diff --git a/deploy.sh b/deploy.sh
index d1e72ade..380066fc 100755
--- a/deploy.sh
+++ b/deploy.sh
@@ -63,8 +63,12 @@ for app in "${BUILD[@]}"; do
echo "=== $app ==="
docker build -f "$dir/Dockerfile" -t "$REGISTRY/$app:latest" .
docker push "$REGISTRY/$app:latest"
- docker service update --force "coop_$app" 2>/dev/null \
- || echo " (service coop_$app not running — will start on next stack deploy)"
+ case "$app" in
+ sx_docs) svc="sx-web_sx_docs" ;;
+ *) svc="coop_$app" ;;
+ esac
+ docker service update --force "$svc" 2>/dev/null \
+ || echo " (service $svc not running — will start on next stack deploy)"
echo ""
done
diff --git a/docker-compose.dev-sx.yml b/docker-compose.dev-sx.yml
index 00a9a648..1c378961 100644
--- a/docker-compose.dev-sx.yml
+++ b/docker-compose.dev-sx.yml
@@ -14,6 +14,7 @@ services:
RELOAD: "true"
SX_USE_REF: "1"
SX_USE_OCAML: "1"
+ SX_USE_WASM: "1"
SX_OCAML_BIN: "/app/bin/sx_server"
SX_BOUNDARY_STRICT: "1"
SX_DEV: "1"
diff --git a/hosts/javascript/run_tests.js b/hosts/javascript/run_tests.js
index ad05ac08..dc7ff631 100644
--- a/hosts/javascript/run_tests.js
+++ b/hosts/javascript/run_tests.js
@@ -306,6 +306,31 @@ if (fullBuild) {
}
}
}
+ // Load web harnesses (DOM mocking, signals, rendering awareness)
+ const webDir = path.join(projectDir, "web");
+ for (const webFile of ["harness-web.sx", "harness-reactive.sx"]) {
+ const wp = path.join(webDir, webFile);
+ if (fs.existsSync(wp)) {
+ const src = fs.readFileSync(wp, "utf8");
+ const exprs = Sx.parse(src);
+ for (const expr of exprs) {
+ try { Sx.eval(expr, env); } catch (e) {
+ console.error(`Error loading ${webFile}: ${e.message}`);
+ }
+ }
+ }
+ }
+ // Load stepper-lib (shared stepper functions used by lib/tests/test-stepper.sx)
+ const stepperLibPath = path.join(projectDir, "sx", "sx", "stepper-lib.sx");
+ if (fs.existsSync(stepperLibPath)) {
+ const src = fs.readFileSync(stepperLibPath, "utf8");
+ const exprs = Sx.parse(src);
+ for (const expr of exprs) {
+ try { Sx.eval(expr, env); } catch (e) {
+ console.error(`Error loading stepper-lib.sx: ${e.message}`);
+ }
+ }
+ }
}
// Determine which tests to run
diff --git a/hosts/ocaml/browser/test_js.js b/hosts/ocaml/browser/test_js.js
new file mode 100644
index 00000000..59fb1df7
--- /dev/null
+++ b/hosts/ocaml/browser/test_js.js
@@ -0,0 +1,62 @@
+#!/usr/bin/env node
+// Test js_of_ocaml build of SX kernel
+const path = require('path');
+require(path.join(__dirname, '../_build/default/browser/sx_browser.bc.js'));
+
+const sx = globalThis.SxKernel;
+console.log('Engine:', sx.engine());
+
+const tests = [
+ ['(+ 1 2)', 3],
+ ['(- 10 3)', 7],
+ ['(* 6 7)', 42],
+ ['(/ 10 2)', 5],
+ ['(= 5 5)', true],
+ ['(< 3 5)', true],
+ ['(> 5 3)', true],
+ ['(not false)', true],
+ ['(inc 5)', 6],
+ ['(dec 5)', 4],
+ ['(len (list 1 2 3))', 3],
+ ['(len "hello")', 5],
+ ['(first (list 10 20))', 10],
+ ['(nth "hello" 0)', 'h'],
+ ['(nth "hello" 4)', 'o'],
+ ['(str "a" "b")', 'ab'],
+ ['(join ", " (list "a" "b" "c"))', 'a, b, c'],
+ ['(let ((x 10) (y 20)) (+ x y))', 30],
+ ['(if true "yes" "no")', 'yes'],
+ ['(cond (= 1 2) "one" :else "other")', 'other'],
+ ['(case 2 1 "one" 2 "two" :else "other")', 'two'],
+ ['(render-to-html (list (quote div) "hello"))', '
hello
'],
+ ['(render-to-html (list (quote span) (list (quote b) "bold")))', 'bold'],
+ // Lambda + closure
+ ['(let ((add (fn (a b) (+ a b)))) (add 3 4))', 7],
+ ['(let ((x 10)) (let ((f (fn () x))) (f)))', 10],
+ // Higher-order
+ ['(len (filter (fn (x) (> x 2)) (list 1 2 3 4 5)))', 3],
+ // Recursion
+ ['(let ((fact (fn (n) (if (<= n 1) 1 (* n (fact (- n 1))))))) (fact 5))', 120],
+];
+
+let passed = 0, failed = 0;
+for (const [expr, expected] of tests) {
+ try {
+ const result = sx.eval(expr);
+ const ok = typeof expected === 'object'
+ ? result && result._type === expected._type
+ : result === expected;
+ if (ok) {
+ passed++;
+ } else {
+ console.log(` FAIL: ${expr} = ${JSON.stringify(result)} (expected ${JSON.stringify(expected)})`);
+ failed++;
+ }
+ } catch (e) {
+ console.log(` ERROR: ${expr}: ${e.message || e}`);
+ failed++;
+ }
+}
+
+console.log(`${passed} passed, ${failed} failed`);
+process.exit(failed > 0 ? 1 : 0);
diff --git a/hosts/ocaml/browser/test_platform.js b/hosts/ocaml/browser/test_platform.js
new file mode 100644
index 00000000..cd5bd114
--- /dev/null
+++ b/hosts/ocaml/browser/test_platform.js
@@ -0,0 +1,134 @@
+#!/usr/bin/env node
+/**
+ * Test the full WASM + platform stack in Node.
+ * Loads the kernel, registers FFI stubs, loads .sx web files.
+ */
+const path = require('path');
+const fs = require('fs');
+
+// Load js_of_ocaml kernel (WASM needs browser; JS works in Node)
+require(path.join(__dirname, '../_build/default/browser/sx_browser.bc.js'));
+
+const K = globalThis.SxKernel;
+console.log('Engine:', K.engine());
+
+// Register FFI stubs (no real DOM in Node, but the primitives must exist)
+K.registerNative("host-global", (args) => {
+ const name = args[0];
+ return globalThis[name] || null;
+});
+K.registerNative("host-get", (args) => {
+ const [obj, prop] = args;
+ if (obj == null) return null;
+ const v = obj[prop];
+ return v === undefined ? null : v;
+});
+K.registerNative("host-set!", (args) => {
+ const [obj, prop, val] = args;
+ if (obj != null) obj[prop] = val;
+});
+K.registerNative("host-call", (args) => {
+ const [obj, method, ...rest] = args;
+ if (obj == null) return null;
+ if (typeof obj[method] === 'function') {
+ try { return obj[method].apply(obj, rest); } catch(e) { return null; }
+ }
+ return null;
+});
+K.registerNative("host-new", (args) => null);
+K.registerNative("host-callback", (args) => {
+ const fn = args[0];
+ if (typeof fn === 'function') return fn;
+ if (fn && fn.__sx_handle !== undefined)
+ return (...a) => K.callFn(fn, a);
+ return () => {};
+});
+K.registerNative("host-typeof", (args) => {
+ const obj = args[0];
+ if (obj == null) return "nil";
+ return typeof obj;
+});
+K.registerNative("host-await", (args) => {
+ const [promise, callback] = args;
+ if (promise && typeof promise.then === 'function') {
+ const cb = typeof callback === 'function' ? callback :
+ (callback && callback.__sx_handle !== undefined) ?
+ (v) => K.callFn(callback, [v]) : () => {};
+ promise.then(cb);
+ }
+});
+
+// Load .sx web files in order
+const root = path.join(__dirname, '../../..');
+const sxFiles = [
+ 'spec/render.sx', // HTML_TAGS, VOID_ELEMENTS, BOOLEAN_ATTRS, parse-element-args
+ 'web/signals.sx',
+ 'web/deps.sx',
+ 'web/router.sx',
+ 'web/page-helpers.sx',
+ 'lib/bytecode.sx',
+ 'lib/compiler.sx',
+ 'lib/vm.sx',
+ 'web/lib/dom.sx',
+ 'web/lib/browser.sx',
+ 'web/adapter-html.sx',
+ 'web/adapter-sx.sx',
+ // Skip adapter-dom.sx, engine.sx, orchestration.sx, boot.sx — need real DOM
+];
+
+let totalExprs = 0;
+for (const f of sxFiles) {
+ const src = fs.readFileSync(path.join(root, f), 'utf8');
+ const result = K.load(src);
+ if (typeof result === 'string' && result.startsWith('Error')) {
+ console.error(` FAIL loading ${f}: ${result}`);
+ process.exit(1);
+ }
+ totalExprs += (typeof result === 'number' ? result : 0);
+}
+console.log(`Loaded ${totalExprs} expressions from ${sxFiles.length} .sx files`);
+
+// Test the loaded stack
+const tests = [
+ // Signals
+ ['(let ((s (signal 0))) (reset! s 42) (deref s))', 42],
+ ['(let ((s (signal 10))) (swap! s inc) (deref s))', 11],
+ // Computed
+ ['(let ((a (signal 2)) (b (computed (fn () (* (deref a) 3))))) (deref b))', 6],
+ // Render (OCaml renderer uses XHTML-style void tags)
+ ['(render-to-html (quote (div :class "foo" "bar")))', 'bar
'],
+ ['(render-to-html (quote (br)))', '
'],
+ // Compiler + VM
+ ['(let ((c (compile (quote (+ 1 2))))) (get c "bytecode"))', { check: v => v && v._type === 'list' }],
+ // dom.sx loaded (functions exist even without real DOM)
+ ['(type-of dom-create-element)', 'lambda'],
+ ['(type-of dom-listen)', 'lambda'],
+ // browser.sx loaded
+ ['(type-of console-log)', 'lambda'],
+];
+
+let passed = 0, failed = 0;
+for (const [expr, expected] of tests) {
+ try {
+ const result = K.eval(expr);
+ let ok;
+ if (expected && typeof expected === 'object' && expected.check) {
+ ok = expected.check(result);
+ } else {
+ ok = result === expected;
+ }
+ if (ok) {
+ passed++;
+ } else {
+ console.log(` FAIL: ${expr}`);
+ console.log(` got: ${JSON.stringify(result)}, expected: ${JSON.stringify(expected)}`);
+ failed++;
+ }
+ } catch(e) {
+ console.log(` ERROR: ${expr}: ${e.message || e}`);
+ failed++;
+ }
+}
+
+console.log(`\n${passed} passed, ${failed} failed`);
+process.exit(failed > 0 ? 1 : 0);
diff --git a/hosts/ocaml/browser/test_wasm.js b/hosts/ocaml/browser/test_wasm.js
new file mode 100644
index 00000000..aa1d6f14
--- /dev/null
+++ b/hosts/ocaml/browser/test_wasm.js
@@ -0,0 +1,73 @@
+#!/usr/bin/env node
+// Test WASM build of SX kernel
+const path = require('path');
+const build_dir = path.join(__dirname, '../_build/default/browser');
+
+async function main() {
+ // Load WASM module — require.main.filename must point to build dir
+ // so the WASM loader finds .wasm assets via path.dirname(require.main.filename)
+ require.main.filename = path.join(build_dir, 'test_wasm.js');
+ require(path.join(build_dir, 'sx_browser.bc.wasm.js'));
+
+ // Wait for WASM init
+ await new Promise(r => setTimeout(r, 2000));
+
+ const sx = globalThis.SxKernel;
+ if (!sx) {
+ console.error('FAIL: SxKernel not available');
+ process.exit(1);
+ }
+
+ console.log('Engine:', sx.engine());
+
+ // Basic tests
+ const tests = [
+ ['(+ 1 2)', 3],
+ ['(- 10 3)', 7],
+ ['(* 6 7)', 42],
+ ['(/ 10 2)', 5],
+ ['(= 5 5)', true],
+ ['(< 3 5)', true],
+ ['(> 5 3)', true],
+ ['(not false)', true],
+ ['(inc 5)', 6],
+ ['(dec 5)', 4],
+ ['(len (list 1 2 3))', 3],
+ ['(len "hello")', 5],
+ ['(first (list 10 20))', 10],
+ ['(nth "hello" 0)', 'h'],
+ ['(nth "hello" 4)', 'o'],
+ ['(str "a" "b")', 'ab'],
+ ['(join ", " (list "a" "b" "c"))', 'a, b, c'],
+ ['(let ((x 10) (y 20)) (+ x y))', 30],
+ ['(if true "yes" "no")', 'yes'],
+ ['(cond (= 1 2) "one" :else "other")', 'other'],
+ ['(case 2 1 "one" 2 "two" :else "other")', 'two'],
+ ['(render-to-html (list (quote div) "hello"))', 'hello
'],
+ ['(render-to-html (list (quote span) (list (quote b) "bold")))', 'bold'],
+ ['(let ((add (fn (a b) (+ a b)))) (add 3 4))', 7],
+ ['(let ((x 10)) (let ((f (fn () x))) (f)))', 10],
+ ['(len (filter (fn (x) (> x 2)) (list 1 2 3 4 5)))', 3],
+ ['(let ((fact (fn (n) (if (<= n 1) 1 (* n (fact (- n 1))))))) (fact 5))', 120],
+ ];
+
+ let passed = 0, failed = 0;
+ for (const [expr, expected] of tests) {
+ const result = sx.eval(expr);
+ const ok = typeof expected === 'object'
+ ? result && result._type === expected._type
+ : result === expected;
+ if (ok) {
+ console.log(` PASS: ${expr} = ${JSON.stringify(result)}`);
+ passed++;
+ } else {
+ console.log(` FAIL: ${expr} = ${JSON.stringify(result)} (expected ${JSON.stringify(expected)})`);
+ failed++;
+ }
+ }
+
+ console.log(`\n${passed} passed, ${failed} failed`);
+ process.exit(failed > 0 ? 1 : 0);
+}
+
+main().catch(e => { console.error(e); process.exit(1); });
diff --git a/hosts/ocaml/dune-project b/hosts/ocaml/dune-project
index 50354e08..25b800af 100644
--- a/hosts/ocaml/dune-project
+++ b/hosts/ocaml/dune-project
@@ -1,2 +1,2 @@
-(lang dune 3.0)
+(lang dune 3.19)
(name sx)
diff --git a/hosts/ocaml/lib/sx_runtime.ml b/hosts/ocaml/lib/sx_runtime.ml
index 9695c5ac..4f697a2b 100644
--- a/hosts/ocaml/lib/sx_runtime.ml
+++ b/hosts/ocaml/lib/sx_runtime.ml
@@ -361,11 +361,44 @@ let signal_value s = match s with
| _ -> raise (Eval_error "not a signal")
let signal_set_value s v = match s with Signal sig' -> sig'.s_value <- v; v | _ -> raise (Eval_error "not a signal")
let signal_subscribers s = match s with Signal sig' -> List (List.map (fun _ -> Nil) sig'.s_subscribers) | _ -> List []
-let signal_add_sub_b _s _f = Nil
-let signal_remove_sub_b _s _f = Nil
-let signal_deps _s = List []
-let signal_set_deps _s _d = Nil
-let notify_subscribers _s = Nil
+let signal_add_sub_b s f =
+ match s with
+ | Dict d ->
+ (match Hashtbl.find_opt d "subscribers" with
+ | Some (ListRef r) -> r := !r @ [f]; Nil
+ | Some (List items) -> Hashtbl.replace d "subscribers" (ListRef (ref (items @ [f]))); Nil
+ | _ -> Hashtbl.replace d "subscribers" (ListRef (ref [f])); Nil)
+ | _ -> Nil
+
+let signal_remove_sub_b s f =
+ match s with
+ | Dict d ->
+ (match Hashtbl.find_opt d "subscribers" with
+ | Some (ListRef r) -> r := List.filter (fun x -> x != f) !r; Nil
+ | Some (List items) -> Hashtbl.replace d "subscribers" (List (List.filter (fun x -> x != f) items)); Nil
+ | _ -> Nil)
+ | _ -> Nil
+
+let signal_deps s =
+ match s with
+ | Dict d -> (match Hashtbl.find_opt d "deps" with Some v -> v | None -> List [])
+ | _ -> List []
+
+let signal_set_deps s d =
+ match s with
+ | Dict tbl -> Hashtbl.replace tbl "deps" d; Nil
+ | _ -> Nil
+
+let notify_subscribers s =
+ let subs = match s with
+ | Dict d -> (match Hashtbl.find_opt d "subscribers" with
+ | Some (ListRef { contents = items }) | Some (List items) -> items
+ | _ -> [])
+ | _ -> []
+ in
+ List.iter (fun f -> ignore (sx_call f [])) subs;
+ Nil
+
let flush_subscribers _s = Nil
let dispose_computed _s = Nil
diff --git a/lib/tests/test-stepper.sx b/lib/tests/test-stepper.sx
new file mode 100644
index 00000000..26e8c3a9
--- /dev/null
+++ b/lib/tests/test-stepper.sx
@@ -0,0 +1,186 @@
+(defsuite
+ "stepper-lib"
+ (deftest
+ "split-tag: string literal becomes leaf step"
+ (let
+ ((result (list)))
+ (split-tag "hello" result)
+ (assert-equal 1 (len result))
+ (assert-equal "leaf" (get (first result) "type"))
+ (assert-equal "hello" (get (first result) "expr"))))
+ (deftest
+ "split-tag: number literal becomes leaf step"
+ (let
+ ((result (list)))
+ (split-tag 42 result)
+ (assert-equal 1 (len result))
+ (assert-equal "leaf" (get (first result) "type"))
+ (assert-equal 42 (get (first result) "expr"))))
+ (deftest
+ "split-tag: empty list produces nothing"
+ (let
+ ((result (list)))
+ (split-tag (list) result)
+ (assert-equal 0 (len result))))
+ (deftest
+ "split-tag: simple div becomes open+close"
+ (let
+ ((result (list)) (parsed (sx-parse "(div)")))
+ (split-tag (first parsed) result)
+ (assert-equal 2 (len result))
+ (assert-equal "open" (get (first result) "type"))
+ (assert-equal "div" (get (first result) "tag"))
+ (assert-equal "close" (get (nth result 1) "type"))))
+ (deftest
+ "split-tag: div with text child becomes open+leaf+close"
+ (let
+ ((result (list)) (parsed (sx-parse "(div \"hello\")")))
+ (split-tag (first parsed) result)
+ (assert-equal 3 (len result))
+ (assert-equal "open" (get (first result) "type"))
+ (assert-equal "leaf" (get (nth result 1) "type"))
+ (assert-equal "hello" (get (nth result 1) "expr"))
+ (assert-equal "close" (get (nth result 2) "type"))))
+ (deftest
+ "split-tag: keyword attrs captured in open step"
+ (let
+ ((result (list)) (parsed (sx-parse "(div :class \"foo\" \"text\")")))
+ (split-tag (first parsed) result)
+ (assert-equal 3 (len result))
+ (assert-equal "open" (get (first result) "type"))
+ (let
+ ((attrs (get (first result) "attrs")))
+ (assert-equal 2 (len attrs)))))
+ (deftest
+ "split-tag: nested tags produce nested open/close pairs"
+ (let
+ ((result (list)) (parsed (sx-parse "(div (span \"hi\"))")))
+ (split-tag (first parsed) result)
+ (assert-equal 5 (len result))
+ (assert-equal "open" (get (first result) "type"))
+ (assert-equal "div" (get (first result) "tag"))
+ (assert-equal "open" (get (nth result 1) "type"))
+ (assert-equal "span" (get (nth result 1) "tag"))
+ (assert-equal "leaf" (get (nth result 2) "type"))
+ (assert-equal "close" (get (nth result 3) "type"))
+ (assert-equal "close" (get (nth result 4) "type"))))
+ (deftest
+ "split-tag: component call becomes expr step"
+ (let
+ ((result (list)) (parsed (sx-parse "(~my/comp :title \"hi\")")))
+ (split-tag (first parsed) result)
+ (assert-equal 1 (len result))
+ (assert-equal "expr" (get (first result) "type"))))
+ (deftest
+ "split-tag: component inside div becomes spread"
+ (let
+ ((result (list))
+ (parsed (sx-parse "(div (~cssx/tw :tokens \"foo\") \"text\")")))
+ (split-tag (first parsed) result)
+ (let
+ ((open-step (first result)))
+ (assert-equal "open" (get open-step "type"))
+ (assert-equal 1 (len (get open-step "spreads"))))))
+ (deftest
+ "build-code-tokens: string expr produces quoted token"
+ (let
+ ((tokens (list)) (ref (dict "v" 0)))
+ (build-code-tokens "hello" tokens ref 0)
+ (assert-equal 1 (len tokens))
+ (assert-equal "\"hello\"" (get (first tokens) "text"))
+ (assert-equal "text-emerald-700" (get (first tokens) "cls"))
+ (assert-equal 0 (get (first tokens) "step"))))
+ (deftest
+ "build-code-tokens: number expr produces token"
+ (let
+ ((tokens (list)) (ref (dict "v" 0)))
+ (build-code-tokens 42 tokens ref 0)
+ (assert-equal 1 (len tokens))
+ (assert-equal "42" (get (first tokens) "text"))
+ (assert-equal "text-amber-700" (get (first tokens) "cls"))))
+ (deftest
+ "build-code-tokens: symbol produces token with name"
+ (let
+ ((tokens (list)) (ref (dict "v" 0)))
+ (build-code-tokens (make-symbol "foo") tokens ref 0)
+ (assert-equal 1 (len tokens))
+ (assert-equal "foo" (get (first tokens) "text"))
+ (assert-equal "text-stone-700" (get (first tokens) "cls"))))
+ (deftest
+ "build-code-tokens: html tag symbol gets sky color"
+ (let
+ ((tokens (list)) (ref (dict "v" 0)))
+ (build-code-tokens (make-symbol "div") tokens ref 0)
+ (assert-equal "text-sky-700 font-semibold" (get (first tokens) "cls"))))
+ (deftest
+ "build-code-tokens: component symbol gets rose color"
+ (let
+ ((tokens (list)) (ref (dict "v" 0)))
+ (build-code-tokens (make-symbol "~my/comp") tokens ref 0)
+ (assert-equal "text-rose-600 font-semibold" (get (first tokens) "cls"))))
+ (deftest
+ "build-code-tokens: list produces open-paren + children + close-paren"
+ (let
+ ((tokens (list))
+ (ref (dict "v" 0))
+ (parsed (sx-parse "(div \"hi\")")))
+ (build-code-tokens (first parsed) tokens ref 0)
+ (assert-equal "(" (get (first tokens) "text"))
+ (assert-equal ")" (get (last tokens) "text"))))
+ (deftest
+ "build-code-tokens: step counter increments for strings"
+ (let
+ ((tokens (list)) (ref (dict "v" 5)))
+ (build-code-tokens "hello" tokens ref 0)
+ (assert-equal 5 (get (first tokens) "step"))
+ (assert-equal 6 (get ref "v"))))
+ (deftest
+ "steps-to-preview: empty steps returns nil"
+ (assert-equal nil (steps-to-preview (list) 5)))
+ (deftest
+ "steps-to-preview: target 0 returns nil"
+ (let
+ ((result (list)))
+ (split-tag "hello" result)
+ (assert-equal nil (steps-to-preview result 0))))
+ (deftest
+ "steps-to-preview: single leaf step reconstructs value"
+ (let
+ ((result (list)))
+ (split-tag "hello" result)
+ (assert-equal "hello" (steps-to-preview result 1))))
+ (deftest
+ "steps-to-preview: open+close reconstructs empty tag"
+ (let
+ ((result (list)) (parsed (sx-parse "(div)")))
+ (split-tag (first parsed) result)
+ (let
+ ((preview (steps-to-preview result 2)))
+ (assert-equal "div" (symbol-name (first preview))))))
+ (deftest
+ "steps-to-preview: partial steps build partial tree"
+ (let
+ ((result (list)) (parsed (sx-parse "(div (span \"a\") (span \"b\"))")))
+ (split-tag (first parsed) result)
+ (let
+ ((preview (steps-to-preview result 4)))
+ (assert-equal "div" (symbol-name (first preview)))
+ (assert-equal true (> (len preview) 1)))))
+ (deftest
+ "steps-to-preview: full steps build complete tree"
+ (let
+ ((result (list)) (parsed (sx-parse "(div \"hello\")")))
+ (split-tag (first parsed) result)
+ (let
+ ((preview (steps-to-preview result (len result))))
+ (assert-equal "div" (symbol-name (first preview)))
+ (assert-equal "hello" (nth preview 1))))))
+
+(deftest
+ "split-tag result is a render leak (list of dicts)"
+ (let
+ ((result (list)) (parsed (sx-parse "(div \"hello\")")))
+ (split-tag (first parsed) result)
+ (assert-equal true (is-render-leak? result))
+ (assert-equal true (> (len result) 0))
+ (assert-equal true (dict? (first result)))))
diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js
index 092438e3..193502cc 100644
--- a/shared/static/scripts/sx-browser.js
+++ b/shared/static/scripts/sx-browser.js
@@ -14,7 +14,7 @@
// =========================================================================
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
- var SX_VERSION = "2026-03-26T11:30:03Z";
+ var SX_VERSION = "2026-03-26T16:13:53Z";
function isNil(x) { return x === NIL || x === null || x === undefined; }
function isSxTruthy(x) { return x !== false && !isNil(x); }
@@ -6583,6 +6583,400 @@ PRIMITIVES["bridge-event"] = bridgeEvent;
PRIMITIVES["resource"] = resource;
+ // === Transpiled from types (gradual type system) ===
+
+ // base-types
+ var baseTypes = ["number", "string", "boolean", "nil", "symbol", "keyword", "element", "any", "never", "list", "dict", "lambda", "component", "island", "macro", "signal"];
+PRIMITIVES["base-types"] = baseTypes;
+
+ // type-any?
+ var typeAny_p = function(t) { return (t == "any"); };
+PRIMITIVES["type-any?"] = typeAny_p;
+
+ // type-never?
+ var typeNever_p = function(t) { return (t == "never"); };
+PRIMITIVES["type-never?"] = typeNever_p;
+
+ // type-nullable?
+ var typeNullable_p = function(t) { return (isSxTruthy((t == "any")) ? true : (isSxTruthy((t == "nil")) ? true : (isSxTruthy((isSxTruthy((typeOf(t) == "string")) && endsWith(t, "?"))) ? true : (isSxTruthy((isSxTruthy((typeOf(t) == "list")) && isSxTruthy(!isSxTruthy(isEmpty(t))) && (first(t) == "or"))) ? contains(rest(t), "nil") : false)))); };
+PRIMITIVES["type-nullable?"] = typeNullable_p;
+
+ // nullable-base
+ var nullableBase = function(t) { return (isSxTruthy((isSxTruthy((typeOf(t) == "string")) && isSxTruthy(endsWith(t, "?")) && !isSxTruthy((t == "?")))) ? slice(t, 0, (stringLength(t) - 1)) : t); };
+PRIMITIVES["nullable-base"] = nullableBase;
+
+ // subtype?
+ var subtype_p = function(a, b) { return (isSxTruthy(typeAny_p(b)) ? true : (isSxTruthy(typeNever_p(a)) ? true : (isSxTruthy(typeAny_p(a)) ? false : (isSxTruthy((a == b)) ? true : (isSxTruthy((a == "nil")) ? typeNullable_p(b) : (isSxTruthy((isSxTruthy((typeOf(b) == "string")) && endsWith(b, "?"))) ? (function() {
+ var base = nullableBase(b);
+ return sxOr((a == base), (a == "nil"));
+})() : (isSxTruthy((isSxTruthy((typeOf(a) == "list")) && isSxTruthy(!isSxTruthy(isEmpty(a))) && (first(a) == "or"))) ? isEvery(function(member) { return subtype_p(member, b); }, rest(a)) : (isSxTruthy((isSxTruthy((typeOf(b) == "list")) && isSxTruthy(!isSxTruthy(isEmpty(b))) && (first(b) == "or"))) ? some(function(member) { return subtype_p(a, member); }, rest(b)) : (isSxTruthy((isSxTruthy((typeOf(a) == "list")) && isSxTruthy((typeOf(b) == "list")) && isSxTruthy((len(a) == 2)) && isSxTruthy((len(b) == 2)) && isSxTruthy((first(a) == "list-of")) && (first(b) == "list-of"))) ? subtype_p(nth(a, 1), nth(b, 1)) : (isSxTruthy((isSxTruthy((a == "list")) && isSxTruthy((typeOf(b) == "list")) && isSxTruthy((len(b) == 2)) && (first(b) == "list-of"))) ? typeAny_p(nth(b, 1)) : (isSxTruthy((isSxTruthy((typeOf(a) == "list")) && isSxTruthy((len(a) == 2)) && isSxTruthy((first(a) == "list-of")) && (b == "list"))) ? true : false))))))))))); };
+PRIMITIVES["subtype?"] = subtype_p;
+
+ // type-union
+ var typeUnion = function(a, b) { return (isSxTruthy((a == b)) ? a : (isSxTruthy(typeAny_p(a)) ? "any" : (isSxTruthy(typeAny_p(b)) ? "any" : (isSxTruthy(typeNever_p(a)) ? b : (isSxTruthy(typeNever_p(b)) ? a : (isSxTruthy(subtype_p(a, b)) ? b : (isSxTruthy(subtype_p(b, a)) ? a : (isSxTruthy((a == "nil")) ? (isSxTruthy((isSxTruthy((typeOf(b) == "string")) && !isSxTruthy(endsWith(b, "?")))) ? (String(b) + String("?")) : ["or", a, b]) : (isSxTruthy((b == "nil")) ? (isSxTruthy((isSxTruthy((typeOf(a) == "string")) && !isSxTruthy(endsWith(a, "?")))) ? (String(a) + String("?")) : ["or", a, b]) : ["or", a, b]))))))))); };
+PRIMITIVES["type-union"] = typeUnion;
+
+ // narrow-type
+ var narrowType = function(t, predicateName) { return (isSxTruthy((predicateName == "nil?")) ? ["nil", narrowExcludeNil(t)] : (isSxTruthy((predicateName == "string?")) ? ["string", narrowExclude(t, "string")] : (isSxTruthy((predicateName == "number?")) ? ["number", narrowExclude(t, "number")] : (isSxTruthy((predicateName == "list?")) ? ["list", narrowExclude(t, "list")] : (isSxTruthy((predicateName == "dict?")) ? ["dict", narrowExclude(t, "dict")] : (isSxTruthy((predicateName == "boolean?")) ? ["boolean", narrowExclude(t, "boolean")] : [t, t])))))); };
+PRIMITIVES["narrow-type"] = narrowType;
+
+ // narrow-exclude-nil
+ var narrowExcludeNil = function(t) { return (isSxTruthy((t == "nil")) ? "never" : (isSxTruthy((t == "any")) ? "any" : (isSxTruthy((isSxTruthy((typeOf(t) == "string")) && endsWith(t, "?"))) ? nullableBase(t) : (isSxTruthy((isSxTruthy((typeOf(t) == "list")) && isSxTruthy(!isSxTruthy(isEmpty(t))) && (first(t) == "or"))) ? (function() {
+ var members = filter(function(m) { return !isSxTruthy((m == "nil")); }, rest(t));
+ return (isSxTruthy((len(members) == 1)) ? first(members) : (isSxTruthy(isEmpty(members)) ? "never" : cons("or", members)));
+})() : t)))); };
+PRIMITIVES["narrow-exclude-nil"] = narrowExcludeNil;
+
+ // narrow-exclude
+ var narrowExclude = function(t, excluded) { return (isSxTruthy((t == excluded)) ? "never" : (isSxTruthy((t == "any")) ? "any" : (isSxTruthy((isSxTruthy((typeOf(t) == "list")) && isSxTruthy(!isSxTruthy(isEmpty(t))) && (first(t) == "or"))) ? (function() {
+ var members = filter(function(m) { return !isSxTruthy((m == excluded)); }, rest(t));
+ return (isSxTruthy((len(members) == 1)) ? first(members) : (isSxTruthy(isEmpty(members)) ? "never" : cons("or", members)));
+})() : t))); };
+PRIMITIVES["narrow-exclude"] = narrowExclude;
+
+ // infer-type
+ var inferType = function(node, typeEnv, primTypes, typeRegistry) { return (function() {
+ var kind = typeOf(node);
+ return (isSxTruthy((kind == "number")) ? "number" : (isSxTruthy((kind == "string")) ? "string" : (isSxTruthy((kind == "boolean")) ? "boolean" : (isSxTruthy(isNil(node)) ? "nil" : (isSxTruthy((kind == "keyword")) ? "keyword" : (isSxTruthy((kind == "symbol")) ? (function() {
+ var name = symbolName(node);
+ return (isSxTruthy(dictHas(typeEnv, name)) ? get(typeEnv, name) : (isSxTruthy((name == "true")) ? "boolean" : (isSxTruthy((name == "false")) ? "boolean" : (isSxTruthy((name == "nil")) ? "nil" : (isSxTruthy(dictHas(primTypes, name)) ? get(primTypes, name) : "any")))));
+})() : (isSxTruthy((kind == "dict")) ? "dict" : (isSxTruthy((kind == "list")) ? inferListType(node, typeEnv, primTypes, typeRegistry) : "any"))))))));
+})(); };
+PRIMITIVES["infer-type"] = inferType;
+
+ // infer-list-type
+ var inferListType = function(node, typeEnv, primTypes, typeRegistry) { return (isSxTruthy(isEmpty(node)) ? "list" : (function() {
+ var head = first(node);
+ var args = rest(node);
+ return (isSxTruthy(!isSxTruthy((typeOf(head) == "symbol"))) ? "any" : (function() {
+ var name = symbolName(head);
+ return (isSxTruthy((name == "if")) ? inferIfType(args, typeEnv, primTypes, typeRegistry) : (isSxTruthy((name == "when")) ? (isSxTruthy((len(args) >= 2)) ? typeUnion(inferType(last(args), typeEnv, primTypes, typeRegistry), "nil") : "nil") : (isSxTruthy(sxOr((name == "cond"), (name == "case"))) ? "any" : (isSxTruthy((name == "let")) ? inferLetType(args, typeEnv, primTypes, typeRegistry) : (isSxTruthy(sxOr((name == "do"), (name == "begin"))) ? (isSxTruthy(isEmpty(args)) ? "nil" : inferType(last(args), typeEnv, primTypes, typeRegistry)) : (isSxTruthy(sxOr((name == "lambda"), (name == "fn"))) ? "lambda" : (isSxTruthy((name == "and")) ? (isSxTruthy(isEmpty(args)) ? "boolean" : inferType(last(args), typeEnv, primTypes, typeRegistry)) : (isSxTruthy((name == "or")) ? (isSxTruthy(isEmpty(args)) ? "boolean" : reduce(typeUnion, "never", map(function(a) { return inferType(a, typeEnv, primTypes, typeRegistry); }, args))) : (isSxTruthy((name == "map")) ? (isSxTruthy((len(args) >= 2)) ? (function() {
+ var fnType = inferType(first(args), typeEnv, primTypes, typeRegistry);
+ return (isSxTruthy((isSxTruthy((typeOf(fnType) == "list")) && (first(fnType) == "->"))) ? ["list-of", last(fnType)] : "list");
+})() : "list") : (isSxTruthy((name == "filter")) ? (isSxTruthy((len(args) >= 2)) ? inferType(nth(args, 1), typeEnv, primTypes, typeRegistry) : "list") : (isSxTruthy((name == "reduce")) ? "any" : (isSxTruthy((name == "list")) ? "list" : (isSxTruthy((name == "dict")) ? "dict" : (isSxTruthy((name == "quote")) ? "any" : (isSxTruthy((name == "str")) ? "string" : (isSxTruthy((name == "not")) ? "boolean" : (isSxTruthy((name == "get")) ? (isSxTruthy((isSxTruthy((len(args) >= 2)) && !isSxTruthy(isNil(typeRegistry)))) ? (function() {
+ var dictType = inferType(first(args), typeEnv, primTypes, typeRegistry);
+ var keyArg = nth(args, 1);
+ var keyName = (isSxTruthy((typeOf(keyArg) == "keyword")) ? keywordName(keyArg) : (isSxTruthy((typeOf(keyArg) == "string")) ? keyArg : NIL));
+ return (isSxTruthy((isSxTruthy(keyName) && isSxTruthy((typeOf(dictType) == "string")) && dictHas(typeRegistry, dictType))) ? (function() {
+ var resolved = resolveType(dictType, typeRegistry);
+ return (isSxTruthy((isSxTruthy((typeOf(resolved) == "dict")) && dictHas(resolved, keyName))) ? get(resolved, keyName) : "any");
+})() : "any");
+})() : "any") : (isSxTruthy(startsWith(name, "~")) ? "element" : (isSxTruthy(dictHas(primTypes, name)) ? get(primTypes, name) : "any")))))))))))))))))));
+})());
+})()); };
+PRIMITIVES["infer-list-type"] = inferListType;
+
+ // infer-if-type
+ var inferIfType = function(args, typeEnv, primTypes, typeRegistry) { return (isSxTruthy((len(args) < 2)) ? "nil" : (function() {
+ var thenType = inferType(nth(args, 1), typeEnv, primTypes, typeRegistry);
+ return (isSxTruthy((len(args) >= 3)) ? typeUnion(thenType, inferType(nth(args, 2), typeEnv, primTypes, typeRegistry)) : typeUnion(thenType, "nil"));
+})()); };
+PRIMITIVES["infer-if-type"] = inferIfType;
+
+ // infer-let-type
+ var inferLetType = function(args, typeEnv, primTypes, typeRegistry) { return (isSxTruthy((len(args) < 2)) ? "nil" : (function() {
+ var bindings = first(args);
+ var body = last(args);
+ var extended = merge(typeEnv, {});
+ { var _c = bindings; for (var _i = 0; _i < _c.length; _i++) { var binding = _c[_i]; if (isSxTruthy((isSxTruthy((typeOf(binding) == "list")) && (len(binding) >= 2)))) {
+ (function() {
+ var name = (isSxTruthy((typeOf(first(binding)) == "symbol")) ? symbolName(first(binding)) : (String(first(binding))));
+ var valType = inferType(nth(binding, 1), extended, primTypes, typeRegistry);
+ return dictSet(extended, name, valType);
+})();
+} } }
+ return inferType(body, extended, primTypes, typeRegistry);
+})()); };
+PRIMITIVES["infer-let-type"] = inferLetType;
+
+ // make-diagnostic
+ var makeDiagnostic = function(level, message, component, expr) { return {"level": level, "component": component, "expr": expr, "message": message}; };
+PRIMITIVES["make-diagnostic"] = makeDiagnostic;
+
+ // check-primitive-call
+ var checkPrimitiveCall = function(name, args, typeEnv, primTypes, primParamTypes, compName, typeRegistry) { return (function() {
+ var diagnostics = [];
+ if (isSxTruthy((isSxTruthy(!isSxTruthy(isNil(primParamTypes))) && dictHas(primParamTypes, name)))) {
+ (function() {
+ var sig = get(primParamTypes, name);
+ var positional = get(sig, "positional");
+ var restType = get(sig, "rest-type");
+ return forEach(function(idx) { return (isSxTruthy((idx < len(args))) ? (isSxTruthy((idx < len(positional))) ? (function() {
+ var paramInfo = nth(positional, idx);
+ var argExpr = nth(args, idx);
+ return (function() {
+ var expectedType = nth(paramInfo, 1);
+ return (isSxTruthy(!isSxTruthy(isNil(expectedType))) ? (function() {
+ var actual = inferType(argExpr, typeEnv, primTypes, typeRegistry);
+ return (isSxTruthy((isSxTruthy(!isSxTruthy(typeAny_p(expectedType))) && isSxTruthy(!isSxTruthy(typeAny_p(actual))) && !isSxTruthy(subtypeResolved_p(actual, expectedType, typeRegistry)))) ? append_b(diagnostics, makeDiagnostic("error", (String("Argument ") + String((idx + 1)) + String(" of `") + String(name) + String("` expects ") + String(expectedType) + String(", got ") + String(actual)), compName, argExpr)) : NIL);
+})() : NIL);
+})();
+})() : (isSxTruthy(!isSxTruthy(isNil(restType))) ? (function() {
+ var argExpr = nth(args, idx);
+ var actual = inferType(argExpr, typeEnv, primTypes, typeRegistry);
+ return (isSxTruthy((isSxTruthy(!isSxTruthy(typeAny_p(restType))) && isSxTruthy(!isSxTruthy(typeAny_p(actual))) && !isSxTruthy(subtypeResolved_p(actual, restType, typeRegistry)))) ? append_b(diagnostics, makeDiagnostic("error", (String("Argument ") + String((idx + 1)) + String(" of `") + String(name) + String("` expects ") + String(restType) + String(", got ") + String(actual)), compName, argExpr)) : NIL);
+})() : NIL)) : NIL); }, range(0, len(args), 1));
+})();
+}
+ return diagnostics;
+})(); };
+PRIMITIVES["check-primitive-call"] = checkPrimitiveCall;
+
+ // check-component-call
+ var checkComponentCall = function(compName, comp, callArgs, typeEnv, primTypes, typeRegistry) { return (function() {
+ var diagnostics = [];
+ var paramTypes = componentParamTypes(comp);
+ var params = componentParams(comp);
+ if (isSxTruthy((isSxTruthy(!isSxTruthy(isNil(paramTypes))) && !isSxTruthy(isEmpty(keys(paramTypes)))))) {
+ (function() {
+ var i = 0;
+ var providedKeys = [];
+ { var _c = range(0, len(callArgs), 1); for (var _i = 0; _i < _c.length; _i++) { var idx = _c[_i]; if (isSxTruthy((idx < len(callArgs)))) {
+ (function() {
+ var arg = nth(callArgs, idx);
+ return (isSxTruthy((typeOf(arg) == "keyword")) ? (function() {
+ var keyName = keywordName(arg);
+ providedKeys.push(keyName);
+ return (isSxTruthy(((idx + 1) < len(callArgs))) ? (function() {
+ var valExpr = nth(callArgs, (idx + 1));
+ return (isSxTruthy(dictHas(paramTypes, keyName)) ? (function() {
+ var expected = get(paramTypes, keyName);
+ var actual = inferType(valExpr, typeEnv, primTypes, typeRegistry);
+ return (isSxTruthy((isSxTruthy(!isSxTruthy(typeAny_p(expected))) && isSxTruthy(!isSxTruthy(typeAny_p(actual))) && !isSxTruthy(subtypeResolved_p(actual, expected, typeRegistry)))) ? append_b(diagnostics, makeDiagnostic("error", (String("Keyword :") + String(keyName) + String(" of ") + String(compName) + String(" expects ") + String(expected) + String(", got ") + String(actual)), compName, valExpr)) : NIL);
+})() : NIL);
+})() : NIL);
+})() : NIL);
+})();
+} } }
+ { var _c = params; for (var _i = 0; _i < _c.length; _i++) { var paramName = _c[_i]; if (isSxTruthy((isSxTruthy(dictHas(paramTypes, paramName)) && isSxTruthy(!isSxTruthy(contains(providedKeys, paramName))) && !isSxTruthy(typeNullable_p(get(paramTypes, paramName)))))) {
+ diagnostics.push(makeDiagnostic("warning", (String("Required param :") + String(paramName) + String(" of ") + String(compName) + String(" not provided")), compName, NIL));
+} } }
+ return forEach(function(key) { return (isSxTruthy(!isSxTruthy(contains(params, key))) ? append_b(diagnostics, makeDiagnostic("warning", (String("Unknown keyword :") + String(key) + String(" passed to ") + String(compName)), compName, NIL)) : NIL); }, providedKeys);
+})();
+}
+ return diagnostics;
+})(); };
+PRIMITIVES["check-component-call"] = checkComponentCall;
+
+ // check-body-walk
+ var checkBodyWalk = function(node, compName, typeEnv, primTypes, primParamTypes, env, diagnostics, typeRegistry, effectAnnotations) { return (function() {
+ var kind = typeOf(node);
+ return (isSxTruthy((kind == "list")) ? (isSxTruthy(!isSxTruthy(isEmpty(node))) ? (function() {
+ var head = first(node);
+ var args = rest(node);
+ if (isSxTruthy((typeOf(head) == "symbol"))) {
+ (function() {
+ var name = symbolName(head);
+ if (isSxTruthy(startsWith(name, "~"))) {
+ (function() {
+ var compVal = envGet(env, name);
+ return (isSxTruthy((typeOf(compVal) == "component")) ? forEach(function(d) { return append_b(diagnostics, d); }, checkComponentCall(name, compVal, args, typeEnv, primTypes, typeRegistry)) : NIL);
+})();
+ if (isSxTruthy(!isSxTruthy(isNil(effectAnnotations)))) {
+ (function() {
+ var callerEffects = getEffects(compName, effectAnnotations);
+ return forEach(function(d) { return append_b(diagnostics, d); }, checkEffectCall(name, callerEffects, effectAnnotations, compName));
+})();
+}
+}
+ if (isSxTruthy((isSxTruthy(!isSxTruthy(startsWith(name, "~"))) && isSxTruthy(!isSxTruthy(isNil(primParamTypes))) && dictHas(primParamTypes, name)))) {
+ { var _c = checkPrimitiveCall(name, args, typeEnv, primTypes, primParamTypes, compName, typeRegistry); for (var _i = 0; _i < _c.length; _i++) { var d = _c[_i]; diagnostics.push(d); } }
+}
+ if (isSxTruthy((isSxTruthy(!isSxTruthy(startsWith(name, "~"))) && !isSxTruthy(isNil(effectAnnotations))))) {
+ (function() {
+ var callerEffects = getEffects(compName, effectAnnotations);
+ return forEach(function(d) { return append_b(diagnostics, d); }, checkEffectCall(name, callerEffects, effectAnnotations, compName));
+})();
+}
+ if (isSxTruthy(sxOr((name == "let"), (name == "let*")))) {
+ if (isSxTruthy((len(args) >= 2))) {
+ (function() {
+ var bindings = first(args);
+ var bodyExprs = rest(args);
+ var extended = merge(typeEnv, {});
+ { var _c = bindings; for (var _i = 0; _i < _c.length; _i++) { var binding = _c[_i]; if (isSxTruthy((isSxTruthy((typeOf(binding) == "list")) && (len(binding) >= 2)))) {
+ (function() {
+ var bname = (isSxTruthy((typeOf(first(binding)) == "symbol")) ? symbolName(first(binding)) : (String(first(binding))));
+ var valType = inferType(nth(binding, 1), extended, primTypes, typeRegistry);
+ return dictSet(extended, bname, valType);
+})();
+} } }
+ return forEach(function(body) { return checkBodyWalk(body, compName, extended, primTypes, primParamTypes, env, diagnostics, typeRegistry, effectAnnotations); }, bodyExprs);
+})();
+}
+}
+ return (isSxTruthy((name == "define")) ? (isSxTruthy((len(args) >= 2)) ? (function() {
+ var defName = (isSxTruthy((typeOf(first(args)) == "symbol")) ? symbolName(first(args)) : NIL);
+ var defVal = nth(args, 1);
+ if (isSxTruthy(defName)) {
+ typeEnv[defName] = inferType(defVal, typeEnv, primTypes, typeRegistry);
+}
+ return checkBodyWalk(defVal, compName, typeEnv, primTypes, primParamTypes, env, diagnostics, typeRegistry, effectAnnotations);
+})() : NIL) : NIL);
+})();
+}
+ return forEach(function(child) { return checkBodyWalk(child, compName, typeEnv, primTypes, primParamTypes, env, diagnostics, typeRegistry, effectAnnotations); }, args);
+})() : NIL) : NIL);
+})(); };
+PRIMITIVES["check-body-walk"] = checkBodyWalk;
+
+ // check-component
+ var checkComponent = function(compName, env, primTypes, primParamTypes, typeRegistry, effectAnnotations) { return (function() {
+ var comp = envGet(env, compName);
+ var diagnostics = [];
+ if (isSxTruthy((typeOf(comp) == "component"))) {
+ (function() {
+ var body = componentBody(comp);
+ var params = componentParams(comp);
+ var paramTypes = componentParamTypes(comp);
+ var typeEnv = {};
+ { var _c = params; for (var _i = 0; _i < _c.length; _i++) { var p = _c[_i]; typeEnv[p] = (isSxTruthy((isSxTruthy(!isSxTruthy(isNil(paramTypes))) && dictHas(paramTypes, p))) ? get(paramTypes, p) : "any"); } }
+ if (isSxTruthy(componentHasChildren(comp))) {
+ typeEnv["children"] = ["list-of", "element"];
+}
+ return checkBodyWalk(body, compName, typeEnv, primTypes, primParamTypes, env, diagnostics, typeRegistry, effectAnnotations);
+})();
+}
+ return diagnostics;
+})(); };
+PRIMITIVES["check-component"] = checkComponent;
+
+ // check-all
+ var checkAll = function(env, primTypes, primParamTypes, typeRegistry, effectAnnotations) { return (function() {
+ var allDiagnostics = [];
+ { var _c = keys(env); for (var _i = 0; _i < _c.length; _i++) { var name = _c[_i]; (function() {
+ var val = envGet(env, name);
+ return (isSxTruthy((typeOf(val) == "component")) ? forEach(function(d) { return append_b(allDiagnostics, d); }, checkComponent(name, env, primTypes, primParamTypes, typeRegistry, effectAnnotations)) : NIL);
+})(); } }
+ return allDiagnostics;
+})(); };
+PRIMITIVES["check-all"] = checkAll;
+
+ // build-type-registry
+ var buildTypeRegistry = function(primDeclarations, ioDeclarations) { return (function() {
+ var registry = {};
+ { var _c = primDeclarations; for (var _i = 0; _i < _c.length; _i++) { var decl = _c[_i]; (function() {
+ var name = get(decl, "name");
+ var returns = get(decl, "returns");
+ return (isSxTruthy((isSxTruthy(!isSxTruthy(isNil(name))) && !isSxTruthy(isNil(returns)))) ? dictSet(registry, name, returns) : NIL);
+})(); } }
+ { var _c = ioDeclarations; for (var _i = 0; _i < _c.length; _i++) { var decl = _c[_i]; (function() {
+ var name = get(decl, "name");
+ var returns = get(decl, "returns");
+ return (isSxTruthy((isSxTruthy(!isSxTruthy(isNil(name))) && !isSxTruthy(isNil(returns)))) ? dictSet(registry, name, returns) : NIL);
+})(); } }
+ return registry;
+})(); };
+PRIMITIVES["build-type-registry"] = buildTypeRegistry;
+
+ // type-def-name
+ var typeDefName = function(td) { return get(td, "name"); };
+PRIMITIVES["type-def-name"] = typeDefName;
+
+ // type-def-params
+ var typeDefParams = function(td) { return get(td, "params"); };
+PRIMITIVES["type-def-params"] = typeDefParams;
+
+ // type-def-body
+ var typeDefBody = function(td) { return get(td, "body"); };
+PRIMITIVES["type-def-body"] = typeDefBody;
+
+ // resolve-type
+ var resolveType = function(t, registry) { return (isSxTruthy(isNil(registry)) ? t : (isSxTruthy((typeOf(t) == "string")) ? (isSxTruthy(dictHas(registry, t)) ? (function() {
+ var td = get(registry, t);
+ return (function() {
+ var params = typeDefParams(td);
+ var body = typeDefBody(td);
+ return (isSxTruthy(isEmpty(params)) ? resolveType(body, registry) : t);
+})();
+})() : t) : (isSxTruthy((typeOf(t) == "list")) ? (isSxTruthy(isEmpty(t)) ? t : (function() {
+ var head = first(t);
+ return (isSxTruthy(sxOr((head == "or"), (head == "list-of"), (head == "->"), (head == "dict-of"))) ? cons(head, map(function(m) { return resolveType(m, registry); }, rest(t))) : (isSxTruthy((isSxTruthy((typeOf(head) == "string")) && dictHas(registry, head))) ? (function() {
+ var td = get(registry, head);
+ var params = typeDefParams(td);
+ var body = typeDefBody(td);
+ var args = rest(t);
+ return (isSxTruthy((len(params) == len(args))) ? resolveType(substituteTypeVars(body, params, args), registry) : t);
+})() : t));
+})()) : (isSxTruthy((typeOf(t) == "dict")) ? mapDict(function(k, v) { return resolveType(v, registry); }, t) : t)))); };
+PRIMITIVES["resolve-type"] = resolveType;
+
+ // substitute-type-vars
+ var substituteTypeVars = function(body, params, args) { return (function() {
+ var subst = {};
+ { var _c = range(0, len(params), 1); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; subst[nth(params, i)] = nth(args, i); } }
+ return substituteInType(body, subst);
+})(); };
+PRIMITIVES["substitute-type-vars"] = substituteTypeVars;
+
+ // substitute-in-type
+ var substituteInType = function(t, subst) { return (isSxTruthy((typeOf(t) == "string")) ? (isSxTruthy(dictHas(subst, t)) ? get(subst, t) : t) : (isSxTruthy((typeOf(t) == "list")) ? map(function(m) { return substituteInType(m, subst); }, t) : (isSxTruthy((typeOf(t) == "dict")) ? mapDict(function(k, v) { return substituteInType(v, subst); }, t) : t))); };
+PRIMITIVES["substitute-in-type"] = substituteInType;
+
+ // subtype-resolved?
+ var subtypeResolved_p = function(a, b, registry) { return (isSxTruthy(isNil(registry)) ? subtype_p(a, b) : (function() {
+ var ra = resolveType(a, registry);
+ var rb = resolveType(b, registry);
+ return (isSxTruthy((isSxTruthy((typeOf(ra) == "dict")) && (typeOf(rb) == "dict"))) ? isEvery(function(key) { return (isSxTruthy(dictHas(ra, key)) && subtypeResolved_p(get(ra, key), get(rb, key), registry)); }, keys(rb)) : subtype_p(ra, rb));
+})()); };
+PRIMITIVES["subtype-resolved?"] = subtypeResolved_p;
+
+ // get-effects
+ var getEffects = function(name, effectAnnotations) { return (isSxTruthy(isNil(effectAnnotations)) ? NIL : (isSxTruthy(dictHas(effectAnnotations, name)) ? get(effectAnnotations, name) : NIL)); };
+PRIMITIVES["get-effects"] = getEffects;
+
+ // effects-subset?
+ var effectsSubset_p = function(calleeEffects, callerEffects) { return (isSxTruthy(isNil(callerEffects)) ? true : (isSxTruthy(isNil(calleeEffects)) ? true : isEvery(function(e) { return contains(callerEffects, e); }, calleeEffects))); };
+PRIMITIVES["effects-subset?"] = effectsSubset_p;
+
+ // check-effect-call
+ var checkEffectCall = function(calleeName, callerEffects, effectAnnotations, compName) { return (function() {
+ var diagnostics = [];
+ var calleeEffects = getEffects(calleeName, effectAnnotations);
+ if (isSxTruthy((isSxTruthy(!isSxTruthy(isNil(callerEffects))) && isSxTruthy(!isSxTruthy(isNil(calleeEffects))) && !isSxTruthy(effectsSubset_p(calleeEffects, callerEffects))))) {
+ diagnostics.push(makeDiagnostic("error", (String("`") + String(calleeName) + String("` has effects ") + String(join(", ", calleeEffects)) + String(" but `") + String(compName) + String("` only allows ") + String((isSxTruthy(isEmpty(callerEffects)) ? "[pure]" : join(", ", callerEffects)))), compName, NIL));
+}
+ return diagnostics;
+})(); };
+PRIMITIVES["check-effect-call"] = checkEffectCall;
+
+ // build-effect-annotations
+ var buildEffectAnnotations = function(ioDeclarations) { return (function() {
+ var annotations = {};
+ { var _c = ioDeclarations; for (var _i = 0; _i < _c.length; _i++) { var decl = _c[_i]; (function() {
+ var name = get(decl, "name");
+ return (isSxTruthy(!isSxTruthy(isNil(name))) ? dictSet(annotations, name, ["io"]) : NIL);
+})(); } }
+ return annotations;
+})(); };
+PRIMITIVES["build-effect-annotations"] = buildEffectAnnotations;
+
+ // check-component-effects
+ var checkComponentEffects = function(compName, env, effectAnnotations) { return (function() {
+ var comp = envGet(env, compName);
+ var diagnostics = [];
+ if (isSxTruthy((typeOf(comp) == "component"))) {
+ (function() {
+ var body = componentBody(comp);
+ return checkBodyWalk(body, compName, {}, {}, NIL, env, diagnostics, NIL, effectAnnotations);
+})();
+}
+ return diagnostics;
+})(); };
+PRIMITIVES["check-component-effects"] = checkComponentEffects;
+
+ // check-all-effects
+ var checkAllEffects = function(env, effectAnnotations) { return (function() {
+ var allDiagnostics = [];
+ { var _c = keys(env); for (var _i = 0; _i < _c.length; _i++) { var name = _c[_i]; (function() {
+ var val = envGet(env, name);
+ return (isSxTruthy((typeOf(val) == "component")) ? forEach(function(d) { return append_b(allDiagnostics, d); }, checkComponentEffects(name, env, effectAnnotations)) : NIL);
+})(); } }
+ return allDiagnostics;
+})(); };
+PRIMITIVES["check-all-effects"] = checkAllEffects;
+
+
// =========================================================================
// Post-transpilation fixups
// =========================================================================
diff --git a/shared/static/wasm/sx_browser.bc.js b/shared/static/wasm/sx_browser.bc.js
index 900e34bb..9c47c693 100644
--- a/shared/static/wasm/sx_browser.bc.js
+++ b/shared/static/wasm/sx_browser.bc.js
@@ -24738,7 +24738,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(globalThis));
//# 5 "../lib/.sx.objs/jsoo/default/sx.cma.js"
-//# shape: Sx_types:[N,N,N,F(1),F(1),F(3),F(2),F(2),F(3),F(2),F(1),F(1),F(1)*,F(1)*,F(1),F(3),F(6),F(5),F(5),F(2),F(1),F(1),F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1)*,F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(1),F(1),F(1),F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(2),F(1),F(1),F(1)]
+//# shape: Sx_types:[N,N,N,F(1),F(1),N,N,N,F(1),F(1),F(3),F(2),F(2),F(3),F(2),F(3),F(3),F(2),F(1),F(1),F(1)*,F(1)*,F(1),F(3),F(6),F(5),F(5),F(2),F(1),F(1),F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1)*,F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(1),F(1),F(1),F(1)*,F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(2),F(1),F(1),F(1)]
(function
(globalThis){
"use strict";
@@ -24766,6 +24766,25 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Stdlib_Float = global_data.Stdlib__Float,
Stdlib_String = global_data.Stdlib__String,
Stdlib_List = global_data.Stdlib__List,
+ sym_to_id = Stdlib_Hashtbl[1].call(null, 0, 512),
+ id_to_sym = Stdlib_Hashtbl[1].call(null, 0, 512),
+ sym_next = [0, 0];
+ function intern(s){
+ var match = Stdlib_Hashtbl[7].call(null, sym_to_id, s);
+ if(match){var id = match[1]; return id;}
+ var id$0 = sym_next[1];
+ sym_next[1]++;
+ Stdlib_Hashtbl[11].call(null, sym_to_id, s, id$0);
+ Stdlib_Hashtbl[11].call(null, id_to_sym, id$0, s);
+ return id$0;
+ }
+ function unintern(id){
+ var match = Stdlib_Hashtbl[7].call(null, id_to_sym, id);
+ if(match){var s = match[1]; return s;}
+ var a = Stdlib[33].call(null, id), b = Stdlib[28].call(null, a, ">");
+ return Stdlib[28].call(null, "",
@@ -26009,7 +26040,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, f < as_number(a) ? 1 : 0];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], ">: 2 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], ">: 2 args"], 1);
});
register
("<=",
@@ -26033,7 +26064,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, as_number(a) <= f ? 1 : 0];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "<=: 2 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "<=: 2 args"], 1);
});
register
(">=",
@@ -26057,25 +26088,25 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, f <= as_number(a) ? 1 : 0];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], ">=: 2 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], ">=: 2 args"], 1);
});
register
("not",
function(args){
if(args && ! args[2]){
var a = args[1];
- return [0, 1 - Sx_types[32].call(null, a)];
+ return [0, 1 - Sx_types[40].call(null, a)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "not: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "not: 1 arg"], 1);
});
register
("nil?",
function(args){
if(args && ! args[2]){
var a = args[1];
- return [0, Sx_types[24].call(null, a)];
+ return [0, Sx_types[32].call(null, a)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "nil?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "nil?: 1 arg"], 1);
});
var c = [0, 0], d = [0, 1];
register
@@ -26087,7 +26118,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 1 === a[0]){if(args[2]) break a; return d;}
if(! args[2]) return c;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "number?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "number?: 1 arg"], 1);
});
var e = [0, 0], f = [0, 1];
register
@@ -26099,7 +26130,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 2 === a[0]){if(args[2]) break a; return f;}
if(! args[2]) return e;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "string?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "string?: 1 arg"], 1);
});
var g = [0, 0], h = [0, 1];
register
@@ -26112,7 +26143,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(! args[2]) return g;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "boolean?: 1 arg"], 1);
+ ([0, Sx_types[7], "boolean?: 1 arg"], 1);
});
var i = [0, 0], j = [0, 1];
register
@@ -26125,7 +26156,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
switch(a[0]){case 5:case 19: if(args[2]) break a; return j;}
if(! args[2]) return i;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "list?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "list?: 1 arg"], 1);
});
var k = [0, 0], l = [0, 1];
register
@@ -26137,7 +26168,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 6 === a[0]){if(args[2]) break a; return l;}
if(! args[2]) return k;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "dict?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "dict?: 1 arg"], 1);
});
var m = [0, 0], n = [0, 1];
register
@@ -26149,7 +26180,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 3 === a[0]){if(args[2]) break a; return n;}
if(! args[2]) return m;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "symbol?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "symbol?: 1 arg"], 1);
});
var o = [0, 0], p = [0, 1];
register
@@ -26162,7 +26193,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(! args[2]) return o;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "keyword?: 1 arg"], 1);
+ ([0, Sx_types[7], "keyword?: 1 arg"], 1);
});
var q = [0, 1], r = [0, 0], s = [0, 0], t = [0, 1], u = [0, 0], v = [0, 1];
register
@@ -26199,7 +26230,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
if(! args[2]) return q;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "empty?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "empty?: 1 arg"], 1);
});
register
("odd?",
@@ -26208,7 +26239,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
return [0, 0 !== ((as_number(a) | 0) % 2 | 0) ? 1 : 0];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "odd?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "odd?: 1 arg"], 1);
});
register
("even?",
@@ -26217,7 +26248,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
return [0, 0 === ((as_number(a) | 0) % 2 | 0) ? 1 : 0];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "even?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "even?: 1 arg"], 1);
});
register
("zero?",
@@ -26226,7 +26257,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
return [0, as_number(a) === 0. ? 1 : 0];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "zero?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "zero?: 1 arg"], 1);
});
register
("str",
@@ -26241,7 +26272,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1], b = as_string(a);
return [2, Stdlib_String[26].call(null, b)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "upper: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "upper: 1 arg"], 1);
});
register
("upcase",
@@ -26250,7 +26281,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1], b = as_string(a);
return [2, Stdlib_String[26].call(null, b)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "upcase: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "upcase: 1 arg"], 1);
});
register
("lower",
@@ -26259,7 +26290,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1], b = as_string(a);
return [2, Stdlib_String[27].call(null, b)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "lower: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "lower: 1 arg"], 1);
});
register
("downcase",
@@ -26269,7 +26300,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [2, Stdlib_String[27].call(null, b)];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "downcase: 1 arg"], 1);
+ ([0, Sx_types[7], "downcase: 1 arg"], 1);
});
register
("trim",
@@ -26278,7 +26309,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1], b = as_string(a);
return [2, Stdlib_String[24].call(null, b)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "trim: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "trim: 1 arg"], 1);
});
register
("string-length",
@@ -26288,7 +26319,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [1, caml_ml_string_length(as_string(a))];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "string-length: 1 arg"], 1);
+ ([0, Sx_types[7], "string-length: 1 arg"], 1);
});
register
("string-contains?",
@@ -26324,7 +26355,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "string-contains?: 2 string args"], 1);
+ ([0, Sx_types[7], "string-contains?: 2 string args"], 1);
});
register
("starts-with?",
@@ -26356,7 +26387,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "starts-with?: 2 string args"], 1);
+ ([0, Sx_types[7], "starts-with?: 2 string args"], 1);
});
register
("ends-with?",
@@ -26389,7 +26420,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "ends-with?: 2 string args"], 1);
+ ([0, Sx_types[7], "ends-with?: 2 string args"], 1);
});
var w = [1, -1.];
register
@@ -26420,7 +26451,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "index-of: 2 string args"], 1);
+ ([0, Sx_types[7], "index-of: 2 string args"], 1);
});
register
("substring",
@@ -26456,7 +26487,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "substring: 3 args"], 1);
+ ([0, Sx_types[7], "substring: 3 args"], 1);
});
register
("substr",
@@ -26495,7 +26526,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "substr: 2-3 args"], 1);
+ ([0, Sx_types[7], "substr: 2-3 args"], 1);
});
register
("split",
@@ -26518,7 +26549,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "split: 2 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "split: 2 args"], 1);
});
register
("join",
@@ -26546,7 +26577,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "join: 2 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "join: 2 args"], 1);
});
var x = [0, [8, [0, 0, 3], 0, 0, 0], cst_g];
register
@@ -26612,7 +26643,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "replace: 3 string args"], 1);
+ ([0, Sx_types[7], "replace: 3 string args"], 1);
});
register
("char-from-code",
@@ -26629,7 +26660,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "char-from-code: 1 arg"], 1);
+ ([0, Sx_types[7], "char-from-code: 1 arg"], 1);
});
register("list", function(args){return [19, [0, args]];});
var
@@ -26697,7 +26728,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
b = Stdlib_List[1].call(null, args),
c = caml_call1(Stdlib_Printf[4].call(null, y), b);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], c], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], c], 1);
});
register
("first",
@@ -26722,9 +26753,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
default:
if(args[2]) break a;
var
- c = Sx_types[59].call(null, x),
+ c = Sx_types[67].call(null, x),
d = Stdlib[28].call(null, "first: expected list, got ", c);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], d], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], d], 1);
}
return 0;
}
@@ -26733,7 +26764,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(! args[2]) return 0;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "first: 1 list arg"], 1);
+ ([0, Sx_types[7], "first: 1 list arg"], 1);
});
var D = [5, 0], E = [5, 0];
register
@@ -26765,7 +26796,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(! args[2]) return D;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "rest: 1 list arg"], 1);
+ ([0, Sx_types[7], "rest: 1 list arg"], 1);
});
register
("last",
@@ -26788,7 +26819,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "last: 1 list arg"], 1);
+ ([0, Sx_types[7], "last: 1 list arg"], 1);
});
var F = [5, 0];
register
@@ -26812,7 +26843,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "init: 1 list arg"], 1);
+ ([0, Sx_types[7], "init: 1 list arg"], 1);
});
register
("nth",
@@ -26860,7 +26891,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "nth: list/string and number"], 1);
+ ([0, Sx_types[7], "nth: list/string and number"], 1);
});
register
("cons",
@@ -26884,7 +26915,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "cons: value and list"], 1);
+ ([0, Sx_types[7], "cons: value and list"], 1);
});
register
("append",
@@ -26991,7 +27022,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "reverse: 1 list"], 1);
+ ([0, Sx_types[7], "reverse: 1 list"], 1);
});
register
("flatten",
@@ -27025,7 +27056,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "flatten: 1 list"], 1);
+ ([0, Sx_types[7], "flatten: 1 list"], 1);
});
register
("concat",
@@ -27148,7 +27179,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "contains?: 2 args"], 1);
+ ([0, Sx_types[7], "contains?: 2 args"], 1);
});
var G = [5, 0];
register
@@ -27204,7 +27235,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "range: 1-3 args"], 1);
+ ([0, Sx_types[7], "range: 1-3 args"], 1);
});
register
("slice",
@@ -27297,7 +27328,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "slice: 2-3 args"], 1);
+ ([0, Sx_types[7], "slice: 2-3 args"], 1);
});
register
("sort",
@@ -27316,7 +27347,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [5, Stdlib_List[59].call(null, runtime.caml_compare, l)];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "sort: 1 list"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "sort: 1 list"], 1);
});
register
("zip",
@@ -27349,7 +27380,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "zip: 2 lists"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "zip: 2 lists"], 1);
});
register
("zip-pairs",
@@ -27372,7 +27403,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [5, go(l)];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "zip-pairs: 1 list"], 1);
+ ([0, Sx_types[7], "zip-pairs: 1 list"], 1);
});
register
("take",
@@ -27408,7 +27439,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "take: list and number"], 1);
+ ([0, Sx_types[7], "take: list and number"], 1);
});
register
("drop",
@@ -27441,7 +27472,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "drop: list and number"], 1);
+ ([0, Sx_types[7], "drop: list and number"], 1);
});
register
("chunk-every",
@@ -27490,7 +27521,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "chunk-every: list and number"], 1);
+ ([0, Sx_types[7], "chunk-every: list and number"], 1);
});
register
("unique",
@@ -27513,7 +27544,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Stdlib_List[44].call
(null,
function(x){
- var key = Sx_types[59].call(null, x);
+ var key = Sx_types[67].call(null, x);
return Stdlib_Hashtbl[9].call(null, seen, key)
? 0
: (Stdlib_Hashtbl[11].call(null, seen, key, 1), 1);
@@ -27523,12 +27554,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "unique: 1 list"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "unique: 1 list"], 1);
});
register
(cst_dict,
function(args){
- var d = Sx_types[52].call(null, 0), param = args;
+ var d = Sx_types[60].call(null, 0), param = args;
for(;;){
if(! param) return [6, d];
var a = param[1];
@@ -27538,7 +27569,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match = param[2];
if(match){
var rest = match[2], v = match[1], k = a[1];
- Sx_types[55].call(null, d, k, v);
+ Sx_types[63].call(null, d, k, v);
param = rest;
continue;
}
@@ -27547,14 +27578,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match$0 = param[2];
if(match$0){
var rest$0 = match$0[2], v$0 = match$0[1], k$0 = a[1];
- Sx_types[55].call(null, d, k$0, v$0);
+ Sx_types[63].call(null, d, k$0, v$0);
param = rest$0;
continue;
}
break;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dict: pairs of key value"], 1);
+ ([0, Sx_types[7], "dict: pairs of key value"], 1);
}
});
register
@@ -27586,11 +27617,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 2:
if(b[2]) break a;
var k = c[1];
- return Sx_types[53].call(null, d, k);
+ return Sx_types[61].call(null, d, k);
case 4:
if(b[2]) break a;
var k$0 = c[1];
- return Sx_types[53].call(null, d, k$0);
+ return Sx_types[61].call(null, d, k$0);
}
break;
case 19:
@@ -27631,13 +27662,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 2:
if(! a[2]){
var k = b[1];
- return [0, Sx_types[54].call(null, d, k)];
+ return [0, Sx_types[62].call(null, d, k)];
}
break;
case 4:
if(! a[2]){
var k$0 = b[1];
- return [0, Sx_types[54].call(null, d, k$0)];
+ return [0, Sx_types[62].call(null, d, k$0)];
}
break;
}
@@ -27645,7 +27676,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "has-key?: dict and key"], 1);
+ ([0, Sx_types[7], "has-key?: dict and key"], 1);
});
register
("assoc",
@@ -27683,12 +27714,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
break;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "assoc: pairs"], 1);
+ ([0, Sx_types[7], "assoc: pairs"], 1);
}
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "assoc: dict + pairs"], 1);
+ ([0, Sx_types[7], "assoc: dict + pairs"], 1);
});
register
("dissoc",
@@ -27711,12 +27742,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dissoc: dict + keys"], 1);
+ ([0, Sx_types[7], "dissoc: dict + keys"], 1);
});
register
("merge",
function(args){
- var d = Sx_types[52].call(null, 0);
+ var d = Sx_types[60].call(null, 0);
Stdlib_List[18].call
(null,
function(param){
@@ -27730,7 +27761,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
src);
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "merge: all args must be dicts"], 1);
+ ([0, Sx_types[7], "merge: all args must be dicts"], 1);
},
args);
return [6, d];
@@ -27742,10 +27773,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
var d = a[1];
- return [5, Sx_types[57].call(null, d)];
+ return [5, Sx_types[65].call(null, d)];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "keys: 1 dict"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "keys: 1 dict"], 1);
});
register
("vals",
@@ -27754,10 +27785,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 6 === a[0] && ! args[2]){
var d = a[1];
- return [5, Sx_types[58].call(null, d)];
+ return [5, Sx_types[66].call(null, d)];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "vals: 1 dict"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "vals: 1 dict"], 1);
});
register("mutable-list", function(args){return [19, [0, 0]];});
register
@@ -27774,7 +27805,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(f && ! f[2])
throw caml_maybe_attach_backtrace
([0,
- Sx_types[2],
+ Sx_types[7],
"set-nth!: list is immutable, use ListRef"],
1);
}
@@ -27798,7 +27829,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "set-nth!: expected (list idx val)"], 1);
+ ([0, Sx_types[7], "set-nth!: expected (list idx val)"], 1);
});
register
("dict-set!",
@@ -27815,7 +27846,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var e = a[2];
if(e && ! e[2]){
var v = e[1], k = b[1];
- Sx_types[55].call(null, d, k, v);
+ Sx_types[63].call(null, d, k, v);
return v;
}
break;
@@ -27823,7 +27854,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var f = a[2];
if(f && ! f[2]){
var v$0 = f[1], k$0 = b[1];
- Sx_types[55].call(null, d, k$0, v$0);
+ Sx_types[63].call(null, d, k$0, v$0);
return v$0;
}
break;
@@ -27832,7 +27863,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dict-set!: dict key val"], 1);
+ ([0, Sx_types[7], "dict-set!: dict key val"], 1);
});
register
("dict-get",
@@ -27846,12 +27877,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof b !== "number")
switch(b[0]){
case 2:
- if(! a[2]){var k = b[1]; return Sx_types[53].call(null, d, k);}
+ if(! a[2]){var k = b[1]; return Sx_types[61].call(null, d, k);}
break;
case 4:
if(! a[2]){
var k$0 = b[1];
- return Sx_types[53].call(null, d, k$0);
+ return Sx_types[61].call(null, d, k$0);
}
break;
}
@@ -27859,7 +27890,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dict-get: dict and key"], 1);
+ ([0, Sx_types[7], "dict-get: dict and key"], 1);
});
register
("dict-has?",
@@ -27872,13 +27903,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var c = b[1];
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
var k = c[1], d = a[1];
- return [0, Sx_types[54].call(null, d, k)];
+ return [0, Sx_types[62].call(null, d, k)];
}
}
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dict-has?: dict and key"], 1);
+ ([0, Sx_types[7], "dict-has?: dict and key"], 1);
});
register
("dict-delete!",
@@ -27891,42 +27922,42 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var c = b[1];
if(typeof c !== "number" && 2 === c[0] && ! b[2]){
var k = c[1], d = a[1];
- Sx_types[56].call(null, d, k);
+ Sx_types[64].call(null, d, k);
return 0;
}
}
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dict-delete!: dict and key"], 1);
+ ([0, Sx_types[7], "dict-delete!: dict and key"], 1);
});
register
("type-of",
function(args){
if(args && ! args[2]){
var a = args[1];
- return [2, Sx_types[23].call(null, a)];
+ return [2, Sx_types[31].call(null, a)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "type-of: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "type-of: 1 arg"], 1);
});
register
("inspect",
function(args){
if(args && ! args[2]){
var a = args[1];
- return [2, Sx_types[59].call(null, a)];
+ return [2, Sx_types[67].call(null, a)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "inspect: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "inspect: 1 arg"], 1);
});
register
("serialize",
function(args){
if(args && ! args[2]){
var a = args[1];
- return [2, Sx_types[59].call(null, a)];
+ return [2, Sx_types[67].call(null, a)];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "serialize: 1 arg"], 1);
+ ([0, Sx_types[7], "serialize: 1 arg"], 1);
});
register
("make-symbol",
@@ -27936,7 +27967,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [3, s];}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "make-symbol: expected string"], 1);
+ ([0, Sx_types[7], "make-symbol: expected string"], 1);
});
register
("error",
@@ -27947,14 +27978,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 2 === a[0]){
if(args[2]) break a;
var msg = a[1];
- throw caml_maybe_attach_backtrace([0, Sx_types[2], msg], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], msg], 1);
}
if(! args[2]){
var b = to_string(a);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "error: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "error: 1 arg"], 1);
});
register
("apply",
@@ -27983,7 +28014,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "apply: function and list"], 1);
+ ([0, Sx_types[7], "apply: function and list"], 1);
});
register
("identical?",
@@ -27996,7 +28027,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "identical?: 2 args"], 1);
+ ([0, Sx_types[7], "identical?: 2 args"], 1);
});
register
("make-spread",
@@ -28013,7 +28044,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "make-spread: 1 dict"], 1);
+ ([0, Sx_types[7], "make-spread: 1 dict"], 1);
});
var H = [0, 0], I = [0, 1];
register
@@ -28025,7 +28056,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number" && 16 === a[0]){if(args[2]) break a; return I;}
if(! args[2]) return H;
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "spread?: 1 arg"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "spread?: 1 arg"], 1);
});
register
("spread-attrs",
@@ -28033,19 +28064,19 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(args){
var a = args[1];
if(typeof a !== "number" && 16 === a[0] && ! args[2]){
- var pairs = a[1], d = Sx_types[52].call(null, 0);
+ var pairs = a[1], d = Sx_types[60].call(null, 0);
Stdlib_List[18].call
(null,
function(param){
var v = param[2], k = param[1];
- return Sx_types[55].call(null, d, k, v);
+ return Sx_types[63].call(null, d, k, v);
},
pairs);
return [6, d];
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "spread-attrs: 1 spread"], 1);
+ ([0, Sx_types[7], "spread-attrs: 1 spread"], 1);
});
function call_any(f, args){
if(typeof f !== "number" && 13 === f[0]){
@@ -28081,7 +28112,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "map: expected (fn list)"], 1);
+ ([0, Sx_types[7], "map: expected (fn list)"], 1);
});
var K = [5, 0];
register
@@ -28111,7 +28142,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "map-indexed: expected (fn list)"], 1);
+ ([0, Sx_types[7], "map-indexed: expected (fn list)"], 1);
});
var L = [5, 0];
register
@@ -28137,14 +28168,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(x){
var a = call_any(f, [0, x, 0]);
- return Sx_types[32].call(null, a);
+ return Sx_types[40].call(null, a);
},
items)];
}
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "filter: expected (fn list)"], 1);
+ ([0, Sx_types[7], "filter: expected (fn list)"], 1);
});
var
M =
@@ -28181,11 +28212,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
c =
Stdlib_List[20].call
- (null, function(v){return Sx_types[23].call(null, v);}, args),
+ (null, function(v){return Sx_types[31].call(null, v);}, args),
types = Stdlib_String[7].call(null, ", ", c),
d = Stdlib_List[1].call(null, args),
e = caml_call2(Stdlib_Printf[4].call(null, M), types, d);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], e], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], e], 1);
});
register
("reduce",
@@ -28216,7 +28247,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "reduce: expected (fn init list)"], 1);
+ ([0, Sx_types[7], "reduce: expected (fn init list)"], 1);
});
var N = [0, 0], O = [0, 0];
register
@@ -28244,7 +28275,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(x){
var a = call_any(f, [0, x, 0]);
- return Sx_types[32].call(null, a);
+ return Sx_types[40].call(null, a);
},
items);
return c;
@@ -28258,7 +28289,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "some: expected (fn list)"], 1);
+ ([0, Sx_types[7], "some: expected (fn list)"], 1);
});
var P = [0, 1];
register
@@ -28284,14 +28315,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(x){
var a = call_any(f, [0, x, 0]);
- return Sx_types[32].call(null, a);
+ return Sx_types[40].call(null, a);
},
items)];
}
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "every?: expected (fn list)"], 1);
+ ([0, Sx_types[7], "every?: expected (fn list)"], 1);
});
register
("make-vm-stack",
@@ -28306,7 +28337,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "make-vm-stack: expected (size)"], 1);
+ ([0, Sx_types[7], "make-vm-stack: expected (size)"], 1);
});
register
("vm-stack-get",
@@ -28325,7 +28356,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "vm-stack-get: expected (stack idx)"], 1);
+ ([0, Sx_types[7], "vm-stack-get: expected (stack idx)"], 1);
});
register
("vm-stack-set!",
@@ -28350,7 +28381,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "vm-stack-set!: expected (stack idx val)"], 1);
+ ([0, Sx_types[7], "vm-stack-set!: expected (stack idx val)"], 1);
});
register
("vm-stack-length",
@@ -28363,7 +28394,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "vm-stack-length: expected (stack)"], 1);
+ ([0, Sx_types[7], "vm-stack-length: expected (stack)"], 1);
});
register
("vm-stack-copy!",
@@ -28400,7 +28431,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "vm-stack-copy!: expected (src dst count)"], 1);
+ ([0, Sx_types[7], "vm-stack-copy!: expected (src dst count)"], 1);
});
var Q = [0, 0];
register
@@ -28451,7 +28482,30 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return V;
});
- var Y = [0, 0], Z = [0, 1], _ = [0, 1];
+ var Y = [0, 0];
+ register
+ ("cond-scheme?",
+ function(args){
+ if(args){
+ var a = args[1];
+ if(typeof a !== "number" && 5 === a[0] && ! args[2]){
+ var clauses = a[1];
+ return [0,
+ Stdlib_List[33].call
+ (null,
+ function(c){
+ if(typeof c !== "number" && 5 === c[0]){
+ var l = c[1];
+ return 2 === Stdlib_List[1].call(null, l) ? 1 : 0;
+ }
+ return 0;
+ },
+ clauses)];
+ }
+ }
+ return Y;
+ });
+ var Z = [0, 0], _ = [0, 1], $ = [0, 1];
register
("component?",
function(args){
@@ -28460,12 +28514,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(typeof a !== "number")
switch(a[0]){
case 8:
- if(! args[2]) return Z; break;
- case 9:
if(! args[2]) return _; break;
+ case 9:
+ if(! args[2]) return $; break;
}
}
- return Y;
+ return Z;
});
register
("lambda-closure",
@@ -28491,7 +28545,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return 0;
});
- var $ = [0, 0];
+ var aa = [0, 0];
register
("component-has-children?",
function(args){
@@ -28505,7 +28559,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(! args[2]){var i = a[1]; return [0, i[3]];} break;
}
}
- return $;
+ return aa;
});
register
("component-name",
@@ -28522,7 +28576,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return 0;
});
- var aa = [5, 0];
+ var ab = [5, 0];
register
("component-params",
function(args){
@@ -28548,7 +28602,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
break;
}
}
- return aa;
+ return ab;
});
register
("component-body",
@@ -28565,15 +28619,15 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return 0;
});
- var ab = [0, 0], ac = [0, 1];
+ var ac = [0, 0], ad = [0, 1];
register
("macro?",
function(args){
if(args){
var a = args[1];
- if(typeof a !== "number" && 10 === a[0] && ! args[2]) return ac;
+ if(typeof a !== "number" && 10 === a[0] && ! args[2]) return ad;
}
- return ab;
+ return ac;
});
register
("for-each-indexed",
@@ -28602,9 +28656,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "for-each-indexed: expected (fn list)"], 1);
+ ([0, Sx_types[7], "for-each-indexed: expected (fn list)"], 1);
});
- var ad = [5, 0];
+ var ae = [5, 0];
register
("lambda-params",
function(args){
@@ -28616,7 +28670,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Stdlib_List[20].call(null, function(s){return [2, s];}, l[1])];
}
}
- return ad;
+ return ae;
});
register
("lambda-body",
@@ -28627,7 +28681,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return 0;
});
- var ae = [0, 1];
+ var af = [0, 1];
register
("empty-dict?",
function(args){
@@ -28638,7 +28692,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, 0 === Stdlib_Hashtbl[15].call(null, d) ? 1 : 0];
}
}
- return ae;
+ return af;
});
register
("make-raw-html",
@@ -28649,7 +28703,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return 0;
});
- var af = [2, cst];
+ var ag = [2, cst];
register
("raw-html-content",
function(args){
@@ -28657,7 +28711,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 15 === a[0] && ! args[2]){var s = a[1]; return [2, s];}
}
- return af;
+ return ag;
});
var cst_VM_undefined = "VM undefined: ";
register
@@ -28671,11 +28725,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
match = Stdlib_Hashtbl[7].call(null, primitives, name);
if(match){var fn = match[1]; return [13, name, fn];}
var b = Stdlib[28].call(null, cst_VM_undefined, name);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "get-primitive: expected (name)"], 1);
+ ([0, Sx_types[7], "get-primitive: expected (name)"], 1);
});
register
("call-primitive",
@@ -28692,7 +28746,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match = Stdlib_Hashtbl[7].call(null, primitives, name);
if(match){var fn = match[1]; return caml_call1(fn, 0);}
var e = Stdlib[28].call(null, cst_VM_undefined, name);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], e], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], e], 1);
}
}
else{
@@ -28707,18 +28761,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match$0 = Stdlib_Hashtbl[7].call(null, primitives, name);
if(match$0){var fn$0 = match$0[1]; return caml_call1(fn$0, a);}
var f = Stdlib[28].call(null, cst_VM_undefined, name);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], f], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], f], 1);
}
}
}
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "call-primitive: expected (name args-list)"],
+ ([0, Sx_types[7], "call-primitive: expected (name args-list)"],
1);
});
runtime.caml_register_global
- (347,
+ (349,
[0,
primitives,
sx_call_fn,
@@ -28737,7 +28791,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
(globalThis));
-//# 4007 "../lib/.sx.objs/jsoo/default/sx.cma.js"
+//# 4061 "../lib/.sx.objs/jsoo/default/sx.cma.js"
//# shape: Sx_runtime:[F(2),F(1),F(1),F(1),F(1),F(2),F(2),F(2),F(3),F(2),F(1),F(1),F(1),F(1),F(2),F(2),F(2),F(1),F(1),F(2),F(2),F(1),F(2),F(1),F(1),F(1),F(2),F(1),F(2),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(2),F(2),F(2),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(1),F(2),F(2),F(3),F(2),F(3),F(1),F(1),F(3),F(2),F(2),F(1),F(1),F(3),F(2),F(2),F(2),F(1),F(1),F(2),F(1),F(1),F(1),F(2),F(2),F(3),F(1),F(1),F(1),F(1),F(2),F(2),F(1),F(1),F(1),F(2),F(1),F(1),F(2),F(1),F(2),F(1)*,F(1)*,F(1),F(2),F(2),F(3),F(3),F(1),F(1),F(2),F(2),F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1)*,F(1),F(1)*,F(2)*,F(1),F(1),F(1)*,F(2),F(2),F(2),F(2),F(1)*,F(2),F(1),F(4),F(2),F(1),F(1),F(2),F(2),F(1),N,F(2),N,N,F(1)*,F(1),F(2),F(1),F(2),F(2),F(1),F(2),F(1),F(1)*,F(1)*,F(2),F(1)*,F(2)*,F(1)*,F(1)*,F(2),F(4),F(4),F(4),F(2),F(2),F(2),F(2),F(2),F(2),F(2)*]
(function
(globalThis){
@@ -28771,7 +28825,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match = Stdlib_Hashtbl[7].call(null, Sx_primitives[1], name);
if(match){var f = match[1]; return caml_call1(f, args);}
var a = Stdlib[28].call(null, "Unknown primitive: ", name);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], a], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);
}
var cst = "", a = [0, [8, [0, 0, 3], 0, 0, 0], "%g"];
function value_to_str(v){
@@ -28788,7 +28842,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 3:
case 4:
var s = v[1]; return s;
- default: return Sx_types[59].call(null, v);
+ default: return Sx_types[67].call(null, v);
}
}
function sx_to_string(v){return [2, value_to_str(v)];}
@@ -28805,19 +28859,19 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var r = v[1]; return r[1];
default:
var
- a = Sx_types[23].call(null, v),
+ a = Sx_types[31].call(null, v),
b = Stdlib[28].call(null, "Expected list, got ", a);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
}
function sx_call(f, args){
if(typeof f !== "number")
switch(f[0]){
case 7:
- var l = f[1], local = Sx_types[5].call(null, l[3]);
+ var l = f[1], local = Sx_types[10].call(null, l[3]);
Stdlib_List[28].call
(null,
- function(p, a){Sx_types[6].call(null, local, p, a); return 0;},
+ function(p, a){Sx_types[11].call(null, local, p, a); return 0;},
l[1],
args);
return [11, l[2], local];
@@ -28828,12 +28882,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 13:
var fn = f[2]; return caml_call1(fn, args);
case 22:
- var cl = f[1]; return caml_call2(Sx_types[1][1], cl, args);
+ var cl = f[1]; return caml_call2(Sx_types[6][1], cl, args);
}
var
- a = Sx_types[59].call(null, f),
+ a = Sx_types[67].call(null, f),
b = Stdlib[28].call(null, "Not callable: ", a);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
Sx_primitives[2][1] = sx_call;
function sx_apply(f, args_list){return sx_call(f, sx_to_list(args_list));}
@@ -28849,9 +28903,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return lst;
}
var
- a = Sx_types[23].call(null, lst),
+ a = Sx_types[31].call(null, lst),
b = Stdlib[28].call(null, "append!: expected list, got ", a);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
function sx_dict_set_b(d, k, v){
if(typeof d !== "number" && 6 === d[0]){
@@ -28864,7 +28918,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "dict-set!: expected dict and string key"], 1);
+ ([0, Sx_types[7], "dict-set!: expected dict and string key"], 1);
}
var
cst_body = "body",
@@ -28887,7 +28941,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
switch(key[0]){
case 2:
case 4:
- var k = key[1]; return Sx_types[53].call(null, d, k);
+ var k = key[1]; return Sx_types[61].call(null, d, k);
default: break a;
}
case 19:
@@ -28984,14 +29038,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "get: 2-3 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "get: 2-3 args"], 1);
});
function prim(name){
var match = Stdlib_Hashtbl[7].call(null, Sx_primitives[1], name);
if(! match)
return function(param){
var a = Stdlib[28].call(null, "Missing prim: ", name);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], a], 1);};
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);};
var f = match[1];
return f;
}
@@ -29109,9 +29163,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function parse_float(a){return caml_call1(prim("parse-float"), [0, a, 0]);}
function error(msg){
var a = value_to_str(msg);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], a], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], a], 1);
}
- function inspect(v){return [2, Sx_types[59].call(null, v)];}
+ function inspect(v){return [2, Sx_types[67].call(null, v)];}
function apply(f, args){return sx_apply(f, args);}
function identical_p(a, b){
return caml_call1(prim("identical?"), [0, a, [0, b, 0]]);
@@ -29130,61 +29184,61 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function sx_emitted(a){return prim_call(cst_emitted, [0, a, 0]);}
function sx_context(a, b){return prim_call("context", [0, a, [0, b, 0]]);}
function trampoline(v){return v;}
- function type_of(v){return [2, Sx_types[23].call(null, v)];}
+ function type_of(v){return [2, Sx_types[31].call(null, v)];}
function unwrap_env(v){
- if(typeof v === "number") return Sx_types[4].call(null, 0);
+ if(typeof v === "number") return Sx_types[9].call(null, 0);
switch(v[0]){
case 6:
- var d = v[1], e = Sx_types[4].call(null, 0);
+ var d = v[1], e = Sx_types[9].call(null, 0);
Stdlib_Hashtbl[12].call
- (null, function(k, v){Sx_types[6].call(null, e, k, v); return 0;}, d);
+ (null, function(k, v){Sx_types[11].call(null, e, k, v); return 0;}, d);
return e;
case 18:
var e$0 = v[1]; return e$0;
default:
var
- a = Sx_types[23].call(null, v),
+ a = Sx_types[31].call(null, v),
b = Stdlib[28].call(null, "Expected env, got ", a);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
}
function env_has(e, name){
var a = value_to_str(name), b = unwrap_env(e);
- return [0, Sx_types[7].call(null, b, a)];
+ return [0, Sx_types[13].call(null, b, a)];
}
function env_get(e, name){
var a = value_to_str(name), b = unwrap_env(e);
- return Sx_types[8].call(null, b, a);
+ return Sx_types[15].call(null, b, a);
}
function env_bind(e, name, v){
var a = value_to_str(name), b = unwrap_env(e);
- return Sx_types[6].call(null, b, a, v);
+ return Sx_types[11].call(null, b, a, v);
}
function env_set(e, name, v){
var a = value_to_str(name), b = unwrap_env(e);
- return Sx_types[9].call(null, b, a, v);
+ return Sx_types[17].call(null, b, a, v);
}
- function make_env(param){return [18, Sx_types[4].call(null, 0)];}
+ function make_env(param){return [18, Sx_types[9].call(null, 0)];}
function env_extend(e){
var a = unwrap_env(e);
- return [18, Sx_types[5].call(null, a)];
+ return [18, Sx_types[10].call(null, a)];
}
function env_merge(a, b){
var c = unwrap_env(b), d = unwrap_env(a);
- return [18, Sx_types[10].call(null, d, c)];
+ return [18, Sx_types[18].call(null, d, c)];
}
function set_lambda_name(l, n){
var a = value_to_str(n);
- return Sx_types[39].call(null, l, a);
+ return Sx_types[47].call(null, l, a);
}
- function is_nil(v){return [0, Sx_types[24].call(null, v)];}
- function is_thunk(v){return [0, Sx_types[29].call(null, v)];}
- function is_lambda(v){return [0, Sx_types[25].call(null, v)];}
- function is_component(v){return [0, Sx_types[26].call(null, v)];}
- function is_island(v){return [0, Sx_types[27].call(null, v)];}
- function is_macro(v){return [0, Sx_types[28].call(null, v)];}
- function is_signal(v){return [0, Sx_types[30].call(null, v)];}
- function is_callable(v){return [0, Sx_types[31].call(null, v)];}
+ function is_nil(v){return [0, Sx_types[32].call(null, v)];}
+ function is_thunk(v){return [0, Sx_types[37].call(null, v)];}
+ function is_lambda(v){return [0, Sx_types[33].call(null, v)];}
+ function is_component(v){return [0, Sx_types[34].call(null, v)];}
+ function is_island(v){return [0, Sx_types[35].call(null, v)];}
+ function is_macro(v){return [0, Sx_types[36].call(null, v)];}
+ function is_signal(v){return [0, Sx_types[38].call(null, v)];}
+ function is_callable(v){return [0, Sx_types[39].call(null, v)];}
function is_identical(a, b){return [0, a === b ? 1 : 0];}
function is_primitive(name){
var a = value_to_str(name);
@@ -29223,7 +29277,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [6, result];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "map-dict: expected dict"], 1);
+ ([0, Sx_types[7], "map-dict: expected dict"], 1);
}
function for_each(fn, coll){
var a = sx_to_list(coll);
@@ -29256,7 +29310,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [6, d];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "not a continuation"], 1);
+ ([0, Sx_types[7], "not a continuation"], 1);
}
function dynamic_wind_call(before, body, after, env){
sx_call(before, 0);
@@ -29282,7 +29336,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function register_special_form(name, handler){
if(6 !== custom_special_forms[0])
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "custom_special_forms not a dict"], 1);
+ ([0, Sx_types[7], "custom_special_forms not a dict"], 1);
var tbl = custom_special_forms[1], a = value_to_str(name);
Stdlib_Hashtbl[11].call(null, tbl, a, handler);
return handler;
@@ -29322,11 +29376,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 14:
var sig = s[1]; return sig[1];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_not_a_signal], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_not_a_signal], 1);
}
function signal_set_value(s, v){
if(typeof s !== "number" && 14 === s[0]){var sig = s[1]; sig[1] = v; return v;}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_not_a_signal], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_not_a_signal], 1);
}
var h = [5, 0];
function signal_subscribers(s){
@@ -29666,7 +29720,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
(globalThis));
-//# 4937 "../lib/.sx.objs/jsoo/default/sx.cma.js"
+//# 4991 "../lib/.sx.objs/jsoo/default/sx.cma.js"
//# shape: Sx_ref:[N,F(1),N,N,N,F(3)*,F(3)*,F(1),F(1),F(1),F(1),F(1),F(1),F(3)*,F(2)*,F(2)*,F(4)*,F(4)*,F(2)*,F(6)*,F(3)*,F(3)*,F(3)*,F(2)*,F(4)*,F(4)*,F(5)*,F(3)*,F(3)*,F(3)*,F(3)*,F(3)*,F(4)*,F(4)*,F(1)*,F(3)*,F(2)*,F(2)*,F(4)*,F(3)*,F(1)*,F(4)*,F(1),F(2),F(1),F(1),F(1),F(1),F(2),F(2),F(1),F(1),N,F(2),N,N,N,F(1),N,F(1),F(2),F(2),F(3),F(3),F(3),F(2),F(1),F(1),F(2),F(2),F(2),F(3),F(1),F(2),F(2),F(1),F(2),F(2),F(3),F(2),F(2),F(2),F(3),F(1),F(1),F(1),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(2),F(3),F(4),F(1),F(1)*,F(2),F(4),F(3),F(3),F(3),F(3),F(3),F(3),F(3),F(1),F(5),F(4),F(2),F(1),F(2),F(1)]
(function
(globalThis){
@@ -29718,7 +29772,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
d = [0, Sx_runtime[23].call(null, state, b), a],
and = Sx_runtime[1].call(null, cst, d);
- if(! Sx_types[32].call(null, and)) return and;
+ if(! Sx_types[40].call(null, and)) return and;
var e = Sx_runtime[23].call(null, state, c);
return Sx_runtime[32].call(null, e);
}
@@ -29769,7 +29823,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
var cst_arg = "arg";
function make_arg_frame(f, evaled, remaining, env, raw_args, head_name){
- var head_name$0 = Sx_types[32].call(null, head_name) ? head_name : 0;
+ var head_name$0 = Sx_types[40].call(null, head_name) ? head_name : 0;
return [21,
[0,
cst_arg,
@@ -29847,7 +29901,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
var cst_scope_acc = "scope-acc", k = [5, 0];
function make_scope_acc_frame(name, value, remaining, env){
- var value$0 = Sx_types[32].call(null, value) ? value : 0;
+ var value$0 = Sx_types[40].call(null, value) ? value : 0;
return [21,
[0, cst_scope_acc, env, name, 0, remaining, 0, 0, 0, value$0, k]];
}
@@ -29922,21 +29976,21 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var k = kont, captured$0 = captured;
for(;;){
var a = Sx_runtime[32].call(null, k);
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var b = Sx_runtime[2].call(null, m);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
var
frame = Sx_runtime[12].call(null, k),
c = [0, frame_type(frame), n],
or = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, or))
+ if(Sx_types[40].call(null, or))
var or$0 = or;
else
var
d = [0, frame_type(frame), o],
or$0 = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, or$0))
+ if(Sx_types[40].call(null, or$0))
return [5, [0, captured$0, [0, Sx_runtime[13].call(null, k), 0]]];
var
captured$1 =
@@ -29952,18 +30006,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var kont = kont$1;
for(;;){
var b = Sx_runtime[32].call(null, kont);
- if(Sx_types[32].call(null, b)) return 0;
+ if(Sx_types[40].call(null, b)) return 0;
var
frame = Sx_runtime[12].call(null, kont),
c = [0, frame_type(frame), p],
and = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
d = [0, Sx_runtime[23].call(null, frame, q), [0, name, 0]],
a = Sx_runtime[1].call(null, cst, d);
else
var a = and;
- if(Sx_types[32].call(null, a)) return frame;
+ if(Sx_types[40].call(null, a)) return frame;
var kont$0 = Sx_runtime[13].call(null, kont);
kont = kont$0;
}
@@ -29973,18 +30027,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var kont = kont$1;
for(;;){
var b = Sx_runtime[32].call(null, kont);
- if(Sx_types[32].call(null, b)) return 0;
+ if(Sx_types[40].call(null, b)) return 0;
var
frame = Sx_runtime[12].call(null, kont),
c = [0, frame_type(frame), r],
and = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
d = [0, Sx_runtime[23].call(null, frame, s), [0, name, 0]],
a = Sx_runtime[1].call(null, cst, d);
else
var a = and;
- if(Sx_types[32].call(null, a)) return frame;
+ if(Sx_types[40].call(null, a)) return frame;
var kont$0 = Sx_runtime[13].call(null, kont);
kont = kont$0;
}
@@ -29994,11 +30048,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var kont = kont$1;
for(;;){
var a = Sx_runtime[32].call(null, kont);
- if(Sx_types[32].call(null, a)) return t;
+ if(Sx_types[40].call(null, a)) return t;
var
b = [0, frame_type(Sx_runtime[12].call(null, kont)), u],
c = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, c)) return v;
+ if(Sx_types[40].call(null, c)) return v;
var kont$0 = Sx_runtime[13].call(null, kont);
kont = kont$0;
}
@@ -30011,15 +30065,15 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var k = kont, captured = captured$0;
for(;;){
var a = Sx_runtime[32].call(null, k);
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var b = Sx_runtime[2].call(null, w);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
var
frame = Sx_runtime[12].call(null, k),
c = [0, frame_type(frame), x],
d = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, d))
+ if(Sx_types[40].call(null, d))
return [5,
[0, captured, [0, frame, [0, Sx_runtime[13].call(null, k), 0]]]];
var
@@ -30072,40 +30126,40 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var expected_type = expected_type$1;
for(;;){
var a = Sx_runtime[1].call(null, cst, [0, expected_type, y]);
- if(Sx_types[32].call(null, a)) return z;
+ if(Sx_types[40].call(null, a)) return z;
var b = Sx_runtime[1].call(null, cst, [0, expected_type, A]);
- if(Sx_types[32].call(null, b)) return Sx_runtime[34].call(null, val);
+ if(Sx_types[40].call(null, b)) return Sx_runtime[34].call(null, val);
var c = Sx_runtime[1].call(null, cst, [0, expected_type, B]);
- if(Sx_types[32].call(null, c)) return Sx_runtime[35].call(null, val);
+ if(Sx_types[40].call(null, c)) return Sx_runtime[35].call(null, val);
var d = Sx_runtime[1].call(null, cst, [0, expected_type, C]);
- if(Sx_types[32].call(null, d)) return Sx_runtime[36].call(null, val);
+ if(Sx_types[40].call(null, d)) return Sx_runtime[36].call(null, val);
var e = Sx_runtime[1].call(null, cst, [0, expected_type, D]);
- if(Sx_types[32].call(null, e)) return Sx_runtime[106].call(null, val);
+ if(Sx_types[40].call(null, e)) return Sx_runtime[106].call(null, val);
var f = Sx_runtime[1].call(null, cst, [0, expected_type, E]);
- if(Sx_types[32].call(null, f)) return Sx_runtime[37].call(null, val);
+ if(Sx_types[40].call(null, f)) return Sx_runtime[37].call(null, val);
var g = Sx_runtime[1].call(null, cst, [0, expected_type, F]);
- if(Sx_types[32].call(null, g)) return Sx_runtime[38].call(null, val);
+ if(Sx_types[40].call(null, g)) return Sx_runtime[38].call(null, val);
var h = Sx_runtime[1].call(null, cst, [0, expected_type, G]);
- if(Sx_types[32].call(null, h)) return Sx_runtime[108].call(null, val);
+ if(Sx_types[40].call(null, h)) return Sx_runtime[108].call(null, val);
var i = Sx_runtime[1].call(null, cst, [0, expected_type, H]);
- if(Sx_types[32].call(null, i)){
+ if(Sx_types[40].call(null, i)){
var j = [0, Sx_runtime[96].call(null, val), I];
return Sx_runtime[1].call(null, cst, j);
}
var k = Sx_runtime[1].call(null, cst, [0, expected_type, J]);
- if(Sx_types[32].call(null, k)){
+ if(Sx_types[40].call(null, k)){
var l = [0, Sx_runtime[96].call(null, val), K];
return Sx_runtime[1].call(null, cst, l);
}
var
and = Sx_runtime[35].call(null, expected_type),
m =
- Sx_types[32].call(null, and)
+ Sx_types[40].call(null, and)
? Sx_runtime[1].call(null, "ends-with?", [0, expected_type, L])
: and;
- if(! Sx_types[32].call(null, m)) return O;
+ if(! Sx_types[40].call(null, m)) return O;
var or = Sx_runtime[106].call(null, val);
- if(Sx_types[32].call(null, or)) return or;
+ if(Sx_types[40].call(null, or)) return or;
var
n =
[0,
@@ -30147,14 +30201,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function strict_check_args(name, args){
var
and = strict_ref[1],
- b = Sx_types[32].call(null, and) ? prim_param_types_ref[1] : and;
- if(! Sx_types[32].call(null, b)) return 0;
+ b = Sx_types[40].call(null, and) ? prim_param_types_ref[1] : and;
+ if(! Sx_types[40].call(null, b)) return 0;
var spec = Sx_runtime[23].call(null, prim_param_types_ref[1], name);
- if(! Sx_types[32].call(null, spec)) return 0;
+ if(! Sx_types[40].call(null, spec)) return 0;
var
positional = Sx_runtime[23].call(null, spec, P),
rest_type = Sx_runtime[23].call(null, spec, Q);
- if(Sx_types[32].call(null, positional)){
+ if(Sx_types[40].call(null, positional)){
var
c = Sx_runtime[5].call(null, positional),
d =
@@ -30174,12 +30228,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
p_type = Sx_runtime[15].call(null, param, S),
a = [0, idx, [0, Sx_runtime[22].call(null, args), 0]],
b = Sx_runtime[1].call(null, cst$3, a);
- if(Sx_types[32].call(null, b)){
+ if(Sx_types[40].call(null, b)){
var
val = Sx_runtime[15].call(null, args, idx),
c = value_matches_type_p(val, p_type),
- d = [0, 1 - Sx_types[32].call(null, c)];
- if(Sx_types[32].call(null, d)){
+ d = [0, 1 - Sx_types[40].call(null, c)];
+ if(Sx_types[40].call(null, d)){
var
e = [0, U, [0, [2, Sx_runtime[4].call(null, [0, val, 0])], T]],
f =
@@ -30196,24 +30250,24 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
[0, p_name, [0, V, [0, Sx_runtime[96].call(null, val), e]]]]]]]],
g = [2, Sx_runtime[4].call(null, f)],
h = Sx_runtime[2].call(null, g);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], h], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], h], 1);
}
}
return 0;
},
e);
}
- if(Sx_types[32].call(null, rest_type))
+ if(Sx_types[40].call(null, rest_type))
var
- positional$0 = Sx_types[32].call(null, positional) ? positional : af,
+ positional$0 = Sx_types[40].call(null, positional) ? positional : af,
f = [0, Sx_runtime[22].call(null, positional$0), 0],
g = [0, Sx_runtime[22].call(null, args), f],
a = Sx_runtime[1].call(null, cst$4, g);
else
var a = rest_type;
- if(! Sx_types[32].call(null, a)) return 0;
+ if(! Sx_types[40].call(null, a)) return 0;
var
- positional$1 = Sx_types[32].call(null, positional) ? positional : ae,
+ positional$1 = Sx_types[40].call(null, positional) ? positional : ae,
h = [0, args, [0, Sx_runtime[22].call(null, positional$1), 0]],
i = Sx_runtime[1].call(null, cst_slice, h),
j = Sx_runtime[5].call(null, i),
@@ -30231,8 +30285,8 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
idx = Sx_runtime[12].call(null, pair),
val = Sx_runtime[15].call(null, pair, Z),
a = value_matches_type_p(val, rest_type),
- b = [0, 1 - Sx_types[32].call(null, a)];
- if(! Sx_types[32].call(null, b)) return 0;
+ b = [0, 1 - Sx_types[40].call(null, a)];
+ if(! Sx_types[40].call(null, b)) return 0;
var
c = [0, $, [0, [2, Sx_runtime[4].call(null, [0, val, 0])], _]],
d =
@@ -30249,7 +30303,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
[0, idx, [0, aa, [0, Sx_runtime[96].call(null, val), c]]]]]]]],
e = [2, Sx_runtime[4].call(null, d)],
f = Sx_runtime[2].call(null, e);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], f], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], f], 1);
},
l);
return 0;
@@ -30263,7 +30317,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
aj = [2, cst_lambda],
ak = [1, 1.];
function bind_lambda_params(f, args, local){
- var params = Sx_types[35].call(null, f);
+ var params = Sx_types[43].call(null, f);
a:
{
if(typeof params !== "number")
@@ -30299,15 +30353,15 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
b = [0, Sx_runtime[22].call(null, params), 0],
c = [0, Sx_runtime[22].call(null, args), b],
d = Sx_runtime[1].call(null, cst$4, c);
- if(Sx_types[32].call(null, d)){
+ if(Sx_types[40].call(null, d)){
var
e = [0, ah, [0, Sx_runtime[22].call(null, args), 0]],
g = [0, ai, [0, Sx_runtime[22].call(null, params), e]],
- or = Sx_types[38].call(null, f),
- or$0 = Sx_types[32].call(null, or) ? or : aj,
+ or = Sx_types[46].call(null, f),
+ or$0 = Sx_types[40].call(null, or) ? or : aj,
h = [2, Sx_runtime[4].call(null, [0, or$0, g])],
i = Sx_runtime[2].call(null, h);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], i], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], i], 1);
}
var
j = Sx_runtime[1].call(null, cst_zip, [0, params, [0, args, 0]]),
@@ -30380,11 +30434,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
function call_lambda(f, args, caller_env){
var
- a = Sx_types[37].call(null, f),
+ a = Sx_types[45].call(null, f),
local = Sx_runtime[104].call(null, a, caller_env);
bind_lambda_params(f, args, local);
- var b = Sx_types[36].call(null, f);
- return Sx_types[20].call(null, b, local);
+ var b = Sx_types[44].call(null, f);
+ return Sx_types[28].call(null, b, local);
}
var cst_children = "children", al = [1, 1.], am = [2, cst_children];
function call_component(comp, raw_args, env){
@@ -30392,28 +30446,28 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
parsed = parse_keyword_args(raw_args, env),
kwargs = Sx_runtime[12].call(null, parsed),
children = Sx_runtime[15].call(null, parsed, al),
- a = Sx_types[43].call(null, comp),
+ a = Sx_types[51].call(null, comp),
local = Sx_runtime[104].call(null, a, env),
- b = Sx_types[41].call(null, comp),
+ b = Sx_types[49].call(null, comp),
c = Sx_runtime[5].call(null, b);
Stdlib_List[18].call
(null,
function(p){
var
or = Sx_runtime[68].call(null, kwargs, p),
- or$0 = Sx_types[32].call(null, or) ? or : 0,
+ or$0 = Sx_types[40].call(null, or) ? or : 0,
a = Sx_runtime[3].call(null, p);
Sx_runtime[100].call(null, local, a, or$0);
return 0;
},
c);
- var d = Sx_types[44].call(null, comp);
- if(Sx_types[32].call(null, d)){
+ var d = Sx_types[52].call(null, comp);
+ if(Sx_types[40].call(null, d)){
var e = Sx_runtime[3].call(null, am);
Sx_runtime[100].call(null, local, e, children);
}
- var f = Sx_types[42].call(null, comp);
- return Sx_types[20].call(null, f, local);
+ var f = Sx_types[50].call(null, comp);
+ return Sx_types[28].call(null, f, local);
}
var
cst_assoc = "assoc",
@@ -30451,7 +30505,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
idx = Sx_runtime[23].call(null, state, as),
skip = Sx_runtime[23].call(null, state, at);
- if(Sx_types[32].call(null, skip)){
+ if(Sx_types[40].call(null, skip)){
var
b =
[0,
@@ -30466,19 +30520,19 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
c = [0, Sx_runtime[96].call(null, arg), ax],
and = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
d = [0, Sx_runtime[22].call(null, raw_args), 0],
e = [0, Sx_runtime[1].call(null, cst_inc, [0, idx, 0]), d],
a = Sx_runtime[1].call(null, cst$3, e);
else
var a = and;
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var
f = Sx_runtime[1].call(null, cst_inc, [0, idx, 0]),
g =
trampoline(eval_expr(Sx_runtime[15].call(null, raw_args, f), env)),
- h = Sx_types[34].call(null, arg);
+ h = Sx_types[42].call(null, arg);
Sx_runtime[9].call(null, kwargs, h, g);
var
i =
@@ -30514,13 +30568,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
b = [0, Sx_runtime[96].call(null, c), aC],
and = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
d = [0, Sx_runtime[22].call(null, c), aD],
a = Sx_runtime[1].call(null, cst, d);
else
var a = and;
- return Sx_types[32].call(null, a);
+ return Sx_types[40].call(null, a);
},
a)];
}
@@ -30535,22 +30589,22 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
a = [0, Sx_runtime[96].call(null, test), aE],
and = Sx_runtime[1].call(null, cst, a);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
- b = [0, Sx_types[34].call(null, test), aF],
+ b = [0, Sx_types[42].call(null, test), aF],
or = Sx_runtime[1].call(null, cst, b);
else
var or = and;
- if(Sx_types[32].call(null, or)) return or;
+ if(Sx_types[40].call(null, or)) return or;
var
c = [0, Sx_runtime[96].call(null, test), aG],
and$0 = Sx_runtime[1].call(null, cst, c);
- if(! Sx_types[32].call(null, and$0)) return and$0;
+ if(! Sx_types[40].call(null, and$0)) return and$0;
var
- d = [0, Sx_types[33].call(null, test), aH],
+ d = [0, Sx_types[41].call(null, test), aH],
or$0 = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, or$0)) return or$0;
- var e = [0, Sx_types[33].call(null, test), aI];
+ if(Sx_types[40].call(null, or$0)) return or$0;
+ var e = [0, Sx_types[41].call(null, test), aI];
return Sx_runtime[1].call(null, cst, e);
}
var
@@ -30577,13 +30631,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function sf_named_let(args, env){
var
b = Sx_runtime[12].call(null, args),
- loop_name = Sx_types[33].call(null, b),
+ loop_name = Sx_types[41].call(null, b),
bindings = Sx_runtime[15].call(null, args, aJ),
body = Sx_runtime[1].call(null, cst_slice, [0, args, aK]),
c = Sx_runtime[12].call(null, bindings),
d = [0, Sx_runtime[96].call(null, c), aN],
and = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
e = Sx_runtime[12].call(null, bindings),
f = [0, Sx_runtime[22].call(null, e), aO],
@@ -30591,7 +30645,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
else
var a = and;
var params = [0, aL], inits = [0, aM];
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var g = Sx_runtime[5].call(null, bindings);
Stdlib_List[18].call
(null,
@@ -30600,10 +30654,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
b = Sx_runtime[12].call(null, binding),
c = [0, Sx_runtime[96].call(null, b), aP],
d = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, d))
+ if(Sx_types[40].call(null, d))
var
e = Sx_runtime[12].call(null, binding),
- a = Sx_types[33].call(null, e);
+ a = Sx_types[41].call(null, e);
else
var a = Sx_runtime[12].call(null, binding);
params[1] = Sx_runtime[8].call(null, params[1], a);
@@ -30627,11 +30681,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
c = Sx_runtime[15].call(null, bindings, b),
d = [0, Sx_runtime[96].call(null, c), aV],
e = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, e))
+ if(Sx_types[40].call(null, e))
var
f = Sx_runtime[1].call(null, cst$5, [0, pair_idx, aX]),
g = Sx_runtime[15].call(null, bindings, f),
- a = Sx_types[33].call(null, g);
+ a = Sx_types[41].call(null, g);
else
var
k = Sx_runtime[1].call(null, cst$5, [0, pair_idx, aZ]),
@@ -30650,19 +30704,19 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
h = [0, Sx_runtime[22].call(null, body), aR],
i = Sx_runtime[1].call(null, cst, h);
- if(Sx_types[32].call(null, i))
+ if(Sx_types[40].call(null, i))
var loop_body = Sx_runtime[12].call(null, body);
else
var
- n = Sx_types[21].call(null, aS),
+ n = Sx_types[29].call(null, aS),
loop_body = Sx_runtime[16].call(null, n, body);
var
- loop_fn = Sx_types[16].call(null, params[1], loop_body, env),
+ loop_fn = Sx_types[24].call(null, params[1], loop_body, env),
j = Sx_runtime[3].call(null, loop_name);
Sx_runtime[105].call(null, loop_fn, j);
var
k = Sx_runtime[3].call(null, loop_name),
- l = Sx_types[37].call(null, loop_fn);
+ l = Sx_types[45].call(null, loop_fn);
Sx_runtime[100].call(null, l, k, loop_fn);
var
m = Sx_runtime[5].call(null, inits[1]),
@@ -30689,11 +30743,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
body_exprs = Sx_runtime[13].call(null, args),
a = [0, Sx_runtime[22].call(null, body_exprs), a0],
b = Sx_runtime[1].call(null, cst, a);
- if(Sx_types[32].call(null, b))
+ if(Sx_types[40].call(null, b))
var body = Sx_runtime[12].call(null, body_exprs);
else
var
- d = Sx_types[21].call(null, a8),
+ d = Sx_types[29].call(null, a8),
body = Sx_runtime[16].call(null, d, body_exprs);
var
c = Sx_runtime[5].call(null, params_expr),
@@ -30705,23 +30759,23 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
b = [0, Sx_runtime[96].call(null, p), a1],
c = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, c)) return Sx_types[33].call(null, p);
+ if(Sx_types[40].call(null, c)) return Sx_types[41].call(null, p);
var
d = [0, Sx_runtime[96].call(null, p), a2],
and = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
e = [0, Sx_runtime[22].call(null, p), a3],
and$0 = Sx_runtime[1].call(null, cst, e);
- if(Sx_types[32].call(null, and$0)){
+ if(Sx_types[40].call(null, and$0)){
var
f = Sx_runtime[15].call(null, p, a5),
g = [0, Sx_runtime[96].call(null, f), a4],
and$1 = Sx_runtime[1].call(null, cst, g);
- if(Sx_types[32].call(null, and$1))
+ if(Sx_types[40].call(null, and$1))
var
h = Sx_runtime[15].call(null, p, a7),
- i = [0, Sx_types[34].call(null, h), a6],
+ i = [0, Sx_types[42].call(null, h), a6],
a = Sx_runtime[1].call(null, cst, i);
else
var a = and$1;
@@ -30731,12 +30785,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else
var a = and;
- if(! Sx_types[32].call(null, a)) return p;
+ if(! Sx_types[40].call(null, a)) return p;
var j = Sx_runtime[12].call(null, p);
- return Sx_types[33].call(null, j);
+ return Sx_types[41].call(null, j);
},
c)];
- return Sx_types[16].call(null, param_names, body, env);
+ return Sx_types[24].call(null, param_names, body, env);
}
var
cst_effect_annotations = "*effect-annotations*",
@@ -30760,7 +30814,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
name_sym = Sx_runtime[12].call(null, args),
params_raw = Sx_runtime[15].call(null, args, a9),
body = Sx_runtime[14].call(null, args),
- a = Sx_types[33].call(null, name_sym),
+ a = Sx_types[41].call(null, name_sym),
comp_name = Sx_runtime[161].call(null, a, a_),
parsed = parse_comp_params(params_raw),
params = Sx_runtime[12].call(null, parsed),
@@ -30768,23 +30822,23 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
param_types = Sx_runtime[15].call(null, parsed, ba),
affinity = defcomp_kwarg(args, bc, bb),
comp =
- Sx_types[17].call
+ Sx_types[25].call
(null, comp_name, params, has_children, body, env, affinity),
effects = defcomp_kwarg(args, bd, 0),
b = Sx_runtime[106].call(null, param_types),
- and = [0, 1 - Sx_types[32].call(null, b)];
- if(Sx_types[32].call(null, and)){
+ and = [0, 1 - Sx_types[40].call(null, b)];
+ if(Sx_types[40].call(null, and)){
var c = Sx_runtime[1].call(null, cst_keys, [0, param_types, 0]);
Sx_runtime[32].call(null, c);
}
var
d = Sx_runtime[106].call(null, effects),
- e = [0, 1 - Sx_types[32].call(null, d)];
- if(Sx_types[32].call(null, e)){
+ e = [0, 1 - Sx_types[40].call(null, d)];
+ if(Sx_types[40].call(null, e)){
var
f = [0, Sx_runtime[96].call(null, effects), be],
g = Sx_runtime[1].call(null, cst, f);
- if(Sx_types[32].call(null, g))
+ if(Sx_types[40].call(null, g))
var
h = Sx_runtime[5].call(null, effects),
effect_list =
@@ -30795,8 +30849,8 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
a = [0, Sx_runtime[96].call(null, e), bf],
b = Sx_runtime[1].call(null, cst, a);
- return Sx_types[32].call(null, b)
- ? Sx_types[33].call(null, e)
+ return Sx_types[40].call(null, b)
+ ? Sx_types[41].call(null, e)
: [2, Sx_runtime[4].call(null, [0, e, 0])];
},
h)];
@@ -30807,16 +30861,16 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
i = Sx_runtime[98].call(null, env, bg),
effect_anns =
- Sx_types[32].call(null, i)
+ Sx_types[40].call(null, i)
? Sx_runtime[99].call(null, env, bh)
: [6, Stdlib_Hashtbl[1].call(null, 0, 0)],
- j = Sx_types[33].call(null, name_sym);
+ j = Sx_types[41].call(null, name_sym);
Sx_runtime[9].call(null, effect_anns, j, effect_list);
var k = Sx_runtime[3].call(null, bi);
Sx_runtime[100].call(null, env, k, effect_anns);
}
var
- l = Sx_types[33].call(null, name_sym),
+ l = Sx_types[41].call(null, name_sym),
m = Sx_runtime[3].call(null, l);
Sx_runtime[100].call(null, env, m, comp);
return comp;
@@ -30844,12 +30898,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
c = [0, Sx_runtime[96].call(null, b), bm],
and = Sx_runtime[1].call(null, cst, c),
cst$0 = "+";
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
d = Sx_runtime[15].call(null, args, i),
- e = [0, Sx_types[34].call(null, d), [0, key, 0]],
+ e = [0, Sx_types[42].call(null, d), [0, key, 0]],
and$0 = Sx_runtime[1].call(null, cst, e);
- if(Sx_types[32].call(null, and$0))
+ if(Sx_types[40].call(null, and$0))
var
f = [0, Sx_runtime[1].call(null, cst$0, [0, i, bn]), [0, end, 0]],
a = Sx_runtime[1].call(null, cst$3, f);
@@ -30858,13 +30912,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else
var a = and;
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var
g = Sx_runtime[1].call(null, cst$0, [0, i, bo]),
val = Sx_runtime[15].call(null, args, g),
h = [0, Sx_runtime[96].call(null, val), bp],
j = Sx_runtime[1].call(null, cst, h),
- k = Sx_types[32].call(null, j) ? Sx_types[34].call(null, val) : val;
+ k = Sx_types[40].call(null, j) ? Sx_types[42].call(null, val) : val;
result[1] = k;
}
return 0;
@@ -30905,24 +30959,24 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
b = [0, Sx_runtime[96].call(null, p), bt],
and = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
c = [0, Sx_runtime[22].call(null, p), bu],
and$0 = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, and$0)){
+ if(Sx_types[40].call(null, and$0)){
var
d = Sx_runtime[12].call(null, p),
e = [0, Sx_runtime[96].call(null, d), bv],
and$1 = Sx_runtime[1].call(null, cst, e);
- if(Sx_types[32].call(null, and$1)){
+ if(Sx_types[40].call(null, and$1)){
var
f = Sx_runtime[15].call(null, p, bx),
g = [0, Sx_runtime[96].call(null, f), bw],
and$2 = Sx_runtime[1].call(null, cst, g);
- if(Sx_types[32].call(null, and$2))
+ if(Sx_types[40].call(null, and$2))
var
h = Sx_runtime[15].call(null, p, bz),
- i = [0, Sx_types[34].call(null, h), by],
+ i = [0, Sx_types[42].call(null, h), by],
a = Sx_runtime[1].call(null, cst, i);
else
var a = and$2;
@@ -30935,17 +30989,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else
var a = and;
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var
j = Sx_runtime[12].call(null, p),
- name = Sx_types[33].call(null, j),
+ name = Sx_types[41].call(null, j),
ptype = Sx_runtime[15].call(null, p, bA),
k = [0, Sx_runtime[96].call(null, ptype), bB],
l = Sx_runtime[1].call(null, cst, k),
type_val =
- Sx_types[32].call(null, l) ? Sx_types[33].call(null, ptype) : ptype,
- m = [0, 1 - Sx_types[32].call(null, has_children[1])];
- if(Sx_types[32].call(null, m)){
+ Sx_types[40].call(null, l) ? Sx_types[41].call(null, ptype) : ptype,
+ m = [0, 1 - Sx_types[40].call(null, has_children[1])];
+ if(Sx_types[40].call(null, m)){
params[1] = Sx_runtime[8].call(null, params[1], name);
Sx_runtime[9].call(null, param_types, name, type_val);
}
@@ -30954,22 +31008,22 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
n = [0, Sx_runtime[96].call(null, p), bC],
o = Sx_runtime[1].call(null, cst, n);
- if(Sx_types[32].call(null, o)){
+ if(Sx_types[40].call(null, o)){
var
- name$0 = Sx_types[33].call(null, p),
+ name$0 = Sx_types[41].call(null, p),
q = Sx_runtime[1].call(null, cst, [0, name$0, bD]);
- if(Sx_types[32].call(null, q))
+ if(Sx_types[40].call(null, q))
in_key[1] = bE;
else{
var r = Sx_runtime[1].call(null, cst, [0, name$0, bF]);
- if(Sx_types[32].call(null, r))
+ if(Sx_types[40].call(null, r))
has_children[1] = bG;
else{
var s = Sx_runtime[1].call(null, cst, [0, name$0, bH]);
- if(Sx_types[32].call(null, s))
+ if(Sx_types[40].call(null, s))
has_children[1] = bI;
- else if(! Sx_types[32].call(null, has_children[1]))
- if(Sx_types[32].call(null, in_key[1]))
+ else if(! Sx_types[40].call(null, has_children[1]))
+ if(Sx_types[40].call(null, in_key[1]))
params[1] = Sx_runtime[8].call(null, params[1], name$0);
else
params[1] = Sx_runtime[8].call(null, params[1], name$0);
@@ -30982,85 +31036,100 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
a);
return [5, [0, params[1], [0, has_children[1], [0, param_types, 0]]]];
}
- var bJ = [1, 1.], bK = [2, cst$7], bL = [1, 1.];
+ var
+ bJ = [1, 1.],
+ bK = [1, 2.],
+ bL = [0, [1, 1.], 0],
+ bM = [2, cst$7],
+ bN = [1, 1.],
+ bO = [2, cst_begin];
function sf_defisland(args, env){
var
name_sym = Sx_runtime[12].call(null, args),
params_raw = Sx_runtime[15].call(null, args, bJ),
- body = Sx_runtime[14].call(null, args),
- a = Sx_types[33].call(null, name_sym),
- comp_name = Sx_runtime[161].call(null, a, bK),
+ body_exprs = Sx_runtime[21].call(null, args, bK),
+ a = [0, Sx_runtime[22].call(null, body_exprs), bL],
+ b = Sx_runtime[1].call(null, cst, a);
+ if(Sx_types[40].call(null, b))
+ var body = Sx_runtime[12].call(null, body_exprs);
+ else
+ var
+ f = [0, Sx_types[29].call(null, bO), [0, body_exprs, 0]],
+ body = Sx_runtime[1].call(null, "cons", f);
+ var
+ c = Sx_types[41].call(null, name_sym),
+ comp_name = Sx_runtime[161].call(null, c, bM),
parsed = parse_comp_params(params_raw),
params = Sx_runtime[12].call(null, parsed),
- has_children = Sx_runtime[15].call(null, parsed, bL),
+ has_children = Sx_runtime[15].call(null, parsed, bN),
island =
- Sx_types[18].call(null, comp_name, params, has_children, body, env),
- b = Sx_types[33].call(null, name_sym),
- c = Sx_runtime[3].call(null, b);
- Sx_runtime[100].call(null, env, c, island);
+ Sx_types[26].call(null, comp_name, params, has_children, body, env),
+ d = Sx_types[41].call(null, name_sym),
+ e = Sx_runtime[3].call(null, d);
+ Sx_runtime[100].call(null, env, e, island);
return island;
}
- var bM = [1, 1.], bN = [1, 2.], bO = [1, 1.];
+ var bP = [1, 1.], bQ = [1, 2.], bR = [1, 1.];
function sf_defmacro(args, env){
var
name_sym = Sx_runtime[12].call(null, args),
- params_raw = Sx_runtime[15].call(null, args, bM),
- body = Sx_runtime[15].call(null, args, bN),
+ params_raw = Sx_runtime[15].call(null, args, bP),
+ body = Sx_runtime[15].call(null, args, bQ),
parsed = parse_macro_params(params_raw),
params = Sx_runtime[12].call(null, parsed),
- rest_param = Sx_runtime[15].call(null, parsed, bO),
- a = Sx_types[33].call(null, name_sym),
- mac = Sx_types[19].call(null, params, rest_param, body, env, a),
- b = Sx_types[33].call(null, name_sym),
+ rest_param = Sx_runtime[15].call(null, parsed, bR),
+ a = Sx_types[41].call(null, name_sym),
+ mac = Sx_types[27].call(null, params, rest_param, body, env, a),
+ b = Sx_types[41].call(null, name_sym),
c = Sx_runtime[3].call(null, b);
Sx_runtime[100].call(null, env, c, mac);
return mac;
}
var
cst_in_rest = "in-rest",
- bP = [5, 0],
- bQ = [0, 0],
- bR = [2, cst_in_rest],
- bS = [0, [2, cst_symbol], 0],
- bT = [0, [2, cst_rest], 0],
- bU = [0, [2, cst_in_rest], [0, [0, 1], 0]],
- bV = [2, cst_in_rest],
- bW = [0, [2, cst_symbol], 0],
- bX = [0, [2, cst_symbol], 0];
+ bS = [5, 0],
+ bT = [0, 0],
+ bU = [2, cst_in_rest],
+ bV = [0, [2, cst_symbol], 0],
+ bW = [0, [2, cst_rest], 0],
+ bX = [0, [2, cst_in_rest], [0, [0, 1], 0]],
+ bY = [2, cst_in_rest],
+ bZ = [0, [2, cst_symbol], 0],
+ b0 = [0, [2, cst_symbol], 0];
function parse_macro_params(params_expr){
var
a = Sx_runtime[5].call(null, params_expr),
d = Stdlib_Hashtbl[1].call(null, 0, 1),
- b = Sx_runtime[2].call(null, bR);
- Stdlib_Hashtbl[11].call(null, d, b, bQ);
- var params = [0, bP], rest_param = [0, 0];
+ b = Sx_runtime[2].call(null, bU);
+ Stdlib_Hashtbl[11].call(null, d, b, bT);
+ var params = [0, bS], rest_param = [0, 0];
Stdlib_List[26].call
(null,
function(state, p){
var
- b = [0, Sx_runtime[96].call(null, p), bS],
+ b = [0, Sx_runtime[96].call(null, p), bV],
and = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
- c = [0, Sx_types[33].call(null, p), bT],
+ c = [0, Sx_types[41].call(null, p), bW],
a = Sx_runtime[1].call(null, cst, c);
else
var a = and;
- if(Sx_types[32].call(null, a))
- return Sx_runtime[1].call(null, cst_assoc, [0, state, bU]);
- var d = Sx_runtime[23].call(null, state, bV);
- if(Sx_types[32].call(null, d)){
+ if(Sx_types[40].call(null, a))
+ return Sx_runtime[1].call(null, cst_assoc, [0, state, bX]);
+ var d = Sx_runtime[23].call(null, state, bY);
+ if(Sx_types[40].call(null, d)){
var
- e = [0, Sx_runtime[96].call(null, p), bW],
+ e = [0, Sx_runtime[96].call(null, p), bZ],
f = Sx_runtime[1].call(null, cst, e),
- g = Sx_types[32].call(null, f) ? Sx_types[33].call(null, p) : p;
+ g = Sx_types[40].call(null, f) ? Sx_types[41].call(null, p) : p;
rest_param[1] = g;
return state;
}
var
- h = [0, Sx_runtime[96].call(null, p), bX],
+ h = [0, Sx_runtime[96].call(null, p), b0],
i = Sx_runtime[1].call(null, cst, h),
- j = Sx_types[32].call(null, i) ? Sx_types[33].call(null, p) : p;
+ j = Sx_types[40].call(null, i) ? Sx_types[41].call(null, p) : p;
params[1] = Sx_runtime[8].call(null, params[1], j);
return state;
},
@@ -31070,59 +31139,59 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
var
cst_concat = "concat",
- bY = [0, [2, cst_list], 0],
- bZ = [5, 0],
- b0 = [0, [2, cst_symbol], 0],
- b1 = [0, [2, "unquote"], 0],
- b2 = [1, 1.],
- b3 = [5, 0],
- b4 = [0, [2, cst_list], 0],
- b5 = [0, [1, 2.], 0],
- b6 = [0, [2, cst_symbol], 0],
- b7 = [0, [2, "splice-unquote"], 0],
- b8 = [1, 1.],
- b9 = [0, [2, cst_list], 0];
+ b1 = [0, [2, cst_list], 0],
+ b2 = [5, 0],
+ b3 = [0, [2, cst_symbol], 0],
+ b4 = [0, [2, "unquote"], 0],
+ b5 = [1, 1.],
+ b6 = [5, 0],
+ b7 = [0, [2, cst_list], 0],
+ b8 = [0, [1, 2.], 0],
+ b9 = [0, [2, cst_symbol], 0],
+ b_ = [0, [2, "splice-unquote"], 0],
+ b$ = [1, 1.],
+ ca = [0, [2, cst_list], 0];
function qq_expand(template, env){
var
- b = [0, Sx_runtime[96].call(null, template), bY],
+ b = [0, Sx_runtime[96].call(null, template), b1],
c = Sx_runtime[1].call(null, cst, b),
- d = [0, 1 - Sx_types[32].call(null, c)];
- if(Sx_types[32].call(null, d)) return template;
+ d = [0, 1 - Sx_types[40].call(null, c)];
+ if(Sx_types[40].call(null, d)) return template;
var e = Sx_runtime[32].call(null, template);
- if(Sx_types[32].call(null, e)) return bZ;
+ if(Sx_types[40].call(null, e)) return b2;
var
head = Sx_runtime[12].call(null, template),
- f = [0, Sx_runtime[96].call(null, head), b0],
+ f = [0, Sx_runtime[96].call(null, head), b3],
and = Sx_runtime[1].call(null, cst, f);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
- g = [0, Sx_types[33].call(null, head), b1],
+ g = [0, Sx_types[41].call(null, head), b4],
a = Sx_runtime[1].call(null, cst, g);
else
var a = and;
- if(Sx_types[32].call(null, a))
+ if(Sx_types[40].call(null, a))
return trampoline
- (eval_expr(Sx_runtime[15].call(null, template, b2), env));
+ (eval_expr(Sx_runtime[15].call(null, template, b5), env));
var h = Sx_runtime[5].call(null, template);
return Stdlib_List[26].call
(null,
function(result, item){
var
- b = [0, Sx_runtime[96].call(null, item), b4],
+ b = [0, Sx_runtime[96].call(null, item), b7],
and = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
- c = [0, Sx_runtime[22].call(null, item), b5],
+ c = [0, Sx_runtime[22].call(null, item), b8],
and$0 = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, and$0)){
+ if(Sx_types[40].call(null, and$0)){
var
d = Sx_runtime[12].call(null, item),
- e = [0, Sx_runtime[96].call(null, d), b6],
+ e = [0, Sx_runtime[96].call(null, d), b9],
and$1 = Sx_runtime[1].call(null, cst, e);
- if(Sx_types[32].call(null, and$1))
+ if(Sx_types[40].call(null, and$1))
var
f = Sx_runtime[12].call(null, item),
- g = [0, Sx_types[33].call(null, f), b7],
+ g = [0, Sx_types[41].call(null, f), b_],
a = Sx_runtime[1].call(null, cst, g);
else
var a = and$1;
@@ -31132,21 +31201,21 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else
var a = and;
- if(! Sx_types[32].call(null, a)){
+ if(! Sx_types[40].call(null, a)){
var k = [0, result, [0, [5, [0, qq_expand(item, env), 0]], 0]];
return Sx_runtime[1].call(null, cst_concat, k);
}
var
spliced =
trampoline
- (eval_expr(Sx_runtime[15].call(null, item, b8), env)),
- h = [0, Sx_runtime[96].call(null, spliced), b9],
+ (eval_expr(Sx_runtime[15].call(null, item, b$), env)),
+ h = [0, Sx_runtime[96].call(null, spliced), ca],
i = Sx_runtime[1].call(null, cst, h);
- if(Sx_types[32].call(null, i))
+ if(Sx_types[40].call(null, i))
return Sx_runtime[1].call
(null, cst_concat, [0, result, [0, spliced, 0]]);
var j = Sx_runtime[106].call(null, spliced);
- return Sx_types[32].call(null, j)
+ return Sx_types[40].call(null, j)
? result
: Sx_runtime
[1].call
@@ -31154,59 +31223,59 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
cst_concat,
[0, result, [0, [5, [0, spliced, 0]], 0]]);
},
- b3,
+ b6,
h);
}
var
cst_dec = "dec",
- b_ = [5, 0],
- b$ = [5, 0],
- ca = [0, [2, cst_list], 0],
- cb = [0, [1, 2.], 0],
- cc = [0, [2, cst_symbol], 0],
- cd = [1, 1.],
- ce = [1, 1.],
- cf = [1, 0.],
- cg = [0, [1, 2.], 0],
- ch = [1, 0.],
- ci = [0, [2, cst_symbol], 0],
+ cb = [5, 0],
+ cc = [5, 0],
+ cd = [0, [2, cst_list], 0],
+ ce = [0, [1, 2.], 0],
+ cf = [0, [2, cst_symbol], 0],
+ cg = [1, 1.],
+ ch = [1, 1.],
+ ci = [1, 0.],
cj = [0, [1, 2.], 0],
- ck = [0, [1, 2.], 0],
- cl = [0, [1, 2.], 0],
- cm = [0, [1, 2.], 0];
+ ck = [1, 0.],
+ cl = [0, [2, cst_symbol], 0],
+ cm = [0, [1, 2.], 0],
+ cn = [0, [1, 2.], 0],
+ co = [0, [1, 2.], 0],
+ cp = [0, [1, 2.], 0];
function sf_letrec(args, env){
var
bindings = Sx_runtime[12].call(null, args),
body = Sx_runtime[13].call(null, args),
local = Sx_runtime[103].call(null, env),
b = Sx_runtime[12].call(null, bindings),
- c = [0, Sx_runtime[96].call(null, b), ca],
+ c = [0, Sx_runtime[96].call(null, b), cd],
and = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
d = Sx_runtime[12].call(null, bindings),
- e = [0, Sx_runtime[22].call(null, d), cb],
+ e = [0, Sx_runtime[22].call(null, d), ce],
a = Sx_runtime[1].call(null, cst, e);
else
var a = and;
- var names = [0, b_], val_exprs = [0, b$];
- if(Sx_types[32].call(null, a)){
+ var names = [0, cb], val_exprs = [0, cc];
+ if(Sx_types[40].call(null, a)){
var f = Sx_runtime[5].call(null, bindings);
Stdlib_List[18].call
(null,
function(binding){
var
a = Sx_runtime[12].call(null, binding),
- b = [0, Sx_runtime[96].call(null, a), cc],
+ b = [0, Sx_runtime[96].call(null, a), cf],
c = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, c))
+ if(Sx_types[40].call(null, c))
var
d = Sx_runtime[12].call(null, binding),
- vname = Sx_types[33].call(null, d);
+ vname = Sx_types[41].call(null, d);
else
var vname = Sx_runtime[12].call(null, binding);
names[1] = Sx_runtime[8].call(null, names[1], vname);
- var e = Sx_runtime[15].call(null, binding, cd);
+ var e = Sx_runtime[15].call(null, binding, cg);
val_exprs[1] = Sx_runtime[8].call(null, val_exprs[1], e);
var f = Sx_runtime[3].call(null, vname);
Sx_runtime[100].call(null, local, f, 0);
@@ -31216,29 +31285,29 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else{
var
- p = [0, Sx_runtime[22].call(null, bindings), cg],
- q = [0, ch, [0, Sx_runtime[1].call(null, cst$6, p), 0]],
+ p = [0, Sx_runtime[22].call(null, bindings), cj],
+ q = [0, ck, [0, Sx_runtime[1].call(null, cst$6, p), 0]],
r = Sx_runtime[1].call(null, cst_range, q),
s = Sx_runtime[5].call(null, r);
Stdlib_List[26].call
(null,
function(acc, pair_idx){
var
- a = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cj]),
+ a = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cm]),
b = Sx_runtime[15].call(null, bindings, a),
- c = [0, Sx_runtime[96].call(null, b), ci],
+ c = [0, Sx_runtime[96].call(null, b), cl],
d = Sx_runtime[1].call(null, cst, c);
- if(Sx_types[32].call(null, d))
+ if(Sx_types[40].call(null, d))
var
- e = Sx_runtime[1].call(null, cst$5, [0, pair_idx, ck]),
+ e = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cn]),
f = Sx_runtime[15].call(null, bindings, e),
- vname = Sx_types[33].call(null, f);
+ vname = Sx_types[41].call(null, f);
else
var
- j = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cm]),
+ j = Sx_runtime[1].call(null, cst$5, [0, pair_idx, cp]),
vname = Sx_runtime[15].call(null, bindings, j);
var
- g = [0, Sx_runtime[1].call(null, cst$5, [0, pair_idx, cl]), 0],
+ g = [0, Sx_runtime[1].call(null, cst$5, [0, pair_idx, co]), 0],
h = Sx_runtime[1].call(null, cst_inc, g),
val_expr = Sx_runtime[15].call(null, bindings, h);
names[1] = Sx_runtime[8].call(null, names[1], vname);
@@ -31261,7 +31330,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(pair){
var
- a = Sx_runtime[15].call(null, pair, ce),
+ a = Sx_runtime[15].call(null, pair, ch),
b = Sx_runtime[12].call(null, pair),
c = Sx_runtime[3].call(null, b);
Sx_runtime[100].call(null, local, c, a);
@@ -31273,7 +31342,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(val){
var a = Sx_runtime[108].call(null, val);
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var b = Sx_runtime[5].call(null, names[1]);
Stdlib_List[18].call
(null,
@@ -31281,7 +31350,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
a = Sx_runtime[99].call(null, local, n),
b = Sx_runtime[3].call(null, n),
- c = Sx_types[37].call(null, val);
+ c = Sx_types[45].call(null, val);
Sx_runtime[100].call(null, c, b, a);
return 0;
},
@@ -31292,59 +31361,59 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
j);
var
k = [0, Sx_runtime[22].call(null, body), 0],
- l = [0, body, [0, cf, [0, Sx_runtime[1].call(null, cst_dec, k), 0]]],
+ l = [0, body, [0, ci, [0, Sx_runtime[1].call(null, cst_dec, k), 0]]],
m = Sx_runtime[1].call(null, cst_slice, l),
n = Sx_runtime[5].call(null, m);
Stdlib_List[18].call
(null, function(e){trampoline(eval_expr(e, local)); return 0;}, n);
var o = Sx_runtime[14].call(null, body);
- return Sx_types[20].call(null, o, local);
+ return Sx_types[28].call(null, o, local);
}
function step_sf_letrec(args, env, kont){
- var thk = sf_letrec(args, env), a = Sx_types[51].call(null, thk);
- return make_cek_state(Sx_types[50].call(null, thk), a, kont);
+ var thk = sf_letrec(args, env), a = Sx_types[59].call(null, thk);
+ return make_cek_state(Sx_types[58].call(null, thk), a, kont);
}
- var cn = [1, 1.], co = [1, 2.];
+ var cq = [1, 1.], cr = [1, 2.];
function sf_dynamic_wind(args, env){
var
before = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- body = trampoline(eval_expr(Sx_runtime[15].call(null, args, cn), env)),
- after = trampoline(eval_expr(Sx_runtime[15].call(null, args, co), env));
+ body = trampoline(eval_expr(Sx_runtime[15].call(null, args, cq), env)),
+ after = trampoline(eval_expr(Sx_runtime[15].call(null, args, cr), env));
return Sx_runtime[125].call(null, before, body, after, env);
}
var
cst$8 = ">=",
- cp = [0, [1, 1.], 0],
- cq = [0, [1, 2.], 0],
- cr = [0, [2, cst_keyword], 0],
- cs = [0, [2, cst_value], 0],
- ct = [1, 1.],
- cu = [0, [1, 2.], 0];
+ cs = [0, [1, 1.], 0],
+ ct = [0, [1, 2.], 0],
+ cu = [0, [2, cst_keyword], 0],
+ cv = [0, [2, cst_value], 0],
+ cw = [1, 1.],
+ cx = [0, [1, 2.], 0];
function sf_scope(args, env){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- rest = Sx_runtime[1].call(null, cst_slice, [0, args, cp]),
- b = [0, Sx_runtime[22].call(null, rest), cq],
+ rest = Sx_runtime[1].call(null, cst_slice, [0, args, cs]),
+ b = [0, Sx_runtime[22].call(null, rest), ct],
and = Sx_runtime[1].call(null, cst$8, b);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
c = Sx_runtime[12].call(null, rest),
- d = [0, Sx_runtime[96].call(null, c), cr],
+ d = [0, Sx_runtime[96].call(null, c), cu],
and$0 = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, and$0))
+ if(Sx_types[40].call(null, and$0))
var
e = Sx_runtime[12].call(null, rest),
- f = [0, Sx_types[34].call(null, e), cs],
+ f = [0, Sx_types[42].call(null, e), cv],
a = Sx_runtime[1].call(null, cst, f);
else
var a = and$0;
}
else
var a = and;
- if(Sx_types[32].call(null, a))
+ if(Sx_types[40].call(null, a))
var
- g = trampoline(eval_expr(Sx_runtime[15].call(null, rest, ct), env)),
- body_exprs = Sx_runtime[1].call(null, cst_slice, [0, rest, cu]),
+ g = trampoline(eval_expr(Sx_runtime[15].call(null, rest, cw), env)),
+ body_exprs = Sx_runtime[1].call(null, cst_slice, [0, rest, cx]),
val = g;
else
var body_exprs = rest, val = 0;
@@ -31357,12 +31426,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Sx_runtime[127].call(null, name);
return result[1];
}
- var cv = [1, 1.], cw = [0, [1, 2.], 0];
+ var cy = [1, 1.], cz = [0, [1, 2.], 0];
function sf_provide(args, env){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- val = trampoline(eval_expr(Sx_runtime[15].call(null, args, cv), env)),
- body_exprs = Sx_runtime[1].call(null, cst_slice, [0, args, cw]);
+ val = trampoline(eval_expr(Sx_runtime[15].call(null, args, cy), env)),
+ body_exprs = Sx_runtime[1].call(null, cst_slice, [0, args, cz]);
Sx_runtime[126].call(null, name, val);
var a = Sx_runtime[5].call(null, body_exprs), result = [0, 0];
Stdlib_List[18].call
@@ -31372,12 +31441,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Sx_runtime[127].call(null, name);
return result[1];
}
- var cx = [1, 1.], cy = [1, 1.];
+ var cA = [1, 1.], cB = [1, 1.];
function expand_macro(mac, raw_args, env){
var
- a = Sx_types[49].call(null, mac),
+ a = Sx_types[57].call(null, mac),
local = Sx_runtime[104].call(null, a, env),
- b = Sx_types[46].call(null, mac),
+ b = Sx_types[54].call(null, mac),
c = Sx_runtime[5].call(null, b),
d =
[5,
@@ -31391,11 +31460,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function(pair){
var
b = [0, Sx_runtime[22].call(null, raw_args), 0],
- c = [0, Sx_runtime[15].call(null, pair, cx), b],
+ c = [0, Sx_runtime[15].call(null, pair, cA), b],
d = Sx_runtime[1].call(null, cst$3, c);
- if(Sx_types[32].call(null, d))
+ if(Sx_types[40].call(null, d))
var
- e = Sx_runtime[15].call(null, pair, cy),
+ e = Sx_runtime[15].call(null, pair, cB),
a = Sx_runtime[15].call(null, raw_args, e);
else
var a = 0;
@@ -31406,17 +31475,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return 0;
},
e);
- var f = Sx_types[47].call(null, mac);
- if(Sx_types[32].call(null, f)){
+ var f = Sx_types[55].call(null, mac);
+ if(Sx_types[40].call(null, f)){
var
- g = Sx_types[46].call(null, mac),
+ g = Sx_types[54].call(null, mac),
h = [0, raw_args, [0, Sx_runtime[22].call(null, g), 0]],
i = Sx_runtime[1].call(null, cst_slice, h),
- j = Sx_types[47].call(null, mac),
+ j = Sx_types[55].call(null, mac),
k = Sx_runtime[3].call(null, j);
Sx_runtime[100].call(null, local, k, i);
}
- return trampoline(eval_expr(Sx_types[48].call(null, mac), local));
+ return trampoline(eval_expr(Sx_types[56].call(null, mac), local));
}
function cek_run(state){
var s = state;
@@ -31431,56 +31500,56 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
s = cek_step(s);
}
}
- var cz = [0, [2, cst_eval], 0];
+ var cC = [0, [2, cst_eval], 0];
function cek_step(state){
- var a = [0, cek_phase(state), cz], b = Sx_runtime[1].call(null, cst, a);
- return Sx_types[32].call(null, b)
+ var a = [0, cek_phase(state), cC], b = Sx_runtime[1].call(null, cst, a);
+ return Sx_types[40].call(null, b)
? step_eval(state)
: step_continue(state);
}
var
- cA = [2, cst_number],
- cB = [2, cst_string],
- cC = [2, cst_boolean],
- cD = [2, cst_nil],
- cE = [2, cst_symbol],
- cF = [0, [2, cst$7], 0],
- cG = [0, [2, "true"], 0],
- cH = [0, 1],
- cI = [0, [2, "false"], 0],
- cJ = [0, 0],
- cK = [0, [2, cst_nil], 0],
- cL = [2, "Undefined symbol: "],
- cM = [2, cst_keyword],
- cN = [2, cst_dict],
- cO = [5, 0],
- cP = [2, cst_list],
- cQ = [5, 0];
+ cD = [2, cst_number],
+ cE = [2, cst_string],
+ cF = [2, cst_boolean],
+ cG = [2, cst_nil],
+ cH = [2, cst_symbol],
+ cI = [0, [2, cst$7], 0],
+ cJ = [0, [2, "true"], 0],
+ cK = [0, 1],
+ cL = [0, [2, "false"], 0],
+ cM = [0, 0],
+ cN = [0, [2, cst_nil], 0],
+ cO = [2, "Undefined symbol: "],
+ cP = [2, cst_keyword],
+ cQ = [2, cst_dict],
+ cR = [5, 0],
+ cS = [2, cst_list],
+ cT = [5, 0];
function step_eval(state){
var
expr = cek_control(state),
env = cek_env(state),
kont = cek_kont(state),
match_val = Sx_runtime[96].call(null, expr);
- if(caml_equal(match_val, cA)) return make_cek_value(expr, env, kont);
- if(caml_equal(match_val, cB)) return make_cek_value(expr, env, kont);
- if(caml_equal(match_val, cC)) return make_cek_value(expr, env, kont);
- if(caml_equal(match_val, cD)) return make_cek_value(0, env, kont);
- if(! caml_equal(match_val, cE)){
- if(caml_equal(match_val, cM))
- return make_cek_value(Sx_types[34].call(null, expr), env, kont);
- if(caml_equal(match_val, cN)){
+ if(caml_equal(match_val, cD)) return make_cek_value(expr, env, kont);
+ if(caml_equal(match_val, cE)) return make_cek_value(expr, env, kont);
+ if(caml_equal(match_val, cF)) return make_cek_value(expr, env, kont);
+ if(caml_equal(match_val, cG)) return make_cek_value(0, env, kont);
+ if(! caml_equal(match_val, cH)){
+ if(caml_equal(match_val, cP))
+ return make_cek_value(Sx_types[42].call(null, expr), env, kont);
+ if(caml_equal(match_val, cQ)){
var
ks = Sx_runtime[1].call(null, cst_keys, [0, expr, 0]),
h = Sx_runtime[32].call(null, ks);
- if(Sx_types[32].call(null, h))
+ if(Sx_types[40].call(null, h))
return make_cek_value
([6, Stdlib_Hashtbl[1].call(null, 0, 0)], env, kont);
var
first_key = Sx_runtime[12].call(null, ks),
i = Sx_runtime[13].call(null, ks),
j = Sx_runtime[5].call(null, i),
- remaining_entries = [0, cO];
+ remaining_entries = [0, cR];
Stdlib_List[18].call
(null,
function(k){
@@ -31499,36 +31568,36 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return make_cek_state
(Sx_runtime[23].call(null, expr, first_key), env, k);
}
- if(! caml_equal(match_val, cP)) return make_cek_value(expr, env, kont);
+ if(! caml_equal(match_val, cS)) return make_cek_value(expr, env, kont);
var l = Sx_runtime[32].call(null, expr);
- return Sx_types[32].call(null, l)
- ? make_cek_value(cQ, env, kont)
+ return Sx_types[40].call(null, l)
+ ? make_cek_value(cT, env, kont)
: step_eval_list(expr, env, kont);
}
var
- name = Sx_types[33].call(null, expr),
+ name = Sx_types[41].call(null, expr),
a = Sx_runtime[98].call(null, env, name);
- if(Sx_types[32].call(null, a))
+ if(Sx_types[40].call(null, a))
var val = Sx_runtime[99].call(null, env, name);
else{
var b = Sx_runtime[115].call(null, name);
- if(Sx_types[32].call(null, b))
+ if(Sx_types[40].call(null, b))
var val = Sx_runtime[116].call(null, name);
else{
- var c = Sx_runtime[1].call(null, cst, [0, name, cG]);
- if(Sx_types[32].call(null, c))
- var val = cH;
+ var c = Sx_runtime[1].call(null, cst, [0, name, cJ]);
+ if(Sx_types[40].call(null, c))
+ var val = cK;
else{
- var d = Sx_runtime[1].call(null, cst, [0, name, cI]);
- if(Sx_types[32].call(null, d))
- var val = cJ;
+ var d = Sx_runtime[1].call(null, cst, [0, name, cL]);
+ if(Sx_types[40].call(null, d))
+ var val = cM;
else{
- var e = Sx_runtime[1].call(null, cst, [0, name, cK]);
- if(! Sx_types[32].call(null, e)){
+ var e = Sx_runtime[1].call(null, cst, [0, name, cN]);
+ if(! Sx_types[40].call(null, e)){
var
- f = [2, Sx_runtime[4].call(null, [0, cL, [0, name, 0]])],
+ f = [2, Sx_runtime[4].call(null, [0, cO, [0, name, 0]])],
g = Sx_runtime[2].call(null, f);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], g], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], g], 1);
}
var val = 0;
}
@@ -31536,8 +31605,8 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
var and = Sx_runtime[106].call(null, val);
- if(Sx_types[32].call(null, and))
- Sx_runtime[1].call(null, "starts-with?", [0, name, cF]);
+ if(Sx_types[40].call(null, and))
+ Sx_runtime[1].call(null, "starts-with?", [0, name, cI]);
return make_cek_value(val, env, kont);
}
var
@@ -31547,177 +31616,177 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
cst_quote = "quote",
render_check = 0,
render_fn = 0,
- cR = [0, [2, cst_symbol], 0],
- cS = [5, 0],
- cT = [5, 0],
cU = [0, [2, cst_symbol], 0],
- cV = [0, [2, cst_if], 0],
- cW = [0, [2, cst_when], 0],
- cX = [0, [2, cst_cond], 0],
- cY = [0, [2, cst_case], 0],
- cZ = [0, [2, cst_and], 0],
- c0 = [0, [2, cst_or], 0],
- c1 = [0, [2, cst_let], 0],
- c2 = [0, [2, "let*"], 0],
- c3 = [0, [2, cst_lambda], 0],
- c4 = [0, [2, "fn"], 0],
- c5 = [0, [2, cst_define], 0],
- c6 = [0, [2, "defcomp"], 0],
- c7 = [0, [2, "defisland"], 0],
- c8 = [0, [2, "defmacro"], 0],
- c9 = [0, [2, cst_begin], 0],
- c_ = [0, [2, "do"], 0],
- c$ = [0, [2, cst_quote], 0],
- da = [0, [2, "quasiquote"], 0],
- db = [0, [2, "->"], 0],
- dc = [0, [2, "set!"], 0],
- dd = [0, [2, "letrec"], 0],
- de = [0, [2, cst_reset], 0],
- df = [0, [2, "shift"], 0],
- dg = [0, [2, cst_deref], 0],
- dh = [0, [2, cst_scope], 0],
- di = [0, [2, cst_provide], 0],
- dj = [0, [2, "context"], 0],
- dk = [0, [2, "emit!"], 0],
- dl = [0, [2, cst_emitted], 0],
- dm = [0, [2, cst_dynamic_wind], 0],
- dn = [0, [2, cst_map], 0],
- dp = [0, [2, cst_map_indexed], 0],
- dq = [0, [2, cst_filter], 0],
- dr = [0, [2, cst_reduce], 0],
- ds = [0, [2, cst_some], 0],
- dt = [0, [2, cst_every$0], 0],
- du = [0, [2, cst_for_each], 0],
- dv = [0, [2, cst_lambda], 0],
- dw = [0, [2, cst_list], 0];
+ cV = [5, 0],
+ cW = [5, 0],
+ cX = [0, [2, cst_symbol], 0],
+ cY = [0, [2, cst_if], 0],
+ cZ = [0, [2, cst_when], 0],
+ c0 = [0, [2, cst_cond], 0],
+ c1 = [0, [2, cst_case], 0],
+ c2 = [0, [2, cst_and], 0],
+ c3 = [0, [2, cst_or], 0],
+ c4 = [0, [2, cst_let], 0],
+ c5 = [0, [2, "let*"], 0],
+ c6 = [0, [2, cst_lambda], 0],
+ c7 = [0, [2, "fn"], 0],
+ c8 = [0, [2, cst_define], 0],
+ c9 = [0, [2, "defcomp"], 0],
+ c_ = [0, [2, "defisland"], 0],
+ c$ = [0, [2, "defmacro"], 0],
+ da = [0, [2, cst_begin], 0],
+ db = [0, [2, "do"], 0],
+ dc = [0, [2, cst_quote], 0],
+ dd = [0, [2, "quasiquote"], 0],
+ de = [0, [2, "->"], 0],
+ df = [0, [2, "set!"], 0],
+ dg = [0, [2, "letrec"], 0],
+ dh = [0, [2, cst_reset], 0],
+ di = [0, [2, "shift"], 0],
+ dj = [0, [2, cst_deref], 0],
+ dk = [0, [2, cst_scope], 0],
+ dl = [0, [2, cst_provide], 0],
+ dm = [0, [2, "context"], 0],
+ dn = [0, [2, "emit!"], 0],
+ dp = [0, [2, cst_emitted], 0],
+ dq = [0, [2, cst_dynamic_wind], 0],
+ dr = [0, [2, cst_map], 0],
+ ds = [0, [2, cst_map_indexed], 0],
+ dt = [0, [2, cst_filter], 0],
+ du = [0, [2, cst_reduce], 0],
+ dv = [0, [2, cst_some], 0],
+ dw = [0, [2, cst_every$0], 0],
+ dx = [0, [2, cst_for_each], 0],
+ dy = [0, [2, cst_lambda], 0],
+ dz = [0, [2, cst_list], 0];
function step_eval_list(expr, env, kont){
var
head = Sx_runtime[12].call(null, expr),
args = Sx_runtime[13].call(null, expr),
- b = [0, Sx_runtime[96].call(null, head), cR],
+ b = [0, Sx_runtime[96].call(null, head), cU],
or = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, or))
+ if(Sx_types[40].call(null, or))
var or$0 = or;
else{
var
- X = [0, Sx_runtime[96].call(null, head), dv],
+ X = [0, Sx_runtime[96].call(null, head), dy],
or$1 = Sx_runtime[1].call(null, cst, X);
- if(Sx_types[32].call(null, or$1))
+ if(Sx_types[40].call(null, or$1))
var or$0 = or$1;
else
var
- Y = [0, Sx_runtime[96].call(null, head), dw],
+ Y = [0, Sx_runtime[96].call(null, head), dz],
or$0 = Sx_runtime[1].call(null, cst, Y);
}
- var c = [0, 1 - Sx_types[32].call(null, or$0)];
- if(Sx_types[32].call(null, c)){
+ var c = [0, 1 - Sx_types[40].call(null, or$0)];
+ if(Sx_types[40].call(null, c)){
var d = Sx_runtime[32].call(null, expr);
- if(Sx_types[32].call(null, d)) return make_cek_value(cS, env, kont);
+ if(Sx_types[40].call(null, d)) return make_cek_value(cV, env, kont);
var
e =
kont_push
- (make_map_frame(0, Sx_runtime[13].call(null, expr), cT, env), kont);
+ (make_map_frame(0, Sx_runtime[13].call(null, expr), cW, env), kont);
return make_cek_state(Sx_runtime[12].call(null, expr), env, e);
}
var
- f = [0, Sx_runtime[96].call(null, head), cU],
+ f = [0, Sx_runtime[96].call(null, head), cX],
g = Sx_runtime[1].call(null, cst, f);
- if(! Sx_types[32].call(null, g))
+ if(! Sx_types[40].call(null, g))
return step_eval_call(head, args, env, kont);
var
- name = Sx_types[33].call(null, head),
- h = Sx_runtime[1].call(null, cst, [0, name, cV]);
- if(Sx_types[32].call(null, h)) return step_sf_if(args, env, kont);
- var i = Sx_runtime[1].call(null, cst, [0, name, cW]);
- if(Sx_types[32].call(null, i)) return step_sf_when(args, env, kont);
- var j = Sx_runtime[1].call(null, cst, [0, name, cX]);
- if(Sx_types[32].call(null, j)) return step_sf_cond(args, env, kont);
- var k = Sx_runtime[1].call(null, cst, [0, name, cY]);
- if(Sx_types[32].call(null, k)) return step_sf_case(args, env, kont);
- var l = Sx_runtime[1].call(null, cst, [0, name, cZ]);
- if(Sx_types[32].call(null, l)) return step_sf_and(args, env, kont);
- var m = Sx_runtime[1].call(null, cst, [0, name, c0]);
- if(Sx_types[32].call(null, m)) return step_sf_or(args, env, kont);
- var n = Sx_runtime[1].call(null, cst, [0, name, c1]);
- if(Sx_types[32].call(null, n)) return step_sf_let(args, env, kont);
- var o = Sx_runtime[1].call(null, cst, [0, name, c2]);
- if(Sx_types[32].call(null, o)) return step_sf_let(args, env, kont);
- var p = Sx_runtime[1].call(null, cst, [0, name, c3]);
- if(Sx_types[32].call(null, p)) return step_sf_lambda(args, env, kont);
- var q = Sx_runtime[1].call(null, cst, [0, name, c4]);
- if(Sx_types[32].call(null, q)) return step_sf_lambda(args, env, kont);
- var r = Sx_runtime[1].call(null, cst, [0, name, c5]);
- if(Sx_types[32].call(null, r)) return step_sf_define(args, env, kont);
- var s = Sx_runtime[1].call(null, cst, [0, name, c6]);
- if(Sx_types[32].call(null, s))
+ name = Sx_types[41].call(null, head),
+ h = Sx_runtime[1].call(null, cst, [0, name, cY]);
+ if(Sx_types[40].call(null, h)) return step_sf_if(args, env, kont);
+ var i = Sx_runtime[1].call(null, cst, [0, name, cZ]);
+ if(Sx_types[40].call(null, i)) return step_sf_when(args, env, kont);
+ var j = Sx_runtime[1].call(null, cst, [0, name, c0]);
+ if(Sx_types[40].call(null, j)) return step_sf_cond(args, env, kont);
+ var k = Sx_runtime[1].call(null, cst, [0, name, c1]);
+ if(Sx_types[40].call(null, k)) return step_sf_case(args, env, kont);
+ var l = Sx_runtime[1].call(null, cst, [0, name, c2]);
+ if(Sx_types[40].call(null, l)) return step_sf_and(args, env, kont);
+ var m = Sx_runtime[1].call(null, cst, [0, name, c3]);
+ if(Sx_types[40].call(null, m)) return step_sf_or(args, env, kont);
+ var n = Sx_runtime[1].call(null, cst, [0, name, c4]);
+ if(Sx_types[40].call(null, n)) return step_sf_let(args, env, kont);
+ var o = Sx_runtime[1].call(null, cst, [0, name, c5]);
+ if(Sx_types[40].call(null, o)) return step_sf_let(args, env, kont);
+ var p = Sx_runtime[1].call(null, cst, [0, name, c6]);
+ if(Sx_types[40].call(null, p)) return step_sf_lambda(args, env, kont);
+ var q = Sx_runtime[1].call(null, cst, [0, name, c7]);
+ if(Sx_types[40].call(null, q)) return step_sf_lambda(args, env, kont);
+ var r = Sx_runtime[1].call(null, cst, [0, name, c8]);
+ if(Sx_types[40].call(null, r)) return step_sf_define(args, env, kont);
+ var s = Sx_runtime[1].call(null, cst, [0, name, c9]);
+ if(Sx_types[40].call(null, s))
return make_cek_value(sf_defcomp(args, env), env, kont);
- var t = Sx_runtime[1].call(null, cst, [0, name, c7]);
- if(Sx_types[32].call(null, t))
+ var t = Sx_runtime[1].call(null, cst, [0, name, c_]);
+ if(Sx_types[40].call(null, t))
return make_cek_value(sf_defisland(args, env), env, kont);
- var u = Sx_runtime[1].call(null, cst, [0, name, c8]);
- if(Sx_types[32].call(null, u))
+ var u = Sx_runtime[1].call(null, cst, [0, name, c$]);
+ if(Sx_types[40].call(null, u))
return make_cek_value(sf_defmacro(args, env), env, kont);
- var v = Sx_runtime[1].call(null, cst, [0, name, c9]);
- if(Sx_types[32].call(null, v)) return step_sf_begin(args, env, kont);
- var w = Sx_runtime[1].call(null, cst, [0, name, c_]);
- if(Sx_types[32].call(null, w)) return step_sf_begin(args, env, kont);
- var x = Sx_runtime[1].call(null, cst, [0, name, c$]);
- if(Sx_types[32].call(null, x)){
+ var v = Sx_runtime[1].call(null, cst, [0, name, da]);
+ if(Sx_types[40].call(null, v)) return step_sf_begin(args, env, kont);
+ var w = Sx_runtime[1].call(null, cst, [0, name, db]);
+ if(Sx_types[40].call(null, w)) return step_sf_begin(args, env, kont);
+ var x = Sx_runtime[1].call(null, cst, [0, name, dc]);
+ if(Sx_types[40].call(null, x)){
var
y = Sx_runtime[32].call(null, args),
- z = Sx_types[32].call(null, y) ? 0 : Sx_runtime[12].call(null, args);
+ z = Sx_types[40].call(null, y) ? 0 : Sx_runtime[12].call(null, args);
return make_cek_value(z, env, kont);
}
- var A = Sx_runtime[1].call(null, cst, [0, name, da]);
- if(Sx_types[32].call(null, A))
+ var A = Sx_runtime[1].call(null, cst, [0, name, dd]);
+ if(Sx_types[40].call(null, A))
return make_cek_value
(qq_expand(Sx_runtime[12].call(null, args), env), env, kont);
- var B = Sx_runtime[1].call(null, cst, [0, name, db]);
- if(Sx_types[32].call(null, B))
+ var B = Sx_runtime[1].call(null, cst, [0, name, de]);
+ if(Sx_types[40].call(null, B))
return step_sf_thread_first(args, env, kont);
- var C = Sx_runtime[1].call(null, cst, [0, name, dc]);
- if(Sx_types[32].call(null, C)) return step_sf_set_b(args, env, kont);
- var D = Sx_runtime[1].call(null, cst, [0, name, dd]);
- if(Sx_types[32].call(null, D)) return step_sf_letrec(args, env, kont);
- var E = Sx_runtime[1].call(null, cst, [0, name, de]);
- if(Sx_types[32].call(null, E)) return step_sf_reset(args, env, kont);
- var F = Sx_runtime[1].call(null, cst, [0, name, df]);
- if(Sx_types[32].call(null, F)) return step_sf_shift(args, env, kont);
- var G = Sx_runtime[1].call(null, cst, [0, name, dg]);
- if(Sx_types[32].call(null, G)) return step_sf_deref(args, env, kont);
- var H = Sx_runtime[1].call(null, cst, [0, name, dh]);
- if(Sx_types[32].call(null, H)) return step_sf_scope(args, env, kont);
- var I = Sx_runtime[1].call(null, cst, [0, name, di]);
- if(Sx_types[32].call(null, I)) return step_sf_provide(args, env, kont);
- var J = Sx_runtime[1].call(null, cst, [0, name, dj]);
- if(Sx_types[32].call(null, J)) return step_sf_context(args, env, kont);
- var K = Sx_runtime[1].call(null, cst, [0, name, dk]);
- if(Sx_types[32].call(null, K)) return step_sf_emit(args, env, kont);
- var L = Sx_runtime[1].call(null, cst, [0, name, dl]);
- if(Sx_types[32].call(null, L)) return step_sf_emitted(args, env, kont);
- var M = Sx_runtime[1].call(null, cst, [0, name, dm]);
- if(Sx_types[32].call(null, M))
+ var C = Sx_runtime[1].call(null, cst, [0, name, df]);
+ if(Sx_types[40].call(null, C)) return step_sf_set_b(args, env, kont);
+ var D = Sx_runtime[1].call(null, cst, [0, name, dg]);
+ if(Sx_types[40].call(null, D)) return step_sf_letrec(args, env, kont);
+ var E = Sx_runtime[1].call(null, cst, [0, name, dh]);
+ if(Sx_types[40].call(null, E)) return step_sf_reset(args, env, kont);
+ var F = Sx_runtime[1].call(null, cst, [0, name, di]);
+ if(Sx_types[40].call(null, F)) return step_sf_shift(args, env, kont);
+ var G = Sx_runtime[1].call(null, cst, [0, name, dj]);
+ if(Sx_types[40].call(null, G)) return step_sf_deref(args, env, kont);
+ var H = Sx_runtime[1].call(null, cst, [0, name, dk]);
+ if(Sx_types[40].call(null, H)) return step_sf_scope(args, env, kont);
+ var I = Sx_runtime[1].call(null, cst, [0, name, dl]);
+ if(Sx_types[40].call(null, I)) return step_sf_provide(args, env, kont);
+ var J = Sx_runtime[1].call(null, cst, [0, name, dm]);
+ if(Sx_types[40].call(null, J)) return step_sf_context(args, env, kont);
+ var K = Sx_runtime[1].call(null, cst, [0, name, dn]);
+ if(Sx_types[40].call(null, K)) return step_sf_emit(args, env, kont);
+ var L = Sx_runtime[1].call(null, cst, [0, name, dp]);
+ if(Sx_types[40].call(null, L)) return step_sf_emitted(args, env, kont);
+ var M = Sx_runtime[1].call(null, cst, [0, name, dq]);
+ if(Sx_types[40].call(null, M))
return make_cek_value(sf_dynamic_wind(args, env), env, kont);
- var N = Sx_runtime[1].call(null, cst, [0, name, dn]);
- if(Sx_types[32].call(null, N)) return step_ho_map(args, env, kont);
- var O = Sx_runtime[1].call(null, cst, [0, name, dp]);
- if(Sx_types[32].call(null, O))
+ var N = Sx_runtime[1].call(null, cst, [0, name, dr]);
+ if(Sx_types[40].call(null, N)) return step_ho_map(args, env, kont);
+ var O = Sx_runtime[1].call(null, cst, [0, name, ds]);
+ if(Sx_types[40].call(null, O))
return step_ho_map_indexed(args, env, kont);
- var P = Sx_runtime[1].call(null, cst, [0, name, dq]);
- if(Sx_types[32].call(null, P)) return step_ho_filter(args, env, kont);
- var Q = Sx_runtime[1].call(null, cst, [0, name, dr]);
- if(Sx_types[32].call(null, Q)) return step_ho_reduce(args, env, kont);
- var R = Sx_runtime[1].call(null, cst, [0, name, ds]);
- if(Sx_types[32].call(null, R)) return step_ho_some(args, env, kont);
- var S = Sx_runtime[1].call(null, cst, [0, name, dt]);
- if(Sx_types[32].call(null, S)) return step_ho_every(args, env, kont);
- var T = Sx_runtime[1].call(null, cst, [0, name, du]);
- if(Sx_types[32].call(null, T)) return step_ho_for_each(args, env, kont);
+ var P = Sx_runtime[1].call(null, cst, [0, name, dt]);
+ if(Sx_types[40].call(null, P)) return step_ho_filter(args, env, kont);
+ var Q = Sx_runtime[1].call(null, cst, [0, name, du]);
+ if(Sx_types[40].call(null, Q)) return step_ho_reduce(args, env, kont);
+ var R = Sx_runtime[1].call(null, cst, [0, name, dv]);
+ if(Sx_types[40].call(null, R)) return step_ho_some(args, env, kont);
+ var S = Sx_runtime[1].call(null, cst, [0, name, dw]);
+ if(Sx_types[40].call(null, S)) return step_ho_every(args, env, kont);
+ var T = Sx_runtime[1].call(null, cst, [0, name, dx]);
+ if(Sx_types[40].call(null, T)) return step_ho_for_each(args, env, kont);
var
U =
Sx_runtime[1].call
(null, "has-key?", [0, custom_special_forms, [0, name, 0]]);
- if(Sx_types[32].call(null, U))
+ if(Sx_types[40].call(null, U))
return make_cek_value
(cek_call
(Sx_runtime[23].call(null, custom_special_forms, name),
@@ -31725,35 +31794,35 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
env,
kont);
var and = Sx_runtime[98].call(null, env, name);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
V = Sx_runtime[99].call(null, env, name),
a = Sx_runtime[111].call(null, V);
else
var a = and;
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var mac = Sx_runtime[99].call(null, env, name);
return make_cek_state(expand_macro(mac, args, env), env, kont);
}
var
W =
- Sx_types[32].call(null, render_check)
+ Sx_types[40].call(null, render_check)
? cek_call(render_check, [5, [0, expr, [0, env, 0]]])
: render_check;
- return Sx_types[32].call(null, W)
+ return Sx_types[40].call(null, W)
? make_cek_value
(cek_call(render_fn, [5, [0, expr, [0, env, 0]]]), env, kont)
: step_eval_call(head, args, env, kont);
}
- var dx = [0, [1, 2.], 0], dy = [1, 2.], dz = [1, 1.];
+ var dA = [0, [1, 2.], 0], dB = [1, 2.], dC = [1, 1.];
function step_sf_if(args, env, kont){
var
- a = [0, Sx_runtime[22].call(null, args), dx],
+ a = [0, Sx_runtime[22].call(null, args), dA],
b = Sx_runtime[1].call(null, cst$4, a),
- c = Sx_types[32].call(null, b) ? Sx_runtime[15].call(null, args, dy) : 0,
+ c = Sx_types[40].call(null, b) ? Sx_runtime[15].call(null, args, dB) : 0,
d =
kont_push
- (make_if_frame(Sx_runtime[15].call(null, args, dz), c, env), kont);
+ (make_if_frame(Sx_runtime[15].call(null, args, dC), c, env), kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, d);
}
function step_sf_when(args, env, kont){
@@ -31762,14 +31831,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
kont_push(make_when_frame(Sx_runtime[13].call(null, args), env), kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var dA = [0, [1, 1.], 0];
+ var dD = [0, [1, 1.], 0];
function step_sf_begin(args, env, kont){
var a = Sx_runtime[32].call(null, args);
- if(Sx_types[32].call(null, a)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, a)) return make_cek_value(0, env, kont);
var
- b = [0, Sx_runtime[22].call(null, args), dA],
+ b = [0, Sx_runtime[22].call(null, args), dD],
c = Sx_runtime[1].call(null, cst, b);
- if(Sx_types[32].call(null, c))
+ if(Sx_types[40].call(null, c))
return make_cek_state(Sx_runtime[12].call(null, args), env, kont);
var
d =
@@ -31777,77 +31846,77 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return make_cek_state(Sx_runtime[12].call(null, args), env, d);
}
var
- dB = [0, [2, cst_symbol], 0],
- dC = [0, [2, cst_list], 0],
- dD = [0, [1, 2.], 0],
- dE = [0, [2, cst_list], 0],
- dF = [0, [1, 2.], 0],
- dG = [0, [2, cst_symbol], 0],
- dH = [1, 1.],
- dI = [5, 0],
- dJ = [0, [1, 2.], 0],
+ dE = [0, [2, cst_symbol], 0],
+ dF = [0, [2, cst_list], 0],
+ dG = [0, [1, 2.], 0],
+ dH = [0, [2, cst_list], 0],
+ dI = [0, [1, 2.], 0],
+ dJ = [0, [2, cst_symbol], 0],
dK = [1, 1.],
- dL = [0, [1, 2.], 0],
+ dL = [5, 0],
dM = [0, [1, 2.], 0],
- dN = [1, 1.];
+ dN = [1, 1.],
+ dO = [0, [1, 2.], 0],
+ dP = [0, [1, 2.], 0],
+ dQ = [1, 1.];
function step_sf_let(args, env, kont){
var
c = Sx_runtime[12].call(null, args),
- d = [0, Sx_runtime[96].call(null, c), dB],
+ d = [0, Sx_runtime[96].call(null, c), dE],
e = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, e))
+ if(Sx_types[40].call(null, e))
return make_cek_value(trampoline(sf_named_let(args, env)), env, kont);
var
bindings = Sx_runtime[12].call(null, args),
body = Sx_runtime[13].call(null, args),
local = Sx_runtime[103].call(null, env),
f = Sx_runtime[32].call(null, bindings);
- if(Sx_types[32].call(null, f)) return step_sf_begin(body, local, kont);
+ if(Sx_types[40].call(null, f)) return step_sf_begin(body, local, kont);
var
g = Sx_runtime[12].call(null, bindings),
- h = [0, Sx_runtime[96].call(null, g), dC],
+ h = [0, Sx_runtime[96].call(null, g), dF],
and = Sx_runtime[1].call(null, cst, h);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
i = Sx_runtime[12].call(null, bindings),
- j = [0, Sx_runtime[22].call(null, i), dD],
+ j = [0, Sx_runtime[22].call(null, i), dG],
a = Sx_runtime[1].call(null, cst, j);
else
var a = and;
- if(Sx_types[32].call(null, a))
+ if(Sx_types[40].call(null, a))
var first_binding = Sx_runtime[12].call(null, bindings);
else
var
- x = [0, Sx_runtime[15].call(null, bindings, dN), 0],
+ x = [0, Sx_runtime[15].call(null, bindings, dQ), 0],
first_binding = [5, [0, Sx_runtime[12].call(null, bindings), x]];
var
k = Sx_runtime[12].call(null, bindings),
- l = [0, Sx_runtime[96].call(null, k), dE],
+ l = [0, Sx_runtime[96].call(null, k), dH],
and$0 = Sx_runtime[1].call(null, cst, l);
- if(Sx_types[32].call(null, and$0))
+ if(Sx_types[40].call(null, and$0))
var
m = Sx_runtime[12].call(null, bindings),
- n = [0, Sx_runtime[22].call(null, m), dF],
+ n = [0, Sx_runtime[22].call(null, m), dI],
b = Sx_runtime[1].call(null, cst, n);
else
var b = and$0;
- if(Sx_types[32].call(null, b))
+ if(Sx_types[40].call(null, b))
var rest_bindings = Sx_runtime[13].call(null, bindings);
else{
var
- t = [0, Sx_runtime[22].call(null, bindings), dJ],
- u = [0, dK, [0, Sx_runtime[1].call(null, cst$6, t), 0]],
+ t = [0, Sx_runtime[22].call(null, bindings), dM],
+ u = [0, dN, [0, Sx_runtime[1].call(null, cst$6, t), 0]],
v = Sx_runtime[1].call(null, cst_range, u),
w = Sx_runtime[5].call(null, v),
- pairs = [0, dI];
+ pairs = [0, dL];
Stdlib_List[26].call
(null,
function(acc, i){
var
- a = [0, Sx_runtime[1].call(null, cst$5, [0, i, dL]), 0],
+ a = [0, Sx_runtime[1].call(null, cst$5, [0, i, dO]), 0],
b = Sx_runtime[1].call(null, cst_inc, a),
c = [0, Sx_runtime[15].call(null, bindings, b), 0],
- d = Sx_runtime[1].call(null, cst$5, [0, i, dM]),
+ d = Sx_runtime[1].call(null, cst$5, [0, i, dP]),
e = [5, [0, Sx_runtime[15].call(null, bindings, d), c]];
pairs[1] = Sx_runtime[8].call(null, pairs[1], e);
return 0;
@@ -31858,52 +31927,52 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
var
o = Sx_runtime[12].call(null, first_binding),
- p = [0, Sx_runtime[96].call(null, o), dG],
+ p = [0, Sx_runtime[96].call(null, o), dJ],
q = Sx_runtime[1].call(null, cst, p);
- if(Sx_types[32].call(null, q))
+ if(Sx_types[40].call(null, q))
var
r = Sx_runtime[12].call(null, first_binding),
- vname = Sx_types[33].call(null, r);
+ vname = Sx_types[41].call(null, r);
else
var vname = Sx_runtime[12].call(null, first_binding);
var
s = kont_push(make_let_frame(vname, rest_bindings, body, local), kont);
return make_cek_state
- (Sx_runtime[15].call(null, first_binding, dH), local, s);
+ (Sx_runtime[15].call(null, first_binding, dK), local, s);
}
var
- dO = [0, [1, 4.], 0],
- dP = [0, [2, cst_keyword], 0],
- dQ = [1, 1.],
- dR = [0, [2, cst_effects], 0],
- dS = [1, 1.],
- dT = [0, [1, 4.], 0],
- dU = [0, [2, cst_keyword], 0],
+ dR = [0, [1, 4.], 0],
+ dS = [0, [2, cst_keyword], 0],
+ dT = [1, 1.],
+ dU = [0, [2, cst_effects], 0],
dV = [1, 1.],
- dW = [0, [2, cst_effects], 0],
- dX = [1, 1.],
- dY = [1, 3.],
- dZ = [0, [1, 4.], 0],
- d0 = [0, [2, cst_keyword], 0],
- d1 = [1, 1.],
- d2 = [0, [2, cst_effects], 0],
- d3 = [1, 1.],
- d4 = [1, 2.],
- d5 = [1, 1.];
+ dW = [0, [1, 4.], 0],
+ dX = [0, [2, cst_keyword], 0],
+ dY = [1, 1.],
+ dZ = [0, [2, cst_effects], 0],
+ d0 = [1, 1.],
+ d1 = [1, 3.],
+ d2 = [0, [1, 4.], 0],
+ d3 = [0, [2, cst_keyword], 0],
+ d4 = [1, 1.],
+ d5 = [0, [2, cst_effects], 0],
+ d6 = [1, 1.],
+ d7 = [1, 2.],
+ d8 = [1, 1.];
function step_sf_define(args, env, kont){
var
name_sym = Sx_runtime[12].call(null, args),
- c = [0, Sx_runtime[22].call(null, args), dO],
+ c = [0, Sx_runtime[22].call(null, args), dR],
and = Sx_runtime[1].call(null, cst$8, c);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
- d = Sx_runtime[15].call(null, args, dQ),
- e = [0, Sx_runtime[96].call(null, d), dP],
+ d = Sx_runtime[15].call(null, args, dT),
+ e = [0, Sx_runtime[96].call(null, d), dS],
and$0 = Sx_runtime[1].call(null, cst, e);
- if(Sx_types[32].call(null, and$0))
+ if(Sx_types[40].call(null, and$0))
var
- f = Sx_runtime[15].call(null, args, dS),
- g = [0, Sx_types[34].call(null, f), dR],
+ f = Sx_runtime[15].call(null, args, dV),
+ g = [0, Sx_types[42].call(null, f), dU],
has_effects = Sx_runtime[1].call(null, cst, g);
else
var has_effects = and$0;
@@ -31911,17 +31980,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
else
var has_effects = and;
var
- h = [0, Sx_runtime[22].call(null, args), dT],
+ h = [0, Sx_runtime[22].call(null, args), dW],
and$1 = Sx_runtime[1].call(null, cst$8, h);
- if(Sx_types[32].call(null, and$1)){
+ if(Sx_types[40].call(null, and$1)){
var
- i = Sx_runtime[15].call(null, args, dV),
- j = [0, Sx_runtime[96].call(null, i), dU],
+ i = Sx_runtime[15].call(null, args, dY),
+ j = [0, Sx_runtime[96].call(null, i), dX],
and$2 = Sx_runtime[1].call(null, cst, j);
- if(Sx_types[32].call(null, and$2))
+ if(Sx_types[40].call(null, and$2))
var
- k = Sx_runtime[15].call(null, args, dX),
- l = [0, Sx_types[34].call(null, k), dW],
+ k = Sx_runtime[15].call(null, args, d0),
+ l = [0, Sx_types[42].call(null, k), dZ],
a = Sx_runtime[1].call(null, cst, l);
else
var a = and$2;
@@ -31929,18 +31998,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
else
var a = and$1;
var
- val_idx = Sx_types[32].call(null, a) ? dY : d5,
- m = [0, Sx_runtime[22].call(null, args), dZ],
+ val_idx = Sx_types[40].call(null, a) ? d1 : d8,
+ m = [0, Sx_runtime[22].call(null, args), d2],
and$3 = Sx_runtime[1].call(null, cst$8, m);
- if(Sx_types[32].call(null, and$3)){
+ if(Sx_types[40].call(null, and$3)){
var
- n = Sx_runtime[15].call(null, args, d1),
- o = [0, Sx_runtime[96].call(null, n), d0],
+ n = Sx_runtime[15].call(null, args, d4),
+ o = [0, Sx_runtime[96].call(null, n), d3],
and$4 = Sx_runtime[1].call(null, cst, o);
- if(Sx_types[32].call(null, and$4))
+ if(Sx_types[40].call(null, and$4))
var
- p = Sx_runtime[15].call(null, args, d3),
- q = [0, Sx_types[34].call(null, p), d2],
+ p = Sx_runtime[15].call(null, args, d6),
+ q = [0, Sx_types[42].call(null, p), d5],
b = Sx_runtime[1].call(null, cst, q);
else
var b = and$4;
@@ -31949,67 +32018,67 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var b = and$3;
var
effect_list =
- Sx_types[32].call(null, b) ? Sx_runtime[15].call(null, args, d4) : 0,
+ Sx_types[40].call(null, b) ? Sx_runtime[15].call(null, args, d7) : 0,
r =
kont_push
(make_define_frame
- (Sx_types[33].call(null, name_sym), env, has_effects, effect_list),
+ (Sx_types[41].call(null, name_sym), env, has_effects, effect_list),
kont);
return make_cek_state(Sx_runtime[15].call(null, args, val_idx), env, r);
}
- var d6 = [1, 1.];
+ var d9 = [1, 1.];
function step_sf_set_b(args, env, kont){
var
a = Sx_runtime[12].call(null, args),
- b = kont_push(make_set_frame(Sx_types[33].call(null, a), env), kont);
- return make_cek_state(Sx_runtime[15].call(null, args, d6), env, b);
+ b = kont_push(make_set_frame(Sx_types[41].call(null, a), env), kont);
+ return make_cek_state(Sx_runtime[15].call(null, args, d9), env, b);
}
- var d7 = [0, 1];
+ var d_ = [0, 1];
function step_sf_and(args, env, kont){
var a = Sx_runtime[32].call(null, args);
- if(Sx_types[32].call(null, a)) return make_cek_value(d7, env, kont);
+ if(Sx_types[40].call(null, a)) return make_cek_value(d_, env, kont);
var
b = kont_push(make_and_frame(Sx_runtime[13].call(null, args), env), kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, b);
}
- var d8 = [0, 0];
+ var d$ = [0, 0];
function step_sf_or(args, env, kont){
var a = Sx_runtime[32].call(null, args);
- if(Sx_types[32].call(null, a)) return make_cek_value(d8, env, kont);
+ if(Sx_types[40].call(null, a)) return make_cek_value(d$, env, kont);
var
b = kont_push(make_or_frame(Sx_runtime[13].call(null, args), env), kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, b);
}
var
- d9 = [1, 1.],
- d_ = [0, 1],
- d$ = [0, [1, 2.], 0],
ea = [1, 1.],
- eb = [0, 0];
+ eb = [0, 1],
+ ec = [0, [1, 2.], 0],
+ ed = [1, 1.],
+ ee = [0, 0];
function step_sf_cond(args, env, kont){
var scheme_p = cond_scheme_p(args);
- if(Sx_types[32].call(null, scheme_p)){
+ if(Sx_types[40].call(null, scheme_p)){
var a = Sx_runtime[32].call(null, args);
- if(Sx_types[32].call(null, a)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, a)) return make_cek_value(0, env, kont);
var
clause = Sx_runtime[12].call(null, args),
test = Sx_runtime[12].call(null, clause),
b = is_else_clause(test);
- return Sx_types[32].call(null, b)
+ return Sx_types[40].call(null, b)
? make_cek_state
- (Sx_runtime[15].call(null, clause, d9), env, kont)
+ (Sx_runtime[15].call(null, clause, ea), env, kont)
: make_cek_state
- (test, env, kont_push(make_cond_frame(args, env, d_), kont));
+ (test, env, kont_push(make_cond_frame(args, env, eb), kont));
}
var
- c = [0, Sx_runtime[22].call(null, args), d$],
+ c = [0, Sx_runtime[22].call(null, args), ec],
d = Sx_runtime[1].call(null, cst$3, c);
- if(Sx_types[32].call(null, d)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, d)) return make_cek_value(0, env, kont);
var test$0 = Sx_runtime[12].call(null, args), e = is_else_clause(test$0);
- return Sx_types[32].call(null, e)
- ? make_cek_state(Sx_runtime[15].call(null, args, ea), env, kont)
+ return Sx_types[40].call(null, e)
+ ? make_cek_state(Sx_runtime[15].call(null, args, ed), env, kont)
: make_cek_state
- (test$0, env, kont_push(make_cond_frame(args, env, eb), kont));
+ (test$0, env, kont_push(make_cond_frame(args, env, ee), kont));
}
function step_sf_case(args, env, kont){
var
@@ -32029,42 +32098,42 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return make_cek_value(sf_lambda(args, env), env, kont);
}
var
- ec = [0, [1, 1.], 0],
- ed = [0, [1, 2.], 0],
- ee = [0, [2, cst_keyword], 0],
- ef = [0, [2, cst_value], 0],
- eg = [1, 1.],
- eh = [0, [1, 2.], 0];
+ ef = [0, [1, 1.], 0],
+ eg = [0, [1, 2.], 0],
+ eh = [0, [2, cst_keyword], 0],
+ ei = [0, [2, cst_value], 0],
+ ej = [1, 1.],
+ ek = [0, [1, 2.], 0];
function step_sf_scope(args, env, kont){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- rest_args = Sx_runtime[1].call(null, cst_slice, [0, args, ec]),
- b = [0, Sx_runtime[22].call(null, rest_args), ed],
+ rest_args = Sx_runtime[1].call(null, cst_slice, [0, args, ef]),
+ b = [0, Sx_runtime[22].call(null, rest_args), eg],
and = Sx_runtime[1].call(null, cst$8, b);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
c = Sx_runtime[12].call(null, rest_args),
- d = [0, Sx_runtime[96].call(null, c), ee],
+ d = [0, Sx_runtime[96].call(null, c), eh],
and$0 = Sx_runtime[1].call(null, cst, d);
- if(Sx_types[32].call(null, and$0))
+ if(Sx_types[40].call(null, and$0))
var
e = Sx_runtime[12].call(null, rest_args),
- f = [0, Sx_types[34].call(null, e), ef],
+ f = [0, Sx_types[42].call(null, e), ei],
a = Sx_runtime[1].call(null, cst, f);
else
var a = and$0;
}
else
var a = and;
- if(Sx_types[32].call(null, a))
+ if(Sx_types[40].call(null, a))
var
- g = trampoline(eval_expr(Sx_runtime[15].call(null, rest_args, eg), env)),
- body = Sx_runtime[1].call(null, cst_slice, [0, rest_args, eh]),
+ g = trampoline(eval_expr(Sx_runtime[15].call(null, rest_args, ej), env)),
+ body = Sx_runtime[1].call(null, cst_slice, [0, rest_args, ek]),
val = g;
else
var body = rest_args, val = 0;
var h = Sx_runtime[32].call(null, body);
- if(Sx_types[32].call(null, h)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, h)) return make_cek_value(0, env, kont);
var
i =
kont_push
@@ -32072,14 +32141,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
kont);
return make_cek_state(Sx_runtime[12].call(null, body), env, i);
}
- var ei = [1, 1.], ej = [0, [1, 2.], 0];
+ var el = [1, 1.], em = [0, [1, 2.], 0];
function step_sf_provide(args, env, kont){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- val = trampoline(eval_expr(Sx_runtime[15].call(null, args, ei), env)),
- body = Sx_runtime[1].call(null, cst_slice, [0, args, ej]),
+ val = trampoline(eval_expr(Sx_runtime[15].call(null, args, el), env)),
+ body = Sx_runtime[1].call(null, cst_slice, [0, args, em]),
a = Sx_runtime[32].call(null, body);
- if(Sx_types[32].call(null, a)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, a)) return make_cek_value(0, env, kont);
var
b =
kont_push
@@ -32087,61 +32156,61 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
kont);
return make_cek_state(Sx_runtime[12].call(null, body), env, b);
}
- var ek = [0, [1, 2.], 0], el = [1, 1.], em = [2, cst_value];
+ var en = [0, [1, 2.], 0], eo = [1, 1.], ep = [2, cst_value];
function step_sf_context(args, env, kont){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- a = [0, Sx_runtime[22].call(null, args), ek],
+ a = [0, Sx_runtime[22].call(null, args), en],
b = Sx_runtime[1].call(null, cst$8, a),
default_val =
- Sx_types[32].call(null, b)
- ? trampoline(eval_expr(Sx_runtime[15].call(null, args, el), env))
+ Sx_types[40].call(null, b)
+ ? trampoline(eval_expr(Sx_runtime[15].call(null, args, eo), env))
: 0,
frame = kont_find_provide(kont, name),
c = Sx_runtime[106].call(null, frame),
default_val$0 =
- Sx_types[32].call(null, c)
+ Sx_types[40].call(null, c)
? default_val
- : Sx_runtime[23].call(null, frame, em);
+ : Sx_runtime[23].call(null, frame, ep);
return make_cek_value(default_val$0, env, kont);
}
- var en = [1, 1.], eo = [2, cst_emitted], ep = [2, cst_emitted];
+ var eq = [1, 1.], er = [2, cst_emitted], es = [2, cst_emitted];
function step_sf_emit(args, env, kont){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
- val = trampoline(eval_expr(Sx_runtime[15].call(null, args, en), env)),
+ val = trampoline(eval_expr(Sx_runtime[15].call(null, args, eq), env)),
frame = kont_find_scope_acc(kont, name);
- if(Sx_types[32].call(null, frame)){
+ if(Sx_types[40].call(null, frame)){
var
- a = [0, Sx_runtime[23].call(null, frame, eo), [0, [5, [0, val, 0]], 0]],
+ a = [0, Sx_runtime[23].call(null, frame, er), [0, [5, [0, val, 0]], 0]],
b = Sx_runtime[1].call(null, cst_append, a);
- Sx_runtime[9].call(null, frame, ep, b);
+ Sx_runtime[9].call(null, frame, es, b);
}
return make_cek_value(0, env, kont);
}
- var eq = [5, 0], er = [2, cst_emitted];
+ var et = [5, 0], eu = [2, cst_emitted];
function step_sf_emitted(args, env, kont){
var
name = trampoline(eval_expr(Sx_runtime[12].call(null, args), env)),
frame = kont_find_scope_acc(kont, name),
a = Sx_runtime[106].call(null, frame),
b =
- Sx_types[32].call(null, a) ? eq : Sx_runtime[23].call(null, frame, er);
+ Sx_types[40].call(null, a) ? et : Sx_runtime[23].call(null, frame, eu);
return make_cek_value(b, env, kont);
}
function step_sf_reset(args, env, kont){
var a = kont_push(make_reset_frame(env), kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var es = [1, 1.], et = [1, 1.];
+ var ev = [1, 1.], ew = [1, 1.];
function step_sf_shift(args, env, kont){
var
a = Sx_runtime[12].call(null, args),
- k_name = Sx_types[33].call(null, a),
- body = Sx_runtime[15].call(null, args, es),
+ k_name = Sx_types[41].call(null, a),
+ body = Sx_runtime[15].call(null, args, ev),
captured_result = kont_capture_to_reset(kont),
captured = Sx_runtime[12].call(null, captured_result),
- rest_kont = Sx_runtime[15].call(null, captured_result, et),
+ rest_kont = Sx_runtime[15].call(null, captured_result, ew),
k = Sx_runtime[123].call(null, captured, rest_kont),
shift_env = Sx_runtime[103].call(null, env),
b = Sx_runtime[3].call(null, k_name);
@@ -32152,34 +32221,34 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = kont_push(make_deref_frame(env), kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var eu = [5, 0], ev = [5, 0];
+ var ex = [5, 0], ey = [5, 0];
function cek_call(f, args){
var
b = Sx_runtime[106].call(null, args),
- a = Sx_types[32].call(null, b) ? eu : args,
+ a = Sx_types[40].call(null, b) ? ex : args,
c = Sx_runtime[106].call(null, f);
- if(Sx_types[32].call(null, c)) return 0;
+ if(Sx_types[40].call(null, c)) return 0;
var
or = Sx_runtime[108].call(null, f),
- or$0 = Sx_types[32].call(null, or) ? or : Sx_runtime[113].call(null, f);
- return Sx_types[32].call(null, or$0)
+ or$0 = Sx_types[40].call(null, or) ? or : Sx_runtime[113].call(null, f);
+ return Sx_types[40].call(null, or$0)
? cek_run
- (continue_with_call(f, a, Sx_runtime[102].call(null, 0), a, ev))
+ (continue_with_call(f, a, Sx_runtime[102].call(null, 0), a, ey))
: 0;
}
var
cst_update_fn = "update-fn",
- ew = [1, 1.],
- ex = [1, 2.],
- ey = [2, cst_update_fn],
- ez = [0, 0];
+ ez = [1, 1.],
+ eA = [1, 2.],
+ eB = [2, cst_update_fn],
+ eC = [0, 0];
function reactive_shift_deref(sig, env, kont){
var
scan_result = kont_capture_to_reactive_reset(kont),
captured_frames = Sx_runtime[12].call(null, scan_result),
- reset_frame = Sx_runtime[15].call(null, scan_result, ew),
- remaining_kont = Sx_runtime[15].call(null, scan_result, ex),
- update_fn = Sx_runtime[23].call(null, reset_frame, ey),
+ reset_frame = Sx_runtime[15].call(null, scan_result, ez),
+ remaining_kont = Sx_runtime[15].call(null, scan_result, eA),
+ update_fn = Sx_runtime[23].call(null, reset_frame, eB),
cst = "\xce\xbb",
subscriber =
[13,
@@ -32188,7 +32257,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = Sx_runtime[5].call(null, 0);
Stdlib_List[18].call(null, function(d){cek_call(d, 0); return 0;}, a);
var
- new_reset = make_reactive_reset_frame(env, update_fn, ez),
+ new_reset = make_reactive_reset_frame(env, update_fn, eC),
new_kont =
Sx_runtime[1].call
(null,
@@ -32227,159 +32296,159 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
[0, [5, [0, reset_frame, 0]], [0, remaining_kont, 0]]]);
return make_cek_value(Sx_runtime[137].call(null, sig), env, initial_kont);
}
- var eA = [0, [2, cst_symbol], 0], eB = [5, 0];
+ var eD = [0, [2, cst_symbol], 0], eE = [5, 0];
function step_eval_call(head, args, env, kont){
var
- a = [0, Sx_runtime[96].call(null, head), eA],
+ a = [0, Sx_runtime[96].call(null, head), eD],
b = Sx_runtime[1].call(null, cst, a),
- hname = Sx_types[32].call(null, b) ? Sx_types[33].call(null, head) : 0;
+ hname = Sx_types[40].call(null, b) ? Sx_types[41].call(null, head) : 0;
return make_cek_state
(head,
env,
- kont_push(make_arg_frame(0, eB, args, env, args, hname), kont));
+ kont_push(make_arg_frame(0, eE, args, env, args, hname), kont));
}
var
- eC = [0, [2, cst_map], 0],
- eD = [0, [2, cst_map_indexed], 0],
- eE = [0, [2, cst_filter], 0],
- eF = [0, [2, cst_reduce], 0],
- eG = [0, [2, cst_some], 0],
- eH = [0, [2, cst_every$0], 0],
- eI = [0, [2, cst_for_each], 0];
+ eF = [0, [2, cst_map], 0],
+ eG = [0, [2, cst_map_indexed], 0],
+ eH = [0, [2, cst_filter], 0],
+ eI = [0, [2, cst_reduce], 0],
+ eJ = [0, [2, cst_some], 0],
+ eK = [0, [2, cst_every$0], 0],
+ eL = [0, [2, cst_for_each], 0];
function ho_form_name_p(name){
- var or = Sx_runtime[1].call(null, cst, [0, name, eC]);
- if(Sx_types[32].call(null, or)) return or;
- var or$0 = Sx_runtime[1].call(null, cst, [0, name, eD]);
- if(Sx_types[32].call(null, or$0)) return or$0;
- var or$1 = Sx_runtime[1].call(null, cst, [0, name, eE]);
- if(Sx_types[32].call(null, or$1)) return or$1;
- var or$2 = Sx_runtime[1].call(null, cst, [0, name, eF]);
- if(Sx_types[32].call(null, or$2)) return or$2;
- var or$3 = Sx_runtime[1].call(null, cst, [0, name, eG]);
- if(Sx_types[32].call(null, or$3)) return or$3;
- var or$4 = Sx_runtime[1].call(null, cst, [0, name, eH]);
- return Sx_types[32].call(null, or$4)
+ var or = Sx_runtime[1].call(null, cst, [0, name, eF]);
+ if(Sx_types[40].call(null, or)) return or;
+ var or$0 = Sx_runtime[1].call(null, cst, [0, name, eG]);
+ if(Sx_types[40].call(null, or$0)) return or$0;
+ var or$1 = Sx_runtime[1].call(null, cst, [0, name, eH]);
+ if(Sx_types[40].call(null, or$1)) return or$1;
+ var or$2 = Sx_runtime[1].call(null, cst, [0, name, eI]);
+ if(Sx_types[40].call(null, or$2)) return or$2;
+ var or$3 = Sx_runtime[1].call(null, cst, [0, name, eJ]);
+ if(Sx_types[40].call(null, or$3)) return or$3;
+ var or$4 = Sx_runtime[1].call(null, cst, [0, name, eK]);
+ return Sx_types[40].call(null, or$4)
? or$4
- : Sx_runtime[1].call(null, cst, [0, name, eI]);
+ : Sx_runtime[1].call(null, cst, [0, name, eL]);
}
function ho_fn_p(v){
var or = Sx_runtime[113].call(null, v);
- return Sx_types[32].call(null, or) ? or : Sx_runtime[108].call(null, v);
+ return Sx_types[40].call(null, or) ? or : Sx_runtime[108].call(null, v);
}
- var eJ = [0, [2, cst_reduce], 0], eK = [1, 1.], eL = [1, 2.], eM = [1, 1.];
+ var eM = [0, [2, cst_reduce], 0], eN = [1, 1.], eO = [1, 2.], eP = [1, 1.];
function ho_swap_args(ho_type, evaled){
- var c = Sx_runtime[1].call(null, cst, [0, ho_type, eJ]);
- if(Sx_types[32].call(null, c)){
+ var c = Sx_runtime[1].call(null, cst, [0, ho_type, eM]);
+ if(Sx_types[40].call(null, c)){
var
a = Sx_runtime[12].call(null, evaled),
- b = Sx_runtime[15].call(null, evaled, eK),
+ b = Sx_runtime[15].call(null, evaled, eN),
d = ho_fn_p(a),
- and = [0, 1 - Sx_types[32].call(null, d)],
- e = Sx_types[32].call(null, and) ? ho_fn_p(b) : and;
- return Sx_types[32].call(null, e)
+ and = [0, 1 - Sx_types[40].call(null, d)],
+ e = Sx_types[40].call(null, and) ? ho_fn_p(b) : and;
+ return Sx_types[40].call(null, e)
? [5,
- [0, b, [0, Sx_runtime[15].call(null, evaled, eL), [0, a, 0]]]]
+ [0, b, [0, Sx_runtime[15].call(null, evaled, eO), [0, a, 0]]]]
: evaled;
}
var
a$0 = Sx_runtime[12].call(null, evaled),
- b$0 = Sx_runtime[15].call(null, evaled, eM),
+ b$0 = Sx_runtime[15].call(null, evaled, eP),
f = ho_fn_p(a$0),
- and$0 = [0, 1 - Sx_types[32].call(null, f)],
- g = Sx_types[32].call(null, and$0) ? ho_fn_p(b$0) : and$0;
- return Sx_types[32].call(null, g) ? [5, [0, b$0, [0, a$0, 0]]] : evaled;
+ and$0 = [0, 1 - Sx_types[40].call(null, f)],
+ g = Sx_types[40].call(null, and$0) ? ho_fn_p(b$0) : and$0;
+ return Sx_types[40].call(null, g) ? [5, [0, b$0, [0, a$0, 0]]] : evaled;
}
var
- eN = [0, [2, cst_map], 0],
- eO = [1, 1.],
- eP = [5, 0],
- eQ = [5, 0],
- eR = [5, 0],
- eS = [0, [2, cst_map_indexed], 0],
- eT = [1, 1.],
+ eQ = [0, [2, cst_map], 0],
+ eR = [1, 1.],
+ eS = [5, 0],
+ eT = [5, 0],
eU = [5, 0],
- eV = [5, 0],
- eW = [5, 0],
- eX = [1, 0.],
- eY = [0, [2, cst_filter], 0],
- eZ = [1, 1.],
- e0 = [5, 0],
- e1 = [5, 0],
- e2 = [5, 0],
- e3 = [0, [2, cst_reduce], 0],
- e4 = [1, 1.],
- e5 = [1, 2.],
- e6 = [5, 0],
- e7 = [0, [2, cst_some], 0],
- e8 = [1, 1.],
- e9 = [0, 0],
- e_ = [5, 0],
- e$ = [0, [2, cst_every], 0],
- fa = [1, 1.],
- fb = [0, 1],
- fc = [5, 0],
- fd = [0, [2, cst_for_each], 0],
- fe = [1, 1.],
+ eV = [0, [2, cst_map_indexed], 0],
+ eW = [1, 1.],
+ eX = [5, 0],
+ eY = [5, 0],
+ eZ = [5, 0],
+ e0 = [1, 0.],
+ e1 = [0, [2, cst_filter], 0],
+ e2 = [1, 1.],
+ e3 = [5, 0],
+ e4 = [5, 0],
+ e5 = [5, 0],
+ e6 = [0, [2, cst_reduce], 0],
+ e7 = [1, 1.],
+ e8 = [1, 2.],
+ e9 = [5, 0],
+ e_ = [0, [2, cst_some], 0],
+ e$ = [1, 1.],
+ fa = [0, 0],
+ fb = [5, 0],
+ fc = [0, [2, cst_every], 0],
+ fd = [1, 1.],
+ fe = [0, 1],
ff = [5, 0],
- fg = [2, "Unknown HO type: "];
+ fg = [0, [2, cst_for_each], 0],
+ fh = [1, 1.],
+ fi = [5, 0],
+ fj = [2, "Unknown HO type: "];
function ho_setup_dispatch(ho_type, evaled, env, kont){
var
ordered = ho_swap_args(ho_type, evaled),
f = Sx_runtime[12].call(null, ordered),
- a = Sx_runtime[1].call(null, cst, [0, ho_type, eN]);
- if(Sx_types[32].call(null, a)){
+ a = Sx_runtime[1].call(null, cst, [0, ho_type, eQ]);
+ if(Sx_types[40].call(null, a)){
var
- coll = Sx_runtime[15].call(null, ordered, eO),
+ coll = Sx_runtime[15].call(null, ordered, eR),
b = Sx_runtime[32].call(null, coll);
- if(Sx_types[32].call(null, b)) return make_cek_value(eP, env, kont);
+ if(Sx_types[40].call(null, b)) return make_cek_value(eS, env, kont);
var
c =
kont_push
- (make_map_frame(f, Sx_runtime[13].call(null, coll), eQ, env), kont);
+ (make_map_frame(f, Sx_runtime[13].call(null, coll), eT, env), kont);
return continue_with_call
- (f, [5, [0, Sx_runtime[12].call(null, coll), 0]], env, eR, c);
+ (f, [5, [0, Sx_runtime[12].call(null, coll), 0]], env, eU, c);
}
- var d = Sx_runtime[1].call(null, cst, [0, ho_type, eS]);
- if(Sx_types[32].call(null, d)){
+ var d = Sx_runtime[1].call(null, cst, [0, ho_type, eV]);
+ if(Sx_types[40].call(null, d)){
var
- coll$0 = Sx_runtime[15].call(null, ordered, eT),
+ coll$0 = Sx_runtime[15].call(null, ordered, eW),
e = Sx_runtime[32].call(null, coll$0);
- if(Sx_types[32].call(null, e)) return make_cek_value(eU, env, kont);
+ if(Sx_types[40].call(null, e)) return make_cek_value(eX, env, kont);
var
g =
kont_push
(make_map_indexed_frame
- (f, Sx_runtime[13].call(null, coll$0), eV, env),
+ (f, Sx_runtime[13].call(null, coll$0), eY, env),
kont);
return continue_with_call
(f,
- [5, [0, eX, [0, Sx_runtime[12].call(null, coll$0), 0]]],
+ [5, [0, e0, [0, Sx_runtime[12].call(null, coll$0), 0]]],
env,
- eW,
+ eZ,
g);
}
- var h = Sx_runtime[1].call(null, cst, [0, ho_type, eY]);
- if(Sx_types[32].call(null, h)){
+ var h = Sx_runtime[1].call(null, cst, [0, ho_type, e1]);
+ if(Sx_types[40].call(null, h)){
var
- coll$1 = Sx_runtime[15].call(null, ordered, eZ),
+ coll$1 = Sx_runtime[15].call(null, ordered, e2),
i = Sx_runtime[32].call(null, coll$1);
- if(Sx_types[32].call(null, i)) return make_cek_value(e0, env, kont);
+ if(Sx_types[40].call(null, i)) return make_cek_value(e3, env, kont);
var
j = Sx_runtime[12].call(null, coll$1),
k =
kont_push
- (make_filter_frame(f, Sx_runtime[13].call(null, coll$1), e1, j, env),
+ (make_filter_frame(f, Sx_runtime[13].call(null, coll$1), e4, j, env),
kont);
return continue_with_call
- (f, [5, [0, Sx_runtime[12].call(null, coll$1), 0]], env, e2, k);
+ (f, [5, [0, Sx_runtime[12].call(null, coll$1), 0]], env, e5, k);
}
- var l = Sx_runtime[1].call(null, cst, [0, ho_type, e3]);
- if(Sx_types[32].call(null, l)){
+ var l = Sx_runtime[1].call(null, cst, [0, ho_type, e6]);
+ if(Sx_types[40].call(null, l)){
var
- init = Sx_runtime[15].call(null, ordered, e4),
- coll$2 = Sx_runtime[15].call(null, ordered, e5),
+ init = Sx_runtime[15].call(null, ordered, e7),
+ coll$2 = Sx_runtime[15].call(null, ordered, e8),
m = Sx_runtime[32].call(null, coll$2);
- if(Sx_types[32].call(null, m)) return make_cek_value(init, env, kont);
+ if(Sx_types[40].call(null, m)) return make_cek_value(init, env, kont);
var
n =
kont_push
@@ -32388,113 +32457,113 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(f,
[5, [0, init, [0, Sx_runtime[12].call(null, coll$2), 0]]],
env,
- e6,
+ e9,
n);
}
- var o = Sx_runtime[1].call(null, cst, [0, ho_type, e7]);
- if(Sx_types[32].call(null, o)){
+ var o = Sx_runtime[1].call(null, cst, [0, ho_type, e_]);
+ if(Sx_types[40].call(null, o)){
var
- coll$3 = Sx_runtime[15].call(null, ordered, e8),
+ coll$3 = Sx_runtime[15].call(null, ordered, e$),
p = Sx_runtime[32].call(null, coll$3);
- if(Sx_types[32].call(null, p)) return make_cek_value(e9, env, kont);
+ if(Sx_types[40].call(null, p)) return make_cek_value(fa, env, kont);
var
q =
kont_push
(make_some_frame(f, Sx_runtime[13].call(null, coll$3), env), kont);
return continue_with_call
- (f, [5, [0, Sx_runtime[12].call(null, coll$3), 0]], env, e_, q);
+ (f, [5, [0, Sx_runtime[12].call(null, coll$3), 0]], env, fb, q);
}
- var r = Sx_runtime[1].call(null, cst, [0, ho_type, e$]);
- if(Sx_types[32].call(null, r)){
+ var r = Sx_runtime[1].call(null, cst, [0, ho_type, fc]);
+ if(Sx_types[40].call(null, r)){
var
- coll$4 = Sx_runtime[15].call(null, ordered, fa),
+ coll$4 = Sx_runtime[15].call(null, ordered, fd),
s = Sx_runtime[32].call(null, coll$4);
- if(Sx_types[32].call(null, s)) return make_cek_value(fb, env, kont);
+ if(Sx_types[40].call(null, s)) return make_cek_value(fe, env, kont);
var
t =
kont_push
(make_every_frame(f, Sx_runtime[13].call(null, coll$4), env), kont);
return continue_with_call
- (f, [5, [0, Sx_runtime[12].call(null, coll$4), 0]], env, fc, t);
+ (f, [5, [0, Sx_runtime[12].call(null, coll$4), 0]], env, ff, t);
}
- var u = Sx_runtime[1].call(null, cst, [0, ho_type, fd]);
- if(! Sx_types[32].call(null, u)){
+ var u = Sx_runtime[1].call(null, cst, [0, ho_type, fg]);
+ if(! Sx_types[40].call(null, u)){
var
- x = [2, Sx_runtime[4].call(null, [0, fg, [0, ho_type, 0]])],
+ x = [2, Sx_runtime[4].call(null, [0, fj, [0, ho_type, 0]])],
y = Sx_runtime[2].call(null, x);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], y], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], y], 1);
}
var
- coll$5 = Sx_runtime[15].call(null, ordered, fe),
+ coll$5 = Sx_runtime[15].call(null, ordered, fh),
v = Sx_runtime[32].call(null, coll$5);
- if(Sx_types[32].call(null, v)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, v)) return make_cek_value(0, env, kont);
var
w =
kont_push
(make_for_each_frame(f, Sx_runtime[13].call(null, coll$5), env), kont);
return continue_with_call
- (f, [5, [0, Sx_runtime[12].call(null, coll$5), 0]], env, ff, w);
+ (f, [5, [0, Sx_runtime[12].call(null, coll$5), 0]], env, fi, w);
}
- var fh = [5, 0], fi = [2, cst_map];
+ var fk = [5, 0], fl = [2, cst_map];
function step_ho_map(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fi, Sx_runtime[13].call(null, args), fh, env),
+ (make_ho_setup_frame(fl, Sx_runtime[13].call(null, args), fk, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var fj = [5, 0], fk = [2, cst_map_indexed];
+ var fm = [5, 0], fn = [2, cst_map_indexed];
function step_ho_map_indexed(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fk, Sx_runtime[13].call(null, args), fj, env),
+ (make_ho_setup_frame(fn, Sx_runtime[13].call(null, args), fm, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var fl = [5, 0], fm = [2, cst_filter];
+ var fo = [5, 0], fp = [2, cst_filter];
function step_ho_filter(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fm, Sx_runtime[13].call(null, args), fl, env),
+ (make_ho_setup_frame(fp, Sx_runtime[13].call(null, args), fo, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var fn = [5, 0], fo = [2, cst_reduce];
+ var fq = [5, 0], fr = [2, cst_reduce];
function step_ho_reduce(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fo, Sx_runtime[13].call(null, args), fn, env),
+ (make_ho_setup_frame(fr, Sx_runtime[13].call(null, args), fq, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var fp = [5, 0], fq = [2, cst_some];
+ var fs = [5, 0], ft = [2, cst_some];
function step_ho_some(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fq, Sx_runtime[13].call(null, args), fp, env),
+ (make_ho_setup_frame(ft, Sx_runtime[13].call(null, args), fs, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var fr = [5, 0], fs = [2, cst_every];
+ var fu = [5, 0], fv = [2, cst_every];
function step_ho_every(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fs, Sx_runtime[13].call(null, args), fr, env),
+ (make_ho_setup_frame(fv, Sx_runtime[13].call(null, args), fu, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
- var ft = [5, 0], fu = [2, cst_for_each];
+ var fw = [5, 0], fx = [2, cst_for_each];
function step_ho_for_each(args, env, kont){
var
a =
kont_push
- (make_ho_setup_frame(fu, Sx_runtime[13].call(null, args), ft, env),
+ (make_ho_setup_frame(fx, Sx_runtime[13].call(null, args), fw, env),
kont);
return make_cek_state(Sx_runtime[12].call(null, args), env, a);
}
@@ -32505,209 +32574,209 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
cst_f = "f",
cst_remaining = "remaining",
cst_results = "results",
- fv = [0, [2, cst_if], 0],
- fw = [2, cst_env],
- fx = [2, "then"],
- fy = [2, cst_else],
+ fy = [0, [2, cst_if], 0],
fz = [2, cst_env],
- fA = [2, cst_else],
- fB = [0, [2, cst_when], 0],
- fC = [2, cst_body],
- fD = [2, cst_env],
- fE = [0, [1, 1.], 0],
- fF = [0, [2, cst_begin], 0],
- fG = [2, cst_remaining],
- fH = [2, cst_env],
- fI = [0, [1, 1.], 0],
- fJ = [0, [2, cst_let], 0],
- fK = [2, cst_name],
- fL = [2, cst_remaining],
- fM = [2, cst_body],
- fN = [2, cst_env],
- fO = [0, [2, cst_symbol], 0],
- fP = [1, 1.],
- fQ = [0, [2, cst_define], 0],
- fR = [2, cst_name],
- fS = [2, cst_env],
- fT = [2, "has-effects"],
- fU = [2, "effect-list"],
- fV = [0, [2, cst_list], 0],
- fW = [0, [2, cst_symbol], 0],
- fX = [2, cst_effect_annotations],
- fY = [2, cst_effect_annotations],
- fZ = [2, cst_effect_annotations],
- f0 = [0, [2, cst_set], 0],
- f1 = [2, cst_name],
- f2 = [2, cst_env],
- f3 = [0, [2, cst_and], 0],
- f4 = [2, cst_remaining],
- f5 = [0, [1, 1.], 0],
- f6 = [2, cst_env],
- f7 = [2, cst_env],
- f8 = [0, [2, cst_or], 0],
- f9 = [2, cst_remaining],
- f_ = [0, 0],
- f$ = [0, [1, 1.], 0],
- ga = [2, cst_env],
- gb = [2, cst_env],
- gc = [0, [2, cst_cond], 0],
- gd = [2, cst_remaining],
+ fA = [2, "then"],
+ fB = [2, cst_else],
+ fC = [2, cst_env],
+ fD = [2, cst_else],
+ fE = [0, [2, cst_when], 0],
+ fF = [2, cst_body],
+ fG = [2, cst_env],
+ fH = [0, [1, 1.], 0],
+ fI = [0, [2, cst_begin], 0],
+ fJ = [2, cst_remaining],
+ fK = [2, cst_env],
+ fL = [0, [1, 1.], 0],
+ fM = [0, [2, cst_let], 0],
+ fN = [2, cst_name],
+ fO = [2, cst_remaining],
+ fP = [2, cst_body],
+ fQ = [2, cst_env],
+ fR = [0, [2, cst_symbol], 0],
+ fS = [1, 1.],
+ fT = [0, [2, cst_define], 0],
+ fU = [2, cst_name],
+ fV = [2, cst_env],
+ fW = [2, "has-effects"],
+ fX = [2, "effect-list"],
+ fY = [0, [2, cst_list], 0],
+ fZ = [0, [2, cst_symbol], 0],
+ f0 = [2, cst_effect_annotations],
+ f1 = [2, cst_effect_annotations],
+ f2 = [2, cst_effect_annotations],
+ f3 = [0, [2, cst_set], 0],
+ f4 = [2, cst_name],
+ f5 = [2, cst_env],
+ f6 = [0, [2, cst_and], 0],
+ f7 = [2, cst_remaining],
+ f8 = [0, [1, 1.], 0],
+ f9 = [2, cst_env],
+ f_ = [2, cst_env],
+ f$ = [0, [2, cst_or], 0],
+ ga = [2, cst_remaining],
+ gb = [0, 0],
+ gc = [0, [1, 1.], 0],
+ gd = [2, cst_env],
ge = [2, cst_env],
- gf = [2, "scheme"],
- gg = [1, 1.],
- gh = [1, 1.],
- gi = [0, 1],
+ gf = [0, [2, cst_cond], 0],
+ gg = [2, cst_remaining],
+ gh = [2, cst_env],
+ gi = [2, "scheme"],
gj = [1, 1.],
- gk = [0, [1, 2.], 0],
- gl = [0, [1, 2.], 0],
+ gk = [1, 1.],
+ gl = [0, 1],
gm = [1, 1.],
- gn = [0, 0],
- go = [0, [2, cst_case], 0],
- gp = [2, "match-val"],
- gq = [2, cst_remaining],
- gr = [2, cst_env],
- gs = [0, [2, cst_thread], 0],
+ gn = [0, [1, 2.], 0],
+ go = [0, [1, 2.], 0],
+ gp = [1, 1.],
+ gq = [0, 0],
+ gr = [0, [2, cst_case], 0],
+ gs = [2, "match-val"],
gt = [2, cst_remaining],
gu = [2, cst_env],
- gv = [0, [2, cst_list], 0],
- gw = [0, [2, cst_symbol], 0],
- gx = [3, cst_quote],
+ gv = [0, [2, cst_thread], 0],
+ gw = [2, cst_remaining],
+ gx = [2, cst_env],
gy = [0, [2, cst_list], 0],
- gz = [2, cst_form_not_callable],
- gA = [2, cst_form_not_callable],
- gB = [0, [2, cst_arg], 0],
- gC = [2, cst_f],
- gD = [2, cst_evaled],
- gE = [2, cst_remaining],
- gF = [2, cst_env],
- gG = [2, "raw-args"],
- gH = [2, "head-name"],
- gI = [5, 0],
- gJ = [5, 0],
- gK = [5, 0],
- gL = [0, [2, cst_dict], 0],
- gM = [2, cst_remaining],
- gN = [2, cst_results],
- gO = [2, cst_env],
- gP = [1, 0.],
- gQ = [1, 1.],
- gR = [1, 1.],
- gS = [0, [2, cst_ho_setup], 0],
- gT = [2, "ho-type"],
- gU = [2, cst_remaining],
- gV = [2, cst_evaled],
- gW = [2, cst_env],
- gX = [0, [2, cst_reset], 0],
- gY = [0, [2, cst_deref], 0],
+ gz = [0, [2, cst_symbol], 0],
+ gA = [3, cst_quote],
+ gB = [0, [2, cst_list], 0],
+ gC = [2, cst_form_not_callable],
+ gD = [2, cst_form_not_callable],
+ gE = [0, [2, cst_arg], 0],
+ gF = [2, cst_f],
+ gG = [2, cst_evaled],
+ gH = [2, cst_remaining],
+ gI = [2, cst_env],
+ gJ = [2, "raw-args"],
+ gK = [2, "head-name"],
+ gL = [5, 0],
+ gM = [5, 0],
+ gN = [5, 0],
+ gO = [0, [2, cst_dict], 0],
+ gP = [2, cst_remaining],
+ gQ = [2, cst_results],
+ gR = [2, cst_env],
+ gS = [1, 0.],
+ gT = [1, 1.],
+ gU = [1, 1.],
+ gV = [0, [2, cst_ho_setup], 0],
+ gW = [2, "ho-type"],
+ gX = [2, cst_remaining],
+ gY = [2, cst_evaled],
gZ = [2, cst_env],
- g0 = [2, "sx-reactive"],
- g1 = [2, "deps"],
- g2 = [2, "notify"],
- g3 = [0, [2, cst_reactive_reset], 0],
- g4 = [2, cst_update_fn],
- g5 = [2, "first-render"],
- g6 = [0, [2, cst_scope], 0],
- g7 = [2, cst_name],
- g8 = [2, cst_remaining],
- g9 = [2, cst_env],
- g_ = [0, [2, cst_provide], 0],
+ g0 = [0, [2, cst_reset], 0],
+ g1 = [0, [2, cst_deref], 0],
+ g2 = [2, cst_env],
+ g3 = [2, "sx-reactive"],
+ g4 = [2, "deps"],
+ g5 = [2, "notify"],
+ g6 = [0, [2, cst_reactive_reset], 0],
+ g7 = [2, cst_update_fn],
+ g8 = [2, "first-render"],
+ g9 = [0, [2, cst_scope], 0],
+ g_ = [2, cst_name],
g$ = [2, cst_remaining],
ha = [2, cst_env],
- hb = [2, cst_value],
- hc = [2, cst_name],
- hd = [0, [2, cst_scope_acc], 0],
- he = [2, cst_remaining],
- hf = [2, cst_env],
- hg = [2, cst_value],
- hh = [2, cst_name],
- hi = [2, cst_emitted],
- hj = [2, cst_emitted],
- hk = [0, [2, cst_map], 0],
- hl = [2, cst_f],
- hm = [2, cst_remaining],
- hn = [2, cst_results],
- ho = [2, "indexed"],
- hp = [2, cst_env],
- hq = [5, 0],
- hr = [0, [2, cst_filter], 0],
- hs = [2, cst_f],
- ht = [2, cst_remaining],
- hu = [2, cst_results],
- hv = [2, "current-item"],
- hw = [2, cst_env],
- hx = [5, 0],
- hy = [0, [2, cst_reduce], 0],
- hz = [2, cst_f],
- hA = [2, cst_remaining],
- hB = [2, cst_env],
- hC = [5, 0],
- hD = [0, [2, cst_for_each], 0],
- hE = [2, cst_f],
- hF = [2, cst_remaining],
- hG = [2, cst_env],
- hH = [5, 0],
- hI = [0, [2, cst_some], 0],
- hJ = [2, cst_f],
- hK = [2, cst_remaining],
- hL = [2, cst_env],
- hM = [0, 0],
- hN = [5, 0],
- hO = [0, [2, cst_every], 0],
- hP = [2, cst_f],
- hQ = [2, cst_remaining],
- hR = [2, cst_env],
- hS = [0, 0],
- hT = [0, 1],
- hU = [5, 0],
- hV = [2, "Unknown frame type: "];
+ hb = [0, [2, cst_provide], 0],
+ hc = [2, cst_remaining],
+ hd = [2, cst_env],
+ he = [2, cst_value],
+ hf = [2, cst_name],
+ hg = [0, [2, cst_scope_acc], 0],
+ hh = [2, cst_remaining],
+ hi = [2, cst_env],
+ hj = [2, cst_value],
+ hk = [2, cst_name],
+ hl = [2, cst_emitted],
+ hm = [2, cst_emitted],
+ hn = [0, [2, cst_map], 0],
+ ho = [2, cst_f],
+ hp = [2, cst_remaining],
+ hq = [2, cst_results],
+ hr = [2, "indexed"],
+ hs = [2, cst_env],
+ ht = [5, 0],
+ hu = [0, [2, cst_filter], 0],
+ hv = [2, cst_f],
+ hw = [2, cst_remaining],
+ hx = [2, cst_results],
+ hy = [2, "current-item"],
+ hz = [2, cst_env],
+ hA = [5, 0],
+ hB = [0, [2, cst_reduce], 0],
+ hC = [2, cst_f],
+ hD = [2, cst_remaining],
+ hE = [2, cst_env],
+ hF = [5, 0],
+ hG = [0, [2, cst_for_each], 0],
+ hH = [2, cst_f],
+ hI = [2, cst_remaining],
+ hJ = [2, cst_env],
+ hK = [5, 0],
+ hL = [0, [2, cst_some], 0],
+ hM = [2, cst_f],
+ hN = [2, cst_remaining],
+ hO = [2, cst_env],
+ hP = [0, 0],
+ hQ = [5, 0],
+ hR = [0, [2, cst_every], 0],
+ hS = [2, cst_f],
+ hT = [2, cst_remaining],
+ hU = [2, cst_env],
+ hV = [0, 0],
+ hW = [0, 1],
+ hX = [5, 0],
+ hY = [2, "Unknown frame type: "];
function step_continue(state){
var
value = cek_value(state),
env = cek_env(state),
kont = cek_kont(state),
i = kont_empty_p(kont);
- if(Sx_types[32].call(null, i)) return state;
+ if(Sx_types[40].call(null, i)) return state;
var
frame = kont_top(kont),
rest_k = kont_pop(kont),
ft = frame_type(frame),
- j = Sx_runtime[1].call(null, cst, [0, ft, fv]);
- if(Sx_types[32].call(null, j)){
- if(Sx_types[32].call(null, value))
+ j = Sx_runtime[1].call(null, cst, [0, ft, fy]);
+ if(Sx_types[40].call(null, j)){
+ if(Sx_types[40].call(null, value))
var
k = Sx_runtime[106].call(null, value),
- b = [0, 1 - Sx_types[32].call(null, k)];
+ b = [0, 1 - Sx_types[40].call(null, k)];
else
var b = value;
- if(Sx_types[32].call(null, b)){
- var l = Sx_runtime[23].call(null, frame, fw);
- return make_cek_state(Sx_runtime[23].call(null, frame, fx), l, rest_k);
+ if(Sx_types[40].call(null, b)){
+ var l = Sx_runtime[23].call(null, frame, fz);
+ return make_cek_state(Sx_runtime[23].call(null, frame, fA), l, rest_k);
}
var
- m = Sx_runtime[23].call(null, frame, fy),
+ m = Sx_runtime[23].call(null, frame, fB),
n = Sx_runtime[106].call(null, m);
- if(Sx_types[32].call(null, n)) return make_cek_value(0, env, rest_k);
- var o = Sx_runtime[23].call(null, frame, fz);
- return make_cek_state(Sx_runtime[23].call(null, frame, fA), o, rest_k);
+ if(Sx_types[40].call(null, n)) return make_cek_value(0, env, rest_k);
+ var o = Sx_runtime[23].call(null, frame, fC);
+ return make_cek_state(Sx_runtime[23].call(null, frame, fD), o, rest_k);
}
- var p = Sx_runtime[1].call(null, cst, [0, ft, fB]);
- if(Sx_types[32].call(null, p)){
- if(Sx_types[32].call(null, value))
+ var p = Sx_runtime[1].call(null, cst, [0, ft, fE]);
+ if(Sx_types[40].call(null, p)){
+ if(Sx_types[40].call(null, value))
var
q = Sx_runtime[106].call(null, value),
- c = [0, 1 - Sx_types[32].call(null, q)];
+ c = [0, 1 - Sx_types[40].call(null, q)];
else
var c = value;
- if(! Sx_types[32].call(null, c)) return make_cek_value(0, env, rest_k);
+ if(! Sx_types[40].call(null, c)) return make_cek_value(0, env, rest_k);
var
- body = Sx_runtime[23].call(null, frame, fC),
- fenv = Sx_runtime[23].call(null, frame, fD),
+ body = Sx_runtime[23].call(null, frame, fF),
+ fenv = Sx_runtime[23].call(null, frame, fG),
r = Sx_runtime[32].call(null, body);
- if(Sx_types[32].call(null, r)) return make_cek_value(0, fenv, rest_k);
+ if(Sx_types[40].call(null, r)) return make_cek_value(0, fenv, rest_k);
var
- s = [0, Sx_runtime[22].call(null, body), fE],
+ s = [0, Sx_runtime[22].call(null, body), fH],
t = Sx_runtime[1].call(null, cst, s);
- if(Sx_types[32].call(null, t))
+ if(Sx_types[40].call(null, t))
return make_cek_state(Sx_runtime[12].call(null, body), fenv, rest_k);
var
u =
@@ -32715,18 +32784,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(make_begin_frame(Sx_runtime[13].call(null, body), fenv), rest_k);
return make_cek_state(Sx_runtime[12].call(null, body), fenv, u);
}
- var v = Sx_runtime[1].call(null, cst, [0, ft, fF]);
- if(Sx_types[32].call(null, v)){
+ var v = Sx_runtime[1].call(null, cst, [0, ft, fI]);
+ if(Sx_types[40].call(null, v)){
var
- remaining = Sx_runtime[23].call(null, frame, fG),
- fenv$0 = Sx_runtime[23].call(null, frame, fH),
+ remaining = Sx_runtime[23].call(null, frame, fJ),
+ fenv$0 = Sx_runtime[23].call(null, frame, fK),
w = Sx_runtime[32].call(null, remaining);
- if(Sx_types[32].call(null, w))
+ if(Sx_types[40].call(null, w))
return make_cek_value(value, fenv$0, rest_k);
var
- x = [0, Sx_runtime[22].call(null, remaining), fI],
+ x = [0, Sx_runtime[22].call(null, remaining), fL],
y = Sx_runtime[1].call(null, cst, x);
- if(Sx_types[32].call(null, y))
+ if(Sx_types[40].call(null, y))
return make_cek_state
(Sx_runtime[12].call(null, remaining), fenv$0, rest_k);
var
@@ -32736,27 +32805,27 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
rest_k);
return make_cek_state(Sx_runtime[12].call(null, remaining), fenv$0, z);
}
- var A = Sx_runtime[1].call(null, cst, [0, ft, fJ]);
- if(Sx_types[32].call(null, A)){
+ var A = Sx_runtime[1].call(null, cst, [0, ft, fM]);
+ if(Sx_types[40].call(null, A)){
var
- name = Sx_runtime[23].call(null, frame, fK),
- remaining$0 = Sx_runtime[23].call(null, frame, fL),
- body$0 = Sx_runtime[23].call(null, frame, fM),
- local = Sx_runtime[23].call(null, frame, fN),
+ name = Sx_runtime[23].call(null, frame, fN),
+ remaining$0 = Sx_runtime[23].call(null, frame, fO),
+ body$0 = Sx_runtime[23].call(null, frame, fP),
+ local = Sx_runtime[23].call(null, frame, fQ),
B = Sx_runtime[3].call(null, name);
Sx_runtime[100].call(null, local, B, value);
var C = Sx_runtime[32].call(null, remaining$0);
- if(Sx_types[32].call(null, C))
+ if(Sx_types[40].call(null, C))
return step_sf_begin(body$0, local, rest_k);
var
next_binding = Sx_runtime[12].call(null, remaining$0),
D = Sx_runtime[12].call(null, next_binding),
- E = [0, Sx_runtime[96].call(null, D), fO],
+ E = [0, Sx_runtime[96].call(null, D), fR],
F = Sx_runtime[1].call(null, cst, E);
- if(Sx_types[32].call(null, F))
+ if(Sx_types[40].call(null, F))
var
G = Sx_runtime[12].call(null, next_binding),
- vname = Sx_types[33].call(null, G);
+ vname = Sx_types[41].call(null, G);
else
var vname = Sx_runtime[12].call(null, next_binding);
var
@@ -32766,33 +32835,33 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(vname, Sx_runtime[13].call(null, remaining$0), body$0, local),
rest_k);
return make_cek_state
- (Sx_runtime[15].call(null, next_binding, fP), local, H);
+ (Sx_runtime[15].call(null, next_binding, fS), local, H);
}
- var I = Sx_runtime[1].call(null, cst, [0, ft, fQ]);
- if(Sx_types[32].call(null, I)){
+ var I = Sx_runtime[1].call(null, cst, [0, ft, fT]);
+ if(Sx_types[40].call(null, I)){
var
- name$0 = Sx_runtime[23].call(null, frame, fR),
- fenv$1 = Sx_runtime[23].call(null, frame, fS),
- has_effects = Sx_runtime[23].call(null, frame, fT),
- effect_list = Sx_runtime[23].call(null, frame, fU),
+ name$0 = Sx_runtime[23].call(null, frame, fU),
+ fenv$1 = Sx_runtime[23].call(null, frame, fV),
+ has_effects = Sx_runtime[23].call(null, frame, fW),
+ effect_list = Sx_runtime[23].call(null, frame, fX),
and = Sx_runtime[108].call(null, value);
- if(Sx_types[32].call(null, and))
+ if(Sx_types[40].call(null, and))
var
- J = Sx_types[38].call(null, value),
+ J = Sx_types[46].call(null, value),
e = Sx_runtime[106].call(null, J);
else
var e = and;
- if(Sx_types[32].call(null, e)){
+ if(Sx_types[40].call(null, e)){
var K = Sx_runtime[3].call(null, name$0);
Sx_runtime[105].call(null, value, K);
}
var L = Sx_runtime[3].call(null, name$0);
Sx_runtime[100].call(null, fenv$1, L, value);
- if(Sx_types[32].call(null, has_effects)){
+ if(Sx_types[40].call(null, has_effects)){
var
- M = [0, Sx_runtime[96].call(null, effect_list), fV],
+ M = [0, Sx_runtime[96].call(null, effect_list), fY],
N = Sx_runtime[1].call(null, cst, M);
- if(Sx_types[32].call(null, N))
+ if(Sx_types[40].call(null, N))
var
O = Sx_runtime[5].call(null, effect_list),
effect_names =
@@ -32801,10 +32870,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(e){
var
- a = [0, Sx_runtime[96].call(null, e), fW],
+ a = [0, Sx_runtime[96].call(null, e), fZ],
b = Sx_runtime[1].call(null, cst, a);
- return Sx_types[32].call(null, b)
- ? Sx_types[33].call(null, e)
+ return Sx_types[40].call(null, b)
+ ? Sx_types[41].call(null, e)
: [2, Sx_runtime[4].call(null, [0, e, 0])];
},
O)];
@@ -32813,137 +32882,137 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
effect_names =
[5, [0, [2, Sx_runtime[4].call(null, [0, effect_list, 0])], 0]];
var
- P = Sx_runtime[98].call(null, fenv$1, fX),
+ P = Sx_runtime[98].call(null, fenv$1, f0),
effect_anns =
- Sx_types[32].call(null, P)
- ? Sx_runtime[99].call(null, fenv$1, fY)
+ Sx_types[40].call(null, P)
+ ? Sx_runtime[99].call(null, fenv$1, f1)
: [6, Stdlib_Hashtbl[1].call(null, 0, 0)];
Sx_runtime[9].call(null, effect_anns, name$0, effect_names);
- var Q = Sx_runtime[3].call(null, fZ);
+ var Q = Sx_runtime[3].call(null, f2);
Sx_runtime[100].call(null, fenv$1, Q, effect_anns);
}
return make_cek_value(value, fenv$1, rest_k);
}
- var R = Sx_runtime[1].call(null, cst, [0, ft, f0]);
- if(Sx_types[32].call(null, R)){
+ var R = Sx_runtime[1].call(null, cst, [0, ft, f3]);
+ if(Sx_types[40].call(null, R)){
var
- name$1 = Sx_runtime[23].call(null, frame, f1),
- fenv$2 = Sx_runtime[23].call(null, frame, f2),
+ name$1 = Sx_runtime[23].call(null, frame, f4),
+ fenv$2 = Sx_runtime[23].call(null, frame, f5),
S = Sx_runtime[3].call(null, name$1);
Sx_runtime[101].call(null, fenv$2, S, value);
return make_cek_value(value, env, rest_k);
}
- var T = Sx_runtime[1].call(null, cst, [0, ft, f3]);
- if(Sx_types[32].call(null, T)){
- var U = [0, 1 - Sx_types[32].call(null, value)];
- if(Sx_types[32].call(null, U)) return make_cek_value(value, env, rest_k);
+ var T = Sx_runtime[1].call(null, cst, [0, ft, f6]);
+ if(Sx_types[40].call(null, T)){
+ var U = [0, 1 - Sx_types[40].call(null, value)];
+ if(Sx_types[40].call(null, U)) return make_cek_value(value, env, rest_k);
var
- remaining$1 = Sx_runtime[23].call(null, frame, f4),
+ remaining$1 = Sx_runtime[23].call(null, frame, f7),
V = Sx_runtime[32].call(null, remaining$1);
- if(Sx_types[32].call(null, V)) return make_cek_value(value, env, rest_k);
+ if(Sx_types[40].call(null, V)) return make_cek_value(value, env, rest_k);
var
- W = [0, Sx_runtime[22].call(null, remaining$1), f5],
+ W = [0, Sx_runtime[22].call(null, remaining$1), f8],
X = Sx_runtime[1].call(null, cst, W);
- if(Sx_types[32].call(null, X))
+ if(Sx_types[40].call(null, X))
var rest_k$0 = rest_k;
else
var
- Z = Sx_runtime[23].call(null, frame, f7),
+ Z = Sx_runtime[23].call(null, frame, f_),
rest_k$0 =
kont_push
(make_and_frame(Sx_runtime[13].call(null, remaining$1), Z), rest_k);
- var Y = Sx_runtime[23].call(null, frame, f6);
+ var Y = Sx_runtime[23].call(null, frame, f9);
return make_cek_state
(Sx_runtime[12].call(null, remaining$1), Y, rest_k$0);
}
- var _ = Sx_runtime[1].call(null, cst, [0, ft, f8]);
- if(Sx_types[32].call(null, _)){
- if(Sx_types[32].call(null, value))
+ var _ = Sx_runtime[1].call(null, cst, [0, ft, f$]);
+ if(Sx_types[40].call(null, _)){
+ if(Sx_types[40].call(null, value))
return make_cek_value(value, env, rest_k);
var
- remaining$2 = Sx_runtime[23].call(null, frame, f9),
+ remaining$2 = Sx_runtime[23].call(null, frame, ga),
$ = Sx_runtime[32].call(null, remaining$2);
- if(Sx_types[32].call(null, $)) return make_cek_value(f_, env, rest_k);
+ if(Sx_types[40].call(null, $)) return make_cek_value(gb, env, rest_k);
var
- aa = [0, Sx_runtime[22].call(null, remaining$2), f$],
+ aa = [0, Sx_runtime[22].call(null, remaining$2), gc],
ab = Sx_runtime[1].call(null, cst, aa);
- if(Sx_types[32].call(null, ab))
+ if(Sx_types[40].call(null, ab))
var rest_k$1 = rest_k;
else
var
- ad = Sx_runtime[23].call(null, frame, gb),
+ ad = Sx_runtime[23].call(null, frame, ge),
rest_k$1 =
kont_push
(make_or_frame(Sx_runtime[13].call(null, remaining$2), ad), rest_k);
- var ac = Sx_runtime[23].call(null, frame, ga);
+ var ac = Sx_runtime[23].call(null, frame, gd);
return make_cek_state
(Sx_runtime[12].call(null, remaining$2), ac, rest_k$1);
}
- var ae = Sx_runtime[1].call(null, cst, [0, ft, gc]);
- if(Sx_types[32].call(null, ae)){
+ var ae = Sx_runtime[1].call(null, cst, [0, ft, gf]);
+ if(Sx_types[40].call(null, ae)){
var
- remaining$3 = Sx_runtime[23].call(null, frame, gd),
- fenv$3 = Sx_runtime[23].call(null, frame, ge),
- scheme_p = Sx_runtime[23].call(null, frame, gf);
- if(! Sx_types[32].call(null, scheme_p)){
- if(Sx_types[32].call(null, value))
+ remaining$3 = Sx_runtime[23].call(null, frame, gg),
+ fenv$3 = Sx_runtime[23].call(null, frame, gh),
+ scheme_p = Sx_runtime[23].call(null, frame, gi);
+ if(! Sx_types[40].call(null, scheme_p)){
+ if(Sx_types[40].call(null, value))
return make_cek_state
- (Sx_runtime[15].call(null, remaining$3, gj), fenv$3, rest_k);
+ (Sx_runtime[15].call(null, remaining$3, gm), fenv$3, rest_k);
var
- next = Sx_runtime[1].call(null, cst_slice, [0, remaining$3, gk]),
- ai = [0, Sx_runtime[22].call(null, next), gl],
+ next = Sx_runtime[1].call(null, cst_slice, [0, remaining$3, gn]),
+ ai = [0, Sx_runtime[22].call(null, next), go],
aj = Sx_runtime[1].call(null, cst$3, ai);
- if(Sx_types[32].call(null, aj))
+ if(Sx_types[40].call(null, aj))
return make_cek_value(0, fenv$3, rest_k);
var
next_test$0 = Sx_runtime[12].call(null, next),
ak = is_else_clause(next_test$0);
- return Sx_types[32].call(null, ak)
+ return Sx_types[40].call(null, ak)
? make_cek_state
- (Sx_runtime[15].call(null, next, gm), fenv$3, rest_k)
+ (Sx_runtime[15].call(null, next, gp), fenv$3, rest_k)
: make_cek_state
(next_test$0,
fenv$3,
- kont_push(make_cond_frame(next, fenv$3, gn), rest_k));
+ kont_push(make_cond_frame(next, fenv$3, gq), rest_k));
}
- if(Sx_types[32].call(null, value)){
+ if(Sx_types[40].call(null, value)){
var af = Sx_runtime[12].call(null, remaining$3);
- return make_cek_state(Sx_runtime[15].call(null, af, gg), fenv$3, rest_k);
+ return make_cek_state(Sx_runtime[15].call(null, af, gj), fenv$3, rest_k);
}
var
next_clauses = Sx_runtime[13].call(null, remaining$3),
ag = Sx_runtime[32].call(null, next_clauses);
- if(Sx_types[32].call(null, ag)) return make_cek_value(0, fenv$3, rest_k);
+ if(Sx_types[40].call(null, ag)) return make_cek_value(0, fenv$3, rest_k);
var
next_clause = Sx_runtime[12].call(null, next_clauses),
next_test = Sx_runtime[12].call(null, next_clause),
ah = is_else_clause(next_test);
- return Sx_types[32].call(null, ah)
+ return Sx_types[40].call(null, ah)
? make_cek_state
- (Sx_runtime[15].call(null, next_clause, gh), fenv$3, rest_k)
+ (Sx_runtime[15].call(null, next_clause, gk), fenv$3, rest_k)
: make_cek_state
(next_test,
fenv$3,
- kont_push(make_cond_frame(next_clauses, fenv$3, gi), rest_k));
+ kont_push(make_cond_frame(next_clauses, fenv$3, gl), rest_k));
}
- var al = Sx_runtime[1].call(null, cst, [0, ft, go]);
- if(Sx_types[32].call(null, al)){
+ var al = Sx_runtime[1].call(null, cst, [0, ft, gr]);
+ if(Sx_types[40].call(null, al)){
var
- match_val = Sx_runtime[23].call(null, frame, gp),
- remaining$4 = Sx_runtime[23].call(null, frame, gq),
- fenv$4 = Sx_runtime[23].call(null, frame, gr),
+ match_val = Sx_runtime[23].call(null, frame, gs),
+ remaining$4 = Sx_runtime[23].call(null, frame, gt),
+ fenv$4 = Sx_runtime[23].call(null, frame, gu),
am = Sx_runtime[106].call(null, match_val);
- return Sx_types[32].call(null, am)
+ return Sx_types[40].call(null, am)
? sf_case_step_loop(value, remaining$4, fenv$4, rest_k)
: sf_case_step_loop(match_val, remaining$4, fenv$4, rest_k);
}
- var an = Sx_runtime[1].call(null, cst, [0, ft, gs]);
- if(Sx_types[32].call(null, an)){
+ var an = Sx_runtime[1].call(null, cst, [0, ft, gv]);
+ if(Sx_types[40].call(null, an)){
var
- remaining$5 = Sx_runtime[23].call(null, frame, gt),
- fenv$5 = Sx_runtime[23].call(null, frame, gu),
+ remaining$5 = Sx_runtime[23].call(null, frame, gw),
+ fenv$5 = Sx_runtime[23].call(null, frame, gx),
ao = Sx_runtime[32].call(null, remaining$5);
- if(Sx_types[32].call(null, ao))
+ if(Sx_types[40].call(null, ao))
return make_cek_value(value, fenv$5, rest_k);
var
form = Sx_runtime[12].call(null, remaining$5),
@@ -32951,26 +33020,26 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
ap = Sx_runtime[13].call(null, remaining$5),
aq = Sx_runtime[32].call(null, ap),
new_kont =
- Sx_types[32].call(null, aq)
+ Sx_types[40].call(null, aq)
? rest_k
: kont_push
(make_thread_frame(Sx_runtime[13].call(null, remaining$5), fenv$5),
rest_k),
- ar = [0, Sx_runtime[96].call(null, form), gv],
+ ar = [0, Sx_runtime[96].call(null, form), gy],
and$0 = Sx_runtime[1].call(null, cst, ar);
- if(Sx_types[32].call(null, and$0)){
+ if(Sx_types[40].call(null, and$0)){
var
as = Sx_runtime[32].call(null, form),
- and$1 = [0, 1 - Sx_types[32].call(null, as)];
- if(Sx_types[32].call(null, and$1)){
+ and$1 = [0, 1 - Sx_types[40].call(null, as)];
+ if(Sx_types[40].call(null, and$1)){
var
at = Sx_runtime[12].call(null, form),
- au = [0, Sx_runtime[96].call(null, at), gw],
+ au = [0, Sx_runtime[96].call(null, at), gz],
and$2 = Sx_runtime[1].call(null, cst, au);
- if(Sx_types[32].call(null, and$2))
+ if(Sx_types[40].call(null, and$2))
var
av = Sx_runtime[12].call(null, form),
- a = ho_form_name_p(Sx_types[33].call(null, av));
+ a = ho_form_name_p(Sx_types[41].call(null, av));
else
var a = and$2;
}
@@ -32979,18 +33048,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else
var a = and$0;
- if(Sx_types[32].call(null, a)){
+ if(Sx_types[40].call(null, a)){
var
aw = Sx_runtime[13].call(null, form),
- ax = Sx_runtime[16].call(null, [5, [0, gx, [0, value, 0]]], aw),
+ ax = Sx_runtime[16].call(null, [5, [0, gA, [0, value, 0]]], aw),
ay = Sx_runtime[12].call(null, form);
return make_cek_state
(Sx_runtime[16].call(null, ay, ax), fenv$5, new_kont);
}
var
- az = [0, Sx_runtime[96].call(null, form), gy],
+ az = [0, Sx_runtime[96].call(null, form), gB],
aA = Sx_runtime[1].call(null, cst, az);
- if(Sx_types[32].call(null, aA)){
+ if(Sx_types[40].call(null, aA)){
var
f = trampoline(eval_expr(Sx_runtime[12].call(null, form), fenv$5)),
aB = Sx_runtime[13].call(null, form),
@@ -33001,22 +33070,22 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null, function(a){return trampoline(eval_expr(a, fenv$5));}, aC)],
all_args = Sx_runtime[16].call(null, value, rargs),
and$3 = Sx_runtime[113].call(null, f);
- if(Sx_types[32].call(null, and$3))
+ if(Sx_types[40].call(null, and$3))
var
aD = Sx_runtime[108].call(null, f),
- g = [0, 1 - Sx_types[32].call(null, aD)];
+ g = [0, 1 - Sx_types[40].call(null, aD)];
else
var g = and$3;
- if(Sx_types[32].call(null, g))
+ if(Sx_types[40].call(null, g))
var result = Sx_runtime[7].call(null, f, all_args);
else{
var aF = Sx_runtime[108].call(null, f);
- if(! Sx_types[32].call(null, aF)){
+ if(! Sx_types[40].call(null, aF)){
var
- aG = [0, gz, [0, Sx_runtime[83].call(null, f), 0]],
+ aG = [0, gC, [0, Sx_runtime[83].call(null, f), 0]],
aH = [2, Sx_runtime[4].call(null, aG)],
aI = Sx_runtime[2].call(null, aH);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], aI], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], aI], 1);
}
var result = trampoline(call_lambda(f, all_args, fenv$5));
}
@@ -33025,58 +33094,58 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
f$0 = trampoline(eval_expr(form, fenv$5)),
and$4 = Sx_runtime[113].call(null, f$0);
- if(Sx_types[32].call(null, and$4))
+ if(Sx_types[40].call(null, and$4))
var
aJ = Sx_runtime[108].call(null, f$0),
- h = [0, 1 - Sx_types[32].call(null, aJ)];
+ h = [0, 1 - Sx_types[40].call(null, aJ)];
else
var h = and$4;
- if(Sx_types[32].call(null, h))
+ if(Sx_types[40].call(null, h))
var result = cek_call(f$0, [5, [0, value, 0]]);
else{
var aK = Sx_runtime[108].call(null, f$0);
- if(! Sx_types[32].call(null, aK)){
+ if(! Sx_types[40].call(null, aK)){
var
- aL = [0, gA, [0, Sx_runtime[83].call(null, f$0), 0]],
+ aL = [0, gD, [0, Sx_runtime[83].call(null, f$0), 0]],
aM = [2, Sx_runtime[4].call(null, aL)],
aN = Sx_runtime[2].call(null, aM);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], aN], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], aN], 1);
}
var result = trampoline(call_lambda(f$0, [5, [0, value, 0]], fenv$5));
}
}
var aE = Sx_runtime[32].call(null, rest_forms);
- return Sx_types[32].call(null, aE)
+ return Sx_types[40].call(null, aE)
? make_cek_value(result, fenv$5, rest_k)
: make_cek_value
(result,
fenv$5,
kont_push(make_thread_frame(rest_forms, fenv$5), rest_k));
}
- var aO = Sx_runtime[1].call(null, cst, [0, ft, gB]);
- if(Sx_types[32].call(null, aO)){
+ var aO = Sx_runtime[1].call(null, cst, [0, ft, gE]);
+ if(Sx_types[40].call(null, aO)){
var
- f$1 = Sx_runtime[23].call(null, frame, gC),
- evaled = Sx_runtime[23].call(null, frame, gD),
- remaining$6 = Sx_runtime[23].call(null, frame, gE),
- fenv$6 = Sx_runtime[23].call(null, frame, gF),
- raw_args = Sx_runtime[23].call(null, frame, gG),
- hname = Sx_runtime[23].call(null, frame, gH),
+ f$1 = Sx_runtime[23].call(null, frame, gF),
+ evaled = Sx_runtime[23].call(null, frame, gG),
+ remaining$6 = Sx_runtime[23].call(null, frame, gH),
+ fenv$6 = Sx_runtime[23].call(null, frame, gI),
+ raw_args = Sx_runtime[23].call(null, frame, gJ),
+ hname = Sx_runtime[23].call(null, frame, gK),
aP = Sx_runtime[106].call(null, f$1);
- if(Sx_types[32].call(null, aP)){
+ if(Sx_types[40].call(null, aP)){
var
and$5 = strict_ref[1],
- hname$0 = Sx_types[32].call(null, and$5) ? hname : and$5;
- if(Sx_types[32].call(null, hname$0)) strict_check_args(hname, gI);
+ hname$0 = Sx_types[40].call(null, and$5) ? hname : and$5;
+ if(Sx_types[40].call(null, hname$0)) strict_check_args(hname, gL);
var aQ = Sx_runtime[32].call(null, remaining$6);
- if(Sx_types[32].call(null, aQ))
- return continue_with_call(value, gJ, fenv$6, raw_args, rest_k);
+ if(Sx_types[40].call(null, aQ))
+ return continue_with_call(value, gM, fenv$6, raw_args, rest_k);
var
aR =
kont_push
(make_arg_frame
(value,
- gK,
+ gN,
Sx_runtime[13].call(null, remaining$6),
fenv$6,
raw_args,
@@ -33090,7 +33159,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Sx_runtime[1].call
(null, cst_append, [0, evaled, [0, [5, [0, value, 0]], 0]]),
aS = Sx_runtime[32].call(null, remaining$6);
- if(! Sx_types[32].call(null, aS)){
+ if(! Sx_types[40].call(null, aS)){
var
aT =
kont_push
@@ -33107,17 +33176,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
var
and$6 = strict_ref[1],
- hname$1 = Sx_types[32].call(null, and$6) ? hname : and$6;
- if(Sx_types[32].call(null, hname$1))
+ hname$1 = Sx_types[40].call(null, and$6) ? hname : and$6;
+ if(Sx_types[40].call(null, hname$1))
strict_check_args(hname, new_evaled);
return continue_with_call(f$1, new_evaled, fenv$6, raw_args, rest_k);
}
- var aU = Sx_runtime[1].call(null, cst, [0, ft, gL]);
- if(Sx_types[32].call(null, aU)){
+ var aU = Sx_runtime[1].call(null, cst, [0, ft, gO]);
+ if(Sx_types[40].call(null, aU)){
var
- remaining$7 = Sx_runtime[23].call(null, frame, gM),
- results = Sx_runtime[23].call(null, frame, gN),
- fenv$7 = Sx_runtime[23].call(null, frame, gO),
+ remaining$7 = Sx_runtime[23].call(null, frame, gP),
+ results = Sx_runtime[23].call(null, frame, gQ),
+ fenv$7 = Sx_runtime[23].call(null, frame, gR),
last_result = Sx_runtime[14].call(null, results),
aV =
[0,
@@ -33128,11 +33197,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
0],
aW = [0, Sx_runtime[22].call(null, results), 0],
aX =
- [0, results, [0, gP, [0, Sx_runtime[1].call(null, cst_dec, aW), 0]]],
+ [0, results, [0, gS, [0, Sx_runtime[1].call(null, cst_dec, aW), 0]]],
aY = [0, Sx_runtime[1].call(null, cst_slice, aX), aV],
completed = Sx_runtime[1].call(null, cst_append, aY),
aZ = Sx_runtime[32].call(null, remaining$7);
- if(Sx_types[32].call(null, aZ)){
+ if(Sx_types[40].call(null, aZ)){
var
d = [6, Stdlib_Hashtbl[1].call(null, 0, 0)],
a0 = Sx_runtime[5].call(null, completed);
@@ -33140,7 +33209,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(pair){
var
- a = Sx_runtime[15].call(null, pair, gQ),
+ a = Sx_runtime[15].call(null, pair, gT),
b = Sx_runtime[12].call(null, pair);
Sx_runtime[9].call(null, d, b, a);
return 0;
@@ -33162,19 +33231,19 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(make_dict_frame(Sx_runtime[13].call(null, remaining$7), a2, fenv$7),
rest_k);
return make_cek_state
- (Sx_runtime[15].call(null, next_entry, gR), fenv$7, a3);
+ (Sx_runtime[15].call(null, next_entry, gU), fenv$7, a3);
}
- var a4 = Sx_runtime[1].call(null, cst, [0, ft, gS]);
- if(Sx_types[32].call(null, a4)){
+ var a4 = Sx_runtime[1].call(null, cst, [0, ft, gV]);
+ if(Sx_types[40].call(null, a4)){
var
- ho_type = Sx_runtime[23].call(null, frame, gT),
- remaining$8 = Sx_runtime[23].call(null, frame, gU),
+ ho_type = Sx_runtime[23].call(null, frame, gW),
+ remaining$8 = Sx_runtime[23].call(null, frame, gX),
a5 =
- [0, Sx_runtime[23].call(null, frame, gV), [0, [5, [0, value, 0]], 0]],
+ [0, Sx_runtime[23].call(null, frame, gY), [0, [5, [0, value, 0]], 0]],
evaled$0 = Sx_runtime[1].call(null, cst_append, a5),
- fenv$8 = Sx_runtime[23].call(null, frame, gW),
+ fenv$8 = Sx_runtime[23].call(null, frame, gZ),
a6 = Sx_runtime[32].call(null, remaining$8);
- if(Sx_types[32].call(null, a6))
+ if(Sx_types[40].call(null, a6))
return ho_setup_dispatch(ho_type, evaled$0, fenv$8, rest_k);
var
a7 =
@@ -33184,54 +33253,54 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
rest_k);
return make_cek_state(Sx_runtime[12].call(null, remaining$8), fenv$8, a7);
}
- var a8 = Sx_runtime[1].call(null, cst, [0, ft, gX]);
- if(Sx_types[32].call(null, a8)) return make_cek_value(value, env, rest_k);
- var a9 = Sx_runtime[1].call(null, cst, [0, ft, gY]);
- if(Sx_types[32].call(null, a9)){
+ var a8 = Sx_runtime[1].call(null, cst, [0, ft, g0]);
+ if(Sx_types[40].call(null, a8)) return make_cek_value(value, env, rest_k);
+ var a9 = Sx_runtime[1].call(null, cst, [0, ft, g1]);
+ if(Sx_types[40].call(null, a9)){
var
- fenv$9 = Sx_runtime[23].call(null, frame, gZ),
+ fenv$9 = Sx_runtime[23].call(null, frame, g2),
a_ = Sx_runtime[112].call(null, value),
- a$ = [0, 1 - Sx_types[32].call(null, a_)];
- if(Sx_types[32].call(null, a$))
+ a$ = [0, 1 - Sx_types[40].call(null, a_)];
+ if(Sx_types[40].call(null, a$))
return make_cek_value(value, fenv$9, rest_k);
var ba = has_reactive_reset_frame_p(rest_k);
- if(Sx_types[32].call(null, ba))
+ if(Sx_types[40].call(null, ba))
return reactive_shift_deref(value, fenv$9, rest_k);
- var ctx = Sx_runtime[94].call(null, g0, 0);
- if(Sx_types[32].call(null, ctx)){
+ var ctx = Sx_runtime[94].call(null, g3, 0);
+ if(Sx_types[40].call(null, ctx)){
var
- dep_list = Sx_runtime[23].call(null, ctx, g1),
- notify_fn = Sx_runtime[23].call(null, ctx, g2),
+ dep_list = Sx_runtime[23].call(null, ctx, g4),
+ notify_fn = Sx_runtime[23].call(null, ctx, g5),
bb =
Sx_runtime[1].call(null, "contains?", [0, dep_list, [0, value, 0]]),
- bc = [0, 1 - Sx_types[32].call(null, bb)];
- if(Sx_types[32].call(null, bc)){
+ bc = [0, 1 - Sx_types[40].call(null, bb)];
+ if(Sx_types[40].call(null, bc)){
Sx_runtime[8].call(null, dep_list, value);
Sx_runtime[140].call(null, value, notify_fn);
}
}
return make_cek_value(Sx_runtime[137].call(null, value), fenv$9, rest_k);
}
- var bd = Sx_runtime[1].call(null, cst, [0, ft, g3]);
- if(Sx_types[32].call(null, bd)){
+ var bd = Sx_runtime[1].call(null, cst, [0, ft, g6]);
+ if(Sx_types[40].call(null, bd)){
var
- update_fn = Sx_runtime[23].call(null, frame, g4),
- first_p = Sx_runtime[23].call(null, frame, g5),
+ update_fn = Sx_runtime[23].call(null, frame, g7),
+ first_p = Sx_runtime[23].call(null, frame, g8),
be =
- Sx_types[32].call(null, update_fn)
- ? [0, 1 - Sx_types[32].call(null, first_p)]
+ Sx_types[40].call(null, update_fn)
+ ? [0, 1 - Sx_types[40].call(null, first_p)]
: update_fn;
- if(Sx_types[32].call(null, be)) cek_call(update_fn, [5, [0, value, 0]]);
+ if(Sx_types[40].call(null, be)) cek_call(update_fn, [5, [0, value, 0]]);
return make_cek_value(value, env, rest_k);
}
- var bf = Sx_runtime[1].call(null, cst, [0, ft, g6]);
- if(Sx_types[32].call(null, bf)){
+ var bf = Sx_runtime[1].call(null, cst, [0, ft, g9]);
+ if(Sx_types[40].call(null, bf)){
var
- name$2 = Sx_runtime[23].call(null, frame, g7),
- remaining$9 = Sx_runtime[23].call(null, frame, g8),
- fenv$10 = Sx_runtime[23].call(null, frame, g9),
+ name$2 = Sx_runtime[23].call(null, frame, g_),
+ remaining$9 = Sx_runtime[23].call(null, frame, g$),
+ fenv$10 = Sx_runtime[23].call(null, frame, ha),
bg = Sx_runtime[32].call(null, remaining$9);
- if(Sx_types[32].call(null, bg)){
+ if(Sx_types[40].call(null, bg)){
Sx_runtime[127].call(null, name$2);
return make_cek_value(value, fenv$10, rest_k);
}
@@ -33244,60 +33313,60 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return make_cek_state
(Sx_runtime[12].call(null, remaining$9), fenv$10, bh);
}
- var bi = Sx_runtime[1].call(null, cst, [0, ft, g_]);
- if(Sx_types[32].call(null, bi)){
+ var bi = Sx_runtime[1].call(null, cst, [0, ft, hb]);
+ if(Sx_types[40].call(null, bi)){
var
- remaining$10 = Sx_runtime[23].call(null, frame, g$),
- fenv$11 = Sx_runtime[23].call(null, frame, ha),
+ remaining$10 = Sx_runtime[23].call(null, frame, hc),
+ fenv$11 = Sx_runtime[23].call(null, frame, hd),
bj = Sx_runtime[32].call(null, remaining$10);
- if(Sx_types[32].call(null, bj))
+ if(Sx_types[40].call(null, bj))
return make_cek_value(value, fenv$11, rest_k);
var
bk = Sx_runtime[13].call(null, remaining$10),
- bl = Sx_runtime[23].call(null, frame, hb),
+ bl = Sx_runtime[23].call(null, frame, he),
bm =
kont_push
(make_provide_frame
- (Sx_runtime[23].call(null, frame, hc), bl, bk, fenv$11),
+ (Sx_runtime[23].call(null, frame, hf), bl, bk, fenv$11),
rest_k);
return make_cek_state
(Sx_runtime[12].call(null, remaining$10), fenv$11, bm);
}
- var bn = Sx_runtime[1].call(null, cst, [0, ft, hd]);
- if(Sx_types[32].call(null, bn)){
+ var bn = Sx_runtime[1].call(null, cst, [0, ft, hg]);
+ if(Sx_types[40].call(null, bn)){
var
- remaining$11 = Sx_runtime[23].call(null, frame, he),
- fenv$12 = Sx_runtime[23].call(null, frame, hf),
+ remaining$11 = Sx_runtime[23].call(null, frame, hh),
+ fenv$12 = Sx_runtime[23].call(null, frame, hi),
bo = Sx_runtime[32].call(null, remaining$11);
- if(Sx_types[32].call(null, bo))
+ if(Sx_types[40].call(null, bo))
return make_cek_value(value, fenv$12, rest_k);
var
bp = Sx_runtime[13].call(null, remaining$11),
- bq = Sx_runtime[23].call(null, frame, hg),
+ bq = Sx_runtime[23].call(null, frame, hj),
new_frame =
make_scope_acc_frame
- (Sx_runtime[23].call(null, frame, hh), bq, bp, fenv$12),
- br = Sx_runtime[23].call(null, frame, hi);
- Sx_runtime[9].call(null, new_frame, hj, br);
+ (Sx_runtime[23].call(null, frame, hk), bq, bp, fenv$12),
+ br = Sx_runtime[23].call(null, frame, hl);
+ Sx_runtime[9].call(null, new_frame, hm, br);
var bs = kont_push(new_frame, rest_k);
return make_cek_state
(Sx_runtime[12].call(null, remaining$11), fenv$12, bs);
}
- var bt = Sx_runtime[1].call(null, cst, [0, ft, hk]);
- if(Sx_types[32].call(null, bt)){
+ var bt = Sx_runtime[1].call(null, cst, [0, ft, hn]);
+ if(Sx_types[40].call(null, bt)){
var
- f$2 = Sx_runtime[23].call(null, frame, hl),
- remaining$12 = Sx_runtime[23].call(null, frame, hm),
- results$0 = Sx_runtime[23].call(null, frame, hn),
- indexed = Sx_runtime[23].call(null, frame, ho),
- fenv$13 = Sx_runtime[23].call(null, frame, hp),
+ f$2 = Sx_runtime[23].call(null, frame, ho),
+ remaining$12 = Sx_runtime[23].call(null, frame, hp),
+ results$0 = Sx_runtime[23].call(null, frame, hq),
+ indexed = Sx_runtime[23].call(null, frame, hr),
+ fenv$13 = Sx_runtime[23].call(null, frame, hs),
new_results =
Sx_runtime[1].call
(null, cst_append, [0, results$0, [0, [5, [0, value, 0]], 0]]),
bu = Sx_runtime[32].call(null, remaining$12);
- if(Sx_types[32].call(null, bu))
+ if(Sx_types[40].call(null, bu))
return make_cek_value(new_results, fenv$13, rest_k);
- if(Sx_types[32].call(null, indexed))
+ if(Sx_types[40].call(null, indexed))
var
bv = [0, Sx_runtime[12].call(null, remaining$12), 0],
call_args = [5, [0, Sx_runtime[22].call(null, new_results), bv]];
@@ -33305,7 +33374,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var call_args = [5, [0, Sx_runtime[12].call(null, remaining$12), 0]];
var
next_frame =
- Sx_types[32].call(null, indexed)
+ Sx_types[40].call(null, indexed)
? make_map_indexed_frame
(f$2,
Sx_runtime[13].call(null, remaining$12),
@@ -33317,18 +33386,18 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
new_results,
fenv$13);
return continue_with_call
- (f$2, call_args, fenv$13, hq, kont_push(next_frame, rest_k));
+ (f$2, call_args, fenv$13, ht, kont_push(next_frame, rest_k));
}
- var bw = Sx_runtime[1].call(null, cst, [0, ft, hr]);
- if(Sx_types[32].call(null, bw)){
+ var bw = Sx_runtime[1].call(null, cst, [0, ft, hu]);
+ if(Sx_types[40].call(null, bw)){
var
- f$3 = Sx_runtime[23].call(null, frame, hs),
- remaining$13 = Sx_runtime[23].call(null, frame, ht),
- results$1 = Sx_runtime[23].call(null, frame, hu),
- current_item = Sx_runtime[23].call(null, frame, hv),
- fenv$14 = Sx_runtime[23].call(null, frame, hw),
+ f$3 = Sx_runtime[23].call(null, frame, hv),
+ remaining$13 = Sx_runtime[23].call(null, frame, hw),
+ results$1 = Sx_runtime[23].call(null, frame, hx),
+ current_item = Sx_runtime[23].call(null, frame, hy),
+ fenv$14 = Sx_runtime[23].call(null, frame, hz),
new_results$0 =
- Sx_types[32].call(null, value)
+ Sx_types[40].call(null, value)
? Sx_runtime
[1].call
(null,
@@ -33336,7 +33405,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
[0, results$1, [0, [5, [0, current_item, 0]], 0]])
: results$1,
bx = Sx_runtime[32].call(null, remaining$13);
- if(Sx_types[32].call(null, bx))
+ if(Sx_types[40].call(null, bx))
return make_cek_value(new_results$0, fenv$14, rest_k);
var
by = Sx_runtime[12].call(null, remaining$13),
@@ -33353,17 +33422,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(f$3,
[5, [0, Sx_runtime[12].call(null, remaining$13), 0]],
fenv$14,
- hx,
+ hA,
bz);
}
- var bA = Sx_runtime[1].call(null, cst, [0, ft, hy]);
- if(Sx_types[32].call(null, bA)){
+ var bA = Sx_runtime[1].call(null, cst, [0, ft, hB]);
+ if(Sx_types[40].call(null, bA)){
var
- f$4 = Sx_runtime[23].call(null, frame, hz),
- remaining$14 = Sx_runtime[23].call(null, frame, hA),
- fenv$15 = Sx_runtime[23].call(null, frame, hB),
+ f$4 = Sx_runtime[23].call(null, frame, hC),
+ remaining$14 = Sx_runtime[23].call(null, frame, hD),
+ fenv$15 = Sx_runtime[23].call(null, frame, hE),
bB = Sx_runtime[32].call(null, remaining$14);
- if(Sx_types[32].call(null, bB))
+ if(Sx_types[40].call(null, bB))
return make_cek_value(value, fenv$15, rest_k);
var
bC =
@@ -33375,17 +33444,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(f$4,
[5, [0, value, [0, Sx_runtime[12].call(null, remaining$14), 0]]],
fenv$15,
- hC,
+ hF,
bC);
}
- var bD = Sx_runtime[1].call(null, cst, [0, ft, hD]);
- if(Sx_types[32].call(null, bD)){
+ var bD = Sx_runtime[1].call(null, cst, [0, ft, hG]);
+ if(Sx_types[40].call(null, bD)){
var
- f$5 = Sx_runtime[23].call(null, frame, hE),
- remaining$15 = Sx_runtime[23].call(null, frame, hF),
- fenv$16 = Sx_runtime[23].call(null, frame, hG),
+ f$5 = Sx_runtime[23].call(null, frame, hH),
+ remaining$15 = Sx_runtime[23].call(null, frame, hI),
+ fenv$16 = Sx_runtime[23].call(null, frame, hJ),
bE = Sx_runtime[32].call(null, remaining$15);
- if(Sx_types[32].call(null, bE))
+ if(Sx_types[40].call(null, bE))
return make_cek_value(0, fenv$16, rest_k);
var
bF =
@@ -33397,20 +33466,20 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(f$5,
[5, [0, Sx_runtime[12].call(null, remaining$15), 0]],
fenv$16,
- hH,
+ hK,
bF);
}
- var bG = Sx_runtime[1].call(null, cst, [0, ft, hI]);
- if(Sx_types[32].call(null, bG)){
+ var bG = Sx_runtime[1].call(null, cst, [0, ft, hL]);
+ if(Sx_types[40].call(null, bG)){
var
- f$6 = Sx_runtime[23].call(null, frame, hJ),
- remaining$16 = Sx_runtime[23].call(null, frame, hK),
- fenv$17 = Sx_runtime[23].call(null, frame, hL);
- if(Sx_types[32].call(null, value))
+ f$6 = Sx_runtime[23].call(null, frame, hM),
+ remaining$16 = Sx_runtime[23].call(null, frame, hN),
+ fenv$17 = Sx_runtime[23].call(null, frame, hO);
+ if(Sx_types[40].call(null, value))
return make_cek_value(value, fenv$17, rest_k);
var bH = Sx_runtime[32].call(null, remaining$16);
- if(Sx_types[32].call(null, bH))
- return make_cek_value(hM, fenv$17, rest_k);
+ if(Sx_types[40].call(null, bH))
+ return make_cek_value(hP, fenv$17, rest_k);
var
bI =
kont_push
@@ -33421,26 +33490,26 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(f$6,
[5, [0, Sx_runtime[12].call(null, remaining$16), 0]],
fenv$17,
- hN,
+ hQ,
bI);
}
- var bJ = Sx_runtime[1].call(null, cst, [0, ft, hO]);
- if(! Sx_types[32].call(null, bJ)){
+ var bJ = Sx_runtime[1].call(null, cst, [0, ft, hR]);
+ if(! Sx_types[40].call(null, bJ)){
var
- bN = [2, Sx_runtime[4].call(null, [0, hV, [0, ft, 0]])],
+ bN = [2, Sx_runtime[4].call(null, [0, hY, [0, ft, 0]])],
bO = Sx_runtime[2].call(null, bN);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], bO], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], bO], 1);
}
var
- f$7 = Sx_runtime[23].call(null, frame, hP),
- remaining$17 = Sx_runtime[23].call(null, frame, hQ),
- fenv$18 = Sx_runtime[23].call(null, frame, hR),
- bK = [0, 1 - Sx_types[32].call(null, value)];
- if(Sx_types[32].call(null, bK))
- return make_cek_value(hS, fenv$18, rest_k);
+ f$7 = Sx_runtime[23].call(null, frame, hS),
+ remaining$17 = Sx_runtime[23].call(null, frame, hT),
+ fenv$18 = Sx_runtime[23].call(null, frame, hU),
+ bK = [0, 1 - Sx_types[40].call(null, value)];
+ if(Sx_types[40].call(null, bK))
+ return make_cek_value(hV, fenv$18, rest_k);
var bL = Sx_runtime[32].call(null, remaining$17);
- if(Sx_types[32].call(null, bL))
- return make_cek_value(hT, fenv$18, rest_k);
+ if(Sx_types[40].call(null, bL))
+ return make_cek_value(hW, fenv$18, rest_k);
var
bM =
kont_push
@@ -33451,39 +33520,39 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(f$7,
[5, [0, Sx_runtime[12].call(null, remaining$17), 0]],
fenv$18,
- hU,
+ hX,
bM);
}
var
jit_call_hook = [0, 0],
- hW = [2, "captured"],
- hX = [1, 1.],
- hY = [2, cst_children],
- hZ = [2, "Not callable: "];
+ hZ = [2, "captured"],
+ h0 = [1, 1.],
+ h1 = [2, cst_children],
+ h2 = [2, "Not callable: "];
function continue_with_call(f, args, env, raw_args, kont){
var b = Sx_runtime[122].call(null, f);
- if(Sx_types[32].call(null, b)){
+ if(Sx_types[40].call(null, b)){
var
c = Sx_runtime[32].call(null, args),
- arg = Sx_types[32].call(null, c) ? 0 : Sx_runtime[12].call(null, args),
+ arg = Sx_types[40].call(null, c) ? 0 : Sx_runtime[12].call(null, args),
cont_data = Sx_runtime[124].call(null, f),
- captured = Sx_runtime[23].call(null, cont_data, hW),
+ captured = Sx_runtime[23].call(null, cont_data, hZ),
result = cek_run(make_cek_value(arg, env, captured));
return make_cek_value(result, env, kont);
}
var and = Sx_runtime[113].call(null, f);
- if(Sx_types[32].call(null, and)){
+ if(Sx_types[40].call(null, and)){
var
d = Sx_runtime[108].call(null, f),
- and$0 = [0, 1 - Sx_types[32].call(null, d)];
- if(Sx_types[32].call(null, and$0)){
+ and$0 = [0, 1 - Sx_types[40].call(null, d)];
+ if(Sx_types[40].call(null, and$0)){
var
e = Sx_runtime[109].call(null, f),
- and$1 = [0, 1 - Sx_types[32].call(null, e)];
- if(Sx_types[32].call(null, and$1))
+ and$1 = [0, 1 - Sx_types[40].call(null, e)];
+ if(Sx_types[40].call(null, and$1))
var
g = Sx_runtime[110].call(null, f),
- a = [0, 1 - Sx_types[32].call(null, g)];
+ a = [0, 1 - Sx_types[40].call(null, g)];
else
var a = and$1;
}
@@ -33492,48 +33561,48 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
else
var a = and;
- if(Sx_types[32].call(null, a))
+ if(Sx_types[40].call(null, a))
return make_cek_value(Sx_runtime[7].call(null, f, args), env, kont);
var h = Sx_runtime[108].call(null, f);
- if(! Sx_types[32].call(null, h)){
+ if(! Sx_types[40].call(null, h)){
var
or = Sx_runtime[109].call(null, f),
- or$0 = Sx_types[32].call(null, or) ? or : Sx_runtime[110].call(null, f);
- if(! Sx_types[32].call(null, or$0)){
+ or$0 = Sx_types[40].call(null, or) ? or : Sx_runtime[110].call(null, f);
+ if(! Sx_types[40].call(null, or$0)){
var
- p = [0, hZ, [0, Sx_runtime[83].call(null, f), 0]],
+ p = [0, h2, [0, Sx_runtime[83].call(null, f), 0]],
q = [2, Sx_runtime[4].call(null, p)],
r = Sx_runtime[2].call(null, q);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], r], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], r], 1);
}
var
parsed = parse_keyword_args(raw_args, env),
kwargs = Sx_runtime[12].call(null, parsed),
- children = Sx_runtime[15].call(null, parsed, hX),
- j = Sx_types[43].call(null, f),
+ children = Sx_runtime[15].call(null, parsed, h0),
+ j = Sx_types[51].call(null, f),
local$0 = Sx_runtime[104].call(null, j, env),
- k = Sx_types[41].call(null, f),
+ k = Sx_types[49].call(null, f),
m = Sx_runtime[5].call(null, k);
Stdlib_List[18].call
(null,
function(p){
var
or = Sx_runtime[68].call(null, kwargs, p),
- or$0 = Sx_types[32].call(null, or) ? or : 0,
+ or$0 = Sx_types[40].call(null, or) ? or : 0,
a = Sx_runtime[3].call(null, p);
Sx_runtime[100].call(null, local$0, a, or$0);
return 0;
},
m);
- var n = Sx_types[44].call(null, f);
- if(Sx_types[32].call(null, n)){
- var o = Sx_runtime[3].call(null, hY);
+ var n = Sx_types[52].call(null, f);
+ if(Sx_types[40].call(null, n)){
+ var o = Sx_runtime[3].call(null, h1);
Sx_runtime[100].call(null, local$0, o, children);
}
- return make_cek_state(Sx_types[42].call(null, f), local$0, kont);
+ return make_cek_state(Sx_types[50].call(null, f), local$0, kont);
}
var
- i = Sx_types[37].call(null, f),
+ i = Sx_types[45].call(null, f),
local = Sx_runtime[104].call(null, i, env);
bind_lambda_params(f, args, local);
var match = jit_call_hook[1];
@@ -33553,47 +33622,47 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
var match$0 = caml_call2(hook, f, args_list);
if(! match$0)
- return make_cek_state(Sx_types[36].call(null, f), local, kont);
+ return make_cek_state(Sx_types[44].call(null, f), local, kont);
var result$0 = match$0[1];
return make_cek_value(result$0, local, kont);
}
}
- return make_cek_state(Sx_types[36].call(null, f), local, kont);
+ return make_cek_state(Sx_types[44].call(null, f), local, kont);
}
- var h0 = [0, [1, 2.], 0], h1 = [1, 1.], h2 = [0, [1, 2.], 0];
+ var h3 = [0, [1, 2.], 0], h4 = [1, 1.], h5 = [0, [1, 2.], 0];
function sf_case_step_loop(match_val, clauses$1, env, kont){
var clauses = clauses$1;
for(;;){
var
- a = [0, Sx_runtime[22].call(null, clauses), h0],
+ a = [0, Sx_runtime[22].call(null, clauses), h3],
b = Sx_runtime[1].call(null, cst$3, a);
- if(Sx_types[32].call(null, b)) return make_cek_value(0, env, kont);
+ if(Sx_types[40].call(null, b)) return make_cek_value(0, env, kont);
var
test = Sx_runtime[12].call(null, clauses),
- body = Sx_runtime[15].call(null, clauses, h1),
+ body = Sx_runtime[15].call(null, clauses, h4),
c = is_else_clause(test);
- if(Sx_types[32].call(null, c)) return make_cek_state(body, env, kont);
+ if(Sx_types[40].call(null, c)) return make_cek_state(body, env, kont);
var
test_val = trampoline(eval_expr(test, env)),
d = Sx_runtime[1].call(null, cst, [0, match_val, [0, test_val, 0]]);
- if(Sx_types[32].call(null, d)) return make_cek_state(body, env, kont);
- var clauses$0 = Sx_runtime[1].call(null, cst_slice, [0, clauses, h2]);
+ if(Sx_types[40].call(null, d)) return make_cek_state(body, env, kont);
+ var clauses$0 = Sx_runtime[1].call(null, cst_slice, [0, clauses, h5]);
clauses = clauses$0;
}
}
- var h3 = [5, 0];
+ var h6 = [5, 0];
function eval_expr_cek(expr, env){
- return cek_run(make_cek_state(expr, env, h3));
+ return cek_run(make_cek_state(expr, env, h6));
}
function trampoline_cek(val){
var a = Sx_runtime[107].call(null, val);
- if(! Sx_types[32].call(null, a)) return val;
- var b = Sx_types[51].call(null, val);
- return eval_expr_cek(Sx_types[50].call(null, val), b);
+ if(! Sx_types[40].call(null, a)) return val;
+ var b = Sx_types[59].call(null, val);
+ return eval_expr_cek(Sx_types[58].call(null, val), b);
}
- var h4 = [5, 0];
+ var h7 = [5, 0];
function eval_expr(expr, env){
- return cek_run(make_cek_state(expr, env, h4));
+ return cek_run(make_cek_state(expr, env, h7));
}
runtime.caml_update_dummy
(custom_special_forms, [6, Stdlib_Hashtbl[1].call(null, 0, 0)]);
@@ -33621,7 +33690,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
runtime.caml_register_global
- (882,
+ (887,
[0,
trampoline_fn,
trampoline,
@@ -33756,7 +33825,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
(globalThis));
-//# 10378 "../lib/.sx.objs/jsoo/default/sx.cma.js"
+//# 10454 "../lib/.sx.objs/jsoo/default/sx.cma.js"
//# shape: Sx_scope:[N,N,F(1)]
(function
(globalThis){
@@ -34113,7 +34182,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
(globalThis));
-//# 10736 "../lib/.sx.objs/jsoo/default/sx.cma.js"
+//# 10812 "../lib/.sx.objs/jsoo/default/sx.cma.js"
//# shape: Sx_parser:[F(1)*,F(1),F(1),F(1)*,F(1),F(1)*,F(1)*,F(1)*,F(1),F(1),F(1),F(1),F(2),F(1),F(1),F(1)]
(function
(globalThis){
@@ -34229,14 +34298,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
for(;;){
if(at_end(s))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Unterminated string"], 1);
+ ([0, Sx_types[8], "Unterminated string"], 1);
var c = caml_string_get(s[1], s[3]);
advance(s);
if(34 === c) return Stdlib_Buffer[2].call(null, buf);
if(92 === c){
if(at_end(s))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Unterminated string escape"], 1);
+ ([0, Sx_types[8], "Unterminated string escape"], 1);
var esc = caml_string_get(s[1], s[3]);
advance(s);
if(92 <= esc){
@@ -34255,7 +34324,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 25:
if(s[2] < (s[3] + 4 | 0))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Incomplete \\u escape"], 1);
+ ([0, Sx_types[8], "Incomplete \\u escape"], 1);
var hex = Stdlib_String[16].call(null, s[1], s[3], 4);
s[3] = s[3] + 4 | 0;
var
@@ -34376,7 +34445,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
for(;;){
if(at_end(s))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Unterminated raw string"], 1);
+ ([0, Sx_types[8], "Unterminated raw string"], 1);
var c$0 = caml_string_get(s[1], s[3]);
advance(s);
if(124 === c$0) return [2, Stdlib_Buffer[2].call(null, buf)];
@@ -34424,7 +34493,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
q = s[3],
r = caml_string_get(s[1], s[3]),
t = caml_call4(Stdlib_Printf[4].call(null, c), r, line$3, col$2, q);
- throw caml_maybe_attach_backtrace([0, Sx_types[3], t], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[8], t], 1);
}
var line = [0, 1];
Stdlib_String[30].call
@@ -34438,7 +34507,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
m = s[3],
o = line[1],
p = caml_call2(Stdlib_Printf[4].call(null, a), o, m);
- throw caml_maybe_attach_backtrace([0, Sx_types[3], p], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[8], p], 1);
}
function read_list(s, close_char){
advance(s);
@@ -34447,7 +34516,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
skip_whitespace_and_comments(s);
if(at_end(s))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Unterminated list"], 1);
+ ([0, Sx_types[8], "Unterminated list"], 1);
if(caml_string_get(s[1], s[3]) === close_char){
advance(s);
return [5, Stdlib_List[10].call(null, items)];
@@ -34457,21 +34526,21 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
function read_dict(s){
advance(s);
- var d = Sx_types[52].call(null, 0);
+ var d = Sx_types[60].call(null, 0);
for(;;){
skip_whitespace_and_comments(s);
if(at_end(s))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Unterminated dict"], 1);
+ ([0, Sx_types[8], "Unterminated dict"], 1);
if(125 === caml_string_get(s[1], s[3])){advance(s); return [6, d];}
var key = read_value(s);
if(typeof key !== "number" && key[0] - 2 >>> 0 < 3){
var key_str = key[1], v = read_value(s);
- Sx_types[55].call(null, d, key_str, v);
+ Sx_types[63].call(null, d, key_str, v);
continue;
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[3], "Dict key must be keyword, string, or symbol"],
+ ([0, Sx_types[8], "Dict key must be keyword, string, or symbol"],
1);
}
}
@@ -34515,7 +34584,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
(globalThis));
-//# 11139 "../lib/.sx.objs/jsoo/default/sx.cma.js"
+//# 11215 "../lib/.sx.objs/jsoo/default/sx.cma.js"
//# shape: Sx_render:[N,N,N,F(1),F(1),F(1),F(1),F(1),N,F(2),F(2),F(2),F(3),F(3),F(3),F(2),F(3),F(2),F(2),F(3),F(2),F(1)]
(function
(globalThis){
@@ -34782,7 +34851,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(k, v){
if(is_boolean_attr(k)){
- var a = Sx_types[32].call(null, v);
+ var a = Sx_types[40].call(null, v);
return a
? (Stdlib_Buffer
[12].call
@@ -34790,12 +34859,12 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Stdlib_Buffer[16].call(null, buf, k))
: a;
}
- var b = 1 - Sx_types[24].call(null, v);
+ var b = 1 - Sx_types[32].call(null, v);
if(! b) return b;
Stdlib_Buffer[12].call(null, buf, 32);
Stdlib_Buffer[16].call(null, buf, k);
Stdlib_Buffer[16].call(null, buf, '="');
- var c = escape_html(Sx_types[11].call(null, v));
+ var c = escape_html(Sx_types[19].call(null, v));
Stdlib_Buffer[16].call(null, buf, c);
return Stdlib_Buffer[12].call(null, buf, 34);
},
@@ -34908,13 +34977,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
args);
var
children = Stdlib_List[10].call(null, children_exprs[1]),
- local = Sx_types[10].call(null, c[5], env);
+ local = Sx_types[18].call(null, c[5], env);
Stdlib_List[18].call
(null,
function(p){
var match = Stdlib_Hashtbl[7].call(null, kwargs, p);
if(match) var v = match[1], v$0 = v; else var v$0 = 0;
- Sx_types[6].call(null, local, p, v$0);
+ Sx_types[11].call(null, local, p, v$0);
return 0;
},
c[2]);
@@ -34924,14 +34993,14 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Stdlib_List[20].call
(null, function(c){return render_to_html(c, env);}, children),
rendered_children = Stdlib_String[7].call(null, cst, a);
- Sx_types[6].call(null, local, "children", [15, rendered_children]);
+ Sx_types[11].call(null, local, "children", [15, rendered_children]);
}
return render_to_html(c[4], local);
}
return cst;
}
function expand_macro(m, args, env){
- var local = Sx_types[5].call(null, m[4]), params = m[1];
+ var local = Sx_types[10].call(null, m[4]), params = m[1];
a:
{
var ps = params, as = args;
@@ -34940,19 +35009,19 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match = m[2];
if(! match) break a;
var rp = match[1];
- Sx_types[6].call(null, local, rp, [5, as]);
+ Sx_types[11].call(null, local, rp, [5, as]);
break a;
}
var ps_rest = ps[2], p = ps[1];
if(! as) break;
var as_rest = as[2], a = as[1];
- Sx_types[6].call(null, local, p, a);
+ Sx_types[11].call(null, local, p, a);
ps = ps_rest;
as = as_rest;
}
var b = Stdlib_List[10].call(null, ps);
Stdlib_List[18].call
- (null, function(p){Sx_types[6].call(null, local, p, 0); return 0;}, b);
+ (null, function(p){Sx_types[11].call(null, local, p, 0); return 0;}, b);
}
return Sx_ref[127].call(null, m[3], [18, local]);
}
@@ -35025,7 +35094,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
v$2 = Sx_ref[127].call(null, r, [18, env]);
if(typeof v$2 !== "number")
switch(v$2[0]){case 2:case 15: var s$0 = v$2[1]; return s$0;}
- return Sx_types[11].call(null, v$2);
+ return Sx_types[19].call(null, v$2);
}
if(is_html_tag(tag)) return render_html_element(tag, args, env);
var switch$ = runtime.caml_string_compare(tag, cst_filter);
@@ -35047,7 +35116,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
n = Stdlib_List[6].call(null, args),
cond_val = Sx_ref[127].call(null, n, [18, env]);
- if(! Sx_types[32].call(null, cond_val)) return cst;
+ if(! Sx_types[40].call(null, cond_val)) return cst;
var
o = Stdlib_List[7].call(null, args),
p =
@@ -35062,7 +35131,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
q = Stdlib_List[6].call(null, args),
cond_val$0 = Sx_ref[127].call(null, q, [18, env]);
- if(Sx_types[32].call(null, cond_val$0)){
+ if(Sx_types[40].call(null, cond_val$0)){
if(1 >= Stdlib_List[1].call(null, args)) return cst;
var g = Stdlib_List[8].call(null, args, 1);
return counter < 50
@@ -35109,7 +35178,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
try{
- var v = Sx_types[8].call(null, env, tag);
+ var v = Sx_types[15].call(null, env, tag);
a:
{
if(typeof v !== "number")
@@ -35136,7 +35205,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 15:
var s = result$2[1], f = s; break b;
}
- var f = Sx_types[11].call(null, result$2);
+ var f = Sx_types[19].call(null, result$2);
}
var a = f;
break a;
@@ -35166,7 +35235,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] !== Sx_types[2]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
var result$0 = Sx_ref[127].call(null, [5, [0, head, args]], [18, env]);
return counter < 50
? do_render_to_html$0(counter + 1 | 0, result$0, env)
@@ -35243,7 +35312,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
: caml_trampoline_return
(do_render_to_html$0, [0, body, env]);
var v = Sx_ref[127].call(null, test, [18, env]);
- if(Sx_types[32].call(null, v))
+ if(Sx_types[40].call(null, v))
return counter < 50
? do_render_to_html$0(counter + 1 | 0, body, env)
: caml_trampoline_return
@@ -35281,7 +35350,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
? do_render_to_html$0(counter + 1 | 0, body$0, env)
: caml_trampoline_return(do_render_to_html$0, [0, body$0, env]);
var v$0 = Sx_ref[127].call(null, test$0, [18, env]);
- if(Sx_types[32].call(null, v$0))
+ if(Sx_types[40].call(null, v$0))
return counter < 50
? do_render_to_html$0(counter + 1 | 0, body$0, env)
: caml_trampoline_return(do_render_to_html$0, [0, body$0, env]);
@@ -35309,7 +35378,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var
bindings_expr = Stdlib_List[6].call(null, args),
body = Stdlib_List[7].call(null, args),
- local = Sx_types[5].call(null, env),
+ local = Sx_types[10].call(null, env),
match = as_list(bindings_expr);
if(match) var l = match[1], bindings = l; else var bindings = 0;
a:
@@ -35337,7 +35406,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
expr = d[1],
name = c[1],
v = Sx_ref[127].call(null, expr, [18, local]);
- Sx_types[6].call(null, local, name, v);
+ Sx_types[11].call(null, local, name, v);
return 0;
}
}
@@ -35362,7 +35431,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
expr = match$0[1],
name = a[1],
v = Sx_ref[127].call(null, expr, [18, local]);
- Sx_types[6].call(null, local, name, v);
+ Sx_types[11].call(null, local, name, v);
param$0 = rest$0;
}
}
@@ -35426,10 +35495,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function(i, item){
var call_args = indexed ? [0, [1, i], [0, item, 0]] : [0, item, 0];
if(typeof fn_val !== "number" && 7 === fn_val[0]){
- var l = fn_val[1], local = Sx_types[5].call(null, l[3]);
+ var l = fn_val[1], local = Sx_types[10].call(null, l[3]);
Stdlib_List[28].call
(null,
- function(p, a){Sx_types[6].call(null, local, p, a); return 0;},
+ function(p, a){Sx_types[11].call(null, local, p, a); return 0;},
l[1],
call_args);
return do_render_to_html(l[2], local);
@@ -35484,10 +35553,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(null,
function(item){
if(typeof fn_val !== "number" && 7 === fn_val[0]){
- var l = fn_val[1], local = Sx_types[5].call(null, l[3]);
+ var l = fn_val[1], local = Sx_types[10].call(null, l[3]);
Stdlib_List[28].call
(null,
- function(p, a){Sx_types[6].call(null, local, p, a); return 0;},
+ function(p, a){Sx_types[11].call(null, local, p, a); return 0;},
l[1],
[0, item, 0]);
return do_render_to_html(l[2], local);
@@ -35502,7 +35571,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function setup_render_env(env){
render_to_html_ref[1] = do_render_to_html;
function bind(name, fn){
- Sx_types[6].call(null, env, name, [13, name, fn]);
+ Sx_types[11].call(null, env, name, [13, name, fn]);
return 0;
}
bind
@@ -36124,7 +36193,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var match = Stdlib_Hashtbl[7].call(null, handle_table, id);
if(match){var v = match[1]; return v;}
var b = caml_call1(Stdlib_Printf[4].call(null, a), id);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], b], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], b], 1);
}
var
alloc_host_handle =
@@ -36135,7 +36204,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
();
Sx_scope[3].call(null, 0);
- var global_env = Sx_types[4].call(null, 0);
+ var global_env = Sx_types[9].call(null, 0);
function call_sx_fn(fn, args){
return Sx_ref[127].call(null, [5, [0, fn, args]], [18, global_env]);
}
@@ -36208,7 +36277,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] !== Sx_types[2])
+ if(exn[1] !== Sx_types[7])
throw caml_maybe_attach_backtrace(exn, 0);
var
msg = exn[2],
@@ -36221,10 +36290,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return tag_fn
(inner,
handle,
- caml_jsstring_of_string(Sx_types[23].call(null, v)));
+ caml_jsstring_of_string(Sx_types[31].call(null, v)));
default:
var handle$0 = alloc_handle(v);
- return {_type: caml_jsstring_of_string(Sx_types[23].call(null, v)),
+ return {_type: caml_jsstring_of_string(Sx_types[31].call(null, v)),
__sx_handle: handle$0};
}
var
@@ -36341,7 +36410,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] !== Sx_types[3]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[8]) throw caml_maybe_attach_backtrace(exn, 0);
var msg = exn[2];
return caml_jsstring_of_string
(Stdlib[28].call(null, cst_Parse_error, msg));
@@ -36365,11 +36434,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] === Sx_types[2]){
+ if(exn[1] === Sx_types[7]){
var msg = exn[2];
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
}
- if(exn[1] !== Sx_types[3]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[8]) throw caml_maybe_attach_backtrace(exn, 0);
var msg$0 = exn[2];
return caml_jsstring_of_string
(Stdlib[28].call(null, cst_Parse_error, msg$0));
@@ -36386,7 +36455,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] !== Sx_types[2]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
var msg = exn[2];
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
}
@@ -36411,11 +36480,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] === Sx_types[2]){
+ if(exn[1] === Sx_types[7]){
var msg = exn[2];
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
}
- if(exn[1] !== Sx_types[3]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[8]) throw caml_maybe_attach_backtrace(exn, 0);
var msg$0 = exn[2];
return caml_jsstring_of_string
(Stdlib[28].call(null, cst_Parse_error, msg$0));
@@ -36433,7 +36502,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] !== Sx_types[2]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
var msg = exn[2];
sx_render_mode[1] = prev;
return caml_jsstring_of_string(Stdlib[28].call(null, cst_Error, msg));
@@ -36441,15 +36510,15 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
function api_stringify(v_js){
var a = js_to_value(v_js);
- return caml_jsstring_of_string(Sx_types[59].call(null, a));
+ return caml_jsstring_of_string(Sx_types[67].call(null, a));
}
function api_type_of(v_js){
var a = js_to_value(v_js);
- return caml_jsstring_of_string(Sx_types[23].call(null, a));
+ return caml_jsstring_of_string(Sx_types[31].call(null, a));
}
function api_inspect(v_js){
var a = js_to_value(v_js);
- return caml_jsstring_of_string(Sx_types[59].call(null, a));
+ return caml_jsstring_of_string(Sx_types[67].call(null, a));
}
function api_engine(param){return "ocaml-vm-wasm";}
function api_register_native(name_js, callback_js){
@@ -36460,7 +36529,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
js_args = Stdlib_Array[11].call(null, a);
return js_to_value(callback_js(caml_js_from_array(js_args)));
}
- Sx_types[6].call(null, global_env, name, [13, name, native_fn]);
+ Sx_types[11].call(null, global_env, name, [13, name, native_fn]);
return Js_of_ocaml_Js[1];
}
function api_call_fn(fn_js, args_js){
@@ -36476,7 +36545,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0), cst_sx_callFn = "[sx] callFn: ";
- if(exn[1] === Sx_types[2]){
+ if(exn[1] === Sx_types[7]){
var
msg = exn[2],
a = caml_jsstring_of_string(Stdlib[28].call(null, cst_sx_callFn, msg));
@@ -36495,7 +36564,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var h = fn_js.__sx_handle;
if(h == Js_of_ocaml_Js[3]) return ! ! 0;
var a = get_handle(h | 0);
- return ! ! Sx_types[31].call(null, a);
+ return ! ! Sx_types[39].call(null, a);
}
return ! ! 0;
}
@@ -36510,7 +36579,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return -1.;
}
function bind(name, fn){
- Sx_types[6].call(null, global_env, name, [13, name, fn]);
+ Sx_types[11].call(null, global_env, name, [13, name, fn]);
}
var cst_cek_eval = "cek-eval";
bind
@@ -36532,7 +36601,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "cek-eval: expected 1-2 args"], 1);
+ ([0, Sx_types[7], "cek-eval: expected 1-2 args"], 1);
});
bind
("eval-expr-cek",
@@ -36546,7 +36615,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "eval-expr-cek: expected 1-2 args"], 1);
+ ([0, Sx_types[7], "eval-expr-cek: expected 1-2 args"], 1);
});
var cst_cek_call = "cek-call";
bind
@@ -36554,7 +36623,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function(args){
if(! args)
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "cek-call: expected function and args"], 1);
+ ([0, Sx_types[7], "cek-call: expected function and args"], 1);
var f = args[1], match = args[2];
if(! match)
return Sx_ref[127].call(null, [5, [0, f, 0]], [18, global_env]);
@@ -36587,17 +36656,17 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "sx-parse: expected string"], 1);
+ ([0, Sx_types[7], "sx-parse: expected string"], 1);
});
bind
("sx-serialize",
function(args){
if(args && ! args[2]){
var v = args[1];
- return [2, Sx_types[59].call(null, v)];
+ return [2, Sx_types[67].call(null, v)];
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "sx-serialize: expected 1 arg"], 1);
+ ([0, Sx_types[7], "sx-serialize: expected 1 arg"], 1);
});
function deep_equal(a, b){
a:
@@ -36689,7 +36758,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, deep_equal(a, b)];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], "equal?: 2 args"], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], "equal?: 2 args"], 1);
});
var b = [0, 1], c = [0, 1];
bind
@@ -36698,29 +36767,29 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(args){
var match = args[2], cond = args[1];
if(! match){
- if(1 - Sx_types[32].call(null, cond))
+ if(1 - Sx_types[40].call(null, cond))
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "Assertion failed"], 1);
+ ([0, Sx_types[7], "Assertion failed"], 1);
return c;
}
if(! match[2]){
var msg = match[1];
- if(! (1 - Sx_types[32].call(null, cond))) return b;
+ if(! (1 - Sx_types[40].call(null, cond))) return b;
var
- a = Sx_types[11].call(null, msg),
+ a = Sx_types[19].call(null, msg),
d = Stdlib[28].call(null, "Assertion: ", a);
- throw caml_maybe_attach_backtrace([0, Sx_types[2], d], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], d], 1);
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "assert: 1-2 args"], 1);
+ ([0, Sx_types[7], "assert: 1-2 args"], 1);
});
- var d = [0, 0], e = [0, 1];
+ var cst_error = "error", cst_ok = "ok", d = [0, 0], e = [0, 1];
bind
("try-call",
function(args){
if(args && ! args[2]){
- var thunk = args[1], cst_ok = "ok";
+ var thunk = args[1];
try{
Sx_ref[127].call(null, [5, [0, thunk, 0]], [18, global_env]);
var d$1 = Stdlib_Hashtbl[1].call(null, 0, 2);
@@ -36729,15 +36798,15 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
catch(exn$0){
var exn = caml_wrap_exception(exn$0);
- if(exn[1] !== Sx_types[2]) throw caml_maybe_attach_backtrace(exn, 0);
+ if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
var msg = exn[2], d$0 = Stdlib_Hashtbl[1].call(null, 0, 2);
Stdlib_Hashtbl[11].call(null, d$0, cst_ok, d);
- Stdlib_Hashtbl[11].call(null, d$0, "error", [2, msg]);
+ Stdlib_Hashtbl[11].call(null, d$0, cst_error, [2, msg]);
return [6, d$0];
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "try-call: 1 arg"], 1);
+ ([0, Sx_types[7], "try-call: 1 arg"], 1);
});
bind
("append!",
@@ -36764,10 +36833,10 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "append!: list and value"], 1);
+ ([0, Sx_types[7], "append!: list and value"], 1);
});
var uw = Sx_runtime[97];
- bind("make-env", function(param){return [18, Sx_types[4].call(null, 0)];});
+ bind("make-env", function(param){return [18, Sx_types[9].call(null, 0)];});
bind("global-env", function(param){return [18, global_env];});
var cst_env_has = "env-has?";
bind
@@ -36783,13 +36852,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 4:
if(! a[2]){
var k = b[1], c = uw(e);
- return [0, Sx_types[7].call(null, c, k)];
+ return [0, Sx_types[13].call(null, c, k)];
}
break;
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_env_has], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_has], 1);
});
var cst_env_get = "env-get";
bind
@@ -36805,13 +36874,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 4:
if(! a[2]){
var k = b[1], c = uw(e);
- return Sx_types[8].call(null, c, k);
+ return Sx_types[15].call(null, c, k);
}
break;
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_env_get], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_get], 1);
});
var cst_env_bind = "env-bind!";
bind
@@ -36828,13 +36897,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var c = a[2];
if(c && ! c[2]){
var v = c[1], k = b[1], d = uw(e);
- return Sx_types[6].call(null, d, k, v);
+ return Sx_types[11].call(null, d, k, v);
}
break;
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_env_bind], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_bind], 1);
});
var cst_env_set = "env-set!";
bind
@@ -36851,13 +36920,13 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var c = a[2];
if(c && ! c[2]){
var v = c[1], k = b[1], d = uw(e);
- return Sx_types[9].call(null, d, k, v);
+ return Sx_types[17].call(null, d, k, v);
}
break;
}
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_env_set], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_set], 1);
});
var cst_env_extend = "env-extend";
bind
@@ -36865,9 +36934,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function(args){
if(args && ! args[2]){
var e = args[1], a = uw(e);
- return [18, Sx_types[5].call(null, a)];
+ return [18, Sx_types[10].call(null, a)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_env_extend], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_extend], 1);
});
var cst_env_merge = "env-merge";
bind
@@ -36880,7 +36949,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return Sx_runtime[104].call(null, a, b);
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_env_merge], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_env_merge], 1);
});
var cst_make_symbol = "make-symbol";
bind
@@ -36894,9 +36963,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var s = v[1];
return [3, s];
}
- if(! args[2]) return [3, Sx_types[11].call(null, v)];
+ if(! args[2]) return [3, Sx_types[19].call(null, v)];
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_make_symbol], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_make_symbol], 1);
});
var cst_make_keyword = "make-keyword";
bind
@@ -36906,7 +36975,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [4, s];}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_make_keyword], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_make_keyword], 1);
});
var cst_keyword_name = "keyword-name";
bind
@@ -36916,7 +36985,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 4 === a[0] && ! args[2]){var k = a[1]; return [2, k];}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_keyword_name], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_keyword_name], 1);
});
var cst_symbol_name = "symbol-name";
bind
@@ -36926,7 +36995,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 3 === a[0] && ! args[2]){var s = a[1]; return [2, s];}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_symbol_name], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_symbol_name], 1);
});
var cst = "", f = [2, cst];
bind
@@ -37020,9 +37089,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return g;
}];
- Sx_types[6].call
+ Sx_types[11].call
(null, global_env, "component-has-children", has_children_impl);
- Sx_types[6].call
+ Sx_types[11].call
(null, global_env, cst_component_has_children, has_children_impl);
var h = [2, "auto"], i = [2, "client"];
bind
@@ -37057,61 +37126,61 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], cst_make_cek_state], 1);
+ ([0, Sx_types[7], cst_make_cek_state], 1);
});
var cst_cek_step = "cek-step";
bind
(cst_cek_step,
function(args){
if(args && ! args[2]){var s = args[1]; return Sx_ref[85].call(null, s);}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_cek_step], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_step], 1);
});
var cst_cek_phase = "cek-phase";
bind
(cst_cek_phase,
function(args){
if(args && ! args[2]){var s = args[1]; return Sx_ref[12].call(null, s);}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_cek_phase], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_phase], 1);
});
var cst_cek_value = "cek-value";
bind
(cst_cek_value,
function(args){
if(args && ! args[2]){var s = args[1]; return Sx_ref[13].call(null, s);}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_cek_value], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_value], 1);
});
var cst_cek_terminal = "cek-terminal?";
bind
(cst_cek_terminal,
function(args){
if(args && ! args[2]){var s = args[1]; return Sx_ref[8].call(null, s);}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_cek_terminal], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_terminal], 1);
});
var cst_cek_kont = "cek-kont";
bind
(cst_cek_kont,
function(args){
if(args && ! args[2]){var s = args[1]; return Sx_ref[11].call(null, s);}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_cek_kont], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_kont], 1);
});
var cst_frame_type = "frame-type";
bind
(cst_frame_type,
function(args){
if(args && ! args[2]){var f = args[1]; return Sx_ref[43].call(null, f);}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_frame_type], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_frame_type], 1);
});
var cst_strict = "*strict*";
- Sx_types[6].call(null, global_env, cst_strict, [0, 0]);
+ Sx_types[11].call(null, global_env, cst_strict, [0, 0]);
var cst_prim_param_types = "*prim-param-types*";
- Sx_types[6].call(null, global_env, cst_prim_param_types, 0);
+ Sx_types[11].call(null, global_env, cst_prim_param_types, 0);
bind
("set-strict!",
function(args){
if(args && ! args[2]){
var v = args[1];
Sx_ref[3][1] = v;
- Sx_types[9].call(null, global_env, cst_strict, v);
+ Sx_types[17].call(null, global_env, cst_strict, v);
return 0;
}
return 0;
@@ -37122,7 +37191,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(args && ! args[2]){
var v = args[1];
Sx_ref[4][1] = v;
- Sx_types[9].call(null, global_env, cst_prim_param_types, v);
+ Sx_types[17].call(null, global_env, cst_prim_param_types, v);
return 0;
}
return 0;
@@ -37144,7 +37213,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
(cst_apply,
function(args){
if(! args)
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_apply], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_apply], 1);
var
rest = args[2],
f = args[1],
@@ -37175,7 +37244,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return Sx_runtime[130].call(null, n, v);
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_provide_push], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_provide_push], 1);
});
var cst_provide_pop = "provide-pop!";
bind
@@ -37185,7 +37254,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var n = args[1];
return Sx_runtime[131].call(null, n);
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_provide_pop], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_provide_pop], 1);
});
bind
("<>",
@@ -37202,7 +37271,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 2:
case 15:
var s = a[1]; return s;
- default: return Sx_types[11].call(null, a);
+ default: return Sx_types[19].call(null, a);
}
},
args);
@@ -37218,7 +37287,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function(a){
if(typeof a !== "number")
switch(a[0]){case 2:case 15: var s = a[1]; return s;}
- return Sx_types[11].call(null, a);
+ return Sx_types[19].call(null, a);
},
args);
return [15, Stdlib_String[7].call(null, cst, a)];
@@ -37251,9 +37320,40 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
boolean_attrs =
[5,
Stdlib_List[20].call(null, function(s){return [2, s];}, Sx_render[3])];
- Sx_types[6].call(null, global_env, "HTML_TAGS", html_tags);
- Sx_types[6].call(null, global_env, "VOID_ELEMENTS", void_elements);
- Sx_types[6].call(null, global_env, "BOOLEAN_ATTRS", boolean_attrs);
+ Sx_types[11].call(null, global_env, "HTML_TAGS", html_tags);
+ Sx_types[11].call(null, global_env, "VOID_ELEMENTS", void_elements);
+ Sx_types[11].call(null, global_env, "BOOLEAN_ATTRS", boolean_attrs);
+ var l = [3, cst_error], m = [3, cst_ok];
+ bind
+ ("cek-try",
+ function(args){
+ if(args){
+ var match = args[2], thunk = args[1];
+ if(! match)
+ try{
+ var r = Sx_ref[108].call(null, thunk, 0);
+ return [5, [0, m, [0, r, 0]]];
+ }
+ catch(exn){
+ var exn$0 = caml_wrap_exception(exn);
+ if(exn$0[1] !== Sx_types[7])
+ throw caml_maybe_attach_backtrace(exn$0, 0);
+ var msg$0 = exn$0[2];
+ return [5, [0, l, [0, [2, msg$0], 0]]];
+ }
+ if(! match[2]){
+ var handler = match[1];
+ try{var a = Sx_ref[108].call(null, thunk, 0); return a;}
+ catch(exn$0){
+ var exn = caml_wrap_exception(exn$0);
+ if(exn[1] !== Sx_types[7]) throw caml_maybe_attach_backtrace(exn, 0);
+ var msg = exn[2];
+ return Sx_ref[108].call(null, handler, [5, [0, [2, msg], 0]]);
+ }
+ }
+ }
+ return 0;
+ });
bind
("eval-expr",
function(args){
@@ -37307,7 +37407,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], "call-lambda: expected (fn args env?)"], 1);
+ ([0, Sx_types[7], "call-lambda: expected (fn args env?)"], 1);
});
bind
(cst_cek_call,
@@ -37319,7 +37419,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return Sx_ref[108].call(null, f, a);
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_cek_call], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_cek_call], 1);
});
bind
(cst_cek_eval,
@@ -37348,22 +37448,22 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
return 0;
});
- var l = [0, 0], m = [0, 1];
+ var n = [0, 0], o = [0, 1];
bind
("thunk?",
function(args){
if(args){
var a = args[1];
- if(typeof a !== "number" && 11 === a[0] && ! args[2]) return m;
+ if(typeof a !== "number" && 11 === a[0] && ! args[2]) return o;
}
- return l;
+ return n;
});
bind
("thunk-expr",
function(args){
if(args && ! args[2]){
var v = args[1];
- return Sx_types[50].call(null, v);
+ return Sx_types[58].call(null, v);
}
return 0;
});
@@ -37372,51 +37472,51 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
function(args){
if(args && ! args[2]){
var v = args[1];
- return Sx_types[51].call(null, v);
+ return Sx_types[59].call(null, v);
}
return 0;
});
- var n = [0, 0], o = [0, 1];
+ var p = [0, 0], q = [0, 1];
bind
("lambda?",
function(args){
if(args){
var a = args[1];
- if(typeof a !== "number" && 7 === a[0] && ! args[2]) return o;
- }
- return n;
- });
- var p = [0, 0], q = [0, 1];
- bind
- ("macro?",
- function(args){
- if(args){
- var a = args[1];
- if(typeof a !== "number" && 10 === a[0] && ! args[2]) return q;
+ if(typeof a !== "number" && 7 === a[0] && ! args[2]) return q;
}
return p;
});
var r = [0, 0], s = [0, 1];
bind
- ("island?",
+ ("macro?",
function(args){
if(args){
var a = args[1];
- if(typeof a !== "number" && 9 === a[0] && ! args[2]) return s;
+ if(typeof a !== "number" && 10 === a[0] && ! args[2]) return s;
}
return r;
});
var t = [0, 0], u = [0, 1];
bind
- ("component?",
+ ("island?",
function(args){
if(args){
var a = args[1];
- if(typeof a !== "number" && a[0] - 8 >>> 0 < 2 && ! args[2]) return u;
+ if(typeof a !== "number" && 9 === a[0] && ! args[2]) return u;
}
return t;
});
var v = [0, 0], w = [0, 1];
+ bind
+ ("component?",
+ function(args){
+ if(args){
+ var a = args[1];
+ if(typeof a !== "number" && a[0] - 8 >>> 0 < 2 && ! args[2]) return w;
+ }
+ return v;
+ });
+ var x = [0, 0], y = [0, 1];
bind
("callable?",
function(args){
@@ -37428,32 +37528,32 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
case 8:
case 9:
case 13:
- if(! args[2]) return w; break;
+ if(! args[2]) return y; break;
}
}
- return v;
- });
- var x = [0, 0], y = [0, 1];
- bind
- ("spread?",
- function(args){
- if(args){
- var a = args[1];
- if(typeof a !== "number" && 16 === a[0] && ! args[2]) return y;
- }
return x;
});
var z = [0, 0], A = [0, 1];
+ bind
+ ("spread?",
+ function(args){
+ if(args){
+ var a = args[1];
+ if(typeof a !== "number" && 16 === a[0] && ! args[2]) return A;
+ }
+ return z;
+ });
+ var B = [0, 0], C = [0, 1];
bind
("continuation?",
function(args){
if(args){
var a = args[1];
- if(typeof a !== "number" && 12 === a[0] && ! args[2]) return A;
+ if(typeof a !== "number" && 12 === a[0] && ! args[2]) return C;
}
- return z;
+ return B;
});
- var B = [5, 0];
+ var D = [5, 0];
bind
("lambda-params",
function(args){
@@ -37465,7 +37565,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
Stdlib_List[20].call(null, function(s){return [2, s];}, l[1])];
}
}
- return B;
+ return D;
});
bind
("lambda-body",
@@ -37532,11 +37632,11 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var s = v[1];
return [15, s];
}
- if(! args[2]) return [15, Sx_types[11].call(null, v)];
+ if(! args[2]) return [15, Sx_types[19].call(null, v)];
}
return 0;
});
- var C = [2, cst];
+ var E = [2, cst];
bind
("raw-html-content",
function(args){
@@ -37550,9 +37650,9 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(! args[2]){var s$0 = a[1]; return [2, s$0];} break;
}
}
- return C;
+ return E;
});
- var D = [0, 1];
+ var F = [0, 1];
bind
("empty-dict?",
function(args){
@@ -37563,7 +37663,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, 0 === Stdlib_Hashtbl[15].call(null, d) ? 1 : 0];
}
}
- return D;
+ return F;
});
var cst_identical = "identical?";
bind
@@ -37576,7 +37676,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
return [0, a === b ? 1 : 0];
}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_identical], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_identical], 1);
});
bind
("for-each-indexed",
@@ -37618,7 +37718,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
var a = args[1];
if(typeof a !== "number" && 2 === a[0] && ! args[2]){var s = a[1]; return [17, s];}
}
- throw caml_maybe_attach_backtrace([0, Sx_types[2], cst_make_sx_expr], 1);
+ throw caml_maybe_attach_backtrace([0, Sx_types[7], cst_make_sx_expr], 1);
});
var cst_sx_expr_source = "sx-expr-source";
bind
@@ -37635,7 +37735,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
}
throw caml_maybe_attach_backtrace
- ([0, Sx_types[2], cst_sx_expr_source], 1);
+ ([0, Sx_types[7], cst_sx_expr_source], 1);
});
bind
("parse-int",
@@ -37685,8 +37785,8 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
if(args){var a = args[2]; if(a && ! a[2]){var d = a[1]; return d;}}
return 0;
});
- var E = [2, "GET"];
- bind("request-method", function(param){return E;});
+ var G = [2, "GET"];
+ bind("request-method", function(param){return G;});
bind("ctx", function(param){return 0;});
bind("helper", function(param){return 0;});
function wrap(fn){
@@ -37714,7 +37814,7 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
sx.isCallable = caml_js_wrap_callback(api_is_callable);
sx.fnArity = caml_js_wrap_callback(api_fn_arity);
Js_of_ocaml_Js[52][1].SxKernel = sx;
- runtime.caml_register_global(265, [0], "Dune__exe__Sx_browser");
+ runtime.caml_register_global(268, [0], "Dune__exe__Sx_browser");
return;
}
(globalThis));
@@ -37737,4 +37837,4 @@ a6=102,b5=114,b6="Stdlib__Type",eD="Stdlib__Buffer",dc="Js_of_ocaml__Dom_svg",dd
}
(globalThis));
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3hfYnJvd3Nlci5iYy5qcyIsInNlY3Rpb25zIjpbeyJvZmZzZXQiOnsibGluZSI6MywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3hfYnJvd3Nlci5lb2Jqcy9qc29vL3N4X2Jyb3dzZXIuYmMucnVudGltZS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvYnVpbHRpbi8rbWxCeXRlcy5qcyIsIi9idWlsdGluLyttYXJzaGFsLmpzIiwiL2J1aWx0aW4vK2lvLmpzIiwiL2J1aWx0aW4vK3N5cy5qcyIsIi9idWlsdGluLytiYWNrdHJhY2UuanMiLCIvYnVpbHRpbi8rc3RkbGliLmpzIiwiL2J1aWx0aW4vK2pzbGliLmpzIiwiL2J1aWx0aW4vK2ZhaWwuanMiLCIvYnVpbHRpbi8rdW5peC5qcyIsIi9idWlsdGluLytmcy5qcyIsIi9idWlsdGluLytmc19mYWtlLmpzIiwiL2J1aWx0aW4vK2ludDY0LmpzIiwiL2J1aWx0aW4vK3N5bmMuanMiLCIvYnVpbHRpbi8rbmF0LmpzIiwiL2J1aWx0aW4vK2ZzX25vZGUuanMiLCIvYnVpbHRpbi8rYmlnYXJyYXkuanMiLCIvYnVpbHRpbi8rYmlnc3RyaW5nLmpzIiwiL2J1aWx0aW4vK2JsYWtlMi5qcyIsIi9idWlsdGluLyttZDUuanMiLCIvYnVpbHRpbi8raWVlZV83NTQuanMiLCIvYnVpbHRpbi8rb2JqLmpzIiwiL2J1aWx0aW4vK2VmZmVjdC5qcyIsIi9idWlsdGluLythcnJheS5qcyIsIi9idWlsdGluLytkb21haW4uanMiLCIvYnVpbHRpbi8raW50cy5qcyIsIi9idWlsdGluLytoYXNoLmpzIiwiL2J1aWx0aW4vK2NvbXBhcmUuanMiLCIvYnVpbHRpbi8rcnVudGltZV9ldmVudHMuanMiLCIvYnVpbHRpbi8renN0ZC5qcyIsIi9idWlsdGluLyt3ZWFrLmpzIiwiL2J1aWx0aW4vK2djLmpzIiwiL2J1aWx0aW4vK2Zvcm1hdC5qcyIsIi9idWlsdGluLytncmFwaGljcy5qcyIsIi9idWlsdGluLytqc2xpYl9qc19vZl9vY2FtbC5qcyIsIi9idWlsdGluLytsZXhpbmcuanMiLCIvYnVpbHRpbi8rcHJuZy5qcyIsIi9idWlsdGluLytwYXJzaW5nLmpzIiwiL2J1aWx0aW4vK3N0ci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIEFuIE9DYW1sIHN0cmluZyBpcyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBmaWVsZHM6XG4vLyAtIHRhZyAndCdcbi8vIC0gbGVuZ3RoICdsJ1xuLy8gLSBjb250ZW50cyAnYydcbi8vXG4vLyBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyIGEgSmF2YVNjcmlwdCBhcnJheSBvclxuLy8gYSBKYXZhU2NyaXB0IHN0cmluZy4gVGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyBjYW4gYmUgbGVzcyB0aGFuIHRoZVxuLy8gbGVuZ3RoIG9mIHRoZSBPQ2FtbCBzdHJpbmcuIEluIHRoaXMgY2FzZSwgcmVtYWluaW5nIGJ5dGVzIGFyZVxuLy8gYXNzdW1lZCB0byBiZSB6ZXJvZXMuIEFycmF5cyBhcmUgbXV0YWJsZSBidXQgY29uc3VtZXMgbW9yZSBtZW1vcnlcbi8vIHRoYW4gc3RyaW5ncy4gQSBjb21tb24gcGF0dGVybiBpcyB0byBzdGFydCBmcm9tIGFuIGVtcHR5IHN0cmluZyBhbmRcbi8vIHByb2dyZXNzaXZlbHkgZmlsbCBpdCBmcm9tIHRoZSBzdGFydC4gUGFydGlhbCBzdHJpbmdzIG1ha2VzIGl0XG4vLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcyBlZmZpY2llbnRseS5cbi8vXG4vLyBXaGVuIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gVVRGLTE2LCB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlXG4vLyBzdHJpbmcgaXMgY29tcG9zZWQgb25seSBvZiBBU0NJSSBjaGFyYWN0ZXJzIChpbiB3aGljaCBjYXNlLCBub1xuLy8gY29udmVyc2lvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQpIG9yIG5vdC5cbi8vXG4vLyBUaGUgc3RyaW5nIHRhZyBjYW4gdGh1cyB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy8gICBmdWxsIHN0cmluZyAgICAgQllURSB8IFVOS05PV046ICAgICAgMFxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IEFTQ0lJOiAgICAgICAgOVxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IE5PVF9BU0NJSTogICAgOFxuLy8gICBzdHJpbmcgcHJlZml4ICAgUEFSVElBTDogICAgICAgICAgICAgMlxuLy8gICBhcnJheSAgICAgICAgICAgQVJSQVk6ICAgICAgICAgICAgICAgNFxuLy9cbi8vIE9uZSBjYW4gdXNlIGJpdCBtYXNraW5nIHRvIGRpc2NyaW1pbmF0ZSB0aGVzZSBkaWZmZXJlbnQgY2FzZXM6XG4vLyAgIGtub3duX2VuY29kaW5nKHgpID0geCY4XG4vLyAgIGlzX2FzY2lpKHgpID0gICAgICAgeCYxXG4vLyAgIGtpbmQoeCkgPSAgICAgICAgICAgeCY2XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9zdHJfcmVwZWF0KG4sIHMpIHtcbiAgcmV0dXJuIHMucmVwZWF0KG4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXNcbi8vV2Vha2RlZlxuLy8gUHJlIEVDTUFTY3JpcHQgNSwgW2FwcGx5XSB3b3VsZCBub3Qgc3VwcG9ydCBhcnJheS1saWtlIG9iamVjdC5cbi8vIEluIHN1Y2ggc2V0dXAsIFR5cGVkX2FycmF5IHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIHBvbHlmaWxsLCBhbmQgW2YuYXBwbHldIHdvdWxkXG4vLyBmYWlsIGhlcmUuIE1hcmsgdGhlIHByaW1pdGl2ZSBhcyBXZWFrZGVmLCBzbyB0aGF0IHBlb3BsZSBjYW4gb3ZlcnJpZGUgaXQgZWFzaWx5LlxuZnVuY3Rpb24gY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsIGksIGxlbikge1xuICB2YXIgZiA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG4gIGlmIChpID09PSAwICYmIGxlbiA8PSA0MDk2ICYmIGxlbiA9PT0gYS5sZW5ndGgpIHJldHVybiBmLmFwcGx5KG51bGwsIGEpO1xuICB2YXIgcyA9IFwiXCI7XG4gIGZvciAoOyAwIDwgbGVuOyBpICs9IDEwMjQsIGxlbiAtPSAxMDI0KVxuICAgIHMgKz0gZi5hcHBseShudWxsLCBhLnNsaWNlKGksIGkgKyBNYXRoLm1pbihsZW4sIDEwMjQpKSk7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG4vL1dlYWtkZWZcbi8vIFByZSBFQ01BU2NyaXB0IDUsIFthcHBseV0gd291bGQgbm90IHN1cHBvcnQgYXJyYXktbGlrZSBvYmplY3QuXG4vLyBJbiBzdWNoIHNldHVwLCBUeXBlZF9hcnJheSB3b3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBwb2x5ZmlsbCwgYW5kIFtmLmFwcGx5XSB3b3VsZFxuLy8gZmFpbCBoZXJlLiBNYXJrIHRoZSBwcmltaXRpdmUgYXMgV2Vha2RlZiwgc28gdGhhdCBwZW9wbGUgY2FuIG92ZXJyaWRlIGl0IGVhc2lseS5cbmZ1bmN0aW9uIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoYSwgaSwgbGVuKSB7XG4gIHZhciBmID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgaWYgKGkgPT09IDAgJiYgbGVuIDw9IDQwOTYgJiYgbGVuID09PSBhLmxlbmd0aCkgcmV0dXJuIGYuYXBwbHkobnVsbCwgYSk7XG4gIHZhciBzID0gXCJcIjtcbiAgZm9yICg7IDAgPCBsZW47IGkgKz0gMTAyNCwgbGVuIC09IDEwMjQpXG4gICAgcyArPSBmLmFwcGx5KG51bGwsIGEuc3ViYXJyYXkoaSwgaSArIE1hdGgubWluKGxlbiwgMTAyNCkpKTtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29faXNfYXNjaWlcbmZ1bmN0aW9uIGpzb29faXNfYXNjaWkocykge1xuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGdldHMgYmV0dGVyIGF0IGFyb3VuZCB0aGlzIHBvaW50IGZvciBhbGwgYnJvd3NlcnNcbiAgaWYgKHMubGVuZ3RoIDwgMjQpIHtcbiAgICAvLyBTcGlkZXJtb25rZXkgZ2V0cyBtdWNoIHNsb3dlciB3aGVuIHMubGVuZ3RoID49IDI0IChvbiA2NCBiaXQgYXJjaHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBpZiAocy5jaGFyQ29kZUF0KGkpID4gMTI3KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleDogZXhwZWN0ZWRcbiAgZWxzZSByZXR1cm4gIS9bXlxceDAwLVxceDdmXS8udGVzdChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0IG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpKSB7XG4gIHN3aXRjaCAocy50ICYgNikge1xuICAgIGNhc2UgMCAvKiBCWVRFUyAqLzpcbiAgICAgIHJldHVybiBzLmMuY2hhckNvZGVBdChpKTtcbiAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgIGlmIChpID49IHMuYy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHMuYy5jaGFyQ29kZUF0KGkpO1xuICAgIGNhc2UgNCAvKiBBUlJBWSAqLzpcbiAgICAgIHJldHVybiBzLmNbaV07XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpLCBjKSB7XG4gIC8vIFRoZSBPQ2FtbCBjb21waWxlciB1c2VzIENoYXIudW5zYWZlX2NociBvbiBpbnRlZ2VycyBsYXJnZXIgdGhhbiAyNTUhXG4gIGMgJj0gMHhmZjtcbiAgaWYgKHMudCAhPT0gNCAvKiBBUlJBWSAqLykge1xuICAgIGlmIChpID09PSBzLmMubGVuZ3RoKSB7XG4gICAgICBzLmMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgIGlmIChpICsgMSA9PT0gcy5sKSBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LTk9XTiovXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICB9XG4gIHMuY1tpXSA9IGM7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldChzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSkgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQxNihzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDEpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSksXG4gICAgYjIgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKTtcbiAgcmV0dXJuIChiMiA8PCA4KSB8IGIxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0MTYocywgaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAxKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpKSxcbiAgICBiMiA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMSk7XG4gIHJldHVybiAoYjIgPDwgOCkgfCBiMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDMyKHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gMykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSxcbiAgICBiMiA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSArIDEpLFxuICAgIGIzID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpICsgMiksXG4gICAgYjQgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAzKTtcbiAgcmV0dXJuIChiNCA8PCAyNCkgfCAoYjMgPDwgMTYpIHwgKGIyIDw8IDgpIHwgYjE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQzMihzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpLFxuICAgIGIyID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkgKyAxKSxcbiAgICBiMyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMiksXG4gICAgYjQgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocywgaSArIDMpO1xuICByZXR1cm4gKGI0IDw8IDI0KSB8IChiMyA8PCAxNikgfCAoYjIgPDwgOCkgfCBiMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDY0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gNykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkoOCk7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgYVs3IC0gal0gPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyBqKTtcbiAgfVxuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0LCBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldDY0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBhWzcgLSBqXSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgaik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQoX3MsIF9pLCBfYykge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfc2V0KHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MTYocywgaSwgaTE2KSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDEpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIyID0gMHhmZiAmIChpMTYgPj4gOCksXG4gICAgYjEgPSAweGZmICYgaTE2O1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGkgKyAxLCBiMik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MzIocywgaSwgaTMyKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGI0ID0gMHhmZiAmIChpMzIgPj4gMjQpLFxuICAgIGIzID0gMHhmZiAmIChpMzIgPj4gMTYpLFxuICAgIGIyID0gMHhmZiAmIChpMzIgPj4gOCksXG4gICAgYjEgPSAweGZmICYgaTMyO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGkgKyAxLCBiMik7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpICsgMiwgYjMpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDMsIGI0KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQ2NChzLCBpLCBpNjQpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoaTY0KTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDcgLSBqLCBhW2pdKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczoganNvb190ZXh0X2VuY29kZXJcbnZhciBqc29vX3RleHRfZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuXG4vL1Byb3ZpZGVzOiBqc29vX3RleHRfZGVjb2RlclxudmFyIGpzb29fdGV4dF9kZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGpzb29fdGV4dF9lbmNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHtcbiAgICByZXR1cm4gbmV3IE1sQnl0ZXMoOSwgcywgcy5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHZhciBhID0ganNvb190ZXh0X2VuY29kZXIuZW5jb2RlKHMpO1xuICAgIHJldHVybiBuZXcgTWxCeXRlcyg0LCBhLCBhLmxlbmd0aCk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcywganNvb19pc19hc2NpaVxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczoganNvb190ZXh0X2RlY29kZXJcbmNsYXNzIE1sQnl0ZXMge1xuICBjb25zdHJ1Y3Rvcih0YWcsIGNvbnRlbnRzLCBsZW5ndGgpIHtcbiAgICB0aGlzLnQgPSB0YWc7XG4gICAgdGhpcy5jID0gY29udGVudHM7XG4gICAgdGhpcy5sID0gbGVuZ3RoO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgc3dpdGNoICh0aGlzLnQpIHtcbiAgICAgIGNhc2UgOTogLypCWVRFUyB8IEFTQ0lJKi9cbiAgICAgIGNhc2UgOCAvKkJZVEVTIHwgTk9UX0FTQ0lJKi86XG4gICAgICAgIHJldHVybiB0aGlzLmM7XG4gICAgICBjYXNlIDQ6IC8qIEFSUkFZICovXG4gICAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHRoaXMpO1xuICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgMCAvKkJZVEVTIHwgVU5LTk9XTiovOlxuICAgICAgICBpZiAoanNvb19pc19hc2NpaSh0aGlzLmMpKSB0aGlzLnQgPSA5OyAvKkJZVEVTIHwgQVNDSUkqL1xuICAgICAgICBlbHNlIHRoaXMudCA9IDg7IC8qQllURVMgfCBOT1RfQVNDSUkqL1xuICAgICAgICByZXR1cm4gdGhpcy5jO1xuICAgIH1cbiAgfVxuXG4gIHRvVXRmMTYoKSB7XG4gICAgaWYgKHRoaXMudCA9PT0gOSkgcmV0dXJuIHRoaXMuYztcbiAgICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXModGhpcyk7XG4gICAgcmV0dXJuIGpzb29fdGV4dF9kZWNvZGVyLmRlY29kZShhKTtcbiAgfVxuXG4gIHNsaWNlKCkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy50ID09PSA0ID8gdGhpcy5jLnNsaWNlKCkgOiB0aGlzLmM7XG4gICAgcmV0dXJuIG5ldyBNbEJ5dGVzKHRoaXMudCwgY29udGVudCwgdGhpcy5sKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocykge1xuICAvKiBBc3N1bWVzIG5vdCBCWVRFUyAqL1xuICBpZiAocy50ID09PSAyIC8qIFBBUlRJQUwgKi8pIHMuYyArPSBjYW1sX3N0cl9yZXBlYXQocy5sIC0gcy5jLmxlbmd0aCwgXCJcXDBcIik7XG4gIGVsc2Ugcy5jID0gY2FtbF9zdWJfdWludDhfYXJyYXlfdG9fanNieXRlcyhzLmMsIDAsIHMuYy5sZW5ndGgpO1xuICBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LTk9XTiovXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpIHtcbiAgLyogQXNzdW1lcyBub3QgQVJSQVkgKi9cbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShzLmwpO1xuICB2YXIgYiA9IHMuYyxcbiAgICBsID0gYi5sZW5ndGgsXG4gICAgaSA9IDA7XG4gIGZvciAoOyBpIDwgbDsgaSsrKSBhW2ldID0gYi5jaGFyQ29kZUF0KGkpO1xuICBmb3IgKGwgPSBzLmw7IGkgPCBsOyBpKyspIGFbaV0gPSAwO1xuICBzLmMgPSBhO1xuICBzLnQgPSA0OyAvKiBBUlJBWSAqL1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMocykge1xuICBpZiAocy50ICE9PSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkocyk7XG4gIHJldHVybiBzLmM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocykge1xuICB2YXIgbCA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKTtcbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShsKTtcbiAgdmFyIGkgPSAwO1xuICBmb3IgKDsgaSA8IGw7IGkrKykgYVtpXSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9jcmVhdGVfc3RyaW5nKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyaW5nLmNyZWF0ZVwiKTtcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKGxlbiA/IDIgOiA5LCBcIlwiLCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9zdHJpbmcoX2xlbikge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHJpbmcuY3JlYXRlXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcyxjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2J5dGVzKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQnl0ZXMuY3JlYXRlXCIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMobGVuID8gMiA6IDksIFwiXCIsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2FycmF5KGEpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsIDAsIGEubGVuZ3RoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGEpIHtcbiAgcmV0dXJuIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoYSwgMCwgYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkoYSkge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91aW50OF9hcnJheShhLnNsaWNlKCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX2FycmF5KGEpIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgYSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICB9XG4gIHJldHVybiBuZXcgTWxCeXRlcyg0LCBhLCBhLmxlbmd0aCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXlcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYSkge1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoNCwgYSwgYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2NvbXBhcmUgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19jb21wYXJlKHMxLCBzMikge1xuICBzMS50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgczIudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiBzMS5jIDwgczIuYyA/IC0xIDogczEuYyA+IHMyLmMgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19lcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMikge1xuICBpZiAoczEgPT09IHMyKSByZXR1cm4gMTtcbiAgczEudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIHMyLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gczEuYyA9PT0gczIuYyA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19lcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbm90ZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiAxIC0gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG5mdW5jdGlvbiBjYW1sX2J5dGVzX25vdGVxdWFsKHMxLCBzMikge1xuICByZXR1cm4gMSAtIGNhbWxfYnl0ZXNfZXF1YWwoczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19sZXNzZXF1YWwgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIHMxLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICBzMi50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIHMxLmMgPD0gczIuYyA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHMxLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICBzMi50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIHMxLmMgPCBzMi5jID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dyZWF0ZXJlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc2VxdWFsXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19sZXNzZXF1YWwoczIsIHMxKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc3RoYW5cbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzdGhhblxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVydGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maWxsX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuLy9BbGlhczogY2FtbF9maWxsX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9maWxsX2J5dGVzKHMsIGksIGwsIGMpIHtcbiAgaWYgKGwgPiAwKSB7XG4gICAgaWYgKGkgPT09IDAgJiYgKGwgPj0gcy5sIHx8IChzLnQgPT09IDIgLyogUEFSVElBTCAqLyAmJiBsID49IHMuYy5sZW5ndGgpKSkge1xuICAgICAgaWYgKGMgPT09IDApIHtcbiAgICAgICAgcy5jID0gXCJcIjtcbiAgICAgICAgcy50ID0gMjsgLyogUEFSVElBTCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcy5jID0gY2FtbF9zdHJfcmVwZWF0KGwsIFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgICBzLnQgPSBsID09PSBzLmwgPyAwIC8qIEJZVEVTIHwgVU5LTk9XTiAqLyA6IDI7IC8qIFBBUlRJQUwgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHMudCAhPT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICAgICAgZm9yIChsICs9IGk7IGkgPCBsOyBpKyspIHMuY1tpXSA9IGM7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsaXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9ibGl0X2J5dGVzKHMxLCBpMSwgczIsIGkyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDA7XG4gIGlmIChcbiAgICBpMiA9PT0gMCAmJlxuICAgIChsZW4gPj0gczIubCB8fCAoczIudCA9PT0gMiAvKiBQQVJUSUFMICovICYmIGxlbiA+PSBzMi5jLmxlbmd0aCkpXG4gICkge1xuICAgIHMyLmMgPVxuICAgICAgczEudCA9PT0gNCAvKiBBUlJBWSAqL1xuICAgICAgICA/IGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoczEuYywgaTEsIGxlbilcbiAgICAgICAgOiBpMSA9PT0gMCAmJiBzMS5jLmxlbmd0aCA9PT0gbGVuXG4gICAgICAgICAgPyBzMS5jXG4gICAgICAgICAgOiBzMS5jLnNsaWNlKGkxLCBpMSArIGxlbik7XG4gICAgczIudCA9IHMyLmMubGVuZ3RoID09PSBzMi5sID8gMCAvKiBCWVRFUyB8IFVOS05PV04gKi8gOiAyOyAvKiBQQVJUSUFMICovXG4gIH0gZWxzZSBpZiAoczIudCA9PT0gMiAvKiBQQVJUSUFMICovICYmIGkyID09PSBzMi5jLmxlbmd0aCkge1xuICAgIHMyLmMgKz1cbiAgICAgIHMxLnQgPT09IDQgLyogQVJSQVkgKi9cbiAgICAgICAgPyBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzKHMxLmMsIGkxLCBsZW4pXG4gICAgICAgIDogaTEgPT09IDAgJiYgczEuYy5sZW5ndGggPT09IGxlblxuICAgICAgICAgID8gczEuY1xuICAgICAgICAgIDogczEuYy5zbGljZShpMSwgaTEgKyBsZW4pO1xuICAgIHMyLnQgPSBzMi5jLmxlbmd0aCA9PT0gczIubCA/IDAgLyogQllURVMgfCBVTktOT1dOICovIDogMjsgLyogUEFSVElBTCAqL1xuICB9IGVsc2Uge1xuICAgIGlmIChzMi50ICE9PSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkoczIpO1xuICAgIHZhciBjMSA9IHMxLmMsXG4gICAgICBjMiA9IHMyLmM7XG4gICAgaWYgKHMxLnQgPT09IDQgLyogQVJSQVkgKi8pIHtcbiAgICAgIGlmIChpMiA8PSBpMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBjMltpMiArIGldID0gYzFbaTEgKyBpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgYzJbaTIgKyBpXSA9IGMxW2kxICsgaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsID0gTWF0aC5taW4obGVuLCBjMS5sZW5ndGggLSBpMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgYzJbaTIgKyBpXSA9IGMxLmNoYXJDb2RlQXQoaTEgKyBpKTtcbiAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIGMyW2kyICsgaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ibGl0X3N0cmluZyhhLCBiLCBjLCBkLCBlKSB7XG4gIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX3N0cmluZyhhKSwgYiwgYywgZCwgZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19sZW5ndGgocykge1xuICByZXR1cm4gcy5sO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb25jYXQgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29uY2F0KGEsIGIpIHtcbiAgcmV0dXJuIGEgKyBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb25jYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMsIE1sQnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbmNhdChzMSwgczIpIHtcbiAgczEudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIHMyLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoMCwgczEuYyArIHMyLmMsIHMxLmwgKyBzMi5sKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpIHtcbiAgcmV0dXJuIHMuY2hhckNvZGVBdChpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBzLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfY29tcGFyZSBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19jb21wYXJlKHMxLCBzMikge1xuICByZXR1cm4gczEgPCBzMiA/IC0xIDogczEgPiBzMiA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19lcXVhbChzMSwgczIpIHtcbiAgaWYgKHMxID09PSBzMikgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gczEgPD0gczIgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc3RoYW4gY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHJldHVybiBzMSA8IHMyID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgcy50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzLmMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh4KSB7XG4gIHJldHVybiB4O1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3RleHRfZGVjb2Rlcl9idWZmXG52YXIganNvb190ZXh0X2RlY29kZXJfYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcblxuLy9Qcm92aWRlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWlcbi8vUmVxdWlyZXM6IGpzb29fdGV4dF9kZWNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX3RleHRfZGVjb2Rlcl9idWZmXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHJldHVybiBzO1xuICB2YXIgYSA9XG4gICAgcy5sZW5ndGggPD0ganNvb190ZXh0X2RlY29kZXJfYnVmZi5sZW5ndGhcbiAgICAgID8gbmV3IFVpbnQ4QXJyYXkoanNvb190ZXh0X2RlY29kZXJfYnVmZiwgMCwgcy5sZW5ndGgpXG4gICAgICA6IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgYVtpXSA9IHMuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4ganNvb190ZXh0X2RlY29kZXIuZGVjb2RlKGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGpzb29fdGV4dF9lbmNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpO1xuICB2YXIgYSA9IGpzb29fdGV4dF9lbmNvZGVyLmVuY29kZShzKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhzKSB7XG4gIHJldHVybiBuZXcgTWxCeXRlcygwLCBzLCBzLmxlbmd0aCk7XG59XG5cbi8vIFRoZSBzZWN0aW9uIGJlbG93IHNob3VsZCBiZSB1c2VkIHdoZW4gdXNlLWpzLXN0cmluZz1mYWxzZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQocywgaSwgYykge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGggY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykge1xuICByZXR1cm4gY2FtbF9tbF9ieXRlc19sZW5ndGgocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfY29tcGFyZVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29tcGFyZShzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfY29tcGFyZShzMSwgczIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19lcXVhbFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzZXF1YWxcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMxLCBzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl9qc2J5dGVzKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcy50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gcy5jO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIHMudG9VdGYxNigpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZ1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyhzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9pc19tbF9ieXRlcyhzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgTWxCeXRlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JldHVybnMgYSAoZnVsbCkgc3RyaW5nIG9mIGJ5dGVzIG9yIGFuIGFycmF5XG5mdW5jdGlvbiBjYW1sX21sX2J5dGVzX2NvbnRlbnQocykge1xuICBzd2l0Y2ggKHMudCAmIDYpIHtcbiAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gICAgICByZXR1cm4gcy5jO1xuICAgIGRlZmF1bHQ6IC8qIEJZVEVTIG9yIEFSUkFZICovXG4gICAgICByZXR1cm4gcy5jO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaXNfbWxfc3RyaW5nKHMpIHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleDogZXhwZWN0ZWRcbiAgcmV0dXJuIHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmICEvW15cXHgwMC1cXHhmZl0vLnRlc3Qocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2lzX21sX2J5dGVzKHMpO1xufVxuXG4vLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBkZXByZWNhdGVkXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vRGVwcmVjYXRlZDogVXNlIFtjYW1sX3N0cmluZ19vZl9qc2J5dGVzXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9zdHJpbmcgbXV0YWJsZSAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RvX2pzX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL0RlcHJlY2F0ZWQ6IFVzZSBbY2FtbF9qc3N0cmluZ19vZl9zdHJpbmddIGluc3RlYWRcbmZ1bmN0aW9uIGNhbWxfdG9fanNfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vRGVwcmVjYXRlZDogVXNlIFtjYW1sX3N0cmluZ19vZl9qc3N0cmluZ10gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9qc190b19zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2FycmF5X29mX3N0cmluZyh4KSB7XG4gIHJldHVybiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNdIGluc3RlYWRcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfb2ZfYnl0ZXMoeCkge1xuICByZXR1cm4gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uZXdfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0RlcHJlY2F0ZWQ6IFVzZSBbY2FtbF9zdHJpbmdfb2ZfanNieXRlc10gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9uZXdfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2NvbnN0YW50c1xudmFyIGNhbWxfbWFyc2hhbF9jb25zdGFudHMgPSB7XG4gIFBSRUZJWF9TTUFMTF9CTE9DSzogMHg4MCxcbiAgUFJFRklYX1NNQUxMX0lOVDogMHg0MCxcbiAgUFJFRklYX1NNQUxMX1NUUklORzogMHgyMCxcbiAgQ09ERV9JTlQ4OiAweDAwLFxuICBDT0RFX0lOVDE2OiAweDAxLFxuICBDT0RFX0lOVDMyOiAweDAyLFxuICBDT0RFX0lOVDY0OiAweDAzLFxuICBDT0RFX1NIQVJFRDg6IDB4MDQsXG4gIENPREVfU0hBUkVEMTY6IDB4MDUsXG4gIENPREVfU0hBUkVEMzI6IDB4MDYsXG4gIENPREVfQkxPQ0szMjogMHgwOCxcbiAgQ09ERV9CTE9DSzY0OiAweDEzLFxuICBDT0RFX1NUUklORzg6IDB4MDksXG4gIENPREVfU1RSSU5HMzI6IDB4MGEsXG4gIENPREVfRE9VQkxFX0JJRzogMHgwYixcbiAgQ09ERV9ET1VCTEVfTElUVExFOiAweDBjLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfQklHOiAweDBkLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfTElUVExFOiAweDBlLFxuICBDT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzogMHgwZixcbiAgQ09ERV9ET1VCTEVfQVJSQVkzMl9MSVRUTEU6IDB4MDcsXG4gIENPREVfQ09ERVBPSU5URVI6IDB4MTAsXG4gIENPREVfSU5GSVhQT0lOVEVSOiAweDExLFxuICBDT0RFX0NVU1RPTTogMHgxMixcbiAgQ09ERV9DVVNUT01fTEVOOiAweDE4LFxuICBDT0RFX0NVU1RPTV9GSVhFRDogMHgxOSxcbn07XG5cbi8vUHJvdmlkZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG5jbGFzcyBVSW50OEFycmF5UmVhZGVyIHtcbiAgY29uc3RydWN0b3IocywgaSkge1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5pID0gaTtcbiAgfVxuXG4gIHJlYWQ4dSgpIHtcbiAgICByZXR1cm4gdGhpcy5zW3RoaXMuaSsrXTtcbiAgfVxuXG4gIHJlYWQ4cygpIHtcbiAgICByZXR1cm4gKHRoaXMuc1t0aGlzLmkrK10gPDwgMjQpID4+IDI0O1xuICB9XG5cbiAgcmVhZDE2dSgpIHtcbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzW2ldIDw8IDgpIHwgc1tpICsgMV07XG4gIH1cblxuICByZWFkMTZzKCkge1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKChzW2ldIDw8IDI0KSA+PiAxNikgfCBzW2kgKyAxXTtcbiAgfVxuXG4gIHJlYWQzMnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKHNbaV0gPDwgMjQpIHwgKHNbaSArIDFdIDw8IDE2KSB8IChzW2kgKyAyXSA8PCA4KSB8IHNbaSArIDNdKSA+Pj4gMDtcbiAgfVxuXG4gIHJlYWQzMnMoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoc1tpXSA8PCAyNCkgfCAoc1tpICsgMV0gPDwgMTYpIHwgKHNbaSArIDJdIDw8IDgpIHwgc1tpICsgM107XG4gIH1cblxuICByZWFkc3RyKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KHRoaXMucy5zdWJhcnJheShpLCBpICsgbGVuKSk7XG4gIH1cblxuICByZWFkdWludDhhcnJheShsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiB0aGlzLnMuc3ViYXJyYXkoaSwgaSArIGxlbik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogSnNTdHJpbmdSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmNsYXNzIEpzU3RyaW5nUmVhZGVyIHtcbiAgY29uc3RydWN0b3IocywgaSkge1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5pID0gaTtcbiAgfVxuXG4gIHJlYWQ4dSgpIHtcbiAgICByZXR1cm4gdGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspO1xuICB9XG5cbiAgcmVhZDhzKCkge1xuICAgIHJldHVybiAodGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspIDw8IDI0KSA+PiAyNDtcbiAgfVxuXG4gIHJlYWQxNnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfVxuXG4gIHJlYWQxNnMoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgPj4gMTYpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfVxuXG4gIHJlYWQzMnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoXG4gICAgICAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfFxuICAgICAgICAocy5jaGFyQ29kZUF0KGkgKyAxKSA8PCAxNikgfFxuICAgICAgICAocy5jaGFyQ29kZUF0KGkgKyAyKSA8PCA4KSB8XG4gICAgICAgIHMuY2hhckNvZGVBdChpICsgMykpID4+PlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICByZWFkMzJzKCkge1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKFxuICAgICAgKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDgpIHxcbiAgICAgIHMuY2hhckNvZGVBdChpICsgMylcbiAgICApO1xuICB9XG5cbiAgcmVhZHN0cihsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHRoaXMucy5zbGljZShpLCBpICsgbGVuKSk7XG4gIH1cblxuICByZWFkdWludDhhcnJheShsZW4pIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgdmFyIHMgPSB0aGlzLnM7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgYltqXSA9IHMuY2hhckNvZGVBdChpICsgaik7XG4gICAgfVxuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX2J5dGVzKGEpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKGEpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IEpzU3RyaW5nUmVhZGVyLCBVSW50OEFycmF5UmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyhzLCBvZnMpIHtcbiAgdmFyIGMgPSBjYW1sX21sX2J5dGVzX2NvbnRlbnQocyk7XG4gIHZhciBvZnMgPSB0eXBlb2Ygb2ZzID09PSBcIm51bWJlclwiID8gb2ZzIDogb2ZzWzBdO1xuICB2YXIgcmVhZGVyID1cbiAgICBjIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgICAgPyBuZXcgVUludDhBcnJheVJlYWRlcihjLCBvZnMpXG4gICAgICA6IG5ldyBKc1N0cmluZ1JlYWRlcihjLCBvZnMpO1xuICByZXR1cm4gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF91bm1hcnNoYWwocmVhZGVyLCBzaXplKSB7XG4gIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgc2l6ZVswXSA9IDg7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKHQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X21hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbWFyc2hhbCh3cml0ZXIsIHYsIHNpemVzKSB7XG4gIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyh2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHdyaXRlci53cml0ZSg4LCBiW2ldKTtcbiAgc2l6ZXNbMF0gPSA4O1xuICBzaXplc1sxXSA9IDg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfdW5tYXJzaGFsXG5mdW5jdGlvbiBjYW1sX2ludDMyX3VubWFyc2hhbChyZWFkZXIsIHNpemUpIHtcbiAgc2l6ZVswXSA9IDQ7XG4gIHJldHVybiByZWFkZXIucmVhZDMycygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbChyZWFkZXIsIHNpemUpIHtcbiAgc3dpdGNoIChyZWFkZXIucmVhZDh1KCkpIHtcbiAgICBjYXNlIDE6XG4gICAgICBzaXplWzBdID0gNDtcbiAgICAgIHJldHVybiByZWFkZXIucmVhZDMycygpO1xuICAgIGNhc2UgMjpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogbmF0aXZlIGludGVnZXIgdmFsdWUgdG9vIGxhcmdlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBuYXRpdmUgaW50ZWdlclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdW5tYXJzaGFsLCBjYW1sX2ludDY0X21hcnNoYWwsIGNhbWxfaW50NjRfY29tcGFyZSwgY2FtbF9pbnQ2NF9oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX3VubWFyc2hhbCwgY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NlcmlhbGl6ZSwgY2FtbF9iYV9kZXNlcmlhbGl6ZSwgY2FtbF9iYV9jb21wYXJlLCBjYW1sX2JhX2hhc2hcbnZhciBjYW1sX2N1c3RvbV9vcHMgPSB7XG4gIF9qOiB7XG4gICAgZGVzZXJpYWxpemU6IGNhbWxfaW50NjRfdW5tYXJzaGFsLFxuICAgIHNlcmlhbGl6ZTogY2FtbF9pbnQ2NF9tYXJzaGFsLFxuICAgIGZpeGVkX2xlbmd0aDogOCxcbiAgICBjb21wYXJlOiBjYW1sX2ludDY0X2NvbXBhcmUsXG4gICAgaGFzaDogY2FtbF9pbnQ2NF9oYXNoLFxuICB9LFxuICBfaToge1xuICAgIGRlc2VyaWFsaXplOiBjYW1sX2ludDMyX3VubWFyc2hhbCxcbiAgICBmaXhlZF9sZW5ndGg6IDQsXG4gIH0sXG4gIF9uOiB7XG4gICAgZGVzZXJpYWxpemU6IGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbCxcbiAgICBmaXhlZF9sZW5ndGg6IDQsXG4gIH0sXG4gIF9iaWdhcnJheToge1xuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAocmVhZGVyLCBzeikge1xuICAgICAgcmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgXCJfYmlnYXJyYXlcIik7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgIGNvbXBhcmU6IGNhbWxfYmFfY29tcGFyZSxcbiAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gIH0sXG4gIF9iaWdhcnIwMjoge1xuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAocmVhZGVyLCBzeikge1xuICAgICAgcmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgXCJfYmlnYXJyMDJcIik7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgIGNvbXBhcmU6IGNhbWxfYmFfY29tcGFyZSxcbiAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gIH0sXG59O1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfZmxvYXRfb2ZfYnl0ZXMsIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogVUludDhBcnJheVJlYWRlclxuLy9SZXF1aXJlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1JlcXVpcmVzOiBjYW1sX3NldF9vb19pZFxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIpIHtcbiAgZnVuY3Rpb24gcmVhZHZscShvdmVyZmxvdykge1xuICAgIHZhciBjID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N2Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT09IDApIHtcbiAgICAgIGMgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgbjcgPSBuIDw8IDc7XG4gICAgICBpZiAobiAhPT0gbjcgPj4gNykgb3ZlcmZsb3dbMF0gPSB0cnVlO1xuICAgICAgbiA9IG43IHwgKGMgJiAweDdmKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgdmFyIG9sZF9wb3MgPSByZWFkZXIuaTtcbiAgdmFyIG1hZ2ljID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgc3dpdGNoIChtYWdpYykge1xuICAgIGNhc2UgMHg4NDk1YTZiZSAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICAgIHZhciBjb21wcmVzc2VkID0gMDtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICB2YXIgdW5jb21wcmVzc2VkX2RhdGFfbGVuID0gZGF0YV9sZW47XG4gICAgICB2YXIgbnVtX29iamVjdHMgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgdmFyIF9zaXplXzMyID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgIHZhciBfc2l6ZV82NCA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmQgLyogSW50ZXh0X21hZ2ljX251bWJlcl9jb21wcmVzc2VkICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSByZWFkZXIucmVhZDh1KCkgJiAweDNmO1xuICAgICAgdmFyIGNvbXByZXNzZWQgPSAxO1xuICAgICAgdmFyIG92ZXJmbG93ID0gW2ZhbHNlXTtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgdmFyIHVuY29tcHJlc3NlZF9kYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgdmFyIG51bV9vYmplY3RzID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgICB2YXIgX3NpemVfMzIgPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICAgIHZhciBfc2l6ZV82NCA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgaWYgKG92ZXJmbG93WzBdKSB7XG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXG4gICAgICAgICAgXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmYgLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi86XG4gICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICBcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXI6IG9iamVjdCB0b28gbGFyZ2UgdG8gYmUgcmVhZCBiYWNrIG9uIGEgMzItYml0IHBsYXRmb3JtXCIsXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBiYWQgb2JqZWN0XCIpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKGhlYWRlcl9sZW4gIT09IHJlYWRlci5pIC0gb2xkX3Bvcykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBpbnZhbGlkIGhlYWRlclwiKTtcbiAgfVxuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG9iamVjdHMgPSBbXTtcbiAgdmFyIGludGVybl9vYmpfdGFibGUgPSBudW1fb2JqZWN0cyA+IDAgPyBbXSA6IG51bGw7XG4gIHZhciBvYmpfY291bnRlciA9IDA7XG4gIGZ1bmN0aW9uIGludGVybl9yZWMocmVhZGVyKSB7XG4gICAgdmFyIGNvZGUgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgaWYgKGNvZGUgPj0gMHg0MCAvKmNzdC5QUkVGSVhfU01BTExfSU5UKi8pIHtcbiAgICAgIGlmIChjb2RlID49IDB4ODAgLypjc3QuUFJFRklYX1NNQUxMX0JMT0NLKi8pIHtcbiAgICAgICAgdmFyIHRhZyA9IGNvZGUgJiAweGY7XG4gICAgICAgIHZhciBzaXplID0gKGNvZGUgPj4gNCkgJiAweDc7XG4gICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgIGlmIChzaXplID09PSAwKSByZXR1cm4gdjtcbiAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICBpZiAodGFnID09PSAyNDgpIG9iamVjdHMucHVzaCh2KTtcbiAgICAgICAgc3RhY2sucHVzaCh2LCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2UgcmV0dXJuIGNvZGUgJiAweDNmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29kZSA+PSAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcgKi8pIHtcbiAgICAgICAgdmFyIGxlbiA9IGNvZGUgJiAweDFmO1xuICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyKGxlbik7XG4gICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICBjYXNlIDB4MDA6IC8vY3N0LkNPREVfSU5UODpcbiAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZDhzKCk7XG4gICAgICAgICAgY2FzZSAweDAxOiAvL2NzdC5DT0RFX0lOVDE2OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMTZzKCk7XG4gICAgICAgICAgY2FzZSAweDAyOiAvL2NzdC5DT0RFX0lOVDMyOlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgY2FzZSAweDAzOiAvL2NzdC5DT0RFX0lOVDY0OlxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbnRlZ2VyIHRvbyBsYXJnZVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgwNDogLy9jc3QuQ09ERV9TSEFSRUQ4OlxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIGlmIChjb21wcmVzc2VkID09PSAwKSBvZmZzZXQgPSBvYmpfY291bnRlciAtIG9mZnNldDtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29mZnNldF07XG4gICAgICAgICAgY2FzZSAweDA1OiAvL2NzdC5DT0RFX1NIQVJFRDE2OlxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICAgICAgICBpZiAoY29tcHJlc3NlZCA9PT0gMCkgb2Zmc2V0ID0gb2JqX2NvdW50ZXIgLSBvZmZzZXQ7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvZmZzZXRdO1xuICAgICAgICAgIGNhc2UgMHgwNjogLy9jc3QuQ09ERV9TSEFSRUQzMjpcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgaWYgKGNvbXByZXNzZWQgPT09IDApIG9mZnNldCA9IG9ial9jb3VudGVyIC0gb2Zmc2V0O1xuICAgICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2Zmc2V0XTtcbiAgICAgICAgICBjYXNlIDB4MDg6IC8vY3N0LkNPREVfQkxPQ0szMjpcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHRhZyA9IGhlYWRlciAmIDB4ZmY7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IGhlYWRlciA+PiAxMDtcbiAgICAgICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkgcmV0dXJuIHY7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICBpZiAodGFnID09PSAyNDgpIG9iamVjdHMucHVzaCh2KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MTM6IC8vY3N0LkNPREVfQkxPQ0s2NDpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogZGF0YSBibG9jayB0b28gbGFyZ2VcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDk6IC8vY3N0LkNPREVfU1RSSU5HODpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyKGxlbik7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGE6IC8vY3N0LkNPREVfU1RSSU5HMzI6XG4gICAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIobGVuKTtcbiAgICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgIGNhc2UgMHgwYzogLy9jc3QuQ09ERV9ET1VCTEVfTElUVExFOlxuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgdFs3IC0gaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGI6IC8vY3N0LkNPREVfRE9VQkxFX0JJRzpcbiAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHRbaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGU6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZOF9MSVRUTEU6XG4gICAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDBkOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWThfQklHOlxuICAgICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICAgICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDA3OiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0xJVFRMRTpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDBmOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MTA6IC8vY3N0LkNPREVfQ09ERVBPSU5URVI6XG4gICAgICAgICAgY2FzZSAweDExOiAvL2NzdC5DT0RFX0lORklYUE9JTlRFUjpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogY29kZSBwb2ludGVyXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDEyOiAvL2NzdC5DT0RFX0NVU1RPTTpcbiAgICAgICAgICBjYXNlIDB4MTg6IC8vY3N0LkNPREVfQ1VTVE9NX0xFTjpcbiAgICAgICAgICBjYXNlIDB4MTk6IC8vY3N0LkNPREVfQ1VTVE9NX0ZJWEVEOlxuICAgICAgICAgICAgdmFyIGMsXG4gICAgICAgICAgICAgIHMgPSBcIlwiO1xuICAgICAgICAgICAgd2hpbGUgKChjID0gcmVhZGVyLnJlYWQ4dSgpKSAhPT0gMCkgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgdmFyIG9wcyA9IGNhbWxfY3VzdG9tX29wc1tzXTtcbiAgICAgICAgICAgIHZhciBleHBlY3RlZF9zaXplO1xuICAgICAgICAgICAgaWYgKCFvcHMpXG4gICAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdW5rbm93biBjdXN0b20gYmxvY2sgaWRlbnRpZmllclwiKTtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICBjYXNlIDB4MTI6IC8vIGNzdC5DT0RFX0NVU1RPTSAoZGVwcmVjYXRlZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAweDE5OiAvLyBjc3QuQ09ERV9DVVNUT01fRklYRURcbiAgICAgICAgICAgICAgICBpZiAoIW9wcy5maXhlZF9sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICAgICAgICAgICAgICBcImlucHV0X3ZhbHVlOiBleHBlY3RlZCBhIGZpeGVkLXNpemUgY3VzdG9tIGJsb2NrXCIsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpemUgPSBvcHMuZml4ZWRfbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDB4MTg6IC8vIGNzdC5DT0RFX0NVU1RPTV9MRU5cbiAgICAgICAgICAgICAgICBleHBlY3RlZF9zaXplID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIHNpemU2NFxuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWQzMnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzaXplID0gWzBdO1xuICAgICAgICAgICAgdmFyIHYgPSBvcHMuZGVzZXJpYWxpemUocmVhZGVyLCBzaXplKTtcbiAgICAgICAgICAgIGlmIChleHBlY3RlZF9zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX3NpemUgIT09IHNpemVbMF0pXG4gICAgICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICAgICAgICAgIFwiaW5wdXRfdmFsdWU6IGluY29ycmVjdCBsZW5ndGggb2Ygc2VyaWFsaXplZCBjdXN0b20gYmxvY2tcIixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBtZXNzYWdlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb21wcmVzc2VkKSB7XG4gICAgaWYgKGNhbWxfZGVjb21wcmVzc19pbnB1dCkge1xuICAgICAgdmFyIGRhdGEgPSByZWFkZXIucmVhZHVpbnQ4YXJyYXkoZGF0YV9sZW4pO1xuICAgICAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KHVuY29tcHJlc3NlZF9kYXRhX2xlbik7XG4gICAgICB2YXIgcmVzID0gY2FtbF9kZWNvbXByZXNzX2lucHV0KGRhdGEsIHJlcyk7XG4gICAgICB2YXIgcmVhZGVyID0gbmV3IFVJbnQ4QXJyYXlSZWFkZXIocmVzLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBjb21wcmVzc2VkIG9iamVjdCwgY2Fubm90IGRlY29tcHJlc3NcIik7XG4gICAgfVxuICB9XG4gIHZhciByZXMgPSBpbnRlcm5fcmVjKHJlYWRlcik7XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHNpemUgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBkID0gdi5sZW5ndGg7XG4gICAgaWYgKGQgPCBzaXplKSBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgIHZbZF0gPSBpbnRlcm5fcmVjKHJlYWRlcik7XG4gIH1cbiAgd2hpbGUgKG9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgIHZhciB4ID0gb2JqZWN0cy5wb3AoKTtcbiAgICBpZiAoeFsyXSA+PSAwKSBjYW1sX3NldF9vb19pZCh4KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPCA1LjEuMFxudmFyIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSA9IDIwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPj0gNS4xLjBcbnZhciBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUgPSAxNjtcblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZShzLCBvZnMpIHtcbiAgdmFyIHIgPSBuZXcgVUludDhBcnJheVJlYWRlcihjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHMpLCBvZnMpO1xuICBmdW5jdGlvbiByZWFkdmxxKG92ZXJmbG93KSB7XG4gICAgdmFyIGMgPSByLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N2Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT09IDApIHtcbiAgICAgIGMgPSByLnJlYWQ4dSgpO1xuICAgICAgdmFyIG43ID0gbiA8PCA3O1xuICAgICAgaWYgKG4gIT09IG43ID4+IDcpIG92ZXJmbG93WzBdID0gdHJ1ZTtcbiAgICAgIG4gPSBuNyB8IChjICYgMHg3Zik7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgc3dpdGNoIChyLnJlYWQzMnUoKSkge1xuICAgIGNhc2UgMHg4NDk1YTZiZSAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHIucmVhZDMydSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAweDg0OTVhNmJkIC8qIEludGV4dF9tYWdpY19udW1iZXJfY29tcHJlc3NlZCAqLzpcbiAgICAgIHZhciBoZWFkZXJfbGVuID0gci5yZWFkOHUoKSAmIDB4M2Y7XG4gICAgICB2YXIgb3ZlcmZsb3cgPSBbZmFsc2VdO1xuICAgICAgdmFyIGRhdGFfbGVuID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgICBpZiAob3ZlcmZsb3dbMF0pIHtcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICBcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmYgLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi86XG4gICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICBcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiBhIDMyLWJpdCBwbGF0Zm9ybVwiLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjYW1sX2ZhaWx3aXRoKFwiTWFyc2hhbC5kYXRhX3NpemU6IGJhZCBvYmplY3RcIik7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaGVhZGVyX2xlbiAtIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSArIGRhdGFfbGVuO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE9iamVjdFRhYmxlXG5jbGFzcyBNbE9iamVjdFRhYmxlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vYmpzID0gW107XG4gICAgdGhpcy5sb29rdXAgPSBuZXcgZ2xvYmFsVGhpcy5NYXAoKTtcbiAgfVxuXG4gIHN0b3JlKHYpIHtcbiAgICB0aGlzLmxvb2t1cC5zZXQodiwgdGhpcy5vYmpzLmxlbmd0aCk7XG4gICAgdGhpcy5vYmpzLnB1c2godik7XG4gIH1cblxuICByZWNhbGwodikge1xuICAgIHZhciBpID0gdGhpcy5sb29rdXAuZ2V0KHYpO1xuICAgIHJldHVybiBpID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMub2Jqcy5sZW5ndGggLSBpOyAvKiBpbmRleCBpcyByZWxhdGl2ZSAqL1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ieXRlc191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBNbE9iamVjdFRhYmxlLCBjYW1sX2xpc3RfdG9fanNfYXJyYXksIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xudmFyIGNhbWxfb3V0cHV0X3ZhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGNsYXNzIFdyaXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDIwO1xuICAgICAgdGhpcy5ibG9ja19sZW4gPSAwO1xuICAgICAgdGhpcy5vYmpfY291bnRlciA9IDA7XG4gICAgICB0aGlzLnNpemVfMzIgPSAwO1xuICAgICAgdGhpcy5zaXplXzY0ID0gMDtcbiAgICB9XG5cbiAgICB3cml0ZShzaXplLCB2YWx1ZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4OyBpID49IDA7IGkgLT0gOClcbiAgICAgICAgdGhpcy5jaHVua1t0aGlzLmNodW5rX2lkeCsrXSA9ICh2YWx1ZSA+PiBpKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgd3JpdGVfYXQocG9zLCBzaXplLCB2YWx1ZSkge1xuICAgICAgdmFyIHBvcyA9IHBvcztcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODsgaSA+PSAwOyBpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbcG9zKytdID0gKHZhbHVlID4+IGkpICYgMHhmZjtcbiAgICB9XG5cbiAgICB3cml0ZV9jb2RlKHNpemUsIGNvZGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gY29kZTtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODsgaSA+PSAwOyBpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbdGhpcy5jaHVua19pZHgrK10gPSAodmFsdWUgPj4gaSkgJiAweGZmO1xuICAgIH1cblxuICAgIHdyaXRlX3NoYXJlZChvZmZzZXQpIHtcbiAgICAgIGlmIChvZmZzZXQgPCAxIDw8IDgpXG4gICAgICAgIHRoaXMud3JpdGVfY29kZSg4LCAweDA0IC8qY3N0LkNPREVfU0hBUkVEOCovLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAob2Zmc2V0IDwgMSA8PCAxNilcbiAgICAgICAgdGhpcy53cml0ZV9jb2RlKDE2LCAweDA1IC8qY3N0LkNPREVfU0hBUkVEMTYqLywgb2Zmc2V0KTtcbiAgICAgIGVsc2UgdGhpcy53cml0ZV9jb2RlKDMyLCAweDA2IC8qY3N0LkNPREVfU0hBUkVEMzIqLywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBwb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaHVua19pZHg7XG4gICAgfVxuXG4gICAgZmluYWxpemUoKSB7XG4gICAgICB0aGlzLmJsb2NrX2xlbiA9IHRoaXMuY2h1bmtfaWR4IC0gMjA7XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDA7XG4gICAgICB0aGlzLndyaXRlKDMyLCAweDg0OTVhNmJlKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMuYmxvY2tfbGVuKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMub2JqX2NvdW50ZXIpO1xuICAgICAgdGhpcy53cml0ZSgzMiwgdGhpcy5zaXplXzMyKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMuc2l6ZV82NCk7XG4gICAgICByZXR1cm4gdGhpcy5jaHVuaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICh2LCBmbGFncykge1xuICAgIGZsYWdzID0gY2FtbF9saXN0X3RvX2pzX2FycmF5KGZsYWdzKTtcblxuICAgIHZhciBub19zaGFyaW5nID0gZmxhZ3MuaW5kZXhPZigwIC8qTWFyc2hhbC5Ob19zaGFyaW5nKi8pICE9PSAtMSxcbiAgICAgIGNsb3N1cmVzID0gZmxhZ3MuaW5kZXhPZigxIC8qTWFyc2hhbC5DbG9zdXJlcyovKSAhPT0gLTE7XG4gICAgLyogTWFyc2hhbC5Db21wYXRfMzIgaXMgcmVkdW5kYW50IHNpbmNlIGludGVnZXJzIGFyZSAzMi1iaXQgYW55d2F5ICovXG5cbiAgICBpZiAoY2xvc3VyZXMpXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiaW4gY2FtbF9vdXRwdXRfdmFsOiBmbGFnIE1hcnNoYWwuQ2xvc3VyZXMgaXMgbm90IHN1cHBvcnRlZC5cIixcbiAgICAgICk7XG5cbiAgICB2YXIgd3JpdGVyID0gbmV3IFdyaXRlcigpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gbm9fc2hhcmluZyA/IG51bGwgOiBuZXcgTWxPYmplY3RUYWJsZSgpO1xuXG4gICAgZnVuY3Rpb24gbWVtbyh2KSB7XG4gICAgICBpZiAobm9fc2hhcmluZykgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV4aXN0aW5nX29mZnNldCA9IGludGVybl9vYmpfdGFibGUucmVjYWxsKHYpO1xuICAgICAgaWYgKGV4aXN0aW5nX29mZnNldCkge1xuICAgICAgICB3cml0ZXIud3JpdGVfc2hhcmVkKGV4aXN0aW5nX29mZnNldCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuX29ial90YWJsZS5zdG9yZSh2KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVybl9yZWModikge1xuICAgICAgaWYgKHYuY2FtbF9jdXN0b20pIHtcbiAgICAgICAgaWYgKG1lbW8odikpIHJldHVybjtcbiAgICAgICAgdmFyIG5hbWUgPSB2LmNhbWxfY3VzdG9tO1xuICAgICAgICB2YXIgb3BzID0gY2FtbF9jdXN0b21fb3BzW25hbWVdO1xuICAgICAgICB2YXIgc3pfMzJfNjQgPSBbMCwgMF07XG4gICAgICAgIGlmICghb3BzLnNlcmlhbGl6ZSlcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChDdXN0b20pXCIpO1xuICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4MTggLypjc3QuQ09ERV9DVVNUT01fTEVOKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgaGVhZGVyX3BvcyA9IHdyaXRlci5wb3MoKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcywgMzIsIHN6XzMyXzY0WzBdKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcyArIDQsIDMyLCAwKTsgLy8gemVyb1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zICsgOCwgMzIsIHN6XzMyXzY0WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMHgxOSAvKmNzdC5DT0RFX0NVU1RPTV9GSVhFRCovKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgbmFtZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMCk7XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCAhPT0gc3pfMzJfNjRbMF0pXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICAgICAgICBcIm91dHB1dF92YWx1ZTogaW5jb3JyZWN0IGZpeGVkIHNpemVzIHNwZWNpZmllZCBieSBcIiArIG5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDIgKyAoKHN6XzMyXzY0WzBdICsgMykgPj4gMik7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDIgKyAoKHN6XzMyXzY0WzFdICsgNykgPj4gMyk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdlswXSA9PT0gKHZbMF0gfCAwKSkge1xuICAgICAgICBpZiAodlswXSA9PT0gMjUxKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKEFic3RyYWN0KVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FtbF9pc19jb250aW51YXRpb25fdGFnKHZbMF0pKVxuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIm91dHB1dF92YWx1ZTogY29udGludWF0aW9uIHZhbHVlXCIpO1xuICAgICAgICBpZiAodi5sZW5ndGggPiAxICYmIG1lbW8odikpIHJldHVybjtcbiAgICAgICAgaWYgKHZbMF0gPCAxNiAmJiB2Lmxlbmd0aCAtIDEgPCA4KVxuICAgICAgICAgIHdyaXRlci53cml0ZShcbiAgICAgICAgICAgIDgsXG4gICAgICAgICAgICAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovICsgdlswXSArICgodi5sZW5ndGggLSAxKSA8PCA0KSxcbiAgICAgICAgICApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoXG4gICAgICAgICAgICAzMixcbiAgICAgICAgICAgIDB4MDggLypjc3QuQ09ERV9CTE9DSzMyKi8sXG4gICAgICAgICAgICAoKHYubGVuZ3RoIC0gMSkgPDwgMTApIHwgdlswXSxcbiAgICAgICAgICApO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSB2Lmxlbmd0aDtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gdi5sZW5ndGg7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA+IDEpIHN0YWNrLnB1c2godiwgMSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXModikpIHtcbiAgICAgICAgaWYgKCFjYW1sX2lzX21sX2J5dGVzKGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIikpKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICAgIFwib3V0cHV0X3ZhbHVlOiBbQnl0ZXMudF0gY2Fubm90IHNhZmVseSBiZSBtYXJzaGFsZWQgd2l0aCBbLS1lbmFibGUgdXNlLWpzLXN0cmluZ11cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgIHZhciBsZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aCh2KTtcbiAgICAgICAgaWYgKGxlbiA8IDB4MjApIHdyaXRlci53cml0ZSg4LCAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcqLyArIGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA8IDB4MTAwKVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDgsIDB4MDkgLypjc3QuQ09ERV9TVFJJTkc4Ki8sIGxlbik7XG4gICAgICAgIGVsc2Ugd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MGEgLypjc3QuQ09ERV9TVFJJTkczMiovLCBsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQodiwgaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KSB8IDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KSB8IDApO1xuICAgICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh2KSkge1xuICAgICAgICBpZiAobWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHYpO1xuICAgICAgICBpZiAobGVuIDwgMHgyMCkgd3JpdGVyLndyaXRlKDgsIDB4MjAgLypjc3QuUFJFRklYX1NNQUxMX1NUUklORyovICsgbGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuIDwgMHgxMDApXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoOCwgMHgwOSAvKmNzdC5DT0RFX1NUUklORzgqLywgbGVuKTtcbiAgICAgICAgZWxzZSB3cml0ZXIud3JpdGVfY29kZSgzMiwgMHgwYSAvKmNzdC5DT0RFX1NUUklORzMyKi8sIGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQodiwgaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KSB8IDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KSB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgIT09ICh2IHwgMCkpIHtcbiAgICAgICAgICB2YXIgdHlwZV9vZl92ID0gdHlwZW9mIHY7XG4gICAgICAgICAgaWYgKHR5cGVfb2ZfdiAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChcIiArIHR5cGVfb2ZfdiArIFwiKVwiKTtcbiAgICAgICAgICAvLyBJZiBhIGZsb2F0IGhhcHBlbnMgdG8gYmUgYW4gaW50ZWdlciBpdCBpcyBzZXJpYWxpemVkIGFzIGFuIGludGVnZXJcbiAgICAgICAgICAvLyAoSnNfb2Zfb2NhbWwgY2Fubm90IHRlbGwgd2hldGhlciB0aGUgdHlwZSBvZiBhbiBpbnRlZ2VyIG51bWJlciBpc1xuICAgICAgICAgIC8vIGZsb2F0IG9yIGludGVnZXIuKSBUaGlzIGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBjcmFzaGVzIHdoZW5cbiAgICAgICAgICAvLyB1bm1hcnNoYWxsaW5nIHVzaW5nIHRoZSBzdGFuZGFyZCBydW50aW1lLlxuICAgICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgICAgdmFyIHQgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCh2KSk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4MGMgLypjc3QuQ09ERV9ET1VCTEVfTElUVExFKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgdFs3IC0gaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAzO1xuICAgICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAodiA+PSAwICYmIHYgPCAweDQwKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4NDAgLypjc3QuUFJFRklYX1NNQUxMX0lOVCovICsgdik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHYgPj0gLSgxIDw8IDcpICYmIHYgPCAxIDw8IDcpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSg4LCAweDAwIC8qY3N0LkNPREVfSU5UOCovLCB2KTtcbiAgICAgICAgICBlbHNlIGlmICh2ID49IC0oMSA8PCAxNSkgJiYgdiA8IDEgPDwgMTUpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSgxNiwgMHgwMSAvKmNzdC5DT0RFX0lOVDE2Ki8sIHYpO1xuICAgICAgICAgIGVsc2Ugd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDIgLypjc3QuQ09ERV9JTlQzMiovLCB2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5fcmVjKHYpO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaSA9IHN0YWNrLnBvcCgpO1xuICAgICAgdmFyIHYgPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmIChpICsgMSA8IHYubGVuZ3RoKSBzdGFjay5wdXNoKHYsIGkgKyAxKTtcbiAgICAgIGV4dGVybl9yZWModltpXSk7XG4gICAgfVxuICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSB3cml0ZXIub2JqX2NvdW50ZXIgPSBpbnRlcm5fb2JqX3RhYmxlLm9ianMubGVuZ3RoO1xuICAgIHdyaXRlci5maW5hbGl6ZSgpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3cml0ZXIuY2h1bmspO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkoY2FtbF9vdXRwdXRfdmFsKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXModiwgZmxhZ3MpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoY2FtbF9vdXRwdXRfdmFsKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlcihzLCBvZnMsIGxlbiwgdiwgZmxhZ3MpIHtcbiAgdmFyIHQgPSBjYW1sX291dHB1dF92YWwodiwgZmxhZ3MpO1xuICBpZiAodC5sZW5ndGggPiBsZW4pIGNhbWxfZmFpbHdpdGgoXCJNYXJzaGFsLnRvX2J1ZmZlcjogYnVmZmVyIG92ZXJmbG93XCIpO1xuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl91aW50OF9hcnJheSh0KSwgMCwgcywgb2ZzLCB0Lmxlbmd0aCk7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBJb1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19mZHNcbnZhciBjYW1sX3N5c19mZHMgPSBuZXcgQXJyYXkoMyk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2Nsb3NlXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19mZHNcbmZ1bmN0aW9uIGNhbWxfc3lzX2Nsb3NlKGZkKSB7XG4gIHZhciB4ID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKHgpIHtcbiAgICB4LmZpbGUuY2xvc2UoZmFsc2UpO1xuICAgIGRlbGV0ZSBjYW1sX3N5c19mZHNbZmRdO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBNbENoYW5pZFxuZnVuY3Rpb24gTWxDaGFuaWQoaWQpIHtcbiAgdGhpcy5pZCA9IGlkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogTWxGYWtlRmRfb3V0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Zkc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZVxuLy9SZXF1aXJlczogTWxDaGFuaWRcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSwgaWR4KSB7XG4gIHZhciBjaGFuaWQ7XG4gIGlmIChpZHggPT09IHVuZGVmaW5lZCkge1xuICAgIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gICAgY2hhbmlkID0gbmV3IE1sQ2hhbmlkKGlkeCk7XG4gIH0gZWxzZSBpZiAoY2FtbF9zeXNfZmRzW2lkeF0pIHtcbiAgICBjaGFuaWQgPSBjYW1sX3N5c19mZHNbaWR4XS5jaGFuaWQ7XG4gIH0gZWxzZSBjaGFuaWQgPSBuZXcgTWxDaGFuaWQoaWR4KTtcbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSB7IGZpbGU6IGZpbGUsIGNoYW5pZDogY2hhbmlkIH07XG4gIHJldHVybiBpZHggfCAwO1xufVxuZnVuY3Rpb24gY2FtbF9zeXNfb3BlbihuYW1lLCBmbGFncywgcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnJkb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmLndyb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmLmFwcGVuZCA9IDE7XG4gICAgICAgIGYud3JpdGVvbmx5ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGYuY3JlYXRlID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGYudHJ1bmNhdGUgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgZi5leGNsID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGYuYmluYXJ5ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGYudGV4dCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBmLm5vbmJsb2NrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZsYWdzID0gZmxhZ3NbMl07XG4gIH1cbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCwgZiwgcGVybXMpO1xuICByZXR1cm4gY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlLCB1bmRlZmluZWQpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlzX25vZGUgPSBmc19ub2RlX3N1cHBvcnRlZCgpO1xuICBmdW5jdGlvbiBmaWxlKGZkLCBmbGFncykge1xuICAgIGlmIChpc19ub2RlKSB7XG4gICAgICByZXR1cm4gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpO1xuICAgIH0gZWxzZSByZXR1cm4gbmV3IE1sRmFrZUZkX291dChmZCwgZmxhZ3MpO1xuICB9XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoXG4gICAgZmlsZSgwLCB7IHJkb25seTogMSwgYWx0bmFtZTogXCIvZGV2L3N0ZGluXCIsIGlzQ2hhcmFjdGVyRGV2aWNlOiB0cnVlIH0pLFxuICAgIDAsXG4gICk7XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoXG4gICAgZmlsZSgxLCB7IGJ1ZmZlcmVkOiBpc19ub2RlID8gMSA6IDIsIHdyb25seTogMSwgaXNDaGFyYWN0ZXJEZXZpY2U6IHRydWUgfSksXG4gICAgMSxcbiAgKTtcbiAgY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChcbiAgICBmaWxlKDIsIHsgYnVmZmVyZWQ6IGlzX25vZGUgPyAxIDogMiwgd3Jvbmx5OiAxLCBpc0NoYXJhY3RlckRldmljZTogdHJ1ZSB9KSxcbiAgICAyLFxuICApO1xufSkoKTtcblxuLy8gb2NhbWwgQ2hhbm5lbHNcblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX25hbWUoY2hhbmlkLCBuYW1lKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICBjaGFuLm5hbWUgPSBuYW1lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogTWxDaGFuaWRcbmNsYXNzIGNhbWxfbWxfY2hhbm5lbHNfc3RhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKTtcbiAgICB0aGlzLm9wZW5lZCA9IG5ldyBnbG9iYWxUaGlzLlNldCgpO1xuICB9XG5cbiAgY2xvc2UoY2hhbmlkKSB7XG4gICAgdGhpcy5vcGVuZWQuZGVsZXRlKGNoYW5pZCk7XG4gIH1cblxuICBnZXQoY2hhbmlkKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChjaGFuaWQpO1xuICB9XG5cbiAgc2V0KGNoYW5pZCwgdmFsKSB7XG4gICAgaWYgKHZhbC5vcGVuZWQpIHRoaXMub3BlbmVkLmFkZChjaGFuaWQpO1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoY2hhbmlkLCB2YWwpO1xuICB9XG5cbiAgYWxsKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW5lZC52YWx1ZXMoKTtcbiAgfVxufVxuXG52YXIgY2FtbF9tbF9jaGFubmVscyA9IG5ldyBjYW1sX21sX2NoYW5uZWxzX3N0YXRlKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2hhbm5lbF9nZXQoaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbHMuZ2V0KGlkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsX3JlZGlyZWN0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0LCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfcmVkaXJlY3QoY2FwdHVyZWQsIGludG8pIHtcbiAgdmFyIHRvX3Jlc3RvcmUgPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNhcHR1cmVkKTtcbiAgdmFyIG5ld18gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGludG8pO1xuICBjYW1sX21sX2NoYW5uZWxzLnNldChjYXB0dXJlZCwgbmV3Xyk7XG4gIHJldHVybiB0b19yZXN0b3JlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfcmVzdG9yZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9jaGFubmVsX3Jlc3RvcmUoY2FwdHVyZWQsIHRvX3Jlc3RvcmUpIHtcbiAgY2FtbF9tbF9jaGFubmVscy5zZXQoY2FwdHVyZWQsIHRvX3Jlc3RvcmUpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdCgpIHtcbiAgdmFyIGwgPSAwO1xuICB2YXIga2V5cyA9IGNhbWxfbWxfY2hhbm5lbHMuYWxsKCk7XG4gIGZvciAodmFyIGsgb2Yga2V5cykge1xuICAgIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChrKTtcbiAgICBpZiAoY2hhbi5vcGVuZWQgJiYgY2hhbi5vdXQpIGwgPSBbMCwgaywgbF07XG4gIH1cbiAgcmV0dXJuIGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9zeXNfZmRzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogY2FtbF9zeXNfb3BlblxuLy9SZXF1aXJlczogY2FtbF9pb19idWZmZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0KGZkKSB7XG4gIHZhciBmZF9kZXNjID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKGZkX2Rlc2MgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihcImZkIFwiICsgZmQgKyBcIiBkb2Vzbid0IGV4aXN0XCIpO1xuICB2YXIgZmlsZSA9IGZkX2Rlc2MuZmlsZTtcbiAgdmFyIGNoYW5pZCA9IGZkX2Rlc2MuY2hhbmlkO1xuICB2YXIgYnVmZmVyZWQgPSBmaWxlLmZsYWdzLmJ1ZmZlcmVkICE9PSB1bmRlZmluZWQgPyBmaWxlLmZsYWdzLmJ1ZmZlcmVkIDogMTtcbiAgdmFyIGNoYW5uZWwgPSB7XG4gICAgZmlsZTogZmlsZSxcbiAgICBvZmZzZXQ6IGZpbGUucG9zKCksXG4gICAgZmQ6IGZkLFxuICAgIG9wZW5lZDogdHJ1ZSxcbiAgICBvdXQ6IHRydWUsXG4gICAgYnVmZmVyX2N1cnI6IDAsXG4gICAgYnVmZmVyOiBuZXcgVWludDhBcnJheShjYW1sX2lvX2J1ZmZlcl9zaXplKSxcbiAgICBidWZmZXJlZDogYnVmZmVyZWQsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHMuc2V0KGNoYW5pZCwgY2hhbm5lbCk7XG4gIHJldHVybiBjaGFuaWQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N5c19mZHNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX2lvX2J1ZmZlcl9zaXplXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbihmZCkge1xuICB2YXIgZmRfZGVzYyA9IGNhbWxfc3lzX2Zkc1tmZF07XG4gIGlmIChmZF9kZXNjID09PSB1bmRlZmluZWQpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJmZCBcIiArIGZkICsgXCIgZG9lc24ndCBleGlzdFwiKTtcbiAgdmFyIGZpbGUgPSBmZF9kZXNjLmZpbGU7XG4gIHZhciBjaGFuaWQgPSBmZF9kZXNjLmNoYW5pZDtcbiAgdmFyIHJlZmlsbCA9IG51bGw7XG4gIHZhciBjaGFubmVsID0ge1xuICAgIGZpbGU6IGZpbGUsXG4gICAgb2Zmc2V0OiBmaWxlLnBvcygpLFxuICAgIGZkOiBmZCxcbiAgICBvcGVuZWQ6IHRydWUsXG4gICAgb3V0OiBmYWxzZSxcbiAgICBidWZmZXJfY3VycjogMCxcbiAgICBidWZmZXJfbWF4OiAwLFxuICAgIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoY2FtbF9pb19idWZmZXJfc2l6ZSksXG4gICAgcmVmaWxsOiByZWZpbGwsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHMuc2V0KGNoYW5pZCwgY2hhbm5lbCk7XG4gIHJldHVybiBjaGFuaWQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luX3dpdGhfZmxhZ3Ncbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1ZlcnNpb246ID49IDUuMVxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW5fd2l0aF9mbGFncyhmZCwgX2ZsYWdzKSB7XG4gIHJldHVybiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbihmZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dF93aXRoX2ZsYWdzXG4vL1JlcXVpcmVzOiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRcbi8vVmVyc2lvbjogPj0gNS4xXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRfd2l0aF9mbGFncyhmZCwgX2ZsYWdzKSB7XG4gIHJldHVybiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXQoZmQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuLy9BbGlhczogd2luX2ZpbGVkZXNjcl9vZl9jaGFubmVsXG5mdW5jdGlvbiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvcihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLmZkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9iaW5hcnlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUoY2hhbmlkLCBtb2RlKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICBjaGFuLmZpbGUuZmxhZ3MudGV4dCA9ICFtb2RlO1xuICBjaGFuLmZpbGUuZmxhZ3MuYmluYXJ5ID0gbW9kZTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaXNfYmluYXJ5X21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX2lzX2JpbmFyeV9tb2RlKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgcmV0dXJuIGNoYW4uZmlsZS5mbGFncy5iaW5hcnk7XG59XG5cbi8vSW5wdXQgZnJvbSBpbl9jaGFubmVsXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2xvc2VfY2hhbm5lbFxuLy9SZXF1aXJlczogY2FtbF9tbF9mbHVzaCwgY2FtbF9tbF9jaGFubmVsX2dldFxuLy9SZXF1aXJlczogY2FtbF9zeXNfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2xvc2VfY2hhbm5lbChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLm9wZW5lZCkge1xuICAgIGNoYW4ub3BlbmVkID0gZmFsc2U7XG4gICAgY2FtbF9tbF9jaGFubmVscy5jbG9zZShjaGFuaWQpO1xuICAgIGNhbWxfc3lzX2Nsb3NlKGNoYW4uZmQpO1xuICAgIGNoYW4uZmQgPSAtMTtcbiAgICBjaGFuLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLmZpbGUubGVuZ3RoKCkgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCxjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNoYW4uZmlsZS5sZW5ndGgoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX291dHB1dChjaGFuaWQsIGYpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGNoYW4ub3V0cHV0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICBmKHMpO1xuICB9O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsKGNoYW5pZCwgZikge1xuICBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCkucmVmaWxsID0gZjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVmaWxsXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yZWZpbGwoY2hhbikge1xuICBpZiAoY2hhbi5yZWZpbGwgIT0gbnVsbCkge1xuICAgIHZhciBzdHIgPSBjaGFuLnJlZmlsbCgpO1xuICAgIHZhciBzdHJfYSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHN0cik7XG4gICAgaWYgKHN0cl9hLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2hhbi5yZWZpbGwgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhbi5idWZmZXIubGVuZ3RoIDwgY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKSB7XG4gICAgICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKTtcbiAgICAgICAgYi5zZXQoY2hhbi5idWZmZXIpO1xuICAgICAgICBjaGFuLmJ1ZmZlciA9IGI7XG4gICAgICB9XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoc3RyX2EsIGNoYW4uYnVmZmVyX21heCk7XG4gICAgICBjaGFuLm9mZnNldCArPSBzdHJfYS5sZW5ndGg7XG4gICAgICBjaGFuLmJ1ZmZlcl9tYXggKz0gc3RyX2EubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbi5mZCA9PT0gLTEpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQmFkIGZpbGUgZGVzY3JpcHRvclwiKTtcbiAgICB9XG4gICAgdmFyIG5yZWFkID0gY2hhbi5maWxlLnJlYWQoXG4gICAgICBjaGFuLmJ1ZmZlcixcbiAgICAgIGNoYW4uYnVmZmVyX21heCxcbiAgICAgIGNoYW4uYnVmZmVyLmxlbmd0aCAtIGNoYW4uYnVmZmVyX21heCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY2hhbi5vZmZzZXQgKz0gbnJlYWQ7XG4gICAgY2hhbi5idWZmZXJfbWF4ICs9IG5yZWFkO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXQoY2hhbmlkLCBiLCBpLCBsKSB7XG4gIHZhciBiYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYik7XG4gIHJldHVybiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2JpZ2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2lucHV0X2Jsb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5XG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9iaWdhcnJheShjaGFuaWQsIGIsIGksIGwpIHtcbiAgdmFyIGJhID0gY2FtbF9iYV90b190eXBlZF9hcnJheShiKTtcbiAgcmV0dXJuIGNhbWxfbWxfaW5wdXRfYmxvY2soY2hhbmlkLCBiYSwgaSwgbCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfcmVmaWxsLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHZhciBuID0gbDtcbiAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgaWYgKGwgPD0gYXZhaWwpIHtcbiAgICBiYS5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciwgY2hhbi5idWZmZXJfY3VyciArIGwpLCBpKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGw7XG4gIH0gZWxzZSBpZiAoYXZhaWwgPiAwKSB7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsIGNoYW4uYnVmZmVyX2N1cnIgKyBhdmFpbCksIGkpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYXZhaWw7XG4gICAgbiA9IGF2YWlsO1xuICB9IGVsc2Uge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgICBpZiAobiA+IGF2YWlsKSBuID0gYXZhaWw7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsIGNoYW4uYnVmZmVyX2N1cnIgKyBuKSwgaSk7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBuO1xuICB9XG4gIHJldHVybiBuIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSwgY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzLCBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yZWZpbGwsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHZhciBoZWFkZXIgPSBuZXcgVWludDhBcnJheShjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBmdW5jdGlvbiBibG9jayhidWZmZXIsIG9mZnNldCwgbikge1xuICAgIHZhciByID0gMDtcbiAgICB3aGlsZSAociA8IG4pIHtcbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgICAgICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpIGJyZWFrO1xuICAgICAgYnVmZmVyW29mZnNldCArIHJdID0gY2hhbi5idWZmZXJbY2hhbi5idWZmZXJfY3Vycl07XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyKys7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHZhciByID0gYmxvY2soaGVhZGVyLCAwLCBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBpZiAociA9PT0gMCkgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICBlbHNlIGlmIChyIDwgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdFwiKTtcbiAgdmFyIGxlbiA9IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUoY2FtbF9ieXRlc19vZl91aW50OF9hcnJheShoZWFkZXIpLCAwKTtcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbiArIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSk7XG4gIGJ1Zi5zZXQoaGVhZGVyLCAwKTtcbiAgdmFyIHIgPSBibG9jayhidWYsIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSwgbGVuKTtcbiAgaWYgKHIgPCBsZW4pIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdCBcIiArIHIgKyBcIiAgXCIgKyBsZW4pO1xuICB2YXIgcmVzID0gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYnVmKSwgMCk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwKGMpIHtcbiAgcmV0dXJuIGNhbWxfaW5wdXRfdmFsdWUoYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9yZWZpbGxcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfY2hhcihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gIH1cbiAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIHZhciByZXMgPSBjaGFuLmJ1ZmZlcltjaGFuLmJ1ZmZlcl9jdXJyXTtcbiAgY2hhbi5idWZmZXJfY3VycisrO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2ludFxuLy9SZXF1aXJlczogY2FtbF9tbF9pbnB1dF9jaGFyXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2ludChjaGFuaWQpIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgcmVzID0gKChyZXMgPDwgOCkgKyBjYW1sX21sX2lucHV0X2NoYXIoY2hhbmlkKSkgfCAwO1xuICB9XG4gIHJldHVybiByZXMgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLnJlZmlsbCAhPSBudWxsKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIklsbGVnYWwgc2Vla1wiKTtcbiAgaWYgKFxuICAgIHBvcyA+PSBjaGFuLm9mZnNldCAtIGNoYW4uYnVmZmVyX21heCAmJlxuICAgIHBvcyA8PSBjaGFuLm9mZnNldCAmJlxuICAgIGNoYW4uZmlsZS5mbGFncy5iaW5hcnlcbiAgKSB7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IGNoYW4uYnVmZmVyX21heCAtIChjaGFuLm9mZnNldCAtIHBvcyk7XG4gIH0gZWxzZSB7XG4gICAgY2hhbi5maWxlLnNlZWsocG9zLCAwKTtcbiAgICBjaGFuLm9mZnNldCA9IHBvcztcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luKGNoYW5pZCwgcG9zKSB7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luXzY0KGNoYW5pZCwgcG9zKSB7XG4gIHZhciBwb3MgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19pblxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICByZXR1cm4gY2hhbi5vZmZzZXQgLSAoY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3Vycik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX2luXG4vL1JlcXVpcmVzOiBjYW1sX3Bvc19pblxuZnVuY3Rpb24gY2FtbF9tbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19pbihjaGFuaWQpIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3NfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfcG9zX2luXG5mdW5jdGlvbiBjYW1sX21sX3Bvc19pbl82NChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQoY2FtbF9wb3NfaW4oY2hhbmlkKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0LCBjYW1sX3JlZmlsbFxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmUoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICB2YXIgcCA9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGRvIHtcbiAgICBpZiAocCA+PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID4gMCkge1xuICAgICAgICBjaGFuLmJ1ZmZlci5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciksIDApO1xuICAgICAgICBwIC09IGNoYW4uYnVmZmVyX2N1cnI7XG4gICAgICAgIGNoYW4uYnVmZmVyX21heCAtPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9tYXggPj0gY2hhbi5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtY2hhbi5idWZmZXJfbWF4IHwgMDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2X21heCA9IGNoYW4uYnVmZmVyX21heDtcbiAgICAgIGNhbWxfcmVmaWxsKGNoYW4pO1xuICAgICAgaWYgKHByZXZfbWF4ID09PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgICAgcmV0dXJuIC1jaGFuLmJ1ZmZlcl9tYXggfCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoY2hhbi5idWZmZXJbcCsrXSAhPT0gMTApO1xuICByZXR1cm4gKHAgLSBjaGFuLmJ1ZmZlcl9jdXJyKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZmx1c2hcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX2ZsdXNoKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgaWYgKCFjaGFuLm9wZW5lZCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgaWYgKCFjaGFuLmJ1ZmZlciB8fCBjaGFuLmJ1ZmZlcl9jdXJyID09PSAwKSByZXR1cm4gMDtcbiAgaWYgKGNoYW4ub3V0cHV0KSB7XG4gICAgY2hhbi5vdXRwdXQoXG4gICAgICBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzKGNoYW4uYnVmZmVyLCAwLCBjaGFuLmJ1ZmZlcl9jdXJyKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IGNoYW4uYnVmZmVyX2N1cnI7ICkge1xuICAgICAgcG9zICs9IGNoYW4uZmlsZS53cml0ZShjaGFuLmJ1ZmZlciwgcG9zLCBjaGFuLmJ1ZmZlcl9jdXJyIC0gcG9zLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIGNoYW4ub2Zmc2V0ICs9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9vdXRwdXQgdG8gb3V0X2NoYW5uZWxcblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfdGFcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmICghY2hhbi5vcGVuZWQpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQ2Fubm90IG91dHB1dCB0byBhIGNsb3NlZCBjaGFubmVsXCIpO1xuICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW4pO1xuICBpZiAoY2hhbi5idWZmZXJfY3VyciArIGJ1ZmZlci5sZW5ndGggPiBjaGFuLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGNoYW4uYnVmZmVyX2N1cnIgKyBidWZmZXIubGVuZ3RoKTtcbiAgICBiLnNldChjaGFuLmJ1ZmZlcik7XG4gICAgY2hhbi5idWZmZXIgPSBiO1xuICB9XG4gIHN3aXRjaCAoY2hhbi5idWZmZXJlZCkge1xuICAgIGNhc2UgMDogLy8gVW5idWZmZXJlZFxuICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlciwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEJ1ZmZlcmVkICh0aGUgZGVmYXVsdClcbiAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXIubGVuZ3RoKSBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6IC8vIEJ1ZmZlcmVkIChvbmx5IGZvciBzdGRvdXQgYW5kIHN0ZGVycilcbiAgICAgIHZhciBpZCA9IGJ1ZmZlci5sYXN0SW5kZXhPZigxMCk7XG4gICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyLmxlbmd0aCkgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheSgwLCBpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBpZCArIDE7XG4gICAgICAgIGNhbWxfbWxfZmx1c2goY2hhbmlkKTtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheShpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoIC0gaWQgLSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX21sX291dHB1dF90YVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoY2hhbmlkLCBidWZmZXIsIG9mZnNldCwgbGVuKSB7XG4gIHZhciBidWZmZXIgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZmZlcik7XG4gIHJldHVybiBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dF9iaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV90b190eXBlZF9hcnJheSwgY2FtbF9tbF9vdXRwdXRfdGFcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9iaWdhcnJheShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pIHtcbiAgdmFyIGJ1ZmZlciA9IGNhbWxfYmFfdG9fdHlwZWRfYXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIGNhbWxfbWxfb3V0cHV0X3RhKGNoYW5pZCwgYnVmZmVyLCBvZmZzZXQsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF9ieXRlcywgY2FtbF9ieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCwgYnVmZmVyLCBvZmZzZXQsIGxlbikge1xuICByZXR1cm4gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoXG4gICAgY2hhbmlkLFxuICAgIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGJ1ZmZlciksXG4gICAgb2Zmc2V0LFxuICAgIGxlbixcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2NoYXIoY2hhbmlkLCBjKSB7XG4gIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLCBzLCAwLCAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcsIGNhbWxfbWxfb3V0cHV0LGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWUoY2hhbmlkLCB2LCBmbGFncykge1xuICB2YXIgcyA9IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncyk7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2Vla19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXQsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpIHtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgY2hhbi5maWxlLnNlZWsocG9zLCAwKTtcbiAgY2hhbi5vZmZzZXQgPSBwb3M7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX3NlZWtfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKSB7XG4gIHJldHVybiBjYW1sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19vdXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19vdXRfNjQoY2hhbmlkLCBwb3MpIHtcbiAgdmFyIHBvcyA9IGNhbWxfaW50NjRfdG9fZmxvYXQocG9zKTtcbiAgcmV0dXJuIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXQsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfcG9zX291dChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLm9mZnNldCArIGNoYW4uYnVmZmVyX2N1cnI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dFxuLy9SZXF1aXJlczogY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19vdXQoY2hhbmlkKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dF82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCwgY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXRfNjQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNhbWxfcG9zX291dChjaGFuaWQpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF90YVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfaW50KGNoYW5pZCwgaSkge1xuICB2YXIgYXJyID0gWyhpID4+IDI0KSAmIDB4ZmYsIChpID4+IDE2KSAmIDB4ZmYsIChpID4+IDgpICYgMHhmZiwgaSAmIDB4ZmZdO1xuICBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIG5ldyBVaW50OEFycmF5KGFyciksIDAsIDQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pc19idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9pc19idWZmZXJlZChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKS5idWZmZXJlZCA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9tbF9mbHVzaFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYnVmZmVyZWQoY2hhbmlkLCB2KSB7XG4gIGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKS5idWZmZXJlZCA9IHY7XG4gIGlmICghdikgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gU3lzXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c19lcnJvcihtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyhjYW1sX2dsb2JhbF9kYXRhLlN5c19lcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4aXRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9BbGlhczogY2FtbF91bml4X2V4aXRcbi8vQWxpYXM6IHVuaXhfZXhpdFxuZnVuY3Rpb24gY2FtbF9zeXNfZXhpdChjb2RlKSB7XG4gIGlmIChnbG9iYWxUaGlzLnF1aXQpIGdsb2JhbFRoaXMucXVpdChjb2RlKTtcbiAgLy9ub2RlanNcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZXhpdCkgZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXQoY29kZSk7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkZ1bmN0aW9uICdleGl0JyBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuKSB7XG4gIHN3aXRjaCAoZXhuWzJdKSB7XG4gICAgY2FzZSAtODogLy8gTWF0Y2hfZmFpbHVyZVxuICAgIGNhc2UgLTExOiAvLyBBc3NlcnRfZmFpbHVyZVxuICAgIGNhc2UgLTEyOiAvLyBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZVxuICAgICAgcmV0dXJuIDE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2V4Y2VwdGlvblxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGV4bikge1xuICB2YXIgciA9IFwiXCI7XG4gIGlmIChleG5bMF0gPT09IDApIHtcbiAgICByICs9IGV4blsxXVsxXTtcbiAgICBpZiAoXG4gICAgICBleG4ubGVuZ3RoID09PSAzICYmXG4gICAgICBleG5bMl1bMF0gPT09IDAgJiZcbiAgICAgIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuWzFdKVxuICAgICkge1xuICAgICAgdmFyIGJ1Y2tldCA9IGV4blsyXTtcbiAgICAgIHZhciBzdGFydCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFydCA9IDI7XG4gICAgICB2YXIgYnVja2V0ID0gZXhuO1xuICAgIH1cbiAgICByICs9IFwiKFwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiBzdGFydCkgciArPSBcIiwgXCI7XG4gICAgICB2YXIgdiA9IGJ1Y2tldFtpXTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgciArPSB2LnRvU3RyaW5nKCk7XG4gICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgTWxCeXRlcykge1xuICAgICAgICByICs9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByICs9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfSBlbHNlIHIgKz0gXCJfXCI7XG4gICAgfVxuICAgIHIgKz0gXCIpXCI7XG4gIH0gZWxzZSBpZiAoZXhuWzBdID09PSAyNDgpIHtcbiAgICByICs9IGV4blsxXTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfZm9ybWF0X2V4Y2VwdGlvbiwgY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGVycikgJiYgKGVyclswXSA9PT0gMCB8fCBlcnJbMF0gPT09IDI0OCkpIHtcbiAgICB2YXIgaGFuZGxlciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQcmludGV4Yy5oYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXCIpO1xuICAgIGlmIChoYW5kbGVyKSBjYW1sX2NhbGxiYWNrKGhhbmRsZXIsIFtlcnIsIGZhbHNlXSk7XG4gICAgZWxzZSB7XG4gICAgICB2YXIgbXNnID0gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGVycik7XG4gICAgICB2YXIgYXRfZXhpdCA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIik7XG4gICAgICBpZiAoYXRfZXhpdCkgY2FtbF9jYWxsYmFjayhhdF9leGl0LCBbMF0pO1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gXCIgKyBtc2cpO1xuICAgICAgaWYgKGVyci5qc19lcnJvcikgdGhyb3cgZXJyLmpzX2Vycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczoganNvb19zdGF0aWNfZW52XG52YXIganNvb19zdGF0aWNfZW52ID0ge307XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3N0YXRpY19lbnZcbi8vUmVxdWlyZXM6IGpzb29fc3RhdGljX2VudlxuZnVuY3Rpb24gY2FtbF9zZXRfc3RhdGljX2VudihrLCB2KSB7XG4gIGpzb29fc3RhdGljX2VudltrXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3N5c19nZXRlbnYgKGNvbnN0KVxuLy9SZXF1aXJlczoganNvb19zdGF0aWNfZW52XG5mdW5jdGlvbiBqc29vX3N5c19nZXRlbnYobikge1xuICBpZiAoanNvb19zdGF0aWNfZW52W25dKSByZXR1cm4ganNvb19zdGF0aWNfZW52W25dO1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgLy9ub2RlanMgZW52XG4gIGlmIChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52W25dICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W25dO1xuICBpZiAoZ2xvYmFsVGhpcy5qc29vX2VudiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5qc29vX2VudltuXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmpzb29fZW52W25dO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGVudiAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBqc29vX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldGVudihuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYgKHIgPT09IHVuZGVmaW5lZCkgY2FtbF9yYWlzZV9ub3RfZm91bmQoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRlbnZfb3B0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0ZW52X29wdChuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHJldHVybiBbMCwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocildO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c191bnNhZmVfZ2V0ZW52XG4vL1JlcXVpcmVzOiBjYW1sX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX3Vuc2FmZV9nZXRlbnYobmFtZSkge1xuICByZXR1cm4gY2FtbF9zeXNfZ2V0ZW52KG5hbWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG52YXIgY2FtbF9hcmd2ID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gIHZhciBtYWluID0gXCJhLm91dFwiO1xuICB2YXIgYXJncyA9IFtdO1xuXG4gIGlmIChwcm9jZXNzPy5hcmd2Py5sZW5ndGggPiAxKSB7XG4gICAgdmFyIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgLy9ub2RlanNcbiAgICBtYWluID0gYXJndlsxXTtcbiAgICBhcmdzID0gYXJndi5zbGljZSgyKTtcbiAgfVxuXG4gIHZhciBwID0gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobWFpbik7XG4gIHZhciBhcmdzMiA9IFswLCBwXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKVxuICAgIGFyZ3MyLnB1c2goY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoYXJnc1tpXSkpO1xuICByZXR1cm4gYXJnczI7XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG52YXIgY2FtbF9leGVjdXRhYmxlX25hbWUgPSBjYW1sX2FyZ3ZbMV07XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldF9hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldF9hcmd2KF91bml0KSB7XG4gIHJldHVybiBbMCwgY2FtbF9hcmd2WzFdLCBjYW1sX2FyZ3ZdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2FyZ3YoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfYXJndjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfbW9kaWZ5X2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfbW9kaWZ5X2FyZ3YoYXJnKSB7XG4gIGNhbWxfYXJndiA9IGFyZztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9leGVjdXRhYmxlX25hbWVcbmZ1bmN0aW9uIGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZShfdW5pdCkge1xuICByZXR1cm4gY2FtbF9leGVjdXRhYmxlX25hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmQoY21kKSB7XG4gIHZhciBjbWQgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhjbWQpO1xuICBpZiAodHlwZW9mIHJlcXVpcmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gICAgaWYgKGNoaWxkX3Byb2Nlc3M/LmV4ZWNTeW5jKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYyhjbWQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gIH0gZWxzZSByZXR1cm4gMTI3O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kKF9jbWQpIHtcbiAgcmV0dXJuIDEyNztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZSBtdXRhYmxlXG52YXIgY2FtbF9pbml0aWFsX3RpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAqIDAuMDAxO1xuZnVuY3Rpb24gY2FtbF9zeXNfdGltZSgpIHtcbiAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICByZXR1cm4gbm93ICogMC4wMDEgLSBjYW1sX2luaXRpYWxfdGltZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuXG4vL1JlcXVpcmVzOiBjYW1sX3N5c190aW1lXG5mdW5jdGlvbiBjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW4oX2IpIHtcbiAgcmV0dXJuIGNhbWxfc3lzX3RpbWUoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmFuZG9tX3NlZWQgbXV0YWJsZVxuLy9UaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5IHNpbmNlIE9DYW1sIDQuMC4uLlxuZnVuY3Rpb24gY2FtbF9zeXNfcmFuZG9tX3NlZWQoKSB7XG4gIGlmIChnbG9iYWxUaGlzLmNyeXB0bykge1xuICAgIGlmIChnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHZhciBhID0gZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBJbnQzMkFycmF5KDQpKTtcbiAgICAgIHJldHVybiBbMCwgYVswXSwgYVsxXSwgYVsyXSwgYVszXV07XG4gICAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcykge1xuICAgICAgdmFyIGEgPSBuZXcgSW50MzJBcnJheShnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcygxNikuYnVmZmVyKTtcbiAgICAgIHJldHVybiBbMCwgYVswXSwgYVsxXSwgYVsyXSwgYVszXV07XG4gICAgfVxuICB9XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdmFyIHggPSBub3cgXiAoMHhmZmZmZmZmZiAqIE1hdGgucmFuZG9tKCkpO1xuICByZXR1cm4gWzAsIHhdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF93b3JkX3NpemUoKSB7XG4gIHJldHVybiAzMjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfaW50X3NpemUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2ludF9zaXplKCkge1xuICByZXR1cm4gMzI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X21heF93b3NpemUgY29uc3Rcbi8vIG1heF9pbnQgLyA0IHNvIHRoYXQgdGhlIGZvbGxvd2luZyBkb2VzIG5vdCBvdmVyZmxvd1xuLy9sZXQgbWF4X3N0cmluZ19sZW5ndGggPSB3b3JkX3NpemUgLyA4ICogbWF4X2FycmF5X2xlbmd0aCAtIDE7O1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSgpIHtcbiAgcmV0dXJuICgweDdmZmZmZmZmIC8gNCkgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXgoKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIlVuaXhcIiA/IDEgOiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3dpbjMyIGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIoKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIldpbjMyXCIgPyAxIDogMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4gY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4oKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIkN5Z3dpblwiID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJqc19vZl9vY2FtbFwiKV07XG59XG5cbi8vUHJvdmlkZXM6IG9zX3R5cGVcbi8vUmVxdWlyZXM6IGpzb29faXNfd2luMzJcbnZhciBvc190eXBlID0ganNvb19pc193aW4zMiA/IFwiV2luMzJcIiA6IFwiVW5peFwiO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRfY29uZmlnIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRfY29uZmlnKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMob3NfdHlwZSksIDMyLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNhdHR5XG5mdW5jdGlvbiBjYW1sX3N5c19pc2F0dHkoX2NoYW4pIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV92YXJpYW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfdmFyaWFudChfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9wYXJhbWV0ZXJzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfcGFyYW1ldGVycyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbnZhciBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzXG4vL1JlcXVpcmVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbmZ1bmN0aW9uIGNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MoYm9vbCkge1xuICBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSBib29sO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcbi8vUmVxdWlyZXM6IGNhbWxfcnVudGltZV93YXJuaW5nc1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfcnVudGltZV93YXJuaW5ncztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3hkZ19kZWZhdWx0c1xuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfeGRnX2RlZmF1bHRzKF91bml0KSB7XG4gIHJldHVybiAwOyAvLyBlbXB0eSBsaXN0XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lzX3JlZ3VsYXJfZmlsZVxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2Vcbi8vVmVyc2lvbjogPj0gNS4xXG5mdW5jdGlvbiBjYW1sX3N5c19pc19yZWd1bGFyX2ZpbGUobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByZXR1cm4gcm9vdC5kZXZpY2UuaXNGaWxlKHJvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW9fYnVmZmVyX3NpemVcbnZhciBjYW1sX2lvX2J1ZmZlcl9zaXplID0gNjU1MzY7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lvX2J1ZmZlcl9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2lvX2J1ZmZlcl9zaXplXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfaW9fYnVmZmVyX3NpemUoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfaW9fYnVmZmVyX3NpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3RlbXBfZGlyX25hbWVcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfdGVtcF9kaXJfbmFtZShfdW5pdCkge1xuICBpZiAob3NfdHlwZSA9PT0gXCJXaW4zMlwiKSB7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHJlcXVpcmUoXCJub2RlOm9zXCIpLnRtcGRpcigpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGVtcF9kaXJfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vVmVyc2lvbjogPj0gNS40XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3N5c190ZW1wX2Rpcl9uYW1lKF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29udmVydF9zaWduYWxfbnVtYmVyXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfY29udmVydF9zaWduYWxfbnVtYmVyKHNpZ25vKSB7XG4gIHJldHVybiBzaWdubztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmV2X2NvbnZlcnRfc2lnbmFsX251bWJlclxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfc3lzX3Jldl9jb252ZXJ0X3NpZ25hbF9udW1iZXIoc2lnbm8pIHtcbiAgcmV0dXJuIHNpZ25vO1xufVxuXG4vL0Fsd2F5c1xuLy9SZXF1aXJlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vSWY6ICF3YXNtXG5mdW5jdGlvbiBjYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyKCkge1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgaWYgKHByb2Nlc3M/Lm9uKSB7XG4gICAgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChlcnIsIG9yaWdpbikge1xuICAgICAgY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5lcnJvcikge1xuICAgICAgICBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihldmVudC5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIoKTtcbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnID0gRkxBRyhcIndpdGgtanMtZXJyb3JcIik7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KFwiT0NBTUxSVU5QQVJBTVwiKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBsID0gci5zcGxpdChcIixcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobFtpXSA9PT0gXCJiXCIpIHtcbiAgICAgICAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGxbaV0uc3RhcnRzV2l0aChcImI9XCIpKSB7XG4gICAgICAgIGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZyA9ICtsW2ldLnNsaWNlKDIpO1xuICAgICAgfSBlbHNlIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnXG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA9IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZztcblxuLy9Qcm92aWRlczogY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cyBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cygpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2JhY2t0cmFjZV9zdGF0dXNcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9ydW50aW1lX2ZsYWdcbmZ1bmN0aW9uIGNhbWxfYmFja3RyYWNlX3N0YXR1cyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA/IDEgOiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSgpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UoX3VuaXQpIHtcbiAgcmV0dXJuIFswXTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuZnVuY3Rpb24gY2FtbF9yZWNvcmRfYmFja3RyYWNlKGIpIHtcbiAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA9IGI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlKCkge1xuICByZXR1cm4gWzBdO1xufVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aCgpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90XG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90KF9zbG90KSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3QoX2J0LCBfaWR4KSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlX3Nsb3Q6IGluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2UoX2V4biwgX2J0KSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2sgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrKCkge1xuICByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90KF9yYnQpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3RcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsX2dlbiAoY29uc3QsIHNoYWxsb3cpXG4vL0lmOiAhZWZmZWN0c1xuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSBmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09PSAwKSByZXR1cm4gZiguLi5hcmdzKTtcbiAgZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgZyA9IGYoLi4uYXJncy5zbGljZSgwLCBuKSk7XG4gICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBnO1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGcsIGFyZ3Muc2xpY2UobikpO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDEpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICAgIHJldHVybiBmKC4uLm5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMik7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKyspIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDFdID0geTtcbiAgICAgICAgICByZXR1cm4gZiguLi5uYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncy5jb25jYXQoZXh0cmFfYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBnLmwgPSBkO1xuICAgIHJldHVybiBnO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbF9nZW4gKGNvbnN0LCBzaGFsbG93KVxuLy9JZjogZWZmZWN0c1xuLy9JZjogIWRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSBmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09PSAwKSB7XG4gICAgcmV0dXJuIGYoLi4uYXJncyk7XG4gIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgcmVzdCA9IGFyZ3Muc2xpY2UobiAtIDEpO1xuICAgIHZhciBrID0gYXJnc1thcmdzTGVuIC0gMV07XG4gICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgbik7XG4gICAgYXJnc1tuIC0gMV0gPSBmdW5jdGlvbiAoZykge1xuICAgICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBrKGcpO1xuICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBrO1xuICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZywgYXJncyk7XG4gICAgfTtcbiAgICByZXR1cm4gZiguLi5hcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzTGVuLS07XG4gICAgdmFyIGsgPSBhcmdzW2FyZ3NMZW5dO1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDIpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAxXSA9IHk7XG4gICAgICAgICAgcmV0dXJuIGYoLi4ubmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4LCB5LCB6KSB7XG4gICAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAzKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKykgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgICBuYXJnc1thcmdzTGVuICsgMV0gPSB5O1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAyXSA9IHo7XG4gICAgICAgICAgcmV0dXJuIGYoLi4ubmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXJncy5sZW5ndGggPSBhcmdzTGVuO1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncy5jb25jYXQoZXh0cmFfYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBnLmwgPSBkICsgMTtcbiAgICByZXR1cm4gayhnKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX2Nwc1xuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuLy9JZjogZWZmZWN0c1xuLy9JZjogIWRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG52YXIgY2FtbF9jYWxsX2dlbl9jcHMgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX3R1cGxlIChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfY3BzX2Nsb3N1cmVcbi8vSWY6IGVmZmVjdHNcbi8vSWY6IGRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG52YXIgY2FtbF9jYWxsX2dlbl90dXBsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGNhbWxfY2FsbF9nZW5fZGlyZWN0KGYsIGFyZ3MpIHtcbiAgICB2YXIgbiA9IGYubCA+PSAwID8gZi5sIDogKGYubCA9IGYubGVuZ3RoKTtcbiAgICB2YXIgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gICAgaWYgKGQgPT09IDApIHtcbiAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICAgIHZhciBnID0gZiguLi5hcmdzLnNsaWNlKDAsIG4pKTtcbiAgICAgIGlmICh0eXBlb2YgZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZztcbiAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2RpcmVjdChnLCBhcmdzLnNsaWNlKG4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRklYTUU6IFJlc3RvcmUgdGhlIG9wdGltaXphdGlvbiBvZiBoYW5kbGluZyBzcGVjaWFsbHkgZCA9IDEgb3IgMlxuICAgICAgdmFyIGFyZ3NfID0gYXJncy5zbGljZSgpO1xuICAgICAgYXJnc18ubGVuZ3RoID0gYXJnc0xlbjtcbiAgICAgIHZhciByZXQgPSBjYW1sX2Nwc19jbG9zdXJlKFxuICAgICAgICBmdW5jdGlvbiAoLi4uZXh0cmFfYXJncykge1xuICAgICAgICAgIGlmIChleHRyYV9hcmdzLmxlbmd0aCA9PT0gMCkgZXh0cmFfYXJncyA9IFt1bmRlZmluZWRdO1xuICAgICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2RpcmVjdChmLCBhcmdzLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fY3BzKGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0LmwgPSBkO1xuICAgICAgcmV0LmNwcy5sID0gZCArIDE7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjYW1sX2NhbGxfZ2VuX2NwcyhmLCBhcmdzKSB7XG4gICAgaWYgKCFmLmNwcykge1xuICAgICAgdmFyIGsgPSBhcmdzLnBvcCgpO1xuICAgICAgcmV0dXJuIGsoY2FtbF9jYWxsX2dlbl9kaXJlY3QoZiwgYXJncykpO1xuICAgIH1cbiAgICB2YXIgbiA9IGYuY3BzLmwgPj0gMCA/IGYuY3BzLmwgOiAoZi5jcHMubCA9IGYuY3BzLmxlbmd0aCk7XG4gICAgdmFyIGFyZ3NMZW4gPSBhcmdzLmxlbmd0aDtcbiAgICB2YXIgZCA9IG4gLSBhcmdzTGVuO1xuICAgIGlmIChkID09PSAwKSB7XG4gICAgICByZXR1cm4gZi5jcHMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIGlmIChkIDwgMCkge1xuICAgICAgdmFyIHJlc3QgPSBhcmdzLnNsaWNlKG4gLSAxKTtcbiAgICAgIHZhciBrID0gYXJnc1thcmdzTGVuIC0gMV07XG4gICAgICBhcmdzID0gYXJncy5zbGljZSgwLCBuKTtcbiAgICAgIGFyZ3NbbiAtIDFdID0gZnVuY3Rpb24gKGcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGs7XG4gICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2NwcyhnLCBhcmdzKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZi5jcHMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3NMZW4tLTtcbiAgICAgIHZhciBhcmdzXyA9IGFyZ3Muc2xpY2UoKTtcbiAgICAgIGFyZ3NfLmxlbmd0aCA9IGFyZ3NMZW47XG4gICAgICB2YXIgY29udCA9IGNhbWxfY3BzX2Nsb3N1cmUoXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fZGlyZWN0KGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fY3BzKGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdmFyIGsgPSBhcmdzW2FyZ3NMZW5dO1xuICAgICAgY29udC5sID0gZDtcbiAgICAgIGNvbnQuY3BzLmwgPSBkICsgMTtcbiAgICAgIHJldHVybiBrKGNvbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2NhbWxfY2FsbF9nZW5fZGlyZWN0LCBjYW1sX2NhbGxfZ2VuX2Nwc107XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuX3R1cGxlXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbi8vV2Vha2RlZlxudmFyIGNhbWxfY2FsbF9nZW4gPSBjYW1sX2NhbGxfZ2VuX3R1cGxlWzBdO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX2Nwc1xuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlbl90dXBsZVxuLy9JZjogZWZmZWN0c1xuLy9JZjogZG91YmxldHJhbnNsYXRlXG4vL1dlYWtkZWZcbnZhciBjYW1sX2NhbGxfZ2VuX2NwcyA9IGNhbWxfY2FsbF9nZW5fdHVwbGVbMV07XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmFtZWRfdmFsdWVzXG52YXIgY2FtbF9uYW1lZF92YWx1ZXMgPSB7fTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZSAoY29uc3QsbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlKG5tLCB2KSB7XG4gIGNhbWxfbmFtZWRfdmFsdWVzW2NhbWxfanNieXRlc19vZl9zdHJpbmcobm0pXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlc1xuZnVuY3Rpb24gY2FtbF9uYW1lZF92YWx1ZShubSkge1xuICByZXR1cm4gY2FtbF9uYW1lZF92YWx1ZXNbbm1dO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dsb2JhbF9kYXRhXG52YXIgY2FtbF9nbG9iYWxfZGF0YSA9IFswXTtcblxuLy9Qcm92aWRlczogY2FtbF9idWlsZF9zeW1ib2xzXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9idWlsZF9zeW1ib2xzKHN5bWIpIHtcbiAgdmFyIHIgPSB7fTtcbiAgdmFyIG1heCA9IC0xO1xuICBpZiAoc3ltYikge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc3ltYi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkeCA9IHN5bWJbaV1bMl07XG4gICAgICBtYXggPSBNYXRoLm1heChtYXgsIGlkeCk7XG4gICAgICByW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN5bWJbaV1bMV0pXSA9IGlkeDtcbiAgICB9XG4gIH1cbiAgci5uZXh0X2lkeCA9IG1heCArIDE7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3RvcGxldmVsX3JlbG9jXG52YXIganNvb190b3BsZXZlbF9yZWxvYyA9IHVuZGVmaW5lZDtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9nbG9iYWwgKGNvbnN0LCBzaGFsbG93LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfY2FsbGJhY2ssIGNhbWxfYnVpbGRfc3ltYm9sc1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczoganNvb190b3BsZXZlbF9yZWxvY1xuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9nbG9iYWwobiwgdiwgbmFtZV9vcHQpIHtcbiAgaWYgKG5hbWVfb3B0KSB7XG4gICAgdmFyIG5hbWUgPSBuYW1lX29wdDtcbiAgICBpZiAoanNvb190b3BsZXZlbF9yZWxvYykge1xuICAgICAgbiA9IGNhbWxfY2FsbGJhY2soanNvb190b3BsZXZlbF9yZWxvYywgW25hbWVdKTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfZ2xvYmFsX2RhdGEuc3ltYm9scykge1xuICAgICAgaWYgKCFjYW1sX2dsb2JhbF9kYXRhLnN5bWlkeCkge1xuICAgICAgICBjYW1sX2dsb2JhbF9kYXRhLnN5bWlkeCA9IGNhbWxfYnVpbGRfc3ltYm9scyhjYW1sX2dsb2JhbF9kYXRhLnN5bWJvbHMpO1xuICAgICAgfVxuICAgICAgdmFyIG5pZCA9IGNhbWxfZ2xvYmFsX2RhdGEuc3ltaWR4W25hbWVdO1xuICAgICAgaWYgKG5pZCA+PSAwKSBuID0gbmlkO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIFRoZSB1bml0IGlzIHVua25vd24sIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGR5bmxpbmtpbmcgYSBwcmVjb21waWxlZCBqcyxcbiAgICAgICAgLy8gbGV0J3MgYWxsb2NhdGUgYSBmcmVzaCBpZHguXG4gICAgICAgIHZhciBuID0gY2FtbF9nbG9iYWxfZGF0YS5zeW1pZHgubmV4dF9pZHgrKztcbiAgICAgICAgY2FtbF9nbG9iYWxfZGF0YS5zeW1pZHhbbmFtZV0gPSBuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYW1sX2dsb2JhbF9kYXRhW24gKyAxXSA9IHY7XG4gIGlmIChuYW1lX29wdCkgY2FtbF9nbG9iYWxfZGF0YVtuYW1lX29wdF0gPSB2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9nbG9iYWxfZGF0YSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2dldF9nbG9iYWxfZGF0YShfdW5pdCkge1xuICByZXR1cm4gY2FtbF9nbG9iYWxfZGF0YTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19wcmludGFibGUgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9pc19wcmludGFibGUoYykge1xuICByZXR1cm4gKyhjID4gMzEgJiYgYyA8IDEyNyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfcHJpbnRfc3RhdHNcbmZ1bmN0aW9uIGNhbWxfbWF5YmVfcHJpbnRfc3RhdHMoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWJcblxuLy9Qcm92aWRlczogY2FtbF9qc19wdXJlX2V4cHIgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfcHVyZV9leHByKGYpIHtcbiAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgWzBdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9qc19zZXQobywgZiwgdikge1xuICBvW2ZdID0gdjtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2dldCAobXV0YWJsZSwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2dldChvLCBmKSB7XG4gIHJldHVybiBvW2ZdO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19kZWxldGUgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19kZWxldGUobywgZikge1xuICBkZWxldGUgb1tmXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaW5zdGFuY2VvZiAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19pbnN0YW5jZW9mKG8sIGMpIHtcbiAgcmV0dXJuIG8gaW5zdGFuY2VvZiBjID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdHlwZW9mIChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdHlwZW9mKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvO1xufVxuXG4vL1Byb3ZpZGVzOmNhbWxfdHJhbXBvbGluZVxuZnVuY3Rpb24gY2FtbF90cmFtcG9saW5lKHJlcykge1xuICB2YXIgYyA9IDE7XG4gIHdoaWxlIChyZXM/Lmpvb190cmFtcCkge1xuICAgIHJlcyA9IHJlcy5qb29fdHJhbXAuYXBwbHkobnVsbCwgcmVzLmpvb19hcmdzKTtcbiAgICBjKys7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczpjYW1sX3RyYW1wb2xpbmVfcmV0dXJuXG5mdW5jdGlvbiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGYsIGFyZ3MsIGRpcmVjdCkge1xuICByZXR1cm4geyBqb29fdHJhbXA6IGYsIGpvb19hcmdzOiBhcmdzLCBqb29fZGlyZWN0OiBkaXJlY3QgfTtcbn1cblxuLy9Qcm92aWRlczpjYW1sX3N0YWNrX2RlcHRoXG4vL0lmOiBlZmZlY3RzXG52YXIgY2FtbF9zdGFja19kZXB0aCA9IDA7XG5cbi8vUHJvdmlkZXM6Y2FtbF9zdGFja19jaGVja19kZXB0aFxuLy9JZjogZWZmZWN0c1xuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoXG5mdW5jdGlvbiBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoKCkge1xuICByZXR1cm4gLS1jYW1sX3N0YWNrX2RlcHRoID4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsYmFja1xuLy9JZjogIWVmZmVjdHNcbi8vUmVxdWlyZXM6Y2FtbF9jYWxsX2dlblxudmFyIGNhbWxfY2FsbGJhY2sgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG4vL1JlcXVpcmVzOiBjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuLCBjYW1sX3dyYXBfZXhjZXB0aW9uXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vQWxpYXM6IGNhbWxfY3BzX3RyYW1wb2xpbmVcbmZ1bmN0aW9uIGNhbWxfY2FsbGJhY2soZiwgYXJncykge1xuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfY3VycmVudF9zdGFjayA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgam9vX3RyYW1wOiBmLFxuICAgICAgam9vX2FyZ3M6IGFyZ3MuY29uY2F0KGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSksXG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBjYW1sX3N0YWNrX2RlcHRoID0gNDA7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBjYW1sX2NhbGxfZ2VuKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gICAgICAgIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgICAgICAgcmVzID0geyBqb29fdHJhbXA6IGhhbmRsZXIsIGpvb19hcmdzOiBbY2FtbF93cmFwX2V4Y2VwdGlvbihlKV0gfTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChyZXM/Lmpvb19hcmdzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9jdXJyZW50X3N0YWNrID0gc2F2ZWRfY3VycmVudF9zdGFjaztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbnZhciBjYW1sX2NhbGxiYWNrID0gY2FtbF9jYWxsX2dlbjtcblxuLy9Qcm92aWRlczogY2FtbF9pc19qc1xuZnVuY3Rpb24gY2FtbF9pc19qcygpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZyhfdW5pdCkge1xuICByZXR1cm4gRkxBRyhcInVzZS1qcy1zdHJpbmdcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc19lZmZlY3RzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHMoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKENPTkZJRyhcImVmZmVjdHNcIikpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dyYXBfZXhjZXB0aW9uIGNvbnN0IChtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSxjYW1sX3N0cmluZ19vZl9qc3N0cmluZyxjYW1sX25hbWVkX3ZhbHVlXG5mdW5jdGlvbiBjYW1sX3dyYXBfZXhjZXB0aW9uKGUpIHtcbiAgaWYgKEZMQUcoXCJleGN3cmFwXCIpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHJldHVybiBlO1xuICAgIHZhciBleG47XG4gICAgLy9TdGFja19vdmVyZmxvdzogY2hyb21lLCBzYWZhcmlcbiAgICBpZiAoXG4gICAgICBnbG9iYWxUaGlzLlJhbmdlRXJyb3IgJiZcbiAgICAgIGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLlJhbmdlRXJyb3IgJiZcbiAgICAgIGUubWVzc2FnZSAmJlxuICAgICAgZS5tZXNzYWdlLm1hdGNoKC9tYXhpbXVtIGNhbGwgc3RhY2svaSlcbiAgICApXG4gICAgICBleG4gPSBjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93O1xuICAgIC8vU3RhY2tfb3ZlcmZsb3c6IGZpcmVmb3hcbiAgICBlbHNlIGlmIChcbiAgICAgIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvciAmJlxuICAgICAgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvciAmJlxuICAgICAgZS5tZXNzYWdlICYmXG4gICAgICBlLm1lc3NhZ2UubWF0Y2goL3RvbyBtdWNoIHJlY3Vyc2lvbi9pKVxuICAgIClcbiAgICAgIGV4biA9IGNhbWxfZ2xvYmFsX2RhdGEuU3RhY2tfb3ZlcmZsb3c7XG4gICAgLy9XcmFwIEVycm9yIGluIEpzLkVycm9yIGV4Y2VwdGlvblxuICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkVycm9yICYmIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpKVxuICAgICAgZXhuID0gWzAsIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpLCBlXTtcbiAgICAvL2ZhbGxiYWNrOiB3cmFwcGVkIGluIEZhaWx1cmVcbiAgICBlbHNlXG4gICAgICBleG4gPSBbMCwgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhTdHJpbmcoZSkpXTtcbiAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXJyb3IgYXQgaGFuZCwgbGV0J3MgdXNlIGl0LlxuICAgIGlmIChlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5FcnJvcikgZXhuLmpzX2Vycm9yID0gZTtcbiAgICByZXR1cm4gZXhuO1xuICB9IGVsc2UgcmV0dXJuIGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZ1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuZnVuY3Rpb24gY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKGV4biwgZm9yY2UpIHtcbiAgLy8gQmFja3RyYWNlcyBhcmUgdmVyeSBleHBlbnNpdmUsIHdlIG9ubHkgZW5hYmxlIHRoZW0gd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZFxuICAvLyBhdCBjb21waWxlLXRpbWUgKC0tZW5hYmxlIHdpdGgtanMtZXJyb3IpIG9yIGF0IHN0YXJ0dXAgd2l0aCBPQ0FNTFJVTlBBUkFNPWI9MS5cbiAgLy8gTGlicmFyaWVzIHN1Y2ggYXMgQmFzZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlIGJhY2t0cmFjZXMgKHByb2dyYW1tYXRpY2FsbHkpIGJ1dFxuICAvLyBpdCdzIHdheSB0byBzbG93LiBIZXJlLCB3ZSBmb3JjZSB0aGUgZW5kLXVzZXIgdG8gb3B0LWluIHRvIGJhY2t0cmFjZXMuXG4gIGlmIChjYW1sX3JlY29yZF9iYWNrdHJhY2VfZW52X2ZsYWcgJiYgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZylcbiAgICByZXR1cm4gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSk7XG4gIGVsc2UgcmV0dXJuIGV4bjtcbn1cblxuLy8gRXhwZXJpbWVudGFsXG4vL1Byb3ZpZGVzOiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSkge1xuICAvL25ldmVyIHJlcmFpc2UgZm9yIGNvbnN0YW50IGV4blxuICBpZiAoIWV4bi5qc19lcnJvciB8fCBmb3JjZSB8fCBleG5bMF0gPT09IDI0OClcbiAgICBleG4uanNfZXJyb3IgPSBuZXcgZ2xvYmFsVGhpcy5FcnJvcihcIkpzIGV4Y2VwdGlvbiBjb250YWluaW5nIGJhY2t0cmFjZVwiKTtcbiAgcmV0dXJuIGV4bjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb24oZXhuKSB7XG4gIGlmIChleG4uanNfZXJyb3IpIHtcbiAgICByZXR1cm4gWzAsIGV4bi5qc19lcnJvcl07XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdGhyb3dfanNfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX3Rocm93X2pzX2V4Y2VwdGlvbihleG4pIHtcbiAgdGhyb3cgZXhuO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fYm9vbCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fYm9vbCh4KSB7XG4gIHJldHVybiAhIXg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19ib29sKHgpIHtcbiAgcmV0dXJuICt4O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2Zsb2F0IGNvbnN0IChjb25zdClcbi8vQWxpYXM6IGNhbWxfanNfZnJvbV9pbnQzMlxuLy9BbGlhczogY2FtbF9qc19mcm9tX25hdGl2ZWludFxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Zsb2F0IGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdG9fZmxvYXQoeCkge1xuICByZXR1cm4geDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9faW50MzIgY29uc3QgKGNvbnN0KVxuLy9BbGlhczogY2FtbF9qc190b19uYXRpdmVpbnRcbmZ1bmN0aW9uIGNhbWxfanNfdG9faW50MzIoeCkge1xuICByZXR1cm4geCB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9hcnJheSBtdXRhYmxlIChzaGFsbG93KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2FycmF5KGEpIHtcbiAgcmV0dXJuIGEuc2xpY2UoMSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2FycmF5IG11dGFibGUgKHNoYWxsb3cpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2FycmF5KGEpIHtcbiAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4gKyAxKTtcbiAgYlswXSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGJbaSArIDFdID0gYVtpXTtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGlzdF9vZl9qc19hcnJheSBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGlzdF9vZl9qc19hcnJheShhKSB7XG4gIHZhciBsID0gMDtcbiAgZm9yICh2YXIgaSA9IGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZSA9IGFbaV07XG4gICAgbCA9IFswLCBlLCBsXTtcbiAgfVxuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9saXN0X3RvX2pzX2FycmF5IGNvbnN0IChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9saXN0X3RvX2pzX2FycmF5KGwpIHtcbiAgdmFyIGEgPSBbXTtcbiAgZm9yICg7IGwgIT09IDA7IGwgPSBsWzJdKSB7XG4gICAgYS5wdXNoKGxbMV0pO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3ZhciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc192YXIoeCkge1xuICB2YXIgeCA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHgpO1xuICAvL0NoZWNrcyB0aGF0IHggaGFzIHRoZSBmb3JtIGlkZW50Wy5pZGVudF0qXG4gIGlmICgheC5tYXRjaCgvXlthLXpBLVpfJF1bYS16QS1aXyQwLTldKihcXC5bYS16QS1aXyRdW2EtekEtWl8kMC05XSopKiQvKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAnY2FtbF9qc192YXI6IFwiJyArXG4gICAgICAgIHggK1xuICAgICAgICAnXCIgaXMgbm90IGEgdmFsaWQgSmF2YVNjcmlwdCB2YXJpYWJsZS4gY29udGludWluZyAuLicsXG4gICAgKTtcbiAgICAvL2NvbnNvbGUuZXJyb3IoXCJKcy5VbnNhZmUuZXZhbF9zdHJpbmdcIilcbiAgfVxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6XG4gIHJldHVybiBldmFsPy4oeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2NhbGwgKGNvbnN0LCBtdXRhYmxlLCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX2NhbGwoZiwgbywgYXJncykge1xuICByZXR1cm4gZi5hcHBseShvLCBjYW1sX2pzX2Zyb21fYXJyYXkoYXJncykpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5fY2FsbCAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfZnVuX2NhbGwoZiwgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGYoKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZihhWzFdKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdKTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdKTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShudWxsLCBjYW1sX2pzX2Zyb21fYXJyYXkoYSkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19tZXRoX2NhbGwgKG11dGFibGUsIGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19tZXRoX2NhbGwobywgZiwgYXJncykge1xuICByZXR1cm4gb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhmKV0uYXBwbHkobywgY2FtbF9qc19mcm9tX2FycmF5KGFyZ3MpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfbmV3IChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19uZXcoYywgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIG5ldyBjKCk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0pO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBuZXcgYyhhWzFdLCBhWzJdKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gbmV3IGMoYVsxXSwgYVsyXSwgYVszXSk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0sIGFbMl0sIGFbM10sIGFbNF0pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBuZXcgYyhhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gbmV3IGMoYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSk7XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10pO1xuICB9XG4gIGZ1bmN0aW9uIEYoKSB7XG4gICAgcmV0dXJuIGMuYXBwbHkodGhpcywgY2FtbF9qc19mcm9tX2FycmF5KGEpKTtcbiAgfVxuICBGLnByb3RvdHlwZSA9IGMucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEYoKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfb2pzX25ld19hcnIgKGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX29qc19uZXdfYXJyKGMsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBuZXcgYygpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gbmV3IGMoYVswXSwgYVsxXSk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMF0sIGFbMV0sIGFbMl0pO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gbmV3IGMoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0pO1xuICAgIGNhc2UgNzpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdKTtcbiAgfVxuICBmdW5jdGlvbiBGKCkge1xuICAgIHJldHVybiBjLmFwcGx5KHRoaXMsIGEpO1xuICB9XG4gIEYucHJvdG90eXBlID0gYy5wcm90b3R5cGU7XG4gIHJldHVybiBuZXcgRigpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXJncyA9IFt1bmRlZmluZWRdO1xuICAgIH1cbiAgICB2YXIgcmVzID0gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBjYW1sX2pzX3dyYXBfY2FsbGJhY2socmVzKSA6IHJlcztcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1xuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50cyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIFthcmdzXSk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGFyZ3MubGVuZ3RoID0gYXJpdHk7XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICB2YXIgbGVuID0gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKTtcbiAgICBhcmdzLmxlbmd0aCA9IGxlbjtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfd3JhcF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2soZikge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gICAgcmV0dXJuIHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gY2FtbF9qc193cmFwX2NhbGxiYWNrKHJlcykgOiByZXM7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgW3RoaXMsIGFyZ3NdKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGFyZ3MubGVuZ3RoID0gYXJpdHk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpO1xuICB9O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIHZhciBsZW4gPSBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICBhcmdzLmxlbmd0aCA9IGxlbjtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuLy9JZjogIWVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gZi5sID49IDAgPyBmLmwgOiAoZi5sID0gZi5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gZi5sID49IDAgPyBmLmwgOiAoZi5sID0gZi5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG5mdW5jdGlvbiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpIHtcbiAgLy8gRnVuY3Rpb25zIGhhdmUgYW4gYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFyYW1ldGVyLiBUaGlzIHNob3VsZFxuICAvLyBub3QgYmUgdmlzaWJsZSB3aGVuIGNhbGxpbmcgdGhlbSBmcm9tIEphdmFTY3JpcHRcbiAgcmV0dXJuIChmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCkpIC0gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19lcXVhbHMoeCwgeSkge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRG91YmxlRXF1YWxzOlxuICByZXR1cm4gKyh4ID09IHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3N0cmljdF9lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19zdHJpY3RfZXF1YWxzKHgsIHkpIHtcbiAgcmV0dXJuICsoeCA9PT0geSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXZhbF9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXZhbF9zdHJpbmcocykge1xuICAvLyBVc2VzIGFuIGluZGlyZWN0IGV2YWwgdGhyb3VnaCB0aGUgb3B0aW9uYWwgY2hhaW5pbmcgb3BlcmF0b3IuXG4gIC8vIChzZWUgaHR0cHM6Ly9tZG4uZGV2L2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2V2YWwpXG4gIC8vIFRoaXMgaXMgZmFzdGVyIGFuZCBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlcy5cbiAgLy8gQWxzbyBwcmVwZW5kcyBgXCJ1c2Ugc3RyaWN0XCJgIGRpcmVjdGl2ZSBzaW5jZSB0aGlzIGlzIG5vdCBpbmhlcml0ZWRcbiAgLy8gZnJvbSB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uIHdpdGggYW4gaW5kaXJlY3QgZXZhbC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsnICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2V4cHIgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXhwcihzKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJjYW1sX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgLy8gV2UgYWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHRoZSBhbWJpZ3VpdHkgYmV0d2VlbiBleHByZXNzaW9uc1xuICAvLyBhbmQgc3RhdGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHdlIGFjY2VwdCBpbnZhbGlkIGlucHV0cyBsaWtlXG4gIC8vIFwiYSkoYlwiLCBidXQgdGhpcyBpcyB1bmxpa2VseSB0byBiZSBhbiBpc3N1ZSBpbiBwcmFjdGljZS5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsoJyArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpICsgXCIpXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3B1cmVfanNfZXhwciBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9wdXJlX2pzX2V4cHIocykge1xuICBjb25zb2xlLmVycm9yKFwiY2FtbF9wdXJlX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsoJyArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpICsgXCIpXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX29iamVjdCAob2JqZWN0X2xpdGVyYWwpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19vYmplY3QoYSkge1xuICB2YXIgbyA9IHt9O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IGFbaV07XG4gICAgb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwWzFdKV0gPSBwWzJdO1xuICB9XG4gIHJldHVybiBvO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9SYWlzZSBleGNlcHRpb25cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9jb25zdGFudCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2NvbnN0YW50KHRhZykge1xuICB0aHJvdyB0YWc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJnKHRhZywgYXJnKSB7XG4gIHRocm93IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShbMCwgdGFnLCBhcmddKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX2FyZ3MgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJncyh0YWcsIGFyZ3MpIHtcbiAgdGhyb3cgY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKFswLCB0YWddLmNvbmNhdChhcmdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcodGFnLCBtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyh0YWcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmFpbHdpdGggKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9mYWlsd2l0aChtc2cpIHtcbiAgaWYgKCFjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUpXG4gICAgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlID0gWzI0OCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkZhaWx1cmVcIiksIC0zXTtcbiAgY2FtbF9yYWlzZV93aXRoX3N0cmluZyhjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUsIG1zZyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2ludmFsaWRfYXJndW1lbnQobXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5JbnZhbGlkX2FyZ3VtZW50LCBtc2cpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRW5kX29mX2ZpbGUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRGl2aXNpb25fYnlfemVybyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vdF9mb3VuZCgpIHtcbiAgY2FtbF9yYWlzZV9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLk5vdF9mb3VuZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXR0aW1lb2ZkYXlcbi8vQWxpYXM6IHVuaXhfZ2V0dGltZW9mZGF5XG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0dGltZW9mZGF5KCkge1xuICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdGltZVxuLy9SZXF1aXJlczogY2FtbF91bml4X2dldHRpbWVvZmRheVxuLy9BbGlhczogdW5peF90aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZSgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoY2FtbF91bml4X2dldHRpbWVvZmRheSgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3RpbWVzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3RpbWVzXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZXMoKSB7XG4gIGlmIChnbG9iYWxUaGlzLnByb2Nlc3M/LmNwdVVzYWdlKSB7XG4gICAgdmFyIHQgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3B1VXNhZ2UoKTtcbiAgICByZXR1cm4gQkxPQ0soMCwgdC51c2VyIC8gMWU2LCB0LnN5c3RlbSAvIDFlNiwgMCwgMCk7XG4gIH0gZWxzZSBpZiAoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZT8ubm93KSB7XG4gICAgcmV0dXJuIEJMT0NLKDAsIGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwLCAwLCAwLCAwKTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RpbWVzOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dtdGltZVxuLy9BbGlhczogdW5peF9nbXRpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF9nbXRpbWUodCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSBuZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksIDAsIDEpKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIGQuZ2V0VVRDTWludXRlcygpLFxuICAgIGQuZ2V0VVRDSG91cnMoKSxcbiAgICBkLmdldFVUQ0RhdGUoKSxcbiAgICBkLmdldFVUQ01vbnRoKCksXG4gICAgZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCxcbiAgICBkLmdldFVUQ0RheSgpLFxuICAgIGRveSxcbiAgICBmYWxzZSB8IDAgLyogZm9yIFVUQyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaXMgZmFsc2UgKi8sXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbG9jYWx0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbG9jYWx0aW1lKHQpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSh0ICogMTAwMCk7XG4gIHZhciBkX251bSA9IGQuZ2V0VGltZSgpO1xuICB2YXIgamFudWFyeWZpcnN0ID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHZhciBqYW4gPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICB2YXIganVsID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCA2LCAxKTtcbiAgdmFyIHN0ZFRpbWV6b25lT2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgamFuLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAganVsLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICk7XG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGQuZ2V0U2Vjb25kcygpLFxuICAgIGQuZ2V0TWludXRlcygpLFxuICAgIGQuZ2V0SG91cnMoKSxcbiAgICBkLmdldERhdGUoKSxcbiAgICBkLmdldE1vbnRoKCksXG4gICAgZC5nZXRGdWxsWWVhcigpIC0gMTkwMCxcbiAgICBkLmdldERheSgpLFxuICAgIGRveSxcbiAgICAoZC5nZXRUaW1lem9uZU9mZnNldCgpIDwgc3RkVGltZXpvbmVPZmZzZXQpIHxcbiAgICAgIDAgLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lICBmaWVsZC4gKi8sXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta3RpbWVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbWt0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbWt0aW1lKHRtKSB7XG4gIHZhciBkID0gbmV3IERhdGUodG1bNl0gKyAxOTAwLCB0bVs1XSwgdG1bNF0sIHRtWzNdLCB0bVsyXSwgdG1bMV0pLmdldFRpbWUoKTtcbiAgdmFyIHQgPSBNYXRoLmZsb29yKGQgLyAxMDAwKTtcbiAgdmFyIHRtMiA9IGNhbWxfdW5peF9sb2NhbHRpbWUodCk7XG4gIHJldHVybiBCTE9DSygwLCB0LCB0bTIpO1xufVxuLy9Qcm92aWRlczogY2FtbF91bml4X3N0YXJ0dXAgY29uc3Rcbi8vQWxpYXM6IHdpbl9zdGFydHVwXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3RhcnR1cCgpIHt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9jbGVhbnVwIGNvbnN0XG4vL0FsaWFzOiB3aW5fY2xlYW51cFxuZnVuY3Rpb24gY2FtbF91bml4X2NsZWFudXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkIGNvbnN0XG4vL0FsaWFzOiB3aW5faGFuZGxlX2ZkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZVxuLy9BbGlhczogdW5peF9pc2F0dHlcbmZ1bmN0aW9uIGNhbWxfdW5peF9pc2F0dHkoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQpO1xuICBpZiAoIWZpbGUuaXNhdHR5KSByZXR1cm4gMDtcbiAgcmV0dXJuIGZpbGUuaXNhdHR5KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vQWxpYXM6IHVuaXhfaXNhdHR5XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3VuaXhfaXNhdHR5KF9maWxlRGVzY3JpcHRvcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogdW5peF9lcnJvclxudmFyIHVuaXhfZXJyb3IgPSBbXG4gIC8qID09PVVuaXguZXJyb3I9PT1cbiAgICpcbiAgICogVGhpcyBhcnJheSBpcyBpbiBvcmRlciBvZiB0aGUgdmFyaWFudCBpbiBPQ2FtbFxuICAgKi9cbiAgXCJFMkJJR1wiLFxuICBcIkVBQ0NFU1wiLFxuICBcIkVBR0FJTlwiLFxuICBcIkVCQURGXCIsXG4gIFwiRUJVU1lcIixcbiAgXCJFQ0hJTERcIixcbiAgXCJFREVBRExLXCIsXG4gIFwiRURPTVwiLFxuICBcIkVFWElTVFwiLFxuICBcIkVGQVVMVFwiLFxuICBcIkVGQklHXCIsXG4gIFwiRUlOVFJcIixcbiAgXCJFSU5WQUxcIixcbiAgXCJFSU9cIixcbiAgXCJFSVNESVJcIixcbiAgXCJFTUZJTEVcIixcbiAgXCJFTUxJTktcIixcbiAgXCJFTkFNRVRPT0xPTkdcIixcbiAgXCJFTkZJTEVcIixcbiAgXCJFTk9ERVZcIixcbiAgXCJFTk9FTlRcIixcbiAgXCJFTk9FWEVDXCIsXG4gIFwiRU5PTENLXCIsXG4gIFwiRU5PTUVNXCIsXG4gIFwiRU5PU1BDXCIsXG4gIFwiRU5PU1lTXCIsXG4gIFwiRU5PVERJUlwiLFxuICBcIkVOT1RFTVBUWVwiLFxuICBcIkVOT1RUWVwiLFxuICBcIkVOWElPXCIsXG4gIFwiRVBFUk1cIixcbiAgXCJFUElQRVwiLFxuICBcIkVSQU5HRVwiLFxuICBcIkVST0ZTXCIsXG4gIFwiRVNQSVBFXCIsXG4gIFwiRVNSQ0hcIixcbiAgXCJFWERFVlwiLFxuICBcIkVXT1VMREJMT0NLXCIsXG4gIFwiRUlOUFJPR1JFU1NcIixcbiAgXCJFQUxSRUFEWVwiLFxuICBcIkVOT1RTT0NLXCIsXG4gIFwiRURFU1RBRERSUkVRXCIsXG4gIFwiRU1TR1NJWkVcIixcbiAgXCJFUFJPVE9UWVBFXCIsXG4gIFwiRU5PUFJPVE9PUFRcIixcbiAgXCJFUFJPVE9OT1NVUFBPUlRcIixcbiAgXCJFU09DS1ROT1NVUFBPUlRcIixcbiAgXCJFT1BOT1RTVVBQXCIsXG4gIFwiRVBGTk9TVVBQT1JUXCIsXG4gIFwiRUFGTk9TVVBQT1JUXCIsXG4gIFwiRUFERFJJTlVTRVwiLFxuICBcIkVBRERSTk9UQVZBSUxcIixcbiAgXCJFTkVURE9XTlwiLFxuICBcIkVORVRVTlJFQUNIXCIsXG4gIFwiRU5FVFJFU0VUXCIsXG4gIFwiRUNPTk5BQk9SVEVEXCIsXG4gIFwiRUNPTk5SRVNFVFwiLFxuICBcIkVOT0JVRlNcIixcbiAgXCJFSVNDT05OXCIsXG4gIFwiRU5PVENPTk5cIixcbiAgXCJFU0hVVERPV05cIixcbiAgXCJFVE9PTUFOWVJFRlNcIixcbiAgXCJFVElNRURPVVRcIixcbiAgXCJFQ09OTlJFRlVTRURcIixcbiAgXCJFSE9TVERPV05cIixcbiAgXCJFSE9TVFVOUkVBQ0hcIixcbiAgXCJFTE9PUFwiLFxuICBcIkVPVkVSRkxPV1wiLFxuXTtcblxuLy9Qcm92aWRlczogbWFrZV91bml4X2Vycl9hcmdzXG4vL1JlcXVpcmVzOiB1bml4X2Vycm9yLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIHN5c2NhbGwsIHBhdGgsIGVycm5vKSB7XG4gIHZhciB2YXJpYW50ID0gdW5peF9lcnJvci5pbmRleE9mKGNvZGUpO1xuICBpZiAodmFyaWFudCA8IDApIHtcbiAgICAvLyBEZWZhdWx0IGlmIHVuZGVmaW5lZFxuICAgIGlmIChlcnJubyA9PSBudWxsKSB7XG4gICAgICBlcnJubyA9IC05OTk5O1xuICAgIH1cbiAgICAvLyBJZiBub25lIG9mIHRoZSBhYm92ZSB2YXJpYW50cywgZmFsbGJhY2sgdG8gRVVOS05PV05FUlIoaW50KVxuICAgIC8vIGVycm5vIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlXG4gICAgdmFyaWFudCA9IEJMT0NLKDAsIC1lcnJubyk7XG4gIH1cbiAgdmFyIGFyZ3MgPSBbXG4gICAgdmFyaWFudCxcbiAgICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhzeXNjYWxsIHx8IFwiXCIpLFxuICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHBhdGggfHwgXCJcIiksXG4gIF07XG4gIHJldHVybiBhcmdzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmVycm9yXG4vL1JlcXVpcmVzOiB1bml4X2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N0cmVycm9yKGVycm5vKSB7XG4gIGNvbnN0IHV0aWwgPSByZXF1aXJlKFwibm9kZTp1dGlsXCIpO1xuICBpZiAoZXJybm8gPj0gMCkge1xuICAgIGNvbnN0IGNvZGUgPSB1bml4X2Vycm9yW2Vycm5vXTtcbiAgICByZXR1cm4gdXRpbFxuICAgICAgLmdldFN5c3RlbUVycm9yTWFwKClcbiAgICAgIC5lbnRyaWVzKClcbiAgICAgIC5maW5kKCh4KSA9PiB4WzFdWzBdID09PSBjb2RlKVsxXVsxXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdXRpbC5nZXRTeXN0ZW1FcnJvck1lc3NhZ2UoZXJybm8pO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyZXJyb3Jcbi8vUmVxdWlyZXM6IHVuaXhfZXJyb3Jcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3RyZXJyb3IoZXJybm8pIHtcbiAgY29uc3QgY29kZSA9IHVuaXhfZXJyb3JbZXJybm9dO1xuICByZXR1cm4gY29kZSB8fCBcIlVua25vd24gZXJyb3IgXCIgKyBlcnJubztcbn1cblxuLy9Qcm92aWRlczogdW5peF9lcnJvcl9tZXNzYWdlXG4vL0FsaWFzOiBjYW1sX3VuaXhfZXJyb3JfbWVzc2FnZVxuLy9SZXF1aXJlczogY2FtbF9zdHJlcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIHVuaXhfZXJyb3JfbWVzc2FnZShlcnIpIHtcbiAgY29uc3QgZXJybm8gPSB0eXBlb2YgZXJyID09PSBcIm51bWJlclwiID8gZXJyIDogLWVyclsxXTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNhbWxfc3RyZXJyb3IoZXJybm8pKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NoZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19jaGRpclxuLy9BbGlhczogdW5peF9jaGRpclxuZnVuY3Rpb24gY2FtbF91bml4X2NoZGlyKGRpcikge1xuICByZXR1cm4gY2FtbF9zeXNfY2hkaXIoZGlyLCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChcbiAgICByb290LnJlc3QsXG4gICAgLyogbGFyZ2UgKi8gZmFsc2UsXG4gICAgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdF82NFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdF82NFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXRfNjQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXRfNjQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChcbiAgICByb290LnJlc3QsXG4gICAgLyogbGFyZ2UgKi8gdHJ1ZSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KFxuICAgIHJvb3QucmVzdCxcbiAgICAvKiBsYXJnZSAqLyBmYWxzZSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdF82NFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRfNjRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdF82NChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0XzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KFxuICAgIHJvb3QucmVzdCxcbiAgICAvKiBsYXJnZSAqLyB0cnVlLFxuICAgIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NobW9kXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9jaG1vZFxuZnVuY3Rpb24gY2FtbF91bml4X2NobW9kKG5hbWUsIHBlcm1zKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UuY2htb2QpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2NobW9kOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmNobW9kKHJvb3QucmVzdCwgcGVybXMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVuYW1lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3Jcbi8vQWxpYXM6IHVuaXhfcmVuYW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVuYW1lKG8sIG4pIHtcbiAgdmFyIG9fcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG8pO1xuICB2YXIgbl9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobik7XG4gIGlmIChvX3Jvb3QuZGV2aWNlICE9PSBuX3Jvb3QuZGV2aWNlKVxuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gMSwgXCJFWERFVlwiLCBcInJlbmFtZVwiKTtcbiAgaWYgKCFvX3Jvb3QuZGV2aWNlLnJlbmFtZSkgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogbm90IGltcGxlbWVudGVkXCIpO1xuICBvX3Jvb3QuZGV2aWNlLnJlbmFtZShvX3Jvb3QucmVzdCwgbl9yb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbWtkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9ta2RpcihuYW1lLCBwZXJtKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubWtkaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X21rZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLm1rZGlyKHJvb3QucmVzdCwgcGVybSwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JtZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9ybWRpclxuZnVuY3Rpb24gY2FtbF91bml4X3JtZGlyKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5ybWRpcikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfcm1kaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uucm1kaXIocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG4vL0FsaWFzOiB1bml4X2xpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9saW5rKGZvbGxvdywgc3JjLCBkc3QpIHtcbiAgdmFyIHNyY19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uoc3JjKTtcbiAgdmFyIGRzdF9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2UoZHN0KTtcbiAgaWYgKCFzcmNfcm9vdC5kZXZpY2UubGluaykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfbGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIC8vIFdlIGNhbid0IGNvbnRyb2wgd2hldGhlciBhICdzcmMnIHN5bWxpbmsgaXMgZm9sbG93ZWQgb3Igbm90LlxuICAvLyBTbyB3ZSBmYWlsIHdoZW4gJ2ZvbGxvdycgaXMgc2V0LCBhcyBkb2N1bWVudGVkIGluIHRoZSBVbml4IG1vZHVsZS5cbiAgaWYgKHR5cGVvZiBmb2xsb3cgIT09IFwibnVtYmVyXCIpXG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoLyogcmFpc2UgVW5peF9lcnJvciAqLyAxLCBcIkVOT1NZU1wiLCBcImxpbmtcIik7XG4gIGlmIChzcmNfcm9vdC5kZXZpY2UgIT09IGRzdF9yb290LmRldmljZSlcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRVhERVZcIiwgXCJsaW5rXCIpO1xuICByZXR1cm4gc3JjX3Jvb3QuZGV2aWNlLmxpbmsoXG4gICAgc3JjX3Jvb3QucmVzdCxcbiAgICBkc3Rfcm9vdC5yZXN0LFxuICAgIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3N5bWxpbmtcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9BbGlhczogdW5peF9zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3ltbGluayh0b19kaXIsIHNyYywgZHN0KSB7XG4gIHZhciBkc3Rfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKGRzdCk7XG4gIGlmICghZHN0X3Jvb3QuZGV2aWNlLnN5bWxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N5bWxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gZHN0X3Jvb3QuZGV2aWNlLnN5bWxpbmsoXG4gICAgdG9fZGlyLFxuICAgIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHNyYyksXG4gICAgZHN0X3Jvb3QucmVzdCxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9yZWFkbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfcmVhZGxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkbGluayhuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVhZGxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3JlYWRsaW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnJlYWRsaW5rKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3VubGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfdW5saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfdW5saW5rKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS51bmxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3VubGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdXRpbWVzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF91dGltZXNcbmZ1bmN0aW9uIGNhbWxfdW5peF91dGltZXMobmFtZSwgYXRpbWUsIG10aW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudXRpbWVzKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF91dGltZXM6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByb290LmRldmljZS51dGltZXMocm9vdC5yZXN0LCBhdGltZSwgbXRpbWUsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdHJ1bmNhdGVcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3RydW5jYXRlXG5mdW5jdGlvbiBjYW1sX3VuaXhfdHJ1bmNhdGUobmFtZSwgbGVuKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudHJ1bmNhdGUpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RydW5jYXRlOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UudHJ1bmNhdGUocm9vdC5yZXN0LCBsZW4sIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdHJ1bmNhdGVfNjRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2ludDY0X3RvX2Zsb2F0XG4vL0FsaWFzOiB1bml4X3RydW5jYXRlXzY0XG5mdW5jdGlvbiBjYW1sX3VuaXhfdHJ1bmNhdGVfNjQobmFtZSwgbGVuKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudHJ1bmNhdGUpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RydW5jYXRlXzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UudHJ1bmNhdGUoXG4gICAgcm9vdC5yZXN0LFxuICAgIGNhbWxfaW50NjRfdG9fZmxvYXQobGVuKSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfYWNjZXNzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9hY2Nlc3NcbmZ1bmN0aW9uIGNhbWxfdW5peF9hY2Nlc3MobmFtZSwgZmxhZ3MpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnIgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZi53ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGYueCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBmLmYgPSAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmxhZ3MgPSBmbGFnc1syXTtcbiAgfVxuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLmFjY2Vzcykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfYWNjZXNzOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UuYWNjZXNzKHJvb3QucmVzdCwgZiwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9vcGVuXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9zeXNfZmRzLCBNbENoYW5pZFxuLy9BbGlhczogdW5peF9vcGVuXG5mdW5jdGlvbiBjYW1sX3VuaXhfb3BlbihuYW1lLCBmbGFncywgcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnJkb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmLndyb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmLnJkd3IgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgZi5ub25ibG9jayA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBmLmFwcGVuZCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgICBmLmNyZWF0ZSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICBmLnRydW5jYXRlID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGYuZXhjbCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBmLm5vY3R0eSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5OlxuICAgICAgICBmLmRzeW5jID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBmLnN5bmMgPSAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmxhZ3MgPSBmbGFnc1syXTtcbiAgfVxuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgZmlsZSA9IHJvb3QuZGV2aWNlLm9wZW4ocm9vdC5yZXN0LCBmLCBwZXJtcywgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgdmFyIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gIHZhciBjaGFuaWQgPSBuZXcgTWxDaGFuaWQoaWR4KTtcbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSB7IGZpbGU6IGZpbGUsIGNoYW5pZDogY2hhbmlkIH07XG4gIHJldHVybiBpZHggfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2ZkcywgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3JcbmZ1bmN0aW9uIGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgY21kKSB7XG4gIHZhciBmZF9kZXNjID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKGZkX2Rlc2MgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgY21kKTtcbiAgcmV0dXJuIGZkX2Rlc2MuZmlsZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZzdGF0XG4vL0FsaWFzOiB1bml4X2ZzdGF0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfdW5peF9mc3RhdChmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmc3RhdFwiKTtcbiAgaWYgKCFmaWxlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3RhdCgvKiBsYXJnZSAqLyBmYWxzZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9mc3RhdF82NFxuLy9BbGlhczogdW5peF9mc3RhdF82NFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX3VuaXhfZnN0YXRfNjQoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiZnN0YXRcIik7XG4gIGlmICghZmlsZS5zdGF0KSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9mc3RhdDY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3RhdCgvKiBsYXJnZSAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZjaG1vZFxuLy9BbGlhczogdW5peF9mY2htb2Rcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF91bml4X2ZjaG1vZChmZCwgcGVybXMpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiZmNobW9kXCIpO1xuICBpZiAoIWZpbGUuY2htb2QpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZjaG1vZDogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiBmaWxlLmNobW9kKHBlcm1zKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZzeW5jXG4vL0FsaWFzOiB1bml4X2ZzeW5jXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfdW5peF9mc3luYyhmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmc3luY1wiKTtcbiAgaWYgKCFmaWxlLnN5bmMpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZzeW5jOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3luYygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfd3JpdGVcbi8vQWxpYXM6IHVuaXhfd3JpdGVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF91bml4X3dyaXRlKGZkLCBidWYsIHBvcywgbGVuKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcIndyaXRlXCIpO1xuICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgdmFyIHdyaXR0ZW4gPSAwO1xuICB3aGlsZSAobGVuID4gMCkge1xuICAgIHZhciBuID0gZmlsZS53cml0ZShhLCBwb3MsIGxlbiwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbiAgICB3cml0dGVuICs9IG47XG4gICAgcG9zICs9IG47XG4gICAgbGVuIC09IG47XG4gIH1cbiAgcmV0dXJuIHdyaXR0ZW47XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zaW5nbGVfd3JpdGVcbi8vQWxpYXM6IHVuaXhfc2luZ2xlX3dyaXRlXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfdW5peF9zaW5nbGVfd3JpdGUoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwid3JpdGVcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICByZXR1cm4gZmlsZS53cml0ZShcbiAgICBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZiksXG4gICAgcG9zLFxuICAgIGxlbixcbiAgICAvKiByYWlzZSB1bml4X2Vycm9yICovIDEsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF93cml0ZV9iaWdhcnJheVxuLy9BbGlhczogY2FtbF91bml4X2xvb2t1cF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5LCBjYW1sX3VuaXhfbG9va3VwX2ZpbGVcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX3VuaXhfd3JpdGVfYmlnYXJyYXkoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGEgPSBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJ1Zik7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcIndyaXRlXCIpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdoaWxlIChsZW4gPiAwKSB7XG4gICAgdmFyIG4gPSBmaWxlLndyaXRlKGEsIHBvcywgbGVuLCAvKiByYWlzZSB1bml4X2Vycm9yICovIDEpO1xuICAgIHdyaXR0ZW4gKz0gbjtcbiAgICBwb3MgKz0gbjtcbiAgICBsZW4gLT0gbjtcbiAgfVxuICByZXR1cm4gd3JpdHRlbjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRcbi8vQWxpYXM6IHVuaXhfcmVhZFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVhZChmZCwgYnVmLCBwb3MsIGxlbikge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJyZWFkXCIpO1xuICByZXR1cm4gZmlsZS5yZWFkKFxuICAgIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKSxcbiAgICBwb3MsXG4gICAgbGVuLFxuICAgIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRfYmlnYXJyYXlcbi8vQWxpYXM6IHVuaXhfcmVhZF9iaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV90b190eXBlZF9hcnJheSwgY2FtbF91bml4X2xvb2t1cF9maWxlXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF91bml4X3JlYWRfYmlnYXJyYXkoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGEgPSBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJ1Zik7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcInJlYWRcIik7XG4gIHJldHVybiBmaWxlLnJlYWQoYSwgcG9zLCBsZW4sIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc2Vla1xuLy9BbGlhczogdW5peF9sc2Vla1xuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlXG5mdW5jdGlvbiBjYW1sX3VuaXhfbHNlZWsoZmQsIGxlbiwgd2hlbmNlKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImxzZWVrXCIpO1xuICByZXR1cm4gZmlsZS5zZWVrKGxlbiwgd2hlbmNlLCAvKiByYWlzZSB1bml4X2Vycm9yICovIDEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbHNlZWtfNjRcbi8vQWxpYXM6IHVuaXhfbHNlZWtfNjRcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9pbnQ2NF90b19mbG9hdFxuZnVuY3Rpb24gY2FtbF91bml4X2xzZWVrXzY0KGZkLCBsZW4sIHdoZW5jZSkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJsc2Vla1wiKTtcbiAgcmV0dXJuIGZpbGUuc2VlayhjYW1sX2ludDY0X3RvX2Zsb2F0KGxlbiksIHdoZW5jZSwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Z0cnVuY2F0ZVxuLy9BbGlhczogdW5peF9mdHJ1bmNhdGVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF91bml4X2Z0cnVuY2F0ZShmZCwgbGVuKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImZ0cnVuY2F0ZVwiKTtcbiAgaWYgKCFmaWxlLnRydW5jYXRlKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9mdHJ1bmNhdGU6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBmaWxlLnRydW5jYXRlKGxlbiwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9mdHJ1bmNhdGVfNjRcbi8vQWxpYXM6IHVuaXhfZnRydW5jYXRlXzY0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGgsIGNhbWxfaW50NjRfdG9fZmxvYXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9mdHJ1bmNhdGVfNjQoZmQsIGxlbikge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmdHJ1bmNhdGVcIik7XG4gIGlmICghZmlsZS50cnVuY2F0ZSkge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfZnRydW5jYXRlXzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZmlsZS50cnVuY2F0ZShjYW1sX2ludDY0X3RvX2Zsb2F0KGxlbiksIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfY2xvc2Vcbi8vQWxpYXM6IHVuaXhfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZVxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlKGZkKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImNsb3NlXCIpO1xuICBmaWxlLmNsb3NlKC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaW5jaGFubmVsX29mX2ZpbGVkZXNjclxuLy9BbGlhczogdW5peF9pbmNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB3aW5faW5jaGFubmVsX29mX2ZpbGVkZXNjclxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblxuZnVuY3Rpb24gY2FtbF91bml4X2luY2hhbm5lbF9vZl9maWxlZGVzY3IoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiaW5fY2hhbm5lbF9vZl9kZXNjclwiKTtcbiAgZmlsZS5jaGVja19zdHJlYW1fc2VtYW50aWNzKFwiaW5fY2hhbm5lbF9vZl9kZXNjclwiKTtcbiAgcmV0dXJuIGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luKGZkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X291dGNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB1bml4X291dGNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB3aW5fb3V0Y2hhbm5lbF9vZl9maWxlZGVzY3Jcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XG5mdW5jdGlvbiBjYW1sX3VuaXhfb3V0Y2hhbm5lbF9vZl9maWxlZGVzY3IoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwib3V0X2NoYW5uZWxfb2ZfZGVzY3JcIik7XG4gIGZpbGUuY2hlY2tfc3RyZWFtX3NlbWFudGljcyhcIm91dF9jaGFubmVsX29mX2Rlc2NyXCIpO1xuICByZXR1cm4gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0KGZkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldHVpZFxuLy9BbGlhczogdW5peF9nZXR1aWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXR1aWQoX3VuaXQpIHtcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZ2V0dWlkKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXR1aWQoKTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldGV1aWRcbi8vQWxpYXM6IHVuaXhfZ2V0ZXVpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldGV1aWQoX3VuaXQpIHtcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZ2V0ZXVpZCkge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0ZXVpZCgpO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0Z2lkXG4vL0FsaWFzOiB1bml4X2dldGdpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldGdpZChfdW5pdCkge1xuICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzPy5nZXRnaWQpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5wcm9jZXNzLmdldGdpZCgpO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0ZWdpZFxuLy9BbGlhczogdW5peF9nZXRlZ2lkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0ZWdpZChfdW5pdCkge1xuICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzPy5nZXRlZ2lkKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXRlZ2lkKCk7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXRwd25hbVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vQWxpYXM6IHVuaXhfZ2V0cHduYW1cbi8vQWxpYXM6IGNhbWxfdW5peF9nZXRwd3VpZFxuLy9BbGlhczogdW5peF9nZXRwd3VpZFxuLy9BbGlhczogY2FtbF91bml4X2dldGdybmFtXG4vL0FsaWFzOiB1bml4X2dldGdybmFtXG4vL0FsaWFzOiBjYW1sX3VuaXhfZ2V0Z3JnaWRcbi8vQWxpYXM6IHVuaXhfZ2V0Z3JnaWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXRwd25hbShfdW5pdCkge1xuICBjYW1sX3JhaXNlX25vdF9mb3VuZCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaGFzX3N5bWxpbmtcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0FsaWFzOiB1bml4X2hhc19zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfaGFzX3N5bWxpbmsoX3VuaXQpIHtcbiAgcmV0dXJuIGZzX25vZGVfc3VwcG9ydGVkKCkgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X29wZW5kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X29wZW5kaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShwYXRoKTtcbiAgaWYgKCFyb290LmRldmljZS5vcGVuZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9vcGVuZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFyIGRpcl9oYW5kbGUgPSByb290LmRldmljZS5vcGVuZGlyKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIHsgcG9pbnRlcjogZGlyX2hhbmRsZSwgcGF0aDogcGF0aCB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG4vL0FsaWFzOiB1bml4X3JlYWRkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkZGlyKGRpcl9oYW5kbGUpIHtcbiAgdmFyIGVudHJ5O1xuICB0cnkge1xuICAgIGVudHJ5ID0gZGlyX2hhbmRsZS5wb2ludGVyLnJlYWRTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgXCJyZWFkZGlyXCIpO1xuICB9XG4gIGlmIChlbnRyeSA9PT0gbnVsbCkge1xuICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoZW50cnkubmFtZSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Nsb3NlZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuLy9BbGlhczogdW5peF9jbG9zZWRpclxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlZGlyKGRpcl9oYW5kbGUpIHtcbiAgdHJ5IHtcbiAgICBkaXJfaGFuZGxlLnBvaW50ZXIuY2xvc2VTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgXCJjbG9zZWRpclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmV3aW5kZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfY2xvc2VkaXIsIGNhbWxfdW5peF9vcGVuZGlyXG4vL0FsaWFzOiB1bml4X3Jld2luZGRpclxuZnVuY3Rpb24gY2FtbF91bml4X3Jld2luZGRpcihkaXJfaGFuZGxlKSB7XG4gIGNhbWxfdW5peF9jbG9zZWRpcihkaXJfaGFuZGxlKTtcbiAgdmFyIG5ld19kaXJfaGFuZGxlID0gY2FtbF91bml4X29wZW5kaXIoZGlyX2hhbmRsZS5wYXRoKTtcbiAgZGlyX2hhbmRsZS5wb2ludGVyID0gbmV3X2Rpcl9oYW5kbGUucG9pbnRlcjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kZmlyc3Rcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF91bml4X29wZW5kaXIsIGNhbWxfdW5peF9yZWFkZGlyXG4vL0FsaWFzOiB3aW5fZmluZGZpcnN0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZGZpcnN0KHBhdGgpIHtcbiAgLy8gVGhlIFdpbmRvd3MgY29kZSBhZGRzIHRoaXMgZ2xvYiB0byB0aGUgcGF0aCwgc28gd2UgbmVlZCB0byByZW1vdmUgaXRcbiAgdmFyIHBhdGhfanMgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwYXRoKTtcbiAgcGF0aF9qcyA9IHBhdGhfanMucmVwbGFjZSgvKF58W1xcXFwvXSlcXCpcXC5cXCokLywgXCJcIik7XG4gIHBhdGggPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhwYXRoX2pzKTtcbiAgLy8gKi4qIGlzIG5vdyBzdHJpcHBlZFxuICB2YXIgZGlyX2hhbmRsZSA9IGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpO1xuICB2YXIgZmlyc3RfZW50cnkgPSBjYW1sX3VuaXhfcmVhZGRpcihkaXJfaGFuZGxlKTtcbiAgLy8gVGhlIFdpbmRvd3MgYmluZGluZ3MgdHlwZSBkaXJfaGFuZGxlIGFzIGFuIGBpbnRgIGJ1dCBpdCdzIG5vdCBpbiBKU1xuICByZXR1cm4gWzAsIGZpcnN0X2VudHJ5LCBkaXJfaGFuZGxlXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbmRuZXh0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9BbGlhczogd2luX2ZpbmRuZXh0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZG5leHQoZGlyX2hhbmRsZSkge1xuICByZXR1cm4gY2FtbF91bml4X3JlYWRkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9jbG9zZWRpclxuLy9BbGlhczogd2luX2ZpbmRjbG9zZVxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbmRjbG9zZShkaXJfaGFuZGxlKSB7XG4gIHJldHVybiBjYW1sX3VuaXhfY2xvc2VkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nIGNvbnN0XG4vL0FsaWFzOiB1bml4X2luZXRfYWRkcl9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmdzLCBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihyYWlzZV91bml4LCBjb2RlLCBjbWQsIG1zZywgcGF0aCkge1xuICB2YXIgdW5peF9lcnJvciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJVbml4LlVuaXhfZXJyb3JcIik7XG4gIGlmIChyYWlzZV91bml4ICYmIHVuaXhfZXJyb3IpXG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIGNtZCwgcGF0aCkpO1xuICBlbHNlIHtcbiAgICB2YXIgbXNnID0gY29kZSArIFwiOiBcIiArIG1zZyArIFwiLCBcIiArIGNtZDtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSBtc2cgKz0gXCIgJ1wiICsgcGF0aCArIFwiJ1wiO1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG1zZyk7XG4gIH1cbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gRHVtbXkgZmlsZXN5c3RlbVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3RyYWlsaW5nX3NsYXNoKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIiA/IG5hbWUgKyBcIi9cIiA6IG5hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VycmVudF9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfdHJhaWxpbmdfc2xhc2gsIGZzX25vZGVfc3VwcG9ydGVkXG5pZiAoZnNfbm9kZV9zdXBwb3J0ZWQoKSAmJiBnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmN3ZClcbiAgdmFyIGNhbWxfY3VycmVudF9kaXIgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5lbHNlIHZhciBjYW1sX2N1cnJlbnRfZGlyID0gXCIvc3RhdGljXCI7XG5jYW1sX2N1cnJlbnRfZGlyID0gY2FtbF90cmFpbGluZ19zbGFzaChjYW1sX2N1cnJlbnRfZGlyKTtcblxuLy9Qcm92aWRlczogY2FtbF9nZXRfcm9vdFxuLy9SZXF1aXJlczogcGF0aF9pc19hYnNvbHV0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfcm9vdChwYXRoKSB7XG4gIHZhciB4ID0gcGF0aF9pc19hYnNvbHV0ZShwYXRoKTtcbiAgaWYgKCF4KSByZXR1cm47XG4gIHJldHVybiB4WzBdICsgXCIvXCI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcm9vdFxuLy9SZXF1aXJlczogY2FtbF9nZXRfcm9vdCwgY2FtbF9jdXJyZW50X2RpciwgY2FtbF9mYWlsd2l0aFxudmFyIGNhbWxfcm9vdCA9XG4gIGNhbWxfZ2V0X3Jvb3QoY2FtbF9jdXJyZW50X2RpcikgfHxcbiAgY2FtbF9mYWlsd2l0aChcInVuYWJsZSB0byBjb21wdXRlIGNhbWxfcm9vdFwiKTtcblxuLy9Qcm92aWRlczogTWxGaWxlXG5mdW5jdGlvbiBNbEZpbGUoKSB7fVxuXG4vL1Byb3ZpZGVzOiBwYXRoX2lzX2Fic29sdXRlXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9SZXF1aXJlczoganNvb19pc193aW4zMlxuZnVuY3Rpb24gbWFrZV9wYXRoX2lzX2Fic29sdXRlKCkge1xuICBmdW5jdGlvbiBwb3NpeChwYXRoKSB7XG4gICAgaWYgKHBhdGguY2hhckF0KDApID09PSBcIi9cIikgcmV0dXJuIFtcIlwiLCBwYXRoLnNsaWNlKDEpXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiB3aW4zMihwYXRoKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvYjNmY2MyNDVmYjI1NTM5OTA5ZWYxZDVlYWEwMWRiZjkyZTE2ODYzMy9saWIvcGF0aC5qcyNMNTZcbiAgICB2YXIgc3BsaXREZXZpY2VSZSA9XG4gICAgICAvXihbYS16QS1aXTp8W1xcXFwvXXsyfVteXFxcXC9dK1tcXFxcL10rW15cXFxcL10rKT8oW1xcXFwvXSk/KFtcXHNcXFNdKj8pJC87XG4gICAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhwYXRoKTtcbiAgICB2YXIgZGV2aWNlID0gcmVzdWx0WzFdIHx8IFwiXCI7XG4gICAgdmFyIGlzVW5jID0gZGV2aWNlLmxlbmd0aCA+IDAgJiYgZGV2aWNlLmNoYXJBdCgxKSAhPT0gXCI6XCI7XG5cbiAgICAvLyBVTkMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZVxuICAgIGlmIChyZXN1bHRbMl0gfHwgaXNVbmMpIHtcbiAgICAgIHZhciByb290ID0gcmVzdWx0WzFdIHx8IFwiXCI7XG4gICAgICB2YXIgc2VwID0gcmVzdWx0WzJdIHx8IFwiXCI7XG4gICAgICByZXR1cm4gW3Jvb3QsIHBhdGguc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKV07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4ganNvb19pc193aW4zMiA/IHdpbjMyIDogcG9zaXg7XG59XG52YXIgcGF0aF9pc19hYnNvbHV0ZSA9IG1ha2VfcGF0aF9pc19hYnNvbHV0ZSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfcGF0aFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpclxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfbWFrZV9wYXRoKG5hbWUpIHtcbiAgbmFtZSA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpO1xuICBpZiAoIXBhdGhfaXNfYWJzb2x1dGUobmFtZSkpIG5hbWUgPSBjYW1sX2N1cnJlbnRfZGlyICsgbmFtZTtcbiAgdmFyIGNvbXAwID0gcGF0aF9pc19hYnNvbHV0ZShuYW1lKTtcbiAgdmFyIGNvbXAgPSBjb21wMFsxXS5zcGxpdCgvWy9cXFxcXS8pO1xuICB2YXIgbmNvbXAgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChjb21wW2ldKSB7XG4gICAgICBjYXNlIFwiLi5cIjpcbiAgICAgICAgbmNvbXAucG9wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbmNvbXAucHVzaChjb21wW2ldKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIG5jb21wLnVuc2hpZnQoY29tcDBbMF0pO1xuICBuY29tcC5vcmlnID0gbmFtZTtcbiAgcmV0dXJuIG5jb21wO1xufVxuXG4vL1Byb3ZpZGVzOmpzb29fbW91bnRfcG9pbnRcbi8vUmVxdWlyZXM6IE1sRmFrZURldmljZSwgTWxOb2RlRGV2aWNlLCBjYW1sX3Jvb3QsIGZzX25vZGVfc3VwcG9ydGVkXG52YXIganNvb19tb3VudF9wb2ludCA9IFtdO1xuaWYgKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgICBwYXRoOiBjYW1sX3Jvb3QsXG4gICAgZGV2aWNlOiBuZXcgTWxOb2RlRGV2aWNlKGNhbWxfcm9vdCksXG4gIH0pO1xufSBlbHNlIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgICBwYXRoOiBjYW1sX3Jvb3QsXG4gICAgZGV2aWNlOiBuZXcgTWxGYWtlRGV2aWNlKGNhbWxfcm9vdCksXG4gIH0pO1xufVxuanNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgcGF0aDogXCIvc3RhdGljL1wiLFxuICBkZXZpY2U6IG5ldyBNbEZha2VEZXZpY2UoXCIvc3RhdGljL1wiKSxcbn0pO1xuXG4vL1Byb3ZpZGVzOmNhbWxfbGlzdF9tb3VudF9wb2ludFxuLy9SZXF1aXJlczoganNvb19tb3VudF9wb2ludCwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbGlzdF9tb3VudF9wb2ludCgpIHtcbiAgdmFyIHByZXYgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb2xkID0gcHJldjtcbiAgICBwcmV2ID0gWzAsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGpzb29fbW91bnRfcG9pbnRbaV0ucGF0aCksIG9sZF07XG4gIH1cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8vUHJvdmlkZXM6IHJlc29sdmVfZnNfZGV2aWNlXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfcGF0aCwganNvb19tb3VudF9wb2ludCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfZ2V0X3Jvb3QsIE1sTm9kZURldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpIHtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBwYXRoLmpvaW4oXCIvXCIpO1xuICB2YXIgbmFtZV9zbGFzaCA9IGNhbWxfdHJhaWxpbmdfc2xhc2gobmFtZSk7XG4gIHZhciByZXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtID0ganNvb19tb3VudF9wb2ludFtpXTtcbiAgICBpZiAoXG4gICAgICBuYW1lX3NsYXNoLnNlYXJjaChtLnBhdGgpID09PSAwICYmXG4gICAgICAoIXJlcyB8fCByZXMucGF0aC5sZW5ndGggPCBtLnBhdGgubGVuZ3RoKVxuICAgIClcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgcGF0aDogbS5wYXRoLFxuICAgICAgICBkZXZpY2U6IG0uZGV2aWNlLFxuICAgICAgICByZXN0OiBuYW1lLnNsaWNlKG0ucGF0aC5sZW5ndGgsIG5hbWUubGVuZ3RoKSxcbiAgICAgIH07XG4gIH1cbiAgaWYgKCFyZXMgJiYgZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgIHZhciByb290ID0gY2FtbF9nZXRfcm9vdChuYW1lKTtcbiAgICBpZiAocm9vdD8ubWF0Y2goL15bYS16QS1aXTpcXC8kLykpIHtcbiAgICAgIHZhciBtID0geyBwYXRoOiByb290LCBkZXZpY2U6IG5ldyBNbE5vZGVEZXZpY2Uocm9vdCkgfTtcbiAgICAgIGpzb29fbW91bnRfcG9pbnQucHVzaChtKTtcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgcGF0aDogbS5wYXRoLFxuICAgICAgICBkZXZpY2U6IG0uZGV2aWNlLFxuICAgICAgICByZXN0OiBuYW1lLnNsaWNlKG0ucGF0aC5sZW5ndGgsIG5hbWUubGVuZ3RoKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHJldHVybiByZXM7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwibm8gZGV2aWNlIGZvdW5kIGZvciBcIiArIG5hbWVfc2xhc2gpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21vdW50X2F1dG9sb2FkXG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIGNhbWxfbWFrZV9wYXRoLCBqc29vX21vdW50X3BvaW50LCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX21vdW50X2F1dG9sb2FkKG5hbWUsIGYpIHtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKHBhdGguam9pbihcIi9cIikpO1xuICBqc29vX21vdW50X3BvaW50LnB1c2goeyBwYXRoOiBuYW1lLCBkZXZpY2U6IG5ldyBNbEZha2VEZXZpY2UobmFtZSwgZikgfSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VubW91bnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfbWFrZV9wYXRoLCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3VubW91bnQobmFtZSkge1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocGF0aC5qb2luKFwiL1wiKSk7XG4gIHZhciBpZHggPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29vX21vdW50X3BvaW50Lmxlbmd0aDsgaSsrKVxuICAgIGlmIChqc29vX21vdW50X3BvaW50W2ldLnBhdGggPT09IG5hbWUpIGlkeCA9IGk7XG4gIGlmIChpZHggPiAtMSkganNvb19tb3VudF9wb2ludC5zcGxpY2UoaWR4LCAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGN3ZFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vQWxpYXM6IGNhbWxfdW5peF9nZXRjd2Rcbi8vQWxpYXM6IHVuaXhfZ2V0Y3dkXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRjd2QoKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhjYW1sX2N1cnJlbnRfZGlyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY2hkaXJcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9kaXIsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N5c19jaGRpcihkaXIsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShkaXIpO1xuICBpZiAocm9vdC5kZXZpY2UuaXNfZGlyKHJvb3QucmVzdCkpIHtcbiAgICBpZiAocm9vdC5yZXN0KVxuICAgICAgY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocm9vdC5wYXRoICsgcm9vdC5yZXN0KTtcbiAgICBlbHNlIGNhbWxfY3VycmVudF9kaXIgPSByb290LnBhdGg7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAocm9vdC5kZXZpY2UuZXhpc3RzKHJvb3QucmVzdCkpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgIHJhaXNlX3VuaXgsXG4gICAgICBcIkVOT1RESVJcIixcbiAgICAgIFwiY2hkaXJcIixcbiAgICAgIFwibm90IGEgZGlyZWN0b3J5XCIsXG4gICAgICBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhkaXIpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoZGlyKSwgcmFpc2VfdW5peCk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShuYW1lLCByYWlzZV91bml4KSB7XG4gIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgIHJhaXNlX3VuaXgsXG4gICAgXCJFTk9FTlRcIixcbiAgICBcIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIixcbiAgICBuYW1lLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19maWxlX2V4aXN0c1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX2ZpbGVfZXhpc3RzKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeShuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBhID0gcm9vdC5kZXZpY2UucmVhZGRpcihyb290LnJlc3QpO1xuICB2YXIgbCA9IG5ldyBBcnJheShhLmxlbmd0aCArIDEpO1xuICBsWzBdID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBsW2kgKyAxXSA9IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGFbaV0pO1xuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVtb3ZlXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfcmVtb3ZlKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc19kaXJlY3Rvcnlcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19pc19kaXJlY3RvcnkobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgYSA9IHJvb3QuZGV2aWNlLmlzX2Rpcihyb290LnJlc3QpO1xuICByZXR1cm4gYSA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZW5hbWVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZW5hbWUobywgbikge1xuICB2YXIgb19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobyk7XG4gIHZhciBuX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuKTtcbiAgaWYgKG9fcm9vdC5kZXZpY2UgIT09IG5fcm9vdC5kZXZpY2UpXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogY2Fubm90IG1vdmUgZmlsZSBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtXCIpO1xuICBpZiAoIW9fcm9vdC5kZXZpY2UucmVuYW1lKSBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zeXNfcmVuYW1lOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIG9fcm9vdC5kZXZpY2UucmVuYW1lKG9fcm9vdC5yZXN0LCBuX3Jvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX21rZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfbWtkaXIobmFtZSwgcGVybSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByb290LmRldmljZS5ta2Rpcihyb290LnJlc3QsIHBlcm0pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcm1kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19ybWRpcihuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJvb3QuZGV2aWNlLnJtZGlyKHJvb3QucmVzdCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX21hcF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2JhX21hcF9maWxlKF92ZmQsIF9raW5kLCBfbGF5b3V0LCBfc2hhcmVkLCBfZGltcywgX3Bvcykge1xuICAvLyB2YXIgZGF0YSA9IGNhbWxfc3lzX2Zkc1t2ZmRdO1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9iYV9tYXBfZmlsZSBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfbWFwX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGUoYXJndiwgX2FyZ24pIHtcbiAgLy8gYXJnbiA9PT0gNlxuICByZXR1cm4gY2FtbF9iYV9tYXBfZmlsZShhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLCBhcmd2WzNdLCBhcmd2WzRdLCBhcmd2WzVdKTtcbn1cblxuLy9Qcm92aWRlczoganNvb19jcmVhdGVfZmlsZV9leHRlcm5cbmZ1bmN0aW9uIGpzb29fY3JlYXRlX2ZpbGVfZXh0ZXJuKG5hbWUsIGNvbnRlbnQpIHtcbiAgaWYgKGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZSkgZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpO1xuICBlbHNlIHtcbiAgICBpZiAoIWdsb2JhbFRoaXMuanNvb19mc190bXApIGdsb2JhbFRoaXMuanNvb19mc190bXAgPSBbXTtcbiAgICBnbG9iYWxUaGlzLmpzb29fZnNfdG1wLnB1c2goeyBuYW1lOiBuYW1lLCBjb250ZW50OiBjb250ZW50IH0pO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZzX2luaXRcbi8vUmVxdWlyZXM6IGpzb29fY3JlYXRlX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfZnNfaW5pdCgpIHtcbiAgdmFyIHRtcCA9IGdsb2JhbFRoaXMuanNvb19mc190bXA7XG4gIGlmICh0bXApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykge1xuICAgICAganNvb19jcmVhdGVfZmlsZSh0bXBbaV0ubmFtZSwgdG1wW2ldLmNvbnRlbnQpO1xuICAgIH1cbiAgfVxuICBnbG9iYWxUaGlzLmpzb29fY3JlYXRlX2ZpbGUgPSBqc29vX2NyZWF0ZV9maWxlO1xuICBnbG9iYWxUaGlzLmpzb29fZnNfdG1wID0gW107XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVnaXN0ZXIpIGNhbWxfZmFpbHdpdGgoXCJjYW5ub3QgcmVnaXN0ZXIgZmlsZVwiKTtcbiAgcm9vdC5kZXZpY2UucmVnaXN0ZXIocm9vdC5yZXN0LCBjb250ZW50KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29fY3JlYXRlX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2ZpbGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBqc29vX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpIHtcbiAgdmFyIG5hbWUgPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhuYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNvbnRlbnQpO1xuICByZXR1cm4gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWFkX2ZpbGVfY29udGVudFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlYWRfZmlsZV9jb250ZW50KG5hbWUpIHtcbiAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiA/IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG5hbWUpIDogbmFtZTtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpKSB7XG4gICAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCwgeyByZG9ubHk6IDEgfSk7XG4gICAgdmFyIGxlbiA9IGZpbGUubGVuZ3RoKCk7XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZmlsZS5yZWFkKGJ1ZiwgMCwgbGVuLCBmYWxzZSk7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGJ1Zik7XG4gIH1cbiAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSkpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogTWxGYWtlRGV2aWNlXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlLCBNbEZha2VGZCwgY2FtbF9jcmVhdGVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfYXJyYXksIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuY2xhc3MgTWxGYWtlRGV2aWNlIHtcbiAgY29uc3RydWN0b3Iocm9vdCwgZikge1xuICAgIHRoaXMuY29udGVudCA9IHt9O1xuICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgdGhpcy5sb29rdXBGdW4gPSBmO1xuICB9XG5cbiAgbm0obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJvb3QgKyBuYW1lO1xuICB9XG5cbiAgY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSkge1xuICAgIHZhciBjb21wID0gbmFtZS5zcGxpdChcIi9cIik7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgcmVzICs9IGNvbXBbaV0gKyBcIi9cIjtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbcmVzXSkgY29udGludWU7XG4gICAgICB0aGlzLmNvbnRlbnRbcmVzXSA9IFN5bWJvbChcImRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cblxuICBzbGFzaChuYW1lKSB7XG4gICAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpID8gbmFtZSA6IG5hbWUgKyBcIi9cIjtcbiAgfVxuXG4gIGxvb2t1cChuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRbbmFtZV0gJiYgdGhpcy5sb29rdXBGdW4pIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLmxvb2t1cEZ1bihcbiAgICAgICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcodGhpcy5yb290KSxcbiAgICAgICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobmFtZSksXG4gICAgICApO1xuICAgICAgaWYgKHJlcyAhPT0gMCkge1xuICAgICAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX3N0cmluZyhyZXNbMV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleGlzdHMobmFtZSwgZG9fbm90X2xvb2t1cCkge1xuICAgIC8vIFRoZSByb290IG9mIHRoZSBkZXZpY2UgZXhpc3RzXG4gICAgaWYgKG5hbWUgPT09IFwiXCIpIHJldHVybiAxO1xuICAgIC8vIENoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgICBpZiAodGhpcy5jb250ZW50W25hbWVfc2xhc2hdKSByZXR1cm4gMTtcbiAgICAvLyBDaGVjayBpZiBhIGZpbGUgZXhpc3RzXG4gICAgaWYgKCFkb19ub3RfbG9va3VwKSB0aGlzLmxvb2t1cChuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50W25hbWVdID8gMSA6IDA7XG4gIH1cblxuICBpc0ZpbGUobmFtZSkge1xuICAgIGlmICh0aGlzLmV4aXN0cyhuYW1lKSAmJiAhdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZW5hbWVfZGlyKG9sZG5hbWUsIG5ld25hbWUpIHtcbiAgICBpZiAodGhpcy5leGlzdHMobmV3bmFtZSkpIHtcbiAgICAgIGlmICghdGhpcy5pc19kaXIobmV3bmFtZSkpIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgICAgdGhpcy5ubShuZXduYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWFkZGlyKG5ld25hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuZXduYW1lKSArIFwiIDogZGlyZWN0b3J5IG5vdCBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9sZF9zbGFzaCA9IHRoaXMuc2xhc2gob2xkbmFtZSk7XG4gICAgdmFyIG5ld19zbGFzaCA9IHRoaXMuc2xhc2gobmV3bmFtZSk7XG4gICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuZXdfc2xhc2gpO1xuICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLnJlYWRkaXIob2xkbmFtZSkpIHtcbiAgICAgIHRoaXMucmVuYW1lKG9sZF9zbGFzaCArIGYsIG5ld19zbGFzaCArIGYpO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5jb250ZW50W29sZF9zbGFzaF07XG4gIH1cblxuICByZW5hbWUob2xkbmFtZSwgbmV3bmFtZSkge1xuICAgIGlmICghdGhpcy5leGlzdHMob2xkbmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG9sZG5hbWUpICsgXCIgOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICAgIGlmICh0aGlzLmlzX2RpcihvbGRuYW1lKSkge1xuICAgICAgdGhpcy5yZW5hbWVfZGlyKG9sZG5hbWUsIG5ld25hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5leGlzdHMobmV3bmFtZSkgJiYgdGhpcy5pc19kaXIobmV3bmFtZSkpIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgICAgdGhpcy5ubShuZXduYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFtuZXduYW1lXSA9IHRoaXMuY29udGVudFtvbGRuYW1lXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbnRlbnRbb2xkbmFtZV07XG4gICAgfVxuICB9XG5cbiAgbWtkaXIobmFtZSwgX21vZGUsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5leGlzdHMobmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFRVhJU1RcIixcbiAgICAgICAgXCJta2RpclwiLFxuICAgICAgICBcImZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICk7XG4gICAgdmFyIHBhcmVudCA9IC9eKC4qKVxcL1teL10rLy5leGVjKG5hbWUpO1xuICAgIHBhcmVudCA9IHBhcmVudD8uWzFdIHx8IFwiXCI7XG4gICAgaWYgKCF0aGlzLmV4aXN0cyhwYXJlbnQpKVxuICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgIFwiRU5PRU5UXCIsXG4gICAgICAgIFwibWtkaXJcIixcbiAgICAgICAgXCJubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsXG4gICAgICAgIHRoaXMubm0obmFtZSksXG4gICAgICApO1xuICAgIGlmICghdGhpcy5pc19kaXIocGFyZW50KSlcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICByYWlzZV91bml4LFxuICAgICAgICBcIkVOT1RESVJcIixcbiAgICAgICAgXCJta2RpclwiLFxuICAgICAgICBcIm5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgKTtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKHRoaXMuc2xhc2gobmFtZSkpO1xuICB9XG5cbiAgcm1kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHZhciBuYW1lX3NsYXNoID0gbmFtZSA9PT0gXCJcIiA/IFwiXCIgOiB0aGlzLnNsYXNoKG5hbWUpO1xuICAgIGlmICghdGhpcy5leGlzdHMobmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFTk9FTlRcIixcbiAgICAgICAgXCJybWRpclwiLFxuICAgICAgICBcIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIixcbiAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICk7XG4gICAgaWYgKCF0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICByYWlzZV91bml4LFxuICAgICAgICBcIkVOT1RESVJcIixcbiAgICAgICAgXCJybWRpclwiLFxuICAgICAgICBcIm5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgKTtcbiAgICBmb3IgKHZhciBuIGluIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKG4uc3RhcnRzV2l0aChuYW1lX3NsYXNoKSAmJiBuICE9PSBuYW1lX3NsYXNoKVxuICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICByYWlzZV91bml4LFxuICAgICAgICAgIFwiRU5PVEVNUFRZXCIsXG4gICAgICAgICAgXCJybWRpclwiLFxuICAgICAgICAgIFwiZGlyZWN0b3J5IG5vdCBlbXB0eVwiLFxuICAgICAgICAgIHRoaXMubm0obmFtZSksXG4gICAgICAgICk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF07XG4gIH1cblxuICByZWFkZGlyKG5hbWUpIHtcbiAgICB2YXIgbmFtZV9zbGFzaCA9IG5hbWUgPT09IFwiXCIgPyBcIlwiIDogdGhpcy5zbGFzaChuYW1lKTtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKG5hbWUpKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgICB2YXIgc2VlbiA9IHt9O1xuICAgIHZhciBhID0gW107XG4gICAgZm9yICh2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmIChuLnN0YXJ0c1dpdGgobmFtZV9zbGFzaCkgJiYgbiAhPT0gbmFtZV9zbGFzaCkge1xuICAgICAgICB2YXIgbGFzdCA9IG4uaW5kZXhPZihcIi9cIiwgbmFtZV9zbGFzaC5sZW5ndGgpO1xuICAgICAgICBpZiAobGFzdCA8IDApIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtID0gbi5zbGljZShuYW1lX3NsYXNoLmxlbmd0aCwgbGFzdCk7XG4gICAgICAgIGlmIChtICYmICFzZWVuW21dKSB7XG4gICAgICAgICAgc2VlblttXSA9IHRydWU7XG4gICAgICAgICAgYS5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG5cbiAgb3BlbmRpcihuYW1lLCByYWlzZV91bml4KSB7XG4gICAgdmFyIGEgPSB0aGlzLnJlYWRkaXIobmFtZSk7XG4gICAgdmFyIGMgPSBmYWxzZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYWRTeW5jOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjKVxuICAgICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICAgIFwiRUJBREZcIixcbiAgICAgICAgICAgIFwicmVhZGRpclwiLFxuICAgICAgICAgICAgXCJiYWQgZmlsZSBkZXNjcmlwdG9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGkgPT09IGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGVudHJ5ID0gYVtpXTtcbiAgICAgICAgaSsrO1xuICAgICAgICByZXR1cm4geyBuYW1lOiBlbnRyeSB9O1xuICAgICAgfSxcbiAgICAgIGNsb3NlU3luYzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYylcbiAgICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgICBcIkVCQURGXCIsXG4gICAgICAgICAgICBcInJlYWRkaXJcIixcbiAgICAgICAgICAgIFwiYmFkIGZpbGUgZGVzY3JpcHRvclwiLFxuICAgICAgICAgICk7XG4gICAgICAgIGMgPSB0cnVlO1xuICAgICAgICBhID0gW107XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpc19kaXIobmFtZSkge1xuICAgIGlmIChuYW1lID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgbmFtZV9zbGFzaCA9IHRoaXMuc2xhc2gobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lX3NsYXNoXSA/IDEgOiAwO1xuICB9XG5cbiAgdW5saW5rKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKG5hbWUsIHRydWUpKSB7XG4gICAgICAvLyBbdHJ1ZV0gbWVhbnMgbm8gXCJsb29rdXBcIiBpZiBub3QgZm91bmQuXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFTk9FTlRcIixcbiAgICAgICAgXCJ1bmxpbmtcIixcbiAgICAgICAgXCJubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsXG4gICAgICAgIG5hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5jb250ZW50W25hbWVdO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgYWNjZXNzKG5hbWUsIF9mbGFncywgcmFpc2VfdW5peCkge1xuICAgIHRoaXMubG9va3VwKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICBcIkVBQ0NFU1NcIixcbiAgICAgICAgICBcImFjY2Vzc1wiLFxuICAgICAgICAgIFwicGVybWlzc2lvbiBkZW5pZWQsXCIsXG4gICAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUodGhpcy5ubShuYW1lKSwgcmFpc2VfdW5peCk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgb3BlbihuYW1lLCBmLCBfcGVybXMsIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgZmlsZTtcbiAgICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgICBpZiAodGhpcy5jb250ZW50W25hbWVdKSB7XG4gICAgICBpZiAodGhpcy5pc19kaXIobmFtZSkpXG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgXCJFSVNESVJcIixcbiAgICAgICAgICBcIm9wZW5cIixcbiAgICAgICAgICBcImlsbGVnYWwgb3BlcmF0aW9uIG9uIGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIGlmIChmLmNyZWF0ZSAmJiBmLmV4Y2wpXG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgXCJFRVhJU1RcIixcbiAgICAgICAgICBcIm9wZW5cIixcbiAgICAgICAgICBcImZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICAgIGlmIChmLnRydW5jYXRlKSBmaWxlLnRydW5jYXRlKDApO1xuICAgIH0gZWxzZSBpZiAoZi5jcmVhdGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSh0aGlzLm5tKG5hbWUpLCByYWlzZV91bml4KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNbEZha2VGZCh0aGlzLm5tKG5hbWUpLCBmaWxlLCBmKTtcbiAgfVxuXG4gIHRydW5jYXRlKG5hbWUsIGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHZhciBmaWxlO1xuICAgIHRoaXMubG9va3VwKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICBcIkVJU0RJUlwiLFxuICAgICAgICAgIFwib3BlblwiLFxuICAgICAgICAgIFwiaWxsZWdhbCBvcGVyYXRpb24gb24gYSBkaXJlY3RvcnlcIixcbiAgICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICAgIGZpbGUudHJ1bmNhdGUobGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUodGhpcy5ubShuYW1lKSwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXIobmFtZSwgY29udGVudCkge1xuICAgIHZhciBmaWxlO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pXG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmaWxlIGFscmVhZHkgZXhpc3RzXCIpO1xuICAgIGlmIChjYW1sX2lzX21sX2J5dGVzKGNvbnRlbnQpKSBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY29udGVudCk7XG4gICAgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKGNvbnRlbnQpKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGNvbnRlbnQpKTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoY29udGVudCkpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjb250ZW50KSk7XG4gICAgZWxzZSBpZiAoY29udGVudC50b1N0cmluZykge1xuICAgICAgdmFyIGJ5dGVzID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoXG4gICAgICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNvbnRlbnQudG9TdHJpbmcoKSksXG4gICAgICApO1xuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGJ5dGVzKTtcbiAgICB9XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBmaWxlO1xuICAgIH0gZWxzZVxuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgIHRoaXMubm0obmFtZSkgKyBcIiA6IHJlZ2lzdGVyaW5nIGZpbGUgd2l0aCBpbnZhbGlkIGNvbnRlbnQgdHlwZVwiLFxuICAgICAgKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBNbEZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ibGl0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XG5jbGFzcyBNbEZha2VGaWxlIGV4dGVuZHMgTWxGaWxlIHtcbiAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gY29udGVudDtcbiAgfVxuXG4gIHRydW5jYXRlKGxlbikge1xuICAgIHZhciBvbGQgPSB0aGlzLmRhdGE7XG4gICAgdmFyIG9sZF9sZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aChvbGQpO1xuICAgIHRoaXMuZGF0YSA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbiB8IDApO1xuICAgIGNhbWxfYmxpdF9ieXRlcyhvbGQsIDAsIHRoaXMuZGF0YSwgMCwgTWF0aC5taW4obGVuLCBvbGRfbGVuKSk7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHRoaXMuZGF0YSk7XG4gIH1cblxuICB3cml0ZShvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gICAgaWYgKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgICB2YXIgbmV3X3N0ciA9IGNhbWxfY3JlYXRlX2J5dGVzKG9mZnNldCArIGxlbik7XG4gICAgICB2YXIgb2xkX2RhdGEgPSB0aGlzLmRhdGE7XG4gICAgICB0aGlzLmRhdGEgPSBuZXdfc3RyO1xuICAgICAgY2FtbF9ibGl0X2J5dGVzKG9sZF9kYXRhLCAwLCB0aGlzLmRhdGEsIDAsIGNsZW4pO1xuICAgIH1cbiAgICBjYW1sX2JsaXRfYnl0ZXMoXG4gICAgICBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5KGJ1ZiksXG4gICAgICBwb3MsXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICBvZmZzZXQsXG4gICAgICBsZW4sXG4gICAgKTtcbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgcmVhZChvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gICAgaWYgKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgICBsZW4gPSBjbGVuIC0gb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgdmFyIGRhdGEgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4gfCAwKTtcbiAgICAgIGNhbWxfYmxpdF9ieXRlcyh0aGlzLmRhdGEsIG9mZnNldCwgZGF0YSwgMCwgbGVuKTtcbiAgICAgIGJ1Zi5zZXQoY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhkYXRhKSwgcG9zKTtcbiAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkX291dFxuLy9SZXF1aXJlczogTWxGYWtlRmlsZSwgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3JcbmNsYXNzIE1sRmFrZUZkX291dCBleHRlbmRzIE1sRmFrZUZpbGUge1xuICBjb25zdHJ1Y3RvcihmZCwgZmxhZ3MpIHtcbiAgICBzdXBlcihjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgdGhpcy5sb2cgPSBmdW5jdGlvbiAoX3MpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgaWYgKGZkID09PSAxICYmIHR5cGVvZiBjb25zb2xlLmxvZyA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGVsc2UgaWYgKGZkID09PSAyICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aGlzLmxvZyA9IGNvbnNvbGUuZXJyb3I7XG4gICAgZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUubG9nID09PSBcImZ1bmN0aW9uXCIpIHRoaXMubG9nID0gY29uc29sZS5sb2c7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdHJ1bmNhdGUoX2xlbiwgcmFpc2VfdW5peCkge1xuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgcmFpc2VfdW5peCxcbiAgICAgIFwiRUlOVkFMXCIsXG4gICAgICBcImZ0cnVuY2F0ZVwiLFxuICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgKTtcbiAgfVxuXG4gIHdyaXRlKGJ1ZiwgcG9zLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgd3JpdHRlbiA9IGxlbjtcbiAgICBpZiAodGhpcy5sb2cpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGVuID4gMCAmJlxuICAgICAgICBwb3MgPj0gMCAmJlxuICAgICAgICBwb3MgKyBsZW4gPD0gYnVmLmxlbmd0aCAmJlxuICAgICAgICBidWZbcG9zICsgbGVuIC0gMV0gPT09IDEwXG4gICAgICApXG4gICAgICAgIGxlbi0tO1xuICAgICAgLy8gRG8gbm90IG91dHB1dCB0aGUgbGFzdCBcXG4gaWYgcHJlc2VudFxuICAgICAgLy8gYXMgY29uc29sZSBsb2dnaW5nIGRpc3BsYXkgYSBuZXdsaW5lIGF0IHRoZSBlbmRcbiAgICAgIHZhciBzcmMgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pO1xuICAgICAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYnVmKSwgcG9zLCBzcmMsIDAsIGxlbik7XG4gICAgICB0aGlzLmxvZyhzcmMudG9VdGYxNigpKTtcbiAgICAgIHJldHVybiB3cml0dGVuO1xuICAgIH1cbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgIHJhaXNlX3VuaXgsXG4gICAgICBcIkVCQURGXCIsXG4gICAgICBcIndyaXRlXCIsXG4gICAgICBcImJhZCBmaWxlIGRlc2NyaXB0b3JcIixcbiAgICApO1xuICB9XG5cbiAgcmVhZChfYnVmLCBfcG9zLCBfbGVuLCByYWlzZV91bml4KSB7XG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IocmFpc2VfdW5peCwgXCJFQkFERlwiLCBcInJlYWRcIiwgXCJiYWQgZmlsZSBkZXNjcmlwdG9yXCIpO1xuICB9XG5cbiAgc2VlayhfbGVuLCBfd2hlbmNlLCByYWlzZV91bml4KSB7XG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IocmFpc2VfdW5peCwgXCJFU1BJUEVcIiwgXCJsc2Vla1wiLCBcImlsbGVnYWwgc2Vla1wiKTtcbiAgfVxuICBwb3MoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5sb2cgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGVja19zdHJlYW1fc2VtYW50aWNzKF9jbWQpIHt9XG59XG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuY2xhc3MgTWxGYWtlRmQge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBmaWxlLCBmbGFncykge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgIHRoaXMuc2Vla2VkID0gZmFsc2U7XG4gIH1cblxuICBlcnJfY2xvc2VkKGNtZCwgcmFpc2VfdW5peCkge1xuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKHJhaXNlX3VuaXgsIFwiRUJBREZcIiwgY21kLCBcImJhZCBmaWxlIGRlc2NyaXB0b3JcIik7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgaWYgKHRoaXMuZmlsZSkgcmV0dXJuIHRoaXMuZmlsZS5sZW5ndGgoKTtcbiAgICB0aGlzLmVycl9jbG9zZWQoXCJsZW5ndGhcIik7XG4gIH1cblxuICB0cnVuY2F0ZShsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5maWxlKSB7XG4gICAgICBpZiAoISh0aGlzLmZsYWdzLndyb25seSB8fCB0aGlzLmZsYWdzLnJkd3IpKVxuICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICByYWlzZV91bml4LFxuICAgICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgICAgXCJ0cnVuY2F0ZVwiLFxuICAgICAgICAgIFwiaW52YWxpZCBhcmd1bWVudFwiLFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZS50cnVuY2F0ZShsZW4pO1xuICAgIH1cbiAgICB0aGlzLmVycl9jbG9zZWQoXCJ0cnVuY2F0ZVwiLCByYWlzZV91bml4KTtcbiAgfVxuXG4gIHdyaXRlKGJ1ZiwgcG9zLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5maWxlICYmICh0aGlzLmZsYWdzLndyb25seSB8fCB0aGlzLmZsYWdzLnJkd3IpKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICBsZW4gPSB0aGlzLmZpbGUud3JpdGUob2Zmc2V0LCBidWYsIHBvcywgbGVuKTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IGxlbjtcbiAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIHRoaXMuZXJyX2Nsb3NlZChcIndyaXRlXCIsIHJhaXNlX3VuaXgpO1xuICB9XG5cbiAgcmVhZChidWYsIHBvcywgbGVuLCByYWlzZV91bml4KSB7XG4gICAgaWYgKHRoaXMuZmlsZSAmJiAhdGhpcy5mbGFncy53cm9ubHkpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgIGxlbiA9IHRoaXMuZmlsZS5yZWFkKG9mZnNldCwgYnVmLCBwb3MsIGxlbik7XG4gICAgICB0aGlzLm9mZnNldCArPSBsZW47XG4gICAgICByZXR1cm4gbGVuO1xuICAgIH1cbiAgICB0aGlzLmVycl9jbG9zZWQoXCJyZWFkXCIsIHJhaXNlX3VuaXgpO1xuICB9XG5cbiAgc2VlayhvZmZzZXQsIHdoZW5jZSwgcmFpc2VfdW5peCkge1xuICAgIHN3aXRjaCAod2hlbmNlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKVxuICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgIFwibHNlZWtcIixcbiAgICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgICApO1xuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHRoaXMuc2Vla2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgcG9zKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldDtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5maWxlKSB0aGlzLmVycl9jbG9zZWQoXCJjbG9zZVwiKTtcbiAgICB0aGlzLmZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGVja19zdHJlYW1fc2VtYW50aWNzKGNtZCkge1xuICAgIGlmICghdGhpcy5maWxlKSByZXR1cm4gdGhpcy5lcnJfY2xvc2VkKGNtZCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgfVxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG52YXIgY2FtbF9pbnQ2NF9vZmZzZXQgPSBNYXRoLnBvdygyLCAtMjQpO1xuXG4vL1Byb3ZpZGVzOiBNbEludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldCwgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuY2xhc3MgTWxJbnQ2NCB7XG4gIGNvbnN0cnVjdG9yKGxvLCBtaSwgaGkpIHtcbiAgICB0aGlzLmxvID0gbG8gJiAweGZmZmZmZjtcbiAgICB0aGlzLm1pID0gbWkgJiAweGZmZmZmZjtcbiAgICB0aGlzLmhpID0gaGkgJiAweGZmZmY7XG4gICAgdGhpcy5jYW1sX2N1c3RvbSA9IFwiX2pcIjtcbiAgfVxuXG4gIHN0YXRpYyBVTlNJR05FRF9NQVggPSBuZXcgTWxJbnQ2NCgweGZmZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZik7XG4gIHN0YXRpYyBTSUdORURfTUFYID0gbmV3IE1sSW50NjQoMHhmZmZmZmYsIDB4ZmZmZmZmLCAweDdmZmYpO1xuICBzdGF0aWMgU0lHTkVEX01JTiA9IG5ldyBNbEludDY0KDB4MDAwMDAwLCAweDAwMDAwMCwgMHg4MDAwKTtcblxuICBzbGljZSgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbywgdGhpcy5taSwgdGhpcy5oaSk7XG4gIH1cblxuICB1Y29tcGFyZSh4KSB7XG4gICAgaWYgKHRoaXMuaGkgPiB4LmhpKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5oaSA8IHguaGkpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5taSA+IHgubWkpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLm1pIDwgeC5taSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmxvID4geC5sbykgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubG8gPCB4LmxvKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlKHgpIHtcbiAgICB2YXIgaGkgPSB0aGlzLmhpIDw8IDE2O1xuICAgIHZhciB4aGkgPSB4LmhpIDw8IDE2O1xuICAgIGlmIChoaSA+IHhoaSkgcmV0dXJuIDE7XG4gICAgaWYgKGhpIDwgeGhpKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubWkgPiB4Lm1pKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5taSA8IHgubWkpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5sbyA+IHgubG8pIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxvIDwgeC5sbykgcmV0dXJuIC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbmVnKCkge1xuICAgIHZhciBsbyA9IC10aGlzLmxvO1xuICAgIHZhciBtaSA9IC10aGlzLm1pICsgKGxvID4+IDI0KTtcbiAgICB2YXIgaGkgPSAtdGhpcy5oaSArIChtaSA+PiAyNCk7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xuICB9XG5cbiAgYWRkKHgpIHtcbiAgICB2YXIgbG8gPSB0aGlzLmxvICsgeC5sbztcbiAgICB2YXIgbWkgPSB0aGlzLm1pICsgeC5taSArIChsbyA+PiAyNCk7XG4gICAgdmFyIGhpID0gdGhpcy5oaSArIHguaGkgKyAobWkgPj4gMjQpO1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbiAgfVxuXG4gIHN1Yih4KSB7XG4gICAgdmFyIGxvID0gdGhpcy5sbyAtIHgubG87XG4gICAgdmFyIG1pID0gdGhpcy5taSAtIHgubWkgKyAobG8gPj4gMjQpO1xuICAgIHZhciBoaSA9IHRoaXMuaGkgLSB4LmhpICsgKG1pID4+IDI0KTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG4gIH1cblxuICBtdWwoeCkge1xuICAgIHZhciBsbyA9IHRoaXMubG8gKiB4LmxvO1xuICAgIHZhciBtaSA9ICgobG8gKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArIHRoaXMubWkgKiB4LmxvICsgdGhpcy5sbyAqIHgubWk7XG4gICAgdmFyIGhpID1cbiAgICAgICgobWkgKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArXG4gICAgICB0aGlzLmhpICogeC5sbyArXG4gICAgICB0aGlzLm1pICogeC5taSArXG4gICAgICB0aGlzLmxvICogeC5oaTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG4gIH1cblxuICBpc1plcm8oKSB7XG4gICAgcmV0dXJuICh0aGlzLmxvIHwgdGhpcy5taSB8IHRoaXMuaGkpID09PSAwO1xuICB9XG5cbiAgaXNOZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGkgPDwgMTYgPCAwO1xuICB9XG5cbiAgYW5kKHgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyAmIHgubG8sIHRoaXMubWkgJiB4Lm1pLCB0aGlzLmhpICYgeC5oaSk7XG4gIH1cblxuICBvcih4KSB7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG8gfCB4LmxvLCB0aGlzLm1pIHwgeC5taSwgdGhpcy5oaSB8IHguaGkpO1xuICB9XG5cbiAgeG9yKHgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyBeIHgubG8sIHRoaXMubWkgXiB4Lm1pLCB0aGlzLmhpIF4geC5oaSk7XG4gIH1cblxuICBzaGlmdF9sZWZ0KHMpIHtcbiAgICBzID0gcyAmIDYzO1xuICAgIGlmIChzID09PSAwKSByZXR1cm4gdGhpcztcbiAgICBpZiAocyA8IDI0KSB7XG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgIHRoaXMubG8gPDwgcyxcbiAgICAgICAgKHRoaXMubWkgPDwgcykgfCAodGhpcy5sbyA+PiAoMjQgLSBzKSksXG4gICAgICAgICh0aGlzLmhpIDw8IHMpIHwgKHRoaXMubWkgPj4gKDI0IC0gcykpLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHMgPCA0OClcbiAgICAgIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAgICAgMCxcbiAgICAgICAgdGhpcy5sbyA8PCAocyAtIDI0KSxcbiAgICAgICAgKHRoaXMubWkgPDwgKHMgLSAyNCkpIHwgKHRoaXMubG8gPj4gKDQ4IC0gcykpLFxuICAgICAgKTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQoMCwgMCwgdGhpcy5sbyA8PCAocyAtIDQ4KSk7XG4gIH1cblxuICBzaGlmdF9yaWdodF91bnNpZ25lZChzKSB7XG4gICAgcyA9IHMgJiA2MztcbiAgICBpZiAocyA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKHMgPCAyNClcbiAgICAgIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAgICAgKHRoaXMubG8gPj4gcykgfCAodGhpcy5taSA8PCAoMjQgLSBzKSksXG4gICAgICAgICh0aGlzLm1pID4+IHMpIHwgKHRoaXMuaGkgPDwgKDI0IC0gcykpLFxuICAgICAgICB0aGlzLmhpID4+IHMsXG4gICAgICApO1xuICAgIGlmIChzIDwgNDgpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICAgdGhpcy5oaSA+PiAocyAtIDI0KSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMuaGkgPj4gKHMgLSA0OCksIDAsIDApO1xuICB9XG5cbiAgc2hpZnRfcmlnaHQocykge1xuICAgIHMgPSBzICYgNjM7XG4gICAgaWYgKHMgPT09IDApIHJldHVybiB0aGlzO1xuICAgIHZhciBoID0gKHRoaXMuaGkgPDwgMTYpID4+IDE2O1xuICAgIGlmIChzIDwgMjQpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgICAodGhpcy5taSA+PiBzKSB8IChoIDw8ICgyNCAtIHMpKSxcbiAgICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiBzKSA+Pj4gMTYsXG4gICAgICApO1xuICAgIHZhciBzaWduID0gKHRoaXMuaGkgPDwgMTYpID4+IDMxO1xuICAgIGlmIChzIDwgNDgpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiAocyAtIDI0KSkgPj4gMTYsXG4gICAgICAgIHNpZ24gJiAweGZmZmYsXG4gICAgICApO1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NCgodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAzMiksIHNpZ24sIHNpZ24pO1xuICB9XG5cbiAgbHNsMSgpIHtcbiAgICB0aGlzLmhpID0gKHRoaXMuaGkgPDwgMSkgfCAodGhpcy5taSA+PiAyMyk7XG4gICAgdGhpcy5taSA9ICgodGhpcy5taSA8PCAxKSB8ICh0aGlzLmxvID4+IDIzKSkgJiAweGZmZmZmZjtcbiAgICB0aGlzLmxvID0gKHRoaXMubG8gPDwgMSkgJiAweGZmZmZmZjtcbiAgfVxuXG4gIGxzcjEoKSB7XG4gICAgdGhpcy5sbyA9ICgodGhpcy5sbyA+Pj4gMSkgfCAodGhpcy5taSA8PCAyMykpICYgMHhmZmZmZmY7XG4gICAgdGhpcy5taSA9ICgodGhpcy5taSA+Pj4gMSkgfCAodGhpcy5oaSA8PCAyMykpICYgMHhmZmZmZmY7XG4gICAgdGhpcy5oaSA9IHRoaXMuaGkgPj4+IDE7XG4gIH1cblxuICB1ZGl2bW9kKHgpIHtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgbW9kdWx1cyA9IHRoaXMuc2xpY2UoKTtcbiAgICB2YXIgZGl2aXNvciA9IHguc2xpY2UoKTtcbiAgICB2YXIgcXVvdGllbnQgPSBuZXcgTWxJbnQ2NCgwLCAwLCAwKTtcbiAgICB3aGlsZSAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+IDApIHtcbiAgICAgIG9mZnNldCsrO1xuICAgICAgZGl2aXNvci5sc2wxKCk7XG4gICAgfVxuICAgIHdoaWxlIChvZmZzZXQgPj0gMCkge1xuICAgICAgb2Zmc2V0LS07XG4gICAgICBxdW90aWVudC5sc2wxKCk7XG4gICAgICBpZiAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+PSAwKSB7XG4gICAgICAgIHF1b3RpZW50LmxvKys7XG4gICAgICAgIG1vZHVsdXMgPSBtb2R1bHVzLnN1YihkaXZpc29yKTtcbiAgICAgIH1cbiAgICAgIGRpdmlzb3IubHNyMSgpO1xuICAgIH1cbiAgICByZXR1cm4geyBxdW90aWVudDogcXVvdGllbnQsIG1vZHVsdXM6IG1vZHVsdXMgfTtcbiAgfVxuXG4gIGRpdih5KSB7XG4gICAgdmFyIHggPSB0aGlzO1xuICAgIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCk7XG4gICAgdmFyIHNpZ24gPSB4LmhpIF4geS5oaTtcbiAgICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gICAgaWYgKHkuaGkgJiAweDgwMDApIHkgPSB5Lm5lZygpO1xuICAgIHZhciBxID0geC51ZGl2bW9kKHkpLnF1b3RpZW50O1xuICAgIGlmIChzaWduICYgMHg4MDAwKSBxID0gcS5uZWcoKTtcbiAgICByZXR1cm4gcTtcbiAgfVxuXG4gIG1vZCh5KSB7XG4gICAgdmFyIHggPSB0aGlzO1xuICAgIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCk7XG4gICAgdmFyIHNpZ24gPSB4LmhpO1xuICAgIGlmICh4LmhpICYgMHg4MDAwKSB4ID0geC5uZWcoKTtcbiAgICBpZiAoeS5oaSAmIDB4ODAwMCkgeSA9IHkubmVnKCk7XG4gICAgdmFyIHIgPSB4LnVkaXZtb2QoeSkubW9kdWx1cztcbiAgICBpZiAoc2lnbiAmIDB4ODAwMCkgciA9IHIubmVnKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICB0b0ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5sbyB8ICh0aGlzLm1pIDw8IDI0KTtcbiAgfVxuXG4gIHRvRmxvYXQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLmhpIDw8IDE2KSAqIE1hdGgucG93KDIsIDMyKSArIHRoaXMubWkgKiBNYXRoLnBvdygyLCAyNCkgKyB0aGlzLmxvXG4gICAgKTtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuaGkgPj4gOCxcbiAgICAgIHRoaXMuaGkgJiAweGZmLFxuICAgICAgdGhpcy5taSA+PiAxNixcbiAgICAgICh0aGlzLm1pID4+IDgpICYgMHhmZixcbiAgICAgIHRoaXMubWkgJiAweGZmLFxuICAgICAgdGhpcy5sbyA+PiAxNixcbiAgICAgICh0aGlzLmxvID4+IDgpICYgMHhmZixcbiAgICAgIHRoaXMubG8gJiAweGZmLFxuICAgIF07XG4gIH1cblxuICBsbzMyKCkge1xuICAgIHJldHVybiB0aGlzLmxvIHwgKCh0aGlzLm1pICYgMHhmZikgPDwgMjQpO1xuICB9XG5cbiAgaGkzMigpIHtcbiAgICByZXR1cm4gKCh0aGlzLm1pID4+PiA4KSAmIDB4ZmZmZikgfCAodGhpcy5oaSA8PCAxNik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF91bHQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdWx0KHgsIHkpIHtcbiAgcmV0dXJuIHgudWNvbXBhcmUoeSkgPCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NvbXBhcmUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY29tcGFyZSh4LCB5LCBfdG90YWwpIHtcbiAgcmV0dXJuIHguY29tcGFyZSh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9uZWcgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbmVnKHgpIHtcbiAgcmV0dXJuIHgubmVnKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYWRkIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FkZCh4LCB5KSB7XG4gIHJldHVybiB4LmFkZCh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zdWIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc3ViKHgsIHkpIHtcbiAgcmV0dXJuIHguc3ViKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X211bCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbXVsKHgsIHkpIHtcbiAgcmV0dXJuIHgubXVsKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2lzX3plcm8gY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaXNfemVybyh4KSB7XG4gIHJldHVybiAreC5pc1plcm8oKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSh4KSB7XG4gIHJldHVybiAreC5pc05lZygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2FuZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9hbmQoeCwgeSkge1xuICByZXR1cm4geC5hbmQoeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb3IoeCwgeSkge1xuICByZXR1cm4geC5vcih5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF94b3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfeG9yKHgsIHkpIHtcbiAgcmV0dXJuIHgueG9yKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfbGVmdCh4LCBzKSB7XG4gIHJldHVybiB4LnNoaWZ0X2xlZnQocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgcykge1xuICByZXR1cm4geC5zaGlmdF9yaWdodF91bnNpZ25lZChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCh4LCBzKSB7XG4gIHJldHVybiB4LnNoaWZ0X3JpZ2h0KHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2RpdlxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9kaXYoeCwgeSkge1xuICByZXR1cm4geC5kaXYoeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbW9kXG5mdW5jdGlvbiBjYW1sX2ludDY0X21vZCh4LCB5KSB7XG4gIHJldHVybiB4Lm1vZCh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuLy9BbGlhczogY2FtbF9pbnQ2NF9vZl9pbnRcbi8vQWxpYXM6IGNhbWxfaW50NjRfb2ZfbmF0aXZlaW50XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2ludDMyKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHggJiAweGZmZmZmZiwgKHggPj4gMjQpICYgMHhmZmZmZmYsICh4ID4+IDMxKSAmIDB4ZmZmZik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9faW50MzIgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50NjRfdG9faW50XG4vL0FsaWFzOiBjYW1sX2ludDY0X3RvX25hdGl2ZWludFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19pbnQzMih4KSB7XG4gIHJldHVybiB4LnRvSW50KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fZmxvYXQoeCkge1xuICByZXR1cm4geC50b0Zsb2F0KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2Zsb2F0KHgpIHtcbiAgaWYgKHggPCAwKSB4ID0gTWF0aC5jZWlsKHgpO1xuICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgeCAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0KSAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0ICogY2FtbF9pbnQ2NF9vZmZzZXQpICYgMHhmZmZmLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zvcm1hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9mb3JtYXQsIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfaXNfbmVnYXRpdmUsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2ludDMyLCBjYW1sX2ludDY0X3RvX2ludDMyXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9mb3JtYXQoZm10LCB4KSB7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGYuc2lnbmVkY29udiAmJiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlKHgpKSB7XG4gICAgZi5zaWduID0gLTE7XG4gICAgeCA9IGNhbWxfaW50NjRfbmVnKHgpO1xuICB9XG4gIHZhciBidWZmZXIgPSBcIlwiO1xuICB2YXIgd2Jhc2UgPSBjYW1sX2ludDY0X29mX2ludDMyKGYuYmFzZSk7XG4gIHZhciBjdnRibCA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuICBkbyB7XG4gICAgdmFyIHAgPSB4LnVkaXZtb2Qod2Jhc2UpO1xuICAgIHggPSBwLnF1b3RpZW50O1xuICAgIGJ1ZmZlciA9IGN2dGJsLmNoYXJBdChjYW1sX2ludDY0X3RvX2ludDMyKHAubW9kdWx1cykpICsgYnVmZmVyO1xuICB9IHdoaWxlICghY2FtbF9pbnQ2NF9pc196ZXJvKHgpKTtcbiAgaWYgKGYucHJlYyA+PSAwKSB7XG4gICAgZi5maWxsZXIgPSBcIiBcIjtcbiAgICB2YXIgbiA9IGYucHJlYyAtIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBidWZmZXIgPSBjYW1sX3N0cl9yZXBlYXQobiwgXCIwXCIpICsgYnVmZmVyO1xuICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIGJ1ZmZlcik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcGFyc2VfZGlnaXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfdWx0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2FkZCwgY2FtbF9pbnQ2NF9tdWwsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9zdHJpbmcocykge1xuICB2YXIgciA9IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZShzKTtcbiAgdmFyIGkgPSByWzBdLFxuICAgIHNpZ24gPSByWzFdLFxuICAgIGJhc2UgPSByWzJdLFxuICAgIHNpZ25lZG5lc3MgPSByWzNdO1xuICB2YXIgYmFzZTY0ID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihiYXNlKTtcbiAgdmFyIHRocmVzaG9sZCA9IE1sSW50NjQuVU5TSUdORURfTUFYLnVkaXZtb2QoYmFzZTY0KS5xdW90aWVudDtcbiAgdmFyIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICB2YXIgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGNhbWxfZmFpbHdpdGgoXCJJbnQ2NC5vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICBmb3IgKDs7KSB7XG4gICAgaSsrO1xuICAgIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICAgIGlmIChjID09PSA5NSkgY29udGludWU7XG4gICAgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gICAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgYnJlYWs7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIGJhc2UgKiByZXMgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQodGhyZXNob2xkLCByZXMpKSBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICAgIGQgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICAgIHJlcyA9IGNhbWxfaW50NjRfYWRkKGNhbWxfaW50NjRfbXVsKGJhc2U2NCwgcmVzKSwgZCk7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIGFkZGl0aW9uIChiYXNlICogcmVzKSArIGQgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQocmVzLCBkKSkgY2FtbF9mYWlsd2l0aChcIkludDY0Lm9mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPT0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICBpZiAoXG4gICAgc2lnbmVkbmVzcyAmJlxuICAgIGNhbWxfaW50NjRfdWx0KHNpZ24gPCAwID8gTWxJbnQ2NC5TSUdORURfTUlOIDogTWxJbnQ2NC5TSUdORURfTUFYLCByZXMpXG4gIClcbiAgICBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICBpZiAoc2lnbiA8IDApIHJlcyA9IGNhbWxfaW50NjRfbmVnKHJlcyk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaShsbywgbWksIGhpKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsbywgaGkpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KFxuICAgIGxvICYgMHhmZmZmZmYsXG4gICAgKChsbyA+Pj4gMjQpICYgMHhmZikgfCAoKGhpICYgMHhmZmZmKSA8PCA4KSxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmZmZixcbiAgKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbG8zMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9sbzMyKHYpIHtcbiAgcmV0dXJuIHYubG8zMigpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2hpMzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaGkzMih2KSB7XG4gIHJldHVybiB2LmhpMzIoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAoYVs3XSA8PCAwKSB8IChhWzZdIDw8IDgpIHwgKGFbNV0gPDwgMTYpLFxuICAgIChhWzRdIDw8IDApIHwgKGFbM10gPDwgOCkgfCAoYVsyXSA8PCAxNiksXG4gICAgKGFbMV0gPDwgMCkgfCAoYVswXSA8PCA4KSxcbiAgKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fYnl0ZXMoeCkge1xuICByZXR1cm4geC50b0FycmF5KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaGFzaCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9oYXNoKHYpIHtcbiAgcmV0dXJuIHYubG8zMigpIF4gdi5oaTMyKCk7XG59XG4iLCIvL1Byb3ZpZGVzOiBNbE11dGV4XG5jbGFzcyBNbE11dGV4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X25ld1xuLy9SZXF1aXJlczogTWxNdXRleFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9uZXcoX3VuaXQpIHtcbiAgcmV0dXJuIG5ldyBNbE11dGV4KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfbG9ja1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9sb2NrKHQpIHtcbiAgaWYgKHQubG9ja2VkKSBjYW1sX2ZhaWx3aXRoKFwiTXV0ZXgubG9jazogbXV0ZXggYWxyZWFkeSBsb2NrZWQuIENhbm5vdCB3YWl0LlwiKTtcbiAgZWxzZSB0LmxvY2tlZCA9IHRydWU7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X3RyeV9sb2NrXG5mdW5jdGlvbiBjYW1sX21sX211dGV4X3RyeV9sb2NrKHQpIHtcbiAgaWYgKCF0LmxvY2tlZCkge1xuICAgIHQubG9ja2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF91bmxvY2tcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHQpIHtcbiAgdC5sb2NrZWQgPSBmYWxzZTtcbiAgcmV0dXJuIDA7XG59XG4iLCIvL1Byb3ZpZGVzOiBpbml0aWFsaXplX25hdFxuLy9SZXF1aXJlczogY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBzZXJpYWxpemVfbmF0LCBkZXNlcmlhbGl6ZV9uYXQsIGNhbWxfaGFzaF9uYXRcbmZ1bmN0aW9uIGluaXRpYWxpemVfbmF0KCkge1xuICBjYW1sX2N1c3RvbV9vcHMuX25hdCA9IHtcbiAgICBkZXNlcmlhbGl6ZTogZGVzZXJpYWxpemVfbmF0LFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplX25hdCxcbiAgICBoYXNoOiBjYW1sX2hhc2hfbmF0LFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5hdFxuY2xhc3MgTWxOYXQge1xuICBjb25zdHJ1Y3Rvcih4KSB7XG4gICAgdGhpcy5kYXRhID0gbmV3IEludDMyQXJyYXkoeCk7XG4gICAgLy8gRm9yIG51bSA8IDEuNVxuICAgIC8vIGxlbmd0aF9uYXQgaXNuJ3QgZXh0ZXJuYWwsIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGUgT2JqLnNpemVcbiAgICAvLyB3b3JrIG91dCByaWdodC5cbiAgICAvLyBXZSBhZGQgKzIgdG8gdGhlIGFycmF5IGxlbmd0aDpcbiAgICAvLyAtICsxIGZvciB0aGUgdGFnXG4gICAgLy8gLSArMSBmb3IgdGhlIGN1c3RvbV9vcHMgc2xvdFxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aCArIDI7XG4gICAgdGhpcy5jYW1sX2N1c3RvbSA9IFwiX25hdFwiO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9uYXRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY2FtbF9oYXNoX25hdCh4KSB7XG4gIHZhciBsZW4gPSBudW1fZGlnaXRzX25hdCh4LCAwLCB4LmRhdGEubGVuZ3RoKTtcbiAgdmFyIGggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHguZGF0YVtpXSk7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGxlbmd0aF9uYXRcbmZ1bmN0aW9uIGxlbmd0aF9uYXQoeCkge1xuICByZXR1cm4geC5kYXRhLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogbmF0X29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gbmF0X29mX2FycmF5KGwpIHtcbiAgcmV0dXJuIG5ldyBNbE5hdChsKTtcbn1cblxuLy9Qcm92aWRlczogY3JlYXRlX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGNyZWF0ZV9uYXQoc2l6ZSkge1xuICB2YXIgYXJyID0gbmV3IE1sTmF0KHNpemUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIGFyci5kYXRhW2ldID0gLTE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLy9Qcm92aWRlczogc2V0X3RvX3plcm9fbmF0XG5mdW5jdGlvbiBzZXRfdG9femVyb19uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0LmRhdGFbb2ZzICsgaV0gPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBibGl0X25hdFxuZnVuY3Rpb24gYmxpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMiwgbGVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQxLmRhdGFbb2ZzMSArIGldID0gbmF0Mi5kYXRhW29mczIgKyBpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdFxuZnVuY3Rpb24gc2V0X2RpZ2l0X25hdChuYXQsIG9mcywgZGlnaXQpIHtcbiAgbmF0LmRhdGFbb2ZzXSA9IGRpZ2l0O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbnRoX2RpZ2l0X25hdFxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdChuYXQsIG9mcykge1xuICByZXR1cm4gbmF0LmRhdGFbb2ZzXTtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdF9uYXRpdmVcbmZ1bmN0aW9uIHNldF9kaWdpdF9uYXRfbmF0aXZlKG5hdCwgb2ZzLCBkaWdpdCkge1xuICBuYXQuZGF0YVtvZnNdID0gZGlnaXQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBudGhfZGlnaXRfbmF0X25hdGl2ZVxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdF9uYXRpdmUobmF0LCBvZnMpIHtcbiAgcmV0dXJuIG5hdC5kYXRhW29mc107XG59XG5cbi8vUHJvdmlkZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBudW1fZGlnaXRzX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChuYXQuZGF0YVtvZnMgKyBpXSAhPT0gMCkgcmV0dXJuIGkgKyAxO1xuICB9XG4gIHJldHVybiAxOyAvLyAwIGNvdW50cyBhcyAxIGRpZ2l0XG59XG5cbi8vUHJvdmlkZXM6IG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdFxuZnVuY3Rpb24gbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0KG5hdCwgb2ZzKSB7XG4gIHZhciBhID0gbmF0LmRhdGFbb2ZzXTtcbiAgdmFyIGIgPSAwO1xuICBpZiAoYSAmIDB4ZmZmZjAwMDApIHtcbiAgICBiICs9IDE2O1xuICAgIGEgPj4+PSAxNjtcbiAgfVxuICBpZiAoYSAmIDB4ZmYwMCkge1xuICAgIGIgKz0gODtcbiAgICBhID4+Pj0gODtcbiAgfVxuICBpZiAoYSAmIDB4ZjApIHtcbiAgICBiICs9IDQ7XG4gICAgYSA+Pj49IDQ7XG4gIH1cbiAgaWYgKGEgJiAxMikge1xuICAgIGIgKz0gMjtcbiAgICBhID4+Pj0gMjtcbiAgfVxuICBpZiAoYSAmIDIpIHtcbiAgICBiICs9IDE7XG4gICAgYSA+Pj49IDE7XG4gIH1cbiAgaWYgKGEgJiAxKSB7XG4gICAgYiArPSAxO1xuICB9XG4gIHJldHVybiAzMiAtIGI7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X2ludFxuZnVuY3Rpb24gaXNfZGlnaXRfaW50KG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdID49IDApIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfemVyb1xuZnVuY3Rpb24gaXNfZGlnaXRfemVybyhuYXQsIG9mcykge1xuICBpZiAobmF0LmRhdGFbb2ZzXSA9PT0gMCkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpc19kaWdpdF9ub3JtYWxpemVkXG5mdW5jdGlvbiBpc19kaWdpdF9ub3JtYWxpemVkKF9uYXQsIF9vZnMpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X29kZFxuZnVuY3Rpb24gaXNfZGlnaXRfb2RkKG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdICYgMSkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpbmNyX25hdFxuZnVuY3Rpb24gaW5jcl9uYXQobmF0LCBvZnMsIGxlbiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQuZGF0YVtvZnMgKyBpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQuZGF0YVtvZnMgKyBpXSA9IHggfCAwO1xuICAgIGlmICh4ID09PSB4ID4+PiAwKSB7XG4gICAgICBjYXJyeSA9IDA7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FycnkgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2Fycnk7XG59XG5cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogYWRkX25hdFxuLy9SZXF1aXJlczogaW5jcl9uYXRcbmZ1bmN0aW9uIGFkZF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0MS5kYXRhW29mczEgKyBpXSA+Pj4gMCkgKyAobmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQxLmRhdGFbb2ZzMSArIGldID0geDtcbiAgICBpZiAoeCA9PT0geCA+Pj4gMCkge1xuICAgICAgY2FycnkgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmNyX25hdChuYXQxLCBvZnMxICsgbGVuMiwgbGVuMSAtIGxlbjIsIGNhcnJ5KTtcbn1cblxuLy9Qcm92aWRlczogY29tcGxlbWVudF9uYXRcbmZ1bmN0aW9uIGNvbXBsZW1lbnRfbmF0KG5hdCwgb2ZzLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW29mcyArIGldID0gKC0xID4+PiAwKSAtIChuYXQuZGF0YVtvZnMgKyBpXSA+Pj4gMCk7XG4gIH1cbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vUHJvdmlkZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBkZWNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgYm9ycm93ID0gY2FycnlfaW4gPT09IDEgPyAwIDogMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciB4ID0gKG5hdC5kYXRhW29mcyArIGldID4+PiAwKSAtIGJvcnJvdztcbiAgICBuYXQuZGF0YVtvZnMgKyBpXSA9IHg7XG4gICAgaWYgKHggPj0gMCkge1xuICAgICAgYm9ycm93ID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3Jyb3cgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm9ycm93ID09PSAxID8gMCA6IDE7XG59XG5cbi8vIG9jYW1sIGZsaXBzIGNhcnJ5X2luXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IHN1Yl9uYXRcbi8vUmVxdWlyZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBzdWJfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIGNhcnJ5X2luKSB7XG4gIHZhciBib3Jyb3cgPSBjYXJyeV9pbiA9PT0gMSA/IDAgOiAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4ID0gKG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDApIC0gKG5hdDIuZGF0YVtvZnMyICsgaV0gPj4+IDApIC0gYm9ycm93O1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSB4O1xuICAgIGlmICh4ID49IDApIHtcbiAgICAgIGJvcnJvdyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvcnJvdyA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWNyX25hdChuYXQxLCBvZnMxICsgbGVuMiwgbGVuMSAtIGxlbjIsIGJvcnJvdyA9PT0gMSA/IDAgOiAxKTtcbn1cblxuLy8gbmF0MSArPSBuYXQyICogbmF0M1tvZnMzXVxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBtdWx0X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogYWRkX25hdCwgbmF0X29mX2FycmF5XG5mdW5jdGlvbiBtdWx0X2RpZ2l0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBhID0gbmF0My5kYXRhW29mczNdID4+PiAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4MSA9XG4gICAgICAobmF0MS5kYXRhW29mczEgKyBpXSA+Pj4gMCkgK1xuICAgICAgKG5hdDIuZGF0YVtvZnMyICsgaV0gPj4+IDApICogKGEgJiAweDAwMDBmZmZmKSArXG4gICAgICBjYXJyeTtcbiAgICB2YXIgeDIgPSAobmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgKiAoYSA+Pj4gMTYpO1xuICAgIGNhcnJ5ID0gTWF0aC5mbG9vcih4MiAvIDY1NTM2KTtcbiAgICB2YXIgeDMgPSB4MSArICh4MiAlIDY1NTM2KSAqIDY1NTM2O1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSB4MztcbiAgICBjYXJyeSArPSBNYXRoLmZsb29yKHgzIC8gNDI5NDk2NzI5Nik7XG4gIH1cblxuICBpZiAobGVuMiA8IGxlbjEgJiYgY2FycnkpIHtcbiAgICByZXR1cm4gYWRkX25hdChcbiAgICAgIG5hdDEsXG4gICAgICBvZnMxICsgbGVuMixcbiAgICAgIGxlbjEgLSBsZW4yLFxuICAgICAgbmF0X29mX2FycmF5KFtjYXJyeV0pLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcnJ5O1xuICB9XG59XG5cbi8vIG5hdDEgKz0gbmF0MiAqIG5hdDNcbi8vIGxlbjEgPj0gbGVuMiArIGxlbjMuXG4vL1Byb3ZpZGVzOiBtdWx0X25hdFxuLy9SZXF1aXJlczogbXVsdF9kaWdpdF9uYXRcbmZ1bmN0aW9uIG11bHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMsIGxlbjMpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4zOyBpKyspIHtcbiAgICBjYXJyeSArPSBtdWx0X2RpZ2l0X25hdChcbiAgICAgIG5hdDEsXG4gICAgICBvZnMxICsgaSxcbiAgICAgIGxlbjEgLSBpLFxuICAgICAgbmF0MixcbiAgICAgIG9mczIsXG4gICAgICBsZW4yLFxuICAgICAgbmF0MyxcbiAgICAgIG9mczMgKyBpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyBuYXQxID0gMiAqIG5hdDEgKyBuYXQyICogbmF0MlxuLy8gbGVuMSA+PSAyICogbGVuMlxuLy9Qcm92aWRlczogc3F1YXJlX25hdFxuLy9SZXF1aXJlczogbXVsdF9uYXQsIGFkZF9uYXRcbmZ1bmN0aW9uIHNxdWFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgY2FycnkgPSAwO1xuICBjYXJyeSArPSBhZGRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDEsIG9mczEsIGxlbjEsIDApO1xuICBjYXJyeSArPSBtdWx0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQyLCBvZnMyLCBsZW4yKTtcbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X2xlZnRfbmF0XG5mdW5jdGlvbiBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBuYml0cykge1xuICBpZiAobmJpdHMgPT09IDApIHtcbiAgICBuYXQyLmRhdGFbb2ZzMl0gPSAwO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciB3cmFwID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4xOyBpKyspIHtcbiAgICB2YXIgYSA9IG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDA7XG4gICAgbmF0MS5kYXRhW29mczEgKyBpXSA9IChhIDw8IG5iaXRzKSB8IHdyYXA7XG4gICAgd3JhcCA9IGEgPj4+ICgzMiAtIG5iaXRzKTtcbiAgfVxuICBuYXQyLmRhdGFbb2ZzMl0gPSB3cmFwO1xuICByZXR1cm4gMDtcbn1cblxuLy8gQXNzdW1pbmcgYyA+IGEsIHJldHVybnMgW3F1b3RpZW50LCByZW1haW5kZXJdIG9mIChhPDwzMiArIGIpL2Ncbi8vUHJvdmlkZXM6IGRpdl9oZWxwZXJcbmZ1bmN0aW9uIGRpdl9oZWxwZXIoYSwgYiwgYykge1xuICB2YXIgeCA9IGEgKiA2NTUzNiArIChiID4+PiAxNik7XG4gIHZhciB5ID0gTWF0aC5mbG9vcih4IC8gYykgKiA2NTUzNjtcbiAgdmFyIHogPSAoeCAlIGMpICogNjU1MzY7XG4gIHZhciB3ID0geiArIChiICYgMHgwMDAwZmZmZik7XG4gIHJldHVybiBbeSArIE1hdGguZmxvb3IodyAvIGMpLCB3ICUgY107XG59XG5cbi8vIG5hdDFbb2ZzMStsZW5dIDwgbmF0MltvZnMyXVxuLy9Qcm92aWRlczogZGl2X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogZGl2X2hlbHBlclxuZnVuY3Rpb24gZGl2X2RpZ2l0X25hdChuYXRxLCBvZnNxLCBuYXRyLCBvZnNyLCBuYXQxLCBvZnMxLCBsZW4sIG5hdDIsIG9mczIpIHtcbiAgdmFyIHJlbSA9IG5hdDEuZGF0YVtvZnMxICsgbGVuIC0gMV0gPj4+IDA7XG4gIC8vIG5hdHFbb2ZzcStsZW4tMV0gaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIChkdWUgdG8gdGhlIE1TRCByZXF1aXJlbWVudCksXG4gIC8vIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uXG4gIGZvciAodmFyIGkgPSBsZW4gLSAyOyBpID49IDA7IGktLSkge1xuICAgIHZhciB4ID0gZGl2X2hlbHBlcihyZW0sIG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAsIG5hdDIuZGF0YVtvZnMyXSA+Pj4gMCk7XG4gICAgbmF0cS5kYXRhW29mc3EgKyBpXSA9IHhbMF07XG4gICAgcmVtID0geFsxXTtcbiAgfVxuICBuYXRyLmRhdGFbb2Zzcl0gPSByZW07XG4gIHJldHVybiAwO1xufVxuXG4vLyBuYXQxW25hdDI6XSA6PSBuYXQxIC8gbmF0MlxuLy8gbmF0MVs6bmF0Ml0gOj0gbmF0MSAlIG5hdDJcbi8vIGxlbjEgPiBsZW4yLCBuYXQyW29mczIrbGVuMi0xXSA+IG5hdDFbb2ZzMStsZW4xLTFdXG4vL1Byb3ZpZGVzOiBkaXZfbmF0XG4vL1JlcXVpcmVzOiBkaXZfZGlnaXRfbmF0LCBkaXZfaGVscGVyLCBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQsIHNoaWZ0X2xlZnRfbmF0LCBzaGlmdF9yaWdodF9uYXQsIGNyZWF0ZV9uYXQsIHNldF90b196ZXJvX25hdCwgbXVsdF9kaWdpdF9uYXQsIHN1Yl9uYXQsIGNvbXBhcmVfbmF0LCBuYXRfb2ZfYXJyYXlcbmZ1bmN0aW9uIGRpdl9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICBpZiAobGVuMiA9PT0gMSkge1xuICAgIGRpdl9kaWdpdF9uYXQobmF0MSwgb2ZzMSArIDEsIG5hdDEsIG9mczEsIG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHMgPSBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQobmF0Miwgb2ZzMiArIGxlbjIgLSAxKTtcbiAgc2hpZnRfbGVmdF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpO1xuICBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7XG5cbiAgdmFyIGQgPSAobmF0Mi5kYXRhW29mczIgKyBsZW4yIC0gMV0gPj4+IDApICsgMTtcbiAgdmFyIGEgPSBjcmVhdGVfbmF0KGxlbjIgKyAxKTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IGxlbjI7IGktLSkge1xuICAgIC8vIERlY2VudCBsb3dlciBib3VuZCBvbiBxdW9cbiAgICB2YXIgcXVvID1cbiAgICAgIGQgPT09IDQyOTQ5NjcyOTZcbiAgICAgICAgPyBuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwXG4gICAgICAgIDogZGl2X2hlbHBlcihcbiAgICAgICAgICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAsXG4gICAgICAgICAgICBuYXQxLmRhdGFbb2ZzMSArIGkgLSAxXSA+Pj4gMCxcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgKVswXTtcbiAgICBzZXRfdG9femVyb19uYXQoYSwgMCwgbGVuMiArIDEpO1xuICAgIG11bHRfZGlnaXRfbmF0KGEsIDAsIGxlbjIgKyAxLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoW3F1b10pLCAwKTtcbiAgICBzdWJfbmF0KG5hdDEsIG9mczEgKyBpIC0gbGVuMiwgbGVuMiArIDEsIGEsIDAsIGxlbjIgKyAxLCAxKTtcblxuICAgIHdoaWxlIChcbiAgICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gIT09IDAgfHxcbiAgICAgIGNvbXBhcmVfbmF0KG5hdDEsIG9mczEgKyBpIC0gbGVuMiwgbGVuMiwgbmF0Miwgb2ZzMiwgbGVuMikgPj0gMFxuICAgICkge1xuICAgICAgcXVvID0gcXVvICsgMTtcbiAgICAgIHN1Yl9uYXQobmF0MSwgb2ZzMSArIGkgLSBsZW4yLCBsZW4yICsgMSwgbmF0Miwgb2ZzMiwgbGVuMiwgMSk7XG4gICAgfVxuXG4gICAgbmF0MS5kYXRhW29mczEgKyBpXSA9IHF1bztcbiAgfVxuXG4gIHNoaWZ0X3JpZ2h0X25hdChuYXQxLCBvZnMxLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7IC8vIHNoaWZ0IHJlbWFpbmRlclxuICBzaGlmdF9yaWdodF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpOyAvLyByZXN0b3JlXG4gIHJldHVybiAwO1xufVxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X3JpZ2h0X25hdFxuZnVuY3Rpb24gc2hpZnRfcmlnaHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIG5iaXRzKSB7XG4gIGlmIChuYml0cyA9PT0gMCkge1xuICAgIG5hdDIuZGF0YVtvZnMyXSA9IDA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIHdyYXAgPSAwO1xuICBmb3IgKHZhciBpID0gbGVuMSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGEgPSBuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwO1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSAoYSA+Pj4gbmJpdHMpIHwgd3JhcDtcbiAgICB3cmFwID0gYSA8PCAoMzIgLSBuYml0cyk7XG4gIH1cbiAgbmF0Mi5kYXRhW29mczJdID0gd3JhcDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgaWYgKG5hdDEuZGF0YVtvZnMxXSA+IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIDE7XG4gIGlmIChuYXQxLmRhdGFbb2ZzMV0gPCBuYXQyLmRhdGFbb2ZzMl0pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfbmF0XG4vL1JlcXVpcmVzOiBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgYSA9IG51bV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIGxlbjEpO1xuICB2YXIgYiA9IG51bV9kaWdpdHNfbmF0KG5hdDIsIG9mczIsIGxlbjIpO1xuICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwID4gbmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgcmV0dXJuIDE7XG4gICAgaWYgKG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAgPCBuYXQyLmRhdGFbb2ZzMiArIGldID4+PiAwKSByZXR1cm4gLTE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGxhbmRfZGlnaXRfbmF0XG5mdW5jdGlvbiBsYW5kX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSAmPSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBsb3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBsb3JfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdIHw9IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGx4b3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBseG9yX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSBePSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXJpYWxpemVfbmF0XG5mdW5jdGlvbiBzZXJpYWxpemVfbmF0KHdyaXRlciwgbmF0LCBzeikge1xuICB2YXIgbGVuID0gbmF0LmRhdGEubGVuZ3RoO1xuICB3cml0ZXIud3JpdGUoMzIsIGxlbik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB3cml0ZXIud3JpdGUoMzIsIG5hdC5kYXRhW2ldKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHN6WzFdID0gbGVuICogODtcbn1cblxuLy9Qcm92aWRlczogZGVzZXJpYWxpemVfbmF0XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gZGVzZXJpYWxpemVfbmF0KHJlYWRlciwgc3opIHtcbiAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBuYXQgPSBuZXcgTWxOYXQobGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW2ldID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHJldHVybiBuYXQ7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBqc29vX2lzX3dpbjMyXG52YXIganNvb19pc193aW4zMiA9XG4gIGdsb2JhbFRoaXMuRGVubz8uYnVpbGQ/Lm9zID09PSBcIndpbmRvd3NcIiB8fFxuICBnbG9iYWxUaGlzLnByb2Nlc3M/LnBsYXRmb3JtID09PSBcIndpbjMyXCI7XG5cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcz8udmVyc2lvbnM/Lm5vZGUgIT09IHVuZGVmaW5lZDtcbn1cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVEZXZpY2Vcbi8vUmVxdWlyZXM6IE1sTm9kZUZkLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yLCBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHNcbi8vUmVxdWlyZXM6IGpzb29faXNfd2luMzJcbmNsYXNzIE1sTm9kZURldmljZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QpIHtcbiAgICB0aGlzLmZzID0gcmVxdWlyZShcIm5vZGU6ZnNcIik7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgfVxuXG4gIG5tKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yb290ICsgbmFtZTtcbiAgfVxuXG4gIGV4aXN0cyhuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmModGhpcy5ubShuYW1lKSkgPyAxIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIGlzRmlsZShuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRmlsZSgpID8gMSA6IDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgbWtkaXIobmFtZSwgbW9kZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLm1rZGlyU3luYyh0aGlzLm5tKG5hbWUpLCB7IG1vZGU6IG1vZGUgfSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgcm1kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnJtZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICByZWFkZGlyKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZnMucmVhZGRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGlzX2RpcihuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRGlyZWN0b3J5KCkgPyAxIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICB1bmxpbmsobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnVubGlua1N5bmModGhpcy5ubShuYW1lKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgdXRpbWVzKG5hbWUsIGF0aW1lLCBtdGltZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXRpbWUgPT09IDAgJiYgbXRpbWUgPT09IDApIHtcbiAgICAgICAgYXRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgIG10aW1lID0gYXRpbWU7XG4gICAgICB9XG4gICAgICB0aGlzLmZzLnV0aW1lc1N5bmModGhpcy5ubShuYW1lKSwgYXRpbWUsIG10aW1lKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICB0cnVuY2F0ZShuYW1lLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy50cnVuY2F0ZVN5bmModGhpcy5ubShuYW1lKSwgbGVuIHwgMCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgYWNjZXNzKG5hbWUsIGYsIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgY29uc3RzID0gdGhpcy5mcy5jb25zdGFudHM7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIga2V5IGluIGYpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5SX09LO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwid1wiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuV19PSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICByZXMgfD0ganNvb19pc193aW4zMiA/IGNvbnN0cy5SX09LIDogY29uc3RzLlhfT0s7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5GX09LO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy5hY2Nlc3NTeW5jKHRoaXMubm0obmFtZSksIHJlcyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbihuYW1lLCBmLCBwZXJtcywgcmFpc2VfdW5peCkge1xuICAgIHZhciBjb25zdHMgPSB0aGlzLmZzLmNvbnN0YW50cztcbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gZikge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcInJkb25seVwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19SRE9OTFk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ3cm9ubHlcIjpcbiAgICAgICAgICByZXMgfD0gY29uc3RzLk9fV1JPTkxZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmR3clwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19SRFdSO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXBwZW5kXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0FQUEVORDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNyZWF0ZVwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19DUkVBVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRydW5jYXRlXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX1RSVU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZXhjbFwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19FWENMO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0JJTkFSWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICByZXMgfD0gY29uc3RzLk9fVEVYVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm5vbmJsb2NrXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX05PTkJMT0NLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibm9jdHR5XCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX05PQ1RUWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRzeW5jXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0RTWU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3luY1wiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19TWU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdmFyIGZkID0gdGhpcy5mcy5vcGVuU3luYyh0aGlzLm5tKG5hbWUpLCByZXMsIHBlcm1zKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQsIGYpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBzbGFzaChuYW1lKSB7XG4gICAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpID8gbmFtZSA6IG5hbWUgKyBcIi9cIjtcbiAgfVxuXG4gIHJlbmFtZShvLCBuLCByYWlzZV91bml4KSB7XG4gICAgaWYgKGpzb29faXNfd2luMzIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLm5tKG4pO1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5ubShvKTtcbiAgICAgICAgdmFyIHRhcmdldF9zdGF0cywgc291cmNlX3N0YXRzO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRhcmdldF9zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmModGFyZ2V0LCB7XG4gICAgICAgICAgICB0aHJvd0lmTm9FbnRyeTogZmFsc2UsXG4gICAgICAgICAgfSkpICYmXG4gICAgICAgICAgKHNvdXJjZV9zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmMoc291cmNlLCB7XG4gICAgICAgICAgICB0aHJvd0lmTm9FbnRyeTogZmFsc2UsXG4gICAgICAgICAgfSkpICYmXG4gICAgICAgICAgc291cmNlX3N0YXRzLmlzRGlyZWN0b3J5KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRhcmdldF9zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2xhc2godGFyZ2V0KS5zdGFydHNXaXRoKHRoaXMuc2xhc2goc291cmNlKSkpXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcy5ybWRpclN5bmModGFyZ2V0KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRU5PVERJUjogbm90IGEgZGlyZWN0b3J5LCByZW5hbWUgJyR7c291cmNlfScgLT4gJyR7dGFyZ2V0fSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oZXJyLCB7XG4gICAgICAgICAgICAgIGVycm5vOiAtMjAsXG4gICAgICAgICAgICAgIGNvZGU6IFwiRU5PVERJUlwiLFxuICAgICAgICAgICAgICBzeXNjYWxsOiBcInJlbmFtZVwiLFxuICAgICAgICAgICAgICBwYXRoOiB0YXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcy5yZW5hbWVTeW5jKHRoaXMubm0obyksIHRoaXMubm0obikpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZnMucmVuYW1lU3luYyh0aGlzLm5tKG8pLCB0aGlzLm5tKG4pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXQobmFtZSwgbGFyZ2UsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5zdGF0U3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICAgIHJldHVybiBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHMoanNfc3RhdHMsIGxhcmdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgbHN0YXQobmFtZSwgbGFyZ2UsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5sc3RhdFN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgICByZXR1cm4gb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzKGpzX3N0YXRzLCBsYXJnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGNobW9kKG5hbWUsIHBlcm1zLCByYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZnMuY2htb2RTeW5jKHRoaXMubm0obmFtZSksIHBlcm1zKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBsaW5rKHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmxpbmtTeW5jKHRoaXMubm0odGFyZ2V0KSwgdGhpcy5ubShwYXRoKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgc3ltbGluayh0b19kaXIsIHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnN5bWxpbmtTeW5jKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHRoaXMubm0ocGF0aCksXG4gICAgICAgIHRvX2RpciA9PT0gMCA/IG51bGwgOiB0b19kaXJbMV0gPyBcImRpclwiIDogXCJmaWxlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRsaW5rKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGxpbmsgPSB0aGlzLmZzLnJlYWRsaW5rU3luYyh0aGlzLm5tKG5hbWUpLCBcInV0ZjhcIik7XG4gICAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobGluayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mcy5vcGVuZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IG9jYW1sX3N0YXRzX2Zyb21fbm9kZV9zdGF0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdFxuZnVuY3Rpb24gb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzKGpzX3N0YXRzLCBsYXJnZSkge1xuICAvKiA9PT1Vbml4LmZpbGVfa2luZD09PVxuICAgKiB0eXBlIGZpbGVfa2luZCA9XG4gICAqICAgICBTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgKCoqIFJlZ3VsYXIgZmlsZSAqKVxuICAgKiAgIHwgU19ESVIgICAgICAgICAgICAgICAgICAgICAgICgqKiBEaXJlY3RvcnkgKilcbiAgICogICB8IFNfQ0hSICAgICAgICAgICAgICAgICAgICAgICAoKiogQ2hhcmFjdGVyIGRldmljZSAqKVxuICAgKiAgIHwgU19CTEsgICAgICAgICAgICAgICAgICAgICAgICgqKiBCbG9jayBkZXZpY2UgKilcbiAgICogICB8IFNfTE5LICAgICAgICAgICAgICAgICAgICAgICAoKiogU3ltYm9saWMgbGluayAqKVxuICAgKiAgIHwgU19GSUZPICAgICAgICAgICAgICAgICAgICAgICgqKiBOYW1lZCBwaXBlICopXG4gICAqICAgfCBTX1NPQ0sgICAgICAgICAgICAgICAgICAgICAgKCoqIFNvY2tldCAqKVxuICAgKi9cbiAgdmFyIGZpbGVfa2luZDtcbiAgaWYgKGpzX3N0YXRzLmlzRmlsZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMDtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgZmlsZV9raW5kID0gMTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0NoYXJhY3RlckRldmljZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMjtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0Jsb2NrRGV2aWNlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAzO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBmaWxlX2tpbmQgPSA0O1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzRklGTygpKSB7XG4gICAgZmlsZV9raW5kID0gNTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc1NvY2tldCgpKSB7XG4gICAgZmlsZV9raW5kID0gNjtcbiAgfVxuICAvKiA9PT1Vbml4LnN0YXRzPT09XG4gICAqIHR5cGUgc3RhdHMgPVxuICAgKiAgeyBzdF9kZXYgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIERldmljZSBudW1iZXIgKilcbiAgICogICAgc3RfaW5vIDogaW50OyAgICAgICAgICAgICAgICgqKiBJbm9kZSBudW1iZXIgKilcbiAgICogICAgc3Rfa2luZCA6IGZpbGVfa2luZDsgICAgICAgICgqKiBLaW5kIG9mIHRoZSBmaWxlICopXG4gICAqICAgIHN0X3Blcm0gOiBmaWxlX3Blcm07ICAgICAgICAoKiogQWNjZXNzIHJpZ2h0cyAqKVxuICAgKiAgICBzdF9ubGluayA6IGludDsgICAgICAgICAgICAgKCoqIE51bWJlciBvZiBsaW5rcyAqKVxuICAgKiAgICBzdF91aWQgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIFVzZXIgaWQgb2YgdGhlIG93bmVyICopXG4gICAqICAgIHN0X2dpZCA6IGludDsgICAgICAgICAgICAgICAoKiogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cCAqKVxuICAgKiAgICBzdF9yZGV2IDogaW50OyAgICAgICAgICAgICAgKCoqIERldmljZSBJRCAoaWYgc3BlY2lhbCBmaWxlKSAqKVxuICAgKiAgICBzdF9zaXplIDogaW50OyAgICAgICAgICAgICAgKCoqIFNpemUgaW4gYnl0ZXMgKilcbiAgICogICAgc3RfYXRpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IGFjY2VzcyB0aW1lICopXG4gICAqICAgIHN0X210aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSAqKVxuICAgKiAgICBzdF9jdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3Qgc3RhdHVzIGNoYW5nZSB0aW1lICopXG4gICAqICB9XG4gICAqL1xuICByZXR1cm4gQkxPQ0soXG4gICAgMCxcbiAgICBqc19zdGF0cy5kZXYsXG4gICAganNfc3RhdHMuaW5vIHwgMCxcbiAgICBmaWxlX2tpbmQsXG4gICAganNfc3RhdHMubW9kZSxcbiAgICBqc19zdGF0cy5ubGluayxcbiAgICBqc19zdGF0cy51aWQsXG4gICAganNfc3RhdHMuZ2lkLFxuICAgIGpzX3N0YXRzLnJkZXYsXG4gICAgbGFyZ2UgPyBjYW1sX2ludDY0X29mX2Zsb2F0KGpzX3N0YXRzLnNpemUpIDoganNfc3RhdHMuc2l6ZSB8IDAsXG4gICAganNfc3RhdHMuYXRpbWVNcyAvIDEwMDAsXG4gICAganNfc3RhdHMubXRpbWVNcyAvIDEwMDAsXG4gICAganNfc3RhdHMuY3RpbWVNcyAvIDEwMDAsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZURldmljZVxuLy9JZjogYnJvd3NlclxuY2xhc3MgTWxOb2RlRGV2aWNlIHt9XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL1JlcXVpcmVzOiBNbEZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX3NldCwgY2FtbF9yYWlzZV9zeXNfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yLCBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvciwgb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzXG5jbGFzcyBNbE5vZGVGZCBleHRlbmRzIE1sRmlsZSB7XG4gIGNvbnN0cnVjdG9yKGZkLCBmbGFncykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mcyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpO1xuICAgIHRoaXMuZmQgPSBmZDtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGF0cyA9IHRoaXMuZnMuZnN0YXRTeW5jKGZkKTtcbiAgICAgIGZsYWdzLm5vU2VlayA9XG4gICAgICAgIHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHwgc3RhdHMuaXNGSUZPKCkgfHwgc3RhdHMuaXNTb2NrZXQoKTtcbiAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5mbGFncy5hcHBlbmQgPyBzdGF0cy5zaXplIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFRoZSBmc3RhdCB3aWxsIGZhaWwgb24gc3RhbmRhcmQgc3RyZWFtcyB1bmRlciBXaW5kb3dzIHdpdGggbm9kZVxuICAgICAgLy8gMTggKGFuZCBsb3dlcikuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbGlidXYvbGlidXYvcHVsbC8zODExLlxuICAgICAgZmxhZ3Mubm9TZWVrID0gdHJ1ZTtcbiAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5zZWVrZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHRydW5jYXRlKGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmZ0cnVuY2F0ZVN5bmModGhpcy5mZCwgbGVuIHwgMCk7XG4gICAgICBpZiAodGhpcy5vZmZzZXQgPiBsZW4pIHRoaXMub2Zmc2V0ID0gbGVuO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBpc2F0dHkoKSB7XG4gICAgdmFyIHR0eSA9IHJlcXVpcmUoXCJub2RlOnR0eVwiKTtcbiAgICByZXR1cm4gdHR5LmlzYXR0eSh0aGlzLmZkKSA/IDEgOiAwO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mcy5mc3RhdFN5bmModGhpcy5mZCkuc2l6ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZShidWYsIGJ1Zl9vZmZzZXQsIGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mbGFncy5ub1NlZWsgfHwgIXRoaXMuc2Vla2VkKSB7XG4gICAgICAgIHZhciB3cml0dGVuID0gdGhpcy5mcy53cml0ZVN5bmModGhpcy5mZCwgYnVmLCBidWZfb2Zmc2V0LCBsZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHdyaXR0ZW4gPSB0aGlzLmZzLndyaXRlU3luYyhcbiAgICAgICAgICB0aGlzLmZkLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBidWZfb2Zmc2V0LFxuICAgICAgICAgIGxlbixcbiAgICAgICAgICB0aGlzLm9mZnNldCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2Zmc2V0ICs9IHdyaXR0ZW47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbiAgfVxuXG4gIHJlYWQoYSwgYnVmX29mZnNldCwgbGVuLCByYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZsYWdzLm5vU2VlayB8fCAhdGhpcy5zZWVrZWQpIHtcbiAgICAgICAgdmFyIHJlYWQgPSB0aGlzLmZzLnJlYWRTeW5jKHRoaXMuZmQsIGEsIGJ1Zl9vZmZzZXQsIGxlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVhZCA9IHRoaXMuZnMucmVhZFN5bmModGhpcy5mZCwgYSwgYnVmX29mZnNldCwgbGVuLCB0aGlzLm9mZnNldCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCArPSByZWFkO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIHNlZWsob2Zmc2V0LCB3aGVuY2UsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5mbGFncy5ub1NlZWspIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKHJhaXNlX3VuaXgsIFwiRVNQSVBFXCIsIFwibHNlZWtcIiwgXCJpbGxlZ2FsIHNlZWtcIik7XG4gICAgfVxuICAgIHN3aXRjaCAod2hlbmNlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFSU5WQUxcIixcbiAgICAgICAgXCJsc2Vla1wiLFxuICAgICAgICBcImludmFsaWQgYXJndW1lbnRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHRoaXMuc2Vla2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5vZmZzZXQ7XG4gIH1cblxuICBwb3MoKSB7XG4gICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICB9XG5cbiAgc3RhdChsYXJnZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIganNfc3RhdHMgPSB0aGlzLmZzLmZzdGF0U3luYyh0aGlzLmZkKTtcbiAgICAgIHJldHVybiBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHMoanNfc3RhdHMsIGxhcmdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgICB9XG4gIH1cblxuICBjaG1vZChwZXJtcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmZjaG1vZFN5bmModGhpcy5mZCwgcGVybXMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gMSk7XG4gICAgfVxuICB9XG5cbiAgc3luYygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy5mc3luY1N5bmModGhpcy5mZCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZnMuY2xvc2VTeW5jKHRoaXMuZmQpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrX3N0cmVhbV9zZW1hbnRpY3MoY21kKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBqc19zdGF0cyA9IHRoaXMuZnMuZnN0YXRTeW5jKHRoaXMuZmQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCAvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIGNtZCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGpzX3N0YXRzLmlzRmlsZSgpIHx8XG4gICAgICAgIGpzX3N0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICAgICAganNfc3RhdHMuaXNGSUZPKCkgfHxcbiAgICAgICAganNfc3RhdHMuaXNTb2NrZXQoKVxuICAgICAgKVxuICAgIClcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIDEsXG4gICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgIGNtZCxcbiAgICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgICApO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL0lmOiBicm93c2VyXG5jbGFzcyBNbE5vZGVGZCB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlXG4vL1JlcXVpcmVzOiBNbE5vZGVGZFxuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpIHtcbiAgaWYgKGZsYWdzLmFsdG5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGZzID0gcmVxdWlyZShcIm5vZGU6ZnNcIik7XG4gICAgICB2YXIgZmQyID0gZnMub3BlblN5bmMoZmxhZ3MuYWx0bmFtZSwgXCJyc1wiKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQyLCBmbGFncyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gbmV3IE1sTm9kZUZkKGZkLCBmbGFncyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5fZm9yX25vZGVcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5fZm9yX25vZGUoX2ZkLCBfZmxhZ3MpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfYXJncywgbWFrZV91bml4X2Vycl9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4LCBjbWQpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKFwiVW5peC5Vbml4X2Vycm9yXCIpO1xuICBpZiAocmFpc2VfdW5peCAmJiB1bml4X2Vycm9yKSB7XG4gICAgdmFyIGFyZ3MgPSBtYWtlX3VuaXhfZXJyX2FyZ3MoXG4gICAgICBlcnIuY29kZSxcbiAgICAgIGNtZCB8fCBlcnIuc3lzY2FsbCxcbiAgICAgIGVyci5wYXRoLFxuICAgICAgZXJyLmVycm5vLFxuICAgICk7XG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZCwgQW5keSBSYXlcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbi8vXG4vLyBCaWdhcnJheS5cbi8vXG4vLyAtIGFsbCBiaWdhcnJheSB0eXBlcyBpbmNsdWRpbmcgSW50NjQgYW5kIENvbXBsZXguXG4vLyAtIGZvcnRyYW4gKyBjIGxheW91dHNcbi8vIC0gc3ViL3NsaWNlL3Jlc2hhcGVcbi8vIC0gcmV0YWluIGZhc3QgcGF0aCBmb3IgMWQgYXJyYXkgYWNjZXNzXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfaW5pdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9iYV9pbml0KCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9zaXplKGRpbXMpIHtcbiAgdmFyIG5fZGltcyA9IGRpbXMubGVuZ3RoO1xuICB2YXIgc2l6ZSA9IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbl9kaW1zOyBpKyspIHtcbiAgICBpZiAoZGltc1tpXSA8IDApXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5jcmVhdGU6IG5lZ2F0aXZlIGRpbWVuc2lvblwiKTtcbiAgICBzaXplID0gc2l6ZSAqIGRpbXNbaV07XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5wYWNrRmxvYXQxNlxudmFyIGNhbWxfdW5wYWNrRmxvYXQxNiA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBwb3cgPSBNYXRoLnBvdztcblxuICB2YXIgRVhQX01BU0sxNiA9IDMxOyAvLyAyICoqIDUgLSAxXG4gIHZhciBTSUdOSUZJQ0FORF9NQVNLMTYgPSAxMDIzOyAvLyAyICoqIDEwIC0gMVxuICB2YXIgTUlOX1NVQk5PUk1BTDE2ID0gcG93KDIsIC0yNCk7IC8vIDIgKiogLTEwICogMiAqKiAtMTRcbiAgdmFyIFNJR05JRklDQU5EX0RFTk9NMTYgPSAwLjAwMDk3NjU2MjU7IC8vIDIgKiogLTEwXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBzaWduID0gYnl0ZXMgPj4+IDE1O1xuICAgIHZhciBleHBvbmVudCA9IChieXRlcyA+Pj4gMTApICYgRVhQX01BU0sxNjtcbiAgICB2YXIgc2lnbmlmaWNhbmQgPSBieXRlcyAmIFNJR05JRklDQU5EX01BU0sxNjtcbiAgICBpZiAoZXhwb25lbnQgPT09IEVYUF9NQVNLMTYpXG4gICAgICByZXR1cm4gc2lnbmlmaWNhbmQgPT09IDBcbiAgICAgICAgPyBzaWduID09PSAwXG4gICAgICAgICAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICA6IE51bWJlci5OYU47XG4gICAgaWYgKGV4cG9uZW50ID09PSAwKVxuICAgICAgcmV0dXJuIHNpZ25pZmljYW5kICogKHNpZ24gPT09IDAgPyBNSU5fU1VCTk9STUFMMTYgOiAtTUlOX1NVQk5PUk1BTDE2KTtcbiAgICB2YXIgciA9XG4gICAgICBwb3coMiwgZXhwb25lbnQgLSAxNSkgKlxuICAgICAgKHNpZ24gPT09IDBcbiAgICAgICAgPyAxICsgc2lnbmlmaWNhbmQgKiBTSUdOSUZJQ0FORF9ERU5PTTE2XG4gICAgICAgIDogLTEgLSBzaWduaWZpY2FuZCAqIFNJR05JRklDQU5EX0RFTk9NMTYpO1xuICAgIHJldHVybiByO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9wYWNrRmxvYXQxNlxudmFyIGNhbWxfcGFja0Zsb2F0MTYgPSAoZnVuY3Rpb24gKCkge1xuICBjb25zdCBJTlZFUlNFX09GX0VQU0lMT04gPSAxIC8gTnVtYmVyLkVQU0lMT047XG5cbiAgZnVuY3Rpb24gcm91bmRUaWVzVG9FdmVuKG51bSkge1xuICAgIHJldHVybiBudW0gKyBJTlZFUlNFX09GX0VQU0lMT04gLSBJTlZFUlNFX09GX0VQU0lMT047XG4gIH1cblxuICBjb25zdCBGTE9BVDE2X01JTl9WQUxVRSA9IDYuMTAzNTE1NjI1ZS01O1xuICBjb25zdCBGTE9BVDE2X01BWF9WQUxVRSA9IDY1NTA0O1xuICBjb25zdCBGTE9BVDE2X0VQU0lMT04gPSAwLjAwMDk3NjU2MjU7XG5cbiAgY29uc3QgRkxPQVQxNl9FUFNJTE9OX01VTFRJUExJRURfQllfRkxPQVQxNl9NSU5fVkFMVUUgPVxuICAgIEZMT0FUMTZfRVBTSUxPTiAqIEZMT0FUMTZfTUlOX1ZBTFVFO1xuICBjb25zdCBGTE9BVDE2X0VQU0lMT05fREVWSURFRF9CWV9FUFNJTE9OID1cbiAgICBGTE9BVDE2X0VQU0lMT04gKiBJTlZFUlNFX09GX0VQU0lMT047XG5cbiAgZnVuY3Rpb24gcm91bmRUb0Zsb2F0MTYobnVtKSB7XG4gICAgY29uc3QgbnVtYmVyID0gK251bTtcblxuICAgIC8vIE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLTBcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXIpIHx8IG51bWJlciA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvLyBmaW5pdGUgZXhjZXB0IDAsIC0wXG4gICAgY29uc3Qgc2lnbiA9IG51bWJlciA+IDAgPyAxIDogLTE7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBNYXRoLmFicyhudW1iZXIpO1xuXG4gICAgLy8gc21hbGwgbnVtYmVyXG4gICAgaWYgKGFic29sdXRlIDwgRkxPQVQxNl9NSU5fVkFMVUUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNpZ24gKlxuICAgICAgICByb3VuZFRpZXNUb0V2ZW4oXG4gICAgICAgICAgYWJzb2x1dGUgLyBGTE9BVDE2X0VQU0lMT05fTVVMVElQTElFRF9CWV9GTE9BVDE2X01JTl9WQUxVRSxcbiAgICAgICAgKSAqXG4gICAgICAgIEZMT0FUMTZfRVBTSUxPTl9NVUxUSVBMSUVEX0JZX0ZMT0FUMTZfTUlOX1ZBTFVFXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXAgPSAoMSArIEZMT0FUMTZfRVBTSUxPTl9ERVZJREVEX0JZX0VQU0lMT04pICogYWJzb2x1dGU7XG4gICAgY29uc3QgcmVzdWx0ID0gdGVtcCAtICh0ZW1wIC0gYWJzb2x1dGUpO1xuXG4gICAgLy8gbGFyZ2UgbnVtYmVyXG4gICAgaWYgKHJlc3VsdCA+IEZMT0FUMTZfTUFYX1ZBTFVFIHx8IE51bWJlci5pc05hTihyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gc2lnbiAqIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbiAqIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGJhc2UgYWxnb3JpdGhtOiBodHRwOi8vZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcblxuICBjb25zdCBiYXNlVGFibGUgPSBuZXcgVWludDE2QXJyYXkoNTEyKTtcbiAgY29uc3Qgc2hpZnRUYWJsZSA9IG5ldyBVaW50OEFycmF5KDUxMik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGNvbnN0IGUgPSBpIC0gMTI3O1xuXG4gICAgLy8gdmVyeSBzbWFsbCBudW1iZXIgKDAsIC0wKVxuICAgIGlmIChlIDwgLTI0KSB7XG4gICAgICBiYXNlVGFibGVbaV0gPSAweDAwMDA7XG4gICAgICBiYXNlVGFibGVbaSB8IDB4MTAwXSA9IDB4ODAwMDtcbiAgICAgIHNoaWZ0VGFibGVbaV0gPSAyNDtcbiAgICAgIHNoaWZ0VGFibGVbaSB8IDB4MTAwXSA9IDI0O1xuXG4gICAgICAvLyBzbWFsbCBudW1iZXIgKGRlbm9ybSlcbiAgICB9IGVsc2UgaWYgKGUgPCAtMTQpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IDB4MDQwMCA+PiAoLWUgLSAxNCk7XG4gICAgICBiYXNlVGFibGVbaSB8IDB4MTAwXSA9ICgweDA0MDAgPj4gKC1lIC0gMTQpKSB8IDB4ODAwMDtcbiAgICAgIHNoaWZ0VGFibGVbaV0gPSAtZSAtIDE7XG4gICAgICBzaGlmdFRhYmxlW2kgfCAweDEwMF0gPSAtZSAtIDE7XG5cbiAgICAgIC8vIG5vcm1hbCBudW1iZXJcbiAgICB9IGVsc2UgaWYgKGUgPD0gMTUpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IChlICsgMTUpIDw8IDEwO1xuICAgICAgYmFzZVRhYmxlW2kgfCAweDEwMF0gPSAoKGUgKyAxNSkgPDwgMTApIHwgMHg4MDAwO1xuICAgICAgc2hpZnRUYWJsZVtpXSA9IDEzO1xuICAgICAgc2hpZnRUYWJsZVtpIHwgMHgxMDBdID0gMTM7XG5cbiAgICAgIC8vIGxhcmdlIG51bWJlciAoSW5maW5pdHksIC1JbmZpbml0eSlcbiAgICB9IGVsc2UgaWYgKGUgPCAxMjgpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IDB4N2MwMDtcbiAgICAgIGJhc2VUYWJsZVtpIHwgMHgxMDBdID0gMHhmYzAwO1xuICAgICAgc2hpZnRUYWJsZVtpXSA9IDI0O1xuICAgICAgc2hpZnRUYWJsZVtpIHwgMHgxMDBdID0gMjQ7XG5cbiAgICAgIC8vIHN0YXkgKE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZVRhYmxlW2ldID0gMHg3YzAwO1xuICAgICAgYmFzZVRhYmxlW2kgfCAweDEwMF0gPSAweGZjMDA7XG4gICAgICBzaGlmdFRhYmxlW2ldID0gMTM7XG4gICAgICBzaGlmdFRhYmxlW2kgfCAweDEwMF0gPSAxMztcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCk7XG4gIGNvbnN0IGZsb2F0VmlldyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgY29uc3QgdWludDMyVmlldyA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAobnVtKSB7XG4gICAgZmxvYXRWaWV3WzBdID0gcm91bmRUb0Zsb2F0MTYobnVtKTtcbiAgICBjb25zdCBmID0gdWludDMyVmlld1swXTtcbiAgICBjb25zdCBlID0gKGYgPj4gMjMpICYgMHgxZmY7XG4gICAgcmV0dXJuIGJhc2VUYWJsZVtlXSArICgoZiAmIDB4MDA3ZmZmZmYpID4+IHNoaWZ0VGFibGVbZV0pO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKSB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgNzpcbiAgICBjYXNlIDEwOlxuICAgIGNhc2UgMTE6XG4gICAgICByZXR1cm4gMjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlX2J1ZmZlcihraW5kLCBzaXplKSB7XG4gIHZhciB2aWV3O1xuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIDA6XG4gICAgICB2aWV3ID0gRmxvYXQzMkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgdmlldyA9IEZsb2F0NjRBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZpZXcgPSBJbnQ4QXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2aWV3ID0gVWludDhBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZpZXcgPSBJbnQxNkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgdmlldyA9IFVpbnQxNkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OlxuICAgICAgdmlldyA9IEludDMyQXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICB2aWV3ID0gSW50MzJBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHZpZXcgPSBJbnQzMkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgdmlldyA9IEludDMyQXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgICAgdmlldyA9IEZsb2F0MzJBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6XG4gICAgICB2aWV3ID0gRmxvYXQ2NEFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjpcbiAgICAgIHZpZXcgPSBVaW50OEFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzpcbiAgICAgIHZpZXcgPSBVaW50MTZBcnJheTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmICghdmlldykgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuY3JlYXRlOiB1bnN1cHBvcnRlZCBraW5kXCIpO1xuICB2YXIgZGF0YSA9IG5ldyB2aWV3KHNpemUgKiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpKTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3VzdG9tX25hbWVcbnZhciBjYW1sX2JhX2N1c3RvbV9uYW1lID0gXCJfYmlnYXJyMDJcIjtcblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9jdXN0b21fbmFtZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGksIGNhbWxfaW50NjRfaGkzMiwgY2FtbF9pbnQ2NF9sbzMyXG4vL1JlcXVpcmVzOiBjYW1sX3BhY2tGbG9hdDE2LCBjYW1sX3VucGFja0Zsb2F0MTZcbmNsYXNzIE1sX0JpZ2FycmF5IHtcbiAgY29uc3RydWN0b3Ioa2luZCwgbGF5b3V0LCBkaW1zLCBidWZmZXIpIHtcbiAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIHRoaXMuZGltcyA9IGRpbXM7XG4gICAgdGhpcy5kYXRhID0gYnVmZmVyO1xuICAgIHRoaXMuY2FtbF9jdXN0b20gPSBjYW1sX2JhX2N1c3RvbV9uYW1lO1xuICB9XG5cbiAgb2Zmc2V0KGFyZykge1xuICAgIHZhciBvZnMgPSAwO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSBhcmcgPSBbYXJnXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImJpZ2FycmF5LmpzOiBpbnZhbGlkIG9mZnNldFwiKTtcbiAgICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPT0gYXJnLmxlbmd0aClcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmdldC9zZXQ6IGJhZCBudW1iZXIgb2YgZGltZW5zaW9uc1wiKTtcbiAgICBpZiAodGhpcy5sYXlvdXQgPT09IDAgLyogY19sYXlvdXQgKi8pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmdbaV0gPCAwIHx8IGFyZ1tpXSA+PSB0aGlzLmRpbXNbaV0pIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgICAgb2ZzID0gb2ZzICogdGhpcy5kaW1zW2ldICsgYXJnW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5kaW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChhcmdbaV0gPCAxIHx8IGFyZ1tpXSA+IHRoaXMuZGltc1tpXSkge1xuICAgICAgICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBvZnMgPSBvZnMgKiB0aGlzLmRpbXNbaV0gKyAoYXJnW2ldIC0gMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZnM7XG4gIH1cblxuICBnZXQob2ZzKSB7XG4gICAgc3dpdGNoICh0aGlzLmtpbmQpIHtcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gSW50NjRcbiAgICAgICAgdmFyIGwgPSB0aGlzLmRhdGFbb2ZzICogMiArIDBdO1xuICAgICAgICB2YXIgaCA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMV07XG4gICAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsLCBoKTtcbiAgICAgIGNhc2UgMTA6XG4gICAgICBjYXNlIDExOlxuICAgICAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgICAgICB2YXIgciA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMF07XG4gICAgICAgIHZhciBpID0gdGhpcy5kYXRhW29mcyAqIDIgKyAxXTtcbiAgICAgICAgcmV0dXJuIFsyNTQsIHIsIGldO1xuICAgICAgY2FzZSAxMzpcbiAgICAgICAgcmV0dXJuIGNhbWxfdW5wYWNrRmxvYXQxNih0aGlzLmRhdGFbb2ZzXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW29mc107XG4gICAgfVxuICB9XG5cbiAgc2V0KG9mcywgdikge1xuICAgIHN3aXRjaCAodGhpcy5raW5kKSB7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIC8vIEludDY0XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSBjYW1sX2ludDY0X2xvMzIodik7XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMV0gPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSB2WzFdO1xuICAgICAgICB0aGlzLmRhdGFbb2ZzICogMiArIDFdID0gdlsyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLmRhdGFbb2ZzXSA9IGNhbWxfcGFja0Zsb2F0MTYodik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5kYXRhW29mc10gPSB2O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmaWxsKHYpIHtcbiAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgY2FzZSA3OlxuICAgICAgICAvLyBJbnQ2NFxuICAgICAgICB2YXIgYSA9IGNhbWxfaW50NjRfbG8zMih2KTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmZpbGwoYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IGkgJSAyID09PSAwID8gYSA6IGI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgICAgIHZhciBpbSA9IHZbMV07XG4gICAgICAgIHZhciByZSA9IHZbMl07XG4gICAgICAgIGlmIChpbSA9PT0gcmUpIHtcbiAgICAgICAgICB0aGlzLmRhdGEuZmlsbChpbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IGkgJSAyID09PSAwID8gaW0gOiByZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLmRhdGEuZmlsbChjYW1sX3BhY2tGbG9hdDE2KHYpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyZShiLCB0b3RhbCkge1xuICAgIGlmICh0aGlzLmxheW91dCAhPT0gYi5sYXlvdXQgfHwgdGhpcy5raW5kICE9PSBiLmtpbmQpIHtcbiAgICAgIHZhciBrMSA9IHRoaXMua2luZCB8ICh0aGlzLmxheW91dCA8PCA4KTtcbiAgICAgIHZhciBrMiA9IGIua2luZCB8IChiLmxheW91dCA8PCA4KTtcbiAgICAgIHJldHVybiBrMiAtIGsxO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPT0gYi5kaW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGIuZGltcy5sZW5ndGggLSB0aGlzLmRpbXMubGVuZ3RoO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGltcy5sZW5ndGg7IGkrKylcbiAgICAgIGlmICh0aGlzLmRpbXNbaV0gIT09IGIuZGltc1tpXSkgcmV0dXJuIHRoaXMuZGltc1tpXSA8IGIuZGltc1tpXSA/IC0xIDogMTtcbiAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIEZsb2F0c1xuICAgICAgICB2YXIgeCwgeTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4ID0gdGhpcy5kYXRhW2ldO1xuICAgICAgICAgIHkgPSBiLmRhdGFbaV07XG4gICAgICAgICAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHggPiB5KSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoeCAhPT0geSkge1xuICAgICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTih4KSkgcmV0dXJuIDE7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTih5KSkgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gSW50NjRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAvLyBDaGVjayBoaWdoZXN0IGJpdHMgZmlyc3RcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA8IGIuZGF0YVtpICsgMV0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA+IGIuZGF0YVtpICsgMV0pIHJldHVybiAxO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPj4+IDAgPCBiLmRhdGFbaV0gPj4+IDApIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID4+PiAwID4gYi5kYXRhW2ldID4+PiAwKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGFhID0gY2FtbF91bnBhY2tGbG9hdDE2KHRoaXMuZGF0YVtpXSk7XG4gICAgICAgICAgdmFyIGJiID0gY2FtbF91bnBhY2tGbG9hdDE2KGIuZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGFhIDwgYmIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYWEgPiBiYikgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDg6XG4gICAgICBjYXNlIDk6XG4gICAgICBjYXNlIDEyOlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPCBiLmRhdGFbaV0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID4gYi5kYXRhW2ldKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlfY18xXzFcbi8vUmVxdWlyZXM6IE1sX0JpZ2FycmF5LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmNsYXNzIE1sX0JpZ2FycmF5X2NfMV8xIGV4dGVuZHMgTWxfQmlnYXJyYXkge1xuICBvZmZzZXQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCA9PT0gMSkgYXJnID0gYXJnWzBdO1xuICAgICAgZWxzZSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJNbF9CaWdhcnJheV9jXzFfMS5vZmZzZXRcIik7XG4gICAgfVxuICAgIGlmIChhcmcgPCAwIHx8IGFyZyA+PSB0aGlzLmRpbXNbMF0pIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICByZXR1cm4gYXJnO1xuICB9XG5cbiAgZ2V0KG9mcykge1xuICAgIHJldHVybiB0aGlzLmRhdGFbb2ZzXTtcbiAgfVxuXG4gIHNldChvZnMsIHYpIHtcbiAgICB0aGlzLmRhdGFbb2ZzXSA9IHY7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmaWxsKHYpIHtcbiAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NvbXBhcmVcbmZ1bmN0aW9uIGNhbWxfYmFfY29tcGFyZShhLCBiLCB0b3RhbCkge1xuICByZXR1cm4gYS5jb21wYXJlKGIsIHRvdGFsKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBNbF9CaWdhcnJheSwgTWxfQmlnYXJyYXlfY18xXzEsIGNhbWxfYmFfZ2V0X3NpemUsIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSkge1xuICB2YXIgc2l6ZV9wZXJfZWxlbWVudCA9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCk7XG4gIGlmIChjYW1sX2JhX2dldF9zaXplKGRpbXMpICogc2l6ZV9wZXJfZWxlbWVudCAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJsZW5ndGggZG9lc24ndCBtYXRjaCBkaW1zXCIpO1xuICB9XG4gIGlmIChcbiAgICBsYXlvdXQgPT09IDAgJiYgLy8gY19sYXlvdXRcbiAgICBkaW1zLmxlbmd0aCA9PT0gMSAmJiAvLyBBcnJheTFcbiAgICBzaXplX3Blcl9lbGVtZW50ID09PSAxICYmXG4gICAga2luZCAhPT0gMTMgLy8gZmxvYXQxNlxuICApXG4gICAgLy8gMS10by0xIG1hcHBpbmdcbiAgICByZXR1cm4gbmV3IE1sX0JpZ2FycmF5X2NfMV8xKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG4gIHJldHVybiBuZXcgTWxfQmlnYXJyYXkoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlKGtpbmQsIGxheW91dCwgZGltc19tbCkge1xuICB2YXIgZGltcyA9IGNhbWxfanNfZnJvbV9hcnJheShkaW1zX21sKTtcbiAgdmFyIGRhdGEgPSBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGNhbWxfYmFfY2hhbmdlX2xheW91dChiYSwgbGF5b3V0KSB7XG4gIGlmIChiYS5sYXlvdXQgPT09IGxheW91dCkgcmV0dXJuIGJhO1xuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIG5ld19kaW1zW2ldID0gYmEuZGltc1tiYS5kaW1zLmxlbmd0aCAtIGkgLSAxXTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBsYXlvdXQsIG5ld19kaW1zLCBiYS5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9raW5kXG5mdW5jdGlvbiBjYW1sX2JhX2tpbmQoYmEpIHtcbiAgcmV0dXJuIGJhLmtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbGF5b3V0XG5mdW5jdGlvbiBjYW1sX2JhX2xheW91dChiYSkge1xuICByZXR1cm4gYmEubGF5b3V0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX251bV9kaW1zXG5mdW5jdGlvbiBjYW1sX2JhX251bV9kaW1zKGJhKSB7XG4gIHJldHVybiBiYS5kaW1zLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1cbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9kaW0oYmEsIGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gYmEuZGltcy5sZW5ndGgpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmRpbVwiKTtcbiAgcmV0dXJuIGJhLmRpbXNbaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzFcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8xKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzJcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8yKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzNcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8zKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfZ2VuZXJpYyhiYSwgaSkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSk7XG4gIHJldHVybiBiYS5nZXQob2ZzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQxNihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMpO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHJldHVybiBiMSB8IChiMiA8PCA4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQzMihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAzID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMgKyAwKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcyArIDEpO1xuICB2YXIgYjMgPSBiYS5nZXQob2ZzICsgMik7XG4gIHZhciBiNCA9IGJhLmdldChvZnMgKyAzKTtcbiAgcmV0dXJuIChiMSA8PCAwKSB8IChiMiA8PCA4KSB8IChiMyA8PCAxNikgfCAoYjQgPDwgMjQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDY0KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYgKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyArIDApO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHZhciBiMyA9IGJhLmdldChvZnMgKyAyKTtcbiAgdmFyIGI0ID0gYmEuZ2V0KG9mcyArIDMpO1xuICB2YXIgYjUgPSBiYS5nZXQob2ZzICsgNCk7XG4gIHZhciBiNiA9IGJhLmdldChvZnMgKyA1KTtcbiAgdmFyIGI3ID0gYmEuZ2V0KG9mcyArIDYpO1xuICB2YXIgYjggPSBiYS5nZXQob2ZzICsgNyk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKFtiOCwgYjcsIGI2LCBiNSwgYjQsIGIzLCBiMiwgYjFdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMShiYSwgaTApIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoaTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMlxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMihiYSwgaTAsIGkxKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KFtpMCwgaTFdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0XzNcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0XzMoYmEsIGkwLCBpMSwgaTIpIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoW2kwLCBpMSwgaTJdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfZ2VuZXJpYyhiYSwgaSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSksIHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQxNihiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGJhLnNldChvZnMgKyAwLCB2ICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAxLCAodiA+Pj4gOCkgJiAweGZmKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfc2V0MzIoYmEsIGkwLCB2KSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZiAob2ZzICsgMyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBiYS5zZXQob2ZzICsgMCwgdiAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzICsgMSwgKHYgPj4+IDgpICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAyLCAodiA+Pj4gMTYpICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAzLCAodiA+Pj4gMjQpICYgMHhmZik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDY0KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYgKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIHYgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgYmEuc2V0KG9mcyArIGksIHZbNyAtIGldKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzFcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzEoYmEsIGkwLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoaTApLCB2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzJcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzIoYmEsIGkwLCBpMSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KFtpMCwgaTFdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8zXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8zKGJhLCBpMCwgaTEsIGkyLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoW2kwLCBpMSwgaTJdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2ZpbGxcbmZ1bmN0aW9uIGNhbWxfYmFfZmlsbChiYSwgdikge1xuICBiYS5maWxsKHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9ibGl0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfYmxpdChzcmMsIGRzdCkge1xuICBpZiAoZHN0LmRpbXMubGVuZ3RoICE9PSBzcmMuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuYmxpdDogZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRzdC5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkc3QuZGltc1tpXSAhPT0gc3JjLmRpbXNbaV0pXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5ibGl0OiBkaW1lbnNpb24gbWlzbWF0Y2hcIik7XG4gIGRzdC5kYXRhLnNldChzcmMuZGF0YSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3N1YlxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfc3ViKGJhLCBvZnMsIGxlbikge1xuICB2YXIgY2hhbmdlZF9kaW07XG4gIHZhciBtdWwgPSAxO1xuICBpZiAoYmEubGF5b3V0ID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gMDtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoIC0gMTsgaSsrKSBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gYmEuZGltcy5sZW5ndGggLSAxO1xuICAgIG9mcyA9IG9mcyAtIDE7XG4gIH1cbiAgaWYgKG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgKyBsZW4gPiBiYS5kaW1zW2NoYW5nZWRfZGltXSkge1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnN1YjogYmFkIHN1Yi1hcnJheVwiKTtcbiAgfVxuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBuZXdfZGltc1tpXSA9IGJhLmRpbXNbaV07XG4gIG5ld19kaW1zW2NoYW5nZWRfZGltXSA9IGxlbjtcbiAgbXVsICo9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoYmEua2luZCk7XG4gIHZhciBuZXdfZGF0YSA9IGJhLmRhdGEuc3ViYXJyYXkob2ZzICogbXVsLCAob2ZzICsgbGVuKSAqIG11bCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBuZXdfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NsaWNlXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX3NsaWNlKGJhLCB2aW5kKSB7XG4gIHZpbmQgPSBjYW1sX2pzX2Zyb21fYXJyYXkodmluZCk7XG4gIHZhciBudW1faW5kcyA9IHZpbmQubGVuZ3RoO1xuICB2YXIgaW5kZXggPSBbXTtcbiAgdmFyIHN1Yl9kaW1zID0gW107XG4gIHZhciBvZnM7XG5cbiAgaWYgKG51bV9pbmRzID4gYmEuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuc2xpY2U6IHRvbyBtYW55IGluZGljZXNcIik7XG5cbiAgLy8gQ29tcHV0ZSBvZmZzZXQgYW5kIGNoZWNrIGJvdW5kc1xuICBpZiAoYmEubGF5b3V0ID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1faW5kczsgaSsrKSBpbmRleFtpXSA9IHZpbmRbaV07XG4gICAgZm9yICg7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBpbmRleFtpXSA9IDA7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKG51bV9pbmRzKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzICsgaV0gPSB2aW5kW2ldO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGggLSBudW1faW5kczsgaSsrKSBpbmRleFtpXSA9IDE7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKDAsIGJhLmRpbXMubGVuZ3RoIC0gbnVtX2luZHMpO1xuICB9XG4gIG9mcyA9IGJhLm9mZnNldChpbmRleCk7XG4gIHZhciBzaXplID0gY2FtbF9iYV9nZXRfc2l6ZShzdWJfZGltcyk7XG4gIHZhciBzaXplX3Blcl9lbGVtZW50ID0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChiYS5raW5kKTtcbiAgdmFyIG5ld19kYXRhID0gYmEuZGF0YS5zdWJhcnJheShcbiAgICBvZnMgKiBzaXplX3Blcl9lbGVtZW50LFxuICAgIChvZnMgKyBzaXplKSAqIHNpemVfcGVyX2VsZW1lbnQsXG4gICk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBzdWJfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3Jlc2hhcGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbmZ1bmN0aW9uIGNhbWxfYmFfcmVzaGFwZShiYSwgdmluZCkge1xuICB2aW5kID0gY2FtbF9qc19mcm9tX2FycmF5KHZpbmQpO1xuICB2YXIgbmV3X2RpbSA9IFtdO1xuICB2YXIgbnVtX2RpbXMgPSB2aW5kLmxlbmd0aDtcblxuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBiYWQgbnVtYmVyIG9mIGRpbWVuc2lvbnNcIik7XG4gIH1cbiAgdmFyIG51bV9lbHRzID0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZGltczsgaSsrKSB7XG4gICAgbmV3X2RpbVtpXSA9IHZpbmRbaV07XG4gICAgaWYgKG5ld19kaW1baV0gPCAwKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogbmVnYXRpdmUgZGltZW5zaW9uXCIpO1xuICAgIG51bV9lbHRzID0gbnVtX2VsdHMgKiBuZXdfZGltW2ldO1xuICB9XG5cbiAgdmFyIHNpemUgPSBjYW1sX2JhX2dldF9zaXplKGJhLmRpbXMpO1xuICAvLyBDaGVjayB0aGF0IHNpemVzIGFncmVlXG4gIGlmIChudW1fZWx0cyAhPT0gc2l6ZSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBzaXplIG1pc21hdGNoXCIpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGJhLmxheW91dCwgbmV3X2RpbSwgYmEuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9wYWNrRmxvYXQxNlxuZnVuY3Rpb24gY2FtbF9iYV9zZXJpYWxpemUod3JpdGVyLCBiYSwgc3opIHtcbiAgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zLmxlbmd0aCk7XG4gIHdyaXRlci53cml0ZSgzMiwgYmEua2luZCB8IChiYS5sYXlvdXQgPDwgOCkpO1xuICBpZiAoYmEuY2FtbF9jdXN0b20gPT09IFwiX2JpZ2FycjAyXCIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYmEuZGltc1tpXSA8IDB4ZmZmZikgd3JpdGVyLndyaXRlKDE2LCBiYS5kaW1zW2ldKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIDB4ZmZmZik7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgMCk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGltc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zW2ldKTtcbiAgc3dpdGNoIChiYS5raW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd3JpdGVyLndyaXRlKDgsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OiAvLyBJbnQxNkFycmF5XG4gICAgY2FzZSA1OiAvLyBVaW50MTZBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgxNiwgYmEuZGF0YVtpXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDY6IC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGF0YVtpXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6IC8vIEludDMyQXJyYXkgKGludClcbiAgICBjYXNlIDk6IC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA3OiAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGJhLmdldChpKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEZsb2F0NjRBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoYmEuZ2V0KGkpKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOiAvLyBGbG9hdDE2QXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAwOiAvLyBGbG9hdDMyQXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYiA9IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChiYS5nZXQoaSkpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICAgIHZhciBqID0gYmEuZ2V0KGkpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChqWzFdKSk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGpbMl0pKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgICB2YXIgY29tcGxleCA9IGJhLmdldChpKTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChjb21wbGV4WzFdKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoY29tcGxleFsyXSkpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlKDgsIGJbal0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgc3pbMF0gPSAoNCArIGJhLmRpbXMubGVuZ3RoKSAqIDQ7XG4gIHN6WzFdID0gKDQgKyBiYS5kaW1zLmxlbmd0aCkgKiA4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2Rlc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXMsIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbi8vUmVxdWlyZXM6IGNhbWxfdW5wYWNrRmxvYXQxNlxuZnVuY3Rpb24gY2FtbF9iYV9kZXNlcmlhbGl6ZShyZWFkZXIsIHN6LCBuYW1lKSB7XG4gIHZhciBudW1fZGltcyA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIGlmIChudW1fZGltcyA8IDAgfHwgbnVtX2RpbXMgPiAxNilcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHdyb25nIG51bWJlciBvZiBiaWdhcnJheSBkaW1lbnNpb25zXCIpO1xuICB2YXIgdGFnID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgdmFyIGtpbmQgPSB0YWcgJiAweGZmO1xuICB2YXIgbGF5b3V0ID0gKHRhZyA+PiA4KSAmIDE7XG4gIHZhciBkaW1zID0gW107XG4gIGlmIChuYW1lID09PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykge1xuICAgICAgdmFyIHNpemVfZGltID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICAgIGlmIChzaXplX2RpbSA9PT0gMHhmZmZmKSB7XG4gICAgICAgIHZhciBzaXplX2RpbV9oaSA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIHZhciBzaXplX2RpbV9sbyA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIGlmIChzaXplX2RpbV9oaSAhPT0gMClcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGJpZ2FycmF5IGRpbWVuc2lvbiBvdmVyZmxvdyBpbiAzMmJpdFwiKTtcbiAgICAgICAgc2l6ZV9kaW0gPSBzaXplX2RpbV9sbztcbiAgICAgIH1cbiAgICAgIGRpbXMucHVzaChzaXplX2RpbSk7XG4gICAgfVxuICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykgZGltcy5wdXNoKHJlYWRlci5yZWFkMzJ1KCkpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoZGltcyk7XG4gIHZhciBkYXRhID0gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIHNpemUpO1xuICB2YXIgYmEgPSBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkOHMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OiAvLyBJbnQxNkFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTogLy8gVWludDE2QXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDE2dSgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OiAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA4OiAvLyBJbnQzMkFycmF5IChpbnQpXG4gICAgY2FzZSA5OiAvLyBJbnQzMkFycmF5IChuYXRpdmVpbnQpXG4gICAgICB2YXIgc2l4dHkgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICBpZiAoc2l4dHkpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXG4gICAgICAgICAgXCJpbnB1dF92YWx1ZTogY2Fubm90IHJlYWQgYmlnYXJyYXkgd2l0aCA2NC1iaXQgT0NhbWwgaW50c1wiLFxuICAgICAgICApO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6IC8vIChpbnQ2NClcbiAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgIHZhciBpbnQ2NCA9IGNhbWxfaW50NjRfb2ZfYnl0ZXModCk7XG4gICAgICAgIGJhLnNldChpLCBpbnQ2NCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEZsb2F0NjRBcnJheVxuICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIGYgPSBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KSk7XG4gICAgICAgIGJhLnNldChpLCBmKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6IC8vIEZsb2F0MTZBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDA6IC8vIEZsb2F0MzJBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICAgIGJhLnNldChpLCBmKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgdmFyIHJlID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgICB2YXIgaW0gPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICAgIGJhLnNldChpLCBbMjU0LCByZSwgaW1dKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIHJlID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIGltID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgICBiYS5zZXQoaSwgWzI1NCwgcmUsIGltXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICBzelswXSA9ICg0ICsgbnVtX2RpbXMpICogNDtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV9mcm9tXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfYmFfY3JlYXRlX3Vuc2FmZV0gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfZnJvbShkYXRhMSwgZGF0YTIsIF9qc3R5cCwga2luZCwgbGF5b3V0LCBkaW1zKSB7XG4gIGlmIChkYXRhMiB8fCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpID09PSAyKSB7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFxuICAgICAgXCJjYW1sX2JhX2NyZWF0ZV9mcm9tOiB1c2UgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGExKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9oYXNoIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2hhc2hfbWl4X2ludCwgY2FtbF9oYXNoX21peF9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF91bnBhY2tGbG9hdDE2LCBjYW1sX2hhc2hfbWl4X2Zsb2F0MTYsIGNhbWxfaGFzaF9taXhfZmxvYXQzMlxuZnVuY3Rpb24gY2FtbF9iYV9oYXNoKGJhKSB7XG4gIHZhciBudW1fZWx0cyA9IGNhbWxfYmFfZ2V0X3NpemUoYmEuZGltcyk7XG4gIHZhciBoID0gMDtcbiAgc3dpdGNoIChiYS5raW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiAyNTYpIG51bV9lbHRzID0gMjU2O1xuICAgICAgdmFyIHcgPSAwLFxuICAgICAgICBpID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9lbHRzOyBpICs9IDQpIHtcbiAgICAgICAgdyA9XG4gICAgICAgICAgKGJhLmRhdGFbaSArIDBdICYgMHhmZikgfFxuICAgICAgICAgICgoYmEuZGF0YVtpICsgMV0gJiAweGZmKSA8PCA4KSB8XG4gICAgICAgICAgKChiYS5kYXRhW2kgKyAyXSAmIDB4ZmYpIDw8IDE2KSB8XG4gICAgICAgICAgKGJhLmRhdGFbaSArIDNdIDw8IDI0KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICAgICAgfVxuICAgICAgdyA9IDA7XG4gICAgICBzd2l0Y2ggKG51bV9lbHRzICYgMykge1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICAgIHcgPSBiYS5kYXRhW2kgKyAyXSA8PCAxNjtcbiAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgICB3IHw9IGJhLmRhdGFbaSArIDFdIDw8IDg7XG4gICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB3IHw9IGJhLmRhdGFbaSArIDBdO1xuICAgICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDogLy8gSW50MTZBcnJheVxuICAgIGNhc2UgNTogLy8gVWludDE2QXJyYXlcbiAgICAgIGlmIChudW1fZWx0cyA+IDEyOCkgbnVtX2VsdHMgPSAxMjg7XG4gICAgICB2YXIgdyA9IDAsXG4gICAgICAgIGkgPSAwO1xuICAgICAgZm9yIChpID0gMDsgaSArIDIgPD0gbnVtX2VsdHM7IGkgKz0gMikge1xuICAgICAgICB3ID0gKGJhLmRhdGFbaSArIDBdICYgMHhmZmZmKSB8IChiYS5kYXRhW2kgKyAxXSA8PCAxNik7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICAgIH1cbiAgICAgIGlmICgobnVtX2VsdHMgJiAxKSAhPT0gMCkgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OiAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6IC8vIEludDMyQXJyYXkgKGludClcbiAgICBjYXNlIDk6IC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6IC8vIEludDMyQXJyYXkgKGludDY0KVxuICAgICAgaWYgKG51bV9lbHRzID4gMzIpIG51bV9lbHRzID0gMzI7XG4gICAgICBudW1fZWx0cyAqPSAyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSB7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgbnVtX2VsdHMgKj0gMjtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgMDogLy8gRmxvYXQzMkFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiA2NCkgbnVtX2VsdHMgPSA2NDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKylcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQzMihoLCBiYS5kYXRhW2ldKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgbnVtX2VsdHMgKj0gMjtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgMTogLy8gRmxvYXQ2NEFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiAzMikgbnVtX2VsdHMgPSAzMjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgaWYgKG51bV9lbHRzID4gMTI4KSBudW1fZWx0cyA9IDEyODtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykge1xuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdDE2KGgsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXQxNlxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQxNihoYXNoLCBkKSB7XG4gIC8qIE5vcm1hbGl6ZSBOYU5zICovXG4gIGlmICgoZCAmIDB4N2MwMCkgPT09IDB4N2MwMCAmJiAoZCAmIDB4MDNmZikgIT09IDApIHtcbiAgICBkID0gMHg3YzAxO1xuICB9IGVsc2UgaWYgKGQgPT09IDB4ODAwMCkge1xuICAgIC8qIE5vcm1hbGl6ZSAtMCBpbnRvICswICovXG4gICAgZCA9IDA7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0MzJcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQzMihoYXNoLCB2KSB7XG4gIHZhciBpID0gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KHYpO1xuICAvKiBOb3JtYWxpemUgTmFOcyAqL1xuICBpZiAoKGkgJiAweDdmODAwMDAwKSA9PT0gMHg3ZjgwMDAwMCAmJiAoaSAmIDB4N2ZmZmZmKSAhPT0gMCkge1xuICAgIGkgPSAweDdmODAwMDAxO1xuICB9IGVsc2UgaWYgKGkgPT09ICgweDgwMDAwMDAwIHwgMCkpIHtcbiAgICAvKiBOb3JtYWxpemUgLTAgaW50byArMCAqL1xuICAgIC8vIFRoaXMgY29kZSBwYXRoIGlzIG5vdCB1c2VkIGJ5IGNhbWxfaGFzaCBiZWNhdXNlIDAgYW5kIC0wIGxvb2tcbiAgICAvLyBsaWtlIGludGVnZXJzXG4gICAgaSA9IDA7XG4gIH1cbiAgaGFzaCA9IGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGkpO1xuICByZXR1cm4gaGFzaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV90b190eXBlZF9hcnJheSBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJhKSB7XG4gIHJldHVybiBiYS5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkodGEpIHtcbiAgdmFyIGtpbmQ7XG4gIGlmICh0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkga2luZCA9IDA7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSBraW5kID0gMTtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIGtpbmQgPSAyO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIGtpbmQgPSAzO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSBraW5kID0gMztcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQxNkFycmF5KSBraW5kID0gNDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkga2luZCA9IDU7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgSW50MzJBcnJheSkga2luZCA9IDY7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgcmV0dXJuIGtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5KHRhKSB7XG4gIHZhciBraW5kID0gY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5KHRhKTtcbiAgdmFyIHRhID1cbiAgICAvKiBOZWVkZWQgdG8gYXZvaWQgdW5zaWduZWQgc2V0dGVycyBvdmVyZmxvd2luZ1xuICAgICAgICAgdGhlIHJhbmdlIG9mIE9DYW1sIFtpbnQzMl0gdmFsdWVzLiAqL1xuICAgIHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXlcbiAgICAgID8gbmV3IEludDMyQXJyYXkodGEuYnVmZmVyLCB0YS5ieXRlT2Zmc2V0LCB0YS5sZW5ndGgpXG4gICAgICA6IHRhO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG4iLCIvLy8vLy8vLy8gQklHU1RSSU5HXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9iaWdzdHJpbmcoaCwgYnMpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsIGJzLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyIG11dGFibGVcbmZ1bmN0aW9uIGJpZ3N0cmluZ190b19hcnJheV9idWZmZXIoYnMpIHtcbiAgcmV0dXJuIGJzLmRhdGEuYnVmZmVyO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkgbXV0YWJsZVxuZnVuY3Rpb24gYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5KGJzKSB7XG4gIHJldHVybiBicy5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlcihhYikge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShhYik7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoMTIsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheShiYSkge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShcbiAgICBiYS5idWZmZXIsXG4gICAgYmEuYnl0ZU9mZnNldCxcbiAgICBiYS5sZW5ndGggKiBiYS5CWVRFU19QRVJfRUxFTUVOVCxcbiAgKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSgxMiwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfbWVtY21wXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19tZW1jbXAoczEsIHBvczEsIHMyLCBwb3MyLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBhID0gY2FtbF9iYV9nZXRfMShzMSwgcG9zMSArIGkpO1xuICAgIHZhciBiID0gY2FtbF9iYV9nZXRfMShzMiwgcG9zMiArIGkpO1xuICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYShiYTEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYgKDEyICE9PSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZiAobGVuID09PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczEgPSBiYTEub2Zmc2V0KHBvczEpO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmIChvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmIChvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGJhMS5kYXRhLnN1YmFycmF5KG9mczEsIG9mczEgKyBsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2UsIHBvczIpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pIHtcbiAgaWYgKDEyICE9PSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMyID0gYmEyLm9mZnNldChwb3MyKTtcbiAgaWYgKHBvczEgKyBsZW4gPiBjYW1sX21sX3N0cmluZ19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYgKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcoc3RyMSkuc3ViYXJyYXkocG9zMSwgcG9zMSArIGxlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSwgb2ZzMik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhKHN0cjEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmEyLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmIChwb3MxICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYgKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzdHIxKS5zdWJhcnJheShwb3MxLCBwb3MxICsgbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLCBvZnMyKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19ieXRlcyhiYTEsIHBvczEsIGJ5dGVzMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMSA9IGJhMS5vZmZzZXQocG9zMSk7XG4gIGlmIChvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmIChwb3MyICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoYnl0ZXMyKSkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBiYTEuZGF0YS5zdWJhcnJheShvZnMxLCBvZnMxICsgbGVuKTtcbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoc2xpY2UpLCAwLCBieXRlczIsIHBvczIsIGxlbik7XG4gIHJldHVybiAwO1xufVxuIiwiLy9Qcm92aWRlczogYmxha2UyYlxuLy9WZXJzaW9uOiA+PSA1LjJcbnZhciBibGFrZTJiID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gQmxha2UyQiBpbiBwdXJlIEphdmFzY3JpcHRcbiAgLy8gQWRhcHRlZCBmcm9tIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaW4gUkZDNzY5M1xuICAvLyBQb3J0ZWQgdG8gSmF2YXNjcmlwdCBieSBEQyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9kY3Bvc2NoXG5cbiAgLy8gNjQtYml0IHVuc2lnbmVkIGFkZGl0aW9uXG4gIC8vIFNldHMgdlthLGErMV0gKz0gdltiLGIrMV1cbiAgLy8gdiBzaG91bGQgYmUgYSBVaW50MzJBcnJheVxuICBmdW5jdGlvbiBBREQ2NEFBKHYsIGEsIGIpIHtcbiAgICBjb25zdCBvMCA9IHZbYV0gKyB2W2JdO1xuICAgIGxldCBvMSA9IHZbYSArIDFdICsgdltiICsgMV07XG4gICAgaWYgKG8wID49IDB4MTAwMDAwMDAwKSB7XG4gICAgICBvMSsrO1xuICAgIH1cbiAgICB2W2FdID0gbzA7XG4gICAgdlthICsgMV0gPSBvMTtcbiAgfVxuXG4gIC8vIDY0LWJpdCB1bnNpZ25lZCBhZGRpdGlvblxuICAvLyBTZXRzIHZbYSxhKzFdICs9IGJcbiAgLy8gYjAgaXMgdGhlIGxvdyAzMiBiaXRzIG9mIGIsIGIxIHJlcHJlc2VudHMgdGhlIGhpZ2ggMzIgYml0c1xuICBmdW5jdGlvbiBBREQ2NEFDKHYsIGEsIGIwLCBiMSkge1xuICAgIGxldCBvMCA9IHZbYV0gKyBiMDtcbiAgICBpZiAoYjAgPCAwKSB7XG4gICAgICBvMCArPSAweDEwMDAwMDAwMDtcbiAgICB9XG4gICAgbGV0IG8xID0gdlthICsgMV0gKyBiMTtcbiAgICBpZiAobzAgPj0gMHgxMDAwMDAwMDApIHtcbiAgICAgIG8xKys7XG4gICAgfVxuICAgIHZbYV0gPSBvMDtcbiAgICB2W2EgKyAxXSA9IG8xO1xuICB9XG5cbiAgLy8gTGl0dGxlLWVuZGlhbiBieXRlIGFjY2Vzc1xuICBmdW5jdGlvbiBCMkJfR0VUMzIoYXJyLCBpKSB7XG4gICAgcmV0dXJuIGFycltpXSBeIChhcnJbaSArIDFdIDw8IDgpIF4gKGFycltpICsgMl0gPDwgMTYpIF4gKGFycltpICsgM10gPDwgMjQpO1xuICB9XG5cbiAgLy8gRyBNaXhpbmcgZnVuY3Rpb25cbiAgLy8gVGhlIFJPVFJzIGFyZSBpbmxpbmVkIGZvciBzcGVlZFxuICBmdW5jdGlvbiBCMkJfRyhhLCBiLCBjLCBkLCBpeCwgaXkpIHtcbiAgICBjb25zdCB4MCA9IG1baXhdO1xuICAgIGNvbnN0IHgxID0gbVtpeCArIDFdO1xuICAgIGNvbnN0IHkwID0gbVtpeV07XG4gICAgY29uc3QgeTEgPSBtW2l5ICsgMV07XG5cbiAgICBBREQ2NEFBKHYsIGEsIGIpOyAvLyB2W2EsYSsxXSArPSB2W2IsYisxXSAuLi4gaW4gSlMgd2UgbXVzdCBzdG9yZSBhIHVpbnQ2NCBhcyB0d28gdWludDMyc1xuICAgIEFERDY0QUModiwgYSwgeDAsIHgxKTsgLy8gdlthLCBhKzFdICs9IHggLi4uIHgwIGlzIHRoZSBsb3cgMzIgYml0cyBvZiB4LCB4MSBpcyB0aGUgaGlnaCAzMiBiaXRzXG5cbiAgICAvLyB2W2QsZCsxXSA9ICh2W2QsZCsxXSB4b3IgdlthLGErMV0pIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IDMyIGJpdHNcbiAgICBsZXQgeG9yMCA9IHZbZF0gXiB2W2FdO1xuICAgIGxldCB4b3IxID0gdltkICsgMV0gXiB2W2EgKyAxXTtcbiAgICB2W2RdID0geG9yMTtcbiAgICB2W2QgKyAxXSA9IHhvcjA7XG5cbiAgICBBREQ2NEFBKHYsIGMsIGQpO1xuXG4gICAgLy8gdltiLGIrMV0gPSAodltiLGIrMV0geG9yIHZbYyxjKzFdKSByb3RhdGVkIHJpZ2h0IGJ5IDI0IGJpdHNcbiAgICB4b3IwID0gdltiXSBeIHZbY107XG4gICAgeG9yMSA9IHZbYiArIDFdIF4gdltjICsgMV07XG4gICAgdltiXSA9ICh4b3IwID4+PiAyNCkgXiAoeG9yMSA8PCA4KTtcbiAgICB2W2IgKyAxXSA9ICh4b3IxID4+PiAyNCkgXiAoeG9yMCA8PCA4KTtcblxuICAgIEFERDY0QUEodiwgYSwgYik7XG4gICAgQURENjRBQyh2LCBhLCB5MCwgeTEpO1xuXG4gICAgLy8gdltkLGQrMV0gPSAodltkLGQrMV0geG9yIHZbYSxhKzFdKSByb3RhdGVkIHJpZ2h0IGJ5IDE2IGJpdHNcbiAgICB4b3IwID0gdltkXSBeIHZbYV07XG4gICAgeG9yMSA9IHZbZCArIDFdIF4gdlthICsgMV07XG4gICAgdltkXSA9ICh4b3IwID4+PiAxNikgXiAoeG9yMSA8PCAxNik7XG4gICAgdltkICsgMV0gPSAoeG9yMSA+Pj4gMTYpIF4gKHhvcjAgPDwgMTYpO1xuXG4gICAgQURENjRBQSh2LCBjLCBkKTtcblxuICAgIC8vIHZbYixiKzFdID0gKHZbYixiKzFdIHhvciB2W2MsYysxXSkgcm90YXRlZCByaWdodCBieSA2MyBiaXRzXG4gICAgeG9yMCA9IHZbYl0gXiB2W2NdO1xuICAgIHhvcjEgPSB2W2IgKyAxXSBeIHZbYyArIDFdO1xuICAgIHZbYl0gPSAoeG9yMSA+Pj4gMzEpIF4gKHhvcjAgPDwgMSk7XG4gICAgdltiICsgMV0gPSAoeG9yMCA+Pj4gMzEpIF4gKHhvcjEgPDwgMSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXphdGlvbiBWZWN0b3JcbiAgY29uc3QgQkxBS0UyQl9JVjMyID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAweGYzYmNjOTA4LCAweDZhMDllNjY3LCAweDg0Y2FhNzNiLCAweGJiNjdhZTg1LCAweGZlOTRmODJiLCAweDNjNmVmMzcyLFxuICAgIDB4NWYxZDM2ZjEsIDB4YTU0ZmY1M2EsIDB4YWRlNjgyZDEsIDB4NTEwZTUyN2YsIDB4MmIzZTZjMWYsIDB4OWIwNTY4OGMsXG4gICAgMHhmYjQxYmQ2YiwgMHgxZjgzZDlhYiwgMHgxMzdlMjE3OSwgMHg1YmUwY2QxOSxcbiAgXSk7XG5cbiAgY29uc3QgU0lHTUE4ID0gW1xuICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE0LCAxMCwgNCwgOCwgOSwgMTUsXG4gICAgMTMsIDYsIDEsIDEyLCAwLCAyLCAxMSwgNywgNSwgMywgMTEsIDgsIDEyLCAwLCA1LCAyLCAxNSwgMTMsIDEwLCAxNCwgMywgNixcbiAgICA3LCAxLCA5LCA0LCA3LCA5LCAzLCAxLCAxMywgMTIsIDExLCAxNCwgMiwgNiwgNSwgMTAsIDQsIDAsIDE1LCA4LCA5LCAwLCA1LFxuICAgIDcsIDIsIDQsIDEwLCAxNSwgMTQsIDEsIDExLCAxMiwgNiwgOCwgMywgMTMsIDIsIDEyLCA2LCAxMCwgMCwgMTEsIDgsIDMsIDQsXG4gICAgMTMsIDcsIDUsIDE1LCAxNCwgMSwgOSwgMTIsIDUsIDEsIDE1LCAxNCwgMTMsIDQsIDEwLCAwLCA3LCA2LCAzLCA5LCAyLCA4LFxuICAgIDExLCAxMywgMTEsIDcsIDE0LCAxMiwgMSwgMywgOSwgNSwgMCwgMTUsIDQsIDgsIDYsIDIsIDEwLCA2LCAxNSwgMTQsIDksIDExLFxuICAgIDMsIDAsIDgsIDEyLCAyLCAxMywgNywgMSwgNCwgMTAsIDUsIDEwLCAyLCA4LCA0LCA3LCA2LCAxLCA1LCAxNSwgMTEsIDksIDE0LFxuICAgIDMsIDEyLCAxMywgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTQsIDEwLFxuICAgIDQsIDgsIDksIDE1LCAxMywgNiwgMSwgMTIsIDAsIDIsIDExLCA3LCA1LCAzLFxuICBdO1xuXG4gIC8vIFRoZXNlIGFyZSBvZmZzZXRzIGludG8gYSB1aW50NjQgYnVmZmVyLlxuICAvLyBNdWx0aXBseSB0aGVtIGFsbCBieSAyIHRvIG1ha2UgdGhlbSBvZmZzZXRzIGludG8gYSB1aW50MzIgYnVmZmVyLFxuICAvLyBiZWNhdXNlIHRoaXMgaXMgSmF2YXNjcmlwdCBhbmQgd2UgZG9uJ3QgaGF2ZSB1aW50NjRzXG4gIGNvbnN0IFNJR01BODIgPSBuZXcgVWludDhBcnJheShcbiAgICBTSUdNQTgubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCAqIDI7XG4gICAgfSksXG4gICk7XG5cbiAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24uICdsYXN0JyBmbGFnIGluZGljYXRlcyBsYXN0IGJsb2NrLlxuICAvLyBOb3RlIHdlJ3JlIHJlcHJlc2VudGluZyAxNiB1aW50NjRzIGFzIDMyIHVpbnQzMnNcbiAgY29uc3QgdiA9IG5ldyBVaW50MzJBcnJheSgzMik7XG4gIGNvbnN0IG0gPSBuZXcgVWludDMyQXJyYXkoMzIpO1xuICBmdW5jdGlvbiBibGFrZTJiQ29tcHJlc3MoY3R4LCBsYXN0KSB7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgLy8gaW5pdCB3b3JrIHZhcmlhYmxlc1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICB2W2ldID0gY3R4LmhbaV07XG4gICAgICB2W2kgKyAxNl0gPSBCTEFLRTJCX0lWMzJbaV07XG4gICAgfVxuXG4gICAgLy8gbG93IDY0IGJpdHMgb2Ygb2Zmc2V0XG4gICAgdlsyNF0gPSB2WzI0XSBeIGN0eC50O1xuICAgIHZbMjVdID0gdlsyNV0gXiAoY3R4LnQgLyAweDEwMDAwMDAwMCk7XG4gICAgLy8gaGlnaCA2NCBiaXRzIG5vdCBzdXBwb3J0ZWQsIG9mZnNldCBtYXkgbm90IGJlIGhpZ2hlciB0aGFuIDIqKjUzLTFcblxuICAgIC8vIGxhc3QgYmxvY2sgZmxhZyBzZXQgP1xuICAgIGlmIChsYXN0KSB7XG4gICAgICB2WzI4XSA9IH52WzI4XTtcbiAgICAgIHZbMjldID0gfnZbMjldO1xuICAgIH1cblxuICAgIC8vIGdldCBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgIG1baV0gPSBCMkJfR0VUMzIoY3R4LmIsIDQgKiBpKTtcbiAgICB9XG5cbiAgICAvLyB0d2VsdmUgcm91bmRzIG9mIG1peGluZ1xuICAgIC8vIHVuY29tbWVudCB0aGUgRGVidWdQcmludCBjYWxscyB0byBsb2cgdGhlIGNvbXB1dGF0aW9uXG4gICAgLy8gYW5kIG1hdGNoIHRoZSBSRkMgc2FtcGxlIGRvY3VtZW50YXRpb25cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgQjJCX0coMCwgOCwgMTYsIDI0LCBTSUdNQTgyW2kgKiAxNiArIDBdLCBTSUdNQTgyW2kgKiAxNiArIDFdKTtcbiAgICAgIEIyQl9HKDIsIDEwLCAxOCwgMjYsIFNJR01BODJbaSAqIDE2ICsgMl0sIFNJR01BODJbaSAqIDE2ICsgM10pO1xuICAgICAgQjJCX0coNCwgMTIsIDIwLCAyOCwgU0lHTUE4MltpICogMTYgKyA0XSwgU0lHTUE4MltpICogMTYgKyA1XSk7XG4gICAgICBCMkJfRyg2LCAxNCwgMjIsIDMwLCBTSUdNQTgyW2kgKiAxNiArIDZdLCBTSUdNQTgyW2kgKiAxNiArIDddKTtcbiAgICAgIEIyQl9HKDAsIDEwLCAyMCwgMzAsIFNJR01BODJbaSAqIDE2ICsgOF0sIFNJR01BODJbaSAqIDE2ICsgOV0pO1xuICAgICAgQjJCX0coMiwgMTIsIDIyLCAyNCwgU0lHTUE4MltpICogMTYgKyAxMF0sIFNJR01BODJbaSAqIDE2ICsgMTFdKTtcbiAgICAgIEIyQl9HKDQsIDE0LCAxNiwgMjYsIFNJR01BODJbaSAqIDE2ICsgMTJdLCBTSUdNQTgyW2kgKiAxNiArIDEzXSk7XG4gICAgICBCMkJfRyg2LCA4LCAxOCwgMjgsIFNJR01BODJbaSAqIDE2ICsgMTRdLCBTSUdNQTgyW2kgKiAxNiArIDE1XSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGN0eC5oW2ldID0gY3R4LmhbaV0gXiB2W2ldIF4gdltpICsgMTZdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJldXNhYmxlIHBhcmFtZXRlckJsb2NrXG4gIGNvbnN0IHBhcmFtZXRlckJsb2NrID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vICAwOiBvdXRsZW4sIGtleWxlbiwgZmFub3V0LCBkZXB0aFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vICA0OiBsZWFmIGxlbmd0aCwgc2VxdWVudGlhbCBtb2RlXG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gIDg6IG5vZGUgb2Zmc2V0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMTI6IG5vZGUgb2Zmc2V0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMTY6IG5vZGUgZGVwdGgsIGlubmVyIGxlbmd0aCwgcmZ1XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMjA6IHJmdVxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vIDI0OiByZnVcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyAyODogcmZ1XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMzI6IHNhbHRcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyAzNjogc2FsdFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vIDQwOiBzYWx0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gNDQ6IHNhbHRcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA0ODogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA1MjogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA1NjogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA2MDogcGVyc29uYWxcbiAgXSk7XG5cbiAgLy8gQ3JlYXRlcyBhIEJMQUtFMmIgaGFzaGluZyBjb250ZXh0XG4gIC8vIFJlcXVpcmVzIGFuIG91dHB1dCBsZW5ndGggYmV0d2VlbiAxIGFuZCA2NCBieXRlc1xuICAvLyBUYWtlcyBhbiBvcHRpb25hbCBVaW50OEFycmF5IGtleVxuICBmdW5jdGlvbiBibGFrZTJiSW5pdChvdXRsZW4sIGtleSkge1xuICAgIGlmIChvdXRsZW4gPT09IDAgfHwgb3V0bGVuID4gNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgb3V0cHV0IGxlbmd0aCwgZXhwZWN0ZWQgMCA8IGxlbmd0aCA8PSA2NFwiKTtcbiAgICB9XG4gICAgaWYgKGtleS5sZW5ndGggPiA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBrZXksIGV4cGVjdGVkIFVpbnQ4QXJyYXkgd2l0aCAwIDwgbGVuZ3RoIDw9IDY0XCIpO1xuICAgIH1cblxuICAgIC8vIHN0YXRlLCAncGFyYW0gYmxvY2snXG4gICAgY29uc3QgY3R4ID0ge1xuICAgICAgYjogbmV3IFVpbnQ4QXJyYXkoMTI4KSxcbiAgICAgIGg6IG5ldyBVaW50MzJBcnJheSgxNiksXG4gICAgICB0OiAwLCAvLyBpbnB1dCBjb3VudFxuICAgICAgYzogMCwgLy8gcG9pbnRlciB3aXRoaW4gYnVmZmVyXG4gICAgICBvdXRsZW46IG91dGxlbiwgLy8gb3V0cHV0IGxlbmd0aCBpbiBieXRlc1xuICAgIH07XG5cbiAgICAvLyBpbml0aWFsaXplIHBhcmFtZXRlckJsb2NrIGJlZm9yZSB1c2FnZVxuICAgIHBhcmFtZXRlckJsb2NrLmZpbGwoMCk7XG4gICAgcGFyYW1ldGVyQmxvY2tbMF0gPSBvdXRsZW47XG4gICAgcGFyYW1ldGVyQmxvY2tbMV0gPSBrZXkubGVuZ3RoO1xuICAgIHBhcmFtZXRlckJsb2NrWzJdID0gMTsgLy8gZmFub3V0XG4gICAgcGFyYW1ldGVyQmxvY2tbM10gPSAxOyAvLyBkZXB0aFxuXG4gICAgLy8gaW5pdGlhbGl6ZSBoYXNoIHN0YXRlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBjdHguaFtpXSA9IEJMQUtFMkJfSVYzMltpXSBeIEIyQl9HRVQzMihwYXJhbWV0ZXJCbG9jaywgaSAqIDQpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID4gMCkge1xuICAgICAgYmxha2UyYlVwZGF0ZShjdHgsIGtleSk7XG4gICAgICAvLyBhdCB0aGUgZW5kXG4gICAgICBjdHguYyA9IDEyODtcbiAgICB9XG5cbiAgICByZXR1cm4gY3R4O1xuICB9XG5cbiAgLy8gVXBkYXRlcyBhIEJMQUtFMmIgc3RyZWFtaW5nIGhhc2hcbiAgLy8gUmVxdWlyZXMgaGFzaCBjb250ZXh0IGFuZCBVaW50OEFycmF5IChieXRlIGFycmF5KVxuICBmdW5jdGlvbiBibGFrZTJiVXBkYXRlKGN0eCwgaW5wdXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY3R4LmMgPT09IDEyOCkge1xuICAgICAgICAvLyBidWZmZXIgZnVsbCA/XG4gICAgICAgIGN0eC50ICs9IGN0eC5jOyAvLyBhZGQgY291bnRlcnNcbiAgICAgICAgYmxha2UyYkNvbXByZXNzKGN0eCwgZmFsc2UpOyAvLyBjb21wcmVzcyAobm90IGxhc3QpXG4gICAgICAgIGN0eC5jID0gMDsgLy8gY291bnRlciB0byB6ZXJvXG4gICAgICB9XG4gICAgICBjdHguYltjdHguYysrXSA9IGlucHV0W2ldO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXBsZXRlcyBhIEJMQUtFMmIgc3RyZWFtaW5nIGhhc2hcbiAgLy8gUmV0dXJucyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgbWVzc2FnZSBkaWdlc3RcbiAgZnVuY3Rpb24gYmxha2UyYkZpbmFsKGN0eCkge1xuICAgIGN0eC50ICs9IGN0eC5jOyAvLyBtYXJrIGxhc3QgYmxvY2sgb2Zmc2V0XG5cbiAgICB3aGlsZSAoY3R4LmMgPCAxMjgpIHtcbiAgICAgIC8vIGZpbGwgdXAgd2l0aCB6ZXJvc1xuICAgICAgY3R4LmJbY3R4LmMrK10gPSAwO1xuICAgIH1cbiAgICBibGFrZTJiQ29tcHJlc3MoY3R4LCB0cnVlKTsgLy8gZmluYWwgYmxvY2sgZmxhZyA9IDFcblxuICAgIC8vIGxpdHRsZSBlbmRpYW4gY29udmVydCBhbmQgc3RvcmVcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShjdHgub3V0bGVuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN0eC5vdXRsZW47IGkrKykge1xuICAgICAgb3V0W2ldID0gY3R4LmhbaSA+PiAyXSA+PiAoOCAqIChpICYgMykpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiB7IEluaXQ6IGJsYWtlMmJJbml0LCBVcGRhdGU6IGJsYWtlMmJVcGRhdGUsIEZpbmFsOiBibGFrZTJiRmluYWwgfTtcbn0pKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxha2UyX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGJsYWtlMmJcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX2JsYWtlMl9jcmVhdGUoaGFzaGxlbiwga2V5KSB7XG4gIGtleSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKGtleSk7XG4gIGlmIChrZXkubGVuZ3RoID4gNjQpIHtcbiAgICBrZXkuc3ViYXJyYXkoMCwgNjQpO1xuICB9XG4gIHJldHVybiBibGFrZTJiLkluaXQoaGFzaGxlbiwga2V5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBibGFrZTJiXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBfaGFzaGxlbikge1xuICAvLyBjdHgub3V0bGVuID09PSBoYXNobGVuXG4gIHZhciByID0gYmxha2UyYi5GaW5hbChjdHgpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkocik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogYmxha2UyYlxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfdXBkYXRlKGN0eCwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgaW5wdXQgPSBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyhidWYpO1xuICBpbnB1dCA9IGlucHV0LnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKTtcbiAgYmxha2UyYi5VcGRhdGUoY3R4LCBpbnB1dCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsYWtlMl91cGRhdGVcbi8vUmVxdWlyZXM6IGJsYWtlMmJcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX2JsYWtlMl91cGRhdGUoY3R4LCBidWYsIG9mcywgbGVuKSB7XG4gIHZhciBpbnB1dCA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgaW5wdXQgPSBpbnB1dC5zdWJhcnJheShvZnMsIG9mcyArIGxlbik7XG4gIGJsYWtlMmIuVXBkYXRlKGN0eCwgaW5wdXQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfc3RyaW5nKGhhc2hsZW4sIGtleSwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleSk7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfc3RyaW5nKGhhc2hsZW4sIGtleSwgYnVmX3N0ciwgb2ZzLCBsZW4pIHtcbiAgdmFyIGN0eCA9IGNhbWxfYmxha2UyX2NyZWF0ZShoYXNobGVuLCBrZXkpO1xuICB2YXIgYnVmID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoYnVmX3N0cik7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfdXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9maW5hbFxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfYmxha2UyX2J5dGVzKGhhc2hsZW4sIGtleSwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleSk7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogYmxha2UyX2pzX2Zvcl93YXNtX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfY3JlYXRlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiB3YXNtXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX2NyZWF0ZShoYXNobGVuLCBrZXkpIHtcbiAgY29uc3Qga2V5X2pzb29fc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhrZXkpO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleV9qc29vX3N0cmluZyk7XG59XG5cbi8vUHJvdmlkZXM6IGJsYWtlMl9qc19mb3Jfd2FzbV9maW5hbFxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWwsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vSWY6IHdhc21cbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBibGFrZTJfanNfZm9yX3dhc21fZmluYWwoY3R4LCBoYXNobGVuKSB7XG4gIHJldHVybiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNhbWxfYmxha2UyX2ZpbmFsKGN0eCwgaGFzaGxlbikpO1xufVxuXG4vL1Byb3ZpZGVzOiBibGFrZTJfanNfZm9yX3dhc21fdXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl91cGRhdGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vSWY6IHdhc21cbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pIHtcbiAgY29uc3QgYnVmX2pzb29fc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhidWYpO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfdXBkYXRlKGN0eCwgYnVmX2pzb29fc3RyaW5nLCBvZnMsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGJsYWtlMl9qc19mb3Jfd2FzbV91cGRhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZSwgY2FtbF9ieXRlc19vZl9qc2J5dGVzXG4vL0lmOiB3YXNtXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pIHtcbiAgY29uc3QgYnVmX2pzb29fc3RyaW5nID0gY2FtbF9ieXRlc19vZl9qc2J5dGVzKGJ1Zik7XG4gIHJldHVybiBjYW1sX2JsYWtlMl91cGRhdGUoY3R4LCBidWZfanNvb19zdHJpbmcsIG9mcywgbGVuKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX21kNV9jaGFuXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9tbF9pbnB1dF9ibG9ja1xuLy9SZXF1aXJlczogY2FtbF9NRDVJbml0LCBjYW1sX01ENVVwZGF0ZSwgY2FtbF9NRDVGaW5hbFxuZnVuY3Rpb24gY2FtbF9tZDVfY2hhbihjaGFuaWQsIHRvcmVhZCkge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSg0MDk2KTtcbiAgaWYgKHRvcmVhZCA8IDApIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIHJlYWQgPSBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgIGlmIChyZWFkID09PSAwKSBicmVhaztcbiAgICAgIGNhbWxfTUQ1VXBkYXRlKGN0eCwgYnVmZmVyLnN1YmFycmF5KDAsIHJlYWQpLCByZWFkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHRvcmVhZCA+IDApIHtcbiAgICAgIHZhciByZWFkID0gY2FtbF9tbF9pbnB1dF9ibG9jayhcbiAgICAgICAgY2hhbmlkLFxuICAgICAgICBidWZmZXIsXG4gICAgICAgIDAsXG4gICAgICAgIHRvcmVhZCA+IGJ1ZmZlci5sZW5ndGggPyBidWZmZXIubGVuZ3RoIDogdG9yZWFkLFxuICAgICAgKTtcbiAgICAgIGlmIChyZWFkID09PSAwKSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gICAgICBjYW1sX01ENVVwZGF0ZShjdHgsIGJ1ZmZlci5zdWJhcnJheSgwLCByZWFkKSwgcmVhZCk7XG4gICAgICB0b3JlYWQgLT0gcmVhZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9zdHJpbmcsIGNhbWxfbWQ1X2J5dGVzXG5mdW5jdGlvbiBjYW1sX21kNV9zdHJpbmcocywgb2ZzLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfbWQ1X2J5dGVzKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpLCBvZnMsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1VHJhbnNmb3JtXG52YXIgY2FtbF9NRDVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBhZGQoeCwgeSkge1xuICAgIHJldHVybiAoeCArIHkpIHwgMDtcbiAgfVxuICBmdW5jdGlvbiB4eChxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgYSA9IGFkZChhZGQoYSwgcSksIGFkZCh4LCB0KSk7XG4gICAgcmV0dXJuIGFkZCgoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xuICB9XG4gIGZ1bmN0aW9uIGZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICByZXR1cm4geHgoKGIgJiBjKSB8ICh+YiAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuICBmdW5jdGlvbiBnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgcmV0dXJuIHh4KChiICYgZCkgfCAoYyAmIH5kKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gaGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgIHJldHVybiB4eChiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xuICB9XG4gIGZ1bmN0aW9uIGlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICByZXR1cm4geHgoYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAodywgYnVmZmVyKSB7XG4gICAgdmFyIGEgPSB3WzBdLFxuICAgICAgYiA9IHdbMV0sXG4gICAgICBjID0gd1syXSxcbiAgICAgIGQgPSB3WzNdO1xuXG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclswXSwgNywgMHhkNzZhYTQ3OCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxXSwgMTIsIDB4ZThjN2I3NTYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMl0sIDE3LCAweDI0MjA3MGRiKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzNdLCAyMiwgMHhjMWJkY2VlZSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcls0XSwgNywgMHhmNTdjMGZhZik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcls1XSwgMTIsIDB4NDc4N2M2MmEpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbNl0sIDE3LCAweGE4MzA0NjEzKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzddLCAyMiwgMHhmZDQ2OTUwMSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcls4XSwgNywgMHg2OTgwOThkOCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcls5XSwgMTIsIDB4OGI0NGY3YWYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMTBdLCAxNywgMHhmZmZmNWJiMSk7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsxMV0sIDIyLCAweDg5NWNkN2JlKTtcbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWzEyXSwgNywgMHg2YjkwMTEyMik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxM10sIDEyLCAweGZkOTg3MTkzKTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWzE0XSwgMTcsIDB4YTY3OTQzOGUpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbMTVdLCAyMiwgMHg0OWI0MDgyMSk7XG5cbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzFdLCA1LCAweGY2MWUyNTYyKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzZdLCA5LCAweGMwNDBiMzQwKTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWzExXSwgMTQsIDB4MjY1ZTVhNTEpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbMF0sIDIwLCAweGU5YjZjN2FhKTtcbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzVdLCA1LCAweGQ2MmYxMDVkKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzEwXSwgOSwgMHgwMjQ0MTQ1Myk7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE0LCAweGQ4YTFlNjgxKTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzRdLCAyMCwgMHhlN2QzZmJjOCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlcls5XSwgNSwgMHgyMWUxY2RlNik7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsxNF0sIDksIDB4YzMzNzA3ZDYpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbM10sIDE0LCAweGY0ZDUwZDg3KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzhdLCAyMCwgMHg0NTVhMTRlZCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDUsIDB4YTllM2U5MDUpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbMl0sIDksIDB4ZmNlZmEzZjgpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbN10sIDE0LCAweDY3NmYwMmQ5KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzEyXSwgMjAsIDB4OGQyYTRjOGEpO1xuXG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlcls1XSwgNCwgMHhmZmZhMzk0Mik7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlcls4XSwgMTEsIDB4ODc3MWY2ODEpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbMTFdLCAxNiwgMHg2ZDlkNjEyMik7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsxNF0sIDIzLCAweGZkZTUzODBjKTtcbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWzFdLCA0LCAweGE0YmVlYTQ0KTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWzRdLCAxMSwgMHg0YmRlY2ZhOSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlcls3XSwgMTYsIDB4ZjZiYjRiNjApO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbMTBdLCAyMywgMHhiZWJmYmM3MCk7XG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDQsIDB4Mjg5YjdlYzYpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMF0sIDExLCAweGVhYTEyN2ZhKTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWzNdLCAxNiwgMHhkNGVmMzA4NSk7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlcls2XSwgMjMsIDB4MDQ4ODFkMDUpO1xuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbOV0sIDQsIDB4ZDlkNGQwMzkpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMTJdLCAxMSwgMHhlNmRiOTllNSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE2LCAweDFmYTI3Y2Y4KTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWzJdLCAyMywgMHhjNGFjNTY2NSk7XG5cbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzBdLCA2LCAweGY0MjkyMjQ0KTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzddLCAxMCwgMHg0MzJhZmY5Nyk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNF0sIDE1LCAweGFiOTQyM2E3KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzVdLCAyMSwgMHhmYzkzYTAzOSk7XG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsxMl0sIDYsIDB4NjU1YjU5YzMpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbM10sIDEwLCAweDhmMGNjYzkyKTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWzEwXSwgMTUsIDB4ZmZlZmY0N2QpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbMV0sIDIxLCAweDg1ODQ1ZGQxKTtcbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzhdLCA2LCAweDZmYTg3ZTRmKTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzE1XSwgMTAsIDB4ZmUyY2U2ZTApO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbNl0sIDE1LCAweGEzMDE0MzE0KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzEzXSwgMjEsIDB4NGUwODExYTEpO1xuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbNF0sIDYsIDB4Zjc1MzdlODIpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbMTFdLCAxMCwgMHhiZDNhZjIzNSk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsyXSwgMTUsIDB4MmFkN2QyYmIpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbOV0sIDIxLCAweGViODZkMzkxKTtcblxuICAgIHdbMF0gPSBhZGQoYSwgd1swXSk7XG4gICAgd1sxXSA9IGFkZChiLCB3WzFdKTtcbiAgICB3WzJdID0gYWRkKGMsIHdbMl0pO1xuICAgIHdbM10gPSBhZGQoZCwgd1szXSk7XG4gIH07XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUluaXRcbmZ1bmN0aW9uIGNhbWxfTUQ1SW5pdCgpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig2NCk7XG4gIHZhciBiMzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgdmFyIGI4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIHtcbiAgICBsZW46IDAsXG4gICAgdzogbmV3IFVpbnQzMkFycmF5KFsweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2XSksXG4gICAgYjMyOiBiMzIsXG4gICAgYjg6IGI4LFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENVVwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9NRDVUcmFuc2Zvcm1cbmZ1bmN0aW9uIGNhbWxfTUQ1VXBkYXRlKGN0eCwgaW5wdXQsIGlucHV0X2xlbikge1xuICB2YXIgaW5fYnVmID0gY3R4LmxlbiAmIDB4M2Y7XG4gIHZhciBpbnB1dF9wb3MgPSAwO1xuICBjdHgubGVuICs9IGlucHV0X2xlbjtcbiAgaWYgKGluX2J1Zikge1xuICAgIHZhciBtaXNzaW5nID0gNjQgLSBpbl9idWY7XG4gICAgaWYgKGlucHV0X2xlbiA8IG1pc3NpbmcpIHtcbiAgICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoMCwgaW5wdXRfbGVuKSwgaW5fYnVmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheSgwLCBtaXNzaW5nKSwgaW5fYnVmKTtcbiAgICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gICAgaW5wdXRfbGVuIC09IG1pc3Npbmc7XG4gICAgaW5wdXRfcG9zICs9IG1pc3Npbmc7XG4gIH1cbiAgd2hpbGUgKGlucHV0X2xlbiA+PSA2NCkge1xuICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoaW5wdXRfcG9zLCBpbnB1dF9wb3MgKyA2NCksIDApO1xuICAgIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgICBpbnB1dF9sZW4gLT0gNjQ7XG4gICAgaW5wdXRfcG9zICs9IDY0O1xuICB9XG4gIGlmIChpbnB1dF9sZW4pXG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheShpbnB1dF9wb3MsIGlucHV0X3BvcyArIGlucHV0X2xlbiksIDApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX01ENVRyYW5zZm9ybVxuZnVuY3Rpb24gY2FtbF9NRDVGaW5hbChjdHgpIHtcbiAgdmFyIGluX2J1ZiA9IGN0eC5sZW4gJiAweDNmO1xuICBjdHguYjhbaW5fYnVmXSA9IDB4ODA7XG4gIGluX2J1ZisrO1xuICBpZiAoaW5fYnVmID4gNTYpIHtcbiAgICBmb3IgKHZhciBqID0gaW5fYnVmOyBqIDwgNjQ7IGorKykge1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gICAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTY7IGorKykge1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaiA9IGluX2J1ZjsgaiA8IDU2OyBqKyspIHtcbiAgICAgIGN0eC5iOFtqXSA9IDA7XG4gICAgfVxuICB9XG4gIGN0eC5iMzJbMTRdID0gY3R4LmxlbiA8PCAzO1xuICBjdHguYjMyWzE1XSA9IChjdHgubGVuID4+IDI5KSAmIDB4MWZmZmZmZmY7XG4gIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgdmFyIHQgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKSB0W2kgKiA0ICsgal0gPSAoY3R4LndbaV0gPj4gKDggKiBqKSkgJiAweGZmO1xuICByZXR1cm4gdDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMsIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX01ENUluaXQsIGNhbWxfTUQ1VXBkYXRlLCBjYW1sX01ENUZpbmFsXG5mdW5jdGlvbiBjYW1sX21kNV9ieXRlcyhzLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBhID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzKTtcbiAgY2FtbF9NRDVVcGRhdGUoY3R4LCBhLnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKSwgbGVuKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczoganNvb19kYXRhdmlld1xudmFyIGpzb29fZGF0YXZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtcblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaVxuLy9SZXF1aXJlczoganNvb19kYXRhdmlld1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpIHtcbiAganNvb19kYXRhdmlldy5zZXRGbG9hdDY0KDAsIHgsIHRydWUpO1xuICB2YXIgbG8zMiA9IGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDAsIHRydWUpO1xuICB2YXIgaGkzMiA9IGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xuICB2YXIgbG8gPSBsbzMyICYgMHhmZmZmZmY7XG4gIHZhciBtaSA9IChsbzMyID4+PiAyNCkgfCAoKGhpMzIgPDwgOCkgJiAweGZmZmZmZik7XG4gIHZhciBoaSA9IChoaTMyID4+PiAxNikgJiAweGZmZmY7XG4gIC8vIFY4IHVzZXMgc2lnbmFsaW5nIE5hTnMgYXMgc2VudGluZWwuIFNvLCBOYU5zIGFyZSBtYWRlIHF1aWV0IHdoZW5cbiAgLy8gdGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5LiBNYWtlIHRoZW0gcXVpZXQgaGVyZSBzbyB0aGF0IHdlIGdldFxuICAvLyBjb25zaXN0ZW50IHJlc3VsdHMuXG4gIGlmICgoaGkgJiAweDdmZjgpID09PSAweDdmZjAgJiYgKG1pIHwgbG8gfCAoaGkgJiAweGYpKSAhPT0gMCkgaGkgfD0gODtcbiAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKGxvLCBtaSwgaGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZGF0YXZpZXdcbmZ1bmN0aW9uIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdCh4KSB7XG4gIGpzb29fZGF0YXZpZXcuc2V0RmxvYXQzMigwLCB4LCB0cnVlKTtcbiAgcmV0dXJuIGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDAsIHRydWUpIHwgMDtcbn1cblxuLy9GUCBsaXRlcmFscyBjYW4gYmUgd3JpdHRlbiB1c2luZyB0aGUgaGV4YWRlY2ltYWxcbi8vbm90YXRpb24gMHg8bWFudGlzc2EgaW4gaGV4PnA8ZXhwb25lbnQ+IGZyb20gSVNPIEM5OS5cbi8vaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWhleGZsb2F0L2Jsb2IvbWFzdGVyL2hleGZsb2F0LmpzXG4vL1Byb3ZpZGVzOiBjYW1sX2hleHN0cmluZ19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQoeCwgcHJlYywgc3R5bGUpIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHgpKSByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJuYW5cIik7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHggPiAwID8gXCJpbmZpbml0eVwiIDogXCItaW5maW5pdHlcIik7XG4gIH1cbiAgdmFyIHNpZ24gPSB4ID09PSAwICYmIDEgLyB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPyAxIDogeCA+PSAwID8gMCA6IDE7XG4gIGlmIChzaWduKSB4ID0gLXg7XG4gIHZhciBleHAgPSAwO1xuICBpZiAoeCA9PT0gMCkge1xuICB9IGVsc2UgaWYgKHggPCAxKSB7XG4gICAgd2hpbGUgKHggPCAxICYmIGV4cCA+IC0xMDIyKSB7XG4gICAgICB4ICo9IDI7XG4gICAgICBleHAtLTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHggPj0gMikge1xuICAgICAgeCAvPSAyO1xuICAgICAgZXhwKys7XG4gICAgfVxuICB9XG4gIHZhciBleHBfc2lnbiA9IGV4cCA8IDAgPyBcIlwiIDogXCIrXCI7XG4gIHZhciBzaWduX3N0ciA9IFwiXCI7XG4gIGlmIChzaWduKSBzaWduX3N0ciA9IFwiLVwiO1xuICBlbHNlIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlIDQzIC8qICcrJyAqLzpcbiAgICAgICAgc2lnbl9zdHIgPSBcIitcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMyIC8qICcgJyAqLzpcbiAgICAgICAgc2lnbl9zdHIgPSBcIiBcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHByZWMgPj0gMCAmJiBwcmVjIDwgMTMpIHtcbiAgICAvKiBJZiBhIHByZWNpc2lvbiBpcyBnaXZlbiwgYW5kIGlzIHNtYWxsLCByb3VuZCBtYW50aXNzYSBhY2NvcmRpbmdseSAqL1xuICAgIHZhciBjc3QgPSBNYXRoLnBvdygyLCBwcmVjICogNCk7XG4gICAgeCA9IE1hdGgucm91bmQoeCAqIGNzdCkgLyBjc3Q7XG4gIH1cbiAgdmFyIHhfc3RyID0geC50b1N0cmluZygxNik7XG4gIGlmIChwcmVjID49IDApIHtcbiAgICB2YXIgaWR4ID0geF9zdHIuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIHhfc3RyICs9IFwiLlwiICsgY2FtbF9zdHJfcmVwZWF0KHByZWMsIFwiMFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNpemUgPSBpZHggKyAxICsgcHJlYztcbiAgICAgIGlmICh4X3N0ci5sZW5ndGggPCBzaXplKVxuICAgICAgICB4X3N0ciArPSBjYW1sX3N0cl9yZXBlYXQoc2l6ZSAtIHhfc3RyLmxlbmd0aCwgXCIwXCIpO1xuICAgICAgZWxzZSB4X3N0ciA9IHhfc3RyLnNsaWNlKDAsIHNpemUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXG4gICAgc2lnbl9zdHIgKyBcIjB4XCIgKyB4X3N0ciArIFwicFwiICsgZXhwX3NpZ24gKyBleHAudG9TdHJpbmcoMTApLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZGF0YXZpZXdcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyh4KSB7XG4gIHZhciBsbyA9IHgubG87XG4gIHZhciBtaSA9IHgubWk7XG4gIHZhciBoaSA9IHguaGk7XG4gIC8vIFY4IHVzZXMgc2lnbmFsaW5nIE5hTnMgYXMgc2VudGluZWwuIFNvLCBOYU5zIGFyZSBtYWRlIHF1aWV0IHdoZW5cbiAgLy8gdGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5LiBNYWtlIHRoZW0gcXVpZXQgaGVyZSBzbyB0aGF0IHdlIGdldFxuICAvLyBjb25zaXN0ZW50IHJlc3VsdHMuXG4gIGlmICgoaGkgJiAweDdmZjgpID09PSAweDdmZjAgJiYgKG1pIHwgbG8gfCAoaGkgJiAweGYpKSAhPT0gMCkgaGkgfD0gODtcbiAganNvb19kYXRhdmlldy5zZXRVaW50MzIoMCwgbG8gfCAobWkgPDwgMjQpLCB0cnVlKTtcbiAganNvb19kYXRhdmlldy5zZXRVaW50MzIoNCwgKG1pID4+PiA4KSB8IChoaSA8PCAxNiksIHRydWUpO1xuICByZXR1cm4ganNvb19kYXRhdmlldy5nZXRGbG9hdDY0KDAsIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25leHRhZnRlcl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfYWRkLCBjYW1sX2ludDY0X3N1YixjYW1sX2ludDY0X29mX2ludDMyXG5mdW5jdGlvbiBjYW1sX25leHRhZnRlcl9mbG9hdCh4LCB5KSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oeCkgfHwgTnVtYmVyLmlzTmFOKHkpKSByZXR1cm4gTnVtYmVyLk5hTjtcbiAgaWYgKHggPT09IHkpIHJldHVybiB5O1xuICBpZiAoeCA9PT0gMCkge1xuICAgIGlmICh5IDwgMCkgcmV0dXJuIC1NYXRoLnBvdygyLCAtMTA3NCk7XG4gICAgZWxzZSByZXR1cm4gTWF0aC5wb3coMiwgLTEwNzQpO1xuICB9XG4gIHZhciBiaXRzID0gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpO1xuICB2YXIgb25lID0gY2FtbF9pbnQ2NF9vZl9pbnQzMigxKTtcbiAgaWYgKHggPCB5ID09PSB4ID4gMCkgYml0cyA9IGNhbWxfaW50NjRfYWRkKGJpdHMsIG9uZSk7XG4gIGVsc2UgYml0cyA9IGNhbWxfaW50NjRfc3ViKGJpdHMsIG9uZSk7XG4gIHJldHVybiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoYml0cyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdHJ1bmNfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdHJ1bmNfZmxvYXQoeCkge1xuICByZXR1cm4gTWF0aC50cnVuYyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzIGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2RhdGF2aWV3XG5mdW5jdGlvbiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMoeCkge1xuICBqc29vX2RhdGF2aWV3LnNldFVpbnQzMigwLCB4LCB0cnVlKTtcbiAgcmV0dXJuIGpzb29fZGF0YXZpZXcuZ2V0RmxvYXQzMigwLCB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jbGFzc2lmeV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jbGFzc2lmeV9mbG9hdCh4KSB7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPj0gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpIHJldHVybiAwO1xuICAgIGlmICh4ICE9PSAwKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuICByZXR1cm4gTnVtYmVyLmlzTmFOKHgpID8gNCA6IDM7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX21vZGZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbW9kZl9mbG9hdCh4KSB7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICB2YXIgbmVnID0gMSAvIHggPCAwO1xuICAgIHggPSBNYXRoLmFicyh4KTtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoeCk7XG4gICAgdmFyIGYgPSB4IC0gaTtcbiAgICBpZiAobmVnKSB7XG4gICAgICBpID0gLWk7XG4gICAgICBmID0gLWY7XG4gICAgfVxuICAgIHJldHVybiBbMCwgZiwgaV07XG4gIH1cbiAgaWYgKE51bWJlci5pc05hTih4KSkgcmV0dXJuIFswLCBOdW1iZXIuTmFOLCBOdW1iZXIuTmFOXTtcbiAgcmV0dXJuIFswLCAxIC8geCwgeF07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xkZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xkZXhwX2Zsb2F0KHgsIGV4cCkge1xuICBleHAgfD0gMDtcbiAgaWYgKGV4cCA+IDEwMjMpIHtcbiAgICBleHAgLT0gMTAyMztcbiAgICB4ICo9IE1hdGgucG93KDIsIDEwMjMpO1xuICAgIGlmIChleHAgPiAxMDIzKSB7XG4gICAgICAvLyBpbiBjYXNlIHggaXMgc3Vibm9ybWFsXG4gICAgICBleHAgLT0gMTAyMztcbiAgICAgIHggKj0gTWF0aC5wb3coMiwgMTAyMyk7XG4gICAgfVxuICB9XG4gIGlmIChleHAgPCAtMTAyMykge1xuICAgIGV4cCArPSAxMDIzO1xuICAgIHggKj0gTWF0aC5wb3coMiwgLTEwMjMpO1xuICB9XG4gIHggKj0gTWF0aC5wb3coMiwgZXhwKTtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZyZXhwX2Zsb2F0KHgpIHtcbiAgaWYgKHggPT09IDAgfHwgIU51bWJlci5pc0Zpbml0ZSh4KSkgcmV0dXJuIFswLCB4LCAwXTtcbiAgdmFyIG5lZyA9IHggPCAwO1xuICBpZiAobmVnKSB4ID0gLXg7XG4gIHZhciBleHAgPSBNYXRoLm1heCgtMTAyMywgTWF0aC5mbG9vcihNYXRoLmxvZzIoeCkpICsgMSk7XG4gIHggKj0gTWF0aC5wb3coMiwgLWV4cCk7XG4gIHdoaWxlICh4IDwgMC41KSB7XG4gICAgeCAqPSAyO1xuICAgIGV4cC0tO1xuICB9XG4gIHdoaWxlICh4ID49IDEpIHtcbiAgICB4ICo9IDAuNTtcbiAgICBleHArKztcbiAgfVxuICBpZiAobmVnKSB4ID0gLXg7XG4gIHJldHVybiBbMCwgeCwgZXhwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9jb21wYXJlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Zsb2F0X2NvbXBhcmUoeCwgeSkge1xuICBpZiAoeCA9PT0geSkgcmV0dXJuIDA7XG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICBpZiAoeCA+IHkpIHJldHVybiAxO1xuICBpZiAoIU51bWJlci5pc05hTih4KSkgcmV0dXJuIDE7XG4gIGlmICghTnVtYmVyLmlzTmFOKHkpKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvcHlzaWduX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NvcHlzaWduX2Zsb2F0KHgsIHkpIHtcbiAgaWYgKHkgPT09IDApIHkgPSAxIC8geTtcbiAgeCA9IE1hdGguYWJzKHgpO1xuICByZXR1cm4geSA8IDAgPyAteCA6IHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2lnbmJpdF9mbG9hdCBjb25zdFxuLy9BbGlhczogY2FtbF9zaWduYml0XG5mdW5jdGlvbiBjYW1sX3NpZ25iaXRfZmxvYXQoeCkge1xuICBpZiAoeCA9PT0gMCkgeCA9IDEgLyB4O1xuICByZXR1cm4geCA8IDAgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9leHBtMV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9leHBtMV9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmV4cG0xKHgpO1xufVxuLy9Qcm92aWRlczogY2FtbF9leHAyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2V4cDJfZmxvYXQoeCkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzFwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzFwX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGgubG9nMXAoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzJfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMl9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmxvZzIoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2h5cG90X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2h5cG90X2Zsb2F0KHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzEwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzEwX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGgubG9nMTAoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Nvc2hfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29zaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmNvc2goeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Fjb3NoX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Fjb3NoX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYWNvc2goeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3NpbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc2luaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLnNpbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2FzaW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2FzaW5oX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYXNpbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3RhbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdGFuaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLnRhbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2F0YW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2F0YW5oX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYXRhbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3JvdW5kX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3JvdW5kX2Zsb2F0KHgpIHtcbiAgaWYgKHggPj0gMCkge1xuICAgIHZhciB5ID0gTWF0aC5mbG9vcih4KTtcbiAgICByZXR1cm4geCAtIHkgPj0gMC41ID8geSArIDEgOiB5O1xuICB9IGVsc2Uge1xuICAgIHZhciB5ID0gTWF0aC5jZWlsKHgpO1xuICAgIHJldHVybiB5IC0geCA+PSAwLjUgPyB5IC0gMSA6IHk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfY2JydF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jYnJ0X2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguY2JydCh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZXJmX2Zsb2F0KHgpIHtcbiAgdmFyIGExID0gMC4yNTQ4Mjk1OTI7XG4gIHZhciBhMiA9IC0wLjI4NDQ5NjczNjtcbiAgdmFyIGEzID0gMS40MjE0MTM3NDE7XG4gIHZhciBhNCA9IC0xLjQ1MzE1MjAyNztcbiAgdmFyIGE1ID0gMS4wNjE0MDU0Mjk7XG4gIHZhciBwID0gMC4zMjc1OTExO1xuXG4gIHZhciBzaWduID0gMTtcbiAgaWYgKHggPCAwKSB7XG4gICAgc2lnbiA9IC0xO1xuICB9XG4gIHggPSBNYXRoLmFicyh4KTtcbiAgdmFyIHQgPSAxLjAgLyAoMS4wICsgcCAqIHgpO1xuICB2YXIgeSA9XG4gICAgMS4wIC0gKCgoKGE1ICogdCArIGE0KSAqIHQgKyBhMykgKiB0ICsgYTIpICogdCArIGExKSAqIHQgKiBNYXRoLmV4cCgteCAqIHgpO1xuXG4gIHJldHVybiBzaWduICogeTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZjX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2VyZl9mbG9hdFxuZnVuY3Rpb24gY2FtbF9lcmZjX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIDEgLSBjYW1sX2VyZl9mbG9hdCh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbWFfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZm1hX2Zsb2F0KHgsIHksIHopIHtcbiAgdmFyIFNQTElUID0gTWF0aC5wb3coMiwgMjcpICsgMTtcbiAgdmFyIE1JTl9WQUxVRSA9IE1hdGgucG93KDIsIC0xMDIyKTtcbiAgdmFyIEVQU0lMT04gPSBNYXRoLnBvdygyLCAtNTIpO1xuICB2YXIgQyA9IDQxNjtcbiAgdmFyIEEgPSBNYXRoLnBvdygyLCArQyk7XG4gIHZhciBCID0gTWF0aC5wb3coMiwgLUMpO1xuXG4gIGZ1bmN0aW9uIG11bHRpcGx5KGEsIGIpIHtcbiAgICB2YXIgYXQgPSBTUExJVCAqIGE7XG4gICAgdmFyIGFoaSA9IGF0IC0gKGF0IC0gYSk7XG4gICAgdmFyIGFsbyA9IGEgLSBhaGk7XG4gICAgdmFyIGJ0ID0gU1BMSVQgKiBiO1xuICAgIHZhciBiaGkgPSBidCAtIChidCAtIGIpO1xuICAgIHZhciBibG8gPSBiIC0gYmhpO1xuICAgIHZhciBwID0gYSAqIGI7XG4gICAgdmFyIGUgPSBhaGkgKiBiaGkgLSBwICsgYWhpICogYmxvICsgYWxvICogYmhpICsgYWxvICogYmxvO1xuICAgIHJldHVybiB7XG4gICAgICBwOiBwLFxuICAgICAgZTogZSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICB2YXIgcyA9IGEgKyBiO1xuICAgIHZhciB2ID0gcyAtIGE7XG4gICAgdmFyIGUgPSBhIC0gKHMgLSB2KSArIChiIC0gdik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHM6IHMsXG4gICAgICBlOiBlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGp1c3QoeCwgeSkge1xuICAgIHJldHVybiB4ICE9PSAwICYmIHkgIT09IDAgJiYgU1BMSVQgKiB4IC0gKFNQTElUICogeCAtIHgpID09PSB4XG4gICAgICA/IHggKiAoMSArICh4IDwgMCA/IC0xIDogKzEpICogKHkgPCAwID8gLTEgOiArMSkgKiBFUFNJTE9OKVxuICAgICAgOiB4O1xuICB9XG5cbiAgaWYgKHggPT09IDAgfHwgeSA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKHgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoeSkpIHtcbiAgICByZXR1cm4geCAqIHkgKyB6O1xuICB9XG4gIGlmICh6ID09PSAwKSB7XG4gICAgcmV0dXJuIHggKiB5O1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHopKSB7XG4gICAgcmV0dXJuIHo7XG4gIH1cblxuICB2YXIgc2NhbGUgPSAxO1xuICB3aGlsZSAoTWF0aC5hYnMoeCkgPiBBKSB7XG4gICAgc2NhbGUgKj0gQTtcbiAgICB4ICo9IEI7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpID4gQSkge1xuICAgIHNjYWxlICo9IEE7XG4gICAgeSAqPSBCO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMSAvIDApIHtcbiAgICByZXR1cm4geCAqIHkgKiBzY2FsZTtcbiAgfVxuICB3aGlsZSAoTWF0aC5hYnMoeCkgPCBCKSB7XG4gICAgc2NhbGUgKj0gQjtcbiAgICB4ICo9IEE7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpIDwgQikge1xuICAgIHNjYWxlICo9IEI7XG4gICAgeSAqPSBBO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMCkge1xuICAgIHJldHVybiB6O1xuICB9XG5cbiAgdmFyIHhzID0geDtcbiAgdmFyIHlzID0geTtcbiAgdmFyIHpzID0geiAvIHNjYWxlO1xuXG4gIGlmIChNYXRoLmFicyh6cykgPiAoTWF0aC5hYnMoeHMgKiB5cykgKiA0KSAvIEVQU0lMT04pIHtcbiAgICByZXR1cm4gejtcbiAgfVxuICBpZiAoTWF0aC5hYnMoenMpIDwgKCgoTWF0aC5hYnMoeHMgKiB5cykgKiBFUFNJTE9OKSAvIDQpICogRVBTSUxPTikgLyA0KSB7XG4gICAgenMgPSAoeiA8IDAgPyAtMSA6ICsxKSAqIE1JTl9WQUxVRTtcbiAgfVxuXG4gIHZhciB4eSA9IG11bHRpcGx5KHhzLCB5cyk7XG4gIHZhciBzID0gYWRkKHh5LnAsIHpzKTtcbiAgdmFyIHUgPSBhZGQoeHkuZSwgcy5lKTtcbiAgdmFyIGkgPSBhZGQocy5zLCB1LnMpO1xuXG4gIHZhciBmID0gaS5zICsgYWRqdXN0KGkuZSwgdS5lKTtcbiAgaWYgKGYgPT09IDApIHtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIHZhciBmcyA9IGYgKiBzY2FsZTtcbiAgaWYgKE1hdGguYWJzKGZzKSA+IE1JTl9WQUxVRSkge1xuICAgIHJldHVybiBmcztcbiAgfVxuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgd2FzIGV4dHJhIHJvdW5kaW5nIGZvciBhIGRlbm9ybWFsaXplZCB2YWx1ZS5cbiAgcmV0dXJuIGZzICsgYWRqdXN0KGYgLSBmcyAvIHNjYWxlLCBpLmUpICogc2NhbGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9mbG9hdChmbXQsIHgpIHtcbiAgZnVuY3Rpb24gdG9GaXhlZCh4LCBkcCkge1xuICAgIGlmIChNYXRoLmFicyh4KSA8IDEuMCkge1xuICAgICAgcmV0dXJuIHgudG9GaXhlZChkcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlID0gTnVtYmVyLnBhcnNlSW50KHgudG9TdHJpbmcoKS5zcGxpdChcIitcIilbMV0pO1xuICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICBlIC09IDIwO1xuICAgICAgICB4IC89IE1hdGgucG93KDEwLCBlKTtcbiAgICAgICAgeCArPSBjYW1sX3N0cl9yZXBlYXQoZSwgXCIwXCIpO1xuICAgICAgICBpZiAoZHAgPiAwKSB7XG4gICAgICAgICAgeCA9IHggKyBcIi5cIiArIGNhbWxfc3RyX3JlcGVhdChkcCwgXCIwXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSBlbHNlIHJldHVybiB4LnRvRml4ZWQoZHApO1xuICAgIH1cbiAgfVxuICB2YXIgcyxcbiAgICBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgdmFyIHByZWMgPSBmLnByZWMgPCAwID8gNiA6IGYucHJlYztcbiAgaWYgKHggPCAwIHx8ICh4ID09PSAwICYmIDEgLyB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpKSB7XG4gICAgZi5zaWduID0gLTE7XG4gICAgeCA9IC14O1xuICB9XG4gIGlmIChOdW1iZXIuaXNOYU4oeCkpIHtcbiAgICBzID0gXCJuYW5cIjtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICB9IGVsc2UgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBzID0gXCJpbmZcIjtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICB9IGVsc2VcbiAgICBzd2l0Y2ggKGYuY29udikge1xuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgdmFyIHMgPSB4LnRvRXhwb25lbnRpYWwocHJlYyk7XG4gICAgICAgIC8vIGV4cG9uZW50IHNob3VsZCBiZSBhdCBsZWFzdCB0d28gZGlnaXRzXG4gICAgICAgIHZhciBpID0gcy5sZW5ndGg7XG4gICAgICAgIGlmIChzLmNoYXJBdChpIC0gMykgPT09IFwiZVwiKVxuICAgICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgLSAxKSArIFwiMFwiICsgcy5zbGljZShpIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImZcIjpcbiAgICAgICAgcyA9IHRvRml4ZWQoeCwgcHJlYyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImdcIjpcbiAgICAgICAgcHJlYyA9IHByZWMgPyBwcmVjIDogMTtcbiAgICAgICAgcyA9IHgudG9FeHBvbmVudGlhbChwcmVjIC0gMSk7XG4gICAgICAgIHZhciBqID0gcy5pbmRleE9mKFwiZVwiKTtcbiAgICAgICAgdmFyIGV4cCA9ICtzLnNsaWNlKGogKyAxKTtcbiAgICAgICAgaWYgKGV4cCA8IC00IHx8IHggPj0gMWUyMSB8fCB4LnRvRml4ZWQoMCkubGVuZ3RoID4gcHJlYykge1xuICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICB2YXIgaSA9IGogLSAxO1xuICAgICAgICAgIHdoaWxlIChzLmNoYXJBdChpKSA9PT0gXCIwXCIpIGktLTtcbiAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT09IFwiLlwiKSBpLS07XG4gICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpICsgcy5zbGljZShqKTtcbiAgICAgICAgICBpID0gcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PT0gXCJlXCIpXG4gICAgICAgICAgICBzID0gcy5zbGljZSgwLCBpIC0gMSkgKyBcIjBcIiArIHMuc2xpY2UoaSAtIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwID0gcHJlYztcbiAgICAgICAgICBpZiAoZXhwIDwgMCkge1xuICAgICAgICAgICAgcCAtPSBleHAgKyAxO1xuICAgICAgICAgICAgcyA9IHgudG9GaXhlZChwKTtcbiAgICAgICAgICB9IGVsc2Ugd2hpbGUgKCgocyA9IHgudG9GaXhlZChwKSksIHMubGVuZ3RoID4gcHJlYyArIDEpKSBwLS07XG4gICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICAgIHZhciBpID0gcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgd2hpbGUgKHMuY2hhckF0KGkpID09PSBcIjBcIikgaS0tO1xuICAgICAgICAgICAgaWYgKHMuY2hhckF0KGkpID09PSBcIi5cIikgaS0tO1xuICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X29mX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX3N0cmluZyhzKSB7XG4gIHZhciByZXM7XG4gIHZhciByX2Zsb2F0ID0gL14gKlstK10/KD86XFxkKlxcLj9cXGQrfFxcZCtcXC4/XFxkKikoPzpbZUVdWy0rXT9cXGQrKT8kLztcbiAgcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocyk7XG4gIHJlcyA9ICtzO1xuICAvL0Zhc3QgcGF0aFxuICBpZiAoIU51bWJlci5pc05hTihyZXMpICYmIHJfZmxvYXQudGVzdChzKSkgcmV0dXJuIHJlcztcbiAgcyA9IHMucmVwbGFjZSgvXy9nLCBcIlwiKTtcbiAgcmVzID0gK3M7XG4gIGlmICgoIU51bWJlci5pc05hTihyZXMpICYmIHJfZmxvYXQudGVzdChzKSkgfHwgL15bKy1dP25hbiQvaS50ZXN0KHMpKVxuICAgIHJldHVybiByZXM7XG4gIHZhciBtID0gL14gKihbKy1dPykweChbMC05YS1mXSspXFwuPyhbMC05YS1mXSopKHAoWystXT9bMC05XSspKT8kL2kuZXhlYyhzKTtcbiAgLy8gICAgICAgICAgMSAgICAgICAgMiAgICAgICAgICAgICAzICAgICAgICAgICA1XG4gIGlmIChtKSB7XG4gICAgdmFyIG0zID0gbVszXS5yZXBsYWNlKC8wKyQvLCBcIlwiKTtcbiAgICB2YXIgbWFudGlzc2EgPSBOdW1iZXIucGFyc2VJbnQobVsxXSArIG1bMl0gKyBtMywgMTYpO1xuICAgIHZhciBleHBvbmVudCA9ICgrbVs1XSB8fCAwKSAtIDQgKiBtMy5sZW5ndGg7XG4gICAgcmVzID0gbWFudGlzc2EgKiBNYXRoLnBvdygyLCBleHBvbmVudCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoL15cXCs/aW5mKGluaXR5KT8kL2kudGVzdChzKSkgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgaWYgKC9eLWluZihpbml0eSk/JC9pLnRlc3QocykpIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGNhbWxfZmFpbHdpdGgoXCJmbG9hdF9vZl9zdHJpbmdcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuZnVuY3Rpb24gY2FtbF91cGRhdGVfZHVtbXkoeCwgeSkge1xuICBpZiAoeS5mdW4pIHtcbiAgICB4LmZ1biA9IHkuZnVuO1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgeC5mdW4gPSB5O1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBpID0geS5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHhbaV0gPSB5W2ldO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19kdW1teV9pbmZpeFxuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuLy9WZXJzaW9uOiA8IDUuNFxuZnVuY3Rpb24gY2FtbF9hbGxvY19kdW1teV9pbmZpeCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYoeCkge1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYuZnVuLCBbeF0pO1xuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FsbG9jX2R1bW15X2xhenlcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2FsbG9jX2R1bW15X2xhenkoX3VuaXQpIHtcbiAgcmV0dXJuIFswLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91cGRhdGVfZHVtbXlfbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfdXBkYXRlX2R1bW15X2xhenkoZHVtbXksIG5ld3ZhbCkge1xuICBzd2l0Y2ggKGNhbWxfb2JqX3RhZyhuZXd2YWwpKSB7XG4gICAgY2FzZSAyNDY6IC8vIExhenlcbiAgICBjYXNlIDI0NDogLy8gRm9yY2luZ1xuICAgIGNhc2UgMjUwOiAvLyBGb3J3YXJkXG4gICAgICBjYW1sX3VwZGF0ZV9kdW1teShkdW1teSwgbmV3dmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBkdW1teVsxXSA9IG5ld3ZhbDtcbiAgICAgIGR1bW15WzBdID0gMjUwO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9pc19tbF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfb2JqX3RhZyh4KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHhbMF0gPT09IHhbMF0gPj4+IDApIHJldHVybiB4WzBdO1xuICBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKHgpKSByZXR1cm4gMjUyO1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh4KSkgcmV0dXJuIDI1MjtcbiAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiAyNDc7XG4gIGVsc2UgaWYgKHg/LmNhbWxfY3VzdG9tKSByZXR1cm4gMjU1O1xuICBlbHNlIHJldHVybiAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9zZXRfdGFnIChtdXRhYmxlLCBjb25zdClcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF90YWcoeCwgdGFnKSB7XG4gIHhbMF0gPSB0YWc7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9vYmpfYmxvY2sgY29uc3QgKGNvbnN0LGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfYmxvY2sodGFnLCBzaXplKSB7XG4gIC8vIFRPRE86IGZhaWwgZm9yIHZhbHVlIHRoYXQgYXJlIG5vdCByZXByZXNlbnRlZCBhcyBhbiBhcnJheVxuICB2YXIgbyA9IG5ldyBBcnJheShzaXplICsgMSk7XG4gIG9bMF0gPSB0YWc7XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHNpemU7IGkrKykgb1tpXSA9IDA7XG4gIHJldHVybiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial93aXRoX3RhZ1xuZnVuY3Rpb24gY2FtbF9vYmpfd2l0aF90YWcodGFnLCB4KSB7XG4gIHZhciBsID0geC5sZW5ndGg7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gdGFnO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGw7IGkrKykgYVtpXSA9IHhbaV07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9kdXAgbXV0YWJsZSAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfb2JqX2R1cCh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIiA/IHggOiB4LnNsaWNlKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RydW5jYXRlIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfdHJ1bmNhdGUoeCwgcykge1xuICBpZiAocyA8PSAwIHx8IHMgKyAxID4geC5sZW5ndGgpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIk9iai50cnVuY2F0ZVwiKTtcbiAgaWYgKHgubGVuZ3RoICE9PSBzICsgMSkgeC5sZW5ndGggPSBzICsgMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX21ha2VfZm9yd2FyZFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfbWFrZV9mb3J3YXJkKGIsIHYpIHtcbiAgYlswXSA9IDI1MDtcbiAgYlsxXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcCh4LCBpLCBvbGQsIG4pIHtcbiAgaWYgKHhbaSArIDFdID09PSBvbGQpIHtcbiAgICB4W2kgKyAxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2lzX3NoYXJlZFxuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfb2JqX2lzX3NoYXJlZChfeCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X21ha2VfZm9yd2FyZCBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGF6eV9tYWtlX2ZvcndhcmQodikge1xuICByZXR1cm4gWzI1MCwgdl07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWV0aG9kX2NhY2hlXG52YXIgY2FtbF9tZXRob2RfY2FjaGUgPSBbXTtcblxuLy9Qcm92aWRlczogY2FtbF9vb19jYWNoZV9pZCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9tZXRob2RfY2FjaGVcbmZ1bmN0aW9uIGNhbWxfb29fY2FjaGVfaWQoKSB7XG4gIHZhciBjYWNoZWlkID0gY2FtbF9tZXRob2RfY2FjaGUubGVuZ3RoO1xuICBjYW1sX21ldGhvZF9jYWNoZVtjYWNoZWlkXSA9IDA7XG4gIGNhY2hlaWQ7XG59XG5cbi8vLy8vLy8vLy8vLy8gQ2FtbGludGVybmFsT09cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NhY2hlZF9tZXRob2QgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWV0aG9kX2NhY2hlXG5mdW5jdGlvbiBjYW1sX2dldF9jYWNoZWRfbWV0aG9kKG9iaiwgdGFnLCBjYWNoZWlkKSB7XG4gIHZhciBtZXRocyA9IG9ialsxXTtcbiAgdmFyIG9mcyA9IGNhbWxfbWV0aG9kX2NhY2hlW2NhY2hlaWRdO1xuICBpZiAobWV0aHNbb2ZzICsgNF0gPT09IHRhZykge1xuICAgIHJldHVybiBtZXRoc1tvZnMgKyAzXTtcbiAgfVxuICB2YXIgbGkgPSAzLFxuICAgIGhpID0gbWV0aHNbMV0gKiAyICsgMSxcbiAgICBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkgKyBoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSArIDFdKSBoaSA9IG1pIC0gMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgY2FtbF9tZXRob2RfY2FjaGVbY2FjaGVpZF0gPSBsaSAtIDM7XG4gIHJldHVybiBtZXRoc1tsaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X3B1YmxpY19tZXRob2QgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X3B1YmxpY19tZXRob2Qob2JqLCB0YWcpIHtcbiAgdmFyIG1ldGhzID0gb2JqWzFdO1xuICB2YXIgbGkgPSAzLFxuICAgIGhpID0gbWV0aHNbMV0gKiAyICsgMSxcbiAgICBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkgKyBoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSArIDFdKSBoaSA9IG1pIC0gMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgLyogcmV0dXJuIDAgaWYgdGFnIGlzIG5vdCB0aGVyZSAqL1xuICByZXR1cm4gdGFnID09PSBtZXRoc1tsaSArIDFdID8gbWV0aHNbbGldIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vb19sYXN0X2lkXG52YXIgY2FtbF9vb19sYXN0X2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9zZXRfb29faWRcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9zZXRfb29faWQoYikge1xuICBiWzJdID0gY2FtbF9vb19sYXN0X2lkKys7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXNoX29vX2lkIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX29vX2xhc3RfaWRcbmZ1bmN0aW9uIGNhbWxfZnJlc2hfb29faWQoKSB7XG4gIHJldHVybiBjYW1sX29vX2xhc3RfaWQrKztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfcmF3X2ZpZWxkXG5mdW5jdGlvbiBjYW1sX29ial9yYXdfZmllbGQobywgaSkge1xuICByZXR1cm4gb1tpICsgMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF9yYXdfZmllbGQobywgaSwgdikge1xuICByZXR1cm4gKG9baSArIDFdID0gdik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3JlYWNoYWJsZV93b3Jkc1xuZnVuY3Rpb24gY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzKF9vKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9hZGRfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX29ial9hZGRfb2Zmc2V0KF92LCBfb2Zmc2V0KSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJPYmouYWRkX29mZnNldCBpcyBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial91cGRhdGVfdGFnXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfdXBkYXRlX3RhZyhiLCBvLCBuKSB7XG4gIGlmIChiWzBdID09PSBvKSB7XG4gICAgYlswXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZ1xuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZyhvKSB7XG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KG8pICYmXG4gICAgb1swXSA9PT0gb1swXSA+Pj4gMCAmJlxuICAgIGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ2LCAyNDQpXG4gICkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZFxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZChvKSB7XG4gIGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ0LCAyNTApO1xuICByZXR1cm4gMDsgLy8gdW5pdFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVzZXRfdG9fbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZXNldF90b19sYXp5KG8pIHtcbiAgY2FtbF9vYmpfdXBkYXRlX3RhZyhvLCAyNDQsIDI0Nik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVhZF9yZXN1bHRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZWFkX3Jlc3VsdChvKSB7XG4gIHJldHVybiBjYW1sX29ial90YWcobykgPT09IDI1MCA/IG9bMV0gOiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbi8vVmVyc2lvbjogPCA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcoX3QpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodCkge1xuICByZXR1cm4gdCA9PT0gMjQ1ID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2lkZW50aWZpZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2N1c3RvbV9pZGVudGlmaWVyKG8pIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG8uY2FtbF9jdXN0b20gfHwgXCJcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZ2NfcmFtcF91cFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfbWxfZ2NfcmFtcF91cChmKSB7XG4gIHZhciBhID0gY2FtbF9jYWxsYmFjayhmLCBbMF0pO1xuICB2YXIgc3VzcGVuZGVkID0gMDtcbiAgcmV0dXJuIFswLCBhLCBzdXNwZW5kZWRdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2djX3JhbXBfZG93blxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfbWxfZ2NfcmFtcF9kb3duKF9zdXNwZW5kZWRfY29sbGVjdGlvbl93b3JrKSB7XG4gIHJldHVybiAwO1xufVxuIiwiLypcblRvIGRlYWwgd2l0aCBlZmZlY3RzLCB0aGUgZXhlY3V0aW9uIGNvbnRleHQgaXMgaW50dWl0aXZlbHkgY29tcG9zZWQgb2ZcbmEgc3RhY2sgb2YgZmliZXJzLiBFYWNoIGZpYmVyIGhhcyBhIGN1cnJlbnQgbG93LWxldmVsIGNvbnRpbnVhdGlvblxuKG9uZS1hcmd1bWVudCBKYXZhU2NyaXB0IGZ1bmN0aW9uKSwgYSBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kXG5hIHRyaXBsZSBvZiBoYW5kbGVycywgd2hpY2ggYXJlIGludm9rZWQgd2hlbiB0aGUgZmliZXIgdGVybWluYXRlc1xuKGVpdGhlciB3aXRoIGEgdmFsdWUgb3IgYW4gZXhjZXB0aW9uKSBvciB3aGVuIGFuIGVmZmVjdCBpcyBwZXJmb3JtZWQuXG5UaGUgbG93LWxldmVsIGNvbnRpbnVhdGlvbiBvZiB0aGUgdG9wbW9zdCBmaWJlciAod2hpY2ggaXMgY3VycmVudGx5XG5leGVjdXRpbmcpIGlzIHBhc3NlZCBmcm9tIGZ1bmN0aW9uIHRvIGZ1bmN0aW9uIGFzIGFuIGFkZGl0aW9uYWxcbmFyZ3VtZW50LiBJdHMgc3RhY2sgb2YgZXhjZXB0aW9uIGhhbmRsZXJzIGlzIHN0b3JlZCBpblxuW2NhbWxfY3VycmVudF9zdGFjay54XS5cbkV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgcHVzaGVkIGludG8gdGhpcyBzdGFja1xud2hlbiBlbnRlcmluZyBhIFt0cnkgLi4uIHdpdGggLi4uXSBhbmQgcG9wcGVkIG9uIGV4aXQuXG5IYW5kbGVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2N1cnJlbnRfc3RhY2suaF1cbmFuZCB0aGUgcmVtYWluaW5nIGZpYmVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2N1cnJlbnRfc3RhY2suZV0uXG5UbyBpbnN0YWxsIGFuIGVmZmVjdCBoYW5kbGVyLCB3ZSBwdXNoIGEgbmV3IGZpYmVyIGludG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LlxuXG5XZSBoYXZlIGJhc2ljYWxseSB0aGUgZm9sbG93aW5nIHR5cGUgZm9yIHJlaWZpZWQgY29udGludWF0aW9ucyAodHlwZVxuW2NvbnRpbnVhdGlvbl0gaW4gbW9kdWxlIFtFZmZlY3RdIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KTpcblxuICB0eXBlICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiA9ICgnYSwgJ2IpIHN0YWNrIHJlZlxuXG4gIGFuZCAoXywgXykgc3RhY2sgPVxuICAgICAgQ29ucyA6ICgnYiAtPiB1bml0KSAqICAgICAgICAgICAgICgqIGxvdy1sZXZlbCBjb250aW51YXRpb24gKilcbiAgICAgICAgICAgICAoZXhuIC0+IHVuaXQpIGxpc3QgKiAgICAgICAoKiBleGNlcHRpb24gaGFuZGxlcnMgKilcbiAgICAgICAgICAgICAoJ2IsICdjKSBoYW5kbGVyICpcbiAgICAgICAgICAgICAoJ2EsICdiKSBzdGFja1xuICAgICAgICAgICAgIC0+ICgnYSwgJ2MpIHN0YWNrXG4gICAgfCBFbXB0eSA6ICgnYSwgJ2EpIHN0YWNrXG5cbiAgYW5kICgnYSwnYikgaGFuZGxlciA9ICAgKCogQXMgaW4gbW9kdWxlIEVmZmVjdCBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5ICopXG4gICAgeyByZXRjOiAnYSAtPiAnYjtcbiAgICAgIGV4bmM6IGV4biAtPiAnYjtcbiAgICAgIGVmZmM6ICdjLidjIEVmZmVjdC50IC0+ICgoJ2MsJ2IpIGNvbnRpbnVhdGlvbiAtPiAnYikgb3B0aW9uIH1cblxuQ29udGludWF0aW9ucyBhcmUgb25lLXNob3QuIEEgY29udGludWF0aW9uIFtyZWYgRW1wdHldIGhhcyBhbHJlYWR5XG5iZWVuIHJlc3VtZWQuXG5cbkEgY29udGludWF0aW9uIGlzIGJhc2ljYWxseSBjb21wb3NlZCBvZiBhIGxpc3Qgb2YgZmliZXJzLCB3aGljaCBlYWNoXG5oYXMgaXRzIGxvdy1sZXZlbCBjb250aW51YXRpb24sIGl0cyBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kIGFcbnRyaXBsZSBvZiBoYW5kbGVycyB0byBkZWFsIHdpdGggd2hlbiB0aGUgZmliZXIgdGVybWluYXRlcyBvciBhblxuZWZmZWN0IGlzIHBlcmZvcm1lZC4gV2hlbiByZXN1bWluZyBhIGNvbnRpbnVhdGlvbiwgdGhlIGlubmVybW9zdCBmaWJlclxuaXMgcmVzdW1lZCBmaXJzdC5cblxuVGhlIGhhbmRsZXJzIGFyZSBDUFMtdHJhbnNmb3JtZWQgZnVuY3Rpb25zOiB0aGV5IGFjdHVhbGx5IHRha2UgYW5cbmFkZGl0aW9uYWwgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBjdXJyZW50IGxvdy1sZXZlbCBjb250aW51YXRpb24uXG4qL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vIFRoaXMgaGFzIHRoZSBzaGFwZSB7aywgeCwgaCwgZX0gd2hlcmVcbi8vIC0gaCBpcyBhIHRyaXBsZSBvZiBoYW5kbGVycyAoc2VlIGVmZmVjdC5tbClcbi8vIC0gayBpcyB0aGUgbG93IGxldmVsIGNvbnRpbnVhdGlvblxuLy8gLSB4IGlzIHRoZSBleGNlcHRpb24gc3RhY2tcbi8vIC0gZSBpcyB0aGUgZmliZXIgc3RhY2sgb2YgdGhlIHBhcmVudCBmaWJlci5cbnZhciBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcblxuLy9Qcm92aWRlczogY2FtbF9wdXNoX3RyYXBcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wdXNoX3RyYXAoaGFuZGxlcikge1xuICBjYW1sX2N1cnJlbnRfc3RhY2sueCA9IHsgaDogaGFuZGxlciwgdDogY2FtbF9jdXJyZW50X3N0YWNrLnggfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3BfdHJhcFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3BvcF90cmFwKCkge1xuICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KVxuICAgIHJldHVybiBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhyb3cgeDtcbiAgICB9O1xuICB2YXIgaCA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfdW5oYW5kbGVkXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG5cbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3VuaGFuZGxlZChlZmYpIHtcbiAgdmFyIGV4biA9IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4bihlZmYpO1xuICB0aHJvdyBleG47XG59XG5cbi8vUHJvdmlkZXM6Y2FtbF9yZXN1bWVfc3RhY2tcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfcmFpc2VfY29uc3RhbnRcbi8vUmVxdWlyZXM6IGNhbWxfcG9wX2ZpYmVyLCBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgbGFzdCwgaykge1xuICBpZiAoIXN0YWNrKVxuICAgIGNhbWxfcmFpc2VfY29uc3RhbnQoXG4gICAgICBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LkNvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcIiksXG4gICAgKTtcbiAgaWYgKGxhc3QgPT09IDApIHtcbiAgICBsYXN0ID0gc3RhY2s7XG4gICAgLy8gUHJlIE9DYW1sIDUuMiwgbGFzdCB3YXMgbm90IHBvcHVsYXRlZC5cbiAgICB3aGlsZSAobGFzdC5lICE9PSAwKSBsYXN0ID0gbGFzdC5lO1xuICB9XG4gIGNhbWxfY3VycmVudF9zdGFjay5rID0gaztcbiAgbGFzdC5lID0gY2FtbF9jdXJyZW50X3N0YWNrO1xuICBjYW1sX2N1cnJlbnRfc3RhY2sgPSBzdGFjaztcbiAgcmV0dXJuIHN0YWNrLms7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9wX2ZpYmVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3BvcF9maWJlcigpIHtcbiAgLy8gTW92ZSB0byB0aGUgcGFyZW50IGZpYmVyLCByZXR1cm5pbmcgdGhlIHBhcmVudCdzIGxvdy1sZXZlbCBjb250aW51YXRpb25cbiAgdmFyIGMgPSBjYW1sX2N1cnJlbnRfc3RhY2suZTtcbiAgY2FtbF9jdXJyZW50X3N0YWNrLmUgPSAwO1xuICBjYW1sX2N1cnJlbnRfc3RhY2sgPSBjO1xuICByZXR1cm4gYy5rO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG5cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfZnJlc2hfb29faWRcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG4oZWZmKSB7XG4gIHZhciBleG4gPSBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LlVuaGFuZGxlZFwiKTtcbiAgaWYgKGV4bikgZXhuID0gWzAsIGV4biwgZWZmXTtcbiAgZWxzZSB7XG4gICAgZXhuID0gW1xuICAgICAgMjQ4LFxuICAgICAgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkVmZmVjdC5VbmhhbmRsZWRcIiksXG4gICAgICBjYW1sX2ZyZXNoX29vX2lkKDApLFxuICAgIF07XG4gIH1cbiAgcmV0dXJuIGV4bjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4biwgY2FtbF9jdXJyZW50X3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9wZXJmb3JtX2VmZmVjdChlZmYsIGswKSB7XG4gIGlmIChjYW1sX2N1cnJlbnRfc3RhY2suZSA9PT0gMCkge1xuICAgIHZhciBleG4gPSBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG4oZWZmKTtcbiAgICB0aHJvdyBleG47XG4gIH1cbiAgLy8gR2V0IGN1cnJlbnQgZWZmZWN0IGhhbmRsZXJcbiAgdmFyIGhhbmRsZXIgPSBjYW1sX2N1cnJlbnRfc3RhY2suaFszXTtcbiAgdmFyIGxhc3RfZmliZXIgPSBjYW1sX2N1cnJlbnRfc3RhY2s7XG4gIGxhc3RfZmliZXIuayA9IGswO1xuICB2YXIgY29udCA9IFsyNDUgLypjb250aW51YXRpb24qLywgbGFzdF9maWJlciwgbGFzdF9maWJlcl07XG4gIC8vIE1vdmUgdG8gcGFyZW50IGZpYmVyIGFuZCBleGVjdXRlIHRoZSBlZmZlY3QgaGFuZGxlciB0aGVyZVxuICAvLyBUaGUgaGFuZGxlciBpcyBkZWZpbmVkIGluIFN0ZGxpYi5FZmZlY3QsIHNvIHdlIGtub3cgdGhhdCB0aGUgYXJpdHkgbWF0Y2hlc1xuICB2YXIgazEgPSBjYW1sX3BvcF9maWJlcigpO1xuICByZXR1cm4gY2FtbF9zdGFja19jaGVja19kZXB0aCgpXG4gICAgPyBjYW1sX2dldF9jcHNfZnVuKGhhbmRsZXIpKGVmZiwgY29udCwgbGFzdF9maWJlciwgazEpXG4gICAgOiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGhhbmRsZXIsIFtlZmYsIGNvbnQsIGxhc3RfZmliZXIsIGsxXSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVwZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4biwgY2FtbF9jdXJyZW50X3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX3Jlc3VtZV9zdGFjaywgY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjXG4vL1JlcXVpcmVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9yZXBlcmZvcm1fZWZmZWN0KGVmZiwgY29udCwgbGFzdCwgazApIHtcbiAgaWYgKGNhbWxfY3VycmVudF9zdGFjay5lID09PSAwKSB7XG4gICAgdmFyIGV4biA9IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4bihlZmYpO1xuICAgIHZhciBzdGFjayA9IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KTtcbiAgICBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgbGFzdCwgazApO1xuICAgIHRocm93IGV4bjtcbiAgfVxuICAvLyBHZXQgY3VycmVudCBlZmZlY3QgaGFuZGxlclxuICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay5oWzNdO1xuICB2YXIgbGFzdF9maWJlciA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgbGFzdF9maWJlci5rID0gazA7XG4gIGxhc3QuZSA9IGxhc3RfZmliZXI7XG4gIGNvbnRbMl0gPSBsYXN0X2ZpYmVyO1xuICAvLyBNb3ZlIHRvIHBhcmVudCBmaWJlciBhbmQgZXhlY3V0ZSB0aGUgZWZmZWN0IGhhbmRsZXIgdGhlcmVcbiAgLy8gVGhlIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiBTdGRsaWIuRWZmZWN0LCBzbyB3ZSBrbm93IHRoYXQgdGhlIGFyaXR5IG1hdGNoZXNcbiAgdmFyIGsxID0gY2FtbF9wb3BfZmliZXIoKTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKVxuICAgID8gY2FtbF9nZXRfY3BzX2Z1bihoYW5kbGVyKShlZmYsIGNvbnQsIGxhc3RfZmliZXIsIGsxKVxuICAgIDogY2FtbF90cmFtcG9saW5lX3JldHVybihoYW5kbGVyLCBbZWZmLCBjb250LCBsYXN0X2ZpYmVyLCBrMV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG5mdW5jdGlvbiBjYW1sX2dldF9jcHNfZnVuKGYpIHtcbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2Nwc19mdW5cbi8vSWY6IGVmZmVjdHNcbi8vSWY6IGRvdWJsZXRyYW5zbGF0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfY3BzX2Z1bihmKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvIGdldCB0aGUgZWZmZWN0IGhhbmRsZXIuIElmIHRoZVxuICAvLyBlZmZlY3QgaGFuZGxlciBoYXMgbm8gQ1BTIGZ1bmN0aW9uLCB3ZSBrbm93IHRoYXQgd2UgY2FuIGRpcmVjdGx5XG4gIC8vIGNhbGwgdGhlIGRpcmVjdCB2ZXJzaW9uIGluc3RlYWQuXG4gIHJldHVybiBmLmNwcyA/IGYuY3BzIDogZjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfY2FsbF9nZW4sIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5fY3BzLCBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrX2NhbGwoZiwgeCkge1xuICB2YXIgYXJncyA9IFt4LCBjYW1sX3BvcF9maWJlcigpXTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKVxuICAgID8gY2FtbF9jYWxsX2dlbl9jcHMoZiwgYXJncylcbiAgICA6IGNhbWxfdHJhbXBvbGluZV9yZXR1cm4oZiwgYXJncywgMCk7XG59XG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrX2h2YWwoeCkge1xuICAvLyBDYWxsIFtodl0gaW4gdGhlIHBhcmVudCBmaWJlclxuICB2YXIgZiA9IGNhbWxfY3VycmVudF9zdGFjay5oWzFdO1xuICByZXR1cm4gY2FtbF9hbGxvY19zdGFja19jYWxsKGYsIHgpO1xufVxuZnVuY3Rpb24gY2FtbF9hbGxvY19zdGFja19oZXhuKGUpIHtcbiAgLy8gQ2FsbCBbaHhdIGluIHRoZSBwYXJlbnQgZmliZXJcbiAgdmFyIGYgPSBjYW1sX2N1cnJlbnRfc3RhY2suaFsyXTtcbiAgcmV0dXJuIGNhbWxfYWxsb2Nfc3RhY2tfY2FsbChmLCBlKTtcbn1cbmZ1bmN0aW9uIGNhbWxfYWxsb2Nfc3RhY2soaHYsIGh4LCBoZikge1xuICB2YXIgaGFuZGxlcnMgPSBbMCwgaHYsIGh4LCBoZl07XG4gIHJldHVybiB7XG4gICAgazogY2FtbF9hbGxvY19zdGFja19odmFsLFxuICAgIHg6IHsgaDogY2FtbF9hbGxvY19zdGFja19oZXhuLCB0OiAwIH0sXG4gICAgaDogaGFuZGxlcnMsXG4gICAgZTogMCxcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9JZjogIWVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrKF9odiwgX2h4LCBfaGYpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KSB7XG4gIHZhciBzdGFjayA9IGNvbnRbMV07XG4gIGNvbnRbMV0gPSAwO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGNcbi8vUmVxdWlyZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGMoXG4gIGNvbnQsXG4gIGh2YWwsXG4gIGhleG4sXG4gIGhlZmYsXG4pIHtcbiAgdmFyIHN0YWNrID0gY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjKGNvbnQpO1xuICBpZiAoc3RhY2sgPT09IDApIHJldHVybiBzdGFjaztcbiAgdmFyIGxhc3QgPSBjb250WzJdO1xuICBsYXN0LmhbMV0gPSBodmFsO1xuICBsYXN0LmhbMl0gPSBoZXhuO1xuICBsYXN0LmhbM10gPSBoZWZmO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2tcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrKCkge1xuICByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9uZXdcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9uZXcoX3VuaXQpIHtcbiAgcmV0dXJuIHsgY29uZGl0aW9uOiAxIH07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3dhaXRcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl93YWl0KF90LCBfbXV0ZXh0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3Rcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3QoX3QpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbFxuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbChfdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczoganNvb19lZmZlY3Rfbm90X3N1cHBvcnRlZFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy8hSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBqc29vX2VmZmVjdF9ub3Rfc3VwcG9ydGVkKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiRWZmZWN0IGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3VtZVxuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuX2NwcywgY2FtbF9jdXJyZW50X3N0YWNrLCBjYW1sX3dyYXBfZXhjZXB0aW9uLCBjYW1sX3Jlc3VtZV9zdGFja1xuLy9JZjogZWZmZWN0c1xuLy9JZjogZG91YmxldHJhbnNsYXRlXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9yZXN1bWUoZiwgYXJnLCBzdGFjaywgbGFzdCkge1xuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfY3VycmVudF9zdGFjayA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcbiAgICB2YXIgayA9IGNhbWxfcmVzdW1lX3N0YWNrKHN0YWNrLCBsYXN0LCBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfSk7XG4gICAgLyogTm90ZTogZiBpcyBub3QgYW4gb3JkaW5hcnkgZnVuY3Rpb24gYnV0IGEgKGRpcmVjdC1zdHlsZSwgQ1BTKSBjbG9zdXJlIHBhaXIgKi9cbiAgICB2YXIgcmVzID0geyBqb29fdHJhbXA6IGYsIGpvb19hcmdzOiBbYXJnLCBrXSwgam9vX2RpcmVjdDogMCB9O1xuICAgIGRvIHtcbiAgICAgIC8qIEF2b2lkcyB0cmFtcG9saW5pbmcgdG9vIG9mdGVuIHdoaWxlIHN0aWxsIGF2b2lkaW5nIHN0YWNrIG92ZXJmbG93LiBTZWVcbiAgICAgICAgIFtjYW1sX2NhbGxiYWNrXS4gKi9cbiAgICAgIGNhbWxfc3RhY2tfZGVwdGggPSA0MDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IHJlcy5qb29fZGlyZWN0XG4gICAgICAgICAgPyByZXMuam9vX3RyYW1wLmFwcGx5KG51bGwsIHJlcy5qb29fYXJncylcbiAgICAgICAgICA6IGNhbWxfY2FsbF9nZW5fY3BzKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gICAgICAgIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgICAgICAgcmVzID0ge1xuICAgICAgICAgIGpvb190cmFtcDogaGFuZGxlcixcbiAgICAgICAgICBqb29fYXJnczogW2NhbWxfd3JhcF9leGNlcHRpb24oZSldLFxuICAgICAgICAgIGpvb19kaXJlY3Q6IDEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSB3aGlsZSAocmVzPy5qb29fYXJncyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9jdXJyZW50X3N0YWNrID0gc2F2ZWRfY3VycmVudF9zdGFjaztcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Nwc19jbG9zdXJlXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfY3BzX2Nsb3N1cmUoZGlyZWN0X2YsIGNwc19mKSB7XG4gIGRpcmVjdF9mLmNwcyA9IGNwc19mO1xuICByZXR1cm4gZGlyZWN0X2Y7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXNzdW1lX25vX3BlcmZvcm1cbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbi8vSWY6IGVmZmVjdHNcbi8vSWY6ICFkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfYXNzdW1lX25vX3BlcmZvcm0oZikge1xuICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBbMF0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBBcnJheVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X3N1YiBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X3N1YihhLCBpLCBsZW4pIHtcbiAgdmFyIGEyID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICBhMlswXSA9IDA7XG4gIGZvciAodmFyIGkyID0gMSwgaTEgPSBpICsgMTsgaTIgPD0gbGVuOyBpMisrLCBpMSsrKSB7XG4gICAgYTJbaTJdID0gYVtpMV07XG4gIH1cbiAgcmV0dXJuIGEyO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfc3ViIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfc3ViXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X3N1YihhLCBpLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfc3ViKGEsIGksIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9zdWIgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9zdWJcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfc3ViKGEsIGksIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9zdWIoYSwgaSwgbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9hcHBlbmQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKSB7XG4gIHZhciBsMSA9IGExLmxlbmd0aCxcbiAgICBsMiA9IGEyLmxlbmd0aDtcbiAgdmFyIGwgPSBsMSArIGwyIC0gMTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGFbMF0gPSAwO1xuICB2YXIgaSA9IDEsXG4gICAgaiA9IDE7XG4gIGZvciAoOyBpIDwgbDE7IGkrKykgYVtpXSA9IGExW2ldO1xuICBmb3IgKDsgaSA8IGw7IGkrKywgaisrKSBhW2ldID0gYTJbal07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfYXBwZW5kIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYXBwZW5kXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2FwcGVuZChhMSwgYTIpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfYXBwZW5kKGExLCBhMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9hcHBlbmQgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9hcHBlbmRcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfYXBwZW5kKGExLCBhMikge1xuICByZXR1cm4gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9jb25jYXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9jb25jYXQgbXV0YWJsZVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9jb25jYXQgbXV0YWJsZVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfdW5pZm9ybV9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgaWYgKGkyIDw9IGkxKSB7XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gbGVuOyBqKyspIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGogPSBsZW47IGogPj0gMTsgai0tKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2JsaXRcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ibGl0XG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF91bmlmb3JtX2FycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pO1xufVxuXG4vLy8vLy8vLy8vLy8vIFBlcnZhc2l2ZVxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9BbGlhczogY2FtbF9hcnJheV9zZXRfZmxvYXRcbi8vQWxpYXM6IGNhbWxfZmxvYXRhcnJheV9zZXRcbi8vQWxpYXM6IGNhbWxfYXJyYXlfc2V0X2FkZHJcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfc2V0KGFycmF5LCBpbmRleCwgbmV3dmFsKSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBhcnJheVtpbmRleCArIDFdID0gbmV3dmFsO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9nZXQgbXV0YWJsZSAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL0FsaWFzOiBjYW1sX2FycmF5X2dldF9mbG9hdFxuLy9BbGlhczogY2FtbF9mbG9hdGFycmF5X2dldFxuLy9BbGlhczogY2FtbF9hcnJheV9nZXRfYWRkclxuZnVuY3Rpb24gY2FtbF9hcnJheV9nZXQoYXJyYXksIGluZGV4KSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJyYXlbaW5kZXggKyAxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9maWxsXG5mdW5jdGlvbiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnJheVtvZnMgKyBpICsgMV0gPSB2O1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfZmlsbFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2ZpbGxfdW5ib3hlZFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2ZpbGxfdW5ib3hlZChhcnJheSwgb2ZzLCBsZW4sIHYpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfZmlsbChhcnJheSwgb2ZzLCBsZW4sIHYpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfZmlsbFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF91bmlmb3JtX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jaGVja19ib3VuZCAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL0FsaWFzOiBjYW1sX2NoZWNrX2JvdW5kX2dlblxuLy9BbGlhczogY2FtbF9jaGVja19ib3VuZF9mbG9hdFxuZnVuY3Rpb24gY2FtbF9jaGVja19ib3VuZChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID4+PiAwID49IGFycmF5Lmxlbmd0aCAtIDEpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X21ha2UgY29uc3QgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9hcnJheV9tYWtlKGxlbiwgaW5pdCkge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDQpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gaW5pdDtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFrZV92ZWN0IGNvbnN0IChjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfbWFrZVxuZnVuY3Rpb24gY2FtbF9tYWtlX3ZlY3QobGVuLCBpbml0KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X21ha2UobGVuLCBpbml0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYWtlX2Zsb2F0X3ZlY3QgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9tYWtlX2Zsb2F0X3ZlY3QobGVuKSB7XG4gIGlmIChsZW4gPj4+IDAgPj0gKCgweDdmZmZmZmZmIC8gOCkgfCAwKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gKGxlbiArIDEpIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXSA9IDI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2NyZWF0ZV9mbG9hdCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9hcnJheV9jcmVhdGVfZmxvYXQobGVuKSB7XG4gIGlmIChsZW4gPj4+IDAgPj0gKCgweDdmZmZmZmZmIC8gOCkgfCAwKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gKGxlbiArIDEpIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXSA9IDI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiO1xufVxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2NyZWF0ZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlKGxlbikge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDgpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAyNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSAwO1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X21ha2UgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9tYWtlKGxlbiwgaW5pdCkge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDgpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAyNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSBpbml0O1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X21ha2VfdW5ib3hlZCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2Zsb2F0YXJyYXlfbWFrZVxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9tYWtlX3VuYm94ZWQobGVuLCBpbml0KSB7XG4gIHJldHVybiBjYW1sX2Zsb2F0YXJyYXlfbWFrZShsZW4sIGluaXQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfbWFrZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X21ha2Vcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfbWFrZShsZW4sIGluaXQpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfbWFrZShsZW4sIGluaXQpO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzXG4vL1ZlcnNpb246ID49IDVcbnZhciBjYW1sX2RvbWFpbl9kbHMgPSBbMF07XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfc2V0KGEpIHtcbiAgY2FtbF9kb21haW5fZGxzID0gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzX2NvbXBhcmVfYW5kX3NldFxuLy9SZXF1aXJlczogY2FtbF9kb21haW5fZGxzXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9kb21haW5fZGxzX2NvbXBhcmVfYW5kX3NldChvbGQsIG4pIHtcbiAgaWYgKGNhbWxfZG9tYWluX2RscyAhPT0gb2xkKSByZXR1cm4gMDtcbiAgY2FtbF9kb21haW5fZGxzID0gbjtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfZ2V0KF91bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9kbHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2xvYWRcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9hdG9taWNfbG9hZChyZWYpIHtcbiAgcmV0dXJuIHJlZlsxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfbG9hZF9maWVsZFxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2xvYWRfZmllbGQoYiwgaSkge1xuICByZXR1cm4gYltpICsgMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2Nhc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXMocmVmLCBvLCBuKSB7XG4gIGlmIChyZWZbMV0gPT09IG8pIHtcbiAgICByZWZbMV0gPSBuO1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19jYXNfZmllbGRcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXNfZmllbGQoYiwgaSwgbywgbikge1xuICBpZiAoYltpICsgMV0gPT09IG8pIHtcbiAgICBiW2kgKyAxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2ZldGNoX2FkZFxuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGQocmVmLCBpKSB7XG4gIHZhciBvbGQgPSByZWZbMV07XG4gIHJlZlsxXSArPSBpO1xuICByZXR1cm4gb2xkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19mZXRjaF9hZGRfZmllbGRcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGRfZmllbGQoYiwgaSwgbikge1xuICB2YXIgb2xkID0gYltpICsgMV07XG4gIGJbaSArIDFdICs9IG47XG4gIHJldHVybiBvbGQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2V4Y2hhbmdlKHJlZiwgdikge1xuICB2YXIgciA9IHJlZlsxXTtcbiAgcmVmWzFdID0gdjtcbiAgcmV0dXJuIHI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlX2ZpZWxkXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9hdG9taWNfZXhjaGFuZ2VfZmllbGQoYiwgaSwgdikge1xuICB2YXIgciA9IGJbaSArIDFdO1xuICBiW2kgKyAxXSA9IHY7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19tYWtlX2NvbnRlbmRlZFxuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX21ha2VfY29udGVuZGVkKGEpIHtcbiAgcmV0dXJuIFswLCBhXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXG4vL1ZlcnNpb246ID49IDUuMCwgPCA1LjJcbnZhciBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fID0gWzBdO1xuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuKF91bml0KSB7XG4gIHJldHVybiBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudChfdW5pdCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faW5kZXhcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1ZlcnNpb246ID49IDUuMDNcbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX2luZGV4KF91bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9pZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5faWRcbi8vVmVyc2lvbjogPj0gNVxudmFyIGNhbWxfZG9tYWluX2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjJcbnZhciBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4ID0gMTtcbmZ1bmN0aW9uIGNhbWxfZG9tYWluX3NwYXduKGYsIHRlcm1fc3luYykge1xuICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgWzBdKTtcbiAgY2FtbF9kb21haW5faWQgPSBvbGQ7XG4gIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHRlcm1fc3luY1syXSk7XG4gIC8vVE9ETzogZml4IGV4biBjYXNlXG4gIHRlcm1fc3luY1sxXSA9IFswLCBbMCwgcmVzXV07XG4gIHJldHVybiBpZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjAsIDwgNS4yXG52YXIgY2FtbF9kb21haW5fbGF0ZXN0X2lkeCA9IDE7XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9zcGF3bihmLCBtdXRleCkge1xuICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgdmFyIF9yZXMgPSBjYW1sX2NhbGxiYWNrKGYsIFswXSk7XG4gIGNhbWxfZG9tYWluX2lkID0gb2xkO1xuICBjYW1sX21sX211dGV4X3VubG9jayhtdXRleCk7XG4gIHJldHVybiBpZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faWRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5faWQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfZG9tYWluX2lkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4KF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfaW50IGNvbnN0IChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZywgY2FtbF9zdHJfcmVwZWF0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0FsaWFzOiBjYW1sX2ludDMyX2Zvcm1hdFxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfZm9ybWF0XG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9pbnQoZm10LCBpKSB7XG4gIGlmIChjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGZtdCkgPT09IFwiJWRcIilcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiICsgaSk7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgaWYgKGYuc2lnbmVkY29udikge1xuICAgICAgZi5zaWduID0gLTE7XG4gICAgICBpID0gLWk7XG4gICAgfSBlbHNlIGkgPj4+PSAwO1xuICB9XG4gIHZhciBzID0gaS50b1N0cmluZyhmLmJhc2UpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICAgIHZhciBuID0gZi5wcmVjIC0gcy5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBzID0gY2FtbF9zdHJfcmVwZWF0KG4sIFwiMFwiKSArIHM7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2Uocykge1xuICB2YXIgaSA9IDAsXG4gICAgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpLFxuICAgIGJhc2UgPSAxMCxcbiAgICBzaWduID0gMSxcbiAgICBzaWduZWRuZXNzID0gMTtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBzd2l0Y2ggKGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkpIHtcbiAgICAgIGNhc2UgNDU6XG4gICAgICAgIGkrKztcbiAgICAgICAgc2lnbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDM6XG4gICAgICAgIGkrKztcbiAgICAgICAgc2lnbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoaSArIDEgPCBsZW4gJiYgY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA9PT0gNDgpXG4gICAgc3dpdGNoIChjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKSkge1xuICAgICAgY2FzZSAxMjA6XG4gICAgICBjYXNlIDg4OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgYmFzZSA9IDE2O1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTE6XG4gICAgICBjYXNlIDc5OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgYmFzZSA9IDg7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk4OlxuICAgICAgY2FzZSA2NjpcbiAgICAgICAgc2lnbmVkbmVzcyA9IDA7XG4gICAgICAgIGJhc2UgPSAyO1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTc6XG4gICAgICBjYXNlIDg1OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBbaSwgc2lnbiwgYmFzZSwgc2lnbmVkbmVzc107XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZGlnaXRcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZGlnaXQoYykge1xuICBpZiAoYyA+PSA0OCAmJiBjIDw9IDU3KSByZXR1cm4gYyAtIDQ4O1xuICBpZiAoYyA+PSA2NSAmJiBjIDw9IDkwKSByZXR1cm4gYyAtIDU1O1xuICBpZiAoYyA+PSA5NyAmJiBjIDw9IDEyMikgcmV0dXJuIGMgLSA4NztcbiAgcmV0dXJuIC0xO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludF9vZl9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfcGFyc2VfZGlnaXQsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IGNhbWxfaW50MzJfb2Zfc3RyaW5nXG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaW50X29mX3N0cmluZyhzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlKHMpO1xuICB2YXIgaSA9IHJbMF0sXG4gICAgc2lnbiA9IHJbMV0sXG4gICAgYmFzZSA9IHJbMl0sXG4gICAgc2lnbmVkbmVzcyA9IHJbM107XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIHZhciB0aHJlc2hvbGQgPSAtMSA+Pj4gMDtcbiAgdmFyIGMgPSBpIDwgbGVuID8gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA6IDA7XG4gIHZhciBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBkO1xuICBmb3IgKGkrKzsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gICAgaWYgKGMgPT09IDk1KSBjb250aW51ZTtcbiAgICBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBicmVhaztcbiAgICByZXMgPSBiYXNlICogcmVzICsgZDtcbiAgICBpZiAocmVzID4gdGhyZXNob2xkKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPT0gbGVuKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgLy8gRm9yIGJhc2UgZGlmZmVyZW50IGZyb20gMTAsIHdlIGV4cGVjdCBhbiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbixcbiAgLy8gaGVuY2UgYW55IHZhbHVlIG9mICdyZXMnIChsZXNzIHRoYW4gJ3RocmVzaG9sZCcpIGlzIGFjY2VwdGFibGUuXG4gIC8vIEJ1dCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIHJlc3VsdCBiYWNrIHRvIGEgc2lnbmVkIGludGVnZXIuXG4gIHJlcyA9IHNpZ24gKiByZXM7XG4gIGlmIChzaWduZWRuZXNzICYmIChyZXMgfCAwKSAhPT0gcmVzKVxuICAgIC8qIFNpZ25lZCByZXByZXNlbnRhdGlvbiBleHBlY3RlZCwgYWxsb3cgLTJeKG5iaXRzLTEpIHRvIDJeKG5iaXRzLTEpIC0gMSAqL1xuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICByZXR1cm4gcmVzIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tdWwgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50MzJfbXVsXG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9tdWxcbi8vQWxpYXM6ICVpbnRfbXVsXG5mdW5jdGlvbiBjYW1sX211bChhLCBiKSB7XG4gIHJldHVybiBNYXRoLmltdWwoYSwgYik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGl2XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL0FsaWFzOiBjYW1sX2ludDMyX2RpdlxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfZGl2XG4vL0FsaWFzOiAlaW50X2RpdlxuZnVuY3Rpb24gY2FtbF9kaXYoeCwgeSkge1xuICBpZiAoeSA9PT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSgpO1xuICByZXR1cm4gKHggLyB5KSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbW9kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL0FsaWFzOiBjYW1sX2ludDMyX21vZFxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfbW9kXG4vL0FsaWFzOiAlaW50X21vZFxuZnVuY3Rpb24gY2FtbF9tb2QoeCwgeSkge1xuICBpZiAoeSA9PT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSgpO1xuICByZXR1cm4geCAlIHk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnN3YXAxNiBjb25zdFxuZnVuY3Rpb24gY2FtbF9ic3dhcDE2KHgpIHtcbiAgcmV0dXJuICgoeCAmIDB4MDBmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2Jzd2FwIGNvbnN0XG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9ic3dhcFxuZnVuY3Rpb24gY2FtbF9pbnQzMl9ic3dhcCh4KSB7XG4gIHJldHVybiAoXG4gICAgKCh4ICYgMHgwMDAwMDBmZikgPDwgMjQpIHxcbiAgICAoKHggJiAweDAwMDBmZjAwKSA8PCA4KSB8XG4gICAgKCh4ICYgMHgwMGZmMDAwMCkgPj4+IDgpIHxcbiAgICAoKHggJiAweGZmMDAwMDAwKSA+Pj4gMjQpXG4gICk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Jzd2FwIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ludDY0X2Jzd2FwKHgpIHtcbiAgdmFyIHkgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHgpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhbeVs3XSwgeVs2XSwgeVs1XSwgeVs0XSwgeVszXSwgeVsyXSwgeVsxXSwgeVswXV0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBIYXNodGJsXG5cbi8vZnVuY3Rpb24gUk9UTDMyKHgsbikgeyByZXR1cm4gKCh4IDw8IG4pIHwgKHggPj4+ICgzMi1uKSkpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ludFxuLy9SZXF1aXJlczogY2FtbF9tdWxcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfaW50KGgsIGQpIHtcbiAgZCA9IGNhbWxfbXVsKGQsIDB4Y2M5ZTJkNTEgfCAwKTtcbiAgZCA9IChkIDw8IDE1KSB8IChkID4+PiAoMzIgLSAxNSkpOyAvLyBST1RMMzIoZCwgMTUpO1xuICBkID0gY2FtbF9tdWwoZCwgMHgxYjg3MzU5Myk7XG4gIGggXj0gZDtcbiAgaCA9IChoIDw8IDEzKSB8IChoID4+PiAoMzIgLSAxMykpOyAvL1JPVEwzMihoLCAxMyk7XG4gIHJldHVybiAoKChoICsgKGggPDwgMikpIHwgMCkgKyAoMHhlNjU0NmI2NCB8IDApKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfbXVsXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpIHtcbiAgaCBePSBoID4+PiAxNjtcbiAgaCA9IGNhbWxfbXVsKGgsIDB4ODVlYmNhNmIgfCAwKTtcbiAgaCBePSBoID4+PiAxMztcbiAgaCA9IGNhbWxfbXVsKGgsIDB4YzJiMmFlMzUgfCAwKTtcbiAgaCBePSBoID4+PiAxNjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbG8zMiwgY2FtbF9pbnQ2NF9oaTMyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2Zsb2F0KGhhc2gsIHYwKSB7XG4gIHZhciBpNjQgPSBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQodjApO1xuICB2YXIgbCA9IGNhbWxfaW50NjRfbG8zMihpNjQpO1xuICB2YXIgaCA9IGNhbWxfaW50NjRfaGkzMihpNjQpO1xuICAvKiBOb3JtYWxpemUgTmFOcyAqL1xuICBpZiAoKGggJiAweDdmZjAwMDAwKSA9PT0gMHg3ZmYwMDAwMCAmJiAobCB8IChoICYgMHhmZmZmZikpICE9PSAwKSB7XG4gICAgaCA9IDB4N2ZmMDAwMDA7XG4gICAgbCA9IDB4MDAwMDAwMDE7XG4gIH0gZWxzZSBpZiAoaCA9PT0gKDB4ODAwMDAwMDAgfCAwKSAmJiBsID09PSAwKSB7XG4gICAgLyogTm9ybWFsaXplIC0wIGludG8gKzAgKi9cbiAgICAvLyBUaGlzIGNvZGUgcGF0aCBpcyBub3QgdXNlZCBieSBjYW1sX2hhc2ggYmVjYXVzZSAwIGFuZCAtMCBsb29rXG4gICAgLy8gbGlrZSBpbnRlZ2Vyc1xuICAgIGggPSAwO1xuICB9XG4gIGhhc2ggPSBjYW1sX2hhc2hfbWl4X2ludChoYXNoLCBsKTtcbiAgaGFzaCA9IGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGgpO1xuICByZXR1cm4gaGFzaDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfaW50NjRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2xvMzIsIGNhbWxfaW50NjRfaGkzMlxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9pbnQ2NChoLCB2KSB7XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBjYW1sX2ludDY0X2xvMzIodikpO1xuICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgY2FtbF9pbnQ2NF9oaTMyKHYpKTtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfanNieXRlcyhoLCBzKSB7XG4gIHZhciBsZW4gPSBzLmxlbmd0aCxcbiAgICBpLFxuICAgIHc7XG4gIGZvciAoaSA9IDA7IGkgKyA0IDw9IGxlbjsgaSArPSA0KSB7XG4gICAgdyA9XG4gICAgICBzLmNoYXJDb2RlQXQoaSkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSArIDMpIDw8IDI0KTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgdyA9IDA7XG4gIHN3aXRjaCAobGVuICYgMykge1xuICAgIGNhc2UgMzpcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgIHcgPSBzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDE2O1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgY2FzZSAyOlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgdyB8PSBzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDg7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDE6XG4gICAgICB3IHw9IHMuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgfVxuICBoIF49IGxlbjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9ieXRlc19hcnIoaCwgcykge1xuICB2YXIgbGVuID0gcy5sZW5ndGgsXG4gICAgaSxcbiAgICB3O1xuICBmb3IgKGkgPSAwOyBpICsgNCA8PSBsZW47IGkgKz0gNCkge1xuICAgIHcgPSBzW2ldIHwgKHNbaSArIDFdIDw8IDgpIHwgKHNbaSArIDJdIDw8IDE2KSB8IChzW2kgKyAzXSA8PCAyNCk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICB9XG4gIHcgPSAwO1xuICBzd2l0Y2ggKGxlbiAmIDMpIHtcbiAgICBjYXNlIDM6XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICB3ID0gc1tpICsgMl0gPDwgMTY7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDI6XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICB3IHw9IHNbaSArIDFdIDw8IDg7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDE6XG4gICAgICB3IHw9IHNbaV07XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgaCBePSBsZW47XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdikge1xuICB2YXIgY29udGVudCA9IGNhbWxfbWxfYnl0ZXNfY29udGVudCh2KTtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNvbnRlbnQpO1xuICAvKiBBUlJBWSAqLyBlbHNlIHJldHVybiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdikge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmcodikpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2ggbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBjYW1sX2hhc2hfbWl4X2ZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0LCBjYW1sX2hhc2hfbWl4X3N0cmluZywgY2FtbF9oYXNoX21peF9ieXRlcywgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuZnVuY3Rpb24gY2FtbF9oYXNoKGNvdW50LCBsaW1pdCwgc2VlZCwgb2JqKSB7XG4gIHZhciBxdWV1ZSwgcmQsIHdyLCBzeiwgbnVtLCBoLCB2LCBpLCBsZW47XG4gIHN6ID0gbGltaXQ7XG4gIGlmIChzeiA8IDAgfHwgc3ogPiAyNTYpIHN6ID0gMjU2O1xuICBudW0gPSBjb3VudDtcbiAgaCA9IHNlZWQ7XG4gIHF1ZXVlID0gW29ial07XG4gIHJkID0gMDtcbiAgd3IgPSAxO1xuICB3aGlsZSAocmQgPCB3ciAmJiBudW0gPiAwKSB7XG4gICAgdiA9IHF1ZXVlW3JkKytdO1xuICAgIGlmICh2Py5jYW1sX2N1c3RvbSkge1xuICAgICAgaWYgKFxuICAgICAgICBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0gJiZcbiAgICAgICAgY2FtbF9jdXN0b21fb3BzW3YuY2FtbF9jdXN0b21dLmhhc2hcbiAgICAgICkge1xuICAgICAgICB2YXIgaGggPSBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCh2KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGhoKTtcbiAgICAgICAgbnVtLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHYpICYmIHZbMF0gPT09ICh2WzBdIHwgMCkpIHtcbiAgICAgIHN3aXRjaCAodlswXSkge1xuICAgICAgICBjYXNlIDI0ODpcbiAgICAgICAgICAvLyBPYmplY3RcbiAgICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdlsyXSk7XG4gICAgICAgICAgbnVtLS07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUwOlxuICAgICAgICAgIC8vIEZvcndhcmRcbiAgICAgICAgICBxdWV1ZVstLXJkXSA9IHZbMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh2WzBdKSkge1xuICAgICAgICAgICAgLyogQWxsIGNvbnRpbnVhdGlvbnMgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZSxcbiAgICAgICAgICAgICBzaW5jZSB3ZSBoYXZlIG5vIGlkZWEgaG93IHRvIGRpc3Rpbmd1aXNoIHRoZW0uICovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhZyA9ICgodi5sZW5ndGggLSAxKSA8PCAxMCkgfCB2WzBdO1xuICAgICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB0YWcpO1xuICAgICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IHYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh3ciA+PSBzeikgYnJlYWs7XG4gICAgICAgICAgICBxdWV1ZVt3cisrXSA9IHZbaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdik7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHYpKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdik7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIHYpO1xuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh2ID09PSAodiB8IDApKSB7XG4gICAgICAvLyBJbnRlZ2VyXG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdiArIHYgKyAxKTtcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLCB2KTtcbiAgICAgIG51bS0tO1xuICAgIH1cbiAgfVxuICBoID0gY2FtbF9oYXNoX21peF9maW5hbChoKTtcbiAgcmV0dXJuIGggJiAweDNmZmZmZmZmO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsLCBjYW1sX2hhc2hfbWl4X3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2hhc2goaCwgdikge1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsIHYpO1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfZmluYWwoaCk7XG4gIHJldHVybiBoICYgMHgzZmZmZmZmZjtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWxfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSkge1xuICBpZiAodHlwZW9mIGEgPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIDEwMDA7IC8vIGludF90YWcgKHdlIHVzZSBpdCBmb3IgYWxsIG51bWJlcnMpXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMoYSkpXG4gICAgcmV0dXJuIDI1MjsgLy8gc3RyaW5nX3RhZ1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyhhKSlcbiAgICByZXR1cm4gMTI1MjsgLy8gb2NhbWwgc3RyaW5nIChpZiBkaWZmZXJlbnQgZnJvbSBieXRlcylcbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBhWzBdID09PSBhWzBdID4+PiAwICYmIGFbMF0gPD0gMjU1KSB7XG4gICAgLy8gTG9vayBsaWtlIGFuIG9jYW1sIGJsb2NrXG4gICAgdmFyIHRhZyA9IGFbMF0gfCAwO1xuICAgIC8vIGlnbm9yZSBkb3VibGVfYXJyYXlfdGFnIGJlY2F1c2Ugd2UgY2Fubm90IGFjY3VyYXRlbHkgc2V0XG4gICAgLy8gdGhpcyB0YWcgd2hlbiB3ZSBjcmVhdGUgYW4gYXJyYXkgb2YgZmxvYXQuXG4gICAgcmV0dXJuIHRhZyA9PT0gMjU0ID8gMCA6IHRhZztcbiAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgU3RyaW5nKVxuICAgIHJldHVybiAxMjUyMDsgLy8gamF2YXNjcmlwdCBzdHJpbmcsIGxpa2Ugc3RyaW5nX3RhZyAoMjUyKVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gMTI1MjA7IC8vIGphdmFzY3JpcHQgc3RyaW5nLCBsaWtlIHN0cmluZ190YWcgKDI1MilcbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE51bWJlcilcbiAgICByZXR1cm4gMTAwMDsgLy8gaW50X3RhZyAod2UgdXNlIGl0IGZvciBhbGwgbnVtYmVycylcbiAgZWxzZSBpZiAoYT8uY2FtbF9jdXN0b20pXG4gICAgcmV0dXJuIDEyNTU7IC8vIGxpa2UgY3VzdG9tX3RhZyAoMjU1KVxuICBlbHNlIGlmIChhPy5jb21wYXJlKVxuICAgIHJldHVybiAxMjU2OyAvLyBsaWtlIGN1c3RvbV90YWcgKDI1NSlcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gMTI0NzsgLy8gbGlrZSBjbG9zdXJlX3RhZyAoMjQ3KVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIDEyNTE7XG4gIHJldHVybiAxMDAxOyAvL291dF9vZl9oZWFwX3RhZ1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX29wc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGEpIHtcbiAgcmV0dXJuIChcbiAgICBjYW1sX2N1c3RvbV9vcHNbYS5jYW1sX2N1c3RvbV0gJiYgY2FtbF9jdXN0b21fb3BzW2EuY2FtbF9jdXN0b21dLmNvbXBhcmVcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShudW0sIGN1c3RvbSwgc3dhcCwgdG90YWwpIHtcbiAgdmFyIGNvbXAgPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oY3VzdG9tKTtcbiAgaWYgKGNvbXApIHtcbiAgICB2YXIgeCA9IHN3YXAgPiAwID8gY29tcChjdXN0b20sIG51bSwgdG90YWwpIDogY29tcChudW0sIGN1c3RvbSwgdG90YWwpO1xuICAgIGlmICh0b3RhbCAmJiBOdW1iZXIuaXNOYU4oeCkpIHJldHVybiBzd2FwOyAvLyB0b3RhbCAmJiBuYW5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKCt4KSkgcmV0dXJuICt4OyAvLyBuYW5cbiAgICBpZiAoKHggfCAwKSAhPT0gMCkgcmV0dXJuIHggfCAwOyAvLyAhbmFuXG4gIH1cbiAgcmV0dXJuIHN3YXA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWwgKGNvbnN0LCBjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ludF9jb21wYXJlLCBjYW1sX3N0cmluZ19jb21wYXJlLCBjYW1sX2J5dGVzX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tLCBjYW1sX2NvbXBhcmVfdmFsX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWwoYSwgYiwgdG90YWwpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIGZvciAoOzspIHtcbiAgICBpZiAoISh0b3RhbCAmJiBhID09PSBiKSkge1xuICAgICAgdmFyIHRhZ19hID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSk7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZiAodGFnX2EgPT09IDI1MCkge1xuICAgICAgICBhID0gYVsxXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdfYiA9IGNhbWxfY29tcGFyZV92YWxfdGFnKGIpO1xuICAgICAgLy8gZm9yd2FyZF90YWcgP1xuICAgICAgaWYgKHRhZ19iID09PSAyNTApIHtcbiAgICAgICAgYiA9IGJbMV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWdzIGFyZSBkaWZmZXJlbnRcbiAgICAgIGlmICh0YWdfYSAhPT0gdGFnX2IpIHtcbiAgICAgICAgaWYgKHRhZ19hID09PSAxMDAwKSB7XG4gICAgICAgICAgaWYgKHRhZ19iID09PSAxMjU1KSB7XG4gICAgICAgICAgICAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShhLCBiLCAtMSwgdG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ19iID09PSAxMDAwKSB7XG4gICAgICAgICAgaWYgKHRhZ19hID09PSAxMjU1KSB7XG4gICAgICAgICAgICAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShiLCBhLCAxLCB0b3RhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWdfYSA8IHRhZ19iID8gLTEgOiAxO1xuICAgICAgfVxuICAgICAgLy8gdGFnX2EgPSB0YWdfYlxuICAgICAgc3dpdGNoICh0YWdfYSkge1xuICAgICAgICAvLyAyNDY6IExhenlfdGFnIGhhbmRsZWQgYmVsbG93XG4gICAgICAgIGNhc2UgMjQ3OiAvLyBDbG9zdXJlX3RhZ1xuICAgICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI0ODogLy8gT2JqZWN0XG4gICAgICAgICAgdmFyIHggPSBjYW1sX2ludF9jb21wYXJlKGFbMl0sIGJbMl0pIHwgMDtcbiAgICAgICAgICBpZiAoeCAhPT0gMCkgcmV0dXJuIHg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ5OiAvLyBJbmZpeFxuICAgICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1MDogLy8gRm9yd2FyZCB0YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGFib3ZlXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBGb3J3YXJkX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUxOiAvL0Fic3RyYWN0XG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGFic3RyYWN0IHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1MjogLy8gT0NhbWwgYnl0ZXNcbiAgICAgICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICAgICAgdmFyIHggPSBjYW1sX2J5dGVzX2NvbXBhcmUoYSwgYikgfCAwO1xuICAgICAgICAgICAgaWYgKHggIT09IDApIHJldHVybiB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTM6IC8vIERvdWJsZV90YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBEb3VibGVfdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheV90YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGluIGNhbWxfY29tcGFyZV92YWxfdGFnXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFxuICAgICAgICAgICAgXCJlcXVhbDogZ290IERvdWJsZV9hcnJheV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTU6IC8vIEN1c3RvbV90YWdcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IEN1c3RvbV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyNDc6IC8vIEZ1bmN0aW9uXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjU1OiAvLyBDdXN0b21cbiAgICAgICAgICB2YXIgY29tcCA9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShhKTtcbiAgICAgICAgICBpZiAoY29tcCAhPT0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jYW1sX2N1c3RvbSA8IGIuY2FtbF9jdXN0b20gPyAtMSA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY29tcCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogYWJzdHJhY3QgdmFsdWVcIik7XG4gICAgICAgICAgdmFyIHggPSBjb21wKGEsIGIsIHRvdGFsKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHgpKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBVTk9SREVSRURcbiAgICAgICAgICAgIHJldHVybiB0b3RhbCA/IC0xIDogeDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggIT09ICh4IHwgMCkpIHtcbiAgICAgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoeCAhPT0gMCkgcmV0dXJuIHggfCAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyNTY6IC8vIGNvbXBhcmUgZnVuY3Rpb25cbiAgICAgICAgICB2YXIgeCA9IGEuY29tcGFyZShiLCB0b3RhbCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTih4KSkge1xuICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgVU5PUkRFUkVEXG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAtMSA6IHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh4ICE9PSAoeCB8IDApKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggIT09IDApIHJldHVybiB4IHwgMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDAwOiAvLyBOdW1iZXJcbiAgICAgICAgICBhID0gK2E7XG4gICAgICAgICAgYiA9ICtiO1xuICAgICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOdW1iZXIuTmFOO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYSkpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYikpIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwMTogLy8gVGhlIHJlc3RcbiAgICAgICAgICAvLyBIZXJlIHdlIGNhbiBiZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAgICAgICAgIC8vIDEuIEphdmFTY3JpcHQgcHJpbWl0aXZlIHR5cGVzXG4gICAgICAgICAgLy8gMi4gSmF2YVNjcmlwdCBvYmplY3QgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgICAvLyAzLiBKYXZhU2NyaXB0IG9iamVjdCB0aGFuIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHByaW1pdGl2ZSB0eXBlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gKDMpIHdpbGwgcmFpc2UgYSBbVHlwZUVycm9yXVxuICAgICAgICAgIC8vICgyKSB3aWxsIGNvZXJjZSB0byBwcmltaXRpdmUgdHlwZXMgdXNpbmcgW3ZhbHVlT2ZdIG9yIFt0b1N0cmluZ11cbiAgICAgICAgICAvLyAoMikgYW5kICgzKSwgYWZ0ZXIgZXZlbnR1YWwgY29lcmNpb25cbiAgICAgICAgICAvLyAtIGlmIGEgYW5kIGIgYXJlIHN0cmluZ3MsIGFwcGx5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvblxuICAgICAgICAgIC8vIC0gaWYgYSBvciBiIGFyZSBub3Qgc3RyaW5ncywgY29udmVydCBhIGFuZCBiIHRvIG51bWJlclxuICAgICAgICAgIC8vICAgYW5kIGFwcGx5IHN0YW5kYXJkIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAxIDogTnVtYmVyLk5hTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MTogLy8gSmF2YVNjcmlwdCBTeW1ib2wsIG5vIG9yZGVyaW5nLlxuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAxIDogTnVtYmVyLk5hTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MjogLy8gb2NhbWwgc3RyaW5nc1xuICAgICAgICAgIHZhciBhID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhhKTtcbiAgICAgICAgICB2YXIgYiA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoYik7XG4gICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MjA6IC8vIGphdmFzY3JpcHQgc3RyaW5nc1xuICAgICAgICAgIHZhciBhID0gYS50b1N0cmluZygpO1xuICAgICAgICAgIHZhciBiID0gYi50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBMYXp5X3RhZyBvciBCbG9jayB3aXRoIG90aGVyIHRhZ1xuICAgICAgICAgIGlmIChjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodGFnX2EpKSB7XG4gICAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBjb250aW51YXRpb24gdmFsdWVcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGEubGVuZ3RoIDwgYi5sZW5ndGggPyAtMSA6IDE7XG4gICAgICAgICAgaWYgKGEubGVuZ3RoID4gMSkgc3RhY2sucHVzaChhLCBiLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgdmFyIGkgPSBzdGFjay5wb3AoKTtcbiAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmIChpICsgMSA8IGEubGVuZ3RoKSBzdGFjay5wdXNoKGEsIGIsIGkgKyAxKTtcbiAgICBhID0gYVtpXTtcbiAgICBiID0gYltpXTtcbiAgfVxufVxuXG4vLyBNYXkgcmFpc2Vcbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9jb21wYXJlKGEsIGIpIHtcbiAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWwoYSwgYiwgdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50X2NvbXBhcmUgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50MzJfY29tcGFyZVxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfY29tcGFyZVxuZnVuY3Rpb24gY2FtbF9pbnRfY29tcGFyZShhLCBiKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIHJldHVybiAxO1xufVxuXG4vLyBNYXkgcmFpc2Vcbi8vUHJvdmlkZXM6IGNhbWxfZXF1YWwgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA9PT0gMCk7XG59XG5cbi8vIE1heSByYWlzZVxuLy9Qcm92aWRlczogY2FtbF9ub3RlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ub3RlcXVhbCh4LCB5KSB7XG4gIHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCwgeSwgZmFsc2UpICE9PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ncmVhdGVyZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA+PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJ0aGFuIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2dyZWF0ZXJ0aGFuKHgsIHkpIHtcbiAgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LCB5LCBmYWxzZSkgPiAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3NlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9sZXNzZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA8PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3N0aGFuIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2xlc3N0aGFuKHgsIHkpIHtcbiAgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LCB5LCBmYWxzZSkgPCAwKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4XG4vL1ZlcnNpb246ID49IDUuMVxudmFyIGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4ID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3JlZ2lzdGVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9ldmVudF9pbmRleFxuLy9WZXJzaW9uOiA+PSA1LjFcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZWdpc3RlcihldmVudF9uYW1lLCBldmVudF90YWcsIGV2ZW50X3R5cGUpIHtcbiAgY2FtbF9jdXN0b21fZXZlbnRfaW5kZXggKz0gMTtcbiAgcmV0dXJuIFswLCBjYW1sX2N1c3RvbV9ldmVudF9pbmRleCwgZXZlbnRfbmFtZSwgZXZlbnRfdHlwZSwgZXZlbnRfdGFnXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlXG4vL1ZlcnNpb246ID49IDUuMVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlKF9ldmVudCwgX2V2ZW50X2NvbnRlbnQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZXNvbHZlXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3Jlc29sdmUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3J1bnRpbWVfZXZlbnRzX3N0YXJ0XG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfc3RhcnRcbi8vVmVyc2lvbjogPj0gNS4wLCA8IDUuMlxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV9ldmVudHNfcGF1c2Vcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19wYXVzZVxuLy9WZXJzaW9uOiA+PSA1LjAsIDwgNS4yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX2V2ZW50c19hcmVfYWN0aXZlXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19hcmVfYWN0aXZlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19yZXN1bWVcbi8vVmVyc2lvbjogPj01LjAsIDwgNS4yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3Jlc3VtZSgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV9ldmVudHNfcmVzdW1lXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19yZXN1bWUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3Jcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3IoX3RhcmdldCkge1xuICByZXR1cm4ge307XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfZnJlZV9jdXJzb3Jcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2ZyZWVfY3Vyc29yKF9jdXJzb3IpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfcmVhZF9wb2xsXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19yZWFkX3BvbGwoX2N1cnNvciwgX2NhbGxiYWNrcywgX251bSkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX2V2ZW50c19wYXRoIGNvbnN0XG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19wYXRoKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy9Qcm92aWRlczogenN0ZF9kZWNvbXByZXNzXG4vL1ZlcnNpb246ID49IDUuMVxudmFyIHpzdGRfZGVjb21wcmVzcyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIGFsaWFzZXMgZm9yIHNob3J0ZXIgY29tcHJlc3NlZCBjb2RlIChtb3N0IG1pbmlmZXJzIGRvbid0IGRvIHRoaXMpXG4gIHZhciBhYiA9IEFycmF5QnVmZmVyLFxuICAgIHU4ID0gVWludDhBcnJheSxcbiAgICB1MTYgPSBVaW50MTZBcnJheSxcbiAgICBpMTYgPSBJbnQxNkFycmF5LFxuICAgIGkzMiA9IEludDMyQXJyYXk7XG4gIHZhciBzbGMgPSBmdW5jdGlvbiAodiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuc2xpY2UpIHJldHVybiB1OC5wcm90b3R5cGUuc2xpY2UuY2FsbCh2LCBzLCBlKTtcbiAgICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKSBzID0gMDtcbiAgICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aCkgZSA9IHYubGVuZ3RoO1xuICAgIHZhciBuID0gbmV3IHU4KGUgLSBzKTtcbiAgICBuLnNldCh2LnN1YmFycmF5KHMsIGUpKTtcbiAgICByZXR1cm4gbjtcbiAgfTtcbiAgdmFyIGZpbGwgPSBmdW5jdGlvbiAodiwgbiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuZmlsbCkgcmV0dXJuIHU4LnByb3RvdHlwZS5maWxsLmNhbGwodiwgbiwgcywgZSk7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMCkgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpIGUgPSB2Lmxlbmd0aDtcbiAgICBmb3IgKDsgcyA8IGU7ICsrcykgdltzXSA9IG47XG4gICAgcmV0dXJuIHY7XG4gIH07XG4gIHZhciBjcHcgPSBmdW5jdGlvbiAodiwgdCwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuY29weVdpdGhpbilcbiAgICAgIHJldHVybiB1OC5wcm90b3R5cGUuY29weVdpdGhpbi5jYWxsKHYsIHQsIHMsIGUpO1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKSBlID0gdi5sZW5ndGg7XG4gICAgd2hpbGUgKHMgPCBlKSB7XG4gICAgICB2W3QrK10gPSB2W3MrK107XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ29kZXMgZm9yIGVycm9ycyBnZW5lcmF0ZWQgd2l0aGluIHRoaXMgbGlicmFyeVxuICAgKi9cbiAgLy8gZXJyb3IgY29kZXNcbiAgdmFyIGVjID0gW1xuICAgIFwiaW52YWxpZCB6c3RkIGRhdGFcIixcbiAgICBcIndpbmRvdyBzaXplIHRvbyBsYXJnZSAoPjIwNDZNQilcIixcbiAgICBcImludmFsaWQgYmxvY2sgdHlwZVwiLFxuICAgIFwiRlNFIGFjY3VyYWN5IHRvbyBoaWdoXCIsXG4gICAgXCJtYXRjaCBkaXN0YW5jZSB0b28gZmFyIGJhY2tcIixcbiAgICBcInVuZXhwZWN0ZWQgRU9GXCIsXG4gIF07XG4gIHZhciBlcnIgPSBmdW5jdGlvbiAoaW5kLCBtc2csIG50KSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobXNnIHx8IGVjW2luZF0pO1xuICAgIGUuY29kZSA9IGluZDtcbiAgICBpZiAoIW50KSB0aHJvdyBlO1xuICAgIHJldHVybiBlO1xuICB9O1xuICB2YXIgcmIgPSBmdW5jdGlvbiAoZCwgYiwgbikge1xuICAgIHZhciBpID0gMCxcbiAgICAgIG8gPSAwO1xuICAgIGZvciAoOyBpIDwgbjsgKytpKSBvIHw9IGRbYisrXSA8PCAoaSA8PCAzKTtcbiAgICByZXR1cm4gbztcbiAgfTtcbiAgdmFyIGI0ID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICByZXR1cm4gKGRbYl0gfCAoZFtiICsgMV0gPDwgOCkgfCAoZFtiICsgMl0gPDwgMTYpIHwgKGRbYiArIDNdIDw8IDI0KSkgPj4+IDA7XG4gIH07XG4gIC8vIHJlYWQgWnN0YW5kYXJkIGZyYW1lIGhlYWRlclxuICB2YXIgcnpmaCA9IGZ1bmN0aW9uIChkYXQsIHcpIHtcbiAgICB2YXIgbjMgPSBkYXRbMF0gfCAoZGF0WzFdIDw8IDgpIHwgKGRhdFsyXSA8PCAxNik7XG4gICAgaWYgKG4zID09PSAweDJmYjUyOCAmJiBkYXRbM10gPT09IDI1Mykge1xuICAgICAgLy8gWnN0YW5kYXJkXG4gICAgICB2YXIgZmxnID0gZGF0WzRdO1xuICAgICAgLy8gICAgc2luZ2xlIHNlZ21lbnQgICAgICAgY2hlY2tzdW0gICAgICAgICAgICAgZGljdCBmbGFnICAgICBmcmFtZSBjb250ZW50IGZsYWdcbiAgICAgIHZhciBzcyA9IChmbGcgPj4gNSkgJiAxLFxuICAgICAgICBjYyA9IChmbGcgPj4gMikgJiAxLFxuICAgICAgICBkZiA9IGZsZyAmIDMsXG4gICAgICAgIGZjZiA9IGZsZyA+PiA2O1xuICAgICAgaWYgKGZsZyAmIDgpIGVycigwKTtcbiAgICAgIC8vIGJ5dGVcbiAgICAgIHZhciBidCA9IDYgLSBzcztcbiAgICAgIC8vIGRpY3QgYnl0ZXNcbiAgICAgIHZhciBkYiA9IGRmID09PSAzID8gNCA6IGRmO1xuICAgICAgLy8gZGljdGlvbmFyeSBpZFxuICAgICAgdmFyIGRpID0gcmIoZGF0LCBidCwgZGIpO1xuICAgICAgYnQgKz0gZGI7XG4gICAgICAvLyBmcmFtZSBzaXplIGJ5dGVzXG4gICAgICB2YXIgZnNiID0gZmNmID8gMSA8PCBmY2YgOiBzcztcbiAgICAgIC8vIGZyYW1lIHNvdXJjZSBzaXplXG4gICAgICB2YXIgZnNzID0gcmIoZGF0LCBidCwgZnNiKSArIChmY2YgPT09IDEgJiYgMjU2KTtcbiAgICAgIC8vIHdpbmRvdyBzaXplXG4gICAgICB2YXIgd3MgPSBmc3M7XG4gICAgICBpZiAoIXNzKSB7XG4gICAgICAgIC8vIHdpbmRvdyBkZXNjcmlwdG9yXG4gICAgICAgIHZhciB3YiA9IDEgPDwgKDEwICsgKGRhdFs1XSA+PiAzKSk7XG4gICAgICAgIHdzID0gd2IgKyAod2IgPj4gMykgKiAoZGF0WzVdICYgNyk7XG4gICAgICB9XG4gICAgICBpZiAod3MgPiAyMTQ1Mzg2NDk2KSBlcnIoMSk7XG4gICAgICB2YXIgYnVmID0gbmV3IHU4KCh3ID09PSAxID8gZnNzIHx8IHdzIDogdyA/IDAgOiB3cykgKyAxMik7XG4gICAgICAoYnVmWzBdID0gMSksIChidWZbNF0gPSA0KSwgKGJ1Zls4XSA9IDgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYjogYnQgKyBmc2IsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGw6IDAsXG4gICAgICAgIGQ6IGRpLFxuICAgICAgICB3OiB3ICYmIHcgIT09IDEgPyB3IDogYnVmLnN1YmFycmF5KDEyKSxcbiAgICAgICAgZTogd3MsXG4gICAgICAgIG86IG5ldyBpMzIoYnVmLmJ1ZmZlciwgMCwgMyksXG4gICAgICAgIHU6IGZzcyxcbiAgICAgICAgYzogY2MsXG4gICAgICAgIG06IE1hdGgubWluKDEzMTA3Miwgd3MpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCgobjMgPj4gNCkgfCAoZGF0WzNdIDw8IDIwKSkgPT09IDB4MTg0ZDJhNSkge1xuICAgICAgLy8gc2tpcHBhYmxlXG4gICAgICByZXR1cm4gYjQoZGF0LCA0KSArIDg7XG4gICAgfVxuICAgIGVycigwKTtcbiAgfTtcbiAgLy8gbW9zdCBzaWduaWZpY2FudCBiaXQgZm9yIG5vbnplcm9cbiAgdmFyIG1zYiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgYml0cyA9IDA7XG4gICAgZm9yICg7IDEgPDwgYml0cyA8PSB2YWw7ICsrYml0cyk7XG4gICAgcmV0dXJuIGJpdHMgLSAxO1xuICB9O1xuICAvLyByZWFkIGZpbml0ZSBzdGF0ZSBlbnRyb3B5XG4gIHZhciByZnNlID0gZnVuY3Rpb24gKGRhdCwgYnQsIG1hbCkge1xuICAgIC8vIHRhYmxlIHBvc1xuICAgIHZhciB0cG9zID0gKGJ0IDw8IDMpICsgNDtcbiAgICAvLyBhY2N1cmFjeSBsb2dcbiAgICB2YXIgYWwgPSAoZGF0W2J0XSAmIDE1KSArIDU7XG4gICAgaWYgKGFsID4gbWFsKSBlcnIoMyk7XG4gICAgLy8gc2l6ZVxuICAgIHZhciBzeiA9IDEgPDwgYWw7XG4gICAgLy8gcHJvYmFiaWxpdGllcyBzeW1ib2xzICByZXBlYXQgICBpbmRleCAgIGhpZ2ggdGhyZXNob2xkXG4gICAgdmFyIHByb2JzID0gc3osXG4gICAgICBzeW0gPSAtMSxcbiAgICAgIHJlID0gLTEsXG4gICAgICBpID0gLTEsXG4gICAgICBodCA9IHN6O1xuICAgIC8vIG9wdGltaXphdGlvbjogc2luZ2xlIGFsbG9jYXRpb24gaXMgbXVjaCBmYXN0ZXJcbiAgICB2YXIgYnVmID0gbmV3IGFiKDUxMiArIChzeiA8PCAyKSk7XG4gICAgdmFyIGZyZXEgPSBuZXcgaTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICAvLyBzYW1lIHZpZXcgYXMgZnJlcVxuICAgIHZhciBkc3RhdGUgPSBuZXcgdTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICB2YXIgbnN0YXRlID0gbmV3IHUxNihidWYsIDUxMiwgc3opO1xuICAgIHZhciBiYjEgPSA1MTIgKyAoc3ogPDwgMSk7XG4gICAgdmFyIHN5bXMgPSBuZXcgdTgoYnVmLCBiYjEsIHN6KTtcbiAgICB2YXIgbmJpdHMgPSBuZXcgdTgoYnVmLCBiYjEgKyBzeik7XG4gICAgd2hpbGUgKHN5bSA8IDI1NSAmJiBwcm9icyA+IDApIHtcbiAgICAgIHZhciBiaXRzID0gbXNiKHByb2JzICsgMSk7XG4gICAgICB2YXIgY2J0ID0gdHBvcyA+PiAzO1xuICAgICAgLy8gbWFza1xuICAgICAgdmFyIG1zayA9ICgxIDw8IChiaXRzICsgMSkpIC0gMTtcbiAgICAgIHZhciB2YWwgPVxuICAgICAgICAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PlxuICAgICAgICAgICh0cG9zICYgNykpICZcbiAgICAgICAgbXNrO1xuICAgICAgLy8gbWFzayAoMSBmZXdlciBiaXQpXG4gICAgICB2YXIgbXNrMWZiID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgLy8gbWF4IHNtYWxsIHZhbHVlXG4gICAgICB2YXIgbXN2ID0gbXNrIC0gcHJvYnMgLSAxO1xuICAgICAgLy8gc21hbGwgdmFsdWVcbiAgICAgIHZhciBzdmFsID0gdmFsICYgbXNrMWZiO1xuICAgICAgaWYgKHN2YWwgPCBtc3YpICh0cG9zICs9IGJpdHMpLCAodmFsID0gc3ZhbCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdHBvcyArPSBiaXRzICsgMTtcbiAgICAgICAgaWYgKHZhbCA+IG1zazFmYikgdmFsIC09IG1zdjtcbiAgICAgIH1cbiAgICAgIGZyZXFbKytzeW1dID0gLS12YWw7XG4gICAgICBpZiAodmFsID09PSAtMSkge1xuICAgICAgICBwcm9icyArPSB2YWw7XG4gICAgICAgIHN5bXNbLS1odF0gPSBzeW07XG4gICAgICB9IGVsc2UgcHJvYnMgLT0gdmFsO1xuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8vIHJlcGVhdCBieXRlXG4gICAgICAgICAgdmFyIHJidCA9IHRwb3MgPj4gMztcbiAgICAgICAgICByZSA9ICgoZGF0W3JidF0gfCAoZGF0W3JidCArIDFdIDw8IDgpKSA+PiAodHBvcyAmIDcpKSAmIDM7XG4gICAgICAgICAgdHBvcyArPSAyO1xuICAgICAgICAgIHN5bSArPSByZTtcbiAgICAgICAgfSB3aGlsZSAocmUgPT09IDMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3ltID4gMjU1IHx8IHByb2JzKSBlcnIoMCk7XG4gICAgdmFyIHN5bXBvcyA9IDA7XG4gICAgLy8gc3ltIHN0ZXAgKGNvcHJpbWUgd2l0aCBzeiAtIGZvcm11bGEgZnJvbSB6c3RkIHNvdXJjZSlcbiAgICB2YXIgc3N0ZXAgPSAoc3ogPj4gMSkgKyAoc3ogPj4gMykgKyAzO1xuICAgIC8vIHN5bSBtYXNrXG4gICAgdmFyIHNtYXNrID0gc3ogLSAxO1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDw9IHN5bTsgKytzKSB7XG4gICAgICB2YXIgc2YgPSBmcmVxW3NdO1xuICAgICAgaWYgKHNmIDwgMSkge1xuICAgICAgICBkc3RhdGVbc10gPSAtc2Y7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBpcyBzcGxpdCBpbnRvIHR3byBsb29wcyBpbiB6c3RkIHRvIGF2b2lkIGJyYW5jaGluZywgYnV0IGFzIEpTIGlzIGhpZ2hlci1sZXZlbCB0aGF0IGlzIHVubmVjZXNzYXJ5XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2Y7ICsraSkge1xuICAgICAgICBzeW1zW3N5bXBvc10gPSBzO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgc3ltcG9zID0gKHN5bXBvcyArIHNzdGVwKSAmIHNtYXNrO1xuICAgICAgICB9IHdoaWxlIChzeW1wb3MgPj0gaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZnRlciBzcHJlYWRpbmcgc3ltYm9scywgc2hvdWxkIGJlIHplcm8gYWdhaW5cbiAgICBpZiAoc3ltcG9zKSBlcnIoMCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHN6OyArK2kpIHtcbiAgICAgIC8vIG5leHQgc3RhdGVcbiAgICAgIHZhciBucyA9IGRzdGF0ZVtzeW1zW2ldXSsrO1xuICAgICAgLy8gbnVtIGJpdHNcbiAgICAgIHZhciBuYiA9IChuYml0c1tpXSA9IGFsIC0gbXNiKG5zKSk7XG4gICAgICBuc3RhdGVbaV0gPSAobnMgPDwgbmIpIC0gc3o7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAodHBvcyArIDcpID4+IDMsXG4gICAgICB7XG4gICAgICAgIGI6IGFsLFxuICAgICAgICBzOiBzeW1zLFxuICAgICAgICBuOiBuYml0cyxcbiAgICAgICAgdDogbnN0YXRlLFxuICAgICAgfSxcbiAgICBdO1xuICB9O1xuICAvLyByZWFkIGh1ZmZtYW5cbiAgdmFyIHJodSA9IGZ1bmN0aW9uIChkYXQsIGJ0KSB7XG4gICAgLy8gIGluZGV4ICB3ZWlnaHQgY291bnRcbiAgICB2YXIgaSA9IDAsXG4gICAgICB3YyA9IC0xO1xuICAgIC8vICAgIGJ1ZmZlciAgICAgICAgICAgICBoZWFkZXIgYnl0ZVxuICAgIHZhciBidWYgPSBuZXcgdTgoMjkyKSxcbiAgICAgIGhiID0gZGF0W2J0XTtcbiAgICAvLyBodWZmbWFuIHdlaWdodHNcbiAgICB2YXIgaHcgPSBidWYuc3ViYXJyYXkoMCwgMjU2KTtcbiAgICAvLyByYW5rIGNvdW50XG4gICAgdmFyIHJjID0gYnVmLnN1YmFycmF5KDI1NiwgMjY4KTtcbiAgICAvLyByYW5rIGluZGV4XG4gICAgdmFyIHJpID0gbmV3IHUxNihidWYuYnVmZmVyLCAyNjgpO1xuICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgYnQgaXMgMSBsZXNzIHRoYW4gZXhwZWN0ZWRcbiAgICBpZiAoaGIgPCAxMjgpIHtcbiAgICAgIC8vIGVuZCBieXRlLCBmc2UgZGVjb2RlIHRhYmxlXG4gICAgICB2YXIgX2EgPSByZnNlKGRhdCwgYnQgKyAxLCA2KSxcbiAgICAgICAgZWJ0ID0gX2FbMF0sXG4gICAgICAgIGZkdCA9IF9hWzFdO1xuICAgICAgYnQgKz0gaGI7XG4gICAgICB2YXIgZXBvcyA9IGVidCA8PCAzO1xuICAgICAgLy8gbGFzdCBieXRlXG4gICAgICB2YXIgbGIgPSBkYXRbYnRdO1xuICAgICAgaWYgKCFsYikgZXJyKDApO1xuICAgICAgLy8gIHN0YXRlMSAgIHN0YXRlMiAgIHN0YXRlMSBiaXRzICAgc3RhdGUyIGJpdHNcbiAgICAgIHZhciBzdDEgPSAwLFxuICAgICAgICBzdDIgPSAwLFxuICAgICAgICBidHIxID0gZmR0LmIsXG4gICAgICAgIGJ0cjIgPSBidHIxO1xuICAgICAgLy8gZnNlIHBvc1xuICAgICAgLy8gcHJlLWluY3JlbWVudCB0byBhY2NvdW50IGZvciBvcmlnaW5hbCBkZWZpY2l0IG9mIDFcbiAgICAgIHZhciBmcG9zID0gKCsrYnQgPDwgMykgLSA4ICsgbXNiKGxiKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgZnBvcyAtPSBidHIxO1xuICAgICAgICBpZiAoZnBvcyA8IGVwb3MpIGJyZWFrO1xuICAgICAgICB2YXIgY2J0ID0gZnBvcyA+PiAzO1xuICAgICAgICBzdDEgKz1cbiAgICAgICAgICAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKGZwb3MgJiA3KSkgJiAoKDEgPDwgYnRyMSkgLSAxKTtcbiAgICAgICAgaHdbKyt3Y10gPSBmZHQuc1tzdDFdO1xuICAgICAgICBmcG9zIC09IGJ0cjI7XG4gICAgICAgIGlmIChmcG9zIDwgZXBvcykgYnJlYWs7XG4gICAgICAgIGNidCA9IGZwb3MgPj4gMztcbiAgICAgICAgc3QyICs9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChmcG9zICYgNykpICYgKCgxIDw8IGJ0cjIpIC0gMSk7XG4gICAgICAgIGh3Wysrd2NdID0gZmR0LnNbc3QyXTtcbiAgICAgICAgYnRyMSA9IGZkdC5uW3N0MV07XG4gICAgICAgIHN0MSA9IGZkdC50W3N0MV07XG4gICAgICAgIGJ0cjIgPSBmZHQubltzdDJdO1xuICAgICAgICBzdDIgPSBmZHQudFtzdDJdO1xuICAgICAgfVxuICAgICAgaWYgKCsrd2MgPiAyNTUpIGVycigwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2MgPSBoYiAtIDEyNztcbiAgICAgIGZvciAoOyBpIDwgd2M7IGkgKz0gMikge1xuICAgICAgICB2YXIgYnl0ZSA9IGRhdFsrK2J0XTtcbiAgICAgICAgaHdbaV0gPSBieXRlID4+IDQ7XG4gICAgICAgIGh3W2kgKyAxXSA9IGJ5dGUgJiAxNTtcbiAgICAgIH1cbiAgICAgICsrYnQ7XG4gICAgfVxuICAgIC8vIHdlaWdodCBleHBvbmVudGlhbCBzdW1cbiAgICB2YXIgd2VzID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgdmFyIHd0ID0gaHdbaV07XG4gICAgICAvLyBiaXRzIG11c3QgYmUgYXQgbW9zdCAxMSwgc2FtZSBhcyB3ZWlnaHRcbiAgICAgIGlmICh3dCA+IDExKSBlcnIoMCk7XG4gICAgICB3ZXMgKz0gd3QgJiYgMSA8PCAod3QgLSAxKTtcbiAgICB9XG4gICAgLy8gbWF4IGJpdHNcbiAgICB2YXIgbWIgPSBtc2Iod2VzKSArIDE7XG4gICAgLy8gdGFibGUgc2l6ZVxuICAgIHZhciB0cyA9IDEgPDwgbWI7XG4gICAgLy8gcmVtYWluaW5nIHN1bVxuICAgIHZhciByZW0gPSB0cyAtIHdlcztcbiAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDJcbiAgICBpZiAocmVtICYgKHJlbSAtIDEpKSBlcnIoMCk7XG4gICAgaHdbd2MrK10gPSBtc2IocmVtKSArIDE7XG4gICAgZm9yIChpID0gMDsgaSA8IHdjOyArK2kpIHtcbiAgICAgIHZhciB3dCA9IGh3W2ldO1xuICAgICAgKytyY1soaHdbaV0gPSB3dCAmJiBtYiArIDEgLSB3dCldO1xuICAgIH1cbiAgICAvLyBodWYgYnVmXG4gICAgdmFyIGhidWYgPSBuZXcgdTgodHMgPDwgMSk7XG4gICAgLy8gICAgc3ltYm9scyAgICAgICAgICAgICAgICAgICAgICBudW0gYml0c1xuICAgIHZhciBzeW1zID0gaGJ1Zi5zdWJhcnJheSgwLCB0cyksXG4gICAgICBuYiA9IGhidWYuc3ViYXJyYXkodHMpO1xuICAgIHJpW21iXSA9IDA7XG4gICAgZm9yIChpID0gbWI7IGkgPiAwOyAtLWkpIHtcbiAgICAgIHZhciBwdiA9IHJpW2ldO1xuICAgICAgZmlsbChuYiwgaSwgcHYsIChyaVtpIC0gMV0gPSBwdiArIHJjW2ldICogKDEgPDwgKG1iIC0gaSkpKSk7XG4gICAgfVxuICAgIGlmIChyaVswXSAhPT0gdHMpIGVycigwKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgdmFyIGJpdHMgPSBod1tpXTtcbiAgICAgIGlmIChiaXRzKSB7XG4gICAgICAgIHZhciBjb2RlID0gcmlbYml0c107XG4gICAgICAgIGZpbGwoc3ltcywgaSwgY29kZSwgKHJpW2JpdHNdID0gY29kZSArICgxIDw8IChtYiAtIGJpdHMpKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgYnQsXG4gICAgICB7XG4gICAgICAgIG46IG5iLFxuICAgICAgICBiOiBtYixcbiAgICAgICAgczogc3ltcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfTtcbiAgLy8gVGFibGVzIGdlbmVyYXRlZCB1c2luZyB0aGlzOlxuICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDFhcnJvd3ovYTk3OTQ1MmQ0MzU1OTkyY2JmOGYyNTdjYmZmYzllZGRcbiAgLy8gZGVmYXVsdCBsaXRlcmFsIGxlbmd0aCB0YWJsZVxuICB2YXIgZGxsdCA9IC8qI19fUFVSRV9fKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgICA4MSwgMTYsIDk5LCAxNDAsIDQ5LCAxOTgsIDI0LCA5OSwgMTIsIDMzLCAxOTYsIDI0LCA5OSwgMTAyLCAxMDIsIDEzNCwgNzAsXG4gICAgICAxNDYsIDQsXG4gICAgXSksXG4gICAgMCxcbiAgICA2LFxuICApWzFdO1xuICAvLyBkZWZhdWx0IG1hdGNoIGxlbmd0aCB0YWJsZVxuICB2YXIgZG1sdCA9IC8qI19fUFVSRV9fKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgICAzMywgMjAsIDE5NiwgMjQsIDk5LCAxNDAsIDMzLCAxMzIsIDE2LCA2NiwgOCwgMzMsIDEzMiwgMTYsIDY2LCA4LCAzMywgNjgsXG4gICAgICA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgMzYsIDksXG4gICAgXSksXG4gICAgMCxcbiAgICA2LFxuICApWzFdO1xuICAvLyBkZWZhdWx0IG9mZnNldCBjb2RlIHRhYmxlXG4gIHZhciBkb2N0ID0gLyojX19QVVJFX18gKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbMzIsIDEzMiwgMTYsIDY2LCAxMDIsIDcwLCA2OCwgNjgsIDY4LCA2OCwgMzYsIDczLCAyXSksXG4gICAgMCxcbiAgICA1LFxuICApWzFdO1xuICAvLyBiaXRzIHRvIGJhc2VsaW5lXG4gIHZhciBiMmJsID0gZnVuY3Rpb24gKGIsIHMpIHtcbiAgICB2YXIgbGVuID0gYi5sZW5ndGgsXG4gICAgICBibCA9IG5ldyBpMzIobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBibFtpXSA9IHM7XG4gICAgICBzICs9IDEgPDwgYltpXTtcbiAgICB9XG4gICAgcmV0dXJuIGJsO1xuICB9O1xuICAvLyBsaXRlcmFsIGxlbmd0aCBiaXRzXG4gIHZhciBsbGIgPSAvKiNfX1BVUkVfXyAqLyBuZXcgdTgoXG4gICAgLyojX19QVVJFX18gKi8gbmV3IGkzMihbXG4gICAgICAwLCAwLCAwLCAwLCAxNjg0MzAwOSwgNTA1Mjg3NzAsIDEzNDY3ODAyMCwgMjAyMDUwMDU3LCAyNjk0MjIwOTMsXG4gICAgXSkuYnVmZmVyLFxuICAgIDAsXG4gICAgMzYsXG4gICk7XG4gIC8vIGxpdGVyYWwgbGVuZ3RoIGJhc2VsaW5lXG4gIHZhciBsbGJsID0gLyojX19QVVJFX18gKi8gYjJibChsbGIsIDApO1xuICAvLyBtYXRjaCBsZW5ndGggYml0c1xuICB2YXIgbWxiID0gLyojX19QVVJFX18gKi8gbmV3IHU4KFxuICAgIC8qI19fUFVSRV9fICovIG5ldyBpMzIoW1xuICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTY4NDMwMDksIDUwNTI4NzcwLCAxMTc3NjkyMjAsIDE4NTIwNzA0OCxcbiAgICAgIDI1MjU3OTA4NCwgMTYsXG4gICAgXSkuYnVmZmVyLFxuICAgIDAsXG4gICAgNTMsXG4gICk7XG4gIC8vIG1hdGNoIGxlbmd0aCBiYXNlbGluZVxuICB2YXIgbWxibCA9IC8qI19fUFVSRV9fICovIGIyYmwobWxiLCAzKTtcbiAgLy8gZGVjb2RlIGh1ZmZtYW4gc3RyZWFtXG4gIHZhciBkaHUgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGxlbiA9IGRhdC5sZW5ndGgsXG4gICAgICBzcyA9IG91dC5sZW5ndGgsXG4gICAgICBsYiA9IGRhdFtsZW4gLSAxXSxcbiAgICAgIG1zayA9ICgxIDw8IGh1LmIpIC0gMSxcbiAgICAgIGViID0gLWh1LmI7XG4gICAgaWYgKCFsYikgZXJyKDApO1xuICAgIHZhciBzdCA9IDAsXG4gICAgICBidHIgPSBodS5iLFxuICAgICAgcG9zID0gKGxlbiA8PCAzKSAtIDggKyBtc2IobGIpIC0gYnRyLFxuICAgICAgaSA9IC0xO1xuICAgIHdoaWxlIChwb3MgPiBlYiAmJiBpIDwgc3MpIHtcbiAgICAgIHZhciBjYnQgPSBwb3MgPj4gMztcbiAgICAgIHZhciB2YWwgPVxuICAgICAgICAoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+IChwb3MgJiA3KTtcbiAgICAgIHN0ID0gKChzdCA8PCBidHIpIHwgdmFsKSAmIG1zaztcbiAgICAgIG91dFsrK2ldID0gaHUuc1tzdF07XG4gICAgICBwb3MgLT0gYnRyID0gaHUubltzdF07XG4gICAgfVxuICAgIGlmIChwb3MgIT09IGViIHx8IGkgKyAxICE9PSBzcykgZXJyKDApO1xuICB9O1xuICAvLyBkZWNvZGUgaHVmZm1hbiBzdHJlYW0gNHhcbiAgLy8gVE9ETzogdXNlIHdvcmtlcnMgdG8gcGFyYWxsZWxpemVcbiAgdmFyIGRodTQgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGJ0ID0gNjtcbiAgICB2YXIgc3MgPSBvdXQubGVuZ3RoLFxuICAgICAgc3oxID0gKHNzICsgMykgPj4gMixcbiAgICAgIHN6MiA9IHN6MSA8PCAxLFxuICAgICAgc3ozID0gc3oxICsgc3oyO1xuICAgIGRodShcbiAgICAgIGRhdC5zdWJhcnJheShidCwgKGJ0ICs9IGRhdFswXSB8IChkYXRbMV0gPDwgOCkpKSxcbiAgICAgIG91dC5zdWJhcnJheSgwLCBzejEpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoXG4gICAgICBkYXQuc3ViYXJyYXkoYnQsIChidCArPSBkYXRbMl0gfCAoZGF0WzNdIDw8IDgpKSksXG4gICAgICBvdXQuc3ViYXJyYXkoc3oxLCBzejIpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoXG4gICAgICBkYXQuc3ViYXJyYXkoYnQsIChidCArPSBkYXRbNF0gfCAoZGF0WzVdIDw8IDgpKSksXG4gICAgICBvdXQuc3ViYXJyYXkoc3oyLCBzejMpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0KSwgb3V0LnN1YmFycmF5KHN6MyksIGh1KTtcbiAgfTtcbiAgLy8gcmVhZCBac3RhbmRhcmQgYmxvY2tcbiAgdmFyIHJ6YiA9IGZ1bmN0aW9uIChkYXQsIHN0LCBvdXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJ0ID0gc3QuYjtcbiAgICAvLyAgICBieXRlIDAgICAgICAgIGJsb2NrIHR5cGVcbiAgICB2YXIgYjAgPSBkYXRbYnRdLFxuICAgICAgYnR5cGUgPSAoYjAgPj4gMSkgJiAzO1xuICAgIHN0LmwgPSBiMCAmIDE7XG4gICAgdmFyIHN6ID0gKGIwID4+IDMpIHwgKGRhdFtidCArIDFdIDw8IDUpIHwgKGRhdFtidCArIDJdIDw8IDEzKTtcbiAgICAvLyBlbmQgYnl0ZSBmb3IgYmxvY2tcbiAgICB2YXIgZWJ0ID0gKGJ0ICs9IDMpICsgc3o7XG4gICAgaWYgKGJ0eXBlID09PSAxKSB7XG4gICAgICBpZiAoYnQgPj0gZGF0Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgc3QuYiA9IGJ0ICsgMTtcbiAgICAgIGlmIChvdXQpIHtcbiAgICAgICAgZmlsbChvdXQsIGRhdFtidF0sIHN0LnksIChzdC55ICs9IHN6KSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsbChuZXcgdTgoc3opLCBkYXRbYnRdKTtcbiAgICB9XG4gICAgaWYgKGVidCA+IGRhdC5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoYnR5cGUgPT09IDApIHtcbiAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICBpZiAob3V0KSB7XG4gICAgICAgIG91dC5zZXQoZGF0LnN1YmFycmF5KGJ0LCBlYnQpLCBzdC55KTtcbiAgICAgICAgc3QueSArPSBzejtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzbGMoZGF0LCBidCwgZWJ0KTtcbiAgICB9XG4gICAgaWYgKGJ0eXBlID09PSAyKSB7XG4gICAgICAvLyAgICBieXRlIDMgICAgICAgIGxpdCBidHlwZSAgICAgc2l6ZSBmb3JtYXRcbiAgICAgIHZhciBiMyA9IGRhdFtidF0sXG4gICAgICAgIGxidCA9IGIzICYgMyxcbiAgICAgICAgc2YgPSAoYjMgPj4gMikgJiAzO1xuICAgICAgLy8gbGl0IHNyYyBzaXplICBsaXQgY21wIHN6IDQgc3RyZWFtc1xuICAgICAgdmFyIGxzcyA9IGIzID4+IDQsXG4gICAgICAgIGxjcyA9IDAsXG4gICAgICAgIHM0ID0gMDtcbiAgICAgIGlmIChsYnQgPCAyKSB7XG4gICAgICAgIGlmIChzZiAmIDEpIGxzcyB8PSAoZGF0WysrYnRdIDw8IDQpIHwgKHNmICYgMiAmJiBkYXRbKytidF0gPDwgMTIpO1xuICAgICAgICBlbHNlIGxzcyA9IGIzID4+IDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzNCA9IHNmO1xuICAgICAgICBpZiAoc2YgPCAyKVxuICAgICAgICAgIChsc3MgfD0gKGRhdFsrK2J0XSAmIDYzKSA8PCA0KSxcbiAgICAgICAgICAgIChsY3MgPSAoZGF0W2J0XSA+PiA2KSB8IChkYXRbKytidF0gPDwgMikpO1xuICAgICAgICBlbHNlIGlmIChzZiA9PT0gMilcbiAgICAgICAgICAobHNzIHw9IChkYXRbKytidF0gPDwgNCkgfCAoKGRhdFsrK2J0XSAmIDMpIDw8IDEyKSksXG4gICAgICAgICAgICAobGNzID0gKGRhdFtidF0gPj4gMikgfCAoZGF0WysrYnRdIDw8IDYpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIChsc3MgfD0gKGRhdFsrK2J0XSA8PCA0KSB8ICgoZGF0WysrYnRdICYgNjMpIDw8IDEyKSksXG4gICAgICAgICAgICAobGNzID0gKGRhdFtidF0gPj4gNikgfCAoZGF0WysrYnRdIDw8IDIpIHwgKGRhdFsrK2J0XSA8PCAxMCkpO1xuICAgICAgfVxuICAgICAgKytidDtcbiAgICAgIC8vIGFkZCBsaXRlcmFscyB0byBlbmQgLSBjYW4gbmV2ZXIgb3ZlcmxhcCB3aXRoIGJhY2tyZWZlcmVuY2VzIGJlY2F1c2UgdW51c2VkIGxpdGVyYWxzIGFsd2F5cyBhcHBlbmRlZFxuICAgICAgdmFyIGJ1ZiA9IG91dCA/IG91dC5zdWJhcnJheShzdC55LCBzdC55ICsgc3QubSkgOiBuZXcgdTgoc3QubSk7XG4gICAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgbGl0ZXJhbHNcbiAgICAgIHZhciBzcGwgPSBidWYubGVuZ3RoIC0gbHNzO1xuICAgICAgaWYgKGxidCA9PT0gMCkgYnVmLnNldChkYXQuc3ViYXJyYXkoYnQsIChidCArPSBsc3MpKSwgc3BsKTtcbiAgICAgIGVsc2UgaWYgKGxidCA9PT0gMSkgZmlsbChidWYsIGRhdFtidCsrXSwgc3BsKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBodWZmbWFuIHRhYmxlXG4gICAgICAgIHZhciBodSA9IHN0Lmg7XG4gICAgICAgIGlmIChsYnQgPT09IDIpIHtcbiAgICAgICAgICB2YXIgaHVkID0gcmh1KGRhdCwgYnQpO1xuICAgICAgICAgIC8vIHN1YnRyYWN0IGRlc2NyaXB0aW9uIGxlbmd0aFxuICAgICAgICAgIGxjcyArPSBidCAtIChidCA9IGh1ZFswXSk7XG4gICAgICAgICAgc3QuaCA9IGh1ID0gaHVkWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKCFodSkgZXJyKDApO1xuICAgICAgICAoczQgPyBkaHU0IDogZGh1KShkYXQuc3ViYXJyYXkoYnQsIChidCArPSBsY3MpKSwgYnVmLnN1YmFycmF5KHNwbCksIGh1KTtcbiAgICAgIH1cbiAgICAgIC8vIG51bSBzZXF1ZW5jZXNcbiAgICAgIHZhciBucyA9IGRhdFtidCsrXTtcbiAgICAgIGlmIChucykge1xuICAgICAgICBpZiAobnMgPT09IDI1NSkgbnMgPSAoZGF0W2J0KytdIHwgKGRhdFtidCsrXSA8PCA4KSkgKyAweDdmMDA7XG4gICAgICAgIGVsc2UgaWYgKG5zID4gMTI3KSBucyA9ICgobnMgLSAxMjgpIDw8IDgpIHwgZGF0W2J0KytdO1xuICAgICAgICAvLyBzeW1ib2wgY29tcHJlc3Npb24gbW9kZXNcbiAgICAgICAgdmFyIHNjbSA9IGRhdFtidCsrXTtcbiAgICAgICAgaWYgKHNjbSAmIDMpIGVycigwKTtcbiAgICAgICAgdmFyIGR0cyA9IFtkbWx0LCBkb2N0LCBkbGx0XTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPiAtMTsgLS1pKSB7XG4gICAgICAgICAgdmFyIG1kID0gKHNjbSA+PiAoKGkgPDwgMSkgKyAyKSkgJiAzO1xuICAgICAgICAgIGlmIChtZCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gcmxlIGJ1ZlxuICAgICAgICAgICAgdmFyIHJidWYgPSBuZXcgdTgoWzAsIDAsIGRhdFtidCsrXV0pO1xuICAgICAgICAgICAgZHRzW2ldID0ge1xuICAgICAgICAgICAgICBzOiByYnVmLnN1YmFycmF5KDIsIDMpLFxuICAgICAgICAgICAgICBuOiByYnVmLnN1YmFycmF5KDAsIDEpLFxuICAgICAgICAgICAgICB0OiBuZXcgdTE2KHJidWYuYnVmZmVyLCAwLCAxKSxcbiAgICAgICAgICAgICAgYjogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChtZCA9PT0gMikge1xuICAgICAgICAgICAgLy8gYWNjdXJhY3kgbG9nIDggZm9yIG9mZnNldHMsIDkgZm9yIG90aGVyc1xuICAgICAgICAgICAgKF9hID0gcmZzZShkYXQsIGJ0LCA5IC0gKGkgJiAxKSkpLCAoYnQgPSBfYVswXSksIChkdHNbaV0gPSBfYVsxXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZCA9PT0gMykge1xuICAgICAgICAgICAgaWYgKCFzdC50KSBlcnIoMCk7XG4gICAgICAgICAgICBkdHNbaV0gPSBzdC50W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgX2IgPSAoc3QudCA9IGR0cyksXG4gICAgICAgICAgbWx0ID0gX2JbMF0sXG4gICAgICAgICAgb2N0ID0gX2JbMV0sXG4gICAgICAgICAgbGx0ID0gX2JbMl07XG4gICAgICAgIHZhciBsYiA9IGRhdFtlYnQgLSAxXTtcbiAgICAgICAgaWYgKCFsYikgZXJyKDApO1xuICAgICAgICB2YXIgc3BvcyA9IChlYnQgPDwgMykgLSA4ICsgbXNiKGxiKSAtIGxsdC5iLFxuICAgICAgICAgIGNidCA9IHNwb3MgPj4gMyxcbiAgICAgICAgICBvdWJ0ID0gMDtcbiAgICAgICAgdmFyIGxzdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IGxsdC5iKSAtIDEpO1xuICAgICAgICBjYnQgPSAoc3BvcyAtPSBvY3QuYikgPj4gMztcbiAgICAgICAgdmFyIG9zdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG9jdC5iKSAtIDEpO1xuICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbHQuYikgPj4gMztcbiAgICAgICAgdmFyIG1zdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG1sdC5iKSAtIDEpO1xuICAgICAgICBmb3IgKCsrbnM7IC0tbnM7ICkge1xuICAgICAgICAgIHZhciBsbGMgPSBsbHQuc1tsc3RdO1xuICAgICAgICAgIHZhciBsYnRyID0gbGx0Lm5bbHN0XTtcbiAgICAgICAgICB2YXIgbWxjID0gbWx0LnNbbXN0XTtcbiAgICAgICAgICB2YXIgbWJ0ciA9IG1sdC5uW21zdF07XG4gICAgICAgICAgdmFyIG9mYyA9IG9jdC5zW29zdF07XG4gICAgICAgICAgdmFyIG9idHIgPSBvY3Qubltvc3RdO1xuICAgICAgICAgIGNidCA9IChzcG9zIC09IG9mYykgPj4gMztcbiAgICAgICAgICB2YXIgb2ZwID0gMSA8PCBvZmM7XG4gICAgICAgICAgdmFyIG9mZiA9XG4gICAgICAgICAgICBvZnAgK1xuICAgICAgICAgICAgKCgoZGF0W2NidF0gfFxuICAgICAgICAgICAgICAoZGF0W2NidCArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICAgKGRhdFtjYnQgKyAyXSA8PCAxNikgfFxuICAgICAgICAgICAgICAoZGF0W2NidCArIDNdIDw8IDI0KSkgPj4+XG4gICAgICAgICAgICAgIChzcG9zICYgNykpICZcbiAgICAgICAgICAgICAgKG9mcCAtIDEpKTtcbiAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbGJbbWxjXSkgPj4gMztcbiAgICAgICAgICB2YXIgbWwgPVxuICAgICAgICAgICAgbWxibFttbGNdICtcbiAgICAgICAgICAgICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PlxuICAgICAgICAgICAgICAoc3BvcyAmIDcpKSAmXG4gICAgICAgICAgICAgICgoMSA8PCBtbGJbbWxjXSkgLSAxKSk7XG4gICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbGxiW2xsY10pID4+IDM7XG4gICAgICAgICAgdmFyIGxsID1cbiAgICAgICAgICAgIGxsYmxbbGxjXSArXG4gICAgICAgICAgICAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj5cbiAgICAgICAgICAgICAgKHNwb3MgJiA3KSkgJlxuICAgICAgICAgICAgICAoKDEgPDwgbGxiW2xsY10pIC0gMSkpO1xuICAgICAgICAgIGNidCA9IChzcG9zIC09IGxidHIpID4+IDM7XG4gICAgICAgICAgbHN0ID1cbiAgICAgICAgICAgIGxsdC50W2xzdF0gK1xuICAgICAgICAgICAgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmXG4gICAgICAgICAgICAgICgoMSA8PCBsYnRyKSAtIDEpKTtcbiAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtYnRyKSA+PiAzO1xuICAgICAgICAgIG1zdCA9XG4gICAgICAgICAgICBtbHQudFttc3RdICtcbiAgICAgICAgICAgICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJlxuICAgICAgICAgICAgICAoKDEgPDwgbWJ0cikgLSAxKSk7XG4gICAgICAgICAgY2J0ID0gKHNwb3MgLT0gb2J0cikgPj4gMztcbiAgICAgICAgICBvc3QgPVxuICAgICAgICAgICAgb2N0LnRbb3N0XSArXG4gICAgICAgICAgICAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICZcbiAgICAgICAgICAgICAgKCgxIDw8IG9idHIpIC0gMSkpO1xuICAgICAgICAgIGlmIChvZmYgPiAzKSB7XG4gICAgICAgICAgICBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgIHN0Lm9bMV0gPSBzdC5vWzBdO1xuICAgICAgICAgICAgc3Qub1swXSA9IG9mZiAtPSAzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gb2ZmIC0gKGxsICE9PSAwKTtcbiAgICAgICAgICAgIGlmIChpZHgpIHtcbiAgICAgICAgICAgICAgb2ZmID0gaWR4ID09PSAzID8gc3Qub1swXSAtIDEgOiBzdC5vW2lkeF07XG4gICAgICAgICAgICAgIGlmIChpZHggPiAxKSBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgICAgc3Qub1sxXSA9IHN0Lm9bMF07XG4gICAgICAgICAgICAgIHN0Lm9bMF0gPSBvZmY7XG4gICAgICAgICAgICB9IGVsc2Ugb2ZmID0gc3Qub1swXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsbDsgKytpKSB7XG4gICAgICAgICAgICBidWZbb3VidCArIGldID0gYnVmW3NwbCArIGldO1xuICAgICAgICAgIH1cbiAgICAgICAgICAob3VidCArPSBsbCksIChzcGwgKz0gbGwpO1xuICAgICAgICAgIHZhciBzdGluID0gb3VidCAtIG9mZjtcbiAgICAgICAgICBpZiAoc3RpbiA8IDApIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSAtc3RpbjtcbiAgICAgICAgICAgIHZhciBicyA9IHN0LmUgKyBzdGluO1xuICAgICAgICAgICAgaWYgKGxlbiA+IG1sKSBsZW4gPSBtbDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgYnVmW291YnQgKyBpXSA9IHN0LndbYnMgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChvdWJ0ICs9IGxlbiksIChtbCAtPSBsZW4pLCAoc3RpbiA9IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1sOyArK2kpIHtcbiAgICAgICAgICAgIGJ1ZltvdWJ0ICsgaV0gPSBidWZbc3RpbiArIGldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdWJ0ICs9IG1sO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdWJ0ICE9PSBzcGwpIHtcbiAgICAgICAgICB3aGlsZSAoc3BsIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgYnVmW291YnQrK10gPSBidWZbc3BsKytdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIG91YnQgPSBidWYubGVuZ3RoO1xuICAgICAgICBpZiAob3V0KSBzdC55ICs9IG91YnQ7XG4gICAgICAgIGVsc2UgYnVmID0gc2xjKGJ1ZiwgMCwgb3VidCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgc3QueSArPSBsc3M7XG4gICAgICAgICAgaWYgKHNwbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsc3M7ICsraSkge1xuICAgICAgICAgICAgICBidWZbaV0gPSBidWZbc3BsICsgaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNwbCkgYnVmID0gc2xjKGJ1Ziwgc3BsKTtcbiAgICAgIH1cbiAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICBlcnIoMik7XG4gIH07XG4gIC8vIGNvbmNhdFxuICB2YXIgY2N0ID0gZnVuY3Rpb24gKGJ1ZnMsIG9sKSB7XG4gICAgaWYgKGJ1ZnMubGVuZ3RoID09PSAxKSByZXR1cm4gYnVmc1swXTtcbiAgICB2YXIgYnVmID0gbmV3IHU4KG9sKTtcbiAgICBmb3IgKHZhciBpID0gMCwgYiA9IDA7IGkgPCBidWZzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY2hrID0gYnVmc1tpXTtcbiAgICAgIGJ1Zi5zZXQoY2hrLCBiKTtcbiAgICAgIGIgKz0gY2hrLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfTtcbiAgLyoqXG4gICAqIERlY29tcHJlc3NlcyBac3RhbmRhcmQgZGF0YVxuICAgKiBAcGFyYW0gZGF0IFRoZSBpbnB1dCBkYXRhXG4gICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBidWZmZXIuIElmIHVuc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZVxuICAgKiAgICAgICAgICAgIGV4YWN0bHkgZW5vdWdoIG1lbW9yeSB0byBmaXQgdGhlIGRlY29tcHJlc3NlZCBkYXRhLiBJZiB5b3VyXG4gICAqICAgICAgICAgICAgZGF0YSBoYXMgbXVsdGlwbGUgZnJhbWVzIGFuZCB5b3Uga25vdyB0aGUgb3V0cHV0IHNpemUsIHNwZWNpZnlpbmdcbiAgICogICAgICAgICAgICBpdCB3aWxsIHlpZWxkIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBkYXRhXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb21wcmVzcyhkYXQsIGJ1Zikge1xuICAgIHZhciBidCA9IDAsXG4gICAgICBidWZzID0gW10sXG4gICAgICBuYiA9ICshYnVmLFxuICAgICAgb2wgPSAwO1xuICAgIHdoaWxlIChkYXQubGVuZ3RoKSB7XG4gICAgICB2YXIgc3QgPSByemZoKGRhdCwgbmIgfHwgYnVmKTtcbiAgICAgIGlmICh0eXBlb2Ygc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKG5iKSB7XG4gICAgICAgICAgYnVmID0gbnVsbDtcbiAgICAgICAgICBpZiAoc3Qudy5sZW5ndGggPT09IHN0LnUpIHtcbiAgICAgICAgICAgIGJ1ZnMucHVzaCgoYnVmID0gc3QudykpO1xuICAgICAgICAgICAgb2wgKz0gc3QudTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmcy5wdXNoKGJ1Zik7XG4gICAgICAgICAgc3QuZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCFzdC5sKSB7XG4gICAgICAgICAgdmFyIGJsayA9IHJ6YihkYXQsIHN0LCBidWYpO1xuICAgICAgICAgIGlmICghYmxrKSBlcnIoNSk7XG4gICAgICAgICAgaWYgKGJ1Zikgc3QuZSA9IHN0Lnk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZzLnB1c2goYmxrKTtcbiAgICAgICAgICAgIG9sICs9IGJsay5sZW5ndGg7XG4gICAgICAgICAgICBjcHcoc3QudywgMCwgYmxrLmxlbmd0aCk7XG4gICAgICAgICAgICBzdC53LnNldChibGssIHN0LncubGVuZ3RoIC0gYmxrLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ0ID0gc3QuYiArIHN0LmMgKiA0O1xuICAgICAgfSBlbHNlIGJ0ID0gc3Q7XG4gICAgICBkYXQgPSBkYXQuc3ViYXJyYXkoYnQpO1xuICAgIH1cbiAgICByZXR1cm4gY2N0KGJ1ZnMsIG9sKTtcbiAgfTtcbn0pKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGVjb21wcmVzc19pbnB1dFxuLy9WZXJzaW9uOiA8IDUuMS4wXG52YXIgY2FtbF9kZWNvbXByZXNzX2lucHV0ID0gbnVsbDtcblxuLy9Qcm92aWRlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1ZlcnNpb246ID49IDUuMS4wXG4vL1ZlcnNpb246IDwgNS4xLjFcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xudmFyIGNhbWxfZGVjb21wcmVzc19pbnB1dCA9IHpzdGRfZGVjb21wcmVzcztcblxuLy9Qcm92aWRlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1ZlcnNpb246ID49IDUuMS4xXG4vL1ZlcnNpb246IDwgNS4yLjBcbnZhciBjYW1sX2RlY29tcHJlc3NfaW5wdXQgPSBudWxsO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2RlY29tcHJlc3NfaW5wdXRcbi8vVmVyc2lvbjogPj0gNS4yXG4vL1JlcXVpcmVzOiB6c3RkX2RlY29tcHJlc3NcbnZhciBjYW1sX2RlY29tcHJlc3NfaW5wdXQgPSB6c3RkX2RlY29tcHJlc3M7XG5cbi8vUHJvdmlkZXM6IGNhbWxfenN0ZF9pbml0aWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2RlY29tcHJlc3NfaW5wdXRcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xuLy9WZXJzaW9uOiA+PSA1LjEuMVxuZnVuY3Rpb24gY2FtbF96c3RkX2luaXRpYWxpemUoX3VuaXQpIHtcbiAgY2FtbF9kZWNvbXByZXNzX2lucHV0ID0genN0ZF9kZWNvbXByZXNzO1xuICByZXR1cm4gMTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBXZWFrIEFQSVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxudmFyIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ID0gMztcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG52YXIgY2FtbF9lcGhlX2RhdGFfb2Zmc2V0ID0gMjtcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX25vbmVcbnZhciBjYW1sX2VwaGVfbm9uZSA9IHsgY2FtbF9lcGhlX25vbmU6IDAgfTtcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3NldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfZGF0YV9vcHRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9zZXRfa2V5KHgsIGksIHYpIHtcbiAgdmFyIG9sZCA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB2IGluc3RhbmNlb2YgT2JqZWN0KSB2ID0gbmV3IGdsb2JhbFRoaXMuV2Vha1JlZih2KTtcbiAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gdjtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdCh4LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3Vuc2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX25vbmVcbmZ1bmN0aW9uIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSkge1xuICB2YXIgb2xkID0gY2FtbF9lcGhlX2dldF9kYXRhKHgpO1xuICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdCh4LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF93ZWFrX2NyZWF0ZVxuZnVuY3Rpb24gY2FtbF9lcGhlX2NyZWF0ZShuKSB7XG4gIHJldHVybiBjYW1sX3dlYWtfY3JlYXRlKG4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX25vbmVcbmZ1bmN0aW9uIGNhbWxfd2Vha19jcmVhdGUobikge1xuICB2YXIgYWxlbiA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgbjtcbiAgdmFyIHggPSBuZXcgQXJyYXkoYWxlbik7XG4gIHhbMF0gPSAyNTE7XG4gIHhbMV0gPSBcImNhbWxfZXBoZV9saXN0X2hlYWRcIjtcbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhbGVuOyBpKyspIHtcbiAgICB4W2ldID0gY2FtbF9lcGhlX25vbmU7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfa2V5LCBjYW1sX2VwaGVfdW5zZXRfa2V5XG5mdW5jdGlvbiBjYW1sX3dlYWtfc2V0KHgsIGksIHYpIHtcbiAgaWYgKHYgPT09IDApIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9rZXkoeCwgaSwgdlsxXSk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG4vL0FsaWFzOiBjYW1sX3dlYWtfZ2V0XG5cbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfa2V5KHgsIGkpIHtcbiAgdmFyIHdlYWsgPSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV07XG4gIGlmICh3ZWFrID09PSBjYW1sX2VwaGVfbm9uZSkgcmV0dXJuIDA7XG4gIGlmIChnbG9iYWxUaGlzLldlYWtSZWYgJiYgd2VhayBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgIHdlYWsgPSB3ZWFrLmRlcmVmKCk7XG4gICAgaWYgKHdlYWsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gY2FtbF9lcGhlX25vbmU7XG4gICAgICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWzAsIHdlYWtdO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlfY29weVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2dldF9rZXksY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuLy9BbGlhczogY2FtbF93ZWFrX2dldF9jb3B5XG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2tleV9jb3B5KHgsIGkpIHtcbiAgdmFyIHkgPSBjYW1sX2VwaGVfZ2V0X2tleSh4LCBpKTtcbiAgaWYgKHkgPT09IDApIHJldHVybiB5O1xuICB2YXIgeiA9IHlbMV07XG4gIGlmIChBcnJheS5pc0FycmF5KHopKSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiB5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfa2V5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG4vL0FsaWFzOiBjYW1sX3dlYWtfY2hlY2tcbmZ1bmN0aW9uIGNhbWxfZXBoZV9jaGVja19rZXkoeCwgaSkge1xuICB2YXIgd2VhayA9IHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXTtcbiAgaWYgKHdlYWsgPT09IGNhbWxfZXBoZV9ub25lKSByZXR1cm4gMDtcbiAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB3ZWFrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgd2VhayA9IHdlYWsuZGVyZWYoKTtcbiAgICBpZiAod2VhayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfYmxpdF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuLy9BbGlhczogY2FtbF93ZWFrX2JsaXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9ibGl0X2tleShhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIHZhciBvbGQgPSBjYW1sX2VwaGVfZ2V0X2RhdGEoYTEpO1xuICAvLyBtaW51cyBvbmUgYmVjYXVzZSBjYW1sX2FycmF5X2JsaXQgd29ya3Mgb24gb2NhbWwgYXJyYXlcbiAgY2FtbF9hcnJheV9ibGl0KFxuICAgIGExLFxuICAgIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTEgLSAxLFxuICAgIGEyLFxuICAgIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTIgLSAxLFxuICAgIGxlbixcbiAgKTtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdChhMiwgb2xkKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9ibGl0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YSwgY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuZnVuY3Rpb24gY2FtbF9lcGhlX2JsaXRfZGF0YShzcmMsIGRzdCkge1xuICB2YXIgb2xkID0gY2FtbF9lcGhlX2dldF9kYXRhKHNyYyk7XG4gIGNhbWxfZXBoZV9zZXRfZGF0YV9vcHQoZHN0LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfbm9uZVxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhKHgpIHtcbiAgdmFyIGRhdGEgPSB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF07XG4gIGlmIChkYXRhID09PSBjYW1sX2VwaGVfbm9uZSkgcmV0dXJuIDA7XG4gIGZvciAodmFyIGkgPSBjYW1sX2VwaGVfa2V5X29mZnNldDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgayA9IHhbaV07XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiBrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICB2YXIgZCA9IGsuZGVyZWYoKTtcbiAgICAgIGlmIChkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeFtpXSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLmdldChrKTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbMCwgZGF0YV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhX2NvcHkoeCkge1xuICB2YXIgciA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKHIgPT09IDApIHJldHVybiAwO1xuICB2YXIgeiA9IHJbMV07XG4gIGlmIChBcnJheS5pc0FycmF5KHopKSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldCwgY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGEoeCwgZGF0YSkge1xuICBmb3IgKHZhciBpID0geC5sZW5ndGggLSAxOyBpID49IGNhbWxfZXBoZV9rZXlfb2Zmc2V0OyBpLS0pIHtcbiAgICB2YXIgayA9IHhbaV07XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiBrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICB2YXIgZCA9IGsuZGVyZWYoKTtcbiAgICAgIGlmIChkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeFtpXSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnbG9iYWxUaGlzLldlYWtNYXApIHtcbiAgICAgICAgZGF0YSA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKS5zZXQoaywgZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGRhdGE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFfb3B0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGFfb3B0KHgsIGRhdGFfb3B0KSB7XG4gIGlmIChkYXRhX29wdCA9PT0gMCkgY2FtbF9lcGhlX3Vuc2V0X2RhdGEoeCk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9kYXRhKHgsIGRhdGFfb3B0WzFdKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG5mdW5jdGlvbiBjYW1sX2VwaGVfdW5zZXRfZGF0YSh4KSB7XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NoZWNrX2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuZnVuY3Rpb24gY2FtbF9lcGhlX2NoZWNrX2RhdGEoeCkge1xuICB2YXIgZGF0YSA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKGRhdGEgPT09IDApIHJldHVybiAwO1xuICBlbHNlIHJldHVybiAxO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9nY19taW5vclxuZnVuY3Rpb24gY2FtbF9nY19taW5vcihfdW5pdCkge1xuICAvL2F2YWlsYWJsZSB3aXRoIFtub2RlIC0tZXhwb3NlLWdjXVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuZ2MgPT09IFwiZnVuY3Rpb25cIikgZ2xvYmFsVGhpcy5nYyh0cnVlKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX21ham9yKF91bml0KSB7XG4gIC8vYXZhaWxhYmxlIHdpdGggW25vZGUgLS1leHBvc2UtZ2NdXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5nYyA9PT0gXCJmdW5jdGlvblwiKSBnbG9iYWxUaGlzLmdjKCk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nY19mdWxsX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX2Z1bGxfbWFqb3IoX3VuaXQpIHtcbiAgLy9hdmFpbGFibGUgd2l0aCBbbm9kZSAtLWV4cG9zZS1nY11cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmdjID09PSBcImZ1bmN0aW9uXCIpIGdsb2JhbFRoaXMuZ2MoKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2NvbXBhY3Rpb25cbmZ1bmN0aW9uIGNhbWxfZ2NfY29tcGFjdGlvbihfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfY291bnRlcnNcbmZ1bmN0aW9uIGNhbWxfZ2NfY291bnRlcnMoX3VuaXQpIHtcbiAgcmV0dXJuIFsyNTQsIDAsIDAsIDBdO1xufVxuLy9Qcm92aWRlczogY2FtbF9nY19xdWlja19zdGF0XG5mdW5jdGlvbiBjYW1sX2djX3F1aWNrX3N0YXQoX3VuaXQpIHtcbiAgcmV0dXJuIFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19zdGF0XG4vL1JlcXVpcmVzOiBjYW1sX2djX3F1aWNrX3N0YXRcbmZ1bmN0aW9uIGNhbWxfZ2Nfc3RhdCh1bml0KSB7XG4gIHJldHVybiBjYW1sX2djX3F1aWNrX3N0YXQodW5pdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2Nfc2V0XG5mdW5jdGlvbiBjYW1sX2djX3NldChfY29udHJvbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19nZXRcbmZ1bmN0aW9uIGNhbWxfZ2NfZ2V0KF91bml0KSB7XG4gIHJldHVybiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVnaXN0ZXIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXIoX2YsIF94KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlXG52YXIgYWxsX2ZpbmFsaXplcnMgPSBuZXcgZ2xvYmFsVGhpcy5TZXQoKTtcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWUoY2IsIGEpIHtcbiAgaWYgKGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgYSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHZhciB4ID0gbmV3IGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHgpIHtcbiAgICAgIGFsbF9maW5hbGl6ZXJzLmRlbGV0ZSh4KTtcbiAgICAgIGNiKDApO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICAgIHgucmVnaXN0ZXIoYSwgeCk7XG4gICAgYWxsX2ZpbmFsaXplcnMuYWRkKHgpO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlbGVhc2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVsZWFzZShfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0YXJ0XG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc3RhcnQoX3JhdGUsIF9zdGFja19zaXplLCBfdHJhY2tlcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0b3BcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zdG9wKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21lbXByb2ZfZGlzY2FyZFxuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9kaXNjYXJkKF90KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V2ZW50bG9nX3Jlc3VtZVxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9ldmVudGxvZ19yZXN1bWUoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcGF1c2Vcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfZXZlbnRsb2dfcGF1c2UoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9nY19odWdlX2ZhbGxiYWNrX2NvdW50KF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yX3NsaWNlXG5mdW5jdGlvbiBjYW1sX2djX21ham9yX3NsaWNlKF93b3JrKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21pbm9yX3dvcmRzXG5mdW5jdGlvbiBjYW1sX2djX21pbm9yX3dvcmRzKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9taW5vcl9mcmVlXG5mdW5jdGlvbiBjYW1sX2dldF9taW5vcl9mcmVlKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9tYWpvcl9idWNrZXRcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfZ2V0X21ham9yX2J1Y2tldChfbikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWFqb3JfY3JlZGl0XG4vL1ZlcnNpb246IDwgNS4wXG5mdW5jdGlvbiBjYW1sX2dldF9tYWpvcl9jcmVkaXQoX24pIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEZvcm1hdFxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2Zvcm1hdFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpIHtcbiAgZm10ID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhmbXQpO1xuICB2YXIgbGVuID0gZm10Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IDMxKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJmb3JtYXRfaW50OiBmb3JtYXQgdG9vIGxvbmdcIik7XG4gIHZhciBmID0ge1xuICAgIGp1c3RpZnk6IFwiK1wiLFxuICAgIHNpZ25zdHlsZTogXCItXCIsXG4gICAgZmlsbGVyOiBcIiBcIixcbiAgICBhbHRlcm5hdGU6IGZhbHNlLFxuICAgIGJhc2U6IDAsXG4gICAgc2lnbmVkY29udjogZmFsc2UsXG4gICAgd2lkdGg6IDAsXG4gICAgdXBwZXJjYXNlOiBmYWxzZSxcbiAgICBzaWduOiAxLFxuICAgIHByZWM6IC0xLFxuICAgIGNvbnY6IFwiZlwiLFxuICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuICAgIHN3aXRjaCAoYykge1xuICAgICAgY2FzZSBcIi1cIjpcbiAgICAgICAgZi5qdXN0aWZ5ID0gXCItXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIitcIjpcbiAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGYuc2lnbnN0eWxlID0gYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOlxuICAgICAgICBmLmZpbGxlciA9IFwiMFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIjXCI6XG4gICAgICAgIGYuYWx0ZXJuYXRlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMVwiOlxuICAgICAgY2FzZSBcIjJcIjpcbiAgICAgIGNhc2UgXCIzXCI6XG4gICAgICBjYXNlIFwiNFwiOlxuICAgICAgY2FzZSBcIjVcIjpcbiAgICAgIGNhc2UgXCI2XCI6XG4gICAgICBjYXNlIFwiN1wiOlxuICAgICAgY2FzZSBcIjhcIjpcbiAgICAgIGNhc2UgXCI5XCI6XG4gICAgICAgIGYud2lkdGggPSAwO1xuICAgICAgICB3aGlsZSAoKChjID0gZm10LmNoYXJDb2RlQXQoaSkgLSA0OCksIGMgPj0gMCAmJiBjIDw9IDkpKSB7XG4gICAgICAgICAgZi53aWR0aCA9IGYud2lkdGggKiAxMCArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGktLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiLlwiOlxuICAgICAgICBmLnByZWMgPSAwO1xuICAgICAgICBpKys7XG4gICAgICAgIHdoaWxlICgoKGMgPSBmbXQuY2hhckNvZGVBdChpKSAtIDQ4KSwgYyA+PSAwICYmIGMgPD0gOSkpIHtcbiAgICAgICAgICBmLnByZWMgPSBmLnByZWMgKiAxMCArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGktLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTtcbiAgICAgICAgZi5iYXNlID0gMTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgZi5iYXNlID0gMTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgZi5iYXNlID0gMTY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgZi5iYXNlID0gMTY7XG4gICAgICAgIGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICBmLmJhc2UgPSA4O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlXCI6XG4gICAgICBjYXNlIFwiZlwiOlxuICAgICAgY2FzZSBcImdcIjpcbiAgICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTtcbiAgICAgICAgZi5jb252ID0gYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcIkZcIjpcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7XG4gICAgICAgIGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgICAgZi5jb252ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcmF3YnVmZmVyKSB7XG4gIGlmIChmLnVwcGVyY2FzZSkgcmF3YnVmZmVyID0gcmF3YnVmZmVyLnRvVXBwZXJDYXNlKCk7XG4gIHZhciBsZW4gPSByYXdidWZmZXIubGVuZ3RoO1xuICAvKiBBZGp1c3QgbGVuIHRvIHJlZmxlY3QgYWRkaXRpb25hbCBjaGFycyAoc2lnbiwgZXRjKSAqL1xuICBpZiAoZi5zaWduZWRjb252ICYmIChmLnNpZ24gPCAwIHx8IGYuc2lnbnN0eWxlICE9PSBcIi1cIikpIGxlbisrO1xuICBpZiAoZi5hbHRlcm5hdGUpIHtcbiAgICBpZiAoZi5iYXNlID09PSA4KSBsZW4gKz0gMTtcbiAgICBpZiAoZi5iYXNlID09PSAxNikgbGVuICs9IDI7XG4gIH1cbiAgLyogRG8gdGhlIGZvcm1hdHRpbmcgKi9cbiAgdmFyIGJ1ZmZlciA9IFwiXCI7XG4gIGlmIChmLmp1c3RpZnkgPT09IFwiK1wiICYmIGYuZmlsbGVyID09PSBcIiBcIilcbiAgICBmb3IgKHZhciBpID0gbGVuOyBpIDwgZi53aWR0aDsgaSsrKSBidWZmZXIgKz0gXCIgXCI7XG4gIGlmIChmLnNpZ25lZGNvbnYpIHtcbiAgICBpZiAoZi5zaWduIDwgMCkgYnVmZmVyICs9IFwiLVwiO1xuICAgIGVsc2UgaWYgKGYuc2lnbnN0eWxlICE9PSBcIi1cIikgYnVmZmVyICs9IGYuc2lnbnN0eWxlO1xuICB9XG4gIGlmIChmLmFsdGVybmF0ZSAmJiBmLmJhc2UgPT09IDgpIGJ1ZmZlciArPSBcIjBcIjtcbiAgaWYgKGYuYWx0ZXJuYXRlICYmIGYuYmFzZSA9PT0gMTYpIGJ1ZmZlciArPSBmLnVwcGVyY2FzZSA/IFwiMFhcIiA6IFwiMHhcIjtcbiAgaWYgKGYuanVzdGlmeSA9PT0gXCIrXCIgJiYgZi5maWxsZXIgPT09IFwiMFwiKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSBcIjBcIjtcbiAgYnVmZmVyICs9IHJhd2J1ZmZlcjtcbiAgaWYgKGYuanVzdGlmeSA9PT0gXCItXCIpIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSBcIiBcIjtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoYnVmZmVyKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcblxuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVcbnZhciBjYW1sX2dyX3N0YXRlO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZVxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2dldCgpIHtcbiAgaWYgKGNhbWxfZ3Jfc3RhdGUpIHtcbiAgICByZXR1cm4gY2FtbF9ncl9zdGF0ZTtcbiAgfVxuICB0aHJvdyBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoW1xuICAgIDAsXG4gICAgY2FtbF9uYW1lZF92YWx1ZShcIkdyYXBoaWNzLkdyYXBoaWNfZmFpbHVyZVwiKSxcbiAgICBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiTm90IGluaXRpYWxpemVkXCIpLFxuICBdKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlLGNhbWxfZ3Jfc3RhdGVfaW5pdFxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9zZXQoY3R4KSB7XG4gIGNhbWxfZ3Jfc3RhdGUgPSBjdHg7XG4gIGNhbWxfZ3Jfc3RhdGVfaW5pdCgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9vcGVuX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fZ3JhcGgoaW5mbykge1xuICB2YXIgaW5mbyA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKGluZm8pO1xuICBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIHZhciByZXMgPSBpbmZvLm1hdGNoKFwiKF58LCkgKlwiICsgbmFtZSArIFwiICo9ICooW2EtekEtWjAtOV9dKykgKigsfCQpXCIpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXNbMl07XG4gIH1cbiAgdmFyIHNwZWNzID0gW107XG4gIGlmICghKGluZm8gPT09IFwiXCIpKSBzcGVjcy5wdXNoKGluZm8pO1xuICB2YXIgdGFyZ2V0ID0gZ2V0KFwidGFyZ2V0XCIpO1xuICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0gXCJcIjtcbiAgdmFyIHN0YXR1cyA9IGdldChcInN0YXR1c1wiKTtcbiAgaWYgKCFzdGF0dXMpIHNwZWNzLnB1c2goXCJzdGF0dXM9MVwiKTtcblxuICB2YXIgdyA9IGdldChcIndpZHRoXCIpO1xuICB3ID0gdyA/IE51bWJlci5wYXJzZUludCh3KSA6IDIwMDtcbiAgc3BlY3MucHVzaChcIndpZHRoPVwiICsgdyk7XG5cbiAgdmFyIGggPSBnZXQoXCJoZWlnaHRcIik7XG4gIGggPSBoID8gTnVtYmVyLnBhcnNlSW50KGgpIDogMjAwO1xuICBzcGVjcy5wdXNoKFwiaGVpZ2h0PVwiICsgaCk7XG5cbiAgdmFyIHdpbiA9IGdsb2JhbFRoaXMub3BlbihcImFib3V0OmJsYW5rXCIsIHRhcmdldCwgc3BlY3Muam9pbihcIixcIikpO1xuICBpZiAoIXdpbikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJHcmFwaGljcy5vcGVuX2dyYXBoOiBjYW5ub3Qgb3BlbiB0aGUgd2luZG93XCIpO1xuICB9XG4gIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gIHZhciBjYW52YXMgPSBkb2MuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gdztcbiAgY2FudmFzLmhlaWdodCA9IGg7XG4gIHZhciBjdHggPSBjYW1sX2dyX3N0YXRlX2NyZWF0ZShjYW52YXMsIHcsIGgpO1xuICBjdHguc2V0X3RpdGxlID0gZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgZG9jLnRpdGxlID0gdGl0bGU7XG4gIH07XG4gIGNhbWxfZ3Jfc3RhdGVfc2V0KGN0eCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIGJvZHkuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcbiAgYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9pbml0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3NldF9jb2xvcixjYW1sX2dyX21vdmV0byxjYW1sX2dyX3Jlc2l6ZV93aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgsY2FtbF9ncl9zZXRfdGV4dF9zaXplLGNhbWxfZ3Jfc2V0X2ZvbnRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9pbml0KCkge1xuICBjYW1sX2dyX21vdmV0byhjYW1sX2dyX3N0YXRlLngsIGNhbWxfZ3Jfc3RhdGUueSk7XG4gIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyhjYW1sX2dyX3N0YXRlLndpZHRoLCBjYW1sX2dyX3N0YXRlLmhlaWdodCk7XG4gIGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgoY2FtbF9ncl9zdGF0ZS5saW5lX3dpZHRoKTtcbiAgY2FtbF9ncl9zZXRfdGV4dF9zaXplKGNhbWxfZ3Jfc3RhdGUudGV4dF9zaXplKTtcbiAgY2FtbF9ncl9zZXRfZm9udChjYW1sX2dyX3N0YXRlLmZvbnQpO1xuICBjYW1sX2dyX3NldF9jb2xvcihjYW1sX2dyX3N0YXRlLmNvbG9yKTtcbiAgY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlKGNhbWxfZ3Jfc3RhdGUudGl0bGUpO1xuICAvL2NhbWxfZ3JfcmVzaXplX3dpbmRvdyBtaWdodCByZXNldCBzb21lIGNhbnZhcycgcHJvcGVydGllc1xuICBjYW1sX2dyX3N0YXRlLmNvbnRleHQudGV4dEJhc2VsaW5lID0gXCJib3R0b21cIjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfY3JlYXRlKGNhbnZhcywgdywgaCkge1xuICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHcsXG4gICAgaGVpZ2h0OiBoLFxuICAgIGxpbmVfd2lkdGg6IDEsXG4gICAgZm9udDogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcImZpeGVkXCIpLFxuICAgIHRleHRfc2l6ZTogMjYsXG4gICAgY29sb3I6IDB4MDAwMDAwLFxuICAgIHRpdGxlOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpLFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RvY19vZl9zdGF0ZVxuZnVuY3Rpb24gY2FtbF9ncl9kb2Nfb2Zfc3RhdGUoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmNhbnZhcy5vd25lckRvY3VtZW50KSByZXR1cm4gc3RhdGUuY2FudmFzLm93bmVyRG9jdW1lbnQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xvc2VfZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2Nsb3NlX2dyYXBoKCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY2FudmFzLndpZHRoID0gMDtcbiAgcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUobmFtZSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMudGl0bGUgPSBuYW1lO1xuICB2YXIganNuYW1lID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIGlmIChzLnNldF90aXRsZSkgcy5zZXRfdGl0bGUoanNuYW1lKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcmVzaXplX3dpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyh3LCBoKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy53aWR0aCA9IHc7XG4gIHMuaGVpZ2h0ID0gaDtcbiAgaWYgKHcgIT09IHMuY2FudmFzLndpZHRoKSBzLmNhbnZhcy53aWR0aCA9IHc7XG4gIGlmIChoICE9PSBzLmNhbnZhcy5oZWlnaHQpIHMuY2FudmFzLmhlaWdodCA9IGg7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2NsZWFyX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jbGVhcl9ncmFwaCgpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHMuY2FudmFzLndpZHRoLCBzLmNhbnZhcy5oZWlnaHQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zaXplX3hcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NpemVfeCgpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy53aWR0aDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3koKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMuaGVpZ2h0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2NvbG9yKGNvbG9yKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgZnVuY3Rpb24gY29udmVydChudW1iZXIpIHtcbiAgICB2YXIgc3RyID0gXCJcIiArIG51bWJlci50b1N0cmluZygxNik7XG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCAyKSBzdHIgPSBcIjBcIiArIHN0cjtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHZhciByID0gKGNvbG9yID4+IDE2KSAmIDB4ZmYsXG4gICAgZyA9IChjb2xvciA+PiA4KSAmIDB4ZmYsXG4gICAgYiA9IChjb2xvciA+PiAwKSAmIDB4ZmY7XG4gIHMuY29sb3IgPSBjb2xvcjtcbiAgdmFyIGNfc3RyID0gXCIjXCIgKyBjb252ZXJ0KHIpICsgY29udmVydChnKSArIGNvbnZlcnQoYik7XG4gIHMuY29udGV4dC5maWxsU3R5bGUgPSBjX3N0cjtcbiAgcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gY19zdHI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9wbG90XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9wbG90KHgsIHkpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW0gPSBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKDEsIDEpO1xuICB2YXIgZCA9IGltLmRhdGE7XG4gIHZhciBjb2xvciA9IHMuY29sb3I7XG4gIGRbMF0gPSAoY29sb3IgPj4gMTYpICYgMHhmZjsgLy9yXG4gIChkWzFdID1cbiAgICAoY29sb3IgPj4gOCkgJlxuICAgIDB4ZmYpLCAvL2dcbiAgICAoZFsyXSA9IChjb2xvciA+PiAwKSAmIDB4ZmYpOyAvL2JcbiAgZFszXSA9IDB4ZmY7IC8vYVxuICBzLnggPSB4O1xuICBzLnkgPSB5O1xuICBzLmNvbnRleHQucHV0SW1hZ2VEYXRhKGltLCB4LCBzLmhlaWdodCAtIHkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9wb2ludF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcG9pbnRfY29sb3IoeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbSA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoeCwgcy5oZWlnaHQgLSB5LCAxLCAxKTtcbiAgdmFyIGQgPSBpbS5kYXRhO1xuICByZXR1cm4gKGRbMF0gPDwgMTYpICsgKGRbMV0gPDwgOCkgKyBkWzJdO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9tb3ZldG9cbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX21vdmV0byh4LCB5KSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy54ID0geDtcbiAgcy55ID0geTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF94XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3goKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3koKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfbGluZXRvXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9saW5ldG8oeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgcy5jb250ZXh0Lm1vdmVUbyhzLngsIHMuaGVpZ2h0IC0gcy55KTtcbiAgcy5jb250ZXh0LmxpbmVUbyh4LCBzLmhlaWdodCAtIHkpO1xuICBzLmNvbnRleHQuc3Ryb2tlKCk7XG4gIHMueCA9IHg7XG4gIHMueSA9IHk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X3JlY3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfcmVjdCh4LCB5LCB3LCBoKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LnN0cm9rZVJlY3QoeCwgcy5oZWlnaHQgLSB5LCB3LCAtaCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2FyY19hdXhcbmZ1bmN0aW9uIGNhbWxfZ3JfYXJjX2F1eChjdHgsIGN4LCBjeSwgcnksIHJ4LCBhMSwgYTIpIHtcbiAgd2hpbGUgKGExID4gYTIpIGEyICs9IDM2MDtcbiAgYTEgLz0gMTgwO1xuICBhMiAvPSAxODA7XG4gIHZhciByb3QgPSAwLFxuICAgIHhQb3MsXG4gICAgeVBvcyxcbiAgICB4UG9zX3ByZXYsXG4gICAgeVBvc19wcmV2O1xuICB2YXIgc3BhY2UgPSAyO1xuICB2YXIgbnVtID0gKCgoYTIgLSBhMSkgKiBNYXRoLlBJICogKChyeCArIHJ5KSAvIDIpKSAvIHNwYWNlKSB8IDA7XG4gIHZhciBkZWx0YSA9ICgoYTIgLSBhMSkgKiBNYXRoLlBJKSAvIG51bTtcbiAgdmFyIGkgPSBhMSAqIE1hdGguUEk7XG4gIGZvciAodmFyIGogPSAwOyBqIDw9IG51bTsgaisrKSB7XG4gICAgeFBvcyA9XG4gICAgICBjeCAtXG4gICAgICByeCAqIE1hdGguc2luKGkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgK1xuICAgICAgcnkgKiBNYXRoLmNvcyhpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHhQb3MgPSB4UG9zLnRvRml4ZWQoMik7XG4gICAgeVBvcyA9XG4gICAgICBjeSArXG4gICAgICByeSAqIE1hdGguY29zKGkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgK1xuICAgICAgcnggKiBNYXRoLnNpbihpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHlQb3MgPSB5UG9zLnRvRml4ZWQoMik7XG4gICAgaWYgKGogPT09IDApIHtcbiAgICAgIGN0eC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgfSBlbHNlIGlmICh4UG9zX3ByZXYgIT09IHhQb3MgfHwgeVBvc19wcmV2ICE9PSB5UG9zKSB7XG4gICAgICBjdHgubGluZVRvKHhQb3MsIHlQb3MpO1xuICAgIH1cbiAgICB4UG9zX3ByZXYgPSB4UG9zO1xuICAgIHlQb3NfcHJldiA9IHlQb3M7XG4gICAgaSAtPSBkZWx0YTsgLy9jY3dcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2FyYyh4LCB5LCByeCwgcnksIGExLCBhMikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCwgeCwgcy5oZWlnaHQgLSB5LCByeCwgcnksIGExLCBhMik7XG4gIHMuY29udGV4dC5zdHJva2UoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9saW5lX3dpZHRoKHcpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmxpbmVfd2lkdGggPSB3O1xuICBzLmNvbnRleHQubGluZVdpZHRoID0gdztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZmlsbF9yZWN0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX3JlY3QoeCwgeSwgdywgaCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5maWxsUmVjdCh4LCBzLmhlaWdodCAtIHksIHcsIC1oKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcG9seVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9wb2x5KGFyKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBzLmNvbnRleHQubW92ZVRvKGFyWzFdWzFdLCBzLmhlaWdodCAtIGFyWzFdWzJdKTtcbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhci5sZW5ndGg7IGkrKylcbiAgICBzLmNvbnRleHQubGluZVRvKGFyW2ldWzFdLCBzLmhlaWdodCAtIGFyW2ldWzJdKTtcbiAgcy5jb250ZXh0LmxpbmVUbyhhclsxXVsxXSwgcy5oZWlnaHQgLSBhclsxXVsyXSk7XG4gIHMuY29udGV4dC5maWxsKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfYXJjXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldCwgY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2ZpbGxfYXJjKHgsIHksIHJ4LCByeSwgYTEsIGEyKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjYW1sX2dyX2FyY19hdXgocy5jb250ZXh0LCB4LCBzLmhlaWdodCAtIHksIHJ4LCByeSwgYTEsIGEyKTtcbiAgcy5jb250ZXh0LmZpbGwoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyKHN0cikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBtID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KHN0cik7XG4gIHZhciBkeCA9IG0ud2lkdGg7XG4gIHMuY29udGV4dC5maWxsVGV4dChzdHIsIHMueCwgcy5oZWlnaHQgLSBzLnkpO1xuICBzLnggKz0gZHggfCAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19jaGFyKGMpIHtcbiAgY2FtbF9ncl9kcmF3X3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyaW5nKHN0cikge1xuICBjYW1sX2dyX2RyYXdfc3RyKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN0cikpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfZm9udFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF9mb250KGYpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmZvbnQgPSBmO1xuICBzLmNvbnRleHQuZm9udCA9IHMudGV4dF9zaXplICsgXCJweCBcIiArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMuZm9udCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF90ZXh0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9zZXRfdGV4dF9zaXplKHNpemUpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLnRleHRfc2l6ZSA9IHNpemU7XG4gIHMuY29udGV4dC5mb250ID0gcy50ZXh0X3NpemUgKyBcInB4IFwiICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocy5mb250KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3JfdGV4dF9zaXplKHR4dCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciB3ID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHR4dCkpLndpZHRoO1xuICByZXR1cm4gWzAsIHcsIHMudGV4dF9zaXplXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9tYWtlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9tYWtlX2ltYWdlKGFycikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBoID0gYXJyLmxlbmd0aCAtIDE7XG4gIHZhciB3ID0gYXJyWzFdLmxlbmd0aCAtIDE7XG4gIHZhciBpbSA9IHMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEodywgaCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB3OyBqKyspIHtcbiAgICAgIHZhciBjID0gYXJyW2kgKyAxXVtqICsgMV07XG4gICAgICB2YXIgbyA9IGkgKiAodyAqIDQpICsgaiAqIDQ7XG4gICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDJdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAoYyA+PiAxNikgJiAweGZmO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IChjID4+IDgpICYgMHhmZjtcbiAgICAgICAgaW0uZGF0YVtvICsgMl0gPSAoYyA+PiAwKSAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGltO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kdW1wX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kdW1wX2ltYWdlKGltKSB7XG4gIHZhciBkYXRhID0gWzBdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltLmhlaWdodDsgaSsrKSB7XG4gICAgZGF0YVtpICsgMV0gPSBbMF07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbS53aWR0aDsgaisrKSB7XG4gICAgICB2YXIgbyA9IGkgKiAoaW0ud2lkdGggKiA0KSArIGogKiA0LFxuICAgICAgICByID0gaW0uZGF0YVtvICsgMF0sXG4gICAgICAgIGcgPSBpbS5kYXRhW28gKyAxXSxcbiAgICAgICAgYiA9IGltLmRhdGFbbyArIDJdO1xuICAgICAgZGF0YVtpICsgMV1baiArIDFdID0gKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19pbWFnZShpbSwgeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIGlmICghaW0uaW1hZ2UpIHtcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSBzLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBzLmhlaWdodDtcbiAgICBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLnB1dEltYWdlRGF0YShpbSwgMCwgMCk7XG4gICAgdmFyIGltYWdlID0gbmV3IGdsb2JhbFRoaXMuSW1hZ2UoKTtcbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzLmNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCB4LCBzLmhlaWdodCAtIGltLmhlaWdodCAtIHkpO1xuICAgICAgaW0uaW1hZ2UgPSBpbWFnZTtcbiAgICB9O1xuICAgIGltYWdlLnNyYyA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG4gIH0gZWxzZSB7XG4gICAgcy5jb250ZXh0LmRyYXdJbWFnZShpbS5pbWFnZSwgeCwgcy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3JlYXRlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jcmVhdGVfaW1hZ2UoeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHgsIHkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9ibGl0X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9ibGl0X2ltYWdlKGltLCB4LCB5KSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltMiA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoXG4gICAgeCxcbiAgICBzLmhlaWdodCAtIGltLmhlaWdodCAtIHksXG4gICAgaW0ud2lkdGgsXG4gICAgaW0uaGVpZ2h0LFxuICApO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltMi5kYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgaW0uZGF0YVtpXSA9IGltMi5kYXRhW2ldO1xuICAgIGltLmRhdGFbaSArIDFdID0gaW0yLmRhdGFbaSArIDFdO1xuICAgIGltLmRhdGFbaSArIDJdID0gaW0yLmRhdGFbaSArIDJdO1xuICAgIGltLmRhdGFbaSArIDNdID0gaW0yLmRhdGFbaSArIDNdO1xuICB9XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19oYW5kbGVyXG5mdW5jdGlvbiBjYW1sX2dyX3NpZ2lvX2hhbmRsZXIoKSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19zaWduYWxcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2lnaW9fc2lnbmFsKCkge1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2FpdF9ldmVudFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93YWl0X2V2ZW50KF9ldmwpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfd2FpdF9ldmVudCBub3QgSW1wbGVtZW50ZWQ6IHVzZSBHcmFwaGljc19qcyBpbnN0ZWFkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N5bmNocm9uaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3N5bmNocm9uaXplKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9zeW5jaHJvbml6ZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3JlbWVtYmVyX21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVtZW1iZXJfbW9kZSgpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3JfcmVtZW1iZXJfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Rpc3BsYXlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9kaXNwbGF5X21vZGUoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Rpc3BsYXlfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2luZG93X2lkXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3dpbmRvd19pZChfYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93aW5kb3dfaWQgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX29wZW5fc3Vid2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fc3Vid2luZG93KF9hLCBfYiwgX2MsIF9kKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX29wZW5fc3Vid2luZG93IG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93KF9hKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Nsb3NlX3N1YndpbmRvdyBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWI6IGNvZGUgc3BlY2lmaWMgdG8gSnNfb2Zfb2NhbWxcblxuLy9Qcm92aWRlczogY2FtbF9qc19odG1sX2VzY2FwZSBjb25zdCAoY29uc3QpXG52YXIgY2FtbF9qc19yZWdleHBzID0geyBhbXA6IC8mL2csIGx0OiAvPC9nLCBxdW90OiAvXCIvZywgYWxsOiAvWyY8XCJdLyB9O1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VzY2FwZShzKSB7XG4gIGlmICghY2FtbF9qc19yZWdleHBzLmFsbC50ZXN0KHMpKSByZXR1cm4gcztcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMuYW1wLCBcIiZhbXA7XCIpXG4gICAgLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLmx0LCBcIiZsdDtcIilcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMucXVvdCwgXCImcXVvdDtcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaHRtbF9lbnRpdGllc1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VudGl0aWVzKHMpIHtcbiAgdmFyIGVudGl0eSA9IC9eJiM/WzAtOWEtekEtWl0rOyQvO1xuICBpZiAocy5tYXRjaChlbnRpdHkpKSB7XG4gICAgdmFyIHN0cixcbiAgICAgIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICB0ZW1wLmlubmVySFRNTCA9IHM7XG4gICAgc3RyID0gdGVtcC50ZXh0Q29udGVudCB8fCB0ZW1wLmlubmVyVGV4dDtcbiAgICB0ZW1wID0gbnVsbDtcbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZ2V0X2NvbnNvbGUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfZ2V0X2NvbnNvbGUoKSB7XG4gIHZhciBjID0gY29uc29sZTtcbiAgdmFyIG0gPSBbXG4gICAgXCJsb2dcIixcbiAgICBcImRlYnVnXCIsXG4gICAgXCJpbmZvXCIsXG4gICAgXCJ3YXJuXCIsXG4gICAgXCJlcnJvclwiLFxuICAgIFwiYXNzZXJ0XCIsXG4gICAgXCJkaXJcIixcbiAgICBcImRpcnhtbFwiLFxuICAgIFwidHJhY2VcIixcbiAgICBcImdyb3VwXCIsXG4gICAgXCJncm91cENvbGxhcHNlZFwiLFxuICAgIFwiZ3JvdXBFbmRcIixcbiAgICBcInRpbWVcIixcbiAgICBcInRpbWVFbmRcIixcbiAgXTtcbiAgZnVuY3Rpb24gZigpIHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgaWYgKCFjW21baV1dKSBjW21baV1dID0gZjtcbiAgcmV0dXJuIGM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlKF91bml0KSB7XG4gIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FtbF9mYWlsd2l0aChcIkZhaWxlZCB0byBjcmVhdGUgWE1MSHR0cFJlcXVlc3RcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uKGV4bikge1xuICBpZiAoZXhuLmpzX2Vycm9yKSB7XG4gICAgcmV0dXJuIGV4bi5qc19lcnJvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKi9cbi8qICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKi9cbi8qICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2l0aCAgICAgKi9cbi8qICB0aGUgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmlsZSAuLi9MSUNFTlNFLiAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogJElkOiBsZXhpbmcuYyA2MDQ1IDIwMDQtMDEtMDEgMTY6NDI6NDNaIGRvbGlnZXogJCAqL1xuXG4vKiBUaGUgdGFibGUtZHJpdmVuIGF1dG9tYXRvbiBmb3IgbGV4ZXJzIGdlbmVyYXRlZCBieSBjYW1sbGV4LiAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9sZXhfYXJyYXkocykge1xuICBzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKTtcbiAgdmFyIGwgPSBzLmxlbmd0aCAvIDI7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICBhW2ldID0gKChzLmNoYXJDb2RlQXQoMiAqIGkpIHwgKHMuY2hhckNvZGVBdCgyICogaSArIDEpIDw8IDgpKSA8PCAxNikgPj4gMTY7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfbGV4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfbGV4X2VuZ2luZSh0YmwsIHN0YXJ0X3N0YXRlLCBsZXhidWYpIHtcbiAgdmFyIGxleF9idWZmZXIgPSAyO1xuICB2YXIgbGV4X2J1ZmZlcl9sZW4gPSAzO1xuICB2YXIgbGV4X3N0YXJ0X3BvcyA9IDU7XG4gIHZhciBsZXhfY3Vycl9wb3MgPSA2O1xuICB2YXIgbGV4X2xhc3RfcG9zID0gNztcbiAgdmFyIGxleF9sYXN0X2FjdGlvbiA9IDg7XG4gIHZhciBsZXhfZW9mX3JlYWNoZWQgPSA5O1xuICB2YXIgbGV4X2Jhc2UgPSAxO1xuICB2YXIgbGV4X2JhY2t0cmsgPSAyO1xuICB2YXIgbGV4X2RlZmF1bHQgPSAzO1xuICB2YXIgbGV4X3RyYW5zID0gNDtcbiAgdmFyIGxleF9jaGVjayA9IDU7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cblxuICB2YXIgYyxcbiAgICBzdGF0ZSA9IHN0YXJ0X3N0YXRlO1xuXG4gIHZhciBidWZmZXIgPSBsZXhidWZbbGV4X2J1ZmZlcl07XG5cbiAgaWYgKHN0YXRlID49IDApIHtcbiAgICAvKiBGaXJzdCBlbnRyeSAqL1xuICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9zdGFydF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSAtMTtcbiAgfSBlbHNlIHtcbiAgICAvKiBSZWVudHJ5IGFmdGVyIHJlZmlsbCAqL1xuICAgIHN0YXRlID0gLXN0YXRlIC0gMTtcbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgLyogTG9va3VwIGJhc2UgYWRkcmVzcyBvciBhY3Rpb24gbnVtYmVyIGZvciBjdXJyZW50IHN0YXRlICovXG4gICAgdmFyIGJhc2UgPSB0YmwubGV4X2Jhc2Vbc3RhdGVdO1xuICAgIGlmIChiYXNlIDwgMCkgcmV0dXJuIC1iYXNlIC0gMTtcbiAgICAvKiBTZWUgaWYgaXQncyBhIGJhY2t0cmFjayBwb2ludCAqL1xuICAgIHZhciBiYWNrdHJrID0gdGJsLmxleF9iYWNrdHJrW3N0YXRlXTtcbiAgICBpZiAoYmFja3RyayA+PSAwKSB7XG4gICAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSBiYWNrdHJrO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgd2UgbmVlZCBhIHJlZmlsbCAqL1xuICAgIGlmIChsZXhidWZbbGV4X2N1cnJfcG9zXSA+PSBsZXhidWZbbGV4X2J1ZmZlcl9sZW5dKSB7XG4gICAgICBpZiAobGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPT09IDApIHJldHVybiAtc3RhdGUgLSAxO1xuICAgICAgZWxzZSBjID0gMjU2O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBSZWFkIG5leHQgaW5wdXQgY2hhciAqL1xuICAgICAgYyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChidWZmZXIsIGxleGJ1ZltsZXhfY3Vycl9wb3NdKTtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdKys7XG4gICAgfVxuICAgIC8qIERldGVybWluZSBuZXh0IHN0YXRlICovXG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09PSBzdGF0ZSkgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlIHN0YXRlID0gdGJsLmxleF9kZWZhdWx0W3N0YXRlXTtcbiAgICAvKiBJZiBubyB0cmFuc2l0aW9uIG9uIHRoaXMgY2hhciwgcmV0dXJuIHRvIGxhc3QgYmFja3RyYWNrIHBvaW50ICovXG4gICAgaWYgKHN0YXRlIDwgMCkge1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gPSBsZXhidWZbbGV4X2xhc3RfcG9zXTtcbiAgICAgIGlmIChsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9PT0gLTEpIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZSByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogTmV3IGxleGVyIGVuZ2luZSwgd2l0aCBtZW1vcnkgb2YgcG9zaXRpb25zICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX25ld19sZXhfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0XG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fbWVtKHMsIGksIG1lbSwgY3Vycl9wb3MpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBkc3QgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaSsrO1xuICAgIGlmIChkc3QgPT09IDB4ZmYpIHJldHVybjtcbiAgICB2YXIgc3JjID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGkrKztcbiAgICBpZiAoc3JjID09PSAweGZmKSBtZW1bZHN0ICsgMV0gPSBjdXJyX3BvcztcbiAgICBlbHNlIG1lbVtkc3QgKyAxXSA9IG1lbVtzcmMgKyAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fdGFnKHMsIGksIG1lbSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGRzdCA9IHMuY2hhckNvZGVBdChpKTtcbiAgICBpKys7XG4gICAgaWYgKGRzdCA9PT0gMHhmZikgcmV0dXJuO1xuICAgIHZhciBzcmMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaSsrO1xuICAgIGlmIChzcmMgPT09IDB4ZmYpIG1lbVtkc3QgKyAxXSA9IC0xO1xuICAgIGVsc2UgbWVtW2RzdCArIDFdID0gbWVtW3NyYyArIDFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbWxfbmV3X2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9tZW0gPSAxMDtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuICB2YXIgbGV4X2Jhc2VfY29kZSA9IDY7XG4gIHZhciBsZXhfYmFja3Rya19jb2RlID0gNztcbiAgdmFyIGxleF9kZWZhdWx0X2NvZGUgPSA4O1xuICB2YXIgbGV4X3RyYW5zX2NvZGUgPSA5O1xuICB2YXIgbGV4X2NoZWNrX2NvZGUgPSAxMDtcbiAgdmFyIGxleF9jb2RlID0gMTE7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHRfY29kZSkge1xuICAgIHRibC5sZXhfYmFzZV9jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9iYXNlX2NvZGVdKTtcbiAgICB0YmwubGV4X2JhY2t0cmtfY29kZSA9IGNhbWxfbGV4X2FycmF5KHRibFtsZXhfYmFja3Rya19jb2RlXSk7XG4gICAgdGJsLmxleF9jaGVja19jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja19jb2RlXSk7XG4gICAgdGJsLmxleF90cmFuc19jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF90cmFuc19jb2RlXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0X2NvZGUgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2RlZmF1bHRfY29kZV0pO1xuICB9XG4gIGlmICh0YmwubGV4X2NvZGUgPT0gbnVsbClcbiAgICB0YmwubGV4X2NvZGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRibFtsZXhfY29kZV0pO1xuXG4gIHZhciBjLFxuICAgIHN0YXRlID0gc3RhcnRfc3RhdGU7XG5cbiAgdmFyIGJ1ZmZlciA9IGxleGJ1ZltsZXhfYnVmZmVyXTtcblxuICBpZiAoc3RhdGUgPj0gMCkge1xuICAgIC8qIEZpcnN0IGVudHJ5ICovXG4gICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X3N0YXJ0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIC8qIFJlZW50cnkgYWZ0ZXIgcmVmaWxsICovXG4gICAgc3RhdGUgPSAtc3RhdGUgLSAxO1xuICB9XG4gIGZvciAoOzspIHtcbiAgICAvKiBMb29rdXAgYmFzZSBhZGRyZXNzIG9yIGFjdGlvbiBudW1iZXIgZm9yIGN1cnJlbnQgc3RhdGUgKi9cbiAgICB2YXIgYmFzZSA9IHRibC5sZXhfYmFzZVtzdGF0ZV07XG4gICAgaWYgKGJhc2UgPCAwKSB7XG4gICAgICB2YXIgcGNfb2ZmID0gdGJsLmxleF9iYXNlX2NvZGVbc3RhdGVdO1xuICAgICAgY2FtbF9sZXhfcnVuX3RhZyh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dKTtcbiAgICAgIHJldHVybiAtYmFzZSAtIDE7XG4gICAgfVxuICAgIC8qIFNlZSBpZiBpdCdzIGEgYmFja3RyYWNrIHBvaW50ICovXG4gICAgdmFyIGJhY2t0cmsgPSB0YmwubGV4X2JhY2t0cmtbc3RhdGVdO1xuICAgIGlmIChiYWNrdHJrID49IDApIHtcbiAgICAgIHZhciBwY19vZmYgPSB0YmwubGV4X2JhY2t0cmtfY29kZVtzdGF0ZV07XG4gICAgICBjYW1sX2xleF9ydW5fdGFnKHRibC5sZXhfY29kZSwgcGNfb2ZmLCBsZXhidWZbbGV4X21lbV0pO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gYmFja3RyaztcbiAgICB9XG4gICAgLyogU2VlIGlmIHdlIG5lZWQgYSByZWZpbGwgKi9cbiAgICBpZiAobGV4YnVmW2xleF9jdXJyX3Bvc10gPj0gbGV4YnVmW2xleF9idWZmZXJfbGVuXSkge1xuICAgICAgaWYgKGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID09PSAwKSByZXR1cm4gLXN0YXRlIC0gMTtcbiAgICAgIGVsc2UgYyA9IDI1NjtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogUmVhZCBuZXh0IGlucHV0IGNoYXIgKi9cbiAgICAgIGMgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQoYnVmZmVyLCBsZXhidWZbbGV4X2N1cnJfcG9zXSk7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSsrO1xuICAgIH1cbiAgICAvKiBEZXRlcm1pbmUgbmV4dCBzdGF0ZSAqL1xuICAgIHZhciBwc3RhdGUgPSBzdGF0ZTtcbiAgICBpZiAodGJsLmxleF9jaGVja1tiYXNlICsgY10gPT09IHN0YXRlKSBzdGF0ZSA9IHRibC5sZXhfdHJhbnNbYmFzZSArIGNdO1xuICAgIGVsc2Ugc3RhdGUgPSB0YmwubGV4X2RlZmF1bHRbc3RhdGVdO1xuICAgIC8qIElmIG5vIHRyYW5zaXRpb24gb24gdGhpcyBjaGFyLCByZXR1cm4gdG8gbGFzdCBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICBpZiAoc3RhdGUgPCAwKSB7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSA9IGxleGJ1ZltsZXhfbGFzdF9wb3NdO1xuICAgICAgaWYgKGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID09PSAtMSkgY2FtbF9mYWlsd2l0aChcImxleGluZzogZW1wdHkgdG9rZW5cIik7XG4gICAgICBlbHNlIHJldHVybiBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogSWYgc29tZSB0cmFuc2l0aW9uLCBnZXQgYW5kIHBlcmZvcm0gbWVtb3J5IG1vdmVzICovXG4gICAgICB2YXIgYmFzZV9jb2RlID0gdGJsLmxleF9iYXNlX2NvZGVbcHN0YXRlXSxcbiAgICAgICAgcGNfb2ZmO1xuICAgICAgaWYgKHRibC5sZXhfY2hlY2tfY29kZVtiYXNlX2NvZGUgKyBjXSA9PT0gcHN0YXRlKVxuICAgICAgICBwY19vZmYgPSB0YmwubGV4X3RyYW5zX2NvZGVbYmFzZV9jb2RlICsgY107XG4gICAgICBlbHNlIHBjX29mZiA9IHRibC5sZXhfZGVmYXVsdF9jb2RlW3BzdGF0ZV07XG4gICAgICBpZiAocGNfb2ZmID4gMClcbiAgICAgICAgY2FtbF9sZXhfcnVuX21lbShcbiAgICAgICAgICB0YmwubGV4X2NvZGUsXG4gICAgICAgICAgcGNfb2ZmLFxuICAgICAgICAgIGxleGJ1ZltsZXhfbWVtXSxcbiAgICAgICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSxcbiAgICAgICAgKTtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfbHhtX01cbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1XG52YXIgY2FtbF9seG1fTSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKFxuICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIjB4ZDEzNDI1NDNkZTgyZWY5NVwiKSxcbik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbHhtX2RhYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1XG52YXIgY2FtbF9seG1fZGFiYSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKFxuICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIjB4ZGFiYTBiNmViMDkzMjJlM1wiKSxcbik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbHhtX25leHQgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3hvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9hZGRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbXVsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2x4bV9NXG4vL1JlcXVpcmVzOiBjYW1sX2x4bV9kYWJhXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfbHhtX25leHQodikge1xuICBmdW5jdGlvbiBzaGlmdF9sKHgsIGspIHtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0KHgsIGspO1xuICB9XG4gIGZ1bmN0aW9uIHNoaWZ0X3IoeCwgaykge1xuICAgIHJldHVybiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIGspO1xuICB9XG4gIGZ1bmN0aW9uIG9yKGEsIGIpIHtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9vcihhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiB4b3IoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X3hvcihhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBhZGQoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X2FkZChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBtdWwoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X211bChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiByb3RsKHgsIGspIHtcbiAgICByZXR1cm4gb3Ioc2hpZnRfbCh4LCBrKSwgc2hpZnRfcih4LCA2NCAtIGspKTtcbiAgfVxuICBmdW5jdGlvbiBnZXQoYSwgaSkge1xuICAgIHJldHVybiBjYW1sX2JhX2dldF8xKGEsIGkpO1xuICB9XG4gIGZ1bmN0aW9uIHNldChhLCBpLCB4KSB7XG4gICAgcmV0dXJuIGNhbWxfYmFfc2V0XzEoYSwgaSwgeCk7XG4gIH1cbiAgdmFyIE0gPSBjYW1sX2x4bV9NO1xuICB2YXIgZGFiYSA9IGNhbWxfbHhtX2RhYmE7XG4gIHZhciB6LCBxMCwgcTE7XG4gIHZhciBzdCA9IHY7XG4gIHZhciBhID0gZ2V0KHN0LCAwKTtcbiAgdmFyIHMgPSBnZXQoc3QsIDEpO1xuICB2YXIgeDAgPSBnZXQoc3QsIDIpO1xuICB2YXIgeDEgPSBnZXQoc3QsIDMpO1xuICAvKiBDb21iaW5pbmcgb3BlcmF0aW9uICovXG4gIHogPSBhZGQocywgeDApO1xuICAvKiBNaXhpbmcgZnVuY3Rpb24gKi9cbiAgeiA9IG11bCh4b3Ioeiwgc2hpZnRfcih6LCAzMikpLCBkYWJhKTtcbiAgeiA9IG11bCh4b3Ioeiwgc2hpZnRfcih6LCAzMikpLCBkYWJhKTtcbiAgeiA9IHhvcih6LCBzaGlmdF9yKHosIDMyKSk7XG4gIC8qIExDRyB1cGRhdGUgKi9cbiAgc2V0KHN0LCAxLCBhZGQobXVsKHMsIE0pLCBhKSk7XG4gIC8qIFhCRyB1cGRhdGUgKi9cbiAgdmFyIHEwID0geDA7XG4gIHZhciBxMSA9IHgxO1xuICBxMSA9IHhvcihxMSwgcTApO1xuICBxMCA9IHJvdGwocTAsIDI0KTtcbiAgcTAgPSB4b3IoeG9yKHEwLCBxMSksIHNoaWZ0X2wocTEsIDE2KSk7XG4gIHExID0gcm90bChxMSwgMzcpO1xuICBzZXQoc3QsIDIsIHEwKTtcbiAgc2V0KHN0LCAzLCBxMSk7XG4gIC8qIFJldHVybiByZXN1bHQgKi9cbiAgcmV0dXJuIHo7XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICovXG4vKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICovXG4vKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdpdGggICAgICovXG4vKiAgdGhlIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZpbGUgLi4vTElDRU5TRS4gICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qICRJZDogcGFyc2luZy5jIDg5ODMgMjAwOC0wOC0wNiAwOTozODoyNVogeGxlcm95ICQgKi9cblxuLyogVGhlIFBEQSBhdXRvbWF0b24gZm9yIHBhcnNlcnMgZ2VuZXJhdGVkIGJ5IGNhbWx5YWNjICovXG5cbi8qIFRoZSBwdXNoZG93biBhdXRvbWF0YSAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlcl90cmFjZVxudmFyIGNhbWxfcGFyc2VyX3RyYWNlID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfbGV4X2FycmF5LCBjYW1sX3BhcnNlcl90cmFjZSxjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXQsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfZmRzXG5mdW5jdGlvbiBjYW1sX3BhcnNlX2VuZ2luZSh0YWJsZXMsIGVudiwgY21kLCBhcmcpIHtcbiAgdmFyIEVSUkNPREUgPSAyNTY7XG5cbiAgLy92YXIgU1RBUlQgPSAwO1xuICAvL3ZhciBUT0tFTl9SRUFEID0gMTtcbiAgLy92YXIgU1RBQ0tTX0dST1dOXzEgPSAyO1xuICAvL3ZhciBTVEFDS1NfR1JPV05fMiA9IDM7XG4gIC8vdmFyIFNFTUFOVElDX0FDVElPTl9DT01QVVRFRCA9IDQ7XG4gIC8vdmFyIEVSUk9SX0RFVEVDVEVEID0gNTtcbiAgdmFyIGxvb3AgPSA2O1xuICB2YXIgdGVzdHNoaWZ0ID0gNztcbiAgdmFyIHNoaWZ0ID0gODtcbiAgdmFyIHNoaWZ0X3JlY292ZXIgPSA5O1xuICB2YXIgcmVkdWNlID0gMTA7XG5cbiAgdmFyIFJFQURfVE9LRU4gPSAwO1xuICB2YXIgUkFJU0VfUEFSU0VfRVJST1IgPSAxO1xuICB2YXIgR1JPV19TVEFDS1NfMSA9IDI7XG4gIHZhciBHUk9XX1NUQUNLU18yID0gMztcbiAgdmFyIENPTVBVVEVfU0VNQU5USUNfQUNUSU9OID0gNDtcbiAgdmFyIENBTExfRVJST1JfRlVOQ1RJT04gPSA1O1xuXG4gIHZhciBlbnZfc19zdGFjayA9IDE7XG4gIHZhciBlbnZfdl9zdGFjayA9IDI7XG4gIHZhciBlbnZfc3ltYl9zdGFydF9zdGFjayA9IDM7XG4gIHZhciBlbnZfc3ltYl9lbmRfc3RhY2sgPSA0O1xuICB2YXIgZW52X3N0YWNrc2l6ZSA9IDU7XG4gIHZhciBlbnZfc3RhY2tiYXNlID0gNjtcbiAgdmFyIGVudl9jdXJyX2NoYXIgPSA3O1xuICB2YXIgZW52X2x2YWwgPSA4O1xuICB2YXIgZW52X3N5bWJfc3RhcnQgPSA5O1xuICB2YXIgZW52X3N5bWJfZW5kID0gMTA7XG4gIHZhciBlbnZfYXNwID0gMTE7XG4gIHZhciBlbnZfcnVsZV9sZW4gPSAxMjtcbiAgdmFyIGVudl9ydWxlX251bWJlciA9IDEzO1xuICB2YXIgZW52X3NwID0gMTQ7XG4gIHZhciBlbnZfc3RhdGUgPSAxNTtcbiAgdmFyIGVudl9lcnJmbGFnID0gMTY7XG5cbiAgLy8gdmFyIF90YmxfYWN0aW9ucyA9IDE7XG4gIHZhciB0YmxfdHJhbnNsX2NvbnN0ID0gMjtcbiAgdmFyIHRibF90cmFuc2xfYmxvY2sgPSAzO1xuICB2YXIgdGJsX2xocyA9IDQ7XG4gIHZhciB0YmxfbGVuID0gNTtcbiAgdmFyIHRibF9kZWZyZWQgPSA2O1xuICB2YXIgdGJsX2Rnb3RvID0gNztcbiAgdmFyIHRibF9zaW5kZXggPSA4O1xuICB2YXIgdGJsX3JpbmRleCA9IDk7XG4gIHZhciB0YmxfZ2luZGV4ID0gMTA7XG4gIHZhciB0YmxfdGFibGVzaXplID0gMTE7XG4gIHZhciB0YmxfdGFibGUgPSAxMjtcbiAgdmFyIHRibF9jaGVjayA9IDEzO1xuICAvLyB2YXIgX3RibF9lcnJvcl9mdW5jdGlvbiA9IDE0O1xuICB2YXIgdGJsX25hbWVzX2NvbnN0ID0gMTU7XG4gIHZhciB0YmxfbmFtZXNfYmxvY2sgPSAxNjtcblxuICBmdW5jdGlvbiBsb2coeCkge1xuICAgIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh4ICsgXCJcXG5cIik7XG4gICAgY2FtbF9tbF9vdXRwdXQoY2FtbF9zeXNfZmRzWzJdLmNoYW5pZCwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuX25hbWUobmFtZXMsIG51bWJlcikge1xuICAgIHZhciBzdHIgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lcyk7XG4gICAgaWYgKHN0clswXSA9PT0gXCJcXHgwMFwiKSByZXR1cm4gXCI8dW5rbm93biB0b2tlbj5cIjtcbiAgICByZXR1cm4gc3RyLnNwbGl0KFwiXFx4MDBcIilbbnVtYmVyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50X3Rva2VuKHN0YXRlLCB0b2spIHtcbiAgICB2YXIgdG9rZW4sIGtpbmQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodG9rKSkge1xuICAgICAgdG9rZW4gPSB0b2tlbl9uYW1lKHRhYmxlc1t0YmxfbmFtZXNfYmxvY2tdLCB0b2tbMF0pO1xuICAgICAgaWYgKHR5cGVvZiB0b2tbMV0gPT09IFwibnVtYmVyXCIpIGtpbmQgPSBcIlwiICsgdG9rWzFdO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHRva1sxXSA9PT0gXCJzdHJpbmdcIikga2luZCA9IHRva1sxXTtcbiAgICAgIGVsc2UgaWYgKHRva1sxXSBpbnN0YW5jZW9mIE1sQnl0ZXMpIGtpbmQgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRva1sxXSk7XG4gICAgICBlbHNlIGtpbmQgPSBcIl9cIjtcbiAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogcmVhZCB0b2tlbiBcIiArIHRva2VuICsgXCIoXCIgKyBraW5kICsgXCIpXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbiA9IHRva2VuX25hbWUodGFibGVzW3RibF9uYW1lc19jb25zdF0sIHRvayk7XG4gICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlYWQgdG9rZW4gXCIgKyB0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YWJsZXMuZGdvdG8pIHtcbiAgICB0YWJsZXMuZGVmcmVkID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF9kZWZyZWRdKTtcbiAgICB0YWJsZXMuc2luZGV4ID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF9zaW5kZXhdKTtcbiAgICB0YWJsZXMuY2hlY2sgPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2NoZWNrXSk7XG4gICAgdGFibGVzLnJpbmRleCA9IGNhbWxfbGV4X2FycmF5KHRhYmxlc1t0YmxfcmluZGV4XSk7XG4gICAgdGFibGVzLnRhYmxlID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF90YWJsZV0pO1xuICAgIHRhYmxlcy5sZW4gPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2xlbl0pO1xuICAgIHRhYmxlcy5saHMgPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2xoc10pO1xuICAgIHRhYmxlcy5naW5kZXggPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2dpbmRleF0pO1xuICAgIHRhYmxlcy5kZ290byA9IGNhbWxfbGV4X2FycmF5KHRhYmxlc1t0YmxfZGdvdG9dKTtcbiAgfVxuXG4gIHZhciByZXMgPSAwLFxuICAgIG4sXG4gICAgbjEsXG4gICAgbjIsXG4gICAgc3RhdGUxO1xuXG4gIC8vIFJFU1RPUkVcbiAgdmFyIHNwID0gZW52W2Vudl9zcF07XG4gIHZhciBzdGF0ZSA9IGVudltlbnZfc3RhdGVdO1xuICB2YXIgZXJyZmxhZyA9IGVudltlbnZfZXJyZmxhZ107XG5cbiAgdGhlX2xvb3A6IGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGNtZCkge1xuICAgICAgY2FzZSAwOiAvL1NUQVJUOlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgZXJyZmxhZyA9IDA7XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIDY6IC8vbG9vcDpcbiAgICAgICAgbiA9IHRhYmxlcy5kZWZyZWRbc3RhdGVdO1xuICAgICAgICBpZiAobiAhPT0gMCkge1xuICAgICAgICAgIGNtZCA9IHJlZHVjZTtcbiAgICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0ZXN0c2hpZnQ7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gUkVBRF9UT0tFTjtcbiAgICAgICAgYnJlYWsgdGhlX2xvb3A7XG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgbGV4ZXIgYW5kIHVwZGF0ZXMgKi9cbiAgICAgIC8qIHN5bWJfc3RhcnQgYW5kIHN5bWJfZW5kICovXG4gICAgICBjYXNlIDE6IC8vVE9LRU5fUkVBRDpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfYmxvY2tdW2FyZ1swXSArIDFdO1xuICAgICAgICAgIGVudltlbnZfbHZhbF0gPSBhcmdbMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfY29uc3RdW2FyZyArIDFdO1xuICAgICAgICAgIGVudltlbnZfbHZhbF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgcHJpbnRfdG9rZW4oc3RhdGUsIGFyZyk7XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIDc6IC8vdGVzdHNoaWZ0OlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICAgIG4xID0gdGFibGVzLnNpbmRleFtzdGF0ZV07XG4gICAgICAgIG4yID0gbjEgKyBlbnZbZW52X2N1cnJfY2hhcl07XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuMSAhPT0gMCAmJlxuICAgICAgICAgIG4yID49IDAgJiZcbiAgICAgICAgICBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09PSBlbnZbZW52X2N1cnJfY2hhcl1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY21kID0gc2hpZnQ7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgbjEgPSB0YWJsZXMucmluZGV4W3N0YXRlXTtcbiAgICAgICAgbjIgPSBuMSArIGVudltlbnZfY3Vycl9jaGFyXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG4xICE9PSAwICYmXG4gICAgICAgICAgbjIgPj0gMCAmJlxuICAgICAgICAgIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT09IGVudltlbnZfY3Vycl9jaGFyXVxuICAgICAgICApIHtcbiAgICAgICAgICBuID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgICAgICBjbWQgPSByZWR1Y2U7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycmZsYWcgPD0gMCkge1xuICAgICAgICAgIHJlcyA9IENBTExfRVJST1JfRlVOQ1RJT047XG4gICAgICAgICAgYnJlYWsgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgZXJyb3IgZnVuY3Rpb24gKi9cbiAgICAgIGNhc2UgNTogLy9FUlJPUl9ERVRFQ1RFRDpcbiAgICAgICAgaWYgKGVycmZsYWcgPCAzKSB7XG4gICAgICAgICAgZXJyZmxhZyA9IDM7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgc3RhdGUxID0gZW52W2Vudl9zX3N0YWNrXVtzcCArIDFdO1xuICAgICAgICAgICAgbjEgPSB0YWJsZXMuc2luZGV4W3N0YXRlMV07XG4gICAgICAgICAgICBuMiA9IG4xICsgRVJSQ09ERTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbjEgIT09IDAgJiZcbiAgICAgICAgICAgICAgbjIgPj0gMCAmJlxuICAgICAgICAgICAgICBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PT0gRVJSQ09ERVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiUmVjb3ZlcmluZyBpbiBzdGF0ZSBcIiArIHN0YXRlMSk7XG4gICAgICAgICAgICAgIGNtZCA9IHNoaWZ0X3JlY292ZXI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIHRoZV9sb29wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBsb2coXCJEaXNjYXJkaW5nIHN0YXRlIFwiICsgc3RhdGUxKTtcbiAgICAgICAgICAgICAgaWYgKHNwIDw9IGVudltlbnZfc3RhY2tiYXNlXSkge1xuICAgICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiTm8gbW9yZSBzdGF0ZXMgdG8gZGlzY2FyZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLyogVGhlIE1MIGNvZGUgcmFpc2VzIFBhcnNlX2Vycm9yICovXG4gICAgICAgICAgICAgIHNwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbnZbZW52X2N1cnJfY2hhcl0gPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7IC8qIFRoZSBNTCBjb2RlIHJhaXNlcyBQYXJzZV9lcnJvciAqL1xuICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiRGlzY2FyZGluZyBsYXN0IHRva2VuIHJlYWRcIik7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gLTE7XG4gICAgICAgICAgY21kID0gbG9vcDtcbiAgICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgLy8gVW5yZWFjaGFibGVcbiAgICAgIGNhc2UgODogLy9zaGlmdDpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSAtMTtcbiAgICAgICAgaWYgKGVycmZsYWcgPiAwKSBlcnJmbGFnLS07XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgY2FzZSA5OiAvL3NoaWZ0X3JlY292ZXI6XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogc2hpZnQgdG8gc3RhdGUgXCIgKyB0YWJsZXMudGFibGVbbjJdKTtcbiAgICAgICAgc3RhdGUgPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgICBzcCsrO1xuICAgICAgICBpZiAoc3AgPj0gZW52W2Vudl9zdGFja3NpemVdKSB7XG4gICAgICAgICAgcmVzID0gR1JPV19TVEFDS1NfMTtcbiAgICAgICAgICBicmVhayB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIHJlc2l6ZXMgdGhlIHN0YWNrcyAqL1xuICAgICAgY2FzZSAyOiAvL1NUQUNLU19HUk9XTl8xOlxuICAgICAgICBlbnZbZW52X3Nfc3RhY2tdW3NwICsgMV0gPSBzdGF0ZTtcbiAgICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9sdmFsXTtcbiAgICAgICAgZW52W2Vudl9zeW1iX3N0YXJ0X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX3N0YXJ0XTtcbiAgICAgICAgZW52W2Vudl9zeW1iX2VuZF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9lbmRdO1xuICAgICAgICBjbWQgPSBsb29wO1xuICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcblxuICAgICAgY2FzZSAxMDogLy9yZWR1Y2U6XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlZHVjZSBieSBydWxlIFwiICsgbik7XG4gICAgICAgIHZhciBtID0gdGFibGVzLmxlbltuXTtcbiAgICAgICAgZW52W2Vudl9hc3BdID0gc3A7XG4gICAgICAgIGVudltlbnZfcnVsZV9udW1iZXJdID0gbjtcbiAgICAgICAgZW52W2Vudl9ydWxlX2xlbl0gPSBtO1xuICAgICAgICBzcCA9IHNwIC0gbSArIDE7XG4gICAgICAgIG0gPSB0YWJsZXMubGhzW25dO1xuICAgICAgICBzdGF0ZTEgPSBlbnZbZW52X3Nfc3RhY2tdW3NwXTtcbiAgICAgICAgbjEgPSB0YWJsZXMuZ2luZGV4W21dO1xuICAgICAgICBuMiA9IG4xICsgc3RhdGUxO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbjEgIT09IDAgJiZcbiAgICAgICAgICBuMiA+PSAwICYmXG4gICAgICAgICAgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PT0gc3RhdGUxXG4gICAgICAgIClcbiAgICAgICAgICBzdGF0ZSA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICAgIGVsc2Ugc3RhdGUgPSB0YWJsZXMuZGdvdG9bbV07XG4gICAgICAgIGlmIChzcCA+PSBlbnZbZW52X3N0YWNrc2l6ZV0pIHtcbiAgICAgICAgICByZXMgPSBHUk9XX1NUQUNLU18yO1xuICAgICAgICAgIGJyZWFrIHRoZV9sb29wO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgLyogVGhlIE1MIGNvZGUgcmVzaXplcyB0aGUgc3RhY2tzICovXG4gICAgICBjYXNlIDM6IC8vU1RBQ0tTX0dST1dOXzI6XG4gICAgICAgIHJlcyA9IENPTVBVVEVfU0VNQU5USUNfQUNUSU9OO1xuICAgICAgICBicmVhayB0aGVfbG9vcDtcbiAgICAgIC8qIFRoZSBNTCBjb2RlIGNhbGxzIHRoZSBzZW1hbnRpYyBhY3Rpb24gKi9cbiAgICAgIGNhc2UgNDogLy9TRU1BTlRJQ19BQ1RJT05fQ09NUFVURUQ6XG4gICAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgICBlbnZbZW52X3Zfc3RhY2tdW3NwICsgMV0gPSBhcmc7XG4gICAgICAgIHZhciBhc3AgPSBlbnZbZW52X2FzcF07XG4gICAgICAgIGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgICAgaWYgKHNwID4gYXNwKSB7XG4gICAgICAgICAgLyogVGhpcyBpcyBhbiBlcHNpbG9uIHByb2R1Y3Rpb24uIFRha2Ugc3ltYl9zdGFydCBlcXVhbCB0byBzeW1iX2VuZC4gKi9cbiAgICAgICAgICBlbnZbZW52X3N5bWJfc3RhcnRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBjbWQgPSBsb29wO1xuICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgfVxuICB9XG4gIC8vIFNBVkVcbiAgZW52W2Vudl9zcF0gPSBzcDtcbiAgZW52W2Vudl9zdGF0ZV0gPSBzdGF0ZTtcbiAgZW52W2Vudl9lcnJmbGFnXSA9IGVycmZsYWc7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3BhcnNlcl90cmFjZVxuLy9SZXF1aXJlczogY2FtbF9wYXJzZXJfdHJhY2VcbmZ1bmN0aW9uIGNhbWxfc2V0X3BhcnNlcl90cmFjZShib29sKSB7XG4gIHZhciBvbGRmbGFnID0gY2FtbF9wYXJzZXJfdHJhY2U7XG4gIGNhbWxfcGFyc2VyX3RyYWNlID0gYm9vbDtcbiAgcmV0dXJuIG9sZGZsYWc7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMjAgLSBIdWdvIEhldXphcmRcbi8vIENvcHlyaWdodCAoQykgMjAyMCAtIFNoYWNoYXIgSXR6aGFreVxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNC4wNy9vdGhlcmxpYnMvc3RyL3N0cnN0dWJzLmNcbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2NvcS9qc2NvcS9ibG9iL3Y4LjExL2NvcS1qcy9qc19zdHViL3N0ci5qc1xuXG4vL1Byb3ZpZGVzOiByZV9tYXRjaFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9qc19mcm9tX2FycmF5LCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfZ2V0XG5cbnZhciByZV9tYXRjaCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciByZV93b3JkX2xldHRlcnMgPSBbXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiAweDAwLTB4MUY6IG5vbmUgKi8sIDB4MDAsIDB4MDAsIDB4ZmYsXG4gICAgMHgwMyAvKiAweDIwLTB4M0Y6IGRpZ2l0cyAwLTkgKi8sIDB4ZmUsIDB4ZmYsIDB4ZmYsXG4gICAgMHg4NyAvKiAweDQwLTB4NUY6IEEgdG8gWiwgXyAqLywgMHhmZSwgMHhmZiwgMHhmZixcbiAgICAweDA3IC8qIDB4NjAtMHg3RjogYSB0byB6ICovLCAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDB4ODAtMHg5Rjogbm9uZSAqLyxcbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDB4QTAtMHhCRjogbm9uZSAqLywgMHhmZiwgMHhmZiwgMHg3ZixcbiAgICAweGZmIC8qIDB4QzAtMHhERjogTGF0aW4tMSBhY2NlbnRlZCB1cHBlcmNhc2UgKi8sIDB4ZmYsIDB4ZmYsIDB4N2YsXG4gICAgMHhmZiAvKiAweEUwLTB4RkY6IExhdGluLTEgYWNjZW50ZWQgbG93ZXJjYXNlICovLFxuICBdO1xuXG4gIHZhciBvcGNvZGVzID0ge1xuICAgIENIQVI6IDAsXG4gICAgQ0hBUk5PUk06IDEsXG4gICAgU1RSSU5HOiAyLFxuICAgIFNUUklOR05PUk06IDMsXG4gICAgQ0hBUkNMQVNTOiA0LFxuICAgIEJPTDogNSxcbiAgICBFT0w6IDYsXG4gICAgV09SREJPVU5EQVJZOiA3LFxuICAgIEJFR0dST1VQOiA4LFxuICAgIEVOREdST1VQOiA5LFxuICAgIFJFRkdST1VQOiAxMCxcbiAgICBBQ0NFUFQ6IDExLFxuICAgIFNJTVBMRU9QVDogMTIsXG4gICAgU0lNUExFU1RBUjogMTMsXG4gICAgU0lNUExFUExVUzogMTQsXG4gICAgR09UTzogMTUsXG4gICAgUFVTSEJBQ0s6IDE2LFxuICAgIFNFVE1BUks6IDE3LFxuICAgIENIRUNLUFJPR1JFU1M6IDE4LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzX3dvcmRfbGV0dGVyKGMpIHtcbiAgICByZXR1cm4gKHJlX3dvcmRfbGV0dGVyc1tjID4+IDNdID4+IChjICYgNykpICYgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluX2JpdHNldChzLCBpKSB7XG4gICAgcmV0dXJuIChjYW1sX3N0cmluZ19nZXQocywgaSA+PiAzKSA+PiAoaSAmIDcpKSAmIDE7XG4gIH1cblxuICBmdW5jdGlvbiByZV9tYXRjaF9pbXBsKHJlLCBzLCBwb3MsIHBhcnRpYWwpIHtcbiAgICB2YXIgcHJvZyA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsxXSksXG4gICAgICBjcG9vbCA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsyXSksXG4gICAgICBub3JtdGFibGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHJlWzNdKSxcbiAgICAgIG51bWdyb3VwcyA9IHJlWzRdIHwgMCxcbiAgICAgIG51bXJlZ2lzdGVycyA9IHJlWzVdIHwgMDtcblxuICAgIHZhciBzID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocyk7XG5cbiAgICB2YXIgcGMgPSAwLFxuICAgICAgcXVpdCA9IGZhbHNlLFxuICAgICAgc3RhY2sgPSBbXSxcbiAgICAgIGdyb3VwcyA9IG5ldyBBcnJheShudW1ncm91cHMpLFxuICAgICAgcmVfcmVnaXN0ZXIgPSBuZXcgQXJyYXkobnVtcmVnaXN0ZXJzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBncm91cHNbaV0gPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgIH1cbiAgICBncm91cHNbMF0uc3RhcnQgPSBwb3M7XG5cbiAgICB2YXIgYmFja3RyYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoaXRlbS51bmRvKSB7XG4gICAgICAgICAgaXRlbS51bmRvLm9ialtpdGVtLnVuZG8ucHJvcF0gPSBpdGVtLnVuZG8udmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MpIHtcbiAgICAgICAgICBwYyA9IGl0ZW0ucG9zLnBjO1xuICAgICAgICAgIHBvcyA9IGl0ZW0ucG9zLnR4dDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1aXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICB2YXIgcHVzaCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBzdGFjay5wdXNoKGl0ZW0pO1xuICAgIH07XG5cbiAgICB2YXIgYWNjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZ3JvdXBzWzBdLmVuZCA9IHBvcztcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoMSArIGdyb3Vwcy5sZW5ndGggKiAyKTtcbiAgICAgIHJlc3VsdFswXSA9IDA7IC8vIHRhZ1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGcgPSBncm91cHNbaV07XG4gICAgICAgIGlmIChnLnN0YXJ0IDwgMCB8fCBnLmVuZCA8IDApIHtcbiAgICAgICAgICBnLnN0YXJ0ID0gZy5lbmQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbMiAqIGkgKyAxXSA9IGcuc3RhcnQ7XG4gICAgICAgIHJlc3VsdFsyICogaSArIDEgKyAxXSA9IGcuZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHByZWZpeF9tYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYXJ0aWFsKSByZXR1cm4gYWNjZXB0KCk7XG4gICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgIH07XG5cbiAgICAvKiBNYWluIERGQSBpbnRlcnByZXRlciBsb29wICovXG4gICAgd2hpbGUgKCFxdWl0KSB7XG4gICAgICB2YXIgb3AgPSBwcm9nW3BjXSAmIDB4ZmYsXG4gICAgICAgIHNhcmcgPSBwcm9nW3BjXSA+PiA4LFxuICAgICAgICB1YXJnID0gc2FyZyAmIDB4ZmYsXG4gICAgICAgIGMgPSBzW3Bvc10sXG4gICAgICAgIGdyb3VwO1xuXG4gICAgICBwYysrO1xuXG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSOlxuICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmVmaXhfbWF0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gdWFyZykgcG9zKys7XG4gICAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkNIQVJOT1JNOlxuICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmVmaXhfbWF0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9ybXRhYmxlLmNoYXJDb2RlQXQoYykgPT09IHVhcmcpIHBvcysrO1xuICAgICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TVFJJTkc6XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7XG4gICAgICAgICAgICBpIDwgYXJnLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09IGFyZy5jaGFyQ29kZUF0KGkpKSBjID0gc1srK3Bvc107XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLlNUUklOR05PUk06XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7XG4gICAgICAgICAgICBpIDwgYXJnLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSBhcmcuY2hhckNvZGVBdChpKSkgYyA9IHNbKytwb3NdO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSQ0xBU1M6XG4gICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZWZpeF9tYXRjaCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuQk9MOlxuICAgICAgICAgIGlmIChwb3MgPiAwICYmIHNbcG9zIC0gMV0gIT09IDEwIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuRU9MOlxuICAgICAgICAgIGlmIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09IDEwIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuV09SREJPVU5EQVJZOlxuICAgICAgICAgIGlmIChwb3MgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHByZWZpeF9tYXRjaCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc193b3JkX2xldHRlcihzWzBdKSkgYnJlYWs7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc193b3JkX2xldHRlcihzW3BvcyAtIDFdKSkgYnJlYWs7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzX3dvcmRfbGV0dGVyKHNbcG9zIC0gMV0pICE9PSBpc193b3JkX2xldHRlcihzW3Bvc10pKSBicmVhaztcbiAgICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkJFR0dST1VQOlxuICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICAgIHB1c2goeyB1bmRvOiB7IG9iajogZ3JvdXAsIHByb3A6IFwic3RhcnRcIiwgdmFsdWU6IGdyb3VwLnN0YXJ0IH0gfSk7XG4gICAgICAgICAgZ3JvdXAuc3RhcnQgPSBwb3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5FTkRHUk9VUDpcbiAgICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgICBwdXNoKHsgdW5kbzogeyBvYmo6IGdyb3VwLCBwcm9wOiBcImVuZFwiLCB2YWx1ZTogZ3JvdXAuZW5kIH0gfSk7XG4gICAgICAgICAgZ3JvdXAuZW5kID0gcG9zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuUkVGR1JPVVA6XG4gICAgICAgICAgZ3JvdXAgPSBncm91cHNbdWFyZ107XG4gICAgICAgICAgaWYgKGdyb3VwLnN0YXJ0IDwgMCB8fCBncm91cC5lbmQgPCAwKSB7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpID0gZ3JvdXAuc3RhcnQ7IGkgPCBncm91cC5lbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNbaV0gIT09IHNbcG9zXSkge1xuICAgICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVPUFQ6XG4gICAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHBvcysrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuU0lNUExFU1RBUjpcbiAgICAgICAgICB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSkgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuU0lNUExFUExVUzpcbiAgICAgICAgICBpZiAocG9zID09PSBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgICAgfSB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSk7XG4gICAgICAgICAgfSBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuQUNDRVBUOlxuICAgICAgICAgIHJldHVybiBhY2NlcHQoKTtcbiAgICAgICAgY2FzZSBvcGNvZGVzLkdPVE86XG4gICAgICAgICAgcGMgPSBwYyArIHNhcmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5QVVNIQkFDSzpcbiAgICAgICAgICBwdXNoKHsgcG9zOiB7IHBjOiBwYyArIHNhcmcsIHR4dDogcG9zIH0gfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TRVRNQVJLOlxuICAgICAgICAgIHB1c2goe1xuICAgICAgICAgICAgdW5kbzogeyBvYmo6IHJlX3JlZ2lzdGVyLCBwcm9wOiB1YXJnLCB2YWx1ZTogcmVfcmVnaXN0ZXJbdWFyZ10gfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZV9yZWdpc3Rlclt1YXJnXSA9IHBvcztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkNIRUNLUFJPR1JFU1M6XG4gICAgICAgICAgaWYgKHJlX3JlZ2lzdGVyW3VhcmddID09PSBwb3MpIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZWNvZGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHJlX21hdGNoX2ltcGw7XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiByZV9zZWFyY2hfZm9yd2FyZFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19nZXRcbmZ1bmN0aW9uIHJlX3NlYXJjaF9mb3J3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYgKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfZm9yd2FyZFwiKTtcbiAgdmFyIHN0YXJ0Y2hhcnMgPSByZVs2XSB8IDA7XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIGlmIChzdGFydGNoYXJzID49IDApIHtcbiAgICBzdGFydGNoYXJzID0gcmVbMl1bc3RhcnRjaGFycyArIDFdO1xuICAgIGRvIHtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgcG9zIDwgbGVuICYmXG4gICAgICAgIGNhbWxfc3RyaW5nX2dldChzdGFydGNoYXJzLCBjYW1sX3N0cmluZ19nZXQocywgcG9zKSkgPT09IDBcbiAgICAgIClcbiAgICAgICAgcG9zKys7XG4gICAgICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gICAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgICAgcG9zKys7XG4gICAgfSB3aGlsZSAocG9zIDw9IGxlbik7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIHBvcysrO1xuICAgIH0gd2hpbGUgKHBvcyA8PSBsZW4pO1xuICB9XG4gIHJldHVybiBbMF07IC8qIFt8fF0gOiBpbnQgYXJyYXkgKi9cbn1cblxuLy9Qcm92aWRlczogcmVfc2VhcmNoX2JhY2t3YXJkXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2dldFxuZnVuY3Rpb24gcmVfc2VhcmNoX2JhY2t3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYgKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfYmFja3dhcmRcIik7XG4gIHZhciBzdGFydGNoYXJzID0gcmVbNl0gfCAwO1xuICBpZiAoc3RhcnRjaGFycyA+PSAwKSB7XG4gICAgc3RhcnRjaGFycyA9IHJlWzJdW3N0YXJ0Y2hhcnMgKyAxXTtcbiAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpO1xuICAgIGRvIHtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgcG9zID4gMCAmJlxuICAgICAgICBwb3MgPCBsZW4gJiZcbiAgICAgICAgY2FtbF9zdHJpbmdfZ2V0KHN0YXJ0Y2hhcnMsIGNhbWxfc3RyaW5nX2dldChzLCBwb3MpKSA9PT0gMFxuICAgICAgKVxuICAgICAgICBwb3MtLTtcbiAgICAgIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgICBwb3MtLTtcbiAgICB9IHdoaWxlIChwb3MgPj0gMCk7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIHBvcy0tO1xuICAgIH0gd2hpbGUgKHBvcyA+PSAwKTtcbiAgfVxuICByZXR1cm4gWzBdOyAvKiBbfHxdIDogaW50IGFycmF5ICovXG59XG5cbi8vUHJvdmlkZXM6IHJlX3N0cmluZ19tYXRjaFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zdHJpbmdfbWF0Y2gocmUsIHMsIHBvcykge1xuICBpZiAocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnN0cmluZ19tYXRjaFwiKTtcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3BhcnRpYWxfbWF0Y2hcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfcGFydGlhbF9tYXRjaChyZSwgcywgcG9zKSB7XG4gIGlmIChwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIucGFydGlhbF9tYXRjaFwiKTtcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDEpO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3JlcGxhY2VtZW50X3RleHRcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vLyBleHRlcm5hbCByZV9yZXBsYWNlbWVudF90ZXh0OiBzdHJpbmcgLT4gaW50IGFycmF5IC0+IHN0cmluZyAtPiBzdHJpbmdcbmZ1bmN0aW9uIHJlX3JlcGxhY2VtZW50X3RleHQocmVwbCwgZ3JvdXBzLCBvcmlnKSB7XG4gIHZhciByZXBsID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhyZXBsKTtcbiAgdmFyIGxlbiA9IHJlcGwubGVuZ3RoO1xuICB2YXIgb3JpZyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcob3JpZyk7XG4gIHZhciByZXMgPSBcIlwiOyAvL3Jlc3VsdFxuICB2YXIgbiA9IDA7IC8vIGN1cnJlbnQgcG9zaXRpb25cbiAgdmFyIGN1cjsgLy9jdXJyZW50IGNoYXJcbiAgdmFyIHN0YXJ0LCBlbmQsIGM7XG4gIHdoaWxlIChuIDwgbGVuKSB7XG4gICAgY3VyID0gcmVwbC5jaGFyQXQobisrKTtcbiAgICBpZiAoY3VyICE9PSBcIlxcXFxcIikge1xuICAgICAgcmVzICs9IGN1cjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG4gPT09IGxlbikgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiBpbGxlZ2FsIGJhY2tzbGFzaCBzZXF1ZW5jZVwiKTtcbiAgICAgIGN1ciA9IHJlcGwuY2hhckF0KG4rKyk7XG4gICAgICBzd2l0Y2ggKGN1cikge1xuICAgICAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgICAgIHJlcyArPSBjdXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCIwXCI6XG4gICAgICAgIGNhc2UgXCIxXCI6XG4gICAgICAgIGNhc2UgXCIyXCI6XG4gICAgICAgIGNhc2UgXCIzXCI6XG4gICAgICAgIGNhc2UgXCI0XCI6XG4gICAgICAgIGNhc2UgXCI1XCI6XG4gICAgICAgIGNhc2UgXCI2XCI6XG4gICAgICAgIGNhc2UgXCI3XCI6XG4gICAgICAgIGNhc2UgXCI4XCI6XG4gICAgICAgIGNhc2UgXCI5XCI6XG4gICAgICAgICAgYyA9ICtjdXI7XG4gICAgICAgICAgaWYgKGMgKiAyID49IGdyb3Vwcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiByZWZlcmVuY2UgdG8gdW5tYXRjaGVkIGdyb3VwXCIpO1xuICAgICAgICAgIHN0YXJ0ID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjICogMik7XG4gICAgICAgICAgZW5kID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjICogMiArIDEpO1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gLTEpXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiU3RyLnJlcGxhY2U6IHJlZmVyZW5jZSB0byB1bm1hdGNoZWQgZ3JvdXBcIik7XG4gICAgICAgICAgcmVzICs9IG9yaWcuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVzICs9IFwiXFxcXFwiICsgY3VyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhyZXMpO1xufVxuIl0sIm5hbWVzIjpbImNzdF9PdXRfb2ZfbWVtb3J5IiwiY3N0X1N5c19lcnJvciIsImNzdF9GYWlsdXJlIiwiY3N0X0ludmFsaWRfYXJndW1lbnQiLCJjc3RfRW5kX29mX2ZpbGUiLCJjc3RfRGl2aXNpb25fYnlfemVybyIsImNzdF9Ob3RfZm91bmQiLCJjc3RfTWF0Y2hfZmFpbHVyZSIsImNzdF9TdGFja19vdmVyZmxvdyIsImNzdF9TeXNfYmxvY2tlZF9pbyIsImNzdF9Bc3NlcnRfZmFpbHVyZSIsImNzdF9VbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSJdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQTtBQUFBO0FBQUEsR0FBQTtBQUFBO0FBQUE7QUFBQSxRQUFBO0FBQUEsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUFBO0FBQUEsSUFBQTtBQUFBLElBQUE7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O0FBQUE7QUFBQTtBQUFBLFdBR3FCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FNUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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Q0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosT0FBTztBQUFBLFNBQ1AsT0FBTztBQUFBLFNBQ1AsT0FBTztBQUFBLFNBQ1AsT0FBTyxhQTdFRixDQThFTjtBQUFBLE9BbkdzQjtBQUFBLE9BQUQ7QUFB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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0p6YUE7QUFBQSxPQUFBQSxvQkFBQTtBQUFBO0FBQUEsT0FBQUMsZ0JBQUE7QUFBQTtBQUFBLE9BQUFDLGNBQUE7QUFBQTtBQUFBLE9BQUFDLHVCQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUFDLGtCQUFBO0FBQUE7QUFBQSxPQUFBQyx1QkFBQTtBQUFBO0FBQUE7QUFBQSxPQUFBQyxnQkFBQTtBQUFBO0FBQUEsT0FBQUMsb0JBQUE7QUFBQTtBQUFBLE9BQUFDLHFCQUFBO0FBQUE7QUFBQSxPQUFBQyxxQkFBQTtBQUFBO0FBQUEsT0FBQUMscUJBQUE7QUFBQTtBQUFBO0FBQUEsT0FBQUMsaUNBQUEiLCJpZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOF19fSx7Im9mZnNldCI6eyJsaW5lIjo5MzE0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2NhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgVmF1Z29uLCBFTlNUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUGFkZGluZyBwb3NpdGlvbi4gKilcbnR5cGUgcGFkdHkgPVxuICB8IExlZnQgICAoKiBUZXh0IGlzIGxlZnQganVzdGlmaWVkICgnLScgb3B0aW9uKS4gICAgICAgICAgICAgICAqKVxuICB8IFJpZ2h0ICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCAobm8gJy0nIG9wdGlvbikuICAgICAgICAgICAqKVxuICB8IFplcm9zICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCBieSB6ZXJvcyAoc2VlICcwJyBvcHRpb24pLiAqKVxuXG4oKioqKVxuXG4oKiBJbnRlZ2VyIGNvbnZlcnNpb24uICopXG50eXBlIGludF9jb252ID1cbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCAgICAgICAgKCogICVkIHwgJStkIHwgJSBkICAqKVxuICB8IEludF9pIHwgSW50X3BpIHwgSW50X3NpICAgICAgICAoKiAgJWkgfCAlK2kgfCAlIGkgICopXG4gIHwgSW50X3ggfCBJbnRfQ3ggICAgICAgICAgICAgICAgICgqICAleCB8ICUjeCAgICAgICAgKilcbiAgfCBJbnRfWCB8IEludF9DWCAgICAgICAgICAgICAgICAgKCogICVYIHwgJSNYICAgICAgICAqKVxuICB8IEludF9vIHwgSW50X0NvICAgICAgICAgICAgICAgICAoKiAgJW8gfCAlI28gICAgICAgICopXG4gIHwgSW50X3UgICAgICAgICAgICAgICAgICAgICAgICAgICgqICAldSAgICAgICAgICAgICAgKilcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgICAgICAgKCogICUjZCB8ICUjaSB8ICUjdSAqKVxuXG4oKiBGbG9hdCBjb252ZXJzaW9uLiAqKVxudHlwZSBmbG9hdF9mbGFnX2NvbnYgPVxuICB8IEZsb2F0X2ZsYWdfICAgICAgICAgICAgICAgICAgICAoKiAlW2ZlRWdHRmhIXSAqKVxuICB8IEZsb2F0X2ZsYWdfcCAgICAgICAgICAgICAgICAgICAoKiAlK1tmZUVnR0ZoSF0gKilcbiAgfCBGbG9hdF9mbGFnX3MgICAgICAgICAgICAgICAgICAgKCogJSBbZmVFZ0dGaEhdICopXG50eXBlIGZsb2F0X2tpbmRfY29udiA9XG4gIHwgRmxvYXRfZiAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZiB8ICUrZiB8ICUgZiAgKilcbiAgfCBGbG9hdF9lICAgICAgICAgICAgICAgICAgICAgICAgKCogICVlIHwgJStlIHwgJSBlICAqKVxuICB8IEZsb2F0X0UgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUUgfCAlK0UgfCAlIEUgICopXG4gIHwgRmxvYXRfZyAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZyB8ICUrZyB8ICUgZyAgKilcbiAgfCBGbG9hdF9HICAgICAgICAgICAgICAgICAgICAgICAgKCogICVHIHwgJStHIHwgJSBHICAqKVxuICB8IEZsb2F0X0YgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUYgfCAlK0YgfCAlIEYgICopXG4gIHwgRmxvYXRfaCAgICAgICAgICAgICAgICAgICAgICAgICgqICAlaCB8ICUraCB8ICUgaCAgKilcbiAgfCBGbG9hdF9IICAgICAgICAgICAgICAgICAgICAgICAgKCogICVIIHwgJStIIHwgJSBIICAqKVxuICB8IEZsb2F0X0NGICAgICAgICAgICAgICAgICAgICAgICAoKiAgJSNGfCAlKyNGfCAlICNGICopXG50eXBlIGZsb2F0X2NvbnYgPSBmbG9hdF9mbGFnX2NvbnYgKiBmbG9hdF9raW5kX2NvbnZcblxuKCoqKilcblxuKCogQ2hhciBzZXRzIChzZWUgJVsuLi5dKSBhcmUgYml0bWFwcyBpbXBsZW1lbnRlZCBhcyAzMi1jaGFyIHN0cmluZ3MuICopXG50eXBlIGNoYXJfc2V0ID0gc3RyaW5nXG5cbigqKiopXG5cbigqIENvdW50ZXIgdXNlZCBpbiBTY2FuZi4gKilcbnR5cGUgY291bnRlciA9XG4gIHwgTGluZV9jb3VudGVyICAgICAoKiAgJWwgICAgICAqKVxuICB8IENoYXJfY291bnRlciAgICAgKCogICVuICAgICAgKilcbiAgfCBUb2tlbl9jb3VudGVyICAgICgqICAlTiwgJUwgICopXG5cbigqKiopXG5cbigqIFBhZGRpbmcgb2Ygc3RyaW5ncyBhbmQgbnVtYmVycy4gKilcbnR5cGUgKCdhLCAnYikgcGFkZGluZyA9XG4gICgqIE5vIHBhZGRpbmcgKGV4OiBcIiVkXCIpICopXG4gIHwgTm9fcGFkZGluZyAgOiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIExpdGVyYWwgcGFkZGluZyAoZXg6IFwiJThkXCIpICopXG4gIHwgTGl0X3BhZGRpbmcgOiBwYWR0eSAqIGludCAtPiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIFBhZGRpbmcgYXMgZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUqZFwiKSAqKVxuICB8IEFyZ19wYWRkaW5nIDogcGFkdHkgLT4gKGludCAtPiAnYSwgJ2EpIHBhZGRpbmdcblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZCxcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwYWRkaW5nIG9wdGlvbiAobm8gZXh0cmEgYXJndW1lbnQpICopXG50eXBlIHBhZF9vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIFByZWNpc2lvbiBvZiBmbG9hdHMgYW5kICcwJy1wYWRkaW5nIG9mIGludGVnZXJzLiAqKVxudHlwZSAoJ2EsICdiKSBwcmVjaXNpb24gPVxuICAoKiBObyBwcmVjaXNpb24gKGV4OiBcIiVmXCIpICopXG4gIHwgTm9fcHJlY2lzaW9uIDogKCdhLCAnYSkgcHJlY2lzaW9uXG4gICgqIExpdGVyYWwgcHJlY2lzaW9uIChleDogXCIlLjNmXCIpICopXG4gIHwgTGl0X3ByZWNpc2lvbiA6IGludCAtPiAoJ2EsICdhKSBwcmVjaXNpb25cbiAgKCogUHJlY2lzaW9uIGFzIGV4dHJhIGFyZ3VtZW50IChleDogXCIlLipmXCIpICopXG4gIHwgQXJnX3ByZWNpc2lvbiA6IChpbnQgLT4gJ2EsICdhKSBwcmVjaXNpb25cblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZixcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwcmVjaXNpb24gb3B0aW9uIChubyBleHRyYSBhcmd1bWVudCkgKilcbnR5cGUgcHJlY19vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIHNlZSB0aGUgQ3VzdG9tIGZvcm1hdCBjb21iaW5hdG9yICopXG50eXBlICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgPVxuICB8IEN1c3RvbV96ZXJvIDogKCdhLCBzdHJpbmcsICdhKSBjdXN0b21fYXJpdHlcbiAgfCBDdXN0b21fc3VjYyA6ICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgLT5cbiAgICAoJ2EsICd4IC0+ICdiLCAneCAtPiAnYykgY3VzdG9tX2FyaXR5XG5cbigqKiopXG5cbigqICAgICAgICBSZWxhdGlvbmFsIGZvcm1hdCB0eXBlc1xuXG5JbiB0aGUgZmlyc3QgZm9ybWF0K2dhZHRzIGltcGxlbWVudGF0aW9uLCB0aGUgdHlwZSBmb3IgJSguLiUpIGluIHRoZVxuZm10IEdBRFQgd2FzIGFzIGZvbGxvd3M6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKiAoJ2QxLCAncTEsICdkMiwgJ3EyKSByZWFkZXJfbmJfdW5pZmllciAqXG4gICAgKCd4LCAnYiwgJ2MsICdkMSwgJ3ExLCAndSkgZm10dHkgKlxuICAgICgndSwgJ2IsICdjLCAncTEsICdlMSwgJ2YpIGZtdCAtPlxuICAgICAgKCgneCwgJ2IsICdjLCAnZDIsICdxMiwgJ3UpIGZvcm1hdDYgLT4gJ3gsICdiLCAnYywgJ2QxLCAnZTEsICdmKSBmbXRcblxuTm90aWNlIHRoYXQgdGhlICd1IHBhcmFtZXRlciBpbiAnZiBwb3NpdGlvbiBpbiB0aGUgZm9ybWF0IGFyZ3VtZW50XG4oKCd4LCAuLiwgJ3UpIGZvcm1hdDYgLT4gLi4pIGlzIGVxdWFsIHRvIHRoZSAndSBwYXJhbWV0ZXIgaW4gJ2FcbnBvc2l0aW9uIGluIHRoZSBmb3JtYXQgdGFpbCAoKCd1LCAuLiwgJ2YpIGZtdCkuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbnR5cGUgb2YgdGhlIGV4cGVjdGVkIGZvcm1hdCBwYXJhbWV0ZXIgZGVwZW5kcyBvZiB3aGVyZSB0aGUgJSguLi4lKVxuYXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nOlxuXG4gICMgUHJpbnRmLnByaW50ZiBcIiUoJSlcIlxuICAtIDogKHVuaXQsIG91dF9jaGFubmVsLCB1bml0LCAnX2EsICdfYSwgdW5pdClcbiAgICAgIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2IC0+IHVuaXRcbiAgPSA8ZnVuPlxuICAjIFByaW50Zi5wcmludGYgXCIlKCUpJWRcIlxuICAtIDogKGludCAtPiB1bml0LCBvdXRfY2hhbm5lbCwgdW5pdCwgJ19hLCAnX2EsIGludCAtPiB1bml0KVxuICAgICAgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDYgLT4gaW50IC0+IHVuaXRcbiAgPSA8ZnVuPlxuXG5PbiB0aGUgY29udHJhcnksIHRoZSBsZWdhY3kgdHlwZXIgZ2l2ZXMgYSBjbGV2ZXIgdHlwZSB0aGF0IGRvZXMgbm90XG5kZXBlbmQgb24gdGhlIHBvc2l0aW9uIG9mICUoLi4lKSBpbiB0aGUgZm9ybWF0IHN0cmluZy4gRm9yIGV4YW1wbGUsXG4lKCUpIHdpbGwgaGF2ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSk6IGl0IGNhblxuYmUgY29uY2F0ZW5hdGVkIHRvIGFueSBmb3JtYXQgdHlwZSwgYW5kIG9ubHkgZW5mb3JjZXMgdGhlIGNvbnN0cmFpbnRcbnRoYXQgaXRzICdhIGFuZCAnZiBwYXJhbWV0ZXJzIGFyZSBlcXVhbCAobm8gZm9ybWF0IGFyZ3VtZW50cykgYW5kICdkXG5hbmQgJ2UgYXJlIGVxdWFsIChubyByZWFkZXIgYXJndW1lbnQpLlxuXG5UaGUgd2Vha2VuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIEdBRFQgdmVyc2lvbiBicm9rZSB1c2VyXG5jb2RlIChpbiBmYWN0IGl0IGVzc2VudGlhbGx5IG1hZGUgJSguLi4lKSB1bnVzYWJsZSBleGNlcHQgYXQgdGhlIGxhc3RcbnBvc2l0aW9uIG9mIGEgZm9ybWF0KS4gSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB3b3VsZCBub3Qgd29ya1xuYW55bW9yZTpcblxuICBmdW4gc2VwIC0+XG4gICAgRm9ybWF0LnByaW50ZiBcImZvbyUoJSliYXIlKCUpYmF6XCIgc2VwIHNlcFxuXG5BcyB0aGUgdHlwZS1jaGVja2VyIHdvdWxkIHJlcXVpcmUgdHdvICppbmNvbXBhdGlibGUqIHR5cGVzIGZvciB0aGUgJSglKVxuaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cblxuVGhlIHNvbHV0aW9uIHRvIHJlZ2FpbiBhIGdlbmVyYWwgdHlwZSBmb3IgJSguLiUpIGlzIHRvIGdlbmVyYWxpemUgdGhpc1xudGVjaG5pcXVlLCBub3Qgb25seSBvbiB0aGUgJ2QsICdlIHBhcmFtZXRlcnMsIGJ1dCBvbiBhbGwgc2l4XG5wYXJhbWV0ZXJzIG9mIGEgZm9ybWF0OiB3ZSBpbnRyb2R1Y2UgYSBcInJlbGF0aW9uYWxcIiB0eXBlXG4gICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG53aG9zZSB2YWx1ZXMgYXJlIHByb29mcyB0aGF0ICgnYTEsIC4uLCAnZjEpIGFuZCAoJ2EyLCAuLiwgJ2YyKSBtb3JhbGx5XG5jb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZvcm1hdCB0eXBlOiAnYTEgaXMgb2J0YWluZWQgZnJvbSAnZjEsJ2IxLCdjMVxuaW4gdGhlIGV4YWN0IHNhbWUgd2F5IHRoYXQgJ2EyIGlzIG9idGFpbmVkIGZyb20gJ2YyLCdiMiwnYzIsIGV0Yy5cblxuRm9yIGV4YW1wbGUsIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHR3byBmb3JtYXQgdHlwZXMgYmVnaW5uaW5nIHdpdGggYSBDaGFyXG5wYXJhbWV0ZXIgaXMgYXMgZm9sbG93czpcblxufCBDaGFyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgICopXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgIChjaGFyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgIGNoYXIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbkluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSB0ZXJtIHN0cnVjdHVyZSBvZiBmbXR0eV9yZWwgaXMgKGFsbW9zdFsxXSlcbmlzb21vcnBoaWMgdG8gdGhlIGZtdHR5IG9mIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbjogZXZlcnlcbmNvbnN0cnVjdG9yIGlzIHJlLXJlYWQgd2l0aCBhIGJpbmFyeSwgcmVsYXRpb25hbCB0eXBlLCBpbnN0ZWFkIG9mIHRoZVxucHJldmlvdXMgdW5hcnkgdHlwaW5nLiBmbXR0eSBjYW4gdGhlbiBiZSByZS1kZWZpbmVkIGFzIHRoZSBkaWFnb25hbCBvZlxuZm10dHlfcmVsOlxuXG4gIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5ID1cbiAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICAgJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfcmVsXG5cbk9uY2Ugd2UgaGF2ZSB0aGlzIGZtdHR5X3JlbCB0eXBlIGluIHBsYWNlLCB3ZSBjYW4gZ2l2ZSB0aGUgbW9yZVxuZ2VuZXJhbCB0eXBlIHRvICUoLi4uJSk6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKlxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzIsICdiLCAnYywgJ2oyLCAnZCwgJ2EpIGZtdHR5X3JlbCAqXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiLCAnYywgJ2oyLCAnZSwgJ2YpIGZtdFxuXG5XZSBhY2NlcHQgYW55IGZvcm1hdCAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYpICh0aGlzIGlzXG5jb21wbGV0ZWx5IHVucmVsYXRlZCB0byB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmb3JtYXQpLCBidXQgYWxzb1xucmVxdWlyZSBhIHByb29mIHRoYXQgdGhpcyBmb3JtYXQgaXMgaW4gcmVsYXRpb24gdG8gYW5vdGhlciBmb3JtYXQgdGhhdFxuaXMgY29uY2F0ZW5hYmxlIHRvIHRoZSBmb3JtYXQgdGFpbC4gV2hlbiBleGVjdXRpbmcgYSAlKC4uLiUpIGZvcm1hdFxuKGluIGNhbWxpbnRlcm5hbEZvcm1hdC5tbDptYWtlX3ByaW50ZiBvciBzY2FuZi5tbDptYWtlX3NjYW5mKSwgd2VcbnRyYW5zdHlwZSB0aGUgZm9ybWF0IGFsb25nIHRoaXMgcmVsYXRpb24gdXNpbmcgdGhlICdyZWNhc3QnIGZ1bmN0aW9uXG50byB0cmFuc3Bvc2UgYmV0d2VlbiByZWxhdGVkIGZvcm1hdCB0eXBlcy5cblxuICB2YWwgcmVjYXN0IDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEpIGZtdFxuICAtPiAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICAtPiAoJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10XG5cbk5PVEUgWzFdOiB0aGUgdHlwaW5nIG9mIEZvcm1hdF9zdWJzdF90eSByZXF1aXJlcyBub3Qgb25lIGZvcm1hdCB0eXBlLCBidXRcbnR3bywgb25lIHRvIGVzdGFibGlzaCB0aGUgbGluayBiZXR3ZWVuIHRoZSBmb3JtYXQgYXJndW1lbnQgYW5kIHRoZVxuZmlyc3Qgc2l4IHBhcmFtZXRlcnMsIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSBsaW5rIGJldHdlZW4gdGhlIGZvcm1hdFxuYXJndW1lbnQgYW5kIHRoZSBsYXN0IHNpeCBwYXJhbWV0ZXJzLlxuXG58IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2QxLCAnYTEpIGZtdHR5X3JlbCAqXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2QyLCAnYTIpIGZtdHR5X3JlbCAqXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzEsICdiMSwgJ2MxLCAnajEsICdlMSwgJ2YxLFxuICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiMiwgJ2MyLCAnajIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuV2hlbiB3ZSBnZW5lcmF0ZSBhIGZvcm1hdCBBU1QsIHdlIGdlbmVyYXRlIGV4YWN0bHkgdGhlIHNhbWUgd2l0bmVzc1xuZm9yIGJvdGggcmVsYXRpb25zLCBhbmQgdGhlIHdpdG5lc3MtY29udmVyc2lvbiBmdW5jdGlvbnMgaW5cbmNhbWxpbnRlcm5hbEZvcm1hdCBkbyByZWx5IG9uIHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSwgdGhlXG5mdW5jdGlvbiB0aGF0IHByb3ZlcyB0aGF0IHRoZSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlXG5cbiAgdmFsIHRyYW5zIDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgLT4gKCdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcbiAgLT4gKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcblxuZG9lcyBhc3N1bWUgdGhhdCB0aGUgdHdvIGlucHV0cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdGVybSBzdHJ1Y3R1cmVcbihhbmQgaXMgb25seSBldmVyeSB1c2VkIGZvciBhcmd1bWVudCB3aXRuZXNzZXMgb2YgdGhlXG5Gb3JtYXRfc3Vic3RfdHkgY29uc3RydWN0b3IpLlxuKilcblxuKCogVHlwZSBvZiBhIGJsb2NrIHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgYmxvY2tfdHlwZSA9XG4gIHwgUHBfaGJveCAgICgqIEhvcml6b250YWwgYmxvY2sgbm8gbGluZSBicmVha2luZyAqKVxuICB8IFBwX3Zib3ggICAoKiBWZXJ0aWNhbCBibG9jayBlYWNoIGJyZWFrIGxlYWRzIHRvIGEgbmV3IGxpbmUgKilcbiAgfCBQcF9odmJveCAgKCogSG9yaXpvbnRhbC12ZXJ0aWNhbCBibG9jazogc2FtZSBhcyB2Ym94LCBleGNlcHQgaWYgdGhpcyBibG9ja1xuICAgICAgICAgICAgICAgICBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgc2luZ2xlIGxpbmUgKilcbiAgfCBQcF9ob3Zib3ggKCogSG9yaXpvbnRhbCBvciBWZXJ0aWNhbCBibG9jazogYnJlYWtzIGxlYWQgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgb25seSB3aGVuIG5lY2Vzc2FyeSB0byBwcmludCB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgKilcbiAgfCBQcF9ib3ggICAgKCogSG9yaXpvbnRhbCBvciBJbmRlbnQgYmxvY2s6IGJyZWFrcyBsZWFkIHRvIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrLCBvclxuICAgICAgICAgICAgICAgICB3aGVuIGl0IGxlYWRzIHRvIGEgbmV3IGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUgKilcbiAgfCBQcF9maXRzICAgKCogSW50ZXJuYWwgdXNhZ2U6IHdoZW4gYSBibG9jayBmaXRzIG9uIGEgc2luZ2xlIGxpbmUgKilcblxuKCogRm9ybWF0dGluZyBlbGVtZW50IHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgZm9ybWF0dGluZ19saXQgPVxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXSAgICopXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEB9ICAgKilcbiAgfCBCcmVhayBvZiBzdHJpbmcgKiBpbnQgKiBpbnQgICAgICAgICAgKCogQCwgfCBAICB8IEA7IHwgQDs8PiAqKVxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAPyAgICopXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBcXG4gICopXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAuICAgKilcbiAgfCBNYWdpY19zaXplIG9mIHN0cmluZyAqIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQDxuPiAqKVxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAQCAgICopXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAlJSAgKilcbiAgfCBTY2FuX2luZGljIG9mIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQFggICAqKVxuXG4oKiBGb3JtYXR0aW5nIGVsZW1lbnQgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW4gPVxuICB8IE9wZW5fdGFnIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gICAgICAoKiBAeyAgICopXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuXG4gIHwgT3Blbl9ib3ggOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAgICAgICgqIEBbICAgKilcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW5cblxuKCoqKilcblxuKCogTGlzdCBvZiBmb3JtYXQgdHlwZSBlbGVtZW50cy4gKilcbigqIEluIHBhcnRpY3VsYXIgdXNlZCB0byByZXByZXNlbnQgJSguLi4lKSBhbmQgJXsuLi4lfSBjb250ZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgPVxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X3JlbFxuYW5kICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgPVxuICB8IENoYXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGNoYXIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBjaGFyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IFN0cmluZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKHN0cmluZyAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIHN0cmluZyAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50MzJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVsZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50MzIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQzMiAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBOYXRpdmVpbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJW5kICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChuYXRpdmVpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBuYXRpdmVpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50NjRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVMZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50NjQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQ2NCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBGbG9hdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWYgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChmbG9hdCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGZsb2F0IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEJvb2xfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQiAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGJvb2wgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBib29sIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRm9ybWF0X2FyZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV7Li4uJX0gKilcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAqXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpXG4gICAgICAgICAgIGZtdHR5X3JlbFxuICB8IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzEsICdiMSwgJ2MxLCAnajEsICdkMSwgJ2ExKSBmbXR0eV9yZWwgKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZDIsICdhMikgZm10dHlfcmVsICpcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZTIsICdmMilcbiAgICAgICAgICAgZm10dHlfcmVsXG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzLiAqKVxuICB8IEFscGhhX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYSAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnYjEgLT4gJ3ggLT4gJ2MxKSAtPiAneCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnYjIgLT4gJ3ggLT4gJ2MyKSAtPiAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBUaGV0YV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2IxIC0+ICdjMSkgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2IyIC0+ICdjMikgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgQW55X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBVc2VkIGZvciBjdXN0b20gZm9ybWF0cyAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ3ggLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3Rvci4gKilcbiAgfCBSZWFkZXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXIgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgneCAtPiAnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICd4IC0+ICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IElnbm9yZWRfcmVhZGVyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3IgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRW5kX29mX2ZtdHR5IDpcbiAgICAgICgnZjEsICdiMSwgJ2MxLCAnZDEsICdkMSwgJ2YxLFxuICAgICAgICdmMiwgJ2IyLCAnYzIsICdkMiwgJ2QyLCAnZjIpIGZtdHR5X3JlbFxuXG4oKioqKVxuXG4oKiBMaXN0IG9mIGZvcm1hdCBlbGVtZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10ID1cbiAgfCBDaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlUyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQzMiAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IE5hdGl2ZWludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVuW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgbmF0aXZlaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQ2NCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZsb2F0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbZmVFZ0dGaEhdICopXG4gICAgICBmbG9hdF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgZmxvYXQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBCb29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2JCXSAqKVxuICAgICAgKCd4LCBib29sIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRmx1c2ggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogYWJjICopXG4gICAgICBzdHJpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDaGFyX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiB4ICopXG4gICAgICBjaGFyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgfCBGb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAley4uLiV9ICopXG4gICAgICBwYWRfb3B0aW9uICogKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5ICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAgIHBhZF9vcHRpb24gKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYiwgJ2MsICdqMiwgJ2QsICdhKSBmbXR0eV9yZWwgKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IsICdjLCAnajIsICdlLCAnZikgZm10XG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3IuICopXG4gIHwgQWxwaGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAneCAtPiAnYykgLT4gJ3ggLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgVGhldGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAnYykgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yOiAqKVxuICB8IEZvcm1hdHRpbmdfbGl0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBfICopXG4gICAgICBmb3JtYXR0aW5nX2xpdCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdHRpbmdfZ2VuIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXyAqKVxuICAgICAgKCdhMSwgJ2IsICdjLCAnZDEsICdlMSwgJ2YxKSBmb3JtYXR0aW5nX2dlbiAqXG4gICAgICAoJ2YxLCAnYiwgJ2MsICdlMSwgJ2UyLCAnZjIpIGZtdCAtPiAoJ2ExLCAnYiwgJ2MsICdkMSwgJ2UyLCAnZjIpIGZtdFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBSZWFkZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3ggLT4gJ2EsICdiLCAnYywgKCdiIC0+ICd4KSAtPiAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2NoYXJfc2V0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKHN0cmluZyAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2dldF9jb3VudGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW25sTkxdICopXG4gICAgICBjb3VudGVyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoaW50IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fbmV4dF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUwYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSWdub3JlZF9wYXJhbSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8gKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBpZ25vcmVkICogKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogQ3VzdG9tIHByaW50aW5nIGZvcm1hdCAoUFIjNjQ1MiwgR1BSIzE0MClcblxuICAgICBXZSBpbmNsdWRlIGEgdHlwZSBDdXN0b20gb2YgXCJjdXN0b20gY29udmVydGVyc1wiLCB3aGVyZSBhblxuICAgICBhcmJpdHJhcnkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgb3IgbW9yZVxuICAgICBhcmd1bWVudHMuIFRoZXJlIGlzIG5vIHN5bnRheCBmb3IgY3VzdG9tIGNvbnZlcnRlcnMsIGl0IGlzIG9ubHlcbiAgICAgaW50ZW5kZWQgZm9yIGN1c3RvbSBwcm9jZXNzb3JzIHRoYXQgd2lzaCB0byByZWx5IG9uIHRoZVxuICAgICBzdGRsaWItZGVmaW5lZCBmb3JtYXQgR0FEVHMuXG5cbiAgICAgRm9yIGluc3RhbmNlIGEgcHJlLXByb2Nlc3NvciBjb3VsZCBjaG9vc2UgdG8gaW50ZXJwcmV0IHN0cmluZ3NcbiAgICAgcHJlZml4ZWQgd2l0aCBbXCIhXCJdIGFzIGZvcm1hdCBzdHJpbmdzIHdoZXJlIFsle3sgLi4uIH19XSBpc1xuICAgICBhIHNwZWNpYWwgZm9ybSB0byBwYXNzIGEgdG9fc3RyaW5nIGZ1bmN0aW9uLCBzbyB0aGF0IG9uZSBjb3VsZFxuICAgICB3cml0ZTpcblxuICAgICB7W1xuICAgICAgIHR5cGUgdCA9IHsgeCA6IGludDsgeSA6IGludCB9XG5cbiAgICAgICBsZXQgc3RyaW5nX29mX3QgdCA9IFByaW50Zi5zcHJpbnRmIFwieyB4ID0gJWQ7IHkgPSAlZCB9XCIgdC54IHQueVxuXG4gICAgICAgUHJpbnRmLnByaW50ZiAhXCJ0ID0gJXt7c3RyaW5nX29mX3R9fVwiIHsgeCA9IDQyOyB5ID0gNDIgfVxuICAgICBdfVxuICAqKVxuICB8IEN1c3RvbSA6XG4gICAgICAoJ2EsICd4LCAneSkgY3VzdG9tX2FyaXR5ICogKHVuaXQgLT4gJ3gpICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCd5LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIGVuZCBvZiBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uICopXG4gIHwgRW5kX29mX2Zvcm1hdCA6XG4gICAgICAgICgnZiwgJ2IsICdjLCAnZSwgJ2UsICdmKSBmbXRcblxuKCoqKilcblxuKCogVHlwZSBmb3IgaWdub3JlZCBwYXJhbWV0ZXJzIChzZWUgXCIlX1wiKS4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZCA9XG4gIHwgSWdub3JlZF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9jICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfY2FtbF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2QgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfbmF0aXZlaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbmQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfTGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZmxvYXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfZiAqKVxuICAgICAgcGFkX29wdGlvbiAqIHByZWNfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9ib29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9CICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV97Li4uJX0gKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXyguLi4lKSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZFxuICB8IElnbm9yZWRfcmVhZGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICgnYiAtPiAneCkgLT4gJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfW25sTkxdICopXG4gICAgICBjb3VudGVyIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8wYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcblxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID1cbiAgRm9ybWF0IG9mICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgKiBzdHJpbmdcblxubGV0IHJlYyBlcmFzZV9yZWwgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYsXG4gICBnLCBoLCBpLCBqLCBrLCBsKSBmbXR0eV9yZWwgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5XG49IGZ1bmN0aW9uXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBTdHJpbmdfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludF90eSByZXN0IC0+XG4gICAgSW50X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBOYXRpdmVpbnRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgQm9vbF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGVyYXNlX3JlbCByZXN0KVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCBfdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTEsIGVyYXNlX3JlbCByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBBbHBoYV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIFRoZXRhX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBSZWFkZXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCB0eXBlIGNvbmNhdGVuYXRpb24gKilcblxuKCogQ29uY2F0ZW5hdGUgdHdvIGZvcm1hdCB0eXBlcy4gKilcbigqIFVzZWQgYnk6XG4gICAqIHJlYWRlcl9uYl91bmlmaWVyX29mX2ZtdHR5IHRvIGNvdW50IHJlYWRlcnMgaW4gYW4gZm10dHksXG4gICAqIFNjYW5mLnRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgdG8gZXh0cmFjdCByZWFkZXJzIGluc2lkZSAlKC4uLiUpLFxuICAgKiBDYW1saW50ZXJuYWxGb3JtYXQuZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgdG8gZXh0cmFjdCBmb3JtYXQgdHlwZS4gKilcblxuKCpcbmxldCByZWMgY29uY2F0X2ZtdHR5IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggLlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChmLCBiLCBjLCBlLCBnLCBoKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXR0eSA9XG4qKVxubGV0IHJlYyBjb25jYXRfZm10dHkgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgICAgICBnMSBqMSBnMiBqMlxuICAuXG4gICAgKGcxLCBiMSwgYzEsIGoxLCBkMSwgYTEsXG4gICAgIGcyLCBiMiwgYzIsIGoyLCBkMiwgYTIpIGZtdHR5X3JlbCAtPlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWwgLT5cbiAgICAoZzEsIGIxLCBjMSwgajEsIGUxLCBmMSxcbiAgICAgZzIsIGIyLCBjMiwgajIsIGUyLCBmMikgZm10dHlfcmVsID1cbmZ1biBmbXR0eTEgZm10dHkyIC0+IG1hdGNoIGZtdHR5MSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgU3RyaW5nX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBJbnRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIE5hdGl2ZWludF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIEJvb2xfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgQWxwaGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgVGhldGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgUmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBFbmRfb2ZfZm10dHkgLT4gZm10dHkyXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgY29uY2F0ZW5hdGlvbiAqKVxuXG4oKiBDb25jYXRlbmF0ZSB0d28gZm9ybWF0cy4gKilcbmxldCByZWMgY29uY2F0X2ZtdCA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIC5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKGYsIGIsIGMsIGUsIGcsIGgpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXQgPVxuZnVuIGZtdDEgZm10MiAtPiBtYXRjaCBmbXQxIHdpdGhcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBTdHJpbmcgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBDYW1sX3N0cmluZyAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludDMyIChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgQ2hhciAocmVzdCkgLT5cbiAgICBDaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIENhbWxfY2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIEJvb2wgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIEFscGhhIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBUaGV0YSByZXN0IC0+XG4gICAgVGhldGEgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEN1c3RvbSAoYXJpdHksIGYsIHJlc3QpIC0+XG4gICAgQ3VzdG9tIChhcml0eSwgZiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgUmVhZGVyIHJlc3QgLT5cbiAgICBSZWFkZXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBGbHVzaCAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIFN0cmluZ19saXRlcmFsIChzdHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIENoYXJfbGl0ZXJhbCAgIChjaHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnICAgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3QgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgIFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFNjYW5fbmV4dF9jaGFyIChyZXN0KSAtPlxuICAgIFNjYW5fbmV4dF9jaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgSWdub3JlZF9wYXJhbSAoaWduLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgLT5cbiAgICBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgZm10MlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJlcmFzZV9yZWwiLCJwYXJhbSIsInJlc3QiLCJ0eSIsInR5MSIsImNvbmNhdF9mbXR0eSIsImZtdHR5MSIsImZtdHR5MiIsInR5MiIsImNvbmNhdF9mbXQiLCJmbXQxIiwiZm10MiIsInBhZCIsInByZWMiLCJpY29udiIsImZjb252Iiwic3RyIiwiY2hyIiwiZm10dHkiLCJmbXRpbmdfbGl0IiwiZm10aW5nX2dlbiIsImNoYXJfc2V0Iiwid2lkdGhfb3B0IiwiY291bnRlciIsImlnbiIsImYiLCJhcml0eSJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxVQUFBQztBQUFBQSxJQytnQlEsOEJBa0NZO0FBQUEsSUFsQ1o7QUFBQTtBQUFBLFdBQUFDLE9BQUEsVUFLSSwyQkFBZ0I7QUFBQTtBQUFBLFdBQUFBLFNBTHBCLFVBT00sNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQVB0QixVQVNHLDZCQUFnQjtBQUFBO0FBQUEsV0FBQUEsU0FUbkIsVUFXSyw2QkFBZ0I7QUFBQTtBQUFBLFdBQUFBLFNBWHJCLFVBZVMsNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQWZ6QixVQWFLLDZCQUFnQjtBQUFBO0FBQUEsV0FBQUEsU0FickIsVUFpQkssNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQWpCckIsVUFtQkksNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQW5CcEIsVUFBQUMsS0FBQTtBQUFBLE9BcUJlLGlDQUFjO0FBQUE7QUFBQSxXQUFBRCxTQXJCN0IsVUFBQUUsTUFBQTtBQUFBLE9BdUJ1Qix1Q0FBYztBQUFBO0FBQUEsV0FBQUYsU0F2QnJDLFVBeUJLLDhCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUF6QnJCLFVBMkJLLCtCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUEzQnJCLFVBNkJHLCtCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUE3Qm5CLFVBK0JNLCtCQUFnQjtBQUFBLG1CQUFBQSxVQS9CdEIsVUFpQ2Ms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QUEsT0F3RGUsa0RBQW9CO0FBQUE7QUFBQSxXQUFBbEIsVUF4RG5DLFNBOEJOLHNDQUFzQjtBQUFBO0FBQUEsV0FBQUEsVUE5QmhCLFNBQUFtQixXQUFBLFNBQUFDLFlBQUE7QUFBQSxPQTZDdUIsMkRBQW9CO0FBQUE7QUFBQSxXQUFBcEIsVUE3QzNDLFNBQUFxQixVQUFBO0FBQUEsT0ErQ2MsK0NBQW9CO0FBQUE7QUFBQSxXQUFBckIsVUEvQ2xDLFNBaURFLHNDQUFzQjtBQUFBO0FBQUEsV0FBQUEsVUFqRHhCLFNBQUFzQixNQUFBO0FBQUEsT0FtRE8sMkNBQW9CO0FBQUE7QUFBQSxXQUFBdEIsVUFuRDNCLFNBQUF1QixJQUFBLFNBQUFDLFFBQUE7QUFBQSxPQTRCSyxnREFBb0I7QUFBQTtBQUFBLEdBK0JsQztBQUFBLEdEanJCUiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjk0ODksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RkbGliLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFeGNlcHRpb25zICopXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlXCJcblxubGV0ICgpID1cbiAgKCogZm9yIHJ1bnRpbWUvZmFpbF9uYXQuYyAqKVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlBlcnZhc2l2ZXMuYXJyYXlfYm91bmRfZXJyb3JcIlxuICAgIChJbnZhbGlkX2FyZ3VtZW50IFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKVxuXG5leHRlcm5hbCByYWlzZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlXCJcbmV4dGVybmFsIHJhaXNlX25vdHJhY2UgOiBleG4gLT4gJ2EgPSBcIiVyYWlzZV9ub3RyYWNlXCJcblxubGV0IGZhaWx3aXRoIHMgPSByYWlzZShGYWlsdXJlIHMpXG5sZXQgaW52YWxpZF9hcmcgcyA9IHJhaXNlKEludmFsaWRfYXJndW1lbnQgcylcblxuZXhjZXB0aW9uIEV4aXRcbmV4Y2VwdGlvbiBNYXRjaF9mYWlsdXJlID0gTWF0Y2hfZmFpbHVyZVxuZXhjZXB0aW9uIEFzc2VydF9mYWlsdXJlID0gQXNzZXJ0X2ZhaWx1cmVcbmV4Y2VwdGlvbiBJbnZhbGlkX2FyZ3VtZW50ID0gSW52YWxpZF9hcmd1bWVudFxuZXhjZXB0aW9uIEZhaWx1cmUgPSBGYWlsdXJlXG5leGNlcHRpb24gTm90X2ZvdW5kID0gTm90X2ZvdW5kXG5leGNlcHRpb24gT3V0X29mX21lbW9yeSA9IE91dF9vZl9tZW1vcnlcbmV4Y2VwdGlvbiBTdGFja19vdmVyZmxvdyA9IFN0YWNrX292ZXJmbG93XG5leGNlcHRpb24gU3lzX2Vycm9yID0gU3lzX2Vycm9yXG5leGNlcHRpb24gRW5kX29mX2ZpbGUgPSBFbmRfb2ZfZmlsZVxuZXhjZXB0aW9uIERpdmlzaW9uX2J5X3plcm8gPSBEaXZpc2lvbl9ieV96ZXJvXG5leGNlcHRpb24gU3lzX2Jsb2NrZWRfaW8gPSBTeXNfYmxvY2tlZF9pb1xuZXhjZXB0aW9uIFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlID0gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGVcblxuKCogQ29tcG9zaXRpb24gb3BlcmF0b3JzICopXG5cbmV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5leHRlcm5hbCAoIEBAICkgOiAoJ2EgLT4gJ2IpIC0+ICdhIC0+ICdiID0gXCIlYXBwbHlcIlxuXG4oKiBEZWJ1Z2dpbmcgKilcblxuZXh0ZXJuYWwgX19MT0NfXyA6IHN0cmluZyA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19GSUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfRklMRVwiXG5leHRlcm5hbCBfX0xJTkVfXyA6IGludCA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fTU9EVUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfTU9EVUxFXCJcbmV4dGVybmFsIF9fUE9TX18gOiBzdHJpbmcgKiBpbnQgKiBpbnQgKiBpbnQgPSBcIiVsb2NfUE9TXCJcbmV4dGVybmFsIF9fRlVOQ1RJT05fXyA6IHN0cmluZyA9IFwiJWxvY19GVU5DVElPTlwiXG5cbmV4dGVybmFsIF9fTE9DX09GX18gOiAnYSAtPiBzdHJpbmcgKiAnYSA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19MSU5FX09GX18gOiAnYSAtPiBpbnQgKiAnYSA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fUE9TX09GX18gOiAnYSAtPiAoc3RyaW5nICogaW50ICogaW50ICogaW50KSAqICdhID0gXCIlbG9jX1BPU1wiXG5cbigqIENvbXBhcmlzb25zICopXG5cbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5leHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5leHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5leHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbmV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuXG5sZXQgbWluIHggeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbmV4dGVybmFsICggPT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcVwiXG5leHRlcm5hbCAoICE9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXFcIlxuXG4oKiBCb29sZWFuIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuXG4oKiBJbnRlZ2VyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgKCB+LSApIDogaW50IC0+IGludCA9IFwiJW5lZ2ludFwiXG5leHRlcm5hbCAoIH4rICkgOiBpbnQgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5leHRlcm5hbCAoICsgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsICggLSApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgKCAqICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW11bGludFwiXG5leHRlcm5hbCAoIC8gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbmV4dGVybmFsICggbW9kICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW1vZGludFwiXG5cbmxldCBhYnMgeCA9IGlmIHggPj0gMCB0aGVuIHggZWxzZSAteFxuXG5leHRlcm5hbCAoIGxhbmQgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsICggbG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsICggbHhvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxuXG5sZXQgbG5vdCB4ID0geCBseG9yICgtMSlcblxuZXh0ZXJuYWwgKCBsc2wgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNsaW50XCJcbmV4dGVybmFsICggbHNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5leHRlcm5hbCAoIGFzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhc3JpbnRcIlxuXG5sZXQgbWF4X2ludCA9ICgtMSkgbHNyIDFcbmxldCBtaW5faW50ID0gbWF4X2ludCArIDFcblxuKCogRmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCAoIH4tLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVuZWdmbG9hdFwiXG5leHRlcm5hbCAoIH4rLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCAoICsuICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFkZGZsb2F0XCJcbmV4dGVybmFsICggLS4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlc3ViZmxvYXRcIlxuZXh0ZXJuYWwgKCAqLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVtdWxmbG9hdFwiXG5leHRlcm5hbCAoIC8uICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWRpdmZsb2F0XCJcbmV4dGVybmFsICggKiogKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Bvd2VyX2Zsb2F0XCIgXCJwb3dcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc19mbG9hdFwiIFwiYWNvc1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbl9mbG9hdFwiIFwiYXNpblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbl9mbG9hdFwiIFwiYXRhblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW4yX2Zsb2F0XCIgXCJhdGFuMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBoeXBvdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICA9IFwiY2FtbF9oeXBvdF9mbG9hdFwiIFwiY2FtbF9oeXBvdFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NfZmxvYXRcIiBcImNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zaF9mbG9hdFwiIFwiY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NoX2Zsb2F0XCIgXCJjYW1sX2Fjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZ19mbG9hdFwiIFwibG9nXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzEwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMTBfZmxvYXRcIiBcImxvZzEwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luaF9mbG9hdFwiIFwiY2FtbF9hc2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5fZmxvYXRcIiBcInRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuaF9mbG9hdFwiIFwidGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5oX2Zsb2F0XCIgXCJjYW1sX2F0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNlaWwgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jZWlsX2Zsb2F0XCIgXCJjZWlsXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb29yIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZmxvb3JfZmxvYXRcIiBcImZsb29yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFic19mbG9hdCA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWJzZmxvYXRcIlxuZXh0ZXJuYWwgY29weXNpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZF9mbG9hdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Ztb2RfZmxvYXRcIiBcImZtb2RcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbmV4dGVybmFsIGZsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBmbG9hdF9vZl9pbnQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIHRydW5jYXRlIDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBpbnRfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgaW5maW5pdHkgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgbmVnX2luZmluaXR5ID1cbiAgZmxvYXRfb2ZfYml0cyAweEZGX0YwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IG5hbiA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9GOF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBtYXhfZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRUZfRkZfRkZfRkZfRkZfRkZfRkZMXG5sZXQgbWluX2Zsb2F0ID1cbiAgZmxvYXRfb2ZfYml0cyAweDAwXzEwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IGVwc2lsb25fZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4M0NfQjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5cbnR5cGUgZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuXG4oKiBTdHJpbmcgYW5kIGJ5dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZXMgU3RyaW5nIGFuZCBCeXRlcyAqKVxuXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgYnl0ZXNfbGVuZ3RoIDogYnl0ZXMgLT4gaW50ID0gXCIlYnl0ZXNfbGVuZ3RoXCJcbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZSA6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgc3RyaW5nX2JsaXQgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfYmxpdCA6IGJ5dGVzIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyA6IGJ5dGVzIC0+IHN0cmluZyA9IFwiJWJ5dGVzX3RvX3N0cmluZ1wiXG5cbmxldCAoIF4gKSBzMSBzMiA9XG4gIGxldCBsMSA9IHN0cmluZ19sZW5ndGggczEgYW5kIGwyID0gc3RyaW5nX2xlbmd0aCBzMiBpblxuICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSAobDEgKyBsMikgaW5cbiAgc3RyaW5nX2JsaXQgczEgMCBzIDAgbDE7XG4gIHN0cmluZ19ibGl0IHMyIDAgcyBsMSBsMjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbigqIENoYXJhY3RlciBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlIENoYXIgKilcblxuZXh0ZXJuYWwgaW50X29mX2NoYXIgOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaGFyX29mX2ludCA6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxubGV0IGNoYXJfb2ZfaW50IG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJjaGFyX29mX2ludFwiIGVsc2UgdW5zYWZlX2NoYXJfb2ZfaW50IG5cblxuKCogVW5pdCBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4oKiBQYWlyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgZnN0IDogJ2EgKiAnYiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCBzbmQgOiAnYSAqICdiIC0+ICdiID0gXCIlZmllbGQxXCJcblxuKCogUmVmZXJlbmNlcyAqKVxuXG50eXBlICdhIHJlZiA9IHsgbXV0YWJsZSBjb250ZW50cyA6ICdhIH1cbmV4dGVybmFsIHJlZiA6ICdhIC0+ICdhIHJlZiA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsICggISApIDogJ2EgcmVmIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsICggOj0gKSA6ICdhIHJlZiAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcbmV4dGVybmFsIGluY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVpbmNyXCJcbmV4dGVybmFsIGRlY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVkZWNyXCJcblxuKCogUmVzdWx0IHR5cGUgKilcblxudHlwZSAoJ2EsJ2IpIHJlc3VsdCA9IE9rIG9mICdhIHwgRXJyb3Igb2YgJ2JcblxuKCogU3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcbmV4dGVybmFsIGZvcm1hdF9mbG9hdCA6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcblxubGV0IHN0cmluZ19vZl9ib29sIGIgPVxuICBpZiBiIHRoZW4gXCJ0cnVlXCIgZWxzZSBcImZhbHNlXCJcbmxldCBib29sX29mX3N0cmluZyA9IGZ1bmN0aW9uXG4gIHwgXCJ0cnVlXCIgLT4gdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBmYWxzZVxuICB8IF8gLT4gaW52YWxpZF9hcmcgXCJib29sX29mX3N0cmluZ1wiXG5cbmxldCBib29sX29mX3N0cmluZ19vcHQgPSBmdW5jdGlvblxuICB8IFwidHJ1ZVwiIC0+IFNvbWUgdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBTb21lIGZhbHNlXG4gIHwgXyAtPiBOb25lXG5cbmxldCBzdHJpbmdfb2ZfaW50IG4gPVxuICBmb3JtYXRfaW50IFwiJWRcIiBuXG5cbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxuXG5sZXQgaW50X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5leHRlcm5hbCBzdHJpbmdfZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcblxubGV0IHZhbGlkX2Zsb2F0X2xleGVtIHMgPVxuICBsZXQgbCA9IHN0cmluZ19sZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA+PSBsIHRoZW4gcyBeIFwiLlwiIGVsc2VcbiAgICBtYXRjaCBzdHJpbmdfZ2V0IHMgaSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IGxvb3AgKGkgKyAxKVxuICAgIHwgXyAtPiBzXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgc3RyaW5nX29mX2Zsb2F0IGYgPSB2YWxpZF9mbG9hdF9sZXhlbSAoZm9ybWF0X2Zsb2F0IFwiJS4xMmdcIiBmKVxuXG5leHRlcm5hbCBmbG9hdF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcblxubGV0IGZsb2F0X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGZsb2F0X29mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbigqIExpc3Qgb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZSBMaXN0ICopXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjICggQCApIGwxIGwyID1cbiAgbWF0Y2ggbDEgd2l0aFxuICB8IFtdIC0+IGwyXG4gIHwgaDEgOjogW10gLT4gaDEgOjogbDJcbiAgfCBoMSA6OiBoMiA6OiBbXSAtPiBoMSA6OiBoMiA6OiBsMlxuICB8IGgxIDo6IGgyIDo6IGgzIDo6IHRsIC0+IGgxIDo6IGgyIDo6IGgzIDo6ICh0bCBAIGwyKVxuXG4oKiBJL08gb3BlcmF0aW9ucyAqKVxuXG50eXBlIGluX2NoYW5uZWxcbnR5cGUgb3V0X2NoYW5uZWxcblxuZXh0ZXJuYWwgb3Blbl9kZXNjcmlwdG9yX291dCA6IGludCAtPiBvdXRfY2hhbm5lbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XCJcbmV4dGVybmFsIG9wZW5fZGVzY3JpcHRvcl9pbiA6IGludCAtPiBpbl9jaGFubmVsID0gXCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblwiXG5cbmxldCBzdGRpbiA9IG9wZW5fZGVzY3JpcHRvcl9pbiAwXG5sZXQgc3Rkb3V0ID0gb3Blbl9kZXNjcmlwdG9yX291dCAxXG5sZXQgc3RkZXJyID0gb3Blbl9kZXNjcmlwdG9yX291dCAyXG5cbigqIEdlbmVyYWwgb3V0cHV0IGZ1bmN0aW9ucyAqKVxuXG50eXBlIG9wZW5fZmxhZyA9XG4gICAgT3Blbl9yZG9ubHkgfCBPcGVuX3dyb25seSB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdCB8IE9wZW5fdHJ1bmMgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeSB8IE9wZW5fdGV4dCB8IE9wZW5fbm9uYmxvY2tcblxuZXh0ZXJuYWwgb3Blbl9kZXNjIDogc3RyaW5nIC0+IG9wZW5fZmxhZyBsaXN0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfc3lzX29wZW5cIlxuXG5leHRlcm5hbCBzZXRfb3V0X2NoYW5uZWxfbmFtZTogb3V0X2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX291dF9nZW4gbW9kZSBwZXJtIG5hbWUgPVxuICBsZXQgYyA9IG9wZW5fZGVzY3JpcHRvcl9vdXQob3Blbl9kZXNjIG5hbWUgbW9kZSBwZXJtKSBpblxuICBzZXRfb3V0X2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5fb3V0IG5hbWUgPVxuICBvcGVuX291dF9nZW4gW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX3RydW5jOyBPcGVuX3RleHRdIDBvNjY2IG5hbWVcblxubGV0IG9wZW5fb3V0X2JpbiBuYW1lID1cbiAgb3Blbl9vdXRfZ2VuIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl90cnVuYzsgT3Blbl9iaW5hcnldIDBvNjY2IG5hbWVcblxuZXh0ZXJuYWwgZmx1c2ggOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2ZsdXNoXCJcblxuZXh0ZXJuYWwgb3V0X2NoYW5uZWxzX2xpc3QgOiB1bml0IC0+IG91dF9jaGFubmVsIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dF9jaGFubmVsc19saXN0XCJcblxubGV0IGZsdXNoX2FsbCAoKSA9XG4gIGxldCByZWMgaXRlciA9IGZ1bmN0aW9uXG4gICAgICBbXSAtPiAoKVxuICAgIHwgYTo6bCAtPlxuICAgICAgICBiZWdpbiB0cnlcbiAgICAgICAgICAgIGZsdXNoIGFcbiAgICAgICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgICAgICgpICgqIGlnbm9yZSBjaGFubmVscyBjbG9zZWQgZHVyaW5nIGEgcHJlY2VkaW5nIGZsdXNoLiAqKVxuICAgICAgICBlbmQ7XG4gICAgICAgIGl0ZXIgbFxuICBpbiBpdGVyIChvdXRfY2hhbm5lbHNfbGlzdCAoKSlcblxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dCA6IG91dF9jaGFubmVsIC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dF9zdHJpbmcgOiBvdXRfY2hhbm5lbCAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRcIlxuXG5leHRlcm5hbCBvdXRwdXRfY2hhciA6IG91dF9jaGFubmVsIC0+IGNoYXIgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5cbmxldCBvdXRwdXRfYnl0ZXMgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXQgb2MgcyAwIChieXRlc19sZW5ndGggcylcblxubGV0IG91dHB1dF9zdHJpbmcgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXRfc3RyaW5nIG9jIHMgMCAoc3RyaW5nX2xlbmd0aCBzKVxuXG5sZXQgb3V0cHV0IG9jIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwib3V0cHV0XCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0IG9jIHMgb2ZzIGxlblxuXG5sZXQgb3V0cHV0X3N1YnN0cmluZyBvYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gc3RyaW5nX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJvdXRwdXRfc3Vic3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0X3N0cmluZyBvYyBzIG9mcyBsZW5cblxuZXh0ZXJuYWwgb3V0cHV0X2J5dGUgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5leHRlcm5hbCBvdXRwdXRfYmluYXJ5X2ludCA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9pbnRcIlxuXG5leHRlcm5hbCBtYXJzaGFsX3RvX2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiAnYSAtPiB1bml0IGxpc3QgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxubGV0IG91dHB1dF92YWx1ZSBjaGFuIHYgPSBtYXJzaGFsX3RvX2NoYW5uZWwgY2hhbiB2IFtdXG5cbmV4dGVybmFsIHNlZWtfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRcIlxuZXh0ZXJuYWwgcG9zX291dCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3Nfb3V0XCJcbmV4dGVybmFsIG91dF9jaGFubmVsX2xlbmd0aCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2Vfb3V0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2Nsb3NlX2NoYW5uZWxcIlxubGV0IGNsb3NlX291dCBvYyA9IGZsdXNoIG9jOyBjbG9zZV9vdXRfY2hhbm5lbCBvY1xubGV0IGNsb3NlX291dF9ub2VyciBvYyA9XG4gICh0cnkgZmx1c2ggb2Mgd2l0aCBfIC0+ICgpKTtcbiAgKHRyeSBjbG9zZV9vdXRfY2hhbm5lbCBvYyB3aXRoIF8gLT4gKCkpXG5leHRlcm5hbCBzZXRfYmluYXJ5X21vZGVfb3V0IDogb3V0X2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZVwiXG5cbigqIEdlbmVyYWwgaW5wdXQgZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIHNldF9pbl9jaGFubmVsX25hbWU6IGluX2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX2luX2dlbiBtb2RlIHBlcm0gbmFtZSA9XG4gIGxldCBjID0gb3Blbl9kZXNjcmlwdG9yX2luKG9wZW5fZGVzYyBuYW1lIG1vZGUgcGVybSkgaW5cbiAgc2V0X2luX2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5faW4gbmFtZSA9XG4gIG9wZW5faW5fZ2VuIFtPcGVuX3Jkb25seTsgT3Blbl90ZXh0XSAwIG5hbWVcblxubGV0IG9wZW5faW5fYmluIG5hbWUgPVxuICBvcGVuX2luX2dlbiBbT3Blbl9yZG9ubHk7IE9wZW5fYmluYXJ5XSAwIG5hbWVcblxuZXh0ZXJuYWwgaW5wdXRfY2hhciA6IGluX2NoYW5uZWwgLT4gY2hhciA9IFwiY2FtbF9tbF9pbnB1dF9jaGFyXCJcblxuZXh0ZXJuYWwgdW5zYWZlX2lucHV0IDogaW5fY2hhbm5lbCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX2lucHV0XCJcblxubGV0IGlucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9pbnB1dCBpYyBzIG9mcyBsZW5cblxubGV0IHJlYyB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gKCkgZWxzZSBiZWdpblxuICAgIGxldCByID0gdW5zYWZlX2lucHV0IGljIHMgb2ZzIGxlbiBpblxuICAgIGlmIHIgPSAwXG4gICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIChvZnMgKyByKSAobGVuIC0gcilcbiAgZW5kXG5cbmxldCByZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJyZWFsbHlfaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIGxlbiBpblxuICByZWFsbHlfaW5wdXQgaWMgcyAwIGxlbjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbmV4dGVybmFsIGlucHV0X3NjYW5fbGluZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X3NjYW5fbGluZVwiXG5cbmxldCBpbnB1dF9saW5lIGNoYW4gPVxuICBsZXQgcmVjIGJ1aWxkX3Jlc3VsdCBidWYgcG9zID0gZnVuY3Rpb25cbiAgICBbXSAtPiBidWZcbiAgfCBoZCA6OiB0bCAtPlxuICAgICAgbGV0IGxlbiA9IGJ5dGVzX2xlbmd0aCBoZCBpblxuICAgICAgYnl0ZXNfYmxpdCBoZCAwIGJ1ZiAocG9zIC0gbGVuKSBsZW47XG4gICAgICBidWlsZF9yZXN1bHQgYnVmIChwb3MgLSBsZW4pIHRsIGluXG4gIGxldCByZWMgc2NhbiBhY2N1IGxlbiA9XG4gICAgbGV0IG4gPSBpbnB1dF9zY2FuX2xpbmUgY2hhbiBpblxuICAgIGlmIG4gPSAwIHRoZW4gYmVnaW4gICAgICAgICAgICAgICAgICAgKCogbiA9IDA6IHdlIGFyZSBhdCBFT0YgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgfCBfICAtPiBidWlsZF9yZXN1bHQgKGJ5dGVzX2NyZWF0ZSBsZW4pIGxlbiBhY2N1XG4gICAgZW5kIGVsc2UgaWYgbiA+IDAgdGhlbiBiZWdpbiAgICAgICAgICAoKiBuID4gMDogbmV3bGluZSBmb3VuZCBpbiBidWZmZXIgKilcbiAgICAgIGxldCByZXMgPSBieXRlc19jcmVhdGUgKG4gLSAxKSBpblxuICAgICAgaWdub3JlICh1bnNhZmVfaW5wdXQgY2hhbiByZXMgMCAobiAtIDEpKTtcbiAgICAgIGlnbm9yZSAoaW5wdXRfY2hhciBjaGFuKTsgICAgICAgICAgICgqIHNraXAgdGhlIG5ld2xpbmUgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByZXNcbiAgICAgIHwgIF8gLT4gbGV0IGxlbiA9IGxlbiArIG4gLSAxIGluXG4gICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdCAoYnl0ZXNfY3JlYXRlIGxlbikgbGVuIChyZXMgOjogYWNjdSlcbiAgICBlbmQgZWxzZSBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICgqIG4gPCAwOiBuZXdsaW5lIG5vdCBmb3VuZCAqKVxuICAgICAgbGV0IGJlZyA9IGJ5dGVzX2NyZWF0ZSAoLW4pIGluXG4gICAgICBpZ25vcmUodW5zYWZlX2lucHV0IGNoYW4gYmVnIDAgKC1uKSk7XG4gICAgICBzY2FuIChiZWcgOjogYWNjdSkgKGxlbiAtIG4pXG4gICAgZW5kXG4gIGluIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgKHNjYW4gW10gMClcblxuZXh0ZXJuYWwgaW5wdXRfYnl0ZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2NoYXJcIlxuZXh0ZXJuYWwgaW5wdXRfYmluYXJ5X2ludCA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2ludFwiXG5leHRlcm5hbCBpbnB1dF92YWx1ZSA6IGluX2NoYW5uZWwgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVcIlxuZXh0ZXJuYWwgc2Vla19pbiA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pblwiXG5leHRlcm5hbCBwb3NfaW4gOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3NfaW5cIlxuZXh0ZXJuYWwgaW5fY2hhbm5lbF9sZW5ndGggOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2VfaW4gOiBpbl9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfY2xvc2VfY2hhbm5lbFwiXG5sZXQgY2xvc2VfaW5fbm9lcnIgaWMgPSAodHJ5IGNsb3NlX2luIGljIHdpdGggXyAtPiAoKSlcbmV4dGVybmFsIHNldF9iaW5hcnlfbW9kZV9pbiA6IGluX2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXCJcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBvdXRwdXQgKilcblxubGV0IHByaW50X2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZG91dCBjXG5sZXQgcHJpbnRfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCBzXG5sZXQgcHJpbnRfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRvdXQgc1xubGV0IHByaW50X2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmludF9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByaW50X2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3Rkb3V0IHM7IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5sZXQgcHJpbnRfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5cbigqIE91dHB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgZXJyb3IgKilcblxubGV0IHByZXJyX2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZGVyciBjXG5sZXQgcHJlcnJfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciBzXG5sZXQgcHJlcnJfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRlcnIgc1xubGV0IHByZXJyX2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmVycl9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByZXJyX2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3RkZXJyIHM7IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5sZXQgcHJlcnJfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5cbigqIElucHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBpbnB1dCAqKVxuXG5sZXQgcmVhZF9saW5lICgpID0gZmx1c2ggc3Rkb3V0OyBpbnB1dF9saW5lIHN0ZGluXG5sZXQgcmVhZF9pbnQgKCkgPSBpbnRfb2Zfc3RyaW5nKHJlYWRfbGluZSgpKVxubGV0IHJlYWRfaW50X29wdCAoKSA9IGludF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxubGV0IHJlYWRfZmxvYXQgKCkgPSBmbG9hdF9vZl9zdHJpbmcocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9mbG9hdF9vcHQgKCkgPSBmbG9hdF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxuXG4oKiBPcGVyYXRpb25zIG9uIGxhcmdlIGZpbGVzICopXG5cbm1vZHVsZSBMYXJnZUZpbGUgPVxuICBzdHJ1Y3RcbiAgICBleHRlcm5hbCBzZWVrX291dCA6IG91dF9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRfNjRcIlxuICAgIGV4dGVybmFsIHBvc19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3Nfb3V0XzY0XCJcbiAgICBleHRlcm5hbCBvdXRfY2hhbm5lbF9sZW5ndGggOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICAgIGV4dGVybmFsIHNlZWtfaW4gOiBpbl9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pbl82NFwiXG4gICAgZXh0ZXJuYWwgcG9zX2luIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3NfaW5fNjRcIlxuICAgIGV4dGVybmFsIGluX2NoYW5uZWxfbGVuZ3RoIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICBlbmRcblxuKCogRm9ybWF0cyAqKVxuXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gICA9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxuICAgPSBGb3JtYXQgb2YgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mbXRcbiAgICAgICAgICAgICAgICogc3RyaW5nXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0ID0gKCdhLCAnYiwgJ2MsICdjLCAnYywgJ2QpIGZvcm1hdDZcblxudHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MsICdjKSBmb3JtYXQ0XG5cbmxldCBzdHJpbmdfb2ZfZm9ybWF0IChGb3JtYXQgKF9mbXQsIHN0cikpID0gc3RyXG5cbmV4dGVybmFsIGZvcm1hdF9vZl9zdHJpbmcgOlxuICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPSBcIiVpZGVudGl0eVwiXG5cbmxldCAoIF5eICkgKEZvcm1hdCAoZm10MSwgc3RyMSkpIChGb3JtYXQgKGZtdDIsIHN0cjIpKSA9XG4gIEZvcm1hdCAoQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmNvbmNhdF9mbXQgZm10MSBmbXQyLFxuICAgICAgICAgIHN0cjEgXiBcIiUsXCIgXiBzdHIyKVxuXG4oKiBNaXNjZWxsYW5lb3VzICopXG5cbmV4dGVybmFsIHN5c19leGl0IDogaW50IC0+ICdhID0gXCJjYW1sX3N5c19leGl0XCJcblxuKCogZm9yIGF0X2V4aXQgKilcbnR5cGUgJ2EgYXRvbWljX3RcbmV4dGVybmFsIGF0b21pY19tYWtlIDogJ2EgLT4gJ2EgYXRvbWljX3QgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCBhdG9taWNfZ2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgPSBcIiVhdG9taWNfbG9hZFwiXG5leHRlcm5hbCBhdG9taWNfY29tcGFyZV9hbmRfc2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgLT4gJ2EgLT4gYm9vbFxuICA9IFwiJWF0b21pY19jYXNcIlxuXG5sZXQgZXhpdF9mdW5jdGlvbiA9IGF0b21pY19tYWtlIGZsdXNoX2FsbFxuXG5sZXQgcmVjIGF0X2V4aXQgZiA9XG4gICgqIE1QUiM3MjUzLCBNUFIjNzc5NjogbWFrZSBzdXJlIFwiZlwiIGlzIGV4ZWN1dGVkIG9ubHkgb25jZSAqKVxuICBsZXQgZl95ZXRfdG9fcnVuID0gYXRvbWljX21ha2UgdHJ1ZSBpblxuICBsZXQgb2xkX2V4aXQgPSBhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24gaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBpZiBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGZfeWV0X3RvX3J1biB0cnVlIGZhbHNlIHRoZW4gZiAoKSA7XG4gICAgb2xkX2V4aXQgKClcbiAgaW5cbiAgbGV0IHN1Y2Nlc3MgPSBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGV4aXRfZnVuY3Rpb24gb2xkX2V4aXQgbmV3X2V4aXQgaW5cbiAgaWYgbm90IHN1Y2Nlc3MgdGhlbiBhdF9leGl0IGZcblxubGV0IGRvX2RvbWFpbl9sb2NhbF9hdF9leGl0ID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgKCFkb19kb21haW5fbG9jYWxfYXRfZXhpdCkgKCk7XG4gIChhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24pICgpXG5cbmxldCBleGl0IHJldGNvZGUgPVxuICBkb19hdF9leGl0ICgpO1xuICBzeXNfZXhpdCByZXRjb2RlXG5cbmxldCBfID0gcmVnaXN0ZXJfbmFtZWRfdmFsdWUgXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIiBkb19hdF9leGl0XG5cbigqTU9EVUxFX0FMSUFTRVMqKVxubW9kdWxlIEFyZyAgICAgICAgICAgID0gQXJnXG5tb2R1bGUgQXJyYXkgICAgICAgICAgPSBBcnJheVxubW9kdWxlIEFycmF5TGFiZWxzICAgID0gQXJyYXlMYWJlbHNcbm1vZHVsZSBBdG9taWMgICAgICAgICA9IEF0b21pY1xubW9kdWxlIEJpZ2FycmF5ICAgICAgID0gQmlnYXJyYXlcbm1vZHVsZSBCb29sICAgICAgICAgICA9IEJvb2xcbm1vZHVsZSBCdWZmZXIgICAgICAgICA9IEJ1ZmZlclxubW9kdWxlIEJ5dGVzICAgICAgICAgID0gQnl0ZXNcbm1vZHVsZSBCeXRlc0xhYmVscyAgICA9IEJ5dGVzTGFiZWxzXG5tb2R1bGUgQ2FsbGJhY2sgICAgICAgPSBDYWxsYmFja1xubW9kdWxlIENoYXIgICAgICAgICAgID0gQ2hhclxubW9kdWxlIENvbXBsZXggICAgICAgID0gQ29tcGxleFxubW9kdWxlIENvbmRpdGlvbiAgICAgID0gQ29uZGl0aW9uXG5tb2R1bGUgRGlnZXN0ICAgICAgICAgPSBEaWdlc3Rcbm1vZHVsZSBEb21haW4gICAgICAgICA9IERvbWFpblxubW9kdWxlIER5bmFycmF5ICAgICAgID0gRHluYXJyYXlcbm1vZHVsZSBFZmZlY3QgICAgICAgICA9IEVmZmVjdFxubW9kdWxlIEVpdGhlciAgICAgICAgID0gRWl0aGVyXG5tb2R1bGUgRXBoZW1lcm9uICAgICAgPSBFcGhlbWVyb25cbm1vZHVsZSBGaWxlbmFtZSAgICAgICA9IEZpbGVuYW1lXG5tb2R1bGUgRmxvYXQgICAgICAgICAgPSBGbG9hdFxubW9kdWxlIEZvcm1hdCAgICAgICAgID0gRm9ybWF0XG5tb2R1bGUgRnVuICAgICAgICAgICAgPSBGdW5cbm1vZHVsZSBHYyAgICAgICAgICAgICA9IEdjXG5tb2R1bGUgSGFzaHRibCAgICAgICAgPSBIYXNodGJsXG5tb2R1bGUgSW5fY2hhbm5lbCAgICAgPSBJbl9jaGFubmVsXG5tb2R1bGUgSW50ICAgICAgICAgICAgPSBJbnRcbm1vZHVsZSBJbnQzMiAgICAgICAgICA9IEludDMyXG5tb2R1bGUgSW50NjQgICAgICAgICAgPSBJbnQ2NFxubW9kdWxlIExhenkgICAgICAgICAgID0gTGF6eVxubW9kdWxlIExleGluZyAgICAgICAgID0gTGV4aW5nXG5tb2R1bGUgTGlzdCAgICAgICAgICAgPSBMaXN0XG5tb2R1bGUgTGlzdExhYmVscyAgICAgPSBMaXN0TGFiZWxzXG5tb2R1bGUgTWFwICAgICAgICAgICAgPSBNYXBcbm1vZHVsZSBNYXJzaGFsICAgICAgICA9IE1hcnNoYWxcbm1vZHVsZSBNb3JlTGFiZWxzICAgICA9IE1vcmVMYWJlbHNcbm1vZHVsZSBNdXRleCAgICAgICAgICA9IE11dGV4XG5tb2R1bGUgTmF0aXZlaW50ICAgICAgPSBOYXRpdmVpbnRcbm1vZHVsZSBPYmogICAgICAgICAgICA9IE9ialxubW9kdWxlIE9vICAgICAgICAgICAgID0gT29cbm1vZHVsZSBPcHRpb24gICAgICAgICA9IE9wdGlvblxubW9kdWxlIE91dF9jaGFubmVsICAgID0gT3V0X2NoYW5uZWxcbm1vZHVsZSBQYXJzaW5nICAgICAgICA9IFBhcnNpbmdcbm1vZHVsZSBQcmludGV4YyAgICAgICA9IFByaW50ZXhjXG5tb2R1bGUgUHJpbnRmICAgICAgICAgPSBQcmludGZcbm1vZHVsZSBRdWV1ZSAgICAgICAgICA9IFF1ZXVlXG5tb2R1bGUgUmFuZG9tICAgICAgICAgPSBSYW5kb21cbm1vZHVsZSBSZXN1bHQgICAgICAgICA9IFJlc3VsdFxubW9kdWxlIFNjYW5mICAgICAgICAgID0gU2NhbmZcbm1vZHVsZSBTZW1hcGhvcmUgICAgICA9IFNlbWFwaG9yZVxubW9kdWxlIFNlcSAgICAgICAgICAgID0gU2VxXG5tb2R1bGUgU2V0ICAgICAgICAgICAgPSBTZXRcbm1vZHVsZSBTdGFjayAgICAgICAgICA9IFN0YWNrXG5tb2R1bGUgU3RkTGFiZWxzICAgICAgPSBTdGRMYWJlbHNcbm1vZHVsZSBTdHJpbmcgICAgICAgICA9IFN0cmluZ1xubW9kdWxlIFN0cmluZ0xhYmVscyAgID0gU3RyaW5nTGFiZWxzXG5tb2R1bGUgU3lzICAgICAgICAgICAgPSBTeXNcbm1vZHVsZSBUeXBlICAgICAgICAgICA9IFR5cGVcbm1vZHVsZSBVY2hhciAgICAgICAgICA9IFVjaGFyXG5tb2R1bGUgVW5pdCAgICAgICAgICAgPSBVbml0XG5tb2R1bGUgV2VhayAgICAgICAgICAgPSBXZWFrXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYXRvbWljX2NhcyIsImNhbWxfYXRvbWljX2xvYWQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfZmxvYXRfb2Zfc3RyaW5nIiwiY2FtbF9pbnRfb2Zfc3RyaW5nIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX21sX2NoYW5uZWxfc2l6ZSIsImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0IiwiY2FtbF9tbF9jbG9zZV9jaGFubmVsIiwiY2FtbF9tbF9mbHVzaCIsImNhbWxfbWxfaW5wdXQiLCJjYW1sX21sX2lucHV0X2NoYXIiLCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbiIsImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dCIsImNhbWxfbWxfb3V0cHV0IiwiY2FtbF9tbF9vdXRwdXRfYnl0ZXMiLCJjYW1sX21sX291dHB1dF9jaGFyIiwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUiLCJjYW1sX21sX3NldF9jaGFubmVsX25hbWUiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19jb25jYXQiLCJjYW1sX3N0cmluZ19vZl9ieXRlcyIsImNhbWxfc3lzX29wZW4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImdsb2JhbF9kYXRhIiwiQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzIiwiSW52YWxpZF9hcmd1bWVudCIsIkZhaWx1cmUiLCJNYXRjaF9mYWlsdXJlIiwiQXNzZXJ0X2ZhaWx1cmUiLCJOb3RfZm91bmQiLCJPdXRfb2ZfbWVtb3J5IiwiU3RhY2tfb3ZlcmZsb3ciLCJTeXNfZXJyb3IiLCJFbmRfb2ZfZmlsZSIsIkRpdmlzaW9uX2J5X3plcm8iLCJTeXNfYmxvY2tlZF9pbyIsIlVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlIiwiZmFpbHdpdGgiLCJzIiwiaW52YWxpZF9hcmciLCJFeGl0IiwibWluIiwieCIsInkiLCJtYXgiLCJhYnMiLCJsbm90IiwiY2hhcl9vZl9pbnQiLCJuIiwiY3N0X2ZhbHNlIiwiY3N0X3RydWUiLCJzdHJpbmdfb2ZfYm9vbCIsImIiLCJib29sX29mX3N0cmluZyIsInBhcmFtIiwiYm9vbF9vZl9zdHJpbmdfb3B0Iiwic3RyaW5nX29mX2ludCIsImludF9vZl9zdHJpbmdfb3B0IiwiZXhuIiwidmFsaWRfZmxvYXRfbGV4ZW0iLCJzMSIsImwiLCJpIiwibWF0Y2giLCJzdHJpbmdfb2ZfZmxvYXQiLCJmbG9hdF9vZl9zdHJpbmdfb3B0Iiwic3ltYm9sIiwibDEiLCJsMiIsImgxIiwiaDIiLCJ0bCIsImgzIiwiYmxvY2siLCJkc3QiLCJvZmZzZXQiLCJzdGRpbiIsInN0ZG91dCIsInN0ZGVyciIsIm9wZW5fb3V0X2dlbiIsIm1vZGUiLCJwZXJtIiwibmFtZSIsImMiLCJvcGVuX291dCIsIm9wZW5fb3V0X2JpbiIsImZsdXNoX2FsbCIsImEiLCJvdXRwdXRfYnl0ZXMiLCJvYyIsIm91dHB1dF9zdHJpbmciLCJvdXRwdXQiLCJvZnMiLCJsZW4iLCJvdXRwdXRfc3Vic3RyaW5nIiwib3V0cHV0X3ZhbHVlIiwiY2hhbiIsInYiLCJjbG9zZV9vdXQiLCJjbG9zZV9vdXRfbm9lcnIiLCJvcGVuX2luX2dlbiIsIm9wZW5faW4iLCJvcGVuX2luX2JpbiIsImlucHV0IiwiaWMiLCJ1bnNhZmVfcmVhbGx5X2lucHV0IiwiciIsInJlYWxseV9pbnB1dCIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJpbnB1dF9saW5lIiwiYnVpbGRfcmVzdWx0IiwiYnVmIiwicG9zIiwiaGQiLCJhY2N1IiwiYmVnIiwicmVzIiwiY2xvc2VfaW5fbm9lcnIiLCJwcmludF9jaGFyIiwicHJpbnRfc3RyaW5nIiwicHJpbnRfYnl0ZXMiLCJwcmludF9pbnQiLCJwcmludF9mbG9hdCIsInByaW50X2VuZGxpbmUiLCJwcmludF9uZXdsaW5lIiwicHJlcnJfY2hhciIsInByZXJyX3N0cmluZyIsInByZXJyX2J5dGVzIiwicHJlcnJfaW50IiwicHJlcnJfZmxvYXQiLCJwcmVycl9lbmRsaW5lIiwicHJlcnJfbmV3bGluZSIsInJlYWRfbGluZSIsInJlYWRfaW50IiwicmVhZF9pbnRfb3B0IiwicmVhZF9mbG9hdCIsInJlYWRfZmxvYXRfb3B0Iiwic3RyaW5nX29mX2Zvcm1hdCIsInN0ciIsInN0cjIiLCJmbXQyIiwic3RyMSIsImZtdDEiLCJzMiIsImV4aXRfZnVuY3Rpb24iLCJhdF9leGl0Iiwib2xkX2V4aXQiLCJmX3lldF90b19ydW4iLCJuZXdfZXhpdCIsInN1Y2Nlc3MiLCJkb19kb21haW5fbG9jYWxfYXRfZXhpdCIsImRvX2F0X2V4aXQiLCJleGl0IiwicmV0Y29kZSIsIlN0ZGxpYiJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLHFCQUFB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHJrQi9EIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6OTk1NywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9zeXMubWwuaW4iXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiBAY29uZmlndXJlX2lucHV0QCAqKVxuIzMgXCJzeXMubWwuaW5cIlxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGJhY2tlbmRfdHlwZSA9XG4gIHwgTmF0aXZlXG4gIHwgQnl0ZWNvZGVcbiAgfCBPdGhlciBvZiBzdHJpbmdcbigqIFN5c3RlbSBpbnRlcmZhY2UgKilcblxuZXh0ZXJuYWwgZ2V0X2NvbmZpZzogdW5pdCAtPiBzdHJpbmcgKiBpbnQgKiBib29sID0gXCJjYW1sX3N5c19nZXRfY29uZmlnXCJcbmV4dGVybmFsIGdldF9leGVjdXRhYmxlX25hbWUgOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lXCJcbmV4dGVybmFsIGFyZ3YgOiBzdHJpbmcgYXJyYXkgPSBcIiVzeXNfYXJndlwiXG5leHRlcm5hbCBiaWdfZW5kaWFuIDogdW5pdCAtPiBib29sID0gXCIlYmlnX2VuZGlhblwiXG5leHRlcm5hbCB3b3JkX3NpemUgOiB1bml0IC0+IGludCA9IFwiJXdvcmRfc2l6ZVwiXG5leHRlcm5hbCBpbnRfc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlaW50X3NpemVcIlxuZXh0ZXJuYWwgbWF4X3dvc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlbWF4X3dvc2l6ZVwiXG5leHRlcm5hbCB1bml4IDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX3VuaXhcIlxuZXh0ZXJuYWwgd2luMzIgOiB1bml0IC0+IGJvb2wgPSBcIiVvc3R5cGVfd2luMzJcIlxuZXh0ZXJuYWwgY3lnd2luIDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX2N5Z3dpblwiXG5leHRlcm5hbCBnZXRfYmFja2VuZF90eXBlIDogdW5pdCAtPiBiYWNrZW5kX3R5cGUgPSBcIiViYWNrZW5kX3R5cGVcIlxuXG5sZXQgZXhlY3V0YWJsZV9uYW1lID0gZ2V0X2V4ZWN1dGFibGVfbmFtZSgpXG5sZXQgKG9zX3R5cGUsIF8sIF8pID0gZ2V0X2NvbmZpZygpXG5sZXQgYmFja2VuZF90eXBlID0gZ2V0X2JhY2tlbmRfdHlwZSAoKVxubGV0IGJpZ19lbmRpYW4gPSBiaWdfZW5kaWFuICgpXG5sZXQgd29yZF9zaXplID0gd29yZF9zaXplICgpXG5sZXQgaW50X3NpemUgPSBpbnRfc2l6ZSAoKVxubGV0IHVuaXggPSB1bml4ICgpXG5sZXQgd2luMzIgPSB3aW4zMiAoKVxubGV0IGN5Z3dpbiA9IGN5Z3dpbiAoKVxubGV0IG1heF9hcnJheV9sZW5ndGggPSBtYXhfd29zaXplICgpXG5sZXQgbWF4X2Zsb2F0YXJyYXlfbGVuZ3RoID0gbWF4X2FycmF5X2xlbmd0aCAvICg2NCAvIHdvcmRfc2l6ZSlcbmxldCBtYXhfc3RyaW5nX2xlbmd0aCA9IHdvcmRfc2l6ZSAvIDggKiBtYXhfYXJyYXlfbGVuZ3RoIC0gMVxuZXh0ZXJuYWwgcnVudGltZV92YXJpYW50IDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfcnVudGltZV92YXJpYW50XCJcbmV4dGVybmFsIHJ1bnRpbWVfcGFyYW1ldGVycyA6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3J1bnRpbWVfcGFyYW1ldGVyc1wiXG5cbmV4dGVybmFsIGZpbGVfZXhpc3RzOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfZmlsZV9leGlzdHNcIlxuZXh0ZXJuYWwgaXNfZGlyZWN0b3J5IDogc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3lzX2lzX2RpcmVjdG9yeVwiXG5leHRlcm5hbCBpc19yZWd1bGFyX2ZpbGUgOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNfcmVndWxhcl9maWxlXCJcbmV4dGVybmFsIHJlbW92ZTogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbW92ZVwiXG5leHRlcm5hbCByZW5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbmFtZVwiXG5leHRlcm5hbCBnZXRlbnY6IHN0cmluZyAtPiBzdHJpbmcgPSBcImNhbWxfc3lzX2dldGVudlwiXG5cbmxldCBnZXRlbnZfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChnZXRlbnYgcylcbiAgd2l0aCBOb3RfZm91bmQgLT4gTm9uZVxuXG5leHRlcm5hbCBjb21tYW5kOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFwiXG5leHRlcm5hbCB0aW1lOiB1bml0IC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9zeXNfdGltZVwiIFwiY2FtbF9zeXNfdGltZV91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGNoZGlyOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfY2hkaXJcIlxuZXh0ZXJuYWwgbWtkaXI6IHN0cmluZyAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9zeXNfbWtkaXJcIlxuZXh0ZXJuYWwgcm1kaXI6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19ybWRpclwiXG5leHRlcm5hbCBnZXRjd2Q6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3N5c19nZXRjd2RcIlxuZXh0ZXJuYWwgcmVhZGRpciA6IHN0cmluZyAtPiBzdHJpbmcgYXJyYXkgPSBcImNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5XCJcblxubGV0IGludGVyYWN0aXZlID0gcmVmIGZhbHNlXG5cbnR5cGUgc2lnbmFsX2JlaGF2aW9yID1cbiAgICBTaWduYWxfZGVmYXVsdFxuICB8IFNpZ25hbF9pZ25vcmVcbiAgfCBTaWduYWxfaGFuZGxlIG9mIChpbnQgLT4gdW5pdClcblxuZXh0ZXJuYWwgc2lnbmFsIDogaW50IC0+IHNpZ25hbF9iZWhhdmlvciAtPiBzaWduYWxfYmVoYXZpb3JcbiAgICAgICAgICAgICAgICA9IFwiY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyXCJcblxubGV0IHNldF9zaWduYWwgc2lnX251bSBzaWdfYmVoID0gaWdub3JlKHNpZ25hbCBzaWdfbnVtIHNpZ19iZWgpXG5cbmxldCBzaWdhYnJ0ID0gLTFcbmxldCBzaWdhbHJtID0gLTJcbmxldCBzaWdmcGUgPSAtM1xubGV0IHNpZ2h1cCA9IC00XG5sZXQgc2lnaWxsID0gLTVcbmxldCBzaWdpbnQgPSAtNlxubGV0IHNpZ2tpbGwgPSAtN1xubGV0IHNpZ3BpcGUgPSAtOFxubGV0IHNpZ3F1aXQgPSAtOVxubGV0IHNpZ3NlZ3YgPSAtMTBcbmxldCBzaWd0ZXJtID0gLTExXG5sZXQgc2lndXNyMSA9IC0xMlxubGV0IHNpZ3VzcjIgPSAtMTNcbmxldCBzaWdjaGxkID0gLTE0XG5sZXQgc2lnY29udCA9IC0xNVxubGV0IHNpZ3N0b3AgPSAtMTZcbmxldCBzaWd0c3RwID0gLTE3XG5sZXQgc2lndHRpbiA9IC0xOFxubGV0IHNpZ3R0b3UgPSAtMTlcbmxldCBzaWd2dGFscm0gPSAtMjBcbmxldCBzaWdwcm9mID0gLTIxXG5sZXQgc2lnYnVzID0gLTIyXG5sZXQgc2lncG9sbCA9IC0yM1xubGV0IHNpZ3N5cyA9IC0yNFxubGV0IHNpZ3RyYXAgPSAtMjVcbmxldCBzaWd1cmcgPSAtMjZcbmxldCBzaWd4Y3B1ID0gLTI3XG5sZXQgc2lneGZzeiA9IC0yOFxuXG5leGNlcHRpb24gQnJlYWtcblxubGV0IGNhdGNoX2JyZWFrIG9uID1cbiAgaWYgb24gdGhlblxuICAgIHNldF9zaWduYWwgc2lnaW50IChTaWduYWxfaGFuZGxlKGZ1biBfIC0+IHJhaXNlIEJyZWFrKSlcbiAgZWxzZVxuICAgIHNldF9zaWduYWwgc2lnaW50IFNpZ25hbF9kZWZhdWx0XG5cblxuZXh0ZXJuYWwgZW5hYmxlX3J1bnRpbWVfd2FybmluZ3M6IGJvb2wgLT4gdW5pdCA9XG4gIFwiY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5nc1wiXG5leHRlcm5hbCBydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQ6IHVuaXQgLT4gYm9vbCA9XG4gIFwiY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcIlxuXG4oKiBUaGUgdmVyc2lvbiBzdHJpbmcgaXMgZm91bmQgaW4gZmlsZSAuLi9WRVJTSU9OICopXG5cbmxldCBvY2FtbF92ZXJzaW9uID0gXCJAVkVSU0lPTkBcIlxuXG5sZXQgZGV2ZWxvcG1lbnRfdmVyc2lvbiA9IEBPQ0FNTF9ERVZFTE9QTUVOVF9WRVJTSU9OQFxuXG50eXBlIGV4dHJhX3ByZWZpeCA9IFBsdXMgfCBUaWxkZVxuXG50eXBlIGV4dHJhX2luZm8gPSBleHRyYV9wcmVmaXggKiBzdHJpbmdcblxudHlwZSBvY2FtbF9yZWxlYXNlX2luZm8gPSB7XG4gIG1ham9yIDogaW50O1xuICBtaW5vciA6IGludDtcbiAgcGF0Y2hsZXZlbCA6IGludDtcbiAgZXh0cmEgOiBleHRyYV9pbmZvIG9wdGlvblxufVxuXG5sZXQgb2NhbWxfcmVsZWFzZSA9IHtcbiAgbWFqb3IgPSBAT0NBTUxfVkVSU0lPTl9NQUpPUkA7XG4gIG1pbm9yID0gQE9DQU1MX1ZFUlNJT05fTUlOT1JAO1xuICBwYXRjaGxldmVsID0gQE9DQU1MX1ZFUlNJT05fUEFUQ0hMRVZFTEA7XG4gIGV4dHJhID0gQE9DQU1MX1JFTEVBU0VfRVhUUkFAXG59XG5cbigqIE9wdGltaXphdGlvbiAqKVxuXG5leHRlcm5hbCBvcGFxdWVfaWRlbnRpdHkgOiAnYSAtPiAnYSA9IFwiJW9wYXF1ZVwiXG5cbm1vZHVsZSBJbW1lZGlhdGU2NCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBOb25faW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0XG4gIGVuZFxuICBtb2R1bGUgdHlwZSBJbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlXVxuICBlbmRcblxuICBtb2R1bGUgTWFrZShJbW1lZGlhdGUgOiBJbW1lZGlhdGUpKE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlKSA9IHN0cnVjdFxuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGU2NF1cbiAgICB0eXBlICdhIHJlcHIgPVxuICAgICAgfCBJbW1lZGlhdGUgOiBJbW1lZGlhdGUudCByZXByXG4gICAgICB8IE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlLnQgcmVwclxuICAgIGV4dGVybmFsIG1hZ2ljIDogXyByZXByIC0+IHQgcmVwciA9IFwiJWlkZW50aXR5XCJcbiAgICBsZXQgcmVwciA9XG4gICAgICBpZiB3b3JkX3NpemUgPSA2NCB0aGVuXG4gICAgICAgIG1hZ2ljIEltbWVkaWF0ZVxuICAgICAgZWxzZVxuICAgICAgICBtYWdpYyBOb25faW1tZWRpYXRlXG4gIGVuZFxuZW5kXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJTdGRsaWIiLCJleGVjdXRhYmxlX25hbWUiLCJvc190eXBlIiwidW5peCIsIndpbjMyIiwiY3lnd2luIiwibWF4X2FycmF5X2xlbmd0aCIsIm1heF9mbG9hdGFycmF5X2xlbmd0aCIsIm1heF9zdHJpbmdfbGVuZ3RoIiwiZ2V0ZW52X29wdCIsInMiLCJleG4iLCJzZXRfc2lnbmFsIiwic2lnX251bSIsInNpZ19iZWgiLCJCcmVhayIsImNhdGNoX2JyZWFrIiwib24iLCJNYWtlIiwiSW1tZWRpYXRlIiwiTm9uX2ltbWVkaWF0ZSIsIlN0ZGxpYl9TeXMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxrQkNtQ3NCO0FBQUEsSUFBQUMsVUFDQTtBQUFBLElBQUFDLE9BQVk7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLFlBQUFDLFdBQUFDO0FBQUFBLElBdUJoQyxZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTUQzRFg7QUFBQSwyQkM0RG9CO0FBQUEsS0Q1RHBCO0FBQUE7QUFBQSxHQzREd0I7QUFBQSxZQUFBQyxXQUFBQyxTQUFBQyxTQXFCdUM7QUFBQSxPQUFBQyxRQTdDN0I7QUFBQSxZQUFBQyxZQUFBQyxJQStFaEMsaUJBR2tDO0FBQUEsWUFBQUMsS0FBQUMsV0FBQUMsZUFzRDVCO0FBQUE7QUFBQSxJQUFBQztBQUFBQSxNQXhJMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwQ2xDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAwNDYsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvb2JqLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBPcGVyYXRpb25zIG9uIGludGVybmFsIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMgKilcblxudHlwZSB0XG5cbnR5cGUgcmF3X2RhdGEgPSBuYXRpdmVpbnRcblxuZXh0ZXJuYWwgcmVwciA6ICdhIC0+IHQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBvYmogOiB0IC0+ICdhID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgbWFnaWMgOiAnYSAtPiAnYiA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGlzX2ludCA6IHQgLT4gYm9vbCA9IFwiJW9ial9pc19pbnRcIlxubGV0IFtAaW5saW5lIGFsd2F5c10gaXNfYmxvY2sgYSA9IG5vdCAoaXNfaW50IGEpXG5leHRlcm5hbCB0YWcgOiB0IC0+IGludCA9IFwiY2FtbF9vYmpfdGFnXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpemUgOiB0IC0+IGludCA9IFwiJW9ial9zaXplXCJcbmV4dGVybmFsIHJlYWNoYWJsZV93b3JkcyA6IHQgLT4gaW50ID0gXCJjYW1sX29ial9yZWFjaGFibGVfd29yZHNcIlxuZXh0ZXJuYWwgZmllbGQgOiB0IC0+IGludCAtPiB0ID0gXCIlb2JqX2ZpZWxkXCJcbmV4dGVybmFsIHNldF9maWVsZCA6IHQgLT4gaW50IC0+IHQgLT4gdW5pdCA9IFwiJW9ial9zZXRfZmllbGRcIlxuZXh0ZXJuYWwgZmxvYXRhcnJheV9nZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdGFycmF5X2dldFwiXG5leHRlcm5hbCBmbG9hdGFycmF5X3NldCA6XG4gICAgZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiY2FtbF9mbG9hdGFycmF5X3NldFwiXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBkb3VibGVfZmllbGQgeCBpID0gZmxvYXRhcnJheV9nZXQgKG9iaiB4IDogZmxvYXRhcnJheSkgaVxubGV0IFtAaW5saW5lIGFsd2F5c10gc2V0X2RvdWJsZV9maWVsZCB4IGkgdiA9XG4gIGZsb2F0YXJyYXlfc2V0IChvYmogeCA6IGZsb2F0YXJyYXkpIGkgdlxuZXh0ZXJuYWwgcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgPSBcImNhbWxfb2JqX3Jhd19maWVsZFwiXG5leHRlcm5hbCBzZXRfcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfb2JqX3NldF9yYXdfZmllbGRcIlxuXG5leHRlcm5hbCBuZXdfYmxvY2sgOiBpbnQgLT4gaW50IC0+IHQgPSBcImNhbWxfb2JqX2Jsb2NrXCJcbmV4dGVybmFsIGR1cCA6IHQgLT4gdCA9IFwiY2FtbF9vYmpfZHVwXCJcbmV4dGVybmFsIGFkZF9vZmZzZXQgOiB0IC0+IEludDMyLnQgLT4gdCA9IFwiY2FtbF9vYmpfYWRkX29mZnNldFwiXG5leHRlcm5hbCB3aXRoX3RhZyA6IGludCAtPiB0IC0+IHQgPSBcImNhbWxfb2JqX3dpdGhfdGFnXCJcblxubGV0IGZpcnN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl90YWcgPSAwXG5sZXQgbGFzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3JfdGFnID0gMjQzXG5cbmxldCBmb3JjaW5nX3RhZyA9IDI0NFxubGV0IGNvbnRfdGFnID0gMjQ1XG5sZXQgbGF6eV90YWcgPSAyNDZcbmxldCBjbG9zdXJlX3RhZyA9IDI0N1xubGV0IG9iamVjdF90YWcgPSAyNDhcbmxldCBpbmZpeF90YWcgPSAyNDlcbmxldCBmb3J3YXJkX3RhZyA9IDI1MFxuXG5sZXQgbm9fc2Nhbl90YWcgPSAyNTFcblxubGV0IGFic3RyYWN0X3RhZyA9IDI1MVxubGV0IHN0cmluZ190YWcgPSAyNTJcbmxldCBkb3VibGVfdGFnID0gMjUzXG5sZXQgZG91YmxlX2FycmF5X3RhZyA9IDI1NFxubGV0IGN1c3RvbV90YWcgPSAyNTVcblxuXG5sZXQgaW50X3RhZyA9IDEwMDBcbmxldCBvdXRfb2ZfaGVhcF90YWcgPSAxMDAxXG5sZXQgdW5hbGlnbmVkX3RhZyA9IDEwMDJcblxubW9kdWxlIEV4dGVuc2lvbl9jb25zdHJ1Y3RvciA9XG5zdHJ1Y3RcbiAgdHlwZSB0ID0gZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXG4gIGxldCBvZl92YWwgeCA9XG4gICAgbGV0IHggPSByZXByIHggaW5cbiAgICBsZXQgc2xvdCA9XG4gICAgICBpZiAoaXNfYmxvY2sgeCkgJiYgKHRhZyB4KSA8PiBvYmplY3RfdGFnICYmIChzaXplIHgpID49IDEgdGhlbiBmaWVsZCB4IDBcbiAgICAgIGVsc2UgeFxuICAgIGluXG4gICAgbGV0IG5hbWUgPVxuICAgICAgaWYgKGlzX2Jsb2NrIHNsb3QpICYmICh0YWcgc2xvdCkgPSBvYmplY3RfdGFnIHRoZW4gZmllbGQgc2xvdCAwXG4gICAgICBlbHNlIGludmFsaWRfYXJnIFwiT2JqLmV4dGVuc2lvbl9jb25zdHJ1Y3RvclwiXG4gICAgaW5cbiAgICAgIGlmICh0YWcgbmFtZSkgPSBzdHJpbmdfdGFnIHRoZW4gKG9iaiBzbG90IDogdClcbiAgICAgIGVsc2UgaW52YWxpZF9hcmcgXCJPYmouZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXCJcblxuICBsZXQgW0BpbmxpbmUgYWx3YXlzXSBuYW1lIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDApIDogc3RyaW5nKVxuXG4gIGxldCBbQGlubGluZSBhbHdheXNdIGlkIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDEpIDogaW50KVxuZW5kXG5cbm1vZHVsZSBFcGhlbWVyb24gPSBzdHJ1Y3RcbiAgdHlwZSBvYmpfdCA9IHRcblxuICB0eXBlIHQgKCoqIGVwaGVtZXJvbiAqKVxuXG4gICAoKiogVG8gY2hhbmdlIGluIHN5bmMgd2l0aCB3ZWFrLmggKilcbiAgbGV0IGFkZGl0aW9uYWxfdmFsdWVzID0gMlxuICBsZXQgbWF4X2VwaGVfbGVuZ3RoID0gU3lzLm1heF9hcnJheV9sZW5ndGggLSBhZGRpdGlvbmFsX3ZhbHVlc1xuXG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiB0ID0gXCJjYW1sX2VwaGVfY3JlYXRlXCJcbiAgbGV0IGNyZWF0ZSBsID1cbiAgICBpZiBub3QgKDAgPD0gbCAmJiBsIDw9IG1heF9lcGhlX2xlbmd0aCkgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJPYmouRXBoZW1lcm9uLmNyZWF0ZVwiO1xuICAgIGNyZWF0ZSBsXG5cbiAgbGV0IGxlbmd0aCB4ID0gc2l6ZShyZXByIHgpIC0gYWRkaXRpb25hbF92YWx1ZXNcblxuICBsZXQgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIG1zZyA9XG4gICAgaWYgbm90ICgwIDw9IG8gJiYgbyA8IGxlbmd0aCBlKSB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBtc2dcblxuICBleHRlcm5hbCBnZXRfa2V5OiB0IC0+IGludCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfa2V5XCJcbiAgbGV0IGdldF9rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmdldF9rZXlcIjtcbiAgICBnZXRfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGdldF9rZXlfY29weTogdCAtPiBpbnQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2tleV9jb3B5XCJcbiAgbGV0IGdldF9rZXlfY29weSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uZ2V0X2tleV9jb3B5XCI7XG4gICAgZ2V0X2tleV9jb3B5IGUgb1xuXG4gIGV4dGVybmFsIHNldF9rZXk6IHQgLT4gaW50IC0+IG9ial90IC0+IHVuaXQgPSBcImNhbWxfZXBoZV9zZXRfa2V5XCJcbiAgbGV0IHNldF9rZXkgZSBvIHggPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uc2V0X2tleVwiO1xuICAgIHNldF9rZXkgZSBvIHhcblxuICBleHRlcm5hbCB1bnNldF9rZXk6IHQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9rZXlcIlxuICBsZXQgdW5zZXRfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi51bnNldF9rZXlcIjtcbiAgICB1bnNldF9rZXkgZSBvXG5cbiAgZXh0ZXJuYWwgY2hlY2tfa2V5OiB0IC0+IGludCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfa2V5XCJcbiAgbGV0IGNoZWNrX2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uY2hlY2tfa2V5XCI7XG4gICAgY2hlY2tfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGJsaXRfa2V5IDogdCAtPiBpbnQgLT4gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9lcGhlX2JsaXRfa2V5XCJcblxuICBsZXQgYmxpdF9rZXkgZTEgbzEgZTIgbzIgbCA9XG4gICAgaWYgbCA8IDAgfHwgbzEgPCAwIHx8IG8xID4gbGVuZ3RoIGUxIC0gbFxuICAgICAgIHx8IG8yIDwgMCB8fCBvMiA+IGxlbmd0aCBlMiAtIGxcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiT2JqLkVwaGVtZXJvbi5ibGl0X2tleVwiXG4gICAgZWxzZSBpZiBsIDw+IDAgdGhlbiBibGl0X2tleSBlMSBvMSBlMiBvMiBsXG5cbiAgZXh0ZXJuYWwgZ2V0X2RhdGE6IHQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2RhdGFcIlxuICBleHRlcm5hbCBnZXRfZGF0YV9jb3B5OiB0IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9kYXRhX2NvcHlcIlxuICBleHRlcm5hbCBzZXRfZGF0YTogdCAtPiBvYmpfdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2RhdGFcIlxuICBleHRlcm5hbCB1bnNldF9kYXRhOiB0IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9kYXRhXCJcbiAgZXh0ZXJuYWwgY2hlY2tfZGF0YTogdCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfZGF0YVwiXG4gIGV4dGVybmFsIGJsaXRfZGF0YSA6IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfYmxpdF9kYXRhXCJcblxuZW5kXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfY2hlY2tfYm91bmQiLCJjYW1sX29ial90YWciLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9TeXMiLCJpc19ibG9jayIsImEiLCJkb3VibGVfZmllbGQiLCJ4IiwiaSIsInNldF9kb3VibGVfZmllbGQiLCJ2Iiwib2ZfdmFsIiwic2xvdCIsImNzdF9PYmpfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIiwibmFtZSIsImlkIiwibWF4X2VwaGVfbGVuZ3RoIiwiY3JlYXRlIiwibCIsImxlbmd0aCIsInJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IiwiZSIsIm8iLCJtc2ciLCJnZXRfa2V5IiwiZ2V0X2tleV9jb3B5Iiwic2V0X2tleSIsInVuc2V0X2tleSIsImNoZWNrX2tleSIsImJsaXRfa2V5IiwiZTEiLCJvMSIsImUyIiwibzIiLCJTdGRsaWJfT2JqIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLFlBQUFDLFNBQUFDLEdDeUJrQyxtQ0FBYztBQUFBLFlBQUFDLGFBQUFDLEdBQUFDLEdBU1Isb0NBQXFDO0FBQUEsWUFBQUMsaUJBQUFGLEdBQUFDLEdBQUFFO0FBQUFBLElBRTNFO0FBQUEsSUFBdUM7QUFBQTtBQUFBLFlBQUFDLE9BQUFKO0FBQUFBO0FBQUFBLEtBQUFLO0FBQUFBLE9Bd0NoQztBQUFBLFVBQWdCO0FBQUE7QUFBQSxLQUFBQyxnQ0Q1RXpCO0FBQUE7QUFBQTtBQUFBLEtDZ0ZTLHFCQUFtQixnQ0FBQUMsT0FBeUM7QUFBQSxTQUFBQSxPQUMxRDtBQUFBO0FBQUEsSUFFRjtBQUFBO0FBQUEsY0FDRSxtREFBdUM7QUFBQTtBQUFBLFlBQUFBLEtBQUFGLE1BR3BCO0FBQUEsWUFBQUcsR0FBQUgsTUFHQTtBQUFBLE9BQUFJLGtCRDFGOUI7QUFBQSxZQUFBQyxPQUFBQztBQUFBQSxRQUFBLElDd0dJO0FBQUEsY0FDRTtBQUFBLElBQ0Ysa0NBQVE7QUFBQTtBQUFBLFlBQUFDLE9BQUFaLEdBRUssd0JBQWdDO0FBQUEsWUFBQWEsd0JBQUFDLEdBQUFDLEdBQUFDO0FBQUFBLFFBQUEsSUFHN0Msb0JBQXNCLG1CQUF0QjtBQUFBLGVBQ0UsNkJBQWU7QUFBQTtBQUFBLFlBQUFDLFFBQUFILEdBQUFDO0FBQUFBLElBSWpCO0FBQUEsSUFDQSxzQ0FBVztBQUFBO0FBQUEsWUFBQUcsYUFBQUosR0FBQUM7QUFBQUEsSUFJWDtBQUFBLElBQ0EsMkNBQWdCO0FBQUE7QUFBQSxZQUFBSSxRQUFBTCxHQUFBQyxHQUFBZjtBQUFBQSxJQUloQjtBQUFBLElBQ0EseUNBQWE7QUFBQTtBQUFBLFlBQUFvQixVQUFBTixHQUFBQztBQUFBQSxJQUliO0FBQUEsSUFDQSx3Q0FBYTtBQUFBO0FBQUEsWUFBQU0sVUFBQVAsR0FBQUM7QUFBQUEsSUFJYjtBQUFBLElBQ0Esd0NBQWE7QUFBQTtBQUFBLFlBQUFPLFNBQUFDLElBQUFDLElBQUFDLElBQUFDLElBQUFmO0FBQUFBLElBTWI7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUEyQix5Q0FDTjtBQUFBO0FBQUEsVUFFaEI7QUFBQSxjQUFlO0FBQUEsS0FBZjtBQUFBO0FBQUEsSUFEQSxxREFDcUM7QUFBQTtBQUFBO0FBQUEsSUFBQWdCO0FBQUFBLE1EbEo5QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEwMTcyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2F0b21pYy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTdGVwaGVuIERvbGFuLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTctMjAxOCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAhJ2EgdFxuXG5leHRlcm5hbCBtYWtlIDogJ2EgLT4gJ2EgdCA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsIG1ha2VfY29udGVuZGVkIDogJ2EgLT4gJ2EgdCA9IFwiY2FtbF9hdG9taWNfbWFrZV9jb250ZW5kZWRcIlxuZXh0ZXJuYWwgZ2V0IDogJ2EgdCAtPiAnYSA9IFwiJWF0b21pY19sb2FkXCJcbmV4dGVybmFsIGV4Y2hhbmdlIDogJ2EgdCAtPiAnYSAtPiAnYSA9IFwiJWF0b21pY19leGNoYW5nZVwiXG5leHRlcm5hbCBjb21wYXJlX2FuZF9zZXQgOiAnYSB0IC0+ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVhdG9taWNfY2FzXCJcbmV4dGVybmFsIGZldGNoX2FuZF9hZGQgOiBpbnQgdCAtPiBpbnQgLT4gaW50ID0gXCIlYXRvbWljX2ZldGNoX2FkZFwiXG5leHRlcm5hbCBpZ25vcmUgOiAnYSAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxubGV0IHNldCByIHggPSBpZ25vcmUgKGV4Y2hhbmdlIHIgeClcbmxldCBpbmNyIHIgPSBpZ25vcmUgKGZldGNoX2FuZF9hZGQgciAxKVxubGV0IGRlY3IgciA9IGlnbm9yZSAoZmV0Y2hfYW5kX2FkZCByICgtMSkpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYXRvbWljX2V4Y2hhbmdlIiwiY2FtbF9hdG9taWNfZmV0Y2hfYWRkIiwic2V0IiwiciIsIngiLCJpbmNyIiwiZGVjciIsIlN0ZGxpYl9BdG9taWMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLFlBQUFDLElBQUFDLEdBQUFDLEdDd0JjLHFDQUFxQjtBQUFBLFlBQUFDLEtBQUFGLEdBQ3RCLHNDQUEwQjtBQUFBLFlBQUFHLEtBQUFILEdBQzFCLHVDQUE2QjtBQUFBO0FBQUEsSUFBQUk7QUFBQUEsTUQxQjFDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAyMDEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvY2FtbGludGVybmFsTGF6eS5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSW50ZXJuYWxzIG9mIGZvcmNpbmcgbGF6eSB2YWx1ZXMuICopXG5cbnR5cGUgJ2EgdCA9ICdhIGxhenlfdFxuXG5leGNlcHRpb24gVW5kZWZpbmVkXG5cbigqIFt1cGRhdGVfdG9fZm9yY2luZyBibGtdIHRyaWVzIHRvIHVwZGF0ZSBhIFtibGtdIHdpdGggW2xhenlfdGFnXSB0b1xuICAgW2ZvcmNpbmdfdGFnXSB1c2luZyBjb21wYXJlLWFuZC1zd2FwIChDQVMpLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGUgaGVhZGVyIHdvcmQgYnkgYSBjb25jdXJyZW50IEdDIHRocmVhZC4gUmV0dXJucyBbMF0gaWYgdGhlXG4gICBDQVMgaXMgc3VjY2Vzc2Z1bC4gSWYgdGhlIENBUyBmYWlscywgdGhlbiB0aGUgdGFnIHdhcyBvYnNlcnZlZCB0byBiZVxuICAgc29tZXRoaW5nIG90aGVyIHRoYW4gW2xhenlfdGFnXSBkdWUgdG8gYSBjb25jdXJyZW50IG11dGF0b3IuIEluIHRoaXMgY2FzZSxcbiAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIFsxXS4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3JjaW5nIDogT2JqLnQgLT4gaW50ID1cbiAgXCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmdcIiBbQEBub2FsbG9jXVxuXG4oKiBbcmVzZXRfdG9fbGF6eSBibGtdIGV4cGVjdHMgW2Jsa10gdG8gYmUgYSBsYXp5IG9iamVjdCB3aXRoIFtPYmouZm9yY2luZ190YWddXG4gICBhbmQgdXBkYXRlcyB0aGUgdGFnIHRvIFtPYmoubGF6eV90YWddLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGlzIG9iamVjdCdzIGhlYWRlciBieSBhIGNvbmN1cnJlbnQgR0MgdGhyZWFkLiAqKVxuZXh0ZXJuYWwgcmVzZXRfdG9fbGF6eSA6IE9iai50IC0+IHVuaXQgPSBcImNhbWxfbGF6eV9yZXNldF90b19sYXp5XCIgW0BAbm9hbGxvY11cblxuKCogW3VwZGF0ZV90b19mb3J3YXJkIGJsa10gZXhwZWN0cyBbYmxrXSB0byBiZSBhIGxhenkgb2JqZWN0IHdpdGhcbiAgIFtPYmouZm9yY2luZ190YWddIGFuZCB1cGRhdGVzIHRoZSB0YWcgdG8gW09iai5mb3J3YXJkX3RhZ10sIHRha2luZyBjYXJlIHRvXG4gICBoYW5kbGUgY29uY3VycmVudCBtYXJraW5nIG9mIHRoaXMgb2JqZWN0J3MgaGVhZGVyIGJ5IGEgY29uY3VycmVudCBHQyB0aHJlYWQuXG4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3J3YXJkIDogT2JqLnQgLT4gdW5pdCA9XG4gIFwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkXCIgW0BAbm9hbGxvY11cblxuKCogQXNzdW1lcyBbYmxrXSBpcyBhIGJsb2NrIHdpdGggdGFnIGZvcmNpbmcgKilcbmxldCBkb19mb3JjZV9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICB0cnlcbiAgICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciByZXN1bHQpO1xuICAgIHVwZGF0ZV90b19mb3J3YXJkIGI7XG4gICAgcmVzdWx0XG4gIHdpdGggZSAtPlxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciAoZnVuICgpIC0+IHJhaXNlIGUpKTtcbiAgICByZXNldF90b19sYXp5IGI7XG4gICAgcmFpc2UgZVxuXG4oKiBBc3N1bWVzIFtibGtdIGlzIGEgYmxvY2sgd2l0aCB0YWcgZm9yY2luZyAqKVxubGV0IGRvX2ZvcmNlX3ZhbF9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgdXBkYXRlX3RvX2ZvcndhcmQgYjtcbiAgcmVzdWx0XG5cbigqIENhbGxlZCBieSBbZm9yY2VfZ2VuXSAqKVxubGV0IGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCAoYmxrIDogJ2FyZyBsYXp5X3QpID1cbiAgKCogV2UgZXhwZWN0IHRoZSB0YWcgdG8gYmUgW2xhenlfdGFnXSwgYnV0IG1heSBiZSBvdGhlciB0YWdzIGR1ZSB0b1xuICAgICBjb25jdXJyZW50IGZvcmNpbmcgb2YgbGF6eSB2YWx1ZXMuICopXG4gIG1hdGNoIHVwZGF0ZV90b19mb3JjaW5nIChPYmoucmVwciBibGspIHdpdGhcbiAgfCAwIHdoZW4gb25seV92YWwgLT4gZG9fZm9yY2VfdmFsX2Jsb2NrIGJsa1xuICB8IDAgLT4gZG9fZm9yY2VfYmxvY2sgYmxrXG4gIHwgXyAtPiByYWlzZSBVbmRlZmluZWRcblxuKCogdXNlZCBpbiB0aGUgJWxhenlfZm9yY2UgcHJpbWl0aXZlICopXG5sZXQgZm9yY2VfbGF6eV9ibG9jayBibGsgPSBmb3JjZV9nZW5fbGF6eV9ibG9jayB+b25seV92YWw6ZmFsc2UgYmxrXG5cbigqIFtmb3JjZV9nZW4gfm9ubHlfdmFsOmZhbHNlXSBpcyBub3QgdXNlZCwgc2luY2UgW0xhenkuZm9yY2VdIGlzXG4gICBkZWNsYXJlZCBhcyBhIHByaW1pdGl2ZSB3aG9zZSBjb2RlIGlubGluZXMgdGhlIHRhZyB0ZXN0cyBvZiBpdHNcbiAgIGFyZ3VtZW50LCBleGNlcHQgd2hlbiBhZmwgaW5zdHJ1bWVudGF0aW9uIGlzIHR1cm5lZCBvbi4gKilcbmxldCBmb3JjZV9nZW4gfm9ubHlfdmFsIChsenYgOiAnYXJnIGxhenlfdCkgPVxuICAoKiBVc2luZyBbU3lzLm9wYXF1ZV9pZGVudGl0eV0gcHJldmVudHMgdHdvIHBvdGVudGlhbCBwcm9ibGVtczpcbiAgICAgLSBJZiB0aGUgdmFsdWUgaXMga25vd24gdG8gaGF2ZSBGb3J3YXJkX3RhZywgdGhlbiBpdCBjb3VsZCBoYXZlIGJlZW5cbiAgICAgICBzaG9ydGN1dCBkdXJpbmcgR0MsIHNvIHRoYXQgaW5mb3JtYXRpb24gbXVzdCBiZSBmb3Jnb3R0ZW4gKHNlZSBHUFIjNzEzXG4gICAgICAgYW5kIGlzc3VlICM3MzAxKS4gVGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhdCB0aGUgbW9tZW50IHNpbmNlXG4gICAgICAgW09iai50YWddIGlzIG5vdCBzaW1wbGlmaWVkIGJ5IHRoZSBjb21waWxlciwgYW5kIEdQUiM3MTMgYWxzb1xuICAgICAgIGVuc3VyZXMgdGhhdCBubyB2YWx1ZSB3aWxsIGJlIGtub3duIHRvIGhhdmUgRm9yd2FyZF90YWcuXG4gICAgIC0gSWYgdGhlIHZhbHVlIGlzIGtub3duIHRvIGJlIGltbXV0YWJsZSwgdGhlbiBpZiB0aGUgY29tcGlsZXJcbiAgICAgICBjYW5ub3QgcHJvdmUgdGhhdCB0aGUgbGFzdCBicmFuY2ggaXMgbm90IHRha2VuIGl0IHdpbGwgaXNzdWUgYVxuICAgICAgIHdhcm5pbmcgNTkgKG1vZGlmaWNhdGlvbiBvZiBhbiBpbW11dGFibGUgdmFsdWUpICopXG4gIGxldCBsenYgPSBTeXMub3BhcXVlX2lkZW50aXR5IGx6diBpblxuICBsZXQgeCA9IE9iai5yZXByIGx6diBpblxuICAoKiBTVEFSVCBubyBzYWZlIHBvaW50cy4gSWYgYSBHQyBvY2N1cnMgaGVyZSwgdGhlbiB0aGUgb2JqZWN0IFt4XSBtYXkgYmVcbiAgICAgc2hvcnQtY2lyY3VpdGVkLCBhbmQgZ2V0dGluZyB0aGUgZmlyc3QgZmllbGQgb2YgW3hdIHdvdWxkIGdldCB1cyB0aGUgd3JvbmdcbiAgICAgdmFsdWUuIEx1Y2tpbHksIHRoZSBjb21waWxlciBkb2VzIG5vdCBpbnNlcnQgR0Mgc2FmZSBwb2ludHMgYXQgdGhpcyBwbGFjZSxcbiAgICAgc28gaXQgaXMgb2suICopXG4gIGxldCB0ID0gT2JqLnRhZyB4IGluXG4gIGlmIHQgPSBPYmouZm9yd2FyZF90YWcgdGhlblxuICAgIChPYmoub2JqIChPYmouZmllbGQgeCAwKSA6ICdhcmcpXG4gICgqIEVORCBubyBzYWZlIHBvaW50cyAqKVxuICBlbHNlIGlmIHQgPSBPYmouZm9yY2luZ190YWcgdGhlbiByYWlzZSBVbmRlZmluZWRcbiAgZWxzZSBpZiB0IDw+IE9iai5sYXp5X3RhZyB0aGVuIChPYmoub2JqIHggOiAnYXJnKVxuICBlbHNlIGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCBsenZcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJTdGRsaWJfT2JqIiwiVW5kZWZpbmVkIiwiZm9yY2VfZ2VuX2xhenlfYmxvY2siLCJvbmx5X3ZhbCIsImJsayIsImNsb3N1cmUiLCJyZXN1bHQiLCJlIiwicGFyYW0iLCJmb3JjZV9sYXp5X2Jsb2NrIiwiZm9yY2VfZ2VuIiwibHp2IiwidCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBLFlBQUFDLHFCQUFBQyxVQUFBQztBQUFBQSxJQ3VFUTtBQUFBLEtBR0M7QUFBQSxJQUZFO0FBQUEsU0FBQUMsWUFaYztBQUFBLEtBQ3ZCO0FBQUEsU0FBQUMsV0FDYTtBQUFBLEtBQ2I7QUFBQSxLQUNBO0FBQUEsS0FBbUI7QUFBQTtBQUFBLFFBQUFELFVBbkJJO0FBQUEsSUFDdkI7QUFBQSxJQUErQjtBQUFBLFNBQUFDLFNBRWhCO0FBQUEsS0FDYjtBQUFBLEtBQ0E7QUFBQTtBQUFBO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsSURsREo7QUFBQSxLQ3FESSxrQkFBQUMsT0FBdUMsd0NBQU87QUFBQSxLQUM5QztBQUFBLEtBQWU7QUFBQTtBQUFBLEdBb0JLO0FBQUEsWUFBQUMsaUJBQUFMLEtBR0csbUNBQXdDO0FBQUEsWUFBQU0sVUFBQVAsVUFBQVE7QUFBQUEsUUFBQUMsSUFxQnpEO0FBQUEsSUFDUix5QkFDMEI7QUFBQSxJQUVyQix3QkFBNEI7QUFBQSxJQUM1QixtQ0FDQSxtQ0FBa0M7QUFBQTtBQUFBLEdEeEd6QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEwMjU4LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2xhenkubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbTGF6eV06IGRlZmVycmVkIGNvbXB1dGF0aW9ucyAqKVxuXG5cbigqXG4gICBXQVJOSU5HOiBzb21lIHB1cnBsZSBtYWdpYyBpcyBnb2luZyBvbiBoZXJlLiAgRG8gbm90IHRha2UgdGhpcyBmaWxlXG4gICBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBwcm9ncmFtIGluIE9DYW1sLlxuKilcblxuXG4oKiBXZSBtYWtlIHVzZSBvZiB0d28gc3BlY2lhbCB0YWdzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lOlxuICAgW2xhenlfdGFnXSBhbmQgW2ZvcndhcmRfdGFnXS5cblxuICAgQSB2YWx1ZSBvZiB0eXBlIFsnYSBMYXp5LnRdIGNhbiBiZSBvbmUgb2YgdGhyZWUgdGhpbmdzOlxuICAgMS4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2xhenlfdGFnXS4gIEl0cyBmaWVsZCBpcyBhIGNsb3N1cmUgb2ZcbiAgICAgIHR5cGUgW3VuaXQgLT4gJ2FdIHRoYXQgY29tcHV0ZXMgdGhlIHZhbHVlLlxuICAgMi4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2ZvcndhcmRfdGFnXS4gIEl0cyBmaWVsZCBpcyB0aGUgdmFsdWVcbiAgICAgIG9mIHR5cGUgWydhXSB0aGF0IHdhcyBjb21wdXRlZC5cbiAgIDMuIEFueXRoaW5nIGVsc2UgZXhjZXB0IGEgZmxvYXQuICBUaGlzIGhhcyB0eXBlIFsnYV0gYW5kIGlzIHRoZSB2YWx1ZVxuICAgICAgdGhhdCB3YXMgY29tcHV0ZWQuXG4gICBFeGNlcHRpb25zIGFyZSBzdG9yZWQgaW4gZm9ybWF0ICgxKS5cbiAgIFRoZSBHQyB3aWxsIG1hZ2ljYWxseSBjaGFuZ2UgdGhpbmdzIGZyb20gKDIpIHRvICgzKSBhY2NvcmRpbmcgdG8gaXRzXG4gICBmYW5jeS5cblxuICAgSWYgT0NhbWwgd2FzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgLWZsYXQtZmxvYXQtYXJyYXkgb3B0aW9uICh3aGljaCBpc1xuICAgY3VycmVudGx5IHRoZSBkZWZhdWx0KSwgdGhlIGZvbGxvd2luZyBpcyBhbHNvIHRydWU6XG4gICBXZSBjYW5ub3QgdXNlIHJlcHJlc2VudGF0aW9uICgzKSBmb3IgYSBbZmxvYXQgTGF6eS50XSBiZWNhdXNlXG4gICBbY2FtbF9tYWtlX2FycmF5XSBhc3N1bWVzIHRoYXQgb25seSBhIFtmbG9hdF0gdmFsdWUgY2FuIGhhdmUgdGFnXG4gICBbRG91YmxlX3RhZ10uXG5cbiAgIFdlIGhhdmUgdG8gdXNlIHRoZSBidWlsdC1pbiB0eXBlIGNvbnN0cnVjdG9yIFtsYXp5X3RdIHRvXG4gICBsZXQgdGhlIGNvbXBpbGVyIGltcGxlbWVudCB0aGUgc3BlY2lhbCB0eXBpbmcgYW5kIGNvbXBpbGF0aW9uXG4gICBydWxlcyBmb3IgdGhlIFtsYXp5XSBrZXl3b3JkLlxuKilcblxudHlwZSAnYSB0ID0gJ2EgQ2FtbGludGVybmFsTGF6eS50XG5cbmV4Y2VwdGlvbiBVbmRlZmluZWQgPSBDYW1saW50ZXJuYWxMYXp5LlVuZGVmaW5lZFxuZXh0ZXJuYWwgbWFrZV9mb3J3YXJkIDogJ2EgLT4gJ2EgbGF6eV90ID0gXCJjYW1sX2xhenlfbWFrZV9mb3J3YXJkXCJcbmV4dGVybmFsIGZvcmNlIDogJ2EgdCAtPiAnYSA9IFwiJWxhenlfZm9yY2VcIlxuXG5sZXQgZm9yY2VfdmFsIGwgPSBDYW1saW50ZXJuYWxMYXp5LmZvcmNlX2dlbiB+b25seV92YWw6dHJ1ZSBsXG5cbmxldCBmcm9tX2Z1biAoZiA6IHVuaXQgLT4gJ2FyZykgPVxuICBsZXQgeCA9IE9iai5uZXdfYmxvY2sgT2JqLmxhenlfdGFnIDEgaW5cbiAgT2JqLnNldF9maWVsZCB4IDAgKE9iai5yZXByIGYpO1xuICAoT2JqLm9iaiB4IDogJ2FyZyB0KVxuXG5sZXQgZnJvbV92YWwgKHYgOiAnYXJnKSA9XG4gIGxldCB0ID0gT2JqLnRhZyAoT2JqLnJlcHIgdikgaW5cbiAgaWYgdCA9IE9iai5mb3J3YXJkX3RhZyB8fCB0ID0gT2JqLmxhenlfdGFnIHx8XG4gICAgIHQgPSBPYmouZm9yY2luZ190YWcgfHwgdCA9IE9iai5kb3VibGVfdGFnIHRoZW4gYmVnaW5cbiAgICBtYWtlX2ZvcndhcmQgdlxuICBlbmQgZWxzZSBiZWdpblxuICAgIChPYmoubWFnaWMgdiA6ICdhcmcgdClcbiAgZW5kXG5cbmxldCBpc192YWwgKGwgOiAnYXJnIHQpID0gT2JqLnRhZyAoT2JqLnJlcHIgbCkgPD4gT2JqLmxhenlfdGFnXG5cbmxldCBtYXAgZiB4ID1cbiAgbGF6eSAoZiAoZm9yY2UgeCkpXG5cbmxldCBtYXBfdmFsIGYgeCA9XG4gIGlmIGlzX3ZhbCB4XG4gIHRoZW4gZnJvbV92YWwgKGYgKGZvcmNlIHgpKVxuICBlbHNlIGxhenkgKGYgKGZvcmNlIHgpKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX29ial90YWciLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJDYW1saW50ZXJuYWxMYXp5IiwiU3RkbGliX09iaiIsIlVuZGVmaW5lZCIsImZvcmNlX3ZhbCIsImwiLCJmcm9tX2Z1biIsIngiLCJmcm9tX3ZhbCIsInYiLCJ0IiwiaXNfdmFsIiwibWFwIiwicGFyYW0iLCJtYXBfdmFsIl0sIm1hcHBpbmdzIjoiT0FBQUEsVUFBQSx5QkFBQUMsZUFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsWUFBQUMsVUFBQUMsR0N1RGtCLDJDQUEyQztBQUFBLFlBQUFDLFNBQUFSO0FBQUFBLFFBQUFTLElBR25EO0FBQUEsSUFDUjtBQUFBLElBQThCO0FBQUEsR0FDVjtBQUFBLFlBQUFDLFNBQUFDO0FBQUFBLFFBQUFDLElBR1o7QUFBQSxJQUNSO0FBQUE7QUFBQTtBQUFBLEtBSUc7QUFBQSxJQUgrQyx3Q0FJL0M7QUFBQTtBQUFBLFlBQUFDLE9BQUFOO0FBQUFBLFFBQUEsSUFFcUI7QUFBQSx3Q0FBb0I7QUFBQSxHQUFnQjtBQUFBLFlBQUFPLElBQUFkLEdBQUFTO0FBQUFBLElBRzVEO0FBQUEscUJBQUFNO0FBQUFBLGlCQUFBLElEMUVGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNDMEVFO0FBQUEsR0FBa0I7QUFBQSxZQUFBQyxRQUFBaEIsR0FBQVM7QUFBQUEsSUFHZjtBQUFBLEtBRUU7QUFBQSxzQkFBQU07QUFBQUEsa0JBQUEsSUQvRVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUMrRU87QUFBQSxZQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFTLE9BQWEsU0FBYixpQkFDUztBQUFBO0FBQUEsR0QvRXpCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAzMzksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc2VxLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFNpbW9uIENydWFuZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW1NlcV06IGZ1bmN0aW9uYWwgaXRlcmF0b3JzICopXG5cbnR5cGUgKydhIG5vZGUgPVxuICB8IE5pbFxuICB8IENvbnMgb2YgJ2EgKiAnYSB0XG5cbmFuZCAnYSB0ID0gdW5pdCAtPiAnYSBub2RlXG5cbmxldCBlbXB0eSAoKSA9IE5pbFxuXG5sZXQgcmV0dXJuIHggKCkgPSBDb25zICh4LCBlbXB0eSlcblxubGV0IGNvbnMgeCBuZXh0ICgpID0gQ29ucyAoeCwgbmV4dClcblxubGV0IHJlYyBhcHBlbmQgc2VxMSBzZXEyICgpID1cbiAgbWF0Y2ggc2VxMSgpIHdpdGhcbiAgfCBOaWwgLT4gc2VxMigpXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT4gQ29ucyAoeCwgYXBwZW5kIG5leHQgc2VxMilcblxubGV0IHJlYyBtYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+IENvbnMgKGYgeCwgbWFwIGYgbmV4dClcblxubGV0IHJlYyBmaWx0ZXJfbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBuZXh0ICgpXG4gICAgICAgIHwgU29tZSB5IC0+IENvbnMgKHksIGZpbHRlcl9tYXAgZiBuZXh0KVxuXG5sZXQgcmVjIGZpbHRlciBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgIGlmIGYgeFxuICAgICAgdGhlbiBDb25zICh4LCBmaWx0ZXIgZiBuZXh0KVxuICAgICAgZWxzZSBmaWx0ZXIgZiBuZXh0ICgpXG5cbmxldCByZWMgY29uY2F0IHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgIGFwcGVuZCB4IChjb25jYXQgbmV4dCkgKClcblxubGV0IHJlYyBmbGF0X21hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgYXBwZW5kIChmIHgpIChmbGF0X21hcCBmIG5leHQpICgpXG5cbmxldCBjb25jYXRfbWFwID0gZmxhdF9tYXBcblxubGV0IHJlYyBmb2xkX2xlZnQgZiBhY2Mgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgICB8IE5pbCAtPiBhY2NcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGxldCBhY2MgPSBmIGFjYyB4IGluXG4gICAgICAgIGZvbGRfbGVmdCBmIGFjYyBuZXh0XG5cbmxldCByZWMgaXRlciBmIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gKClcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGYgeDtcbiAgICAgICAgaXRlciBmIG5leHRcblxubGV0IHJlYyB1bmZvbGQgZiB1ICgpID1cbiAgbWF0Y2ggZiB1IHdpdGhcbiAgfCBOb25lIC0+IE5pbFxuICB8IFNvbWUgKHgsIHUnKSAtPiBDb25zICh4LCB1bmZvbGQgZiB1JylcblxubGV0IGlzX2VtcHR5IHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoXywgXykgLT5cbiAgICAgIGZhbHNlXG5cbmxldCB1bmNvbnMgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIFNvbWUgKHgsIHhzKVxuICB8IE5pbCAtPlxuICAgICAgTm9uZVxuXG5cblxubGV0IHJlYyBsZW5ndGhfYXV4IGFjY3UgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zIChfLCB4cykgLT5cbiAgICAgIGxlbmd0aF9hdXggKGFjY3UgKyAxKSB4c1xuXG5sZXRbQGlubGluZV0gbGVuZ3RoIHhzID1cbiAgbGVuZ3RoX2F1eCAwIHhzXG5cbmxldCByZWMgaXRlcmlfYXV4IGYgaSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgKClcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGYgaSB4O1xuICAgICAgaXRlcmlfYXV4IGYgKGkrMSkgeHNcblxubGV0W0BpbmxpbmVdIGl0ZXJpIGYgeHMgPVxuICBpdGVyaV9hdXggZiAwIHhzXG5cbmxldCByZWMgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IGkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGxldCBhY2N1ID0gZiBhY2N1IGkgeCBpblxuICAgICAgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IChpKzEpIHhzXG5cbmxldFtAaW5saW5lXSBmb2xkX2xlZnRpIGYgYWNjdSB4cyA9XG4gIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSAwIHhzXG5cbmxldCByZWMgZm9yX2FsbCBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggJiYgZm9yX2FsbCBwIHhzXG5cbmxldCByZWMgZXhpc3RzIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggfHwgZXhpc3RzIHAgeHNcblxubGV0IHJlYyBmaW5kIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGlmIHAgeCB0aGVuIFNvbWUgeCBlbHNlIGZpbmQgcCB4c1xuXG5sZXQgZmluZF9pbmRleCBwIHhzID1cbiAgbGV0IHJlYyBhdXggaSB4cyA9IG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5vbmVcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBpZiBwIHggdGhlbiBTb21lIGkgZWxzZSBhdXggKGkrMSkgeHMgaW5cbiAgYXV4IDAgeHNcblxubGV0IHJlYyBmaW5kX21hcCBmIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgZmluZF9tYXAgZiB4c1xuICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+XG4gICAgICAgICAgcmVzdWx0XG5cbmxldCBmaW5kX21hcGkgZiB4cyA9XG4gIGxldCByZWMgYXV4IGkgeHMgPSBtYXRjaCB4cygpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGF1eCAoaSsxKSB4c1xuICAgICAgICB8IFNvbWUgXyBhcyByZXN1bHQgLT5cbiAgICAgICAgICAgIHJlc3VsdCBpblxuICBhdXggMCB4c1xuXG4oKiBbaXRlcjJdLCBbZm9sZF9sZWZ0Ml0sIFtmb3JfYWxsMl0sIFtleGlzdHMyXSwgW21hcDJdLCBbemlwXSB3b3JrIGFsc28gaW5cbiAgIHRoZSBjYXNlIHdoZXJlIHRoZSB0d28gc2VxdWVuY2VzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIFRoZXkgc3RvcCBhcyBzb29uXG4gICBhcyBvbmUgc2VxdWVuY2UgaXMgZXhoYXVzdGVkLiBUaGVpciBiZWhhdmlvciBpcyBzbGlnaHRseSBhc3ltbWV0cmljOiB3aGVuXG4gICBbeHNdIGlzIGVtcHR5LCB0aGV5IGRvIG5vdCBmb3JjZSBbeXNdOyBob3dldmVyLCB3aGVuIFt5c10gaXMgZW1wdHksIFt4c10gaXNcbiAgIGZvcmNlZCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24gW3hzKCldIHR1cm5zIG91dFxuICAgdG8gYmUgdXNlbGVzcy4gKilcblxubGV0IHJlYyBpdGVyMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICAoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgICgpXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5O1xuICAgICAgICAgIGl0ZXIyIGYgeHMgeXNcblxubGV0IHJlYyBmb2xkX2xlZnQyIGYgYWNjdSB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgYWNjdVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGFjY3VcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgbGV0IGFjY3UgPSBmIGFjY3UgeCB5IGluXG4gICAgICAgICAgZm9sZF9sZWZ0MiBmIGFjY3UgeHMgeXNcblxubGV0IHJlYyBmb3JfYWxsMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgdHJ1ZVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBmIHggeSAmJiBmb3JfYWxsMiBmIHhzIHlzXG5cbmxldCByZWMgZXhpc3RzMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBmYWxzZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5IHx8IGV4aXN0czIgZiB4cyB5c1xuXG5sZXQgcmVjIGVxdWFsIGVxIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gIHwgTmlsLCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cyksIENvbnMgKHksIHlzKSAtPlxuICAgICAgZXEgeCB5ICYmIGVxdWFsIGVxIHhzIHlzXG4gIHwgTmlsLCBDb25zIChfLCBfKVxuICB8IENvbnMgKF8sIF8pLCBOaWwgLT5cbiAgICAgIGZhbHNlXG5cbmxldCByZWMgY29tcGFyZSBjbXAgeHMgeXMgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgfCBOaWwsIE5pbCAtPlxuICAgICAgMFxuICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBsZXQgYyA9IGNtcCB4IHkgaW5cbiAgICAgIGlmIGMgPD4gMCB0aGVuIGMgZWxzZSBjb21wYXJlIGNtcCB4cyB5c1xuICB8IE5pbCwgQ29ucyAoXywgXykgLT5cbiAgICAgIC0xXG4gIHwgQ29ucyAoXywgXyksIE5pbCAtPlxuICAgICAgKzFcblxuXG5cbigqIFtpbml0X2F1eCBmIGkgal0gaXMgdGhlIHNlcXVlbmNlIFtmIGksIC4uLiwgZiAoai0xKV0uICopXG5cbmxldCByZWMgaW5pdF9hdXggZiBpIGogKCkgPVxuICBpZiBpIDwgaiB0aGVuIGJlZ2luXG4gICAgQ29ucyAoZiBpLCBpbml0X2F1eCBmIChpICsgMSkgailcbiAgZW5kXG4gIGVsc2VcbiAgICBOaWxcblxubGV0IGluaXQgbiBmID1cbiAgaWYgbiA8IDAgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU2VxLmluaXRcIlxuICBlbHNlXG4gICAgaW5pdF9hdXggZiAwIG5cblxubGV0IHJlYyByZXBlYXQgeCAoKSA9XG4gIENvbnMgKHgsIHJlcGVhdCB4KVxuXG5sZXQgcmVjIGZvcmV2ZXIgZiAoKSA9XG4gIENvbnMgKGYoKSwgZm9yZXZlciBmKVxuXG4oKiBUaGlzIHByZWxpbWluYXJ5IGRlZmluaXRpb24gb2YgW2N5Y2xlXSByZXF1aXJlcyB0aGUgc2VxdWVuY2UgW3hzXVxuICAgdG8gYmUgbm9uZW1wdHkuIEFwcGx5aW5nIGl0IHRvIGFuIGVtcHR5IHNlcXVlbmNlIHdvdWxkIHByb2R1Y2UgYVxuICAgc2VxdWVuY2UgdGhhdCBkaXZlcmdlcyB3aGVuIGl0IGlzIGZvcmNlZC4gKilcblxubGV0IHJlYyBjeWNsZV9ub25lbXB0eSB4cyAoKSA9XG4gIGFwcGVuZCB4cyAoY3ljbGVfbm9uZW1wdHkgeHMpICgpXG5cbigqIFtjeWNsZSB4c10gY2hlY2tzIHdoZXRoZXIgW3hzXSBpcyBlbXB0eSBhbmQsIGlmIHNvLCByZXR1cm5zIGFuIGVtcHR5XG4gICBzZXF1ZW5jZS4gT3RoZXJ3aXNlLCBbY3ljbGUgeHNdIHByb2R1Y2VzIG9uZSBjb3B5IG9mIFt4c10gZm9sbG93ZWRcbiAgIHdpdGggdGhlIGluZmluaXRlIHNlcXVlbmNlIFtjeWNsZV9ub25lbXB0eSB4c10uIFRodXMsIHRoZSBub25lbXB0aW5lc3NcbiAgIGNoZWNrIGlzIHBlcmZvcm1lZCBqdXN0IG9uY2UuICopXG5cbmxldCBjeWNsZSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMnKSAtPlxuICAgICAgQ29ucyAoeCwgYXBwZW5kIHhzJyAoY3ljbGVfbm9uZW1wdHkgeHMpKVxuXG4oKiBbaXRlcmF0ZTEgZiB4XSBpcyB0aGUgc2VxdWVuY2UgW2YgeCwgZiAoZiB4KSwgLi4uXS5cbiAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKGl0ZXJhdGUgZiB4KV0uXG4gICBbaXRlcmF0ZTFdIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0uICopXG5cbmxldCByZWMgaXRlcmF0ZTEgZiB4ICgpID1cbiAgbGV0IHkgPSBmIHggaW5cbiAgQ29ucyAoeSwgaXRlcmF0ZTEgZiB5KVxuXG4oKiBbaXRlcmF0ZSBmIHhdIGlzIHRoZSBzZXF1ZW5jZSBbeCwgZiB4LCAuLi5dLiAqKVxuXG4oKiBUaGUgcmVhc29uIHdoeSB3ZSBnaXZlIHRoaXMgc2xpZ2h0bHkgaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0sXG4gICBhcyBvcHBvc2VkIHRvIHRoZSBtb3JlIG5haXZlIGRlZmluaXRpb24gdGhhdCBtYXkgY29tZSB0byBtaW5kLCBpcyB0aGF0XG4gICB3ZSBhcmUgY2FyZWZ1bCB0byBhdm9pZCBldmFsdWF0aW5nIFtmIHhdIHVudGlsIHRoaXMgZnVuY3Rpb24gY2FsbCBpc1xuICAgYWN0dWFsbHkgbmVjZXNzYXJ5LiBUaGUgbmFpdmUgZGVmaW5pdGlvbiAobm90IHNob3duIGhlcmUpIGNvbXB1dGVzIHRoZVxuICAgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBzZXF1ZW5jZSwgW2YgeF0sIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IGlzXG4gICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICopXG5cbmxldCBpdGVyYXRlIGYgeCA9XG4gIGNvbnMgeCAoaXRlcmF0ZTEgZiB4KVxuXG5cblxubGV0IHJlYyBtYXBpX2F1eCBmIGkgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoZiBpIHgsIG1hcGlfYXV4IGYgKGkrMSkgeHMpXG5cbmxldFtAaW5saW5lXSBtYXBpIGYgeHMgPVxuICBtYXBpX2F1eCBmIDAgeHNcblxuKCogW3RhaWxfc2NhbiBmIHMgeHNdIGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKHNjYW4gZiBzIHhzKV0uXG4gICBbdGFpbF9zY2FuXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW3NjYW5dLiAqKVxuXG4oKiBUaGlzIHNsaWdodGx5IGluZGlyZWN0IGRlZmluaXRpb24gb2YgW3NjYW5dIGlzIG1lYW50IHRvIGF2b2lkIGNvbXB1dGluZ1xuICAgZWxlbWVudHMgdG9vIGVhcmx5OyBzZWUgdGhlIGFib3ZlIGNvbW1lbnQgYWJvdXQgW2l0ZXJhdGUxXSBhbmQgW2l0ZXJhdGVdLiAqKVxuXG5sZXQgcmVjIHRhaWxfc2NhbiBmIHMgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbGV0IHMgPSBmIHMgeCBpblxuICAgICAgQ29ucyAocywgdGFpbF9zY2FuIGYgcyB4cylcblxubGV0IHNjYW4gZiBzIHhzID1cbiAgY29ucyBzICh0YWlsX3NjYW4gZiBzIHhzKVxuXG4oKiBbdGFrZV0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW3Rha2UgMCB4c10gcmV0dXJucyBbZW1wdHldXG4gICBpbW1lZGlhdGVseSwgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCByZWMgdGFrZV9hdXggbiB4cyA9XG4gIGlmIG4gPSAwIHRoZW5cbiAgICBlbXB0eVxuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICAgIENvbnMgKHgsIHRha2VfYXV4IChuLTEpIHhzKVxuXG5sZXQgdGFrZSBuIHhzID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcS50YWtlXCI7XG4gIHRha2VfYXV4IG4geHNcblxuKCogW2ZvcmNlX2Ryb3AgbiB4c10gaXMgZXF1aXZhbGVudCB0byBbZHJvcCBuIHhzICgpXS5cbiAgIFtmb3JjZV9kcm9wIG4geHNdIHJlcXVpcmVzIFtuID4gMF0uXG4gICBbZm9yY2VfZHJvcF0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtkcm9wXS4gKilcblxubGV0IHJlYyBmb3JjZV9kcm9wIG4geHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKF8sIHhzKSAtPlxuICAgICAgbGV0IG4gPSBuIC0gMSBpblxuICAgICAgaWYgbiA9IDAgdGhlblxuICAgICAgICB4cygpXG4gICAgICBlbHNlXG4gICAgICAgIGZvcmNlX2Ryb3AgbiB4c1xuXG4oKiBbZHJvcF0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW2Ryb3AgMCB4c10gcmV0dXJucyBbeHNdIGltbWVkaWF0ZWx5LFxuICAgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCBkcm9wIG4geHMgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VxLmRyb3BcIlxuICBlbHNlIGlmIG4gPSAwIHRoZW5cbiAgICB4c1xuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBmb3JjZV9kcm9wIG4geHNcblxubGV0IHJlYyB0YWtlX3doaWxlIHAgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgaWYgcCB4IHRoZW4gQ29ucyAoeCwgdGFrZV93aGlsZSBwIHhzKSBlbHNlIE5pbFxuXG5sZXQgcmVjIGRyb3Bfd2hpbGUgcCB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIGFzIG5vZGUgLT5cbiAgICAgIGlmIHAgeCB0aGVuIGRyb3Bfd2hpbGUgcCB4cyAoKSBlbHNlIG5vZGVcblxubGV0IHJlYyBncm91cCBlcSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zIChjb25zIHggKHRha2Vfd2hpbGUgKGVxIHgpIHhzKSwgZ3JvdXAgZXEgKGRyb3Bfd2hpbGUgKGVxIHgpIHhzKSlcblxuZXhjZXB0aW9uIEZvcmNlZF90d2ljZVxuXG5tb2R1bGUgU3VzcGVuc2lvbiA9IHN0cnVjdFxuXG4gIHR5cGUgJ2Egc3VzcGVuc2lvbiA9XG4gICAgdW5pdCAtPiAnYVxuXG4gICgqIENvbnZlcnNpb25zLiAqKVxuXG4gIGxldCB0b19sYXp5IDogJ2Egc3VzcGVuc2lvbiAtPiAnYSBMYXp5LnQgPVxuICAgIExhenkuZnJvbV9mdW5cbiAgICAoKiBmdW4gcyAtPiBsYXp5IChzKCkpICopXG5cbiAgbGV0IGZyb21fbGF6eSAocyA6ICdhIExhenkudCkgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBmdW4gKCkgLT4gTGF6eS5mb3JjZSBzXG5cbiAgKCogW21lbW9pemVdIHR1cm5zIGFuIGFyYml0cmFyeSBzdXNwZW5zaW9uIGludG8gYSBwZXJzaXN0ZW50IHN1c3BlbnNpb24uICopXG5cbiAgbGV0IG1lbW9pemUgKHMgOiAnYSBzdXNwZW5zaW9uKSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGZyb21fbGF6eSAodG9fbGF6eSBzKVxuXG4gICgqIFtmYWlsdXJlXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBmYWlscyB3aGVuIGZvcmNlZC4gKilcblxuICBsZXQgZmFpbHVyZSA6IF8gc3VzcGVuc2lvbiA9XG4gICAgZnVuICgpIC0+XG4gICAgICAoKiBBIHN1c3BlbnNpb24gY3JlYXRlZCBieSBbb25jZV0gaGFzIGJlZW4gZm9yY2VkIHR3aWNlLiAqKVxuICAgICAgcmFpc2UgRm9yY2VkX3R3aWNlXG5cbiAgKCogSWYgW2ZdIGlzIGEgc3VzcGVuc2lvbiwgdGhlbiBbb25jZSBmXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBjYW4gYmUgZm9yY2VkXG4gICAgIGF0IG1vc3Qgb25jZS4gSWYgaXQgaXMgZm9yY2VkIG1vcmUgdGhhbiBvbmNlLCB0aGVuIFtGb3JjZWRfdHdpY2VdIGlzXG4gICAgIHJhaXNlZC4gKilcblxuICBsZXQgb25jZSAoZiA6ICdhIHN1c3BlbnNpb24pIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgbGV0IGFjdGlvbiA9IEF0b21pYy5tYWtlIGYgaW5cbiAgICBmdW4gKCkgLT5cbiAgICAgICgqIEdldCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IHN0b3JlZCBpbiBbYWN0aW9uXSwgYW5kIHdyaXRlIHRoZVxuICAgICAgICAgZnVuY3Rpb24gW2ZhaWx1cmVdIGluIGl0cyBwbGFjZSwgc28gdGhlIG5leHQgYWNjZXNzIHdpbGwgcmVzdWx0XG4gICAgICAgICBpbiBhIGNhbGwgdG8gW2ZhaWx1cmUoKV0uICopXG4gICAgICBsZXQgZiA9IEF0b21pYy5leGNoYW5nZSBhY3Rpb24gZmFpbHVyZSBpblxuICAgICAgZigpXG5cbmVuZCAoKiBTdXNwZW5zaW9uICopXG5cbmxldCByZWMgbWVtb2l6ZSB4cyA9XG4gIFN1c3BlbnNpb24ubWVtb2l6ZSAoZnVuICgpIC0+XG4gICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgQ29ucyAoeCwgbWVtb2l6ZSB4cylcbiAgKVxuXG5sZXQgcmVjIG9uY2UgeHMgPVxuICBTdXNwZW5zaW9uLm9uY2UgKGZ1biAoKSAtPlxuICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgIENvbnMgKHgsIG9uY2UgeHMpXG4gIClcblxuXG5sZXQgcmVjIHppcCB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKCh4LCB5KSwgemlwIHhzIHlzKVxuXG5sZXQgcmVjIG1hcDIgZiB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKGYgeCB5LCBtYXAyIGYgeHMgeXMpXG5cbmxldCByZWMgaW50ZXJsZWF2ZSB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgeXMoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoeCwgaW50ZXJsZWF2ZSB5cyB4cylcblxuKCogW3NvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIChjb25zIHggeHMpIHlzXS5cblxuICAgW3NvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIHhzIChjb25zIHkgeXMpXS5cblxuICAgW3NvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c10gaXMgZXF1aXZhbGVudCB0b1xuICAgICBbc29ydGVkX21lcmdlIGNtcCAoY29ucyB4IHhzKSAoY29ucyB5IHlzKV0uXG5cbiAgIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBhcmUgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgaW4gdGhlIGRlZmluaXRpb25cbiAgIG9mIFtzb3J0ZWRfbWVyZ2VdLiAqKVxuXG5sZXQgcmVjIHNvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzICgpID1cbiAgbWF0Y2ggeXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBDb25zICh4LCB4cylcbiAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5hbmQgc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIENvbnMgKHksIHlzKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cbmFuZCBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXMgPVxuICBpZiBjbXAgeCB5IDw9IDAgdGhlblxuICAgIENvbnMgKHgsIHNvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzKVxuICBlbHNlXG4gICAgQ29ucyAoeSwgc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXMpXG5cbmxldCBzb3J0ZWRfbWVyZ2UgY21wIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gICAgfCBOaWwsIE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IE5pbCwgY1xuICAgIHwgYywgTmlsIC0+XG4gICAgICAgIGNcbiAgICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5cbmxldCByZWMgbWFwX2ZzdCB4eXMgKCkgPVxuICBtYXRjaCB4eXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICgoeCwgXyksIHh5cykgLT5cbiAgICAgIENvbnMgKHgsIG1hcF9mc3QgeHlzKVxuXG5sZXQgcmVjIG1hcF9zbmQgeHlzICgpID1cbiAgbWF0Y2ggeHlzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoKF8sIHkpLCB4eXMpIC0+XG4gICAgICBDb25zICh5LCBtYXBfc25kIHh5cylcblxubGV0IHVuemlwIHh5cyA9XG4gIG1hcF9mc3QgeHlzLCBtYXBfc25kIHh5c1xuXG5sZXQgc3BsaXQgPVxuICB1bnppcFxuXG4oKiBbZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgIFtmaWx0ZXJfbWFwIEVpdGhlci5maW5kX2xlZnQgKG1hcCBmIHhzKV0uICopXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgRWl0aGVyLkxlZnQgeSAtPlxuICAgICAgICAgIENvbnMgKHksIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzKVxuICAgICAgfCBFaXRoZXIuUmlnaHQgXyAtPlxuICAgICAgICAgIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzICgpXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IEVpdGhlci5MZWZ0IF8gLT5cbiAgICAgICAgICBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMgKClcbiAgICAgIHwgRWl0aGVyLlJpZ2h0IHogLT5cbiAgICAgICAgICBDb25zICh6LCBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMpXG5cbmxldCBwYXJ0aXRpb25fbWFwIGYgeHMgPVxuICBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyxcbiAgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzXG5cbmxldCBwYXJ0aXRpb24gcCB4cyA9XG4gIGZpbHRlciBwIHhzLCBmaWx0ZXIgKGZ1biB4IC0+IG5vdCAocCB4KSkgeHNcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW3BlZWwgeHNzXSBpcyBhIHBhaXIgb2ZcbiAgIHRoZSBmaXJzdCBjb2x1bW4gKGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMpIGFuZCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZVxuICAgbWF0cml4IChhIHNlcXVlbmNlIG9mIHNob3J0ZXIgcm93cykuIFRoZXNlIHR3byBzZXF1ZW5jZXMgaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBUaGUgcm93cyBvZiB0aGUgbWF0cml4IFt4c3NdIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBBbiBlbXB0eSByb3cgaXMgaWdub3JlZC4gKilcblxuKCogQmVjYXVzZSBbcGVlbF0gdXNlcyBbdW56aXBdLCBpdHMgYXJndW1lbnQgbXVzdCBiZSBwZXJzaXN0ZW50LiBUaGUgc2FtZVxuICAgcmVtYXJrIGFwcGxpZXMgdG8gW3RyYW5zcG9zZV0sIFtkaWFnb25hbHNdLCBbcHJvZHVjdF0sIGV0Yy4gKilcblxubGV0IHBlZWwgeHNzID1cbiAgdW56aXAgKGZpbHRlcl9tYXAgdW5jb25zIHhzcylcblxubGV0IHJlYyB0cmFuc3Bvc2UgeHNzICgpID1cbiAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgeHNzIGluXG4gIGlmIGlzX2VtcHR5IGhlYWRzIHRoZW4gYmVnaW5cbiAgICBhc3NlcnQgKGlzX2VtcHR5IHRhaWxzKTtcbiAgICBOaWxcbiAgZW5kXG4gIGVsc2VcbiAgICBDb25zIChoZWFkcywgdHJhbnNwb3NlIHRhaWxzKVxuXG4oKiBUaGUgaW50ZXJuYWwgZnVuY3Rpb24gW2RpYWdvbmFsc10gdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQsIFtyZW1haW5kZXJzXSxcbiAgIHdoaWNoIGNvbnRhaW5zIHRoZSByZW1haW5kZXJzIG9mIHRoZSByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgIGRpc2NvdmVyZWQuICopXG5cbmxldCByZWMgZGlhZ29uYWxzIHJlbWFpbmRlcnMgeHNzICgpID1cbiAgbWF0Y2ggeHNzKCkgd2l0aFxuICB8IENvbnMgKHhzLCB4c3MpIC0+XG4gICAgICBiZWdpbiBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgbm9uZW1wdHkgcm93IFt4IDo6IHhzXS4gVGh1cywgdGhlIG5leHQgZGlhZ29uYWxcbiAgICAgICAgICAgICBpcyBbeCA6OiBoZWFkc106IHRoaXMgZGlhZ29uYWwgYmVnaW5zIHdpdGggW3hdIGFuZCBjb250aW51ZXMgd2l0aFxuICAgICAgICAgICAgIHRoZSBmaXJzdCBlbGVtZW50IG9mIGV2ZXJ5IHJvdyBpbiBbcmVtYWluZGVyc10uIEluIHRoZSByZWN1cnNpdmVcbiAgICAgICAgICAgICBjYWxsLCB0aGUgYXJndW1lbnQgW3JlbWFpbmRlcnNdIGlzIGluc3RhbnRpYXRlZCB3aXRoIFt4cyA6OlxuICAgICAgICAgICAgIHRhaWxzXSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3csIFt4c10sXG4gICAgICAgICAgICAgYW5kIHRoYXQgd2Uga2VlcCB0aGUgdGFpbHMgb2YgdGhlIHByZS1leGlzdGluZyByZW1haW5pbmcgcm93cy4gKilcbiAgICAgICAgICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCByZW1haW5kZXJzIGluXG4gICAgICAgICAgQ29ucyAoY29ucyB4IGhlYWRzLCBkaWFnb25hbHMgKGNvbnMgeHMgdGFpbHMpIHhzcylcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgZW1wdHkgcm93LiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgZGlhZ29uYWwgaXNcbiAgICAgICAgICAgICBqdXN0IFtoZWFkc10sIGFuZCBbcmVtYWluZGVyc10gaXMgaW5zdGFudGlhdGVkIHdpdGgganVzdCBbdGFpbHNdLFxuICAgICAgICAgICAgIGFzIHdlIGRvIG5vdCBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3cuICopXG4gICAgICAgICAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgcmVtYWluZGVycyBpblxuICAgICAgICAgIENvbnMgKGhlYWRzLCBkaWFnb25hbHMgdGFpbHMgeHNzKVxuICAgICAgZW5kXG4gIHwgTmlsIC0+XG4gICAgICAoKiBUaGVyZSBhcmUgbm8gbW9yZSByb3dzIHRvIGJlIGRpc2NvdmVyZWQuIFRoZXJlIHJlbWFpbnMgdG8gZXhoYXVzdFxuICAgICAgICAgdGhlIHJlbWFpbmluZyByb3dzLiAqKVxuICAgICAgdHJhbnNwb3NlIHJlbWFpbmRlcnMgKClcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW2RpYWdvbmFscyB4c3NdIGlzXG4gICB0aGUgc2VxdWVuY2Ugb2YgaXRzIGRpYWdvbmFscy5cblxuICAgVGhlIGZpcnN0IGRpYWdvbmFsIGNvbnRhaW5zIGp1c3QgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBmaXJzdCByb3cuIFRoZSBzZWNvbmQgZGlhZ29uYWwgY29udGFpbnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBzZWNvbmQgcm93IGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHJvdzsgYW5kIHNvIG9uLlxuICAgVGhpcyBraW5kIG9mIGRpYWdvbmFsIGlzIGluIGZhY3Qgc29tZXRpbWVzIGtub3duIGFzIGFuIGFudGlkaWFnb25hbC5cblxuICAgLSBFdmVyeSBkaWFnb25hbCBpcyBhIGZpbml0ZSBzZXF1ZW5jZS5cbiAgIC0gVGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCBbeHNzXSBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIGlzIG5vdCByZXF1aXJlZCB0byBiZSBmaW5pdGUgKGluIGVpdGhlciBkaXJlY3Rpb24pLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIG11c3QgYmUgcGVyc2lzdGVudC4gKilcblxubGV0IGRpYWdvbmFscyB4c3MgPVxuICBkaWFnb25hbHMgZW1wdHkgeHNzXG5cbmxldCBtYXBfcHJvZHVjdCBmIHhzIHlzID1cbiAgY29uY2F0IChkaWFnb25hbHMgKFxuICAgIG1hcCAoZnVuIHggLT5cbiAgICAgIG1hcCAoZnVuIHkgLT5cbiAgICAgICAgZiB4IHlcbiAgICAgICkgeXNcbiAgICApIHhzXG4gICkpXG5cbmxldCBwcm9kdWN0IHhzIHlzID1cbiAgbWFwX3Byb2R1Y3QgKGZ1biB4IHkgLT4gKHgsIHkpKSB4cyB5c1xuXG5sZXQgb2ZfZGlzcGVuc2VyIGl0ID1cbiAgbGV0IHJlYyBjICgpID1cbiAgICBtYXRjaCBpdCgpIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgTmlsXG4gICAgfCBTb21lIHggLT5cbiAgICAgICAgQ29ucyAoeCwgYylcbiAgaW5cbiAgY1xuXG5sZXQgdG9fZGlzcGVuc2VyIHhzID1cbiAgbGV0IHMgPSByZWYgeHMgaW5cbiAgZnVuICgpIC0+XG4gICAgbWF0Y2ggKCFzKSgpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgcyA6PSB4cztcbiAgICAgICAgU29tZSB4XG5cblxuXG5sZXQgcmVjIGludHMgaSAoKSA9XG4gIENvbnMgKGksIGludHMgKGkgKyAxKSlcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiQXNzZXJ0X2ZhaWx1cmUiLCJTdGRsaWJfQXRvbWljIiwiQ2FtbGludGVybmFsTGF6eSIsIlN0ZGxpYiIsIlN0ZGxpYl9MYXp5IiwiZW1wdHkiLCJwYXJhbSIsInJldHVybiQiLCJ4IiwiY29ucyIsIm5leHQiLCJhcHBlbmQiLCJzZXExIiwic2VxMiIsIm1hdGNoIiwibWFwIiwic2VxIiwiZmlsdGVyX21hcCIsInkiLCJmaWx0ZXIiLCJjb25jYXQiLCJmbGF0X21hcCIsImZvbGRfbGVmdCIsImFjYyIsIml0ZXIiLCJ1bmZvbGQiLCJ1IiwiaXNfZW1wdHkiLCJ4cyIsInVuY29ucyIsImxlbmd0aCIsImFjY3UiLCJpdGVyaSIsImkiLCJmb2xkX2xlZnRpIiwiZm9yX2FsbCIsInAiLCJleGlzdHMiLCJmaW5kIiwiZmluZF9pbmRleCIsImZpbmRfbWFwIiwicmVzdWx0IiwiZmluZF9tYXBpIiwiaXRlcjIiLCJ5cyIsImZvbGRfbGVmdDIiLCJmb3JfYWxsMiIsImV4aXN0czIiLCJlcXVhbCIsImVxIiwiY29tcGFyZSIsImNtcCIsImMiLCJpbml0X2F1eCIsImoiLCJpbml0IiwibiIsInJlcGVhdCIsImZvcmV2ZXIiLCJjeWNsZV9ub25lbXB0eSIsImN5Y2xlIiwiaXRlcmF0ZTEiLCJpdGVyYXRlIiwibWFwaV9hdXgiLCJtYXBpIiwidGFpbF9zY2FuIiwicyIsInNjYW4iLCJ0YWtlX2F1eCIsInRha2UiLCJkcm9wIiwidGFrZV93aGlsZSIsImRyb3Bfd2hpbGUiLCJub2RlIiwiZ3JvdXAiLCJGb3JjZWRfdHdpY2UiLCJ0b19sYXp5IiwiZmFpbHVyZSIsIm1lbW9pemUiLCJvbmNlIiwiYWN0aW9uIiwiemlwIiwibWFwMiIsImludGVybGVhdmUiLCJzb3J0ZWRfbWVyZ2UxIiwic29ydGVkX21lcmdlIiwibWFwX2ZzdCIsInh5cyIsIm1hcF9zbmQiLCJ1bnppcCIsImZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCIsImZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAiLCJ6IiwicGFydGl0aW9uX21hcCIsInBhcnRpdGlvbiIsInBlZWwiLCJ4c3MiLCJ0cmFuc3Bvc2UiLCJ0YWlscyIsImhlYWRzIiwicmVtYWluZGVycyIsIm1hcF9wcm9kdWN0IiwicHJvZHVjdCIsIm9mX2Rpc3BlbnNlciIsIml0IiwidG9fZGlzcGVuc2VyIiwiaW50cyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUosR0FBQUMsSUFBQUUsSUFBQUU7QUFBQUEsSUFB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LFNBQUFOLElBRk07QUFBQSxLQUlOO0FBQUEsSUFBVztBQUFBLElBRWpCO0FBQUEsR0FBQztBQUFBLFlBQUFpRyxhQUFBN0U7QUFBQUEsUUFBQXNDLElBR0Q7QUFBQSxJQUNBLGdCQUFBNUQ7QUFBQUEsU0FBQVEsUUFDUTtBQUFBLEtBQU0sWUFFUjtBQUFBLFNBQUFjLEtBRlEsVUFBQXBCLElBQUE7QUFBQSxLQUlSO0FBQUEsS0FDQSxjQUFNLENBTlo7QUFBQSxHQU1ZO0FBQUEsWUFBQWtHLEtBQUF6RSxHQUFBM0I7QUFBQUEsUUFBQSxJQUtIO0FBQUEsSUFBWSwwQkFBWixvQkFBWTtBQUFBLEdBQUM7QUFBQSxHRDdyQnhCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTEwMzIsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvb3B0aW9uLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAnYSBvcHRpb24gPSBOb25lIHwgU29tZSBvZiAnYVxuXG5sZXQgbm9uZSA9IE5vbmVcbmxldCBzb21lIHYgPSBTb21lIHZcbmxldCB2YWx1ZSBvIH5kZWZhdWx0ID0gbWF0Y2ggbyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBkZWZhdWx0XG5sZXQgZ2V0ID0gZnVuY3Rpb24gU29tZSB2IC0+IHYgfCBOb25lIC0+IGludmFsaWRfYXJnIFwib3B0aW9uIGlzIE5vbmVcIlxubGV0IGJpbmQgbyBmID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBmIHZcbmxldCBqb2luID0gZnVuY3Rpb24gU29tZSBvIC0+IG8gfCBOb25lIC0+IE5vbmVcbmxldCBtYXAgZiBvID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBTb21lIChmIHYpXG5sZXQgZm9sZCB+bm9uZSB+c29tZSA9IGZ1bmN0aW9uIFNvbWUgdiAtPiBzb21lIHYgfCBOb25lIC0+IG5vbmVcbmxldCBpdGVyIGYgPSBmdW5jdGlvbiBTb21lIHYgLT4gZiB2IHwgTm9uZSAtPiAoKVxubGV0IGlzX25vbmUgPSBmdW5jdGlvbiBOb25lIC0+IHRydWUgfCBTb21lIF8gLT4gZmFsc2VcbmxldCBpc19zb21lID0gZnVuY3Rpb24gTm9uZSAtPiBmYWxzZSB8IFNvbWUgXyAtPiB0cnVlXG5cbmxldCBlcXVhbCBlcSBvMCBvMSA9IG1hdGNoIG8wLCBvMSB3aXRoXG58IFNvbWUgdjAsIFNvbWUgdjEgLT4gZXEgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiB0cnVlXG58IF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgY21wIG8wIG8xID0gbWF0Y2ggbzAsIG8xIHdpdGhcbnwgU29tZSB2MCwgU29tZSB2MSAtPiBjbXAgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiAwXG58IE5vbmUsIFNvbWUgXyAtPiAtMVxufCBTb21lIF8sIE5vbmUgLT4gMVxuXG5sZXQgdG9fcmVzdWx0IH5ub25lID0gZnVuY3Rpb24gTm9uZSAtPiBFcnJvciBub25lIHwgU29tZSB2IC0+IE9rIHZcbmxldCB0b19saXN0ID0gZnVuY3Rpb24gTm9uZSAtPiBbXSB8IFNvbWUgdiAtPiBbdl1cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBOb25lIC0+IFNlcS5lbXB0eSB8IFNvbWUgdiAtPiBTZXEucmV0dXJuIHZcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX1NlcSIsIlN0ZGxpYiIsInNvbWUiLCJ2IiwidmFsdWUiLCJvIiwiZGVmYXVsdCQiLCJnZXQiLCJwYXJhbSIsImJpbmQiLCJqb2luIiwibWFwIiwiZm9sZCIsIm5vbmUiLCJpdGVyIiwiaXNfbm9uZSIsImlzX3NvbWUiLCJlcXVhbCIsImVxIiwibzAiLCJvMSIsInYxIiwidjAiLCJjb21wYXJlIiwiY21wIiwidG9fcmVzdWx0IiwidG9fbGlzdCIsInRvX3NlcSJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsWUFBQUMsS0FBQUMsR0NrQmEsY0FBTTtBQUFBLFlBQUFDLE1BQUFDLEdBQUFDO0FBQUFBLElBQ0ksUUFBbUM7QUFBQSxRQUFBSCxJQUFuQztBQUFBLElBQXVCO0FBQUEsR0FBbUI7QUFBQSxZQUFBSSxJQUFBQztBQUFBQSxJQUN2RCxZQUErQiw2Q0FBNEI7QUFBQSxRQUFBTCxJQUEzRDtBQUFBLElBQW1CO0FBQUEsR0FBd0M7QUFBQSxZQUFBTSxLQUFBSixHQUFBVjtBQUFBQSxJQUN0RCxRQUFxQjtBQUFBLFFBQUFRLElBQXJCO0FBQUEsSUFBc0MsdUJBQUc7QUFBQTtBQUFBLFlBQUFPLEtBQUFGLE9BQzdDLFlBQStCLGNBQUFILElBQS9CLFVBQW1CLFNBQWdCO0FBQUEsWUFBQU0sSUFBQWhCLEdBQUFVO0FBQUFBLElBQ2hDLFFBQXFCO0FBQUEsUUFBQUYsSUFBckI7QUFBQSxJQUEyQyw0QkFBSztBQUFBO0FBQUEsWUFBQVMsS0FBQUMsTUFBQVgsTUFBQU07QUFBQUEsSUFDckQsWUFBa0Q7QUFBQSxRQUFBTCxJQUFsRDtBQUFBLElBQWlDLDBCQUFxQjtBQUFBO0FBQUEsWUFBQVcsS0FBQW5CLEdBQUFhO0FBQUFBLElBQ3RELFlBQXFDO0FBQUEsUUFBQUwsSUFBckM7QUFBQSxJQUF1Qix1QkFBZ0I7QUFBQTtBQUFBLFlBQUFZLFFBQUFQLE9BQ2xDLG9CQUF1QztBQUFBLFlBQUFRLFFBQUFSLE9BQ3ZDLG9CQUF1QztBQUFBLFlBQUFTLE1BQUFDLElBQUFDLElBQUFDO0FBQUFBLElBRWhDO0FBQUEsZ0JBQUFDLEtBQUEsT0FBQUMsS0FBQSxPQUNDLDZCQUVWO0FBQUE7QUFBQSxrQkFESTtBQUFBLElBQ1Q7QUFBQSxHQUFLO0FBQUEsWUFBQUMsUUFBQUMsS0FBQUwsSUFBQUM7QUFBQUEsSUFFWSwyQkFJTDtBQUFBLFFBQUFFLEtBSks7QUFBQSxhQUlOO0FBQUEsUUFBQUQsS0FKTTtBQUFBLElBQ0YsOEJBR0g7QUFBQTtBQUFBLFlBQUFJLFVBQUFaLE1BQUFMO0FBQUFBLElBRUwsWUFBeUI7QUFBQSxRQUFBTCxJQUF6QjtBQUFBLElBQWdEO0FBQUEsR0FBSTtBQUFBLFlBQUF1QixRQUFBbEI7QUFBQUEsSUFDcEQsWUFBaUI7QUFBQSxRQUFBTCxJQUFqQjtBQUFBLElBQWdDO0FBQUEsR0FBRztBQUFBLFlBQUF3QixPQUFBbkI7QUFBQUEsSUFDcEMsWUFBaUI7QUFBQSxRQUFBTCxJQUFqQixjQUF1QztBQUFBLHVCRDFDcEQsZ0JDMENvRDtBQUFBLEdBQVk7QUFBQSxHRDFDaEUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMTE0MCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9jaGFyLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBDaGFyYWN0ZXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBjb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaHI6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgY2hyIG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJDaGFyLmNoclwiIGVsc2UgdW5zYWZlX2NociBuXG5cbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZTogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCBieXRlc191bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuXG5sZXQgZXNjYXBlZCA9IGZ1bmN0aW9uXG4gIHwgJ1xcJycgLT4gXCJcXFxcJ1wiXG4gIHwgJ1xcXFwnIC0+IFwiXFxcXFxcXFxcIlxuICB8ICdcXG4nIC0+IFwiXFxcXG5cIlxuICB8ICdcXHQnIC0+IFwiXFxcXHRcIlxuICB8ICdcXHInIC0+IFwiXFxcXHJcIlxuICB8ICdcXGInIC0+IFwiXFxcXGJcIlxuICB8ICcgJyAuLiAnficgYXMgYyAtPlxuICAgICAgbGV0IHMgPSBieXRlc19jcmVhdGUgMSBpblxuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDAgYztcbiAgICAgIHVuc2FmZV90b19zdHJpbmcgc1xuICB8IGMgLT5cbiAgICAgIGxldCBuID0gY29kZSBjIGluXG4gICAgICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSA0IGluXG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMCAnXFxcXCc7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMSAodW5zYWZlX2NociAoNDggKyBuIC8gMTAwKSk7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMiAodW5zYWZlX2NociAoNDggKyAobiAvIDEwKSBtb2QgMTApKTtcbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAzICh1bnNhZmVfY2hyICg0OCArIG4gbW9kIDEwKSk7XG4gICAgICB1bnNhZmVfdG9fc3RyaW5nIHNcblxubGV0IGxvd2VyY2FzZV9hc2NpaSA9IGZ1bmN0aW9uXG4gIHwgJ0EnIC4uICdaJyBhcyBjIC0+IHVuc2FmZV9jaHIoY29kZSBjICsgMzIpXG4gIHwgYyAtPiBjXG5cbmxldCB1cHBlcmNhc2VfYXNjaWkgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgYXMgYyAtPiB1bnNhZmVfY2hyKGNvZGUgYyAtIDMyKVxuICB8IGMgLT4gY1xuXG50eXBlIHQgPSBjaGFyXG5cbmxldCBjb21wYXJlIGMxIGMyID0gY29kZSBjMSAtIGNvZGUgYzJcbmxldCBlcXVhbCAoYzE6IHQpIChjMjogdCkgPSBjb21wYXJlIGMxIGMyID0gMFxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfaGFzaCIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiU3RkbGliIiwiY2hyIiwibiIsImVzY2FwZWQiLCJjIiwicyIsImxvd2VyY2FzZV9hc2NpaSIsInVwcGVyY2FzZV9hc2NpaSIsImNvbXBhcmUiLCJjMSIsImMyIiwiZXF1YWwiLCJzZWVkZWRfaGFzaCIsInNlZWQiLCJ4IiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLElBQUFDO0FBQUFBLElDcUJFLHVCQUFxRDtBQUFBLElBQTVCLHVDQUF3QztBQUFBO0FBQUEsWUFBQUMsUUFBQUM7QUFBQUE7QUFBQUE7QUFBQUEsS0FPckQ7QUFBQSxtQkFFRjtBQUFBLE1BRkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU1GO0FBQUE7QUFBQSxVQUZBO0FBQUE7QUFBQSxVQURBO0FBQUE7QUFBQSxVQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFMRSxZQUNGO0FBQUE7QUFBQSxTQUFBQyxNQU9FO0FBQUEsS0FDUjtBQUFBLEtBQ0EsZ0NBUWtCO0FBQUE7QUFBQSxRQUFBQSxJQUxWO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsOEJBQWtCO0FBQUE7QUFBQSxZQUFBQyxnQkFBQUYsR0FFRix5Q0FFWjtBQUFBLFlBQUFHLGdCQUFBSCxHQUVZLHlDQUVaO0FBQUEsWUFBQUksUUFBQUMsSUFBQUMsSUFJVSxtQkFBaUI7QUFBQSxZQUFBQyxNQUFBRixJQUFBQyxJQUNJLG1DQUFJO0FBQUEsWUFBQUUsWUFBQUMsTUFBQUMsR0FJcEIsa0NBQStCO0FBQUEsWUFBQUMsS0FBQUQsR0FDM0MsK0JBQTRCO0FBQUEsR0RoRXpDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTEyMTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvdWNoYXIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERhbmllbCBDLiBCdWVuemxpICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcblxubGV0IGVycl9ub19wcmVkID0gXCJVKzAwMDAgaGFzIG5vIHByZWRlY2Vzc29yXCJcbmxldCBlcnJfbm9fc3VjYyA9IFwiVSsxMEZGRkYgaGFzIG5vIHN1Y2Nlc3NvclwiXG5sZXQgZXJyX25vdF9zdiBpID0gZm9ybWF0X2ludCBcIiVYXCIgaSBeIFwiIGlzIG5vdCBhbiBVbmljb2RlIHNjYWxhciB2YWx1ZVwiXG5sZXQgZXJyX25vdF9sYXRpbjEgdSA9IFwiVStcIiBeIGZvcm1hdF9pbnQgXCIlMDRYXCIgdSBeIFwiIGlzIG5vdCBhIGxhdGluMSBjaGFyYWN0ZXJcIlxuXG50eXBlIHQgPSBpbnRcblxubGV0IG1pbiA9IDB4MDAwMFxubGV0IG1heCA9IDB4MTBGRkZGXG5sZXQgbG9fYm91bmQgPSAweEQ3RkZcbmxldCBoaV9ib3VuZCA9IDB4RTAwMFxuXG5sZXQgYm9tID0gMHhGRUZGXG5sZXQgcmVwID0gMHhGRkZEXG5cbmxldCBzdWNjIHUgPVxuICBpZiB1ID0gbG9fYm91bmQgdGhlbiBoaV9ib3VuZCBlbHNlXG4gIGlmIHUgPSBtYXggdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fc3VjYyBlbHNlXG4gIHUgKyAxXG5cbmxldCBwcmVkIHUgPVxuICBpZiB1ID0gaGlfYm91bmQgdGhlbiBsb19ib3VuZCBlbHNlXG4gIGlmIHUgPSBtaW4gdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fcHJlZCBlbHNlXG4gIHUgLSAxXG5cbmxldCBpc192YWxpZCBpID0gKG1pbiA8PSBpICYmIGkgPD0gbG9fYm91bmQpIHx8IChoaV9ib3VuZCA8PSBpICYmIGkgPD0gbWF4KVxubGV0IG9mX2ludCBpID0gaWYgaXNfdmFsaWQgaSB0aGVuIGkgZWxzZSBpbnZhbGlkX2FyZyAoZXJyX25vdF9zdiBpKVxuZXh0ZXJuYWwgdW5zYWZlX29mX2ludCA6IGludCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdG9faW50IDogdCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBpc19jaGFyIHUgPSB1IDwgMjU2XG5sZXQgb2ZfY2hhciBjID0gQ2hhci5jb2RlIGNcbmxldCB0b19jaGFyIHUgPVxuICBpZiB1ID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgKGVycl9ub3RfbGF0aW4xIHUpIGVsc2VcbiAgQ2hhci51bnNhZmVfY2hyIHVcblxubGV0IHVuc2FmZV90b19jaGFyID0gQ2hhci51bnNhZmVfY2hyXG5cbmxldCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9ICggPSApXG5sZXQgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmxldCBoYXNoID0gdG9faW50XG5cbigqIFVURiBjb2RlY3MgdG9vbHMgKilcblxudHlwZSB1dGZfZGVjb2RlID0gaW50XG4oKiBUaGlzIGlzIGFuIGludCBbMHhEVVVVVVVVXSBkZWNvbXBvc2VkIGFzIGZvbGxvd3M6XG4gICAtIFtEXSBpcyBmb3VyIGJpdHMgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiwgdGhlIGhpZ2hlc3QgYml0IGlzIHNldCBpZiB0aGVcbiAgICAgZGVjb2RlIGlzIHZhbGlkLiBUaGUgdGhyZWUgbG93ZXIgYml0cyBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG4gICAgIGZyb20gdGhlIHNvdXJjZSB0aGF0IHdlcmUgY29uc3VtZWQgYnkgdGhlIGRlY29kZS5cbiAgIC0gW1VVVVVVVV0gaXMgdGhlIGRlY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgb3IgdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnRcbiAgICAgY2hhcmFjdGVyIFUrRkZGRCBpZiBmb3IgaW52YWxpZCBkZWNvZGVzLiAqKVxuXG5sZXQgdmFsaWRfYml0ID0gMjdcbmxldCBkZWNvZGVfYml0cyA9IDI0XG5cbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2lzX3ZhbGlkIGQgPSAoZCBsc3IgdmFsaWRfYml0KSA9IDFcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2xlbmd0aCBkID0gKGQgbHNyIGRlY29kZV9iaXRzKSBsYW5kIDBiMTExXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV91Y2hhciBkID0gdW5zYWZlX29mX2ludCAoZCBsYW5kIDB4RkZGRkZGKVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGUgbiB1ID0gKCg4IGxvciBuKSBsc2wgZGVjb2RlX2JpdHMpIGxvciAodG9faW50IHUpXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9pbnZhbGlkIG4gPSAobiBsc2wgZGVjb2RlX2JpdHMpIGxvciByZXBcblxubGV0IHV0Zl84X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+IDFcbnwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDNcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgdXRmXzE2X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2Zvcm1hdF9pbnQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJnbG9iYWxfZGF0YSIsIkFzc2VydF9mYWlsdXJlIiwiU3RkbGliIiwic3VjYyIsInUiLCJwcmVkIiwiaXNfdmFsaWQiLCJpIiwib2ZfaW50IiwiaXNfY2hhciIsIm9mX2NoYXIiLCJjIiwidG9fY2hhciIsInVuc2FmZV90b19jaGFyIiwiZXF1YWwiLCJjb21wYXJlIiwiaGFzaCIsInV0Zl9kZWNvZGVfaXNfdmFsaWQiLCJkIiwidXRmX2RlY29kZV9sZW5ndGgiLCJ1dGZfZGVjb2RlX3VjaGFyIiwidXRmX2RlY29kZSIsIm4iLCJ1dGZfZGVjb2RlX2ludmFsaWQiLCJjc3RfdWNoYXJfbWwiLCJ1dGZfOF9ieXRlX2xlbmd0aCIsInV0Zl8xNl9ieXRlX2xlbmd0aCIsIlN0ZGxpYl9VY2hhciJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLEtBQUFDO0FBQUFBLElDaUNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQ2dCO0FBQUEseUJBQ1g7QUFBQTtBQUFBLFlBQUFDLEtBQUFEO0FBQUFBLElBR0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFDZ0I7QUFBQSx5QkFDWDtBQUFBO0FBQUEsWUFBQUUsU0FBQUM7QUFBQUEsUUFBQSxJQUVVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQTBEO0FBQUEsWUFBQUMsT0FBQUQ7QUFBQUEsSUFDekQsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBLE9BeEJFO0FBQUEsZUFBakI7QUFBQSxJQXdCZ0Q7QUFBQTtBQUFBLFlBQUFFLFFBQUFMLEdBSW5ELHVCQUFPO0FBQUEsWUFBQU0sUUFBQUMsR0FDUCxTQUFXO0FBQUEsWUFBQUMsUUFBQVI7QUFBQUEsSUFFekIsYUFDQTtBQUFBO0FBQUE7QUFBQSxPQS9CNEI7QUFBQTtBQUFBLFNBQWtEO0FBQUEsSUE4QmhDLDhCQUM3QjtBQUFBO0FBQUEsWUFBQVMsZUFBQSxHRG5EbkI7QUFBQSxZQUFBQyxNQUFBO0FBQUEsT0FBQUMsVUFBQTtBQUFBLFlBQUFDLEtBQUE7QUFBQSxZQUFBQyxvQkFBQUMsR0N3RXFDLG9DQUFxQjtBQUFBLFlBQUFDLGtCQUFBRCxHQUN2QiwwQkFBOEI7QUFBQSxZQUFBRSxpQkFBQUYsR0FDL0Isb0JBQStCO0FBQUEsWUFBQUcsV0FBQUMsR0FBQWxCLEdBQ25DLHlCQUEwQztBQUFBLFlBQUFtQixtQkFBQUQsR0FDcEMsdUJBQTJCO0FBQUE7QUFBQSxJQUFBRSxlRDVFL0Q7QUFBQTtBQUFBO0FBQUEsWUFBQUMsa0JBQUFyQjtBQUFBQSxJQytFUyxVQUFTO0FBQUEsSUFDVCxhQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixlQUFlO0FBQUEsSUFDZjtBQUFBLEtBQ0Y7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQSxXRHBGbkI7QUFBQSxZQUFBc0IsbUJBQUF0QjtBQUFBQSxJQ3VGUyxVQUFTO0FBQUEsSUFDVCxlQUFlO0FBQUEsSUFDZjtBQUFBLEtBQ0Y7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQTtBQUFBLElBQUF1QjtBQUFBQSxNRDFGbkIiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMTMzMCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9saXN0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgbGlzdHMuICopXG50eXBlICdhIHQgPSAnYSBsaXN0ID0gW10gfCAoOjopIG9mICdhICogJ2EgbGlzdFxuXG4oKiBMaXN0IG9wZXJhdGlvbnMgKilcblxubGV0IHJlYyBsZW5ndGhfYXV4IGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gbGVuXG4gIHwgXzo6bCAtPiBsZW5ndGhfYXV4IChsZW4gKyAxKSBsXG5cbmxldCBsZW5ndGggbCA9IGxlbmd0aF9hdXggMCBsXG5cbmxldCBjb25zIGEgbCA9IGE6OmxcblxubGV0IGhkID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcImhkXCJcbiAgfCBhOjpfIC0+IGFcblxubGV0IHRsID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcInRsXCJcbiAgfCBfOjpsIC0+IGxcblxubGV0IG50aCBsIG4gPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5udGhcIiBlbHNlXG4gIGxldCByZWMgbnRoX2F1eCBsIG4gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gZmFpbHdpdGggXCJudGhcIlxuICAgIHwgYTo6bCAtPiBpZiBuID0gMCB0aGVuIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IG50aF9vcHQgbCBuID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QubnRoXCIgZWxzZVxuICBsZXQgcmVjIG50aF9hdXggbCBuID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgbiA9IDAgdGhlbiBTb21lIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IGFwcGVuZCA9IChAKVxuXG5sZXQgcmVjIHJldl9hcHBlbmQgbDEgbDIgPVxuICBtYXRjaCBsMSB3aXRoXG4gICAgW10gLT4gbDJcbiAgfCBhIDo6IGwgLT4gcmV2X2FwcGVuZCBsIChhIDo6IGwyKVxuXG5sZXQgcmV2IGwgPSByZXZfYXBwZW5kIGwgW11cblxubGV0W0B0YWlsX21vZF9jb25zXSByZWMgaW5pdCBpIGxhc3QgZiA9XG4gIGlmIGkgPiBsYXN0IHRoZW4gW11cbiAgZWxzZSBpZiBpID0gbGFzdCB0aGVuIFtmIGldXG4gIGVsc2VcbiAgICBsZXQgcjEgPSBmIGkgaW5cbiAgICBsZXQgcjIgPSBmIChpKzEpIGluXG4gICAgcjEgOjogcjIgOjogaW5pdCAoaSsyKSBsYXN0IGZcblxubGV0IGluaXQgbGVuIGYgPVxuICBpZiBsZW4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LmluaXRcIiBlbHNlXG4gIGluaXQgMCAobGVuIC0gMSkgZlxuXG5sZXQgcmVjIGZsYXR0ZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgbDo6ciAtPiBsIEAgZmxhdHRlbiByXG5cbmxldCBjb25jYXQgPSBmbGF0dGVuXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IFthMV0gLT5cbiAgICAgIGxldCByMSA9IGYgYTEgaW5cbiAgICAgIFtyMV1cbiAgfCBhMTo6YTI6OmwgLT5cbiAgICAgIGxldCByMSA9IGYgYTEgaW5cbiAgICAgIGxldCByMiA9IGYgYTIgaW5cbiAgICAgIHIxOjpyMjo6bWFwIGYgbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBtYXBpIGkgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW11cbiAgfCBbYTFdIC0+XG4gICAgICBsZXQgcjEgPSBmIGkgYTEgaW5cbiAgICAgIFtyMV1cbiAgfCBhMTo6YTI6OmwgLT5cbiAgICAgIGxldCByMSA9IGYgaSBhMSBpblxuICAgICAgbGV0IHIyID0gZiAoaSsxKSBhMiBpblxuICAgICAgcjE6OnIyOjptYXBpIChpKzIpIGYgbFxuXG5sZXQgbWFwaSBmIGwgPSBtYXBpIDAgZiBsXG5cbmxldCByZXZfbWFwIGYgbCA9XG4gIGxldCByZWMgcm1hcF9mIGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdVxuICAgIHwgYTo6bCAtPiBybWFwX2YgKGYgYSA6OiBhY2N1KSBsXG4gIGluXG4gIHJtYXBfZiBbXSBsXG5cblxubGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+ICgpXG4gIHwgYTo6bCAtPiBmIGE7IGl0ZXIgZiBsXG5cbmxldCByZWMgaXRlcmkgaSBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoKVxuICB8IGE6OmwgLT4gZiBpIGE7IGl0ZXJpIChpICsgMSkgZiBsXG5cbmxldCBpdGVyaSBmIGwgPSBpdGVyaSAwIGYgbFxuXG5sZXQgcmVjIGZvbGRfbGVmdCBmIGFjY3UgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICAgIFtdIC0+IGFjY3VcbiAgfCBhOjpsIC0+IGZvbGRfbGVmdCBmIChmIGFjY3UgYSkgbFxuXG5sZXQgcmVjIGZvbGRfcmlnaHQgZiBsIGFjY3UgPVxuICBtYXRjaCBsIHdpdGhcbiAgICBbXSAtPiBhY2N1XG4gIHwgYTo6bCAtPiBmIGEgKGZvbGRfcmlnaHQgZiBsIGFjY3UpXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIG1hcDIgZiBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChbYTFdLCBbYjFdKSAtPlxuICAgICAgbGV0IHIxID0gZiBhMSBiMSBpblxuICAgICAgW3IxXVxuICB8IChhMTo6YTI6OmwxLCBiMTo6YjI6OmwyKSAtPlxuICAgICAgbGV0IHIxID0gZiBhMSBiMSBpblxuICAgICAgbGV0IHIyID0gZiBhMiBiMiBpblxuICAgICAgcjE6OnIyOjptYXAyIGYgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0Lm1hcDJcIlxuXG5sZXQgcmV2X21hcDIgZiBsMSBsMiA9XG4gIGxldCByZWMgcm1hcDJfZiBhY2N1IGwxIGwyID1cbiAgICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgfCAoW10sIFtdKSAtPiBhY2N1XG4gICAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHJtYXAyX2YgKGYgYTEgYTIgOjogYWNjdSkgbDEgbDJcbiAgICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmV2X21hcDJcIlxuICBpblxuICBybWFwMl9mIFtdIGwxIGwyXG5cblxubGV0IHJlYyBpdGVyMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+ICgpXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmIGExIGEyOyBpdGVyMiBmIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5pdGVyMlwiXG5cbmxldCByZWMgZm9sZF9sZWZ0MiBmIGFjY3UgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZm9sZF9sZWZ0MiBmIChmIGFjY3UgYTEgYTIpIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb2xkX2xlZnQyXCJcblxubGV0IHJlYyBmb2xkX3JpZ2h0MiBmIGwxIGwyIGFjY3UgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZiBhMSBhMiAoZm9sZF9yaWdodDIgZiBsMSBsMiBhY2N1KVxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9sZF9yaWdodDJcIlxuXG5sZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gdHJ1ZVxuICB8IGE6OmwgLT4gcCBhICYmIGZvcl9hbGwgcCBsXG5cbmxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBwIGEgfHwgZXhpc3RzIHAgbFxuXG5sZXQgcmVjIGZvcl9hbGwyIHAgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gdHJ1ZVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcCBhMSBhMiAmJiBmb3JfYWxsMiBwIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb3JfYWxsMlwiXG5cbmxldCByZWMgZXhpc3RzMiBwIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGZhbHNlXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBwIGExIGEyIHx8IGV4aXN0czIgcCBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZXhpc3RzMlwiXG5cbmxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtIHggbFxuXG5sZXQgcmVjIG1lbXEgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IGEgPT0geCB8fCBtZW1xIHggbFxuXG5sZXQgcmVjIGFzc29jIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGIgZWxzZSBhc3NvYyB4IGxcblxubGV0IHJlYyBhc3NvY19vcHQgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gTm9uZVxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIFNvbWUgYiBlbHNlIGFzc29jX29wdCB4IGxcblxubGV0IHJlYyBhc3NxIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGEgPT0geCB0aGVuIGIgZWxzZSBhc3NxIHggbFxuXG5sZXQgcmVjIGFzc3Ffb3B0IHggPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgfCAoYSxiKTo6bCAtPiBpZiBhID09IHggdGhlbiBTb21lIGIgZWxzZSBhc3NxX29wdCB4IGxcblxubGV0IHJlYyBtZW1fYXNzb2MgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gZmFsc2VcbiAgfCAoYSwgXykgOjogbCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtX2Fzc29jIHggbFxuXG5sZXQgcmVjIG1lbV9hc3NxIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IGZhbHNlXG4gIHwgKGEsIF8pIDo6IGwgLT4gYSA9PSB4IHx8IG1lbV9hc3NxIHggbFxuXG5sZXQgcmVjIHJlbW92ZV9hc3NvYyB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT5cbiAgICAgIGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGwgZWxzZSBwYWlyIDo6IHJlbW92ZV9hc3NvYyB4IGxcblxubGV0IHJlYyByZW1vdmVfYXNzcSB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT4gaWYgYSA9PSB4IHRoZW4gbCBlbHNlIHBhaXIgOjogcmVtb3ZlX2Fzc3EgeCBsXG5cbmxldCByZWMgZmluZCBwID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4geCBlbHNlIGZpbmQgcCBsXG5cbmxldCByZWMgZmluZF9vcHQgcCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kX29wdCBwIGxcblxubGV0IGZpbmRfaW5kZXggcCA9XG4gIGxldCByZWMgYXV4IGkgPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgcCBhIHRoZW4gU29tZSBpIGVsc2UgYXV4IChpKzEpIGwgaW5cbiAgYXV4IDBcblxubGV0IHJlYyBmaW5kX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBsIC0+XG4gICAgIGJlZ2luIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+IHJlc3VsdFxuICAgICAgIHwgTm9uZSAtPiBmaW5kX21hcCBmIGxcbiAgICAgZW5kXG5cbmxldCBmaW5kX21hcGkgZiA9XG4gIGxldCByZWMgYXV4IGkgPSBmdW5jdGlvblxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHJlc3VsdCAtPiByZXN1bHRcbiAgICAgICB8IE5vbmUgLT4gYXV4IChpKzEpIGxcbiAgICAgZW5kIGluXG4gIGF1eCAwXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIGZpbmRfYWxsIHAgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHggOjogZmluZF9hbGwgcCBsIGVsc2UgZmluZF9hbGwgcCBsXG5cbmxldCBmaWx0ZXIgPSBmaW5kX2FsbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaWx0ZXJpIHAgaSA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB4OjpsIC0+XG4gICAgICBsZXQgaScgPSBpICsgMSBpblxuICAgICAgaWYgcCBpIHggdGhlbiB4IDo6IGZpbHRlcmkgcCBpJyBsIGVsc2UgZmlsdGVyaSBwIGknIGxcblxubGV0IGZpbHRlcmkgcCBsID0gZmlsdGVyaSBwIDAgbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiBsIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBsXG4gICAgICB8IFNvbWUgdiAtPiB2IDo6IGZpbHRlcl9tYXAgZiBsXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIGNvbmNhdF9tYXAgZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB4Ojp4cyAtPiBwcmVwZW5kX2NvbmNhdF9tYXAgKGYgeCkgZiB4c1xuYW5kW0B0YWlsX21vZF9jb25zXSBwcmVwZW5kX2NvbmNhdF9tYXAgeXMgZiB4cyA9XG4gIG1hdGNoIHlzIHdpdGhcbiAgfCBbXSAtPiBjb25jYXRfbWFwIGYgeHNcbiAgfCB5IDo6IHlzIC0+IHkgOjogcHJlcGVuZF9jb25jYXRfbWFwIHlzIGYgeHNcblxubGV0IGZvbGRfbGVmdF9tYXAgZiBhY2N1IGwgPVxuICBsZXQgcmVjIGF1eCBhY2N1IGxfYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2N1LCByZXYgbF9hY2N1XG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICAgbGV0IGFjY3UsIHggPSBmIGFjY3UgeCBpblxuICAgICAgICBhdXggYWNjdSAoeCA6OiBsX2FjY3UpIGwgaW5cbiAgYXV4IGFjY3UgW10gbFxuXG5sZXQgcGFydGl0aW9uIHAgbCA9XG4gIGxldCByZWMgcGFydCB5ZXMgbm8gPSBmdW5jdGlvblxuICB8IFtdIC0+IChyZXYgeWVzLCByZXYgbm8pXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHBhcnQgKHggOjogeWVzKSBubyBsIGVsc2UgcGFydCB5ZXMgKHggOjogbm8pIGwgaW5cbiAgcGFydCBbXSBbXSBsXG5cbmxldCBwYXJ0aXRpb25fbWFwIHAgbCA9XG4gIGxldCByZWMgcGFydCBsZWZ0IHJpZ2h0ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiAocmV2IGxlZnQsIHJldiByaWdodClcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggcCB4IHdpdGhcbiAgICAgICB8IEVpdGhlci5MZWZ0IHYgLT4gcGFydCAodiA6OiBsZWZ0KSByaWdodCBsXG4gICAgICAgfCBFaXRoZXIuUmlnaHQgdiAtPiBwYXJ0IGxlZnQgKHYgOjogcmlnaHQpIGxcbiAgICAgZW5kXG4gIGluXG4gIHBhcnQgW10gW10gbFxuXG5sZXQgcmVjIHNwbGl0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoW10sIFtdKVxuICB8ICh4LHkpOjpsIC0+XG4gICAgICBsZXQgKHJ4LCByeSkgPSBzcGxpdCBsIGluICh4OjpyeCwgeTo6cnkpXG5cbmxldCByZWMgY29tYmluZSBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gKGExLCBhMikgOjogY29tYmluZSBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuY29tYmluZVwiXG5cbigqKiBzb3J0aW5nICopXG5cbmxldCByZWMgbWVyZ2UgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgbDIgLT4gbDJcbiAgfCBsMSwgW10gLT4gbDFcbiAgfCBoMSA6OiB0MSwgaDIgOjogdDIgLT5cbiAgICAgIGlmIGNtcCBoMSBoMiA8PSAwXG4gICAgICB0aGVuIGgxIDo6IG1lcmdlIGNtcCB0MSBsMlxuICAgICAgZWxzZSBoMiA6OiBtZXJnZSBjbXAgbDEgdDJcblxuXG5sZXQgc3RhYmxlX3NvcnQgY21wIGwgPVxuICBsZXQgcmVjIHJldl9tZXJnZSBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyIDw9IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID0gaWYgY21wIHgxIHgyIDw9IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPD0gMCB0aGVuXG4gICAgICAgICAgICBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPD0gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA8PSAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHJldl9zb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHJldl9zb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2VfcmV2IHMxIHMyIFtdLCB0bClcbiAgYW5kIHJldl9zb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9IGlmIGNtcCB4MSB4MiA+IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPiAwIHRoZW5cbiAgICAgICAgICAgIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzID4gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA+IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSBzb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHNvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZSBzMSBzMiBbXSwgdGwpXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggbCBpblxuICBpZiBsZW4gPCAyIHRoZW4gbCBlbHNlIGZzdCAoc29ydCBsZW4gbClcblxuXG5sZXQgc29ydCA9IHN0YWJsZV9zb3J0XG5sZXQgZmFzdF9zb3J0ID0gc3RhYmxlX3NvcnRcblxuKCogTm90ZTogb24gYSB2ZXJ5IGxvbmcgbGlzdCAobGVuZ3RoIG92ZXIgYWJvdXQgMTAwMDAwKSwgaXQgdXNlZCB0byBiZVxuICAgZmFzdGVyIHRvIGNvbnZlcnQgdGhlIGxpc3QgdG8gYW4gYXJyYXksIHNvcnQgdGhlIGFycmF5LCBhbmQgY29udmVydFxuICAgYmFjaywgdHJ1bmNhdGluZyB0aGUgYXJyYXkgb2JqZWN0IGFmdGVyIHByZXBlbmRpbmcgZWFjaCB0aG91c2FuZFxuICAgZW50cmllcyB0byB0aGUgcmVzdWx0aW5nIGxpc3QuIEltcG9zc2libGUgbm93IHRoYXQgT2JqLnRydW5jYXRlIGhhc1xuICAgYmVlbiByZW1vdmVkLiAqKVxuXG4oKiogc29ydGluZyArIHJlbW92aW5nIGR1cGxpY2F0ZXMgKilcblxubGV0IHNvcnRfdW5pcSBjbXAgbCA9XG4gIGxldCByZWMgcmV2X21lcmdlIGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBsZXQgYyA9IGNtcCBoMSBoMiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJldl9tZXJnZSB0MSB0MiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgbGV0IGMgPSBjbXAgaDEgaDIgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiByZXZfbWVyZ2VfcmV2IHQxIHQyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSBpZiBjID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gcmV2X3NvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gcmV2X3NvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZV9yZXYgczEgczIgW10sIHRsKVxuICBhbmQgcmV2X3NvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSBzb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2UgczEgczIgW10sIHRsKVxuICBpblxuICBsZXQgbGVuID0gbGVuZ3RoIGwgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIGwgZWxzZSBmc3QgKHNvcnQgbGVuIGwpXG5cblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aHMgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF8gLT4gLTFcbiAgfCBfLCBbXSAtPiAxXG4gIHwgXyA6OiBsMSwgXyA6OiBsMiAtPiBjb21wYXJlX2xlbmd0aHMgbDEgbDJcblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aF93aXRoIGwgbiA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+XG4gICAgaWYgbiA9IDAgdGhlbiAwIGVsc2VcbiAgICAgIGlmIG4gPiAwIHRoZW4gLTEgZWxzZSAxXG4gIHwgXyA6OiBsIC0+XG4gICAgaWYgbiA8PSAwIHRoZW4gMSBlbHNlXG4gICAgICBjb21wYXJlX2xlbmd0aF93aXRoIGwgKG4tMSlcblxubGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiB0cnVlXG4gIHwgXyA6OiBfIC0+IGZhbHNlXG5cbigqKiB7MSBDb21wYXJpc29ufSAqKVxuXG4oKiBOb3RlOiB3ZSBhcmUgKm5vdCogc2hvcnRjdXR0aW5nIHRoZSBsaXN0IGJ5IHVzaW5nXG4gICBbTGlzdC5jb21wYXJlX2xlbmd0aHNdIGZpcnN0OyB0aGlzIG1heSBiZSBzbG93ZXIgb24gbG9uZyBsaXN0c1xuICAgaW1tZWRpYXRlbHkgc3RhcnQgd2l0aCBkaXN0aW5jdCBlbGVtZW50cy4gSXQgaXMgYWxzbyBpbmNvcnJlY3QgZm9yXG4gICBbY29tcGFyZV0gYmVsb3csIGFuZCBpdCBpcyBiZXR0ZXIgKHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlzZSkgdG9cbiAgIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBmb3IgYm90aCBmdW5jdGlvbnMuICopXG5sZXQgcmVjIGVxdWFsIGVxIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gdHJ1ZVxuICB8IFtdLCBfOjpfIHwgXzo6XywgW10gLT4gZmFsc2VcbiAgfCBhMTo6bDEsIGEyOjpsMiAtPiBlcSBhMSBhMiAmJiBlcXVhbCBlcSBsMSBsMlxuXG5sZXQgcmVjIGNvbXBhcmUgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfOjpfIC0+IC0xXG4gIHwgXzo6XywgW10gLT4gMVxuICB8IGExOjpsMSwgYTI6OmwyIC0+XG4gICAgbGV0IGMgPSBjbXAgYTEgYTIgaW5cbiAgICBpZiBjIDw+IDAgdGhlbiBjXG4gICAgZWxzZSBjb21wYXJlIGNtcCBsMSBsMlxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGwgPVxuICBsZXQgcmVjIGF1eCBsICgpID0gbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBTZXEuTmlsXG4gICAgfCB4IDo6IHRhaWwgLT4gU2VxLkNvbnMgKHgsIGF1eCB0YWlsKVxuICBpblxuICBhdXggbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBvZl9zZXEgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBTZXEuTmlsIC0+IFtdXG4gIHwgU2VxLkNvbnMgKHgxLCBzZXEpIC0+XG4gICAgICBiZWdpbiBtYXRjaCBzZXEgKCkgd2l0aFxuICAgICAgfCBTZXEuTmlsIC0+IFt4MV1cbiAgICAgIHwgU2VxLkNvbnMgKHgyLCBzZXEpIC0+IHgxIDo6IHgyIDo6IG9mX3NlcSBzZXFcbiAgICAgIGVuZFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NvbXBhcmUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsMyIsImEyIiwiU3RkbGliIiwibGVuZ3RoIiwibCIsImxlbiIsInBhcmFtIiwiY29ucyIsImEiLCJoZCIsInRsIiwiY3N0X0xpc3RfbnRoIiwibnRoIiwibiIsIm50aF9vcHQiLCJhcHBlbmQiLCJyZXZfYXBwZW5kIiwibDEiLCJsMiIsInJldiIsImluaXQiLCJsYXN0IiwiaSIsInIxIiwicjIiLCJibG9jayIsImRzdCIsIm9mZnNldCIsImZsYXR0ZW4iLCJyIiwibWFwIiwibWF0Y2giLCJtYXBpIiwicmV2X21hcCIsImFjY3UiLCJpdGVyIiwiaXRlcmkiLCJmb2xkX2xlZnQiLCJmb2xkX3JpZ2h0IiwibWFwMiIsImNzdF9MaXN0X21hcDIiLCJiMiIsImIxIiwicmV2X21hcDIiLCJpdGVyMiIsImZvbGRfbGVmdDIiLCJmb2xkX3JpZ2h0MiIsImZvcl9hbGwiLCJwIiwiZXhpc3RzIiwiZm9yX2FsbDIiLCJleGlzdHMyIiwibWVtIiwieCIsIm1lbXEiLCJhc3NvYyIsImIiLCJhc3NvY19vcHQiLCJhc3NxIiwiYXNzcV9vcHQiLCJtZW1fYXNzb2MiLCJtZW1fYXNzcSIsInJlbW92ZV9hc3NvYyIsInBhaXIiLCJyZW1vdmVfYXNzcSIsImZpbmQiLCJmaW5kX29wdCIsImZpbmRfaW5kZXgiLCJmaW5kX21hcCIsInJlc3VsdCIsImZpbmRfbWFwaSIsImZpbmRfYWxsIiwiZmlsdGVyaSIsImZpbHRlcl9tYXAiLCJ2IiwiY29uY2F0X21hcCIsInhzIiwieXMiLCJ5IiwiZm9sZF9sZWZ0X21hcCIsImxfYWNjdSIsInBhcnRpdGlvbiIsInllcyIsIm5vIiwicGFydGl0aW9uX21hcCIsImxlZnQiLCJyaWdodCIsInNwbGl0IiwicnkiLCJyeCIsImNvbWJpbmUiLCJtZXJnZSIsImNtcCIsInQyIiwiaDIiLCJ0MSIsImgxIiwic3RhYmxlX3NvcnQiLCJzb3J0IiwieDIiLCJ4MSIsInMiLCJ4MyIsIm4xIiwibjIiLCJzMSIsInMyIiwicmV2X3NvcnQiLCJzb3J0X3VuaXEiLCJjIiwiY29tcGFyZV9sZW5ndGhzIiwiY29tcGFyZV9sZW5ndGhfd2l0aCIsImlzX2VtcHR5IiwiZXF1YWwiLCJlcSIsImNvbXBhcmUiLCJ0b19zZXEiLCJhdXgiLCJ0YWlsIiwib2Zfc2VxIiwic2VxIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdB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LEtBQWY7QUFBQTtBQUFBO0FBQUEsR0FDc0I7QUFBQSxZQUFBTyxPQUFBaEg7QUFBQUEsYUFBQWlILElBQUFqSCxHQUFBRTtBQUFBQSxLQUtMLFFBQ1Q7QUFBQSxTQUFBZ0gsT0FEUyxNQUFBakUsSUFBQTtBQUFBLEtBRW1CLDBCQUFSLHNCQUFRO0FBQUEsSUFBQztBQUFBLElBRXZDO0FBQUEsR0FBSztBQUFBLFlBQUFrRSxPQUFBQztBQUFBQSxRQUFBekYsUUFHQztBQUFBLElBQU0sWUFDQztBQUFBLFFBQUF5RixRQURELFVBQUFwQixLQUFBLFVBQUFyRSxVQUdJO0FBQUEsSUFBTSxjQUNMO0FBQUE7QUFBQSxLQUFBeUYsUUFESztBQUFBLEtBQUFyQixLQUFBO0FBQUEsS0FBQTFFLFFBRU07QUFBQSxLQUFBQyxNQUFZO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUE2RixRQUFBO0FBQUE7QUFBQSxTQUFBekYsVUFMbEM7QUFBQSxLQUFNO0FBQUE7QUFBQSxPQUFBeUYsUUFBQTtBQUFBLE9BQUFwQixPQUFBO0FBQUEsT0FBQXJFLFVBR0k7QUFBQSxNQUFNO0FBQUEsV0FBQXlGLFFBQUEsWUFBQXJCLE9BQUEsWUFBQXpFLFFBRU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQURYO0FBQUE7QUFBQTtBQUFBLE1BSEo7QUFBQSxLQUlxQztBQUFBO0FBQUEsR0FDM0M7QUFBQSxHRHprQlQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMjY3NiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbnQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGludFxuXG5sZXQgemVybyA9IDBcbmxldCBvbmUgPSAxXG5sZXQgbWludXNfb25lID0gLTFcbmV4dGVybmFsIG5lZyA6IGludCAtPiBpbnQgPSBcIiVuZWdpbnRcIlxuZXh0ZXJuYWwgYWRkIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgc3ViIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgbXVsIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtdWxpbnRcIlxuZXh0ZXJuYWwgZGl2IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgcmVtIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtb2RpbnRcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5sZXQgYWJzIHggPSBpZiB4ID49IDAgdGhlbiB4IGVsc2UgLXhcbmxldCBtYXhfaW50ID0gKC0xKSBsc3IgMVxubGV0IG1pbl9pbnQgPSBtYXhfaW50ICsgMVxuZXh0ZXJuYWwgbG9nYW5kIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsIGxvZ3hvciA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIleG9yaW50XCJcbmxldCBsb2dub3QgeCA9IGxvZ3hvciB4ICgtMSlcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzbGludFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYXNyaW50XCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5sZXQgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuXG4oKlxuZXh0ZXJuYWwgaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfaW50X29mX3N0cmluZ1wiXG5sZXQgb2Zfc3RyaW5nIHMgPSB0cnkgU29tZSAoaW50X29mX3N0cmluZyBzKSB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG4qKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5sZXQgdG9fc3RyaW5nIHggPSBmb3JtYXRfaW50IFwiJWRcIiB4XG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfaGFzaCIsImFicyIsIngiLCJsb2dub3QiLCJlcXVhbCIsImNvbXBhcmUiLCJtaW4iLCJ5IiwibWF4IiwidG9fc3RyaW5nIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUEseUJBQUFDLFlBQUE7QUFBQSxZQUFBQyxJQUFBQyxHQzRCWSwyQkFBd0I7QUFBQSxZQUFBQyxPQUFBRCxHQU1yQixjQUFhO0FBQUEsWUFBQUUsTUFBQSxNRGxDNUI7QUFBQSxPQUFBQyxVQUFBO0FBQUEsWUFBQUMsSUFBQUosR0FBQUssR0N3Q2tCLHFCQUF1QjtBQUFBLFlBQUFDLElBQUFOLEdBQUFLLEdBQ3ZCLHFCQUF1QjtBQUFBLFlBQUFFLFVBQUFQLEdBVU47QUFBQSxZQUFBUSxZQUFBQyxNQUFBVCxHQUlWLGtDQUErQjtBQUFBLFlBQUFVLEtBQUFWLEdBQzNDLCtCQUE0QjtBQUFBLEdEeER6QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEyNzE0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2J5dGVzLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBCeXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMgKilcblxuKCogV0FSTklORzogU29tZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBzdHJpbmcubWwuXG4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIFwiZHVwbGljYXRlZFwiIGNvbW1lbnQgYWJvdmUgdGhlaXIgZGVmaW5pdGlvbi5cbiopXG5cbmV4dGVybmFsIGxlbmd0aCA6IGJ5dGVzIC0+IGludCA9IFwiJWJ5dGVzX2xlbmd0aFwiXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc19zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCB1bnNhZmVfZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfZmlsbCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gY2hhciAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9maWxsX2J5dGVzXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuZXh0ZXJuYWwgdW5zYWZlX29mX3N0cmluZyA6IHN0cmluZyAtPiBieXRlcyA9IFwiJWJ5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHVuc2FmZV9ibGl0IDogYnl0ZXMgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB1bnNhZmVfYmxpdF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5sZXQgbWFrZSBuIGMgPVxuICBsZXQgcyA9IGNyZWF0ZSBuIGluXG4gIHVuc2FmZV9maWxsIHMgMCBuIGM7XG4gIHNcblxubGV0IGluaXQgbiBmID1cbiAgbGV0IHMgPSBjcmVhdGUgbiBpblxuICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHMgaSAoZiBpKVxuICBkb25lO1xuICBzXG5cbmxldCBlbXB0eSA9IGNyZWF0ZSAwXG5cbmxldCBjb3B5IHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gIHVuc2FmZV9ibGl0IHMgMCByIDAgbGVuO1xuICByXG5cbmxldCB0b19zdHJpbmcgYiA9IHVuc2FmZV90b19zdHJpbmcgKGNvcHkgYilcbmxldCBvZl9zdHJpbmcgcyA9IGNvcHkgKHVuc2FmZV9vZl9zdHJpbmcgcylcblxubGV0IHN1YiBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5zdWIgLyBCeXRlcy5zdWJcIlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgcyBvZnMgciAwIGxlbjtcbiAgICByXG4gIGVuZFxuXG5sZXQgc3ViX3N0cmluZyBiIG9mcyBsZW4gPSB1bnNhZmVfdG9fc3RyaW5nIChzdWIgYiBvZnMgbGVuKVxuXG4oKiBhZGRpdGlvbiB3aXRoIGFuIG92ZXJmbG93IGNoZWNrICopXG5sZXQgKCsrKSBhIGIgPVxuICBsZXQgYyA9IGEgKyBiIGluXG4gIG1hdGNoIGEgPCAwLCBiIDwgMCwgYyA8IDAgd2l0aFxuICB8IHRydWUgLCB0cnVlICwgZmFsc2VcbiAgfCBmYWxzZSwgZmFsc2UsIHRydWUgIC0+IGludmFsaWRfYXJnIFwiQnl0ZXMuZXh0ZW5kXCIgKCogb3ZlcmZsb3cgKilcbiAgfCBfIC0+IGNcblxubGV0IGV4dGVuZCBzIGxlZnQgcmlnaHQgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgKysgbGVmdCArKyByaWdodCBpblxuICBsZXQgciA9IGNyZWF0ZSBsZW4gaW5cbiAgbGV0IChzcmNvZmYsIGRzdG9mZikgPSBpZiBsZWZ0IDwgMCB0aGVuIC1sZWZ0LCAwIGVsc2UgMCwgbGVmdCBpblxuICBsZXQgY3B5bGVuID0gSW50Lm1pbiAobGVuZ3RoIHMgLSBzcmNvZmYpIChsZW4gLSBkc3RvZmYpIGluXG4gIGlmIGNweWxlbiA+IDAgdGhlbiB1bnNhZmVfYmxpdCBzIHNyY29mZiByIGRzdG9mZiBjcHlsZW47XG4gIHJcblxubGV0IGZpbGwgcyBvZnMgbGVuIGMgPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5maWxsIC8gQnl0ZXMuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgcyBvZnMgbGVuIGNcblxubGV0IGJsaXQgczEgb2ZzMSBzMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBzMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggczIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ5dGVzLmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IHMxIG9mczEgczIgb2ZzMiBsZW5cblxubGV0IGJsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBzdHJpbmdfbGVuZ3RoIHMxIC0gbGVuXG4gICAgICAgICAgICAgfHwgb2ZzMiA8IDAgfHwgb2ZzMiA+IGxlbmd0aCBzMiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmJsaXQgLyBCeXRlcy5ibGl0X3N0cmluZ1wiXG4gIGVsc2UgdW5zYWZlX2JsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpdGVyIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZih1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGl0ZXJpIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgZW5zdXJlX2dlICh4OmludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIkJ5dGVzLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZW1wdHlcbiAgfCBsIC0+IGxldCBzZXBsZW4gPSBsZW5ndGggc2VwIGluXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoY3JlYXRlIChzdW1fbGVuZ3RocyAwIHNlcGxlbiBsKSlcbiAgICAgICAgICAgIDAgc2VwIHNlcGxlbiBsXG5cbmxldCBjYXQgczEgczIgPVxuICBsZXQgbDEgPSBsZW5ndGggczEgaW5cbiAgbGV0IGwyID0gbGVuZ3RoIHMyIGluXG4gIGxldCByID0gY3JlYXRlIChsMSArIGwyKSBpblxuICB1bnNhZmVfYmxpdCBzMSAwIHIgMCBsMTtcbiAgdW5zYWZlX2JsaXQgczIgMCByIGwxIGwyO1xuICByXG5cblxuZXh0ZXJuYWwgY2hhcl9jb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGNoYXJfY2hyOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IGxlbiAmJiBpc19zcGFjZSAodW5zYWZlX2dldCBzICFpKSBkb1xuICAgIGluY3IgaVxuICBkb25lO1xuICBsZXQgaiA9IHJlZiAobGVuIC0gMSkgaW5cbiAgd2hpbGUgIWogPj0gIWkgJiYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAhaikgZG9cbiAgICBkZWNyIGpcbiAgZG9uZTtcbiAgaWYgIWogPj0gIWkgdGhlblxuICAgIHN1YiBzICFpICghaiAtICFpICsgMSlcbiAgZWxzZVxuICAgIGVtcHR5XG5cbmxldCB1bnNhZmVfZXNjYXBlIHMgPVxuICAoKiBXZSBwZXJmb3JtIHR3byBwYXNzZXMgb24gdGhlIGlucHV0IHNlcXVlbmNlLCBvbmUgdG8gY29tcHV0ZSB0aGVcbiAgICAgcmVzdWx0IHNpemUgYW5kIG9uZSB0byB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgICMxMTUwOCwgIzExNTA5OiBUaGlzIGxvZ2ljIHdvdWxkIGJlIGluY29ycmVjdCBpbiBwcmVzZW5jZSBvZlxuICAgICBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiB0byB0aGUgaW5wdXQsIG1ha2luZyB0aGUgdXNlIG9mXG4gICAgIFt1bnNhZmVfc2V0XSBiZWxvdyBtZW1vcnktdW5zYWZlLlxuXG4gICAgIFByZWNvbmRpdGlvbjogVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCBvbjpcbiAgICAgLSBhbiBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZVxuICAgICAtIGEgdW5pcXVlbHktb3duZWQgYnl0ZSBzZXF1ZW5jZSAodGhlIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcClcblxuICAgICBJbiBlaXRoZXIgY2FzZSB3ZSByZXR1cm4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlLlxuICAqKVxuICBsZXQgbiA9IHJlZiAwIGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICBuIDo9ICFuICtcbiAgICAgIChtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgfCAnXFxcIicgfCAnXFxcXCcgfCAnXFxuJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxiJyAtPiAyXG4gICAgICAgfCAnICcgLi4gJ34nIC0+IDFcbiAgICAgICB8IF8gLT4gNClcbiAgZG9uZTtcbiAgaWYgIW4gPSBsZW5ndGggcyB0aGVuIHNcbiAgZWxzZSBiZWdpblxuICAgIGxldCBzJyA9IGNyZWF0ZSAhbiBpblxuICAgIG4gOj0gMDtcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgICBiZWdpbiBtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICB8ICgnXFxcIicgfCAnXFxcXCcpIGFzIGMgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICduJ1xuICAgICAgfCAnXFx0JyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ3QnXG4gICAgICB8ICdcXHInIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAncidcbiAgICAgIHwgJ1xcYicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICdiJ1xuICAgICAgfCAoJyAnIC4uICd+JykgYXMgYyAtPiB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgYyAtPlxuICAgICAgICAgIGxldCBhID0gY2hhcl9jb2RlIGMgaW5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSAvIDEwMCkpO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyAoYSAvIDEwKSBtb2QgMTApKTtcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSBtb2QgMTApKTtcbiAgICAgIGVuZDtcbiAgICAgIGluY3IgblxuICAgIGRvbmU7XG4gICAgcydcbiAgZW5kXG5cbmxldCBlc2NhcGVkIGIgPVxuICBsZXQgYiA9IGNvcHkgYiBpblxuICAoKiBXZSBjb3B5IG91ciBpbnB1dCB0byBvYnRhaW4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlIFtiXVxuICAgICB0byBzYXRpc2Z5IFt1bnNhZmVfZXNjYXBlXSdzIHByZWNvbmRpdGlvbiAqKVxuICB1bnNhZmVfZXNjYXBlIGJcblxubGV0IG1hcCBmIHMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGwgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBzIGkpKSBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCBtYXBpIGYgcyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgbCA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgcyBpKSkgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZTtcbiAgIXJcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IHMgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgcyBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgdXBwZXJjYXNlX2FzY2lpIHMgPSBtYXAgQ2hhci51cHBlcmNhc2VfYXNjaWkgc1xubGV0IGxvd2VyY2FzZV9hc2NpaSBzID0gbWFwIENoYXIubG93ZXJjYXNlX2FzY2lpIHNcblxubGV0IGFwcGx5MSBmIHMgPVxuICBpZiBsZW5ndGggcyA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNvcHkgcyBpblxuICAgIHVuc2FmZV9zZXQgciAwIChmKHVuc2FmZV9nZXQgcyAwKSk7XG4gICAgclxuICBlbmRcblxubGV0IGNhcGl0YWxpemVfYXNjaWkgcyA9IGFwcGx5MSBDaGFyLnVwcGVyY2FzZV9hc2NpaSBzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPSBhcHBseTEgQ2hhci5sb3dlcmNhc2VfYXNjaWkgc1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHN0YXJ0c193aXRoIH5wcmVmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fcHJlID0gbGVuZ3RoIHByZWZpeCBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3ByZSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyBpIDw+IHVuc2FmZV9nZXQgcHJlZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gbGVuX3MgPj0gbGVuX3ByZSAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGVuZHNfd2l0aCB+c3VmZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3N1ZiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgbGV0IGRpZmYgPSBsZW5fcyAtIGxlbl9zdWYgaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9zdWYgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgKGRpZmYgKyBpKSA8PiB1bnNhZmVfZ2V0IHN1ZmZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGRpZmYgPj0gMCAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWMgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgaW5kZXhfcmVjIHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIGluZGV4X3JlY19vcHQgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgaW5kZXhfcmVjX29wdCBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9vcHQgcyBjID0gaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgaW5kZXhfcmVjIHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMuaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgaW5kZXhfcmVjX29wdCBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4IHMgYyA9IHJpbmRleF9yZWMgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb20gLyBCeXRlcy5yaW5kZXhfZnJvbVwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjIHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfb3B0IHMgYyA9IHJpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5yaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgcmluZGV4X3JlY19vcHQgcyBpIGNcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5jb250YWluc19mcm9tIC8gQnl0ZXMuY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChpbmRleF9yZWMgcyBsIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zIHMgYyA9IGNvbnRhaW5zX2Zyb20gcyAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG50eXBlIHQgPSBieXRlc1xuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5leHRlcm5hbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2J5dGVzX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpID0gbGVuZ3RoIHMgdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBnZXQgcyBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBzID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA9IGxlbmd0aCBzIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gZ2V0IHMgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBuID0gcmVmIDAgaW5cbiAgbGV0IGJ1ZiA9IHJlZiAobWFrZSAyNTYgJ1xcMDAwJykgaW5cbiAgbGV0IHJlc2l6ZSAoKSA9XG4gICAgKCogcmVzaXplICopXG4gICAgbGV0IG5ld19sZW4gPSBJbnQubWluICgyICogbGVuZ3RoICFidWYpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgIGlmIGxlbmd0aCAhYnVmID0gbmV3X2xlbiB0aGVuIGZhaWx3aXRoIFwiQnl0ZXMub2Zfc2VxOiBjYW5ub3QgZ3JvdyBieXRlc1wiO1xuICAgIGxldCBuZXdfYnVmID0gbWFrZSBuZXdfbGVuICdcXDAwMCcgaW5cbiAgICBibGl0ICFidWYgMCBuZXdfYnVmIDAgIW47XG4gICAgYnVmIDo9IG5ld19idWZcbiAgaW5cbiAgU2VxLml0ZXJcbiAgICAoZnVuIGMgLT5cbiAgICAgICBpZiAhbiA9IGxlbmd0aCAhYnVmIHRoZW4gcmVzaXplKCk7XG4gICAgICAgc2V0ICFidWYgIW4gYztcbiAgICAgICBpbmNyIG4pXG4gICAgaTtcbiAgc3ViICFidWYgMCAhblxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nL2RlY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG4oKiBUaGUgZ2V0XyBmdW5jdGlvbnMgYXJlIGFsbCBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxuXG5leHRlcm5hbCB1bnNhZmVfZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNnVcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbmV4dGVybmFsIGdldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNlwiXG5leHRlcm5hbCBnZXRfaW50MzJfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgPSBcIiVjYW1sX2J5dGVzX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfYnl0ZXNfZ2V0NjRcIlxuXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVjYW1sX2J5dGVzX3NldDE2dVwiXG5leHRlcm5hbCBzZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIHNldF9pbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZcIlxuZXh0ZXJuYWwgc2V0X2ludDMyX25lIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMyXCJcbmV4dGVybmFsIHNldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NFwiXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5sZXQgdW5zYWZlX2dldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiBzd2FwMTYgKHVuc2FmZV9nZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSB1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IHVuc2FmZV9nZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX2dldF91aW50MTZfbmUgYiBpXG4gIGVsc2Ugc3dhcDE2ICh1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGkpXG5cbmxldCBnZXRfaW50OCBiIGkgPVxuICAoKGdldF91aW50OCBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gOCkpIGFzciAoU3lzLmludF9zaXplIC0gOClcblxubGV0IGdldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgKGdldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIGdldF91aW50MTZfbmUgYiBpXG5cbmxldCBnZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiAoZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IGdldF9pbnQxNl9uZSBiIGkgPVxuICAoKGdldF91aW50MTZfbmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9sZSBiIGkgPVxuICAoKGdldF91aW50MTZfbGUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9iZSBiIGkgPVxuICAoKGdldF91aW50MTZfYmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQzMl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiAoZ2V0X2ludDMyX25lIGIgaSlcbiAgZWxzZSBnZXRfaW50MzJfbmUgYiBpXG5cbmxldCBnZXRfaW50MzJfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIChnZXRfaW50MzJfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQzMl9uZSBiIGlcblxubGV0IGdldF9pbnQ2NF9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCAoZ2V0X2ludDY0X25lIGIgaSlcbiAgZWxzZSBnZXRfaW50NjRfbmUgYiBpXG5cbmxldCBnZXRfaW50NjRfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IChnZXRfaW50NjRfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQ2NF9uZSBiIGlcblxubGV0IHVuc2FmZV9zZXRfdWludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSB4XG5cbmxldCB1bnNhZmVfc2V0X3VpbnQxNl9iZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIHggZWxzZVxuICB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuXG5sZXQgc2V0X2ludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSBzZXRfaW50MTZfbmUgYiBpIHhcblxubGV0IHNldF9pbnQxNl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHNldF9pbnQxNl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDMyX2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MzJfbmUgYiBpIChzd2FwMzIgeClcbiAgZWxzZSBzZXRfaW50MzJfbmUgYiBpIHhcblxubGV0IHNldF9pbnQzMl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQzMl9uZSBiIGkgKHN3YXAzMiB4KVxuICBlbHNlIHNldF9pbnQzMl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDY0X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50NjRfbmUgYiBpIChzd2FwNjQgeClcbiAgZWxzZSBzZXRfaW50NjRfbmUgYiBpIHhcblxubGV0IHNldF9pbnQ2NF9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQ2NF9uZSBiIGkgKHN3YXA2NCB4KVxuICBlbHNlIHNldF9pbnQ2NF9uZSBiIGkgeFxuXG5sZXQgc2V0X3VpbnQ4ID0gc2V0X2ludDhcbmxldCBzZXRfdWludDE2X25lID0gc2V0X2ludDE2X25lXG5sZXQgc2V0X3VpbnQxNl9iZSA9IHNldF9pbnQxNl9iZVxubGV0IHNldF91aW50MTZfbGUgPSBzZXRfaW50MTZfbGVcblxuKCogVVRGIGNvZGVjcyBhbmQgdmFsaWRhdGlvbnMgKilcblxubGV0IGRlY19pbnZhbGlkID0gVWNoYXIudXRmX2RlY29kZV9pbnZhbGlkXG5sZXRbQGlubGluZV0gZGVjX3JldCBuIHUgPSBVY2hhci51dGZfZGVjb2RlIG4gKFVjaGFyLnVuc2FmZV9vZl9pbnQgdSlcblxuKCogSW4gY2FzZSBvZiBkZWNvZGluZyBlcnJvciwgaWYgd2UgZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIHdlXG4gICBjb25zdW1lIHRoZSBieXRlLCBvdGhlcndpc2Ugd2UgY29uc3VtZSB0aGUgW25dIGJ5dGVzIHByZWNlZGluZ1xuICAgdGhlIGVycm9yaW5nIGJ5dGUuXG5cbiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGNsaWVudCB1c2VzIGRlY29kZXMgd2l0aG91dCBjYXJpbmcgYWJvdXRcbiAgIHZhbGlkaXR5IGl0IG5hdHVyYWxseSByZXBsYWNlIGJvZ3VzIGRhdGEgd2l0aCBVY2hhci5yZXAgYWNjb3JkaW5nXG4gICB0byB0aGUgV0hBVFdHIEVuY29kaW5nIHN0YW5kYXJkLiBPdGhlciBzY2hlbWVzIGFyZSBwb3NzaWJsZSBieVxuICAgY29uc3VsdGluZyB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgb24gaW52YWxpZCBkZWNvZGVzLiBGb3IgbW9yZVxuICAgZGV0YWlscyBzZWUgaHR0cHM6Ly9oc2l2b25lbi5maS9icm9rZW4tdXRmLTgvXG5cbiAgIEZvciB0aGlzIHJlYXNvbiBpbiBbZ2V0X3V0Zl84X3VjaGFyXSB3ZSBncmFkdWFsbHkgY2hlY2sgdGhlIG5leHRcbiAgIGJ5dGUgaXMgYXZhaWxhYmxlIHJhdGhlciB0aGFuIGRvaW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgZmlyc3QgYnl0ZS4gQ29udHJhc3Qgd2l0aCBbaXNfdmFsaWRfdXRmXzhdLiAqKVxuXG4oKiBVVEYtOCAqKVxuXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194QkYgYiA9IGIgbHNyIDYgPD4gMGIxMFxubGV0W0BpbmxpbmVdIG5vdF9pbl94QTBfdG9feEJGIGIgPSBiIGxzciA1IDw+IDBiMTAxXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194OUYgYiA9IGIgbHNyIDUgPD4gMGIxMDBcbmxldFtAaW5saW5lXSBub3RfaW5feDkwX3RvX3hCRiBiID0gYiA8IDB4OTAgfHwgMHhCRiA8IGJcbmxldFtAaW5saW5lXSBub3RfaW5feDgwX3RvX3g4RiBiID0gYiBsc3IgNCA8PiAweDhcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzIgYjAgYjEgPVxuICAoKGIwIGxhbmQgMHgxRikgbHNsIDYpIGxvclxuICAoKGIxIGxhbmQgMHgzRikpXG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl8zIGIwIGIxIGIyID1cbiAgKChiMCBsYW5kIDB4MEYpIGxzbCAxMikgbG9yXG4gICgoYjEgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSlcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMgPVxuICAoKGIwIGxhbmQgMHgwNykgbHNsIDE4KSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpIGxzbCAxMikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjMgbGFuZCAweDNGKSlcblxubGV0IGdldF91dGZfOF91Y2hhciBiIGkgPVxuICBsZXQgYjAgPSBnZXRfdWludDggYiBpIGluICgqIHJhaXNlcyBpZiBbaV0gaXMgbm90IGEgdmFsaWQgaW5kZXguICopXG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQ4IGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgbWF0Y2ggQ2hhci51bnNhZmVfY2hyIGIwIHdpdGggKCogU2VlIFRoZSBVbmljb2RlIFN0YW5kYXJkLCBUYWJsZSAzLjcgKilcbiAgfCAnXFx4MDAnIC4uICdcXHg3RicgLT4gZGVjX3JldCAxIGIwXG4gIHwgJ1xceEMyJyAuLiAnXFx4REYnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGRlY19yZXQgMiAodXRmXzhfdWNoYXJfMiBiMCBiMSlcbiAgfCAnXFx4RTAnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3hBMF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhFMScgLi4gJ1xceEVDJyB8ICdcXHhFRScgLi4gJ1xceEVGJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RUQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OUYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhGMCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDkwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjEnIC4uICdcXHhGMycgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OEYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgXyAtPiBkZWNfaW52YWxpZCAxXG5cbmxldCBzZXRfdXRmXzhfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50OCBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIG1hdGNoIFVjaGFyLnRvX2ludCB1IHdpdGhcbiAgfCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+XG4gICAgICBzZXRfdWludDggYiBpIHU7XG4gICAgICAxXG4gIHwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICAoc2V0X3VpbnQ4IGIgaSAoMHhDMCBsb3IgKHUgbHNyIDYpKTtcbiAgICAgICBzZXQgYiBsYXN0ICgweDgwIGxvciAodSBsYW5kIDB4M0YpKTtcbiAgICAgICAyKVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RTAgbG9yICh1IGxzciAxMikpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgMylcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RjAgbG9yICh1IGxzciAxOCkpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgMTIpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIChpICsgMikgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgNClcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgaXNfdmFsaWRfdXRmXzggYiA9XG4gIGxldCByZWMgbG9vcCBtYXggYiBpID1cbiAgICBpZiBpID4gbWF4IHRoZW4gdHJ1ZSBlbHNlXG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDggaW5cbiAgICBtYXRjaCBDaGFyLnVuc2FmZV9jaHIgKGdldCBiIGkpIHdpdGhcbiAgICB8ICdcXHgwMCcgLi4gJ1xceDdGJyAtPiBsb29wIG1heCBiIChpICsgMSlcbiAgICB8ICdcXHhDMicgLi4gJ1xceERGJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFMCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94QTBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEUxJyAuLiAnXFx4RUMnIHwgJ1xceEVFJyAuLiAnXFx4RUYnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFRCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feDlGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYwJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g5MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYxJyAuLiAnXFx4RjMnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RjQnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3g4RiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkJFICopXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2YmVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfYmUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmJlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkxFICopXG5cbmxldCBnZXRfdXRmXzE2bGVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2bGVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfbGUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmxpdF9ieXRlcyIsImNhbWxfYnN3YXAxNiIsImNhbWxfYnl0ZXNfZ2V0IiwiY2FtbF9ieXRlc19nZXQxNiIsImNhbWxfYnl0ZXNfZ2V0MzIiLCJjYW1sX2J5dGVzX2dldDY0IiwiY2FtbF9ieXRlc19vZl9zdHJpbmciLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ieXRlc19zZXQ2NCIsImNhbWxfYnl0ZXNfdW5zYWZlX2dldCIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9maWxsX2J5dGVzIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJkdW1teSIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX1VjaGFyIiwiQXNzZXJ0X2ZhaWx1cmUiLCJTdGRsaWJfU3lzIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9TZXEiLCJTdGRsaWJfQ2hhciIsIm1ha2UiLCJuIiwiYyIsInMiLCJpbml0IiwiaSIsImVtcHR5IiwiY29weSIsImxlbiIsInIiLCJ0b19zdHJpbmciLCJiIiwib2Zfc3RyaW5nIiwic3ViIiwib2ZzIiwic3ViX3N0cmluZyIsInN5bWJvbCIsImEiLCJtYXRjaCIsImV4dGVuZCIsImxlZnQiLCJyaWdodCIsImRzdG9mZiIsInNyY29mZiIsImNweWxlbiIsImZpbGwiLCJibGl0IiwiczEiLCJvZnMxIiwiczIiLCJvZnMyIiwiYmxpdF9zdHJpbmciLCJpdGVyIiwiaXRlcmkiLCJjb25jYXQiLCJzZXAiLCJsIiwic2VwbGVuIiwiYWNjIiwicGFyYW0iLCJwb3MiLCJoZCIsInRsIiwieCIsImRzdCIsImNhdCIsImwxIiwibDIiLCJpc19zcGFjZSIsInRyaW0iLCJqIiwidW5zYWZlX2VzY2FwZSIsImVzY2FwZWQiLCJtYXAiLCJtYXBpIiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImV4aXN0cyIsInAiLCJmb3JfYWxsIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiYXBwbHkxIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJpbmRleF9yZWMiLCJsaW0iLCJpbmRleCIsImluZGV4X3JlY19vcHQiLCJpbmRleF9vcHQiLCJpbmRleF9mcm9tIiwiaW5kZXhfZnJvbV9vcHQiLCJyaW5kZXhfcmVjIiwicmluZGV4IiwicmluZGV4X2Zyb20iLCJyaW5kZXhfcmVjX29wdCIsInJpbmRleF9vcHQiLCJyaW5kZXhfZnJvbV9vcHQiLCJjb250YWluc19mcm9tIiwiZXhuIiwiY29udGFpbnMiLCJyY29udGFpbnNfZnJvbSIsImNvbXBhcmUiLCJzcGxpdF9vbl9jaGFyIiwidG9fc2VxIiwiYXV4IiwidG9fc2VxaSIsIm9mX3NlcSIsImJ1ZiIsIm5ld19sZW4iLCJuZXdfYnVmIiwidW5zYWZlX2dldF91aW50MTZfbGUiLCJ1bnNhZmVfZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQ4IiwiZ2V0X3VpbnQxNl9sZSIsImdldF91aW50MTZfYmUiLCJnZXRfaW50MTZfbmUiLCJnZXRfaW50MTZfbGUiLCJnZXRfaW50MTZfYmUiLCJnZXRfaW50MzJfbGUiLCJnZXRfaW50MzJfYmUiLCJnZXRfaW50NjRfbGUiLCJnZXRfaW50NjRfYmUiLCJ1bnNhZmVfc2V0X3VpbnQxNl9sZSIsInVuc2FmZV9zZXRfdWludDE2X2JlIiwic2V0X2ludDE2X2xlIiwic2V0X2ludDE2X2JlIiwic2V0X2ludDMyX2xlIiwic2V0X2ludDMyX2JlIiwic2V0X2ludDY0X2xlIiwic2V0X2ludDY0X2JlIiwiZGVjX2ludmFsaWQiLCJkZWNfcmV0IiwidSIsIm5vdF9pbl94ODBfdG9feEJGIiwibm90X2luX3hBMF90b194QkYiLCJub3RfaW5feDgwX3RvX3g5RiIsIm5vdF9pbl94OTBfdG9feEJGIiwibm90X2luX3g4MF90b194OEYiLCJ1dGZfOF91Y2hhcl8zIiwiYjAiLCJiMSIsImIyIiwidXRmXzhfdWNoYXJfNCIsImIzIiwiZ2V0X3V0Zl84X3VjaGFyIiwibWF4IiwiY3N0X2J5dGVzX21sIiwic2V0X3V0Zl84X3VjaGFyIiwic2V0IiwibGFzdCIsImlzX3ZhbGlkX3V0Zl84IiwiY3N0X2luZGV4X291dF9vZl9ib3VuZHMiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJoaSIsImxvIiwic2V0X3V0Zl8xNmJlX3VjaGFyIiwiaXNfdmFsaWRfdXRmXzE2YmUiLCJnZXRfdXRmXzE2bGVfdWNoYXIiLCJzZXRfdXRmXzE2bGVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZsZSIsIlN0ZGxpYl9CeXRlcyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEs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cCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RyaW5nLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTdHJpbmcgb3BlcmF0aW9ucywgYmFzZWQgb24gYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBieXRlcy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBieXRlcy5tbC5cbiAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgXCJkdXBsaWNhdGVkXCIgY29tbWVudCBhYm92ZSB0aGVpciBkZWZpbml0aW9uLlxuKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6IHN0cmluZyAtPiBpbnQgLT4gIGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5tb2R1bGUgQiA9IEJ5dGVzXG5cbmxldCBidHMgPSBCLnVuc2FmZV90b19zdHJpbmdcbmxldCBib3MgPSBCLnVuc2FmZV9vZl9zdHJpbmdcblxubGV0IG1ha2UgbiBjID1cbiAgQi5tYWtlIG4gYyB8PiBidHNcbmxldCBpbml0IG4gZiA9XG4gIEIuaW5pdCBuIGYgfD4gYnRzXG5sZXQgZW1wdHkgPSBcIlwiXG5sZXQgb2ZfYnl0ZXMgPSBCLnRvX3N0cmluZ1xubGV0IHRvX2J5dGVzID0gQi5vZl9zdHJpbmdcbmxldCBzdWIgcyBvZnMgbGVuID1cbiAgQi5zdWIgKGJvcyBzKSBvZnMgbGVuIHw+IGJ0c1xubGV0IGJsaXQgPVxuICBCLmJsaXRfc3RyaW5nXG5cbmxldCBlbnN1cmVfZ2UgKHg6aW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiU3RyaW5nLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gXCJcIlxuICB8IGwgLT4gbGV0IHNlcGxlbiA9IGxlbmd0aCBzZXAgaW4gYnRzIEBAXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoQi5jcmVhdGUgKHN1bV9sZW5ndGhzIDAgc2VwbGVuIGwpKVxuICAgICAgICAgICAgMCBzZXAgc2VwbGVuIGxcblxubGV0IGNhdCA9ICggXiApXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpdGVyIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiAodW5zYWZlX2dldCBzIGkpIGRvbmVcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGl0ZXJpIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IHMgaSkgZG9uZVxuXG5sZXQgbWFwIGYgcyA9XG4gIEIubWFwIGYgKGJvcyBzKSB8PiBidHNcbmxldCBtYXBpIGYgcyA9XG4gIEIubWFwaSBmIChib3MgcykgfD4gYnRzXG5sZXQgZm9sZF9yaWdodCBmIHggYSA9XG4gIEIuZm9sZF9yaWdodCBmIChib3MgeCkgYVxubGV0IGZvbGRfbGVmdCBmIGEgeCA9XG4gIEIuZm9sZF9sZWZ0IGYgYSAoYm9zIHgpXG5sZXQgZXhpc3RzIGYgcyA9XG4gIEIuZXhpc3RzIGYgKGJvcyBzKVxubGV0IGZvcl9hbGwgZiBzID1cbiAgQi5mb3JfYWxsIGYgKGJvcyBzKVxuXG4oKiBCZXdhcmU6IHdlIGNhbm5vdCB1c2UgQi50cmltIG9yIEIuZXNjYXBlIGJlY2F1c2UgdGhleSBhbHdheXMgbWFrZSBhXG4gICBjb3B5LCBidXQgU3RyaW5nLm1saSBzcGVsbHMgb3V0IHNvbWUgY2FzZXMgd2hlcmUgd2UgYXJlIG5vdCBhbGxvd2VkXG4gICB0byBtYWtlIGEgY29weS4gKilcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBpZiBzID0gXCJcIiB0aGVuIHNcbiAgZWxzZSBpZiBpc19zcGFjZSAodW5zYWZlX2dldCBzIDApIHx8IGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgKGxlbmd0aCBzIC0gMSkpXG4gICAgdGhlbiBidHMgKEIudHJpbSAoYm9zIHMpKVxuICBlbHNlIHNcblxubGV0IGVzY2FwZWQgcyA9XG4gIGxldCBiID0gYm9zIHMgaW5cbiAgKCogV2Ugc2F0aXNmeSBbdW5zYWZlX2VzY2FwZV0ncyBwcmVjb25kaXRpb24gYnkgcGFzc2luZyBhblxuICAgICBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZSBbYl0uICopXG4gIGJ0cyAoQi51bnNhZmVfZXNjYXBlIGIpXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjX29wdCBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSBpbmRleF9yZWNfb3B0IHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgICBpbmRleF9yZWMgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXggcyBjID0gcmluZGV4X3JlYyBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9vcHQgcyBjID0gcmluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID1cbiAgQi51cHBlcmNhc2VfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9XG4gIEIubG93ZXJjYXNlX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgY2FwaXRhbGl6ZV9hc2NpaSBzID1cbiAgQi5jYXBpdGFsaXplX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPVxuICBCLnVuY2FwaXRhbGl6ZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgc3RhcnRzX3dpdGggfnByZWZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9wcmUgPSBsZW5ndGggcHJlZml4IGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fcHJlIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIGkgPD4gdW5zYWZlX2dldCBwcmVmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBsZW5fcyA+PSBsZW5fcHJlICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2ggOiBpbnQgLT4gc3RyaW5nIC0+IGludCA9IFwiY2FtbF9zdHJpbmdfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2ggMCB4XG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG50eXBlIHQgPSBzdHJpbmdcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3RyaW5nX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID0gYm9zIHMgfD4gQi50b19zZXFcblxubGV0IHRvX3NlcWkgcyA9IGJvcyBzIHw+IEIudG9fc2VxaVxuXG5sZXQgb2Zfc2VxIGcgPSBCLm9mX3NlcSBnIHw+IGJ0c1xuXG4oKiBVVEYgZGVjb2RlcnMgYW5kIHZhbGlkYXRvcnMgKilcblxubGV0IGdldF91dGZfOF91Y2hhciBzIGkgPSBCLmdldF91dGZfOF91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfOCBzID0gQi5pc192YWxpZF91dGZfOCAoYm9zIHMpXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzE2YmVfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzE2YmUgcyA9IEIuaXNfdmFsaWRfdXRmXzE2YmUgKGJvcyBzKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl8xNmxlX3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIHMgPSBCLmlzX3ZhbGlkX3V0Zl8xNmxlIChib3MgcylcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZy9kZWNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogc3RyaW5nIC0+IGludCAtPiBpbnQgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQxNl9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9zdHJpbmdfZ2V0MTZcIlxuZXh0ZXJuYWwgZ2V0X2ludDMyX25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQzMiA9IFwiJWNhbWxfc3RyaW5nX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX3N0cmluZ19nZXQ2NFwiXG5cbmxldCBnZXRfaW50OCBzIGkgPSBCLmdldF9pbnQ4IChib3MgcykgaVxubGV0IGdldF91aW50MTZfbGUgcyBpID0gQi5nZXRfdWludDE2X2xlIChib3MgcykgaVxubGV0IGdldF91aW50MTZfYmUgcyBpID0gQi5nZXRfdWludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9uZSBzIGkgPSBCLmdldF9pbnQxNl9uZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfbGUgcyBpID0gQi5nZXRfaW50MTZfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X2JlIHMgaSA9IEIuZ2V0X2ludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQzMl9sZSBzIGkgPSBCLmdldF9pbnQzMl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MzJfYmUgcyBpID0gQi5nZXRfaW50MzJfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDY0X2xlIHMgaSA9IEIuZ2V0X2ludDY0X2xlIChib3MgcykgaVxubGV0IGdldF9pbnQ2NF9iZSBzIGkgPSBCLmdldF9pbnQ2NF9iZSAoYm9zIHMpIGlcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ibGl0X3N0cmluZyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2VxdWFsIiwiY2FtbF9zdHJpbmdfaGFzaCIsImNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX0J5dGVzIiwiYnRzIiwiYm9zIiwibWFrZSIsIm4iLCJjIiwiaW5pdCIsIm9mX2J5dGVzIiwidG9fYnl0ZXMiLCJzdWIiLCJzIiwib2ZzIiwibGVuIiwiYmxpdCIsImNzdCIsImNvbmNhdCIsInNlcCIsImwiLCJzZXBsZW4iLCJhY2MiLCJwYXJhbSIsInBvcyIsImhkIiwidGwiLCJ4IiwiZHN0IiwiY2F0IiwiaXRlciIsImkiLCJpdGVyaSIsIm1hcCIsIm1hcGkiLCJmb2xkX3JpZ2h0IiwiYSIsImZvbGRfbGVmdCIsImV4aXN0cyIsImZvcl9hbGwiLCJpc19zcGFjZSIsInRyaW0iLCJlc2NhcGVkIiwiYiIsImluZGV4X3JlYyIsImxpbSIsImluZGV4IiwiaW5kZXhfcmVjX29wdCIsImluZGV4X29wdCIsImluZGV4X2Zyb20iLCJpbmRleF9mcm9tX29wdCIsInJpbmRleF9yZWMiLCJyaW5kZXgiLCJyaW5kZXhfZnJvbSIsInJpbmRleF9yZWNfb3B0IiwicmluZGV4X29wdCIsInJpbmRleF9mcm9tX29wdCIsImNvbnRhaW5zX2Zyb20iLCJleG4iLCJjb250YWlucyIsInJjb250YWluc19mcm9tIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJoYXNoIiwic3BsaXRfb25fY2hhciIsImoiLCJyIiwiY29tcGFyZSIsInRvX3NlcSIsInRvX3NlcWkiLCJvZl9zZXEiLCJnIiwiZ2V0X3V0Zl84X3VjaGFyIiwiaXNfdmFsaWRfdXRmXzgiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZiZSIsImdldF91dGZfMTZsZV91Y2hhciIsImlzX3ZhbGlkX3V0Zl8xNmxlIiwiZ2V0X2ludDgiLCJnZXRfdWludDE2X2xlIiwiZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQxNl9uZSIsImdldF9pbnQxNl9sZSIsImdldF9pbnQxNl9iZSIsImdldF9pbnQzMl9sZSIsImdldF9pbnQzMl9iZSIsImdldF9pbnQ2NF9sZSIsImdldF9pbnQ2NF9iZSIsIlN0ZGxpYl9TdHJpbmciXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHlCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxZQUFBQyxLQUFBQyxHQUFBQyxHQ21DRSxPQUFVLElBQVYsaUNBQWlCO0FBQUEsWUFBQUMsS0FBQUYsR0FBQVYsR0FFakIsT0FBVSxJQUFWLGlDQUFpQjtBQUFBLE9BQUFhLFdEckNuQixpQkFBQUMs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O0FBQUFBLFFBQUEsSUFDQztBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUEyRCxjQUFBN0UsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE0RCxhQUFBOUUsR0FBQWtCO0FBQUFBLFFBQUEsSUFDWDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE2RCxhQUFBL0UsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE4RCxhQUFBaEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUErRCxhQUFBakYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFnRSxhQUFBbEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFpRSxhQUFBbkYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFrRSxhQUFBcEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBO0FBQUEsSUFBQW1FO0FBQUFBLE1EblIvQyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjE0MzY5LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2FycmF5Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgYXJyYXlzLiAqKVxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxuKCogQXJyYXkgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBsZW5ndGggOiAnYSBhcnJheSAtPiBpbnQgPSBcIiVhcnJheV9sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV9zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgbWFrZTogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG5leHRlcm5hbCBjcmVhdGU6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuZXh0ZXJuYWwgdW5zYWZlX3N1YiA6ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfc3ViXCJcbmV4dGVybmFsIGFwcGVuZF9wcmltIDogJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfYXBwZW5kXCJcbmV4dGVybmFsIGNvbmNhdCA6ICdhIGFycmF5IGxpc3QgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfY29uY2F0XCJcbmV4dGVybmFsIHVuc2FmZV9ibGl0IDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9hcnJheV9ibGl0XCJcbmV4dGVybmFsIHVuc2FmZV9maWxsIDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2FycmF5X2ZpbGxcIlxuZXh0ZXJuYWwgY3JlYXRlX2Zsb2F0OiBpbnQgLT4gZmxvYXQgYXJyYXkgPSBcImNhbWxfbWFrZV9mbG9hdF92ZWN0XCJcblxubW9kdWxlIEZsb2F0YXJyYXkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGZsb2F0YXJyYXkgPSBcImNhbWxfZmxvYXRhcnJheV9jcmVhdGVcIlxuICBleHRlcm5hbCBsZW5ndGggOiBmbG9hdGFycmF5IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdFxuICAgICAgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9zZXRcIlxuZW5kXG5cbmxldCBpbml0IGwgZiA9XG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlXG4gIGlmIGwgPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5pbml0XCJcbiAgKCogU2VlICM2NTc1LiBXZSBtdXN0IG5vdCBldmFsdWF0ZSBbZiAwXSB3aGVuIFtsIDw9IDBdLlxuICAgICBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtYXhpbXVtIGFycmF5IHNpemUsIGJ1dCB0aGlzIGRlcGVuZHNcbiAgICAgb24gd2hldGhlciB3ZSBjcmVhdGUgYSBmbG9hdCBhcnJheSBvciBhIHJlZ3VsYXIgb25lLi4uICopXG4gIGVsc2VcbiAgIGxldCByZXMgPSBjcmVhdGUgbCAoZiAwKSBpblxuICAgZm9yIGkgPSAxIHRvIHByZWQgbCBkb1xuICAgICB1bnNhZmVfc2V0IHJlcyBpIChmIGkpXG4gICBkb25lO1xuICAgcmVzXG5cbmxldCBtYWtlX21hdHJpeCBzeCBzeSBpbml0ID1cbiAgKCogV2UgcmFpc2UgZXZlbiBpZiBbc3ggPSAwICYmIHN5IDwgMF06ICopXG4gIGlmIHN5IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkubWFrZV9tYXRyaXhcIjtcbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICAgIHVuc2FmZV9zZXQgcmVzIHggKGNyZWF0ZSBzeSBpbml0KVxuICAgIGRvbmU7XG4gIGVuZDtcbiAgcmVzXG5cbmxldCBpbml0X21hdHJpeCBzeCBzeSBmID1cbiAgKCogV2UgcmFpc2UgZXZlbiBpZiBbc3ggPSAwICYmIHN5IDwgMF06ICopXG4gIGlmIHN5IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuaW5pdF9tYXRyaXhcIjtcbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gICgqIFdlIG11c3Qgbm90IGV2YWx1YXRlIFtmIHggMF0gd2hlbiBbc3kgPD0gMF06ICopXG4gIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICAgIGxldCByb3cgPSBjcmVhdGUgc3kgKGYgeCAwKSBpblxuICAgICAgZm9yIHkgPSAxIHRvIHByZWQgc3kgZG9cbiAgICAgICAgdW5zYWZlX3NldCByb3cgeSAoZiB4IHkpXG4gICAgICBkb25lO1xuICAgICAgdW5zYWZlX3NldCByZXMgeCByb3dcbiAgICBkb25lO1xuICBlbmQ7XG4gIHJlc1xuXG5sZXQgY29weSBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpbiBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSB1bnNhZmVfc3ViIGEgMCBsXG5cbmxldCBhcHBlbmQgYTEgYTIgPVxuICBsZXQgbDEgPSBsZW5ndGggYTEgaW5cbiAgaWYgbDEgPSAwIHRoZW4gY29weSBhMlxuICBlbHNlIGlmIGxlbmd0aCBhMiA9IDAgdGhlbiB1bnNhZmVfc3ViIGExIDAgbDFcbiAgZWxzZSBhcHBlbmRfcHJpbSBhMSBhMlxuXG5sZXQgc3ViIGEgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuc3ViXCJcbiAgZWxzZSB1bnNhZmVfc3ViIGEgb2ZzIGxlblxuXG5sZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHZcblxubGV0IGJsaXQgYTEgb2ZzMSBhMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBhMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggYTIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IGExIG9mczEgYTIgb2ZzMiBsZW5cblxubGV0IGl0ZXIgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBpdGVyMiBmIGEgYiA9XG4gIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gIGVsc2VcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxubGV0IG1hcCBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZih1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZih1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwX2lucGxhY2UgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgYSBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gIGRvbmVcblxubGV0IG1hcGlfaW5wbGFjZSBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgdW5zYWZlX3NldCBhIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICBkb25lXG5cbmxldCBtYXAyIGYgYSBiID1cbiAgbGV0IGxhID0gbGVuZ3RoIGEgaW5cbiAgbGV0IGxiID0gbGVuZ3RoIGIgaW5cbiAgaWYgbGEgPD4gbGIgdGhlblxuICAgIGludmFsaWRfYXJnIFwiQXJyYXkubWFwMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICBlbHNlIGJlZ2luXG4gICAgaWYgbGEgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGNyZWF0ZSBsYSAoZiAodW5zYWZlX2dldCBhIDApICh1bnNhZmVfZ2V0IGIgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbGEgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG4gIGVuZFxuXG5sZXQgaXRlcmkgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBtYXBpIGYgYSA9XG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIChmIDAgKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCB0b19saXN0IGEgPVxuICBsZXQgcmVjIHRvbGlzdCBpIHJlcyA9XG4gICAgaWYgaSA8IDAgdGhlbiByZXMgZWxzZSB0b2xpc3QgKGkgLSAxKSAodW5zYWZlX2dldCBhIGkgOjogcmVzKSBpblxuICB0b2xpc3QgKGxlbmd0aCBhIC0gMSkgW11cblxuKCogQ2Fubm90IHVzZSBMaXN0Lmxlbmd0aCBoZXJlIGJlY2F1c2UgdGhlIExpc3QgbW9kdWxlIGRlcGVuZHMgb24gQXJyYXkuICopXG5sZXQgcmVjIGxpc3RfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY3VcbiAgfCBfOjp0IC0+IGxpc3RfbGVuZ3RoIChzdWNjIGFjY3UpIHRcblxubGV0IG9mX2xpc3QgPSBmdW5jdGlvblxuICAgIFtdIC0+IFt8fF1cbiAgfCBoZDo6dGwgYXMgbCAtPlxuICAgICAgbGV0IGEgPSBjcmVhdGUgKGxpc3RfbGVuZ3RoIDAgbCkgaGQgaW5cbiAgICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgICBbXSAtPiBhXG4gICAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpKzEpIHRsIGluXG4gICAgICBmaWxsIDEgdGxcblxubGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFyXG5cbmxldCBmb2xkX2xlZnRfbWFwIGYgYWNjIGlucHV0X2FycmF5ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBpbnB1dF9hcnJheSBpblxuICBpZiBsZW4gPSAwIHRoZW4gKGFjYywgW3x8XSkgZWxzZSBiZWdpblxuICAgIGxldCBhY2MsIGVsdCA9IGYgYWNjICh1bnNhZmVfZ2V0IGlucHV0X2FycmF5IDApIGluXG4gICAgbGV0IG91dHB1dF9hcnJheSA9IGNyZWF0ZSBsZW4gZWx0IGluXG4gICAgbGV0IGFjYyA9IHJlZiBhY2MgaW5cbiAgICBmb3IgaSA9IDEgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IGFjYycsIGVsdCA9IGYgIWFjYyAodW5zYWZlX2dldCBpbnB1dF9hcnJheSBpKSBpblxuICAgICAgYWNjIDo9IGFjYyc7XG4gICAgICB1bnNhZmVfc2V0IG91dHB1dF9hcnJheSBpIGVsdDtcbiAgICBkb25lO1xuICAgICFhY2MsIG91dHB1dF9hcnJheVxuICBlbmRcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbDIgcCBsMSBsMiA9XG4gIGxldCBuMSA9IGxlbmd0aCBsMVxuICBhbmQgbjIgPSBsZW5ndGggbDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmZvcl9hbGwyXCJcbiAgZWxzZSBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4xIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBsMSBpKSAodW5zYWZlX2dldCBsMiBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZXhpc3RzMiBwIGwxIGwyID1cbiAgbGV0IG4xID0gbGVuZ3RoIGwxXG4gIGFuZCBuMiA9IGxlbmd0aCBsMiBpblxuICBpZiBuMSA8PiBuMiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZXhpc3RzMlwiXG4gIGVsc2UgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuMSB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGwxIGkpICh1bnNhZmVfZ2V0IGwyIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IG1lbSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGEgaSkgeCA9IDAgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgbWVtcSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiB4ID09ICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9vcHQgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICBlbHNlIGxvb3AgKHN1Y2MgaSlcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX2luZGV4IHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gU29tZSBpXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9tYXAgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIChzdWNjIGkpXG4gICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX21hcGkgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiBpICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgfCBOb25lIC0+IGxvb3AgKHN1Y2MgaSlcbiAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICBpblxuICBsb29wIDBcblxubGV0IHNwbGl0IHggPVxuICBpZiB4ID0gW3x8XSB0aGVuIFt8fF0sIFt8fF1cbiAgZWxzZSBiZWdpblxuICAgIGxldCBhMCwgYjAgPSB1bnNhZmVfZ2V0IHggMCBpblxuICAgIGxldCBuID0gbGVuZ3RoIHggaW5cbiAgICBsZXQgYSA9IGNyZWF0ZSBuIGEwIGluXG4gICAgbGV0IGIgPSBjcmVhdGUgbiBiMCBpblxuICAgIGZvciBpID0gMSB0byBuIC0gMSBkb1xuICAgICAgbGV0IGFpLCBiaSA9IHVuc2FmZV9nZXQgeCBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSBhaTtcbiAgICAgIHVuc2FmZV9zZXQgYiBpIGJpXG4gICAgZG9uZTtcbiAgICBhLCBiXG4gIGVuZFxuXG5sZXQgY29tYmluZSBhIGIgPVxuICBsZXQgbmEgPSBsZW5ndGggYSBpblxuICBsZXQgbmIgPSBsZW5ndGggYiBpblxuICBpZiBuYSA8PiBuYiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuY29tYmluZVwiO1xuICBpZiBuYSA9IDAgdGhlbiBbfHxdXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgeCA9IGNyZWF0ZSBuYSAodW5zYWZlX2dldCBhIDAsIHVuc2FmZV9nZXQgYiAwKSBpblxuICAgIGZvciBpID0gMSB0byBuYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgeCBpICh1bnNhZmVfZ2V0IGEgaSwgdW5zYWZlX2dldCBiIGkpXG4gICAgZG9uZTtcbiAgICB4XG4gIGVuZFxuXG5leGNlcHRpb24gQm90dG9tIG9mIGludFxubGV0IHNvcnQgY21wIGEgPVxuICBsZXQgbWF4c29uIGwgaSA9XG4gICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICBsZXQgeCA9IHJlZiBpMzEgaW5cbiAgICBpZiBpMzErMiA8IGwgdGhlbiBiZWdpblxuICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgaWYgY21wIChnZXQgYSAheCkgKGdldCBhIChpMzErMikpIDwgMCB0aGVuIHggOj0gaTMxKzI7XG4gICAgICAheFxuICAgIGVuZCBlbHNlXG4gICAgICBpZiBpMzErMSA8IGwgJiYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDBcbiAgICAgIHRoZW4gaTMxKzFcbiAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgaW5cbiAgbGV0IHJlYyB0cmlja2xlZG93biBsIGkgZSA9XG4gICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgaWYgY21wIChnZXQgYSBqKSBlID4gMCB0aGVuIGJlZ2luXG4gICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBzZXQgYSBpIGU7XG4gICAgZW5kO1xuICBpblxuICBsZXQgdHJpY2tsZSBsIGkgZSA9IHRyeSB0cmlja2xlZG93biBsIGkgZSB3aXRoIEJvdHRvbSBpIC0+IHNldCBhIGkgZSBpblxuICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICBidWJibGVkb3duIGwgalxuICBpblxuICBsZXQgYnViYmxlIGwgaSA9IHRyeSBidWJibGVkb3duIGwgaSB3aXRoIEJvdHRvbSBpIC0+IGkgaW5cbiAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICBsZXQgZmF0aGVyID0gKGkgLSAxKSAvIDMgaW5cbiAgICBhc3NlcnQgKGkgPD4gZmF0aGVyKTtcbiAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgZmF0aGVyKTtcbiAgICAgIGlmIGZhdGhlciA+IDAgdGhlbiB0cmlja2xldXAgZmF0aGVyIGUgZWxzZSBzZXQgYSAwIGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHNldCBhIGkgZTtcbiAgICBlbmQ7XG4gIGluXG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgZm9yIGkgPSAobCArIDEpIC8gMyAtIDEgZG93bnRvIDAgZG8gdHJpY2tsZSBsIGkgKGdldCBhIGkpOyBkb25lO1xuICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgbGV0IGUgPSAoZ2V0IGEgaSkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSAwKTtcbiAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gIGRvbmU7XG4gIGlmIGwgPiAxIHRoZW4gKGxldCBlID0gKGdldCBhIDEpIGluIHNldCBhIDEgKGdldCBhIDApOyBzZXQgYSAwIGUpXG5cblxubGV0IGN1dG9mZiA9IDVcbmxldCBzdGFibGVfc29ydCBjbXAgYSA9XG4gIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgbGV0IHNyYzFyID0gc3JjMW9mcyArIHNyYzFsZW4gYW5kIHNyYzJyID0gc3JjMm9mcyArIHNyYzJsZW4gaW5cbiAgICBsZXQgcmVjIGxvb3AgaTEgczEgaTIgczIgZCA9XG4gICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBkc3QgZCBzMTtcbiAgICAgICAgbGV0IGkxID0gaTEgKyAxIGluXG4gICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgIGxvb3AgaTEgKGdldCBhIGkxKSBpMiBzMiAoZCArIDEpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgZHN0IGQgczI7XG4gICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICBpZiBpMiA8IHNyYzJyIHRoZW5cbiAgICAgICAgICBsb29wIGkxIHMxIGkyIChnZXQgc3JjMiBpMikgKGQgKyAxKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYmxpdCBhIGkxIGRzdCAoZCArIDEpIChzcmMxciAtIGkxKVxuICAgICAgZW5kXG4gICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gIGluXG4gIGxldCBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBlID0gKGdldCBhIChzcmNvZnMgKyBpKSkgaW5cbiAgICAgIGxldCBqID0gcmVmIChkc3RvZnMgKyBpIC0gMSkgaW5cbiAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgc2V0IGRzdCAoIWogKyAxKSAoZ2V0IGRzdCAhaik7XG4gICAgICAgIGRlY3IgajtcbiAgICAgIGRvbmU7XG4gICAgICBzZXQgZHN0ICghaiArIDEpIGU7XG4gICAgZG9uZTtcbiAgaW5cbiAgbGV0IHJlYyBzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICBpZiBsZW4gPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gZWxzZSBiZWdpblxuICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgbGV0IGwyID0gbGVuIC0gbDEgaW5cbiAgICAgIHNvcnR0byAoc3Jjb2ZzICsgbDEpIGRzdCAoZHN0b2ZzICsgbDEpIGwyO1xuICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICBtZXJnZSAoc3Jjb2ZzICsgbDIpIGwxIGRzdCAoZHN0b2ZzICsgbDEpIGwyIGRzdCBkc3RvZnM7XG4gICAgZW5kO1xuICBpblxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byAwIGEgMCBsIGVsc2UgYmVnaW5cbiAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgIGxldCBsMiA9IGwgLSBsMSBpblxuICAgIGxldCB0ID0gbWFrZSBsMiAoZ2V0IGEgMCkgaW5cbiAgICBzb3J0dG8gbDEgdCAwIGwyO1xuICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgbWVyZ2UgbDIgbDEgdCAwIGwyIGEgMDtcbiAgZW5kXG5cblxubGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbmxldCBzaHVmZmxlIH5yYW5kIGEgPSAoKiBGaXNoZXItWWF0ZXMgKilcbiAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDEgZG9cbiAgICBsZXQgaiA9IHJhbmQgKGkgKyAxKSBpblxuICAgIGxldCB2ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICB1bnNhZmVfc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgdW5zYWZlX3NldCBhIGogdlxuICBkb25lXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgYSA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPCBsZW5ndGggYVxuICAgIHRoZW5cbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gICAgZWxzZSBTZXEuTmlsXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGEgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICB0aGVuXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICBlbHNlIFNlcS5OaWxcbiAgaW5cbiAgYXV4IDBcblxubGV0IG9mX3Jldl9saXN0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbfHxdXG4gIHwgaGQ6OnRsIGFzIGwgLT5cbiAgICAgIGxldCBsZW4gPSBsaXN0X2xlbmd0aCAwIGwgaW5cbiAgICAgIGxldCBhID0gY3JlYXRlIGxlbiBoZCBpblxuICAgICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICAgIFtdIC0+IGFcbiAgICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICAgIGluXG4gICAgICBmaWxsIChsZW4tMikgdGxcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gIG9mX3Jldl9saXN0IGxcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9hcnJheV9zdWIiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX1NlcSIsIkFzc2VydF9mYWlsdXJlIiwiU3RkbGliIiwiaW5pdCIsImwiLCJyZXMiLCJpIiwibWFrZV9tYXRyaXgiLCJzeCIsInN5IiwieCIsImluaXRfbWF0cml4Iiwicm93IiwieSIsImNvcHkiLCJhIiwiYXBwZW5kIiwiYTIiLCJsMSIsInN1YiIsIm9mcyIsImxlbiIsImZpbGwiLCJ2IiwiYmxpdCIsIm9mczEiLCJvZnMyIiwiaXRlciIsIml0ZXIyIiwiYiIsIm1hcCIsInIiLCJtYXBfaW5wbGFjZSIsIm1hcGlfaW5wbGFjZSIsIm1hcDIiLCJsYSIsImxiIiwiaXRlcmkiLCJtYXBpIiwidG9fbGlzdCIsImxpc3RfbGVuZ3RoIiwiYWNjdSIsInBhcmFtIiwidCIsIm9mX2xpc3QiLCJ0bCIsImhkIiwiZm9sZF9sZWZ0IiwiZm9sZF9sZWZ0X21hcCIsImFjYyIsImlucHV0X2FycmF5IiwibWF0Y2giLCJlbHQiLCJvdXRwdXRfYXJyYXkiLCJmb2xkX3JpZ2h0IiwiZXhpc3RzIiwicCIsIm4iLCJmb3JfYWxsIiwiZm9yX2FsbDIiLCJsMiIsIm4xIiwibjIiLCJleGlzdHMyIiwibWVtIiwibWVtcSIsImZpbmRfb3B0IiwiZmluZF9pbmRleCIsImZpbmRfbWFwIiwiZmluZF9tYXBpIiwic3BsaXQiLCJiMCIsImJpIiwiYWkiLCJjb21iaW5lIiwibmEiLCJuYiIsIkJvdHRvbSIsInNvcnQiLCJjbXAiLCJtYXhzb24iLCJpMzEiLCJlIiwiaiIsImV4biIsImZhdGhlciIsInN0YWJsZV9zb3J0IiwibWVyZ2UiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdCIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiIsInMxIiwiaTEiLCJpMiIsImQiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwic2h1ZmZsZSIsInJhbmQiLCJ0b19zZXEiLCJhdXgiLCJ0b19zZXFpIiwib2Zfc2VxIiwiU3RkbGliX0FycmF5Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxZQUFBQyxLQUFBQyxHQUFBVDtBQUFBQSxJQytDRSxZQUFjO0FBQUEsSUFDZCxVQUFjLHlDQVNWO0FBQUEsUUFBQVUsTUFKTyxrQkFBUyx1QkFDbkI7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLE1BQ21CO0FBQUEsY0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFeEI7QUFBQSxHQUFHO0FBQUEsWUFBQUMsWUFBQUMsSUFBQUMsSUFBQU47QUFBQUEsSUFJSixXQUFlO0FBQUEsUUFBQUUsTUFDTDtBQUFBLElBQ1Y7QUFBQSxhQUFlO0FBQUE7QUFBQSxVQUFBSyxJQUFBO0FBQUE7QUFBQSxPQUVNO0FBQUEsZUFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFHckM7QUFBQSxHQUFHO0FBQUEsWUFBQUMsWUFBQUgsSUFBQUMsSUFBQWQ7QUFBQUEsSUFJSCxXQUFlO0FBQUEsUUFBQVUsTUFDTDtBQUFBLElBRVY7QUFBQSxhQUFlO0FBQUE7QUFBQSxVQUFBSyxJQUFBO0FBQUE7QUFBQSxXQUFBRSxNQUVELG1CQUFVLDBCQUNwQjtBQUFBO0FBQUEsWUFBQUMsSUFBQTtBQUFBO0FBQUEsU0FDbUI7QUFBQSxpQkFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FFMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUdKO0FBQUEsR0FBRztBQUFBLFlBQUFDLEtBQUFDO0FBQUFBLFFBQUFYLElBR0g7QUFBQSxJQUFvQix1QkFBd0IsdUJBQWdCO0FBQUE7QUFBQSxZQUFBWSxPQUFBbEIsSUFBQW1CO0FBQUFBLFFBQUFDLEtBRzVEO0FBQUEsSUFDQTtBQUFBLGNBQWU7QUFBQTtBQUFBO0FBQUEsZ0JBQ1k7QUFBQSxnQkFDdEIsaUNBQWlCO0FBQUE7QUFBQSxZQUFBQyxJQUFBSixHQUFBSyxLQUFBQztBQUFBQSxJQUd0QjtBQUFBLEtBRUssa0NBQW9CO0FBQUEsSUFEcEIsd0NBQ29CO0FBQUE7QUFBQSxZQUFBQyxLQUFBUCxHQUFBSyxLQUFBQyxLQUFBRTtBQUFBQSxJQUd6QjtBQUFBLEtBRUssOENBQXVCO0FBQUEsSUFEdkIseUNBQ3VCO0FBQUE7QUFBQSxZQUFBQyxLQUFBMUIsSUFBQTJCLE1BQUFSLElBQUFTLE1BQUFMO0FBQUFBLElBRzVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FHSyx1REFBK0I7QUFBQSxJQUQvQix5Q0FDK0I7QUFBQTtBQUFBLFlBQUFNLEtBQUFoQyxHQUFBb0I7QUFBQUEsUUFBQSxJQUdwQztBQUFBO0FBQUEsU0FBQVQsSUFBQTtBQUFBO0FBQUEsTUFBNkI7QUFBQSxjQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBOUM7QUFBQSxHQUFtRDtBQUFBLFlBQUFzQixNQUFBakMsR0FBQW9CLEdBQUFjO0FBQUFBLElBR25EO0FBQUEsS0FDRTtBQUFBLG9FQUVxRTtBQUFBLFlBQXJFO0FBQUE7QUFBQSxTQUFBdkIsSUFBQTtBQUFBO0FBQUEsTUFBNkI7QUFBQSxjQUFtQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBaEU7QUFBQSxHQUFxRTtBQUFBLFlBQUF3QixJQUFBbkMsR0FBQW9CO0FBQUFBLFFBQUFYLElBR3ZFO0FBQUEsSUFDQSxZQUFjO0FBQUEsUUFBQTJCLElBQ0osa0JBQVMsMEJBQ2pCO0FBQUE7QUFBQSxTQUFBekIsSUFBQTtBQUFBO0FBQUEsTUFDaUI7QUFBQSxjQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFcEM7QUFBQSxHQUNDO0FBQUEsWUFBQTBCLFlBQUFyQyxHQUFBb0I7QUFBQUEsUUFBQSxJQUdIO0FBQUE7QUFBQSxTQUFBVCxJQUFBO0FBQUE7QUFBQSxNQUNpQjtBQUFBLGNBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQURyQztBQUFBLEdBRUk7QUFBQSxZQUFBMkIsYUFBQXRDLEdBQUFvQjtBQUFBQSxRQUFBLElBR0o7QUFBQTtBQUFBLFNBQUFULElBQUE7QUFBQTtBQUFBLE1BQ2lCO0FBQUEsY0FBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRHZDO0FBQUEsR0FFSTtBQUFBLFlBQUE0QixLQUFBdkMsR0FBQW9CLEdBQUFjO0FBQUFBLFFBQUFNLEtBR0osY0FBQUMsS0FDQTtBQUFBLElBQ0E7QUFBQSxLQUNFO0FBQUEsbUVBU0M7QUFBQSxJQVJFLGFBQ1k7QUFBQSxRQUFBTCxJQUNMLG1CQUFVLGdDQUNsQjtBQUFBO0FBQUEsU0FBQXpCLElBQUE7QUFBQTtBQUFBLE1BQ2lCO0FBQUEsY0FBcUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRXREO0FBQUEsR0FFRDtBQUFBLFlBQUErQixNQUFBMUMsR0FBQW9CO0FBQUFBLFFBQUEsSUFHSDtBQUFBO0FBQUEsU0FBQVQsSUFBQTtBQUFBO0FBQUEsTUFBNkI7QUFBQSxjQUFvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBakQ7QUFBQSxHQUFzRDtBQUFBLFlBQUFnQyxLQUFBM0MsR0FBQW9CO0FBQUFBLFFBQUFYLElBR3REO0FBQUEsSUFDQSxZQUFjO0FBQUEsUUFBQTJCLElBQ0osa0JBQVMsNkJBQ2pCO0FBQUE7QUFBQSxTQUFBekIsSUFBQTtBQUFBO0FBQUEsTUFDaUI7QUFBQSxjQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFdkM7QUFBQSxHQUNDO0FBQUEsWUFBQWlDLFFBQUF4QjtBQUFBQSxRQUFBVCxNQUtILGtCQUFBQSxJQUFBLEtBQUFELE1BQUE7QUFBQTtBQUFBLEtBREUsVUFBYztBQUFBLFNBQUFBLFFBQXVDLG9CQUFBQyxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FDL0I7QUFBQSxZQUFBa0MsWUFBQUMsUUFBQUM7QUFBQUEsUUFBQUQsT0FHTixRQUFBQyxRQUFBO0FBQUE7QUFBQSxpQkFDVjtBQUFBLFNBQUFDLElBRFUsVUFBQUYsU0FFUjtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQXlCO0FBQUEsWUFBQUcsUUFBQXhDO0FBQUFBLElBRXZCLFFBQ0o7QUFBQTtBQUFBLEtBQUF5QyxLQURJO0FBQUEsS0FBQUMsS0FBQTtBQUFBLEtBQUEvQixJQUdBLGVBQU87QUFBQSxLQUFBVCxJQUlmO0FBQUEsS0FBQW9DLFFBQUE7QUFBQTtBQUFBLEtBSGEsWUFDSDtBQUFBLFNBQUFHLE9BREcsVUFBQUMsT0FBQTtBQUFBLEtBRUM7QUFBQSxTQUFBeEMsTUFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUN0QjtBQUFBLFlBQUF5QyxVQUFBcEQsR0FBQWUsR0FBQUs7QUFBQUEsUUFBQSxJQUliO0FBQUE7QUFBQSxTQUFBZ0IsTUFBQTtBQUFBO0FBQUEsU0FBQUEsSUFBQSxHQUFBekIsSUFBQTtBQUFBO0FBQUEsY0FDTyxnQ0FBcUI7QUFBQSxzQkFBQXlCLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRTVCO0FBQUEsR0FBRTtBQUFBLFlBQUFpQixjQUFBckQsR0FBQXNELEtBQUFDO0FBQUFBLFFBQUE3QixNQUdGO0FBQUEsSUFDQSxjQUFnQjtBQUFBO0FBQUEsS0FBQThCLFFBQ0M7QUFBQSxLQUFBQyxNQUFnQztBQUFBLEtBQUFILFFBQUE7QUFBQSxLQUFBSSxlQUM1QjtBQUFBLFNBRW5CO0FBQUE7QUFBQSxTQUFBSixRQUFBO0FBQUE7QUFBQSxTQUFBQSxRQUFBLE9BQUEzQyxJQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUE2QyxVQUNrQjtBQUFBLE9BQUFDLFFBQWlDO0FBQUEsT0FBQUgsUUFBQTtBQUFBLE1BRWpEO0FBQUEsY0FBNkI7QUFBQSxzQkFBQUEsUUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFL0I7QUFBQSxHQUNDO0FBQUEsWUFBQUssV0FBQTNELEdBQUFvQixHQUFBTDtBQUFBQSxRQUFBLElBSUg7QUFBQTtBQUFBLFNBQUFxQixNQUFBO0FBQUE7QUFBQSxTQUFBQSxJQUFBLEdBQUF6QixJQUFBO0FBQUE7QUFBQSxjQUNPLGdDQUFxQjtBQUFBLHNCQUFBeUIsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFNUI7QUFBQSxHQUFFO0FBQUEsWUFBQXdCLE9BQUFDLEdBQUF6QztBQUFBQSxRQUFBMEMsSUFHRixjQUFBbkQsSUFLQTtBQUFBO0FBQUEsS0FIRSxZQUFjO0FBQUEsS0FDTiw0QkFBd0I7QUFBQSxTQUFBQSxNQUMzQjtBQUFBO0FBQUE7QUFBQSxHQUNEO0FBQUEsWUFBQW9ELFFBQUFGLEdBQUF6QztBQUFBQSxRQUFBMEMsSUFHTixjQUFBbkQsSUFLQTtBQUFBO0FBQUEsS0FIRSxZQUFjO0FBQUEsS0FDTiw4QkFDSDtBQUFBLFNBQUFBLE1BRDJCO0FBQUE7QUFBQTtBQUFBLEdBRTVCO0FBQUEsWUFBQXFELFNBQUFILEdBQUF0QyxJQUFBMEM7QUFBQUEsUUFBQUMsS0FHTixlQUFBQyxLQUFBO0FBQUEsSUFFQSxjQUFpQiw2Q0FLWDtBQUFBLFFBQUF4RCxJQUFOO0FBQUE7QUFBQSxLQUhFLGFBQWU7QUFBQSxLQUNQLDBDQUNIO0FBQUEsU0FBQUEsTUFEOEM7QUFBQTtBQUFBO0FBQUEsR0FFL0M7QUFBQSxZQUFBeUQsUUFBQVAsR0FBQXRDLElBQUEwQztBQUFBQSxRQUFBQyxLQUdOLGVBQUFDLEtBQUE7QUFBQSxJQUVBLGNBQWlCLDRDQUtYO0FBQUEsUUFBQXhELElBQU47QUFBQTtBQUFBLEtBSEUsYUFBZTtBQUFBLEtBQ1Asd0NBQTJDO0FBQUEsU0FBQUEsTUFDOUM7QUFBQTtBQUFBO0FBQUEsR0FDRDtBQUFBLFlBQUEwRCxJQUFBdEQsR0FBQUs7QUFBQUEsUUFBQTBDLElBR04sY0FBQW5ELElBS0E7QUFBQTtBQUFBLEtBSEUsWUFBYztBQUFBLEtBQ04sNENBQW9DO0FBQUEsU0FBQUEsTUFDdkM7QUFBQTtBQUFBO0FBQUEsR0FDRDtBQUFBLFlBQUEyRCxLQUFBdkQsR0FBQUs7QUFBQUEsUUFBQTBDLElBR04sY0FBQW5ELElBS0E7QUFBQTtBQUFBLEtBSEUsWUFBYztBQUFBLEtBQ2UsbUJBQU07QUFBQSxTQUFBQSxNQUM5QjtBQUFBO0FBQUE7QUFBQSxHQUNEO0FBQUEsWUFBQTRELFNBQUFWLEdBQUF6QztBQUFBQSxRQUFBMEMsSUFHTixjQUFBbkQsSUFRQTtBQUFBO0FBQUEsS0FORSxZQUFjO0FBQUEsU0FBQUksSUFFSjtBQUFBLEtBQ0wscUJBQVM7QUFBQSxTQUFBSixNQUNQO0FBQUE7QUFBQTtBQUFBLEdBRUg7QUFBQSxZQUFBNkQsV0FBQVgsR0FBQXpDO0FBQUFBLFFBQUEwQyxJQUdOLGNBQUFuRCxJQUtBO0FBQUE7QUFBQSxLQUhFLFlBQWM7QUFBQSxLQUNOLDRCQUF3QjtBQUFBLFNBQUFBLE1BQzNCO0FBQUE7QUFBQTtBQUFBLEdBQ0Q7QUFBQSxZQUFBOEQsU0FBQXpFLEdBQUFvQjtBQUFBQSxRQUFBMEMsSUFHTixjQUFBbkQsSUFRQTtBQUFBO0FBQUEsS0FORSxZQUFjO0FBQUEsU0FBQXlCLElBRU47QUFBQSxLQUFrQixNQUVQO0FBQUEsU0FBQXpCLE1BRFA7QUFBQTtBQUFBO0FBQUEsR0FHUjtBQUFBLFlBQUErRCxVQUFBMUUsR0FBQW9CO0FBQUFBLFFBQUEwQyxJQUdOLGNBQUFuRCxJQVFBO0FBQUE7QUFBQSxLQU5FLFlBQWM7QUFBQSxTQUFBeUIsSUFFTjtBQUFBLEtBQW9CLE1BRVQ7QUFBQSxTQUFBekIsTUFEUDtBQUFBO0FBQUE7QUFBQSxHQUdSO0FBQUEsWUFBQWdFLE1BQUE1RDtBQUFBQSxJQUdILCtCQUFjO0FBQUE7QUFBQSxLQUFBeUMsUUFDWjtBQUFBLEtBQUFvQixLQUFBO0FBQUEsS0FBQTNFLEtBQUE7QUFBQSxLQUFBNkQsSUFFSDtBQUFBLEtBQUExQyxJQUNRO0FBQUEsS0FBQWMsSUFDQTtBQUFBLFNBQ1I7QUFBQTtBQUFBLFNBQUF2QixJQUFBO0FBQUE7QUFBQSxVQUFBNkMsVUFDRSxVQUFBcUIsS0FBQSxZQUFBQyxLQUFBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxjQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFbkI7QUFBQSxHQUNDO0FBQUEsWUFBQUMsUUFBQTNELEdBQUFjO0FBQUFBLFFBQUE4QyxLQUdILGNBQUFDLEtBQ0E7QUFBQSxJQUNBLGNBQWlCO0FBQUEsSUFDakIsYUFBZTtBQUFBLFFBQUFsRSxJQUVMLHlDQUNSO0FBQUE7QUFBQSxTQUFBSixJQUFBO0FBQUE7QUFBQSxNQUNnQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUVoQztBQUFBLEdBQ0M7QUFBQTtBQUFBLElBQUF1RSxTRDlVTDtBQUFBO0FBQUEsWUFBQUMsS0FBQUMsS0FBQWhFO0FBQUFBLGFBQUFpRSxPQUFBNUUsR0FBQUU7QUFBQUEsU0FBQTJFLE1DbVZJO0FBQUEsS0FFQTtBQUFBO0FBQUEsV0FBa0I7QUFBQSxXQUNHO0FBQUEsT0FBQXZFO0FBQUFBLFNBQWhCLGdCQUFJO0FBQUE7QUFBQTtBQUFBLFdBQ1A7QUFBQSxXQUFrQjtBQUFBLE9BQUFBO0FBQUFBLFNBQWYsZ0JBQUk7QUFBQTtBQUFBO0FBQUEsTUFDUDtBQUFBO0FBQUEsS0FFQTtBQUFBLCtCQUFnQztBQUFBLE1BQVosT0FBSixnQkFBSTtBQUFBLE9BQ2Y7QUFBQTtBQUFBLEtBQ0EsWUFBZ0I7QUFBQSxLQUFTO0FBQUEsSUFBZ0I7QUFBQSxRQUFBTixJQTRCbEQsb0JBQ0E7QUFBQTtBQUFBLFNBQUFFLE1BQUE7QUFBQTtBQUFBLFVBQUE0RSxNQUFnRDtBQUFBLE1BbEI1QjtBQUFBLFdBQUE1RSxJQUFBO0FBQUE7QUFBQSxZQUFBNkUsSUFSVjtBQUFBLFFBQ0QsUUFBSixnQkFBSSx1Q0FHRTtBQUFBLGdCQUZDO0FBQUEsUUFBUjtBQUFBLFFBQWlCO0FBQUE7QUFBQTtBQUFBLFlBQUFDO0FBQUFBLFdBQUFBLE1Eald2QjtBQUFBO0FBQUEsV0FBQTlFLE1BQUE7QUFBQSxPQ3VXNkQ7QUFBQTtBQUFBLGNBa0JGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUN6RDtBQUFBO0FBQUEsU0FBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQSxVQUFBNEUsTUFDVTtBQUFBLE1BQ0E7QUFBQSxNQWZPO0FBQUEsV0FBQTVFLE1BQUE7QUFBQTtBQUFBLFlBQUE2RSxNQUpQLHNCQUNBO0FBQUEsUUFBUjtBQUFBLFFBQWlCO0FBQUE7QUFBQTtBQUFBLFlBQUFDO0FBQUFBLFdBQUFBLFFEMVdyQjtBQUFBO0FBQUEsV0FBQTlFLE1BQUEsVUFBQUEsTUM2WEk7QUFBQTtBQUFBLFlBQUErRSxTQWRBO0FBQUEsUUFDQTtBQUFBO0FBQUEsUUFDTztBQUFBLGVBQUosZ0JBQUk7QUFBQSxTQUdFO0FBQUE7QUFBQSxpQkFGQztBQUFBLFNBQVI7QUFBQSxTQUFzQjtBQUFBLFNBQ3FCO0FBQUE7QUFBQSxnQkFVckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBRTFCO0FBQUE7QUFBQSxTQUFBSCxJQUF1QjtBQUFBLEtBQXFCO0FBQUEsS0FBVztBQUFBLGFBQVM7QUFBQTtBQUFBO0FBQUEsYUFBaEU7QUFBQTtBQUFBLEdBQWlFO0FBQUEsWUFBQUksWUFBQVAsS0FBQWhFO0FBQUFBLGFBQUF3RSxNQUFBQyxTQUFBQyxTQUFBQyxNQUFBQyxTQUFBQyxTQUFBQyxLQUFBQztBQUFBQTtBQUFBQSxNQUFBQyxRQU0vRDtBQUFBLE1BQUFDLFFBQUE7QUFBQSxNQUFBQyxPQWlCd0M7QUFBQSxNQUFBQyxPQUF4QjtBQUFBLE1BQUFDLEtBQWU7QUFBQSxNQUFBRCxLQUFBO0FBQUEsTUFBQUUsS0FBQTtBQUFBLE1BQUFILEtBQUE7QUFBQSxNQUFBSSxJQUFBO0FBQUE7QUFBQSxNQWYxQjtBQUFBLE9BUUQ7QUFBQSxXQUFBRCxPQUFZO0FBQUEsT0FFWixrQkFHRSxrREFFNEQ7QUFBQSxXQUFBQyxNQUo1RCxXQUFBSixPQUFjO0FBQUEsT0FBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FWN0I7QUFBQSxXQUFBRSxPQUFZO0FBQUEsT0FFWjtBQUFBLFFBR0UscURBUzREO0FBQUEsV0FBQUUsTUFYNUQsV0FBQUgsT0FBUTtBQUFBLE9BQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVcwQztBQUFBLGFBQUFJLFFBQUFDLFFBQUFWLEtBQUFDLFFBQUF6RTtBQUFBQSxTQUFBLElBR2xFO0FBQUE7QUFBQSxVQUFBZixJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFDRTtBQUFBLFFBQUE0RSxJQUFRO0FBQUEsUUFBQUMsSUFFUjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUF1QixnQkFBSTtBQUFBLGlCQUNJLGVBQVo7QUFBQSxTQUFqQjtBQUFBLGFBQUFBLE1BQTZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBRy9CO0FBQUE7QUFBQSxnQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVBwQjtBQUFBLElBUUk7QUFBQSxhQUFBcUIsT0FBQUQsUUFBQVYsS0FBQUMsUUFBQXpFO0FBQUFBLEtBR0osYUFBc0Isd0NBTW5CO0FBQUEsU0FBQUgsS0FOc0QsYUFBQTBDLEtBRXZEO0FBQUEsS0FDQTtBQUFBLEtBQ0E7QUFBQSxLQUFnQyx3RUFFL0I7QUFBQTtBQUFBLFFBQUF4RCxJQUVMO0FBQUEsSUFDQSxXQUFvQiwwQkFPakI7QUFBQTtBQUFBLEtBQUFjLEtBUHNDO0FBQUEsS0FBQTBDLEtBRXZDO0FBQUEsS0FBQWpCLElBQ1EsbUJBQVE7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxJQUFnQixvQ0FFZjtBQUFBO0FBQUEsWUFBQThELFFBQUFDLE1BQUEzRjtBQUFBQSxRQUFBLElBTUg7QUFBQTtBQUFBLFNBQUFULElBQUE7QUFBQTtBQUFBLFVBQUE2RSxJQUNVLDZCQUFBNUQsSUFDQTtBQUFBLE1BQ087QUFBQSxNQUNmO0FBQUEsY0FBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSmxCO0FBQUEsR0FLSTtBQUFBLFlBQUFvRixPQUFBNUY7QUFBQUEsYUFBQTZGLElBQUF0RyxHQUFBb0M7QUFBQUEsS0FNRixzQkFJSztBQUFBLFNBQUFoQyxJQUZLLGNBQ0s7QUFBQSxLQUFTLDBCQUFULG1CQUFTO0FBQUEsSUFDWjtBQUFBLElBRWQsbUJEM2NGLGtCQzJjRTtBQUFBLEdBQUs7QUFBQSxZQUFBbUcsUUFBQTlGO0FBQUFBLGFBQUE2RixJQUFBdEcsR0FBQW9DO0FBQUFBLEtBSUgsc0JBSUs7QUFBQSxTQUFBaEMsSUFGSyxjQUNTO0FBQUEsS0FBUyxrQ0FBVCxtQkFBUztBQUFBLElBQ2hCO0FBQUEsSUFFZCxtQkRyZEYsa0JDcWRFO0FBQUEsR0FBSztBQUFBLFlBQUFvRyxPQUFBeEc7QUFBQUE7QUFBQUEsS0FBQUY7QUFBQUEsT0FjRyxrQ0FBQTZDLEtBQUF2QyxHQUE0QixtQkFBTTtBQUFBLElBWjFCLFFBQ1I7QUFBQTtBQUFBLEtBQUFtQyxLQURRO0FBQUEsS0FBQUMsS0FBQTtBQUFBLEtBQUF6QixNQUdGO0FBQUEsS0FBQU4sSUFDRjtBQUFBLEtBQUFULE1BS1I7QUFBQSxLQUFBQSxJQUFBO0FBQUEsS0FBQW9DLFFBQUE7QUFBQTtBQUFBLEtBSmEsWUFDSDtBQUFBLFNBQUFHLE9BREcsVUFBQUMsT0FBQTtBQUFBLEtBRUM7QUFBQSxTQUFBeEMsTUFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQU10QjtBQUFBO0FBQUEsSUFBQXlHO0FBQUFBLE1EcGVmIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTUxMjQsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvZmxvYXQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgT2plZGEgQmFyLCBMZXhpRmkgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIG5lZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlbmVnZmxvYXRcIlxuZXh0ZXJuYWwgYWRkIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVhZGRmbG9hdFwiXG5leHRlcm5hbCBzdWIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJXN1YmZsb2F0XCJcbmV4dGVybmFsIG11bCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlbXVsZmxvYXRcIlxuZXh0ZXJuYWwgZGl2IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVkaXZmbG9hdFwiXG5leHRlcm5hbCByZW0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbW9kX2Zsb2F0XCIgXCJmbW9kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZtYSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2ZtYV9mbG9hdFwiIFwiY2FtbF9mbWFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5cbmxldCB6ZXJvID0gMC5cbmxldCBvbmUgPSAxLlxubGV0IG1pbnVzX29uZSA9IC0xLlxubGV0IGluZmluaXR5ID0gU3RkbGliLmluZmluaXR5XG5sZXQgbmVnX2luZmluaXR5ID0gU3RkbGliLm5lZ19pbmZpbml0eVxubGV0IG5hbiA9IFN0ZGxpYi5uYW5cbmxldCBxdWlldF9uYW4gPSBuYW5cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgc2lnbmFsaW5nX25hbiA9IGZsb2F0X29mX2JpdHMgMHg3Rl9GMF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBpc19maW5pdGUgKHg6IGZsb2F0KSA9IHggLS4geCA9IDAuXG5sZXQgaXNfaW5maW5pdGUgKHg6IGZsb2F0KSA9IDEuIC8uIHggPSAwLlxubGV0IGlzX25hbiAoeDogZmxvYXQpID0geCA8PiB4XG5cbmxldCBwaSA9IDB4MS45MjFmYjU0NDQyZDE4cCsxXG5sZXQgbWF4X2Zsb2F0ID0gU3RkbGliLm1heF9mbG9hdFxubGV0IG1pbl9mbG9hdCA9IFN0ZGxpYi5taW5fZmxvYXRcbmxldCBlcHNpbG9uID0gU3RkbGliLmVwc2lsb25fZmxvYXRcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcbmxldCBvZl9zdHJpbmdfb3B0ID0gU3RkbGliLmZsb2F0X29mX3N0cmluZ19vcHRcbmxldCB0b19zdHJpbmcgPSBTdGRsaWIuc3RyaW5nX29mX2Zsb2F0XG50eXBlIGZwY2xhc3MgPSBTdGRsaWIuZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcG93IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjYnJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2JydF9mbG9hdFwiIFwiY2FtbF9jYnJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cDIgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHAyX2Zsb2F0XCIgXCJjYW1sX2V4cDJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzJfZmxvYXRcIiBcImNhbWxfbG9nMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zaF9mbG9hdFwiIFwiY2FtbF9hY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXJmIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmX2Zsb2F0XCIgXCJjYW1sX2VyZlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBlcmZjIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmY19mbG9hdFwiIFwiY2FtbF9lcmZjXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRydW5jIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdHJ1bmNfZmxvYXRcIiBcImNhbWxfdHJ1bmNcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcm91bmQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9yb3VuZF9mbG9hdFwiIFwiY2FtbF9yb3VuZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2VpbF9mbG9hdFwiIFwiY2VpbFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb29yX2Zsb2F0XCIgXCJmbG9vclwiXG5bQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgaXNfaW50ZWdlciB4ID0geCA9IHRydW5jIHggJiYgaXNfZmluaXRlIHhcblxuZXh0ZXJuYWwgbmV4dF9hZnRlciA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gID0gXCJjYW1sX25leHRhZnRlcl9mbG9hdFwiIFwiY2FtbF9uZXh0YWZ0ZXJcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgc3VjYyB4ID0gbmV4dF9hZnRlciB4IGluZmluaXR5XG5sZXQgcHJlZCB4ID0gbmV4dF9hZnRlciB4IG5lZ19pbmZpbml0eVxuXG5leHRlcm5hbCBjb3B5X3NpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpZ25fYml0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGJvb2xcbiAgPSBcImNhbWxfc2lnbmJpdF9mbG9hdFwiIFwiY2FtbF9zaWduYml0XCIgW0BAbm9hbGxvY11cblxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbnR5cGUgdCA9IGZsb2F0XG5leHRlcm5hbCBjb21wYXJlIDogZmxvYXQgLT4gZmxvYXQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5sZXQgZXF1YWwgeCB5ID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldFtAaW5saW5lXSBtaW4gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuICBlbHNlIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIHlcblxubGV0W0BpbmxpbmVdIG1heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geCB0aGVuIHggZWxzZSB5XG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuXG5sZXRbQGlubGluZV0gbWluX21heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB8fCBpc19uYW4geSB0aGVuIChuYW4sIG5hbilcbiAgZWxzZSBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW4gKHgsIHkpIGVsc2UgKHksIHgpXG5cbmxldFtAaW5saW5lXSBtaW5fbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIHhcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuIHggZWxzZSB5XG5cbmxldFtAaW5saW5lXSBtYXhfbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIHlcbiAgZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSB4XG5cbmxldFtAaW5saW5lXSBtaW5fbWF4X251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB0aGVuICh5LHkpXG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiAoeCx4KVxuICBlbHNlIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlbiAoeCx5KSBlbHNlICh5LHgpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5cbm1vZHVsZSBBcnJheSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IGZsb2F0YXJyYXlcblxuICBleHRlcm5hbCBsZW5ndGggOiB0IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gdCA9IFwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiB0IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiB0IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcblxuICBsZXQgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGZvciBpID0gb2ZzIHRvIG9mcyArIGxlbiAtIDEgZG8gdW5zYWZlX3NldCBhIGkgdiBkb25lXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXQ6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0ID1cbiAgICBcImNhbWxfZmxvYXRhcnJheV9ibGl0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY2hlY2sgYSBvZnMgbGVuIG1zZyA9XG4gICAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyArIGxlbiA8IDAgfHwgb2ZzICsgbGVuID4gbGVuZ3RoIGEgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgbGV0IG1ha2UgbiB2ID1cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIG4gaW5cbiAgICB1bnNhZmVfZmlsbCByZXN1bHQgMCBuIHY7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGluaXQgbCBmID1cbiAgICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaW5pdFwiXG4gICAgZWxzZVxuICAgICAgbGV0IHJlcyA9IGNyZWF0ZSBsIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgICAgZG9uZTtcbiAgICAgIHJlc1xuXG4gIGxldCBtYWtlX21hdHJpeCBzeCBzeSB2ID1cbiAgICAoKiBXZSByYWlzZSBldmVuIGlmIFtzeCA9IDAgJiYgc3kgPCAwXTogKilcbiAgICBpZiBzeSA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5Lm1ha2VfbWF0cml4XCI7XG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2Ugc3ggKGNyZWF0ZSAwKSBpblxuICAgIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgICBmb3IgeCA9IDAgdG8gc3ggLSAxIGRvXG4gICAgICAgIEFycmF5LnVuc2FmZV9zZXQgcmVzIHggKG1ha2Ugc3kgdilcbiAgICAgIGRvbmU7XG4gICAgZW5kO1xuICAgIHJlc1xuXG4gIGxldCBpbml0X21hdHJpeCBzeCBzeSBmID1cbiAgICAoKiBXZSByYWlzZSBldmVuIGlmIFtzeCA9IDAgJiYgc3kgPCAwXTogKilcbiAgICBpZiBzeSA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5LmluaXRfbWF0cml4XCI7XG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2Ugc3ggKGNyZWF0ZSAwKSBpblxuICAgIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgICBmb3IgeCA9IDAgdG8gc3ggLSAxIGRvXG4gICAgICAgIGxldCByb3cgPSBjcmVhdGUgc3kgaW5cbiAgICAgICAgZm9yIHkgPSAwIHRvIHN5IC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgcm93IHkgKGYgeCB5KVxuICAgICAgICBkb25lO1xuICAgICAgICBBcnJheS51bnNhZmVfc2V0IHJlcyB4IHJvd1xuICAgICAgZG9uZTtcbiAgICBlbmQ7XG4gICAgcmVzXG5cbiAgbGV0IGFwcGVuZCBhMSBhMiA9XG4gICAgbGV0IGwxID0gbGVuZ3RoIGExIGluXG4gICAgbGV0IGwyID0gbGVuZ3RoIGEyIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAobDEgKyBsMikgaW5cbiAgICB1bnNhZmVfYmxpdCBhMSAwIHJlc3VsdCAwIGwxO1xuICAgIHVuc2FmZV9ibGl0IGEyIDAgcmVzdWx0IGwxIGwyO1xuICAgIHJlc3VsdFxuXG4gICgqIG5leHQgMyBmdW5jdGlvbnM6IG1vZGlmaWVkIGNvcHkgb2YgY29kZSBmcm9tIHN0cmluZy5tbCAqKVxuICBsZXQgZW5zdXJlX2dlICh4OmludCkgeSA9XG4gICAgaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuY29uY2F0XCJcblxuICBsZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIGFjYykgYWNjKSB0bFxuXG4gIGxldCBjb25jYXQgbCA9XG4gICAgbGV0IGxlbiA9IHN1bV9sZW5ndGhzIDAgbCBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgbGV0IHJlYyBsb29wIGwgaSA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IChpID0gbGVuKVxuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICBsZXQgaGxlbiA9IGxlbmd0aCBoZCBpblxuICAgICAgICB1bnNhZmVfYmxpdCBoZCAwIHJlc3VsdCBpIGhsZW47XG4gICAgICAgIGxvb3AgdGwgKGkgKyBobGVuKVxuICAgIGluXG4gICAgbG9vcCBsIDA7XG4gICAgcmVzdWx0XG5cbiAgbGV0IHN1YiBhIG9mcyBsZW4gPVxuICAgIGNoZWNrIGEgb2ZzIGxlbiBcIkZsb2F0LkFycmF5LnN1YlwiO1xuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgYSBvZnMgcmVzdWx0IDAgbGVuO1xuICAgIHJlc3VsdFxuXG4gIGxldCBjb3B5IGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGwgaW5cbiAgICB1bnNhZmVfYmxpdCBhIDAgcmVzdWx0IDAgbDtcbiAgICByZXN1bHRcblxuICBsZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gICAgY2hlY2sgYSBvZnMgbGVuIFwiRmxvYXQuQXJyYXkuZmlsbFwiO1xuICAgIHVuc2FmZV9maWxsIGEgb2ZzIGxlbiB2XG5cbiAgbGV0IGJsaXQgc3JjIHNvZnMgZHN0IGRvZnMgbGVuID1cbiAgICBjaGVjayBzcmMgc29mcyBsZW4gXCJGbG9hdC5hcnJheS5ibGl0XCI7XG4gICAgY2hlY2sgZHN0IGRvZnMgbGVuIFwiRmxvYXQuYXJyYXkuYmxpdFwiO1xuICAgIHVuc2FmZV9ibGl0IHNyYyBzb2ZzIGRzdCBkb2ZzIGxlblxuXG4gIGxldCB0b19saXN0IGEgPVxuICAgIExpc3QuaW5pdCAobGVuZ3RoIGEpICh1bnNhZmVfZ2V0IGEpXG5cbiAgbGV0IG9mX2xpc3QgbCA9XG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAoTGlzdC5sZW5ndGggbCkgaW5cbiAgICBsZXQgcmVjIGZpbGwgaSBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiByZXN1bHRcbiAgICAgIHwgaCA6OiB0IC0+IHVuc2FmZV9zZXQgcmVzdWx0IGkgaDsgZmlsbCAoaSArIDEpIHRcbiAgICBpblxuICAgIGZpbGwgMCBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBpdGVyIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlcjIgZiBhIGIgPVxuICAgIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaXRlcjI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgICBlbHNlXG4gICAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxuICBsZXQgbWFwIGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBtYXBfaW5wbGFjZSBmIGEgPVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgYSBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZVxuXG4gIGxldCBtYXAyIGYgYSBiID1cbiAgICBsZXQgbGEgPSBsZW5ndGggYSBpblxuICAgIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gICAgaWYgbGEgPD4gbGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5tYXAyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsYSAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXJpIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbiAgbGV0IG1hcGkgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgbWFwaV9pbnBsYWNlIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCBhIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmVcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gICAgZG9uZTtcbiAgICAhclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9sZF9yaWdodCBmIGEgeCA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgICByIDo9IGYgKHVuc2FmZV9nZXQgYSBpKSAhclxuICAgIGRvbmU7XG4gICAgIXJcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGV4aXN0cyBwIGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb3JfYWxsIHAgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiBsb29wIChpICsgMSlcbiAgICAgIGVsc2UgZmFsc2UgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG1lbSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYSBpKSB4ID0gMCB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ICopXG4gIGxldCBtZW1faWVlZSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHggPSAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZmluZF9vcHQgcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZpbmRfaW5kZXggcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIFNvbWUgaVxuICAgICAgZWxzZSBsb29wIChpICsgMSkgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZpbmRfbWFwIGYgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgICAgZWxzZVxuICAgICAgICBtYXRjaCBmICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICAgIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmaW5kX21hcGkgZiBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIG1hdGNoIGYgaSAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBleGNlcHRpb24gQm90dG9tIG9mIGludFxuICBsZXQgc29ydCBjbXAgYSA9XG4gICAgbGV0IG1heHNvbiBsIGkgPVxuICAgICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICAgIGxldCB4ID0gcmVmIGkzMSBpblxuICAgICAgaWYgaTMxKzIgPCBsIHRoZW4gYmVnaW5cbiAgICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgICBpZiBjbXAgKGdldCBhICF4KSAoZ2V0IGEgKGkzMSsyKSkgPCAwIHRoZW4geCA6PSBpMzErMjtcbiAgICAgICAgIXhcbiAgICAgIGVuZCBlbHNlXG4gICAgICAgIGlmIGkzMSsxIDwgbCAmJiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMFxuICAgICAgICB0aGVuIGkzMSsxXG4gICAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgICBpblxuICAgIGxldCByZWMgdHJpY2tsZWRvd24gbCBpIGUgPVxuICAgICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgICBpZiBjbXAgKGdldCBhIGopIGUgPiAwIHRoZW4gYmVnaW5cbiAgICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IHRyaWNrbGUgbCBpIGUgPSB0cnkgdHJpY2tsZWRvd24gbCBpIGUgd2l0aCBCb3R0b20gaSAtPiBzZXQgYSBpIGUgaW5cbiAgICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICBidWJibGVkb3duIGwgalxuICAgIGluXG4gICAgbGV0IGJ1YmJsZSBsIGkgPSB0cnkgYnViYmxlZG93biBsIGkgd2l0aCBCb3R0b20gaSAtPiBpIGluXG4gICAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICAgIGxldCBmYXRoZXIgPSAoaSAtIDEpIC8gMyBpblxuICAgICAgYXNzZXJ0IChpIDw+IGZhdGhlcik7XG4gICAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgYSBpIChnZXQgYSBmYXRoZXIpO1xuICAgICAgICBpZiBmYXRoZXIgPiAwIHRoZW4gdHJpY2tsZXVwIGZhdGhlciBlIGVsc2Ugc2V0IGEgMCBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGZvciBpID0gKGwgKyAxKSAvIDMgLSAxIGRvd250byAwIGRvIHRyaWNrbGUgbCBpIChnZXQgYSBpKTsgZG9uZTtcbiAgICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgICBsZXQgZSA9IChnZXQgYSBpKSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgMCk7XG4gICAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gICAgZG9uZTtcbiAgICBpZiBsID4gMSB0aGVuIChsZXQgZSA9IChnZXQgYSAxKSBpbiBzZXQgYSAxIChnZXQgYSAwKTsgc2V0IGEgMCBlKVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCwgZXhjZXB0IGZvciB0aGUgY2FsbCB0byBbY3JlYXRlXSAqKVxuICBsZXQgY3V0b2ZmID0gNVxuICBsZXQgc3RhYmxlX3NvcnQgY21wIGEgPVxuICAgIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgICBsZXQgc3JjMXIgPSBzcmMxb2ZzICsgc3JjMWxlbiBhbmQgc3JjMnIgPSBzcmMyb2ZzICsgc3JjMmxlbiBpblxuICAgICAgbGV0IHJlYyBsb29wIGkxIHMxIGkyIHMyIGQgPVxuICAgICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMxO1xuICAgICAgICAgIGxldCBpMSA9IGkxICsgMSBpblxuICAgICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSAoZ2V0IGEgaTEpIGkyIHMyIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMyO1xuICAgICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICAgIGlmIGkyIDwgc3JjMnIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSBzMSBpMiAoZ2V0IHNyYzIgaTIpIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IGEgaTEgZHN0IChkICsgMSkgKHNyYzFyIC0gaTEpXG4gICAgICAgIGVuZFxuICAgICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gICAgaW5cbiAgICBsZXQgaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgbGV0IGUgPSAoZ2V0IGEgKHNyY29mcyArIGkpKSBpblxuICAgICAgICBsZXQgaiA9IHJlZiAoZHN0b2ZzICsgaSAtIDEpIGluXG4gICAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgICBzZXQgZHN0ICghaiArIDEpIChnZXQgZHN0ICFqKTtcbiAgICAgICAgICBkZWNyIGo7XG4gICAgICAgIGRvbmU7XG4gICAgICAgIHNldCBkc3QgKCFqICsgMSkgZTtcbiAgICAgIGRvbmU7XG4gICAgaW5cbiAgICBsZXQgcmVjIHNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgaWYgbGVuIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgICBsZXQgbDIgPSBsZW4gLSBsMSBpblxuICAgICAgICBzb3J0dG8gKHNyY29mcyArIGwxKSBkc3QgKGRzdG9mcyArIGwxKSBsMjtcbiAgICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICAgIG1lcmdlIChzcmNvZnMgKyBsMikgbDEgZHN0IChkc3RvZnMgKyBsMSkgbDIgZHN0IGRzdG9mcztcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gMCBhIDAgbCBlbHNlIGJlZ2luXG4gICAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgICAgbGV0IGwyID0gbCAtIGwxIGluXG4gICAgICBsZXQgdCA9IGNyZWF0ZSBsMiBpblxuICAgICAgc29ydHRvIGwxIHQgMCBsMjtcbiAgICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgICBtZXJnZSBsMiBsMSB0IDAgbDIgYSAwO1xuICAgIGVuZFxuXG4gIGxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgc2h1ZmZsZSB+cmFuZCBhID0gKCogRmlzaGVyLVlhdGVzICopXG4gICAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDEgZG9cbiAgICAgIGxldCBqID0gcmFuZCAoaSArIDEpIGluXG4gICAgICBsZXQgdiA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICB1bnNhZmVfc2V0IGEgaiB2XG4gICAgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgdG9fc2VxIGEgPVxuICAgIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgICB0aGVuXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IHRvX3NlcWkgYSA9XG4gICAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICAgIHRoZW5cbiAgICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9yZXZfbGlzdCBsID1cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggbCBpblxuICAgIGxldCBhID0gY3JlYXRlIGxlbiBpblxuICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgW10gLT4gYVxuICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICBpblxuICAgIGZpbGwgKGxlbi0xKSBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9zZXEgaSA9XG4gICAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gICAgb2ZfcmV2X2xpc3QgbFxuXG5cbiAgbGV0IG1hcF90b19hcnJheSBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsID0gMCB0aGVuIFt8IHxdIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gQXJyYXkubWFrZSBsIChmICh1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgICAgQXJyYXkudW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG5cbiAgbGV0IG1hcF9mcm9tX2FycmF5IGYgYSA9XG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIChBcnJheS51bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbmVuZFxuXG5tb2R1bGUgQXJyYXlMYWJlbHMgPSBBcnJheVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9mbG9hdF9jb21wYXJlIiwiY2FtbF9mbG9hdGFycmF5X2JsaXQiLCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlIiwiY2FtbF9oYXNoIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX25leHRhZnRlcl9mbG9hdCIsImNhbWxfc2lnbmJpdF9mbG9hdCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU2VxIiwiU3RkbGliX0xpc3QiLCJBc3NlcnRfZmFpbHVyZSIsIlN0ZGxpYiIsImluZmluaXR5IiwibmVnX2luZmluaXR5IiwibmFuIiwiaXNfZmluaXRlIiwieCIsImlzX2luZmluaXRlIiwiaXNfbmFuIiwibWF4X2Zsb2F0IiwibWluX2Zsb2F0IiwiZXBzaWxvbiIsIm9mX3N0cmluZ19vcHQiLCJ0b19zdHJpbmciLCJpc19pbnRlZ2VyIiwic3VjYyIsInByZWQiLCJlcXVhbCIsInkiLCJtaW4iLCJtYXgiLCJtaW5fbWF4IiwibWluX251bSIsIm1heF9udW0iLCJtaW5fbWF4X251bSIsInNlZWRlZF9oYXNoIiwic2VlZCIsImhhc2giLCJ1bnNhZmVfZmlsbCIsImEiLCJvZnMiLCJsZW4iLCJ2IiwiaSIsImNoZWNrIiwibXNnIiwibWFrZSIsIm4iLCJyZXN1bHQiLCJpbml0IiwibCIsInJlcyIsIm1ha2VfbWF0cml4Iiwic3giLCJzeSIsImluaXRfbWF0cml4Iiwicm93IiwiYXBwZW5kIiwiYTIiLCJsMSIsImwyIiwiY3N0X2Zsb2F0X21sIiwiY29uY2F0IiwiYWNjIiwicGFyYW0iLCJ0bCIsImhkIiwiaGxlbiIsInN1YiIsImNvcHkiLCJmaWxsIiwiYmxpdCIsInNyYyIsInNvZnMiLCJkc3QiLCJkb2ZzIiwiY3N0X0Zsb2F0X2FycmF5X2JsaXQiLCJ0b19saXN0Iiwib2ZfbGlzdCIsInQiLCJoIiwiaXRlciIsIml0ZXIyIiwiYiIsIm1hcCIsInIiLCJtYXBfaW5wbGFjZSIsIm1hcDIiLCJsYSIsImxiIiwiaXRlcmkiLCJtYXBpIiwibWFwaV9pbnBsYWNlIiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImV4aXN0cyIsInAiLCJmb3JfYWxsIiwibWVtIiwibWVtX2llZWUiLCJmaW5kX29wdCIsImZpbmRfaW5kZXgiLCJmaW5kX21hcCIsImZpbmRfbWFwaSIsIkJvdHRvbSIsInNvcnQiLCJjbXAiLCJtYXhzb24iLCJpMzEiLCJlIiwiaiIsImV4biIsImZhdGhlciIsInN0YWJsZV9zb3J0IiwibWVyZ2UiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiIsInMxIiwiaTEiLCJpMiIsImQiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwic2h1ZmZsZSIsInJhbmQiLCJ0b19zZXEiLCJhdXgiLCJ0b19zZXFpIiwib2Zfc2VxIiwibWFwX3RvX2FycmF5IiwibWFwX2Zyb21fYXJyYXkiLCJTdGRsaWJfRmxvYXQiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMseUJBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7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QUFBQTtBQUFBLFNBQUExQyxJQUFBO0FBQUE7QUFBQSxNQUNpQjtBQUFBLGNBQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUUzQztBQUFBLEdBQUM7QUFBQTtBQUFBLElBQUFnRztBQUFBQSxNQXJrQnVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkRyQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdDcUM0RDtBQUFBO0FBQUEsRURyQzVEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTU5OTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvaW50MzIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbSW50MzJdOiAzMi1iaXQgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnIDogaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9uZWdcIlxuZXh0ZXJuYWwgYWRkIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hZGRcIlxuZXh0ZXJuYWwgc3ViIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9zdWJcIlxuZXh0ZXJuYWwgbXVsIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tdWxcIlxuZXh0ZXJuYWwgZGl2IDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9kaXZcIlxuZXh0ZXJuYWwgcmVtIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hbmRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX29yXCJcbmV4dGVybmFsIGxvZ3hvciA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2xzclwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogaW50MzIgLT4gaW50ID0gXCIlaW50MzJfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IGludDMyIC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDMyX3RvX2Zsb2F0XCIgXCJjYW1sX2ludDMyX3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQzMiAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCB6ZXJvID0gMGxcbmxldCBvbmUgPSAxbFxubGV0IG1pbnVzX29uZSA9IC0xbFxubGV0IHN1Y2MgbiA9IGFkZCBuIDFsXG5sZXQgcHJlZCBuID0gc3ViIG4gMWxcbmxldCBhYnMgbiA9IGlmIG4gPj0gMGwgdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBtaW5faW50ID0gMHg4MDAwMDAwMGxcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRmxcbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMWwpXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBtYXRjaCBTeXMud29yZF9zaXplIHdpdGhcbiAgfCAzMiAtPlxuICAgICAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgICAgIGZ1biBuIC0+XG4gICAgICAgIGlmIG4gPj0gMGwgJiYgbiA8PSBtYXhfaW50IHRoZW5cbiAgICAgICAgICBTb21lICh0b19pbnQgbilcbiAgICAgICAgZWxzZVxuICAgICAgICAgIE5vbmVcbiAgfCA2NCAtPlxuICAgICAgKCogU28gdGhhdCBpdCBjb21waWxlcyBpbiAzMi1iaXQgKilcbiAgICAgIGxldCBtYXNrID0gMHhGRkZGIGxzbCAxNiBsb3IgMHhGRkZGIGluXG4gICAgICBmdW4gbiAtPiBTb21lICh0b19pbnQgbiBsYW5kIG1hc2spXG4gIHwgXyAtPlxuICAgICAgYXNzZXJ0IGZhbHNlXG5cbmV4dGVybmFsIGZvcm1hdCA6IHN0cmluZyAtPiBpbnQzMiAtPiBzdHJpbmcgPSBcImNhbWxfaW50MzJfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50MzIgPSBcImNhbWxfaW50MzJfb2Zfc3RyaW5nXCJcblxubGV0IG9mX3N0cmluZ19vcHQgcyA9XG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBpbnQzMlxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IHggPSB5XG5cbmxldCB1bnNpZ25lZF9jb21wYXJlIG4gbSA9XG4gIGNvbXBhcmUgKHN1YiBuIG1pbl9pbnQpIChzdWIgbSBtaW5faW50KVxuXG5sZXQgdW5zaWduZWRfbHQgbiBtID1cbiAgc3ViIG4gbWluX2ludCA8IHN1YiBtIG1pbl9pbnRcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lIGJpdG5lc3MuXG4gICBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfbHQgbiBkIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9sdCByIGQgdGhlbiBxIGVsc2Ugc3VjYyBxXG5cbmxldCB1bnNpZ25lZF9yZW0gbiBkID1cbiAgc3ViIG4gKG11bCAodW5zaWduZWRfZGl2IG4gZCkgZClcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCAwIHhcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ncmVhdGVyZXF1YWwiLCJjYW1sX2hhc2giLCJjYW1sX2ludF9jb21wYXJlIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tdWwiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWIiLCJTdGRsaWJfU3lzIiwiQXNzZXJ0X2ZhaWx1cmUiLCJzdWNjIiwibiIsInByZWQiLCJhYnMiLCJsb2dub3QiLCJtYXRjaCIsIm1heF9pbnQiLCJ1bnNpZ25lZF90b19pbnQiLCJ0b19zdHJpbmciLCJvZl9zdHJpbmdfb3B0IiwicyIsImV4biIsImVxdWFsIiwidW5zaWduZWRfY29tcGFyZSIsIm0iLCJ5IiwieCIsInVuc2lnbmVkX2x0IiwibWluIiwibWF4IiwiemVybyIsIm9uZSIsInVuc2lnbmVkX2RpdiIsImQiLCJxIiwiciIsInVuc2lnbmVkX3JlbSIsInNlZWRlZF9oYXNoIiwic2VlZCIsImhhc2giLCJTdGRsaWJfSW50MzIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDK0NxQjtBQUFBLFlBQUFDLEtBQUFELEdBQ0E7QUFBQSxZQUFBRSxJQUFBRixHQUNOLDRDQUF5QjtBQUFBLFlBQUFHLE9BQUFILEdBR1g7QUFBQSxPQUFBSSxRRHBEN0I7QUFBQTtBQUFBO0FBQUEsS0FBQUMsVUN5RG9CO0FBQUEsS0FBQUM7QUFBQUEsT0FDZCxTQUFBTjtBQUFBQSxRQUNLLDhCQUFXO0FBQUEsU0FDWjtBQUFBLFFBRUE7QUFBQSxPQUFJO0FBQUE7QUFBQSxJRDlEZDtBQUFBLEtDb0VNO0FBQUE7QUFBQSxRQUFBTSxrQkFGQSxTQUFBTixHQUFTLG1CQUF5QjtBQUFBO0FBQUEsWUFBQU8sVUFBQVAsR0FLdEIsdUNBQWE7QUFBQSxZQUFBUSxjQUFBQztBQUFBQSxJQUs3QixZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTUQ1RVg7QUFBQSw4QkM2RW9CO0FBQUEsS0Q3RXBCO0FBQUE7QUFBQSxHQzZFd0I7QUFBQSxPQUFBQyxRRDdFeEI7QUFBQSxZQUFBQyxpQkFBQVosR0FBQWE7QUFBQUEsUUFBQUMsSUNxRjBCLG9CQUFBQyxJQUFoQjtBQUFBLElBSmtCLDZCQUlhO0FBQUE7QUFBQSxZQUFBQyxZQUFBaEIsR0FBQWE7QUFBQUEsSUFHdkMsNERBQTZCO0FBQUE7QUFBQSxZQUFBSSxJQUFBRixHQUFBRCxHQUVWLG1DQUFvQjtBQUFBLFlBQUFJLElBQUFILEdBQUFELEdBQ3BCLHNDQUFvQjtBQUFBLE9BQUFLLE9EM0Z6QyxHQUFBQyxNQUFBO0FBQUEsWUFBQUMsYUFBQXJCLEdBQUFzQjtBQUFBQSxJQ2lHSyx3QkFDRSxxQ0FJa0M7QUFBQSxRQUFBQyxJQUZsQix1Q0FBQUMsSUFDTDtBQUFBLElBQ1gsd0NBQWtDO0FBQUE7QUFBQSxZQUFBQyxhQUFBekIsR0FBQXNCO0FBQUFBLElBRzVCLFdBQUwsU0FBSywwQkFBcUI7QUFBQTtBQUFBLFlBQUFJLFlBQUFDLE1BQUFaLEdBSVQsa0NBQStCO0FBQUEsWUFBQWEsS0FBQWIsR0FDM0MsK0JBQTRCO0FBQUE7QUFBQSxJQUFBYztBQUFBQSxNRDlHekMiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxNjA5MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbnQ2NC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtJbnQ2NF06IDY0LWJpdCBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWcgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X25lZ1wiXG5leHRlcm5hbCBhZGQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FkZFwiXG5leHRlcm5hbCBzdWIgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X3N1YlwiXG5leHRlcm5hbCBtdWwgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X211bFwiXG5leHRlcm5hbCBkaXYgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2RpdlwiXG5leHRlcm5hbCByZW0gOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X21vZFwiXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FuZFwiXG5leHRlcm5hbCBsb2dvciA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfbHNyXCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQgOiBpbnQ2NCAtPiBpbnQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9vZl9mbG9hdFwiIFwiY2FtbF9pbnQ2NF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfdG9fZmxvYXRcIiBcImNhbWxfaW50NjRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMiA6IGludDMyIC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzIgOiBpbnQ2NCAtPiBpbnQzMiA9IFwiJWludDY0X3RvX2ludDMyXCJcbmV4dGVybmFsIG9mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX25hdGl2ZWludFwiXG5leHRlcm5hbCB0b19uYXRpdmVpbnQgOiBpbnQ2NCAtPiBuYXRpdmVpbnQgPSBcIiVpbnQ2NF90b19uYXRpdmVpbnRcIlxuXG5sZXQgemVybyA9IDBMXG5sZXQgb25lID0gMUxcbmxldCBtaW51c19vbmUgPSAtMUxcbmxldCBzdWNjIG4gPSBhZGQgbiAxTFxubGV0IHByZWQgbiA9IHN1YiBuIDFMXG5sZXQgYWJzIG4gPSBpZiBuID49IDBMIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgbWluX2ludCA9IDB4ODAwMDAwMDAwMDAwMDAwMExcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGTFxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xTClcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gIGZ1biBuIC0+XG4gICAgaWYgbiA+PSAwTCAmJiBuIDw9IG1heF9pbnQgdGhlblxuICAgICAgU29tZSAodG9faW50IG4pXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gaW50NjQgLT4gc3RyaW5nID0gXCJjYW1sX2ludDY0X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDY0ID0gXCJjYW1sX2ludDY0X29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50NjRfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbnR5cGUgdCA9IGludDY0XG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmxldCBlcXVhbCAoeDogdCkgKHk6IHQpID0geCA9IHlcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCB1bnNpZ25lZF9sdCBuIG0gPVxuICBzdWIgbiBtaW5faW50IDwgc3ViIG0gbWluX2ludFxuXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuKCogVW5zaWduZWQgZGl2aXNpb24gZnJvbSBzaWduZWQgZGl2aXNpb24gb2YgdGhlIHNhbWUgYml0bmVzcy5cbiAgIFNlZSBXYXJyZW4gSnIuLCBIZW5yeSBTLiAoMjAxMykuIEhhY2tlcidzIERlbGlnaHQgKDIgZWQuKSwgU2VjIDktMy5cbiopXG5sZXQgdW5zaWduZWRfZGl2IG4gZCA9XG4gIGlmIGQgPCB6ZXJvIHRoZW5cbiAgICBpZiB1bnNpZ25lZF9sdCBuIGQgdGhlbiB6ZXJvIGVsc2Ugb25lXG4gIGVsc2VcbiAgICBsZXQgcSA9IHNoaWZ0X2xlZnQgKGRpdiAoc2hpZnRfcmlnaHRfbG9naWNhbCBuIDEpIGQpIDEgaW5cbiAgICBsZXQgciA9IHN1YiBuIChtdWwgcSBkKSBpblxuICAgIGlmIHVuc2lnbmVkX2x0IHIgZCB0aGVuIHEgZWxzZSBzdWNjIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2dyZWF0ZXJlcXVhbCIsImNhbWxfaGFzaCIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9jb21wYXJlIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X211bCIsImNhbWxfaW50NjRfc3ViIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsInplcm8iLCJvbmUiLCJtaW51c19vbmUiLCJtaW5faW50IiwibWF4X2ludCIsIlN0ZGxpYiIsInN1Y2MiLCJuIiwicHJlZCIsImFicyIsImxvZ25vdCIsInVuc2lnbmVkX3RvX2ludCIsInRvX3N0cmluZyIsIm9mX3N0cmluZ19vcHQiLCJzIiwiZXhuIiwiY29tcGFyZSIsIngiLCJ5IiwiZXF1YWwiLCJ1bnNpZ25lZF9jb21wYXJlIiwibSIsInVuc2lnbmVkX2x0IiwibWluIiwibWF4IiwidW5zaWduZWRfZGl2IiwiZCIsInEiLCJyIiwidW5zaWduZWRfcmVtIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsNkJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxNQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDNkNhLDJCQUFRO0FBQUEsWUFBQUMsS0FBQUQsR0FDUiwyQkFBUTtBQUFBLFlBQUFFLElBQUFGO0FBQUFBLElBQ04scUNBQW9CLHlCQUFLO0FBQUE7QUFBQSxZQUFBRyxPQUFBSCxHQUd6QixtQ0FBYztBQUFBO0FBQUEsSUFBQUgsWUFHYjtBQUFBLFFBQ2Q7QUFBQSxZQUFBTyxnQkFBQUo7QUFBQUEsSUFDSyw4QkFBVztBQUFBLEtBQ1o7QUFBQSxJQUVBO0FBQUEsR0FBSTtBQUFBLFlBQUFLLFVBQUFMLEdBR1EseUNBQWE7QUFBQSxZQUFBTSxjQUFBQztBQUFBQSxJQUs3QixZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTURsRVg7QUFBQSw4QkNtRW9CO0FBQUEsS0RuRXBCO0FBQUE7QUFBQSxHQ21Fd0I7QUFBQSxZQUFBQyxRQUFBQyxHQUFBQyxHQVdJLCtCQUFrQjtBQUFBLE9BQUFDLFFBeEI1QztBQUFBLFlBQUFDLGlCQUFBYixHQUFBYztBQUFBQSxRQUFBSCxJQTRCd0IsNEJBQUFELElBQWhCO0FBQUEsSUFKa0IsK0JBSWE7QUFBQTtBQUFBLFlBQUFLLFlBQUFmLEdBQUFjO0FBQUFBLElBR3ZDO0FBQUEseUNBQWdCLDJCQUFhO0FBQUE7QUFBQSxZQUFBRSxJQUFBTixHQUFBQyxHQUVWLG1DQUFvQjtBQUFBLFlBQUFNLElBQUFQLEdBQUFDLEdBQ3BCLHNDQUFvQjtBQUFBLFlBQUFPLGFBQUFsQixHQUFBbUI7QUFBQUEsSUFNcEMsMkJBQ0UscUNBSWtDO0FBQUE7QUFBQSxLQUFBQztBQUFBQSxPQUY3QjtBQUFBLFNBQVc7QUFBQSxXQUFLO0FBQUE7QUFBQSxLQUFBQyxJQUNoQixrQkFBTTtBQUFBLElBQ1gsK0JBdERNLG9CQXNENEI7QUFBQTtBQUFBLFlBQUFDLGFBQUF0QixHQUFBbUI7QUFBQUEsSUFHNUIsT0FBWCxrQkFBTSxlQUFLLHVCQUFxQjtBQUFBO0FBQUEsWUFBQUksWUFBQUMsTUFBQWQsR0FJVCxrQ0FBK0I7QUFBQSxZQUFBZSxLQUFBZixHQUMzQywrQkFBNEI7QUFBQSxHQXJEdkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEdERGIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTYxOTksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvbmF0aXZlaW50Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW05hdGl2ZWludF06IHByb2Nlc3Nvci1uYXRpdmUgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X25lZ1wiXG5leHRlcm5hbCBhZGQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FkZFwiXG5leHRlcm5hbCBzdWI6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X3N1YlwiXG5leHRlcm5hbCBtdWw6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X211bFwiXG5leHRlcm5hbCBkaXY6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2RpdlwiXG5leHRlcm5hbCByZW06IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X21vZFwiXG5leHRlcm5hbCBsb2dhbmQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FuZFwiXG5leHRlcm5hbCBsb2dvcjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNsXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0OiBuYXRpdmVpbnQgLT4gaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNyXCJcbmV4dGVybmFsIG9mX2ludDogaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50OiBuYXRpdmVpbnQgLT4gaW50ID0gXCIlbmF0aXZlaW50X3RvX2ludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IG5hdGl2ZWludFxuICA9IFwiY2FtbF9uYXRpdmVpbnRfb2ZfZmxvYXRcIiBcImNhbWxfbmF0aXZlaW50X29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBuYXRpdmVpbnQgLT4gZmxvYXRcbiAgPSBcImNhbWxfbmF0aXZlaW50X3RvX2Zsb2F0XCIgXCJjYW1sX25hdGl2ZWludF90b19mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG9mX2ludDMyOiBpbnQzMiAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzI6IG5hdGl2ZWludCAtPiBpbnQzMiA9IFwiJW5hdGl2ZWludF90b19pbnQzMlwiXG5cbmxldCB6ZXJvID0gMG5cbmxldCBvbmUgPSAxblxubGV0IG1pbnVzX29uZSA9IC0xblxubGV0IHN1Y2MgbiA9IGFkZCBuIDFuXG5sZXQgcHJlZCBuID0gc3ViIG4gMW5cbmxldCBhYnMgbiA9IGlmIG4gPj0gMG4gdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBzaXplID0gU3lzLndvcmRfc2l6ZVxubGV0IG1pbl9pbnQgPSBzaGlmdF9sZWZ0IDFuIChzaXplIC0gMSlcbmxldCBtYXhfaW50ID0gc3ViIG1pbl9pbnQgMW5cbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMW4pXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBsZXQgbWF4X2ludCA9IG9mX2ludCBTdGRsaWIubWF4X2ludCBpblxuICBmdW4gbiAtPlxuICAgIGlmIG4gPj0gMG4gJiYgbiA8PSBtYXhfaW50IHRoZW5cbiAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IG5hdGl2ZWludCAtPiBzdHJpbmcgPSBcImNhbWxfbmF0aXZlaW50X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nOiBzdHJpbmcgLT4gbmF0aXZlaW50ID0gXCJjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgdHJ5IFNvbWUgKG9mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbnR5cGUgdCA9IG5hdGl2ZWludFxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IHVuc2lnbmVkX2x0IG4gbSA9XG4gIHN1YiBuIG1pbl9pbnQgPCBzdWIgbSBtaW5faW50XG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZSBiaXRuZXNzLlxuICAgU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2x0IG4gZCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfbHQgciBkIHRoZW4gcSBlbHNlIHN1Y2MgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZ3JlYXRlcmVxdWFsIiwiY2FtbF9oYXNoIiwiY2FtbF9pbnRfY29tcGFyZSIsImNhbWxfbGVzc2VxdWFsIiwiY2FtbF9sZXNzdGhhbiIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbXVsIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX1N5cyIsInN1Y2MiLCJuIiwicHJlZCIsImFicyIsInNpemUiLCJtaW5faW50IiwibWF4X2ludCIsImxvZ25vdCIsInVuc2lnbmVkX3RvX2ludCIsInRvX3N0cmluZyIsIm9mX3N0cmluZ19vcHQiLCJzIiwiZXhuIiwiZXF1YWwiLCJ4IiwieSIsInVuc2lnbmVkX2NvbXBhcmUiLCJtIiwidW5zaWduZWRfbHQiLCJtaW4iLCJtYXgiLCJ6ZXJvIiwib25lIiwidW5zaWduZWRfZGl2IiwiZCIsInEiLCJyIiwidW5zaWduZWRfcmVtIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDMkNxQjtBQUFBLFlBQUFDLEtBQUFELEdBQ0E7QUFBQSxZQUFBRSxJQUFBRixHQUNOLDRDQUF5QjtBQUFBO0FBQUEsSUFBQUcsT0Q3Q3hDO0FBQUEsSUFBQUMsVUMrQ2M7QUFBQSxJQUFBQyxVQUNBO0FBQUEsWUFBQUMsT0FBQU4sR0FDZTtBQUFBLE9BQUFLLFlBR2I7QUFBQSxZQUFBRSxnQkFBQVA7QUFBQUEsSUFFVCw4QkFBVyw4QkFDWjtBQUFBLElBRUE7QUFBQSxHQUFJO0FBQUEsWUFBQVEsVUFBQVIsR0FHUSx1Q0FBYTtBQUFBLFlBQUFTLGNBQUFDO0FBQUFBLElBSzdCLFlBQVM7QUFBQSxVQUFBQztBQUFBQSxTQUFBQSxNRGpFWDtBQUFBLDhCQ2tFb0I7QUFBQSxLRGxFcEI7QUFBQTtBQUFBLEdDa0V3QjtBQUFBLFlBQUFDLE1BQUFDLEdBQUFDLEdBSUksMkNBQ1MsQ0FBSTtBQUFBLFlBQUFDLGlCQUFBZixHQUFBZ0I7QUFBQUEsUUFBQUYsSUFHZixpQkFBQUQsSUFBaEI7QUFBQSxJQUprQiw2QkFJYTtBQUFBO0FBQUEsWUFBQUksWUFBQWpCLEdBQUFnQjtBQUFBQSxJQUd2QyxzREFBNkI7QUFBQTtBQUFBLFlBQUFFLElBQUFMLEdBQUFDLEdBRVYsbUNBQW9CO0FBQUEsWUFBQUssSUFBQU4sR0FBQUMsR0FDcEIsc0NBQW9CO0FBQUEsT0FBQU0sT0RoRnpDLEdBQUFDLE1BQUE7QUFBQSxZQUFBQyxhQUFBdEIsR0FBQXVCO0FBQUFBLElDc0ZLLHdCQUNFLHFDQUlrQztBQUFBLFFBQUFDLElBRmxCLHVDQUFBQyxJQUNMO0FBQUEsSUFDWCx3Q0FBa0M7QUFBQTtBQUFBLFlBQUFDLGFBQUExQixHQUFBdUI7QUFBQUEsSUFHNUIsV0FBTCxTQUFLLDBCQUFxQjtBQUFBO0FBQUEsWUFBQUksWUFBQUMsTUFBQWYsR0FJVCxrQ0FBK0I7QUFBQSxZQUFBZ0IsS0FBQWhCLEdBQzNDLCtCQUE0QjtBQUFBLEdBOUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHJERiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjE2MjkwLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2J1ZmZlci5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgIFBpZXJyZSBXZWlzIGFuZCBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTkgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogRXh0ZW5zaWJsZSBidWZmZXJzICopXG5cbigqIFRoZSBbaW5uZXJfYnVmZmVyXSB0eXBlIGVuc3VyZXMgdGhhdCB0aGUgW2xlbmd0aF0gYW5kIFtidWZmZXJdIGZpZWxkcyBhcmVcbiAgIGFsd2F5cyBzeW5jaHJvbml6ZWQsIFtsZW5ndGggPSBCeXRlcy5sZW5ndGggYnVmZmVyXSwgZXZlbiBpbiBwcmVzZW5jZVxuICAgb2YgZGF0YSByYWNlcy5cbiopXG50eXBlIGlubmVyX2J1ZmZlciA9IHtcbiAgYnVmZmVyOiBieXRlcztcbiAgbGVuZ3RoOiBpbnQ7XG59XG5cbnR5cGUgdCA9XG4ge211dGFibGUgaW5uZXIgOiBpbm5lcl9idWZmZXI7XG4gIG11dGFibGUgcG9zaXRpb24gOiBpbnQ7XG4gIGluaXRpYWxfYnVmZmVyIDogYnl0ZXN9XG4oKiBJbnZhcmlhbnRzOiBhbGwgcGFydHMgb2YgdGhlIGNvZGUgcHJlc2VydmUgdGhlIGludmFyaWFudHMgdGhhdDpcbiAgIC0gW2lubmVyLmxlbmd0aCA9IEJ5dGVzLmxlbmd0aCBpbm5lci5idWZmZXJdXG4gICBJbiBhYnNlbmNlIG9mIGRhdGEgcmFjZXMsIHdlIGFsc28gaGF2ZVxuICAgLSBbMCA8PSBiLnBvc2l0aW9uIDw9IGIuaW5uZXIubGVuZ3RoXVxuXG4gICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBbYi5wb3NpdGlvbiA9IGIuaW5uZXIubGVuZ3RoXSBpcyBsZWdhbCxcbiAgIGl0IG1lYW5zIHRoYXQgdGhlIGJ1ZmZlciBpcyBmdWxsIGFuZCB3aWxsIGhhdmUgdG8gYmUgZXh0ZW5kZWRcbiAgIGJlZm9yZSBhbnkgZnVydGhlciBhZGRpdGlvbi4gKilcblxubGV0IGNyZWF0ZSBuID1cbiBsZXQgbiA9IGlmIG4gPCAxIHRoZW4gMSBlbHNlIG4gaW5cbiBsZXQgbiA9IGlmIG4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiBTeXMubWF4X3N0cmluZ19sZW5ndGggZWxzZSBuIGluXG4gbGV0IHMgPSBCeXRlcy5jcmVhdGUgbiBpblxuIHsgaW5uZXIgPSB7IGJ1ZmZlciA9IHM7IGxlbmd0aCA9IG59OyBwb3NpdGlvbiA9IDA7IGluaXRpYWxfYnVmZmVyID0gc31cblxubGV0IGNvbnRlbnRzIGIgPSBCeXRlcy5zdWJfc3RyaW5nIGIuaW5uZXIuYnVmZmVyIDAgYi5wb3NpdGlvblxubGV0IHRvX2J5dGVzIGIgPSBCeXRlcy5zdWIgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBzdWIgYiBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGIucG9zaXRpb24gLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5zdWJcIlxuICBlbHNlIEJ5dGVzLnN1Yl9zdHJpbmcgYi5pbm5lci5idWZmZXIgb2ZzIGxlblxuXG5cbmxldCBibGl0IHNyYyBzcmNvZmYgZHN0IGRzdG9mZiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IHNyY29mZiA8IDAgfHwgc3Jjb2ZmID4gc3JjLnBvc2l0aW9uIC0gbGVuXG4gICAgICAgICAgICAgfHwgZHN0b2ZmIDwgMCB8fCBkc3RvZmYgPiAoQnl0ZXMubGVuZ3RoIGRzdCkgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5ibGl0XCJcbiAgZWxzZVxuICAgIEJ5dGVzLmJsaXQgc3JjLmlubmVyLmJ1ZmZlciBzcmNvZmYgZHN0IGRzdG9mZiBsZW5cblxuXG5sZXQgbnRoIGIgb2ZzID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBpZiBvZnMgPCAwIHx8IG9mcyA+PSBwb3NpdGlvbiB8fCBwb3NpdGlvbiA+IGxlbmd0aCB0aGVuXG4gICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5udGhcIlxuICBlbHNlIEJ5dGVzLnVuc2FmZV9nZXQgYnVmZmVyIG9mc1xuXG5cbmxldCBsZW5ndGggYiA9IGIucG9zaXRpb25cblxubGV0IGNsZWFyIGIgPSBiLnBvc2l0aW9uIDwtIDBcblxubGV0IHJlc2V0IGIgPVxuICBiLnBvc2l0aW9uIDwtIDA7XG4gIGxldCBpbm5lciA9XG4gICAgeyBidWZmZXIgPSBiLmluaXRpYWxfYnVmZmVyOyBsZW5ndGggPSBCeXRlcy5sZW5ndGggYi5pbml0aWFsX2J1ZmZlciB9XG4gIGluXG4gIGIuaW5uZXIgPC0gaW5uZXJcblxuKCogW3Jlc2l6ZSBiIG1vcmVdIGVuc3VyZXMgdGhhdCBbYi5wb3NpdGlvbiArIG1vcmUgPD0gYi5pbm5lci5sZW5ndGhdIGhvbGRzXG4gICBieSBkeW5hbWljYWxseSBleHRlbmRpbmcgW2IuaW5uZXJdIGlmIG5lY2Vzc2FyeSAtLSBhbmQgdGh1c1xuICAgaW5jcmVhc2luZyBbYi5pbm5lci5sZW5ndGhdLlxuKilcbmxldCByZXNpemUgYiBtb3JlID1cbiAgbGV0IG9sZF9wb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCBvbGRfbGVuID0gYi5pbm5lci5sZW5ndGggaW5cbiAgbGV0IG5ld19sZW4gPSByZWYgb2xkX2xlbiBpblxuICB3aGlsZSBvbGRfcG9zICsgbW9yZSA+ICFuZXdfbGVuIGRvIG5ld19sZW4gOj0gMiAqICFuZXdfbGVuIGRvbmU7XG4gIGlmICFuZXdfbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gYmVnaW5cbiAgICBpZiBvbGRfcG9zICsgbW9yZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICB0aGVuIG5ld19sZW4gOj0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgZWxzZSBmYWlsd2l0aCBcIkJ1ZmZlci5hZGQ6IGNhbm5vdCBncm93IGJ1ZmZlclwiXG4gIGVuZDtcbiAgbGV0IG5ld19idWZmZXIgPSBCeXRlcy5jcmVhdGUgIW5ld19sZW4gaW5cbiAgKCogUFIjNjE0ODogbGV0J3Mga2VlcCB1c2luZyBbYmxpdF0gcmF0aGVyIHRoYW4gW3Vuc2FmZV9ibGl0XSBpblxuICAgICB0aGlzIHRyaWNreSBmdW5jdGlvbiB0aGF0IGlzIHNsb3cgYW55d2F5LiAqKVxuICBCeXRlcy5ibGl0IGIuaW5uZXIuYnVmZmVyIDAgbmV3X2J1ZmZlciAwIGIucG9zaXRpb247XG4gIGIuaW5uZXIgPC0geyBidWZmZXIgPSBuZXdfYnVmZmVyOyBsZW5ndGggPSAhbmV3X2xlbiB9XG5cbigqIE5vdGU6XG4gICAgU29tZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGhhdmUgYSBmYXN0IHBhdGggd2hlbiB0aGUgaW5uZXJcbiAgYnVmZmVyIGRvZXNuJ3QgbmVlZCB0byBiZSBleHRlbmRlZC5cbiAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB1bnNhZmUgYWNjZXNzZXMgb24gdGhlXG4gIGNvbnRlbnRzIG9mIHRoZSBbaW5uZXJdIGZpZWxkIHNpbmNlIGl0cyBmaWVsZHMgYXJlIGltbXV0YWJsZS5cbiAgSW4gcHJlc2VuY2Ugb2YgZGF0YSByYWNlcywgd2UgbWF5IGFjY2VzcyB0aGUgd3JvbmcgaW5uZXIgYnVmZmVyLCBidXQgd2VcbiAgd2lsbCB1c2UgdGhpcyBidWZmZXIgc2FmZWx5LlxuICBBcyBzb29uIGFzIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBidWZmZXIsIHdlIGZhbGwgYmFjayB0byBzYWZlIGFjY2Vzc2VzLlxuKilcblxubGV0IGFkZF9jaGFyIGIgYyA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyO2xlbmd0aH0gPSBiLmlubmVyIGluXG4gIGlmIHBvcyA+PSBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMTtcbiAgICBCeXRlcy5zZXQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBjXG4gICkgZWxzZVxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgYnVmZmVyIHBvcyBjO1xuICBiLnBvc2l0aW9uIDwtIHBvcyArIDFcblxubGV0IHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heCA9IDRcbmxldCB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4ID0gNFxuXG5sZXQgcmVjIGFkZF91dGZfOF91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl84X3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl84X3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgcmVjIGFkZF91dGZfMTZiZV91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfMTZiZV91Y2hhciBiLmlubmVyLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzE2YmVfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCByZWMgYWRkX3V0Zl8xNmxlX3VjaGFyIGIgdSA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGlmIHBvcyA+PSBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl8xNmxlX3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfMTZsZV91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IGFkZF9zdWJzdHJpbmcgYiBzIG9mZnNldCBsZW4gPVxuICBpZiBvZmZzZXQgPCAwIHx8IGxlbiA8IDAgfHwgb2Zmc2V0ID4gU3RyaW5nLmxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX3N1YnN0cmluZy9hZGRfc3ViYnl0ZXNcIjtcbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyBsZW4gaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIGxlbjtcbiAgICBCeXRlcy5ibGl0X3N0cmluZyBzIG9mZnNldCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlblxuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyBvZmZzZXQgYnVmZmVyIHBvc2l0aW9uIGxlbjtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9zdWJieXRlcyBiIHMgb2Zmc2V0IGxlbiA9XG4gIGFkZF9zdWJzdHJpbmcgYiAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzKSBvZmZzZXQgbGVuXG5cbmxldCBhZGRfc3RyaW5nIGIgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjsgbGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiBsZW47XG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcyAwIGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gbGVuO1xuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyAwIGJ1ZmZlciBwb3NpdGlvbiBsZW47XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfYnl0ZXMgYiBzID0gYWRkX3N0cmluZyBiIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHMpXG5cbmxldCBhZGRfYnVmZmVyIGIgYnMgPVxuICBhZGRfc3ViYnl0ZXMgYiBicy5pbm5lci5idWZmZXIgMCBicy5wb3NpdGlvblxuXG4oKiB0aGlzIChwcml2YXRlKSBmdW5jdGlvbiBjb3VsZCBtb3ZlIGludG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgKilcbmxldCByZWFsbHlfaW5wdXRfdXBfdG8gaWMgYnVmIG9mcyBsZW4gPVxuICBsZXQgcmVjIGxvb3AgaWMgYnVmIH5hbHJlYWR5X3JlYWQgfm9mcyB+dG9fcmVhZCA9XG4gICAgaWYgdG9fcmVhZCA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGlucHV0IGljIGJ1ZiBvZnMgdG9fcmVhZCBpblxuICAgICAgaWYgciA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGFscmVhZHlfcmVhZCA9IGFscmVhZHlfcmVhZCArIHIgaW5cbiAgICAgICAgbGV0IG9mcyA9IG9mcyArIHIgaW5cbiAgICAgICAgbGV0IHRvX3JlYWQgPSB0b19yZWFkIC0gciBpblxuICAgICAgICBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkIH5vZnMgfnRvX3JlYWRcbiAgICAgIGVuZFxuICAgIGVuZFxuICBpbiBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkOjAgfm9mcyB+dG9fcmVhZDpsZW5cblxuXG5sZXQgdW5zYWZlX2FkZF9jaGFubmVsX3VwX3RvIGIgaWMgbGVuID1cbiAgaWYgYi5wb3NpdGlvbiArIGxlbiA+IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgbGVuO1xuICBsZXQgbiA9IHJlYWxseV9pbnB1dF91cF90byBpYyBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlbiBpblxuICBiLnBvc2l0aW9uIDwtIGIucG9zaXRpb24gKyBuO1xuICBuXG5cbmxldCBhZGRfY2hhbm5lbCBiIGljIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gICAoKiBQUiM1MDA0ICopXG4gICAgaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX2NoYW5uZWxcIjtcbiAgbGV0IG4gPSB1bnNhZmVfYWRkX2NoYW5uZWxfdXBfdG8gYiBpYyBsZW4gaW5cbiAgKCogSXQgaXMgaW50ZW50aW9uYWwgdGhhdCBhIGNvbnN1bWVyIGNhdGNoaW5nIEVuZF9vZl9maWxlXG4gICAgIHdpbGwgc2VlIHRoZSBkYXRhIHdyaXR0ZW4gKHNlZSAjNjcxOSwgIzcxMzYpLiAqKVxuICBpZiBuIDwgbGVuIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGU7XG4gICgpXG5cbmxldCBvdXRwdXRfYnVmZmVyIG9jIGIgPVxuICBvdXRwdXQgb2MgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBjbG9zaW5nID0gZnVuY3Rpb25cbiAgfCAnKCcgLT4gJyknXG4gIHwgJ3snIC0+ICd9J1xuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbigqIG9wZW5pbmcgYW5kIGNsb3Npbmc6IG9wZW4gYW5kIGNsb3NlIGNoYXJhY3RlcnMsIHR5cGljYWxseSAoIGFuZCApXG4gICBrOiBiYWxhbmNlIG9mIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnNcbiAgIHM6IHRoZSBzdHJpbmcgd2hlcmUgd2UgYXJlIHNlYXJjaGluZ1xuICAgc3RhcnQ6IHRoZSBpbmRleCB3aGVyZSB3ZSBzdGFydCB0aGUgc2VhcmNoLiAqKVxubGV0IGFkdmFuY2VfdG9fY2xvc2luZyBvcGVuaW5nIGNsb3NpbmcgayBzIHN0YXJ0ID1cbiAgbGV0IHJlYyBhZHZhbmNlIGsgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgICBpZiBzLltpXSA9IG9wZW5pbmcgdGhlbiBhZHZhbmNlIChrICsgMSkgKGkgKyAxKSBsaW0gZWxzZVxuICAgIGlmIHMuW2ldID0gY2xvc2luZyB0aGVuXG4gICAgICBpZiBrID0gMCB0aGVuIGkgZWxzZSBhZHZhbmNlIChrIC0gMSkgKGkgKyAxKSBsaW1cbiAgICBlbHNlIGFkdmFuY2UgayAoaSArIDEpIGxpbSBpblxuICBhZHZhbmNlIGsgc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxubGV0IGFkdmFuY2VfdG9fbm9uX2FscGhhIHMgc3RhcnQgPVxuICBsZXQgcmVjIGFkdmFuY2UgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gbGltIGVsc2VcbiAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgfCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgLT4gYWR2YW5jZSAoaSArIDEpIGxpbVxuICAgIHwgXyAtPiBpIGluXG4gIGFkdmFuY2Ugc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxuKCogV2UgYXJlIGp1c3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBpZGVudCBpbiBzLCBzdGFydGluZyBhdCBzdGFydC4gKilcbmxldCBmaW5kX2lkZW50IHMgc3RhcnQgbGltID1cbiAgaWYgc3RhcnQgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgbWF0Y2ggcy5bc3RhcnRdIHdpdGhcbiAgKCogUGFyZW50aGVzaXplZCBpZGVudCA/ICopXG4gIHwgJygnIHwgJ3snIGFzIGMgLT5cbiAgICAgbGV0IG5ld19zdGFydCA9IHN0YXJ0ICsgMSBpblxuICAgICBsZXQgc3RvcCA9IGFkdmFuY2VfdG9fY2xvc2luZyBjIChjbG9zaW5nIGMpIDAgcyBuZXdfc3RhcnQgaW5cbiAgICAgU3RyaW5nLnN1YiBzIG5ld19zdGFydCAoc3RvcCAtIHN0YXJ0IC0gMSksIHN0b3AgKyAxXG4gICgqIFJlZ3VsYXIgaWRlbnQgKilcbiAgfCBfIC0+XG4gICAgIGxldCBzdG9wID0gYWR2YW5jZV90b19ub25fYWxwaGEgcyBzdGFydCBpblxuICAgICBpZiBzdG9wID0gc3RhcnQgdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICAgICBTdHJpbmcuc3ViIHMgc3RhcnQgKHN0b3AgLSBzdGFydCksIHN0b3BcblxuKCogU3Vic3RpdHV0ZSAkaWRlbnQsICQoaWRlbnQpLCBvciAke2lkZW50fSBpbiBzLFxuICAgIGFjY29yZGluZyB0byB0aGUgZnVuY3Rpb24gbWFwcGluZyBmLiAqKVxubGV0IGFkZF9zdWJzdGl0dXRlIGIgZiBzID1cbiAgbGV0IGxpbSA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIHN1YnN0IHByZXZpb3VzIGkgPVxuICAgIGlmIGkgPCBsaW0gdGhlbiBiZWdpblxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnJCcgYXMgY3VycmVudCB3aGVuIHByZXZpb3VzID0gJ1xcXFwnIC0+XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCAnICcgKGkgKyAxKVxuICAgICAgfCAnJCcgLT5cbiAgICAgICAgIGxldCBqID0gaSArIDEgaW5cbiAgICAgICAgIGJlZ2luIG1hdGNoIGZpbmRfaWRlbnQgcyBqIGxpbSB3aXRoXG4gICAgICAgICB8IGlkZW50LCBuZXh0X2kgLT5cbiAgICAgICAgICAgYWRkX3N0cmluZyBiIChmIGlkZW50KTtcbiAgICAgICAgICAgc3Vic3QgJyAnIG5leHRfaVxuICAgICAgICAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+XG4gICAgICAgICAgIGFkZF9jaGFyIGIgJyQnO1xuICAgICAgICAgICBzdWJzdCAnICcgalxuICAgICAgICAgZW5kXG4gICAgICB8IGN1cnJlbnQgLT5cbiAgICAgICAgIGlmIHByZXZpb3VzID0gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBwcmV2aW91cztcbiAgICAgICAgIGlmIGN1cnJlbnQgPD4gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgY3VycmVudCAoaSArIDEpXG4gICAgZW5kIGVsc2VcbiAgICBpZiBwcmV2aW91cyA9ICdcXFxcJyB0aGVuIGFkZF9jaGFyIGIgcHJldmlvdXMgaW5cbiAgc3Vic3QgJyAnIDBcblxubGV0IHRydW5jYXRlIGIgbGVuID1cbiAgICBpZiBsZW4gPCAwIHx8IGxlbiA+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiQnVmZmVyLnRydW5jYXRlXCJcbiAgICBlbHNlXG4gICAgICBiLnBvc2l0aW9uIDwtIGxlblxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgYWRkX3NlcSBiIHNlcSA9IFNlcS5pdGVyIChhZGRfY2hhciBiKSBzZXFcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGIgPSBjcmVhdGUgMzIgaW5cbiAgYWRkX3NlcSBiIGk7XG4gIGJcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDE2IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQxNnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NHVcIlxuZXh0ZXJuYWwgc2V0X2ludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG5leHRlcm5hbCBzZXRfaW50MTYgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDE2XCJcbmV4dGVybmFsIHNldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMlwiXG5leHRlcm5hbCBzZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjRcIlxuXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5cbmxldCBhZGRfaW50OCBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyAxIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiAxO1xuICAgIHNldF9pbnQ4IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDggYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgMiBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMjtcbiAgICBzZXRfaW50MTYgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MTYgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MzJfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgNCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgNDtcbiAgICBzZXRfaW50MzIgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MzIgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50NjRfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgOCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgODtcbiAgICBzZXRfaW50NjQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50NjQgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbGUgYiB4ID1cbiAgYWRkX2ludDE2X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDE2X2JlIGIgeCA9XG4gIGFkZF9pbnQxNl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwMTYgeClcblxubGV0IGFkZF9pbnQzMl9sZSBiIHggPVxuICBhZGRfaW50MzJfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50MzJfYmUgYiB4ID1cbiAgYWRkX2ludDMyX25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXAzMiB4KVxuXG5sZXQgYWRkX2ludDY0X2xlIGIgeCA9XG4gIGFkZF9pbnQ2NF9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQ2NF9iZSBiIHggPVxuICBhZGRfaW50NjRfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDY0IHgpXG5cbmxldCBhZGRfdWludDggPSBhZGRfaW50OFxubGV0IGFkZF91aW50MTZfbmUgPSBhZGRfaW50MTZfbmVcbmxldCBhZGRfdWludDE2X2xlID0gYWRkX2ludDE2X2xlXG5sZXQgYWRkX3VpbnQxNl9iZSA9IGFkZF9pbnQxNl9iZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2JsaXRfc3RyaW5nIiwiY2FtbF9ic3dhcDE2IiwiY2FtbF9ieXRlc19nZXQiLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ieXRlc19zZXQ2NCIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQnl0ZXMiLCJTdGRsaWJfU3lzIiwiU3RkbGliX1NlcSIsIlN0ZGxpYiIsIlN0ZGxpYl9TdHJpbmciLCJBc3NlcnRfZmFpbHVyZSIsImR1bW15IiwiY3JlYXRlIiwibiIsInMiLCJjb250ZW50cyIsImIiLCJ0b19ieXRlcyIsInN1YiIsIm9mcyIsImxlbiIsImJsaXQiLCJzcmMiLCJzcmNvZmYiLCJkc3QiLCJkc3RvZmYiLCJudGgiLCJwb3NpdGlvbiIsIm1hdGNoIiwibGVuZ3RoIiwiYnVmZmVyIiwiY2xlYXIiLCJyZXNldCIsImlubmVyIiwicmVzaXplIiwibW9yZSIsIm9sZF9wb3MiLCJvbGRfbGVuIiwibmV3X2xlbiIsIm5ld19idWZmZXIiLCJhZGRfY2hhciIsImMiLCJwb3MiLCJhZGRfdXRmXzhfdWNoYXIiLCJ1IiwidWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4IiwidWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heCIsImFkZF91dGZfMTZiZV91Y2hhciIsImFkZF91dGZfMTZsZV91Y2hhciIsImFkZF9zdWJzdHJpbmciLCJvZmZzZXQiLCJuZXdfcG9zaXRpb24iLCJhZGRfc3ViYnl0ZXMiLCJhZGRfc3RyaW5nIiwiYWRkX2J5dGVzIiwiYWRkX2J1ZmZlciIsImJzIiwiYWRkX2NoYW5uZWwiLCJpYyIsInRvX3JlYWQiLCJidWYiLCJhbHJlYWR5X3JlYWQiLCJyIiwib3V0cHV0X2J1ZmZlciIsIm9jIiwiYWRkX3N1YnN0aXR1dGUiLCJsaW0iLCJwcmV2aW91cyIsImkiLCJzdGFydCIsIm9wZW5pbmciLCJzdG9wIiwidmFsIiwibmV3X3N0YXJ0IiwiY2xvc2luZyIsImsiLCJleG4iLCJuZXh0X2kiLCJpZGVudCIsInRydW5jYXRlIiwidG9fc2VxIiwiYXV4IiwicGFyYW0iLCJ4IiwidG9fc2VxaSIsImFkZF9zZXEiLCJzZXEiLCJvZl9zZXEiLCJhZGRfaW50OCIsImFkZF9pbnQxNl9uZSIsImFkZF9pbnQzMl9uZSIsImFkZF9pbnQ2NF9uZSIsImFkZF9pbnQxNl9sZSIsImFkZF9pbnQxNl9iZSIsImFkZF9pbnQzMl9sZSIsImFkZF9pbnQzMl9iZSIsImFkZF9pbnQ2NF9sZSIsImFkZF9pbnQ2NF9iZSJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFD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IjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvbXV0ZXgubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgWGF2aWVyIExlcm95IGFuZCBQYXNjYWwgQ3VvcSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk1IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdFxuZXh0ZXJuYWwgY3JlYXRlOiB1bml0IC0+IHQgPSBcImNhbWxfbWxfbXV0ZXhfbmV3XCJcbmV4dGVybmFsIGxvY2s6IHQgLT4gdW5pdCA9IFwiY2FtbF9tbF9tdXRleF9sb2NrXCJcbmV4dGVybmFsIHRyeV9sb2NrOiB0IC0+IGJvb2wgPSBcImNhbWxfbWxfbXV0ZXhfdHJ5X2xvY2tcIlxuZXh0ZXJuYWwgdW5sb2NrOiB0IC0+IHVuaXQgPSBcImNhbWxfbWxfbXV0ZXhfdW5sb2NrXCJcblxuKCogcHJpdmF0ZSByZS1leHBvcnQgKilcbmV4dGVybmFsIHJlcmFpc2UgOiBleG4gLT4gJ2EgPSBcIiVyZXJhaXNlXCJcblxuKCogY2Fubm90IGlubGluZSwgb3RoZXJ3aXNlIGZsYW1iZGEgbWlnaHQgbW92ZSBjb2RlIGFyb3VuZC4gKilcbmxldFtAaW5saW5lIG5ldmVyXSBwcm90ZWN0IG0gZiA9XG4gIGxvY2sgbTtcbiAgbWF0Y2ggZigpIHdpdGhcbiAgfCB4IC0+XG4gICAgdW5sb2NrIG07IHhcbiAgfCBleGNlcHRpb24gZSAtPlxuICAgICgqIE5PVEU6IFt1bmxvY2tdIGRvZXMgbm90IHBvbGwgZm9yIGFzeW5jaHJvbm91cyBleGNlcHRpb25zICopXG4gICAgdW5sb2NrIG07XG4gICAgcmVyYWlzZSBlXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfbXV0ZXhfbG9jayIsImNhbWxfbWxfbXV0ZXhfdW5sb2NrIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJwcm90ZWN0IiwibSIsIngiLCJlIiwiU3RkbGliX011dGV4Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFFBQUFDLEdBQUFIO0FBQUFBLElDMEJFO0FBQUEsSUFBTSxRQUFBSSxJQUNBO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsSUQzQlI7QUFBQSxLQ2dDSTtBQUFBLEtBQVE7QUFBQTtBQUFBLElBSFI7QUFBQSxJQUFRO0FBQUEsR0FJQztBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTURqQ2IiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxNjgxNywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSJdLCJuYW1lcyI6WyJydW50aW1lIiwiU3RkbGliX0NvbmRpdGlvbiJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQztBQUFBQSxNQUFBIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTY4MzUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvZG9tYWluLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICBLQyBTaXZhcmFtYWtyaXNobmFuLCBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFN0ZXBoZW4gRG9sYW4sIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgVG9tIEtlbGx5LCBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5ICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOSBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5IEx0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5tb2R1bGUgUmF3ID0gc3RydWN0XG4gICgqIExvdy1sZXZlbCBwcmltaXRpdmVzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lICopXG4gIHR5cGUgdCA9IHByaXZhdGUgaW50XG5cbiAgKCogVGhlIGxheW91dHMgb2YgW3N0YXRlXSBhbmQgW3Rlcm1fc3luY10gYXJlIGhhcmQtY29kZWQgaW5cbiAgICAgW3J1bnRpbWUvZG9tYWluLmNdICopXG5cbiAgdHlwZSAnYSBzdGF0ZSA9XG4gICAgfCBSdW5uaW5nXG4gICAgfCBGaW5pc2hlZCBvZiAoJ2EsIGV4bikgcmVzdWx0IFtAd2FybmluZyBcIi11bnVzZWQtY29uc3RydWN0b3JcIl1cblxuICB0eXBlICdhIHRlcm1fc3luYyA9IHtcbiAgICAoKiBwcm90ZWN0ZWQgYnkgW211dF0gKilcbiAgICBtdXRhYmxlIHN0YXRlIDogJ2Egc3RhdGUgW0B3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXSA7XG4gICAgbXV0IDogTXV0ZXgudCA7XG4gICAgY29uZCA6IENvbmRpdGlvbi50IDtcbiAgfVxuXG4gIGV4dGVybmFsIHNwYXduIDogKHVuaXQgLT4gJ2EpIC0+ICdhIHRlcm1fc3luYyAtPiB0XG4gICAgPSBcImNhbWxfZG9tYWluX3NwYXduXCJcbiAgZXh0ZXJuYWwgc2VsZiA6IHVuaXQgLT4gdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9pZFwiIFtAQG5vYWxsb2NdXG4gIGV4dGVybmFsIGNwdV9yZWxheCA6IHVuaXQgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcIlxuICBleHRlcm5hbCBnZXRfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50OiB1bml0IC0+IGludFxuICAgID0gXCJjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFwiIFtAQG5vYWxsb2NdXG5lbmRcblxubGV0IGNwdV9yZWxheCAoKSA9IFJhdy5jcHVfcmVsYXggKClcblxudHlwZSBpZCA9IFJhdy50XG5cbnR5cGUgJ2EgdCA9IHtcbiAgZG9tYWluIDogUmF3LnQ7XG4gIHRlcm1fc3luYyA6ICdhIFJhdy50ZXJtX3N5bmM7XG59XG5cbm1vZHVsZSBETFMgPSBzdHJ1Y3RcblxuICBtb2R1bGUgT2JqX29wdCA6IHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBub25lIDogdFxuICAgIHZhbCBzb21lIDogJ2EgLT4gdFxuICAgIHZhbCBpc19zb21lIDogdCAtPiBib29sXG5cbiAgICAoKiogW3Vuc2FmZV9nZXQgb2JqXSBtYXkgb25seSBiZSBjYWxsZWQgc2FmZWx5XG4gICAgICAgIGlmIFtpc19zb21lXSBpcyB0cnVlLlxuXG4gICAgICAgIFt1bnNhZmVfZ2V0IChzb21lIHYpXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIFtPYmoub2JqIChPYmoucmVwciB2KV0uICopXG4gICAgdmFsIHVuc2FmZV9nZXQgOiB0IC0+ICdhXG4gIGVuZCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IE9iai50XG4gICAgbGV0IG5vbmUgPSBPYmoucmVwciAocmVmIDApXG4gICAgbGV0IHNvbWUgdiA9IE9iai5yZXByIHZcbiAgICBsZXQgaXNfc29tZSBvYmogPSAob2JqICE9IG5vbmUpXG4gICAgbGV0IHVuc2FmZV9nZXQgb2JqID0gT2JqLm9iaiBvYmpcbiAgZW5kXG5cbiAgdHlwZSBkbHNfc3RhdGUgPSBPYmpfb3B0LnQgYXJyYXlcblxuICBleHRlcm5hbCBnZXRfZGxzX3N0YXRlIDogdW5pdCAtPiBkbHNfc3RhdGUgPSBcIiVkbHNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXRfZGxzX3N0YXRlIDogZGxzX3N0YXRlIC0+IHVuaXQgPVxuICAgIFwiY2FtbF9kb21haW5fZGxzX3NldFwiIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY29tcGFyZV9hbmRfc2V0X2Rsc19zdGF0ZSA6IGRsc19zdGF0ZSAtPiBkbHNfc3RhdGUgLT4gYm9vbCA9XG4gICAgXCJjYW1sX2RvbWFpbl9kbHNfY29tcGFyZV9hbmRfc2V0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlX2RscyAoKSA9XG4gICAgbGV0IHN0ID0gQXJyYXkubWFrZSA4IE9ial9vcHQubm9uZSBpblxuICAgIHNldF9kbHNfc3RhdGUgc3RcblxuICBsZXQgXyA9IGNyZWF0ZV9kbHMgKClcblxuICB0eXBlICdhIGtleSA9IGludCAqICh1bml0IC0+ICdhKVxuXG4gIGxldCBrZXlfY291bnRlciA9IEF0b21pYy5tYWtlIDBcblxuICB0eXBlIGtleV9pbml0aWFsaXplciA9XG4gICAgS0k6ICdhIGtleSAqICgnYSAtPiAnYSkgLT4ga2V5X2luaXRpYWxpemVyXG5cbiAgbGV0IHBhcmVudF9rZXlzID0gQXRvbWljLm1ha2UgKFtdIDoga2V5X2luaXRpYWxpemVyIGxpc3QpXG5cbiAgbGV0IHJlYyBhZGRfcGFyZW50X2tleSBraSA9XG4gICAgbGV0IGwgPSBBdG9taWMuZ2V0IHBhcmVudF9rZXlzIGluXG4gICAgaWYgbm90IChBdG9taWMuY29tcGFyZV9hbmRfc2V0IHBhcmVudF9rZXlzIGwgKGtpIDo6IGwpKVxuICAgIHRoZW4gYWRkX3BhcmVudF9rZXkga2lcblxuICBsZXQgbmV3X2tleSA/c3BsaXRfZnJvbV9wYXJlbnQgaW5pdF9vcnBoYW4gPVxuICAgIGxldCBpZHggPSBBdG9taWMuZmV0Y2hfYW5kX2FkZCBrZXlfY291bnRlciAxIGluXG4gICAgbGV0IGsgPSAoaWR4LCBpbml0X29ycGhhbikgaW5cbiAgICBiZWdpbiBtYXRjaCBzcGxpdF9mcm9tX3BhcmVudCB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHNwbGl0IC0+IGFkZF9wYXJlbnRfa2V5IChLSShrLCBzcGxpdCkpXG4gICAgZW5kO1xuICAgIGtcblxuICAoKiBJZiBuZWNlc3NhcnksIGdyb3cgdGhlIGN1cnJlbnQgZG9tYWluJ3MgbG9jYWwgc3RhdGUgYXJyYXkgc3VjaCB0aGF0IFtpZHhdXG4gICAqIGlzIGEgdmFsaWQgaW5kZXggaW4gdGhlIGFycmF5LiAqKVxuICBsZXQgcmVjIG1heWJlX2dyb3cgaWR4ID1cbiAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgbGV0IHN6ID0gQXJyYXkubGVuZ3RoIHN0IGluXG4gICAgaWYgaWR4IDwgc3ogdGhlbiBzdFxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgY29tcHV0ZV9uZXdfc2l6ZSBzID1cbiAgICAgICAgaWYgaWR4IDwgcyB0aGVuIHMgZWxzZSBjb21wdXRlX25ld19zaXplICgyICogcylcbiAgICAgIGluXG4gICAgICBsZXQgbmV3X3N6ID0gY29tcHV0ZV9uZXdfc2l6ZSBzeiBpblxuICAgICAgbGV0IG5ld19zdCA9IEFycmF5Lm1ha2UgbmV3X3N6IE9ial9vcHQubm9uZSBpblxuICAgICAgQXJyYXkuYmxpdCBzdCAwIG5ld19zdCAwIHN6O1xuICAgICAgKCogV2Ugd2FudCBhIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc2FmZSB3aXRoIHJlc3BlY3QgdG9cbiAgICAgICAgIHNpbmdsZS1kb21haW4gbXVsdGktdGhyZWFkaW5nOiByZXRyeSBpZiB0aGUgRExTIHN0YXRlIGhhc1xuICAgICAgICAgY2hhbmdlZCB1bmRlciBvdXIgZmVldC5cbiAgICAgICAgIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHJldHJpZXMgd2lsbCBiZSB2ZXJ5IHNtYWxsIGluXG4gICAgICAgICBjb250ZW5kZWQgc2NlbmFyaW9zLCBhcyB0aGUgYXJyYXkgb25seSBncm93cywgd2l0aFxuICAgICAgICAgZXhwb25lbnRpYWwgcmVzaXppbmcuICopXG4gICAgICBpZiBjb21wYXJlX2FuZF9zZXRfZGxzX3N0YXRlIHN0IG5ld19zdFxuICAgICAgdGhlbiBuZXdfc3RcbiAgICAgIGVsc2UgbWF5YmVfZ3JvdyBpZHhcbiAgICBlbmRcblxuICBsZXQgc2V0ICh0eXBlIGEpIChpZHgsIF9pbml0KSAoeCA6IGEpID1cbiAgICBsZXQgc3QgPSBtYXliZV9ncm93IGlkeCBpblxuICAgICgqIFtTeXMub3BhcXVlX2lkZW50aXR5XSBlbnN1cmVzIHRoYXQgZmxhbWJkYSBkb2VzIG5vdCBsb29rIGF0IHRoZSB0eXBlIG9mXG4gICAgICogW3hdLCB3aGljaCBtYXkgYmUgYSBbZmxvYXRdIGFuZCBjb25jbHVkZSB0aGF0IHRoZSBbc3RdIGlzIGEgZmxvYXQgYXJyYXkuXG4gICAgICogV2UgZG8gbm90IHdhbnQgT0NhbWwncyBmbG9hdCBhcnJheSBvcHRpbWlzYXRpb24ga2lja2luZyBpbiBoZXJlLiAqKVxuICAgIHN0LihpZHgpIDwtIE9ial9vcHQuc29tZSAoU3lzLm9wYXF1ZV9pZGVudGl0eSB4KVxuXG5cbiAgbGV0W0BpbmxpbmUgbmV2ZXJdIGFycmF5X2NvbXBhcmVfYW5kX3NldCBhIGkgb2xkdmFsIG5ld3ZhbCA9XG4gICAgKCogTm90ZTogd2UgY2Fubm90IHVzZSBbQHBvbGwgZXJyb3JdIGR1ZSB0byB0aGVcbiAgICAgICBhbGxvY2F0aW9ucyBvbiBhLihpKSBpbiB0aGUgRG91YmxlX2FycmF5IGNhc2UuICopXG4gICAgbGV0IGN1cnZhbCA9IGEuKGkpIGluXG4gICAgaWYgY3VydmFsID09IG9sZHZhbCB0aGVuIChcbiAgICAgIEFycmF5LnVuc2FmZV9zZXQgYSBpIG5ld3ZhbDtcbiAgICAgIHRydWVcbiAgICApIGVsc2UgZmFsc2VcblxuICBsZXQgZ2V0ICh0eXBlIGEpICgoaWR4LCBpbml0KSA6IGEga2V5KSA6IGEgPVxuICAgIGxldCBzdCA9IG1heWJlX2dyb3cgaWR4IGluXG4gICAgbGV0IG9iaiA9IHN0LihpZHgpIGluXG4gICAgaWYgT2JqX29wdC5pc19zb21lIG9ialxuICAgIHRoZW4gKE9ial9vcHQudW5zYWZlX2dldCBvYmogOiBhKVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCB2IDogYSA9IGluaXQgKCkgaW5cbiAgICAgIGxldCBuZXdfb2JqID0gT2JqX29wdC5zb21lIChTeXMub3BhcXVlX2lkZW50aXR5IHYpIGluXG4gICAgICAoKiBBdCB0aGlzIHBvaW50LCBbc3RdIG9yIFtzdC4oaWR4KV0gbWF5IGhhdmUgYmVlbiBjaGFuZ2VkXG4gICAgICAgICBieSBhbm90aGVyIHRocmVhZCBvbiB0aGUgc2FtZSBkb21haW4uXG5cbiAgICAgICAgIElmIFtzdF0gY2hhbmdlZCwgaXQgd2FzIHJlc2l6ZWQgaW50byBhIGxhcmdlciB2YWx1ZSxcbiAgICAgICAgIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBuZXcgdmFsdWUuXG5cbiAgICAgICAgIElmIFtzdC4oaWR4KV0gY2hhbmdlZCwgd2UgZHJvcCB0aGUgY3VycmVudCB2YWx1ZSB0byBhdm9pZFxuICAgICAgICAgbGV0dGluZyBvdGhlciB0aHJlYWRzIG9ic2VydmUgYSAncmV2ZXJ0JyB0aGF0IGZvcmdldHNcbiAgICAgICAgIHByZXZpb3VzIG1vZGlmaWNhdGlvbnMuICopXG4gICAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgICBpZiBhcnJheV9jb21wYXJlX2FuZF9zZXQgc3QgaWR4IG9iaiBuZXdfb2JqXG4gICAgICB0aGVuIHZcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgKCogaWYgc3QuKGlkeCkgY2hhbmdlZCwgc29tZW9uZSBtdXN0IGhhdmUgaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgdGhlIGtleSBpbiB0aGUgbWVhbnRpbWUuICopXG4gICAgICAgIGxldCB1cGRhdGVkX29iaiA9IHN0LihpZHgpIGluXG4gICAgICAgIGlmIE9ial9vcHQuaXNfc29tZSB1cGRhdGVkX29ialxuICAgICAgICB0aGVuIChPYmpfb3B0LnVuc2FmZV9nZXQgdXBkYXRlZF9vYmogOiBhKVxuICAgICAgICBlbHNlIGFzc2VydCBmYWxzZVxuICAgICAgZW5kXG4gICAgZW5kXG5cbiAgdHlwZSBrZXlfdmFsdWUgPSBLViA6ICdhIGtleSAqICdhIC0+IGtleV92YWx1ZVxuXG4gIGxldCBnZXRfaW5pdGlhbF9rZXlzICgpIDoga2V5X3ZhbHVlIGxpc3QgPVxuICAgIExpc3QubWFwXG4gICAgICAoZnVuIChLSSAoaywgc3BsaXQpKSAtPiBLViAoaywgKHNwbGl0IChnZXQgaykpKSlcbiAgICAgIChBdG9taWMuZ2V0IHBhcmVudF9rZXlzKVxuXG4gIGxldCBzZXRfaW5pdGlhbF9rZXlzIChsOiBrZXlfdmFsdWUgbGlzdCkgPVxuICAgIExpc3QuaXRlciAoZnVuIChLViAoaywgdikpIC0+IHNldCBrIHYpIGxcbmVuZFxuXG4oKioqKioqKiogSWRlbnRpdHkgKioqKioqKioqKilcblxubGV0IGdldF9pZCB7IGRvbWFpbjsgXyB9ID0gZG9tYWluXG5cbmxldCBzZWxmICgpID0gUmF3LnNlbGYgKClcblxubGV0IGlzX21haW5fZG9tYWluICgpID0gKHNlbGYgKCkgOj4gaW50KSA9IDBcblxuKCoqKioqKioqIENhbGxiYWNrcyAqKioqKioqKioqKVxuXG4oKiBmaXJzdCBzcGF3biwgZG9tYWluIHN0YXJ0dXAgYW5kIGF0IGV4aXQgZnVuY3Rpb25hbGl0eSAqKVxubGV0IGZpcnN0X2RvbWFpbl9zcGF3bmVkID0gQXRvbWljLm1ha2UgZmFsc2VcblxubGV0IGZpcnN0X3NwYXduX2Z1bmN0aW9uID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBiZWZvcmVfZmlyc3Rfc3Bhd24gZiA9XG4gIGlmIEF0b21pYy5nZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdGhlblxuICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiZmlyc3QgZG9tYWluIGFscmVhZHkgc3Bhd25lZFwiKVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG9sZF9mID0gIWZpcnN0X3NwYXduX2Z1bmN0aW9uIGluXG4gICAgbGV0IG5ld19mICgpID0gb2xkX2YgKCk7IGYgKCkgaW5cbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSBuZXdfZlxuICBlbmRcblxubGV0IGRvX2JlZm9yZV9maXJzdF9zcGF3biAoKSA9XG4gIGlmIG5vdCAoQXRvbWljLmdldCBmaXJzdF9kb21haW5fc3Bhd25lZCkgdGhlbiBiZWdpblxuICAgIEF0b21pYy5zZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdHJ1ZTtcbiAgICAhZmlyc3Rfc3Bhd25fZnVuY3Rpb24oKTtcbiAgICAoKiBSZWxlYXNlIHRoZSBvbGQgZnVuY3Rpb24gKilcbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSAoZnVuICgpIC0+ICgpKVxuICBlbmRcblxubGV0IGF0X2V4aXRfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPiAoZnVuICgpIC0+ICgpKSlcblxubGV0IGF0X2V4aXQgZiA9XG4gIGxldCBvbGRfZXhpdCA6IHVuaXQgLT4gdW5pdCA9IERMUy5nZXQgYXRfZXhpdF9rZXkgaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBmICgpOyBvbGRfZXhpdCAoKVxuICBpblxuICBETFMuc2V0IGF0X2V4aXRfa2V5IG5ld19leGl0XG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgbGV0IGYgOiB1bml0IC0+IHVuaXQgPSBETFMuZ2V0IGF0X2V4aXRfa2V5IGluXG4gIGYgKClcblxubGV0IF8gPSBTdGRsaWIuZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQgOj0gZG9fYXRfZXhpdFxuXG4oKioqKioqKiBDcmVhdGlvbiBhbmQgVGVybWluYXRpb24gKioqKioqKiopXG5cbmxldCBzcGF3biBmID1cbiAgZG9fYmVmb3JlX2ZpcnN0X3NwYXduICgpO1xuICBsZXQgcGsgPSBETFMuZ2V0X2luaXRpYWxfa2V5cyAoKSBpblxuXG4gICgqIFt0ZXJtX3N5bmNdIGlzIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgam9pbmluZyBkb21haW5zICopXG4gIGxldCB0ZXJtX3N5bmMgPVxuICAgIFJhdy57IHN0YXRlID0gUnVubmluZyA7XG4gICAgICAgICAgbXV0ID0gTXV0ZXguY3JlYXRlICgpIDtcbiAgICAgICAgICBjb25kID0gQ29uZGl0aW9uLmNyZWF0ZSAoKSB9XG4gIGluXG5cbiAgbGV0IGJvZHkgKCkgPVxuICAgIG1hdGNoXG4gICAgICBETFMuY3JlYXRlX2RscyAoKTtcbiAgICAgIERMUy5zZXRfaW5pdGlhbF9rZXlzIHBrO1xuICAgICAgbGV0IHJlcyA9IGYgKCkgaW5cbiAgICAgIHJlc1xuICAgIHdpdGhcbiAgICAoKiBSdW4gdGhlIFthdF9leGl0XSBjYWxsYmFja3Mgd2hlbiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGVpdGhlclxuICAgICAgIHRlcm1pbmF0ZXMgbm9ybWFsbHkgb3IgZXhjZXB0aW9uYWxseS4gKilcbiAgICB8IHJlcyAtPlxuICAgICAgICAoKiBJZiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIHRlcm1pbmF0ZWQgbm9ybWFsbHksIGJ1dCB0aGVcbiAgICAgICAgICAgW2F0X2V4aXRdIGNhbGxiYWNrcyByYWlzZWQgYW4gZXhjZXB0aW9uLCB0aGVuIHJldHVybiB0aGVcbiAgICAgICAgICAgZXhjZXB0aW9uLiAqKVxuICAgICAgICBkb19hdF9leGl0ICgpO1xuICAgICAgICByZXNcbiAgICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICAgICAgKCogSWYgYm90aCB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGFuZCB0aGUgW2F0X2V4aXRdIGNhbGxiYWNrc1xuICAgICAgICAgICByYWlzZSBleGNlcHRpb25zLCB0aGVuIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGZyb20gdGhlXG4gICAgICAgICAgIFthdF9leGl0XSBjYWxsYmFja3MgYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLiAqKVxuICAgICAgICAodHJ5IGRvX2F0X2V4aXQgKCkgd2l0aCBfIC0+ICgpKTtcbiAgICAgICAgcmFpc2UgZXhuXG4gIGluXG4gIGxldCBkb21haW4gPSBSYXcuc3Bhd24gYm9keSB0ZXJtX3N5bmMgaW5cbiAgeyBkb21haW4gOyB0ZXJtX3N5bmMgfVxuXG5sZXQgam9pbiB7IHRlcm1fc3luYyA7IF8gfSA9XG4gIGxldCBvcGVuIFJhdyBpblxuICBsZXQgcmVjIGxvb3AgKCkgPVxuICAgIG1hdGNoIHRlcm1fc3luYy5zdGF0ZSB3aXRoXG4gICAgfCBSdW5uaW5nIC0+XG4gICAgICAgIENvbmRpdGlvbi53YWl0IHRlcm1fc3luYy5jb25kIHRlcm1fc3luYy5tdXQ7XG4gICAgICAgIGxvb3AgKClcbiAgICB8IEZpbmlzaGVkIHJlcyAtPlxuICAgICAgICByZXNcbiAgaW5cbiAgbWF0Y2ggTXV0ZXgucHJvdGVjdCB0ZXJtX3N5bmMubXV0IGxvb3Agd2l0aFxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIGV4IC0+IHJhaXNlIGV4XG5cbmxldCByZWNvbW1lbmRlZF9kb21haW5fY291bnQgPSBSYXcuZ2V0X3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9kb21haW5fZGxzX2dldCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9kb21haW5faWQiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImR1bW15IiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQ29uZGl0aW9uIiwiU3RkbGliX011dGV4IiwiU3RkbGliX0F0b21pYyIsIlN0ZGxpYiIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9MaXN0IiwiQXNzZXJ0X2ZhaWx1cmUiLCJjcHVfcmVsYXgiLCJwYXJhbSIsIm5vbmUiLCJjcmVhdGVfZGxzIiwic3QiLCJrZXlfY291bnRlciIsInBhcmVudF9rZXlzIiwibmV3X2tleSIsInNwbGl0X2Zyb21fcGFyZW50IiwiaW5pdF9vcnBoYW4iLCJpZHgiLCJrIiwic3BsaXQiLCJraSIsImwiLCJtYXliZV9ncm93Iiwic3oiLCJuZXdfc3oiLCJuZXdfc3QiLCJzIiwic2V0IiwieCIsImdldCIsImluaXQiLCJvbGR2YWwiLCJuZXdfb2JqIiwiY3VydmFsIiwidXBkYXRlZF9vYmoiLCJzZXRfaW5pdGlhbF9rZXlzIiwidiIsImdldF9pZCIsImRvbWFpbiIsInNlbGYiLCJpc19tYWluX2RvbWFpbiIsImZpcnN0X2RvbWFpbl9zcGF3bmVkIiwiZmlyc3Rfc3Bhd25fZnVuY3Rpb24iLCJiZWZvcmVfZmlyc3Rfc3Bhd24iLCJvbGRfZiIsIm5ld19mIiwiYXRfZXhpdF9rZXkiLCJhdF9leGl0Iiwib2xkX2V4aXQiLCJuZXdfZXhpdCIsImRvX2F0X2V4aXQiLCJzcGF3biIsInBrIiwidGVybV9zeW5jIiwiYm9keSIsInJlcyIsImV4biIsImpvaW4iLCJsb29wIiwibWF0Y2giLCJleCIsInJlY29tbWVuZGVkX2RvbWFpbl9jb3VudCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxZQUFBQyxVQUFBQyxPQzhDbUIsMENBQWdCO0FBQUEsT0FBQUMsT0Q5Q25DO0FBQUEsWUFBQUMsV0FBQUY7QUFBQUEsUUFBQUcsS0N3RmE7QUFBQSxJQUNUO0FBQUEsR0FBZ0I7QUFBQSxHQUVWO0FBQUE7QUFBQSxJQUFBQyxjQUlVO0FBQUEsSUFBQUMsY0FLQTtBQUFBLFlBQUFDLFFBQUFDLG1CQUFBQztBQUFBQTtBQUFBQSxLQUFBQyxNQVFOO0FBQUEsS0FBQUMsSUFDVjtBQUFBLElBQ0E7QUFBQSxTQUFBQyxRQUFBLHNCQUFBQyxLQUVnQjtBQUFBLEtBVGhCO0FBQUEsVUFBQUMsSUFBUTtBQUFBLE1BQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVVQO0FBQUEsR0FBQztBQUFBLFlBQUFDLFdBQUFMO0FBQUFBLElBS0Q7QUFBQSxTQUFBTixLQUFBLHdCQUFBWSxLQUNBO0FBQUEsS0FDQSxhQUFpQjtBQUFBLFNBQUFDLFNBQWpCO0FBQUE7QUFBQSxNQUdJO0FBQUEsV0FBQUMsU0FHVztBQUFBLE9BQ2I7QUFBQSxPQU9HLHdEQUNFO0FBQUE7QUFBQTtBQUFBLFVBQUFDLElBWm9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FjeEI7QUFBQSxZQUFBQyxJQUFBbkIsT0FBQW9CO0FBQUFBLFFBQUFYLE1BRUcsVUFBQU4sS0FDRztBQUFBLElBSVQ7QUFBQSxJQUFnRDtBQUFBO0FBQUEsV0E3Q087QUFBQSxZQUFBa0IsSUFBQXJCO0FBQUFBO0FBQUFBLEtBQUFzQixPQXlEakQ7QUFBQSxLQUFBYixNQUFBO0FBQUEsS0FBQU4sS0FDRztBQUFBLEtBQUFvQixTQUNDO0FBQUEsSUFDWSxvQkF0RkQ7QUFBQTtBQUFBLEtBQUFDLFVBeUZQO0FBQUEsS0FBQXJCLE9BV1o7QUFBQSxLQUFBc0IsU0F2Qlc7QUFBQSxTQUNiO0FBQUEsSUF1QjZDLE1BQ3RDO0FBQUEsUUFBQUMsY0FJZTtBQUFBLElBQ1kseUJBM0diO0FBQUEsSUE2R1o7QUFBQSxHQUVOO0FBQUEsWUFBQUMsaUJBQUFkO0FBQUFBLElBVUg7QUFBQTtBQUFBLHNCQUFBYjtBQUFBQSxrQkFBQTRCLElBQVUsVUFBQWxCLElBQUE7QUFBQSxjQUFvQixnQkFBUTtBQUFBO0FBQUEsZUFBRTtBQUFBO0FBQUEsWUFBQW1CLE9BQUE3QixXQUFBOEIsU0FLakMsVUFBZ0IsY0FBTTtBQUFBLFlBQUFDLEtBQUEvQixPQUVuQiwyQkFBVztBQUFBLFlBQUFnQyxlQUFBaEMsT0FBWCx5Q0FFa0IsQ0FBWTtBQUFBO0FBQUEsSUFBQWlDLHVCQUtqQjtBQUFBLElBQUFDLHVCQUFpQixhQUFBbEMsT0FFQTtBQUFBLFlBQUFtQyxtQkFBQS9DO0FBQUFBLElBR3ZDO0FBQUEsS0FDRDtBQUFBO0FBQUEsUUFBQWdELFFBQ0c7QUFBQSxhQUFBQyxNQUFBckMsT0FFWSxzQkFBUSx1QkFBTTtBQUFBLElBQzdCO0FBQUE7QUFBQSxHQUNDO0FBQUE7QUFBQSxJQUFBc0M7QUFBQUEsTUFVYSxvQkFBQXRDLE9BQXVCLGdCQUFBQSxPQUFXLFNBQUUsQ0FBYixDQUFjO0FBQUEsWUFBQXVDLFFBQUFuRDtBQUFBQSxRQUFBb0QsV0FHdkI7QUFBQSxhQUFBQyxTQUFBekM7QUFBQUEsS0FFNUI7QUFBQSxLQUFJLDhCQUFhO0FBQUE7QUFBQSxJQUVuQixpQ0FBNEI7QUFBQTtBQUFBLFlBQUEwQyxXQUFBMUM7QUFBQUEsUUFBQVosSUFHTDtBQUFBLElBQ3ZCLHVCQUFJO0FBQUE7QUFBQSxHQVhrRDtBQUFBLFlBQUF1RCxNQUFBdkQ7QUFBQUEsSUFQL0M7QUFBQSxLQUNMO0FBQUEsS0FDQTtBQUFBLEtBQXVCLG1DQUFBWSxPQUVZLFNBQUU7QUFBQTtBQUFBO0FBQUEsU0FuQ25DO0FBQUEsS0FBQTRDO0FBQUFBLE9BQXdCO0FBQUE7QUFBQSxrQkFBQTVDO0FBQUFBLGNBQUFXLFFBRHhCLFVBQUFELElBQUE7QUFBQSxVQUFzQyxjQUFQLGtCQUFPLFFBQVE7QUFBQSxTQUFFO0FBQUE7QUFBQSxTQWdFckM7QUFBQSxLQUFBbUMsWUFERDtBQUFBLGFBQUFDLEtBQUE5QztBQUFBQSxLQUtaLElBQ0UsZUFDQSwwQkFBQStDLE1BQ1U7QUFBQSxXQUFBQztBQUFBQSxVQUFBQSxNRHRRaEI7QUFBQSxVQ3FSYSxxQkFBQUE7QUFBQUEsTUFDTDtBQUFBO0FBQUEsS0FQQTtBQUFBLEtBQWE7QUFBQSxJQU9KO0FBQUEsUUFBQWxCLFNBRUY7QUFBQSxJQUNiO0FBQUEsR0FBc0I7QUFBQSxZQUFBbUIsS0FBQWpEO0FBQUFBLFFBQUE2QyxZQUVmO0FBQUEsYUFBQUssS0FBQWxEO0FBQUFBLEtBR0w7QUFBQSxVQUFBbUQsUUFBQTtBQUFBLG9CQUFBSixNQUFBLFVBS0k7QUFBQSxNQUhBO0FBQUE7QUFBQSxJQUdHO0FBQUEsUUFBQUksUUFFSDtBQUFBLElBQWdDLHVCQUFBL0IsSUFBQSxVQUM1QjtBQUFBLFFBQUFnQyxLQUQ0QjtBQUFBO0FBQUEsR0FFaEI7QUFBQSxPQUFBQywyQkFqRWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR0T3hEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTcwMzEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvY2FtbGludGVybmFsRm9ybWF0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbm9pdCBWYXVnb24sIEVOU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAoKiBUb29scyB0byBtYW5pcHVsYXRlIHNjYW5uaW5nIHNldCBvZiBjaGFycyAoc2VlICVbLi4uXSkgKilcblxudHlwZSBtdXRhYmxlX2NoYXJfc2V0ID0gYnl0ZXNcblxuKCogQ3JlYXRlIGEgZnJlc2gsIGVtcHR5LCBtdXRhYmxlIGNoYXIgc2V0LiAqKVxubGV0IGNyZWF0ZV9jaGFyX3NldCAoKSA9IEJ5dGVzLm1ha2UgMzIgJ1xcMDAwJ1xuXG4oKiBBZGQgYSBjaGFyIGluIGEgbXV0YWJsZSBjaGFyIHNldC4gKilcbmxldCBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyA9XG4gIGxldCBpbmQgPSBpbnRfb2ZfY2hhciBjIGluXG4gIGxldCBzdHJfaW5kID0gaW5kIGxzciAzIGFuZCBtYXNrID0gMSBsc2wgKGluZCBsYW5kIDBiMTExKSBpblxuICBCeXRlcy5zZXQgY2hhcl9zZXQgc3RyX2luZFxuICAgIChjaGFyX29mX2ludCAoaW50X29mX2NoYXIgKEJ5dGVzLmdldCBjaGFyX3NldCBzdHJfaW5kKSBsb3IgbWFzaykpXG5cbmxldCBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgPVxuICBCeXRlcy50b19zdHJpbmcgY2hhcl9zZXRcblxuKCogQ29tcHV0ZSB0aGUgY29tcGxlbWVudCBvZiBhIGNoYXIgc2V0LiAqKVxubGV0IHJldl9jaGFyX3NldCBjaGFyX3NldCA9XG4gIGxldCBjaGFyX3NldCcgPSBjcmVhdGVfY2hhcl9zZXQgKCkgaW5cbiAgZm9yIGkgPSAwIHRvIDMxIGRvXG4gICAgQnl0ZXMuc2V0IGNoYXJfc2V0JyBpXG4gICAgICAoY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IGkpIGx4b3IgMHhGRikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGNoYXJfc2V0J1xuXG4oKiBSZXR1cm4gdHJ1ZSBpZiBhIGBjJyBpcyBpbiBgY2hhcl9zZXQnLiAqKVxubGV0IGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgPVxuICBsZXQgaW5kID0gaW50X29mX2NoYXIgYyBpblxuICBsZXQgc3RyX2luZCA9IGluZCBsc3IgMyBhbmQgbWFzayA9IDEgbHNsIChpbmQgbGFuZCAwYjExMSkgaW5cbiAgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IHN0cl9pbmQpIGxhbmQgbWFzaykgPD4gMFxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKCogSWdub3JlZCBwYXJhbSBjb252ZXJzaW9uICopXG5cbigqIEdBRFQgdXNlZCB0byBhYnN0cmFjdCBhbiBleGlzdGVudGlhbCB0eXBlIHBhcmFtZXRlci4gKilcbigqIFNlZSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiID0gUGFyYW1fZm9ybWF0X0VCQiA6XG4gICAgKCd4IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiXG5cbigqIENvbXB1dGUgYSBwYWRkaW5nIGFzc29jaWF0ZWQgdG8gYSBwYWRfb3B0aW9uIChzZWUgXCIlXzQyZFwiKS4gKilcbmxldCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wYWRkaW5nXG4gIHwgU29tZSB3aWR0aCAtPiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuXG4oKiBDb21wdXRlIGEgcHJlY2lzaW9uIGFzc29jaWF0ZWQgdG8gYSBwcmVjX29wdGlvbiAoc2VlIFwiJV8uNDJmXCIpLiAqKVxubGV0IHByZWNfb2ZfcHJlY19vcHQgcHJlY19vcHQgPSBtYXRjaCBwcmVjX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wcmVjaXNpb25cbiAgfCBTb21lIG5kZWMgLT4gTGl0X3ByZWNpc2lvbiBuZGVjXG5cbigqIFR1cm4gYW4gaWdub3JlZCBwYXJhbSBpbnRvIGl0cyBlcXVpdmFsZW50IG5vdC1pZ25vcmVkIGZvcm1hdCBub2RlLiAqKVxuKCogVXNlZCBmb3IgZm9ybWF0IHByZXR0eS1wcmludGluZyBhbmQgU2NhbmYuICopXG5sZXQgcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+ICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYXJhbV9mb3JtYXRfZWJiID1cbmZ1biBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2hhciBmbXQpXG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDYW1sX2NoYXIgZm10KVxuICB8IElnbm9yZWRfc3RyaW5nIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEludCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2ludDMyIChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoSW50MzIgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChOYXRpdmVpbnQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQ2NCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEludDY0IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfZmxvYXQgKHBhZF9vcHQsIHByZWNfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChGbG9hdCAoKEZsb2F0X2ZsYWdfLCBGbG9hdF9mKSxcbiAgICAgICAgICAgICAgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgcHJlY19vZl9wcmVjX29wdCBwcmVjX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2Jvb2wgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEJvb2wgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgZm10KSlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHkpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIGZtdCkpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChSZWFkZXIgZm10KVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXQpKVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10KSlcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10KVxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUeXBlcyAqKVxuXG50eXBlICgnYiwgJ2MpIGFjY19mb3JtYXR0aW5nX2dlbiA9XG4gIHwgQWNjX29wZW5fdGFnIG9mICgnYiwgJ2MpIGFjY1xuICB8IEFjY19vcGVuX2JveCBvZiAoJ2IsICdjKSBhY2NcblxuKCogUmV2ZXJzZWQgbGlzdCBvZiBwcmludGluZyBhdG9tcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBwcmludGYgYXJndW1lbnRzLiAqKVxuYW5kICgnYiwgJ2MpIGFjYyA9XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IG9mICgnYiwgJ2MpIGFjYyAqIGZvcm1hdHRpbmdfbGl0XG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gb2YgKCdiLCAnYykgYWNjICogKCdiLCAnYykgYWNjX2Zvcm1hdHRpbmdfZ2VuXG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nICAgICAoKiBMaXRlcmFsIHN0cmluZyAqKVxuICB8IEFjY19jaGFyX2xpdGVyYWwgICBvZiAoJ2IsICdjKSBhY2MgKiBjaGFyICAgICAgICgqIExpdGVyYWwgY2hhciAqKVxuICB8IEFjY19kYXRhX3N0cmluZyAgICBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmcgICAgICgqIEdlbmVyYXRlZCBzdHJpbmcgKilcbiAgfCBBY2NfZGF0YV9jaGFyICAgICAgb2YgKCdiLCAnYykgYWNjICogY2hhciAgICAgICAoKiBHZW5lcmF0ZWQgY2hhciAqKVxuICB8IEFjY19kZWxheSAgICAgICAgICBvZiAoJ2IsICdjKSBhY2MgKiAoJ2IgLT4gJ2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBEZWxheWVkIHByaW50aW5nICglYSwgJXQpICopXG4gIHwgQWNjX2ZsdXNoICAgICAgICAgIG9mICgnYiwgJ2MpIGFjYyAgICAgICAgICAgICAgKCogRmx1c2ggKilcbiAgfCBBY2NfaW52YWxpZF9hcmcgICAgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nXG4gICAgICAoKiBSYWlzZSBJbnZhbGlkX2FyZ3VtZW50IG1zZyAqKVxuICB8IEVuZF9vZl9hY2NcblxuKCogTGlzdCBvZiBoZXRlcm9nZW5lb3VzIHZhbHVlcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBzY2FuZiBjYWxsYmFjayBhcmd1bWVudHMuICopXG50eXBlICgnYSwgJ2IpIGhldGVyX2xpc3QgPVxuICB8IENvbnMgOiAnYyAqICgnYSwgJ2IpIGhldGVyX2xpc3QgLT4gKCdjIC0+ICdhLCAnYikgaGV0ZXJfbGlzdFxuICB8IE5pbCA6ICgnYiwgJ2IpIGhldGVyX2xpc3RcblxuKCogRXhpc3RlbnRpYWwgQmxhY2sgQm94ZXMuICopXG4oKiBVc2VkIHRvIGFic3RyYWN0IHNvbWUgZXhpc3RlbnRpYWwgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRkaW5nIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkZGluZ19mbXR0eV9lYmIgPSBQYWRkaW5nX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZGRpbmdfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRwcmVjIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkcHJlY19mbXR0eV9lYmIgPSBQYWRwcmVjX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICd6KSBwcmVjaXNpb24gKiAoJ3osICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZHByZWNfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcgYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3BhZGRpbmdfZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcGFkZGluZ19mbXRfZWJiID0gUGFkZGluZ19mbXRfRUJCIDpcbiAgICAgKF8sICd4IC0+ICdhKSBwYWRkaW5nICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwYWRkaW5nX2ZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wcmVjaXNpb25fZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcHJlY2lzaW9uX2ZtdF9lYmIgPSBQcmVjaXNpb25fZm10X0VCQiA6XG4gICAgIChfLCAneCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwcmVjaXNpb25fZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcGFkcHJlY19mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmIgPSBQYWRwcmVjX2ZtdF9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAncCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmJcblxuKCogQWJzdHJhY3QgdGhlICdhIGFuZCAnZCBwYXJhbWV0ZXJzIG9mIGFuIGZtdC4gKilcbigqIE91dHB1dCB0eXBlIG9mIHRoZSBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbi4gKilcbnR5cGUgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiID0gRm10X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhbiBmbXR0eSBhbmQgYW4gZm10LiAqKVxuKCogU2VlIHRoZSB0eXBlX2Zvcm1hdF9nZW4gZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRfZm10dHlfZWJiID0gRm10X2ZtdHR5X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBmbXQgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGFuIGZtdHR5IGFuZCBhbiBmbXQuICopXG4oKiBTZWUgdGhlIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYiA9IEZtdHR5X2ZtdF9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgZm10dHkgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10X2ZtdHR5X2ViYiAtPlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgZm10dHkgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIGZvcm1hdCB0eXBlcy4gKilcbnR5cGUgZm10dHlfZWJiID0gRm10dHlfRUJCIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+IGZtdHR5X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgcGFkZGluZyB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgcGFkZGluZ3MuICopXG50eXBlIHBhZGRpbmdfZWJiID0gUGFkZGluZ19FQkIgOiAoJ2EsICdiKSBwYWRkaW5nIC0+IHBhZGRpbmdfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBwcmVjaXNpb24gdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIHByZWNpc2lvbnMuICopXG50eXBlIHByZWNpc2lvbl9lYmIgPSBQcmVjaXNpb25fRUJCIDogKCdhLCAnYikgcHJlY2lzaW9uIC0+IHByZWNpc2lvbl9lYmJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBDb25zdGFudHMgKilcblxuKCogRGVmYXVsdCBwcmVjaXNpb24gZm9yIGZsb2F0IHByaW50aW5nLiAqKVxubGV0IGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252ID1cbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRyB8IEZsb2F0X2ggfCBGbG9hdF9IXG4gIHwgRmxvYXRfQ0YgLT4gLTZcbiAgKCogRm9yICVoICVIIGFuZCAlI0YgZm9ybWF0cywgYSBuZWdhdGl2ZSBwcmVjaXNpb24gbWVhbnMgXCJhcyBtYW55IGRpZ2l0cyBhc1xuICAgICBuZWNlc3NhcnlcIi4gIEZvciB0aGUgb3RoZXIgRlAgZm9ybWF0cywgd2UgdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWVcbiAgICAgb2YgdGhlIHByZWNpc2lvbiwgaGVuY2UgNiBkaWdpdHMgYnkgZGVmYXVsdC4gKilcbiAgfCBGbG9hdF9GIC0+IDEyXG4gICgqIERlZmF1bHQgcHJlY2lzaW9uIGZvciBPQ2FtbCBmbG9hdCBwcmludGluZyAoJUYpLiAqKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEV4dGVybmFscyAqKVxuXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQ6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDMyOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5leHRlcm5hbCBmb3JtYXRfbmF0aXZlaW50OiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ2NDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxuZXh0ZXJuYWwgaGV4c3RyaW5nX29mX2Zsb2F0OiBmbG9hdCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0XCJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICgqIFRvb2xzIHRvIHByZXR0eS1wcmludCBmb3JtYXRzICopXG5cbigqIFR5cGUgb2YgZXh0ZW5zaWJsZSBjaGFyYWN0ZXIgYnVmZmVycy4gKilcbnR5cGUgYnVmZmVyID0ge1xuICBtdXRhYmxlIGluZCA6IGludDtcbiAgbXV0YWJsZSBieXRlcyA6IGJ5dGVzO1xufVxuXG4oKiBDcmVhdGUgYSBmcmVzaCBidWZmZXIuICopXG5sZXQgYnVmZmVyX2NyZWF0ZSBpbml0X3NpemUgPSB7IGluZCA9IDA7IGJ5dGVzID0gQnl0ZXMuY3JlYXRlIGluaXRfc2l6ZSB9XG5cbigqIENoZWNrIHNpemUgb2YgdGhlIGJ1ZmZlciBhbmQgZ3JvdyBpdCBpZiBuZWVkZWQuICopXG5sZXQgYnVmZmVyX2NoZWNrX3NpemUgYnVmIG92ZXJoZWFkID1cbiAgbGV0IGxlbiA9IEJ5dGVzLmxlbmd0aCBidWYuYnl0ZXMgaW5cbiAgbGV0IG1pbl9sZW4gPSBidWYuaW5kICsgb3ZlcmhlYWQgaW5cbiAgaWYgbWluX2xlbiA+IGxlbiB0aGVuIChcbiAgICBsZXQgbmV3X2xlbiA9IEludC5tYXggKGxlbiAqIDIpIG1pbl9sZW4gaW5cbiAgICBsZXQgbmV3X3N0ciA9IEJ5dGVzLmNyZWF0ZSBuZXdfbGVuIGluXG4gICAgQnl0ZXMuYmxpdCBidWYuYnl0ZXMgMCBuZXdfc3RyIDAgbGVuO1xuICAgIGJ1Zi5ieXRlcyA8LSBuZXdfc3RyO1xuICApXG5cbigqIEFkZCB0aGUgY2hhcmFjdGVyIGBjJyB0byB0aGUgYnVmZmVyIGBidWYnLiAqKVxubGV0IGJ1ZmZlcl9hZGRfY2hhciBidWYgYyA9XG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiAxO1xuICBCeXRlcy5zZXQgYnVmLmJ5dGVzIGJ1Zi5pbmQgYztcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgMVxuXG4oKiBBZGQgdGhlIHN0cmluZyBgcycgdG8gdGhlIGJ1ZmZlciBgYnVmJy4gKilcbmxldCBidWZmZXJfYWRkX3N0cmluZyBidWYgcyA9XG4gIGxldCBzdHJfbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiBzdHJfbGVuO1xuICBTdHJpbmcuYmxpdCBzIDAgYnVmLmJ5dGVzIGJ1Zi5pbmQgc3RyX2xlbjtcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgc3RyX2xlblxuXG4oKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4gKilcbmxldCBidWZmZXJfY29udGVudHMgYnVmID1cbiAgQnl0ZXMuc3ViX3N0cmluZyBidWYuYnl0ZXMgMCBidWYuaW5kXG5cbigqKiopXG5cbigqIENvbnZlcnQgYW4gaW50ZWdlciBjb252ZXJzaW9uIHRvIGNoYXIuICopXG5sZXQgY2hhcl9vZl9pY29udiBpY29udiA9IG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCB8IEludF9DZCAtPiAnZCcgfCBJbnRfaSB8IEludF9waSB8IEludF9zaVxuICB8IEludF9DaSAtPiAnaScgfCBJbnRfeCB8IEludF9DeCAtPiAneCcgfCBJbnRfWCB8IEludF9DWCAtPiAnWCcgfCBJbnRfb1xuICB8IEludF9DbyAtPiAnbycgfCBJbnRfdSB8IEludF9DdSAtPiAndSdcblxuKCogQ29udmVydCBhIGZsb2F0IGNvbnZlcnNpb24gdG8gY2hhci4gKilcbigqIGBjRicgd2lsbCBiZSAnRicgZm9yIGRpc3BsYXlpbmcgZm9ybWF0IGFuZCAnZycgdG8gY2FsbCBsaWJjIHByaW50ZiAqKVxubGV0IGNoYXJfb2ZfZmNvbnYgPyhjRj0nRicpIGZjb252ID0gbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIC0+ICdmJyB8IEZsb2F0X2UgLT4gJ2UnXG4gIHwgRmxvYXRfRSAtPiAnRScgfCBGbG9hdF9nIC0+ICdnJ1xuICB8IEZsb2F0X0cgLT4gJ0cnIHwgRmxvYXRfRiAtPiBjRlxuICB8IEZsb2F0X2ggLT4gJ2gnIHwgRmxvYXRfSCAtPiAnSCdcbiAgfCBGbG9hdF9DRiAtPiAnRidcblxuXG4oKiBDb252ZXJ0IGEgc2Nhbm5pbmcgY291bnRlciB0byBjaGFyLiAqKVxubGV0IGNoYXJfb2ZfY291bnRlciBjb3VudGVyID0gbWF0Y2ggY291bnRlciB3aXRoXG4gIHwgTGluZV9jb3VudGVyICAtPiAnbCdcbiAgfCBDaGFyX2NvdW50ZXIgIC0+ICduJ1xuICB8IFRva2VuX2NvdW50ZXIgLT4gJ04nXG5cbigqKiopXG5cbigqIFByaW50IGEgY2hhcl9zZXQgaW4gYSBidWZmZXIgd2l0aCB0aGUgT0NhbWwgZm9ybWF0IGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0ID1cbiAgbGV0IHJlYyBwcmludF9zdGFydCBzZXQgPVxuICAgIGxldCBpc19hbG9uZSBjID1cbiAgICAgIGxldCBiZWZvcmUsIGFmdGVyID0gQ2hhci4oY2hyIChjb2RlIGMgLSAxKSwgY2hyIChjb2RlIGMgKyAxKSkgaW5cbiAgICAgIGlzX2luX2NoYXJfc2V0IHNldCBjXG4gICAgICAmJiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCBiZWZvcmUgJiYgaXNfaW5fY2hhcl9zZXQgc2V0IGFmdGVyKSBpblxuICAgIGlmIGlzX2Fsb25lICddJyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nO1xuICAgIHByaW50X291dCBzZXQgMTtcbiAgICBpZiBpc19hbG9uZSAnLScgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICctJztcbiAgYW5kIHByaW50X291dCBzZXQgaSA9XG4gICAgaWYgaSA8IDI1NiB0aGVuXG4gICAgICBpZiBpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGkpIHRoZW4gcHJpbnRfZmlyc3Qgc2V0IGlcbiAgICAgIGVsc2UgcHJpbnRfb3V0IHNldCAoaSArIDEpXG4gIGFuZCBwcmludF9maXJzdCBzZXQgaSA9XG4gICAgbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnXFwyNTUnIC0+IHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICB8ICddJyB8ICctJyAtPiBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgfCBfIC0+IHByaW50X3NlY29uZCBzZXQgKGkgKyAxKTtcbiAgYW5kIHByaW50X3NlY29uZCBzZXQgaSA9XG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBpKSB0aGVuXG4gICAgICBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICAgIHwgJ1xcMjU1JyAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAyNTQ7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICAgIHwgJ10nIHwgJy0nIHdoZW4gbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IChpICsgMSkpKSAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgICBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgICB8IF8gd2hlbiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgKGkgKyAxKSkpIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIGk7XG4gICAgICAgIHByaW50X291dCBzZXQgKGkgKyAyKTtcbiAgICAgIHwgXyAtPlxuICAgICAgICBwcmludF9pbiBzZXQgKGkgLSAxKSAoaSArIDIpO1xuICAgIGVsc2UgKFxuICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgIHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICApXG4gIGFuZCBwcmludF9pbiBzZXQgaSBqID1cbiAgICBpZiBqID0gMjU2IHx8IG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBqKSkgdGhlbiAoXG4gICAgICBwcmludF9jaGFyIGJ1ZiBpO1xuICAgICAgcHJpbnRfY2hhciBidWYgKGludF9vZl9jaGFyICctJyk7XG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaiAtIDEpO1xuICAgICAgaWYgaiA8IDI1NiB0aGVuIHByaW50X291dCBzZXQgKGogKyAxKTtcbiAgICApIGVsc2VcbiAgICAgIHByaW50X2luIHNldCBpIChqICsgMSk7XG4gIGFuZCBwcmludF9jaGFyIGJ1ZiBpID0gbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnJScgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICAgIHwgJ0AnIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICdAJztcbiAgICB8IGMgICAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGluXG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ1snO1xuICBwcmludF9zdGFydCAoXG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgJ1xcMDAwJ1xuICAgIHRoZW4gKCBidWZmZXJfYWRkX2NoYXIgYnVmICdeJzsgcmV2X2NoYXJfc2V0IGNoYXJfc2V0IClcbiAgICBlbHNlIGNoYXJfc2V0XG4gICk7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nXG5cbigqKiopXG5cbigqIFByaW50IGEgcGFkdHkgaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wYWR0eSBidWYgcGFkdHkgPSBtYXRjaCBwYWR0eSB3aXRoXG4gIHwgTGVmdCAgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLSdcbiAgfCBSaWdodCAtPiAoKVxuICB8IFplcm9zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJzAnXG5cbigqIFByaW50IHRoZSAnXycgb2YgYW4gaWdub3JlZCBmbGFnIGlmIG5lZWRlZC4gKilcbmxldCBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZyA9XG4gIGlmIGlnbl9mbGFnIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXydcblxuKCoqKilcblxubGV0IGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgd2lkdGggLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIHdpZHRoKVxuXG4oKioqKVxuXG4oKiBQcmludCBwYWRkaW5nIGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcGFkZGluZyA6IHR5cGUgYSBiIC4gYnVmZmVyIC0+IChhLCBiKSBwYWRkaW5nIC0+IHVuaXQgPVxuZnVuIGJ1ZiBwYWQgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nIC0+ICgpXG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCBuKSAtPlxuICAgIGJwcmludF9wYWR0eSBidWYgcGFkdHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wYWRkaW5nIHBhZHR5IC0+XG4gICAgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcqJ1xuXG4oKiBQcmludCBwcmVjaXNpb24gaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wcmVjaXNpb24gOiB0eXBlIGEgYiAuIGJ1ZmZlciAtPiAoYSwgYikgcHJlY2lzaW9uIC0+IHVuaXQgPVxuICBmdW4gYnVmIHByZWMgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uIC0+ICgpXG4gIHwgTGl0X3ByZWNpc2lvbiBuIC0+XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLic7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wcmVjaXNpb24gLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIuKlwiXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBvciAnIycgYXNzb2NpYXRlZCB0byBhbiBpbnQgY29udmVyc2lvbi4gKilcbmxldCBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnYgPSBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X3BkIHwgSW50X3BpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgSW50X3NkIHwgSW50X3NpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgSW50X0N4IHwgSW50X0NYIHwgSW50X0NvIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcjJ1xuICB8IEludF9kIHwgSW50X2kgfCBJbnRfeCB8IEludF9YIHwgSW50X28gfCBJbnRfdSAtPiAoKVxuXG4oKiBQcmludCBhbiBjb21wbGV0ZSBpbnQgZm9ybWF0IGluIGEgYnVmZmVyIChleDogXCIlMy4qZFwiKS4gKilcbmxldCBicHJpbnRfaW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9pY29udiBpY29udilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBhbmQvb3IgJyMnIGFzc29jaWF0ZWQgdG8gYSBmbG9hdCBjb252ZXJzaW9uLiAqKVxubGV0IGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udiA9XG4gIGJlZ2luIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZmxhZ19wIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgRmxvYXRfZmxhZ19zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgRmxvYXRfZmxhZ18gLT4gKCkgZW5kO1xuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X0NGIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyMnXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0dcbiAgfCBGbG9hdF9GIHwgRmxvYXRfaCB8IEZsb2F0X0ggLT4gKClcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmbG9hdCBmb3JtYXQgaW4gYSBidWZmZXIgKGV4OiBcIiUrKi4zZlwiKS4gKilcbmxldCBicHJpbnRfZmxvYXRfZm10IGJ1ZiBpZ25fZmxhZyBmY29udiBwYWQgcHJlYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2Zjb252IGZjb252KVxuXG4oKiBDb21wdXRlIHRoZSBsaXRlcmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEZvcm1hdHRpbmdfbGl0LiAqKVxuKCogVXNlZCBieSBQcmludGYgYW5kIFNjYW5mIHdoZXJlIGZvcm1hdHRpbmcgaXMgbm90IGludGVycHJldGVkLiAqKVxubGV0IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmb3JtYXR0aW5nX2xpdCA9IG1hdGNoIGZvcm1hdHRpbmdfbGl0IHdpdGhcbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAtPiBcIkBdXCJcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAtPiBcIkB9XCJcbiAgfCBCcmVhayAoc3RyLCBfLCBfKSAgICAtPiBzdHJcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAtPiBcIkA/XCJcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAtPiBcIkBcXG5cIlxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgIC0+IFwiQC5cIlxuICB8IE1hZ2ljX3NpemUgKHN0ciwgXykgIC0+IHN0clxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgIC0+IFwiQEBcIlxuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgIC0+IFwiQCVcIlxuICB8IFNjYW5faW5kaWMgYyAtPiBcIkBcIiBeIChTdHJpbmcubWFrZSAxIGMpXG5cbigqKiopXG5cbigqIFByaW50IGEgbGl0ZXJhbCBjaGFyIGluIGEgYnVmZmVyLCBlc2NhcGUgJyUnIGJ5IFwiJSVcIi4gKilcbmxldCBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBjaHIgPSBtYXRjaCBjaHIgd2l0aFxuICB8ICclJyAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlJVwiXG4gIHwgXyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGNoclxuXG4oKiBQcmludCBhIGxpdGVyYWwgc3RyaW5nIGluIGEgYnVmZmVyLCBlc2NhcGUgYWxsICclJyBieSBcIiUlXCIuICopXG5sZXQgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBzdHIgPVxuICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzdHIgLSAxIGRvXG4gICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgc3RyLltpXVxuICBkb25lXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwcmV0dHktcHJpbnRpbmcgKilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmb3JtYXQgdHlwZSAoYW4gZm10dHkpIGluIGEgYnVmZmVyLiAqKVxubGV0IHJlYyBicHJpbnRfZm10dHkgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgICBidWZmZXIgLT4gKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIGZtdHR5X3JlbCAtPiB1bml0ID1cbmZ1biBidWYgZm10dHkgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVjXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXNcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlaVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludDMyX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVsaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJW5pXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlTGlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEZsb2F0X3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVmXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQm9vbF90eSByZXN0ICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJUJcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBBbHBoYV90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlYVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFRoZXRhX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV0XCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQW55X3R5IHJlc3QgICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJT9cIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBSZWFkZXJfdHkgcmVzdCAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlclwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVfclwiO1xuICAgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IEZvcm1hdF9hcmdfdHkgKHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIle1wiOyBicHJpbnRfZm10dHkgYnVmIHN1Yl9mbXR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlfVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgRm9ybWF0X3N1YnN0X3R5IChzdWJfZm10dHksIF8sIHJlc3QpIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJShcIjsgYnByaW50X2ZtdHR5IGJ1ZiBzdWJfZm10dHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgRW5kX29mX2ZtdHR5IC0+ICgpXG5cbigqKiopXG5cbmxldCByZWMgaW50X29mX2N1c3RvbV9hcml0eSA6IHR5cGUgYSBiIGMgLlxuICAoYSwgYiwgYykgY3VzdG9tX2FyaXR5IC0+IGludCA9XG4gIGZ1bmN0aW9uXG4gIHwgQ3VzdG9tX3plcm8gLT4gMFxuICB8IEN1c3RvbV9zdWNjIHggLT4gMSArIGludF9vZl9jdXN0b21fYXJpdHkgeFxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfZm10IGJ1ZiBmbXQgPVxuICBsZXQgcmVjIGZtdGl0ZXIgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYm9vbCAtPiB1bml0ID1cbiAgZnVuIGZtdCBpZ25fZmxhZyAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdzJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdTJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2ludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ2wnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICduJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICdMJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2Zsb2F0X2ZtdCBidWYgaWduX2ZsYWcgZmNvbnYgcGFkIHByZWM7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IENoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnYyc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdDJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQic7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBBbHBoYSByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdhJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAndCc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpIC0+XG4gICAgICBmb3IgX2kgPSAxIHRvIGludF9vZl9jdXN0b21fYXJpdHkgYXJpdHkgZG9cbiAgICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICc/JztcbiAgICAgIGRvbmU7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBSZWFkZXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAncic7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsdXNoIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUhXCI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIHN0cjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgY2hyO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0OyBidWZmZXJfYWRkX2NoYXIgYnVmICd7JztcbiAgICAgIGJwcmludF9mbXR0eSBidWYgZm10dHk7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICd9JztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICBicHJpbnRfZm10dHkgYnVmIGZtdHR5OyBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKSc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgd2lkdGhfb3B0OyBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0O1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfY291bnRlciBjb3VudGVyKTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgXCIwY1wiOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICAgIGZtdGl0ZXIgZm10JyB0cnVlO1xuXG4gICAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgKHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0KTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggZm10aW5nX2dlbiB3aXRoXG4gICAgICB8IE9wZW5fdGFnIChGb3JtYXQgKF8sIHN0cikpIC0+XG4gICAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIkB7XCI7IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzdHJcbiAgICAgIHwgT3Blbl9ib3ggKEZvcm1hdCAoXywgc3RyKSkgLT5cbiAgICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiQFtcIjsgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHN0clxuICAgICAgZW5kO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+ICgpXG5cbiAgaW4gZm10aXRlciBmbXQgZmFsc2VcblxuKCoqKilcblxuKCogQ29udmVydCBhIGZvcm1hdCB0byBzdHJpbmcuICopXG5sZXQgc3RyaW5nX29mX2ZtdCBmbXQgPVxuICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICBicHJpbnRfZm10IGJ1ZiBmbXQ7XG4gIGJ1ZmZlcl9jb250ZW50cyBidWZcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVHlwZSBleHRyYWN0aW9uICopXG5cbnR5cGUgKF8sIF8pIGVxID0gUmVmbCA6ICgnYSwgJ2EpIGVxXG5cbigqIEludmFyaWFudDogdGhpcyBmdW5jdGlvbiBpcyB0aGUgaWRlbnRpdHkgb24gdmFsdWVzLlxuXG4gICBJbiBwYXJ0aWN1bGFyLCBpZiAodHkxLCB0eTIpIGhhdmUgZXF1YWwgdmFsdWVzLCB0aGVuXG4gICAodHJhbnMgKHN5bW0gdHkxKSB0eTIpIHJlc3BlY3RzIHRoZSAndHJhbnMnIHByZWNvbmRpdGlvbi4gKilcbmxldCByZWMgc3ltbSA6IHR5cGUgYTEgYjEgYzEgZDEgZTEgZjEgYTIgYjIgYzIgZDIgZTIgZjIgLlxuICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4tPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMixcbiAgICBhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXR0eV9yZWxcbj0gZnVuY3Rpb25cbiAgfCBDaGFyX3R5IHJlc3QgLT4gQ2hhcl90eSAoc3ltbSByZXN0KVxuICB8IEludF90eSByZXN0IC0+IEludF90eSAoc3ltbSByZXN0KVxuICB8IEludDMyX3R5IHJlc3QgLT4gSW50MzJfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnQ2NF90eSByZXN0IC0+IEludDY0X3R5IChzeW1tIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gTmF0aXZlaW50X3R5IChzeW1tIHJlc3QpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPiBGbG9hdF90eSAoc3ltbSByZXN0KVxuICB8IEJvb2xfdHkgcmVzdCAtPiBCb29sX3R5IChzeW1tIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT4gU3RyaW5nX3R5IChzeW1tIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPiBUaGV0YV90eSAoc3ltbSByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT4gQWxwaGFfdHkgKHN5bW0gcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPiBBbnlfdHkgKHN5bW0gcmVzdClcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPiBSZWFkZXJfdHkgKHN5bW0gcmVzdClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+IElnbm9yZWRfcmVhZGVyX3R5IChzeW1tIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIHN5bW0gcmVzdClcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkyLCB0eTEsIHN5bW0gcmVzdClcbiAgfCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG5cbmxldCByZWMgZm10dHlfcmVsX2RldCA6IHR5cGUgYTEgYiBjIGQxIGUxIGYxIGEyIGQyIGUyIGYyIC5cbiAgKGExLCBiLCBjLCBkMSwgZTEsIGYxLFxuICAgYTIsIGIsIGMsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoZjEsIGYyKSBlcSAtPiAoYTEsIGEyKSBlcSlcbiAgKiAoKGExLCBhMikgZXEgLT4gKGYxLCBmMikgZXEpXG4gICogKChlMSwgZTIpIGVxIC0+IChkMSwgZDIpIGVxKVxuICAqICgoZDEsIGQyKSBlcSAtPiAoZTEsIGUyKSBlcSlcbj0gZnVuY3Rpb25cbiAgfCBFbmRfb2ZfZm10dHkgLT5cbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbClcbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG4gIHwgRm9ybWF0X2FyZ190eSAoX3R5LCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgbGV0IGFnLCBnYSwgZGosIGpkID0gZm10dHlfcmVsX2RldCB0eSBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZyBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGdhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gbGV0IFJlZmwgPSBkaiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGpkIFJlZmwgaW4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG5cbigqIFByZWNvbmRpdGlvbjogd2UgYXNzdW1lIHRoYXQgdGhlIHR3byBmbXR0eV9yZWwgYXJndW1lbnRzIGhhdmUgZXF1YWxcbiAgIHZhbHVlcyAoYXQgcG9zc2libHkgZGlzdGluY3QgdHlwZXMpOyB0aGlzIGludmFyaWFudCBjb21lcyBmcm9tIHRoZSB3YXlcbiAgIGZtdHR5X3JlbCB3aXRuZXNzZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSB0eXBlLWNoZWNrZXJcblxuICAgVGhlIGNvZGUgYmVsb3cgdXNlcyAoYXNzZXJ0IGZhbHNlKSB3aGVuIHRoaXMgYXNzdW1wdGlvbiBpcyBicm9rZW4uIFRoZVxuICAgY29kZSBwYXR0ZXJuIGlzIHRoZSBmb2xsb3dpbmc6XG5cbiAgICAgfCBGb28geCwgRm9vIHkgLT5cbiAgICAgICAoKiBjYXNlIHdoZXJlIGluZGVlZCBib3RoIHZhbHVlc1xuICAgICAgICAgIHN0YXJ0IHdpdGggY29uc3RydWN0b3IgRm9vICopXG4gICAgIHwgRm9vIF8sIF9cbiAgICAgfCBfLCBGb28gXyAtPlxuICAgICAgICgqIGRpZmZlcmVudCBoZWFkIGNvbnN0cnVjdG9yczogYnJva2VuIHByZWNvbmRpdGlvbiAqKVxuICAgICAgIGFzc2VydCBmYWxzZVxuKilcbmFuZCB0cmFucyA6IHR5cGVcbiAgYTEgYjEgYzEgZDEgZTEgZjFcbiAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgYTMgYjMgYzMgZDMgZTMgZjNcbi5cbiAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIsXG4gICAgYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHlfcmVsXG4tPiAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eV9yZWxcbj0gZnVuIHR5MSB0eTIgLT4gbWF0Y2ggdHkxLCB0eTIgd2l0aFxuICB8IENoYXJfdHkgcmVzdDEsIENoYXJfdHkgcmVzdDIgLT4gQ2hhcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgU3RyaW5nX3R5IHJlc3QxLCBTdHJpbmdfdHkgcmVzdDIgLT4gU3RyaW5nX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBCb29sX3R5IHJlc3QxLCBCb29sX3R5IHJlc3QyIC0+IEJvb2xfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludF90eSByZXN0MSwgSW50X3R5IHJlc3QyIC0+IEludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50MzJfdHkgcmVzdDEsIEludDMyX3R5IHJlc3QyIC0+IEludDMyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnQ2NF90eSByZXN0MSwgSW50NjRfdHkgcmVzdDIgLT4gSW50NjRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IE5hdGl2ZWludF90eSByZXN0MSwgTmF0aXZlaW50X3R5IHJlc3QyIC0+IE5hdGl2ZWludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRmxvYXRfdHkgcmVzdDEsIEZsb2F0X3R5IHJlc3QyIC0+IEZsb2F0X3R5ICh0cmFucyByZXN0MSByZXN0MilcblxuICB8IEFscGhhX3R5IHJlc3QxLCBBbHBoYV90eSByZXN0MiAtPiBBbHBoYV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQWxwaGFfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBBbHBoYV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgVGhldGFfdHkgcmVzdDEsIFRoZXRhX3R5IHJlc3QyIC0+IFRoZXRhX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBUaGV0YV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIFRoZXRhX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBBbnlfdHkgcmVzdDEsIEFueV90eSByZXN0MiAtPiBBbnlfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEFueV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEFueV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgUmVhZGVyX3R5IHJlc3QxLCBSZWFkZXJfdHkgcmVzdDIgLT4gUmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBSZWFkZXJfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBSZWFkZXJfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QxLCBJZ25vcmVkX3JlYWRlcl90eSByZXN0MiAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIElnbm9yZWRfcmVhZGVyX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBGb3JtYXRfYXJnX3R5ICh0eTEsIHJlc3QxKSwgRm9ybWF0X2FyZ190eSAodHkyLCByZXN0MikgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0cmFucyB0eTEgdHkyLCB0cmFucyByZXN0MSByZXN0MilcbiAgfCBGb3JtYXRfYXJnX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRm9ybWF0X2FyZ190eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTExLCB0eTEyLCByZXN0MSksXG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTIxLCB0eTIyLCByZXN0MikgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEyKSB0eTIxIGluXG4gICAgbGV0IF8sIGYyLCBfLCBmNCA9IGZtdHR5X3JlbF9kZXQgdHkgaW5cbiAgICBsZXQgUmVmbCA9IGYyIFJlZmwgaW5cbiAgICBsZXQgUmVmbCA9IGY0IFJlZmwgaW5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MTEsIHR5MjIsIHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZvcm1hdF9zdWJzdF90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEZvcm1hdF9zdWJzdF90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRW5kX29mX2ZtdHR5LCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG4gIHwgRW5kX29mX2ZtdHR5LCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEVuZF9vZl9mbXR0eSAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHJlYyBmbXR0eV9vZl9mb3JtYXR0aW5nX2dlbiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm9ybWF0dGluZ19nZW4gLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGZvcm1hdHRpbmdfZ2VuIC0+IG1hdGNoIGZvcm1hdHRpbmdfZ2VuIHdpdGhcbiAgfCBPcGVuX3RhZyAoRm9ybWF0IChmbXQsIF8pKSAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgT3Blbl9ib3ggKEZvcm1hdCAoZm10LCBfKSkgLT4gZm10dHlfb2ZfZm10IGZtdFxuXG4oKiBFeHRyYWN0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIChhbiBmbXR0eSkgb2YgYSBmb3JtYXQuICopXG5hbmQgZm10dHlfb2ZfZm10IDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBmbXR0eSAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuXG4gIHwgSW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBJbnQzMiAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnQzMl90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBOYXRpdmVpbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoTmF0aXZlaW50X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEludDY0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludDY0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEZsb2F0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuXG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAgICAgICAgICAgLT5cbiAgICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChCb29sX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG4gIHwgQWxwaGEgcmVzdCAgICAgICAgICAgICAgICAgLT4gQWxwaGFfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgIC0+IFRoZXRhX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAgICAtPiBmbXR0eV9vZl9jdXN0b20gYXJpdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFJlYWRlciByZXN0ICAgICAgICAgICAgICAgIC0+IFJlYWRlcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGb3JtYXRfYXJnIChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0IChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5LCB0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGbHVzaCByZXN0ICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAgICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+IFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT4gSW50X3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAtPiBmbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdFxuICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpICAtPlxuICAgIGNvbmNhdF9mbXR0eSAoZm10dHlfb2ZfZm9ybWF0dGluZ19nZW4gZm10aW5nX2dlbikgKGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgLT4gRW5kX29mX2ZtdHR5XG5cbmFuZCBmbXR0eV9vZl9jdXN0b20gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICh5LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gYXJpdHkgZm10dHkgLT4gbWF0Y2ggYXJpdHkgd2l0aFxuICB8IEN1c3RvbV96ZXJvIC0+IGZtdHR5XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT4gQW55X3R5IChmbXR0eV9vZl9jdXN0b20gYXJpdHkgZm10dHkpXG5cbigqIEV4dHJhY3QgdGhlIGZtdHR5IG9mIGFuIGlnbm9yZWQgcGFyYW1ldGVyIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mXG4gICB0aGUgZm9ybWF0LiAqKVxuYW5kIGZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gY29uY2F0X2ZtdHR5IGZtdHR5IChmbXR0eV9vZl9mbXQgZm10KVxuICB8IElnbm9yZWRfcmVhZGVyICAgICAgICAgICAgICAgICAgLT4gSWdub3JlZF9yZWFkZXJfdHkgKGZtdHR5X29mX2ZtdCBmbXQpXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwYWRkaW5nIGlzIHRha2VuIGFzIGFuIGV4dHJhIGFyZ3VtZW50IChleDogXCIlKnNcIikuICopXG5hbmQgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSA6IHR5cGUgeCBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIGEpIHBhZGRpbmcgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwYWQgZm10dHkgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgICAgLT4gZm10dHlcbiAgICB8IExpdF9wYWRkaW5nIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wYWRkaW5nIF8gLT4gSW50X3R5IGZtdHR5XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwcmVjaXNpb24gaXMgdGFrZW4gYXMgYW4gZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUuKmZcIikuKilcbmFuZCBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgOiB0eXBlIHggYSBiIGMgZCBlIGYgLlxuICAgICh4LCBhKSBwcmVjaXNpb24gLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwcmVjIGZtdHR5IC0+IG1hdGNoIHByZWMgd2l0aFxuICAgIHwgTm9fcHJlY2lzaW9uICAgIC0+IGZtdHR5XG4gICAgfCBMaXRfcHJlY2lzaW9uIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wcmVjaXNpb24gICAtPiBJbnRfdHkgZm10dHlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgdHlwaW5nICopXG5cbigqIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIGZvcm1hdCBkb2VzIG5vdCBtYXRjaCBhIGdpdmVuIGZvcm1hdCB0eXBlLiAqKVxuZXhjZXB0aW9uIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIHBhZGRpbmcuICopXG4oKiBUYWtlIGFuIEludF90eSBmcm9tIHRoZSBmbXR0eSBpZiB0aGUgaW50ZWdlciBzaG91bGQgYmUga2VwdCBhcyBhcmd1bWVudC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkZGluZyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRkaW5nX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIGZtdHR5IC0+IG1hdGNoIHBhZCwgZm10dHkgd2l0aFxuICB8IE5vX3BhZGRpbmcsIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKE5vX3BhZGRpbmcsIGZtdHR5KVxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKExpdF9wYWRkaW5nIChwYWR0eSx3KSxmbXR0eSlcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgSW50X3R5IHJlc3QgLT4gUGFkZGluZ19mbXR0eV9FQkIgKEFyZ19wYWRkaW5nIHBhZHR5LHJlc3QpXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIENvbnZlcnQgYSAodXBhZGRpbmcsIHVwcmVjaXNpb24pIHRvIGEgKHBhZGRpbmcsIHByZWNpc2lvbikuICopXG4oKiBUYWtlIG9uZSBvciB0d28gSW50X3R5IGZyb20gdGhlIGZtdHR5IGlmIG5lZWRlZC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkcHJlYyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IHogLlxuICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeikgcHJlY2lzaW9uIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRwcmVjX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIHByZWMgZm10dHkgLT4gbWF0Y2ggcHJlYywgdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIE5vX3ByZWNpc2lvbiwgcmVzdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAsIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgTGl0X3ByZWNpc2lvbiBwLCByZXN0KVxuICB8IEFyZ19wcmVjaXNpb24sIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEludF90eSByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIEFyZ19wcmVjaXNpb24sIHJlc3QpXG4gIHwgXywgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBJZiB0eXBpbmcgc3VjY2VlZCwgZ2VuZXJhdGUgYSBjb3B5IG9mIHRoZSBmb3JtYXQgd2l0aCB0aGUgc2FtZVxuICAgIHR5cGUgcGFyYW1ldGVycyBhcyB0aGUgZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCByZWMgdHlwZV9mb3JtYXQgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjIgIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+IG1hdGNoIHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkgd2l0aFxuICB8IEZtdF9mbXR0eV9FQkIgKGZtdCcsIEVuZF9vZl9mbXR0eSkgLT4gZm10J1xuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG5hbmQgdHlwZV9mb3JtYXRfZ2VuIDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRfZm10dHlfZWJiXG49IGZ1biBmbXQgZm10dHkgLT4gbWF0Y2ggZm10LCBmbXR0eSB3aXRoXG4gIHwgQ2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXIgZm10JywgZm10dHknKVxuICB8IENhbWxfY2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfY2hhciBmbXQnLCBmbXR0eScpXG4gIHwgU3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKFN0cmluZyAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfc3RyaW5nIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50MzJfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludDMyIChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgTmF0aXZlaW50X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludDY0X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgRmxvYXRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEJvb2wgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEJvb2xfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEJvb2wgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbHVzaCBmbXRfcmVzdCwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGbHVzaCBmbXQnLCBmbXR0eScpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU3RyaW5nX2xpdGVyYWwgKHN0ciwgZm10JyksIGZtdHR5JylcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXJfbGl0ZXJhbCAoY2hyLCBmbXQnKSwgZm10dHknKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5LCBmbXRfcmVzdCksXG4gICAgRm9ybWF0X2FyZ190eSAoc3ViX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgc3ViX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWJfZm10dHknIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5JywgZm10JyksIGZtdHR5JylcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViX2ZtdHR5MSwgX3N1Yl9mbXR0eTIsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWJfZm10dHkxKSB0aGVuXG4gICAgICByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID1cbiAgICAgIHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCAoZXJhc2VfcmVsIGZtdHR5X3Jlc3QpXG4gICAgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eTEsIGZtdCcpLCBmbXR0eScpXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBBbHBoYSBmbXRfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChBbHBoYSBmbXQnLCBmbXR0eScpXG4gIHwgVGhldGEgZm10X3Jlc3QsIFRoZXRhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoVGhldGEgZm10JywgZm10dHknKVxuXG4gICgqIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXQnKSwgZm10dHknKVxuICB8IEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nX2dlbiwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgdHlwZV9mb3JtYXR0aW5nX2dlbiBmb3JtYXR0aW5nX2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0XG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IFJlYWRlciBmbXRfcmVzdCwgUmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoUmVhZGVyIGZtdCcsIGZtdHR5JylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXRfcmVzdCksIFN0cmluZ190eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdCcpLCBmbXR0eScpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpLCBJbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXQnKSwgZm10dHknKVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICB0eXBlX2lnbm9yZWRfcGFyYW0gaWduIHJlc3QgZm10dHlfcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCwgZm10dHlfcmVzdCAtPiBGbXRfZm10dHlfRUJCIChFbmRfb2ZfZm9ybWF0LCBmbXR0eV9yZXN0KVxuXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbmFuZCB0eXBlX2Zvcm1hdHRpbmdfZ2VuIDogdHlwZSBhMSBhMyBiMSBiMyBjMSBjMyBkMSBkMyBlMSBlMiBlMyBmMSBmMiBmMyAuXG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZvcm1hdHRpbmdfZ2VuIC0+XG4gICAgKGYxLCBiMSwgYzEsIGUxLCBlMiwgZjIpIGZtdCAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eSAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXRfZm10dHlfZWJiID1cbmZ1biBmb3JtYXR0aW5nX2dlbiBmbXQwIGZtdHR5MCAtPiBtYXRjaCBmb3JtYXR0aW5nX2dlbiB3aXRoXG4gIHwgT3Blbl90YWcgKEZvcm1hdCAoZm10MSwgc3RyKSkgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MiwgZm10dHkyKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQxIGZtdHR5MCBpblxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQzLCBmbXR0eTMpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDAgZm10dHkyIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdDIsIHN0cikpLCBmbXQzKSwgZm10dHkzKVxuICB8IE9wZW5fYm94IChGb3JtYXQgKGZtdDEsIHN0cikpIC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDIsIGZtdHR5MikgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MSBmbXR0eTAgaW5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MywgZm10dHkzKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQwIGZtdHR5MiBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQyLCBzdHIpKSwgZm10MyksIGZtdHR5MylcblxuKCogVHlwZSBhbiBJZ25vcmVkX3BhcmFtIG5vZGUgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuYW5kIHR5cGVfaWdub3JlZF9wYXJhbSA6IHR5cGUgcCBxIHggeSB6IHQgdSB2IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgeSwgeiwgdCwgcSwgcCkgaWdub3JlZCAtPlxuICAgIChwLCB5LCB6LCBxLCB1LCB2KSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10X2ZtdHR5X2ViYiA9XG5mdW4gaWduIGZtdCBmbXR0eSAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50IF8gICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50MzIgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfbmF0aXZlaW50IF8gICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50NjQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZmxvYXQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSAtPlxuICAgIHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgKElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSkgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSkgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5JywgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSkgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5IGZtdCBmbXR0eSBpblxuICAgIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQnKSxcbiAgICAgICAgICAgICAgICAgICBmbXR0eScpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT4gKFxuICAgIG1hdGNoIGZtdHR5IHdpdGhcbiAgICB8IElnbm9yZWRfcmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3JlYWRlciwgZm10JyksIGZtdHR5JylcbiAgICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG5cbmFuZCB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIDogdHlwZSBhMSBhMiBiMSBiMiBjMSBjMiBkMSBkMiBlMSBlMiBmMSBmMiAuXG4gICAgKGEyLCBiMiwgYzIsIGQyLCBkMiwgYTIpIGlnbm9yZWQgLT5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdF9mbXR0eV9lYmJcbj0gZnVuIGlnbiBmbXQgZm10dHkgLT5cbiAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5IGluXG4gIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbiwgZm10JyksIGZtdHR5JylcblxuKCogVHlwaW5nIG9mIHRoZSBjb21wbGV4IGNhc2U6IFwiJV8oLi4uJSlcIi4gKilcbmFuZCB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiA6IHR5cGUgdyB4IHkgeiBwIHMgdCB1IGEgYiBjIGQgZSBmIC5cbiAgICAodywgeCwgeSwgeiwgcywgcCkgZm10dHkgLT5cbiAgICAocCwgeCwgeSwgcywgdCwgdSkgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eV9mbXRfZWJiID1cbmZ1biBzdWJfZm10dHkgZm10IGZtdHR5IC0+IG1hdGNoIHN1Yl9mbXR0eSwgZm10dHkgd2l0aFxuICB8IENoYXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQ2hhcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0LCBTdHJpbmdfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludDMyX3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnQzMl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnQzMl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0LCBOYXRpdmVpbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnQ2NF90eSBzdWJfZm10dHlfcmVzdCwgSW50NjRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50NjRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEZsb2F0X3R5IHN1Yl9mbXR0eV9yZXN0LCBGbG9hdF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGbG9hdF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgQm9vbF90eSBzdWJfZm10dHlfcmVzdCwgQm9vbF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChCb29sX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBBbHBoYV90eSBzdWJfZm10dHlfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQWxwaGFfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFRoZXRhX3R5IHN1Yl9mbXR0eV9yZXN0LCBUaGV0YV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChUaGV0YV90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0LCBSZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBzdWJfZm10dHlfcmVzdCwgSWdub3JlZF9yZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSWdub3JlZF9yZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuXG4gIHwgRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eSwgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiBzdWIyX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWIyX2ZtdHR5JyB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5Jywgc3ViX2ZtdHR5X3Jlc3QnKSwgZm10JylcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHksICBzdWIyX2ZtdHR5LCAgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgICgqIFRPRE8gZGVmaW5lIEZtdHR5X3JlbF9FQkIgdG8gcmVtb3ZlIHRob3NlIGVyYXNlX3JlbCAqKVxuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHknKVxuICAgIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5JylcbiAgICB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IHN1Yl9mbXR0eScgPSB0cmFucyAoc3ltbSBzdWIxX2ZtdHR5Jykgc3ViMl9mbXR0eScgaW5cbiAgICBsZXQgXywgZjIsIF8sIGY0ID0gZm10dHlfcmVsX2RldCBzdWJfZm10dHknIGluXG4gICAgbGV0IFJlZmwgPSBmMiBSZWZsIGluXG4gICAgbGV0IFJlZmwgPSBmNCBSZWZsIGluXG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gKGVyYXNlX3JlbCBzdWJfZm10dHlfcmVzdCkgZm10IGZtdHR5X3Jlc3RcbiAgICBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbSBzdWJfZm10dHlfcmVzdCcpLFxuICAgICAgICAgICAgICAgICAgIGZtdCcpXG4gIHwgRW5kX29mX2ZtdHR5LCBmbXR0eSAtPlxuICAgIEZtdHR5X2ZtdF9FQkIgKEVuZF9vZl9mbXR0eSwgdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSlcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBgcmVjYXN0YCBpcyBhIGJpdCBkaXNhcHBvaW50aW5nLiBUaGVcbiAgIGludmFyaWFudCBwcm92aWRlZCBieSB0aGUgdHlwZSBhcmUgdmVyeSBzdHJvbmc6IHRoZSBpbnB1dCBmb3JtYXQnc1xuICAgdHlwZSBpcyBpbiByZWxhdGlvbiB0byB0aGUgb3V0cHV0IHR5cGUncyBhcyB3aXRuZXNzZWQgYnkgdGhlXG4gICBmbXR0eV9yZWwgYXJndW1lbnQuIE9uZSB3b3VsZCBhdCBmaXJzdCBleHBlY3QgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgdG90YWwsIGFuZCBpbXBsZW1lbnRhYmxlIGJ5IGV4aGF1c3RpdmUgcGF0dGVybiBtYXRjaGluZy4gSW5zdGVhZCxcbiAgIHdlIHJldXNlIHRoZSBoaWdobHkgcGFydGlhbCBhbmQgbXVjaCBsZXNzIHdlbGwtZGVmaW5lZCBmdW5jdGlvblxuICAgYHR5cGVfZm9ybWF0YCB0aGF0IGhhcyBsb3N0IGFsbCBrbm93bGVkZ2Ugb2YgdGhlIGNvcnJlc3BvbmRlbmNlXG4gICBiZXR3ZWVuIHRoZSBhcmd1bWVudCdzIHR5cGVzLlxuXG4gICBCZXNpZGVzIHRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXVzZXMgYSBsb3Qgb2YgdGhlXG4gICBgdHlwZV9mb3JtYXRgIGxvZ2ljIChlZy46IHNlZWluZyBJbnRfdHkgaW4gdGhlIGZtdHR5IHBhcmFtZXRlciBkb2VzXG4gICBub3QgbGV0IHlvdSBtYXRjaCBvbiBJbnQgb25seSwgYXMgeW91IG1heSBpbiBmYWN0IGhhdmUgRmxvYXRcbiAgIChBcmdfcGFkZGluZywgLi4uKSAoXCIlLipkXCIpIGJlZ2lubmluZyB3aXRoIGFuIEludF90eSksIGl0IGlzIGFsc29cbiAgIGEgcGFydGlhbCBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgdHlwaW5nIGluZm9ybWF0aW9uIGluIGEgZm9ybWF0IGlzXG4gICBub3QgcXVpdGUgZW5vdWdoIHRvIHJlY29uc3RydWN0IGl0IHVuYW1iaWd1b3VzbHkuIEZvciBleGFtcGxlLCB0aGVcbiAgIGZvcm1hdCB0eXBlcyBvZiBcIiVkJV9yXCIgYW5kIFwiJV9yJWRcIiBoYXZlIHRoZSBzYW1lIGZvcm1hdDZcbiAgIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGFyZSBub3QgYXQgYWxsIGV4Y2hhbmdlYWJsZSwgYW5kIHB1dHRpbmcgb25lXG4gICBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgbXVzdCByZXN1bHQgaW4gYSBkeW5hbWljIGZhaWx1cmUuXG5cbiAgIEdpdmVuIHRoYXQ6XG4gICAtIHdlJ2QgaGF2ZSB0byBkdXBsaWNhdGUgYSBsb3Qgb2Ygbm9uLXRyaXZpYWwgdHlwaW5nIGxvZ2ljIGZyb20gdHlwZV9mb3JtYXRcbiAgIC0gdGhpcyB3b3VsZG4ndCBldmVuIGVsaW1pbmF0ZSAoYWxsKSB0aGUgZHluYW1pYyBmYWlsdXJlc1xuICAgd2UgZGVjaWRlZCB0byBqdXN0IHJldXNlIHR5cGVfZm9ybWF0IGRpcmVjdGx5IGZvciBub3cuXG4qKVxubGV0IHJlY2FzdCA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMlxuICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+XG4gIHR5cGVfZm9ybWF0IGZtdCAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUHJpbnRpbmcgdG9vbHMgKilcblxuKCogQWRkIHBhZGRpbmcgc3BhY2VzIGFyb3VuZCBhIHN0cmluZy4gKilcbmxldCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCBzdHIgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHdpZHRoLCBwYWR0eSA9XG4gICAgYWJzIHdpZHRoLFxuICAgICgqIHdoaWxlIGxpdGVyYWwgcGFkZGluZyB3aWR0aHMgYXJlIGFsd2F5cyBub24tbmVnYXRpdmUsXG4gICAgICAgZHluYW1pY2FsbHktc2V0IHdpZHRocyAoQXJnX3BhZGRpbmcsIGVnLiAlKmQpIG1heSBiZSBuZWdhdGl2ZTtcbiAgICAgICB3ZSBpbnRlcnByZXQgdGhvc2UgYXMgc3BlY2lmeWluZyBhIHBhZGRpbmctdG8tdGhlLWxlZnQ7IHRoaXNcbiAgICAgICBtZWFucyB0aGF0ICcwJyBtYXkgZ2V0IGRyb3BwZWQgZXZlbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQsXG4gICAgICAgYnV0OlxuICAgICAgIC0gdGhpcyBpcyB3aGF0IHRoZSBsZWdhY3kgaW1wbGVtZW50YXRpb24gZG9lcywgYW5kXG4gICAgICAgICB3ZSBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IGlmIHBvc3NpYmxlXG4gICAgICAgLSB3ZSBjb3VsZCBvbmx5IHNpZ25hbCB0aGlzIGlzc3VlIGJ5IGZhaWxpbmcgYXQgcnVudGltZSxcbiAgICAgICAgIHdoaWNoIGlzIG5vdCB2ZXJ5IG5pY2UuLi4gKilcbiAgICBpZiB3aWR0aCA8IDAgdGhlbiBMZWZ0IGVsc2UgcGFkdHkgaW5cbiAgaWYgd2lkdGggPD0gbGVuIHRoZW4gc3RyIGVsc2VcbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSB3aWR0aCAoaWYgcGFkdHkgPSBaZXJvcyB0aGVuICcwJyBlbHNlICcgJykgaW5cbiAgICBiZWdpbiBtYXRjaCBwYWR0eSB3aXRoXG4gICAgfCBMZWZ0ICAtPiBTdHJpbmcuYmxpdCBzdHIgMCByZXMgMCBsZW5cbiAgICB8IFJpZ2h0IC0+IFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAwICYmIChzdHIuWzBdID0gJysnIHx8IHN0ci5bMF0gPSAnLScgfHwgc3RyLlswXSA9ICcgJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMCBzdHIuWzBdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzICh3aWR0aCAtIGxlbiArIDEpIChsZW4gLSAxKVxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAxICYmIHN0ci5bMF0gPSAnMCcgJiYgKHN0ci5bMV0gPSAneCcgfHwgc3RyLlsxXSA9ICdYJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMSBzdHIuWzFdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzICh3aWR0aCAtIGxlbiArIDIpIChsZW4gLSAyKVxuICAgIHwgWmVyb3MgLT5cbiAgICAgIFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIGVuZDtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBBZGQgJzAnIHBhZGRpbmcgdG8gaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gKilcbmxldCBmaXhfaW50X3ByZWNpc2lvbiBwcmVjIHN0ciA9XG4gIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIG1hdGNoIHN0ci5bMF0gd2l0aFxuICB8ICgnKycgfCAnLScgfCAnICcpIGFzIGMgd2hlbiBwcmVjICsgMSA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMSkgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAwIGM7XG4gICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzIChwcmVjIC0gbGVuICsgMikgKGxlbiAtIDEpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIHdoZW4gcHJlYyArIDIgPiBsZW4gJiYgbGVuID4gMSAmJiAoc3RyLlsxXSA9ICd4JyB8fCBzdHIuWzFdID0gJ1gnKSAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMikgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAxIHN0ci5bMV07XG4gICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzIChwcmVjIC0gbGVuICsgNCkgKGxlbiAtIDIpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHdoZW4gcHJlYyA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIHByZWMgJzAnIGluXG4gICAgU3RyaW5nLmJsaXQgc3RyIDAgcmVzIChwcmVjIC0gbGVuKSBsZW47XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCBfIC0+XG4gICAgc3RyXG5cbigqIEVzY2FwZSBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGluZyBjb252ZW50aW9uLiAqKVxubGV0IHN0cmluZ190b19jYW1sX3N0cmluZyBzdHIgPVxuICBsZXQgc3RyID0gU3RyaW5nLmVzY2FwZWQgc3RyIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKGwgKyAyKSAnXFxcIicgaW5cbiAgU3RyaW5nLnVuc2FmZV9ibGl0IHN0ciAwIHJlcyAxIGw7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfaW50L2ludDMyL25hdGl2ZWludC9pbnQ2NCBmaXJzdCBhcmd1bWVudFxuICAgZnJvbSBhbiBpbnRfY29udi4gKilcbmxldCBmb3JtYXRfb2ZfaWNvbnYgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWRcIiB8IEludF9wZCAtPiBcIiUrZFwiIHwgSW50X3NkIC0+IFwiJSBkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVpXCIgfCBJbnRfcGkgLT4gXCIlK2lcIiB8IEludF9zaSAtPiBcIiUgaVwiXG4gIHwgSW50X3ggLT4gXCIleFwiIHwgSW50X0N4IC0+IFwiJSN4XCJcbiAgfCBJbnRfWCAtPiBcIiVYXCIgfCBJbnRfQ1ggLT4gXCIlI1hcIlxuICB8IEludF9vIC0+IFwiJW9cIiB8IEludF9DbyAtPiBcIiUjb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIldVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZMID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVMZFwiIHwgSW50X3BkIC0+IFwiJStMZFwiIHwgSW50X3NkIC0+IFwiJSBMZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlTGlcIiB8IEludF9waSAtPiBcIiUrTGlcIiB8IEludF9zaSAtPiBcIiUgTGlcIlxuICB8IEludF94IC0+IFwiJUx4XCIgfCBJbnRfQ3ggLT4gXCIlI0x4XCJcbiAgfCBJbnRfWCAtPiBcIiVMWFwiIHwgSW50X0NYIC0+IFwiJSNMWFwiXG4gIHwgSW50X28gLT4gXCIlTG9cIiB8IEludF9DbyAtPiBcIiUjTG9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJUx1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udmwgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWxkXCIgfCBJbnRfcGQgLT4gXCIlK2xkXCIgfCBJbnRfc2QgLT4gXCIlIGxkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVsaVwiIHwgSW50X3BpIC0+IFwiJStsaVwiIHwgSW50X3NpIC0+IFwiJSBsaVwiXG4gIHwgSW50X3ggLT4gXCIlbHhcIiB8IEludF9DeCAtPiBcIiUjbHhcIlxuICB8IEludF9YIC0+IFwiJWxYXCIgfCBJbnRfQ1ggLT4gXCIlI2xYXCJcbiAgfCBJbnRfbyAtPiBcIiVsb1wiIHwgSW50X0NvIC0+IFwiJSNsb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlbHVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252biA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlbmRcIiB8IEludF9wZCAtPiBcIiUrbmRcIiB8IEludF9zZCAtPiBcIiUgbmRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJW5pXCIgfCBJbnRfcGkgLT4gXCIlK25pXCIgfCBJbnRfc2kgLT4gXCIlIG5pXCJcbiAgfCBJbnRfeCAtPiBcIiVueFwiIHwgSW50X0N4IC0+IFwiJSNueFwiXG4gIHwgSW50X1ggLT4gXCIlblhcIiB8IEludF9DWCAtPiBcIiUjblhcIlxuICB8IEludF9vIC0+IFwiJW5vXCIgfCBJbnRfQ28gLT4gXCIlI25vXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVudVwiXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfZmxvYXQgZmlyc3QgYXJndW1lbnQgZnJvbSBhIGZsb2F0X2NvbnYuICopXG5sZXQgZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMgPVxuICAgIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgICBsZXQgc3ltYiA9IGNoYXJfb2ZfZmNvbnYgfmNGOidnJyBmY29udiBpblxuICAgIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gICAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy4nO1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBwcmVjKTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmIHN5bWI7XG4gICAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG5sZXQgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgcyA9XG4gIG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgLT5cbiAgICBsZXQgZGlnaXRzID1cbiAgICAgIGxldCBuID0gcmVmIDAgaW5cbiAgICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgIHwgJzAnLi4nOScgLT4gaW5jciBuXG4gICAgICAgIHwgXyAtPiAoKVxuICAgICAgZG9uZTtcbiAgICAgICFuXG4gICAgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAoZGlnaXRzIC0gMSkgLyAzKSBpblxuICAgIGxldCBwb3MgPSByZWYgMCBpblxuICAgIGxldCBwdXQgYyA9IEJ5dGVzLnNldCBidWYgIXBvcyBjOyBpbmNyIHBvcyBpblxuICAgIGxldCBsZWZ0ID0gcmVmICgoZGlnaXRzIC0gMSkgbW9kIDMgKyAxKSBpblxuICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgfCAnMCcuLic5JyBhcyBjIC0+XG4gICAgICAgICAgaWYgIWxlZnQgPSAwIHRoZW4gKHB1dCAnXyc7IGxlZnQgOj0gMyk7IGRlY3IgbGVmdDsgcHV0IGNcbiAgICAgIHwgYyAtPiBwdXQgY1xuICAgIGRvbmU7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgfCBfIC0+IHNcblxuKCogQ29udmVydCBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIGNvbnZlcnNpb24uICopXG5sZXQgY29udmVydF9pbnQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50IChmb3JtYXRfb2ZfaWNvbnYgaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQzMiBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQzMiAoZm9ybWF0X29mX2ljb252bCBpY29udikgbilcbmxldCBjb252ZXJ0X25hdGl2ZWludCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9uYXRpdmVpbnQgKGZvcm1hdF9vZl9pY29udm4gaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQ2NCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQ2NCAoZm9ybWF0X29mX2ljb252TCBpY29udikgbilcblxuKCogQ29udmVydCBhIGZsb2F0IHRvIHN0cmluZy4gKilcbigqIEZpeCBzcGVjaWFsIGNhc2Ugb2YgXCJPQ2FtbCBmbG9hdCBmb3JtYXRcIi4gKilcbmxldCBjb252ZXJ0X2Zsb2F0IGZjb252IHByZWMgeCA9XG4gIGxldCBoZXggKCkgPVxuICAgIGxldCBzaWduID1cbiAgICAgIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gICAgICB8IEZsb2F0X2ZsYWdfcCAtPiAnKydcbiAgICAgIHwgRmxvYXRfZmxhZ19zIC0+ICcgJ1xuICAgICAgfCBfIC0+ICctJyBpblxuICAgIGhleHN0cmluZ19vZl9mbG9hdCB4IHByZWMgc2lnbiBpblxuICBsZXQgYWRkX2RvdF9pZl9uZWVkZWQgc3RyID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZXQgcmVjIGlzX3ZhbGlkIGkgPVxuICAgICAgaWYgaSA9IGxlbiB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltpXSB3aXRoXG4gICAgICAgIHwgJy4nIHwgJ2UnIHwgJ0UnIC0+IHRydWVcbiAgICAgICAgfCBfIC0+IGlzX3ZhbGlkIChpICsgMSkgaW5cbiAgICBpZiBpc192YWxpZCAwIHRoZW4gc3RyIGVsc2Ugc3RyIF4gXCIuXCIgaW5cbiAgbGV0IGNhbWxfc3BlY2lhbF92YWwgc3RyID0gbWF0Y2ggY2xhc3NpZnlfZmxvYXQgeCB3aXRoXG4gICAgfCBGUF9ub3JtYWwgfCBGUF9zdWJub3JtYWwgfCBGUF96ZXJvIC0+IHN0clxuICAgIHwgRlBfaW5maW5pdGUgLT4gaWYgeCA8IDAuMCB0aGVuIFwibmVnX2luZmluaXR5XCIgZWxzZSBcImluZmluaXR5XCJcbiAgICB8IEZQX25hbiAtPiBcIm5hblwiIGluXG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfaCAtPiBoZXggKClcbiAgfCBGbG9hdF9IIC0+IFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGhleCAoKSlcbiAgfCBGbG9hdF9DRiAtPiBjYW1sX3NwZWNpYWxfdmFsIChoZXggKCkpXG4gIHwgRmxvYXRfRiAtPlxuICAgIGxldCBzdHIgPSBmb3JtYXRfZmxvYXQgKGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjKSB4IGluXG4gICAgY2FtbF9zcGVjaWFsX3ZhbCAoYWRkX2RvdF9pZl9uZWVkZWQgc3RyKVxuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HIC0+XG4gICAgZm9ybWF0X2Zsb2F0IChmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYykgeFxuXG4oKiBDb252ZXJ0IGEgY2hhciB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBmb3JtYXRfY2FtbF9jaGFyIGMgPVxuICBsZXQgc3RyID0gQ2hhci5lc2NhcGVkIGMgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgcmVzID0gQnl0ZXMubWFrZSAobCArIDIpICdcXCcnIGluXG4gIFN0cmluZy51bnNhZmVfYmxpdCBzdHIgMCByZXMgMSBsO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBDb252ZXJ0IGEgZm9ybWF0IHR5cGUgdG8gc3RyaW5nICopXG5sZXQgc3RyaW5nX29mX2ZtdHR5IGZtdHR5ID1cbiAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTtcbiAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBwcmludGluZyBmdW5jdGlvbiAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBwcmludGluZyBmdW5jdGlvbi4gKilcbigqIFVzZWQgdG8gZ2VuZXJhdGUgUHJpbnRmIGFuZCBGb3JtYXQgcHJpbnRpbmcgZnVuY3Rpb25zLiAqKVxuKCogUGFyYW1ldGVyczpcbiAgICAgazogYSBjb250aW51YXRpb24gZmluYWxseSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gICAgIG86IHRoZSBvdXRwdXQgc3RyZWFtIChzZWUgaywgJWEgYW5kICV0KS5cbiAgICAgYWNjOiByZXYgbGlzdCBvZiBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzaCwgZm9ybWF0dGluZywgLi4uKS5cbiAgICAgZm10OiB0aGUgZm9ybWF0LiAqKVxubGV0IHJlYyBtYWtlX3ByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IENoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX2NoYXIgKGFjYywgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZm9ybWF0X2NhbWxfY2hhciBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgKGZ1biBzdHIgLT4gc3RyKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ190b19jYW1sX3N0cmluZ1xuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50IGljb252XG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludDMyIGljb252XG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9uYXRpdmVpbnQgaWNvbnZcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50NjQgaWNvbnZcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2Zsb2F0X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgZmNvbnZcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ19vZl9ib29sXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIGZ1biBmIHggLT4gbWFrZV9wcmludGYgayAoQWNjX2RlbGF5IChhY2MsIGZ1biBvIC0+IGYgbyB4KSkgcmVzdFxuICB8IFRoZXRhIHJlc3QgLT5cbiAgICBmdW4gZiAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGVsYXkgKGFjYywgZikpIHJlc3RcbiAgfCBDdXN0b20gKGFyaXR5LCBmLCByZXN0KSAtPlxuICAgIG1ha2VfY3VzdG9tIGsgYWNjIHJlc3QgYXJpdHkgKGYgKCkpXG4gIHwgUmVhZGVyIF8gLT5cbiAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICopXG4gICAgKCogSW5kZWVkLCBzaW5jZSBwcmludGYgYW5kIGNvLiB0YWtlIGEgZm9ybWF0NCBhcyBhcmd1bWVudCwgdGhlICdkIGFuZCAnZVxuICAgICAgIHR5cGUgcGFyYW1ldGVycyBvZiBmbXQgYXJlIG9idmlvdXNseSBlcXVhbHMuIFRoZSBSZWFkZXIgaXMgdGhlXG4gICAgICAgb25seSBjb25zdHJ1Y3RvciB3aGljaCB0b3VjaCAnZCBhbmQgJ2UgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtYXRcbiAgICAgICB0eXBlLCBpdCBhZGRzIGFuICgtPikgdG8gdGhlICdkIHBhcmFtZXRlcnMuIENvbnNlcXVlbnRseSwgYSBmb3JtYXQ0XG4gICAgICAgY2Fubm90IGNvbnRhaW4gYSBSZWFkZXIgbm9kZSwgZXhjZXB0IGluIHRoZSBzdWItZm9ybWF0IGFzc29jaWF0ZWQgdG9cbiAgICAgICBhbiAley4uLiV9LiBJdCdzIG5vdCBhIHByb2JsZW0gYmVjYXVzZSBtYWtlX3ByaW50ZiBkbyBub3QgY2FsbFxuICAgICAgIGl0c2VsZiByZWN1cnNpdmVseSBvbiB0aGUgc3ViLWZvcm1hdCBhc3NvY2lhdGVkIHRvICV7Li4uJX0uICopXG4gICAgYXNzZXJ0IGZhbHNlXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mbHVzaCBhY2MpIHJlc3RcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX3N0cmluZ19saXRlcmFsIChhY2MsIHN0cikpIHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfY2hhcl9saXRlcmFsIChhY2MsIGNocikpIHJlc3RcblxuICB8IEZvcm1hdF9hcmcgKF8sIHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSBzdHJpbmdfb2ZfZm10dHkgc3ViX2ZtdHR5IGluXG4gICAgKGZ1biBzdHIgLT5cbiAgICAgIGlnbm9yZSBzdHI7XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHkpKSByZXN0KVxuICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpIC0+XG4gICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+IG1ha2VfcHJpbnRmIGsgYWNjXG4gICAgICAoY29uY2F0X2ZtdCAocmVjYXN0IGZtdCBmbXR0eSkgcmVzdClcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+XG4gICAgbGV0IG5ld19hY2MgPSBBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVbXCIpIGluXG4gICAgZnVuIF8gLT4gbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPlxuICAgICgqIFRoaXMgY2FzZSBzaG91bGQgYmUgcmVmdXNlZCBmb3IgUHJpbnRmLiAqKVxuICAgICgqIEFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqKVxuICAgICgqIEludGVycHJldCAlbCwgJW4gYW5kICVMIGFzICV1LiAqKVxuICAgIGZ1biBuIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmb3JtYXRfaW50IFwiJXVcIiBuKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfY2hhciAoYWNjLCBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgbWFrZV9pZ25vcmVkX3BhcmFtIGsgYWNjIGlnbiByZXN0XG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19saXQgKGFjYywgZm10aW5nX2xpdCkpIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl90YWcga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl9ib3gga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBrIGFjY1xuXG4oKiBEZWxheSB0aGUgZXJyb3IgKEludmFsaWRfYXJndW1lbnQgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpLiAqKVxuKCogR2VuZXJhdGUgZnVuY3Rpb25zIHRvIHRha2UgcmVtYWluaW5nIGFyZ3VtZW50cyAoYWZ0ZXIgdGhlIFwiJV9cIikuICopXG5hbmQgbWFrZV9pZ25vcmVkX3BhcmFtIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgZm10dHkgZm10XG4gIHwgSWdub3JlZF9yZWFkZXIgICAgICAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcblxuXG4oKiBTcGVjaWFsIGNhc2Ugb2YgcHJpbnRmIFwiJV8oXCIuICopXG5hbmQgbWFrZV9mcm9tX2ZtdHR5IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgZm10dHkgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50X3R5IHJlc3QgICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBSZWFkZXJfdHkgXyAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBGb3JtYXRfYXJnX3R5IChfLCByZXN0KSAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogSW5zZXJ0IGFuIEFjY19pbnZhbGlkX2FyZyBpbiB0aGUgYWNjdW11bGF0b3IgYW5kIGNvbnRpbnVlIHRvIGdlbmVyYXRlXG4gICBjbG9zdXJlcyB0byBnZXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICopXG5hbmQgbWFrZV9pbnZhbGlkX2FyZyA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPlxuICBtYWtlX3ByaW50ZiBrIChBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpKSBmbXRcblxuKCogRml4IHBhZGRpbmcsIHRha2UgaXQgYXMgYW4gZXh0cmEgaW50ZWdlciBhcmd1bWVudCBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9wYWRkaW5nIDogdHlwZSB4IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHogLT4gYSkgcGFkZGluZyAtPiAoeiAtPiBzdHJpbmcpIC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCB0cmFucyAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHJhbnMgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCAodHJhbnMgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHkgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcblxuKCogRml4IHBhZGRpbmcgYW5kIHByZWNpc2lvbiBmb3IgaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0LiAqKVxuKCogVGFrZSBvbmUgb3IgdHdvIGV4dHJhIGludGVnZXIgYXJndW1lbnRzIGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IChpbnRfY29udiAtPiB6IC0+IHN0cmluZykgLT5cbiAgICBpbnRfY29udiAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgcHJlYyB0cmFucyBpY29udiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gdHJhbnMgaWNvbnYgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuXG4oKiBDb252ZXJ0IGEgZmxvYXQsIGZpeCBwYWRkaW5nIGFuZCBwcmVjaXNpb24gaWYgbmVlZGVkLiAqKVxuKCogVGFrZSB0aGUgZmxvYXQgYXJndW1lbnQgYW5kIG9uZSBvciB0d28gZXh0cmEgaW50ZWdlciBhcmd1bWVudHMgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfZmxvYXRfcGFkZGluZ19wcmVjaXNpb24gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgZmxvYXQgLT4gYSkgcHJlY2lzaW9uIC0+IGZsb2F0X2NvbnYgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHByZWMgZmNvbnYgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiBwIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbmFuZCBtYWtlX2N1c3RvbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4geCAtPiB5ID1cbiAgZnVuIGsgYWNjIHJlc3QgYXJpdHkgZiAtPiBtYXRjaCBhcml0eSB3aXRoXG4gIHwgQ3VzdG9tX3plcm8gLT4gbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIGYpKSByZXN0XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbWFrZV9jdXN0b20gayBhY2MgcmVzdCBhcml0eSAoZiB4KVxuXG5sZXQgY29uc3QgeCBfID0geFxuXG5sZXQgcmVjIG1ha2VfaXByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPiBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuICBmdW4gayBvIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgQ2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBDYW1sX3N0cmluZyAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfc3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9zdHJpbmcgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50MzIgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IE5hdGl2ZWludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50NjQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBCb29sIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQm9vbCAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEJvb2wgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEFscGhhIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfY3VzdG9tX2FyaXR5IGsgbyByZXN0IGFyaXR5XG4gICAgfCBSZWFkZXIgXyAtPlxuICAgICAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICBTZWUgdGhlXG4gICAgICAgICAgIG5vdGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FzZSBmb3IgbWFrZV9wcmludGYuICopXG4gICAgICAgIGFzc2VydCBmYWxzZVxuICAgIHwgRmx1c2ggcmVzdCAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBGb3JtYXRfYXJnIChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+XG4gICAgICAgICAgbWFrZV9pcHJpbnRmIGsgb1xuICAgICAgICAgICAgKGNvbmNhdF9mbXQgKHJlY2FzdCBmbXQgZm10dHkpIHJlc3QpXG4gICAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pZ25vcmVkX3BhcmFtIChmdW4gXyAtPiBrIG8pIChFbmRfb2ZfYWNjKSBpZ24gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIChmdW4ga29jIC0+IG1ha2VfaXByaW50ZiBrIGtvYyByZXN0KSBvIGZtdCdcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiAoZnVuIGtvYyAtPiBtYWtlX2lwcmludGYgayBrb2MgcmVzdCkgbyBmbXQnXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgICAgIGsgb1xuYW5kIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIDpcbiAgdHlwZSB4IHkgeiBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+IHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IHggPVxuICBmdW4gayBvIGZtdCBwYWQgcHJlYyAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAgICwgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IE5vX3BhZGRpbmcgICAsIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBOb19wYWRkaW5nICAgLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTGl0X3BhZGRpbmcgXywgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IExpdF9wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpKVxuYW5kIGZuX29mX2N1c3RvbV9hcml0eSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT5cbiAgc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IHkgPVxuICBmdW4gayBvIGZtdCAtPiBmdW5jdGlvblxuICAgIHwgQ3VzdG9tX3plcm8gLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyBmbXRcbiAgICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+XG4gICAgICAgIGNvbnN0IChmbl9vZl9jdXN0b21fYXJpdHkgayBvIGZtdCBhcml0eSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQ29udGludWF0aW9ucyBmb3IgbWFrZV9wcmludGYgKilcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhbiBvdXRwdXRfc3RyZWFtLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgb3V0cHV0X2FjYyBvIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQHtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQFtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X2NoYXIgbyBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBmIG9cbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IGZsdXNoIG9cbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gb3V0cHV0X2FjYyBvIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIGJ1ZnB1dF9hY2MgYiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQHtcIjsgYnVmcHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkBbXCI7IGJ1ZnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBmIGJcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gYnVmcHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IGJ1ZnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBEaWZmZXIgZnJvbSBidWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiAlYSBhbmQgJXQuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBzdHJwdXRfYWNjIGIgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkB7XCI7IHN0cnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAW1wiOyBzdHJwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiAoZiAoKSlcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gc3RycHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEVycm9yIG1hbmFnZW1lbnQgKilcblxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBwcmV0dHktcHJpbnRlZCBlcnJvciBtZXNzYWdlLiAqKVxubGV0IGZhaWx3aXRoX21lc3NhZ2UgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyNTYgaW5cbiAgbGV0IGsgYWNjID0gc3RycHV0X2FjYyBidWYgYWNjOyBmYWlsd2l0aCAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdHRpbmcgdG9vbHMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhbiBvcGVuIGJsb2NrIGRlc2NyaXB0aW9uIChpbmRlbnQsIGJsb2NrX3R5cGUpICopXG5sZXQgb3Blbl9ib3hfb2Zfc3RyaW5nIHN0ciA9XG4gIGlmIHN0ciA9IFwiXCIgdGhlbiAoMCwgUHBfYm94KSBlbHNlXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGV0IGludmFsaWRfYm94ICgpID0gZmFpbHdpdGhfbWVzc2FnZSBcImludmFsaWQgYm94IGRlc2NyaXB0aW9uICVTXCIgc3RyIGluXG4gICAgbGV0IHJlYyBwYXJzZV9zcGFjZXMgaSA9XG4gICAgICBpZiBpID0gbGVuIHRoZW4gaSBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5baV0gd2l0aFxuICAgICAgICB8ICcgJyB8ICdcXHQnIC0+IHBhcnNlX3NwYWNlcyAoaSArIDEpXG4gICAgICAgIHwgXyAtPiBpXG4gICAgYW5kIHBhcnNlX2x3b3JkIGkgaiA9XG4gICAgICBpZiBqID0gbGVuIHRoZW4gaiBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5bal0gd2l0aFxuICAgICAgICB8ICdhJyAuLiAneicgLT4gcGFyc2VfbHdvcmQgaSAoaiArIDEpXG4gICAgICAgIHwgXyAtPiBqXG4gICAgYW5kIHBhcnNlX2ludCBpIGogPVxuICAgICAgaWYgaiA9IGxlbiB0aGVuIGogZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2pdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IHBhcnNlX2ludCBpIChqICsgMSlcbiAgICAgICAgfCBfIC0+IGogaW5cbiAgICBsZXQgd3N0YXJ0ID0gcGFyc2Vfc3BhY2VzIDAgaW5cbiAgICBsZXQgd2VuZCA9IHBhcnNlX2x3b3JkIHdzdGFydCB3c3RhcnQgaW5cbiAgICBsZXQgYm94X25hbWUgPSBTdHJpbmcuc3ViIHN0ciB3c3RhcnQgKHdlbmQgLSB3c3RhcnQpIGluXG4gICAgbGV0IG5zdGFydCA9IHBhcnNlX3NwYWNlcyB3ZW5kIGluXG4gICAgbGV0IG5lbmQgPSBwYXJzZV9pbnQgbnN0YXJ0IG5zdGFydCBpblxuICAgIGxldCBpbmRlbnQgPVxuICAgICAgaWYgbnN0YXJ0ID0gbmVuZCB0aGVuIDAgZWxzZVxuICAgICAgICB0cnkgaW50X29mX3N0cmluZyAoU3RyaW5nLnN1YiBzdHIgbnN0YXJ0IChuZW5kIC0gbnN0YXJ0KSlcbiAgICAgICAgd2l0aCBGYWlsdXJlIF8gLT4gaW52YWxpZF9ib3ggKCkgaW5cbiAgICBsZXQgZXhwX2VuZCA9IHBhcnNlX3NwYWNlcyBuZW5kIGluXG4gICAgaWYgZXhwX2VuZCA8PiBsZW4gdGhlbiBpbnZhbGlkX2JveCAoKTtcbiAgICBsZXQgYm94X3R5cGUgPSBtYXRjaCBib3hfbmFtZSB3aXRoXG4gICAgICB8IFwiXCIgfCBcImJcIiAtPiBQcF9ib3hcbiAgICAgIHwgXCJoXCIgICAgICAtPiBQcF9oYm94XG4gICAgICB8IFwidlwiICAgICAgLT4gUHBfdmJveFxuICAgICAgfCBcImh2XCIgICAgIC0+IFBwX2h2Ym94XG4gICAgICB8IFwiaG92XCIgICAgLT4gUHBfaG92Ym94XG4gICAgICB8IF8gICAgICAgIC0+IGludmFsaWRfYm94ICgpIGluXG4gICAgKGluZGVudCwgYm94X3R5cGUpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUGFyc2luZyB0b29scyAqKVxuXG4oKiBDcmVhdGUgYSBwYWRkaW5nX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcgYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcGFkZGluZyB0byBkaXNqb2luIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnQgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3BhZGRpbmdfZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgICAoXywgXywgXywgXywgXykgcGFkZGluZ19mbXRfZWJiID1cbmZ1biBwYWQgZm10IC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAgICAgICAgIC0+IFBhZGRpbmdfZm10X0VCQiAoTm9fcGFkZGluZywgZm10KVxuICB8IExpdF9wYWRkaW5nIChzLCB3KSAtPiBQYWRkaW5nX2ZtdF9FQkIgKExpdF9wYWRkaW5nIChzLCB3KSwgZm10KVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRkaW5nX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIGZtdClcblxuKCogQ3JlYXRlIGEgcHJlY2lzaW9uX2ZtdF9lYmIgZnJvbSBhIHByZWNpc2lvbiBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50IGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wcmVjaXNpb25fZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcHJlY2lzaW9uIC0+IChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAgIChfLCBfLCBfLCBfLCBfKSBwcmVjaXNpb25fZm10X2ViYiA9XG5mdW4gcHJlYyBmbXQgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uICAgIC0+IFByZWNpc2lvbl9mbXRfRUJCIChOb19wcmVjaXNpb24sIGZtdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKExpdF9wcmVjaXNpb24gcCwgZm10KVxuICB8IEFyZ19wcmVjaXNpb24gICAtPiBQcmVjaXNpb25fZm10X0VCQiAoQXJnX3ByZWNpc2lvbiwgZm10KVxuXG4oKiBDcmVhdGUgYSBwYWRwcmVjX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHBhZGRpbmcgYW5kIHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnRzXG4gICBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcGFkcHJlY19mbXRfZWJiIDogdHlwZSB4IHkgeiB0IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+XG4gICAgKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgIChfLCBfLCBfLCBfLCBfKSBwYWRwcmVjX2ZtdF9lYmIgPVxuZnVuIHBhZCBwcmVjIGZtdCAtPlxuICBsZXQgUHJlY2lzaW9uX2ZtdF9FQkIgKHByZWMsIGZtdCcpID0gbWFrZV9wcmVjaXNpb25fZm10X2ViYiBwcmVjIGZtdCBpblxuICBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgICAgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKE5vX3BhZGRpbmcsIHByZWMsIGZtdCcpXG4gIHwgTGl0X3BhZGRpbmcgKHMsIHcpIC0+IFBhZHByZWNfZm10X0VCQiAoTGl0X3BhZGRpbmcgKHMsIHcpLCBwcmVjLCBmbXQnKVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIHByZWMsIGZtdCcpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwYXJzaW5nICopXG5cbigqIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGZvcm1hdCBhbmQgY3JlYXRlIGEgZm10X2ViYi4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSBpbiBjYXNlIG9mIGludmFsaWQgZm9ybWF0LiAqKVxubGV0IGZtdF9lYmJfb2Zfc3RyaW5nID9sZWdhY3lfYmVoYXZpb3Igc3RyID1cbiAgKCogUGFyYW1ldGVycyBuYW1pbmcgY29udmVudGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gbGl0X3N0YXJ0OiBzdGFydCBvZiB0aGUgbGl0ZXJhbCBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBzdHJfaW5kOiBjdXJyZW50IGluZGV4IGluIHRoZSBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIGVuZF9pbmQ6IGVuZCBvZiB0aGUgY3VycmVudCAoc3ViLSlmb3JtYXQuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gcGN0X2luZDogaW5kZXggb2YgdGhlICclJyBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICopXG4gICgqICAgLSB6ZXJvOiAgaXMgdGhlICcwJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIG1pbnVzOiBpcyB0aGUgJy0nIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gcGx1czogIGlzIHRoZSAnKycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBoYXNoOiAgaXMgdGhlICcjJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHNwYWNlOiBpcyB0aGUgJyAnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gaWduOiAgIGlzIHRoZSAnXycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBwYWQ6IHBhZGRpbmcgb2YgdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHByZWM6IHByZWNpc2lvbiBvZiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gc3ltYjogY2hhciByZXByZXNlbnRpbmcgdGhlIGNvbnZlcnNpb24gKCdjJywgJ3MnLCAnZCcsIC4uLikuICopXG4gICgqICAgLSBjaGFyX3NldDogc2V0IG9mIGNoYXJhY3RlcnMgYXMgYml0bWFwIChzZWUgc2NhbmYgJVsuLi5dKS4gICAgKilcblxuICBsZXQgbGVnYWN5X2JlaGF2aW9yID0gbWF0Y2ggbGVnYWN5X2JlaGF2aW9yIHdpdGhcbiAgICB8IFNvbWUgZmxhZyAtPiBmbGFnXG4gICAgfCBOb25lIC0+IHRydWVcbiAgKCogIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQsIHRoZSBmb3JtYXQgcGFyc2VyIHRyaWVzIHRvIGJlaGF2ZSBhc1xuICAgICAgdGhlIDw0LjAyIGltcGxlbWVudGF0aW9ucywgaW4gcGFydGljdWxhciBpdCBpZ25vcmVzIG1vc3QgYmVuaWduXG4gICAgICBub25zZW5zaWNhbCBmb3JtYXRzLiBXaGVuIHRoZSBmbGFnIGlzIGRpc2FibGVkLCBpdCB3aWxsIHJlamVjdCBhbnlcbiAgICAgIGZvcm1hdCB0aGF0IGlzIG5vdCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWNhdGlvbi5cblxuICAgICAgQSB0eXBpY2FsIGV4YW1wbGUgd291bGQgYmUgXCIlKyBkXCI6IHNwZWNpZnlpbmcgYm90aCAnKycgKGlmIHRoZVxuICAgICAgbnVtYmVyIGlzIHBvc2l0aXZlLCBwYWQgd2l0aCBhICcrJyB0byBnZXQgdGhlIHNhbWUgd2lkdGggYXNcbiAgICAgIG5lZ2F0aXZlIG51bWJlcnMpIGFuZCAnICcgKGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUsIHBhZCB3aXRoXG4gICAgICBhIHNwYWNlKSBkb2VzIG5vdCBtYWtlIHNlbnNlLCBidXQgdGhlIGxlZ2FjeSAoPCA0LjAyKVxuICAgICAgaW1wbGVtZW50YXRpb24gd2FzIGhhcHB5IHRvIGp1c3QgaWdub3JlIHRoZSBzcGFjZS5cbiAgKilcbiAgaW5cblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UuICopXG4gIGxldCBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIHN0cl9pbmQgbXNnID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAlc1wiXG4gICAgICBzdHIgc3RyX2luZCBtc2dcbiAgaW5cblxuICAoKiBVc2VkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IChvciB0aGUgY3VycmVudCBzdWItZm9ybWF0KSB3YXMgZW5jb3VudGVyZWRcbiAgICAgIHVuZXhwZWN0ZWRseS4gKilcbiAgbGV0IHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kID1cbiAgICBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIGVuZF9pbmRcbiAgICAgIFwidW5leHBlY3RlZCBlbmQgb2YgZm9ybWF0XCJcbiAgaW5cblxuICAoKiBVc2VkIGZvciAlMGM6IG5vIG90aGVyIHdpZHRocyBhcmUgaW1wbGVtZW50ZWQgKilcbiAgbGV0IGludmFsaWRfbm9ubnVsbF9jaGFyX3dpZHRoIHN0cl9pbmQgPVxuICAgIGludmFsaWRfZm9ybWF0X21lc3NhZ2Ugc3RyX2luZFxuICAgICAgXCJub24temVybyB3aWR0aHMgYXJlIHVuc3VwcG9ydGVkIGZvciAlYyBjb252ZXJzaW9uc1wiXG4gIGluXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiBvcHRpb24gZGVwZW5kZW5jeVxuICAgICBwcm9ibGVtLiAqKVxuICBsZXQgaW52YWxpZF9mb3JtYXRfd2l0aG91dCBzdHJfaW5kIGMgcyA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJyVjJyB3aXRob3V0ICVzXCJcbiAgICAgIHN0ciBzdHJfaW5kIGMgc1xuICBpblxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiB1bmV4cGVjdGVkXG4gICAgIGNoYXJhY3Rlci4gKilcbiAgbGV0IGV4cGVjdGVkX2NoYXJhY3RlciBzdHJfaW5kIGV4cGVjdGVkIHJlYWQgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJXMgZXhwZWN0ZWQsIHJlYWQgJUNcIlxuICAgICAgc3RyIHN0cl9pbmQgZXhwZWN0ZWQgcmVhZFxuICBpblxuXG4gICgqIFBhcnNlIHRoZSBzdHJpbmcgZnJvbSBiZWdfaW5kIChpbmNsdWRlZCkgdG8gZW5kX2luZCAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIHBhcnNlIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGJlZ19pbmQgZW5kX2luZCAtPiBwYXJzZV9saXRlcmFsIGJlZ19pbmQgYmVnX2luZCBlbmRfaW5kXG5cbiAgKCogUmVhZCBsaXRlcmFsIGNoYXJhY3RlcnMgdXAgdG8gJyUnIG9yICdAJyBzcGVjaWFsIGNoYXJhY3RlcnMuICopXG4gIGFuZCBwYXJzZV9saXRlcmFsIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBsaXRfc3RhcnQgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBFbmRfb2ZfZm9ybWF0IGVsc2VcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZV9mb3JtYXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIGZtdF9yZXN0XG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlX2FmdGVyX2F0IChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBmbXRfcmVzdFxuICAgICAgfCBfIC0+XG4gICAgICAgIHBhcnNlX2xpdGVyYWwgbGl0X3N0YXJ0IChzdHJfaW5kICsgMSkgZW5kX2luZFxuXG4gICgqIFBhcnNlIGEgZm9ybWF0IGFmdGVyICclJyAqKVxuICBhbmQgcGFyc2VfZm9ybWF0IDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgZW5kX2luZCAtPiBwYXJzZV9pZ24gcGN0X2luZCAocGN0X2luZCArIDEpIGVuZF9pbmRcblxuICBhbmQgcGFyc2VfaWduIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdfJyAtPiBwYXJzZV9mbGFncyBwY3RfaW5kIChzdHJfaW5kKzEpIGVuZF9pbmQgdHJ1ZVxuICAgICAgfCBfIC0+IHBhcnNlX2ZsYWdzIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGZhbHNlXG5cbiAgYW5kIHBhcnNlX2ZsYWdzIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiXG4gID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGlnbiAtPlxuICAgIGxldCB6ZXJvID0gcmVmIGZhbHNlIGFuZCBtaW51cyA9IHJlZiBmYWxzZVxuICAgIGFuZCBwbHVzID0gcmVmIGZhbHNlIGFuZCBzcGFjZSA9IHJlZiBmYWxzZVxuICAgIGFuZCBoYXNoID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IHNldF9mbGFnIHN0cl9pbmQgZmxhZyA9XG4gICAgICAoKiBpbiBsZWdhY3kgbW9kZSwgZHVwbGljYXRlIGZsYWdzIGFyZSBhY2NlcHRlZCAqKVxuICAgICAgaWYgIWZsYWcgJiYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBkdXBsaWNhdGUgZmxhZyAlQ1wiXG4gICAgICAgICAgc3RyIHN0cl9pbmQgc3RyLltzdHJfaW5kXTtcbiAgICAgIGZsYWcgOj0gdHJ1ZTtcbiAgICBpblxuICAgIGxldCByZWMgcmVhZF9mbGFncyBzdHJfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJzAnIC0+IHNldF9mbGFnIHN0cl9pbmQgemVybzsgIHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnLScgLT4gc2V0X2ZsYWcgc3RyX2luZCBtaW51czsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcrJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHBsdXM7ICByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJyMnIC0+IHNldF9mbGFnIHN0cl9pbmQgaGFzaDsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcgJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHNwYWNlOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgXyAtPlxuICAgICAgICBwYXJzZV9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kXG4gICAgICAgICAgIXplcm8gIW1pbnVzICFwbHVzICFoYXNoICFzcGFjZSBpZ25cbiAgICAgIGVuZFxuICAgIGluXG4gICAgcmVhZF9mbGFncyBzdHJfaW5kXG5cbiAgKCogVHJ5IHRvIHJlYWQgYSBkaWdpdGFsIG9yIGEgJyonIHBhZGRpbmcuICopXG4gIGFuZCBwYXJzZV9wYWRkaW5nIDogdHlwZSBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgemVybyBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBsZXQgcGFkdHkgPSBtYXRjaCB6ZXJvLCBtaW51cyB3aXRoXG4gICAgICB8IGZhbHNlLCBmYWxzZSAtPiBSaWdodFxuICAgICAgfCBmYWxzZSwgdHJ1ZSAgLT4gTGVmdFxuICAgICAgfCAgdHJ1ZSwgZmFsc2UgLT4gWmVyb3NcbiAgICAgIHwgIHRydWUsIHRydWUgIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExlZnRcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJy0nIFwiMFwiIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+XG4gICAgICBsZXQgbmV3X2luZCwgd2lkdGggPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIG5ld19pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIChMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSlcbiAgICB8ICcqJyAtPlxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2VcbiAgICAgICAgaWduIChBcmdfcGFkZGluZyBwYWR0eSlcbiAgICB8IF8gLT5cbiAgICAgIGJlZ2luIG1hdGNoIHBhZHR5IHdpdGhcbiAgICAgIHwgTGVmdCAgLT5cbiAgICAgICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICctJyBcInBhZGRpbmdcIjtcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgfCBaZXJvcyAtPlxuICAgICAgICAgKCogYSAnMCcgcGFkZGluZyBpbmRpY2F0aW9uIG5vdCBmb2xsb3dlZCBieSBhbnl0aGluZyBzaG91bGRcbiAgICAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYSBSaWdodCBwYWRkaW5nIG9mIHdpZHRoIDAuIFRoaXMgaXMgdXNlZFxuICAgICAgICAgICBieSBzY2FubmluZyBjb252ZXJzaW9ucyAlMHMgYW5kICUwYyAqKVxuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICAoTGl0X3BhZGRpbmcgKFJpZ2h0LCAwKSlcbiAgICAgIHwgUmlnaHQgLT5cbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgZW5kXG5cbiAgKCogSXMgcHJlY2lzaW9uIGRlZmluZWQ/ICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wYWRkaW5nIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJy4nIC0+XG4gICAgICBwYXJzZV9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICBwYWRcbiAgICB8IHN5bWIgLT5cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgTm9fcHJlY2lzaW9uIHBhZCBzeW1iXG5cbiAgKCogUmVhZCB0aGUgZGlnaXRhbCBvciAnKicgcHJlY2lzaW9uLiAqKVxuICBhbmQgcGFyc2VfcHJlY2lzaW9uIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9saXRlcmFsIG1pbnVzIHN0cl9pbmQgPVxuICAgICAgbGV0IG5ld19pbmQsIHByZWMgPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgbmV3X2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgcGFkIChMaXRfcHJlY2lzaW9uIHByZWMpIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX2xpdGVyYWwgbWludXMgc3RyX2luZFxuICAgIHwgKCcrJyB8ICctJykgYXMgc3ltYiB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPlxuICAgICAgKCogTGVnYWN5IG1vZGUgd291bGQgYWNjZXB0IGFuZCBpZ25vcmUgJysnIG9yICctJyBiZWZvcmUgdGhlXG4gICAgICAgICBpbnRlZ2VyIGRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgcHJlY2lzaW9uOyBub3RlIHRoYXQgdGhpc1xuICAgICAgICAgY2Fubm90IGhhcHBlbiBmb3IgcGFkZGluZyB3aWR0aCwgYXMgJysnIGFuZCAnLScgYWxyZWFkeSBoYXZlXG4gICAgICAgICBhIHNlbWFudGljcyB0aGVyZS5cblxuICAgICAgICAgVGhhdCBzYWlkLCB0aGUgaWRlYSAoc3VwcG9ydGVkIGJ5IHRoaXMgdHdlYWspIHRoYXQgd2lkdGggYW5kXG4gICAgICAgICBwcmVjaXNpb24gbGl0ZXJhbHMgYXJlIFwiaW50ZWdlciBsaXRlcmFsc1wiIGluIHRoZSBPQ2FtbCBzZW5zZSBpc1xuICAgICAgICAgc3RpbGwgYmxhdGFudGx5IHdyb25nLCBhcyAxMjNfNDU2IG9yIDB4RkYgYXJlIHJlamVjdGVkLiAqKVxuICAgICAgcGFyc2VfbGl0ZXJhbCAobWludXMgfHwgc3ltYiA9ICctJykgKHN0cl9pbmQgKyAxKVxuICAgIHwgJyonIC0+XG4gICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlXG4gICAgICAgIGlnbiBwYWQgQXJnX3ByZWNpc2lvblxuICAgIHwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogbm90ZSB0aGF0IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBkaWQgbm90IGlnbm9yZSAnLicgd2l0aG91dFxuICAgICAgICAgICBhIG51bWJlciAoYXMgaXQgZG9lcyBmb3IgcGFkZGluZyBpbmRpY2F0aW9ucyksIGJ1dFxuICAgICAgICAgICBpbnRlcnByZXRzIGl0IGFzICcuMCcgKilcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBwYWQgKExpdF9wcmVjaXNpb24gMClcbiAgICAgIGVsc2VcbiAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICcuJyBcInByZWNpc2lvblwiXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIGNvbnZlcnNpb24uICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wcmVjaXNpb24gOiB0eXBlIHggeSB6IHQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIHByZWMgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9jb252ICh0eXBlIHUpICh0eXBlIHYpIChwYWRwcmVjIDogKHUsIHYpIHBhZGRpbmcpID1cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgcHJlYyBwYWRwcmVjIHN0ci5bc3RyX2luZF0gaW5cbiAgICAoKiBpbiBsZWdhY3kgbW9kZSwgc29tZSBmb3JtYXRzICglcyBhbmQgJVMpIGFjY2VwdCBhIHdlaXJkIG1peCBvZlxuICAgICAgIHBhZGRpbmcgYW5kIHByZWNpc2lvbiwgd2hpY2ggaXMgbWVyZ2VkIGFzIGEgc2luZ2xlIHBhZGRpbmdcbiAgICAgICBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGluICUuMTBzIHRoZSBwcmVjaXNpb24gaXMgaW1wbGljaXRseVxuICAgICAgIHVuZGVyc3Rvb2QgYXMgcGFkZGluZyAlMTBzLCBidXQgdGhlIGxlZnQtcGFkZGluZyBjb21wb25lbnQgbWF5XG4gICAgICAgYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGxlZnQgcGFkZGluZyBvciBhIG5lZ2F0aXZlIHByZWNpc2lvbjpcbiAgICAgICAlLS4zcyBhbmQgJS4tM3MgYXJlIGVxdWl2YWxlbnQgdG8gJS0zcyAqKVxuICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgfCBOb19wYWRkaW5nIC0+IChcbiAgICAgIG1hdGNoIG1pbnVzLCBwcmVjIHdpdGhcbiAgICAgICAgfCBfLCBOb19wcmVjaXNpb24gLT4gcGFyc2VfY29udiBOb19wYWRkaW5nXG4gICAgICAgIHwgZmFsc2UsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoUmlnaHQsIG4pKVxuICAgICAgICB8IHRydWUsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoTGVmdCwgbikpXG4gICAgICAgIHwgZmFsc2UsIEFyZ19wcmVjaXNpb24gLT4gcGFyc2VfY29udiAoQXJnX3BhZGRpbmcgUmlnaHQpXG4gICAgICAgIHwgdHJ1ZSwgQXJnX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IChBcmdfcGFkZGluZyBMZWZ0KVxuICAgIClcbiAgICB8IHBhZCAtPiBwYXJzZV9jb252IHBhZFxuXG4gICgqIENhc2UgYW5hbHlzaXMgb24gY29udmVyc2lvbi4gKilcbiAgYW5kIHBhcnNlX2NvbnZlcnNpb24gOiB0eXBlIHggeSB6IHQgdSB2IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+ICh4LCB5KSBwYWRkaW5nIC0+XG4gICAgICAgICh6LCB0KSBwcmVjaXNpb24gLT4gKHUsIHYpIHBhZGRpbmcgLT4gY2hhciAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCBwcmVjIHBhZHByZWMgc3ltYiAtPlxuICAgICgqIEZsYWdzIHVzZWQgdG8gY2hlY2sgb3B0aW9uIHVzYWdlcy9jb21wYXRpYmlsaXRpZXMuICopXG4gICAgbGV0IHBsdXNfdXNlZCAgPSByZWYgZmFsc2UgYW5kIGhhc2hfdXNlZCA9IHJlZiBmYWxzZVxuICAgIGFuZCBzcGFjZV91c2VkID0gcmVmIGZhbHNlIGFuZCBpZ25fdXNlZCAgID0gcmVmIGZhbHNlXG4gICAgYW5kIHBhZF91c2VkICAgPSByZWYgZmFsc2UgYW5kIHByZWNfdXNlZCAgPSByZWYgZmFsc2UgaW5cblxuICAgICgqIEFjY2VzcyB0byBvcHRpb25zLCB1cGRhdGUgZmxhZ3MuICopXG4gICAgbGV0IGdldF9wbHVzICAgICgpID0gcGx1c191c2VkICA6PSB0cnVlOyBwbHVzXG4gICAgYW5kIGdldF9oYXNoICAgKCkgPSBoYXNoX3VzZWQgOj0gdHJ1ZTsgaGFzaFxuICAgIGFuZCBnZXRfc3BhY2UgICAoKSA9IHNwYWNlX3VzZWQgOj0gdHJ1ZTsgc3BhY2VcbiAgICBhbmQgZ2V0X2lnbiAgICAgKCkgPSBpZ25fdXNlZCAgIDo9IHRydWU7IGlnblxuICAgIGFuZCBnZXRfcGFkICAgICAoKSA9IHBhZF91c2VkICAgOj0gdHJ1ZTsgcGFkXG4gICAgYW5kIGdldF9wcmVjICAgICgpID0gcHJlY191c2VkICA6PSB0cnVlOyBwcmVjXG4gICAgYW5kIGdldF9wYWRwcmVjICgpID0gcGFkX3VzZWQgICA6PSB0cnVlOyBwYWRwcmVjIGluXG5cbiAgICBsZXQgZ2V0X2ludF9wYWQgKCkgOiAoeCx5KSBwYWRkaW5nID1cbiAgICAgICgqICU1LjNkIGlzIGFjY2VwdGVkIGFuZCBtZWFuaW5nZnVsOiBwYWQgdG8gbGVuZ3RoIDUgd2l0aFxuICAgICAgICAgc3BhY2VzLCBidXQgZmlyc3QgcGFkIHdpdGggemVyb3MgdXB0byBsZW5ndGggMyAoMC1wYWRkaW5nXG4gICAgICAgICBpcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgXCJwcmVjaXNpb25cIiBmb3IgaW50ZWdlciBmb3JtYXRzKS5cblxuICAgICAgICAgJTA1LjNkIGlzIHJlZHVuZGFudDogcGFkIHRvIGxlbmd0aCA1ICp3aXRoIHplcm9zKiwgYnV0XG4gICAgICAgICBmaXJzdCBwYWQgd2l0aCB6ZXJvcy4uLiBUbyBhZGQgaW5zdWx0IHRvIHRoZSBpbmp1cnksIHRoZVxuICAgICAgICAgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIDAtcGFkZGluZyBpbmRpY2F0aW9uIGFuZFxuICAgICAgICAgZG9lcyB0aGUgNSBwYWRkaW5nIHdpdGggc3BhY2VzIGluc3RlYWQuIFdlIHJldXNlIHRoaXNcbiAgICAgICAgIGludGVycHJldGF0aW9uIGZvciBjb21wYXRpYmlsaXR5LCBidXQgc3RhdGljYWxseSByZWplY3QgdGhpc1xuICAgICAgICAgZm9ybWF0IHdoZW4gdGhlIGxlZ2FjeSBtb2RlIGlzIGRpc2FibGVkLCB0byBwcm90ZWN0IHN0cmljdFxuICAgICAgICAgdXNlcnMgZnJvbSB0aGlzIGNvcm5lciBjYXNlLiAqKVxuICAgICAgIG1hdGNoIGdldF9wYWQgKCksIGdldF9wcmVjICgpIHdpdGhcbiAgICAgICAgIHwgcGFkLCBOb19wcmVjaXNpb24gLT4gcGFkXG4gICAgICAgICB8IE5vX3BhZGRpbmcsIF8gICAgIC0+IE5vX3BhZGRpbmdcbiAgICAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCBuKSwgXyAtPlxuICAgICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIG4pXG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IEFyZ19wYWRkaW5nIFplcm9zLCBfIC0+XG4gICAgICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IExpdF9wYWRkaW5nIF8gYXMgcGFkLCBfIC0+IHBhZFxuICAgICAgICAgfCBBcmdfcGFkZGluZyBfIGFzIHBhZCwgXyAtPiBwYWQgaW5cblxuICAgICgqIENoZWNrIHRoYXQgcGFkdHkgPD4gWmVyb3MuICopXG4gICAgbGV0IGNoZWNrX25vXzAgc3ltYiAodHlwZSBhIGIpIChwYWQgOiAoYSwgYikgcGFkZGluZykgOiAoYSxiKSBwYWRkaW5nID1cbiAgICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gcGFkXG4gICAgICB8IExpdF9wYWRkaW5nICgoTGVmdCB8IFJpZ2h0KSwgXykgLT4gcGFkXG4gICAgICB8IEFyZ19wYWRkaW5nIChMZWZ0IHwgUmlnaHQpIC0+IHBhZFxuICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiMFwiXG4gICAgICB8IEFyZ19wYWRkaW5nIFplcm9zIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCIwXCJcbiAgICBpblxuXG4gICAgKCogR2V0IHBhZGRpbmcgYXMgYSBwYWRfb3B0aW9uIChzZWUgXCIlX1wiLCBcIiV7XCIsIFwiJShcIiBhbmQgXCIlW1wiKS5cbiAgICAgICAobm8gbmVlZCBmb3IgbGVnYWN5IG1vZGUgdHdlYWtpbmcsIHRob3NlIHdlcmUgcmVqZWN0ZWQgYnkgdGhlXG4gICAgICAgbGVnYWN5IHBhcnNlciBhcyB3ZWxsKSAqKVxuICAgIGxldCBvcHRfb2ZfcGFkIGMgKHR5cGUgYSkgKHR5cGUgYikgKHBhZCA6IChhLCBiKSBwYWRkaW5nKSA9IG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gTm9uZVxuICAgICAgfCBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKSAtPiBTb21lIHdpZHRoXG4gICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIFNvbWUgd2lkdGhcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicwJ1wiXG4gICAgICB8IExpdF9wYWRkaW5nIChMZWZ0LCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gU29tZSB3aWR0aFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJy0nXCJcbiAgICAgIHwgQXJnX3BhZGRpbmcgXyAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicqJ1wiXG4gICAgaW5cbiAgICBsZXQgZ2V0X3BhZF9vcHQgYyA9IG9wdF9vZl9wYWQgYyAoZ2V0X3BhZCAoKSkgaW5cbiAgICBsZXQgZ2V0X3BhZHByZWNfb3B0IGMgPSBvcHRfb2ZfcGFkIGMgKGdldF9wYWRwcmVjICgpKSBpblxuXG4gICAgKCogR2V0IHByZWNpc2lvbiBhcyBhIHByZWNfb3B0aW9uIChzZWUgXCIlX2ZcIikuXG4gICAgICAgKG5vIG5lZWQgZm9yIGxlZ2FjeSBtb2RlIHR3ZWFraW5nLCB0aG9zZSB3ZXJlIHJlamVjdGVkIGJ5IHRoZVxuICAgICAgIGxlZ2FjeSBwYXJzZXIgYXMgd2VsbCkgKilcbiAgICBsZXQgZ2V0X3ByZWNfb3B0ICgpID0gbWF0Y2ggZ2V0X3ByZWMgKCkgd2l0aFxuICAgICAgfCBOb19wcmVjaXNpb24gICAgICAgLT4gTm9uZVxuICAgICAgfCBMaXRfcHJlY2lzaW9uIG5kZWMgLT4gU29tZSBuZGVjXG4gICAgICB8IEFyZ19wcmVjaXNpb24gICAgICAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJ18nIFwiJyonXCJcbiAgICBpblxuXG4gICAgbGV0IGZtdF9yZXN1bHQgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICcsJyAtPlxuICAgICAgcGFyc2Ugc3RyX2luZCBlbmRfaW5kXG4gICAgfCAnYycgLT5cbiAgICAgIGxldCBjaGFyX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICVjICopXG4gICAgICAgIGlmIGdldF9pZ24gKClcbiAgICAgICAgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NoYXIsIGZtdF9yZXN0KSlcbiAgICAgICAgZWxzZSBGbXRfRUJCIChDaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBzY2FuX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICUwYyAqKVxuICAgICAgICBpZiBnZXRfaWduICgpXG4gICAgICAgIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9zY2FuX25leHRfY2hhciwgZm10X3Jlc3QpKVxuICAgICAgICBlbHNlIEZtdF9FQkIgKFNjYW5fbmV4dF9jaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBiZWdpbiBtYXRjaCBnZXRfcGFkX29wdCAnYycgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gY2hhcl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIDAgLT4gc2Nhbl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIF9uIC0+XG4gICAgICAgICAgIGlmIG5vdCBsZWdhY3lfYmVoYXZpb3JcbiAgICAgICAgICAgdGhlbiBpbnZhbGlkX25vbm51bGxfY2hhcl93aWR0aCBzdHJfaW5kXG4gICAgICAgICAgIGVsc2UgKCogbGVnYWN5IGlnbm9yZXMgJWMgd2lkdGhzICopIGNoYXJfZm9ybWF0IGZtdF9yZXN0XG4gICAgICBlbmRcbiAgICB8ICdDJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NhbWxfY2hhcixmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKENhbWxfY2hhciBmbXRfcmVzdClcbiAgICB8ICdzJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zdHJpbmcgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKFN0cmluZyAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdTJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9jYW1sX3N0cmluZyAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnZCcgfCAnaScgfCAneCcgfCAnWCcgfCAnbycgfCAndScgLT5cbiAgICAgIGxldCBpY29udiA9IGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAoZ2V0X3NwYWNlICgpKSBzeW1iIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChJbnQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdOJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gVG9rZW5fY291bnRlciBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCkpXG4gICAgfCAnbCcgfCAnbicgfCAnTCcgd2hlbiBzdHJfaW5kPWVuZF9pbmQgfHwgbm90IChpc19pbnRfYmFzZSBzdHIuW3N0cl9pbmRdKSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gY291bnRlcl9vZl9jaGFyIHN5bWIgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpKVxuICAgIHwgJ2wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQzMiAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDMyIChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnbicgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSlcbiAgICAgICAgICAoZ2V0X2hhc2ggKCkpIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX25hdGl2ZWludCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKE5hdGl2ZWludCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ0wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQ2NCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDY0IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnZicgfCAnZScgfCAnRScgfCAnZycgfCAnRycgfCAnRicgfCAnaCcgfCAnSCcgLT5cbiAgICAgIGxldCBmY29udiA9XG4gICAgICAgIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmRcbiAgICAgICAgICAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSkgKGdldF9zcGFjZSAoKSkgc3ltYiBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZmxvYXQgKGdldF9wYWRfb3B0ICdfJywgZ2V0X3ByZWNfb3B0ICgpKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChGbG9hdCAoZmNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2InIHwgJ0InIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Jvb2wgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEJvb2wgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnYScgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChBbHBoYSBmbXRfcmVzdClcbiAgICB8ICd0JyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKFRoZXRhIGZtdF9yZXN0KVxuICAgIHwgJ3InIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfcmVhZGVyLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKFJlYWRlciBmbXRfcmVzdClcbiAgICB8ICchJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZsdXNoIGZtdF9yZXN0KVxuICAgIHwgKCclJyB8ICdAJykgYXMgYyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoYywgZm10X3Jlc3QpKVxuICAgIHwgJ3snIC0+XG4gICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCAnfScgaW5cbiAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIHN1Yl9lbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2ZtdHR5ID0gZm10dHlfb2ZfZm10IHN1Yl9mbXQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ3snLCBzdWJfZm10dHksIGZtdF9yZXN0KSlcbiAgICB8ICcoJyAtPlxuICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCBzdHJfaW5kIGVuZF9pbmQgJyknIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdWJfZW5kICsgMikgZW5kX2luZCBpblxuICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgc3ViX2VuZCBpblxuICAgICAgbGV0IHN1Yl9mbXR0eSA9IGZtdHR5X29mX2ZtdCBzdWJfZm10IGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X3N1YnN0IChnZXRfcGFkX29wdCAnKCcsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpKVxuICAgIHwgJ1snIC0+XG4gICAgICBsZXQgbmV4dF9pbmQsIGNoYXJfc2V0ID0gcGFyc2VfY2hhcl9zZXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAoZ2V0X3BhZF9vcHQgJ18nLCBjaGFyX3NldCkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2NoYXJfc2V0IChnZXRfcGFkX29wdCAnWycsIGNoYXJfc2V0LCBmbXRfcmVzdCkpXG4gICAgfCAnLScgfCAnKycgfCAnIycgfCAnICcgfCAnXycgLT5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgXFxcbiAgICAgICAgIGZsYWcgJUMgaXMgb25seSBhbGxvd2VkIGFmdGVyIHRoZSAnJSUnLCBiZWZvcmUgcGFkZGluZyBhbmQgcHJlY2lzaW9uXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgc3ltYlxuICAgIHwgXyAtPlxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgaW52YWxpZCBjb252ZXJzaW9uIFxcXCIlJSVjXFxcIlwiIHN0ciAoc3RyX2luZCAtIDEpIHN5bWJcbiAgICBpblxuICAgICgqIENoZWNrIGZvciB1bnVzZWQgb3B0aW9ucywgYW5kIHJlamVjdCB0aGVtIGFzIGluY29tcGF0aWJsZS5cblxuICAgICAgIFN1Y2ggY2hlY2tzIG5lZWQgdG8gYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoZSBsZWdhY3lcbiAgICAgICBwYXJzZXIgc2lsZW50bHkgaWdub3JlZCBpbmNvbXBhdGlibGUgZmxhZ3MuICopXG4gICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuIGJlZ2luXG4gICAgaWYgbm90ICFwbHVzX3VzZWQgJiYgcGx1cyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicrJ1wiO1xuICAgIGlmIG5vdCAhaGFzaF91c2VkICYmIGhhc2ggdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIjtcbiAgICBpZiBub3QgIXNwYWNlX3VzZWQgJiYgc3BhY2UgdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInICdcIjtcbiAgICBpZiBub3QgIXBhZF91c2VkICAmJiBQYWRkaW5nX0VCQiBwYWQgPD4gUGFkZGluZ19FQkIgTm9fcGFkZGluZyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcImBwYWRkaW5nJ1wiO1xuICAgIGlmIG5vdCAhcHJlY191c2VkICYmIFByZWNpc2lvbl9FQkIgcHJlYyA8PiBQcmVjaXNpb25fRUJCIE5vX3ByZWNpc2lvbiB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgKGlmIGlnbiB0aGVuICdfJyBlbHNlIHN5bWIpXG4gICAgICAgIFwiYHByZWNpc2lvbidcIjtcbiAgICBpZiBpZ24gJiYgcGx1cyB0aGVuIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnXycgXCInKydcIjtcbiAgICBlbmQ7XG4gICAgKCogdGhpcyBsYXN0IHRlc3QgbXVzdCBub3QgYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsXG4gICAgICAgYXMgaWdub3JpbmcgaXQgd291bGQgdHlwaWNhbGx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0eXBpbmdcbiAgICAgICB0aGFuIHdoYXQgdGhlIGxlZ2FjeSBwYXJzZXIgdXNlZCAqKVxuICAgIGlmIG5vdCAhaWduX3VzZWQgJiYgaWduIHRoZW5cbiAgICAgIGJlZ2luIG1hdGNoIHN5bWIgd2l0aFxuICAgICAgICAoKiBhcmd1bWVudC1sZXNzIGZvcm1hdHMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIGluIGxlZ2FjeSBtb2RlICopXG4gICAgICAgIHwgKCdAJyB8ICclJyB8ICchJyB8ICcsJykgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gKClcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInXydcIlxuICAgICAgZW5kO1xuICAgIGZtdF9yZXN1bHRcblxuICAoKiBQYXJzZSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIChhZnRlciAnQCcpLiAqKVxuICBhbmQgcGFyc2VfYWZ0ZXJfYXQgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKCdAJywgRW5kX29mX2Zvcm1hdCkpXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdbJyAtPlxuICAgICAgICBwYXJzZV90YWcgZmFsc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICddJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQ2xvc2VfYm94LCBmbXRfcmVzdCkpXG4gICAgICB8ICd7JyAtPlxuICAgICAgICBwYXJzZV90YWcgdHJ1ZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ30nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChDbG9zZV90YWcsIGZtdF9yZXN0KSlcbiAgICAgIHwgJywnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChCcmVhayAoXCJALFwiLCAwLCAwKSwgZm10X3Jlc3QpKVxuICAgICAgfCAnICcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEJyZWFrIChcIkAgXCIsIDEsIDApLCBmbXRfcmVzdCkpXG4gICAgICB8ICc7JyAtPlxuICAgICAgICBwYXJzZV9nb29kX2JyZWFrIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnPycgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZGbHVzaCwgZm10X3Jlc3QpKVxuICAgICAgfCAnXFxuJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRm9yY2VfbmV3bGluZSwgZm10X3Jlc3QpKVxuICAgICAgfCAnLicgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZsdXNoX25ld2xpbmUsIGZtdF9yZXN0KSlcbiAgICAgIHwgJzwnIC0+XG4gICAgICAgIHBhcnNlX21hZ2ljX3NpemUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRXNjYXBlZF9hdCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgd2hlbiBzdHJfaW5kICsgMSA8IGVuZF9pbmQgJiYgc3RyLltzdHJfaW5kICsgMV0gPSAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEVzY2FwZWRfcGVyY2VudCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoQ2hhcl9saXRlcmFsICgnQCcsIGZtdF9yZXN0KSlcbiAgICAgIHwgYyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoU2Nhbl9pbmRpYyBjLCBmbXRfcmVzdCkpXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIG9wdGlvbmFsIDxuYW1lPiBhZnRlciBcIkB7XCIgb3IgXCJAW1wiLiAqKVxuICBhbmQgcGFyc2VfdGFnIDogdHlwZSBlIGYgLiBib29sIC0+IGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gaXNfb3Blbl90YWcgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgdHJ5XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnPCcgLT5cbiAgICAgICAgbGV0IGluZCA9IFN0cmluZy5pbmRleF9mcm9tIHN0ciAoc3RyX2luZCArIDEpICc+JyBpblxuICAgICAgICBpZiBpbmQgPj0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN1Yl9zdHIgPSBTdHJpbmcuc3ViIHN0ciBzdHJfaW5kIChpbmQgLSBzdHJfaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCAoaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IHN1Yl9mb3JtYXQgPSBGb3JtYXQgKHN1Yl9mbXQsIHN1Yl9zdHIpIGluXG4gICAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgICBpZiBpc19vcGVuX3RhZyB0aGVuIE9wZW5fdGFnIHN1Yl9mb3JtYXQgZWxzZSBPcGVuX2JveCBzdWJfZm9ybWF0IGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nLCBmbXRfcmVzdCkpXG4gICAgICB8IF8gLT5cbiAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2Zvcm1hdCA9IEZvcm1hdCAoRW5kX29mX2Zvcm1hdCwgXCJcIikgaW5cbiAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgaWYgaXNfb3Blbl90YWcgdGhlbiBPcGVuX3RhZyBzdWJfZm9ybWF0IGVsc2UgT3Blbl9ib3ggc3ViX2Zvcm1hdCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmcsIGZtdF9yZXN0KSlcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgb3B0aW9uYWwgPHdpZHRoIG9mZnNldD4gYWZ0ZXIgXCJAO1wiLiAqKVxuICBhbmQgcGFyc2VfZ29vZF9icmVhayA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBsZXQgbmV4dF9pbmQsIGZvcm1hdHRpbmdfbGl0ID1cbiAgICAgIHRyeVxuICAgICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB8fCBzdHIuW3N0cl9pbmRdIDw+ICc8JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN0cl9pbmRfMSA9IHBhcnNlX3NwYWNlcyAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzFdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IChcbiAgICAgICAgICBsZXQgc3RyX2luZF8yLCB3aWR0aCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8xIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIGxldCBzdHJfaW5kXzMgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF8yIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8zXSB3aXRoXG4gICAgICAgICAgICAgIHwgJz4nIC0+XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZC0yKSAoc3RyX2luZF8zLXN0cl9pbmQrMykgaW5cbiAgICAgICAgICAgICAgICBzdHJfaW5kXzMgKyAxLCBCcmVhayAocywgd2lkdGgsIDApXG4gICAgICAgICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgICAgICAgIGxldCBzdHJfaW5kXzQsIG9mZnNldCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8zIGVuZF9pbmQgaW5cbiAgICAgICAgICAgICAgICBsZXQgc3RyX2luZF81ID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfNCBlbmRfaW5kIGluXG4gICAgICAgICAgICAgICAgaWYgc3RyLltzdHJfaW5kXzVdIDw+ICc+JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kLTIpIChzdHJfaW5kXzUtc3RyX2luZCszKSBpblxuICAgICAgICAgICAgICAgIHN0cl9pbmRfNSArIDEsIEJyZWFrIChzLCB3aWR0aCwgb2Zmc2V0KVxuICAgICAgICAgICAgICB8IF8gLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgIClcbiAgICAgICAgfCBfIC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgd2l0aCBOb3RfZm91bmQgfCBGYWlsdXJlIF8gLT5cbiAgICAgICAgc3RyX2luZCwgQnJlYWsgKFwiQDtcIiwgMSwgMClcbiAgICBpblxuICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIHRoZSBzaXplIGluIGEgPG4+LiAqKVxuICBhbmQgcGFyc2VfbWFnaWNfc2l6ZSA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBtYXRjaFxuICAgICAgdHJ5XG4gICAgICAgIGxldCBzdHJfaW5kXzEgPSBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8xXSB3aXRoXG4gICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgIGxldCBzdHJfaW5kXzIsIHNpemUgPSBwYXJzZV9pbnRlZ2VyIHN0cl9pbmRfMSBlbmRfaW5kIGluXG4gICAgICAgICAgbGV0IHN0cl9pbmRfMyA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzIgZW5kX2luZCBpblxuICAgICAgICAgIGlmIHN0ci5bc3RyX2luZF8zXSA8PiAnPicgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZCAtIDIpIChzdHJfaW5kXzMgLSBzdHJfaW5kICsgMykgaW5cbiAgICAgICAgICBTb21lIChzdHJfaW5kXzMgKyAxLCBNYWdpY19zaXplIChzLCBzaXplKSlcbiAgICAgICAgfCBfIC0+IE5vbmVcbiAgICAgIHdpdGggTm90X2ZvdW5kIHwgRmFpbHVyZSBfIC0+XG4gICAgICAgIE5vbmVcbiAgICB3aXRoXG4gICAgfCBTb21lIChuZXh0X2luZCwgZm9ybWF0dGluZ19saXQpIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuICAgIHwgTm9uZSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChTY2FuX2luZGljICc8JywgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIGFuZCBjb25zdHJ1Y3QgYSBjaGFyIHNldC4gKilcbiAgYW5kIHBhcnNlX2NoYXJfc2V0IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcblxuICAgIGxldCBjaGFyX3NldCA9IGNyZWF0ZV9jaGFyX3NldCAoKSBpblxuICAgIGxldCBhZGRfY2hhciBjID1cbiAgICAgIGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCBjO1xuICAgIGluXG4gICAgbGV0IGFkZF9yYW5nZSBjIGMnID1cbiAgICAgIGZvciBpID0gaW50X29mX2NoYXIgYyB0byBpbnRfb2ZfY2hhciBjJyBkb1xuICAgICAgICBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgKGNoYXJfb2ZfaW50IGkpO1xuICAgICAgZG9uZTtcbiAgICBpblxuXG4gICAgbGV0IGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZCA9XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6ICclJScgYWxvbmUgaXMgbm90IGFjY2VwdGVkIGluIGNoYXJhY3RlciBzZXRzLCBcXFxuICAgICAgICAgdXNlICUlJSUgaW5zdGVhZCBhdCBwb3NpdGlvbiAlZC5cIiBzdHIgc3RyX2luZFxuICAgIGluXG5cbiAgICAoKiBQYXJzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgY2hhciBzZXQuICopXG4gICAgbGV0IHJlYyBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGxldCBjID0gc3RyLltzdHJfaW5kXSBpblxuICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICAgKCogUGFyc2UgdGhlIGNvbnRlbnQgb2YgYSBjaGFyIHNldCB1bnRpbCB0aGUgZmlyc3QgJ10nLiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9jb250ZW50IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICddJyAtPlxuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnLScgLT5cbiAgICAgICAgYWRkX2NoYXIgJy0nO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCBjIC0+XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcblxuICAgICgqIFRlc3QgZm9yIHJhbmdlIGluIGNoYXIgc2V0LiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICctJyAtPlxuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9taW51cyAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyB3aGVuIGMgPSAnJScgLT5cbiAgICAgICAgYWRkX2NoYXIgYyc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGlmIGMgPSAnJScgdGhlbiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmQ7XG4gICAgICAgICgqIG5vdGUgdGhhdCAnQCcgYWxvbmUgaXMgYWNjZXB0ZWQsIGFzIGRvbmUgYnkgdGhlIGxlZ2FjeVxuICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjsgdGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWNhbGx5IHJlcXVpcmVzICVAXG4gICAgICAgICAgIHNvIHdlIGNvdWxkIHdhcm4gb24gdGhhdCAqKVxuICAgICAgICBhZGRfY2hhciBjO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjJ1xuXG4gICAgKCogTWFuYWdlIHJhbmdlIGluIGNoYXIgc2V0IChleGNlcHQgaWYgdGhlICctJyB0aGUgbGFzdCBjaGFyIGJlZm9yZSAnXScpICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2FmdGVyX21pbnVzIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIGFkZF9jaGFyICctJztcbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJyUnIC0+XG4gICAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyAtPlxuICAgICAgICAgICAgYWRkX3JhbmdlIGMgYyc7XG4gICAgICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMikgZW5kX2luZFxuICAgICAgICAgIHwgXyAtPiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmRcbiAgICAgICAgZW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGFkZF9yYW5nZSBjIGMnO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgIGluXG4gICAgbGV0IHN0cl9pbmQsIHJldmVyc2UgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgICB8ICdeJyAtPiBzdHJfaW5kICsgMSwgdHJ1ZVxuICAgICAgICB8IF8gLT4gc3RyX2luZCwgZmFsc2UgaW5cbiAgICBsZXQgbmV4dF9pbmQgPSBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICBsZXQgY2hhcl9zZXQgPSBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgaW5cbiAgICBuZXh0X2luZCwgKGlmIHJldmVyc2UgdGhlbiByZXZfY2hhcl9zZXQgY2hhcl9zZXQgZWxzZSBjaGFyX3NldClcblxuICAoKiBDb25zdW1lIGFsbCBuZXh0IHNwYWNlcywgcmFpc2UgYW4gRmFpbHVyZSBpZiBlbmRfaW5kIGlzIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGlmIHN0ci5bc3RyX2luZF0gPSAnICcgdGhlbiBwYXJzZV9zcGFjZXMgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGVsc2Ugc3RyX2luZFxuXG4gICgqIFJlYWQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZyb20gdGhlIHN0cmluZywgcmFpc2UgYSBGYWlsdXJlIGlmIGVuZF9pbmQgaXNcbiAgICAgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCBhY2MgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gYWNjICogMTAgKyAoaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICcwJykgaW5cbiAgICAgIGlmIG5ld19hY2MgPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogaW50ZWdlciAlZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxpbWl0ICVkXCJcbiAgICAgICAgICBzdHIgbmV3X2FjYyBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICAgIGVsc2VcbiAgICAgICAgcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG5ld19hY2NcbiAgICB8IF8gLT4gc3RyX2luZCwgYWNjXG5cbiAgKCogUmVhZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgZnJvbSB0aGUgc3RyaW5nLCByYWlzZSBhIEZhaWx1cmVcbiAgICAgaWYgZW5kX2luZCBpcyByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2VfaW50ZWdlciBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwXG4gICAgfCAnLScgLT4gKFxuICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgLT5cbiAgICAgICAgbGV0IG5leHRfaW5kLCBuID0gcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIDAgaW5cbiAgICAgICAgbmV4dF9pbmQsIC1uXG4gICAgICB8IGMgLT5cbiAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJkaWdpdFwiIGNcbiAgICApXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIEFkZCBhIGxpdGVyYWwgdG8gYSBmb3JtYXQgZnJvbSBhIGxpdGVyYWwgY2hhcmFjdGVyIHN1Yi1zZXF1ZW5jZS4gKilcbiAgYW5kIGFkZF9saXRlcmFsIDogdHlwZSBhIGQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gKGEsIF8sIF8sIGQsIGUsIGYpIGZtdCAtPlxuICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gbGl0X3N0YXJ0IHN0cl9pbmQgZm10IC0+IG1hdGNoIHN0cl9pbmQgLSBsaXRfc3RhcnQgd2l0aFxuICAgIHwgMCAgICAtPiBGbXRfRUJCIGZtdFxuICAgIHwgMSAgICAtPiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKHN0ci5bbGl0X3N0YXJ0XSwgZm10KSlcbiAgICB8IHNpemUgLT4gRm10X0VCQiAoU3RyaW5nX2xpdGVyYWwgKFN0cmluZy5zdWIgc3RyIGxpdF9zdGFydCBzaXplLCBmbXQpKVxuXG4gICgqIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN1Yi1mb3JtYXRcbiAgICAgKGkuZS4gdGhlIGNvcnJlc3BvbmRpbmcgXCIlfVwiIG9yIFwiJSlcIikgKilcbiAgYW5kIHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuXG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IHVuY2xvc2VkIHN1Yi1mb3JtYXQsIFxcXG4gICAgICAgICBleHBlY3RlZCBcXFwiJSUlY1xcXCIgYXQgY2hhcmFjdGVyIG51bWJlciAlZFwiIHN0ciBjIGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnJScgLT5cbiAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgaWYgc3RyLltzdHJfaW5kICsgMV0gPSBjIHRoZW4gKCogRW5kIG9mIGZvcm1hdCBmb3VuZCAqKSBzdHJfaW5kIGVsc2VcbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMV0gd2l0aFxuICAgICAgICB8ICdfJyAtPlxuICAgICAgICAgICgqIFNlYXJjaCBmb3IgXCIlXyhcIiBvciBcIiVfe1wiLiAqKVxuICAgICAgICAgIGlmIHN0cl9pbmQgKyAyID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDJdIHdpdGhcbiAgICAgICAgICB8ICd7JyAtPlxuICAgICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDMpIGVuZF9pbmQgJ30nIGluXG4gICAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCAnKScgaW5cbiAgICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgICAgfCBfIC0+IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCBjXG4gICAgICAgICAgZW5kXG4gICAgICAgIHwgJ3snIC0+XG4gICAgICAgICAgKCogJXsuLi4lfSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICd9JyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgKCogJSguLi4lKSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICcpJyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJ30nIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICUoLi4uJX0uICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJyknXCIgJ30nXG4gICAgICAgIHwgJyknIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICV7Li4uJSkuICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJ30nXCIgJyknXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIGVuZFxuICAgIHwgXyAtPiBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICgqIENoZWNrIGlmIHN5bWIgaXMgYSB2YWxpZCBpbnQgY29udmVyc2lvbiBhZnRlciBcIiVsXCIsIFwiJW5cIiBvciBcIiVMXCIgKilcbiAgYW5kIGlzX2ludF9iYXNlIHN5bWIgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICdkJyB8ICdpJyB8ICd4JyB8ICdYJyB8ICdvJyB8ICd1JyAtPiB0cnVlXG4gICAgfCBfIC0+IGZhbHNlXG5cbiAgKCogQ29udmVydCBhIGNoYXIgKGwsIG4gb3IgTCkgdG8gaXRzIGFzc29jaWF0ZWQgY291bnRlci4gKilcbiAgYW5kIGNvdW50ZXJfb2ZfY2hhciBzeW1iID0gbWF0Y2ggc3ltYiB3aXRoXG4gICAgfCAnbCcgLT4gTGluZV9jb3VudGVyICB8ICduJyAtPiBDaGFyX2NvdW50ZXJcbiAgICB8ICdMJyAtPiBUb2tlbl9jb3VudGVyIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzeW1iKSB0byBpdHMgYXNzb2NpYXRlZCBpbnRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBzcGFjZSBzeW1iID1cbiAgICBtYXRjaCBwbHVzLCBoYXNoLCBzcGFjZSwgc3ltYiB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnZCcgLT4gSW50X2QgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ2knIC0+IEludF9pXG4gICAgfCBmYWxzZSwgZmFsc2UsICB0cnVlLCAnZCcgLT4gSW50X3NkIHwgZmFsc2UsIGZhbHNlLCAgdHJ1ZSwgJ2knIC0+IEludF9zaVxuICAgIHwgIHRydWUsIGZhbHNlLCBmYWxzZSwgJ2QnIC0+IEludF9wZCB8ICB0cnVlLCBmYWxzZSwgZmFsc2UsICdpJyAtPiBJbnRfcGlcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd4JyAtPiBJbnRfeCAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnWCcgLT4gSW50X1hcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICd4JyAtPiBJbnRfQ3ggfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnWCcgLT4gSW50X0NYXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnbycgLT4gSW50X29cbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdvJyAtPiBJbnRfQ29cbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd1JyAtPiBJbnRfdVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2QnIC0+IEludF9DZFxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2knIC0+IEludF9DaVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ3UnIC0+IEludF9DdVxuICAgIHwgXywgdHJ1ZSwgXywgJ3gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DeFxuICAgIHwgXywgdHJ1ZSwgXywgJ1gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DWFxuICAgIHwgXywgdHJ1ZSwgXywgJ28nIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9Db1xuICAgIHwgXywgdHJ1ZSwgXywgKCdkJyB8ICdpJyB8ICd1JykgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGZhbHNlIHNwYWNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIlxuICAgIHwgdHJ1ZSwgXywgdHJ1ZSwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogcGx1cyBhbmQgc3BhY2U6IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHBsdXMgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIGZhbHNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiXG4gICAgfCBmYWxzZSwgXywgdHJ1ZSwgXyAgICAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBmYWxzZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyAnXCJcbiAgICB8IHRydWUsIF8sIGZhbHNlLCBfICAgIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgZmFsc2UgaGFzaCBzcGFjZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJysnXCJcbiAgICB8IGZhbHNlLCBfLCBmYWxzZSwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzcGFjZSwgc3ltYikgdG8gaXRzIGFzc29jaWF0ZWQgZmxvYXRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIHNwYWNlIHN5bWIgPVxuICAgIGxldCBmbGFnID0gbWF0Y2ggcGx1cywgc3BhY2Ugd2l0aFxuICAgIHwgZmFsc2UsIGZhbHNlIC0+IEZsb2F0X2ZsYWdfXG4gICAgfCBmYWxzZSwgIHRydWUgLT4gRmxvYXRfZmxhZ19zXG4gICAgfCAgdHJ1ZSwgZmFsc2UgLT4gRmxvYXRfZmxhZ19wXG4gICAgfCAgdHJ1ZSwgIHRydWUgLT5cbiAgICAgICgqIHBsdXMgYW5kIHNwYWNlOiBsZWdhY3kgaW1wbGVtZW50YXRpb24gcHJlZmVycyBwbHVzICopXG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBGbG9hdF9mbGFnX3BcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiIGluXG4gICAgbGV0IGtpbmQgPSBtYXRjaCBoYXNoLCBzeW1iIHdpdGhcbiAgICB8IF8sICdmJyAtPiBGbG9hdF9mXG4gICAgfCBfLCAnZScgLT4gRmxvYXRfZVxuICAgIHwgXywgJ0UnIC0+IEZsb2F0X0VcbiAgICB8IF8sICdnJyAtPiBGbG9hdF9nXG4gICAgfCBfLCAnRycgLT4gRmxvYXRfR1xuICAgIHwgXywgJ2gnIC0+IEZsb2F0X2hcbiAgICB8IF8sICdIJyAtPiBGbG9hdF9IXG4gICAgfCBmYWxzZSwgJ0YnIC0+IEZsb2F0X0ZcbiAgICB8IHRydWUsICdGJyAtPiBGbG9hdF9DRlxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgaW5cbiAgICBmbGFnLCBraW5kXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGluY29tcGF0aWJsZSBvcHRpb25zLiopXG4gIGFuZCBpbmNvbXBhdGlibGVfZmxhZyA6IHR5cGUgYSAuIGludCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmcgLT4gYSA9XG4gICAgZnVuIHBjdF9pbmQgc3RyX2luZCBzeW1iIG9wdGlvbiAtPlxuICAgICAgbGV0IHN1YmZtdCA9IFN0cmluZy5zdWIgc3RyIHBjdF9pbmQgKHN0cl9pbmQgLSBwY3RfaW5kKSBpblxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgJXMgaXMgaW5jb21wYXRpYmxlIHdpdGggJyVjJyBpbiBzdWItZm9ybWF0ICVTXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgb3B0aW9uIHN5bWIgc3ViZm10XG5cbiAgaW4gcGFyc2UgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAoKiBHdWFyZGVkIHN0cmluZyB0byBmb3JtYXQgY29udmVyc2lvbnMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2ZtdHR5IHN0ciBmbXR0eSA9XG4gIGxldCBGbXRfRUJCIGZtdCA9IGZtdF9lYmJfb2Zfc3RyaW5nIHN0ciBpblxuICB0cnkgRm9ybWF0ICh0eXBlX2Zvcm1hdCBmbXQgZm10dHksIHN0cilcbiAgd2l0aCBUeXBlX21pc21hdGNoIC0+XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJiYWQgaW5wdXQ6IGZvcm1hdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gJVMgYW5kICVTXCJcbiAgICAgIHN0ciAoc3RyaW5nX29mX2ZtdHR5IGZtdHR5KVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBhbiBvdGhlciBmb3JtYXQuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCBzdHIgKEZvcm1hdCAoZm10Jywgc3RyJykpID1cbiAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgc3RyIGluXG4gIHRyeSBGb3JtYXQgKHR5cGVfZm9ybWF0IGZtdCAoZm10dHlfb2ZfZm10IGZtdCcpLCBzdHIpXG4gIHdpdGggVHlwZV9taXNtYXRjaCAtPlxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiYmFkIGlucHV0OiBmb3JtYXQgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICVTIGFuZCAlU1wiIHN0ciBzdHInXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmxpdF9zdHJpbmciLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9mb3JtYXRfZmxvYXQiLCJjYW1sX2Zvcm1hdF9pbnQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX25vdGVxdWFsIiwiY2FtbF9zdHJpbmdfZ2V0IiwiY2FtbF9zdHJpbmdfdW5zYWZlX2dldCIsImNhbWxfdHJhbXBvbGluZSIsImNhbWxfdHJhbXBvbGluZV9yZXR1cm4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImNhbWxfY2FsbDQiLCJhMyIsImNhbWxfY2FsbDUiLCJhNCIsImR1bW15IiwiZ2xvYmFsX2RhdGEiLCJBc3NlcnRfZmFpbHVyZSIsIkNhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcyIsIlN0ZGxpYiIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX1N5cyIsIlN0ZGxpYl9DaGFyIiwiU3RkbGliX0J5dGVzIiwiU3RkbGliX0ludCIsImNyZWF0ZV9jaGFyX3NldCIsInBhcmFtIiwiYWRkX2luX2NoYXJfc2V0IiwiY2hhcl9zZXQiLCJjIiwic3RyX2luZCIsIm1hc2siLCJmcmVlemVfY2hhcl9zZXQiLCJyZXZfY2hhcl9zZXQiLCJpIiwiaXNfaW5fY2hhcl9zZXQiLCJwYWRfb2ZfcGFkX29wdCIsInBhZF9vcHQiLCJ3aWR0aCIsInBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCIsImlnbiIsImZtdCIsImljb252IiwicHJlY19vcHQiLCJuZGVjIiwiZm10dHkiLCJ3aWR0aF9vcHQiLCJjb3VudGVyIiwiZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24iLCJmY29udiIsImJ1ZmZlcl9jcmVhdGUiLCJpbml0X3NpemUiLCJidWZmZXJfY2hlY2tfc2l6ZSIsImJ1ZiIsIm92ZXJoZWFkIiwibGVuIiwibWluX2xlbiIsIm5ld19sZW4iLCJuZXdfc3RyIiwiYnVmZmVyX2FkZF9jaGFyIiwiYnVmZmVyX2FkZF9zdHJpbmciLCJzIiwic3RyX2xlbiIsImJ1ZmZlcl9jb250ZW50cyIsImNoYXJfb2ZfaWNvbnYiLCJjaGFyX29mX2Zjb252Iiwib3B0IiwiY0YiLCJicHJpbnRfY2hhcl9zZXQiLCJwcmludF9jaGFyIiwic2V0IiwiaXNfYWxvbmUiLCJhZnRlciIsImJlZm9yZSIsInN3aXRjaGVyIiwiaiIsImJwcmludF9wYWR0eSIsInBhZHR5IiwiYnByaW50X2lnbm9yZWRfZmxhZyIsImlnbl9mbGFnIiwiYnByaW50X3BhZF9vcHQiLCJicHJpbnRfcGFkZGluZyIsInBhZCIsIm4iLCJicHJpbnRfcHJlY2lzaW9uIiwicHJlYyIsImJwcmludF9pY29udl9mbGFnIiwiYnByaW50X2FsdGludF9mbXQiLCJicHJpbnRfZmNvbnZfZmxhZyIsInN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCIsImZvcm1hdHRpbmdfbGl0Iiwic3RyIiwiYnByaW50X2NoYXJfbGl0ZXJhbCIsImNociIsImJwcmludF9zdHJpbmdfbGl0ZXJhbCIsImNzdF9MaSIsImNzdF9pIiwiY3N0X2xpIiwiY3N0X25pIiwiYnByaW50X2ZtdHR5Iiwic3ViX2ZtdHR5IiwiaW50X29mX2N1c3RvbV9hcml0eSIsIngiLCJjc3QiLCJzdHJpbmdfb2ZfZm10IiwiZm10aXRlciIsInJlc3QiLCJmbXRpbmdfbGl0IiwiZm10aW5nX2dlbiIsImFyaXR5Iiwic3ltbSIsInR5IiwidHkyIiwidHkxIiwiZm10dHlfcmVsX2RldCIsIm1hdGNoIiwiZGUiLCJhZiIsImpkIiwiZ2EiLCJjc3RfY2FtbGludGVybmFsRm9ybWF0X21sIiwidHJhbnMiLCJyZXN0MSIsInJlc3QyIiwidHkxMiIsInR5MTEiLCJ0eTIyIiwidHkyMSIsImY0IiwiZjIiLCJmbXR0eV9vZl9mbXQiLCJ0eV9yZXN0IiwicHJlY190eSIsImZvcm1hdHRpbmdfZ2VuIiwiZm10dHlfb2ZfY3VzdG9tIiwiZm10dHlfb2ZfcGFkZGluZ19mbXR0eSIsImZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSIsIlR5cGVfbWlzbWF0Y2giLCJ0eXBlX3BhZGRpbmciLCJ3IiwidHlwZV9wYWRwcmVjIiwicCIsInR5cGVfZm9ybWF0IiwidHlwZV9mb3JtYXRfZ2VuIiwiZm10dHkwIiwiZm10dHlfcmVzdCIsImZtdF9yZXN0Iiwic3ViX2ZtdHR5MSIsImZtdDEiLCJmbXR0eTIiLCJmbXQyIiwiZm10dHkzIiwiZm10MyIsInR5cGVfaWdub3JlZF9wYXJhbV9vbmUiLCJ0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGkiLCJzdWJfZm10dHlfcmVzdCIsInN1YjJfZm10dHkiLCJzdWIxX2ZtdHR5IiwicmVjYXN0IiwiZml4X3BhZGRpbmciLCJyZXMiLCJmaXhfaW50X3ByZWNpc2lvbiIsInN0cmluZ190b19jYW1sX3N0cmluZyIsImwiLCJmb3JtYXRfb2ZfZmNvbnYiLCJzeW1iIiwidHJhbnNmb3JtX2ludF9hbHQiLCJwb3MiLCJwdXQiLCJsZWZ0IiwiY3N0X3UiLCJjb252ZXJ0X2ludCIsImNvbnZlcnRfaW50MzIiLCJjb252ZXJ0X25hdGl2ZWludCIsImNvbnZlcnRfaW50NjQiLCJjb252ZXJ0X2Zsb2F0IiwiaGV4Iiwic2lnbiIsImNhbWxfc3BlY2lhbF92YWwiLCJzdHJpbmdfb2ZfZm10dHkiLCJtYWtlX3ByaW50ZiIsImsiLCJhY2MiLCJrYWNjIiwibmV3X2FjYyIsIm8iLCJtYWtlX2lnbm9yZWRfcGFyYW0iLCJtYWtlX2Zyb21fZm10dHkiLCJtYWtlX2ludmFsaWRfYXJnIiwibWFrZV9wYWRkaW5nIiwibWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24iLCJtYWtlX2N1c3RvbSIsIm1ha2VfaXByaW50ZiIsImtvYyIsImZuX29mX2N1c3RvbV9hcml0eSIsIm91dHB1dF9hY2MiLCJtc2ciLCJidWZwdXRfYWNjIiwiYiIsInN0cnB1dF9hY2MiLCJmYWlsd2l0aF9tZXNzYWdlIiwib3Blbl9ib3hfb2Zfc3RyaW5nIiwiaW52YWxpZF9ib3giLCJwYXJzZV9zcGFjZXMiLCJ3c3RhcnQiLCJ3ZW5kIiwiYm94X25hbWUiLCJuc3RhcnQiLCJuZW5kIiwiaW5kZW50IiwiZXhuIiwiZXhwX2VuZCIsImJveF90eXBlIiwibWFrZV9wYWRkaW5nX2ZtdF9lYmIiLCJtYWtlX3BhZHByZWNfZm10X2ViYiIsImNzdF9hdF9jaGFyYWN0ZXJfbnVtYmVyIiwiY3N0X2ludmFsaWRfZm9ybWF0Iiwic3ViX2Zvcm1hdCIsImZtdF9lYmJfb2Zfc3RyaW5nIiwibGVnYWN5X2JlaGF2aW9yIiwiZmxhZyIsImludmFsaWRfZm9ybWF0X21lc3NhZ2UiLCJpbnZhbGlkX2Zvcm1hdF93aXRob3V0IiwiZXhwZWN0ZWRfY2hhcmFjdGVyIiwiZXhwZWN0ZWQiLCJyZWFkIiwiY3N0X3VuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCIsInBhcnNlIiwibGl0X3N0YXJ0IiwiZW5kX2luZCIsImNzdF8wIiwicGFyc2VfZmxhZ3MiLCJwY3RfaW5kIiwic2V0X2ZsYWciLCJ6ZXJvIiwibWludXMiLCJwbHVzIiwic3BhY2UiLCJoYXNoIiwibmV3X2luZCIsImNzdF9wcmVjaXNpb24iLCJwYXJzZV9hZnRlcl9wYWRkaW5nIiwicGFyc2VfbGl0ZXJhbCIsInBhcnNlX2FmdGVyX3ByZWNpc2lvbiIsInBhcnNlX2NvbnYiLCJwYWRwcmVjIiwicGFyc2VfY29udmVyc2lvbiIsInBsdXNfdXNlZCIsImdldF9wbHVzIiwiaGFzaF91c2VkIiwiZ2V0X2hhc2giLCJzcGFjZV91c2VkIiwiZ2V0X3NwYWNlIiwiaWduX3VzZWQiLCJnZXRfaWduIiwicGFkX3VzZWQiLCJnZXRfcGFkIiwicHJlY191c2VkIiwiZ2V0X3ByZWMiLCJnZXRfcGFkcHJlYyIsImdldF9pbnRfcGFkIiwiY2hlY2tfbm9fMCIsIm9wdF9vZl9wYWQiLCJnZXRfcGFkX29wdCIsImdldF9wYWRwcmVjX29wdCIsImZtdF9yZXN1bHQiLCJzdWJfZW5kIiwic3ViX2ZtdCIsImlnbm9yZWQiLCJuZXh0X2luZCIsImNoYXJfZm9ybWF0Iiwia2luZCIsInBhcnNlX2FmdGVyX2F0Iiwic3RyX2luZF8xIiwic3RyX2luZF8yIiwic3RyX2luZF8zIiwib2Zmc2V0Iiwic3RyX2luZF80Iiwic3RyX2luZF81Iiwic2l6ZSIsInBhcnNlX3RhZyIsImlzX29wZW5fdGFnIiwiaW5kIiwic3ViX3N0ciIsImZvcm1hdHRpbmciLCJwYXJzZV9jaGFyX3NldCIsImFkZF9yYW5nZSIsImZhaWxfc2luZ2xlX3BlcmNlbnQiLCJwYXJzZV9jaGFyX3NldF9jb250ZW50IiwicGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciIsInJldmVyc2UiLCJwYXJzZV9wb3NpdGl2ZSIsInBhcnNlX2ludGVnZXIiLCJhZGRfbGl0ZXJhbCIsInNlYXJjaF9zdWJmb3JtYXRfZW5kIiwiY29tcHV0ZV9pbnRfY29udiIsImluY29tcGF0aWJsZV9mbGFnIiwib3B0aW9uIiwic3ViZm10IiwiY3N0X2FuZCIsImNzdF9iYWRfaW5wdXRfZm9ybWF0X3R5cGVfbWlzbSIsImZvcm1hdF9vZl9zdHJpbmdfZm10dHkiLCJmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyx5QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMseUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FB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MjE4ODUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvcHJpbnRmLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBYYXZpZXIgTGVyb3kgYW5kIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxubGV0IGtmcHJpbnRmIGsgbyAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgbyBhY2M7IGsgbykgRW5kX29mX2FjYyBmbXRcbmxldCBrYnByaW50ZiBrIGIgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZiAoZnVuIGFjYyAtPiBidWZwdXRfYWNjIGIgYWNjOyBrIGIpIEVuZF9vZl9hY2MgZm10XG5sZXQgaWtmcHJpbnRmIGsgb2MgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgayBvYyBmbXRcbmxldCBpa2JwcmludGYgPSBpa2ZwcmludGZcblxubGV0IGZwcmludGYgb2MgZm10ID0ga2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGJwcmludGYgYiBmbXQgPSBrYnByaW50ZiBpZ25vcmUgYiBmbXRcbmxldCBpZnByaW50ZiBvYyBmbXQgPSBpa2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGlicHJpbnRmIGIgZm10ID0gaWticHJpbnRmIGlnbm9yZSBiIGZtdFxubGV0IHByaW50ZiBmbXQgPSBmcHJpbnRmIHN0ZG91dCBmbXRcbmxldCBlcHJpbnRmIGZtdCA9IGZwcmludGYgc3RkZXJyIGZtdFxuXG5sZXQga3NwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBrJyBhY2MgPVxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gICAgc3RycHV0X2FjYyBidWYgYWNjO1xuICAgIGsgKEJ1ZmZlci5jb250ZW50cyBidWYpIGluXG4gIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10XG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAtPiBzKSBmbXRcblxubGV0IGtwcmludGYgPSBrc3ByaW50ZlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQnVmZmVyIiwiQ2FtbGludGVybmFsRm9ybWF0IiwiU3RkbGliIiwia2ZwcmludGYiLCJrIiwibyIsInBhcmFtIiwiZm10IiwiYWNjIiwia2JwcmludGYiLCJiIiwiaWtmcHJpbnRmIiwib2MiLCJmcHJpbnRmIiwiYnByaW50ZiIsImlmcHJpbnRmIiwiaWJwcmludGYiLCJwcmludGYiLCJlcHJpbnRmIiwia3NwcmludGYiLCJidWYiLCJzcHJpbnRmIiwicyJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxZQUFBQyxTQUFBQyxHQUFBQyxHQUFBQztBQUFBQSxRQUFBQyxNQ2tCYTtBQUFBLElBQ1g7QUFBQTtBQUFBLHNCQUFBQztBQUFBQSxjQUF3QjtBQUFBLGNBQWdCLHVCQUFLO0FBQUE7QUFBQTtBQUFBLGlCQUFnQjtBQUFBO0FBQUEsWUFBQUMsU0FBQUwsR0FBQU0sR0FBQUo7QUFBQUEsUUFBQUMsTUFDbEQ7QUFBQSxJQUNYO0FBQUE7QUFBQSxzQkFBQUM7QUFBQUEsY0FBd0I7QUFBQSxjQUFnQix1QkFBSztBQUFBO0FBQUE7QUFBQSxpQkFBZ0I7QUFBQTtBQUFBLFlBQUFHLFVBQUFQLEdBQUFRLElBQUFOO0FBQUFBLFFBQUFDLE1BQ2pEO0FBQUEsSUFDWixtREFBcUI7QUFBQTtBQUFBLFlBQUFNLFFBQUFELElBQUFMO0FBQUFBLElBR0YsNEJEMUJyQixvQkMwQjJDO0FBQUE7QUFBQSxZQUFBTyxRQUFBSixHQUFBSCxLQUN2Qiw0QkQzQnBCLG1CQzJCeUM7QUFBQSxZQUFBUSxTQUFBSCxJQUFBTDtBQUFBQSxJQUNuQiw2QkQ1QnRCLG9CQzRCNkM7QUFBQTtBQUFBLFlBQUFTLFNBQUFOLEdBQUFIO0FBQUFBLElBQ3hCLDZCRDdCckIsbUJDNkIyQztBQUFBO0FBQUEsWUFBQVUsT0FBQVYsS0FDMUIsK0JBQWtCO0FBQUEsWUFBQVcsUUFBQVgsS0FDakIsK0JBQWtCO0FBQUEsWUFBQVksU0FBQWYsR0FBQUU7QUFBQUEsUUFBQUMsTUFFdkI7QUFBQSxhQUFBSCxJQUFBSTtBQUFBQSxTQUFBWSxNQUVDO0FBQUEsS0FDVjtBQUFBLEtBQ0UsT0FBcUIsY0FBckIsaUNBQXFCO0FBQUE7QUFBQSxJQUN6QixvREFBNkI7QUFBQTtBQUFBLFlBQUFDLFFBQUFkLEtBRWIseUJBQUFlLEdBQW1CLFNBQUMsT0FBSztBQUFBLEdEeEMzQyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjIxOTcxLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL3ByaW50ZXhjLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIFByaW50ZlxuXG50eXBlIHQgPSBleG4gPSAuLlxuXG5sZXQgcHJpbnRlcnMgPSBBdG9taWMubWFrZSBbXVxuXG5sZXQgbG9jZm10ID0gZm9ybWF0X29mX3N0cmluZyBcIkZpbGUgXFxcIiVzXFxcIiwgbGluZSAlZCwgY2hhcmFjdGVycyAlZC0lZDogJXNcIlxuXG5sZXQgZmllbGQgeCBpID1cbiAgbGV0IGYgPSBPYmouZmllbGQgeCBpIGluXG4gIGlmIG5vdCAoT2JqLmlzX2Jsb2NrIGYpIHRoZW5cbiAgICBzcHJpbnRmIFwiJWRcIiAoT2JqLm1hZ2ljIGYgOiBpbnQpICAgICAgICAgICAoKiBjYW4gYWxzbyBiZSBhIGNoYXIgKilcbiAgZWxzZSBpZiBPYmoudGFnIGYgPSBPYmouc3RyaW5nX3RhZyB0aGVuXG4gICAgc3ByaW50ZiBcIiVTXCIgKE9iai5tYWdpYyBmIDogc3RyaW5nKVxuICBlbHNlIGlmIE9iai50YWcgZiA9IE9iai5kb3VibGVfdGFnIHRoZW5cbiAgICBzdHJpbmdfb2ZfZmxvYXQgKE9iai5tYWdpYyBmIDogZmxvYXQpXG4gIGVsc2VcbiAgICBcIl9cIlxuXG5sZXQgcmVjIG90aGVyX2ZpZWxkcyB4IGkgPVxuICBpZiBpID49IE9iai5zaXplIHggdGhlbiBcIlwiXG4gIGVsc2Ugc3ByaW50ZiBcIiwgJXMlc1wiIChmaWVsZCB4IGkpIChvdGhlcl9maWVsZHMgeCAoaSsxKSlcblxubGV0IGZpZWxkcyB4ID1cbiAgbWF0Y2ggT2JqLnNpemUgeCB3aXRoXG4gIHwgMCAtPiBcIlwiXG4gIHwgMSAtPiBcIlwiXG4gIHwgMiAtPiBzcHJpbnRmIFwiKCVzKVwiIChmaWVsZCB4IDEpXG4gIHwgXyAtPiBzcHJpbnRmIFwiKCVzJXMpXCIgKGZpZWxkIHggMSkgKG90aGVyX2ZpZWxkcyB4IDIpXG5cbmxldCB1c2VfcHJpbnRlcnMgeCA9XG4gIGxldCByZWMgY29udiA9IGZ1bmN0aW9uXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICAobWF0Y2ggaGQgeCB3aXRoXG4gICAgICAgICB8IE5vbmUgfCBleGNlcHRpb24gXyAtPiBjb252IHRsXG4gICAgICAgICB8IFNvbWUgcyAtPiBTb21lIHMpXG4gICAgfCBbXSAtPiBOb25lIGluXG4gIGNvbnYgKEF0b21pYy5nZXQgcHJpbnRlcnMpXG5cbmxldCBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgeCA9XG4gIGlmIE9iai50YWcgeCA8PiAwIHRoZW5cbiAgICAoKE9iai5tYWdpYyAoT2JqLmZpZWxkIHggMCkgOiBzdHJpbmcpLCBOb25lKVxuICBlbHNlXG4gICAgbGV0IGNvbnN0cnVjdG9yID1cbiAgICAgIChPYmoubWFnaWMgKE9iai5maWVsZCAoT2JqLmZpZWxkIHggMCkgMCkgOiBzdHJpbmcpIGluXG4gICAgKGNvbnN0cnVjdG9yLCBTb21lIChmaWVsZHMgeCkpXG5cbmxldCBzdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHQgPVxuICBsZXQgY29uc3RydWN0b3IsIGZpZWxkc19vcHQgPSBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgdCBpblxuICBtYXRjaCBmaWVsZHNfb3B0IHdpdGhcbiAgfCBOb25lIC0+IGNvbnN0cnVjdG9yXG4gIHwgU29tZSBmIC0+IGNvbnN0cnVjdG9yIF4gZlxuXG5sZXQgdG9fc3RyaW5nX2RlZmF1bHQgPSBmdW5jdGlvblxuICB8IE91dF9vZl9tZW1vcnkgLT4gXCJPdXQgb2YgbWVtb3J5XCJcbiAgfCBTdGFja19vdmVyZmxvdyAtPiBcIlN0YWNrIG92ZXJmbG93XCJcbiAgfCBNYXRjaF9mYWlsdXJlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis1KSBcIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbGVkXCJcbiAgfCBBc3NlcnRfZmFpbHVyZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJBc3NlcnRpb24gZmFpbGVkXCJcbiAgfCBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJVbmRlZmluZWQgcmVjdXJzaXZlIG1vZHVsZVwiXG4gIHwgeCAtPlxuICAgICAgc3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvciAoT2JqLnJlcHIgeClcblxubGV0IHRvX3N0cmluZyBlID1cbiAgbWF0Y2ggdXNlX3ByaW50ZXJzIGUgd2l0aFxuICB8IFNvbWUgcyAtPiBzXG4gIHwgTm9uZSAtPiB0b19zdHJpbmdfZGVmYXVsdCBlXG5cbmxldCBwcmludCBmY3QgYXJnID1cbiAgdHJ5XG4gICAgZmN0IGFyZ1xuICB3aXRoIHggLT5cbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZmx1c2ggc3RkZXJyO1xuICAgIHJhaXNlIHhcblxubGV0IGNhdGNoIGZjdCBhcmcgPVxuICB0cnlcbiAgICBmY3QgYXJnXG4gIHdpdGggeCAtPlxuICAgIGZsdXNoIHN0ZG91dDtcbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZXhpdCAyXG5cbnR5cGUgcmF3X2JhY2t0cmFjZV9zbG90XG50eXBlIHJhd19iYWNrdHJhY2VfZW50cnkgPSBwcml2YXRlIGludFxudHlwZSByYXdfYmFja3RyYWNlID0gcmF3X2JhY2t0cmFjZV9lbnRyeSBhcnJheVxuXG5sZXQgcmF3X2JhY2t0cmFjZV9lbnRyaWVzIGJ0ID0gYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2U6XG4gIHVuaXQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2VcIlxuXG5leHRlcm5hbCByYWlzZV93aXRoX2JhY2t0cmFjZTogZXhuIC0+IHJhd19iYWNrdHJhY2UgLT4gJ2FcbiAgPSBcIiVyYWlzZV93aXRoX2JhY2t0cmFjZVwiXG5cbigqIERpc2FibGUgd2FybmluZyAzNzogdmFsdWVzIGFyZSBjb25zdHJ1Y3RlZCBpbiB0aGUgcnVudGltZSAqKVxudHlwZVtAd2FybmluZyBcIi0zN1wiXSBiYWNrdHJhY2Vfc2xvdCA9XG4gIHwgS25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgICA6IGJvb2w7XG4gICAgICBmaWxlbmFtZSAgIDogc3RyaW5nO1xuICAgICAgc3RhcnRfbG51bSA6IGludDtcbiAgICAgIHN0YXJ0X2NoYXIgOiBpbnQ7XG4gICAgICBlbmRfb2Zmc2V0IDogaW50OyAoKiBSZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2Ygc3RhcnRfbG51bSAqKVxuICAgICAgZW5kX2xudW0gICA6IGludDtcbiAgICAgIGVuZF9jaGFyICAgOiBpbnQ7ICgqIFJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBlbmRfbG51bSBsaW5lICopXG4gICAgICBpc19pbmxpbmUgIDogYm9vbDtcbiAgICAgIGRlZm5hbWUgICAgOiBzdHJpbmc7XG4gICAgfVxuICB8IFVua25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgOiBib29sXG4gICAgfVxuXG5leHRlcm5hbCBjb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdDpcbiAgcmF3X2JhY2t0cmFjZV9zbG90IC0+IGJhY2t0cmFjZV9zbG90ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XCJcblxuZXh0ZXJuYWwgY29udmVydF9yYXdfYmFja3RyYWNlOlxuICByYXdfYmFja3RyYWNlIC0+IGJhY2t0cmFjZV9zbG90IGFycmF5ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZVwiXG5cbmxldCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UgYnQgPVxuICB0cnkgU29tZSAoY29udmVydF9yYXdfYmFja3RyYWNlIGJ0KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgcG9zIHNsb3QgPVxuICBsZXQgaW5mbyBpc19yYWlzZSA9XG4gICAgaWYgaXNfcmFpc2UgdGhlblxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGF0XCIgZWxzZSBcIlJlLXJhaXNlZCBhdFwiXG4gICAgZWxzZVxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGJ5IHByaW1pdGl2ZSBvcGVyYXRpb24gYXRcIiBlbHNlIFwiQ2FsbGVkIGZyb21cIlxuICBpblxuICBtYXRjaCBzbG90IHdpdGhcbiAgfCBVbmtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGlmIGwuaXNfcmFpc2UgdGhlblxuICAgICAgICAoKiBjb21waWxlci1pbnNlcnRlZCByZS1yYWlzZSwgc2tpcHBlZCAqKSBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIFNvbWUgKHNwcmludGYgXCIlcyB1bmtub3duIGxvY2F0aW9uXCIgKGluZm8gZmFsc2UpKVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGxldCBsaW5lcyA9XG4gICAgICAgIGlmIGwuc3RhcnRfbG51bSA9IGwuZW5kX2xudW0gdGhlblxuICAgICAgICAgIFByaW50Zi5zcHJpbnRmIFwiICVkXCIgbC5zdGFydF9sbnVtXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBQcmludGYuc3ByaW50ZiBcInMgJWQtJWRcIiBsLnN0YXJ0X2xudW0gbC5lbmRfbG51bVxuICAgICAgaW5cbiAgICAgIFNvbWUgKHNwcmludGYgXCIlcyAlcyBpbiBmaWxlIFxcXCIlc1xcXCIlcywgbGluZSVzLCBjaGFyYWN0ZXJzICVkLSVkXCJcbiAgICAgICAgICAgICAgKGluZm8gbC5pc19yYWlzZSkgbC5kZWZuYW1lIGwuZmlsZW5hbWVcbiAgICAgICAgICAgICAgKGlmIGwuaXNfaW5saW5lIHRoZW4gXCIgKGlubGluZWQpXCIgZWxzZSBcIlwiKVxuICAgICAgICAgICAgICBsaW5lcyBsLnN0YXJ0X2NoYXIgbC5lbmRfY2hhcilcblxubGV0IHByaW50X2V4Y2VwdGlvbl9iYWNrdHJhY2Ugb3V0Y2hhbiBiYWNrdHJhY2UgPVxuICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICB8IE5vbmUgLT5cbiAgICAgIGZwcmludGYgb3V0Y2hhblxuICAgICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBhIC0gMSBkb1xuICAgICAgICBtYXRjaCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgaSBhLihpKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIHN0ciAtPiBmcHJpbnRmIG91dGNoYW4gXCIlc1xcblwiIHN0clxuICAgICAgZG9uZVxuXG5sZXQgcHJpbnRfcmF3X2JhY2t0cmFjZSBvdXRjaGFuIHJhd19iYWNrdHJhY2UgPVxuICBwcmludF9leGNlcHRpb25fYmFja3RyYWNlIG91dGNoYW4gKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG4oKiBjb25mdXNpbmdseSBuYW1lZDogcHJpbnRzIHRoZSBnbG9iYWwgY3VycmVudCBiYWNrdHJhY2UgKilcbmxldCBwcmludF9iYWNrdHJhY2Ugb3V0Y2hhbiA9XG4gIHByaW50X3Jhd19iYWNrdHJhY2Ugb3V0Y2hhbiAoZ2V0X3Jhd19iYWNrdHJhY2UgKCkpXG5cbmxldCBiYWNrdHJhY2VfdG9fc3RyaW5nIGJhY2t0cmFjZSA9XG4gIG1hdGNoIGJhY2t0cmFjZSB3aXRoXG4gIHwgTm9uZSAtPlxuICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDEwMjQgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggYSAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZm9ybWF0X2JhY2t0cmFjZV9zbG90IGkgYS4oaSkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBzdHIgLT4gYnByaW50ZiBiIFwiJXNcXG5cIiBzdHJcbiAgICAgIGRvbmU7XG4gICAgICBCdWZmZXIuY29udGVudHMgYlxuXG5sZXQgcmF3X2JhY2t0cmFjZV90b19zdHJpbmcgcmF3X2JhY2t0cmFjZSA9XG4gIGJhY2t0cmFjZV90b19zdHJpbmcgKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2UgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19yYWlzZVxuICB8IFVua25vd25fbG9jYXRpb24gbCAtPiBsLmlzX3JhaXNlXG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9pc19pbmxpbmUgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19pbmxpbmVcbiAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcblxudHlwZSBsb2NhdGlvbiA9IHtcbiAgZmlsZW5hbWUgOiBzdHJpbmc7XG4gIGxpbmVfbnVtYmVyIDogaW50O1xuICBzdGFydF9jaGFyIDogaW50O1xuICBlbmRfY2hhciA6IGludDtcbiAgZW5kX2xpbmUgOiBpbnQ7XG4gIGVuZF9jb2wgOiBpbnQ7XG59XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvbiA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgU29tZSB7XG4gICAgICBmaWxlbmFtZSAgICA9IGwuZmlsZW5hbWU7XG4gICAgICBsaW5lX251bWJlciA9IGwuc3RhcnRfbG51bTtcbiAgICAgIHN0YXJ0X2NoYXIgID0gbC5zdGFydF9jaGFyO1xuICAgICAgZW5kX2NoYXIgICAgPSBsLmVuZF9vZmZzZXQ7XG4gICAgICBlbmRfbGluZSAgICA9IGwuZW5kX2xudW07XG4gICAgICBlbmRfY29sICAgICA9IGwuZW5kX2NoYXI7XG4gICAgfVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfXG4gIHwgS25vd25fbG9jYXRpb24geyBkZWZuYW1lID0gXCJcIiB9IC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IFNvbWUgbC5kZWZuYW1lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHMgcmF3X2JhY2t0cmFjZSA9XG4gICgqIFRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IFNvbWUgaXNcbiAgICAgcmV0dXJuZWQgb25seSBpZiBhIHBhcnQgb2YgdGhlIHRyYWNlIGlzIHVzYWJsZS4gVGhpcyBnaXZlcyB1c1xuICAgICBhIGJpdCBtb3JlIHdvcmsgdGhhbiBqdXN0IGNvbnZlcnRfcmF3X2JhY2t0cmFjZSwgYnV0IGl0IG1ha2VzIHRoZVxuICAgICBBUEkgbW9yZSB1c2VyLWZyaWVuZGx5IC0tIG90aGVyd2lzZSBtb3N0IHVzZXJzIHdvdWxkIGhhdmUgdG9cbiAgICAgcmVpbXBsZW1lbnQgdGhlIFwiUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIHNvcnJ5XCIgbG9naWNcbiAgICAgdGhlbXNlbHZlcy4gKilcbiAgbWF0Y2ggY29udmVydF9yYXdfYmFja3RyYWNlIHJhd19iYWNrdHJhY2Ugd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGJhY2t0cmFjZSAtPlxuICAgICAgbGV0IHVzYWJsZV9zbG90ID0gZnVuY3Rpb25cbiAgICAgICAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcbiAgICAgICAgfCBLbm93bl9sb2NhdGlvbiBfIC0+IHRydWUgaW5cbiAgICAgIGxldCByZWMgZXhpc3RzX3VzYWJsZSA9IGZ1bmN0aW9uXG4gICAgICAgIHwgKC0xKSAtPiBmYWxzZVxuICAgICAgICB8IGkgLT4gdXNhYmxlX3Nsb3QgYmFja3RyYWNlLihpKSB8fCBleGlzdHNfdXNhYmxlIChpIC0gMSkgaW5cbiAgICAgIGlmIGV4aXN0c191c2FibGUgKEFycmF5Lmxlbmd0aCBiYWNrdHJhY2UgLSAxKVxuICAgICAgdGhlbiBTb21lIGJhY2t0cmFjZVxuICAgICAgZWxzZSBOb25lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHNfb2ZfcmF3X2VudHJ5IGVudHJ5ID1cbiAgYmFja3RyYWNlX3Nsb3RzIFt8IGVudHJ5IHxdXG5cbm1vZHVsZSBTbG90ID0gc3RydWN0XG4gIHR5cGUgdCA9IGJhY2t0cmFjZV9zbG90XG4gIGxldCBmb3JtYXQgPSBmb3JtYXRfYmFja3RyYWNlX3Nsb3RcbiAgbGV0IGlzX3JhaXNlID0gYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2VcbiAgbGV0IGlzX2lubGluZSA9IGJhY2t0cmFjZV9zbG90X2lzX2lubGluZVxuICBsZXQgbG9jYXRpb24gPSBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvblxuICBsZXQgbmFtZSA9IGJhY2t0cmFjZV9zbG90X2RlZm5hbWVcbmVuZFxuXG5sZXQgcmF3X2JhY2t0cmFjZV9sZW5ndGggYnQgPSBBcnJheS5sZW5ndGggYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2Vfc2xvdCA6XG4gIHJhd19iYWNrdHJhY2UgLT4gaW50IC0+IHJhd19iYWNrdHJhY2Vfc2xvdCA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3RcIlxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3QgOlxuICByYXdfYmFja3RyYWNlX3Nsb3QgLT4gcmF3X2JhY2t0cmFjZV9zbG90IG9wdGlvblxuICA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdFwiXG5cbigqIGNvbmZ1c2luZ2x5IG5hbWVkOlxuICAgcmV0dXJucyB0aGUgKnN0cmluZyogY29ycmVzcG9uZGluZyB0byB0aGUgZ2xvYmFsIGN1cnJlbnQgYmFja3RyYWNlICopXG5sZXQgZ2V0X2JhY2t0cmFjZSAoKSA9IHJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIChnZXRfcmF3X2JhY2t0cmFjZSAoKSlcblxuZXh0ZXJuYWwgcmVjb3JkX2JhY2t0cmFjZTogYm9vbCAtPiB1bml0ID0gXCJjYW1sX3JlY29yZF9iYWNrdHJhY2VcIlxuZXh0ZXJuYWwgYmFja3RyYWNlX3N0YXR1czogdW5pdCAtPiBib29sID0gXCJjYW1sX2JhY2t0cmFjZV9zdGF0dXNcIlxuXG5sZXQgcmVjIHJlZ2lzdGVyX3ByaW50ZXIgZm4gPVxuICBsZXQgb2xkX3ByaW50ZXJzID0gQXRvbWljLmdldCBwcmludGVycyBpblxuICBsZXQgbmV3X3ByaW50ZXJzID0gZm4gOjogb2xkX3ByaW50ZXJzIGluXG4gIGxldCBzdWNjZXNzID0gQXRvbWljLmNvbXBhcmVfYW5kX3NldCBwcmludGVycyBvbGRfcHJpbnRlcnMgbmV3X3ByaW50ZXJzIGluXG4gIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmVnaXN0ZXJfcHJpbnRlciBmblxuXG5leHRlcm5hbCBnZXRfY2FsbHN0YWNrOiBpbnQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2tcIlxuXG5sZXQgZXhuX3Nsb3QgeCA9XG4gIGxldCB4ID0gT2JqLnJlcHIgeCBpblxuICBpZiBPYmoudGFnIHggPSAwIHRoZW4gT2JqLmZpZWxkIHggMCBlbHNlIHhcblxubGV0IGV4bl9zbG90X2lkIHggPVxuICBsZXQgc2xvdCA9IGV4bl9zbG90IHggaW5cbiAgKE9iai5vYmogKE9iai5maWVsZCBzbG90IDEpIDogaW50KVxuXG5sZXQgZXhuX3Nsb3RfbmFtZSB4ID1cbiAgbGV0IHNsb3QgPSBleG5fc2xvdCB4IGluXG4gIChPYmoub2JqIChPYmouZmllbGQgc2xvdCAwKSA6IHN0cmluZylcblxuZXh0ZXJuYWwgZ2V0X2RlYnVnX2luZm9fc3RhdHVzIDogdW5pdCAtPiBpbnQgPSBcImNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXNcIlxuXG4oKiBEZXNjcmlwdGlvbnMgZm9yIGVycm9ycyBpbiBzdGFydHVwLmguIFNlZSBhbHNvIGJhY2t0cmFjZS5jICopXG5sZXQgZXJyb3JzID0gW3wgXCJcIjtcbiAgKCogRklMRV9OT1RfRk9VTkQgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIG5vdCBmb3VuZClcIjtcbiAgKCogQkFEX0JZVEVDT0RFICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQpXCI7XG4gICgqIFdST05HX01BR0lDICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBoYXMgd3JvbmcgbWFnaWMgbnVtYmVyKVwiO1xuICAoKiBOT19GRFMgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQ7XFxuIFxcXG4gICAgICAtLSB0b28gbWFueSBvcGVuIGZpbGVzLiBUcnkgcnVubmluZyB3aXRoIE9DQU1MUlVOUEFSQU09Yj0yKVwiXG58XVxuXG5sZXQgZGVmYXVsdF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBleG4gcmF3X2JhY2t0cmFjZSA9XG4gIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlO1xuICBsZXQgc3RhdHVzID0gZ2V0X2RlYnVnX2luZm9fc3RhdHVzICgpIGluXG4gIGlmIHN0YXR1cyA8IDAgdGhlblxuICAgIHByZXJyX2VuZGxpbmUgZXJyb3JzLihhYnMgc3RhdHVzKTtcbiAgZmx1c2ggc3RkZXJyXG5cbmxldCB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA9IHJlZiBkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyXG5cbmxldCBzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZm4gPSB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA6PSBmblxuXG5sZXQgZW1wdHlfYmFja3RyYWNlIDogcmF3X2JhY2t0cmFjZSA9IFt8IHxdXG5cbmxldCB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgPVxuICB0cnlcbiAgICBnZXRfcmF3X2JhY2t0cmFjZSAoKVxuICB3aXRoIF8gKCogT3V0X29mX21lbW9yeT8gKikgLT5cbiAgICBlbXB0eV9iYWNrdHJhY2VcblxubGV0IGhhbmRsZV91bmNhdWdodF9leGNlcHRpb24nIGV4biBkZWJ1Z2dlcl9pbl91c2UgPVxuICB0cnlcbiAgICAoKiBHZXQgdGhlIGJhY2t0cmFjZSBub3csIGluIGNhc2Ugb25lIG9mIHRoZSBbYXRfZXhpdF0gZnVuY3Rpb25cbiAgICAgICBkZXN0cm95cyBpdC4gKilcbiAgICBsZXQgcmF3X2JhY2t0cmFjZSA9XG4gICAgICBpZiBkZWJ1Z2dlcl9pbl91c2UgKCogU2FtZSB0ZXN0IGFzIGluIFtydW50aW1lL3ByaW50ZXhjLmNdICopIHRoZW5cbiAgICAgICAgZW1wdHlfYmFja3RyYWNlXG4gICAgICBlbHNlXG4gICAgICAgIHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKVxuICAgIGluXG4gICAgKHRyeSBTdGRsaWIuZG9fYXRfZXhpdCAoKSB3aXRoIF8gLT4gKCkpO1xuICAgIHRyeVxuICAgICAgIXVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGV4biByYXdfYmFja3RyYWNlXG4gICAgd2l0aCBleG4nIC0+XG4gICAgICBsZXQgcmF3X2JhY2t0cmFjZScgPSB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICAgICAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZTtcbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvciBpbiB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlcjogZXhjZXB0aW9uICVzXFxuXCJcbiAgICAgICAgKHRvX3N0cmluZyBleG4nKTtcbiAgICAgIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2UnO1xuICAgICAgZmx1c2ggc3RkZXJyXG4gIHdpdGhcbiAgICB8IE91dF9vZl9tZW1vcnkgLT5cbiAgICAgICAgcHJlcnJfZW5kbGluZVxuICAgICAgICAgIFwiRmF0YWwgZXJyb3I6IG91dCBvZiBtZW1vcnkgaW4gdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXJcIlxuXG4oKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBbY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25dIGluXG4gICBbcnVudGltZS9wcmludGV4Yy5jXSB3aGljaCBleHBlY3RzIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuICopXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbiBleG4gZGVidWdnZXJfaW5fdXNlID1cbiAgdHJ5XG4gICAgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbicgZXhuIGRlYnVnZ2VyX2luX3VzZVxuICB3aXRoIF8gLT5cbiAgICAoKiBUaGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCAqKVxuICAgICgpXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgKCkgPVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlByaW50ZXhjLmhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cIlxuICAgIGhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfb2JqX3RhZyIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsNSIsImEyIiwiYTMiLCJhNCIsImNhbWxfY2FsbDciLCJhNSIsImE2IiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfUHJpbnRmIiwiU3RkbGliX0F0b21pYyIsIlN0ZGxpYiIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfT2JqIiwicHJpbnRlcnMiLCJmaWVsZCIsIngiLCJpIiwiY3N0Iiwib3RoZXJfZmllbGRzIiwidXNlX3ByaW50ZXJzIiwicGFyYW0iLCJ0bCIsImhkIiwidmFsIiwicyIsInN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0byIsInQiLCJjb25zdHJ1Y3RvciIsIm1hdGNoIiwiZmllbGRzX29wdCIsImNzdF9jaGFyYWN0ZXJzIiwibG9jZm10IiwidG9fc3RyaW5nX2RlZmF1bHQiLCJjaGFyIiwibGluZSIsImZpbGUiLCJ0b19zdHJpbmciLCJlIiwiY3N0X1VuY2F1Z2h0X2V4Y2VwdGlvbiIsImNzdF9VbmNhdWdodF9leGNlcHRpb25fcyIsInByaW50IiwiZmN0IiwiYXJnIiwiY2F0Y2gkIiwicmF3X2JhY2t0cmFjZV9lbnRyaWVzIiwiYnQiLCJjb252ZXJ0X3Jhd19iYWNrdHJhY2UiLCJmb3JtYXRfYmFja3RyYWNlX3Nsb3QiLCJwb3MiLCJzbG90IiwiaW5mbyIsImlzX3JhaXNlIiwibGluZXMiLCJjc3RfcyIsImNzdF9Qcm9ncmFtX25vdF9saW5rZWRfd2l0aF9nXyIsInByaW50X3Jhd19iYWNrdHJhY2UiLCJvdXRjaGFuIiwicmF3X2JhY2t0cmFjZSIsImJhY2t0cmFjZSIsImEiLCJzdHIiLCJwcmludF9iYWNrdHJhY2UiLCJyYXdfYmFja3RyYWNlX3RvX3N0cmluZyIsImIiLCJiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZSIsImJhY2t0cmFjZV9zbG90X2lzX2lubGluZSIsImJhY2t0cmFjZV9zbG90X2xvY2F0aW9uIiwiYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSIsImJhY2t0cmFjZV9zbG90cyIsImJhY2t0cmFjZV9zbG90c19vZl9yYXdfZW50cnkiLCJlbnRyeSIsInJhd19iYWNrdHJhY2VfbGVuZ3RoIiwiZ2V0X2JhY2t0cmFjZSIsInJlZ2lzdGVyX3ByaW50ZXIiLCJmbiIsIm9sZF9wcmludGVycyIsIm5ld19wcmludGVycyIsInN1Y2Nlc3MiLCJleG5fc2xvdCIsImV4bl9zbG90X2lkIiwiZXhuX3Nsb3RfbmFtZSIsImVycm9ycyIsImNzdF9GYXRhbF9lcnJvcl9leGNlcHRpb24iLCJjc3RfRmF0YWxfZXJyb3JfZXhjZXB0aW9uX3MiLCJkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW4iLCJleG4iLCJzdGF0dXMiLCJ1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsInNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsImVtcHR5X2JhY2t0cmFjZSIsImhhbmRsZV91bmNhdWdodF9leGNlcHRpb24iLCJkZWJ1Z2dlcl9pbl91c2UiLCJTdGRsaWJfUHJpbnRleGMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQ0FBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBSixHQUFBQyxJQUFBRSxJ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QUFBQSxZQW1Cd0M7QUFBQSxPQUF0QztBQUFBLE9BQ0E7QUFBQSxlQUVFO0FBQUEsT0FERjtBQUFBLE9BRUE7QUFBQSxlQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FBQTRCO0FBQUFBLFVBQUFBLE1EeldOO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0M0V1E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBQUFBLEtBVUo7QUFBQSxHQUFFO0FBQUEsR0FNSjtBQUFBO0FBQUE7QUFBQSxJQUFBTztBQUFBQSxNQUMyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEN1g3QiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjIyNDUzLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2Z1bi5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgaWQgOiAnYSAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmxldCBjb25zdCBjIF8gPSBjXG5sZXQgY29tcG9zZSBmIGcgeCA9IGYgKGcgeClcbmxldCBmbGlwIGYgeCB5ID0gZiB5IHhcbmxldCBuZWdhdGUgcCB2ID0gbm90IChwIHYpXG5cbmV4Y2VwdGlvbiBGaW5hbGx5X3JhaXNlZCBvZiBleG5cblxubGV0ICgpID0gUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciBAQCBmdW5jdGlvblxufCBGaW5hbGx5X3JhaXNlZCBleG4gLT4gU29tZSAoXCJGdW4uRmluYWxseV9yYWlzZWQ6IFwiIF4gUHJpbnRleGMudG9fc3RyaW5nIGV4bilcbnwgXyAtPiBOb25lXG5cbmxldCBwcm90ZWN0IH4oZmluYWxseSA6IHVuaXQgLT4gdW5pdCkgd29yayA9XG4gIGxldCBmaW5hbGx5X25vX2V4biAoKSA9XG4gICAgdHJ5IGZpbmFsbHkgKCkgd2l0aCBlIC0+XG4gICAgICBsZXQgYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgKEZpbmFsbHlfcmFpc2VkIGUpIGJ0XG4gIGluXG4gIG1hdGNoIHdvcmsgKCkgd2l0aFxuICB8IHJlc3VsdCAtPiBmaW5hbGx5X25vX2V4biAoKSA7IHJlc3VsdFxuICB8IGV4Y2VwdGlvbiB3b3JrX2V4biAtPlxuICAgICAgbGV0IHdvcmtfYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgZmluYWxseV9ub19leG4gKCkgO1xuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2Ugd29ya19leG4gd29ya19idFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfUHJpbnRleGMiLCJTdGRsaWIiLCJjb25zdCQiLCJjIiwicGFyYW0iLCJjb21wb3NlIiwiZyIsIngiLCJmbGlwIiwieSIsIm5lZ2F0ZSIsInAiLCJ2IiwiRmluYWxseV9yYWlzZWQiLCJleG4iLCJkdW1teSIsInByb3RlY3QiLCJmaW5hbGx5JCIsIndvcmsiLCJmaW5hbGx5X25vX2V4biIsImUiLCJidCIsInJlc3VsdCIsIndvcmtfZXhuIiwid29ya19idCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDZCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLE9BQUFDLEdBQUFDLE9DZ0JnQixTQUFDO0FBQUEsWUFBQUMsUUFBQVYsR0FBQVcsR0FBQUMsR0FDSyxPQUFLLGNBQUwsaUJBQUs7QUFBQSxZQUFBQyxLQUFBYixHQUFBWSxHQUFBRSxHQUNWLDBCQUFLO0FBQUEsWUFBQUMsT0FBQUMsR0FBQUMsR0FDRCwyQkFBSztBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTURuQjFCO0FBQUEsR0N1QlM7QUFBQTtBQUFBLGNBQUFUO0FBQUFBLE1BQTZCLGdDQUUvQjtBQUFBLFVBQUFVLE1BRitCLGNBQ2lCO0FBQUEsTUFBMUIsNERBQWlEO0FBQUEsS0FDbkU7QUFBQSxPQUFBQyxRQUFBO0FBQUEsWUFBQUMsUUFBQUMsVUFBQUM7QUFBQUEsYUFBQUMsZUFBQWY7QUFBQUEsS0FJUCxJQUFJO0FBQUEsV0FBQWdCO0FBQUFBO0FBQUFBLE9BQUFBLElEN0JSO0FBQUEsT0FBQUMsS0M4QmU7QUFBQSxPQUFBUCxNQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBbUQ7QUFBQSxJQUV2RCxRQUFBUSxTQUFNO0FBQUEsVUFBQUM7QUFBQUE7QUFBQUEsTUFBQUEsV0RqQ1I7QUFBQSxNQUFBQyxVQ29Db0I7QUFBQSxLQUNkO0FBQUEsS0FBaUI7QUFBQTtBQUFBO0FBQUEsSUFIVDtBQUFBLElBQWlCO0FBQUEsR0FJcUI7QUFBQSxHQWJ6QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR6QlgiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMjUyNCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbl9jaGFubmVsLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBpbl9jaGFubmVsXG5cbnR5cGUgb3Blbl9mbGFnID0gU3RkbGliLm9wZW5fZmxhZyA9XG4gIHwgT3Blbl9yZG9ubHlcbiAgfCBPcGVuX3dyb25seVxuICB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdFxuICB8IE9wZW5fdHJ1bmNcbiAgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeVxuICB8IE9wZW5fdGV4dFxuICB8IE9wZW5fbm9uYmxvY2tcblxubGV0IHN0ZGluID0gU3RkbGliLnN0ZGluXG5sZXQgb3Blbl9iaW4gPSBTdGRsaWIub3Blbl9pbl9iaW5cbmxldCBvcGVuX3RleHQgPSBTdGRsaWIub3Blbl9pblxubGV0IG9wZW5fZ2VuID0gU3RkbGliLm9wZW5faW5fZ2VuXG5cbmxldCB3aXRoX29wZW4gb3BlbmZ1biBzIGYgPVxuICBsZXQgaWMgPSBvcGVuZnVuIHMgaW5cbiAgRnVuLnByb3RlY3QgfmZpbmFsbHk6KGZ1biAoKSAtPiBTdGRsaWIuY2xvc2VfaW5fbm9lcnIgaWMpXG4gICAgKGZ1biAoKSAtPiBmIGljKVxuXG5sZXQgd2l0aF9vcGVuX2JpbiBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5faW5fYmluIHMgZlxuXG5sZXQgd2l0aF9vcGVuX3RleHQgcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX2luIHMgZlxuXG5sZXQgd2l0aF9vcGVuX2dlbiBmbGFncyBwZXJtIHMgZiA9XG4gIHdpdGhfb3BlbiAoU3RkbGliLm9wZW5faW5fZ2VuIGZsYWdzIHBlcm0pIHMgZlxuXG5sZXQgc2VlayA9IFN0ZGxpYi5MYXJnZUZpbGUuc2Vla19pblxubGV0IHBvcyA9IFN0ZGxpYi5MYXJnZUZpbGUucG9zX2luXG5sZXQgbGVuZ3RoID0gU3RkbGliLkxhcmdlRmlsZS5pbl9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlID0gU3RkbGliLmNsb3NlX2luXG5sZXQgY2xvc2Vfbm9lcnIgPSBTdGRsaWIuY2xvc2VfaW5fbm9lcnJcblxubGV0IGlucHV0X2NoYXIgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfY2hhciBpYyB3aXRoXG4gIHwgYyAtPiBTb21lIGNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXRfYnl0ZSBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9ieXRlIGljIHdpdGhcbiAgfCBuIC0+IFNvbWUgblxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dF9saW5lIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IHMgLT4gU29tZSBzXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0ID0gU3RkbGliLmlucHV0XG5cbmV4dGVybmFsIHVuc2FmZV9pbnB1dF9iaWdhcnJheSA6XG4gIHQgLT4gXyBCaWdhcnJheS5BcnJheTEudCAtPiBpbnQgLT4gaW50IC0+IGludFxuICA9IFwiY2FtbF9tbF9pbnB1dF9iaWdhcnJheVwiXG5cbmxldCBpbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCaWdhcnJheS5BcnJheTEuZGltIGJ1ZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRfYmlnYXJyYXlcIlxuICBlbHNlIHVuc2FmZV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlblxuXG5sZXQgcmVhbGx5X2lucHV0IGljIGJ1ZiBwb3MgbGVuID1cbiAgbWF0Y2ggU3RkbGliLnJlYWxseV9pbnB1dCBpYyBidWYgcG9zIGxlbiB3aXRoXG4gIHwgKCkgLT4gU29tZSAoKVxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCByZWMgdW5zYWZlX3JlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gU29tZSAoKSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSB1bnNhZmVfaW5wdXRfYmlnYXJyYXkgaWMgYnVmIG9mcyBsZW4gaW5cbiAgICBpZiByID0gMFxuICAgIHRoZW4gTm9uZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgKG9mcyArIHIpIChsZW4gLSByKVxuICBlbmRcblxubGV0IHJlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCaWdhcnJheS5BcnJheTEuZGltIGJ1ZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwicmVhbGx5X2lucHV0X2JpZ2FycmF5XCJcbiAgZWxzZSB1bnNhZmVfcmVhbGx5X2lucHV0X2JpZ2FycmF5IGljIGJ1ZiBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIG1hdGNoIFN0ZGxpYi5yZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiB3aXRoXG4gIHwgcyAtPiBTb21lIHNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG4oKiBSZWFkIHVwIHRvIFtsZW5dIGJ5dGVzIGludG8gW2J1Zl0sIHN0YXJ0aW5nIGF0IFtvZnNdLiBSZXR1cm4gdG90YWwgYnl0ZXNcbiAgIHJlYWQuICopXG5sZXQgcmVhZF91cHRvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIG9mcyBsZW4gPVxuICAgIGlmIGxlbiA9IDAgdGhlbiBvZnNcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IFN0ZGxpYi5pbnB1dCBpYyBidWYgb2ZzIGxlbiBpblxuICAgICAgaWYgciA9IDAgdGhlblxuICAgICAgICBvZnNcbiAgICAgIGVsc2VcbiAgICAgICAgbG9vcCAob2ZzICsgcikgKGxlbiAtIHIpXG4gICAgZW5kXG4gIGluXG4gIGxvb3Agb2ZzIGxlbiAtIG9mc1xuXG4oKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIHJldHVybiBhIGJ1ZmZlciB3aXRoID49IChvZnMgKyBuKSBieXRlcyBvZiBzdG9yYWdlLFxuICAgYW5kIHN1Y2ggdGhhdCBpdCBjb2luY2lkZXMgd2l0aCBbYnVmXSBhdCBpbmRpY2VzIDwgW29mc10uXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZXF1YWwgdG8gW2J1Zl0gaXRzZWxmIGlmIGl0IGFscmVhZHkgaGFzIHN1ZmZpY2llbnRcbiAgIGZyZWUgc3BhY2UuXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgKmZld2VyKiB0aGFuIFtvZnMgKyBuXSBieXRlcyBvZiBzdG9yYWdlIGlmIHRoaXNcbiAgIG51bWJlciBpcyA+IFtTeXMubWF4X3N0cmluZ19sZW5ndGhdLiBIb3dldmVyIHRoZSByZXR1cm5lZCBidWZmZXIgd2lsbFxuICAgKmFsd2F5cyogaGF2ZSA+IFtvZnNdIGJ5dGVzIG9mIHN0b3JhZ2UuIEluIHRoZSBsaW1pdGluZyBjYXNlIHdoZW4gW29mcyA9IGxlblxuICAgPSBTeXMubWF4X3N0cmluZ19sZW5ndGhdIChzbyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXNpemUgdGhlIGJ1ZmZlciBhdFxuICAgYWxsKSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcblxubGV0IGVuc3VyZSBidWYgb2ZzIG4gPVxuICBsZXQgbGVuID0gQnl0ZXMubGVuZ3RoIGJ1ZiBpblxuICBpZiBsZW4gPj0gb2ZzICsgbiB0aGVuIGJ1ZlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG5ld19sZW4gPSByZWYgbGVuIGluXG4gICAgd2hpbGUgIW5ld19sZW4gPCBvZnMgKyBuIGRvXG4gICAgICBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiArIDFcbiAgICBkb25lO1xuICAgIGxldCBuZXdfbGVuID0gIW5ld19sZW4gaW5cbiAgICBsZXQgbmV3X2xlbiA9XG4gICAgICBpZiBuZXdfbGVuIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIG5ld19sZW5cbiAgICAgIGVsc2UgaWYgb2ZzIDwgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgICBlbHNlXG4gICAgICAgIGZhaWx3aXRoIFwiSW5fY2hhbm5lbC5pbnB1dF9hbGw6IGNoYW5uZWwgY29udGVudCBcXFxuICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoXCJcbiAgICBpblxuICAgIGxldCBuZXdfYnVmID0gQnl0ZXMuY3JlYXRlIG5ld19sZW4gaW5cbiAgICBCeXRlcy5ibGl0IGJ1ZiAwIG5ld19idWYgMCBvZnM7XG4gICAgbmV3X2J1ZlxuICBlbmRcblxubGV0IGlucHV0X2FsbCBpYyA9XG4gIGxldCBjaHVua19zaXplID0gNjU1MzYgaW4gKCogSU9fQlVGRkVSX1NJWkUgKilcbiAgbGV0IGluaXRpYWxfc2l6ZSA9XG4gICAgdHJ5XG4gICAgICBTdGRsaWIuaW5fY2hhbm5lbF9sZW5ndGggaWMgLSBTdGRsaWIucG9zX2luIGljXG4gICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgLTFcbiAgaW5cbiAgbGV0IGluaXRpYWxfc2l6ZSA9IGlmIGluaXRpYWxfc2l6ZSA8IDAgdGhlbiBjaHVua19zaXplIGVsc2UgaW5pdGlhbF9zaXplIGluXG4gIGxldCBpbml0aWFsX3NpemUgPVxuICAgIGlmIGluaXRpYWxfc2l6ZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgaW5pdGlhbF9zaXplXG4gICAgZWxzZVxuICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gIGluXG4gIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgaW5pdGlhbF9zaXplIGluXG4gIGxldCBucmVhZCA9IHJlYWRfdXB0byBpYyBidWYgMCBpbml0aWFsX3NpemUgaW5cbiAgaWYgbnJlYWQgPCBpbml0aWFsX3NpemUgdGhlbiAoKiBFT0YgcmVhY2hlZCwgYnVmZmVyIHBhcnRpYWxseSBmaWxsZWQgKilcbiAgICBCeXRlcy5zdWJfc3RyaW5nIGJ1ZiAwIG5yZWFkXG4gIGVsc2UgYmVnaW4gKCogbnJlYWQgPSBpbml0aWFsX3NpemUsIG1heWJlIEVPRiByZWFjaGVkICopXG4gICAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICAgIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+XG4gICAgICAgICgqIEVPRiByZWFjaGVkLCBidWZmZXIgaXMgY29tcGxldGVseSBmaWxsZWQgKilcbiAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgICB8IGMgLT5cbiAgICAgICAgKCogRU9GIG5vdCByZWFjaGVkICopXG4gICAgICAgIGxldCByZWMgbG9vcCBidWYgb2ZzID1cbiAgICAgICAgICBsZXQgYnVmID0gZW5zdXJlIGJ1ZiBvZnMgY2h1bmtfc2l6ZSBpblxuICAgICAgICAgIGxldCByZW0gPSBCeXRlcy5sZW5ndGggYnVmIC0gb2ZzIGluXG4gICAgICAgICAgKCogW3JlbV0gY2FuIGJlIDwgW2NodW5rX3NpemVdIGlmIGJ1ZmZlciBzaXplIGNsb3NlIHRvXG4gICAgICAgICAgICAgW1N5cy5tYXhfc3RyaW5nX2xlbmd0aF0gKilcbiAgICAgICAgICBsZXQgciA9IHJlYWRfdXB0byBpYyBidWYgb2ZzIHJlbSBpblxuICAgICAgICAgIGlmIHIgPCByZW0gdGhlbiAoKiBFT0YgcmVhY2hlZCAqKVxuICAgICAgICAgICAgQnl0ZXMuc3ViX3N0cmluZyBidWYgMCAob2ZzICsgcilcbiAgICAgICAgICBlbHNlICgqIHIgPSByZW0gKilcbiAgICAgICAgICAgIGxvb3AgYnVmIChvZnMgKyByZW0pXG4gICAgICAgIGluXG4gICAgICAgIGxldCBidWYgPSBlbnN1cmUgYnVmIG5yZWFkIChjaHVua19zaXplICsgMSkgaW5cbiAgICAgICAgQnl0ZXMuc2V0IGJ1ZiBucmVhZCBjO1xuICAgICAgICBsb29wIGJ1ZiAobnJlYWQgKyAxKVxuICBlbmRcblxubGV0IFtAdGFpbF9tb2RfY29uc10gcmVjIGlucHV0X2xpbmVzIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IGxpbmUgLT4gbGluZSA6OiBpbnB1dF9saW5lcyBpY1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBbXVxuXG5sZXQgcmVjIGZvbGRfbGluZXMgZiBhY2N1IGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IGxpbmUgLT4gZm9sZF9saW5lcyBmIChmIGFjY3UgbGluZSkgaWNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gYWNjdVxuXG5sZXQgc2V0X2JpbmFyeV9tb2RlID0gU3RkbGliLnNldF9iaW5hcnlfbW9kZV9pblxuXG5leHRlcm5hbCBpc19iaW5hcnlfbW9kZSA6IGluX2NoYW5uZWwgLT4gYm9vbCA9IFwiY2FtbF9tbF9pc19iaW5hcnlfbW9kZVwiXG5cbmV4dGVybmFsIGlzYXR0eSA6IHQgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNhdHR5XCJcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9iYV9kaW1fMSIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX21sX2lucHV0X2JpZ2FycmF5IiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9CeXRlcyIsIlN0ZGxpYl9TeXMiLCJTdGRsaWJfRnVuIiwic3RkaW4iLCJvcGVuX2JpbiIsIm9wZW5fdGV4dCIsIm9wZW5fZ2VuIiwid2l0aF9vcGVuIiwib3BlbmZ1biIsInMiLCJpYyIsInBhcmFtIiwid2l0aF9vcGVuX2JpbiIsIndpdGhfb3Blbl90ZXh0Iiwid2l0aF9vcGVuX2dlbiIsImZsYWdzIiwicGVybSIsInNlZWsiLCJwb3MiLCJsZW5ndGgiLCJjbG9zZSIsImNsb3NlX25vZXJyIiwiaW5wdXRfY2hhciIsImMiLCJleG4iLCJpbnB1dF9ieXRlIiwibiIsImlucHV0X2xpbmUiLCJpbnB1dCIsImlucHV0X2JpZ2FycmF5IiwiYnVmIiwib2ZzIiwibGVuIiwicmVhbGx5X2lucHV0IiwicmVhbGx5X2lucHV0X2JpZ2FycmF5IiwiciIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJyZWFkX3VwdG8iLCJlbnN1cmUiLCJuZXdfbGVuIiwibmV3X2J1ZiIsImlucHV0X2FsbCIsImluaXRpYWxfc2l6ZSIsImNodW5rX3NpemUiLCJucmVhZCIsInJlbSIsImlucHV0X2xpbmVzIiwibGluZSIsImJsb2NrIiwiZHN0Iiwib2Zmc2V0IiwiZm9sZF9saW5lcyIsImFjY3UiLCJzZXRfYmluYXJ5X21vZGUiLCJTdGRsaWJfSW5fY2hhbm5lbCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLG9CQUFBO0FB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QUEsUUFBQXdCLFFDb01ZLGtCQUFBQyxNQUFRLE9BQUFDLFNBQUE7QUFBQTtBQUFBLEtBRGxCLFFBQUFILFNBQU07QUFBQSxXQUFBdkI7QUFBQUEsVUFBQUEsUURuTVI7QUFBQTtBQUFBLE1DcU02QjtBQUFBLE1BREs7QUFBQTtBQUFBLFNBQUF5QixRQUF0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FDbUI7QUFBQSxZQUFBRSxXQUFBekQsR0FBQTBELFFBQUExQztBQUFBQSxRQUFBMEMsT0FHN0I7QUFBQTtBQUFBLGFBQUFMLE9BQU07QUFBQSxXQUFBdkI7QUFBQUEsVUFBQUEsTUR4TVI7QUFBQSw2QkMwTTZCO0FBQUEsTUQxTTdCO0FBQUE7QUFBQSxTQUFBNEIsU0N5TXlCO0FBQUEsS0FBYTtBQUFBO0FBQUEsR0FDTDtBQUFBO0FBQUEsSUFBQUMsa0JEMU1qQztBQUFBLElBQUFDO0FBQUFBLE1BQUEiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMjc5MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9kaWdlc3QubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFV0aWxpdHkgZnVuY3Rpb25zICopXG5cbmxldCBoZXhfb2Zfc3RyaW5nIGQgPVxuICBsZXQgY2hhcl9oZXggbiA9XG4gICAgQ2hhci5jaHIgKGlmIG4gPCAxMCB0aGVuIENoYXIuY29kZSAnMCcgKyBuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIENoYXIuY29kZSAnYScgKyBuIC0gMTApIGluXG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIGQgaW5cbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAobGVuICogMikgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICBsZXQgeCA9IENoYXIuY29kZSBkLltpXSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIpIChjaGFyX2hleCAoeCBsc3IgNCkpO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIrMSkgKGNoYXJfaGV4ICh4IGxhbmQgMHgwZikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc3VsdFxuXG5sZXQgc3RyaW5nX29mX2hleCBzID1cbiAgbGV0IGRpZ2l0IGMgPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJzAnLi4nOScgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJzAnXG4gICAgfCAnQScuLidGJyAtPiBDaGFyLmNvZGUgYyAtIENoYXIuY29kZSAnQScgKyAxMFxuICAgIHwgJ2EnLi4nZicgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJ2EnICsgMTBcbiAgICB8IF8gLT4gaW52YWxpZF9hcmcgXCJEaWdlc3Qub2ZfaGV4XCIgaW5cbiAgbGV0IGJ5dGUgaSA9IGRpZ2l0IHMuW2ldIGxzbCA0ICsgZGlnaXQgcy5baSsxXSBpblxuICBTdHJpbmcuaW5pdCAoU3RyaW5nLmxlbmd0aCBzIC8gMikgKGZ1biBpIC0+IENoYXIuY2hyIChieXRlICgyICogaSkpKVxuXG4oKiBHZW5lcmljIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgdCA9IHN0cmluZ1xuICB2YWwgaGFzaF9sZW5ndGggOiBpbnRcbiAgdmFsIGNvbXBhcmUgOiB0IC0+IHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sXG4gIHZhbCBzdHJpbmcgOiBzdHJpbmcgLT4gdFxuICB2YWwgYnl0ZXMgOiBieXRlcyAtPiB0XG4gIHZhbCBzdWJzdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0XG4gIHZhbCBzdWJieXRlcyA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdFxuICB2YWwgY2hhbm5lbCA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHRcbiAgdmFsIGZpbGUgOiBzdHJpbmcgLT4gdFxuICB2YWwgb3V0cHV0IDogb3V0X2NoYW5uZWwgLT4gdCAtPiB1bml0XG4gIHZhbCBpbnB1dCA6IGluX2NoYW5uZWwgLT4gdFxuICB2YWwgdG9faGV4IDogdCAtPiBzdHJpbmdcbiAgdmFsIG9mX2hleCA6IHN0cmluZyAtPiB0XG5lbmRcblxuKCogQkxBS0UyIGhhc2hpbmcsIHBhcmFtZXRlcml6ZWQgYnkgaGFzaCBzaXplICopXG5cbm1vZHVsZSBCTEFLRTIgKFg6IHNpZyB2YWwgaGFzaF9sZW5ndGggOiBpbnQgZW5kKSA6IFMgPSBzdHJ1Y3RcblxuICB0eXBlIHQgPSBzdHJpbmdcblxuICBsZXQgaGFzaF9sZW5ndGggPVxuICAgIGlmIFguaGFzaF9sZW5ndGggPCAxIHx8IFguaGFzaF9sZW5ndGggPiA2NFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3QuQkxBS0UyOiB3cm9uZyBoYXNoIHNpemVcIjtcbiAgICBYLmhhc2hfbGVuZ3RoXG5cbiAgbGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxuICBsZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuICB0eXBlIHN0YXRlXG5cbiAgZXh0ZXJuYWwgY3JlYXRlX2dlbjogaW50IC0+IHN0cmluZyAtPiBzdGF0ZSA9IFwiY2FtbF9ibGFrZTJfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgdXBkYXRlOiBzdGF0ZSAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2JsYWtlMl91cGRhdGVcIlxuICBleHRlcm5hbCBmaW5hbDogc3RhdGUgLT4gaW50IC0+IHQgPSBcImNhbWxfYmxha2UyX2ZpbmFsXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3N0cmluZzogaW50IC0+IHN0cmluZyAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0XG4gICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGFrZTJfc3RyaW5nXCJcblxuICBsZXQgY3JlYXRlICgpID0gY3JlYXRlX2dlbiBoYXNoX2xlbmd0aCBcIlwiXG5cbiAgbGV0IHN0cmluZyBzdHIgPVxuICAgIHVuc2FmZV9zdHJpbmcgaGFzaF9sZW5ndGggXCJcIiBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbiAgbGV0IGJ5dGVzIGIgPVxuICAgIHN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKVxuXG4gIGxldCBzdWJzdHJpbmcgc3RyIG9mcyBsZW4gPVxuICAgIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBTdHJpbmcubGVuZ3RoIHN0ciAtIGxlblxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3Quc3Vic3RyaW5nXCI7XG4gICAgdW5zYWZlX3N0cmluZyBoYXNoX2xlbmd0aCBcIlwiIHN0ciBvZnMgbGVuXG5cbiAgbGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9XG4gICAgc3Vic3RyaW5nIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGIpIG9mcyBsZW5cblxuICBsZXQgY2hhbm5lbCBpYyB0b3JlYWQgPVxuICAgIGxldCBidWZfc2l6ZSA9IDQwOTYgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIGJ1Zl9zaXplIGluXG4gICAgbGV0IGN0eCA9IGNyZWF0ZSAoKSBpblxuICAgIGlmIHRvcmVhZCA8IDAgdGhlbiBiZWdpblxuICAgICAgbGV0IHJlYyBkb19yZWFkICgpID1cbiAgICAgICAgbGV0IG4gPSBJbl9jaGFubmVsLmlucHV0IGljIGJ1ZiAwIGJ1Zl9zaXplIGluXG4gICAgICAgIGlmIG4gPSAwXG4gICAgICAgIHRoZW4gZmluYWwgY3R4IGhhc2hfbGVuZ3RoXG4gICAgICAgIGVsc2UgKHVwZGF0ZSBjdHggKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmKSAwIG47IGRvX3JlYWQgKCkpXG4gICAgICBpbiBkb19yZWFkICgpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgZG9fcmVhZCB0b3JlYWQgPVxuICAgICAgICBpZiB0b3JlYWQgPSAwIHRoZW4gZmluYWwgY3R4IGhhc2hfbGVuZ3RoIGVsc2UgYmVnaW5cbiAgICAgICAgICBsZXQgbiA9IEluX2NoYW5uZWwuaW5wdXQgaWMgYnVmIDAgKEludC5taW4gYnVmX3NpemUgdG9yZWFkKSBpblxuICAgICAgICAgIGlmIG4gPSAwXG4gICAgICAgICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgIHVwZGF0ZSBjdHggKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmKSAwIG47XG4gICAgICAgICAgICBkb19yZWFkICh0b3JlYWQgLSBuKVxuICAgICAgICAgIGVuZFxuICAgICAgICBlbmRcbiAgICAgIGluIGRvX3JlYWQgdG9yZWFkXG4gICAgZW5kXG5cbiAgbGV0IGZpbGUgZmlsZW5hbWUgPVxuICAgIEluX2NoYW5uZWwud2l0aF9vcGVuX2JpbiBmaWxlbmFtZSAoZnVuIGljIC0+IGNoYW5uZWwgaWMgKC0xKSlcblxuICBsZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID0gb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG4gIGxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIGhhc2hfbGVuZ3RoXG5cbiAgbGV0IHRvX2hleCBkID1cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gaGFzaF9sZW5ndGggdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgICBoZXhfb2Zfc3RyaW5nIGRcblxuICBsZXQgb2ZfaGV4IHMgPVxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA8PiBoYXNoX2xlbmd0aCAqIDIgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC5vZl9oZXhcIjtcbiAgICBzdHJpbmdfb2ZfaGV4IHNcblxuZW5kXG5cbm1vZHVsZSBCTEFLRTEyOCA9IEJMQUtFMihzdHJ1Y3QgbGV0IGhhc2hfbGVuZ3RoID0gMTYgZW5kKVxubW9kdWxlIEJMQUtFMjU2ID0gQkxBS0UyKHN0cnVjdCBsZXQgaGFzaF9sZW5ndGggPSAzMiBlbmQpXG5tb2R1bGUgQkxBS0U1MTIgPSBCTEFLRTIoc3RydWN0IGxldCBoYXNoX2xlbmd0aCA9IDY0IGVuZClcblxuKCogTUQ1IGhhc2hpbmcgKilcblxubW9kdWxlIE1ENSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IHN0cmluZ1xuXG4gIGxldCBoYXNoX2xlbmd0aCA9IDE2XG5cbiAgbGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxuICBsZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuICBleHRlcm5hbCB1bnNhZmVfc3RyaW5nOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9zdHJpbmdcIlxuICBleHRlcm5hbCBjaGFubmVsOiBpbl9jaGFubmVsIC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9jaGFuXCJcblxuICBsZXQgc3RyaW5nIHN0ciA9XG4gICAgdW5zYWZlX3N0cmluZyBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbiAgbGV0IGJ5dGVzIGIgPSBzdHJpbmcgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYilcblxuICBsZXQgc3Vic3RyaW5nIHN0ciBvZnMgbGVuID1cbiAgICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gU3RyaW5nLmxlbmd0aCBzdHIgLSBsZW5cbiAgICB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LnN1YnN0cmluZ1wiXG4gICAgZWxzZSB1bnNhZmVfc3RyaW5nIHN0ciBvZnMgbGVuXG5cbiAgbGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9IHN1YnN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKSBvZnMgbGVuXG5cbiAgbGV0IGZpbGUgZmlsZW5hbWUgPVxuICAgIEluX2NoYW5uZWwud2l0aF9vcGVuX2JpbiBmaWxlbmFtZSAoZnVuIGljIC0+IGNoYW5uZWwgaWMgKC0xKSlcblxuICBsZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID0gb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG4gIGxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIDE2XG5cbiAgbGV0IHRvX2hleCBkID1cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gMTYgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgICBoZXhfb2Zfc3RyaW5nIGRcblxuICBsZXQgb2ZfaGV4IHMgPVxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA8PiAzMiB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LmZyb21faGV4XCI7XG4gICAgc3RyaW5nX29mX2hleCBzXG5cbmVuZFxuXG4oKiBEZWZhdWx0IGV4cG9ydGVkIGltcGxlbWVudGF0aW9uIGlzIE1ENSAqKVxuXG5pbmNsdWRlIE1ENVxuXG5sZXQgZnJvbV9oZXggPSBvZl9oZXhcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ibGFrZTJfZmluYWwiLCJjYW1sX2JsYWtlMl9zdHJpbmciLCJjYW1sX2JsYWtlMl91cGRhdGUiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWQ1X2NoYW4iLCJjYW1sX21kNV9zdHJpbmciLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19nZXQiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9Jbl9jaGFubmVsIiwiU3RkbGliX0J5dGVzIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfQ2hhciIsImhleF9vZl9zdHJpbmciLCJkIiwiY2hhcl9oZXgiLCJuIiwibGVuIiwicmVzdWx0IiwiaSIsIngiLCJjc3RfRGlnZXN0X29mX2hleCIsInN0cmluZ19vZl9oZXgiLCJzIiwiZGlnaXQiLCJjIiwiY3N0X0RpZ2VzdF9zdWJzdHJpbmciLCJjc3RfRGlnZXN0X3RvX2hleCIsIkJMQUtFMiIsIlgiLCJoYXNoX2xlbmd0aCIsImNvbXBhcmUiLCJlcXVhbCIsImNzdCIsInN0cmluZyIsInN0ciIsImJ5dGVzIiwiYiIsInN1YnN0cmluZyIsIm9mcyIsInN1YmJ5dGVzIiwiY2hhbm5lbCIsImljIiwidG9yZWFkIiwiYnVmIiwiY3R4IiwiYnVmX3NpemUiLCJmaWxlIiwiZmlsZW5hbWUiLCJvdXRwdXQiLCJjaGFuIiwiZGlnZXN0IiwiaW5wdXQiLCJ0b19oZXgiLCJvZl9oZXgiLCJCTEFLRTEyOCIsIkJMQUtFMjU2IiwiQkxBS0U1MTIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxZQUFBQyxjQUFBQztBQUFBQSxhQUFBQyxTQUFBQztBQUFBQSxTQUFBLElDbUJJO0FBQUEsd0NBQ2dEO0FBQUE7QUFBQTtBQUFBLEtBQUFDLE1BQ2xEO0FBQUEsS0FBQUMsU0FDYTtBQUFBLFNBQ2I7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLFVBQUFDLElBQ29CO0FBQUEsTUFDZ0MseUNBQXBCO0FBQUEsTUFDMEIsbURBQXhCO0FBQUEsY0FBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElB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O0FBQUFBLElBRzFDO0FBQUEsS0FBOEI7QUFBQSxJQUM5Qix1QkFBZTtBQUFBO0FBQUEsWUFBQXdDLE9BQUEvQjtBQUFBQSxJQUdmO0FBQUEsS0FBOEI7QUFBQSxJQUM5Qix1QkFBZTtBQUFBO0FBQUEsR0R0TG5CIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjMwMTYsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvYmlnYXJyYXkubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgTWFudWVsIFNlcnJhbm8gZXQgWGF2aWVyIExlcm95LCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAwIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbQmlnYXJyYXldOiBsYXJnZSwgbXVsdGktZGltZW5zaW9uYWwsIG51bWVyaWNhbCBhcnJheXMgKilcblxuKCogVGhlc2UgdHlwZXMgaW4gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGFibGVzIGluXG4gICAuLi90eXBpbmcvdHlwZW9wdC5tbCAqKVxuXG50eXBlIGZsb2F0MTZfZWx0ID0gRmxvYXQxNl9lbHRcbnR5cGUgZmxvYXQzMl9lbHQgPSBGbG9hdDMyX2VsdFxudHlwZSBmbG9hdDY0X2VsdCA9IEZsb2F0NjRfZWx0XG50eXBlIGludDhfc2lnbmVkX2VsdCA9IEludDhfc2lnbmVkX2VsdFxudHlwZSBpbnQ4X3Vuc2lnbmVkX2VsdCA9IEludDhfdW5zaWduZWRfZWx0XG50eXBlIGludDE2X3NpZ25lZF9lbHQgPSBJbnQxNl9zaWduZWRfZWx0XG50eXBlIGludDE2X3Vuc2lnbmVkX2VsdCA9IEludDE2X3Vuc2lnbmVkX2VsdFxudHlwZSBpbnQzMl9lbHQgPSBJbnQzMl9lbHRcbnR5cGUgaW50NjRfZWx0ID0gSW50NjRfZWx0XG50eXBlIGludF9lbHQgPSBJbnRfZWx0XG50eXBlIG5hdGl2ZWludF9lbHQgPSBOYXRpdmVpbnRfZWx0XG50eXBlIGNvbXBsZXgzMl9lbHQgPSBDb21wbGV4MzJfZWx0XG50eXBlIGNvbXBsZXg2NF9lbHQgPSBDb21wbGV4NjRfZWx0XG5cbigqIEtlZXAgdGhlIG9yZGVyIG9mIHRoZXNlIGNvbnN0cnVjdG9ycyBpbiBzeW5jIHdpdGggdGhlIGNhbWxfYmFfa2luZFxuICAgZW51bWVyYXRpb24gaW4gYmlnYXJyYXkuaCAqKVxuXG50eXBlICgnYSwgJ2IpIGtpbmQgPVxuICB8IEZsb2F0MzIgOiAoZmxvYXQsIGZsb2F0MzJfZWx0KSBraW5kXG4gIHwgRmxvYXQ2NCA6IChmbG9hdCwgZmxvYXQ2NF9lbHQpIGtpbmRcbiAgfCBJbnQ4X3NpZ25lZCA6IChpbnQsIGludDhfc2lnbmVkX2VsdCkga2luZFxuICB8IEludDhfdW5zaWduZWQgOiAoaW50LCBpbnQ4X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDE2X3NpZ25lZCA6IChpbnQsIGludDE2X3NpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQxNl91bnNpZ25lZCA6IChpbnQsIGludDE2X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDMyIDogKGludDMyLCBpbnQzMl9lbHQpIGtpbmRcbiAgfCBJbnQ2NCA6IChpbnQ2NCwgaW50NjRfZWx0KSBraW5kXG4gIHwgSW50IDogKGludCwgaW50X2VsdCkga2luZFxuICB8IE5hdGl2ZWludCA6IChuYXRpdmVpbnQsIG5hdGl2ZWludF9lbHQpIGtpbmRcbiAgfCBDb21wbGV4MzIgOiAoQ29tcGxleC50LCBjb21wbGV4MzJfZWx0KSBraW5kXG4gIHwgQ29tcGxleDY0IDogKENvbXBsZXgudCwgY29tcGxleDY0X2VsdCkga2luZFxuICB8IENoYXIgOiAoY2hhciwgaW50OF91bnNpZ25lZF9lbHQpIGtpbmRcbiAgfCBGbG9hdDE2IDogKGZsb2F0LCBmbG9hdDE2X2VsdCkga2luZFxuXG50eXBlIGNfbGF5b3V0ID0gQ19sYXlvdXRfdHlwXG50eXBlIGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRfdHlwICgqKilcblxudHlwZSAnYSBsYXlvdXQgPVxuICAgIENfbGF5b3V0OiBjX2xheW91dCBsYXlvdXRcbiAgfCBGb3J0cmFuX2xheW91dDogZm9ydHJhbl9sYXlvdXQgbGF5b3V0XG5cbmxldCBmbG9hdDE2ID0gRmxvYXQxNlxubGV0IGZsb2F0MzIgPSBGbG9hdDMyXG5sZXQgZmxvYXQ2NCA9IEZsb2F0NjRcbmxldCBpbnQ4X3NpZ25lZCA9IEludDhfc2lnbmVkXG5sZXQgaW50OF91bnNpZ25lZCA9IEludDhfdW5zaWduZWRcbmxldCBpbnQxNl9zaWduZWQgPSBJbnQxNl9zaWduZWRcbmxldCBpbnQxNl91bnNpZ25lZCA9IEludDE2X3Vuc2lnbmVkXG5sZXQgaW50MzIgPSBJbnQzMlxubGV0IGludDY0ID0gSW50NjRcbmxldCBpbnQgPSBJbnRcbmxldCBuYXRpdmVpbnQgPSBOYXRpdmVpbnRcbmxldCBjb21wbGV4MzIgPSBDb21wbGV4MzJcbmxldCBjb21wbGV4NjQgPSBDb21wbGV4NjRcbmxldCBjaGFyID0gQ2hhclxuXG5sZXQga2luZF9zaXplX2luX2J5dGVzIDogdHlwZSBhIGIuIChhLCBiKSBraW5kIC0+IGludCA9IGZ1bmN0aW9uXG4gIHwgRmxvYXQxNiAtPiAyXG4gIHwgRmxvYXQzMiAtPiA0XG4gIHwgRmxvYXQ2NCAtPiA4XG4gIHwgSW50OF9zaWduZWQgLT4gMVxuICB8IEludDhfdW5zaWduZWQgLT4gMVxuICB8IEludDE2X3NpZ25lZCAtPiAyXG4gIHwgSW50MTZfdW5zaWduZWQgLT4gMlxuICB8IEludDMyIC0+IDRcbiAgfCBJbnQ2NCAtPiA4XG4gIHwgSW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgTmF0aXZlaW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgQ29tcGxleDMyIC0+IDhcbiAgfCBDb21wbGV4NjQgLT4gMTZcbiAgfCBDaGFyIC0+IDFcblxuKCogS2VlcCB0aG9zZSBjb25zdGFudHMgaW4gc3luYyB3aXRoIHRoZSBjYW1sX2JhX2xheW91dCBlbnVtZXJhdGlvblxuICAgaW4gYmlnYXJyYXkuaCAqKVxuXG5sZXQgY19sYXlvdXQgPSBDX2xheW91dFxubGV0IGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRcblxubW9kdWxlIEdlbmFycmF5ID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHRcbiAgZXh0ZXJuYWwgY3JlYXRlOiAoJ2EsICdiKSBraW5kIC0+ICdjIGxheW91dCAtPiBpbnQgYXJyYXkgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgPSBcImNhbWxfYmFfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgYXJyYXkgLT4gJ2FcbiAgICAgPSBcImNhbWxfYmFfZ2V0X2dlbmVyaWNcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCBhcnJheSAtPiAnYSAtPiB1bml0XG4gICAgID0gXCJjYW1sX2JhX3NldF9nZW5lcmljXCJcblxuICBsZXQgcmVjIGNsb29wIGFyciBpZHggZiBjb2wgbWF4ID1cbiAgICBpZiBjb2wgPSBBcnJheS5sZW5ndGggaWR4IHRoZW4gc2V0IGFyciBpZHggKGYgaWR4KVxuICAgIGVsc2UgZm9yIGogPSAwIHRvIHByZWQgbWF4Lihjb2wpIGRvXG4gICAgICAgICAgIGlkeC4oY29sKSA8LSBqO1xuICAgICAgICAgICBjbG9vcCBhcnIgaWR4IGYgKHN1Y2MgY29sKSBtYXhcbiAgICAgICAgIGRvbmVcbiAgbGV0IHJlYyBmbG9vcCBhcnIgaWR4IGYgY29sIG1heCA9XG4gICAgaWYgY29sIDwgMCB0aGVuIHNldCBhcnIgaWR4IChmIGlkeClcbiAgICBlbHNlIGZvciBqID0gMSB0byBtYXguKGNvbCkgZG9cbiAgICAgICAgICAgaWR4Lihjb2wpIDwtIGo7XG4gICAgICAgICAgIGZsb29wIGFyciBpZHggZiAocHJlZCBjb2wpIG1heFxuICAgICAgICAgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltcyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbXMgaW5cbiAgICBsZXQgZGxlbiA9IEFycmF5Lmxlbmd0aCBkaW1zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDApIGYgMCBkaW1zOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDEpIGYgKHByZWQgZGxlbikgZGltczsgYXJyXG5cbiAgZXh0ZXJuYWwgbnVtX2RpbXM6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiY2FtbF9iYV9udW1fZGltc1wiXG4gIGV4dGVybmFsIG50aF9kaW06ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfYmFfZGltXCJcbiAgbGV0IGRpbXMgYSA9XG4gICAgbGV0IG4gPSBudW1fZGltcyBhIGluXG4gICAgbGV0IGQgPSBBcnJheS5tYWtlIG4gMCBpblxuICAgIGZvciBpID0gMCB0byBuLTEgZG8gZC4oaSkgPC0gbnRoX2RpbSBhIGkgZG9uZTtcbiAgICBkXG5cbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChBcnJheS5mb2xkX2xlZnQgKCAqICkgMSAoZGltcyBhcnIpKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzbGljZV9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgYXJyYXkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc2xpY2VcIlxuICBleHRlcm5hbCBzbGljZV9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IGFycmF5IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3NsaWNlXCJcbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbmVuZFxuXG5tb2R1bGUgQXJyYXkwID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0ID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3x8XVxuICBsZXQgZ2V0IGFyciA9IEdlbmFycmF5LmdldCBhcnIgW3x8XVxuICBsZXQgc2V0IGFyciA9IEdlbmFycmF5LnNldCBhcnIgW3x8XVxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9IGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpXG5cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcblxuICBsZXQgb2ZfdmFsdWUga2luZCBsYXlvdXQgdiA9XG4gICAgbGV0IGEgPSBjcmVhdGUga2luZCBsYXlvdXQgaW5cbiAgICBzZXQgYSB2O1xuICAgIGFcbiAgbGV0IGluaXQgPSBvZl92YWx1ZVxuZW5kXG5cbm1vZHVsZSBBcnJheTEgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW18XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzFcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlY2FtbF9iYV9zZXRfMVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8xXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMVwiXG4gIGV4dGVybmFsIGRpbTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbSBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsICdjKSB0ID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZSAodHlwZSB0KSAoYSA6IChfLCBfLCB0KSBHZW5hcnJheS50KSBuID1cbiAgICBtYXRjaCBsYXlvdXQgYSB3aXRoXG4gICAgfCBDX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdIDogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XTogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0gZG8gdW5zYWZlX3NldCBhcnIgaSAoZiBpKSBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDEgdG8gZGltIGRvIHVuc2FmZV9zZXQgYXJyIGkgKGYgaSkgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0gZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgKEFycmF5Lmxlbmd0aCBkYXRhKSBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGRhdGEgLSAxIGRvIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIGRhdGEuKGkpIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5tb2R1bGUgQXJyYXkyID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltMTsgZGltMnxdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzJcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWNhbWxfYmFfc2V0XzJcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhXG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzJcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMlwiXG4gIGV4dGVybmFsIGRpbTE6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBkaW0yOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8yXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDpcbiAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZV9sZWZ0IGEgbiA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XVxuICBsZXQgc2xpY2VfcmlnaHQgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltMSBkb1xuICAgICAgZm9yIGogPSAwIHRvIHByZWQgZGltMiBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGYgPVxuICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICBmb3IgaSA9IDEgdG8gZGltMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbTEgZGltMiBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbTEgZGltMiBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gZGltMSAtIDEgZG9cbiAgICAgIGxldCByb3cgPSBkYXRhLihpKSBpblxuICAgICAgaWYgQXJyYXkubGVuZ3RoIHJvdyA8PiBkaW0yIHRoZW5cbiAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTIub2ZfYXJyYXk6IG5vbi1yZWN0YW5ndWxhciBkYXRhXCIpO1xuICAgICAgZm9yIGogPSAwIHRvIGRpbTIgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSByb3cuKGopXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbm1vZHVsZSBBcnJheTMgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbTE7IGRpbTI7IGRpbTN8XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfM1wiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfc2V0XzNcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYVxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8zXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8zXCJcbiAgZXh0ZXJuYWwgZGltMTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGRpbTI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzJcIlxuICBleHRlcm5hbCBkaW0zOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8zXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKSAqIChkaW0zIGFycilcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6XG4gICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlX2xlZnRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG47IG18XVxuICBsZXQgc2xpY2VfcmlnaHRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xuOyBtfF1cbiAgbGV0IHNsaWNlX2xlZnRfMiBhIG4gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF1cbiAgbGV0IHNsaWNlX3JpZ2h0XzIgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0xIGRvXG4gICAgICBmb3IgaiA9IDAgdG8gcHJlZCBkaW0yIGRvXG4gICAgICAgIGZvciBrID0gMCB0byBwcmVkIGRpbTMgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogayAoZiBpIGogaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgZm9yIGsgPSAxIHRvIGRpbTMgZG9cbiAgICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICAgIGZvciBpID0gMSB0byBkaW0xIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIGsgKGYgaSBqIGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGRpbTMgPSBpZiBkaW0yID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBkaW0xIC0gMSBkb1xuICAgICAgbGV0IHJvdyA9IGRhdGEuKGkpIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggcm93IDw+IGRpbTIgdGhlblxuICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICBmb3IgaiA9IDAgdG8gZGltMiAtIDEgZG9cbiAgICAgICAgbGV0IGNvbCA9IHJvdy4oaikgaW5cbiAgICAgICAgaWYgQXJyYXkubGVuZ3RoIGNvbCA8PiBkaW0zIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICAgIGZvciBrID0gMCB0byBkaW0zIC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSAoayArIG9mcykgY29sLihrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MDogKCdhLCAnYiwgJ2MpIEFycmF5MC50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MTogKCdhLCAnYiwgJ2MpIEFycmF5MS50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MjogKCdhLCAnYiwgJ2MpIEFycmF5Mi50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MzogKCdhLCAnYiwgJ2MpIEFycmF5My50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmxldCBhcnJheTBfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAwIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkwX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTFfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAxIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkxX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTJfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAyIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkyX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTNfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAzIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkzX29mX2dlbmFycmF5XCJcblxuZXh0ZXJuYWwgcmVzaGFwZTpcbiAgICgnYSwgJ2IsICdjKSBHZW5hcnJheS50IC0+IGludCBhcnJheSAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcImNhbWxfYmFfcmVzaGFwZVwiXG5sZXQgcmVzaGFwZV8wIGEgPSByZXNoYXBlIGEgW3x8XVxubGV0IHJlc2hhcGVfMSBhIGRpbTEgPSByZXNoYXBlIGEgW3xkaW0xfF1cbmxldCByZXNoYXBlXzIgYSBkaW0xIGRpbTIgPSByZXNoYXBlIGEgW3xkaW0xO2RpbTJ8XVxubGV0IHJlc2hhcGVfMyBhIGRpbTEgZGltMiBkaW0zID0gcmVzaGFwZSBhIFt8ZGltMTtkaW0yO2RpbTN8XVxuXG4oKiBGb3JjZSBjYW1sX2JhX2dldF97MSwyLDMsTn0gdG8gYmUgbGlua2VkIGluLCBzaW5jZSB3ZSBkb24ndCByZWZlclxuICAgdG8gdGhvc2UgcHJpbWl0aXZlcyBkaXJlY3RseSBpbiB0aGlzIGZpbGUgKilcblxubGV0IF8gPVxuICBsZXQgXyA9IEdlbmFycmF5LmdldCBpblxuICBsZXQgXyA9IEFycmF5MS5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTIuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkzLmdldCBpblxuICAoKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMlwiXVxuZXh0ZXJuYWwgZ2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8xXCJcbmV4dGVybmFsIGdldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfMlwiXG5leHRlcm5hbCBnZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzNcIlxuZXh0ZXJuYWwgc2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8xXCJcbmV4dGVybmFsIHNldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfMlwiXG5leHRlcm5hbCBzZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzNcIlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2JhX2NoYW5nZV9sYXlvdXQiLCJjYW1sX2JhX2NyZWF0ZSIsImNhbWxfYmFfZGltXzEiLCJjYW1sX2JhX2RpbV8yIiwiY2FtbF9iYV9raW5kIiwiY2FtbF9iYV9udW1fZGltcyIsImNhbWxfYmFfcmVzaGFwZSIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2JhX3NldF8yIiwiY2FtbF9iYV9zZXRfMyIsImNhbWxfYmFfc2V0X2dlbmVyaWMiLCJjYW1sX2JhX3NsaWNlIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tdWwiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsMyIsImEyIiwiZHVtbXkiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9TeXMiLCJraW5kX3NpemVfaW5fYnl0ZXMiLCJwYXJhbSIsImNsb29wIiwiYXJyIiwiaWR4IiwiY29sIiwibWF4IiwiaiIsImZsb29wIiwiaW5pdCIsImtpbmQiLCJsYXlvdXQiLCJkaW1zIiwiZGxlbiIsImEiLCJuIiwiZCIsImkiLCJzaXplX2luX2J5dGVzIiwiY3JlYXRlIiwiZ2V0Iiwic2V0Iiwib2ZfdmFsdWUiLCJ2IiwiZGltIiwic2xpY2UiLCJvZl9hcnJheSIsImRhdGEiLCJiYSIsIm9mcyIsImRpbTEiLCJkaW0yIiwic2xpY2VfbGVmdCIsInNsaWNlX3JpZ2h0Iiwicm93IiwiZGltMyIsInNsaWNlX2xlZnRfMSIsIm0iLCJzbGljZV9yaWdodF8xIiwic2xpY2VfbGVmdF8yIiwic2xpY2VfcmlnaHRfMiIsImsiLCJjc3RfQmlnYXJyYXlfQXJyYXkzX29mX2FycmF5X24iLCJhcnJheTBfb2ZfZ2VuYXJyYXkiLCJhcnJheTFfb2ZfZ2VuYXJyYXkiLCJhcnJheTJfb2ZfZ2VuYXJyYXkiLCJhcnJheTNfb2ZfZ2VuYXJyYXkiLCJyZXNoYXBlXzAiLCJyZXNoYXBlXzEiLCJyZXNoYXBlXzIiLCJyZXNoYXBlXzMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUosR0FBQUMsSUFBQUUsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFBQUE7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Z0IsTUFBQUMsTUFBQUk7QUFBQUEsSUFDbEIsZ0RBQTRCO0FBQUE7QUFBQSxHQVUzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUQ1WkYiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMzUxNCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9yYW5kb20ubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICopXG4oKiAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDYW1iaXVtLCBDb2xsZWdlIGRlIEZyYW5jZSBhbmQgSW5yaWEgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqKVxuXG5leHRlcm5hbCByYW5kb21fc2VlZDogdW5pdCAtPiBpbnQgYXJyYXkgPSBcImNhbWxfc3lzX3JhbmRvbV9zZWVkXCJcblxubW9kdWxlIFN0YXRlID0gc3RydWN0XG5cbiAgb3BlbiBCaWdhcnJheVxuXG4gIHR5cGUgdCA9IChpbnQ2NCwgaW50NjRfZWx0LCBjX2xheW91dCkgQXJyYXkxLnRcblxuICBleHRlcm5hbCBuZXh0OiB0IC0+IChpbnQ2NFtAdW5ib3hlZF0pXG4gICAgICA9IFwiY2FtbF9seG1fbmV4dFwiIFwiY2FtbF9seG1fbmV4dF91bmJveGVkXCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlICgpIDogdCA9XG4gICAgQXJyYXkxLmNyZWF0ZSBJbnQ2NCBDX2xheW91dCA0XG5cbiAgbGV0IHNldCBzIGkxIGkyIGkzIGk0ID1cbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDAgKEludDY0LmxvZ29yIGkxIDFMKTsgKCogbXVzdCBiZSBvZGQgKilcbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDEgaTI7XG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAyIChpZiBpMyA8PiAwTCB0aGVuIGkzIGVsc2UgMUwpOyAoKiBtdXN0IG5vdCBiZSAwICopXG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAzIChpZiBpNCA8PiAwTCB0aGVuIGk0IGVsc2UgMkwpICgqIG11c3Qgbm90IGJlIDAgKilcblxuICBsZXQgbWsgaTEgaTIgaTMgaTQgPVxuICAgIGxldCBzID0gY3JlYXRlICgpIGluXG4gICAgc2V0IHMgaTEgaTIgaTMgaTQ7IHNcblxuICBsZXQgc2VyaWFsaXphdGlvbl9wcmVmaXggPVxuICAgIFwibHhtMTpcIlxuICAgICgqIFwibHhtXCIgZGVub3RlcyB0aGUgYWxnb3JpdGhtIGN1cnJlbnRseSBpbiB1c2UsIGFuZCAnMScgaXNcbiAgICAgICBhIHZlcnNpb24gbnVtYmVyLiBXZSBzaG91bGQgdXBkYXRlIHRoaXMgcHJlZml4IGlmIHdlIGNoYW5nZVxuICAgICAgIHRoZSBSYW5kb20gYWxnb3JpdGhtIG9yIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCwgc28gdGhhdCB1c2Vyc1xuICAgICAgIGdldCBhIGNsZWFuIGVycm9yIGluc3RlYWQgb2YgYmVsaWV2aW5nIHRoYXQgdGhleSBmYWl0aGZ1bGx5XG4gICAgICAgcmVwcm9kdWNlIHRoZWlyIHByZXZpb3VzIHN0YXRlIGFuZCBpbiBmYWN0IGdldCBhIGRpZmZlcmVudFxuICAgICAgIHN0cmVhbS5cblxuICAgICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBjb25zdHJhaW50IHRvIGtlZXAgdGhlIHNhbWVcbiAgICAgICBcIjxuYW1lPjx2ZXI+OjxkYXRhPlwiIGZvcm1hdCBvciBtZXNzYWdlIHNpemUgaW4gZnV0dXJlIHZlcnNpb25zLFxuICAgICAgIHdlIGNvdWxkIGNoYW5nZSB0aGUgZm9ybWF0IGNvbXBsZXRlbHkgaWYgd2Ugd2FudGVkIGFzIGxvbmdcbiAgICAgICBhcyB0aGVyZSBpcyBubyBjb25mdXNpb24gcG9zc2libGUgd2l0aCB0aGUgcHJldmlvdXMgZm9ybWF0cy4gKilcblxuICBsZXQgc2VyaWFsaXphdGlvbl9wcmVmaXhfbGVuID1cbiAgICBTdHJpbmcubGVuZ3RoIHNlcmlhbGl6YXRpb25fcHJlZml4XG5cbiAgbGV0IHRvX2JpbmFyeV9zdHJpbmcgcyA9XG4gICAgbGV0IHByZWZpeCA9IHNlcmlhbGl6YXRpb25fcHJlZml4IGluXG4gICAgbGV0IHByZWZsZW4gPSBzZXJpYWxpemF0aW9uX3ByZWZpeF9sZW4gaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChwcmVmbGVuICsgNCAqIDgpIGluXG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcHJlZml4IDAgYnVmIDAgcHJlZmxlbjtcbiAgICBmb3IgaSA9IDAgdG8gMyBkb1xuICAgICAgQnl0ZXMuc2V0X2ludDY0X2xlIGJ1ZiAocHJlZmxlbiArIGkgKiA4KSAoQXJyYXkxLmdldCBzIGkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGJ1ZlxuXG4gIGxldCBvZl9iaW5hcnlfc3RyaW5nIGJ1ZiA9XG4gICAgbGV0IHByZWZpeCA9IHNlcmlhbGl6YXRpb25fcHJlZml4IGluXG4gICAgbGV0IHByZWZsZW4gPSBzZXJpYWxpemF0aW9uX3ByZWZpeF9sZW4gaW5cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGJ1ZiA8PiBwcmVmbGVuICsgNCAqIDhcbiAgICAgICB8fCBub3QgKFN0cmluZy5zdGFydHNfd2l0aCB+cHJlZml4IGJ1ZilcbiAgICB0aGVuXG4gICAgICBmYWlsd2l0aFxuICAgICAgICAoXCJSYW5kb20uU3RhdGUub2ZfYmluYXJ5X3N0cmluZzogZXhwZWN0ZWQgYSBmb3JtYXQgXFxcbiAgICAgICAgICBjb21wYXRpYmxlIHdpdGggT0NhbWwgXCIgXiBTeXMub2NhbWxfdmVyc2lvbik7XG4gICAgbGV0IGkxID0gU3RyaW5nLmdldF9pbnQ2NF9sZSBidWYgKHByZWZsZW4gKyAwICogOCkgaW5cbiAgICBsZXQgaTIgPSBTdHJpbmcuZ2V0X2ludDY0X2xlIGJ1ZiAocHJlZmxlbiArIDEgKiA4KSBpblxuICAgIGxldCBpMyA9IFN0cmluZy5nZXRfaW50NjRfbGUgYnVmIChwcmVmbGVuICsgMiAqIDgpIGluXG4gICAgbGV0IGk0ID0gU3RyaW5nLmdldF9pbnQ2NF9sZSBidWYgKHByZWZsZW4gKyAzICogOCkgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuXG4gIGxldCBhc3NpZ24gKGRzdDogdCkgKHNyYzogdCkgPVxuICAgIEFycmF5MS5ibGl0IHNyYyBkc3RcblxuICBsZXQgY29weSBzID1cbiAgICBsZXQgcycgPSBjcmVhdGUoKSBpbiBhc3NpZ24gcycgczsgcydcblxuICAoKiBUaGUgc2VlZCBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEl0IGNhbiBiZSBqdXN0IG9uZSBpbnRlZ2VyLFxuICAgICBidXQgaXQgY2FuIGFsc28gYmUgMTIgb3IgbW9yZSBieXRlcy4gIFRvIGhpZGUgdGhlIGRpZmZlcmVuY2UsXG4gICAgIHdlIHNlcmlhbGl6ZSB0aGUgYXJyYXkgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcywgdGhlbiBoYXNoIHRoZVxuICAgICBzZXF1ZW5jZSB3aXRoIE1ENSAoRGlnZXN0LmJ5dGVzKS4gIE1ENSBnaXZlcyBvbmx5IDEyOCBiaXRzIHdoaWxlXG4gICAgIHdlIG5lZWQgMjU2IGJpdHMsIHNvIHdlIGhhc2ggdHdpY2Ugd2l0aCBkaWZmZXJlbnQgc3VmZml4ZXMuICopXG4gIGxldCByZWluaXQgcyBzZWVkID1cbiAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBzZWVkIGluXG4gICAgbGV0IGIgPSBCeXRlcy5jcmVhdGUgKG4gKiA4ICsgMSkgaW5cbiAgICBmb3IgaSA9IDAgdG8gbi0xIGRvXG4gICAgICBCeXRlcy5zZXRfaW50NjRfbGUgYiAoaSAqIDgpIChJbnQ2NC5vZl9pbnQgc2VlZC4oaSkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMSc7XG4gICAgbGV0IGQxID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMic7XG4gICAgbGV0IGQyID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBzZXQgcyAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMSAwKVxuICAgICAgICAgIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQxIDgpXG4gICAgICAgICAgKFN0cmluZy5nZXRfaW50NjRfbGUgZDIgMClcbiAgICAgICAgICAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMiA4KVxuXG4gIGxldCBtYWtlIHNlZWQgPVxuICAgIGxldCBzID0gY3JlYXRlKCkgaW4gcmVpbml0IHMgc2VlZDsgc1xuXG4gIGxldCBtYWtlX3NlbGZfaW5pdCAoKSA9XG4gICAgbWFrZSAocmFuZG9tX3NlZWQgKCkpXG5cbiAgbGV0IG1pbl9pbnQzMSA9IC0weDQwMDBfMDAwMFxuICAgICAgKCogPSAtMnteMzB9LCB3aGljaCBpcyBbbWluX2ludF0gZm9yIDMxLWJpdCBpbnRlZ2VycyAqKVxuICBsZXQgbWF4X2ludDMxID0gMHgzRkZGX0ZGRkZcbiAgICAgICgqID0gIDJ7XjMwfS0xLCB3aGljaCBpcyBbbWF4X2ludF0gZm9yIDMxLWJpdCBpbnRlZ2VycyAqKVxuICAoKiBhdm9pZCBpbnRlZ2VyIGxpdGVyYWxzIGZvciB0aGVzZSwgMzItYml0IE9DYW1sIHdvdWxkIHJlamVjdCB0aGVtOiAqKVxuICBsZXQgbWluX2ludDMyID0gLSgxIGxzbCAzMSlcbiAgICAgICgqID0gLTB4ODAwMF8wMDAwIG9uIHBsYXRmb3JtcyB3aGVyZSBbU3lzLmludF9zaXplID49IDMyXSAqKVxuICBsZXQgbWF4X2ludDMyID0gKDEgbHNsIDMxKSAtIDFcbiAgICAgICgqID0gIDB4N0ZGRl9GRkZGIG9uIHBsYXRmb3JtcyB3aGVyZSBbU3lzLmludF9zaXplID49IDMyXSAqKVxuXG4gICgqIFJldHVybiAzMCByYW5kb20gYml0cyBhcyBhbiBpbnRlZ2VyIDAgPD0geCA8IDJeMzAgKilcbiAgbGV0IGJpdHMgcyA9XG4gICAgSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWF4X2ludDMxXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtuXSAoZXhjbHVkZWQpLlxuICAgICBbYm91bmRdIG1heSBiZSBhbnkgcG9zaXRpdmUgW2ludF0uICBbbWFza10gbXVzdCBiZSBvZiB0aGUgZm9ybSBbMnteaX0tMV1cbiAgICAgYW5kIGdyZWF0ZXIgb3IgZXF1YWwgdG8gW25dLiAgTGFyZ2VyIHZhbHVlcyBvZiBbbWFza10gbWFrZSB0aGUgZnVuY3Rpb25cbiAgICAgcnVuIGZhc3RlciAoZmV3ZXIgc2FtcGxlcyBhcmUgcmVqZWN0ZWQpLiAgU21hbGxlciB2YWx1ZXMgb2YgW21hc2tdXG4gICAgIGFyZSB1c2FibGUgb24gYSB3aWRlciByYW5nZSBvZiBPQ2FtbCBpbXBsZW1lbnRhdGlvbnMuICAqKVxuICBsZXQgcmVjIGludF9hdXggcyBuIG1hc2sgPVxuICAgICgqIFdlIHN0YXJ0IGJ5IGRyYXdpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciBpbiB0aGUgWyBbMCwgbWFza10gXSByYW5nZSAqKVxuICAgIGxldCByID0gSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWFzayBpblxuICAgIGxldCB2ID0gciBtb2QgbiBpblxuICAgICgqIEZvciB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcmVzdWx0IGJldHdlZW4gMCBpbmNsdWRlZCBhbmQgW25dXG4gICAgICogZXhjbHVkZWQsIHRoZSByYW5kb20gbnVtYmVyIFtyXSBtdXN0IGhhdmUgYmVlbiBkcmF3biB1bmlmb3JtbHkgaW5cbiAgICAgKiBhbiBpbnRlcnZhbCB3aG9zZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiBbbl0uIFRvIGFjaGlldmUgdGhpcyxcbiAgICAgKiB3ZSB1c2UgcmVqZWN0aW9uIHNhbXBsaW5nIG9uIHRoZSBncmVhdGVzdCBpbnRlcnZhbCBbIFswLCBrKm4tMV0gXVxuICAgICAqIHRoYXQgZml0cyBpbiBbIFswLCBtYXNrXSBdLiAgVGhhdCBpcywgd2UgcmVqZWN0IHRoZVxuICAgICAqIHNhbXBsZSBpZiBpdCBmYWxscyBvdXRzaWRlIG9mIHRoaXMgaW50ZXJ2YWwsIGFuZCBkcmF3IGFnYWluLlxuICAgICAqIFRoaXMgaXMgd2hhdCB0aGUgdGVzdCBiZWxvdyBkb2VzLCB3aGlsZSBjYXJlZnVseSBhdm9pZGluZ1xuICAgICAqIG92ZXJmbG93cyBhbmQgc3BhcmluZyBhIGRpdmlzaW9uIFttYXNrIC8gbl0uICopXG4gICAgaWYgciAtIHYgPiBtYXNrIC0gbiArIDEgdGhlbiBpbnRfYXV4IHMgbiBtYXNrIGVsc2UgdlxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuXG4gICAgIFRoZSBib3VuZCBtdXN0IGZpdCBpbiAzMS1iaXQgc2lnbmVkIGludGVnZXJzLlxuICAgICBUaGlzIGZ1bmN0aW9uIHlpZWxkcyB0aGUgc2FtZSBvdXRwdXQgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZWdlciBzaXplLiAqKVxuICBsZXQgaW50IHMgYm91bmQgPVxuICAgIGlmIGJvdW5kID4gbWF4X2ludDMxIHx8IGJvdW5kIDw9IDBcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiUmFuZG9tLmludFwiXG4gICAgZWxzZSBpbnRfYXV4IHMgYm91bmQgbWF4X2ludDMxXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS5cbiAgICAgW2JvdW5kXSBtYXkgYmUgYW55IHBvc2l0aXZlIFtpbnRdLiAqKVxuICBsZXQgZnVsbF9pbnQgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMCB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIlJhbmRvbS5mdWxsX2ludFwiXG4gICAgKCogV2hlbiB0aGUgYm91bmQgZml0cyBpbiAzMS1iaXQgc2lnbmVkIGludGVnZXJzLCB3ZSB1c2UgdGhlIHNhbWUgbWFza1xuICAgICAgIGFzIGluIGZ1bmN0aW9uIFtpbnRdIHNvIGFzIHRvIHlpZWxkIHRoZSBzYW1lIG91dHB1dCBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgc3VwcG9ydGVkIGJ5IE9DYW1sICgzMi1iaXQgT0NhbWwsIDY0LWJpdCBPQ2FtbCwgYW5kIEphdmFTY3JpcHQpLlxuICAgICAgIFdoZW4gdGhlIGJvdW5kIGZpdHMgaW4gMzItYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIFttYXhfaW50MzJdXG4gICAgICAgYXMgdGhlIG1hc2sgc28gYXMgdG8geWllbGQgdGhlIHNhbWUgb3V0cHV0IG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmVcbiAgICAgICBbU3lzLmludF9zaXplID49IDMyXSAoaS5lLiBKYXZhU2NyaXB0IGFuZCA2NC1iaXQgT0NhbWwpLiAqKVxuICAgIGVsc2VcbiAgICAgIGludF9hdXggcyBib3VuZFxuICAgICAgICAoaWYgYm91bmQgPD0gbWF4X2ludDMxIHRoZW4gbWF4X2ludDMxXG4gICAgICAgICBlbHNlIGlmIGJvdW5kIDw9IG1heF9pbnQzMiB0aGVuIG1heF9pbnQzMlxuICAgICAgICAgZWxzZSBtYXhfaW50KVxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgVGhlIFtuYml0c10gcGFyYW1ldGVyIGlzIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHNpZ25lZCBpbnRlZ2Vyc1xuICAgICB3ZSBkcmF3IGZyb20gW3NdLlxuICAgICBXZSBtdXN0IGhhdmUgWy0ye15uYml0cyAtIDF9IDw9IG1pbiA8PSBtYXggPCAye15uYml0cyAtIDF9XS5cbiAgICAgTW9yZW92ZXIsIGZvciB0aGUgaXRlcmF0aW9uIHRvIGNvbnZlcmdlIHF1aWNrbHksIHRoZSBpbnRlcnZhbFxuICAgICBbW21pbiwgbWF4XV0gc2hvdWxkIGhhdmUgd2lkdGggYXQgbGVhc3QgWzJ7Xm5iaXRzIC0gMX1dLlxuICAgICBBcyB0aGUgd2lkdGggYXBwcm9hY2hlcyB0aGlzIGxvd2VyIGxpbWl0LCB0aGUgYXZlcmFnZSBudW1iZXIgb2ZcbiAgICAgZHJhd3MgYXBwcm9hY2hlcyAyLCB3aXRoIGEgcXVpdGUgaGlnaCBzdGFuZGFyZCBkZXZpYXRpb24gKDIgKyBlcHNpbG9uKS4gKilcbiAgbGV0IHJlYyBpbnRfaW5fbGFyZ2VfcmFuZ2UgcyB+bWluIH5tYXggfm5iaXRzID1cbiAgICBsZXQgZHJvcCA9IFN5cy5pbnRfc2l6ZSAtIG5iaXRzIGluXG4gICAgKCogVGhlIGJpdHNoaWZ0cyByZXBsaWNhdGUgdGhlIFtuYml0c10tdGggYml0IChzaWduIGJpdCkgdG8gaGlnaGVyIGJpdHM6ICopXG4gICAgbGV0IHIgPSAoKEludDY0LnRvX2ludCAobmV4dCBzKSkgbHNsIGRyb3ApIGFzciBkcm9wIGluXG4gICAgaWYgciA8IG1pbiB8fCByID4gbWF4IHRoZW4gaW50X2luX2xhcmdlX3JhbmdlIHMgfm1pbiB+bWF4IH5uYml0cyBlbHNlIHJcblxuICAoKiBSZXR1cm4gYW4gaW50ZWdlciBiZXR3ZWVuIFttaW5dIChpbmNsdWRlZCkgYW5kIFttYXhdIChpbmNsdWRlZCkuXG4gICAgIFttYXNrXSBpcyBhcyBkZXNjcmliZWQgZm9yIFtpbnRfYXV4XS5cbiAgICAgW25iaXRzXSBpcyBhcyBkZXNjcmliZWQgZm9yIFtpbnRfaW5fbGFyZ2VfcmFuZ2VdLiAqKVxuICBsZXQgaW50X2luX3JhbmdlX2F1eCBzIH5taW4gfm1heCB+bWFzayB+bmJpdHMgPVxuICAgIGxldCBzcGFuID0gbWF4IC0gbWluICsgMSBpblxuICAgIGlmIHNwYW4gPD0gbWFzayAoKiBbc3Bhbl0gaXMgc21hbGwgZW5vdWdoICopXG4gICAgJiYgc3BhbiA+IDAgICAgICgqIG5vIG92ZXJmbG93IG9jY3VycmVkIHdoZW4gY29tcHV0aW5nIFtzcGFuXSAqKVxuICAgIHRoZW5cbiAgICAgICgqIEp1c3QgZHJhdyBhIG51bWJlciBpbiBbWzAsIHNwYW4pXSBhbmQgc2hpZnQgaXQgYnkgW21pbl0uICopXG4gICAgICBtaW4gKyBpbnRfYXV4IHMgc3BhbiBtYXNrXG4gICAgZWxzZVxuICAgICAgKCogU3BhbiB0b28gbGFyZ2UsIHVzZSB0aGUgYWx0ZXJuYXRpdmUgZHJhd2luZyBtZXRob2QuICopXG4gICAgICBpbnRfaW5fbGFyZ2VfcmFuZ2UgcyB+bWluIH5tYXggfm5iaXRzXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiBbbWluXSAoaW5jbHVkZWQpIGFuZCBbbWF4XSAoaW5jbHVkZWQpLlxuICAgICBXZSBtdXN0IGhhdmUgW21pbiA8PSBtYXhdLiAqKVxuICBsZXQgaW50X2luX3JhbmdlIHMgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXggdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uaW50X2luX3JhbmdlXCI7XG4gICAgKCogV2hlbiBib3RoIGJvdW5kcyBmaXQgaW4gMzEtYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIHBhcmFtZXRlcnNcbiAgICAgICBbbWFza10gYW5kIFtuYml0c10gYXBwcm9wcmlhdGUgZm9yIDMxLWJpdCBpbnRlZ2Vycywgc28gYXMgdG9cbiAgICAgICB5aWVsZCB0aGUgc2FtZSBvdXRwdXQgb24gYWxsIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkgT0NhbWwuXG4gICAgICAgV2hlbiBib3RoIGJvdW5kcyBmaXQgaW4gMzItYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIHBhcmFtZXRlcnNcbiAgICAgICBbbWFza10gYW5kIFtuYml0c10gYXBwcm9wcmlhdGUgZm9yIDMyLWJpdCBpbnRlZ2Vycywgc28gYXMgdG9cbiAgICAgICB5aWVsZCB0aGUgc2FtZSBvdXRwdXQgb24gSmF2YVNjcmlwdCBhbmQgb24gNjQtYml0IE9DYW1sLiAqKVxuICAgIGlmIG1pbiA+PSBtaW5faW50MzEgJiYgbWF4IDw9IG1heF9pbnQzMSB0aGVuXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQzMSB+bmJpdHM6MzFcbiAgICBlbHNlIGlmIG1pbiA+PSBtaW5faW50MzIgJiYgbWF4IDw9IG1heF9pbnQzMiB0aGVuXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQzMiB+bmJpdHM6MzJcbiAgICBlbHNlXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQgfm5iaXRzOlN5cy5pbnRfc2l6ZVxuXG4gICgqIFJldHVybiAzMiByYW5kb20gYml0cyBhcyBhbiBbaW50MzJdICopXG4gIGxldCBiaXRzMzIgcyA9XG4gICAgSW50NjQudG9faW50MzIgKG5leHQgcylcblxuICAoKiBSZXR1cm4gYW4gW2ludDMyXSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDMyYXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzMzIgcykgMSBpblxuICAgIGxldCB2ID0gSW50MzIucmVtIHIgbiBpblxuICAgICgqIEV4cGxhbmF0aW9uIG9mIHRoaXMgdGVzdDogc2VlIGNvbW1lbnQgaW4gW2ludF9hdXhdLiAqKVxuICAgIGlmIEludDMyLihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxbClcbiAgICB0aGVuIGludDMyYXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQzMiBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwbFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJcIlxuICAgIGVsc2UgaW50MzJhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBbaW50MzJdIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgV2UgbXVzdCBoYXZlIFttaW4gPD0gbWF4XS4gKilcbiAgbGV0IHJlYyBpbnQzMl9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggPVxuICAgIGxldCByID0gSW50NjQudG9faW50MzIgKG5leHQgcykgaW5cbiAgICBpZiByIDwgbWluIHx8IHIgPiBtYXggdGhlbiBpbnQzMl9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggZWxzZSByXG5cbiAgbGV0IGludDMyX2luX3JhbmdlIHMgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXggdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJfaW5fcmFuZ2VcIlxuICAgIGVsc2VcbiAgICAgIGxldCBzcGFuID0gSW50MzIuc3VjYyAoSW50MzIuc3ViIG1heCBtaW4pIGluXG4gICAgICAoKiBFeHBsYW5hdGlvbiBvZiB0aGlzIHRlc3Q6IHNlZSBjb21tZW50IGluIFtpbnRfaW5fcmFuZ2VfYXV4XS4gKilcbiAgICAgIGlmIHNwYW4gPD0gSW50MzIuemVybyB0aGVuXG4gICAgICAgIGludDMyX2luX3JhbmdlX2F1eCBzIH5taW4gfm1heFxuICAgICAgZWxzZVxuICAgICAgICBJbnQzMi5hZGQgbWluIChpbnQzMmF1eCBzIHNwYW4pXG5cbiAgKCogUmV0dXJuIDY0IHJhbmRvbSBiaXRzIGFzIGFuIFtpbnQ2NF0gKilcbiAgbGV0IGJpdHM2NCBzID1cbiAgICBuZXh0IHNcblxuICAoKiBSZXR1cm4gYW4gW2ludDY0XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDY0YXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzNjQgcykgMSBpblxuICAgIGxldCB2ID0gSW50NjQucmVtIHIgbiBpblxuICAgICgqIEV4cGxhbmF0aW9uIG9mIHRoaXMgdGVzdDogc2VlIGNvbW1lbnQgaW4gW2ludF9hdXhdLiAqKVxuICAgIGlmIEludDY0LihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxTClcbiAgICB0aGVuIGludDY0YXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQ2NCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwTFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50NjRcIlxuICAgIGVsc2UgaW50NjRhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBbaW50NjRdIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgV2UgbXVzdCBoYXZlIFttaW4gPD0gbWF4XS4gKilcbiAgbGV0IHJlYyBpbnQ2NF9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggPVxuICAgIGxldCByID0gbmV4dCBzIGluXG4gICAgaWYgciA8IG1pbiB8fCByID4gbWF4IHRoZW4gaW50NjRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IGVsc2UgclxuXG4gIGxldCBpbnQ2NF9pbl9yYW5nZSBzIH5taW4gfm1heCA9XG4gICAgaWYgbWluID4gbWF4IHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiUmFuZG9tLmludDY0X2luX3JhbmdlXCJcbiAgICBlbHNlXG4gICAgICBsZXQgc3BhbiA9IEludDY0LnN1Y2MgKEludDY0LnN1YiBtYXggbWluKSBpblxuICAgICAgKCogRXhwbGFuYXRpb24gb2YgdGhpcyB0ZXN0OiBzZWUgY29tbWVudCBpbiBbaW50X2luX3JhbmdlX2F1eF0uICopXG4gICAgICBpZiBzcGFuIDw9IEludDY0Lnplcm8gdGhlblxuICAgICAgICBpbnQ2NF9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXhcbiAgICAgIGVsc2VcbiAgICAgICAgSW50NjQuYWRkIG1pbiAoaW50NjRhdXggcyBzcGFuKVxuXG4gICgqIFJldHVybiAzMiBvciA2NCByYW5kb20gYml0cyBhcyBhIFtuYXRpdmVpbnRdICopXG4gIGxldCBuYXRpdmViaXRzID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGJpdHMzMiBzKVxuICAgIGVsc2UgZnVuIHMgLT4gSW50NjQudG9fbmF0aXZlaW50IChiaXRzNjQgcylcblxuICAoKiBSZXR1cm4gYSBbbmF0aXZlaW50XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50ID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyBib3VuZCAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGludDMyIHMgKE5hdGl2ZWludC50b19pbnQzMiBib3VuZCkpXG4gICAgZWxzZSBmdW4gcyBib3VuZCAtPiBJbnQ2NC50b19uYXRpdmVpbnQgKGludDY0IHMgKEludDY0Lm9mX25hdGl2ZWludCBib3VuZCkpXG5cbiAgKCogUmV0dXJuIGEgW25hdGl2ZWludF0gYmV0d2VlbiBbbWluXSAoaW5jbHVkZWQpIGFuZCBbbWF4XSAoaW5jbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50X2luX3JhbmdlID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyB+bWluIH5tYXggLT5cbiAgICAgIE5hdGl2ZWludC5vZl9pbnQzMiAoaW50MzJfaW5fcmFuZ2Ugc1xuICAgICAgICB+bWluOihOYXRpdmVpbnQudG9faW50MzIgbWluKSB+bWF4OihOYXRpdmVpbnQudG9faW50MzIgbWF4KSlcbiAgICBlbHNlIGZ1biBzIH5taW4gfm1heCAtPlxuICAgICAgSW50NjQudG9fbmF0aXZlaW50IChpbnQ2NF9pbl9yYW5nZSBzXG4gICAgICAgIH5taW46KEludDY0Lm9mX25hdGl2ZWludCBtaW4pIH5tYXg6KEludDY0Lm9mX25hdGl2ZWludCBtYXgpKVxuXG4gICgqIFJldHVybiBhIGZsb2F0IDAgPCB4IDwgMSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlXG4gICAgIG11bHRpcGxlcyBvZiAyXi01MyAqKVxuICBsZXQgcmVjIHJhd2Zsb2F0IHMgPVxuICAgIGxldCBiID0gbmV4dCBzIGluXG4gICAgbGV0IG4gPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIGIgMTEgaW5cbiAgICBpZiBuIDw+IDBMIHRoZW4gSW50NjQudG9fZmxvYXQgbiAqLiAweDEucC01MyBlbHNlIHJhd2Zsb2F0IHNcblxuICAoKiBSZXR1cm4gYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIFtib3VuZF0gKilcbiAgbGV0IGZsb2F0IHMgYm91bmQgPSByYXdmbG9hdCBzICouIGJvdW5kXG5cbiAgKCogUmV0dXJuIGEgcmFuZG9tIEJvb2xlYW4gKilcbiAgbGV0IGJvb2wgcyA9IG5leHQgcyA8IDBMXG5cbiAgKCogU3BsaXQgYSBuZXcgUFJORyBvZmYgdGhlIGdpdmVuIFBSTkcgKilcbiAgbGV0IHNwbGl0IHMgPVxuICAgIGxldCBpMSA9IGJpdHM2NCBzIGluIGxldCBpMiA9IGJpdHM2NCBzIGluXG4gICAgbGV0IGkzID0gYml0czY0IHMgaW4gbGV0IGk0ID0gYml0czY0IHMgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuZW5kXG5cbmxldCBta19kZWZhdWx0ICgpID1cbiAgKCogVGhpcyBpcyB0aGUgc3RhdGUgb2J0YWluZWQgd2l0aCBbU3RhdGUubWFrZSBbfCAzMTQxNTkyNjUgfF1dLiAqKVxuICBTdGF0ZS5tayAoLTYxOTY4NzQyODk1Njc3MDUwOTdMKVxuICAgICAgICAgICA1ODY1NzMyNDk4MzM3MTMxODlMXG4gICAgICAgICAgICgtODU5MTI2ODgwMzg2NTA0MzQwN0wpXG4gICAgICAgICAgIDYzODg2MTM1OTU4NDk3NzIwNDRMXG5cbmxldCByYW5kb21fa2V5ID1cbiAgRG9tYWluLkRMUy5uZXdfa2V5IH5zcGxpdF9mcm9tX3BhcmVudDpTdGF0ZS5zcGxpdCBta19kZWZhdWx0XG5cbmxldCBiaXRzICgpID0gU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBpbnQgYm91bmQgPSBTdGF0ZS5pbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgZnVsbF9pbnQgYm91bmQgPSBTdGF0ZS5mdWxsX2ludCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnRfaW5fcmFuZ2Ugfm1pbiB+bWF4ID1cbiAgU3RhdGUuaW50X2luX3JhbmdlIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSB+bWluIH5tYXhcbmxldCBpbnQzMiBib3VuZCA9IFN0YXRlLmludDMyIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGludDMyX2luX3JhbmdlIH5taW4gfm1heCA9XG4gIFN0YXRlLmludDMyX2luX3JhbmdlIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSB+bWluIH5tYXhcbmxldCBuYXRpdmVpbnQgYm91bmQgPSBTdGF0ZS5uYXRpdmVpbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgbmF0aXZlaW50X2luX3JhbmdlIH5taW4gfm1heCA9XG4gIFN0YXRlLm5hdGl2ZWludF9pbl9yYW5nZSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgfm1pbiB+bWF4XG5sZXQgaW50NjQgYm91bmQgPSBTdGF0ZS5pbnQ2NCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnQ2NF9pbl9yYW5nZSB+bWluIH5tYXggPVxuICBTdGF0ZS5pbnQ2NF9pbl9yYW5nZSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgfm1pbiB+bWF4XG5sZXQgZmxvYXQgc2NhbGUgPSBTdGF0ZS5mbG9hdCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgc2NhbGVcbmxldCBib29sICgpID0gU3RhdGUuYm9vbCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBiaXRzMzIgKCkgPSBTdGF0ZS5iaXRzMzIgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgYml0czY0ICgpID0gU3RhdGUuYml0czY0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IG5hdGl2ZWJpdHMgKCkgPSBTdGF0ZS5uYXRpdmViaXRzIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG5sZXQgZnVsbF9pbml0IHNlZWQgPSBTdGF0ZS5yZWluaXQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIHNlZWRcbmxldCBpbml0IHNlZWQgPSBmdWxsX2luaXQgW3wgc2VlZCB8XVxubGV0IHNlbGZfaW5pdCAoKSA9IGZ1bGxfaW5pdCAocmFuZG9tX3NlZWQoKSlcblxuKCogU3BsaXR0aW5nICopXG5cbmxldCBzcGxpdCAoKSA9IFN0YXRlLnNwbGl0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG4oKiBNYW5pcHVsYXRpbmcgdGhlIGN1cnJlbnQgc3RhdGUuICopXG5cbmxldCBnZXRfc3RhdGUgKCkgPSBTdGF0ZS5jb3B5IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IHNldF9zdGF0ZSBzID0gU3RhdGUuYXNzaWduIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBzXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmFfYmxpdCIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9ncmVhdGVydGhhbiIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X29mX2ludDMyIiwiY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lIiwiY2FtbF9pbnQ2NF9zdWIiLCJjYW1sX2ludDY0X3RvX2ludDMyIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9seG1fbmV4dCIsImNhbWxfbW9kIiwiY2FtbF9ub3RlcXVhbCIsImNhbWxfc3lzX3JhbmRvbV9zZWVkIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiU3RkbGliX0RvbWFpbiIsIlN0ZGxpYl9TeXMiLCJTdGRsaWJfSW50MzIiLCJTdGRsaWJfSW50NjQiLCJTdGRsaWIiLCJTdGRsaWJfQnl0ZXMiLCJTdGRsaWJfRGlnZXN0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9CaWdhcnJheSIsIlN0ZGxpYl9OYXRpdmVpbnQiLCJjcmVhdGUiLCJwYXJhbSIsInNldCIsInMiLCJpMSIsImkyIiwiaTMiLCJpNCIsIm1rIiwic2VyaWFsaXphdGlvbl9wcmVmaXgiLCJ0b19iaW5hcnlfc3RyaW5nIiwiYnVmIiwiaSIsIm9mX2JpbmFyeV9zdHJpbmciLCJjb3B5Iiwic3JjIiwiZHN0IiwicmVpbml0Iiwic2VlZCIsIm4iLCJiIiwiZDEiLCJkMiIsIm1ha2UiLCJtYWtlX3NlbGZfaW5pdCIsImJpdHMiLCJpbnRfYXV4IiwibWFzayIsInIiLCJ2IiwibWF4X2ludDMxIiwiaW50IiwiYm91bmQiLCJtYXhfaW50MzIiLCJmdWxsX2ludCIsImludF9pbl9yYW5nZV9hdXgiLCJtaW4iLCJtYXgiLCJuYml0cyIsInNwYW4iLCJkcm9wIiwiaW50X2luX3JhbmdlIiwiYml0czMyIiwiaW50MzJhdXgiLCJpbnQzMiIsImludDMyX2luX3JhbmdlIiwiaW50NjRhdXgiLCJpbnQ2NCIsImludDY0X2luX3JhbmdlIiwibmF0aXZlYml0cyIsIm5hdGl2ZWludCIsIm5hdGl2ZWludF9pbl9yYW5nZSIsImZsb2F0IiwiYm9vbCIsInNwbGl0IiwibWtfZGVmYXVsdCIsInJhbmRvbV9rZXkiLCJzY2FsZSIsImJpdHM2NCIsImZ1bGxfaW5pdCIsImluaXQiLCJzZWxmX2luaXQiLCJnZXRfc3RhdGUiLCJzZXRfc3RhdGUiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw2QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUNBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsT0FBQUMsT0M4Qkksa0RB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwVjlEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjM5MDgsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvaGFzaHRibC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSGFzaCB0YWJsZXMgKilcblxuKCogV2UgZG8gZHluYW1pYyBoYXNoaW5nLCBhbmQgcmVzaXplIHRoZSB0YWJsZSBhbmQgcmVoYXNoIHRoZSBlbGVtZW50c1xuICAgd2hlbiB0aGUgbG9hZCBmYWN0b3IgYmVjb21lcyB0b28gaGlnaC4gKilcblxudHlwZSAoJ2EsICdiKSB0ID1cbiAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgIG11dGFibGUgZGF0YTogKCdhLCAnYikgYnVja2V0bGlzdCBhcnJheTsgICgqIHRoZSBidWNrZXRzICopXG4gICAgc2VlZDogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICgqIGZvciByYW5kb21pemF0aW9uICopXG4gICAgbXV0YWJsZSBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgKCogaW5pdGlhbCBhcnJheSBzaXplICopXG4gIH1cblxuYW5kICgnYSwgJ2IpIGJ1Y2tldGxpc3QgPVxuICAgIEVtcHR5XG4gIHwgQ29ucyBvZiB7IG11dGFibGUga2V5OiAnYTtcbiAgICAgICAgICAgICAgbXV0YWJsZSBkYXRhOiAnYjtcbiAgICAgICAgICAgICAgbXV0YWJsZSBuZXh0OiAoJ2EsICdiKSBidWNrZXRsaXN0IH1cblxuKCogVGhlIHNpZ24gb2YgaW5pdGlhbF9zaXplIGVuY29kZXMgdGhlIGZhY3QgdGhhdCBhIHRyYXZlcnNhbCBpc1xuICAgb25nb2luZyBvciBub3QuXG5cbiAgIFRoaXMgZGlzYWJsZXMgdGhlIGVmZmljaWVudCBpbiBwbGFjZSBpbXBsZW1lbnRhdGlvbiBvZiByZXNpemluZy5cbiopXG5cbmxldCBvbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gIHx8IGguaW5pdGlhbF9zaXplIDwgMFxuXG5sZXQgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgaC5pbml0aWFsX3NpemUgPC0gLSBoLmluaXRpYWxfc2l6ZVxuXG4oKiBUbyBwaWNrIHJhbmRvbSBzZWVkcyBpZiByZXF1ZXN0ZWQgKilcblxubGV0IHJhbmRvbWl6ZWRfZGVmYXVsdCA9XG4gIGxldCBwYXJhbXMgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiT0NBTUxSVU5QQVJBTVwiIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJDQU1MUlVOUEFSQU1cIiB3aXRoIE5vdF9mb3VuZCAtPiBcIlwiIGluXG4gIFN0cmluZy5jb250YWlucyBwYXJhbXMgJ1InXG5cbmxldCByYW5kb21pemVkID0gQXRvbWljLm1ha2UgcmFuZG9taXplZF9kZWZhdWx0XG5cbmxldCByYW5kb21pemUgKCkgPSBBdG9taWMuc2V0IHJhbmRvbWl6ZWQgdHJ1ZVxubGV0IGlzX3JhbmRvbWl6ZWQgKCkgPSBBdG9taWMuZ2V0IHJhbmRvbWl6ZWRcblxubGV0IHBybmdfa2V5ID0gRG9tYWluLkRMUy5uZXdfa2V5IFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdFxuXG4oKiBGdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGJlZm9yZSB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgbXVzdCBlaXRoZXIgYmVcbiAgIGluZGVwZW5kZW50IG9mIHRoZSBoYXNoIGZ1bmN0aW9uIG9yIHRha2UgaXQgYXMgYSBwYXJhbWV0ZXIgKHNlZSAjMjIwMiBhbmRcbiAgIGNvZGUgYmVsb3cgdGhlIGZ1bmN0b3IgZGVmaW5pdGlvbnMuICopXG5cbigqIENyZWF0aW5nIGEgZnJlc2gsIGVtcHR5IHRhYmxlICopXG5cbmxldCByZWMgcG93ZXJfMl9hYm92ZSB4IG4gPVxuICBpZiB4ID49IG4gdGhlbiB4XG4gIGVsc2UgaWYgeCAqIDIgPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIHhcbiAgZWxzZSBwb3dlcl8yX2Fib3ZlICh4ICogMikgblxuXG5sZXQgY3JlYXRlID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBpbml0aWFsX3NpemUgPVxuICBsZXQgcyA9IHBvd2VyXzJfYWJvdmUgMTYgaW5pdGlhbF9zaXplIGluXG4gIGxldCBzZWVkID1cbiAgICBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcHJuZ19rZXkpIGVsc2UgMFxuICBpblxuICB7IGluaXRpYWxfc2l6ZSA9IHM7IHNpemUgPSAwOyBzZWVkID0gc2VlZDsgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eSB9XG5cbmxldCBjbGVhciBoID1cbiAgaWYgaC5zaXplID4gMCB0aGVuIGJlZ2luXG4gICAgaC5zaXplIDwtIDA7XG4gICAgQXJyYXkuZmlsbCBoLmRhdGEgMCAoQXJyYXkubGVuZ3RoIGguZGF0YSkgRW1wdHlcbiAgZW5kXG5cbmxldCByZXNldCBoID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gICAgfHwgbGVuID0gYWJzIGguaW5pdGlhbF9zaXplIHRoZW5cbiAgICBjbGVhciBoXG4gIGVsc2UgYmVnaW5cbiAgICBoLnNpemUgPC0gMDtcbiAgICBoLmRhdGEgPC0gQXJyYXkubWFrZSAoYWJzIGguaW5pdGlhbF9zaXplKSBFbXB0eVxuICBlbmRcblxubGV0IGNvcHlfYnVja2V0bGlzdCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gRW1wdHlcbiAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICBsZXQgcmVjIGxvb3AgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIHwgQ29ucyBwcmVjIC0+ICBwcmVjLm5leHQgPC0gclxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgbG9vcCByIG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgIGxvb3AgciBuZXh0O1xuICAgICAgclxuXG5sZXQgY29weSBoID0geyBoIHdpdGggZGF0YSA9IEFycmF5Lm1hcCBjb3B5X2J1Y2tldGxpc3QgaC5kYXRhIH1cblxubGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbmxldCBpbnNlcnRfYWxsX2J1Y2tldHMgaW5kZXhmdW4gaW5wbGFjZSBvZGF0YSBuZGF0YSA9XG4gIGxldCBuc2l6ZSA9IEFycmF5Lmxlbmd0aCBuZGF0YSBpblxuICBsZXQgbmRhdGFfdGFpbCA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGFzIGNlbGwgLT5cbiAgICAgICAgbGV0IGNlbGwgPVxuICAgICAgICAgIGlmIGlucGxhY2UgdGhlbiBjZWxsXG4gICAgICAgICAgZWxzZSBDb25zIHtrZXk7IGRhdGE7IG5leHQgPSBFbXB0eX1cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5pZHggPSBpbmRleGZ1biBrZXkgaW5cbiAgICAgICAgYmVnaW4gbWF0Y2ggbmRhdGFfdGFpbC4obmlkeCkgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IG5kYXRhLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gY2VsbDtcbiAgICAgICAgZW5kO1xuICAgICAgICBuZGF0YV90YWlsLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICBpbnNlcnRfYnVja2V0IG5leHRcbiAgaW5cbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBvZGF0YSAtIDEgZG9cbiAgICBpbnNlcnRfYnVja2V0IG9kYXRhLihpKVxuICBkb25lO1xuICBpZiBpbnBsYWNlIHRoZW5cbiAgICBmb3IgaSA9IDAgdG8gbnNpemUgLSAxIGRvXG4gICAgICBtYXRjaCBuZGF0YV90YWlsLihpKSB3aXRoXG4gICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gRW1wdHlcbiAgICBkb25lXG5cbmxldCByZXNpemUgaW5kZXhmdW4gaCA9XG4gIGxldCBvZGF0YSA9IGguZGF0YSBpblxuICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgbGV0IG5zaXplID0gb3NpemUgKiAyIGluXG4gIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiBiZWdpblxuICAgIGxldCBuZGF0YSA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgICBsZXQgaW5wbGFjZSA9IG5vdCAob25nb2luZ190cmF2ZXJzYWwgaCkgaW5cbiAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICAgICgqIHNvIHRoYXQgaW5kZXhmdW4gc2VlcyB0aGUgbmV3IGJ1Y2tldCBjb3VudCAqKVxuICAgIGluc2VydF9hbGxfYnVja2V0cyAoaW5kZXhmdW4gaCkgaW5wbGFjZSBvZGF0YSBuZGF0YVxuICBlbmRcblxubGV0IGl0ZXIgZiBoID1cbiAgbGV0IHJlYyBkb19idWNrZXQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgKClcbiAgICB8IENvbnN7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBmIGtleSBkYXRhOyBkb19idWNrZXQgbmV4dCBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBkb19idWNrZXQgZC4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbmxldCByZWMgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBwcmVjID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBFbXB0eVxuICAgICAgZW5kXG4gIHwgKENvbnMgKHtrZXk7IGRhdGE7IG5leHR9IGFzIGMpKSBhcyBzbG90IC0+XG4gICAgICBiZWdpbiBtYXRjaCBmIGtleSBkYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgcHJlYyBuZXh0XG4gICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBzbG90XG4gICAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIHNsb3RcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgYy5kYXRhIDwtIGRhdGE7XG4gICAgICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBzbG90IG5leHRcbiAgICAgIGVuZFxuXG5sZXQgZmlsdGVyX21hcF9pbnBsYWNlIGYgaCA9XG4gIGxldCBkID0gaC5kYXRhIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIEVtcHR5IGguZGF0YS4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaFxuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxubGV0IGZvbGQgZiBoIGluaXQgPVxuICBsZXQgcmVjIGRvX2J1Y2tldCBiIGFjY3UgPVxuICAgIG1hdGNoIGIgd2l0aFxuICAgICAgRW1wdHkgLT5cbiAgICAgICAgYWNjdVxuICAgIHwgQ29uc3trZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIGRvX2J1Y2tldCBuZXh0IChmIGtleSBkYXRhIGFjY3UpIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgIGxldCBhY2N1ID0gcmVmIGluaXQgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBhY2N1IDo9IGRvX2J1Y2tldCBkLihpKSAhYWNjdVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgICFhY2N1XG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG50eXBlIHN0YXRpc3RpY3MgPSB7XG4gIG51bV9iaW5kaW5nczogaW50O1xuICBudW1fYnVja2V0czogaW50O1xuICBtYXhfYnVja2V0X2xlbmd0aDogaW50O1xuICBidWNrZXRfaGlzdG9ncmFtOiBpbnQgYXJyYXlcbn1cblxubGV0IHJlYyBidWNrZXRfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFjY3VcbiAgfCBDb25ze25leHR9IC0+IGJ1Y2tldF9sZW5ndGggKGFjY3UgKyAxKSBuZXh0XG5cbmxldCBzdGF0cyBoID1cbiAgbGV0IG1ibCA9XG4gICAgQXJyYXkuZm9sZF9sZWZ0IChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aCAwIGIpKSAwIGguZGF0YSBpblxuICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gIEFycmF5Lml0ZXJcbiAgICAoZnVuIGIgLT5cbiAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgIGguZGF0YTtcbiAgeyBudW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgdGJsID1cbiAgKCogY2FwdHVyZSBjdXJyZW50IGFycmF5LCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHRhYmxlIGlzIHJlc2l6ZWQgd2VcbiAgICAga2VlcCBpdGVyYXRpbmcgb24gdGhlIHNhbWUgYXJyYXkgKilcbiAgbGV0IHRibF9kYXRhID0gdGJsLmRhdGEgaW5cbiAgKCogc3RhdGU6IGluZGV4ICogbmV4dCBidWNrZXQgdG8gdHJhdmVyc2UgKilcbiAgbGV0IHJlYyBhdXggaSBidWNrICgpID0gbWF0Y2ggYnVjayB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBpZiBpID0gQXJyYXkubGVuZ3RoIHRibF9kYXRhXG4gICAgICAgIHRoZW4gU2VxLk5pbFxuICAgICAgICBlbHNlIGF1eChpKzEpIHRibF9kYXRhLihpKSAoKVxuICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBTZXEuQ29ucyAoKGtleSwgZGF0YSksIGF1eCBpIG5leHQpXG4gIGluXG4gIGF1eCAwIEVtcHR5XG5cbmxldCB0b19zZXFfa2V5cyBtID0gU2VxLm1hcCBmc3QgKHRvX3NlcSBtKVxuXG5sZXQgdG9fc2VxX3ZhbHVlcyBtID0gU2VxLm1hcCBzbmQgKHRvX3NlcSBtKVxuXG4oKiBGdW5jdG9yaWFsIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBIYXNoZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBoYXNoOiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkSGFzaGVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgc2VlZGVkX2hhc2g6IGludCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhJ2EgdFxuICAgIHZhbCBjcmVhdGU6IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHk6ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBhZGQ6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgcmVtb3ZlOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQ6ICdhIHQgLT4ga2V5IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9hbGw6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICAgIHZhbCBpdGVyOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBsZW5ndGg6ICdhIHQgLT4gaW50XG4gICAgdmFsIHN0YXRzOiAnYSB0IC0+IHN0YXRpc3RpY3NcbiAgICB2YWwgdG9fc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3NlcV9rZXlzIDogXyB0IC0+IGtleSBTZXEudFxuICAgIHZhbCB0b19zZXFfdmFsdWVzIDogJ2EgdCAtPiAnYSBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFNlZWRlZFMgPVxuICBzaWdcbiAgICB0eXBlIGtleVxuICAgIHR5cGUgISdhIHRcbiAgICB2YWwgY3JlYXRlIDogP3JhbmRvbTpib29sIC0+IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICAgIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gICAgdmFsIGl0ZXIgOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZCA6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgc3RhdHM6ICdhIHQgLT4gc3RhdGlzdGljc1xuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIE1ha2VTZWVkZWQoSDogU2VlZGVkSGFzaGVkVHlwZSk6IChTZWVkZWRTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgdHlwZSBrZXkgPSBILnRcbiAgICB0eXBlICdhIGhhc2h0YmwgPSAoa2V5LCAnYSkgdFxuICAgIHR5cGUgJ2EgdCA9ICdhIGhhc2h0YmxcbiAgICBsZXQgY3JlYXRlID0gY3JlYXRlXG4gICAgbGV0IGNsZWFyID0gY2xlYXJcbiAgICBsZXQgcmVzZXQgPSByZXNldFxuICAgIGxldCBjb3B5ID0gY29weVxuXG4gICAgbGV0IGtleV9pbmRleCBoIGtleSA9XG4gICAgICAoSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5KSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcblxuICAgIGxldCBhZGQgaCBrZXkgZGF0YSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgbGV0IGJ1Y2tldCA9IENvbnN7a2V5OyBkYXRhOyBuZXh0PWguZGF0YS4oaSl9IGluXG4gICAgICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuXG4gICAgbGV0IHJlYyByZW1vdmVfYnVja2V0IGggaSBrZXkgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgKClcbiAgICAgIHwgKENvbnMge2tleT1rOyBuZXh0fSkgYXMgYyAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGJlZ2luXG4gICAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICAgIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBuZXh0XG4gICAgICAgICAgZW5kXG4gICAgICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbiAgICBsZXQgcmVtb3ZlIGgga2V5ID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG4gICAgbGV0IHJlYyBmaW5kX3JlYyBrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsgdGhlbiBkYXRhIGVsc2UgZmluZF9yZWMga2V5IG5leHRcblxuICAgIGxldCBmaW5kIGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMSB0aGVuIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMiB0aGVuIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazMgdGhlbiBkMyBlbHNlIGZpbmRfcmVjIGtleSBuZXh0M1xuXG4gICAgbGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgayB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG4gICAgbGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazEgdGhlbiBTb21lIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazIgdGhlbiBTb21lIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGszIHRoZW4gU29tZSBkMyBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dDNcblxuICAgIGxldCBmaW5kX2FsbCBoIGtleSA9XG4gICAgICBsZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgW11cbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YT1kOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGQgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbiAgICBsZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICAgICAgZWxzZSByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBuZXh0XG5cbiAgICBsZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgICAgIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICAgICAgZW5kXG5cbiAgICBsZXQgcmVjIG1lbV9pbl9idWNrZXQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBDb25ze2tleT1rOyBuZXh0fSAtPlxuICAgICAgICAgIEguZXF1YWwgayBrZXkgfHwgbWVtX2luX2J1Y2tldCBrZXkgbmV4dFxuXG4gICAgbGV0IG1lbSBoIGtleSA9XG4gICAgICBtZW1faW5fYnVja2V0IGtleSBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgICBsZXQgaXRlciA9IGl0ZXJcbiAgICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlID0gZmlsdGVyX21hcF9pbnBsYWNlXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCBzdGF0cyA9IHN0YXRzXG4gICAgbGV0IHRvX3NlcSA9IHRvX3NlcVxuICAgIGxldCB0b19zZXFfa2V5cyA9IHRvX3NlcV9rZXlzXG4gICAgbGV0IHRvX3NlcV92YWx1ZXMgPSB0b19zZXFfdmFsdWVzXG4gIGVuZFxuXG5tb2R1bGUgTWFrZShIOiBIYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4oKiBQb2x5bW9ycGhpYyBoYXNoIGZ1bmN0aW9uLWJhc2VkIHRhYmxlcyAqKVxuKCogQ29kZSBpbmNsdWRlZCBiZWxvdyB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgdG8gZ3VhcmQgYWdhaW5zdCBhY2NpZGVudGFsXG4gICB1c2UgLSBzZWUgIzIyMDIgKilcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5sZXQgaGFzaF9wYXJhbSBuMSBuMiB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gbjEgbjIgMCB4XG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxuXG5sZXQga2V5X2luZGV4IGgga2V5ID1cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDRcbiAgdGhlbiAoc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIGguc2VlZCBrZXkpIGxhbmQgKEFycmF5Lmxlbmd0aCBoLmRhdGEgLSAxKVxuICBlbHNlIGludmFsaWRfYXJnIFwiSGFzaHRibDogdW5zdXBwb3J0ZWQgaGFzaCB0YWJsZSBmb3JtYXRcIlxuXG5sZXQgYWRkIGgga2V5IGRhdGEgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICBsZXQgYnVja2V0ID0gQ29uc3trZXk7IGRhdGE7IG5leHQ9aC5kYXRhLihpKX0gaW5cbiAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG5cbmxldCByZWMgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IHByZWMgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICAoKVxuICB8IChDb25zIHtrZXk9azsgbmV4dH0pIGFzIGMgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGJlZ2luXG4gICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIG5leHRcbiAgICAgIGVuZFxuICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbmxldCByZW1vdmUgaCBrZXkgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG5sZXQgcmVjIGZpbmRfcmVjIGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIGRhdGEgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dFxuXG5sZXQgZmluZCBoIGtleSA9XG4gIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrMSA9IDAgdGhlbiBkMSBlbHNlXG4gICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMiA9IDAgdGhlbiBkMiBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgaWYgY29tcGFyZSBrZXkgazMgPSAwIHRoZW4gZDMgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dDNcblxubGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgTm9uZVxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG5sZXQgZmluZF9vcHQgaCBrZXkgPVxuICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICB8IEVtcHR5IC0+IE5vbmVcbiAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsxID0gMCB0aGVuIFNvbWUgZDEgZWxzZVxuICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGsyID0gMCB0aGVuIFNvbWUgZDIgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMyA9IDAgdGhlbiBTb21lIGQzIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0M1xuXG5sZXQgZmluZF9hbGwgaCBrZXkgPVxuICBsZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIFtdXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGRhdGEgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgZWxzZSBmaW5kX2luX2J1Y2tldCBuZXh0IGluXG4gIGZpbmRfaW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIChzbG90LmtleSA8LSBrZXk7IHNsb3QuZGF0YSA8LSBkYXRhOyBmYWxzZSlcbiAgICAgIGVsc2UgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbmV4dFxuXG5sZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgbGV0IGwgPSBoLmRhdGEuKGkpIGluXG4gIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgIGguZGF0YS4oaSkgPC0gQ29uc3trZXk7IGRhdGE7IG5leHQ9bH07XG4gICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICBlbmRcblxubGV0IHJlYyBtZW1faW5fYnVja2V0IGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29uc3trZXk9azsgbmV4dH0gLT5cbiAgICAgIGNvbXBhcmUgayBrZXkgPSAwIHx8IG1lbV9pbl9idWNrZXQga2V5IG5leHRcblxubGV0IG1lbSBoIGtleSA9XG4gIG1lbV9pbl9idWNrZXQga2V5IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgYWRkX3NlcSB0YmwgaSA9XG4gIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxubGV0IHJlcGxhY2Vfc2VxIHRibCBpID1cbiAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiByZXBsYWNlIHRibCBrIHYpIGlcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgdGJsXG5cbmxldCByZWJ1aWxkID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBoID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IChBcnJheS5sZW5ndGggaC5kYXRhKSBpblxuICBsZXQgc2VlZCA9XG4gICAgaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKERvbWFpbi5ETFMuZ2V0IHBybmdfa2V5KVxuICAgIGVsc2UgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDQgdGhlbiBoLnNlZWRcbiAgICBlbHNlIDAgaW5cbiAgbGV0IGgnID0ge1xuICAgIHNpemUgPSBoLnNpemU7XG4gICAgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eTtcbiAgICBzZWVkID0gc2VlZDtcbiAgICBpbml0aWFsX3NpemUgPSBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNCB0aGVuIGguaW5pdGlhbF9zaXplIGVsc2Ugc1xuICB9IGluXG4gIGluc2VydF9hbGxfYnVja2V0cyAoa2V5X2luZGV4IGgnKSBmYWxzZSBoLmRhdGEgaCcuZGF0YTtcbiAgaCdcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfY29tcGFyZSIsImNhbWxfaGFzaCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9zeXNfZ2V0ZW52IiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJjYW1sX2NhbGwzIiwiYTIiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYl9TeXMiLCJTdGRsaWIiLCJTdGRsaWJfQXRvbWljIiwiU3RkbGliX0RvbWFpbiIsIlN0ZGxpYl9SYW5kb20iLCJTdGRsaWJfU2VxIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9TdHJpbmciLCJvbmdvaW5nX3RyYXZlcnNhbCIsImgiLCJmbGlwX29uZ29pbmdfdHJhdmVyc2FsIiwicGFyYW1zIiwiZXhuIiwicmFuZG9taXplZF9kZWZhdWx0IiwicmFuZG9taXplZCIsInJhbmRvbWl6ZSIsInBhcmFtIiwiaXNfcmFuZG9taXplZCIsInBybmdfa2V5IiwicG93ZXJfMl9hYm92ZSIsIngiLCJuIiwiY3JlYXRlIiwib3B0IiwiaW5pdGlhbF9zaXplIiwicmFuZG9tIiwicyIsInNlZWQiLCJjbGVhciIsInJlc2V0IiwibGVuIiwiY29weV9idWNrZXRsaXN0Iiwia2V5IiwiZGF0YSIsIm5leHQiLCJwcmVjIiwiY29weSIsImxlbmd0aCIsImluc2VydF9hbGxfYnVja2V0cyIsImluZGV4ZnVuIiwiaW5wbGFjZSIsIm9kYXRhIiwibmRhdGEiLCJuc2l6ZSIsIm5kYXRhX3RhaWwiLCJpIiwiY2VsbCIsIm5pZHgiLCJtYXRjaCIsInJlc2l6ZSIsIm9zaXplIiwiaXRlciIsIm9sZF90cmF2IiwiZCIsImZpbHRlcl9tYXBfaW5wbGFjZSIsInNsb3QiLCJmb2xkIiwiaW5pdCIsImFjY3UiLCJiIiwiYnVja2V0X2xlbmd0aCIsInN0YXRzIiwibWJsIiwibSIsImhpc3RvIiwibCIsInRvX3NlcSIsInRibCIsInRibF9kYXRhIiwiYXV4IiwiYnVjayIsInRvX3NlcV9rZXlzIiwidG9fc2VxX3ZhbHVlcyIsIk1ha2VTZWVkZWQiLCJIIiwia2V5X2luZGV4IiwiYWRkIiwiYnVja2V0IiwicmVtb3ZlIiwiayIsImZpbmQiLCJrMSIsImQxIiwibmV4dDEiLCJrMiIsImQyIiwibmV4dDIiLCJrMyIsImQzIiwibmV4dDMiLCJmaW5kX29wdCIsImZpbmRfYWxsIiwiYmxvY2siLCJkc3QiLCJvZmZzZXQiLCJyZXBsYWNlIiwibWVtIiwiYWRkX3NlcSIsInYiLCJyZXBsYWNlX3NlcSIsIm9mX3NlcSIsIk1ha2UiLCJlcXVhbCIsInNlZWRlZF9oYXNoIiwiaW5jbHVkZSIsInN6IiwiaGFzaCIsImhhc2hfcGFyYW0iLCJuMSIsIm4yIiwicmVidWlsZCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFD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QUFBO0FBQUEsU0FFUDtBQUFBLEtBQUFsQixNQUVTO0FBQUEsSUFJVDtBQUFBLGtCQUFtQjtBQUFBLElBQW1DO0FBQUEsR0FDcEQ7QUFBQSxHQTlqQnlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEM0Q3RCIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjI0NzIyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2NhbGxiYWNrLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBSZWdpc3RlcmluZyBPQ2FtbCB2YWx1ZXMgd2l0aCB0aGUgQyBydW50aW1lIGZvciBsYXRlciBjYWxsYmFja3MgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gT2JqLnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgcmVnaXN0ZXIgbmFtZSB2ID1cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSAoT2JqLnJlcHIgdilcblxubGV0IHJlZ2lzdGVyX2V4Y2VwdGlvbiBuYW1lIChleG4gOiBleG4pID1cbiAgbGV0IGV4biA9IE9iai5yZXByIGV4biBpblxuICBsZXQgc2xvdCA9IGlmIE9iai50YWcgZXhuID0gT2JqLm9iamVjdF90YWcgdGhlbiBleG4gZWxzZSBPYmouZmllbGQgZXhuIDAgaW5cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSBzbG90XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWUiLCJTdGRsaWJfT2JqIiwicmVnaXN0ZXJfZXhjZXB0aW9uIiwibmFtZSIsImV4biIsInNsb3QiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsNEJBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsWUFBQUMsbUJBQUFDLE1BQUFDO0FBQUFBO0FBQUFBLEtBQUEsSUN5QmdCO0FBQUEsS0FBQUMsT0FBQTtBQUFBLElBQ2QsNENBQThCO0FBQUE7QUFBQSxHRDFCaEMiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyNDc0NSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfdHlwZXMubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogQ29yZSB0eXBlcyBmb3IgdGhlIFNYIGxhbmd1YWdlLlxuXG4gICAgVGhlIFt2YWx1ZV0gc3VtIHR5cGUgcmVwcmVzZW50cyBldmVyeSBwb3NzaWJsZSBTWCBydW50aW1lIHZhbHVlLlxuICAgIE9DYW1sJ3MgYWxnZWJyYWljIHR5cGVzIG1ha2UgdGhlIENFSyBtYWNoaW5lJ3MgZnJhbWUgZGlzcGF0Y2ggYVxuICAgIHBhdHRlcm4gbWF0Y2gg4oCUIGV4YWN0bHkgd2hhdCB0aGUgc3BlYyBkZXNjcmliZXMuICopXG5cbigqKiB7MSBFbnZpcm9ubWVudH0gKilcblxuKCoqIExleGljYWwgc2NvcGUgY2hhaW4uICBFYWNoIGZyYW1lIGhvbGRzIGEgbXV0YWJsZSBiaW5kaW5nIHRhYmxlIGFuZFxuICAgIGFuIG9wdGlvbmFsIHBhcmVudCBsaW5rIGZvciBzY29wZS1jaGFpbiBsb29rdXAuICopXG50eXBlIGVudiA9IHtcbiAgYmluZGluZ3MgOiAoc3RyaW5nLCB2YWx1ZSkgSGFzaHRibC50O1xuICBwYXJlbnQgICA6IGVudiBvcHRpb247XG59XG5cbigqKiB7MSBWYWx1ZXN9ICopXG5cbmFuZCB2YWx1ZSA9XG4gIHwgTmlsXG4gIHwgQm9vbCAgIG9mIGJvb2xcbiAgfCBOdW1iZXIgb2YgZmxvYXRcbiAgfCBTdHJpbmcgb2Ygc3RyaW5nXG4gIHwgU3ltYm9sIG9mIHN0cmluZ1xuICB8IEtleXdvcmQgb2Ygc3RyaW5nXG4gIHwgTGlzdCAgIG9mIHZhbHVlIGxpc3RcbiAgfCBEaWN0ICAgb2YgZGljdFxuICB8IExhbWJkYSBvZiBsYW1iZGFcbiAgfCBDb21wb25lbnQgb2YgY29tcG9uZW50XG4gIHwgSXNsYW5kIG9mIGlzbGFuZFxuICB8IE1hY3JvICBvZiBtYWNyb1xuICB8IFRodW5rICBvZiB2YWx1ZSAqIGVudlxuICB8IENvbnRpbnVhdGlvbiBvZiAodmFsdWUgLT4gdmFsdWUpICogZGljdCBvcHRpb25cbiAgfCBOYXRpdmVGbiBvZiBzdHJpbmcgKiAodmFsdWUgbGlzdCAtPiB2YWx1ZSlcbiAgfCBTaWduYWwgb2Ygc2lnbmFsXG4gIHwgUmF3SFRNTCBvZiBzdHJpbmdcbiAgfCBTcHJlYWQgb2YgKHN0cmluZyAqIHZhbHVlKSBsaXN0XG4gIHwgU3hFeHByIG9mIHN0cmluZyAgKCoqIE9wYXF1ZSBTWCB3aXJlLWZvcm1hdCBzdHJpbmcg4oCUIGFzZXIgb3V0cHV0LiAqKVxuICB8IEVudiBvZiBlbnYgICgqKiBGaXJzdC1jbGFzcyBlbnZpcm9ubWVudCDigJQgdXNlZCBieSBDRUsgbWFjaGluZSBzdGF0ZSBkaWN0cy4gKilcbiAgfCBMaXN0UmVmIG9mIHZhbHVlIGxpc3QgcmVmICAoKiogTXV0YWJsZSBsaXN0IOKAlCBKUy1zdHlsZSBhcnJheSBmb3IgYXBwZW5kISAqKVxuICB8IENla1N0YXRlIG9mIGNla19zdGF0ZSAgKCoqIE9wdGltaXplZCBDRUsgbWFjaGluZSBzdGF0ZSDigJQgYXZvaWRzIERpY3QgYWxsb2NhdGlvbi4gKilcbiAgfCBDZWtGcmFtZSBvZiBjZWtfZnJhbWUgICgqKiBPcHRpbWl6ZWQgQ0VLIGNvbnRpbnVhdGlvbiBmcmFtZS4gKilcbiAgfCBWbUNsb3N1cmUgb2Ygdm1fY2xvc3VyZSAgKCoqIFZNLWNvbXBpbGVkIGNsb3N1cmUg4oCUIGNhbGxhYmxlIHdpdGhpbiB0aGUgVk0gd2l0aG91dCBhbGxvY2F0aW5nIGEgbmV3IFZNLiAqKVxuXG4oKiogQ0VLIG1hY2hpbmUgc3RhdGUg4oCUIHJlY29yZCBpbnN0ZWFkIG9mIERpY3QgZm9yIHBlcmZvcm1hbmNlLlxuICAgIDUgZmllbGRzIMOXIDU1SyBzdGVwcy9zZWMgPSAyNzVLIEhhc2h0YmwgYWxsb2NhdGlvbnMvc2VjIGVsaW1pbmF0ZWQuICopXG5hbmQgY2VrX3N0YXRlID0ge1xuICBjc19jb250cm9sIDogdmFsdWU7XG4gIGNzX2VudiAgICAgOiB2YWx1ZTtcbiAgY3Nfa29udCAgICA6IHZhbHVlO1xuICBjc19waGFzZSAgIDogc3RyaW5nO1xuICBjc192YWx1ZSAgIDogdmFsdWU7XG59XG5cbigqKiBDRUsgY29udGludWF0aW9uIGZyYW1lIOKAlCB0YWdnZWQgcmVjb3JkIGNvdmVyaW5nIGFsbCAyOSBmcmFtZSB0eXBlcy5cbiAgICBGaWVsZHMgYXJlIG5hbWVkIGdlbmVyaWNhbGx5OyBub3QgYWxsIGFyZSB1c2VkIGJ5IGV2ZXJ5IGZyYW1lIHR5cGUuXG4gICAgRWxpbWluYXRlcyB+MTAwSyBIYXNodGJsIGFsbG9jYXRpb25zIHBlciBwYWdlIHJlbmRlci4gKilcbmFuZCBjZWtfZnJhbWUgPSB7XG4gIGNmX3R5cGUgICAgICA6IHN0cmluZzsgICAgICAgICgqIGZyYW1lIHR5cGUgdGFnOiBcImlmXCIsIFwibGV0XCIsIFwiY2FsbFwiLCBldGMuICopXG4gIGNmX2VudiAgICAgICA6IHZhbHVlOyAgICAgICAgICgqIGVudmlyb25tZW50IOKAlCBldmVyeSBmcmFtZSBoYXMgdGhpcyAqKVxuICBjZl9uYW1lICAgICAgOiB2YWx1ZTsgICAgICAgICAoKiBsZXQvZGVmaW5lL3NldC9zY29wZTogYmluZGluZyBuYW1lICopXG4gIGNmX2JvZHkgICAgICA6IHZhbHVlOyAgICAgICAgICgqIHdoZW4vbGV0OiBib2R5IGV4cHIgKilcbiAgY2ZfcmVtYWluaW5nIDogdmFsdWU7ICAgICAgICAgKCogYmVnaW4vY29uZC9tYXAvZXRjOiByZW1haW5pbmcgZXhwcnMgKilcbiAgY2ZfZiAgICAgICAgIDogdmFsdWU7ICAgICAgICAgKCogY2FsbC9tYXAvZmlsdGVyL2V0YzogZnVuY3Rpb24gKilcbiAgY2ZfYXJncyAgICAgIDogdmFsdWU7ICAgICAgICAgKCogY2FsbDogcmF3IGFyZ3M7IGFyZzogZXZhbGVkIGFyZ3MgKilcbiAgY2ZfcmVzdWx0cyAgIDogdmFsdWU7ICAgICAgICAgKCogbWFwL2ZpbHRlci9kaWN0OiBhY2N1bXVsYXRlZCByZXN1bHRzICopXG4gIGNmX2V4dHJhICAgICA6IHZhbHVlOyAgICAgICAgICgqIGV4dHJhIGZpZWxkOiBzY2hlbWUsIGluZGV4ZWQsIHZhbHVlLCBwaGFzZSwgZXRjLiAqKVxuICBjZl9leHRyYTIgICAgOiB2YWx1ZTsgICAgICAgICAoKiBzZWNvbmQgZXh0cmE6IGVtaXR0ZWQsIGV0Yy4gKilcbn1cblxuKCoqIE11dGFibGUgc3RyaW5nLWtleWVkIHRhYmxlIChTWCBkaWN0cyBzdXBwb3J0IFtkaWN0LXNldCFdKS4gKilcbmFuZCBkaWN0ID0gKHN0cmluZywgdmFsdWUpIEhhc2h0YmwudFxuXG5hbmQgbGFtYmRhID0ge1xuICBsX3BhcmFtcyAgOiBzdHJpbmcgbGlzdDtcbiAgbF9ib2R5ICAgIDogdmFsdWU7XG4gIGxfY2xvc3VyZSA6IGVudjtcbiAgbXV0YWJsZSBsX25hbWUgOiBzdHJpbmcgb3B0aW9uO1xuICBtdXRhYmxlIGxfY29tcGlsZWQgOiB2bV9jbG9zdXJlIG9wdGlvbjsgICgqKiBMYXp5IEpJVCBjYWNoZSAqKVxufVxuXG5hbmQgY29tcG9uZW50ID0ge1xuICBjX25hbWUgICAgICAgICA6IHN0cmluZztcbiAgY19wYXJhbXMgICAgICAgOiBzdHJpbmcgbGlzdDtcbiAgY19oYXNfY2hpbGRyZW4gOiBib29sO1xuICBjX2JvZHkgICAgICAgICA6IHZhbHVlO1xuICBjX2Nsb3N1cmUgICAgICA6IGVudjtcbiAgY19hZmZpbml0eSAgICAgOiBzdHJpbmc7ICAoKiogXCJhdXRvXCIgfCBcImNsaWVudFwiIHwgXCJzZXJ2ZXJcIiAqKVxuICBtdXRhYmxlIGNfY29tcGlsZWQgOiB2bV9jbG9zdXJlIG9wdGlvbjsgICgqKiBMYXp5IEpJVCBjYWNoZSAqKVxufVxuXG5hbmQgaXNsYW5kID0ge1xuICBpX25hbWUgICAgICAgICA6IHN0cmluZztcbiAgaV9wYXJhbXMgICAgICAgOiBzdHJpbmcgbGlzdDtcbiAgaV9oYXNfY2hpbGRyZW4gOiBib29sO1xuICBpX2JvZHkgICAgICAgICA6IHZhbHVlO1xuICBpX2Nsb3N1cmUgICAgICA6IGVudjtcbn1cblxuYW5kIG1hY3JvID0ge1xuICBtX3BhcmFtcyAgICAgOiBzdHJpbmcgbGlzdDtcbiAgbV9yZXN0X3BhcmFtIDogc3RyaW5nIG9wdGlvbjtcbiAgbV9ib2R5ICAgICAgIDogdmFsdWU7XG4gIG1fY2xvc3VyZSAgICA6IGVudjtcbiAgbV9uYW1lICAgICAgIDogc3RyaW5nIG9wdGlvbjtcbn1cblxuYW5kIHNpZ25hbCA9IHtcbiAgbXV0YWJsZSBzX3ZhbHVlICAgICAgIDogdmFsdWU7XG4gIG11dGFibGUgc19zdWJzY3JpYmVycyA6ICh1bml0IC0+IHVuaXQpIGxpc3Q7XG4gIG11dGFibGUgc19kZXBzICAgICAgICA6IHNpZ25hbCBsaXN0O1xufVxuXG4oKiogezEgQnl0ZWNvZGUgVk0gdHlwZXN9XG5cbiAgICBEZWZpbmVkIGhlcmUgKG5vdCBpbiBzeF92bS5tbCkgYmVjYXVzZSBbdm1fY29kZS5jb25zdGFudHNdIHJlZmVyZW5jZXNcbiAgICBbdmFsdWVdIGFuZCBbbGFtYmRhLmxfY29tcGlsZWRdIHJlZmVyZW5jZXMgW3ZtX2Nsb3N1cmVdIOKAlCBtdXR1YWxcbiAgICByZWN1cnNpb24gcmVxdWlyZXMgYWxsIHR5cGVzIGluIG9uZSBbYW5kXSBjaGFpbi4gKilcblxuKCoqIENvbXBpbGVkIGZ1bmN0aW9uIGJvZHkg4oCUIGJ5dGVjb2RlICsgY29uc3RhbnQgcG9vbC4gKilcbmFuZCB2bV9jb2RlID0ge1xuICB2Y19hcml0eSAgICAgOiBpbnQ7XG4gIHZjX2xvY2FscyAgICA6IGludDtcbiAgdmNfYnl0ZWNvZGUgIDogaW50IGFycmF5O1xuICB2Y19jb25zdGFudHMgOiB2YWx1ZSBhcnJheTtcbn1cblxuKCoqIFVwdmFsdWUgY2VsbCDigJQgc2hhcmVkIG11dGFibGUgcmVmZXJlbmNlIHRvIGEgY2FwdHVyZWQgdmFyaWFibGUuICopXG5hbmQgdm1fdXB2YWx1ZV9jZWxsID0ge1xuICBtdXRhYmxlIHV2X3ZhbHVlIDogdmFsdWU7XG59XG5cbigqKiBDbG9zdXJlIOKAlCBjb21waWxlZCBjb2RlICsgY2FwdHVyZWQgdXB2YWx1ZXMgKyBsaXZlIGVudiByZWZlcmVuY2UuICopXG5hbmQgdm1fY2xvc3VyZSA9IHtcbiAgdm1fY29kZSAgICAgOiB2bV9jb2RlO1xuICB2bV91cHZhbHVlcyA6IHZtX3VwdmFsdWVfY2VsbCBhcnJheTtcbiAgdm1fbmFtZSAgICAgOiBzdHJpbmcgb3B0aW9uO1xuICB2bV9lbnZfcmVmICA6IChzdHJpbmcsIHZhbHVlKSBIYXNodGJsLnQ7XG4gIHZtX2Nsb3N1cmVfZW52IDogZW52IG9wdGlvbjsgICgqKiBPcmlnaW5hbCBjbG9zdXJlIGVudiBmb3IgaW5uZXIgZnVuY3Rpb25zICopXG59XG5cblxuKCoqIHsxIEZvcndhcmQgcmVmIGZvciBjYWxsaW5nIFZNIGNsb3N1cmVzIGZyb20gb3V0c2lkZSB0aGUgVk19ICopXG5cbmxldCBfdm1fY2FsbF9jbG9zdXJlX3JlZiA6ICh2bV9jbG9zdXJlIC0+IHZhbHVlIGxpc3QgLT4gdmFsdWUpIHJlZiA9XG4gIHJlZiAoZnVuIF8gXyAtPiByYWlzZSAoRmFpbHVyZSBcIlZNIGNhbGxfY2xvc3VyZSBub3QgaW5pdGlhbGl6ZWRcIikpXG5cblxuKCoqIHsxIEVycm9yc30gKilcblxuZXhjZXB0aW9uIEV2YWxfZXJyb3Igb2Ygc3RyaW5nXG5leGNlcHRpb24gUGFyc2VfZXJyb3Igb2Ygc3RyaW5nXG5cblxuKCoqIHsxIEVudmlyb25tZW50IG9wZXJhdGlvbnN9ICopXG5cbmxldCBtYWtlX2VudiAoKSA9XG4gIHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gTm9uZSB9XG5cbmxldCBlbnZfZXh0ZW5kIHBhcmVudCA9XG4gIHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gU29tZSBwYXJlbnQgfVxuXG5sZXQgZW52X2JpbmQgZW52IG5hbWUgdiA9XG4gIEhhc2h0YmwucmVwbGFjZSBlbnYuYmluZGluZ3MgbmFtZSB2OyBOaWxcblxubGV0IHJlYyBlbnZfaGFzIGVudiBuYW1lID1cbiAgSGFzaHRibC5tZW0gZW52LmJpbmRpbmdzIG5hbWUgfHxcbiAgbWF0Y2ggZW52LnBhcmVudCB3aXRoIFNvbWUgcCAtPiBlbnZfaGFzIHAgbmFtZSB8IE5vbmUgLT4gZmFsc2VcblxubGV0IHJlYyBlbnZfZ2V0IGVudiBuYW1lID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBlbnYuYmluZGluZ3MgbmFtZSB3aXRoXG4gIHwgU29tZSB2IC0+IHZcbiAgfCBOb25lIC0+XG4gICAgbWF0Y2ggZW52LnBhcmVudCB3aXRoXG4gICAgfCBTb21lIHAgLT4gZW52X2dldCBwIG5hbWVcbiAgICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5kZWZpbmVkIHN5bWJvbDogXCIgXiBuYW1lKSlcblxubGV0IHJlYyBlbnZfc2V0IGVudiBuYW1lIHYgPVxuICBpZiBIYXNodGJsLm1lbSBlbnYuYmluZGluZ3MgbmFtZSB0aGVuXG4gICAgKEhhc2h0YmwucmVwbGFjZSBlbnYuYmluZGluZ3MgbmFtZSB2OyBOaWwpXG4gIGVsc2VcbiAgICBtYXRjaCBlbnYucGFyZW50IHdpdGhcbiAgICB8IFNvbWUgcCAtPiBlbnZfc2V0IHAgbmFtZSB2XG4gICAgfCBOb25lIC0+IEhhc2h0YmwucmVwbGFjZSBlbnYuYmluZGluZ3MgbmFtZSB2OyBOaWxcblxubGV0IGVudl9tZXJnZSBiYXNlIG92ZXJsYXkgPVxuICAoKiBJZiBiYXNlIGFuZCBvdmVybGF5IGFyZSB0aGUgc2FtZSBlbnYgKHBoeXNpY2FsIGVxdWFsaXR5KSBvciBvdmVybGF5XG4gICAgIGlzIGEgZGVzY2VuZGFudCBvZiBiYXNlLCBqdXN0IGV4dGVuZCBiYXNlIOKAlCBubyBjb3B5aW5nIG5lZWRlZC5cbiAgICAgVGhpcyBwcmV2ZW50cyBzZXQhIGluc2lkZSBsYW1iZGFzIGZyb20gbW9kaWZ5aW5nIHNoYWRvdyBjb3BpZXMuICopXG4gIGlmIGJhc2UgPT0gb3ZlcmxheSB0aGVuXG4gICAgeyBiaW5kaW5ncyA9IEhhc2h0YmwuY3JlYXRlIDE2OyBwYXJlbnQgPSBTb21lIGJhc2UgfVxuICBlbHNlIGJlZ2luXG4gICAgKCogQ2hlY2sgaWYgb3ZlcmxheSBpcyBhIGRlc2NlbmRhbnQgb2YgYmFzZSAqKVxuICAgIGxldCByZWMgaXNfZGVzY2VuZGFudCBlIGRlcHRoID1cbiAgICAgIGlmIGRlcHRoID4gMTAwIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgZSA9PSBiYXNlIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBtYXRjaCBlLnBhcmVudCB3aXRoIFNvbWUgcCAtPiBpc19kZXNjZW5kYW50IHAgKGRlcHRoICsgMSkgfCBOb25lIC0+IGZhbHNlXG4gICAgaW5cbiAgICBpZiBpc19kZXNjZW5kYW50IG92ZXJsYXkgMCB0aGVuXG4gICAgICB7IGJpbmRpbmdzID0gSGFzaHRibC5jcmVhdGUgMTY7IHBhcmVudCA9IFNvbWUgYmFzZSB9XG4gICAgZWxzZSBiZWdpblxuICAgICAgKCogR2VuZXJhbCBjYXNlOiBleHRlbmQgYmFzZSwgY29weSBPTkxZIG92ZXJsYXkgYmluZGluZ3MgdGhhdCBkb24ndFxuICAgICAgICAgZXhpc3QgYW55d2hlcmUgaW4gdGhlIGJhc2UgY2hhaW4gKGF2b2lkcyBzaGFkb3dpbmcgY2xvc3VyZSBiaW5kaW5ncykuICopXG4gICAgICBsZXQgZSA9IHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gU29tZSBiYXNlIH0gaW5cbiAgICAgIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPlxuICAgICAgICBpZiBub3QgKGVudl9oYXMgYmFzZSBrKSB0aGVuIEhhc2h0YmwucmVwbGFjZSBlLmJpbmRpbmdzIGsgdlxuICAgICAgKSBvdmVybGF5LmJpbmRpbmdzO1xuICAgICAgZVxuICAgIGVuZFxuICBlbmRcblxuXG4oKiogezEgVmFsdWUgZXh0cmFjdGlvbiBoZWxwZXJzfSAqKVxuXG5sZXQgdmFsdWVfdG9fc3RyaW5nID0gZnVuY3Rpb25cbiAgfCBTdHJpbmcgcyAtPiBzIHwgU3ltYm9sIHMgLT4gcyB8IEtleXdvcmQgayAtPiBrXG4gIHwgTnVtYmVyIG4gLT4gaWYgRmxvYXQuaXNfaW50ZWdlciBuIHRoZW4gc3RyaW5nX29mX2ludCAoaW50X29mX2Zsb2F0IG4pIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCIgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE5pbCAtPiBcIlwiIHwgXyAtPiBcIjx2YWx1ZT5cIlxuXG5sZXQgdmFsdWVfdG9fc3RyaW5nX2xpc3QgPSBmdW5jdGlvblxuICB8IExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9IC0+IExpc3QubWFwIHZhbHVlX3RvX3N0cmluZyBpdGVtc1xuICB8IF8gLT4gW11cblxubGV0IHZhbHVlX3RvX2Jvb2wgPSBmdW5jdGlvblxuICB8IEJvb2wgYiAtPiBiIHwgTmlsIC0+IGZhbHNlIHwgXyAtPiB0cnVlXG5cbmxldCB2YWx1ZV90b19zdHJpbmdfb3B0ID0gZnVuY3Rpb25cbiAgfCBTdHJpbmcgcyAtPiBTb21lIHMgfCBTeW1ib2wgcyAtPiBTb21lIHMgfCBOaWwgLT4gTm9uZSB8IF8gLT4gTm9uZVxuXG5cbigqKiB7MSBDb25zdHJ1Y3RvcnMg4oCUIGFjY2VwdCBbdmFsdWVdIGFyZ3MgZnJvbSB0cmFuc3BpbGVkIGNvZGV9ICopXG5cbmxldCB1bndyYXBfZW52X3ZhbCA9IGZ1bmN0aW9uXG4gIHwgRW52IGUgLT4gZVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlX2xhbWJkYTogZXhwZWN0ZWQgZW52IGZvciBjbG9zdXJlXCIpXG5cbmxldCBtYWtlX2xhbWJkYSBwYXJhbXMgYm9keSBjbG9zdXJlID1cbiAgbGV0IHBzID0gbWF0Y2ggcGFyYW1zIHdpdGhcbiAgICB8IExpc3QgaXRlbXMgLT4gTGlzdC5tYXAgdmFsdWVfdG9fc3RyaW5nIGl0ZW1zXG4gICAgfCBfIC0+IHZhbHVlX3RvX3N0cmluZ19saXN0IHBhcmFtc1xuICBpblxuICBMYW1iZGEgeyBsX3BhcmFtcyA9IHBzOyBsX2JvZHkgPSBib2R5OyBsX2Nsb3N1cmUgPSB1bndyYXBfZW52X3ZhbCBjbG9zdXJlOyBsX25hbWUgPSBOb25lOyBsX2NvbXBpbGVkID0gTm9uZSB9XG5cbmxldCBtYWtlX2NvbXBvbmVudCBuYW1lIHBhcmFtcyBoYXNfY2hpbGRyZW4gYm9keSBjbG9zdXJlIGFmZmluaXR5ID1cbiAgbGV0IG4gPSB2YWx1ZV90b19zdHJpbmcgbmFtZSBpblxuICBsZXQgcHMgPSB2YWx1ZV90b19zdHJpbmdfbGlzdCBwYXJhbXMgaW5cbiAgbGV0IGhjID0gdmFsdWVfdG9fYm9vbCBoYXNfY2hpbGRyZW4gaW5cbiAgbGV0IGFmZiA9IG1hdGNoIGFmZmluaXR5IHdpdGggU3RyaW5nIHMgLT4gcyB8IF8gLT4gXCJhdXRvXCIgaW5cbiAgQ29tcG9uZW50IHtcbiAgICBjX25hbWUgPSBuOyBjX3BhcmFtcyA9IHBzOyBjX2hhc19jaGlsZHJlbiA9IGhjO1xuICAgIGNfYm9keSA9IGJvZHk7IGNfY2xvc3VyZSA9IHVud3JhcF9lbnZfdmFsIGNsb3N1cmU7IGNfYWZmaW5pdHkgPSBhZmY7XG4gICAgY19jb21waWxlZCA9IE5vbmU7XG4gIH1cblxubGV0IG1ha2VfaXNsYW5kIG5hbWUgcGFyYW1zIGhhc19jaGlsZHJlbiBib2R5IGNsb3N1cmUgPVxuICBsZXQgbiA9IHZhbHVlX3RvX3N0cmluZyBuYW1lIGluXG4gIGxldCBwcyA9IHZhbHVlX3RvX3N0cmluZ19saXN0IHBhcmFtcyBpblxuICBsZXQgaGMgPSB2YWx1ZV90b19ib29sIGhhc19jaGlsZHJlbiBpblxuICBJc2xhbmQge1xuICAgIGlfbmFtZSA9IG47IGlfcGFyYW1zID0gcHM7IGlfaGFzX2NoaWxkcmVuID0gaGM7XG4gICAgaV9ib2R5ID0gYm9keTsgaV9jbG9zdXJlID0gdW53cmFwX2Vudl92YWwgY2xvc3VyZTtcbiAgfVxuXG5sZXQgbWFrZV9tYWNybyBwYXJhbXMgcmVzdF9wYXJhbSBib2R5IGNsb3N1cmUgbmFtZSA9XG4gIGxldCBwcyA9IHZhbHVlX3RvX3N0cmluZ19saXN0IHBhcmFtcyBpblxuICBsZXQgcnAgPSB2YWx1ZV90b19zdHJpbmdfb3B0IHJlc3RfcGFyYW0gaW5cbiAgbGV0IG4gPSB2YWx1ZV90b19zdHJpbmdfb3B0IG5hbWUgaW5cbiAgTWFjcm8ge1xuICAgIG1fcGFyYW1zID0gcHM7IG1fcmVzdF9wYXJhbSA9IHJwO1xuICAgIG1fYm9keSA9IGJvZHk7IG1fY2xvc3VyZSA9IHVud3JhcF9lbnZfdmFsIGNsb3N1cmU7IG1fbmFtZSA9IG47XG4gIH1cblxubGV0IG1ha2VfdGh1bmsgZXhwciBlbnYgPSBUaHVuayAoZXhwciwgdW53cmFwX2Vudl92YWwgZW52KVxuXG5sZXQgbWFrZV9zeW1ib2wgbmFtZSA9IFN5bWJvbCAodmFsdWVfdG9fc3RyaW5nIG5hbWUpXG5sZXQgbWFrZV9rZXl3b3JkIG5hbWUgPSBLZXl3b3JkICh2YWx1ZV90b19zdHJpbmcgbmFtZSlcblxuXG4oKiogezEgVHlwZSBpbnNwZWN0aW9ufSAqKVxuXG5sZXQgdHlwZV9vZiA9IGZ1bmN0aW9uXG4gIHwgTmlsICAgICAgICAgICAgLT4gXCJuaWxcIlxuICB8IEJvb2wgXyAgICAgICAgIC0+IFwiYm9vbGVhblwiXG4gIHwgTnVtYmVyIF8gICAgICAgLT4gXCJudW1iZXJcIlxuICB8IFN0cmluZyBfICAgICAgIC0+IFwic3RyaW5nXCJcbiAgfCBTeW1ib2wgXyAgICAgICAtPiBcInN5bWJvbFwiXG4gIHwgS2V5d29yZCBfICAgICAgLT4gXCJrZXl3b3JkXCJcbiAgfCBMaXN0IF8gfCBMaXN0UmVmIF8gLT4gXCJsaXN0XCJcbiAgfCBEaWN0IF8gICAgICAgICAtPiBcImRpY3RcIlxuICB8IExhbWJkYSBfICAgICAgIC0+IFwibGFtYmRhXCJcbiAgfCBDb21wb25lbnQgXyAgICAtPiBcImNvbXBvbmVudFwiXG4gIHwgSXNsYW5kIF8gICAgICAgLT4gXCJpc2xhbmRcIlxuICB8IE1hY3JvIF8gICAgICAgIC0+IFwibWFjcm9cIlxuICB8IFRodW5rIF8gICAgICAgIC0+IFwidGh1bmtcIlxuICB8IENvbnRpbnVhdGlvbiAoXywgXykgLT4gXCJjb250aW51YXRpb25cIlxuICB8IE5hdGl2ZUZuIF8gICAgIC0+IFwiZnVuY3Rpb25cIlxuICB8IFNpZ25hbCBfICAgICAgIC0+IFwic2lnbmFsXCJcbiAgfCBSYXdIVE1MIF8gICAgICAtPiBcInJhdy1odG1sXCJcbiAgfCBTcHJlYWQgXyAgICAgICAtPiBcInNwcmVhZFwiXG4gIHwgU3hFeHByIF8gICAgICAgLT4gXCJzeC1leHByXCJcbiAgfCBFbnYgXyAgICAgICAgICAtPiBcImVudlwiXG4gIHwgQ2VrU3RhdGUgXyAgICAgLT4gXCJkaWN0XCIgICgqIENFSyBzdGF0ZSBiZWhhdmVzIGFzIGEgZGljdCBmb3IgdHlwZSBjaGVja3MgKilcbiAgfCBDZWtGcmFtZSBfICAgICAtPiBcImRpY3RcIlxuICB8IFZtQ2xvc3VyZSBfICAgIC0+IFwiZnVuY3Rpb25cIlxuXG5sZXQgaXNfbmlsID0gZnVuY3Rpb24gTmlsIC0+IHRydWUgfCBfIC0+IGZhbHNlXG5sZXQgaXNfbGFtYmRhID0gZnVuY3Rpb24gTGFtYmRhIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19jb21wb25lbnQgPSBmdW5jdGlvbiBDb21wb25lbnQgXyAtPiB0cnVlIHwgXyAtPiBmYWxzZVxubGV0IGlzX2lzbGFuZCA9IGZ1bmN0aW9uIElzbGFuZCBfIC0+IHRydWUgfCBfIC0+IGZhbHNlXG5sZXQgaXNfbWFjcm8gPSBmdW5jdGlvbiBNYWNybyBfIC0+IHRydWUgfCBfIC0+IGZhbHNlXG5sZXQgaXNfdGh1bmsgPSBmdW5jdGlvbiBUaHVuayBfIC0+IHRydWUgfCBfIC0+IGZhbHNlXG5sZXQgaXNfc2lnbmFsID0gZnVuY3Rpb25cbiAgfCBTaWduYWwgXyAtPiB0cnVlXG4gIHwgRGljdCBkIC0+IEhhc2h0YmwubWVtIGQgXCJfX3NpZ25hbFwiXG4gIHwgXyAtPiBmYWxzZVxuXG5sZXQgaXNfY2FsbGFibGUgPSBmdW5jdGlvblxuICB8IExhbWJkYSBfIHwgTmF0aXZlRm4gXyB8IENvbnRpbnVhdGlvbiAoXywgXykgfCBWbUNsb3N1cmUgXyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5cbigqKiB7MSBUcnV0aGluZXNzfSAqKVxuXG4oKiogU1ggdHJ1dGhpbmVzczogZXZlcnl0aGluZyBpcyB0cnV0aHkgZXhjZXB0IFtOaWxdIGFuZCBbQm9vbCBmYWxzZV0uICopXG5sZXQgc3hfdHJ1dGh5ID0gZnVuY3Rpb25cbiAgfCBOaWwgfCBCb29sIGZhbHNlIC0+IGZhbHNlXG4gIHwgXyAtPiB0cnVlXG5cblxuKCoqIHsxIEFjY2Vzc29yc30gKilcblxubGV0IHN5bWJvbF9uYW1lID0gZnVuY3Rpb25cbiAgfCBTeW1ib2wgcyAtPiBTdHJpbmcgc1xuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgc3ltYm9sLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQga2V5d29yZF9uYW1lID0gZnVuY3Rpb25cbiAgfCBLZXl3b3JkIGsgLT4gU3RyaW5nIGtcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGtleXdvcmQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBsYW1iZGFfcGFyYW1zID0gZnVuY3Rpb25cbiAgfCBMYW1iZGEgbCAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGwubF9wYXJhbXMpXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBsYW1iZGEsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBsYW1iZGFfYm9keSA9IGZ1bmN0aW9uXG4gIHwgTGFtYmRhIGwgLT4gbC5sX2JvZHlcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxhbWJkYSwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGxhbWJkYV9jbG9zdXJlID0gZnVuY3Rpb25cbiAgfCBMYW1iZGEgbCAtPiBFbnYgbC5sX2Nsb3N1cmVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxhbWJkYSwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGxhbWJkYV9uYW1lID0gZnVuY3Rpb25cbiAgfCBMYW1iZGEgbCAtPiAobWF0Y2ggbC5sX25hbWUgd2l0aCBTb21lIG4gLT4gU3RyaW5nIG4gfCBOb25lIC0+IE5pbClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxhbWJkYSwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IHNldF9sYW1iZGFfbmFtZSBsIG4gPSBtYXRjaCBsIHdpdGhcbiAgfCBMYW1iZGEgbCAtPiBsLmxfbmFtZSA8LSBTb21lIG47IE5pbFxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzZXQtbGFtYmRhLW5hbWUhOiBub3QgYSBsYW1iZGFcIilcblxubGV0IGNvbXBvbmVudF9uYW1lID0gZnVuY3Rpb25cbiAgfCBDb21wb25lbnQgYyAtPiBTdHJpbmcgYy5jX25hbWVcbiAgfCBJc2xhbmQgaSAtPiBTdHJpbmcgaS5pX25hbWVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGNvbXBvbmVudCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGNvbXBvbmVudF9wYXJhbXMgPSBmdW5jdGlvblxuICB8IENvbXBvbmVudCBjIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgYy5jX3BhcmFtcylcbiAgfCBJc2xhbmQgaSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGkuaV9wYXJhbXMpXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBjb21wb25lbnQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBjb21wb25lbnRfYm9keSA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gYy5jX2JvZHlcbiAgfCBJc2xhbmQgaSAtPiBpLmlfYm9keVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgY29tcG9uZW50LCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgY29tcG9uZW50X2Nsb3N1cmUgPSBmdW5jdGlvblxuICB8IENvbXBvbmVudCBjIC0+IEVudiBjLmNfY2xvc3VyZVxuICB8IElzbGFuZCBpIC0+IEVudiBpLmlfY2xvc3VyZVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgY29tcG9uZW50LCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgY29tcG9uZW50X2hhc19jaGlsZHJlbiA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gQm9vbCBjLmNfaGFzX2NoaWxkcmVuXG4gIHwgSXNsYW5kIGkgLT4gQm9vbCBpLmlfaGFzX2NoaWxkcmVuXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBjb21wb25lbnQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBjb21wb25lbnRfYWZmaW5pdHkgPSBmdW5jdGlvblxuICB8IENvbXBvbmVudCBjIC0+IFN0cmluZyBjLmNfYWZmaW5pdHlcbiAgfCBJc2xhbmQgXyAtPiBTdHJpbmcgXCJjbGllbnRcIlxuICB8IF8gLT4gU3RyaW5nIFwiYXV0b1wiXG5cbmxldCBtYWNyb19wYXJhbXMgPSBmdW5jdGlvblxuICB8IE1hY3JvIG0gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBtLm1fcGFyYW1zKVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbWFjcm8sIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBtYWNyb19yZXN0X3BhcmFtID0gZnVuY3Rpb25cbiAgfCBNYWNybyBtIC0+IChtYXRjaCBtLm1fcmVzdF9wYXJhbSB3aXRoIFNvbWUgcyAtPiBTdHJpbmcgcyB8IE5vbmUgLT4gTmlsKVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbWFjcm8sIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBtYWNyb19ib2R5ID0gZnVuY3Rpb25cbiAgfCBNYWNybyBtIC0+IG0ubV9ib2R5XG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBtYWNybywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IG1hY3JvX2Nsb3N1cmUgPSBmdW5jdGlvblxuICB8IE1hY3JvIG0gLT4gRW52IG0ubV9jbG9zdXJlXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBtYWNybywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IHRodW5rX2V4cHIgPSBmdW5jdGlvblxuICB8IFRodW5rIChlLCBfKSAtPiBlXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCB0aHVuaywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IHRodW5rX2VudiA9IGZ1bmN0aW9uXG4gIHwgVGh1bmsgKF8sIGUpIC0+IEVudiBlXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCB0aHVuaywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxuXG4oKiogezEgRGljdCBvcGVyYXRpb25zfSAqKVxuXG5sZXQgbWFrZV9kaWN0ICgpIDogZGljdCA9IEhhc2h0YmwuY3JlYXRlIDhcblxubGV0IGRpY3RfZ2V0IChkIDogZGljdCkga2V5ID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIGtleSB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBOaWxcblxubGV0IGRpY3RfaGFzIChkIDogZGljdCkga2V5ID0gSGFzaHRibC5tZW0gZCBrZXlcblxubGV0IGRpY3Rfc2V0IChkIDogZGljdCkga2V5IHYgPSBIYXNodGJsLnJlcGxhY2UgZCBrZXkgdlxuXG5sZXQgZGljdF9kZWxldGUgKGQgOiBkaWN0KSBrZXkgPSBIYXNodGJsLnJlbW92ZSBkIGtleVxuXG5sZXQgZGljdF9rZXlzIChkIDogZGljdCkgPVxuICBIYXNodGJsLmZvbGQgKGZ1biBrIF8gYWNjIC0+IFN0cmluZyBrIDo6IGFjYykgZCBbXVxuXG5sZXQgZGljdF92YWxzIChkIDogZGljdCkgPVxuICBIYXNodGJsLmZvbGQgKGZ1biBfIHYgYWNjIC0+IHYgOjogYWNjKSBkIFtdXG5cblxuKCoqIHsxIFZhbHVlIGRpc3BsYXl9ICopXG5cbmxldCByZWMgaW5zcGVjdCA9IGZ1bmN0aW9uXG4gIHwgTmlsIC0+IFwibmlsXCJcbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE51bWJlciBuIC0+XG4gICAgaWYgRmxvYXQuaXNfaW50ZWdlciBuIHRoZW4gUHJpbnRmLnNwcmludGYgXCIlZFwiIChpbnRfb2ZfZmxvYXQgbilcbiAgICBlbHNlIFByaW50Zi5zcHJpbnRmIFwiJWdcIiBuXG4gIHwgU3RyaW5nIHMgLT5cbiAgICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAoU3RyaW5nLmxlbmd0aCBzICsgMikgaW5cbiAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICdcIic7XG4gICAgU3RyaW5nLml0ZXIgKGZ1bmN0aW9uXG4gICAgICB8ICdcIicgIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIlxcXFxcXFwiXCJcbiAgICAgIHwgJ1xcXFwnIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIlxcXFxcXFxcXCJcbiAgICAgIHwgJ1xcbicgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXG5cIlxuICAgICAgfCAnXFxyJyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCJcXFxcclwiXG4gICAgICB8ICdcXHQnIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIlxcXFx0XCJcbiAgICAgIHwgYyAgICAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmIGMpIHM7XG4gICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXCInO1xuICAgIEJ1ZmZlci5jb250ZW50cyBidWZcbiAgfCBTeW1ib2wgcyAtPiBzXG4gIHwgS2V5d29yZCBrIC0+IFwiOlwiIF4ga1xuICB8IExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9IC0+XG4gICAgXCIoXCIgXiBTdHJpbmcuY29uY2F0IFwiIFwiIChMaXN0Lm1hcCBpbnNwZWN0IGl0ZW1zKSBeIFwiKVwiXG4gIHwgRGljdCBkIC0+XG4gICAgbGV0IHBhaXJzID0gSGFzaHRibC5mb2xkIChmdW4gayB2IGFjYyAtPlxuICAgICAgKFByaW50Zi5zcHJpbnRmIFwiOiVzICVzXCIgayAoaW5zcGVjdCB2KSkgOjogYWNjKSBkIFtdIGluXG4gICAgXCJ7XCIgXiBTdHJpbmcuY29uY2F0IFwiIFwiIHBhaXJzIF4gXCJ9XCJcbiAgfCBMYW1iZGEgbCAtPlxuICAgIGxldCB0YWcgPSBtYXRjaCBsLmxfbmFtZSB3aXRoIFNvbWUgbiAtPiBuIHwgTm9uZSAtPiBcImxhbWJkYVwiIGluXG4gICAgUHJpbnRmLnNwcmludGYgXCI8JXMoJXMpPlwiIHRhZyAoU3RyaW5nLmNvbmNhdCBcIiwgXCIgbC5sX3BhcmFtcylcbiAgfCBDb21wb25lbnQgYyAtPlxuICAgIFByaW50Zi5zcHJpbnRmIFwiPENvbXBvbmVudCB+JXMoJXMpPlwiIGMuY19uYW1lIChTdHJpbmcuY29uY2F0IFwiLCBcIiBjLmNfcGFyYW1zKVxuICB8IElzbGFuZCBpIC0+XG4gICAgUHJpbnRmLnNwcmludGYgXCI8SXNsYW5kIH4lcyglcyk+XCIgaS5pX25hbWUgKFN0cmluZy5jb25jYXQgXCIsIFwiIGkuaV9wYXJhbXMpXG4gIHwgTWFjcm8gbSAtPlxuICAgIGxldCB0YWcgPSBtYXRjaCBtLm1fbmFtZSB3aXRoIFNvbWUgbiAtPiBuIHwgTm9uZSAtPiBcIm1hY3JvXCIgaW5cbiAgICBQcmludGYuc3ByaW50ZiBcIjwlcyglcyk+XCIgdGFnIChTdHJpbmcuY29uY2F0IFwiLCBcIiBtLm1fcGFyYW1zKVxuICB8IFRodW5rIF8gLT4gXCI8dGh1bms+XCJcbiAgfCBDb250aW51YXRpb24gKF8sIF8pIC0+IFwiPGNvbnRpbnVhdGlvbj5cIlxuICB8IE5hdGl2ZUZuIChuYW1lLCBfKSAtPiBQcmludGYuc3ByaW50ZiBcIjxuYXRpdmU6JXM+XCIgbmFtZVxuICB8IFNpZ25hbCBfIC0+IFwiPHNpZ25hbD5cIlxuICB8IFJhd0hUTUwgcyAtPiBQcmludGYuc3ByaW50ZiBcIjxyYXctaHRtbDolZCBjaGFycz5cIiAoU3RyaW5nLmxlbmd0aCBzKVxuICB8IFNwcmVhZCBfIC0+IFwiPHNwcmVhZD5cIlxuICB8IFN4RXhwciBzIC0+IFByaW50Zi5zcHJpbnRmIFwiPHN4LWV4cHI6JWQgY2hhcnM+XCIgKFN0cmluZy5sZW5ndGggcylcbiAgfCBFbnYgXyAtPiBcIjxlbnY+XCJcbiAgfCBDZWtTdGF0ZSBfIC0+IFwiPGNlay1zdGF0ZT5cIlxuICB8IENla0ZyYW1lIGYgLT4gUHJpbnRmLnNwcmludGYgXCI8ZnJhbWU6JXM+XCIgZi5jZl90eXBlXG4gIHwgVm1DbG9zdXJlIGNsIC0+IFByaW50Zi5zcHJpbnRmIFwiPHZtOiVzPlwiIChtYXRjaCBjbC52bV9uYW1lIHdpdGggU29tZSBuIC0+IG4gfCBOb25lIC0+IFwiYW5vblwiKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2ZyZXNoX29vX2lkIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWIiLCJTdGRsaWJfUHJpbnRmIiwiU3RkbGliX0J1ZmZlciIsIlN0ZGxpYl9GbG9hdCIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfTGlzdCIsInZtX2NhbGxfY2xvc3VyZV9yZWYiLCJwYXJhbSIsIkV2YWxfZXJyb3IiLCJQYXJzZV9lcnJvciIsIm1ha2VfZW52IiwiZW52X2V4dGVuZCIsInBhcmVudCIsImVudl9iaW5kIiwiZW52IiwibmFtZSIsInYiLCJlbnZfaGFzIiwibWF0Y2giLCJlbnZfZ2V0IiwiZW52X3NldCIsImVudl9tZXJnZSIsImJhc2UiLCJvdmVybGF5IiwiZSIsImRlcHRoIiwicCIsImsiLCJjc3RfZyIsImNzdF9mYWxzZSIsImNzdF90cnVlIiwidmFsdWVfdG9fc3RyaW5nIiwibiIsInMiLCJ2YWx1ZV90b19zdHJpbmdfbGlzdCIsIml0ZW1zIiwidmFsdWVfdG9fYm9vbCIsImIiLCJ2YWx1ZV90b19zdHJpbmdfb3B0IiwidW53cmFwX2Vudl92YWwiLCJtYWtlX2xhbWJkYSIsInBhcmFtcyIsImJvZHkiLCJjbG9zdXJlIiwicHMiLCJjc3RfYXV0byIsIm1ha2VfY29tcG9uZW50IiwiaGFzX2NoaWxkcmVuIiwiYWZmaW5pdHkiLCJoYyIsImFmZiIsIm1ha2VfaXNsYW5kIiwibWFrZV9tYWNybyIsInJlc3RfcGFyYW0iLCJycCIsIm1ha2VfdGh1bmsiLCJleHByIiwibWFrZV9zeW1ib2wiLCJtYWtlX2tleXdvcmQiLCJjc3RfbGFtYmRhIiwiY3N0X21hY3JvIiwiY3N0X25pbCIsInR5cGVfb2YiLCJjc3RfZGljdCIsImNzdF9mdW5jdGlvbiIsImlzX25pbCIsImlzX2xhbWJkYSIsImlzX2NvbXBvbmVudCIsImlzX2lzbGFuZCIsImlzX21hY3JvIiwiaXNfdGh1bmsiLCJpc19zaWduYWwiLCJkIiwiaXNfY2FsbGFibGUiLCJzeF90cnV0aHkiLCJzeW1ib2xfbmFtZSIsImtleXdvcmRfbmFtZSIsImNzdF9FeHBlY3RlZF9sYW1iZGFfZ290IiwibGFtYmRhX3BhcmFtcyIsImwiLCJsYW1iZGFfYm9keSIsImxhbWJkYV9jbG9zdXJlIiwibGFtYmRhX25hbWUiLCJzZXRfbGFtYmRhX25hbWUiLCJjc3RfRXhwZWN0ZWRfY29tcG9uZW50X2dvdCIsImNvbXBvbmVudF9uYW1lIiwiYyIsImNvbXBvbmVudF9wYXJhbXMiLCJpIiwiY29tcG9uZW50X2JvZHkiLCJjb21wb25lbnRfY2xvc3VyZSIsImNvbXBvbmVudF9oYXNfY2hpbGRyZW4iLCJjb21wb25lbnRfYWZmaW5pdHkiLCJjc3RfRXhwZWN0ZWRfbWFjcm9fZ290IiwibWFjcm9fcGFyYW1zIiwibSIsIm1hY3JvX3Jlc3RfcGFyYW0iLCJtYWNyb19ib2R5IiwibWFjcm9fY2xvc3VyZSIsImNzdF9FeHBlY3RlZF90aHVua19nb3QiLCJ0aHVua19leHByIiwidGh1bmtfZW52IiwibWFrZV9kaWN0IiwiZGljdF9nZXQiLCJrZXkiLCJkaWN0X2hhcyIsImRpY3Rfc2V0IiwiZGljdF9kZWxldGUiLCJkaWN0X2tleXMiLCJhY2MiLCJkaWN0X3ZhbHMiLCJjc3RfY2hhcnMiLCJjc3QiLCJjc3Rfc19zIiwiaW5zcGVjdCIsImJ1ZiIsInBhaXJzIiwidGFnIiwiY2wiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMs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QUFBQSxTQXpCckU7QUFBQSxTQUFsQjtBQUFBO0FBQUEsSUFBZ0Qsb0NBeUJ1QztBQUFBO0FBQUEsR0RuZWpHIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjU0ODEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4Lm9ianMvanNvby9kZWZhdWx0L3N4LmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvd29ya3NwYWNlX3Jvb3QvbGliL3N4X3ByaW1pdGl2ZXMubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogQnVpbHQtaW4gcHJpbWl0aXZlIGZ1bmN0aW9ucyAofjgwIHB1cmUgZnVuY3Rpb25zKS5cblxuICAgIFJlZ2lzdGVyZWQgaW4gYSBnbG9iYWwgdGFibGU7IHRoZSBldmFsdWF0b3IgY2hlY2tzIHRoaXMgdGFibGVcbiAgICB3aGVuIGEgc3ltYm9sIGlzbid0IGZvdW5kIGluIHRoZSBsZXhpY2FsIGVudmlyb25tZW50LiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbmxldCBwcmltaXRpdmVzIDogKHN0cmluZywgdmFsdWUgbGlzdCAtPiB2YWx1ZSkgSGFzaHRibC50ID0gSGFzaHRibC5jcmVhdGUgMTI4XG5cbigqKiBGb3J3YXJkIHJlZnMgZm9yIGNhbGxpbmcgU1ggZnVuY3Rpb25zIGZyb20gcHJpbWl0aXZlcyAoYnJlYWtzIGN5Y2xlKS4gKilcbmxldCBfc3hfY2FsbF9mbiA6ICh2YWx1ZSAtPiB2YWx1ZSBsaXN0IC0+IHZhbHVlKSByZWYgPVxuICByZWYgKGZ1biBfIF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzeF9jYWxsIG5vdCBpbml0aWFsaXplZFwiKSlcbmxldCBfc3hfdHJhbXBvbGluZV9mbiA6ICh2YWx1ZSAtPiB2YWx1ZSkgcmVmID1cbiAgcmVmIChmdW4gdiAtPiB2KVxuXG5sZXQgcmVnaXN0ZXIgbmFtZSBmbiA9IEhhc2h0YmwucmVwbGFjZSBwcmltaXRpdmVzIG5hbWUgZm5cblxubGV0IGlzX3ByaW1pdGl2ZSBuYW1lID0gSGFzaHRibC5tZW0gcHJpbWl0aXZlcyBuYW1lXG5cbmxldCBnZXRfcHJpbWl0aXZlIG5hbWUgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gIHwgU29tZSBmbiAtPiBOYXRpdmVGbiAobmFtZSwgZm4pXG4gIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJVbmtub3duIHByaW1pdGl2ZTogXCIgXiBuYW1lKSlcblxuKCogLS0tIEhlbHBlcnMgLS0tICopXG5cbigqIFRyYW1wb2xpbmUgaG9vayDigJQgc2V0IGJ5IHN4X3JlZiBhZnRlciBpbml0aWFsaXphdGlvbiB0byBicmVhayBjaXJjdWxhciBkZXAgKilcbmxldCB0cmFtcG9saW5lX2hvb2sgOiAodmFsdWUgLT4gdmFsdWUpIHJlZiA9IHJlZiAoZnVuIHYgLT4gdilcblxubGV0IHJlYyBhc19udW1iZXIgPSBmdW5jdGlvblxuICB8IE51bWJlciBuIC0+IG5cbiAgfCBCb29sIHRydWUgLT4gMS4wXG4gIHwgQm9vbCBmYWxzZSAtPiAwLjBcbiAgfCBOaWwgLT4gMC4wXG4gIHwgU3RyaW5nIHMgLT4gKG1hdGNoIGZsb2F0X29mX3N0cmluZ19vcHQgcyB3aXRoIFNvbWUgbiAtPiBuIHwgTm9uZSAtPiBGbG9hdC5uYW4pXG4gIHwgVGh1bmsgXyBhcyB0IC0+XG4gICAgKCogVHJhbXBvbGluZSB0aHVua3Mg4oCUIHRoZXkgc2hvdWxkbid0IGxlYWsgYnV0IHNvbWV0aW1lcyBkbyAqKVxuICAgIGFzX251bWJlciAoIXRyYW1wb2xpbmVfaG9vayB0KVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbnVtYmVyLCBnb3QgXCIgXiB0eXBlX29mIHYgXiBcIjogXCIgXiAobWF0Y2ggdiB3aXRoIERpY3QgZCAtPiAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwiX19zaWduYWxcIiB3aXRoIFNvbWUgXyAtPiBcInNpZ25hbHt2YWx1ZT1cIiBeIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJ2YWx1ZVwiIHdpdGggU29tZSB2JyAtPiB2YWx1ZV90b19zdHJpbmcgdicgfCBOb25lIC0+IFwiP1wiKSBeIFwifVwiIHwgTm9uZSAtPiBcImRpY3RcIikgfCBfIC0+IFwiXCIpKSlcblxubGV0IGFzX3N0cmluZyA9IGZ1bmN0aW9uXG4gIHwgU3RyaW5nIHMgLT4gc1xuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgc3RyaW5nLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgcmVjIGFzX2xpc3QgPSBmdW5jdGlvblxuICB8IExpc3QgbCAtPiBsXG4gIHwgTGlzdFJlZiByIC0+ICFyXG4gIHwgTmlsIC0+IFtdXG4gIHwgVGh1bmsgXyBhcyB0IC0+IGFzX2xpc3QgKCFfc3hfdHJhbXBvbGluZV9mbiB0KVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGFzX2Jvb2wgPSBmdW5jdGlvblxuICB8IEJvb2wgYiAtPiBiXG4gIHwgdiAtPiBzeF90cnV0aHkgdlxuXG5sZXQgcmVjIHRvX3N0cmluZyA9IGZ1bmN0aW9uXG4gIHwgU3RyaW5nIHMgLT4gc1xuICB8IE51bWJlciBuIC0+XG4gICAgaWYgRmxvYXQuaXNfaW50ZWdlciBuIHRoZW4gc3RyaW5nX29mX2ludCAoaW50X29mX2Zsb2F0IG4pXG4gICAgZWxzZSBQcmludGYuc3ByaW50ZiBcIiVnXCIgblxuICB8IEJvb2wgdHJ1ZSAtPiBcInRydWVcIlxuICB8IEJvb2wgZmFsc2UgLT4gXCJmYWxzZVwiXG4gIHwgTmlsIC0+IFwiXCJcbiAgfCBTeW1ib2wgcyAtPiBzXG4gIHwgS2V5d29yZCBrIC0+IGtcbiAgfCBUaHVuayBfIGFzIHQgLT4gdG9fc3RyaW5nICghdHJhbXBvbGluZV9ob29rIHQpXG4gIHwgdiAtPiBpbnNwZWN0IHZcblxubGV0ICgpID1cbiAgKCogPT09IEFyaXRobWV0aWMgPT09ICopXG4gIHJlZ2lzdGVyIFwiK1wiIChmdW4gYXJncyAtPlxuICAgIE51bWJlciAoTGlzdC5mb2xkX2xlZnQgKGZ1biBhY2MgYSAtPiBhY2MgKy4gYXNfbnVtYmVyIGEpIDAuMCBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwiLVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW10gLT4gTnVtYmVyIDAuMFxuICAgIHwgW2FdIC0+IE51bWJlciAoLS4gKGFzX251bWJlciBhKSlcbiAgICB8IGEgOjogcmVzdCAtPiBOdW1iZXIgKExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4gYWNjIC0uIGFzX251bWJlciB4KSAoYXNfbnVtYmVyIGEpIHJlc3QpKTtcbiAgcmVnaXN0ZXIgXCIqXCIgKGZ1biBhcmdzIC0+XG4gICAgTnVtYmVyIChMaXN0LmZvbGRfbGVmdCAoZnVuIGFjYyBhIC0+IGFjYyAqLiBhc19udW1iZXIgYSkgMS4wIGFyZ3MpKTtcbiAgcmVnaXN0ZXIgXCIvXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT4gTnVtYmVyIChhc19udW1iZXIgYSAvLiBhc19udW1iZXIgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCIvOiBleHBlY3RlZCAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIm1vZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+IE51bWJlciAoRmxvYXQucmVtIChhc19udW1iZXIgYSkgKGFzX251bWJlciBiKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtb2Q6IGV4cGVjdGVkIDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiaW5jXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBOdW1iZXIgKGFzX251bWJlciBhICsuIDEuMCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaW5jOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZGVjXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBOdW1iZXIgKGFzX251bWJlciBhIC0uIDEuMCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGVjOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiYWJzXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBOdW1iZXIgKEZsb2F0LmFicyAoYXNfbnVtYmVyIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJhYnM6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJmbG9vclwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChmbG9vciAoYXNfbnVtYmVyIGEpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImZsb29yOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiY2VpbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChjZWlsIChhc19udW1iZXIgYSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VpbDogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInJvdW5kXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYV0gLT4gTnVtYmVyIChGbG9hdC5yb3VuZCAoYXNfbnVtYmVyIGEpKVxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgbiA9IGFzX251bWJlciBhIGFuZCBwbGFjZXMgPSBpbnRfb2ZfZmxvYXQgKGFzX251bWJlciBiKSBpblxuICAgICAgbGV0IGZhY3RvciA9IDEwLjAgKiogZmxvYXRfb2ZfaW50IHBsYWNlcyBpblxuICAgICAgTnVtYmVyIChGbG9hdC5yb3VuZCAobiAqLiBmYWN0b3IpIC8uIGZhY3RvcilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJyb3VuZDogMS0yIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIm1pblwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW10gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtaW46IGF0IGxlYXN0IDEgYXJnXCIpXG4gICAgfCBfIC0+IE51bWJlciAoTGlzdC5mb2xkX2xlZnQgKGZ1biBhY2MgYSAtPiBGbG9hdC5taW4gYWNjIChhc19udW1iZXIgYSkpIEZsb2F0LmluZmluaXR5IGFyZ3MpKTtcbiAgcmVnaXN0ZXIgXCJtYXhcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtdIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWF4OiBhdCBsZWFzdCAxIGFyZ1wiKVxuICAgIHwgXyAtPiBOdW1iZXIgKExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIGEgLT4gRmxvYXQubWF4IGFjYyAoYXNfbnVtYmVyIGEpKSBGbG9hdC5uZWdfaW5maW5pdHkgYXJncykpO1xuICByZWdpc3RlciBcInNxcnRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoRmxvYXQuc3FydCAoYXNfbnVtYmVyIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzcXJ0OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwicG93XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthOyBiXSAtPiBOdW1iZXIgKGFzX251bWJlciBhICoqIGFzX251bWJlciBiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInBvdzogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJjbGFtcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3g7IGxvOyBoaV0gLT5cbiAgICAgIGxldCB4ID0gYXNfbnVtYmVyIHggYW5kIGxvID0gYXNfbnVtYmVyIGxvIGFuZCBoaSA9IGFzX251bWJlciBoaSBpblxuICAgICAgTnVtYmVyIChGbG9hdC5tYXggbG8gKEZsb2F0Lm1pbiBoaSB4KSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjbGFtcDogMyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJwYXJzZS1pbnRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc10gLT4gKG1hdGNoIGludF9vZl9zdHJpbmdfb3B0IHMgd2l0aCBTb21lIG4gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgbikgfCBOb25lIC0+IE5pbClcbiAgICB8IFtTdHJpbmcgczsgZGVmYXVsdF92YWxdIC0+XG4gICAgICAobWF0Y2ggaW50X29mX3N0cmluZ19vcHQgcyB3aXRoIFNvbWUgbiAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCBuKSB8IE5vbmUgLT4gZGVmYXVsdF92YWwpXG4gICAgfCBbTnVtYmVyIG5dIHwgW051bWJlciBuOyBfXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoaW50X29mX2Zsb2F0IG4pKVxuICAgIHwgW187IGRlZmF1bHRfdmFsXSAtPiBkZWZhdWx0X3ZhbFxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcInBhcnNlLWZsb2F0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IChtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IHMgd2l0aCBTb21lIG4gLT4gTnVtYmVyIG4gfCBOb25lIC0+IE5pbClcbiAgICB8IFtOdW1iZXIgbl0gLT4gTnVtYmVyIG5cbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiA9PT0gQ29tcGFyaXNvbiA9PT0gKilcbiAgKCogU2FmZSBlcXVhbGl0eTogcGh5c2ljYWwgZXF1YWxpdHkgZm9yIHBvdGVudGlhbGx5LWNpcmN1bGFyIHR5cGVzXG4gICAgIChEaWN0LCBMYW1iZGEsIENvbXBvbmVudCwgSXNsYW5kLCBTaWduYWwsIE5hdGl2ZUZuKSxcbiAgICAgc3RydWN0dXJhbCBlcXVhbGl0eSBmb3IgYWN5Y2xpYyB0eXBlcyAoTnVtYmVyLCBTdHJpbmcsIEJvb2wsIGV0Yy4pLlxuICAgICBMaXN0cyBhcmUgY29tcGFyZWQgZWxlbWVudC13aXNlIHJlY3Vyc2l2ZWx5IHdpdGggdGhlIHNhbWUgc2FmZXR5LiAqKVxuICBsZXQgcmVjIHNhZmVfZXEgYSBiID1cbiAgICBpZiBhID09IGIgdGhlbiB0cnVlICAoKiBwaHlzaWNhbCBlcXVhbGl0eSBmYXN0IHBhdGggKilcbiAgICBlbHNlIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgTnVtYmVyIHgsIE51bWJlciB5IC0+IHggPSB5XG4gICAgfCBTdHJpbmcgeCwgU3RyaW5nIHkgLT4geCA9IHlcbiAgICB8IEJvb2wgeCwgQm9vbCB5IC0+IHggPSB5XG4gICAgfCBOaWwsIE5pbCAtPiB0cnVlXG4gICAgfCBTeW1ib2wgeCwgU3ltYm9sIHkgLT4geCA9IHlcbiAgICB8IEtleXdvcmQgeCwgS2V5d29yZCB5IC0+IHggPSB5XG4gICAgfCAoTGlzdCBsYSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxhIH0pLFxuICAgICAgKExpc3QgbGIgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYiB9KSAtPlxuICAgICAgTGlzdC5sZW5ndGggbGEgPSBMaXN0Lmxlbmd0aCBsYiAmJlxuICAgICAgTGlzdC5mb3JfYWxsMiBzYWZlX2VxIGxhIGxiXG4gICAgKCogRGljdDogY2hlY2sgX19ob3N0X2hhbmRsZSBmb3IgRE9NIG5vZGUgaWRlbnRpdHkgKilcbiAgICB8IERpY3QgYSwgRGljdCBiIC0+XG4gICAgICAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBhIFwiX19ob3N0X2hhbmRsZVwiLCBIYXNodGJsLmZpbmRfb3B0IGIgXCJfX2hvc3RfaGFuZGxlXCIgd2l0aFxuICAgICAgIHwgU29tZSAoTnVtYmVyIGhhKSwgU29tZSAoTnVtYmVyIGhiKSAtPiBoYSA9IGhiXG4gICAgICAgfCBfIC0+IGZhbHNlKVxuICAgICgqIExhbWJkYS9Db21wb25lbnQvSXNsYW5kL1NpZ25hbC9OYXRpdmVGbjogcGh5c2ljYWwgb25seSAqKVxuICAgIHwgXyAtPiBmYWxzZVxuICBpblxuICByZWdpc3RlciBcIj1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFthOyBiXSAtPiBCb29sIChzYWZlX2VxIGEgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCI9OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIiE9XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT4gQm9vbCAobm90IChzYWZlX2VxIGEgYikpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiIT06IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiPFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBhOyBTdHJpbmcgYl0gLT4gQm9vbCAoYSA8IGIpXG4gICAgfCBbYTsgYl0gLT4gQm9vbCAoYXNfbnVtYmVyIGEgPCBhc19udW1iZXIgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCI8OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIj5cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgYTsgU3RyaW5nIGJdIC0+IEJvb2wgKGEgPiBiKVxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKGFzX251bWJlciBhID4gYXNfbnVtYmVyIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiPjogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCI8PVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBhOyBTdHJpbmcgYl0gLT4gQm9vbCAoYSA8PSBiKVxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKGFzX251bWJlciBhIDw9IGFzX251bWJlciBiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIjw9OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIj49XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIGE7IFN0cmluZyBiXSAtPiBCb29sIChhID49IGIpXG4gICAgfCBbYTsgYl0gLT4gQm9vbCAoYXNfbnVtYmVyIGEgPj0gYXNfbnVtYmVyIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiPj06IDIgYXJnc1wiKSk7XG5cbiAgKCogPT09IExvZ2ljID09PSAqKVxuICByZWdpc3RlciBcIm5vdFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gQm9vbCAobm90IChzeF90cnV0aHkgYSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm5vdDogMSBhcmdcIikpO1xuXG4gICgqID09PSBQcmVkaWNhdGVzID09PSAqKVxuICByZWdpc3RlciBcIm5pbD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IEJvb2wgKGlzX25pbCBhKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJuaWw/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibnVtYmVyP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbTnVtYmVyIF9dIC0+IEJvb2wgdHJ1ZSB8IFtfXSAtPiBCb29sIGZhbHNlIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm51bWJlcj86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdHJpbmc/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtTdHJpbmcgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2UgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3RyaW5nPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImJvb2xlYW4/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtCb29sIF9dIC0+IEJvb2wgdHJ1ZSB8IFtfXSAtPiBCb29sIGZhbHNlIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImJvb2xlYW4/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibGlzdD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0xpc3QgX10gfCBbTGlzdFJlZiBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJsaXN0PzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImRpY3Q/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtEaWN0IF9dIC0+IEJvb2wgdHJ1ZSB8IFtfXSAtPiBCb29sIGZhbHNlIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRpY3Q/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic3ltYm9sP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbU3ltYm9sIF9dIC0+IEJvb2wgdHJ1ZSB8IFtfXSAtPiBCb29sIGZhbHNlIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN5bWJvbD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJrZXl3b3JkP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbS2V5d29yZCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJrZXl3b3JkPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImVtcHR5P1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgW11dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IFtdIH1dIC0+IEJvb2wgdHJ1ZVxuICAgIHwgW0xpc3QgX10gfCBbTGlzdFJlZiBfXSAtPiBCb29sIGZhbHNlXG4gICAgfCBbU3RyaW5nIFwiXCJdIC0+IEJvb2wgdHJ1ZSB8IFtTdHJpbmcgX10gLT4gQm9vbCBmYWxzZVxuICAgIHwgW0RpY3QgZF0gLT4gQm9vbCAoSGFzaHRibC5sZW5ndGggZCA9IDApXG4gICAgfCBbTmlsXSAtPiBCb29sIHRydWVcbiAgICB8IFtfXSAtPiBCb29sIGZhbHNlXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW1wdHk/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwib2RkP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gQm9vbCAoaW50X29mX2Zsb2F0IChhc19udW1iZXIgYSkgbW9kIDIgPD4gMCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwib2RkPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImV2ZW4/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBCb29sIChpbnRfb2ZfZmxvYXQgKGFzX251bWJlciBhKSBtb2QgMiA9IDApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImV2ZW4/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiemVybz9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IEJvb2wgKGFzX251bWJlciBhID0gMC4wKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ6ZXJvPzogMSBhcmdcIikpO1xuXG4gICgqID09PSBTdHJpbmdzID09PSAqKVxuICByZWdpc3RlciBcInN0clwiIChmdW4gYXJncyAtPiBTdHJpbmcgKFN0cmluZy5jb25jYXQgXCJcIiAoTGlzdC5tYXAgdG9fc3RyaW5nIGFyZ3MpKSk7XG4gIHJlZ2lzdGVyIFwidXBwZXJcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLnVwcGVyY2FzZV9hc2NpaSAoYXNfc3RyaW5nIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ1cHBlcjogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInVwY2FzZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nIChTdHJpbmcudXBwZXJjYXNlX2FzY2lpIChhc19zdHJpbmcgYSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInVwY2FzZTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImxvd2VyXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBTdHJpbmcgKFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgKGFzX3N0cmluZyBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibG93ZXI6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJkb3duY2FzZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nIChTdHJpbmcubG93ZXJjYXNlX2FzY2lpIChhc19zdHJpbmcgYSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRvd25jYXNlOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwidHJpbVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nIChTdHJpbmcudHJpbSAoYXNfc3RyaW5nIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ0cmltOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic3RyaW5nLWxlbmd0aFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKFN0cmluZy5sZW5ndGggKGFzX3N0cmluZyBhKSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3RyaW5nLWxlbmd0aDogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInN0cmluZy1jb250YWlucz9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgaGF5c3RhY2s7IFN0cmluZyBuZWVkbGVdIC0+XG4gICAgICBsZXQgcmVjIGZpbmQgaSA9XG4gICAgICAgIGlmIGkgKyBTdHJpbmcubGVuZ3RoIG5lZWRsZSA+IFN0cmluZy5sZW5ndGggaGF5c3RhY2sgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGlmIFN0cmluZy5zdWIgaGF5c3RhY2sgaSAoU3RyaW5nLmxlbmd0aCBuZWVkbGUpID0gbmVlZGxlIHRoZW4gdHJ1ZVxuICAgICAgICBlbHNlIGZpbmQgKGkgKyAxKVxuICAgICAgaW4gQm9vbCAoZmluZCAwKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN0cmluZy1jb250YWlucz86IDIgc3RyaW5nIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInN0YXJ0cy13aXRoP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzOyBTdHJpbmcgcHJlZml4XSAtPlxuICAgICAgQm9vbCAoU3RyaW5nLmxlbmd0aCBzID49IFN0cmluZy5sZW5ndGggcHJlZml4ICYmXG4gICAgICAgICAgICBTdHJpbmcuc3ViIHMgMCAoU3RyaW5nLmxlbmd0aCBwcmVmaXgpID0gcHJlZml4KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN0YXJ0cy13aXRoPzogMiBzdHJpbmcgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiZW5kcy13aXRoP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzOyBTdHJpbmcgc3VmZml4XSAtPlxuICAgICAgbGV0IHNsID0gU3RyaW5nLmxlbmd0aCBzIGFuZCB4bCA9IFN0cmluZy5sZW5ndGggc3VmZml4IGluXG4gICAgICBCb29sIChzbCA+PSB4bCAmJiBTdHJpbmcuc3ViIHMgKHNsIC0geGwpIHhsID0gc3VmZml4KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVuZHMtd2l0aD86IDIgc3RyaW5nIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImluZGV4LW9mXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIGhheXN0YWNrOyBTdHJpbmcgbmVlZGxlXSAtPlxuICAgICAgbGV0IG5sID0gU3RyaW5nLmxlbmd0aCBuZWVkbGUgYW5kIGhsID0gU3RyaW5nLmxlbmd0aCBoYXlzdGFjayBpblxuICAgICAgbGV0IHJlYyBmaW5kIGkgPVxuICAgICAgICBpZiBpICsgbmwgPiBobCB0aGVuIE51bWJlciAoLTEuMClcbiAgICAgICAgZWxzZSBpZiBTdHJpbmcuc3ViIGhheXN0YWNrIGkgbmwgPSBuZWVkbGUgdGhlbiBOdW1iZXIgKGZsb2F0X29mX2ludCBpKVxuICAgICAgICBlbHNlIGZpbmQgKGkgKyAxKVxuICAgICAgaW4gZmluZCAwXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaW5kZXgtb2Y6IDIgc3RyaW5nIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInN1YnN0cmluZ1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzOyBOdW1iZXIgc3RhcnQ7IE51bWJlciBlbmRfXSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgc3RhcnQgYW5kIGogPSBpbnRfb2ZfZmxvYXQgZW5kXyBpblxuICAgICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgICAgbGV0IGkgPSBtYXggMCAobWluIGkgbGVuKSBhbmQgaiA9IG1heCAwIChtaW4gaiBsZW4pIGluXG4gICAgICBTdHJpbmcgKFN0cmluZy5zdWIgcyBpIChtYXggMCAoaiAtIGkpKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzdWJzdHJpbmc6IDMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwic3Vic3RyXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHM7IE51bWJlciBzdGFydDsgTnVtYmVyIGxlbl0gLT5cbiAgICAgIGxldCBpID0gaW50X29mX2Zsb2F0IHN0YXJ0IGFuZCBuID0gaW50X29mX2Zsb2F0IGxlbiBpblxuICAgICAgbGV0IHNsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gICAgICBsZXQgaSA9IG1heCAwIChtaW4gaSBzbCkgaW5cbiAgICAgIGxldCBuID0gbWF4IDAgKG1pbiBuIChzbCAtIGkpKSBpblxuICAgICAgU3RyaW5nIChTdHJpbmcuc3ViIHMgaSBuKVxuICAgIHwgW1N0cmluZyBzOyBOdW1iZXIgc3RhcnRdIC0+XG4gICAgICBsZXQgaSA9IGludF9vZl9mbG9hdCBzdGFydCBpblxuICAgICAgbGV0IHNsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gICAgICBsZXQgaSA9IG1heCAwIChtaW4gaSBzbCkgaW5cbiAgICAgIFN0cmluZyAoU3RyaW5nLnN1YiBzIGkgKHNsIC0gaSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3Vic3RyOiAyLTMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwic3BsaXRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHNlcF0gLT5cbiAgICAgIExpc3QgKExpc3QubWFwIChmdW4gcCAtPiBTdHJpbmcgcCkgKFN0cmluZy5zcGxpdF9vbl9jaGFyIHNlcC5bMF0gcykpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3BsaXQ6IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiam9pblwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzZXA7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBTdHJpbmcgKFN0cmluZy5jb25jYXQgc2VwIChMaXN0Lm1hcCB0b19zdHJpbmcgaXRlbXMpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImpvaW46IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwicmVwbGFjZVwiIChmdW4gYXJncyAtPlxuICAgIGxldCB0b19zdHIgPSBmdW5jdGlvblxuICAgICAgfCBTdHJpbmcgcyAtPiBzIHwgU3hFeHByIHMgLT4gcyB8IFJhd0hUTUwgcyAtPiBzXG4gICAgICB8IEtleXdvcmQgayAtPiBrIHwgU3ltYm9sIHMgLT4gc1xuICAgICAgfCBOaWwgLT4gXCJcIiB8IEJvb2wgdHJ1ZSAtPiBcInRydWVcIiB8IEJvb2wgZmFsc2UgLT4gXCJmYWxzZVwiXG4gICAgICB8IE51bWJlciBuIC0+IGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKSBlbHNlIFByaW50Zi5zcHJpbnRmIFwiJWdcIiBuXG4gICAgICB8IFRodW5rIF8gYXMgdCAtPiAobWF0Y2ggIV9zeF90cmFtcG9saW5lX2ZuIHQgd2l0aCBTdHJpbmcgcyAtPiBzIHwgdiAtPiB0b19zdHJpbmcgdilcbiAgICAgIHwgdiAtPiB0b19zdHJpbmcgdlxuICAgIGluXG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbczsgb2xkX3M7IG5ld19zXSAtPlxuICAgICAgbGV0IHMgPSB0b19zdHIgcyBhbmQgb2xkX3MgPSB0b19zdHIgb2xkX3MgYW5kIG5ld19zID0gdG9fc3RyIG5ld19zIGluXG4gICAgICBsZXQgb2wgPSBTdHJpbmcubGVuZ3RoIG9sZF9zIGluXG4gICAgICBpZiBvbCA9IDAgdGhlbiBTdHJpbmcgc1xuICAgICAgZWxzZSBiZWdpblxuICAgICAgICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAoU3RyaW5nLmxlbmd0aCBzKSBpblxuICAgICAgICBsZXQgcmVjIGdvIGkgPVxuICAgICAgICAgIGlmIGkgPj0gU3RyaW5nLmxlbmd0aCBzIHRoZW4gKClcbiAgICAgICAgICBlbHNlIGlmIGkgKyBvbCA8PSBTdHJpbmcubGVuZ3RoIHMgJiYgU3RyaW5nLnN1YiBzIGkgb2wgPSBvbGRfcyB0aGVuIGJlZ2luXG4gICAgICAgICAgICBCdWZmZXIuYWRkX3N0cmluZyBidWYgbmV3X3M7XG4gICAgICAgICAgICBnbyAoaSArIG9sKVxuICAgICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmIHMuW2ldO1xuICAgICAgICAgICAgZ28gKGkgKyAxKVxuICAgICAgICAgIGVuZFxuICAgICAgICBpbiBnbyAwO1xuICAgICAgICBTdHJpbmcgKEJ1ZmZlci5jb250ZW50cyBidWYpXG4gICAgICBlbmRcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJyZXBsYWNlOiAzIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJjaGFyLWZyb20tY29kZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW051bWJlciBuXSAtPlxuICAgICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgNCBpblxuICAgICAgQnVmZmVyLmFkZF91dGZfOF91Y2hhciBidWYgKFVjaGFyLm9mX2ludCAoaW50X29mX2Zsb2F0IG4pKTtcbiAgICAgIFN0cmluZyAoQnVmZmVyLmNvbnRlbnRzIGJ1ZilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjaGFyLWZyb20tY29kZTogMSBhcmdcIikpO1xuXG4gICgqID09PSBDb2xsZWN0aW9ucyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJsaXN0XCIgKGZ1biBhcmdzIC0+IExpc3RSZWYgKHJlZiBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwibGVuXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH1dIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChMaXN0Lmxlbmd0aCBsKSlcbiAgICB8IFtTdHJpbmcgc10gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKFN0cmluZy5sZW5ndGggcykpXG4gICAgfCBbRGljdCBkXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoSGFzaHRibC5sZW5ndGggZCkpXG4gICAgfCBbTmlsXSB8IFtCb29sIGZhbHNlXSAtPiBOdW1iZXIgMC4wXG4gICAgfCBbQm9vbCB0cnVlXSAtPiBOdW1iZXIgMS4wXG4gICAgfCBbTnVtYmVyIF9dIC0+IE51bWJlciAxLjBcbiAgICB8IFtSYXdIVE1MIHNdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChTdHJpbmcubGVuZ3RoIHMpKVxuICAgIHwgW1N4RXhwciBzXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoU3RyaW5nLmxlbmd0aCBzKSlcbiAgICB8IFtTcHJlYWQgcGFpcnNdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChMaXN0Lmxlbmd0aCBwYWlycykpXG4gICAgfCBbQ29tcG9uZW50IF9dIHwgW0lzbGFuZCBfXSB8IFtMYW1iZGEgX10gfCBbTmF0aXZlRm4gX11cbiAgICB8IFtNYWNybyBfXSB8IFtUaHVuayBfXSB8IFtLZXl3b3JkIF9dIHwgW1N5bWJvbCBfXSAtPiBOdW1iZXIgMC4wXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZiBcImxlbjogJWQgYXJnc1wiXG4gICAgICAgIChMaXN0Lmxlbmd0aCBhcmdzKSkpKTtcbiAgcmVnaXN0ZXIgXCJmaXJzdFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgKHggOjogXyldIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IHggOjogXyB9XSAtPiB4XG4gICAgfCBbTGlzdCBbXV0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gW10gfV0gLT4gTmlsIHwgW05pbF0gLT4gTmlsXG4gICAgfCBbeF0gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiZmlyc3Q6IGV4cGVjdGVkIGxpc3QsIGdvdCBcIiBeIGluc3BlY3QgeCkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZmlyc3Q6IDEgbGlzdCBhcmdcIikpO1xuICByZWdpc3RlciBcInJlc3RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IChfIDo6IHhzKV0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gXyA6OiB4cyB9XSAtPiBMaXN0IHhzXG4gICAgfCBbTGlzdCBbXV0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gW10gfV0gLT4gTGlzdCBbXSB8IFtOaWxdIC0+IExpc3QgW11cbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJyZXN0OiAxIGxpc3QgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJsYXN0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH1dIC0+XG4gICAgICAobWF0Y2ggTGlzdC5yZXYgbCB3aXRoIHggOjogXyAtPiB4IHwgW10gLT4gTmlsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImxhc3Q6IDEgbGlzdCBhcmdcIikpO1xuICByZWdpc3RlciBcImluaXRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxdIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfV0gLT5cbiAgICAgIChtYXRjaCBMaXN0LnJldiBsIHdpdGggXyA6OiByZXN0IC0+IExpc3QgKExpc3QucmV2IHJlc3QpIHwgW10gLT4gTGlzdCBbXSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJpbml0OiAxIGxpc3QgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJudGhcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGw7IE51bWJlciBuXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH07IE51bWJlciBuXSAtPlxuICAgICAgKHRyeSBMaXN0Lm50aCBsIChpbnRfb2ZfZmxvYXQgbikgd2l0aCBfIC0+IE5pbClcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIG5dIC0+XG4gICAgICBsZXQgaSA9IGludF9vZl9mbG9hdCBuIGluXG4gICAgICBpZiBpID49IDAgJiYgaSA8IFN0cmluZy5sZW5ndGggcyB0aGVuIFN0cmluZyAoU3RyaW5nLm1ha2UgMSBzLltpXSlcbiAgICAgIGVsc2UgTmlsXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibnRoOiBsaXN0L3N0cmluZyBhbmQgbnVtYmVyXCIpKTtcbiAgcmVnaXN0ZXIgXCJjb25zXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbeDsgTGlzdCBsXSB8IFt4OyBMaXN0UmVmIHsgY29udGVudHMgPSBsIH1dIC0+IExpc3QgKHggOjogbClcbiAgICB8IFt4OyBOaWxdIC0+IExpc3QgW3hdXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY29uczogdmFsdWUgYW5kIGxpc3RcIikpO1xuICByZWdpc3RlciBcImFwcGVuZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYSB9OyBMaXN0IGxiIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbGIgfV0gLT5cbiAgICAgIExpc3QgKGxhIEAgbGIpXG4gICAgfCBbTGlzdCBsYSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxhIH07IE5pbF0gLT4gTGlzdCBsYVxuICAgIHwgW05pbDsgTGlzdCBsYiB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxiIH1dIC0+IExpc3QgbGJcbiAgICB8IFtMaXN0IGxhIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbGEgfTsgdl0gLT4gTGlzdCAobGEgQCBbdl0pXG4gICAgfCBbdjsgTGlzdCBsYiB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxiIH1dIC0+IExpc3QgKFt2XSBAIGxiKVxuICAgIHwgXyAtPlxuICAgICAgbGV0IGFsbCA9IExpc3QuY29uY2F0X21hcCBhc19saXN0IGFyZ3MgaW5cbiAgICAgIExpc3QgYWxsKTtcbiAgcmVnaXN0ZXIgXCJyZXZlcnNlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH1dIC0+IExpc3QgKExpc3QucmV2IGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmV2ZXJzZTogMSBsaXN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJmbGF0dGVuXCIgKGZ1biBhcmdzIC0+XG4gICAgbGV0IHJlYyBmbGF0ID0gZnVuY3Rpb25cbiAgICAgIHwgTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0gLT4gTGlzdC5jb25jYXRfbWFwIGZsYXQgaXRlbXNcbiAgICAgIHwgeCAtPiBbeF1cbiAgICBpblxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBMaXN0IChMaXN0LmNvbmNhdF9tYXAgZmxhdCBsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImZsYXR0ZW46IDEgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwiY29uY2F0XCIgKGZ1biBhcmdzIC0+IExpc3QgKExpc3QuY29uY2F0X21hcCBhc19saXN0IGFyZ3MpKTtcbiAgcmVnaXN0ZXIgXCJjb250YWlucz9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGw7IGl0ZW1dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfTsgaXRlbV0gLT5cbiAgICAgICgqIFBoeXNpY2FsIGVxdWFsaXR5IGZpcnN0IChoYW5kbGVzIHNpZ25hbHMvZGljdHMvY2xvc3VyZXMgc2FmZWx5KSxcbiAgICAgICAgIHN0cnVjdHVyYWwgZmFsbGJhY2sgb25seSBmb3IgYWN5Y2xpYyB0eXBlcyAoc3RyaW5nL251bWJlci9ib29sL25pbC9zeW1ib2wva2V5d29yZCkgKilcbiAgICAgIGxldCBzYWZlX2VxIGEgYiA9XG4gICAgICAgIGEgPT0gYiB8fFxuICAgICAgICAobWF0Y2ggYSwgYiB3aXRoXG4gICAgICAgICB8IE51bWJlciB4LCBOdW1iZXIgeSAtPiB4ID0geVxuICAgICAgICAgfCBTdHJpbmcgeCwgU3RyaW5nIHkgLT4geCA9IHlcbiAgICAgICAgIHwgQm9vbCB4LCBCb29sIHkgLT4geCA9IHlcbiAgICAgICAgIHwgTmlsLCBOaWwgLT4gdHJ1ZVxuICAgICAgICAgfCBTeW1ib2wgeCwgU3ltYm9sIHkgLT4geCA9IHlcbiAgICAgICAgIHwgS2V5d29yZCB4LCBLZXl3b3JkIHkgLT4geCA9IHlcbiAgICAgICAgIHwgRGljdCBhLCBEaWN0IGIgLT5cbiAgICAgICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgYSBcIl9faG9zdF9oYW5kbGVcIiwgSGFzaHRibC5maW5kX29wdCBiIFwiX19ob3N0X2hhbmRsZVwiIHdpdGhcbiAgICAgICAgICAgIHwgU29tZSAoTnVtYmVyIGhhKSwgU29tZSAoTnVtYmVyIGhiKSAtPiBoYSA9IGhiXG4gICAgICAgICAgICB8IF8gLT4gZmFsc2UpXG4gICAgICAgICB8IF8gLT4gZmFsc2UpXG4gICAgICBpblxuICAgICAgQm9vbCAoTGlzdC5leGlzdHMgKGZ1biB4IC0+IHNhZmVfZXEgeCBpdGVtKSBsKVxuICAgIHwgW1N0cmluZyBzOyBTdHJpbmcgc3ViXSAtPlxuICAgICAgbGV0IHJlYyBmaW5kIGkgPVxuICAgICAgICBpZiBpICsgU3RyaW5nLmxlbmd0aCBzdWIgPiBTdHJpbmcubGVuZ3RoIHMgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGlmIFN0cmluZy5zdWIgcyBpIChTdHJpbmcubGVuZ3RoIHN1YikgPSBzdWIgdGhlbiB0cnVlXG4gICAgICAgIGVsc2UgZmluZCAoaSArIDEpXG4gICAgICBpbiBCb29sIChmaW5kIDApXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY29udGFpbnM/OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInJhbmdlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTnVtYmVyIHN0b3BdIC0+XG4gICAgICBsZXQgbiA9IGludF9vZl9mbG9hdCBzdG9wIGluXG4gICAgICBMaXN0IChMaXN0LmluaXQgKG1heCAwIG4pIChmdW4gaSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCBpKSkpXG4gICAgfCBbTnVtYmVyIHN0YXJ0OyBOdW1iZXIgc3RvcF0gLT5cbiAgICAgIGxldCBzID0gaW50X29mX2Zsb2F0IHN0YXJ0IGFuZCBlID0gaW50X29mX2Zsb2F0IHN0b3AgaW5cbiAgICAgIGxldCBsZW4gPSBtYXggMCAoZSAtIHMpIGluXG4gICAgICBMaXN0IChMaXN0LmluaXQgbGVuIChmdW4gaSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAocyArIGkpKSkpXG4gICAgfCBbTnVtYmVyIHN0YXJ0OyBOdW1iZXIgc3RvcDsgTnVtYmVyIHN0ZXBdIC0+XG4gICAgICBsZXQgcyA9IHN0YXJ0IGFuZCBlID0gc3RvcCBhbmQgc3QgPSBzdGVwIGluXG4gICAgICBpZiBzdCA9IDAuMCB0aGVuIExpc3QgW11cbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IGl0ZW1zID0gcmVmIFtdIGluXG4gICAgICAgIGxldCBpID0gcmVmIHMgaW5cbiAgICAgICAgaWYgc3QgPiAwLjAgdGhlblxuICAgICAgICAgICh3aGlsZSAhaSA8IGUgZG8gaXRlbXMgOj0gTnVtYmVyICFpIDo6ICFpdGVtczsgaSA6PSAhaSArLiBzdCBkb25lKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgKHdoaWxlICFpID4gZSBkbyBpdGVtcyA6PSBOdW1iZXIgIWkgOjogIWl0ZW1zOyBpIDo9ICFpICsuIHN0IGRvbmUpO1xuICAgICAgICBMaXN0IChMaXN0LnJldiAhaXRlbXMpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmFuZ2U6IDEtMyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJzbGljZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgWyhMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pOyBOdW1iZXIgc3RhcnRdIC0+XG4gICAgICBsZXQgaSA9IG1heCAwIChpbnRfb2ZfZmxvYXQgc3RhcnQpIGluXG4gICAgICBsZXQgcmVjIGRyb3AgbiA9IGZ1bmN0aW9uIF8gOjogeHMgd2hlbiBuID4gMCAtPiBkcm9wIChuLTEpIHhzIHwgbCAtPiBsIGluXG4gICAgICBMaXN0IChkcm9wIGkgbClcbiAgICB8IFsoTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9KTsgTnVtYmVyIHN0YXJ0OyBOdW1iZXIgZW5kX10gLT5cbiAgICAgIGxldCBpID0gbWF4IDAgKGludF9vZl9mbG9hdCBzdGFydCkgYW5kIGogPSBpbnRfb2ZfZmxvYXQgZW5kXyBpblxuICAgICAgbGV0IGxlbiA9IExpc3QubGVuZ3RoIGwgaW5cbiAgICAgIGxldCBqID0gbWluIGogbGVuIGluXG4gICAgICBsZXQgcmVjIHRha2VfcmFuZ2UgaWR4ID0gZnVuY3Rpb25cbiAgICAgICAgfCBbXSAtPiBbXVxuICAgICAgICB8IHggOjogeHMgLT5cbiAgICAgICAgICBpZiBpZHggPj0gaiB0aGVuIFtdXG4gICAgICAgICAgZWxzZSBpZiBpZHggPj0gaSB0aGVuIHggOjogdGFrZV9yYW5nZSAoaWR4KzEpIHhzXG4gICAgICAgICAgZWxzZSB0YWtlX3JhbmdlIChpZHgrMSkgeHNcbiAgICAgIGluIExpc3QgKHRha2VfcmFuZ2UgMCBsKVxuICAgIHwgW1N0cmluZyBzOyBOdW1iZXIgc3RhcnRdIC0+XG4gICAgICBsZXQgaSA9IG1heCAwIChpbnRfb2ZfZmxvYXQgc3RhcnQpIGluXG4gICAgICBTdHJpbmcgKFN0cmluZy5zdWIgcyBpIChtYXggMCAoU3RyaW5nLmxlbmd0aCBzIC0gaSkpKVxuICAgIHwgW1N0cmluZyBzOyBOdW1iZXIgc3RhcnQ7IE51bWJlciBlbmRfXSAtPlxuICAgICAgbGV0IGkgPSBtYXggMCAoaW50X29mX2Zsb2F0IHN0YXJ0KSBhbmQgaiA9IGludF9vZl9mbG9hdCBlbmRfIGluXG4gICAgICBsZXQgc2wgPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgICAgIGxldCBqID0gbWluIGogc2wgaW5cbiAgICAgIFN0cmluZyAoU3RyaW5nLnN1YiBzIGkgKG1heCAwIChqIC0gaSkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNsaWNlOiAyLTMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwic29ydFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBMaXN0IChMaXN0LnNvcnQgY29tcGFyZSBsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNvcnQ6IDEgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwiemlwXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT5cbiAgICAgIGxldCBsYSA9IGFzX2xpc3QgYSBhbmQgbGIgPSBhc19saXN0IGIgaW5cbiAgICAgIGxldCByZWMgZ28gbDEgbDIgYWNjID0gbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICAgICAgfCB4IDo6IHhzLCB5IDo6IHlzIC0+IGdvIHhzIHlzIChMaXN0IFt4OyB5XSA6OiBhY2MpXG4gICAgICAgIHwgXyAtPiBMaXN0LnJldiBhY2NcbiAgICAgIGluIExpc3QgKGdvIGxhIGxiIFtdKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInppcDogMiBsaXN0c1wiKSk7XG4gIHJlZ2lzdGVyIFwiemlwLXBhaXJzXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbdl0gLT5cbiAgICAgIGxldCBsID0gYXNfbGlzdCB2IGluXG4gICAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgICAgfCBhIDo6IGIgOjogcmVzdCAtPiBMaXN0IFthOyBiXSA6OiBnbyByZXN0XG4gICAgICAgIHwgXyAtPiBbXVxuICAgICAgaW4gTGlzdCAoZ28gbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ6aXAtcGFpcnM6IDEgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwidGFrZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgWyhMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pOyBOdW1iZXIgbl0gLT5cbiAgICAgIGxldCByZWMgdGFrZV9uIGkgPSBmdW5jdGlvblxuICAgICAgICB8IHggOjogeHMgd2hlbiBpID4gMCAtPiB4IDo6IHRha2VfbiAoaS0xKSB4c1xuICAgICAgICB8IF8gLT4gW11cbiAgICAgIGluIExpc3QgKHRha2VfbiAoaW50X29mX2Zsb2F0IG4pIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidGFrZTogbGlzdCBhbmQgbnVtYmVyXCIpKTtcbiAgcmVnaXN0ZXIgXCJkcm9wXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSk7IE51bWJlciBuXSAtPlxuICAgICAgbGV0IHJlYyBkcm9wX24gaSA9IGZ1bmN0aW9uXG4gICAgICAgIHwgXyA6OiB4cyB3aGVuIGkgPiAwIC0+IGRyb3BfbiAoaS0xKSB4c1xuICAgICAgICB8IGwgLT4gbFxuICAgICAgaW4gTGlzdCAoZHJvcF9uIChpbnRfb2ZfZmxvYXQgbikgbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkcm9wOiBsaXN0IGFuZCBudW1iZXJcIikpO1xuICByZWdpc3RlciBcImNodW5rLWV2ZXJ5XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSk7IE51bWJlciBuXSAtPlxuICAgICAgbGV0IHNpemUgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgW10gLT4gW11cbiAgICAgICAgfCBsIC0+XG4gICAgICAgICAgbGV0IHJlYyB0YWtlX24gaSA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IHggOjogeHMgd2hlbiBpID4gMCAtPiB4IDo6IHRha2VfbiAoaS0xKSB4c1xuICAgICAgICAgICAgfCBfIC0+IFtdXG4gICAgICAgICAgaW5cbiAgICAgICAgICBsZXQgcmVjIGRyb3BfbiBpID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgXyA6OiB4cyB3aGVuIGkgPiAwIC0+IGRyb3BfbiAoaS0xKSB4c1xuICAgICAgICAgICAgfCBsIC0+IGxcbiAgICAgICAgICBpblxuICAgICAgICAgIExpc3QgKHRha2VfbiBzaXplIGwpIDo6IGdvIChkcm9wX24gc2l6ZSBsKVxuICAgICAgaW4gTGlzdCAoZ28gbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjaHVuay1ldmVyeTogbGlzdCBhbmQgbnVtYmVyXCIpKTtcbiAgcmVnaXN0ZXIgXCJ1bmlxdWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFsoTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9KV0gLT5cbiAgICAgIGxldCBzZWVuID0gSGFzaHRibC5jcmVhdGUgMTYgaW5cbiAgICAgIGxldCByZXN1bHQgPSBMaXN0LmZpbHRlciAoZnVuIHggLT5cbiAgICAgICAgbGV0IGtleSA9IGluc3BlY3QgeCBpblxuICAgICAgICBpZiBIYXNodGJsLm1lbSBzZWVuIGtleSB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgKEhhc2h0YmwucmVwbGFjZSBzZWVuIGtleSB0cnVlOyB0cnVlKVxuICAgICAgKSBsIGluXG4gICAgICBMaXN0IHJlc3VsdFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInVuaXF1ZTogMSBsaXN0XCIpKTtcblxuICAoKiA9PT0gRGljdCA9PT0gKilcbiAgcmVnaXN0ZXIgXCJkaWN0XCIgKGZ1biBhcmdzIC0+XG4gICAgbGV0IGQgPSBtYWtlX2RpY3QgKCkgaW5cbiAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gRGljdCBkXG4gICAgICB8IEtleXdvcmQgayA6OiB2IDo6IHJlc3QgLT4gZGljdF9zZXQgZCBrIHY7IGdvIHJlc3RcbiAgICAgIHwgU3RyaW5nIGsgOjogdiA6OiByZXN0IC0+IGRpY3Rfc2V0IGQgayB2OyBnbyByZXN0XG4gICAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0OiBwYWlycyBvZiBrZXkgdmFsdWVcIilcbiAgICBpbiBnbyBhcmdzKTtcbiAgcmVnaXN0ZXIgXCJnZXRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGQ7IFN0cmluZyBrXSAtPiBkaWN0X2dldCBkIGtcbiAgICB8IFtEaWN0IGQ7IEtleXdvcmQga10gLT4gZGljdF9nZXQgZCBrXG4gICAgfCBbTGlzdCBsOyBOdW1iZXIgbl0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9OyBOdW1iZXIgbl0gLT5cbiAgICAgICh0cnkgTGlzdC5udGggbCAoaW50X29mX2Zsb2F0IG4pIHdpdGggXyAtPiBOaWwpXG4gICAgfCBbTmlsOyBfXSAtPiBOaWwgICgqIG5pbC5hbnl0aGluZyDihpIgbmlsICopXG4gICAgfCBbXzsgX10gLT4gTmlsICAgICgqIHR5cGUgbWlzbWF0Y2gg4oaSIG5pbCAobWF0Y2hlcyBKUy9QeXRob24gYmVoYXZpb3IpICopXG4gICAgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwiaGFzLWtleT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGQ7IFN0cmluZyBrXSAtPiBCb29sIChkaWN0X2hhcyBkIGspXG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGtdIC0+IEJvb2wgKGRpY3RfaGFzIGQgaylcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJoYXMta2V5PzogZGljdCBhbmQga2V5XCIpKTtcbiAgcmVnaXN0ZXIgXCJhc3NvY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgRGljdCBkIDo6IHJlc3QgLT5cbiAgICAgIGxldCBkMiA9IEhhc2h0YmwuY29weSBkIGluXG4gICAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgICAgfCBbXSAtPiBEaWN0IGQyXG4gICAgICAgIHwgU3RyaW5nIGsgOjogdiA6OiByZXN0IC0+IEhhc2h0YmwucmVwbGFjZSBkMiBrIHY7IGdvIHJlc3RcbiAgICAgICAgfCBLZXl3b3JkIGsgOjogdiA6OiByZXN0IC0+IEhhc2h0YmwucmVwbGFjZSBkMiBrIHY7IGdvIHJlc3RcbiAgICAgICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYXNzb2M6IHBhaXJzXCIpXG4gICAgICBpbiBnbyByZXN0XG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYXNzb2M6IGRpY3QgKyBwYWlyc1wiKSk7XG4gIHJlZ2lzdGVyIFwiZGlzc29jXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBEaWN0IGQgOjoga2V5cyAtPlxuICAgICAgbGV0IGQyID0gSGFzaHRibC5jb3B5IGQgaW5cbiAgICAgIExpc3QuaXRlciAoZnVuIGsgLT4gSGFzaHRibC5yZW1vdmUgZDIgKHRvX3N0cmluZyBrKSkga2V5cztcbiAgICAgIERpY3QgZDJcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaXNzb2M6IGRpY3QgKyBrZXlzXCIpKTtcbiAgcmVnaXN0ZXIgXCJtZXJnZVwiIChmdW4gYXJncyAtPlxuICAgIGxldCBkID0gbWFrZV9kaWN0ICgpIGluXG4gICAgTGlzdC5pdGVyIChmdW5jdGlvblxuICAgICAgfCBEaWN0IHNyYyAtPiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5yZXBsYWNlIGQgayB2KSBzcmNcbiAgICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1lcmdlOiBhbGwgYXJncyBtdXN0IGJlIGRpY3RzXCIpXG4gICAgKSBhcmdzO1xuICAgIERpY3QgZCk7XG4gIHJlZ2lzdGVyIFwia2V5c1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbRGljdCBkXSAtPiBMaXN0IChkaWN0X2tleXMgZCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwia2V5czogMSBkaWN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJ2YWxzXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtEaWN0IGRdIC0+IExpc3QgKGRpY3RfdmFscyBkKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ2YWxzOiAxIGRpY3RcIikpO1xuICByZWdpc3RlciBcIm11dGFibGUtbGlzdFwiIChmdW4gX2FyZ3MgLT4gTGlzdFJlZiAocmVmIFtdKSk7XG4gIHJlZ2lzdGVyIFwic2V0LW50aCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHI7IE51bWJlciBuOyB2XSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgbGV0IGwgPSAhciBpblxuICAgICAgciA6PSBMaXN0Lm1hcGkgKGZ1biBqIHggLT4gaWYgaiA9IGkgdGhlbiB2IGVsc2UgeCkgbDtcbiAgICAgIE5pbFxuICAgIHwgW0xpc3QgXzsgXzsgX10gLT5cbiAgICAgIHJhaXNlIChFdmFsX2Vycm9yIFwic2V0LW50aCE6IGxpc3QgaXMgaW1tdXRhYmxlLCB1c2UgTGlzdFJlZlwiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNldC1udGghOiBleHBlY3RlZCAobGlzdCBpZHggdmFsKVwiKSk7XG4gIHJlZ2lzdGVyIFwiZGljdC1zZXQhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcgazsgdl0gLT4gZGljdF9zZXQgZCBrIHY7IHZcbiAgICB8IFtEaWN0IGQ7IEtleXdvcmQgazsgdl0gLT4gZGljdF9zZXQgZCBrIHY7IHZcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LXNldCE6IGRpY3Qga2V5IHZhbFwiKSk7XG4gIHJlZ2lzdGVyIFwiZGljdC1nZXRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGQ7IFN0cmluZyBrXSAtPiBkaWN0X2dldCBkIGtcbiAgICB8IFtEaWN0IGQ7IEtleXdvcmQga10gLT4gZGljdF9nZXQgZCBrXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGljdC1nZXQ6IGRpY3QgYW5kIGtleVwiKSk7XG4gIHJlZ2lzdGVyIFwiZGljdC1oYXM/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gQm9vbCAoZGljdF9oYXMgZCBrKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRpY3QtaGFzPzogZGljdCBhbmQga2V5XCIpKTtcbiAgcmVnaXN0ZXIgXCJkaWN0LWRlbGV0ZSFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGQ7IFN0cmluZyBrXSAtPiBkaWN0X2RlbGV0ZSBkIGs7IE5pbFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRpY3QtZGVsZXRlITogZGljdCBhbmQga2V5XCIpKTtcblxuICAoKiA9PT0gTWlzYyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJ0eXBlLW9mXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBTdHJpbmcgKHR5cGVfb2YgYSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidHlwZS1vZjogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImluc3BlY3RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoaW5zcGVjdCBhKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJpbnNwZWN0OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic2VyaWFsaXplXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYV0gLT4gU3RyaW5nIChpbnNwZWN0IGEpICAoKiB1c2VkIGZvciBkZWR1cCBrZXlzIGluIGNvbXBpbGVyICopXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic2VyaWFsaXplOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibWFrZS1zeW1ib2xcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc10gLT4gU3ltYm9sIHNcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLXN5bWJvbDogZXhwZWN0ZWQgc3RyaW5nXCIpKTtcbiAgcmVnaXN0ZXIgXCJlcnJvclwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIG1zZ10gLT4gcmFpc2UgKEV2YWxfZXJyb3IgbXNnKVxuICAgIHwgW2FdIC0+IHJhaXNlIChFdmFsX2Vycm9yICh0b19zdHJpbmcgYSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZXJyb3I6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJhcHBseVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW05hdGl2ZUZuIChfLCBmKTsgKExpc3QgYSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGEgfSldIC0+IGYgYVxuICAgIHwgW05hdGl2ZUZuIChfLCBmKTsgTmlsXSAtPiBmIFtdXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYXBwbHk6IGZ1bmN0aW9uIGFuZCBsaXN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJpZGVudGljYWw/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthOyBiXSAtPiBCb29sIChhID09IGIpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImlkZW50aWNhbD86IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwibWFrZS1zcHJlYWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGRdIC0+XG4gICAgICBsZXQgcGFpcnMgPSBIYXNodGJsLmZvbGQgKGZ1biBrIHYgYWNjIC0+IChrLCB2KSA6OiBhY2MpIGQgW10gaW5cbiAgICAgIFNwcmVhZCBwYWlyc1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2Utc3ByZWFkOiAxIGRpY3RcIikpO1xuICByZWdpc3RlciBcInNwcmVhZD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1NwcmVhZCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNwcmVhZD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJzcHJlYWQtYXR0cnNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTcHJlYWQgcGFpcnNdIC0+XG4gICAgICBsZXQgZCA9IG1ha2VfZGljdCAoKSBpblxuICAgICAgTGlzdC5pdGVyIChmdW4gKGssIHYpIC0+IGRpY3Rfc2V0IGQgayB2KSBwYWlycztcbiAgICAgIERpY3QgZFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNwcmVhZC1hdHRyczogMSBzcHJlYWRcIikpO1xuXG4gICgqIEhpZ2hlci1vcmRlciBmb3JtcyBhcyBjYWxsYWJsZSBwcmltaXRpdmVzIOKAlCB1c2VkIGJ5IHRoZSBWTS5cbiAgICAgVGhlIENFSyBtYWNoaW5lIGhhbmRsZXMgdGhlc2UgYXMgc3BlY2lhbCBmb3JtcyB3aXRoIGRlZGljYXRlZCBmcmFtZXM7XG4gICAgIHRoZSBWTSBuZWVkcyB0aGVtIGFzIHBsYWluIGNhbGxhYmxlIHZhbHVlcy4gKilcbiAgKCogQ2FsbCBhbnkgU1ggY2FsbGFibGUg4oCUIGhhbmRsZXMgTmF0aXZlRm4sIExhbWJkYSAodmlhIHRyYW1wb2xpbmUpLCBWTSBjbG9zdXJlcyAqKVxuICBsZXQgY2FsbF9hbnkgZiBhcmdzID1cbiAgICBtYXRjaCBmIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJnc1xuICAgIHwgXyAtPiAhX3N4X3RyYW1wb2xpbmVfZm4gKCFfc3hfY2FsbF9mbiBmIGFyZ3MpXG4gIGluXG4gIHJlZ2lzdGVyIFwibWFwXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZjsgKExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9KV0gLT5cbiAgICAgIExpc3QgKExpc3QubWFwIChmdW4geCAtPiBjYWxsX2FueSBmIFt4XSkgaXRlbXMpXG4gICAgfCBbXzsgTmlsXSAtPiBMaXN0IFtdXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFwOiBleHBlY3RlZCAoZm4gbGlzdClcIikpO1xuICByZWdpc3RlciBcIm1hcC1pbmRleGVkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZjsgKExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9KV0gLT5cbiAgICAgIExpc3QgKExpc3QubWFwaSAoZnVuIGkgeCAtPiBjYWxsX2FueSBmIFtOdW1iZXIgKGZsb2F0X29mX2ludCBpKTsgeF0pIGl0ZW1zKVxuICAgIHwgW187IE5pbF0gLT4gTGlzdCBbXVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1hcC1pbmRleGVkOiBleHBlY3RlZCAoZm4gbGlzdClcIikpO1xuICByZWdpc3RlciBcImZpbHRlclwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBMaXN0IChMaXN0LmZpbHRlciAoZnVuIHggLT4gc3hfdHJ1dGh5IChjYWxsX2FueSBmIFt4XSkpIGl0ZW1zKVxuICAgIHwgW187IE5pbF0gLT4gTGlzdCBbXVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImZpbHRlcjogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJmb3ItZWFjaFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBMaXN0Lml0ZXIgKGZ1biB4IC0+IGlnbm9yZSAoY2FsbF9hbnkgZiBbeF0pKSBpdGVtczsgTmlsXG4gICAgfCBbXzsgTmlsXSAtPiBOaWwgICgqIG5pbCBjb2xsZWN0aW9uID0gbm8tb3AgKilcbiAgICB8IF8gLT5cbiAgICAgIGxldCB0eXBlcyA9IFN0cmluZy5jb25jYXQgXCIsIFwiIChMaXN0Lm1hcCAoZnVuIHYgLT4gdHlwZV9vZiB2KSBhcmdzKSBpblxuICAgICAgcmFpc2UgKEV2YWxfZXJyb3IgKFByaW50Zi5zcHJpbnRmIFwiZm9yLWVhY2g6IGV4cGVjdGVkIChmbiBsaXN0KSwgZ290ICglcykgJWQgYXJnc1wiIHR5cGVzIChMaXN0Lmxlbmd0aCBhcmdzKSkpKTtcbiAgcmVnaXN0ZXIgXCJyZWR1Y2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyBpbml0OyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdC5mb2xkX2xlZnQgKGZ1biBhY2MgeCAtPiBjYWxsX2FueSBmIFthY2M7IHhdKSBpbml0IGl0ZW1zXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmVkdWNlOiBleHBlY3RlZCAoZm4gaW5pdCBsaXN0KVwiKSk7XG4gIHJlZ2lzdGVyIFwic29tZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICAodHJ5IExpc3QuZmluZCAoZnVuIHggLT4gc3hfdHJ1dGh5IChjYWxsX2FueSBmIFt4XSkpIGl0ZW1zXG4gICAgICAgd2l0aCBOb3RfZm91bmQgLT4gQm9vbCBmYWxzZSlcbiAgICB8IFtfOyBOaWxdIC0+IEJvb2wgZmFsc2VcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzb21lOiBleHBlY3RlZCAoZm4gbGlzdClcIikpO1xuICByZWdpc3RlciBcImV2ZXJ5P1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBCb29sIChMaXN0LmZvcl9hbGwgKGZ1biB4IC0+IHN4X3RydXRoeSAoY2FsbF9hbnkgZiBbeF0pKSBpdGVtcylcbiAgICB8IFtfOyBOaWxdIC0+IEJvb2wgdHJ1ZVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImV2ZXJ5PzogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcblxuICAoKiAtLS0tIFZNIHN0YWNrIHByaW1pdGl2ZXMgKHZtLnN4IHBsYXRmb3JtIGludGVyZmFjZSkgLS0tLSAqKVxuICByZWdpc3RlciBcIm1ha2Utdm0tc3RhY2tcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtOdW1iZXIgbl0gLT4gTGlzdFJlZiAocmVmIChMaXN0LmluaXQgKGludF9vZl9mbG9hdCBuKSAoZnVuIF8gLT4gTmlsKSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFrZS12bS1zdGFjazogZXhwZWN0ZWQgKHNpemUpXCIpKTtcbiAgcmVnaXN0ZXIgXCJ2bS1zdGFjay1nZXRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHI7IE51bWJlciBuXSAtPiBMaXN0Lm50aCAhciAoaW50X29mX2Zsb2F0IG4pXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidm0tc3RhY2stZ2V0OiBleHBlY3RlZCAoc3RhY2sgaWR4KVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stc2V0IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3RSZWYgcjsgTnVtYmVyIG47IHZdIC0+XG4gICAgICBsZXQgaSA9IGludF9vZl9mbG9hdCBuIGluXG4gICAgICByIDo9IExpc3QubWFwaSAoZnVuIGogeCAtPiBpZiBqID0gaSB0aGVuIHYgZWxzZSB4KSAhcjsgTmlsXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidm0tc3RhY2stc2V0ITogZXhwZWN0ZWQgKHN0YWNrIGlkeCB2YWwpXCIpKTtcbiAgcmVnaXN0ZXIgXCJ2bS1zdGFjay1sZW5ndGhcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHJdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChMaXN0Lmxlbmd0aCAhcikpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidm0tc3RhY2stbGVuZ3RoOiBleHBlY3RlZCAoc3RhY2spXCIpKTtcbiAgcmVnaXN0ZXIgXCJ2bS1zdGFjay1jb3B5IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3RSZWYgc3JjOyBMaXN0UmVmIGRzdDsgTnVtYmVyIG5dIC0+XG4gICAgICBsZXQgY291bnQgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgbGV0IHNyY19pdGVtcyA9ICFzcmMgaW5cbiAgICAgIGRzdCA6PSBMaXN0Lm1hcGkgKGZ1biBpIHggLT4gaWYgaSA8IGNvdW50IHRoZW4gTGlzdC5udGggc3JjX2l0ZW1zIGkgZWxzZSB4KSAhZHN0OyBOaWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ2bS1zdGFjay1jb3B5ITogZXhwZWN0ZWQgKHNyYyBkc3QgY291bnQpXCIpKTtcbiAgcmVnaXN0ZXIgXCJwcmltaXRpdmU/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIC0+IEJvb2wgKEhhc2h0YmwubWVtIHByaW1pdGl2ZXMgbmFtZSlcbiAgICB8IF8gLT4gQm9vbCBmYWxzZSk7XG5cbiAgKCogU2NvcGUgc3RhY2sgcHJpbWl0aXZlcyBhcmUgcmVnaXN0ZXJlZCBieSBzeF9zZXJ2ZXIubWwgLyBydW5fdGVzdHMubWxcbiAgICAgYmVjYXVzZSB0aGV5IHVzZSBhIHNoYXJlZCBzY29wZSBzdGFja3MgdGFibGUgd2l0aCBjb2xsZWN0IS9jb2xsZWN0ZWQuICopXG5cbiAgKCogLS0tLSBQcmVkaWNhdGVzIG5lZWRlZCBieSBhZGFwdGVyLWh0bWwuc3ggLS0tLSAqKVxuICByZWdpc3RlciBcImxhbWJkYT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImlzbGFuZD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0lzbGFuZCBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImlzLWVsc2UtY2xhdXNlP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0tleXdvcmQgXCJlbHNlXCJdIC0+IEJvb2wgdHJ1ZVxuICAgIHwgW0Jvb2wgdHJ1ZV0gLT4gQm9vbCB0cnVlXG4gICAgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImNvbXBvbmVudD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBfXSAtPiBCb29sIHRydWUgfCBbSXNsYW5kIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIHJlZ2lzdGVyIFwibGFtYmRhLWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBsXSAtPiBFbnYgbC5sX2Nsb3N1cmUgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwiY29tcG9uZW50LWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gRW52IGMuY19jbG9zdXJlXG4gICAgfCBbSXNsYW5kIGldIC0+IEVudiBpLmlfY2xvc3VyZVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IEJvb2wgYy5jX2hhc19jaGlsZHJlblxuICAgIHwgW0lzbGFuZCBpXSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW5cbiAgICB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIHJlZ2lzdGVyIFwiY29tcG9uZW50LW5hbWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gU3RyaW5nIGMuY19uYW1lXG4gICAgfCBbSXNsYW5kIGldIC0+IFN0cmluZyBpLmlfbmFtZVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBjLmNfcGFyYW1zKVxuICAgIHwgW0lzbGFuZCBpXSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGkuaV9wYXJhbXMpXG4gICAgfCBfIC0+IExpc3QgW10pO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1ib2R5XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IGMuY19ib2R5XG4gICAgfCBbSXNsYW5kIGldIC0+IGkuaV9ib2R5XG4gICAgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwibWFjcm8/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtNYWNybyBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImZvci1lYWNoLWluZGV4ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdC5pdGVyaSAoZnVuIGkgeCAtPiBpZ25vcmUgKGNhbGxfYW55IGYgW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyB4XSkpIGl0ZW1zOyBOaWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmb3ItZWFjaC1pbmRleGVkOiBleHBlY3RlZCAoZm4gbGlzdClcIikpO1xuICByZWdpc3RlciBcImxhbWJkYS1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMYW1iZGEgbF0gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBsLmxfcGFyYW1zKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcbiAgcmVnaXN0ZXIgXCJsYW1iZGEtYm9keVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIGxdIC0+IGwubF9ib2R5IHwgXyAtPiBOaWwpO1xuICAoKiBleHBhbmQtbWFjcm8gaXMgcmVnaXN0ZXJlZCBsYXRlciBieSBydW5fdGVzdHMubWwgLyBzeF9zZXJ2ZXIubWxcbiAgICAgYmVjYXVzZSBpdCBuZWVkcyBldmFsX2V4cHIgd2hpY2ggY3JlYXRlcyBhIGRlcGVuZGVuY3kgY3ljbGUgKik7XG4gIHJlZ2lzdGVyIFwiZW1wdHktZGljdD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGRdIC0+IEJvb2wgKEhhc2h0YmwubGVuZ3RoIGQgPSAwKVxuICAgIHwgXyAtPiBCb29sIHRydWUpO1xuICByZWdpc3RlciBcIm1ha2UtcmF3LWh0bWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBSYXdIVE1MIHMgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwicmF3LWh0bWwtY29udGVudFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbUmF3SFRNTCBzXSAtPiBTdHJpbmcgcyB8IF8gLT4gU3RyaW5nIFwiXCIpO1xuICByZWdpc3RlciBcImdldC1wcmltaXRpdmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gICAgICAgfCBTb21lIGZuIC0+IE5hdGl2ZUZuIChuYW1lLCBmbilcbiAgICAgICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVk0gdW5kZWZpbmVkOiBcIiBeIG5hbWUpKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJnZXQtcHJpbWl0aXZlOiBleHBlY3RlZCAobmFtZSlcIikpO1xuICByZWdpc3RlciBcImNhbGwtcHJpbWl0aXZlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWU7IChMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0pXSAtPlxuICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgcHJpbWl0aXZlcyBuYW1lIHdpdGhcbiAgICAgICB8IFNvbWUgZm4gLT4gZm4gYVxuICAgICAgIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpKVxuICAgIHwgW1N0cmluZyBuYW1lOyBOaWxdIC0+XG4gICAgICAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBwcmltaXRpdmVzIG5hbWUgd2l0aFxuICAgICAgIHwgU29tZSBmbiAtPiBmbiBbXVxuICAgICAgIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNhbGwtcHJpbWl0aXZlOiBleHBlY3RlZCAobmFtZSBhcmdzLWxpc3QpXCIpKTtcbiAgKClcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIiwiY2FtbF9yb3VuZF9mbG9hdCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfSGFzaHRibCIsIlN4X3R5cGVzIiwiU3RkbGliIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliX1ByaW50ZiIsIlN0ZGxpYl9MaXN0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfVWNoYXIiLCJwcmltaXRpdmVzIiwic3hfY2FsbF9mbiIsInBhcmFtIiwic3hfdHJhbXBvbGluZV9mbiIsInYiLCJyZWdpc3RlciIsIm5hbWUiLCJmbiIsImlzX3ByaW1pdGl2ZSIsImdldF9wcmltaXRpdmUiLCJtYXRjaCIsInRyYW1wb2xpbmVfaG9vayIsImNzdCIsImNzdF9kaWN0IiwiYXNfbnVtYmVyIiwidCIsIm4iLCJzIiwiZCIsImFzX3N0cmluZyIsImFzX2xpc3QiLCJsIiwiciIsImFzX2Jvb2wiLCJiIiwiY3N0X2ciLCJjc3RfZmFsc2UiLCJjc3RfdHJ1ZSIsInRvX3N0cmluZyIsImFyZ3MiLCJhY2MiLCJhIiwicmVzdCIsIngiLCJwbGFjZXMiLCJmYWN0b3IiLCJoaSIsImxvIiwiZGVmYXVsdF92YWwiLCJjc3RfaG9zdF9oYW5kbGUiLCJzYWZlX2VxIiwieSIsImxhIiwiaGIiLCJoYSIsImxiIiwibmVlZGxlIiwiaGF5c3RhY2siLCJpIiwicHJlZml4Iiwic3VmZml4Iiwic2wiLCJ4bCIsIm5sIiwiaGwiLCJlbmQiLCJzdGFydCIsImoiLCJsZW4iLCJzZXAiLCJwIiwiaXRlbXMiLCJ0b19zdHIiLCJuZXdfcyIsIm9sZF9zIiwib2wiLCJidWYiLCJjc3RfYXJncyIsInBhaXJzIiwieHMiLCJleG4iLCJhbGwiLCJmbGF0Iiwic3ViIiwiaXRlbSIsInN0b3AiLCJlIiwic3RlcCIsInRha2VfcmFuZ2UiLCJpZHgiLCJsMSIsImwyIiwieXMiLCJnbyIsInRha2VfbiIsInNpemUiLCJzZWVuIiwicmVzdWx0Iiwia2V5IiwiayIsImQyIiwia2V5cyIsInNyYyIsIm1zZyIsImNhbGxfYW55IiwidHlwZXMiLCJpbml0IiwiZHN0IiwiY291bnQiLCJzcmNfaXRlbXMiLCJjIiwiY3N0X1ZNX3VuZGVmaW5lZCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsYUNPMkQ7QUFBQSxJQUFBQztBQUFBQSxNQUFrQjtBQUFBLG1CQUFBQztBQUFBQSxRQUkzRDtBQUFBO0FBQUEsT0FBNEM7QUFBQSxJQUFBQyxtQkFKZSxhQUFBQyxHQU03RCxTQUFDO0FBQUEsWUFBQUMsU0FBQUMsTUFBQUM7QUFBQUEsSUFFTSwwREFBa0M7QUFBQTtBQUFBLFlBQUFDLGFBQUFGO0FBQUFBLElBRWpDLHFEQUEyQjtBQUFBO0FBQUEsWUFBQUcsY0FBQUg7QUFBQUEsUUFBQUksUUFHM0M7QUFBQSxJQUFn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UUFBeUI7QUFBQTtBQUFBO0FBQUEsTUFDakQ7QUFBQTtBQUFBLEtBQW1EO0FBQUEsR0FDNUQ7QUFBQTtBQUFBLGNBQUFzQjtBQUFBQTtBQUFBQSxNQUFBO0FBQUEsZUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFBdkIsT0FBQTtBQUFBO0FBQUE7QUFBQSxlQUFBSSxRQU1TO0FBQUEsV0FBZ0MsY0FBQUgsS0FBQSxVQUN6Qix3QkFFcUQ7QUFBQSxtQkFEdEM7QUFBQSxXQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUnhEO0FBQUE7QUFBQSxpQkFBQXdCLElBQUE7QUFBQTtBQUFBLGlCQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBQXJCLFVBRVM7QUFBQSxXQUFnQyxnQkFBQUgsT0FBQSxZQUN6QiwwQkFNcUQ7QUFBQSxtQkFMdEM7QUFBQSxXQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtqRDtBQUFBO0FBQUE7QUFBQSxLQUE4RDtBQUFBLEdBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEeDFCMUUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyODc0NSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcnVudGltZS5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKiBSdW50aW1lIGhlbHBlcnMgZm9yIHRyYW5zcGlsZWQgY29kZS5cblxuICAgIFRoZXNlIGJyaWRnZSB0aGUgZ2FwIGJldHdlZW4gdGhlIHRyYW5zcGlsZXIncyBvdXRwdXQgYW5kIHRoZVxuICAgIGZvdW5kYXRpb24gdHlwZXMvcHJpbWl0aXZlcy4gVGhlIHRyYW5zcGlsZWQgZXZhbHVhdG9yIGNhbGxzIHRoZXNlXG4gICAgZnVuY3Rpb25zIGRpcmVjdGx5LiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqKiBDYWxsIGEgcmVnaXN0ZXJlZCBwcmltaXRpdmUgYnkgbmFtZS4gKilcbmxldCBwcmltX2NhbGwgbmFtZSBhcmdzID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBTeF9wcmltaXRpdmVzLnByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gIHwgU29tZSBmIC0+IGYgYXJnc1xuICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5rbm93biBwcmltaXRpdmU6IFwiIF4gbmFtZSkpXG5cbigqKiBDb252ZXJ0IGFueSBTWCB2YWx1ZSB0byBhbiBPQ2FtbCBzdHJpbmcgKGludGVybmFsKS4gKilcbmxldCB2YWx1ZV90b19zdHIgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE5pbCAtPiBcIlwiXG4gIHwgU3ltYm9sIHMgLT4gc1xuICB8IEtleXdvcmQgayAtPiBrXG4gIHwgdiAtPiBpbnNwZWN0IHZcblxuKCoqIHN4X3RvX3N0cmluZyByZXR1cm5zIGEgdmFsdWUgKFN0cmluZykgZm9yIHRyYW5zcGlsZWQgY29kZS4gKilcbmxldCBzeF90b19zdHJpbmcgdiA9IFN0cmluZyAodmFsdWVfdG9fc3RyIHYpXG5cbigqKiBTdHJpbmcgY29uY2F0ZW5hdGlvbiBoZWxwZXIg4oCUIFtzeF9zdHJdIHRha2VzIGEgbGlzdCBvZiB2YWx1ZXMuICopXG5sZXQgc3hfc3RyIGFyZ3MgPVxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIHZhbHVlX3RvX3N0ciBhcmdzKVxuXG4oKiogQ29udmVydCBhIHZhbHVlIHRvIGEgbGlzdC4gKilcbmxldCBzeF90b19saXN0ID0gZnVuY3Rpb25cbiAgfCBMaXN0IGwgLT4gbFxuICB8IExpc3RSZWYgciAtPiAhclxuICB8IE5pbCAtPiBbXVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxuKCoqIENhbGwgYW4gU1ggY2FsbGFibGUgKGxhbWJkYSwgbmF0aXZlIGZuLCBjb250aW51YXRpb24pLiAqKVxubGV0IHN4X2NhbGwgZiBhcmdzID1cbiAgbWF0Y2ggZiB3aXRoXG4gIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzXG4gIHwgVm1DbG9zdXJlIGNsIC0+ICFTeF90eXBlcy5fdm1fY2FsbF9jbG9zdXJlX3JlZiBjbCBhcmdzXG4gIHwgTGFtYmRhIGwgLT5cbiAgICBsZXQgbG9jYWwgPSBTeF90eXBlcy5lbnZfZXh0ZW5kIGwubF9jbG9zdXJlIGluXG4gICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKFN4X3R5cGVzLmVudl9iaW5kIGxvY2FsIHAgYSkpIGwubF9wYXJhbXMgYXJncztcbiAgICBUaHVuayAobC5sX2JvZHksIGxvY2FsKVxuICB8IENvbnRpbnVhdGlvbiAoaywgXykgLT5cbiAgICBrIChtYXRjaCBhcmdzIHdpdGggeCA6OiBfIC0+IHggfCBbXSAtPiBOaWwpXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJOb3QgY2FsbGFibGU6IFwiIF4gaW5zcGVjdCBmKSlcblxuKCogSW5pdGlhbGl6ZSBmb3J3YXJkIHJlZiBzbyBwcmltaXRpdmVzIGNhbiBjYWxsIFNYIGZ1bmN0aW9ucyAqKVxubGV0ICgpID0gU3hfcHJpbWl0aXZlcy5fc3hfY2FsbF9mbiA6PSBzeF9jYWxsXG4oKiBUcmFtcG9saW5lIHJlZiBpcyBzZXQgYnkgc3hfcmVmLm1sIGFmdGVyIGl0J3MgbG9hZGVkICopXG5cbigqKiBBcHBseSBhIGZ1bmN0aW9uIHRvIGEgbGlzdCBvZiBhcmdzLiAqKVxubGV0IHN4X2FwcGx5IGYgYXJnc19saXN0ID1cbiAgc3hfY2FsbCBmIChzeF90b19saXN0IGFyZ3NfbGlzdClcblxuKCoqIE11dGFibGUgYXBwZW5kIOKAlCBhZGQgaXRlbSB0byBhIGxpc3QgcmVmIG9yIGFjY3VtdWxhdG9yLlxuICAgIEluIHRyYW5zcGlsZWQgY29kZSwgbGlzdHMgdGhhdCBnZXQgYXBwZW5kZWQgdG8gYXJlIG11dGFibGUgcmVmcy4gKilcbmxldCBzeF9hcHBlbmRfYiBsc3QgaXRlbSA9XG4gIG1hdGNoIGxzdCB3aXRoXG4gIHwgTGlzdCBpdGVtcyAtPiBMaXN0IChpdGVtcyBAIFtpdGVtXSlcbiAgfCBMaXN0UmVmIHIgLT4gciA6PSAhciBAIFtpdGVtXTsgbHN0ICAoKiBtdXRhdGUgaW4gcGxhY2UsIHJldHVybiBzYW1lIHJlZiAqKVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiYXBwZW5kITogZXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiBsc3QpKVxuXG4oKiogTXV0YWJsZSBkaWN0LXNldCDigJQgc2V0IGtleSBpbiBkaWN0LCByZXR1cm4gdmFsdWUuICopXG5sZXQgc3hfZGljdF9zZXRfYiBkIGsgdiA9XG4gIG1hdGNoIGQsIGsgd2l0aFxuICB8IERpY3QgdGJsLCBTdHJpbmcga2V5IC0+IEhhc2h0YmwucmVwbGFjZSB0Ymwga2V5IHY7IHZcbiAgfCBEaWN0IHRibCwgS2V5d29yZCBrZXkgLT4gSGFzaHRibC5yZXBsYWNlIHRibCBrZXkgdjsgdlxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LXNldCE6IGV4cGVjdGVkIGRpY3QgYW5kIHN0cmluZyBrZXlcIilcblxuKCoqIEdldCBmcm9tIGRpY3Qgb3IgbGlzdC4gKilcbmxldCBnZXRfdmFsIGNvbnRhaW5lciBrZXkgPVxuICBtYXRjaCBjb250YWluZXIsIGtleSB3aXRoXG4gIHwgQ2VrU3RhdGUgcywgU3RyaW5nIGsgLT5cbiAgICAobWF0Y2ggayB3aXRoXG4gICAgIHwgXCJjb250cm9sXCIgLT4gcy5jc19jb250cm9sIHwgXCJlbnZcIiAtPiBzLmNzX2VudlxuICAgICB8IFwia29udFwiIC0+IHMuY3Nfa29udCB8IFwicGhhc2VcIiAtPiBTdHJpbmcgcy5jc19waGFzZVxuICAgICB8IFwidmFsdWVcIiAtPiBzLmNzX3ZhbHVlIHwgXyAtPiBOaWwpXG4gIHwgQ2VrRnJhbWUgZiwgU3RyaW5nIGsgLT5cbiAgICAobWF0Y2ggayB3aXRoXG4gICAgIHwgXCJ0eXBlXCIgLT4gU3RyaW5nIGYuY2ZfdHlwZSB8IFwiZW52XCIgLT4gZi5jZl9lbnZcbiAgICAgfCBcIm5hbWVcIiAtPiBmLmNmX25hbWUgfCBcImJvZHlcIiAtPiBmLmNmX2JvZHlcbiAgICAgfCBcInJlbWFpbmluZ1wiIC0+IGYuY2ZfcmVtYWluaW5nIHwgXCJmXCIgLT4gZi5jZl9mXG4gICAgIHwgXCJhcmdzXCIgLT4gZi5jZl9hcmdzIHwgXCJldmFsZWRcIiAtPiBmLmNmX2FyZ3NcbiAgICAgfCBcInJlc3VsdHNcIiAtPiBmLmNmX3Jlc3VsdHMgfCBcInJhdy1hcmdzXCIgLT4gZi5jZl9yZXN1bHRzXG4gICAgIHwgXCJ0aGVuXCIgLT4gZi5jZl9ib2R5IHwgXCJlbHNlXCIgLT4gZi5jZl9uYW1lXG4gICAgIHwgXCJoby10eXBlXCIgLT4gZi5jZl9leHRyYSB8IFwic2NoZW1lXCIgLT4gZi5jZl9leHRyYVxuICAgICB8IFwiaW5kZXhlZFwiIC0+IGYuY2ZfZXh0cmEgfCBcInZhbHVlXCIgLT4gZi5jZl9leHRyYVxuICAgICB8IFwicGhhc2VcIiAtPiBmLmNmX2V4dHJhIHwgXCJoYXMtZWZmZWN0c1wiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcIm1hdGNoLXZhbFwiIC0+IGYuY2ZfZXh0cmEgfCBcImN1cnJlbnQtaXRlbVwiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcInVwZGF0ZS1mblwiIC0+IGYuY2ZfZXh0cmEgfCBcImhlYWQtbmFtZVwiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcImVtaXR0ZWRcIiAtPiBmLmNmX2V4dHJhMiB8IFwiZWZmZWN0LWxpc3RcIiAtPiBmLmNmX2V4dHJhMlxuICAgICB8IFwiZmlyc3QtcmVuZGVyXCIgLT4gZi5jZl9leHRyYTJcbiAgICAgfCBfIC0+IE5pbClcbiAgfCBEaWN0IGQsIFN0cmluZyBrIC0+IGRpY3RfZ2V0IGQga1xuICB8IERpY3QgZCwgS2V5d29yZCBrIC0+IGRpY3RfZ2V0IGQga1xuICB8IChMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pLCBOdW1iZXIgbiAtPlxuICAgICh0cnkgTGlzdC5udGggbCAoaW50X29mX2Zsb2F0IG4pIHdpdGggXyAtPiBOaWwpXG4gIHwgTmlsLCBfIC0+IE5pbCAgKCogbmlsLmFueXRoaW5nIOKGkiBuaWwgKilcbiAgfCBfLCBfIC0+IE5pbCAgICAoKiB0eXBlIG1pc21hdGNoIOKGkiBuaWwgKG1hdGNoZXMgSlMvUHl0aG9uIGJlaGF2aW9yKSAqKVxuXG4oKiogUmVnaXN0ZXIgZ2V0IGFzIGEgcHJpbWl0aXZlIG92ZXJyaWRlIOKAlCB0cmFuc3BpbGVkIGNvZGUgY2FsbHMgKGdldCBkIGspLiAqKVxubGV0ICgpID1cbiAgU3hfcHJpbWl0aXZlcy5yZWdpc3RlciBcImdldFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2M7IGtdIC0+IGdldF92YWwgYyBrXG4gICAgfCBbYzsgazsgZGVmYXVsdF0gLT5cbiAgICAgICh0cnlcbiAgICAgICAgbGV0IHYgPSBnZXRfdmFsIGMgayBpblxuICAgICAgICBpZiB2ID0gTmlsIHRoZW4gZGVmYXVsdCBlbHNlIHZcbiAgICAgIHdpdGggXyAtPiBkZWZhdWx0KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImdldDogMi0zIGFyZ3NcIikpXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogUHJpbWl0aXZlIGFsaWFzZXMg4oCUIHRvcC1sZXZlbCBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRyYW5zcGlsZWQgY29kZSAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG4oKiogVGhlIHRyYW5zcGlsZWQgZXZhbHVhdG9yIGNhbGxzIHByaW1pdGl2ZXMgZGlyZWN0bHkgYnkgdGhlaXIgbWFuZ2xlZFxuICAgIE9DYW1sIG5hbWUuIFRoZXNlIGFsaWFzZXMgZGVsZWdhdGUgdG8gdGhlIHByaW1pdGl2ZXMgdGFibGUgc28gdGhlXG4gICAgdHJhbnNwaWxlZCBjb2RlIGNvbXBpbGVzIHdpdGhvdXQgbmVlZGluZyBbcHJpbV9jYWxsXSBldmVyeXdoZXJlLiAqKVxuXG5sZXQgX3ByaW0gbmFtZSA9IG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIG5hbWUgd2l0aFxuICB8IFNvbWUgZiAtPiBmIHwgTm9uZSAtPiAoZnVuIF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiTWlzc2luZyBwcmltOiBcIiBeIG5hbWUpKSlcblxuKCogQ29sbGVjdGlvbiBvcHMgKilcbmxldCBmaXJzdCBhcmdzID0gX3ByaW0gXCJmaXJzdFwiIFthcmdzXVxubGV0IHJlc3QgYXJncyA9IF9wcmltIFwicmVzdFwiIFthcmdzXVxubGV0IGxhc3QgYXJncyA9IF9wcmltIFwibGFzdFwiIFthcmdzXVxubGV0IG50aCBjb2xsIGkgPSBfcHJpbSBcIm50aFwiIFtjb2xsOyBpXVxubGV0IGNvbnMgeCBsID0gX3ByaW0gXCJjb25zXCIgW3g7IGxdXG5sZXQgYXBwZW5kIGEgYiA9IF9wcmltIFwiYXBwZW5kXCIgW2E7IGJdXG5sZXQgcmV2ZXJzZSBsID0gX3ByaW0gXCJyZXZlcnNlXCIgW2xdXG5sZXQgZmxhdHRlbiBsID0gX3ByaW0gXCJmbGF0dGVuXCIgW2xdXG5sZXQgY29uY2F0IGEgYiA9IF9wcmltIFwiY29uY2F0XCIgW2E7IGJdXG5sZXQgc2xpY2UgYSBiID0gX3ByaW0gXCJzbGljZVwiIFthOyBiXVxubGV0IGxlbiBhID0gX3ByaW0gXCJsZW5cIiBbYV1cbmxldCBnZXQgYSBiID0gZ2V0X3ZhbCBhIGJcbmxldCBzb3J0JyBhID0gX3ByaW0gXCJzb3J0XCIgW2FdXG5sZXQgcmFuZ2UnIGEgPSBfcHJpbSBcInJhbmdlXCIgW2FdXG5sZXQgdW5pcXVlIGEgPSBfcHJpbSBcInVuaXF1ZVwiIFthXVxubGV0IHppcCBhIGIgPSBfcHJpbSBcInppcFwiIFthOyBiXVxubGV0IHppcF9wYWlycyBhID0gX3ByaW0gXCJ6aXAtcGFpcnNcIiBbYV1cbmxldCB0YWtlIGEgYiA9IF9wcmltIFwidGFrZVwiIFthOyBiXVxubGV0IGRyb3AgYSBiID0gX3ByaW0gXCJkcm9wXCIgW2E7IGJdXG5sZXQgY2h1bmtfZXZlcnkgYSBiID0gX3ByaW0gXCJjaHVuay1ldmVyeVwiIFthOyBiXVxuXG4oKiBQcmVkaWNhdGVzICopXG5sZXQgZW1wdHlfcCBhID0gX3ByaW0gXCJlbXB0eT9cIiBbYV1cbmxldCBuaWxfcCBhID0gX3ByaW0gXCJuaWw/XCIgW2FdXG5sZXQgbnVtYmVyX3AgYSA9IF9wcmltIFwibnVtYmVyP1wiIFthXVxubGV0IHN0cmluZ19wIGEgPSBfcHJpbSBcInN0cmluZz9cIiBbYV1cbmxldCBib29sZWFuX3AgYSA9IF9wcmltIFwiYm9vbGVhbj9cIiBbYV1cbmxldCBsaXN0X3AgYSA9IF9wcmltIFwibGlzdD9cIiBbYV1cbmxldCBkaWN0X3AgYSA9IF9wcmltIFwiZGljdD9cIiBbYV1cbmxldCBzeW1ib2xfcCBhID0gX3ByaW0gXCJzeW1ib2w/XCIgW2FdXG5sZXQga2V5d29yZF9wIGEgPSBfcHJpbSBcImtleXdvcmQ/XCIgW2FdXG5sZXQgY29udGFpbnNfcCBhIGIgPSBfcHJpbSBcImNvbnRhaW5zP1wiIFthOyBiXVxubGV0IGhhc19rZXlfcCBhIGIgPSBfcHJpbSBcImhhcy1rZXk/XCIgW2E7IGJdXG5sZXQgc3RhcnRzX3dpdGhfcCBhIGIgPSBfcHJpbSBcInN0YXJ0cy13aXRoP1wiIFthOyBiXVxubGV0IGVuZHNfd2l0aF9wIGEgYiA9IF9wcmltIFwiZW5kcy13aXRoP1wiIFthOyBiXVxubGV0IHN0cmluZ19jb250YWluc19wIGEgYiA9IF9wcmltIFwic3RyaW5nLWNvbnRhaW5zP1wiIFthOyBiXVxubGV0IG9kZF9wIGEgPSBfcHJpbSBcIm9kZD9cIiBbYV1cbmxldCBldmVuX3AgYSA9IF9wcmltIFwiZXZlbj9cIiBbYV1cbmxldCB6ZXJvX3AgYSA9IF9wcmltIFwiemVybz9cIiBbYV1cblxuKCogU3RyaW5nIG9wcyAqKVxubGV0IHN0cicgYXJncyA9IFN0cmluZyAoc3hfc3RyIGFyZ3MpXG5sZXQgdXBwZXIgYSA9IF9wcmltIFwidXBwZXJcIiBbYV1cbmxldCB1cGNhc2UgYSA9IF9wcmltIFwidXBjYXNlXCIgW2FdXG5sZXQgbG93ZXIgYSA9IF9wcmltIFwibG93ZXJcIiBbYV1cbmxldCBkb3duY2FzZSBhID0gX3ByaW0gXCJkb3duY2FzZVwiIFthXVxubGV0IHRyaW0gYSA9IF9wcmltIFwidHJpbVwiIFthXVxubGV0IHNwbGl0IGEgYiA9IF9wcmltIFwic3BsaXRcIiBbYTsgYl1cbmxldCBqb2luIGEgYiA9IF9wcmltIFwiam9pblwiIFthOyBiXVxubGV0IHJlcGxhY2UgYSBiIGMgPSBfcHJpbSBcInJlcGxhY2VcIiBbYTsgYjsgY11cbmxldCBpbmRleF9vZiBhIGIgPSBfcHJpbSBcImluZGV4LW9mXCIgW2E7IGJdXG5sZXQgc3Vic3RyaW5nIGEgYiBjID0gX3ByaW0gXCJzdWJzdHJpbmdcIiBbYTsgYjsgY11cbmxldCBzdHJpbmdfbGVuZ3RoIGEgPSBfcHJpbSBcInN0cmluZy1sZW5ndGhcIiBbYV1cbmxldCBjaGFyX2Zyb21fY29kZSBhID0gX3ByaW0gXCJjaGFyLWZyb20tY29kZVwiIFthXVxuXG4oKiBEaWN0IG9wcyAqKVxubGV0IGFzc29jIGQgayB2ID0gX3ByaW0gXCJhc3NvY1wiIFtkOyBrOyB2XVxubGV0IGRpc3NvYyBkIGsgPSBfcHJpbSBcImRpc3NvY1wiIFtkOyBrXVxubGV0IG1lcmdlJyBhIGIgPSBfcHJpbSBcIm1lcmdlXCIgW2E7IGJdXG5sZXQga2V5cyBhID0gX3ByaW0gXCJrZXlzXCIgW2FdXG5sZXQgdmFscyBhID0gX3ByaW0gXCJ2YWxzXCIgW2FdXG5sZXQgZGljdF9zZXQgYSBiIGMgPSBfcHJpbSBcImRpY3Qtc2V0IVwiIFthOyBiOyBjXVxubGV0IGRpY3RfZ2V0IGEgYiA9IF9wcmltIFwiZGljdC1nZXRcIiBbYTsgYl1cbmxldCBkaWN0X2hhc19wIGEgYiA9IF9wcmltIFwiZGljdC1oYXM/XCIgW2E7IGJdXG5sZXQgZGljdF9kZWxldGUgYSBiID0gX3ByaW0gXCJkaWN0LWRlbGV0ZSFcIiBbYTsgYl1cblxuKCogTWF0aCAqKVxubGV0IGFicycgYSA9IF9wcmltIFwiYWJzXCIgW2FdXG5sZXQgc3FydCcgYSA9IF9wcmltIFwic3FydFwiIFthXVxubGV0IHBvdycgYSBiID0gX3ByaW0gXCJwb3dcIiBbYTsgYl1cbmxldCBmbG9vcicgYSA9IF9wcmltIFwiZmxvb3JcIiBbYV1cbmxldCBjZWlsJyBhID0gX3ByaW0gXCJjZWlsXCIgW2FdXG5sZXQgcm91bmQnIGEgPSBfcHJpbSBcInJvdW5kXCIgW2FdXG5sZXQgbWluJyBhIGIgPSBfcHJpbSBcIm1pblwiIFthOyBiXVxubGV0IG1heCcgYSBiID0gX3ByaW0gXCJtYXhcIiBbYTsgYl1cbmxldCBjbGFtcCBhIGIgYyA9IF9wcmltIFwiY2xhbXBcIiBbYTsgYjsgY11cbmxldCBwYXJzZV9pbnQgYSA9IF9wcmltIFwicGFyc2UtaW50XCIgW2FdXG5sZXQgcGFyc2VfZmxvYXQgYSA9IF9wcmltIFwicGFyc2UtZmxvYXRcIiBbYV1cblxuKCogTWlzYyAqKVxubGV0IGVycm9yIG1zZyA9IHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgbXNnKSlcblxuKCogaW5zcGVjdCB3cmFwcGVyIOKAlCByZXR1cm5zIFN0cmluZyB2YWx1ZSBpbnN0ZWFkIG9mIE9DYW1sIHN0cmluZyAqKVxubGV0IGluc3BlY3QgdiA9IFN0cmluZyAoU3hfdHlwZXMuaW5zcGVjdCB2KVxubGV0IGFwcGx5JyBmIGFyZ3MgPSBzeF9hcHBseSBmIGFyZ3NcbmxldCBpZGVudGljYWxfcCBhIGIgPSBfcHJpbSBcImlkZW50aWNhbD9cIiBbYTsgYl1cbmxldCBfaXNfc3ByZWFkX3ByaW0gYSA9IF9wcmltIFwic3ByZWFkP1wiIFthXVxubGV0IHNwcmVhZF9hdHRycyBhID0gX3ByaW0gXCJzcHJlYWQtYXR0cnNcIiBbYV1cbmxldCBtYWtlX3NwcmVhZCBhID0gX3ByaW0gXCJtYWtlLXNwcmVhZFwiIFthXVxuXG4oKiBTY29wZSBwcmltaXRpdmVzIOKAlCBkZWxlZ2F0ZSB0byBzeF9yZWYucHkncyBzaGFyZWQgc2NvcGUgc3RhY2tzICopXG5sZXQgc3hfY29sbGVjdCBhIGIgPSBwcmltX2NhbGwgXCJjb2xsZWN0IVwiIFthOyBiXVxubGV0IHN4X2NvbGxlY3RlZCBhID0gcHJpbV9jYWxsIFwiY29sbGVjdGVkXCIgW2FdXG5sZXQgc3hfY2xlYXJfY29sbGVjdGVkIGEgPSBwcmltX2NhbGwgXCJjbGVhci1jb2xsZWN0ZWQhXCIgW2FdXG5sZXQgc3hfZW1pdCBhIGIgPSBwcmltX2NhbGwgXCJlbWl0IVwiIFthOyBiXVxubGV0IHN4X2VtaXR0ZWQgYSA9IHByaW1fY2FsbCBcImVtaXR0ZWRcIiBbYV1cbmxldCBzeF9jb250ZXh0IGEgYiA9IHByaW1fY2FsbCBcImNvbnRleHRcIiBbYTsgYl1cblxuKCogVHJhbXBvbGluZSDigJQgZm9yd2FyZC1kZWNsYXJlZCBpbiBzeF9yZWYubWwsIGRlbGVnYXRlcyB0byBDRUsgZXZhbF9leHByICopXG4oKiBUaGlzIGlzIGEgc3R1YjsgdGhlIHJlYWwgdHJhbXBvbGluZSBpcyB3aXJlZCB1cCBpbiBzeF9yZWYubWwgYWZ0ZXIgZXZhbF9leHByIGlzIGRlZmluZWQgKilcbmxldCB0cmFtcG9saW5lIHYgPSB2XG5cbigqIFZhbHVlLXJldHVybmluZyB0eXBlIHByZWRpY2F0ZXMg4oCUIHRoZSB0cmFuc3BpbGVkIGNvZGUgcGFzc2VzIHRoZXNlIHRocm91Z2hcbiAgIHN4X3RydXRoeSwgc28gdGhleSBuZWVkIHRvIHJldHVybiBCb29sLCBub3QgT0NhbWwgYm9vbC4gKilcbigqIHR5cGVfb2YgcmV0dXJucyB2YWx1ZSwgbm90IHN0cmluZyAqKVxubGV0IHR5cGVfb2YgdiA9IFN0cmluZyAoU3hfdHlwZXMudHlwZV9vZiB2KVxuXG4oKiBFbnYgb3BlcmF0aW9ucyDigJQgYWNjZXB0IEVudi13cmFwcGVkIHZhbHVlcyBhbmQgdmFsdWUga2V5cy5cbiAgIFRoZSB0cmFuc3BpbGVkIENFSyBtYWNoaW5lIHN0b3JlcyBlbnZzIGluIGRpY3RzIGFzIEVudiB2YWx1ZXMuICopXG5sZXQgdW53cmFwX2VudiA9IGZ1bmN0aW9uXG4gIHwgRW52IGUgLT4gZVxuICB8IERpY3QgZCAtPlxuICAgICgqIERpY3QgdXNlZCBhcyBlbnYg4oCUIHdyYXAgaXQuIE5lZWRlZCBieSBhZGFwdGVyLWh0bWwuc3ggd2hpY2hcbiAgICAgICBwYXNzZXMgZGljdHMgYXMgZW52IGFyZ3MgKGUuZy4gZW1wdHkge30gYXMgY2FsbGVyIGVudikuICopXG4gICAgbGV0IGUgPSBTeF90eXBlcy5tYWtlX2VudiAoKSBpblxuICAgIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBpZ25vcmUgKFN4X3R5cGVzLmVudl9iaW5kIGUgayB2KSkgZDtcbiAgICBlXG4gIHwgTmlsIC0+XG4gICAgU3hfdHlwZXMubWFrZV9lbnYgKClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGVudiwgZ290IFwiIF4gU3hfdHlwZXMudHlwZV9vZiB2KSlcblxubGV0IGVudl9oYXMgZSBuYW1lID0gQm9vbCAoU3hfdHlwZXMuZW52X2hhcyAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpKVxubGV0IGVudl9nZXQgZSBuYW1lID0gU3hfdHlwZXMuZW52X2dldCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpXG5sZXQgZW52X2JpbmQgZSBuYW1lIHYgPSBTeF90eXBlcy5lbnZfYmluZCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpIHZcbmxldCBlbnZfc2V0IGUgbmFtZSB2ID0gU3hfdHlwZXMuZW52X3NldCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpIHZcblxubGV0IG1ha2VfZW52ICgpID0gRW52IChTeF90eXBlcy5tYWtlX2VudiAoKSlcbmxldCBlbnZfZXh0ZW5kIGUgPSBFbnYgKFN4X3R5cGVzLmVudl9leHRlbmQgKHVud3JhcF9lbnYgZSkpXG5sZXQgZW52X21lcmdlIGEgYiA9IEVudiAoU3hfdHlwZXMuZW52X21lcmdlICh1bndyYXBfZW52IGEpICh1bndyYXBfZW52IGIpKVxuXG4oKiBzZXRfbGFtYmRhX25hbWUgd3JhcHBlciDigJQgYWNjZXB0cyB2YWx1ZSwgZXh0cmFjdHMgc3RyaW5nICopXG5sZXQgc2V0X2xhbWJkYV9uYW1lIGwgbiA9IFN4X3R5cGVzLnNldF9sYW1iZGFfbmFtZSBsICh2YWx1ZV90b19zdHIgbilcblxubGV0IGlzX25pbCB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfbmlsIHYpXG5sZXQgaXNfdGh1bmsgdiA9IEJvb2wgKFN4X3R5cGVzLmlzX3RodW5rIHYpXG5sZXQgaXNfbGFtYmRhIHYgPSBCb29sIChTeF90eXBlcy5pc19sYW1iZGEgdilcbmxldCBpc19jb21wb25lbnQgdiA9IEJvb2wgKFN4X3R5cGVzLmlzX2NvbXBvbmVudCB2KVxubGV0IGlzX2lzbGFuZCB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfaXNsYW5kIHYpXG5sZXQgaXNfbWFjcm8gdiA9IEJvb2wgKFN4X3R5cGVzLmlzX21hY3JvIHYpXG5sZXQgaXNfc2lnbmFsIHYgPSBCb29sIChTeF90eXBlcy5pc19zaWduYWwgdilcbmxldCBpc19jYWxsYWJsZSB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfY2FsbGFibGUgdilcbmxldCBpc19pZGVudGljYWwgYSBiID0gQm9vbCAoYSA9PSBiKVxubGV0IGlzX3ByaW1pdGl2ZSBuYW1lID0gQm9vbCAoU3hfcHJpbWl0aXZlcy5pc19wcmltaXRpdmUgKHZhbHVlX3RvX3N0ciBuYW1lKSlcbmxldCBnZXRfcHJpbWl0aXZlIG5hbWUgPSBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgKHZhbHVlX3RvX3N0ciBuYW1lKVxubGV0IGlzX3NwcmVhZCB2ID0gbWF0Y2ggdiB3aXRoIFNwcmVhZCBfIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZVxuXG4oKiBTdHVicyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gc3hfcmVmLm1sIOKAlCByZXNvbHZlZCBhdCBsaW5rIHRpbWUgKilcbigqIFRoZXNlIGFyZSBmb3J3YXJkLWRlY2xhcmVkIGhlcmU7IHN4X3JlZi5tbCBkZWZpbmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zICopXG5cbigqIHN0cmlwLXByZWZpeCAqKVxuKCogU3R1YnMgZm9yIGV2YWx1YXRvciBmdW5jdGlvbnMg4oCUIGRlZmluZWQgaW4gc3hfcmVmLm1sIGJ1dFxuICAgc29tZXRpbWVzIHJlZmVyZW5jZWQgYmVmb3JlIHRoZWlyIGRlZmluaXRpb24gdmlhIGZvcndhcmQgY2FsbHMuXG4gICBUaGVzZSBnZXQgb3ZlcnJpZGRlbiBieSB0aGUgYWN0dWFsIHRyYW5zcGlsZWQgZGVmaW5pdGlvbnMuICopXG5cbmxldCBtYXBfaW5kZXhlZCBmbiBjb2xsID1cbiAgTGlzdCAoTGlzdC5tYXBpIChmdW4gaSB4IC0+IHN4X2NhbGwgZm4gW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyB4XSkgKHN4X3RvX2xpc3QgY29sbCkpXG5cbmxldCBtYXBfZGljdCBmbiBkID1cbiAgbWF0Y2ggZCB3aXRoXG4gIHwgRGljdCB0YmwgLT5cbiAgICBsZXQgcmVzdWx0ID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIHRibCkgaW5cbiAgICBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5yZXBsYWNlIHJlc3VsdCBrIChzeF9jYWxsIGZuIFtTdHJpbmcgazsgdl0pKSB0Ymw7XG4gICAgRGljdCByZXN1bHRcbiAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFwLWRpY3Q6IGV4cGVjdGVkIGRpY3RcIilcblxubGV0IGZvcl9lYWNoIGZuIGNvbGwgPVxuICBMaXN0Lml0ZXIgKGZ1biB4IC0+IGlnbm9yZSAoc3hfY2FsbCBmbiBbeF0pKSAoc3hfdG9fbGlzdCBjb2xsKTtcbiAgTmlsXG5cbmxldCBmb3JfZWFjaF9pbmRleGVkIGZuIGNvbGwgPVxuICBMaXN0Lml0ZXJpIChmdW4gaSB4IC0+IGlnbm9yZSAoc3hfY2FsbCBmbiBbTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IHhdKSkgKHN4X3RvX2xpc3QgY29sbCk7XG4gIE5pbFxuXG4oKiBDb250aW51YXRpb24gc3VwcG9ydCAqKVxubGV0IGNvbnRpbnVhdGlvbl9wIHYgPSBtYXRjaCB2IHdpdGggQ29udGludWF0aW9uIChfLCBfKSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2VcblxubGV0IG1ha2VfY2VrX2NvbnRpbnVhdGlvbiBjYXB0dXJlZCByZXN0X2tvbnQgPVxuICBsZXQgZGF0YSA9IEhhc2h0YmwuY3JlYXRlIDIgaW5cbiAgSGFzaHRibC5yZXBsYWNlIGRhdGEgXCJjYXB0dXJlZFwiIGNhcHR1cmVkO1xuICBIYXNodGJsLnJlcGxhY2UgZGF0YSBcInJlc3Qta29udFwiIHJlc3Rfa29udDtcbiAgQ29udGludWF0aW9uICgoZnVuIHYgLT4gdiksIFNvbWUgZGF0YSlcblxubGV0IGNvbnRpbnVhdGlvbl9kYXRhIHYgPSBtYXRjaCB2IHdpdGhcbiAgfCBDb250aW51YXRpb24gKF8sIFNvbWUgZCkgLT4gRGljdCBkXG4gIHwgQ29udGludWF0aW9uIChfLCBOb25lKSAtPiBEaWN0IChIYXNodGJsLmNyZWF0ZSAwKVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJub3QgYSBjb250aW51YXRpb25cIilcblxuKCogRHluYW1pYyB3aW5kIOKAlCBzaW1wbGlmaWVkIGZvciBPQ2FtbCAobm8gYXN5bmMpICopXG5sZXQgZHluYW1pY193aW5kX2NhbGwgYmVmb3JlIGJvZHkgYWZ0ZXIgX2VudiA9XG4gIGlnbm9yZSAoc3hfY2FsbCBiZWZvcmUgW10pO1xuICBsZXQgcmVzdWx0ID0gc3hfY2FsbCBib2R5IFtdIGluXG4gIGlnbm9yZSAoc3hfY2FsbCBhZnRlciBbXSk7XG4gIHJlc3VsdFxuXG4oKiBTY29wZSBzdGFjayDigJQgYWxsIGRlbGVnYXRlZCB0byBwcmltaXRpdmVzIHJlZ2lzdGVyZWQgaW4gc3hfc2VydmVyLm1sICopXG5sZXQgc2NvcGVfcHVzaCBuYW1lIHZhbHVlID0gcHJpbV9jYWxsIFwic2NvcGUtcHVzaCFcIiBbbmFtZTsgdmFsdWVdXG5sZXQgc2NvcGVfcG9wIG5hbWUgPSBwcmltX2NhbGwgXCJzY29wZS1wb3AhXCIgW25hbWVdXG5sZXQgc2NvcGVfcGVlayBuYW1lID0gcHJpbV9jYWxsIFwic2NvcGUtcGVla1wiIFtuYW1lXVxubGV0IHNjb3BlX2VtaXQgbmFtZSB2YWx1ZSA9IHByaW1fY2FsbCBcInNjb3BlLWVtaXQhXCIgW25hbWU7IHZhbHVlXVxubGV0IHByb3ZpZGVfcHVzaCBuYW1lIHZhbHVlID0gcHJpbV9jYWxsIFwic2NvcGUtcHVzaCFcIiBbbmFtZTsgdmFsdWVdXG5sZXQgcHJvdmlkZV9wb3AgbmFtZSA9IHByaW1fY2FsbCBcInNjb3BlLXBvcCFcIiBbbmFtZV1cblxuKCogQ3VzdG9tIHNwZWNpYWwgZm9ybXMgcmVnaXN0cnkg4oCUIG11dGFibGUgZGljdCAqKVxubGV0IGN1c3RvbV9zcGVjaWFsX2Zvcm1zID0gRGljdCAoSGFzaHRibC5jcmVhdGUgNClcblxuKCogcmVnaXN0ZXItc3BlY2lhbC1mb3JtISDigJQgYWRkIGEgaGFuZGxlciB0byB0aGUgY3VzdG9tIHJlZ2lzdHJ5ICopXG5sZXQgcmVnaXN0ZXJfc3BlY2lhbF9mb3JtIG5hbWUgaGFuZGxlciA9XG4gIChtYXRjaCBjdXN0b21fc3BlY2lhbF9mb3JtcyB3aXRoXG4gICB8IERpY3QgdGJsIC0+IEhhc2h0YmwucmVwbGFjZSB0YmwgKHZhbHVlX3RvX3N0ciBuYW1lKSBoYW5kbGVyOyBoYW5kbGVyXG4gICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjdXN0b21fc3BlY2lhbF9mb3JtcyBub3QgYSBkaWN0XCIpKVxuXG4oKiBSZW5kZXIgY2hlY2svZm4gaG9va3Mg4oCUIG5pbCBieSBkZWZhdWx0LCBzZXQgYnkgcGxhdGZvcm0gaWYgbmVlZGVkICopXG5sZXQgcmVuZGVyX2NoZWNrID0gTmlsXG5sZXQgcmVuZGVyX2ZuID0gTmlsXG5cbigqIGlzLWVsc2UtY2xhdXNlPyDigJQgY2hlY2sgaWYgYSBjb25kL2Nhc2UgdGVzdCBpcyBhbiBlbHNlIG1hcmtlciAqKVxubGV0IGlzX2Vsc2VfY2xhdXNlIHYgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBLZXl3b3JkIGsgLT4gQm9vbCAoayA9IFwiZWxzZVwiIHx8IGsgPSBcImRlZmF1bHRcIilcbiAgfCBTeW1ib2wgcyAtPiBCb29sIChzID0gXCJlbHNlXCIgfHwgcyA9IFwiZGVmYXVsdFwiKVxuICB8IEJvb2wgdHJ1ZSAtPiBCb29sIHRydWVcbiAgfCBfIC0+IEJvb2wgZmFsc2VcblxuKCogU2lnbmFsIGFjY2Vzc29ycyAqKVxubGV0IHNpZ25hbF92YWx1ZSBzID0gbWF0Y2ggcyB3aXRoXG4gIHwgU2lnbmFsIHNpZycgLT4gc2lnJy5zX3ZhbHVlXG4gIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJ2YWx1ZVwiIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IE5pbClcbiAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibm90IGEgc2lnbmFsXCIpXG5sZXQgc2lnbmFsX3NldF92YWx1ZSBzIHYgPSBtYXRjaCBzIHdpdGggU2lnbmFsIHNpZycgLT4gc2lnJy5zX3ZhbHVlIDwtIHY7IHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibm90IGEgc2lnbmFsXCIpXG5sZXQgc2lnbmFsX3N1YnNjcmliZXJzIHMgPSBtYXRjaCBzIHdpdGggU2lnbmFsIHNpZycgLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBfIC0+IE5pbCkgc2lnJy5zX3N1YnNjcmliZXJzKSB8IF8gLT4gTGlzdCBbXVxubGV0IHNpZ25hbF9hZGRfc3ViX2IgcyBmID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCBkIC0+XG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcInN1YnNjcmliZXJzXCIgd2l0aFxuICAgICB8IFNvbWUgKExpc3RSZWYgcikgLT4gciA6PSAhciBAIFtmXTsgTmlsXG4gICAgIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gSGFzaHRibC5yZXBsYWNlIGQgXCJzdWJzY3JpYmVyc1wiIChMaXN0UmVmIChyZWYgKGl0ZW1zIEAgW2ZdKSkpOyBOaWxcbiAgICAgfCBfIC0+IEhhc2h0YmwucmVwbGFjZSBkIFwic3Vic2NyaWJlcnNcIiAoTGlzdFJlZiAocmVmIFtmXSkpOyBOaWwpXG4gIHwgXyAtPiBOaWxcblxubGV0IHNpZ25hbF9yZW1vdmVfc3ViX2IgcyBmID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCBkIC0+XG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcInN1YnNjcmliZXJzXCIgd2l0aFxuICAgICB8IFNvbWUgKExpc3RSZWYgcikgLT4gciA6PSBMaXN0LmZpbHRlciAoZnVuIHggLT4geCAhPSBmKSAhcjsgTmlsXG4gICAgIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gSGFzaHRibC5yZXBsYWNlIGQgXCJzdWJzY3JpYmVyc1wiIChMaXN0IChMaXN0LmZpbHRlciAoZnVuIHggLT4geCAhPSBmKSBpdGVtcykpOyBOaWxcbiAgICAgfCBfIC0+IE5pbClcbiAgfCBfIC0+IE5pbFxuXG5sZXQgc2lnbmFsX2RlcHMgcyA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IERpY3QgZCAtPiAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwiZGVwc1wiIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IExpc3QgW10pXG4gIHwgXyAtPiBMaXN0IFtdXG5cbmxldCBzaWduYWxfc2V0X2RlcHMgcyBkID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCB0YmwgLT4gSGFzaHRibC5yZXBsYWNlIHRibCBcImRlcHNcIiBkOyBOaWxcbiAgfCBfIC0+IE5pbFxuXG5sZXQgbm90aWZ5X3N1YnNjcmliZXJzIHMgPVxuICBsZXQgc3VicyA9IG1hdGNoIHMgd2l0aFxuICAgIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJzdWJzY3JpYmVyc1wiIHdpdGhcbiAgICAgICB8IFNvbWUgKExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gaXRlbXNcbiAgICAgICB8IF8gLT4gW10pXG4gICAgfCBfIC0+IFtdXG4gIGluXG4gIExpc3QuaXRlciAoZnVuIGYgLT4gaWdub3JlIChzeF9jYWxsIGYgW10pKSBzdWJzO1xuICBOaWxcblxubGV0IGZsdXNoX3N1YnNjcmliZXJzIF9zID0gTmlsXG5sZXQgZGlzcG9zZV9jb21wdXRlZCBfcyA9IE5pbFxuXG4oKiBJc2xhbmQgc2NvcGUgc3R1YnMg4oCUIGFjY2VwdCBib3RoIGJhcmUgT0NhbWwgZm5zIGFuZCBOYXRpdmVGbiB2YWx1ZXNcbiAgIGZyb20gdHJhbnNwaWxlZCBjb2RlIChOYXRpdmVGbiB3cmFwcGluZyBmb3IgdmFsdWUtc3RvcmFibGUgbGFtYmRhcykuICopXG5sZXQgd2l0aF9pc2xhbmRfc2NvcGUgX3JlZ2lzdGVyX2ZuIGJvZHlfZm4gPVxuICBtYXRjaCBib2R5X2ZuIHdpdGhcbiAgfCBOYXRpdmVGbiAoXywgZikgLT4gZiBbXVxuICB8IF8gLT4gTmlsXG5sZXQgcmVnaXN0ZXJfaW5fc2NvcGUgX2Rpc3Bvc2VfZm4gPSBOaWxcblxuKCogQ29tcG9uZW50IHR5cGUgYW5ub3RhdGlvbiBzdHViICopXG5sZXQgY29tcG9uZW50X3NldF9wYXJhbV90eXBlc19iIF9jb21wIF90eXBlcyA9IE5pbFxuXG4oKiBQYXJzZSBrZXl3b3JkIGFyZ3MgZnJvbSBhIGNhbGwg4oCUIHRoaXMgaXMgZGVmaW5lZCBpbiBldmFsdWF0b3Iuc3gsXG4gICB0aGUgdHJhbnNwaWxlZCB2ZXJzaW9uIHdpbGwgb3ZlcnJpZGUgdGhpcyBzdHViLiAqKVxuKCogRm9yd2FyZC1yZWZlcmVuY2Ugc3R1YnMgZm9yIGV2YWx1YXRvciBmdW5jdGlvbnMgdXNlZCBiZWZvcmUgZGVmaW5pdGlvbiAqKVxubGV0IHBhcnNlX2NvbXBfcGFyYW1zIF9wYXJhbXMgPSBMaXN0IFtMaXN0IFtdOyBOaWw7IEJvb2wgZmFsc2VdXG5sZXQgcGFyc2VfbWFjcm9fcGFyYW1zIF9wYXJhbXMgPSBMaXN0IFtMaXN0IFtdOyBOaWxdXG5cbmxldCBwYXJzZV9rZXl3b3JkX2FyZ3MgX3Jhd19hcmdzIF9lbnYgPVxuICAoKiBTdHViIOKAlCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBpcyB0cmFuc3BpbGVkIGZyb20gZXZhbHVhdG9yLnN4ICopXG4gIExpc3QgW0RpY3QgKEhhc2h0YmwuY3JlYXRlIDApOyBMaXN0IFtdXVxuXG4oKiBNYWtlIGhhbmRsZXIvcXVlcnkvYWN0aW9uL3BhZ2UgZGVmIHN0dWJzICopXG5sZXQgbWFrZV9oYW5kbGVyX2RlZiBuYW1lIHBhcmFtcyBib2R5IF9lbnYgPSBEaWN0IChsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDQgaW4gSGFzaHRibC5yZXBsYWNlIGQgXCJ0eXBlXCIgKFN0cmluZyBcImhhbmRsZXJcIik7IEhhc2h0YmwucmVwbGFjZSBkIFwibmFtZVwiIG5hbWU7IEhhc2h0YmwucmVwbGFjZSBkIFwicGFyYW1zXCIgcGFyYW1zOyBIYXNodGJsLnJlcGxhY2UgZCBcImJvZHlcIiBib2R5OyBkKVxubGV0IG1ha2VfcXVlcnlfZGVmIG5hbWUgcGFyYW1zIGJvZHkgX2VudiA9IG1ha2VfaGFuZGxlcl9kZWYgbmFtZSBwYXJhbXMgYm9keSBfZW52XG5sZXQgbWFrZV9hY3Rpb25fZGVmIG5hbWUgcGFyYW1zIGJvZHkgX2VudiA9IG1ha2VfaGFuZGxlcl9kZWYgbmFtZSBwYXJhbXMgYm9keSBfZW52XG5sZXQgbWFrZV9wYWdlX2RlZiBuYW1lIF9vcHRzID0gRGljdCAobGV0IGQgPSBIYXNodGJsLmNyZWF0ZSA0IGluIEhhc2h0YmwucmVwbGFjZSBkIFwidHlwZVwiIChTdHJpbmcgXCJwYWdlXCIpOyBIYXNodGJsLnJlcGxhY2UgZCBcIm5hbWVcIiBuYW1lOyBkKVxuXG4oKiBzZi1kZWYqIHN0dWJzIOKAlCBwbGF0Zm9ybS1zcGVjaWZpYyBkZWYtZm9ybXMsIG5vdCBpbiB0aGUgU1ggc3BlYyAqKVxubGV0IHNmX2RlZmhhbmRsZXIgYXJncyBlbnYgPVxuICBsZXQgbmFtZSA9IGZpcnN0IGFyZ3MgaW4gbGV0IHJlc3RfYXJncyA9IHJlc3QgYXJncyBpblxuICBtYWtlX2hhbmRsZXJfZGVmIG5hbWUgKGZpcnN0IHJlc3RfYXJncykgKG50aCByZXN0X2FyZ3MgKE51bWJlciAxLjApKSBlbnZcbmxldCBzZl9kZWZxdWVyeSBhcmdzIGVudiA9IHNmX2RlZmhhbmRsZXIgYXJncyBlbnZcbmxldCBzZl9kZWZhY3Rpb24gYXJncyBlbnYgPSBzZl9kZWZoYW5kbGVyIGFyZ3MgZW52XG5sZXQgc2ZfZGVmcGFnZSBhcmdzIF9lbnYgPVxuICBsZXQgbmFtZSA9IGZpcnN0IGFyZ3MgaW4gbWFrZV9wYWdlX2RlZiBuYW1lIChyZXN0IGFyZ3MpXG5cbmxldCBzdHJpcF9wcmVmaXggcyBwcmVmaXggPVxuICBtYXRjaCBzLCBwcmVmaXggd2l0aFxuICB8IFN0cmluZyBzLCBTdHJpbmcgcCAtPlxuICAgIGxldCBwbCA9IFN0cmluZy5sZW5ndGggcCBpblxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA+PSBwbCAmJiBTdHJpbmcuc3ViIHMgMCBwbCA9IHBcbiAgICB0aGVuIFN0cmluZyAoU3RyaW5nLnN1YiBzIHBsIChTdHJpbmcubGVuZ3RoIHMgLSBwbCkpXG4gICAgZWxzZSBTdHJpbmcgc1xuICB8IF8gLT4gc1xuXG4oKiBkZWJ1Z19sb2cg4oCUIG5vLW9wIGluIHByb2R1Y3Rpb24sIHVzZWQgYnkgQ0VLIGV2YWx1YXRvciBmb3IgY29tcG9uZW50IHdhcm5pbmdzICopXG5sZXQgZGVidWdfbG9nIF8gXyA9IE5pbFxuXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2NvbXBhcmUiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYiIsIlN4X3R5cGVzIiwiU3hfcHJpbWl0aXZlcyIsIlN0ZGxpYl9GbG9hdCIsIlN0ZGxpYl9QcmludGYiLCJwcmltX2NhbGwiLCJuYW1lIiwiYXJncyIsIm1hdGNoIiwiY3N0IiwidmFsdWVfdG9fc3RyIiwidiIsIm4iLCJzIiwic3hfdG9fc3RyaW5nIiwic3hfc3RyIiwic3hfdG9fbGlzdCIsImwiLCJyIiwic3hfY2FsbCIsImxvY2FsIiwicCIsImEiLCJrIiwieCIsImZuIiwiY2wiLCJzeF9hcHBseSIsImFyZ3NfbGlzdCIsInN4X2FwcGVuZF9iIiwibHN0IiwiaXRlbSIsIml0ZW1zIiwic3hfZGljdF9zZXRfYiIsImQiLCJ0YmwiLCJrZXkiLCJjc3RfYm9keSIsImNzdF9lbHNlIiwiY3N0X2VtaXR0ZWQiLCJjc3RfbmFtZSIsImNzdF90eXBlIiwiY3N0X3ZhbHVlIiwiZ2V0X3ZhbCIsImNvbnRhaW5lciIsImNzdF9lbnYiLCJjc3RfcGhhc2UiLCJzd2l0Y2gkIiwiZXhuIiwiYyIsImRlZmF1bHQkIiwicHJpbSIsInBhcmFtIiwiZmlyc3QiLCJyZXN0IiwibGFzdCIsIm50aCIsImNvbGwiLCJpIiwiY29ucyIsImFwcGVuZCIsImIiLCJyZXZlcnNlIiwiZmxhdHRlbiIsImNvbmNhdCIsInNsaWNlIiwibGVuIiwiZ2V0Iiwic29ydCIsInJhbmdlIiwidW5pcXVlIiwiemlwIiwiemlwX3BhaXJzIiwidGFrZSIsImRyb3AiLCJjaHVua19ldmVyeSIsImVtcHR5X3AiLCJuaWxfcCIsIm51bWJlcl9wIiwic3RyaW5nX3AiLCJib29sZWFuX3AiLCJsaXN0X3AiLCJkaWN0X3AiLCJzeW1ib2xfcCIsImtleXdvcmRfcCIsImNvbnRhaW5zX3AiLCJoYXNfa2V5X3AiLCJzdGFydHNfd2l0aF9wIiwiZW5kc193aXRoX3AiLCJzdHJpbmdfY29udGFpbnNfcCIsIm9kZF9wIiwiZXZlbl9wIiwiemVyb19wIiwic3RyIiwidXBwZXIiLCJ1cGNhc2UiLCJsb3dlciIsImRvd25jYXNlIiwidHJpbSIsInNwbGl0Iiwiam9pbiIsInJlcGxhY2UiLCJpbmRleF9vZiIsInN1YnN0cmluZyIsInN0cmluZ19sZW5ndGgiLCJjaGFyX2Zyb21fY29kZSIsImFzc29jIiwiZGlzc29jIiwibWVyZ2UiLCJrZXlzIiwidmFscyIsImRpY3Rfc2V0IiwiZGljdF9nZXQiLCJkaWN0X2hhc19wIiwiZGljdF9kZWxldGUiLCJhYnMiLCJzcXJ0IiwicG93IiwiZmxvb3IiLCJjZWlsIiwicm91bmQiLCJtaW4iLCJtYXgiLCJjbGFtcCIsInBhcnNlX2ludCIsInBhcnNlX2Zsb2F0IiwiZXJyb3IiLCJtc2ciLCJpbnNwZWN0IiwiYXBwbHkiLCJpZGVudGljYWxfcCIsImlzX3NwcmVhZF9wcmltIiwic3ByZWFkX2F0dHJzIiwibWFrZV9zcHJlYWQiLCJzeF9jb2xsZWN0Iiwic3hfY29sbGVjdGVkIiwic3hfY2xlYXJfY29sbGVjdGVkIiwic3hfZW1pdCIsInN4X2VtaXR0ZWQiLCJzeF9jb250ZXh0IiwidHJhbXBvbGluZSIsInR5cGVfb2YiLCJ1bndyYXBfZW52IiwiZSIsImVudl9oYXMiLCJlbnZfZ2V0IiwiZW52X2JpbmQiLCJlbnZfc2V0IiwibWFrZV9lbnYiLCJlbnZfZXh0ZW5kIiwiZW52X21lcmdlIiwic2V0X2xhbWJkYV9uYW1lIiwiaXNfbmlsIiwiaXNfdGh1bmsiLCJpc19sYW1iZGEiLCJpc19jb21wb25lbnQiLCJpc19pc2xhbmQiLCJpc19tYWNybyIsImlzX3NpZ25hbCIsImlzX2NhbGxhYmxlIiwiaXNfaWRlbnRpY2FsIiwiaXNfcHJpbWl0aXZlIiwiZ2V0X3ByaW1pdGl2ZSIsImlzX3NwcmVhZCIsIm1hcF9pbmRleGVkIiwibWFwX2RpY3QiLCJyZXN1bHQiLCJmb3JfZWFjaCIsImZvcl9lYWNoX2luZGV4ZWQiLCJjb250aW51YXRpb25fcCIsIm1ha2VfY2VrX2NvbnRpbnVhdGlvbiIsImNhcHR1cmVkIiwicmVzdF9rb250IiwiZGF0YSIsImNvbnRpbnVhdGlvbl9kYXRhIiwiZHluYW1pY193aW5kX2NhbGwiLCJiZWZvcmUiLCJib2R5IiwiYWZ0ZXIiLCJlbnYiLCJjc3Rfc2NvcGVfcHVzaCIsInNjb3BlX3B1c2giLCJ2YWx1ZSIsImNzdF9zY29wZV9wb3AiLCJzY29wZV9wb3AiLCJzY29wZV9wZWVrIiwic2NvcGVfZW1pdCIsInByb3ZpZGVfcHVzaCIsInByb3ZpZGVfcG9wIiwiY3VzdG9tX3NwZWNpYWxfZm9ybXMiLCJyZWdpc3Rlcl9zcGVjaWFsX2Zvcm0iLCJoYW5kbGVyIiwiaXNfZWxzZV9jbGF1c2UiLCJjc3RfZGVmYXVsdCIsImNzdF9ub3RfYV9zaWduYWwiLCJzaWduYWxfdmFsdWUiLCJzaWciLCJzaWduYWxfc2V0X3ZhbHVlIiwic2lnbmFsX3N1YnNjcmliZXJzIiwiY3N0X3N1YnNjcmliZXJzIiwic2lnbmFsX2FkZF9zdWJfYiIsInNpZ25hbF9yZW1vdmVfc3ViX2IiLCJjc3RfZGVwcyIsInNpZ25hbF9kZXBzIiwic2lnbmFsX3NldF9kZXBzIiwibm90aWZ5X3N1YnNjcmliZXJzIiwic3VicyIsImZsdXNoX3N1YnNjcmliZXJzIiwiZGlzcG9zZV9jb21wdXRlZCIsIndpdGhfaXNsYW5kX3Njb3BlIiwicmVnaXN0ZXJfZm4iLCJib2R5X2ZuIiwicmVnaXN0ZXJfaW5fc2NvcGUiLCJkaXNwb3NlX2ZuIiwiY29tcG9uZW50X3NldF9wYXJhbV90eXBlc19iIiwiY29tcCIsInR5cGVzIiwicGFyc2VfY29tcF9wYXJhbXMiLCJwYXJhbXMiLCJwYXJzZV9tYWNyb19wYXJhbXMiLCJwYXJzZV9rZXl3b3JkX2FyZ3MiLCJyYXdfYXJncyIsIm1ha2VfaGFuZGxlcl9kZWYiLCJtYWtlX3F1ZXJ5X2RlZiIsIm1ha2VfYWN0aW9uX2RlZiIsIm1ha2VfcGFnZV9kZWYiLCJvcHRzIiwic2ZfZGVmaGFuZGxlciIsInJlc3RfYXJncyIsInNmX2RlZnF1ZXJ5Iiwic2ZfZGVmYWN0aW9uIiwic2ZfZGVmcGFnZSIsInN0cmlwX3ByZWZpeCIsInByZWZpeCIsInBsIiwiZGVidWdfbG9nIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsWUFBQUMsVUFBQUMsTUFBQUM7QUFBQUEsUUFBQUMsUUNVUTtBQUFBLElBQThDLGNBQUFoQixJQUFBLFVBQ3hDLDBCQUMrQztBQUFBLFlBQS9CO0FBQUEsSUFBOEI7QUFBQSxHQUFDO0FBQUEsT0FBQWlCLE1EWjdEO0FBQUEsWUFBQUMsYUFBQUM7QUFBQUEsSUNlbUIsMEJBT1I7QUFBQSxJQVBRO0FBQUE7QUFBQSxxQ0FVRDtBQUFBO0FBQUEsV0FBQUMsSUFWQztBQUFBLE9BR1o7QUFBQSxpQkFBd0I7QUFBQSxpQkFDdEIsNkNBTVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUFBQyxJQVZDO0FBQUEsZUFV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O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRGhWbEQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyOTY3NCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcmVmLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCogc3hfcmVmLm1sIOKAlCBBdXRvLWdlbmVyYXRlZCBmcm9tIFNYIHNwZWMgYnkgaG9zdHMvb2NhbWwvYm9vdHN0cmFwLnB5ICopXG4oKiBEbyBub3QgZWRpdCDigJQgcmVnZW5lcmF0ZSB3aXRoOiBweXRob24zIGhvc3RzL29jYW1sL2Jvb3RzdHJhcC5weSAqKVxuXG5bQEBAd2FybmluZyBcIi0yNi0yN1wiXVxuXG5vcGVuIFN4X3R5cGVzXG5vcGVuIFN4X3J1bnRpbWVcblxuKCogVHJhbXBvbGluZSDigJQgZm9yd2FyZCByZWYsIHJlc29sdmVkIGFmdGVyIGV2YWxfZXhwciBpcyBkZWZpbmVkLiAqKVxubGV0IHRyYW1wb2xpbmVfZm4gOiAodmFsdWUgLT4gdmFsdWUpIHJlZiA9IHJlZiAoZnVuIHYgLT4gdilcbmxldCB0cmFtcG9saW5lIHYgPSAhdHJhbXBvbGluZV9mbiB2XG5cblxuXG4oKiA9PT0gTXV0YWJsZSBzdGF0ZSBmb3Igc3RyaWN0IG1vZGUgPT09ICopXG4oKiBUaGVzZSBhcmUgZGVmaW5lZCBhcyB0b3AtbGV2ZWwgcmVmcyBiZWNhdXNlIHRoZSB0cmFuc3BpbGVyIGNhbm5vdCBoYW5kbGVcbiAgIGdsb2JhbCBzZXQhIG11dGF0aW9uIChpdCBjcmVhdGVzIGxvY2FsIHJlZnMgdGhhdCBzaGFkb3cgdGhlIGdsb2JhbCkuICopXG5sZXQgX3N0cmljdF9yZWYgPSByZWYgKEJvb2wgZmFsc2UpXG5sZXQgX3ByaW1fcGFyYW1fdHlwZXNfcmVmID0gcmVmIE5pbFxuXG4oKiBKSVQgY2FsbCBob29rIOKAlCBjZWtfY2FsbCBjaGVja3MgdGhpcyBiZWZvcmUgQ0VLIGRpc3BhdGNoIGZvciBuYW1lZFxuICAgbGFtYmRhcy4gIFJlZ2lzdGVyZWQgYnkgc3hfc2VydmVyLm1sIGFmdGVyIGNvbXBpbGVyIGxvYWRzLiAgVGVzdHNcbiAgIHJ1biB3aXRoIGhvb2sgPSBOb25lIChwdXJlIENFSywgbm8gY29tcGlsYXRpb24gZGVwZW5kZW5jeSkuICopXG5sZXQgaml0X2NhbGxfaG9vayA6ICh2YWx1ZSAtPiB2YWx1ZSBsaXN0IC0+IHZhbHVlIG9wdGlvbikgb3B0aW9uIHJlZiA9IHJlZiBOb25lXG5cblxuXG4oKiA9PT0gVHJhbnNwaWxlZCBmcm9tIGV2YWx1YXRvciAoZnJhbWVzICsgZXZhbCArIENFSykgPT09ICopXG5cbigqIG1ha2UtY2VrLXN0YXRlICopXG5sZXQgcmVjIG1ha2VfY2VrX3N0YXRlIGNvbnRyb2wgZW52IGtvbnQgPVxuICAoQ2VrU3RhdGUgeyBjc19jb250cm9sID0gY29udHJvbDsgY3NfZW52ID0gZW52OyBjc19rb250ID0ga29udDsgY3NfcGhhc2UgPSBcImV2YWxcIjsgY3NfdmFsdWUgPSBOaWwgfSlcblxuKCogbWFrZS1jZWstdmFsdWUgKilcbmFuZCBtYWtlX2Nla192YWx1ZSB2YWx1ZSBlbnYga29udCA9XG4gIChDZWtTdGF0ZSB7IGNzX2NvbnRyb2wgPSBOaWw7IGNzX2VudiA9IGVudjsgY3Nfa29udCA9IGtvbnQ7IGNzX3BoYXNlID0gXCJjb250aW51ZVwiOyBjc192YWx1ZSA9IHZhbHVlIH0pXG5cbigqIGNlay10ZXJtaW5hbD8gKilcbmFuZCBjZWtfdGVybWluYWxfcCBzdGF0ZSA9XG4gIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhnZXQgKHN0YXRlKSAoKFN0cmluZyBcInBoYXNlXCIpKSk7IChTdHJpbmcgXCJjb250aW51ZVwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChlbXB0eV9wICgoZ2V0IChzdGF0ZSkgKChTdHJpbmcgXCJrb250XCIpKSkpKSlcblxuKCogY2VrLWNvbnRyb2wgKilcbmFuZCBjZWtfY29udHJvbCBzID1cbiAgKGdldCAocykgKChTdHJpbmcgXCJjb250cm9sXCIpKSlcblxuKCogY2VrLWVudiAqKVxuYW5kIGNla19lbnYgcyA9XG4gIChnZXQgKHMpICgoU3RyaW5nIFwiZW52XCIpKSlcblxuKCogY2VrLWtvbnQgKilcbmFuZCBjZWtfa29udCBzID1cbiAgKGdldCAocykgKChTdHJpbmcgXCJrb250XCIpKSlcblxuKCogY2VrLXBoYXNlICopXG5hbmQgY2VrX3BoYXNlIHMgPVxuICAoZ2V0IChzKSAoKFN0cmluZyBcInBoYXNlXCIpKSlcblxuKCogY2VrLXZhbHVlICopXG5hbmQgY2VrX3ZhbHVlIHMgPVxuICAoZ2V0IChzKSAoKFN0cmluZyBcInZhbHVlXCIpKSlcblxuKCogbWFrZS1pZi1mcmFtZSAqKVxuYW5kIG1ha2VfaWZfZnJhbWUgdGhlbl9leHByIGVsc2VfZXhwciBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJpZlwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBlbHNlX2V4cHI7IGNmX2JvZHkgPSB0aGVuX2V4cHI7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLXdoZW4tZnJhbWUgKilcbmFuZCBtYWtlX3doZW5fZnJhbWUgYm9keV9leHBycyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJ3aGVuXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IGJvZHlfZXhwcnM7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWJlZ2luLWZyYW1lICopXG5hbmQgbWFrZV9iZWdpbl9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiYmVnaW5cIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1sZXQtZnJhbWUgKilcbmFuZCBtYWtlX2xldF9mcmFtZSBuYW1lIHJlbWFpbmluZyBib2R5IGxvY2FsID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwibGV0XCI7IGNmX2VudiA9IGxvY2FsOyBjZl9uYW1lID0gbmFtZTsgY2ZfYm9keSA9IGJvZHk7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWRlZmluZS1mcmFtZSAqKVxuYW5kIG1ha2VfZGVmaW5lX2ZyYW1lIG5hbWUgZW52IGhhc19lZmZlY3RzIGVmZmVjdF9saXN0ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiZGVmaW5lXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBoYXNfZWZmZWN0czsgY2ZfZXh0cmEyID0gZWZmZWN0X2xpc3QgfSlcblxuKCogbWFrZS1zZXQtZnJhbWUgKilcbmFuZCBtYWtlX3NldF9mcmFtZSBuYW1lIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcInNldFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBuYW1lOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSBOaWw7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1hcmctZnJhbWUgKilcbmFuZCBtYWtlX2FyZ19mcmFtZSBmIGV2YWxlZCByZW1haW5pbmcgZW52IHJhd19hcmdzIGhlYWRfbmFtZSA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImFyZ1wiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBldmFsZWQ7IGNmX3Jlc3VsdHMgPSByYXdfYXJnczsgY2ZfZXh0cmEgPSAobGV0IF9vciA9IGhlYWRfbmFtZSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgTmlsKTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY2FsbC1mcmFtZSAqKVxuYW5kIG1ha2VfY2FsbF9mcmFtZSBmIGFyZ3MgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiY2FsbFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBhcmdzOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY29uZC1mcmFtZSAqKVxuYW5kIG1ha2VfY29uZF9mcmFtZSByZW1haW5pbmcgZW52IHNjaGVtZV9wID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiY29uZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBzY2hlbWVfcDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY2FzZS1mcmFtZSAqKVxuYW5kIG1ha2VfY2FzZV9mcmFtZSBtYXRjaF92YWwgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImNhc2VcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gbWF0Y2hfdmFsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS10aHJlYWQtZnJhbWUgKilcbmFuZCBtYWtlX3RocmVhZF9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwidGhyZWFkXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtbWFwLWZyYW1lICopXG5hbmQgbWFrZV9tYXBfZnJhbWUgZiByZW1haW5pbmcgcmVzdWx0cyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJtYXBcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gcmVzdWx0czsgY2ZfZXh0cmEgPSAoQm9vbCBmYWxzZSk7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLW1hcC1pbmRleGVkLWZyYW1lICopXG5hbmQgbWFrZV9tYXBfaW5kZXhlZF9mcmFtZSBmIHJlbWFpbmluZyByZXN1bHRzIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcIm1hcFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSByZXN1bHRzOyBjZl9leHRyYSA9IChCb29sIHRydWUpOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1maWx0ZXItZnJhbWUgKilcbmFuZCBtYWtlX2ZpbHRlcl9mcmFtZSBmIHJlbWFpbmluZyByZXN1bHRzIGN1cnJlbnRfaXRlbSBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJmaWx0ZXJcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gcmVzdWx0czsgY2ZfZXh0cmEgPSBjdXJyZW50X2l0ZW07IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLXJlZHVjZS1mcmFtZSAqKVxuYW5kIG1ha2VfcmVkdWNlX2ZyYW1lIGYgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcInJlZHVjZVwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1mb3ItZWFjaC1mcmFtZSAqKVxuYW5kIG1ha2VfZm9yX2VhY2hfZnJhbWUgZiByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiZm9yLWVhY2hcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2Utc29tZS1mcmFtZSAqKVxuYW5kIG1ha2Vfc29tZV9mcmFtZSBmIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJzb21lXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gZjsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWV2ZXJ5LWZyYW1lICopXG5hbmQgbWFrZV9ldmVyeV9mcmFtZSBmIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJldmVyeVwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1zY29wZS1mcmFtZSAqKVxuYW5kIG1ha2Vfc2NvcGVfZnJhbWUgbmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwic2NvcGVcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gbmFtZTsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtcHJvdmlkZS1mcmFtZSAqKVxuYW5kIG1ha2VfcHJvdmlkZV9mcmFtZSBuYW1lIHZhbHVlIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJwcm92aWRlXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSB2YWx1ZTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2Utc2NvcGUtYWNjLWZyYW1lICopXG5hbmQgbWFrZV9zY29wZV9hY2NfZnJhbWUgbmFtZSB2YWx1ZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwic2NvcGUtYWNjXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSAobGV0IF9vciA9IHZhbHVlIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSBOaWwpOyBjZl9leHRyYTIgPSAoTGlzdCBbXSkgfSlcblxuKCogbWFrZS1yZXNldC1mcmFtZSAqKVxuYW5kIG1ha2VfcmVzZXRfZnJhbWUgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwicmVzZXRcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSBOaWw7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1kaWN0LWZyYW1lICopXG5hbmQgbWFrZV9kaWN0X2ZyYW1lIHJlbWFpbmluZyByZXN1bHRzIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImRpY3RcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSByZXN1bHRzOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtYW5kLWZyYW1lICopXG5hbmQgbWFrZV9hbmRfZnJhbWUgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImFuZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLW9yLWZyYW1lICopXG5hbmQgbWFrZV9vcl9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwib3JcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1keW5hbWljLXdpbmQtZnJhbWUgKilcbmFuZCBtYWtlX2R5bmFtaWNfd2luZF9mcmFtZSBwaGFzZSBib2R5X3RodW5rIGFmdGVyX3RodW5rIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImR5bmFtaWMtd2luZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBwaGFzZTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtcmVhY3RpdmUtcmVzZXQtZnJhbWUgKilcbmFuZCBtYWtlX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lIGVudiB1cGRhdGVfZm4gZmlyc3RfcmVuZGVyX3AgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJyZWFjdGl2ZS1yZXNldFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSB1cGRhdGVfZm47IGNmX2V4dHJhMiA9IGZpcnN0X3JlbmRlcl9wIH0pXG5cbigqIG1ha2UtZGVyZWYtZnJhbWUgKilcbmFuZCBtYWtlX2RlcmVmX2ZyYW1lIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImRlcmVmXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gTmlsOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtaG8tc2V0dXAtZnJhbWUgKilcbmFuZCBtYWtlX2hvX3NldHVwX2ZyYW1lIGhvX3R5cGUgcmVtYWluaW5nX2FyZ3MgZXZhbGVkX2FyZ3MgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiaG8tc2V0dXBcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmdfYXJnczsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IGV2YWxlZF9hcmdzOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IGhvX3R5cGU7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBmcmFtZS10eXBlICopXG5hbmQgZnJhbWVfdHlwZSBmID1cbiAgKGdldCAoZikgKChTdHJpbmcgXCJ0eXBlXCIpKSlcblxuKCoga29udC1wdXNoICopXG5hbmQga29udF9wdXNoIGZyYW1lIGtvbnQgPVxuICAoY29ucyAoZnJhbWUpIChrb250KSlcblxuKCoga29udC10b3AgKilcbmFuZCBrb250X3RvcCBrb250ID1cbiAgKGZpcnN0IChrb250KSlcblxuKCoga29udC1wb3AgKilcbmFuZCBrb250X3BvcCBrb250ID1cbiAgKHJlc3QgKGtvbnQpKVxuXG4oKiBrb250LWVtcHR5PyAqKVxuYW5kIGtvbnRfZW1wdHlfcCBrb250ID1cbiAgKGVtcHR5X3AgKGtvbnQpKVxuXG4oKiBrb250LWNhcHR1cmUtdG8tcmVzZXQgKilcbmFuZCBrb250X2NhcHR1cmVfdG9fcmVzZXQga29udCA9XG4gIChsZXQgcmVjIHNjYW4gPSAoZnVuIGsgY2FwdHVyZWQgLT4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGspKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwic2hpZnQgd2l0aG91dCBlbmNsb3NpbmcgcmVzZXRcIikpKSkgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFsoZnJhbWVfdHlwZSAoZnJhbWUpKTsgKFN0cmluZyBcInJlc2V0XCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhmcmFtZV90eXBlIChmcmFtZSkpOyAoU3RyaW5nIFwicmVhY3RpdmUtcmVzZXRcIildKSkpIHRoZW4gKExpc3QgW2NhcHR1cmVkOyAocmVzdCAoaykpXSkgZWxzZSAoc2NhbiAoKHJlc3QgKGspKSkgKChwcmltX2NhbGwgXCJhcHBlbmRcIiBbY2FwdHVyZWQ7IChMaXN0IFtmcmFtZV0pXSkpKSkpKSkgaW4gKHNjYW4gKGtvbnQpICgoTGlzdCBbXSkpKSlcblxuKCoga29udC1maW5kLXByb3ZpZGUgKilcbmFuZCBrb250X2ZpbmRfcHJvdmlkZSBrb250IG5hbWUgPVxuICAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoa29udCkpKSB0aGVuIE5pbCBlbHNlIChsZXQgZnJhbWUgPSAoZmlyc3QgKGtvbnQpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsoZnJhbWVfdHlwZSAoZnJhbWUpKTsgKFN0cmluZyBcInByb3ZpZGVcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSk7IG5hbWVdKSkpIHRoZW4gZnJhbWUgZWxzZSAoa29udF9maW5kX3Byb3ZpZGUgKChyZXN0IChrb250KSkpIChuYW1lKSkpKSlcblxuKCoga29udC1maW5kLXNjb3BlLWFjYyAqKVxuYW5kIGtvbnRfZmluZF9zY29wZV9hY2Mga29udCBuYW1lID1cbiAgKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGtvbnQpKSkgdGhlbiBOaWwgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrb250KSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKGZyYW1lKSk7IChTdHJpbmcgXCJzY29wZS1hY2NcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSk7IG5hbWVdKSkpIHRoZW4gZnJhbWUgZWxzZSAoa29udF9maW5kX3Njb3BlX2FjYyAoKHJlc3QgKGtvbnQpKSkgKG5hbWUpKSkpKVxuXG4oKiBoYXMtcmVhY3RpdmUtcmVzZXQtZnJhbWU/ICopXG5hbmQgaGFzX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lX3Aga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChrb250KSkpIHRoZW4gKEJvb2wgZmFsc2UpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKChmaXJzdCAoa29udCkpKSk7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChCb29sIHRydWUpIGVsc2UgKGhhc19yZWFjdGl2ZV9yZXNldF9mcmFtZV9wICgocmVzdCAoa29udCkpKSkpKVxuXG4oKiBrb250LWNhcHR1cmUtdG8tcmVhY3RpdmUtcmVzZXQgKilcbmFuZCBrb250X2NhcHR1cmVfdG9fcmVhY3RpdmVfcmVzZXQga29udCA9XG4gIChsZXQgcmVjIHNjYW4gPSAoZnVuIGsgY2FwdHVyZWQgLT4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGspKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwicmVhY3RpdmUgZGVyZWYgd2l0aG91dCBlbmNsb3NpbmcgcmVhY3RpdmUtcmVzZXRcIikpKSkgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKGZyYW1lKSk7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChMaXN0IFtjYXB0dXJlZDsgZnJhbWU7IChyZXN0IChrKSldKSBlbHNlIChzY2FuICgocmVzdCAoaykpKSAoKHByaW1fY2FsbCBcImFwcGVuZFwiIFtjYXB0dXJlZDsgKExpc3QgW2ZyYW1lXSldKSkpKSkpKSBpbiAoc2NhbiAoa29udCkgKChMaXN0IFtdKSkpKVxuXG4oKiAqY3VzdG9tLXNwZWNpYWwtZm9ybXMqICopXG5hbmQgY3VzdG9tX3NwZWNpYWxfZm9ybXMgPVxuICAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpXG5cbigqIHJlZ2lzdGVyLXNwZWNpYWwtZm9ybSEgKilcbmFuZCByZWdpc3Rlcl9zcGVjaWFsX2Zvcm0gbmFtZSBoYW5kbGVyID1cbiAgKHN4X2RpY3Rfc2V0X2IgY3VzdG9tX3NwZWNpYWxfZm9ybXMgbmFtZSBoYW5kbGVyKVxuXG4oKiAqcmVuZGVyLWNoZWNrKiAqKVxuYW5kIHJlbmRlcl9jaGVjayA9XG4gIE5pbFxuXG4oKiAqcmVuZGVyLWZuKiAqKVxuYW5kIHJlbmRlcl9mbiA9XG4gIE5pbFxuXG4oKiAqc3RyaWN0KiAqKVxuYW5kIF9zdHJpY3RfID0gIV9zdHJpY3RfcmVmXG5cbigqIHNldC1zdHJpY3QhICopXG5hbmQgc2V0X3N0cmljdF9iIHZhbCcgPVxuICBfc3RyaWN0X3JlZiA6PSB2YWwnOyBOaWxcblxuKCogKnByaW0tcGFyYW0tdHlwZXMqICopXG5hbmQgX3ByaW1fcGFyYW1fdHlwZXNfID0gIV9wcmltX3BhcmFtX3R5cGVzX3JlZlxuXG4oKiBzZXQtcHJpbS1wYXJhbS10eXBlcyEgKilcbmFuZCBzZXRfcHJpbV9wYXJhbV90eXBlc19iIHR5cGVzID1cbiAgX3ByaW1fcGFyYW1fdHlwZXNfcmVmIDo9IHR5cGVzOyBOaWxcblxuKCogdmFsdWUtbWF0Y2hlcy10eXBlPyAqKVxuYW5kIHZhbHVlX21hdGNoZXNfdHlwZV9wIHZhbCcgZXhwZWN0ZWRfdHlwZSA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJhbnlcIildKSkgdGhlbiAoQm9vbCB0cnVlKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJudW1iZXJcIildKSkgdGhlbiAobnVtYmVyX3AgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJzdHJpbmdcIildKSkgdGhlbiAoc3RyaW5nX3AgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJib29sZWFuXCIpXSkpIHRoZW4gKGJvb2xlYW5fcCAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcIm5pbFwiKV0pKSB0aGVuIChpc19uaWwgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKGxpc3RfcCAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcImRpY3RcIildKSkgdGhlbiAoZGljdF9wICh2YWwnKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtleHBlY3RlZF90eXBlOyAoU3RyaW5nIFwibGFtYmRhXCIpXSkpIHRoZW4gKGlzX2xhbWJkYSAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh2YWwnKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkpIHRoZW4gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHZhbCcpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBlbHNlIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChzdHJpbmdfcCAoZXhwZWN0ZWRfdHlwZSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCJlbmRzLXdpdGg/XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCI/XCIpXSkpKSB0aGVuIChsZXQgX29yID0gKGlzX25pbCAodmFsJykpIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAodmFsdWVfbWF0Y2hlc190eXBlX3AgKHZhbCcpICgocHJpbV9jYWxsIFwic2xpY2VcIiBbZXhwZWN0ZWRfdHlwZTsgKE51bWJlciAwLjApOyAocHJpbV9jYWxsIFwiLVwiIFsocHJpbV9jYWxsIFwic3RyaW5nLWxlbmd0aFwiIFtleHBlY3RlZF90eXBlXSk7IChOdW1iZXIgMS4wKV0pXSkpKSkgZWxzZSAoQm9vbCB0cnVlKSkpKSkpKSkpKSkpXG5cbigqIHN0cmljdC1jaGVjay1hcmdzICopXG5hbmQgc3RyaWN0X2NoZWNrX2FyZ3MgbmFtZSBhcmdzID1cbiAgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gIV9zdHJpY3RfcmVmIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlICFfcHJpbV9wYXJhbV90eXBlc19yZWYpKSB0aGVuIChsZXQgc3BlYyA9IChnZXQgKCFfcHJpbV9wYXJhbV90eXBlc19yZWYpIChuYW1lKSkgaW4gKGlmIHN4X3RydXRoeSAoc3BlYykgdGhlbiAobGV0IHBvc2l0aW9uYWwgPSAoZ2V0IChzcGVjKSAoKFN0cmluZyBcInBvc2l0aW9uYWxcIikpKSBpbiBsZXQgcmVzdF90eXBlID0gKGdldCAoc3BlYykgKChTdHJpbmcgXCJyZXN0LXR5cGVcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChwb3NpdGlvbmFsKSB0aGVuIChMaXN0Lml0ZXIgKGZ1biBwYWlyIC0+IGlnbm9yZSAoKGxldCBpZHggPSAoZmlyc3QgKHBhaXIpKSBpbiBsZXQgcGFyYW0gPSAobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IHBfbmFtZSA9IChmaXJzdCAocGFyYW0pKSBpbiBsZXQgcF90eXBlID0gKG50aCAocGFyYW0pICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPFwiIFtpZHg7IChsZW4gKGFyZ3MpKV0pKSB0aGVuIChsZXQgdmFsJyA9IChudGggKGFyZ3MpIChpZHgpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKCh2YWx1ZV9tYXRjaGVzX3R5cGVfcCAodmFsJykgKHBfdHlwZSkpKSkpKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIChzeF9zdHIgWyhTdHJpbmcgXCJUeXBlIGVycm9yOiBcIik7IG5hbWU7IChTdHJpbmcgXCIgZXhwZWN0ZWQgXCIpOyBwX3R5cGU7IChTdHJpbmcgXCIgZm9yIHBhcmFtIFwiKTsgcF9uYW1lOyAoU3RyaW5nIFwiLCBnb3QgXCIpOyAodHlwZV9vZiAodmFsJykpOyAoU3RyaW5nIFwiIChcIik7IChTdHJpbmcgKHN4X3N0ciBbdmFsJ10pKTsgKFN0cmluZyBcIilcIildKSkpKSkgZWxzZSBOaWwpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKExpc3QgKExpc3QubWFwaSAoZnVuIGkgcCAtPiBsZXQgaSA9IE51bWJlciAoZmxvYXRfb2ZfaW50IGkpIGluIChMaXN0IFtpOyBwXSkpIChzeF90b19saXN0IHBvc2l0aW9uYWwpKSkpOyBOaWwpIGVsc2UgTmlsKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gcmVzdF90eXBlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI+XCIgWyhsZW4gKGFyZ3MpKTsgKGxlbiAoKGxldCBfb3IgPSBwb3NpdGlvbmFsIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAoTGlzdCBbXSkpKSldKSkpIHRoZW4gKExpc3QuaXRlciAoZnVuIHBhaXIgLT4gaWdub3JlICgobGV0IGlkeCA9IChmaXJzdCAocGFpcikpIGluIGxldCB2YWwnID0gKG50aCAocGFpcikgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoKHZhbHVlX21hdGNoZXNfdHlwZV9wICh2YWwnKSAocmVzdF90eXBlKSkpKSkpKSB0aGVuIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlR5cGUgZXJyb3I6IFwiKTsgbmFtZTsgKFN0cmluZyBcIiBleHBlY3RlZCBcIik7IHJlc3RfdHlwZTsgKFN0cmluZyBcIiBmb3IgcmVzdCBhcmcgXCIpOyBpZHg7IChTdHJpbmcgXCIsIGdvdCBcIik7ICh0eXBlX29mICh2YWwnKSk7IChTdHJpbmcgXCIgKFwiKTsgKFN0cmluZyAoc3hfc3RyIFt2YWwnXSkpOyAoU3RyaW5nIFwiKVwiKV0pKSkpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKExpc3QgKExpc3QubWFwaSAoZnVuIGkgdiAtPiBsZXQgaSA9IE51bWJlciAoZmxvYXRfb2ZfaW50IGkpIGluIChMaXN0IFtpOyB2XSkpIChzeF90b19saXN0IChwcmltX2NhbGwgXCJzbGljZVwiIFthcmdzOyAobGVuICgobGV0IF9vciA9IHBvc2l0aW9uYWwgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChMaXN0IFtdKSkpKV0pKSkpKTsgTmlsKSBlbHNlIE5pbCkpKSBlbHNlIE5pbCkpIGVsc2UgTmlsKVxuXG4oKiBiaW5kX2xhbWJkYV9wYXJhbXMg4oCUIHNoYXJlZCBoZWxwZXIgZm9yIGNhbGwtbGFtYmRhIGFuZCBDRUsgZGlzcGF0Y2guXG4gICBIYW5kbGVzICZyZXN0IHBhcmFtczogYmluZHMgcmVxdWlyZWQgcGFyYW1zLCBjb2xsZWN0cyByZXN0IGludG8gbGlzdC4gKilcbmFuZCBiaW5kX2xhbWJkYV9wYXJhbXMgZiBhcmdzIGxvY2FsID1cbiAgbGV0IHBhcmFtcyA9IGxhbWJkYV9wYXJhbXMgZiBpblxuICBsZXQgcGFyYW1fbGlzdCA9IG1hdGNoIHBhcmFtcyB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBsZXQgYXJnc19saXN0ID0gbWF0Y2ggYXJncyB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBsZXQgcmVzdF9pZHggPSByZWYgKC0xKSBpblxuICBMaXN0Lml0ZXJpIChmdW4gaSBwIC0+IG1hdGNoIHAgd2l0aCBTeW1ib2wgXCImcmVzdFwiIHwgU3RyaW5nIFwiJnJlc3RcIiAtPiByZXN0X2lkeCA6PSBpIHwgXyAtPiAoKSkgcGFyYW1fbGlzdDtcbiAgaWYgIXJlc3RfaWR4ID49IDAgdGhlbiBiZWdpblxuICAgIGxldCByZXF1aXJlZCA9IExpc3QuZmlsdGVyaSAoZnVuIGkgXyAtPiBpIDwgIXJlc3RfaWR4KSBwYXJhbV9saXN0IGluXG4gICAgbGV0IHJlc3RfbmFtZSA9IChtYXRjaCBMaXN0Lm50aF9vcHQgcGFyYW1fbGlzdCAoIXJlc3RfaWR4ICsgMSkgd2l0aFxuICAgICAgfCBTb21lIChTeW1ib2wgcyB8IFN0cmluZyBzKSAtPiBzIHwgXyAtPiBcInJlc3RcIikgaW5cbiAgICBMaXN0Lml0ZXJpIChmdW4gaSBwIC0+XG4gICAgICBsZXQgbmFtZSA9IHN4X3RvX3N0cmluZyBwIGluXG4gICAgICBsZXQgdiA9IG1hdGNoIExpc3QubnRoX29wdCBhcmdzX2xpc3QgaSB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBOaWwgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgbmFtZSB2KSkgcmVxdWlyZWQ7XG4gICAgbGV0IHJlc3RfdmFscyA9IGlmICFyZXN0X2lkeCA8PSBMaXN0Lmxlbmd0aCBhcmdzX2xpc3RcbiAgICAgIHRoZW4gTGlzdCAoTGlzdC5maWx0ZXJpIChmdW4gaSBfIC0+IGkgPj0gIXJlc3RfaWR4KSBhcmdzX2xpc3QpIGVsc2UgTGlzdCBbXSBpblxuICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKFN0cmluZyByZXN0X25hbWUpIHJlc3RfdmFscylcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICBpZiBzeF90cnV0aHkgKHByaW1fY2FsbCBcIj5cIiBbbGVuIGFyZ3M7IGxlbiBwYXJhbXNdKSB0aGVuXG4gICAgICByYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbXG4gICAgICAgIChsZXQgX29yID0gbGFtYmRhX25hbWUgZiBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgU3RyaW5nIFwibGFtYmRhXCIpO1xuICAgICAgICBTdHJpbmcgXCIgZXhwZWN0cyBcIjsgbGVuIHBhcmFtczsgU3RyaW5nIFwiIGFyZ3MsIGdvdCBcIjsgbGVuIGFyZ3NdKSkpKTtcbiAgICBpZ25vcmUgKExpc3QuaXRlciAoZnVuIHBhaXIgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoZmlyc3QgcGFpcikpIChudGggcGFpciAoTnVtYmVyIDEuMCkpKSlcbiAgICAgIChzeF90b19saXN0IChwcmltX2NhbGwgXCJ6aXBcIiBbcGFyYW1zOyBhcmdzXSkpKTtcbiAgICBpZ25vcmUgKExpc3QuaXRlciAoZnVuIHAgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyBwKSBOaWwpKVxuICAgICAgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInNsaWNlXCIgW3BhcmFtczsgbGVuIGFyZ3NdKSkpXG4gIGVuZFxuXG4oKiBjYWxsLWxhbWJkYSDigJQgdXNlcyBzaGFyZWQgYmluZF9sYW1iZGFfcGFyYW1zIGZvciAmcmVzdCBzdXBwb3J0ICopXG5hbmQgY2FsbF9sYW1iZGEgZiBhcmdzIGNhbGxlcl9lbnYgPVxuICBsZXQgbG9jYWwgPSBlbnZfbWVyZ2UgKGxhbWJkYV9jbG9zdXJlIGYpIGNhbGxlcl9lbnYgaW5cbiAgYmluZF9sYW1iZGFfcGFyYW1zIGYgYXJncyBsb2NhbDtcbiAgbWFrZV90aHVuayAobGFtYmRhX2JvZHkgZikgbG9jYWxcblxuKCogY2FsbC1jb21wb25lbnQgKilcbmFuZCBjYWxsX2NvbXBvbmVudCBjb21wIHJhd19hcmdzIGVudiA9XG4gIChsZXQgcGFyc2VkID0gKHBhcnNlX2tleXdvcmRfYXJncyAocmF3X2FyZ3MpIChlbnYpKSBpbiBsZXQga3dhcmdzID0gKGZpcnN0IChwYXJzZWQpKSBpbiBsZXQgY2hpbGRyZW4gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgbG9jYWwgPSAoZW52X21lcmdlICgoY29tcG9uZW50X2Nsb3N1cmUgKGNvbXApKSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBwIC0+IGlnbm9yZSAoKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgcCkgKGxldCBfb3IgPSAoZGljdF9nZXQgKGt3YXJncykgKHApKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgTmlsKSkpKSAoc3hfdG9fbGlzdCAoY29tcG9uZW50X3BhcmFtcyAoY29tcCkpKTsgTmlsKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGNvbXBvbmVudF9oYXNfY2hpbGRyZW4gKGNvbXApKSkgdGhlbiAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoU3RyaW5nIFwiY2hpbGRyZW5cIikpIGNoaWxkcmVuKSBlbHNlIE5pbCkpIGluIChtYWtlX3RodW5rICgoY29tcG9uZW50X2JvZHkgKGNvbXApKSkgKGxvY2FsKSkpKSlcblxuKCogcGFyc2Uta2V5d29yZC1hcmdzICopXG5hbmQgcGFyc2Vfa2V5d29yZF9hcmdzIHJhd19hcmdzIGVudiA9XG4gIChsZXQga3dhcmdzID0gKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSBpbiBsZXQgY2hpbGRyZW4gPSByZWYgKChMaXN0IFtdKSkgaW4gbGV0IGkgPSAoTnVtYmVyIDAuMCkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKExpc3QuZm9sZF9sZWZ0IChmdW4gc3RhdGUgYXJnIC0+IChsZXQgaWR4ID0gKGdldCAoc3RhdGUpICgoU3RyaW5nIFwiaVwiKSkpIGluIGxldCBza2lwID0gKGdldCAoc3RhdGUpICgoU3RyaW5nIFwic2tpcFwiKSkpIGluIChpZiBzeF90cnV0aHkgKHNraXApIHRoZW4gKHByaW1fY2FsbCBcImFzc29jXCIgW3N0YXRlOyAoU3RyaW5nIFwic2tpcFwiKTsgKEJvb2wgZmFsc2UpOyAoU3RyaW5nIFwiaVwiKTsgKHByaW1fY2FsbCBcImluY1wiIFtpZHhdKV0pIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGFyZykpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI8XCIgWyhwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSk7IChsZW4gKHJhd19hcmdzKSldKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2Iga3dhcmdzIChrZXl3b3JkX25hbWUgKGFyZykpICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChyYXdfYXJncykgKChwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSkpKSkgKGVudikpKSkpKSBpbiAocHJpbV9jYWxsIFwiYXNzb2NcIiBbc3RhdGU7IChTdHJpbmcgXCJza2lwXCIpOyAoQm9vbCB0cnVlKTsgKFN0cmluZyBcImlcIik7IChwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSldKSkgZWxzZSAobGV0ICgpID0gaWdub3JlICgoY2hpbGRyZW4gOj0gc3hfYXBwZW5kX2IgIWNoaWxkcmVuICh0cmFtcG9saW5lICgoZXZhbF9leHByIChhcmcpIChlbnYpKSkpOyBOaWwpKSBpbiAocHJpbV9jYWxsIFwiYXNzb2NcIiBbc3RhdGU7IChTdHJpbmcgXCJpXCIpOyAocHJpbV9jYWxsIFwiaW5jXCIgW2lkeF0pXSkpKSkpKSAobGV0IF9kID0gSGFzaHRibC5jcmVhdGUgMiBpbiBIYXNodGJsLnJlcGxhY2UgX2QgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwiaVwiKSkgKE51bWJlciAwLjApOyBIYXNodGJsLnJlcGxhY2UgX2QgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwic2tpcFwiKSkgKEJvb2wgZmFsc2UpOyAgRGljdCBfZCkgKHN4X3RvX2xpc3QgcmF3X2FyZ3MpKSkgaW4gKExpc3QgW2t3YXJnczsgIWNoaWxkcmVuXSkpKVxuXG4oKiBjb25kLXNjaGVtZT8gKilcbmFuZCBjb25kX3NjaGVtZV9wIGNsYXVzZXMgPVxuICAoQm9vbCAoTGlzdC5mb3JfYWxsIChmdW4gYyAtPiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChjKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYykpOyAoTnVtYmVyIDIuMCldKSkpKSAoc3hfdG9fbGlzdCBjbGF1c2VzKSkpXG5cbigqIGlzLWVsc2UtY2xhdXNlPyAqKVxuYW5kIGlzX2Vsc2VfY2xhdXNlIHRlc3QgPVxuICAobGV0IF9vciA9IChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh0ZXN0KSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAodGVzdCkpOyAoU3RyaW5nIFwiZWxzZVwiKV0pKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHRlc3QpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbKHN5bWJvbF9uYW1lICh0ZXN0KSk7IChTdHJpbmcgXCJlbHNlXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhzeW1ib2xfbmFtZSAodGVzdCkpOyAoU3RyaW5nIFwiOmVsc2VcIildKSkpKVxuXG4oKiBzZi1uYW1lZC1sZXQgKilcbmFuZCBzZl9uYW1lZF9sZXQgYXJncyBlbnYgPVxuICAobGV0IGxvb3BfbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChhcmdzKSkpKSBpbiBsZXQgYmluZGluZ3MgPSAobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IGJvZHkgPSAocHJpbV9jYWxsIFwic2xpY2VcIiBbYXJnczsgKE51bWJlciAyLjApXSkgaW4gbGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgaW5pdHMgPSByZWYgKChMaXN0IFtdKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoTnVtYmVyIDIuMCldKSkpIHRoZW4gKExpc3QuaXRlciAoZnVuIGJpbmRpbmcgLT4gaWdub3JlICgobGV0ICgpID0gaWdub3JlICgocGFyYW1zIDo9IHN4X2FwcGVuZF9iICFwYXJhbXMgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAoYmluZGluZykpKSkgZWxzZSAoZmlyc3QgKGJpbmRpbmcpKSk7IE5pbCkpIGluIChpbml0cyA6PSBzeF9hcHBlbmRfYiAhaW5pdHMgKG50aCAoYmluZGluZykgKChOdW1iZXIgMS4wKSkpOyBOaWwpKSkpIChzeF90b19saXN0IGJpbmRpbmdzKTsgTmlsKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgcGFpcl9pZHggLT4gKGxldCAoKSA9IGlnbm9yZSAoKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW3BhaXJfaWR4OyAoTnVtYmVyIDIuMCldKSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpKSBlbHNlIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpOyBOaWwpKSBpbiAoaW5pdHMgOj0gc3hfYXBwZW5kX2IgIWluaXRzIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtwYWlyX2lkeDsgKE51bWJlciAyLjApXSldKSkpOyBOaWwpKSkgTmlsIChzeF90b19saXN0IChwcmltX2NhbGwgXCJyYW5nZVwiIFsoTnVtYmVyIDAuMCk7IChwcmltX2NhbGwgXCIvXCIgWyhsZW4gKGJpbmRpbmdzKSk7IChOdW1iZXIgMi4wKV0pXSkpKSkpIGluIChsZXQgbG9vcF9ib2R5ID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYm9keSkpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAoZmlyc3QgKGJvZHkpKSBlbHNlIChjb25zICgobWFrZV9zeW1ib2wgKChTdHJpbmcgXCJiZWdpblwiKSkpKSAoYm9keSkpKSBpbiBsZXQgbG9vcF9mbiA9IChtYWtlX2xhbWJkYSAoIXBhcmFtcykgKGxvb3BfYm9keSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzZXRfbGFtYmRhX25hbWUgbG9vcF9mbiAoc3hfdG9fc3RyaW5nIGxvb3BfbmFtZSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X2JpbmQgKGxhbWJkYV9jbG9zdXJlIChsb29wX2ZuKSkgKHN4X3RvX3N0cmluZyBsb29wX25hbWUpIGxvb3BfZm4pKSBpbiAobGV0IGluaXRfdmFscyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChlbnYpKSkpKSAoc3hfdG9fbGlzdCAhaW5pdHMpKSkgaW4gKGNhbGxfbGFtYmRhIChsb29wX2ZuKSAoaW5pdF92YWxzKSAoZW52KSkpKSkpKSlcblxuKCogc2YtbGFtYmRhICopXG5hbmQgc2ZfbGFtYmRhIGFyZ3MgZW52ID1cbiAgKGxldCBwYXJhbXNfZXhwciA9IChmaXJzdCAoYXJncykpIGluIGxldCBib2R5X2V4cHJzID0gKHJlc3QgKGFyZ3MpKSBpbiBsZXQgYm9keSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKGJvZHlfZXhwcnMpKTsgKE51bWJlciAxLjApXSkpIHRoZW4gKGZpcnN0IChib2R5X2V4cHJzKSkgZWxzZSAoY29ucyAoKG1ha2Vfc3ltYm9sICgoU3RyaW5nIFwiYmVnaW5cIikpKSkgKGJvZHlfZXhwcnMpKSkgaW4gbGV0IHBhcmFtX25hbWVzID0gKExpc3QgKExpc3QubWFwIChmdW4gcCAtPiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKHApKTsgKE51bWJlciAzLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChudGggKHApICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhrZXl3b3JkX25hbWUgKChudGggKHApICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwiYXNcIildKSkpKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAocCkpKSkgZWxzZSBwKSkpIChzeF90b19saXN0IHBhcmFtc19leHByKSkpIGluIChtYWtlX2xhbWJkYSAocGFyYW1fbmFtZXMpIChib2R5KSAoZW52KSkpXG5cbigqIHNmLWRlZmNvbXAgKilcbmFuZCBzZl9kZWZjb21wIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBwYXJhbXNfcmF3ID0gKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpIGluIGxldCBib2R5ID0gKGxhc3QgKGFyZ3MpKSBpbiBsZXQgY29tcF9uYW1lID0gKHN0cmlwX3ByZWZpeCAoKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSAoKFN0cmluZyBcIn5cIikpKSBpbiBsZXQgcGFyc2VkID0gKHBhcnNlX2NvbXBfcGFyYW1zIChwYXJhbXNfcmF3KSkgaW4gbGV0IHBhcmFtcyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IGhhc19jaGlsZHJlbiA9IChudGggKHBhcnNlZCkgKChOdW1iZXIgMS4wKSkpIGluIGxldCBwYXJhbV90eXBlcyA9IChudGggKHBhcnNlZCkgKChOdW1iZXIgMi4wKSkpIGluIGxldCBhZmZpbml0eSA9IChkZWZjb21wX2t3YXJnIChhcmdzKSAoKFN0cmluZyBcImFmZmluaXR5XCIpKSAoKFN0cmluZyBcImF1dG9cIikpKSBpbiAobGV0IGNvbXAgPSAobWFrZV9jb21wb25lbnQgKGNvbXBfbmFtZSkgKHBhcmFtcykgKGhhc19jaGlsZHJlbikgKGJvZHkpIChlbnYpIChhZmZpbml0eSkpIGluIGxldCBlZmZlY3RzID0gKGRlZmNvbXBfa3dhcmcgKGFyZ3MpICgoU3RyaW5nIFwiZWZmZWN0c1wiKSkgKE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAocGFyYW1fdHlwZXMpKSkpKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoZW1wdHlfcCAoKHByaW1fY2FsbCBcImtleXNcIiBbcGFyYW1fdHlwZXNdKSkpKSkpKSkpIHRoZW4gKGNvbXBvbmVudF9zZXRfcGFyYW1fdHlwZXNfYiAoY29tcCkgKHBhcmFtX3R5cGVzKSkgZWxzZSBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKChpc19uaWwgKGVmZmVjdHMpKSkpKSkpIHRoZW4gKGxldCBlZmZlY3RfbGlzdCA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChlZmZlY3RzKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKExpc3QgKExpc3QubWFwIChmdW4gZSAtPiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoZSkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChlKSkgZWxzZSAoU3RyaW5nIChzeF9zdHIgW2VdKSkpKSAoc3hfdG9fbGlzdCBlZmZlY3RzKSkpIGVsc2UgKExpc3QgWyhTdHJpbmcgKHN4X3N0ciBbZWZmZWN0c10pKV0pKSBpbiBsZXQgZWZmZWN0X2FubnMgPSAoaWYgc3hfdHJ1dGh5ICgoZW52X2hhcyAoZW52KSAoKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSkpIHRoZW4gKGVudl9nZXQgKGVudikgKChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkpIGVsc2UgKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2IgZWZmZWN0X2FubnMgKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpIGVmZmVjdF9saXN0KSkgaW4gKGVudl9iaW5kIGVudiAoc3hfdG9fc3RyaW5nIChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkgZWZmZWN0X2FubnMpKSkgZWxzZSBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X2JpbmQgZW52IChzeF90b19zdHJpbmcgKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSBjb21wKSkgaW4gY29tcCkpKSkpXG5cbigqIGRlZmNvbXAta3dhcmcgKilcbmFuZCBkZWZjb21wX2t3YXJnIGFyZ3Mga2V5IGRlZmF1bHQgPVxuICAobGV0IGVuZCcgPSAocHJpbV9jYWxsIFwiLVwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgMS4wKV0pIGluIGxldCByZXN1bHQnID0gcmVmIChkZWZhdWx0KSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gaSAtPiBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChhcmdzKSAoaSkpKSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAoKG50aCAoYXJncykgKGkpKSkpOyBrZXldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPFwiIFsocHJpbV9jYWxsIFwiK1wiIFtpOyAoTnVtYmVyIDEuMCldKTsgZW5kJ10pKSkpIHRoZW4gKGxldCB2YWwnID0gKG50aCAoYXJncykgKChwcmltX2NhbGwgXCIrXCIgW2k7IChOdW1iZXIgMS4wKV0pKSkgaW4gKHJlc3VsdCcgOj0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHZhbCcpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSkgdGhlbiAoa2V5d29yZF9uYW1lICh2YWwnKSkgZWxzZSB2YWwnKTsgTmlsKSkgZWxzZSBOaWwpKSkgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInJhbmdlXCIgWyhOdW1iZXIgMi4wKTsgZW5kJzsgKE51bWJlciAxLjApXSkpOyBOaWwpKSBpbiAhcmVzdWx0JykpXG5cbigqIHBhcnNlLWNvbXAtcGFyYW1zICopXG5hbmQgcGFyc2VfY29tcF9wYXJhbXMgcGFyYW1zX2V4cHIgPVxuICAobGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgcGFyYW1fdHlwZXMgPSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpIGluIGxldCBoYXNfY2hpbGRyZW4gPSByZWYgKChCb29sIGZhbHNlKSkgaW4gbGV0IGluX2tleSA9IHJlZiAoKEJvb2wgZmFsc2UpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAocCkpOyAoTnVtYmVyIDMuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChwKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChwKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgobnRoIChwKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImFzXCIpXSkpKSkpKSB0aGVuIChsZXQgbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChwKSkpKSBpbiBsZXQgcHR5cGUgPSAobnRoIChwKSAoKE51bWJlciAyLjApKSkgaW4gKGxldCB0eXBlX3ZhbCA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwdHlwZSkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwdHlwZSkpIGVsc2UgcHR5cGUpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoIWhhc19jaGlsZHJlbikpKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIG5hbWU7IE5pbCkpIGluIChzeF9kaWN0X3NldF9iIHBhcmFtX3R5cGVzIG5hbWUgdHlwZV92YWwpKSBlbHNlIE5pbCkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoc3ltYm9sX25hbWUgKHApKSBpbiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiJmtleVwiKV0pKSB0aGVuIChpbl9rZXkgOj0gKEJvb2wgdHJ1ZSk7IE5pbCkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiJnJlc3RcIildKSkgdGhlbiAoaGFzX2NoaWxkcmVuIDo9IChCb29sIHRydWUpOyBOaWwpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIiZjaGlsZHJlblwiKV0pKSB0aGVuIChoYXNfY2hpbGRyZW4gOj0gKEJvb2wgdHJ1ZSk7IE5pbCkgZWxzZSAoaWYgc3hfdHJ1dGh5ICghaGFzX2NoaWxkcmVuKSB0aGVuIE5pbCBlbHNlIChpZiBzeF90cnV0aHkgKCFpbl9rZXkpIHRoZW4gKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIG5hbWU7IE5pbCkgZWxzZSAocGFyYW1zIDo9IHN4X2FwcGVuZF9iICFwYXJhbXMgbmFtZTsgTmlsKSkpKSkpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgcGFyYW1zX2V4cHIpOyBOaWwpKSBpbiAoTGlzdCBbIXBhcmFtczsgIWhhc19jaGlsZHJlbjsgcGFyYW1fdHlwZXNdKSkpXG5cbigqIHNmLWRlZmlzbGFuZCAqKVxuYW5kIHNmX2RlZmlzbGFuZCBhcmdzIGVudiA9XG4gIChsZXQgbmFtZV9zeW0gPSAoZmlyc3QgKGFyZ3MpKSBpbiBsZXQgcGFyYW1zX3JhdyA9IChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgYm9keSA9IChsYXN0IChhcmdzKSkgaW4gbGV0IGNvbXBfbmFtZSA9IChzdHJpcF9wcmVmaXggKChzeW1ib2xfbmFtZSAobmFtZV9zeW0pKSkgKChTdHJpbmcgXCJ+XCIpKSkgaW4gbGV0IHBhcnNlZCA9IChwYXJzZV9jb21wX3BhcmFtcyAocGFyYW1zX3JhdykpIGluIGxldCBwYXJhbXMgPSAoZmlyc3QgKHBhcnNlZCkpIGluIGxldCBoYXNfY2hpbGRyZW4gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAobGV0IGlzbGFuZCA9IChtYWtlX2lzbGFuZCAoY29tcF9uYW1lKSAocGFyYW1zKSAoaGFzX2NoaWxkcmVuKSAoYm9keSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBlbnYgKHN4X3RvX3N0cmluZyAoc3ltYm9sX25hbWUgKG5hbWVfc3ltKSkpIGlzbGFuZCkpIGluIGlzbGFuZCkpKVxuXG4oKiBzZi1kZWZtYWNybyAqKVxuYW5kIHNmX2RlZm1hY3JvIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBwYXJhbXNfcmF3ID0gKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpIGluIGxldCBib2R5ID0gKG50aCAoYXJncykgKChOdW1iZXIgMi4wKSkpIGluIGxldCBwYXJzZWQgPSAocGFyc2VfbWFjcm9fcGFyYW1zIChwYXJhbXNfcmF3KSkgaW4gbGV0IHBhcmFtcyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IHJlc3RfcGFyYW0gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAobGV0IG1hYyA9IChtYWtlX21hY3JvIChwYXJhbXMpIChyZXN0X3BhcmFtKSAoYm9keSkgKGVudikgKChzeW1ib2xfbmFtZSAobmFtZV9zeW0pKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBlbnYgKHN4X3RvX3N0cmluZyAoc3ltYm9sX25hbWUgKG5hbWVfc3ltKSkpIG1hYykpIGluIG1hYykpKVxuXG4oKiBwYXJzZS1tYWNyby1wYXJhbXMgKilcbmFuZCBwYXJzZV9tYWNyb19wYXJhbXMgcGFyYW1zX2V4cHIgPVxuICAobGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgcmVzdF9wYXJhbSA9IHJlZiAoTmlsKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5mb2xkX2xlZnQgKGZ1biBzdGF0ZSBwIC0+IChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoc3ltYm9sX25hbWUgKHApKTsgKFN0cmluZyBcIiZyZXN0XCIpXSkpKSB0aGVuIChwcmltX2NhbGwgXCJhc3NvY1wiIFtzdGF0ZTsgKFN0cmluZyBcImluLXJlc3RcIik7IChCb29sIHRydWUpXSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgoZ2V0IChzdGF0ZSkgKChTdHJpbmcgXCJpbi1yZXN0XCIpKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHJlc3RfcGFyYW0gOj0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHApKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAocCkpIGVsc2UgcCk7IE5pbCkpIGluIHN0YXRlKSBlbHNlIChsZXQgKCkgPSBpZ25vcmUgKChwYXJhbXMgOj0gc3hfYXBwZW5kX2IgIXBhcmFtcyAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwKSkgZWxzZSBwKTsgTmlsKSkgaW4gc3RhdGUpKSkpIChsZXQgX2QgPSBIYXNodGJsLmNyZWF0ZSAxIGluIEhhc2h0YmwucmVwbGFjZSBfZCAodmFsdWVfdG9fc3RyIChTdHJpbmcgXCJpbi1yZXN0XCIpKSAoQm9vbCBmYWxzZSk7ICBEaWN0IF9kKSAoc3hfdG9fbGlzdCBwYXJhbXNfZXhwcikpKSBpbiAoTGlzdCBbIXBhcmFtczsgIXJlc3RfcGFyYW1dKSkpXG5cbigqIHFxLWV4cGFuZCAqKVxuYW5kIHFxX2V4cGFuZCB0ZW1wbGF0ZSBlbnYgPVxuICAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh0ZW1wbGF0ZSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSkpKSkgdGhlbiB0ZW1wbGF0ZSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wICh0ZW1wbGF0ZSkpKSB0aGVuIChMaXN0IFtdKSBlbHNlIChsZXQgaGVhZCA9IChmaXJzdCAodGVtcGxhdGUpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKHN5bWJvbF9uYW1lIChoZWFkKSk7IChTdHJpbmcgXCJ1bnF1b3RlXCIpXSkpKSB0aGVuICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoICh0ZW1wbGF0ZSkgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIHJlc3VsdCcgaXRlbSAtPiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaXRlbSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKGl0ZW0pKTsgKE51bWJlciAyLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoaXRlbSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoc3ltYm9sX25hbWUgKChmaXJzdCAoaXRlbSkpKSk7IChTdHJpbmcgXCJzcGxpY2UtdW5xdW90ZVwiKV0pKSkpKSB0aGVuIChsZXQgc3BsaWNlZCA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChpdGVtKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChzcGxpY2VkKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtyZXN1bHQnOyBzcGxpY2VkXSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgoaXNfbmlsIChzcGxpY2VkKSkpIHRoZW4gcmVzdWx0JyBlbHNlIChwcmltX2NhbGwgXCJjb25jYXRcIiBbcmVzdWx0JzsgKExpc3QgW3NwbGljZWRdKV0pKSkpIGVsc2UgKHByaW1fY2FsbCBcImNvbmNhdFwiIFtyZXN1bHQnOyAoTGlzdCBbKHFxX2V4cGFuZCAoaXRlbSkgKGVudikpXSldKSkpIChMaXN0IFtdKSAoc3hfdG9fbGlzdCB0ZW1wbGF0ZSkpKSkpKVxuXG4oKiBzZi1sZXRyZWMgKilcbmFuZCBzZl9sZXRyZWMgYXJncyBlbnYgPVxuICAobGV0IGJpbmRpbmdzID0gKGZpcnN0IChhcmdzKSkgaW4gbGV0IGJvZHkgPSAocmVzdCAoYXJncykpIGluIGxldCBsb2NhbCA9IChlbnZfZXh0ZW5kIChlbnYpKSBpbiBsZXQgbmFtZXMgPSByZWYgKChMaXN0IFtdKSkgaW4gbGV0IHZhbF9leHBycyA9IHJlZiAoKExpc3QgW10pKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChOdW1iZXIgMi4wKV0pKSkgdGhlbiAoTGlzdC5pdGVyIChmdW4gYmluZGluZyAtPiBpZ25vcmUgKChsZXQgdm5hbWUgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5nKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoKGZpcnN0IChiaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAoYmluZGluZykpKSBpbiAobGV0ICgpID0gaWdub3JlICgobmFtZXMgOj0gc3hfYXBwZW5kX2IgIW5hbWVzIHZuYW1lOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgodmFsX2V4cHJzIDo9IHN4X2FwcGVuZF9iICF2YWxfZXhwcnMgKG50aCAoYmluZGluZykgKChOdW1iZXIgMS4wKSkpOyBOaWwpKSBpbiAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyB2bmFtZSkgTmlsKSkpKSkpIChzeF90b19saXN0IGJpbmRpbmdzKTsgTmlsKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgcGFpcl9pZHggLT4gKGxldCB2bmFtZSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW3BhaXJfaWR4OyAoTnVtYmVyIDIuMCldKSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpKSBlbHNlIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpIGluIGxldCB2YWxfZXhwciA9IChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtwYWlyX2lkeDsgKE51bWJlciAyLjApXSldKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChuYW1lcyA6PSBzeF9hcHBlbmRfYiAhbmFtZXMgdm5hbWU7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKCh2YWxfZXhwcnMgOj0gc3hfYXBwZW5kX2IgIXZhbF9leHBycyB2YWxfZXhwcjsgTmlsKSkgaW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgdm5hbWUpIE5pbCkpKSkpIE5pbCAoc3hfdG9fbGlzdCAocHJpbV9jYWxsIFwicmFuZ2VcIiBbKE51bWJlciAwLjApOyAocHJpbV9jYWxsIFwiL1wiIFsobGVuIChiaW5kaW5ncykpOyAoTnVtYmVyIDIuMCldKV0pKSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgobGV0IHZhbHVlcyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChsb2NhbCkpKSkpIChzeF90b19saXN0ICF2YWxfZXhwcnMpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKExpc3QuaXRlciAoZnVuIHBhaXIgLT4gaWdub3JlICgoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoZmlyc3QgKHBhaXIpKSkgKG50aCAocGFpcikgKChOdW1iZXIgMS4wKSkpKSkpIChzeF90b19saXN0IChwcmltX2NhbGwgXCJ6aXBcIiBbIW5hbWVzOyB2YWx1ZXNdKSk7IE5pbCkpIGluIChMaXN0Lml0ZXIgKGZ1biB2YWwnIC0+IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGlzX2xhbWJkYSAodmFsJykpKSB0aGVuIChMaXN0Lml0ZXIgKGZ1biBuIC0+IGlnbm9yZSAoKGVudl9iaW5kIChsYW1iZGFfY2xvc3VyZSAodmFsJykpIChzeF90b19zdHJpbmcgbikgKGVudl9nZXQgKGxvY2FsKSAobikpKSkpIChzeF90b19saXN0ICFuYW1lcyk7IE5pbCkgZWxzZSBOaWwpKSkgKHN4X3RvX2xpc3QgdmFsdWVzKTsgTmlsKSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gZSAtPiBpZ25vcmUgKCh0cmFtcG9saW5lICgoZXZhbF9leHByIChlKSAobG9jYWwpKSkpKSkgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInNsaWNlXCIgW2JvZHk7IChOdW1iZXIgMC4wKTsgKHByaW1fY2FsbCBcImRlY1wiIFsobGVuIChib2R5KSldKV0pKTsgTmlsKSkgaW4gKG1ha2VfdGh1bmsgKChsYXN0IChib2R5KSkpIChsb2NhbCkpKSkpKVxuXG4oKiBzdGVwLXNmLWxldHJlYyAqKVxuYW5kIHN0ZXBfc2ZfbGV0cmVjIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IHRoayA9IChzZl9sZXRyZWMgKGFyZ3MpIChlbnYpKSBpbiAobWFrZV9jZWtfc3RhdGUgKCh0aHVua19leHByICh0aGspKSkgKCh0aHVua19lbnYgKHRoaykpKSAoa29udCkpKVxuXG4oKiBzZi1keW5hbWljLXdpbmQgKilcbmFuZCBzZl9keW5hbWljX3dpbmQgYXJncyBlbnYgPVxuICAobGV0IGJlZm9yZSA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGFyZ3MpKSkgKGVudikpKSkgaW4gbGV0IGJvZHkgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBpbiBsZXQgYWZ0ZXIgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMi4wKSkpKSAoZW52KSkpKSBpbiAoZHluYW1pY193aW5kX2NhbGwgKGJlZm9yZSkgKGJvZHkpIChhZnRlcikgKGVudikpKVxuXG4oKiBzZi1zY29wZSAqKVxuYW5kIHNmX3Njb3BlIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgcmVzdCA9IChwcmltX2NhbGwgXCJzbGljZVwiIFthcmdzOyAoTnVtYmVyIDEuMCldKSBpbiBsZXQgdmFsJyA9IHJlZiAoTmlsKSBpbiBsZXQgYm9keV9leHBycyA9IHJlZiAoTmlsKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAocmVzdCkpOyAoTnVtYmVyIDIuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChyZXN0KSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgoZmlyc3QgKHJlc3QpKSkpOyAoU3RyaW5nIFwidmFsdWVcIildKSkpKSB0aGVuIChsZXQgKCkgPSBpZ25vcmUgKCh2YWwnIDo9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChyZXN0KSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpOyBOaWwpKSBpbiAoYm9keV9leHBycyA6PSAocHJpbV9jYWxsIFwic2xpY2VcIiBbcmVzdDsgKE51bWJlciAyLjApXSk7IE5pbCkpIGVsc2UgKGJvZHlfZXhwcnMgOj0gcmVzdDsgTmlsKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzY29wZV9wdXNoIChuYW1lKSAoIXZhbCcpKSkgaW4gKGxldCByZXN1bHQnID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBlIC0+IGlnbm9yZSAoKHJlc3VsdCcgOj0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChlbnYpKSkpOyBOaWwpKSkgKHN4X3RvX2xpc3QgIWJvZHlfZXhwcnMpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluICFyZXN1bHQnKSkpKSkpXG5cbigqIHNmLXByb3ZpZGUgKilcbmFuZCBzZl9wcm92aWRlIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgdmFsJyA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIGxldCBib2R5X2V4cHJzID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMi4wKV0pIGluIGxldCByZXN1bHQnID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzY29wZV9wdXNoIChuYW1lKSAodmFsJykpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gZSAtPiBpZ25vcmUgKChyZXN1bHQnIDo9ICh0cmFtcG9saW5lICgoZXZhbF9leHByIChlKSAoZW52KSkpKTsgTmlsKSkpIChzeF90b19saXN0IGJvZHlfZXhwcnMpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluICFyZXN1bHQnKSkpKVxuXG4oKiBleHBhbmQtbWFjcm8gKilcbmFuZCBleHBhbmRfbWFjcm8gbWFjIHJhd19hcmdzIGVudiA9XG4gIChsZXQgbG9jYWwgPSAoZW52X21lcmdlICgobWFjcm9fY2xvc3VyZSAobWFjKSkpIChlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcGFpciAtPiBpZ25vcmUgKChlbnZfYmluZCBsb2NhbCAoc3hfdG9fc3RyaW5nIChmaXJzdCAocGFpcikpKSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPFwiIFsobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSk7IChsZW4gKHJhd19hcmdzKSldKSkgdGhlbiAobnRoIChyYXdfYXJncykgKChudGggKHBhaXIpICgoTnVtYmVyIDEuMCkpKSkpIGVsc2UgTmlsKSkpKSAoc3hfdG9fbGlzdCAoTGlzdCAoTGlzdC5tYXBpIChmdW4gaSBwIC0+IGxldCBpID0gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSkgaW4gKExpc3QgW3A7IGldKSkgKHN4X3RvX2xpc3QgKG1hY3JvX3BhcmFtcyAobWFjKSkpKSkpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobWFjcm9fcmVzdF9wYXJhbSAobWFjKSkpIHRoZW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgKG1hY3JvX3Jlc3RfcGFyYW0gKG1hYykpKSAocHJpbV9jYWxsIFwic2xpY2VcIiBbcmF3X2FyZ3M7IChsZW4gKChtYWNyb19wYXJhbXMgKG1hYykpKSldKSkgZWxzZSBOaWwpKSBpbiAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG1hY3JvX2JvZHkgKG1hYykpKSAobG9jYWwpKSkpKSkpXG5cbigqIGNlay1ydW4g4oCUIGl0ZXJhdGl2ZSB0byBhdm9pZCBPQ2FtbCBzdGFjayBvdmVyZmxvdyBpbiBqc19vZl9vY2FtbC9XQVNNICopXG5hbmQgY2VrX3J1biBzdGF0ZSA9XG4gIGxldCBzID0gcmVmIHN0YXRlIGluXG4gIHdoaWxlIG5vdCAobWF0Y2ggY2VrX3Rlcm1pbmFsX3AgIXMgd2l0aCBCb29sIHRydWUgLT4gdHJ1ZSB8IF8gLT4gZmFsc2UpIGRvXG4gICAgcyA6PSBjZWtfc3RlcCAhc1xuICBkb25lO1xuICBjZWtfdmFsdWUgIXNcblxuKCogY2VrLXN0ZXAgKilcbmFuZCBjZWtfc3RlcCBzdGF0ZSA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhjZWtfcGhhc2UgKHN0YXRlKSk7IChTdHJpbmcgXCJldmFsXCIpXSkpIHRoZW4gKHN0ZXBfZXZhbCAoc3RhdGUpKSBlbHNlIChzdGVwX2NvbnRpbnVlIChzdGF0ZSkpKVxuXG4oKiBzdGVwLWV2YWwgKilcbmFuZCBzdGVwX2V2YWwgc3RhdGUgPVxuICAobGV0IGV4cHIgPSAoY2VrX2NvbnRyb2wgKHN0YXRlKSkgaW4gbGV0IGVudiA9IChjZWtfZW52IChzdGF0ZSkpIGluIGxldCBrb250ID0gKGNla19rb250IChzdGF0ZSkpIGluIChsZXQgX21hdGNoX3ZhbCA9ICh0eXBlX29mIChleHByKSkgaW4gKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwibnVtYmVyXCIpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChleHByKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwic3RyaW5nXCIpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChleHByKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwiYm9vbGVhblwiKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoZXhwcikgKGVudikgKGtvbnQpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcIm5pbFwiKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwic3ltYm9sXCIpIHRoZW4gKGxldCBuYW1lID0gKHN5bWJvbF9uYW1lIChleHByKSkgaW4gKGxldCB2YWwnID0gKGlmIHN4X3RydXRoeSAoKGVudl9oYXMgKGVudikgKG5hbWUpKSkgdGhlbiAoZW52X2dldCAoZW52KSAobmFtZSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGlzX3ByaW1pdGl2ZSAobmFtZSkpKSB0aGVuIChnZXRfcHJpbWl0aXZlIChuYW1lKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwidHJ1ZVwiKV0pKSB0aGVuIChCb29sIHRydWUpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZhbHNlXCIpXSkpIHRoZW4gKEJvb2wgZmFsc2UpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm5pbFwiKV0pKSB0aGVuIE5pbCBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlVuZGVmaW5lZCBzeW1ib2w6IFwiKTsgbmFtZV0pKSkpKSkpKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChpc19uaWwgKHZhbCcpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwic3RhcnRzLXdpdGg/XCIgW25hbWU7IChTdHJpbmcgXCJ+XCIpXSkpKSB0aGVuIChkZWJ1Z19sb2cgKChTdHJpbmcgXCJDb21wb25lbnQgbm90IGZvdW5kOlwiKSkgKG5hbWUpKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsJykgKGVudikgKGtvbnQpKSkpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImtleXdvcmRcIikgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChrZXl3b3JkX25hbWUgKGV4cHIpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImRpY3RcIikgdGhlbiAobGV0IGtzID0gKHByaW1fY2FsbCBcImtleXNcIiBbZXhwcl0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChrcykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgZmlyc3Rfa2V5ID0gKGZpcnN0IChrcykpIGluIGxldCByZW1haW5pbmdfZW50cmllcyA9IHJlZiAoKExpc3QgW10pKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gayAtPiBpZ25vcmUgKChyZW1haW5pbmdfZW50cmllcyA6PSBzeF9hcHBlbmRfYiAhcmVtYWluaW5nX2VudHJpZXMgKExpc3QgW2s7IChnZXQgKGV4cHIpIChrKSldKTsgTmlsKSkpIChzeF90b19saXN0IChyZXN0IChrcykpKTsgTmlsKSkgaW4gKG1ha2VfY2VrX3N0YXRlICgoZ2V0IChleHByKSAoZmlyc3Rfa2V5KSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9kaWN0X2ZyYW1lICghcmVtYWluaW5nX2VudHJpZXMpICgoTGlzdCBbKExpc3QgW2ZpcnN0X2tleV0pXSkpIChlbnYpKSkgKGtvbnQpKSkpKSkpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImxpc3RcIikgdGhlbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoZXhwcikpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKHN0ZXBfZXZhbF9saXN0IChleHByKSAoZW52KSAoa29udCkpKSBlbHNlIChtYWtlX2Nla192YWx1ZSAoZXhwcikgKGVudikgKGtvbnQpKSkpKSkpKSkpKSlcblxuKCogc3RlcC1ldmFsLWxpc3QgKilcbmFuZCBzdGVwX2V2YWxfbGlzdCBleHByIGVudiBrb250ID1cbiAgKGxldCBoZWFkID0gKGZpcnN0IChleHByKSkgaW4gbGV0IGFyZ3MgPSAocmVzdCAoZXhwcikpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGhlYWQpKTsgKFN0cmluZyBcImxhbWJkYVwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSkpKSkpKSB0aGVuIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChleHByKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoTGlzdCBbXSkpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoZXhwcikpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfbWFwX2ZyYW1lIChOaWwpICgocmVzdCAoZXhwcikpKSAoKExpc3QgW10pKSAoZW52KSkpIChrb250KSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKGxldCBuYW1lID0gKHN5bWJvbF9uYW1lIChoZWFkKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImlmXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfaWYgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwid2hlblwiKV0pKSB0aGVuIChzdGVwX3NmX3doZW4gKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiY29uZFwiKV0pKSB0aGVuIChzdGVwX3NmX2NvbmQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiY2FzZVwiKV0pKSB0aGVuIChzdGVwX3NmX2Nhc2UgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiYW5kXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfYW5kIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm9yXCIpXSkpIHRoZW4gKHN0ZXBfc2Zfb3IgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibGV0XCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGV0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImxldCpcIildKSkgdGhlbiAoc3RlcF9zZl9sZXQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibGFtYmRhXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGFtYmRhIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZuXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGFtYmRhIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZmluZVwiKV0pKSB0aGVuIChzdGVwX3NmX2RlZmluZSAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJkZWZjb21wXCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc2ZfZGVmY29tcCAoYXJncykgKGVudikpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZmlzbGFuZFwiKV0pKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKHNmX2RlZmlzbGFuZCAoYXJncykgKGVudikpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZm1hY3JvXCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc2ZfZGVmbWFjcm8gKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJiZWdpblwiKV0pKSB0aGVuIChzdGVwX3NmX2JlZ2luIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRvXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfYmVnaW4gKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicXVvdGVcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChhcmdzKSkpIHRoZW4gTmlsIGVsc2UgKGZpcnN0IChhcmdzKSkpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInF1YXNpcXVvdGVcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChxcV9leHBhbmQgKChmaXJzdCAoYXJncykpKSAoZW52KSkpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiLT5cIildKSkgdGhlbiAoc3RlcF9zZl90aHJlYWRfZmlyc3QgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwic2V0IVwiKV0pKSB0aGVuIChzdGVwX3NmX3NldF9iIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImxldHJlY1wiKV0pKSB0aGVuIChzdGVwX3NmX2xldHJlYyAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJyZXNldFwiKV0pKSB0aGVuIChzdGVwX3NmX3Jlc2V0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNoaWZ0XCIpXSkpIHRoZW4gKHN0ZXBfc2Zfc2hpZnQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiZGVyZWZcIildKSkgdGhlbiAoc3RlcF9zZl9kZXJlZiAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJzY29wZVwiKV0pKSB0aGVuIChzdGVwX3NmX3Njb3BlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInByb3ZpZGVcIildKSkgdGhlbiAoc3RlcF9zZl9wcm92aWRlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImNvbnRleHRcIildKSkgdGhlbiAoc3RlcF9zZl9jb250ZXh0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImVtaXQhXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfZW1pdCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJlbWl0dGVkXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfZW1pdHRlZCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJkeW5hbWljLXdpbmRcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChzZl9keW5hbWljX3dpbmQgKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJtYXBcIildKSkgdGhlbiAoc3RlcF9ob19tYXAgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibWFwLWluZGV4ZWRcIildKSkgdGhlbiAoc3RlcF9ob19tYXBfaW5kZXhlZCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmaWx0ZXJcIildKSkgdGhlbiAoc3RlcF9ob19maWx0ZXIgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKHN0ZXBfaG9fcmVkdWNlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNvbWVcIildKSkgdGhlbiAoc3RlcF9ob19zb21lIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImV2ZXJ5P1wiKV0pKSB0aGVuIChzdGVwX2hvX2V2ZXJ5IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZvci1lYWNoXCIpXSkpIHRoZW4gKHN0ZXBfaG9fZm9yX2VhY2ggKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiaGFzLWtleT9cIiBbY3VzdG9tX3NwZWNpYWxfZm9ybXM7IG5hbWVdKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChjZWtfY2FsbCAoKGdldCAoY3VzdG9tX3NwZWNpYWxfZm9ybXMpIChuYW1lKSkpIChMaXN0IFthcmdzOyBlbnZdKSkpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAoZW52X2hhcyAoZW52KSAobmFtZSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChpc19tYWNybyAoKGVudl9nZXQgKGVudikgKG5hbWUpKSkpKSkgdGhlbiAobGV0IG1hYyA9IChlbnZfZ2V0IChlbnYpIChuYW1lKSkgaW4gKG1ha2VfY2VrX3N0YXRlICgoZXhwYW5kX21hY3JvIChtYWMpIChhcmdzKSAoZW52KSkpIChlbnYpIChrb250KSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gcmVuZGVyX2NoZWNrIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChjZWtfY2FsbCAocmVuZGVyX2NoZWNrKSAoTGlzdCBbZXhwcjsgZW52XSkpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChjZWtfY2FsbCAocmVuZGVyX2ZuKSAoTGlzdCBbZXhwcjsgZW52XSkpKSAoZW52KSAoa29udCkpIGVsc2UgKHN0ZXBfZXZhbF9jYWxsIChoZWFkKSAoYXJncykgKGVudikgKGtvbnQpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpIGVsc2UgKHN0ZXBfZXZhbF9jYWxsIChoZWFkKSAoYXJncykgKGVudikgKGtvbnQpKSkpKVxuXG4oKiBzdGVwLXNmLWlmICopXG5hbmQgc3RlcF9zZl9pZiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2lmX2ZyYW1lICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpICgoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPlwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgMi4wKV0pKSB0aGVuIChudGggKGFyZ3MpICgoTnVtYmVyIDIuMCkpKSBlbHNlIE5pbCkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2Ytd2hlbiAqKVxuYW5kIHN0ZXBfc2Zfd2hlbiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3doZW5fZnJhbWUgKChyZXN0IChhcmdzKSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2YtYmVnaW4gKilcbmFuZCBzdGVwX3NmX2JlZ2luIGFyZ3MgZW52IGtvbnQgPVxuICAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoYXJncykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoa29udCkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2JlZ2luX2ZyYW1lICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKSkpXG5cbigqIHN0ZXAtc2YtbGV0ICopXG5hbmQgc3RlcF9zZl9sZXQgYXJncyBlbnYga29udCA9XG4gIGxldCBwYWlycyA9IHJlZiBOaWwgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYXJncykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKCh0cmFtcG9saW5lICgoc2ZfbmFtZWRfbGV0IChhcmdzKSAoZW52KSkpKSkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgYmluZGluZ3MgPSAoZmlyc3QgKGFyZ3MpKSBpbiBsZXQgYm9keSA9IChyZXN0IChhcmdzKSkgaW4gbGV0IGxvY2FsID0gKGVudl9leHRlbmQgKGVudikpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChiaW5kaW5ncykpKSB0aGVuIChzdGVwX3NmX2JlZ2luIChib2R5KSAobG9jYWwpIChrb250KSkgZWxzZSAobGV0IGZpcnN0X2JpbmRpbmcgPSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChOdW1iZXIgMi4wKV0pKSkgdGhlbiAoZmlyc3QgKGJpbmRpbmdzKSkgZWxzZSAoTGlzdCBbKGZpcnN0IChiaW5kaW5ncykpOyAobnRoIChiaW5kaW5ncykgKChOdW1iZXIgMS4wKSkpXSkpIGluIGxldCByZXN0X2JpbmRpbmdzID0gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoTnVtYmVyIDIuMCldKSkpIHRoZW4gKHJlc3QgKGJpbmRpbmdzKSkgZWxzZSAobGV0IHBhaXJzID0gcmVmICgoTGlzdCBbXSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgaSAtPiAocGFpcnMgOj0gc3hfYXBwZW5kX2IgIXBhaXJzIChMaXN0IFsobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW2k7IChOdW1iZXIgMi4wKV0pKSk7IChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtpOyAoTnVtYmVyIDIuMCldKV0pKSldKTsgTmlsKSkgTmlsIChzeF90b19saXN0IChwcmltX2NhbGwgXCJyYW5nZVwiIFsoTnVtYmVyIDEuMCk7IChwcmltX2NhbGwgXCIvXCIgWyhsZW4gKGJpbmRpbmdzKSk7IChOdW1iZXIgMi4wKV0pXSkpKSkgaW4gIXBhaXJzKSkpIGluIChsZXQgdm5hbWUgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChmaXJzdF9iaW5kaW5nKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoKGZpcnN0IChmaXJzdF9iaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAoZmlyc3RfYmluZGluZykpKSBpbiAobWFrZV9jZWtfc3RhdGUgKChudGggKGZpcnN0X2JpbmRpbmcpICgoTnVtYmVyIDEuMCkpKSkgKGxvY2FsKSAoKGtvbnRfcHVzaCAoKG1ha2VfbGV0X2ZyYW1lICh2bmFtZSkgKHJlc3RfYmluZGluZ3MpIChib2R5KSAobG9jYWwpKSkgKGtvbnQpKSkpKSkpKSlcblxuKCogc3RlcC1zZi1kZWZpbmUgKilcbmFuZCBzdGVwX3NmX2RlZmluZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBoYXNfZWZmZWN0cyA9IChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI+PVwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgNC4wKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImVmZmVjdHNcIildKSkpIGluIGxldCB2YWxfaWR4ID0gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj49XCIgWyhsZW4gKGFyZ3MpKTsgKE51bWJlciA0LjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhrZXl3b3JkX25hbWUgKChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwiZWZmZWN0c1wiKV0pKSkpIHRoZW4gKE51bWJlciAzLjApIGVsc2UgKE51bWJlciAxLjApKSBpbiBsZXQgZWZmZWN0X2xpc3QgPSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDQuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSk7IChTdHJpbmcgXCJlZmZlY3RzXCIpXSkpKSkgdGhlbiAobnRoIChhcmdzKSAoKE51bWJlciAyLjApKSkgZWxzZSBOaWwpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKHZhbF9pZHgpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2RlZmluZV9mcmFtZSAoKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSAoZW52KSAoaGFzX2VmZmVjdHMpIChlZmZlY3RfbGlzdCkpKSAoa29udCkpKSkpXG5cbigqIHN0ZXAtc2Ytc2V0ISAqKVxuYW5kIHN0ZXBfc2Zfc2V0X2IgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2Vfc2V0X2ZyYW1lICgoc3ltYm9sX25hbWUgKChmaXJzdCAoYXJncykpKSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2YtYW5kICopXG5hbmQgc3RlcF9zZl9hbmQgYXJncyBlbnYga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChhcmdzKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCB0cnVlKSkgKGVudikgKGtvbnQpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9hbmRfZnJhbWUgKChyZXN0IChhcmdzKSkpIChlbnYpKSkgKGtvbnQpKSkpKVxuXG4oKiBzdGVwLXNmLW9yICopXG5hbmQgc3RlcF9zZl9vciBhcmdzIGVudiBrb250ID1cbiAgKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGVudikgKGtvbnQpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9vcl9mcmFtZSAoKHJlc3QgKGFyZ3MpKSkgKGVudikpKSAoa29udCkpKSkpXG5cbigqIHN0ZXAtc2YtY29uZCAqKVxuYW5kIHN0ZXBfc2ZfY29uZCBhcmdzIGVudiBrb250ID1cbiAgKGxldCBzY2hlbWVfcCA9IChjb25kX3NjaGVtZV9wIChhcmdzKSkgaW4gKGlmIHN4X3RydXRoeSAoc2NoZW1lX3ApIHRoZW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgY2xhdXNlID0gKGZpcnN0IChhcmdzKSkgaW4gbGV0IHRlc3QgPSAoZmlyc3QgKGNsYXVzZSkpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAodGVzdCkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoY2xhdXNlKSAoKE51bWJlciAxLjApKSkpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKHRlc3QpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9jb25kX2ZyYW1lIChhcmdzKSAoZW52KSAoKEJvb2wgdHJ1ZSkpKSkgKGtvbnQpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIjxcIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgdGVzdCA9IChmaXJzdCAoYXJncykpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAodGVzdCkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSAoa29udCkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICh0ZXN0KSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfY29uZF9mcmFtZSAoYXJncykgKGVudikgKChCb29sIGZhbHNlKSkpKSAoa29udCkpKSkpKSkpKVxuXG4oKiBzdGVwLXNmLWNhc2UgKilcbmFuZCBzdGVwX3NmX2Nhc2UgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9jYXNlX2ZyYW1lIChOaWwpICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKVxuXG4oKiBzdGVwLXNmLXRocmVhZC1maXJzdCAqKVxuYW5kIHN0ZXBfc2ZfdGhyZWFkX2ZpcnN0IGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfdGhyZWFkX2ZyYW1lICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKVxuXG4oKiBzdGVwLXNmLWxhbWJkYSAqKVxuYW5kIHN0ZXBfc2ZfbGFtYmRhIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfdmFsdWUgKChzZl9sYW1iZGEgKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKVxuXG4oKiBzdGVwLXNmLXNjb3BlICopXG5hbmQgc3RlcF9zZl9zY29wZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgcmVzdF9hcmdzID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMS4wKV0pIGluIGxldCB2YWwnID0gcmVmIChOaWwpIGluIGxldCBib2R5ID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI+PVwiIFsobGVuIChyZXN0X2FyZ3MpKTsgKE51bWJlciAyLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAocmVzdF9hcmdzKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgoZmlyc3QgKHJlc3RfYXJncykpKSk7IChTdHJpbmcgXCJ2YWx1ZVwiKV0pKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHZhbCcgOj0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChudGggKHJlc3RfYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKTsgTmlsKSkgaW4gKGJvZHkgOj0gKHByaW1fY2FsbCBcInNsaWNlXCIgW3Jlc3RfYXJnczsgKE51bWJlciAyLjApXSk7IE5pbCkpIGVsc2UgKGJvZHkgOj0gcmVzdF9hcmdzOyBOaWwpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKCFib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoIWJvZHkpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3Njb3BlX2FjY19mcmFtZSAobmFtZSkgKCF2YWwnKSAoKHJlc3QgKCFib2R5KSkpIChlbnYpKSkgKGtvbnQpKSkpKSkpXG5cbigqIHN0ZXAtc2YtcHJvdmlkZSAqKVxuYW5kIHN0ZXBfc2ZfcHJvdmlkZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgdmFsJyA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIGxldCBib2R5ID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMi4wKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYm9keSkpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfcHJvdmlkZV9mcmFtZSAobmFtZSkgKHZhbCcpICgocmVzdCAoYm9keSkpKSAoZW52KSkpIChrb250KSkpKSkpXG5cbigqIHN0ZXAtc2YtY29udGV4dCAqKVxuYW5kIHN0ZXBfc2ZfY29udGV4dCBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgZGVmYXVsdF92YWwgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBlbHNlIE5pbCkgaW4gbGV0IGZyYW1lID0gKGtvbnRfZmluZF9wcm92aWRlIChrb250KSAobmFtZSkpIGluIChtYWtlX2Nla192YWx1ZSAoKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoZnJhbWUpKSkgdGhlbiBkZWZhdWx0X3ZhbCBlbHNlIChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInZhbHVlXCIpKSkpKSAoZW52KSAoa29udCkpKVxuXG4oKiBzdGVwLXNmLWVtaXQgKilcbmFuZCBzdGVwX3NmX2VtaXQgYXJncyBlbnYga29udCA9XG4gIChsZXQgbmFtZSA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGFyZ3MpKSkgKGVudikpKSkgaW4gbGV0IHZhbCcgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBpbiBsZXQgZnJhbWUgPSAoa29udF9maW5kX3Njb3BlX2FjYyAoa29udCkgKG5hbWUpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChmcmFtZSkgdGhlbiAoc3hfZGljdF9zZXRfYiBmcmFtZSAoU3RyaW5nIFwiZW1pdHRlZFwiKSAocHJpbV9jYWxsIFwiYXBwZW5kXCIgWyhnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVtaXR0ZWRcIikpKTsgKExpc3QgW3ZhbCddKV0pKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpKSlcblxuKCogc3RlcC1zZi1lbWl0dGVkICopXG5hbmQgc3RlcF9zZl9lbWl0dGVkIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IG5hbWUgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKGZpcnN0IChhcmdzKSkpIChlbnYpKSkpIGluIGxldCBmcmFtZSA9IChrb250X2ZpbmRfc2NvcGVfYWNjIChrb250KSAobmFtZSkpIGluIChtYWtlX2Nla192YWx1ZSAoKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoZnJhbWUpKSkgdGhlbiAoTGlzdCBbXSkgZWxzZSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbWl0dGVkXCIpKSkpKSAoZW52KSAoa29udCkpKVxuXG4oKiBzdGVwLXNmLXJlc2V0ICopXG5hbmQgc3RlcF9zZl9yZXNldCBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3Jlc2V0X2ZyYW1lIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2Ytc2hpZnQgKilcbmFuZCBzdGVwX3NmX3NoaWZ0IGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IGtfbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChhcmdzKSkpKSBpbiBsZXQgYm9keSA9IChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgY2FwdHVyZWRfcmVzdWx0ID0gKGtvbnRfY2FwdHVyZV90b19yZXNldCAoa29udCkpIGluIGxldCBjYXB0dXJlZCA9IChmaXJzdCAoY2FwdHVyZWRfcmVzdWx0KSkgaW4gbGV0IHJlc3Rfa29udCA9IChudGggKGNhcHR1cmVkX3Jlc3VsdCkgKChOdW1iZXIgMS4wKSkpIGluIChsZXQgayA9IChtYWtlX2Nla19jb250aW51YXRpb24gKGNhcHR1cmVkKSAocmVzdF9rb250KSkgaW4gKGxldCBzaGlmdF9lbnYgPSAoZW52X2V4dGVuZCAoZW52KSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGVudl9iaW5kIHNoaWZ0X2VudiAoc3hfdG9fc3RyaW5nIGtfbmFtZSkgaykpIGluIChtYWtlX2Nla19zdGF0ZSAoYm9keSkgKHNoaWZ0X2VudikgKHJlc3Rfa29udCkpKSkpKVxuXG4oKiBzdGVwLXNmLWRlcmVmICopXG5hbmQgc3RlcF9zZl9kZXJlZiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2RlcmVmX2ZyYW1lIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIGNlay1jYWxsICopXG5hbmQgY2VrX2NhbGwgZiBhcmdzID1cbiAgKGxldCBhID0gKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoYXJncykpKSB0aGVuIChMaXN0IFtdKSBlbHNlIGFyZ3MpIGluIChpZiBzeF90cnV0aHkgKChpc19uaWwgKGYpKSkgdGhlbiBOaWwgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9vciA9IChpc19sYW1iZGEgKGYpKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGlzX2NhbGxhYmxlIChmKSkpKSB0aGVuIChjZWtfcnVuICgoY29udGludWVfd2l0aF9jYWxsIChmKSAoYSkgKChtYWtlX2VudiAoKSkpIChhKSAoKExpc3QgW10pKSkpKSBlbHNlIE5pbCkpKVxuXG4oKiByZWFjdGl2ZS1zaGlmdC1kZXJlZiAqKVxuYW5kIHJlYWN0aXZlX3NoaWZ0X2RlcmVmIHNpZycgZW52IGtvbnQgPVxuICAobGV0IHNjYW5fcmVzdWx0ID0gKGtvbnRfY2FwdHVyZV90b19yZWFjdGl2ZV9yZXNldCAoa29udCkpIGluIGxldCBjYXB0dXJlZF9mcmFtZXMgPSAoZmlyc3QgKHNjYW5fcmVzdWx0KSkgaW4gbGV0IHJlc2V0X2ZyYW1lID0gKG50aCAoc2Nhbl9yZXN1bHQpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgcmVtYWluaW5nX2tvbnQgPSAobnRoIChzY2FuX3Jlc3VsdCkgKChOdW1iZXIgMi4wKSkpIGluIGxldCB1cGRhdGVfZm4gPSAoZ2V0IChyZXNldF9mcmFtZSkgKChTdHJpbmcgXCJ1cGRhdGUtZm5cIikpKSBpbiAobGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgKChMaXN0IFtdKSkgaW4gKGxldCBzdWJzY3JpYmVyID0gKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gbGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgTmlsIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBkIC0+IGlnbm9yZSAoKGNla19jYWxsIChkKSAoTmlsKSkpKSAoc3hfdG9fbGlzdCAhc3ViX2Rpc3Bvc2Vycyk7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzdWJfZGlzcG9zZXJzIDo9IChMaXN0IFtdKTsgTmlsKSkgaW4gKGxldCBuZXdfcmVzZXQgPSAobWFrZV9yZWFjdGl2ZV9yZXNldF9mcmFtZSAoZW52KSAodXBkYXRlX2ZuKSAoKEJvb2wgZmFsc2UpKSkgaW4gbGV0IG5ld19rb250ID0gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtjYXB0dXJlZF9mcmFtZXM7IChMaXN0IFtuZXdfcmVzZXRdKTsgcmVtYWluaW5nX2tvbnRdKSBpbiAod2l0aF9pc2xhbmRfc2NvcGUgKChOYXRpdmVGbiAoXCJcXDIwNlxcMTg3XCIsIGZ1biBfYXJncyAtPiBtYXRjaCBfYXJncyB3aXRoIFtkXSAtPiAoZnVuIGQgLT4gbGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgTmlsIGluIChzdWJfZGlzcG9zZXJzIDo9IHN4X2FwcGVuZF9iICFzdWJfZGlzcG9zZXJzIGQ7IE5pbCkpIGQgfCBfIC0+IE5pbCkpKSAoKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gKGNla19ydW4gKChtYWtlX2Nla192YWx1ZSAoKHNpZ25hbF92YWx1ZSAoc2lnJykpKSAoZW52KSAobmV3X2tvbnQpKSkpKSAoKSkpKSkpKSkpICgpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKHNpZ25hbF9hZGRfc3ViX2IgKHNpZycpIChzdWJzY3JpYmVyKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChyZWdpc3Rlcl9pbl9zY29wZSAoKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gKGxldCAoKSA9IGlnbm9yZSAoKHNpZ25hbF9yZW1vdmVfc3ViX2IgKHNpZycpIChzdWJzY3JpYmVyKSkpIGluIChMaXN0Lml0ZXIgKGZ1biBkIC0+IGlnbm9yZSAoKGNla19jYWxsIChkKSAoTmlsKSkpKSAoc3hfdG9fbGlzdCAhc3ViX2Rpc3Bvc2Vycyk7IE5pbCkpKSAoKSkpKSkpIGluIChsZXQgaW5pdGlhbF9rb250ID0gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtjYXB0dXJlZF9mcmFtZXM7IChMaXN0IFtyZXNldF9mcmFtZV0pOyByZW1haW5pbmdfa29udF0pIGluIChtYWtlX2Nla192YWx1ZSAoKHNpZ25hbF92YWx1ZSAoc2lnJykpKSAoZW52KSAoaW5pdGlhbF9rb250KSkpKSkpKSlcblxuKCogc3RlcC1ldmFsLWNhbGwgKilcbmFuZCBzdGVwX2V2YWxfY2FsbCBoZWFkIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IGhuYW1lID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGhlYWQpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoaGVhZCkpIGVsc2UgTmlsKSBpbiAobWFrZV9jZWtfc3RhdGUgKGhlYWQpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKE5pbCkgKChMaXN0IFtdKSkgKGFyZ3MpIChlbnYpIChhcmdzKSAoaG5hbWUpKSkgKGtvbnQpKSkpKVxuXG4oKiBoby1mb3JtLW5hbWU/ICopXG5hbmQgaG9fZm9ybV9uYW1lX3AgbmFtZSA9XG4gIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm1hcFwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAobGV0IF9vciA9IChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAobGV0IF9vciA9IChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmaWx0ZXJcIildKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNvbWVcIildKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiZXZlcnk/XCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmb3ItZWFjaFwiKV0pKSkpKSkpXG5cbigqIGhvLWZuPyAqKVxuYW5kIGhvX2ZuX3AgdiA9XG4gIChsZXQgX29yID0gKGlzX2NhbGxhYmxlICh2KSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChpc19sYW1iZGEgKHYpKSlcblxuKCogaG8tc3dhcC1hcmdzICopXG5hbmQgaG9fc3dhcF9hcmdzIGhvX3R5cGUgZXZhbGVkID1cbiAgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbaG9fdHlwZTsgKFN0cmluZyBcInJlZHVjZVwiKV0pKSB0aGVuIChsZXQgYSA9IChmaXJzdCAoZXZhbGVkKSkgaW4gbGV0IGIgPSAobnRoIChldmFsZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAoQm9vbCAobm90IChzeF90cnV0aHkgKChob19mbl9wIChhKSkpKSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChob19mbl9wIChiKSkpKSB0aGVuIChMaXN0IFtiOyAobnRoIChldmFsZWQpICgoTnVtYmVyIDIuMCkpKTsgYV0pIGVsc2UgZXZhbGVkKSkgZWxzZSAobGV0IGEgPSAoZmlyc3QgKGV2YWxlZCkpIGluIGxldCBiID0gKG50aCAoZXZhbGVkKSAoKE51bWJlciAxLjApKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaG9fZm5fcCAoYSkpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoaG9fZm5fcCAoYikpKSkgdGhlbiAoTGlzdCBbYjsgYV0pIGVsc2UgZXZhbGVkKSkpXG5cbigqIGhvLXNldHVwLWRpc3BhdGNoICopXG5hbmQgaG9fc2V0dXBfZGlzcGF0Y2ggaG9fdHlwZSBldmFsZWQgZW52IGtvbnQgPVxuICAobGV0IG9yZGVyZWQgPSAoaG9fc3dhcF9hcmdzIChob190eXBlKSAoZXZhbGVkKSkgaW4gKGxldCBmID0gKGZpcnN0IChvcmRlcmVkKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbaG9fdHlwZTsgKFN0cmluZyBcIm1hcFwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKGNvbGwpKV0pKSAoZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfbWFwX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKChMaXN0IFtdKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoTnVtYmVyIDAuMCk7IChmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9tYXBfaW5kZXhlZF9mcmFtZSAoZikgKChyZXN0IChjb2xsKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwiZmlsdGVyXCIpXSkpIHRoZW4gKGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoTGlzdCBbXSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9maWx0ZXJfZnJhbWUgKGYpICgocmVzdCAoY29sbCkpKSAoKExpc3QgW10pKSAoKGZpcnN0IChjb2xsKSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKGxldCBpbml0ID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMi4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChpbml0KSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFtpbml0OyAoZmlyc3QgKGNvbGwpKV0pKSAoZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfcmVkdWNlX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJzb21lXCIpXSkpIHRoZW4gKGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCBmYWxzZSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9zb21lX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJldmVyeVwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKEJvb2wgdHJ1ZSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9ldmVyeV9mcmFtZSAoZikgKChyZXN0IChjb2xsKSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwiZm9yLWVhY2hcIildKSkgdGhlbiAobGV0IGNvbGwgPSAobnRoIChvcmRlcmVkKSAoKE51bWJlciAxLjApKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGNvbGwpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChjb250aW51ZV93aXRoX2NhbGwgKGYpICgoTGlzdCBbKGZpcnN0IChjb2xsKSldKSkgKGVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX2Zvcl9lYWNoX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlVua25vd24gSE8gdHlwZTogXCIpOyBob190eXBlXSkpKSkpKSkpKSkpKSkpXG5cbigqIHN0ZXAtaG8tbWFwICopXG5hbmQgc3RlcF9ob19tYXAgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcIm1hcFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tbWFwLWluZGV4ZWQgKilcbmFuZCBzdGVwX2hvX21hcF9pbmRleGVkIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZmlsdGVyICopXG5hbmQgc3RlcF9ob19maWx0ZXIgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcImZpbHRlclwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tcmVkdWNlICopXG5hbmQgc3RlcF9ob19yZWR1Y2UgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcInJlZHVjZVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tc29tZSAqKVxuYW5kIHN0ZXBfaG9fc29tZSBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2hvX3NldHVwX2ZyYW1lICgoU3RyaW5nIFwic29tZVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZXZlcnkgKilcbmFuZCBzdGVwX2hvX2V2ZXJ5IGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJldmVyeVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZm9yLWVhY2ggKilcbmFuZCBzdGVwX2hvX2Zvcl9lYWNoIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJmb3ItZWFjaFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtY29udGludWUgKilcbmFuZCBzdGVwX2NvbnRpbnVlIHN0YXRlID1cbiAgKGxldCB2YWx1ZSA9IChjZWtfdmFsdWUgKHN0YXRlKSkgaW4gbGV0IGVudiA9IChjZWtfZW52IChzdGF0ZSkpIGluIGxldCBrb250ID0gKGNla19rb250IChzdGF0ZSkpIGluIChpZiBzeF90cnV0aHkgKChrb250X2VtcHR5X3AgKGtvbnQpKSkgdGhlbiBzdGF0ZSBlbHNlIChsZXQgZnJhbWUgPSAoa29udF90b3AgKGtvbnQpKSBpbiBsZXQgcmVzdF9rID0gKGtvbnRfcG9wIChrb250KSkgaW4gbGV0IGZ0ID0gKGZyYW1lX3R5cGUgKGZyYW1lKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJpZlwiKV0pKSB0aGVuIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IHZhbHVlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAodmFsdWUpKSkpKSkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidGhlblwiKSkpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19uaWwgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVsc2VcIikpKSkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVsc2VcIikpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpKSAocmVzdF9rKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwid2hlblwiKV0pKSB0aGVuIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IHZhbHVlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAodmFsdWUpKSkpKSkpKSB0aGVuIChsZXQgYm9keSA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImJvZHlcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChmZW52KSAocmVzdF9rKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsobGVuIChib2R5KSk7IChOdW1iZXIgMS4wKV0pKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChib2R5KSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYm9keSkpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2JlZ2luX2ZyYW1lICgocmVzdCAoYm9keSkpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSBlbHNlIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAocmVzdF9rKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJiZWdpblwiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKHJlbWFpbmluZykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfYmVnaW5fZnJhbWUgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImxldFwiKV0pKSB0aGVuIChsZXQgbmFtZSA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcIm5hbWVcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGJvZHkgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJib2R5XCIpKSkgaW4gbGV0IGxvY2FsID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKHN0ZXBfc2ZfYmVnaW4gKGJvZHkpIChsb2NhbCkgKHJlc3RfaykpIGVsc2UgKGxldCBuZXh0X2JpbmRpbmcgPSAoZmlyc3QgKHJlbWFpbmluZykpIGluIGxldCB2bmFtZSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgoZmlyc3QgKG5leHRfYmluZGluZykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAobmV4dF9iaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAobmV4dF9iaW5kaW5nKSkpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAobmV4dF9iaW5kaW5nKSAoKE51bWJlciAxLjApKSkpIChsb2NhbCkgKChrb250X3B1c2ggKChtYWtlX2xldF9mcmFtZSAodm5hbWUpICgocmVzdCAocmVtYWluaW5nKSkpIChib2R5KSAobG9jYWwpKSkgKHJlc3RfaykpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkZWZpbmVcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiBsZXQgaGFzX2VmZmVjdHMgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJoYXMtZWZmZWN0c1wiKSkpIGluIGxldCBlZmZlY3RfbGlzdCA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVmZmVjdC1saXN0XCIpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2xhbWJkYSAodmFsdWUpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoaXNfbmlsICgobGFtYmRhX25hbWUgKHZhbHVlKSkpKSkpIHRoZW4gKHNldF9sYW1iZGFfbmFtZSB2YWx1ZSAoc3hfdG9fc3RyaW5nIG5hbWUpKSBlbHNlIE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBmZW52IChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChoYXNfZWZmZWN0cykgdGhlbiAobGV0IGVmZmVjdF9uYW1lcyA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChlZmZlY3RfbGlzdCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSB0aGVuIChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGUpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoZSkpIGVsc2UgKFN0cmluZyAoc3hfc3RyIFtlXSkpKSkgKHN4X3RvX2xpc3QgZWZmZWN0X2xpc3QpKSkgZWxzZSAoTGlzdCBbKFN0cmluZyAoc3hfc3RyIFtlZmZlY3RfbGlzdF0pKV0pKSBpbiBsZXQgZWZmZWN0X2FubnMgPSAoaWYgc3hfdHJ1dGh5ICgoZW52X2hhcyAoZmVudikgKChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkpKSB0aGVuIChlbnZfZ2V0IChmZW52KSAoKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSkgZWxzZSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc3hfZGljdF9zZXRfYiBlZmZlY3RfYW5ucyBuYW1lIGVmZmVjdF9uYW1lcykpIGluIChlbnZfYmluZCBmZW52IChzeF90b19zdHJpbmcgKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSBlZmZlY3RfYW5ucykpKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsdWUpIChmZW52KSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJzZXRcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X3NldCBmZW52IChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZW52KSAocmVzdF9rKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiYW5kXCIpXSkpIHRoZW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICh2YWx1ZSkpKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkpICgoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsobGVuIChyZW1haW5pbmcpKTsgKE51bWJlciAxLjApXSkpIHRoZW4gcmVzdF9rIGVsc2UgKGtvbnRfcHVzaCAoKG1ha2VfYW5kX2ZyYW1lICgocmVzdCAocmVtYWluaW5nKSkpICgoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSkpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcIm9yXCIpXSkpIHRoZW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCBmYWxzZSkpIChlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpKSAoKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAocmVtYWluaW5nKSk7IChOdW1iZXIgMS4wKV0pKSB0aGVuIHJlc3RfayBlbHNlIChrb250X3B1c2ggKChtYWtlX29yX2ZyYW1lICgocmVzdCAocmVtYWluaW5nKSkpICgoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSkpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImNvbmRcIildKSkgdGhlbiAobGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gbGV0IHNjaGVtZV9wID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwic2NoZW1lXCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoc2NoZW1lX3ApIHRoZW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgobnRoICgoZmlyc3QgKHJlbWFpbmluZykpKSAoKE51bWJlciAxLjApKSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobGV0IG5leHRfY2xhdXNlcyA9IChyZXN0IChyZW1haW5pbmcpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAobmV4dF9jbGF1c2VzKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobGV0IG5leHRfY2xhdXNlID0gKGZpcnN0IChuZXh0X2NsYXVzZXMpKSBpbiBsZXQgbmV4dF90ZXN0ID0gKGZpcnN0IChuZXh0X2NsYXVzZSkpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAobmV4dF90ZXN0KSkpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgobnRoIChuZXh0X2NsYXVzZSkgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlIChuZXh0X3Rlc3QpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfY29uZF9mcmFtZSAobmV4dF9jbGF1c2VzKSAoZmVudikgKChCb29sIHRydWUpKSkpIChyZXN0X2spKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICh2YWx1ZSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChudGggKHJlbWFpbmluZykgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCBuZXh0ID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW3JlbWFpbmluZzsgKE51bWJlciAyLjApXSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIjxcIiBbKGxlbiAobmV4dCkpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChsZXQgbmV4dF90ZXN0ID0gKGZpcnN0IChuZXh0KSkgaW4gKGlmIHN4X3RydXRoeSAoKGlzX2Vsc2VfY2xhdXNlIChuZXh0X3Rlc3QpKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChudGggKG5leHQpICgoTnVtYmVyIDEuMCkpKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAobmV4dF90ZXN0KSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2NvbmRfZnJhbWUgKG5leHQpIChmZW52KSAoKEJvb2wgZmFsc2UpKSkpIChyZXN0X2spKSkpKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiY2FzZVwiKV0pKSB0aGVuIChsZXQgbWF0Y2hfdmFsID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibWF0Y2gtdmFsXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGlzX25pbCAobWF0Y2hfdmFsKSkpIHRoZW4gKHNmX2Nhc2Vfc3RlcF9sb29wICh2YWx1ZSkgKHJlbWFpbmluZykgKGZlbnYpIChyZXN0X2spKSBlbHNlIChzZl9jYXNlX3N0ZXBfbG9vcCAobWF0Y2hfdmFsKSAocmVtYWluaW5nKSAoZmVudikgKHJlc3RfaykpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInRocmVhZFwiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChsZXQgZm9ybSA9IChmaXJzdCAocmVtYWluaW5nKSkgaW4gbGV0IHJlc3RfZm9ybXMgPSAocmVzdCAocmVtYWluaW5nKSkgaW4gbGV0IG5ld19rb250ID0gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKChyZXN0IChyZW1haW5pbmcpKSkpKSB0aGVuIHJlc3RfayBlbHNlIChrb250X3B1c2ggKChtYWtlX3RocmVhZF9mcmFtZSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpIGluIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChmb3JtKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoZW1wdHlfcCAoZm9ybSkpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChmb3JtKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChob19mb3JtX25hbWVfcCAoKHN5bWJvbF9uYW1lICgoZmlyc3QgKGZvcm0pKSkpKSkpKSkpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgoY29ucyAoKGZpcnN0IChmb3JtKSkpICgoY29ucyAoKExpc3QgWyhTeW1ib2wgXCJxdW90ZVwiKTsgdmFsdWVdKSkgKChyZXN0IChmb3JtKSkpKSkpKSAoZmVudikgKG5ld19rb250KSkgZWxzZSAobGV0IHJlc3VsdCcgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoZm9ybSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSB0aGVuIChsZXQgZiA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGZvcm0pKSkgKGZlbnYpKSkpIGluIGxldCByYXJncyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGEgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGEpIChmZW52KSkpKSkgKHN4X3RvX2xpc3QgKHJlc3QgKGZvcm0pKSkpKSBpbiBsZXQgYWxsX2FyZ3MgPSAoY29ucyAodmFsdWUpIChyYXJncykpIGluIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChpc19jYWxsYWJsZSAoZikpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX2xhbWJkYSAoZikpKSkpKSkpIHRoZW4gKHN4X2FwcGx5IGYgYWxsX2FyZ3MpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGlzX2xhbWJkYSAoZikpKSB0aGVuICh0cmFtcG9saW5lICgoY2FsbF9sYW1iZGEgKGYpIChhbGxfYXJncykgKGZlbnYpKSkpIGVsc2UgKHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgKFN0cmluZyAoc3hfc3RyIFsoU3RyaW5nIFwiLT4gZm9ybSBub3QgY2FsbGFibGU6IFwiKTsgKGluc3BlY3QgKGYpKV0pKSkpKSkpKSBlbHNlIChsZXQgZiA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByIChmb3JtKSAoZmVudikpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2NhbGxhYmxlIChmKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfbGFtYmRhIChmKSkpKSkpKSkgdGhlbiAoY2VrX2NhbGwgKGYpIChMaXN0IFt2YWx1ZV0pKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19sYW1iZGEgKGYpKSkgdGhlbiAodHJhbXBvbGluZSAoKGNhbGxfbGFtYmRhIChmKSAoKExpc3QgW3ZhbHVlXSkpIChmZW52KSkpKSBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIi0+IGZvcm0gbm90IGNhbGxhYmxlOiBcIik7IChpbnNwZWN0IChmKSldKSkpKSkpKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZXN0X2Zvcm1zKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3RocmVhZF9mcmFtZSAocmVzdF9mb3JtcykgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImFyZ1wiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgZXZhbGVkID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZXZhbGVkXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gbGV0IHJhd19hcmdzID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmF3LWFyZ3NcIikpKSBpbiBsZXQgaG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJoZWFkLW5hbWVcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoaXNfbmlsIChmKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gIV9zdHJpY3RfcmVmIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIGhuYW1lKSkgdGhlbiAoc3RyaWN0X2NoZWNrX2FyZ3MgKGhuYW1lKSAoKExpc3QgW10pKSkgZWxzZSBOaWwpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKGNvbnRpbnVlX3dpdGhfY2FsbCAodmFsdWUpICgoTGlzdCBbXSkpIChmZW52KSAocmF3X2FyZ3MpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKHZhbHVlKSAoKExpc3QgW10pKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikgKHJhd19hcmdzKSAoaG5hbWUpKSkgKHJlc3RfaykpKSkpKSBlbHNlIChsZXQgbmV3X2V2YWxlZCA9IChwcmltX2NhbGwgXCJhcHBlbmRcIiBbZXZhbGVkOyAoTGlzdCBbdmFsdWVdKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAhX3N0cmljdF9yZWYgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgaG5hbWUpKSB0aGVuIChzdHJpY3RfY2hlY2tfYXJncyAoaG5hbWUpIChuZXdfZXZhbGVkKSkgZWxzZSBOaWwpKSBpbiAoY29udGludWVfd2l0aF9jYWxsIChmKSAobmV3X2V2YWxlZCkgKGZlbnYpIChyYXdfYXJncykgKHJlc3RfaykpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKGYpIChuZXdfZXZhbGVkKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikgKHJhd19hcmdzKSAoaG5hbWUpKSkgKHJlc3RfaykpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkaWN0XCIpXSkpIHRoZW4gKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgcmVzdWx0cyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlc3VsdHNcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChsZXQgbGFzdF9yZXN1bHQgPSAobGFzdCAocmVzdWx0cykpIGluIGxldCBjb21wbGV0ZWQgPSAocHJpbV9jYWxsIFwiYXBwZW5kXCIgWyhwcmltX2NhbGwgXCJzbGljZVwiIFtyZXN1bHRzOyAoTnVtYmVyIDAuMCk7IChwcmltX2NhbGwgXCJkZWNcIiBbKGxlbiAocmVzdWx0cykpXSldKTsgKExpc3QgWyhMaXN0IFsoZmlyc3QgKGxhc3RfcmVzdWx0KSk7IHZhbHVlXSldKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0IGQgPSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBwYWlyIC0+IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2IgZCAoZmlyc3QgKHBhaXIpKSAobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSkpKSkgKHN4X3RvX2xpc3QgY29tcGxldGVkKTsgTmlsKSkgaW4gKG1ha2VfY2VrX3ZhbHVlIChkKSAoZmVudikgKHJlc3RfaykpKSkgZWxzZSAobGV0IG5leHRfZW50cnkgPSAoZmlyc3QgKHJlbWFpbmluZykpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAobmV4dF9lbnRyeSkgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2RpY3RfZnJhbWUgKChyZXN0IChyZW1haW5pbmcpKSkgKChwcmltX2NhbGwgXCJhcHBlbmRcIiBbY29tcGxldGVkOyAoTGlzdCBbKExpc3QgWyhmaXJzdCAobmV4dF9lbnRyeSkpXSldKV0pKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImhvLXNldHVwXCIpXSkpIHRoZW4gKGxldCBob190eXBlID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiaG8tdHlwZVwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZXZhbGVkID0gKHByaW1fY2FsbCBcImFwcGVuZFwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJldmFsZWRcIikpKTsgKExpc3QgW3ZhbHVlXSldKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAoaG9fc2V0dXBfZGlzcGF0Y2ggKGhvX3R5cGUpIChldmFsZWQpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKGhvX3R5cGUpICgocmVzdCAocmVtYWluaW5nKSkpIChldmFsZWQpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInJlc2V0XCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkZXJlZlwiKV0pKSB0aGVuIChsZXQgdmFsJyA9IHZhbHVlIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfc2lnbmFsICh2YWwnKSkpKSkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAodmFsJykgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChoYXNfcmVhY3RpdmVfcmVzZXRfZnJhbWVfcCAocmVzdF9rKSkpIHRoZW4gKHJlYWN0aXZlX3NoaWZ0X2RlcmVmICh2YWwnKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCAoKSA9IGlnbm9yZSAoKGxldCBjdHggPSAoc3hfY29udGV4dCAoKFN0cmluZyBcInN4LXJlYWN0aXZlXCIpKSAoTmlsKSkgaW4gKGlmIHN4X3RydXRoeSAoY3R4KSB0aGVuIChsZXQgZGVwX2xpc3QgPSByZWYgKChnZXQgKGN0eCkgKChTdHJpbmcgXCJkZXBzXCIpKSkpIGluIGxldCBub3RpZnlfZm4gPSAoZ2V0IChjdHgpICgoU3RyaW5nIFwibm90aWZ5XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiY29udGFpbnM/XCIgWyFkZXBfbGlzdDsgdmFsJ10pKSkpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoZGVwX2xpc3QgOj0gc3hfYXBwZW5kX2IgIWRlcF9saXN0IHZhbCc7IE5pbCkpIGluIChzaWduYWxfYWRkX3N1Yl9iICh2YWwnKSAobm90aWZ5X2ZuKSkpIGVsc2UgTmlsKSkgZWxzZSBOaWwpKSkgaW4gKG1ha2VfY2VrX3ZhbHVlICgoc2lnbmFsX3ZhbHVlICh2YWwnKSkpIChmZW52KSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChsZXQgdXBkYXRlX2ZuID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidXBkYXRlLWZuXCIpKSkgaW4gbGV0IGZpcnN0X3AgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmaXJzdC1yZW5kZXJcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSB1cGRhdGVfZm4gaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5IChmaXJzdF9wKSkpKSkpIHRoZW4gKGNla19jYWxsICh1cGRhdGVfZm4pICgoTGlzdCBbdmFsdWVdKSkpIGVsc2UgTmlsKSkgaW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNjb3BlXCIpXSkpIHRoZW4gKGxldCBuYW1lID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibmFtZVwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsdWUpIChmZW52KSAocmVzdF9rKSkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3Njb3BlX2ZyYW1lIChuYW1lKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJwcm92aWRlXCIpXSkpIHRoZW4gKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3Byb3ZpZGVfZnJhbWUgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcIm5hbWVcIikpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInZhbHVlXCIpKSkpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNjb3BlLWFjY1wiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobGV0IG5ld19mcmFtZSA9IChtYWtlX3Njb3BlX2FjY19mcmFtZSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibmFtZVwiKSkpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidmFsdWVcIikpKSkgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc3hfZGljdF9zZXRfYiBuZXdfZnJhbWUgKFN0cmluZyBcImVtaXR0ZWRcIikgKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW1pdHRlZFwiKSkpKSkgaW4gbmV3X2ZyYW1lKSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcIm1hcFwiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IHJlc3VsdHMgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZXN1bHRzXCIpKSkgaW4gbGV0IGluZGV4ZWQgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJpbmRleGVkXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0IG5ld19yZXN1bHRzID0gKHByaW1fY2FsbCBcImFwcGVuZFwiIFtyZXN1bHRzOyAoTGlzdCBbdmFsdWVdKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKG5ld19yZXN1bHRzKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCBjYWxsX2FyZ3MgPSAoaWYgc3hfdHJ1dGh5IChpbmRleGVkKSB0aGVuIChMaXN0IFsobGVuIChuZXdfcmVzdWx0cykpOyAoZmlyc3QgKHJlbWFpbmluZykpXSkgZWxzZSAoTGlzdCBbKGZpcnN0IChyZW1haW5pbmcpKV0pKSBpbiBsZXQgbmV4dF9mcmFtZSA9IChpZiBzeF90cnV0aHkgKGluZGV4ZWQpIHRoZW4gKG1ha2VfbWFwX2luZGV4ZWRfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChuZXdfcmVzdWx0cykgKGZlbnYpKSBlbHNlIChtYWtlX21hcF9mcmFtZSAoZikgKChyZXN0IChyZW1haW5pbmcpKSkgKG5ld19yZXN1bHRzKSAoZmVudikpKSBpbiAoY29udGludWVfd2l0aF9jYWxsIChmKSAoY2FsbF9hcmdzKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKG5leHRfZnJhbWUpIChyZXN0X2spKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiZmlsdGVyXCIpXSkpIHRoZW4gKGxldCBmID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZlwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgcmVzdWx0cyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlc3VsdHNcIikpKSBpbiBsZXQgY3VycmVudF9pdGVtID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiY3VycmVudC1pdGVtXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0IG5ld19yZXN1bHRzID0gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKHByaW1fY2FsbCBcImFwcGVuZFwiIFtyZXN1bHRzOyAoTGlzdCBbY3VycmVudF9pdGVtXSldKSBlbHNlIHJlc3VsdHMpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKG5ld19yZXN1bHRzKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZmlsdGVyX2ZyYW1lIChmKSAoKHJlc3QgKHJlbWFpbmluZykpKSAobmV3X3Jlc3VsdHMpICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKGxldCBmID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZlwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFt2YWx1ZTsgKGZpcnN0IChyZW1haW5pbmcpKV0pKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX3JlZHVjZV9mcmFtZSAoZikgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiZm9yLWVhY2hcIildKSkgdGhlbiAobGV0IGYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKHJlbWFpbmluZykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZm9yX2VhY2hfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNvbWVcIildKSkgdGhlbiAobGV0IGYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChjb250aW51ZV93aXRoX2NhbGwgKGYpICgoTGlzdCBbKGZpcnN0IChyZW1haW5pbmcpKV0pKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX3NvbWVfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJldmVyeVwiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKHZhbHVlKSkpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIHRydWUpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZXZlcnlfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkpIGVsc2UgKHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgKFN0cmluZyAoc3hfc3RyIFsoU3RyaW5nIFwiVW5rbm93biBmcmFtZSB0eXBlOiBcIik7IGZ0XSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSlcblxuKCogY29udGludWUtd2l0aC1jYWxsICopXG5hbmQgY29udGludWVfd2l0aF9jYWxsIGYgYXJncyBlbnYgcmF3X2FyZ3Mga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChjb250aW51YXRpb25fcCAoZikpKSB0aGVuIChsZXQgYXJnID0gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiBOaWwgZWxzZSAoZmlyc3QgKGFyZ3MpKSkgaW4gbGV0IGNvbnRfZGF0YSA9IChjb250aW51YXRpb25fZGF0YSAoZikpIGluIChsZXQgY2FwdHVyZWQgPSAoZ2V0IChjb250X2RhdGEpICgoU3RyaW5nIFwiY2FwdHVyZWRcIikpKSBpbiAobGV0IHJlc3VsdCcgPSAoY2VrX3J1biAoKG1ha2VfY2VrX3ZhbHVlIChhcmcpIChlbnYpIChjYXB0dXJlZCkpKSkgaW4gKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZW52KSAoa29udCkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2NhbGxhYmxlIChmKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfbGFtYmRhIChmKSkpKSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX2NvbXBvbmVudCAoZikpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoQm9vbCAobm90IChzeF90cnV0aHkgKChpc19pc2xhbmQgKGYpKSkpKSkpKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc3hfYXBwbHkgZiBhcmdzKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19sYW1iZGEgKGYpKSkgdGhlbiAobGV0IGxvY2FsID0gKGVudl9tZXJnZSAoKGxhbWJkYV9jbG9zdXJlIChmKSkpIChlbnYpKSBpbiBsZXQgKCkgPSBiaW5kX2xhbWJkYV9wYXJhbXMgZiBhcmdzIGxvY2FsIGluIChtYXRjaCAhaml0X2NhbGxfaG9vaywgZiB3aXRoIHwgU29tZSBob29rLCBMYW1iZGEgbCB3aGVuIGwubF9uYW1lIDw+IE5vbmUgLT4gbGV0IGFyZ3NfbGlzdCA9IG1hdGNoIGFyZ3Mgd2l0aCBMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0gLT4gYSB8IF8gLT4gW10gaW4gKG1hdGNoIGhvb2sgZiBhcmdzX2xpc3Qgd2l0aCBTb21lIHJlc3VsdCAtPiBtYWtlX2Nla192YWx1ZSByZXN1bHQgbG9jYWwga29udCB8IE5vbmUgLT4gbWFrZV9jZWtfc3RhdGUgKGxhbWJkYV9ib2R5IGYpIGxvY2FsIGtvbnQpIHwgXyAtPiBtYWtlX2Nla19zdGF0ZSAoKGxhbWJkYV9ib2R5IChmKSkpIChsb2NhbCkgKGtvbnQpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9vciA9IChpc19jb21wb25lbnQgKGYpKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGlzX2lzbGFuZCAoZikpKSkgdGhlbiAobGV0IHBhcnNlZCA9IChwYXJzZV9rZXl3b3JkX2FyZ3MgKHJhd19hcmdzKSAoZW52KSkgaW4gbGV0IGt3YXJncyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IGNoaWxkcmVuID0gKG50aCAocGFyc2VkKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IGxvY2FsID0gKGVudl9tZXJnZSAoKGNvbXBvbmVudF9jbG9zdXJlIChmKSkpIChlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKChlbnZfYmluZCBsb2NhbCAoc3hfdG9fc3RyaW5nIHApIChsZXQgX29yID0gKGRpY3RfZ2V0IChrd2FyZ3MpIChwKSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKGNvbXBvbmVudF9wYXJhbXMgKGYpKSk7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChjb21wb25lbnRfaGFzX2NoaWxkcmVuIChmKSkpIHRoZW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgKFN0cmluZyBcImNoaWxkcmVuXCIpKSBjaGlsZHJlbikgZWxzZSBOaWwpKSBpbiAobWFrZV9jZWtfc3RhdGUgKChjb21wb25lbnRfYm9keSAoZikpKSAobG9jYWwpIChrb250KSkpKSkgZWxzZSAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIChzeF9zdHIgWyhTdHJpbmcgXCJOb3QgY2FsbGFibGU6IFwiKTsgKGluc3BlY3QgKGYpKV0pKSkpKSkpKSlcblxuKCogc2YtY2FzZS1zdGVwLWxvb3AgKilcbmFuZCBzZl9jYXNlX3N0ZXBfbG9vcCBtYXRjaF92YWwgY2xhdXNlcyBlbnYga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI8XCIgWyhsZW4gKGNsYXVzZXMpKTsgKE51bWJlciAyLjApXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobGV0IHRlc3QgPSAoZmlyc3QgKGNsYXVzZXMpKSBpbiBsZXQgYm9keSA9IChudGggKGNsYXVzZXMpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoaXNfZWxzZV9jbGF1c2UgKHRlc3QpKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKGJvZHkpIChlbnYpIChrb250KSkgZWxzZSAobGV0IHRlc3RfdmFsID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKHRlc3QpIChlbnYpKSkpIGluIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW21hdGNoX3ZhbDsgdGVzdF92YWxdKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKGJvZHkpIChlbnYpIChrb250KSkgZWxzZSAoc2ZfY2FzZV9zdGVwX2xvb3AgKG1hdGNoX3ZhbCkgKChwcmltX2NhbGwgXCJzbGljZVwiIFtjbGF1c2VzOyAoTnVtYmVyIDIuMCldKSkgKGVudikgKGtvbnQpKSkpKSkpXG5cbigqIGV2YWwtZXhwci1jZWsgKilcbmFuZCBldmFsX2V4cHJfY2VrIGV4cHIgZW52ID1cbiAgKGNla19ydW4gKChtYWtlX2Nla19zdGF0ZSAoZXhwcikgKGVudikgKChMaXN0IFtdKSkpKSlcblxuKCogdHJhbXBvbGluZS1jZWsgKilcbmFuZCB0cmFtcG9saW5lX2NlayB2YWwnID1cbiAgKGlmIHN4X3RydXRoeSAoKGlzX3RodW5rICh2YWwnKSkpIHRoZW4gKGV2YWxfZXhwcl9jZWsgKCh0aHVua19leHByICh2YWwnKSkpICgodGh1bmtfZW52ICh2YWwnKSkpKSBlbHNlIHZhbCcpXG5cbigqIGV2YWwtZXhwciAqKVxuYW5kIGV2YWxfZXhwciBleHByIGVudiA9XG4gIChjZWtfcnVuICgobWFrZV9jZWtfc3RhdGUgKGV4cHIpIChlbnYpICgoTGlzdCBbXSkpKSkpXG5cblxuKCogV2lyZSB1cCB0cmFtcG9saW5lIHRvIHJlc29sdmUgdGh1bmtzIHZpYSB0aGUgQ0VLIG1hY2hpbmUgKilcbmxldCAoKSA9IHRyYW1wb2xpbmVfZm4gOj0gKGZ1biB2IC0+XG4gIG1hdGNoIHYgd2l0aFxuICB8IFRodW5rIChleHByLCBlbnYpIC0+IGV2YWxfZXhwciBleHByIChFbnYgZW52KVxuICB8IF8gLT4gdilcblxuKCogV2lyZSB1cCB0aGUgcHJpbWl0aXZlcyB0cmFtcG9saW5lIHNvIGNhbGxfYW55IGluIEhPIGZvcm1zIHJlc29sdmVzIFRodW5rcyAqKVxubGV0ICgpID0gU3hfcHJpbWl0aXZlcy5fc3hfdHJhbXBvbGluZV9mbiA6PSAhdHJhbXBvbGluZV9mblxuXG4oKiBXaXJlIHVwIGFzX251bWJlciB0cmFtcG9saW5lIHNvIGFyaXRobWV0aWMgb24gbGVha2VkIHRodW5rcyBhdXRvLXJlc29sdmVzICopXG5sZXQgKCkgPSBTeF9wcmltaXRpdmVzLnRyYW1wb2xpbmVfaG9vayA6PSAhdHJhbXBvbGluZV9mblxuXG4oKiBPdmVycmlkZSByZWN1cnNpdmUgY2VrX3J1biB3aXRoIGl0ZXJhdGl2ZSBsb29wICopXG5sZXQgY2VrX3J1bl9pdGVyYXRpdmUgc3RhdGUgPVxuICBsZXQgcyA9IHJlZiBzdGF0ZSBpblxuICB3aGlsZSBub3QgKG1hdGNoIGNla190ZXJtaW5hbF9wICFzIHdpdGggQm9vbCB0cnVlIC0+IHRydWUgfCBfIC0+IGZhbHNlKSBkb1xuICAgIHMgOj0gY2VrX3N0ZXAgIXNcbiAgZG9uZTtcbiAgY2VrX3ZhbHVlICFzXG5cblxuXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZXF1YWwiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTeF9ydW50aW1lIiwiU3hfdHlwZXMiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYl9IYXNodGJsIiwiU3hfcHJpbWl0aXZlcyIsInRyYW1wb2xpbmVfZm4iLCJ2IiwidHJhbXBvbGluZSIsInN0cmljdF9yZWYiLCJzdHJpY3QiLCJwcmltX3BhcmFtX3R5cGVzX3JlZiIsInByaW1fcGFyYW1fdHlwZXMiLCJjc3RfZXZhbCIsIm1ha2VfY2VrX3N0YXRlIiwiY29udHJvbCIsImVudiIsImtvbnQiLCJjc3RfY29udGludWUiLCJtYWtlX2Nla192YWx1ZSIsInZhbHVlIiwiY3N0IiwiY3N0X2tvbnQiLCJjc3RfcGhhc2UiLCJjZWtfdGVybWluYWxfcCIsInN0YXRlIiwiYW5kIiwiY2VrX2NvbnRyb2wiLCJzIiwiY3N0X2VudiIsImNla19lbnYiLCJjZWtfa29udCIsImNla19waGFzZSIsImNzdF92YWx1ZSIsImNla192YWx1ZSIsImNzdF9pZiIsIm1ha2VfaWZfZnJhbWUiLCJ0aGVuX2V4cHIiLCJlbHNlX2V4cHIiLCJjc3Rfd2hlbiIsIm1ha2Vfd2hlbl9mcmFtZSIsImJvZHlfZXhwcnMiLCJjc3RfYmVnaW4iLCJtYWtlX2JlZ2luX2ZyYW1lIiwicmVtYWluaW5nIiwiY3N0X2xldCIsIm1ha2VfbGV0X2ZyYW1lIiwibmFtZSIsImJvZHkiLCJsb2NhbCIsImNzdF9kZWZpbmUiLCJtYWtlX2RlZmluZV9mcmFtZSIsImhhc19lZmZlY3RzIiwiZWZmZWN0X2xpc3QiLCJjc3Rfc2V0IiwibWFrZV9zZXRfZnJhbWUiLCJjc3RfYXJnIiwibWFrZV9hcmdfZnJhbWUiLCJldmFsZWQiLCJyYXdfYXJncyIsImhlYWRfbmFtZSIsIm1ha2VfY2FsbF9mcmFtZSIsImFyZ3MiLCJjc3RfY29uZCIsIm1ha2VfY29uZF9mcmFtZSIsInNjaGVtZV9wIiwiY3N0X2Nhc2UiLCJtYWtlX2Nhc2VfZnJhbWUiLCJtYXRjaF92YWwiLCJjc3RfdGhyZWFkIiwibWFrZV90aHJlYWRfZnJhbWUiLCJjc3RfbWFwIiwibWFrZV9tYXBfZnJhbWUiLCJyZXN1bHRzIiwibWFrZV9tYXBfaW5kZXhlZF9mcmFtZSIsImNzdF9maWx0ZXIiLCJtYWtlX2ZpbHRlcl9mcmFtZSIsImN1cnJlbnRfaXRlbSIsImNzdF9yZWR1Y2UiLCJtYWtlX3JlZHVjZV9mcmFtZSIsImNzdF9mb3JfZWFjaCIsIm1ha2VfZm9yX2VhY2hfZnJhbWUiLCJjc3Rfc29tZSIsIm1ha2Vfc29tZV9mcmFtZSIsImNzdF9ldmVyeSIsIm1ha2VfZXZlcnlfZnJhbWUiLCJjc3Rfc2NvcGUiLCJtYWtlX3Njb3BlX2ZyYW1lIiwiY3N0X3Byb3ZpZGUiLCJtYWtlX3Byb3ZpZGVfZnJhbWUiLCJjc3Rfc2NvcGVfYWNjIiwibWFrZV9zY29wZV9hY2NfZnJhbWUiLCJjc3RfcmVzZXQiLCJtYWtlX3Jlc2V0X2ZyYW1lIiwiY3N0X2RpY3QiLCJtYWtlX2RpY3RfZnJhbWUiLCJjc3RfYW5kIiwibWFrZV9hbmRfZnJhbWUiLCJjc3Rfb3IiLCJtYWtlX29yX2ZyYW1lIiwiY3N0X2R5bmFtaWNfd2luZCIsIm1ha2VfZHluYW1pY193aW5kX2ZyYW1lIiwicGhhc2UiLCJib2R5X3RodW5rIiwiYWZ0ZXJfdGh1bmsiLCJjc3RfcmVhY3RpdmVfcmVzZXQiLCJtYWtlX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lIiwidXBkYXRlX2ZuIiwiZmlyc3RfcmVuZGVyX3AiLCJjc3RfZGVyZWYiLCJtYWtlX2RlcmVmX2ZyYW1lIiwiY3N0X2hvX3NldHVwIiwibWFrZV9ob19zZXR1cF9mcmFtZSIsImhvX3R5cGUiLCJyZW1haW5pbmdfYXJncyIsImV2YWxlZF9hcmdzIiwiZnJhbWVfdHlwZSIsImtvbnRfcHVzaCIsImZyYW1lIiwia29udF90b3AiLCJrb250X3BvcCIsImtvbnRfZW1wdHlfcCIsImNzdF9hcHBlbmQiLCJjYXB0dXJlZCIsImtvbnRfY2FwdHVyZV90b19yZXNldCIsImsiLCJvciIsImNzdF9uYW1lIiwia29udF9maW5kX3Byb3ZpZGUiLCJrb250X2ZpbmRfc2NvcGVfYWNjIiwiaGFzX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lX3AiLCJrb250X2NhcHR1cmVfdG9fcmVhY3RpdmVfcmVzZXQiLCJjdXN0b21fc3BlY2lhbF9mb3JtcyIsInJlZ2lzdGVyX3NwZWNpYWxfZm9ybSIsImhhbmRsZXIiLCJzZXRfc3RyaWN0X2IiLCJ2YWwiLCJzZXRfcHJpbV9wYXJhbV90eXBlc19iIiwidHlwZXMiLCJjc3RfYm9vbGVhbiIsImNzdF9rZXl3b3JkIiwiY3N0X2xhbWJkYSIsImNzdF9saXN0IiwiY3N0X25pbCIsImNzdF9udW1iZXIiLCJjc3Rfc2xpY2UiLCJjc3Rfc3RyaW5nIiwiY3N0X3N5bWJvbCIsInZhbHVlX21hdGNoZXNfdHlwZV9wIiwiZXhwZWN0ZWRfdHlwZSIsImNzdF9leHBlY3RlZCIsImNzdF9nb3QiLCJjc3RfVHlwZV9lcnJvciIsInN0cmljdF9jaGVja19hcmdzIiwic3BlYyIsInBvc2l0aW9uYWwiLCJyZXN0X3R5cGUiLCJpIiwicCIsInBhaXIiLCJpZHgiLCJwYXJhbSIsInBfbmFtZSIsInBfdHlwZSIsImNzdF9yZXN0IiwiY3N0X3ppcCIsImJpbmRfbGFtYmRhX3BhcmFtcyIsInBhcmFtcyIsInBhcmFtX2xpc3QiLCJhcmdzX2xpc3QiLCJyZXN0X2lkeCIsInJlcXVpcmVkIiwibWF0Y2giLCJyZXN0X25hbWUiLCJyZXN0X3ZhbHMiLCJjYWxsX2xhbWJkYSIsImNhbGxlcl9lbnYiLCJjc3RfY2hpbGRyZW4iLCJjYWxsX2NvbXBvbmVudCIsImNvbXAiLCJwYXJzZWQiLCJrd2FyZ3MiLCJjaGlsZHJlbiIsImNzdF9hc3NvYyIsImNzdF9pIiwiY3N0X2luYyIsImNzdF9za2lwIiwicGFyc2Vfa2V5d29yZF9hcmdzIiwiZCIsImFyZyIsInNraXAiLCJjb25kX3NjaGVtZV9wIiwiY2xhdXNlcyIsImMiLCJjc3RfZWxzZSIsImlzX2Vsc2VfY2xhdXNlIiwidGVzdCIsImNzdF9yYW5nZSIsInNmX25hbWVkX2xldCIsImxvb3BfbmFtZSIsImJpbmRpbmdzIiwiaW5pdHMiLCJiaW5kaW5nIiwiYWNjIiwicGFpcl9pZHgiLCJsb29wX2JvZHkiLCJsb29wX2ZuIiwiaW5pdF92YWxzIiwiZSIsImNzdF9hcyIsInNmX2xhbWJkYSIsInBhcmFtc19leHByIiwicGFyYW1fbmFtZXMiLCJjc3RfZWZmZWN0X2Fubm90YXRpb25zIiwiY3N0X2VmZmVjdHMiLCJjc3Rfa2V5cyIsInNmX2RlZmNvbXAiLCJuYW1lX3N5bSIsInBhcmFtc19yYXciLCJjb21wX25hbWUiLCJoYXNfY2hpbGRyZW4iLCJwYXJhbV90eXBlcyIsImFmZmluaXR5IiwiZWZmZWN0cyIsImVmZmVjdF9hbm5zIiwiZGVmY29tcF9rd2FyZyIsImtleSIsImRlZmF1bHQkIiwiZW5kIiwicmVzdWx0IiwicGFyc2VfY29tcF9wYXJhbXMiLCJpbl9rZXkiLCJwdHlwZSIsInR5cGVfdmFsIiwic2ZfZGVmaXNsYW5kIiwiaXNsYW5kIiwic2ZfZGVmbWFjcm8iLCJyZXN0X3BhcmFtIiwibWFjIiwiY3N0X2luX3Jlc3QiLCJwYXJzZV9tYWNyb19wYXJhbXMiLCJjc3RfY29uY2F0IiwicXFfZXhwYW5kIiwidGVtcGxhdGUiLCJoZWFkIiwiaXRlbSIsInNwbGljZWQiLCJjc3RfZGVjIiwic2ZfbGV0cmVjIiwibmFtZXMiLCJ2YWxfZXhwcnMiLCJ2bmFtZSIsInZhbF9leHByIiwidmFsdWVzIiwibiIsInN0ZXBfc2ZfbGV0cmVjIiwidGhrIiwic2ZfZHluYW1pY193aW5kIiwiYmVmb3JlIiwiYWZ0ZXIiLCJzZl9zY29wZSIsInJlc3QiLCJzZl9wcm92aWRlIiwiZXhwYW5kX21hY3JvIiwiY2VrX3J1biIsImNla19zdGVwIiwic3RlcF9ldmFsIiwiZXhwciIsImtzIiwiZmlyc3Rfa2V5IiwicmVtYWluaW5nX2VudHJpZXMiLCJjc3RfZW1pdHRlZCIsImNzdF9tYXBfaW5kZXhlZCIsImNzdF9xdW90ZSIsInJlbmRlcl9jaGVjayIsInJlbmRlcl9mbiIsInN0ZXBfZXZhbF9saXN0Iiwic3RlcF9zZl9pZiIsInN0ZXBfc2Zfd2hlbiIsInN0ZXBfc2ZfYmVnaW4iLCJzdGVwX3NmX2xldCIsImZpcnN0X2JpbmRpbmciLCJyZXN0X2JpbmRpbmdzIiwicGFpcnMiLCJzdGVwX3NmX2RlZmluZSIsInZhbF9pZHgiLCJzdGVwX3NmX3NldF9iIiwic3RlcF9zZl9hbmQiLCJzdGVwX3NmX29yIiwic3RlcF9zZl9jb25kIiwiY2xhdXNlIiwic3RlcF9zZl9jYXNlIiwic3RlcF9zZl90aHJlYWRfZmlyc3QiLCJzdGVwX3NmX2xhbWJkYSIsInN0ZXBfc2Zfc2NvcGUiLCJyZXN0X2FyZ3MiLCJzdGVwX3NmX3Byb3ZpZGUiLCJzdGVwX3NmX2NvbnRleHQiLCJkZWZhdWx0X3ZhbCIsInN0ZXBfc2ZfZW1pdCIsInN0ZXBfc2ZfZW1pdHRlZCIsInN0ZXBfc2ZfcmVzZXQiLCJzdGVwX3NmX3NoaWZ0Iiwia19uYW1lIiwiY2FwdHVyZWRfcmVzdWx0IiwicmVzdF9rb250Iiwic2hpZnRfZW52Iiwic3RlcF9zZl9kZXJlZiIsImNla19jYWxsIiwiYSIsImNzdF91cGRhdGVfZm4iLCJyZWFjdGl2ZV9zaGlmdF9kZXJlZiIsInNpZyIsInNjYW5fcmVzdWx0IiwiY2FwdHVyZWRfZnJhbWVzIiwicmVzZXRfZnJhbWUiLCJyZW1haW5pbmdfa29udCIsInN1YnNjcmliZXIiLCJuZXdfcmVzZXQiLCJuZXdfa29udCIsImluaXRpYWxfa29udCIsInN0ZXBfZXZhbF9jYWxsIiwiaG5hbWUiLCJob19mb3JtX25hbWVfcCIsImhvX2ZuX3AiLCJob19zd2FwX2FyZ3MiLCJiIiwiaG9fc2V0dXBfZGlzcGF0Y2giLCJvcmRlcmVkIiwiY29sbCIsImluaXQiLCJzdGVwX2hvX21hcCIsInN0ZXBfaG9fbWFwX2luZGV4ZWQiLCJzdGVwX2hvX2ZpbHRlciIsInN0ZXBfaG9fcmVkdWNlIiwic3RlcF9ob19zb21lIiwic3RlcF9ob19ldmVyeSIsInN0ZXBfaG9fZm9yX2VhY2giLCJjc3RfZm9ybV9ub3RfY2FsbGFibGUiLCJjc3RfYm9keSIsImNzdF9ldmFsZWQiLCJjc3RfZiIsImNzdF9yZW1haW5pbmciLCJjc3RfcmVzdWx0cyIsInN0ZXBfY29udGludWUiLCJyZXN0X2siLCJmdCIsImZlbnYiLCJuZXh0X2JpbmRpbmciLCJlZmZlY3RfbmFtZXMiLCJuZXh0IiwibmV4dF90ZXN0IiwibmV4dF9jbGF1c2VzIiwibmV4dF9jbGF1c2UiLCJmb3JtIiwicmVzdF9mb3JtcyIsInJhcmdzIiwiYWxsX2FyZ3MiLCJuZXdfZXZhbGVkIiwibGFzdF9yZXN1bHQiLCJjb21wbGV0ZWQiLCJuZXh0X2VudHJ5IiwiY3R4IiwiZGVwX2xpc3QiLCJub3RpZnlfZm4iLCJmaXJzdF9wIiwibmV3X2ZyYW1lIiwiaW5kZXhlZCIsIm5ld19yZXN1bHRzIiwiY2FsbF9hcmdzIiwibmV4dF9mcmFtZSIsImppdF9jYWxsX2hvb2siLCJjb250aW51ZV93aXRoX2NhbGwiLCJjb250X2RhdGEiLCJsIiwiaG9vayIsInNmX2Nhc2Vfc3RlcF9sb29wIiwidGVzdF92YWwiLCJldmFsX2V4cHJfY2VrIiwidHJhbXBvbGluZV9jZWsiLCJldmFsX2V4cHIiLCJjZWtfcnVuX2l0ZXJhdGl2ZSJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQSxhQUFBQyxHQ1N5RCxTQUFDO0FBQUEsWUFBQUMsV0FBQUQsR0FDdkMsc0NBQWdCO0FBQUE7QUFBQSxJQUFBRSxhRFZuQztBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLFlBQUFDLGVBQUFDLFNBQUFDLEtBQUFDO0FBQUFBLElDK0JFO0FBQUEsR0FBb0c7QUFBQSxPQUFBQyxlRC9CdEc7QUFBQSxZQUFBQyxlQUFBQyxPQUFBSixLQUFBQztBQUFBQSxJQ21DRTtBQUFBLEdBQXNHO0FBQUE7QUFBQSxJQUFBSSxNRG5DeEc7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLGVBQUFD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QUFZLHdCQUE0QztBQUFBO0FBQUEsSUFBL0UsT0FBZ0IsZUFBaEIsd0NBQTRIO0FBQUE7QUFBQTtBQUFBLElBQUFpVSx3QkQzZ0I5STtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUQzTjFCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzM3NjQsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4Lm9ianMvanNvby9kZWZhdWx0L3N4LmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvd29ya3NwYWNlX3Jvb3QvbGliL3N4X3Njb3BlLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIFNjb3BlIHN0YWNrcyDigJQgZHluYW1pYyBzY29wZSBmb3IgcmVuZGVyLXRpbWUgZWZmZWN0cy5cblxuICAgIFByb3ZpZGVzIHNjb3BlLXB1c2ghL3BvcCEvcGVlaywgY29sbGVjdCEvY29sbGVjdGVkL2NsZWFyLWNvbGxlY3RlZCEsXG4gICAgc2NvcGUtZW1pdCEvZW1pdHRlZC9zY29wZS1lbWl0dGVkLCBjb250ZXh0LCBhbmQgY29va2llIGFjY2Vzcy5cblxuICAgIEFsbCBmdW5jdGlvbnMgYXJlIHJlZ2lzdGVyZWQgYXMgcHJpbWl0aXZlcyBzbyBib3RoIHRoZSBDRUsgZXZhbHVhdG9yXG4gICAgYW5kIHRoZSBKSVQgVk0gY2FuIGZpbmQgdGhlbSBpbiB0aGUgc2FtZSBwbGFjZS4gKilcblxub3BlbiBTeF90eXBlc1xuXG4oKiogVGhlIHNoYXJlZCBzY29wZSBzdGFja3MgaGFzaHRhYmxlLiBFYWNoIGtleSBtYXBzIHRvIGEgc3RhY2sgb2YgdmFsdWVzLlxuICAgIFVzZWQgYnkgYXNlciBmb3Igc3ByZWFkL3Byb3ZpZGUvZW1pdCBwYXR0ZXJucywgQ1NTWCBjb2xsZWN0L2ZsdXNoLCBldGMuICopXG5sZXQgc2NvcGVfc3RhY2tzIDogKHN0cmluZywgdmFsdWUgbGlzdCkgSGFzaHRibC50ID0gSGFzaHRibC5jcmVhdGUgOFxuXG4oKiogUmVxdWVzdCBjb29raWVzIOKAlCBzZXQgYnkgdGhlIFB5dGhvbiBicmlkZ2UgYmVmb3JlIGVhY2ggcmVuZGVyLlxuICAgIGdldC1jb29raWUgcmVhZHMgZnJvbSBoZXJlOyBzZXQtY29va2llIGlzIGEgbm8tb3Agb24gdGhlIHNlcnZlci4gKilcbmxldCByZXF1ZXN0X2Nvb2tpZXMgOiAoc3RyaW5nLCBzdHJpbmcpIEhhc2h0YmwudCA9IEhhc2h0YmwuY3JlYXRlIDhcblxuKCoqIENsZWFyIGFsbCBzY29wZSBzdGFja3MuIENhbGxlZCBiZXR3ZWVuIHJlcXVlc3RzIGlmIG5lZWRlZC4gKilcbmxldCBjbGVhcl9hbGwgKCkgPSBIYXNodGJsLmNsZWFyIHNjb3BlX3N0YWNrc1xuXG5sZXQgKCkgPVxuICBsZXQgcmVnaXN0ZXIgPSBTeF9wcmltaXRpdmVzLnJlZ2lzdGVyIGluXG5cbiAgKCogLS0tIENvb2tpZXMgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJnZXQtY29va2llXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIC0+XG4gICAgICAobWF0Y2ggSGFzaHRibC5maW5kX29wdCByZXF1ZXN0X2Nvb2tpZXMgbmFtZSB3aXRoXG4gICAgICAgfCBTb21lIHYgLT4gU3RyaW5nIHZcbiAgICAgICB8IE5vbmUgLT4gTmlsKVxuICAgIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwic2V0LWNvb2tpZVwiIChmdW4gX2FyZ3MgLT4gTmlsKTtcblxuICAoKiAtLS0gQ29yZSBzY29wZSBzdGFjayBvcGVyYXRpb25zIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwic2NvcGUtcHVzaCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZTsgdmFsdWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKHZhbHVlIDo6IHN0YWNrKTsgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1wb3AhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICAobWF0Y2ggc3RhY2sgd2l0aCBfIDo6IHJlc3QgLT4gSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIHJlc3QgfCBbXSAtPiAoKSk7IE5pbFxuICAgIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwic2NvcGUtcGVla1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrIHdpdGggdiA6OiBfIC0+IHYgfCBbXSAtPiBOaWwpXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIENvbnRleHQgKHNjb3BlIGxvb2t1cCB3aXRoIG9wdGlvbmFsIGRlZmF1bHQpIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwiY29udGV4dFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSB8IFtTdHJpbmcgbmFtZTsgX10gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjaywgYXJncyB3aXRoXG4gICAgICAgfCB2IDo6IF8sIF8gLT4gdlxuICAgICAgIHwgW10sIFtfOyBkZWZhdWx0X3ZhbF0gLT4gZGVmYXVsdF92YWxcbiAgICAgICB8IFtdLCBfIC0+IE5pbClcbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gQ29sbGVjdCAvIGNvbGxlY3RlZCAvIGNsZWFyLWNvbGxlY3RlZCEgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJjb2xsZWN0IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lOyB2YWx1ZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoXG4gICAgICAgfCBMaXN0IGl0ZW1zIDo6IHJlc3QgLT5cbiAgICAgICAgIGlmIG5vdCAoTGlzdC5tZW0gdmFsdWUgaXRlbXMpIHRoZW5cbiAgICAgICAgICAgSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIChMaXN0IChpdGVtcyBAIFt2YWx1ZV0pIDo6IHJlc3QpXG4gICAgICAgfCBbXSAtPlxuICAgICAgICAgSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIFtMaXN0IFt2YWx1ZV1dXG4gICAgICAgfCBfIDo6IF8gLT4gKCkpO1xuICAgICAgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJjb2xsZWN0ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoIExpc3QgaXRlbXMgOjogXyAtPiBMaXN0IGl0ZW1zIHwgXyAtPiBMaXN0IFtdKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcImNsZWFyLWNvbGxlY3RlZCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoXG4gICAgICAgfCBfIDo6IHJlc3QgLT4gSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIChMaXN0IFtdIDo6IHJlc3QpXG4gICAgICAgfCBbXSAtPiBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgW0xpc3QgW11dKTtcbiAgICAgIE5pbFxuICAgIHwgXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBFbWl0IC8gZW1pdHRlZCAoZm9yIHNwcmVhZCBhdHRycyBpbiBhZGFwdGVyLWh0bWwuc3gpIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwic2NvcGUtZW1pdCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZTsgdmFsdWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICAobWF0Y2ggc3RhY2sgd2l0aFxuICAgICAgIHwgTGlzdCBpdGVtcyA6OiByZXN0IC0+XG4gICAgICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKExpc3QgKGl0ZW1zIEAgW3ZhbHVlXSkgOjogcmVzdClcbiAgICAgICB8IE5pbCA6OiByZXN0IC0+XG4gICAgICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKExpc3QgW3ZhbHVlXSA6OiByZXN0KVxuICAgICAgIHwgW10gLT5cbiAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBzY29wZV9zdGFja3MgbmFtZSBbTGlzdCBbdmFsdWVdXVxuICAgICAgIHwgXyA6OiBfIC0+ICgpKTtcbiAgICAgIE5pbFxuICAgIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwiZW1pdCFcIiAoZnVuIGFyZ3MgLT5cbiAgICAoKiBBbGlhcyBmb3Igc2NvcGUtZW1pdCEgKilcbiAgICBtYXRjaCBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgXCJzY29wZS1lbWl0IVwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTmlsKTtcblxuICByZWdpc3RlciBcImVtaXR0ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoIExpc3QgaXRlbXMgOjogXyAtPiBMaXN0IGl0ZW1zIHwgXyAtPiBMaXN0IFtdKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcInNjb3BlLWVtaXR0ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgXCJlbWl0dGVkXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcInNjb3BlLWNvbGxlY3RlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBcImNvbGxlY3RlZFwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTGlzdCBbXSk7XG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1jbGVhci1jb2xsZWN0ZWQhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIFwiY2xlYXItY29sbGVjdGVkIVwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gUHJvdmlkZSBhbGlhc2VzIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwicHJvdmlkZS1wdXNoIVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBcInNjb3BlLXB1c2ghXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwicHJvdmlkZS1wb3AhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIFwic2NvcGUtcG9wIVwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTmlsKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImdsb2JhbF9kYXRhIiwiU3hfcHJpbWl0aXZlcyIsIlN0ZGxpYl9IYXNodGJsIiwiU3RkbGliIiwiU3RkbGliX0xpc3QiLCJzY29wZV9zdGFja3MiLCJyZXF1ZXN0X2Nvb2tpZXMiLCJjbGVhcl9hbGwiLCJwYXJhbSIsInJlZ2lzdGVyIiwiYXJncyIsIm5hbWUiLCJtYXRjaCIsInYiLCJjc3Rfc2NvcGVfcHVzaCIsInZhbHVlIiwic3RhY2siLCJleG4iLCJjc3Rfc2NvcGVfcG9wIiwicmVzdCIsImRlZmF1bHRfdmFsIiwiaXRlbXMiLCJjc3RfY29sbGVjdGVkIiwiY3N0X2NsZWFyX2NvbGxlY3RlZCIsImNzdF9zY29wZV9lbWl0IiwiZm4iLCJjc3RfZW1pdHRlZCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJ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RSxRQUNRO0FBQUEsTUFBeUMscURBQUFhLEtBQUEsVUFDekIsMkJBQWtCO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLEdBRTFDO0FBQUE7QUFBQSxjQUFBZjtBQUFBQSxVQUFBRSxRQUNRO0FBQUEsTUFBd0MscURBQUFhLEtBQUEsVUFDeEIsMkJBQWtCO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLEdBQUM7QUFBQTtBQUFBO0FBQUEsRUR6SjdDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzQxMjEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4Lm9ianMvanNvby9kZWZhdWx0L3N4LmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvd29ya3NwYWNlX3Jvb3QvbGliL3N4X3BhcnNlci5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKiBTLWV4cHJlc3Npb24gcGFyc2VyLlxuXG4gICAgUmVjdXJzaXZlIGRlc2NlbnQgb3ZlciBhIHN0cmluZywgcHJvZHVjaW5nIFtTeF90eXBlcy52YWx1ZSBsaXN0XS5cbiAgICBTdXBwb3J0czogbGlzdHMsIGRpY3RzLCBzeW1ib2xzLCBrZXl3b3Jkcywgc3RyaW5ncyAod2l0aCBlc2NhcGVzKSxcbiAgICBudW1iZXJzLCBib29sZWFucywgbmlsLCBjb21tZW50cywgcXVvdGUvcXVhc2lxdW90ZS91bnF1b3RlIHN1Z2FyLiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbnR5cGUgc3RhdGUgPSB7XG4gIHNyYyA6IHN0cmluZztcbiAgbGVuIDogaW50O1xuICBtdXRhYmxlIHBvcyA6IGludDtcbn1cblxubGV0IG1ha2Vfc3RhdGUgc3JjID0geyBzcmM7IGxlbiA9IFN0cmluZy5sZW5ndGggc3JjOyBwb3MgPSAwIH1cblxubGV0IHBlZWsgcyA9IGlmIHMucG9zIDwgcy5sZW4gdGhlbiBTb21lIHMuc3JjLltzLnBvc10gZWxzZSBOb25lXG5sZXQgYWR2YW5jZSBzID0gcy5wb3MgPC0gcy5wb3MgKyAxXG5sZXQgYXRfZW5kIHMgPSBzLnBvcyA+PSBzLmxlblxuXG5sZXQgc2tpcF93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyBzID1cbiAgbGV0IHJlYyBnbyAoKSA9XG4gICAgaWYgYXRfZW5kIHMgdGhlbiAoKVxuICAgIGVsc2UgbWF0Y2ggcy5zcmMuW3MucG9zXSB3aXRoXG4gICAgfCAnICcgfCAnXFx0JyB8ICdcXG4nIHwgJ1xccicgLT4gYWR2YW5jZSBzOyBnbyAoKVxuICAgIHwgJzsnIC0+XG4gICAgICB3aGlsZSBzLnBvcyA8IHMubGVuICYmIHMuc3JjLltzLnBvc10gPD4gJ1xcbicgZG8gYWR2YW5jZSBzIGRvbmU7XG4gICAgICBpZiBzLnBvcyA8IHMubGVuIHRoZW4gYWR2YW5jZSBzO1xuICAgICAgZ28gKClcbiAgICB8IF8gLT4gKClcbiAgaW4gZ28gKClcblxuKCogQ2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIOKAlCBtYXRjaGVzIHNwZWMvcGFyc2VyLnN4IGlkZW50LXN0YXJ0L2lkZW50LWNoYXIuXG4gICBpZGVudC1zdGFydDogYS16IEEtWiBfIH4gKiArIC0gPiA8ID0gLyAhID8gJlxuICAgaWRlbnQtY2hhcjogIGlkZW50LXN0YXJ0IHBsdXMgMC05IC4gOiAvICMgLCAqKVxubGV0IGlzX2lkZW50X3N0YXJ0ID0gZnVuY3Rpb25cbiAgfCAnYScuLid6JyB8ICdBJy4uJ1onIHwgJ18nIHwgJ34nIHwgJyonIHwgJysnIHwgJy0nXG4gIHwgJz4nIHwgJzwnIHwgJz0nIHwgJy8nIHwgJyEnIHwgJz8nIHwgJyYnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCBpc19pZGVudF9jaGFyID0gZnVuY3Rpb25cbiAgfCBjIHdoZW4gaXNfaWRlbnRfc3RhcnQgYyAtPiB0cnVlXG4gIHwgJzAnLi4nOScgfCAnLicgfCAnOicgfCAnIycgfCAnLCcgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxuKCogU3ltYm9sIHJlYWRpbmcgdXNlcyBpZGVudF9jaGFyOyBmaXJzdCBjaGFyIG11c3QgYmUgaWRlbnRfc3RhcnQgb3IgZGlnaXQvY29sb24gKilcbmxldCBpc19zeW1ib2xfY2hhciA9IGlzX2lkZW50X2NoYXJcblxubGV0IHJlYWRfc3RyaW5nIHMgPVxuICAoKiBzLnBvcyBpcyBvbiB0aGUgb3BlbmluZyBxdW90ZSAqKVxuICBhZHZhbmNlIHM7XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gIGxldCByZWMgZ28gKCkgPVxuICAgIGlmIGF0X2VuZCBzIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiVW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbiAgICBsZXQgYyA9IHMuc3JjLltzLnBvc10gaW5cbiAgICBhZHZhbmNlIHM7XG4gICAgaWYgYyA9ICdcIicgdGhlbiBCdWZmZXIuY29udGVudHMgYnVmXG4gICAgZWxzZSBpZiBjID0gJ1xcXFwnIHRoZW4gYmVnaW5cbiAgICAgIGlmIGF0X2VuZCBzIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBlc2NhcGVcIik7XG4gICAgICBsZXQgZXNjID0gcy5zcmMuW3MucG9zXSBpblxuICAgICAgYWR2YW5jZSBzO1xuICAgICAgKG1hdGNoIGVzYyB3aXRoXG4gICAgICAgfCAnbicgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXFxuJ1xuICAgICAgIHwgJ3QnIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1xcdCdcbiAgICAgICB8ICdyJyAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmICdcXHInXG4gICAgICAgfCAnXCInIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1wiJ1xuICAgICAgIHwgJ1xcXFwnIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1xcXFwnXG4gICAgICAgfCAndScgLT5cbiAgICAgICAgICgqIFxcdVhYWFgg4oCUIHJlYWQgNCBoZXggZGlnaXRzLCBlbmNvZGUgYXMgVVRGLTggKilcbiAgICAgICAgIGlmIHMucG9zICsgNCA+IHMubGVuIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiSW5jb21wbGV0ZSBcXFxcdSBlc2NhcGVcIik7XG4gICAgICAgICBsZXQgaGV4ID0gU3RyaW5nLnN1YiBzLnNyYyBzLnBvcyA0IGluXG4gICAgICAgICBzLnBvcyA8LSBzLnBvcyArIDQ7XG4gICAgICAgICBsZXQgY29kZSA9IGludF9vZl9zdHJpbmcgKFwiMHhcIiBeIGhleCkgaW5cbiAgICAgICAgIGxldCB1YnVmID0gQnVmZmVyLmNyZWF0ZSA0IGluXG4gICAgICAgICBCdWZmZXIuYWRkX3V0Zl84X3VjaGFyIHVidWYgKFVjaGFyLm9mX2ludCBjb2RlKTtcbiAgICAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiAoQnVmZmVyLmNvbnRlbnRzIHVidWYpXG4gICAgICAgfCAnYCcgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnYCdcbiAgICAgICB8IF8gLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXFxcXCc7IEJ1ZmZlci5hZGRfY2hhciBidWYgZXNjKTtcbiAgICAgIGdvICgpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgYztcbiAgICAgIGdvICgpXG4gICAgZW5kXG4gIGluIGdvICgpXG5cbmxldCByZWFkX3N5bWJvbCBzID1cbiAgbGV0IHN0YXJ0ID0gcy5wb3MgaW5cbiAgd2hpbGUgcy5wb3MgPCBzLmxlbiAmJiBpc19zeW1ib2xfY2hhciBzLnNyYy5bcy5wb3NdIGRvIGFkdmFuY2UgcyBkb25lO1xuICBTdHJpbmcuc3ViIHMuc3JjIHN0YXJ0IChzLnBvcyAtIHN0YXJ0KVxuXG5sZXQgdHJ5X251bWJlciBzdHIgPVxuICBtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IHN0ciB3aXRoXG4gIHwgU29tZSBuIC0+IFNvbWUgKE51bWJlciBuKVxuICB8IE5vbmUgLT4gTm9uZVxuXG5sZXQgcmVjIHJlYWRfdmFsdWUgcyA6IHZhbHVlID1cbiAgc2tpcF93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyBzO1xuICBpZiBhdF9lbmQgcyB0aGVuIGJlZ2luXG4gICAgbGV0IGxpbmUgPSByZWYgMSBpblxuICAgIFN0cmluZy5pdGVyIChmdW4gYyAtPiBpZiBjID0gJ1xcbicgdGhlbiBpbmNyIGxpbmUpIHMuc3JjO1xuICAgIHJhaXNlIChQYXJzZV9lcnJvciAoUHJpbnRmLnNwcmludGYgXCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhdCBsaW5lICVkIChwb3MgJWQpXCIgIWxpbmUgcy5wb3MpKVxuICBlbmQ7XG4gIG1hdGNoIHMuc3JjLltzLnBvc10gd2l0aFxuICB8ICcoJyAtPiByZWFkX2xpc3QgcyAnKSdcbiAgfCAnWycgLT4gcmVhZF9saXN0IHMgJ10nXG4gIHwgJ3snIC0+IHJlYWRfZGljdCBzXG4gIHwgJ1wiJyAtPiBTdHJpbmcgKHJlYWRfc3RyaW5nIHMpXG4gIHwgJ1xcJycgLT4gYWR2YW5jZSBzOyBMaXN0IFtTeW1ib2wgXCJxdW90ZVwiOyByZWFkX3ZhbHVlIHNdXG4gIHwgJ2AnIC0+IGFkdmFuY2UgczsgTGlzdCBbU3ltYm9sIFwicXVhc2lxdW90ZVwiOyByZWFkX3ZhbHVlIHNdXG4gIHwgJyMnIHdoZW4gcy5wb3MgKyAxIDwgcy5sZW4gJiYgcy5zcmMuW3MucG9zICsgMV0gPSAnOycgLT5cbiAgICAoKiBEYXR1bSBjb21tZW50OiAjOyBkaXNjYXJkcyBuZXh0IGV4cHJlc3Npb24gKilcbiAgICBhZHZhbmNlIHM7IGFkdmFuY2UgcztcbiAgICBpZ25vcmUgKHJlYWRfdmFsdWUgcyk7XG4gICAgcmVhZF92YWx1ZSBzXG4gIHwgJyMnIHdoZW4gcy5wb3MgKyAxIDwgcy5sZW4gJiYgcy5zcmMuW3MucG9zICsgMV0gPSAnXFwnJyAtPlxuICAgICgqIFF1b3RlIHNob3J0aGFuZDogIydleHByIC0+IChxdW90ZSBleHByKSAqKVxuICAgIGFkdmFuY2UgczsgYWR2YW5jZSBzO1xuICAgIExpc3QgW1N5bWJvbCBcInF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgfCAnIycgd2hlbiBzLnBvcyArIDEgPCBzLmxlbiAmJiBzLnNyYy5bcy5wb3MgKyAxXSA9ICd8JyAtPlxuICAgICgqIFJhdyBzdHJpbmc6ICN8Li4ufCAg4oCUIGVuZHMgYXQgbmV4dCB8ICopXG4gICAgYWR2YW5jZSBzOyBhZHZhbmNlIHM7XG4gICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgNjQgaW5cbiAgICBsZXQgcmVjIGdvICgpID1cbiAgICAgIGlmIGF0X2VuZCBzIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiVW50ZXJtaW5hdGVkIHJhdyBzdHJpbmdcIik7XG4gICAgICBsZXQgYyA9IHMuc3JjLltzLnBvc10gaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIGlmIGMgPSAnfCcgdGhlblxuICAgICAgICBTdHJpbmcgKEJ1ZmZlci5jb250ZW50cyBidWYpXG4gICAgICBlbHNlIGJlZ2luXG4gICAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgYztcbiAgICAgICAgZ28gKClcbiAgICAgIGVuZFxuICAgIGluIGdvICgpXG4gIHwgJywnIC0+XG4gICAgKCogVW5xdW90ZSAvIHNwbGljZS11bnF1b3RlIOKAlCBtYXRjaGVzIHNwZWM6ICwgYWx3YXlzIHRyaWdnZXJzIHVucXVvdGUgKilcbiAgICBhZHZhbmNlIHM7XG4gICAgaWYgcy5wb3MgPCBzLmxlbiAmJiBzLnNyYy5bcy5wb3NdID0gJ0AnIHRoZW4gYmVnaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIExpc3QgW1N5bWJvbCBcInNwbGljZS11bnF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgICBlbmQgZWxzZVxuICAgICAgTGlzdCBbU3ltYm9sIFwidW5xdW90ZVwiOyByZWFkX3ZhbHVlIHNdXG4gIHwgXyAtPlxuICAgIGJlZ2luXG4gICAgICAoKiBTeW1ib2wsIGtleXdvcmQsIG51bWJlciwgb3IgYm9vbGVhbiAqKVxuICAgICAgbGV0IHRva2VuID0gcmVhZF9zeW1ib2wgcyBpblxuICAgICAgaWYgdG9rZW4gPSBcIlwiIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IGxpbmUgPSByZWYgMSBhbmQgY29sID0gcmVmIDEgaW5cbiAgICAgICAgZm9yIGkgPSAwIHRvIHMucG9zIC0gMSBkb1xuICAgICAgICAgIGlmIHMuc3JjLltpXSA9ICdcXG4nIHRoZW4gKGluY3IgbGluZTsgY29sIDo9IDEpIGVsc2UgaW5jciBjb2xcbiAgICAgICAgZG9uZTtcbiAgICAgICAgcmFpc2UgKFBhcnNlX2Vycm9yIChQcmludGYuc3ByaW50ZiBcIlVuZXhwZWN0ZWQgY2hhcjogJWMgYXQgbGluZSAlZCBjb2wgJWQgKHBvcyAlZClcIlxuICAgICAgICAgIHMuc3JjLltzLnBvc10gIWxpbmUgIWNvbCBzLnBvcykpXG4gICAgICBlbmQ7XG4gICAgICBtYXRjaCB0b2tlbiB3aXRoXG4gICAgICB8IFwidHJ1ZVwiIC0+IEJvb2wgdHJ1ZVxuICAgICAgfCBcImZhbHNlXCIgLT4gQm9vbCBmYWxzZVxuICAgICAgfCBcIm5pbFwiIC0+IE5pbFxuICAgICAgfCBfIHdoZW4gdG9rZW4uWzBdID0gJzonIC0+XG4gICAgICAgIEtleXdvcmQgKFN0cmluZy5zdWIgdG9rZW4gMSAoU3RyaW5nLmxlbmd0aCB0b2tlbiAtIDEpKVxuICAgICAgfCBfIC0+XG4gICAgICAgIG1hdGNoIHRyeV9udW1iZXIgdG9rZW4gd2l0aFxuICAgICAgICB8IFNvbWUgbiAtPiBuXG4gICAgICAgIHwgTm9uZSAtPiBTeW1ib2wgdG9rZW5cbiAgICBlbmRcblxuYW5kIHJlYWRfbGlzdCBzIGNsb3NlX2NoYXIgPVxuICBhZHZhbmNlIHM7ICgqIHNraXAgb3BlbmluZyBwYXJlbi9icmFja2V0ICopXG4gIGxldCBpdGVtcyA9IHJlZiBbXSBpblxuICBsZXQgcmVjIGdvICgpID1cbiAgICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgbGlzdFwiKTtcbiAgICBpZiBzLnNyYy5bcy5wb3NdID0gY2xvc2VfY2hhciB0aGVuIGJlZ2luXG4gICAgICBhZHZhbmNlIHM7XG4gICAgICBMaXN0IChMaXN0LnJldiAhaXRlbXMpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIGl0ZW1zIDo9IHJlYWRfdmFsdWUgcyA6OiAhaXRlbXM7XG4gICAgICBnbyAoKVxuICAgIGVuZFxuICBpbiBnbyAoKVxuXG5hbmQgcmVhZF9kaWN0IHMgPVxuICBhZHZhbmNlIHM7ICgqIHNraXAgeyAqKVxuICBsZXQgZCA9IG1ha2VfZGljdCAoKSBpblxuICBsZXQgcmVjIGdvICgpID1cbiAgICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgZGljdFwiKTtcbiAgICBpZiBzLnNyYy5bcy5wb3NdID0gJ30nIHRoZW4gYmVnaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIERpY3QgZFxuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBsZXQga2V5ID0gcmVhZF92YWx1ZSBzIGluXG4gICAgICBsZXQga2V5X3N0ciA9IG1hdGNoIGtleSB3aXRoXG4gICAgICAgIHwgS2V5d29yZCBrIC0+IGtcbiAgICAgICAgfCBTdHJpbmcgayAtPiBrXG4gICAgICAgIHwgU3ltYm9sIGsgLT4ga1xuICAgICAgICB8IF8gLT4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiRGljdCBrZXkgbXVzdCBiZSBrZXl3b3JkLCBzdHJpbmcsIG9yIHN5bWJvbFwiKVxuICAgICAgaW5cbiAgICAgIGxldCB2ID0gcmVhZF92YWx1ZSBzIGluXG4gICAgICBkaWN0X3NldCBkIGtleV9zdHIgdjtcbiAgICAgIGdvICgpXG4gICAgZW5kXG4gIGluIGdvICgpXG5cblxuKCoqIFBhcnNlIGEgc3RyaW5nIGludG8gYSBsaXN0IG9mIFNYIHZhbHVlcy4gKilcbmxldCBwYXJzZV9hbGwgc3JjID1cbiAgbGV0IHMgPSBtYWtlX3N0YXRlIHNyYyBpblxuICBsZXQgcmVzdWx0cyA9IHJlZiBbXSBpblxuICBsZXQgcmVjIGdvICgpID1cbiAgICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gICAgaWYgYXRfZW5kIHMgdGhlbiBMaXN0LnJldiAhcmVzdWx0c1xuICAgIGVsc2UgYmVnaW5cbiAgICAgIHJlc3VsdHMgOj0gcmVhZF92YWx1ZSBzIDo6ICFyZXN1bHRzO1xuICAgICAgZ28gKClcbiAgICBlbmRcbiAgaW4gZ28gKClcblxuKCoqIFBhcnNlIGEgZmlsZSBpbnRvIGEgbGlzdCBvZiBTWCB2YWx1ZXMuICopXG5sZXQgcGFyc2VfZmlsZSBwYXRoID1cbiAgbGV0IGljID0gb3Blbl9pbiBwYXRoIGluXG4gIGxldCBuID0gaW5fY2hhbm5lbF9sZW5ndGggaWMgaW5cbiAgbGV0IHNyYyA9IHJlYWxseV9pbnB1dF9zdHJpbmcgaWMgbiBpblxuICBjbG9zZV9pbiBpYztcbiAgcGFyc2VfYWxsIHNyY1xuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19nZXQiLCJjYW1sX2NhbGwyIiwiZiIsImEwIiwiYTEiLCJjYW1sX2NhbGw0IiwiYTIiLCJhMyIsImdsb2JhbF9kYXRhIiwiU3hfdHlwZXMiLCJTdGRsaWJfQnVmZmVyIiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9QcmludGYiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYiIsIlN0ZGxpYl9VY2hhciIsIm1ha2Vfc3RhdGUiLCJzcmMiLCJwZWVrIiwicyIsImFkdmFuY2UiLCJhdF9lbmQiLCJza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIiwibWF0Y2giLCJpc19pZGVudF9zdGFydCIsInBhcmFtIiwiaXNfaWRlbnRfY2hhciIsImMiLCJyZWFkX3N0cmluZyIsImJ1ZiIsImVzYyIsImhleCIsImNvZGUiLCJ1YnVmIiwicmVhZF9zeW1ib2wiLCJzdGFydCIsInRyeV9udW1iZXIiLCJzdHIiLCJuIiwiY3N0X3BvcyIsImNzdF9xdW90ZSIsInJlYWRfdmFsdWUiLCJ0b2tlbiIsImNvbCIsImxpbmUiLCJpIiwicmVhZF9saXN0IiwiY2xvc2VfY2hhciIsIml0ZW1zIiwicmVhZF9kaWN0IiwiZCIsImtleSIsImtleV9zdHIiLCJ2IiwicGFyc2VfYWxsIiwicmVzdWx0cyIsInBhcnNlX2ZpbGUiLCJwYXRoIiwiaWMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUMsSUFBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFILEdBQUFDLElBQUFDLElBQUFFLElBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsWUFBQUMsV0FBQUMsS0NjcUIsK0NBQXlDO0FBQUEsWUFBQUMsS0FBQUM7QUFBQUEsSUFFakQseUJBQTJCLGdDQUF1QjtBQUFBO0FBQUEsWUFBQUMsUUFBQUQsR0FDL0MsOEJBQWtCO0FBQUEsWUFBQUUsT0FBQUYsR0FDbkIsNEJBQWM7QUFBQSxZQUFBRyw2QkFBQUg7QUFBQUE7QUFBQUEsSUFJdEI7QUFBQSxtQkFBYztBQUFBLFNBQUFJLFFBQ047QUFBQTtBQUFBO0FBQUEsTUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLGtDQUdDLDZCQUF5QjtBQUFBLFNBQ2hEO0FBQUEsU0FBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FKQTtBQUFBLE1BQ007QUFBQTtBQUFBO0FBQUEsS0FLdkI7QUFBQTtBQUFBLEdBQ0Q7QUFBQSxZQUFBQyxlQUFBQztBQUFBQTtBQUFBQTtBQUFBQSxLQUtXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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LHdDQUNELFlBQVM7QUFBQSxTQUFBQyxNQUdDO0FBQUEsS0FDVjtBQUFBLFVBQUFDLFVBQUEsUUFBQUMsSUFNUTtBQUFBLE1BQ1I7QUFBQTtBQUFBO0FBQUEsS0FIUztBQUFBO0FBQUE7QUFBQTtBQUFBLEdBTUw7QUFBQSxZQUFBQyxVQUFBckM7QUFBQUEsUUFBQUUsSUFLQSxpQkFBQW9DLFVBR047QUFBQTtBQUFBO0FBQUEsS0FDRyxjQUFjLDBDQUtYO0FBQUEsS0FGSixjQURXO0FBQUE7QUFBQSxHQUdQO0FBQUEsWUFBQUMsV0FBQUM7QUFBQUE7QUFBQUEsS0FBQUMsS0FJQztBQUFBLEtBQUFwQixJQUNEO0FBQUEsS0FBQXJCLE1BQ0U7QUFBQSxJQUNWO0FBQUEsSUFBVyxxQkFDRTtBQUFBO0FBQUEsR0QvTmYiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNDUyMywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcmVuZGVyLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIEhUTUwgcmVuZGVyZXIgZm9yIFNYIHZhbHVlcy5cblxuICAgIEV4dHJhY3RlZCBmcm9tIHJ1bl90ZXN0cy5tbCDigJQgcmVuZGVycyBhbiBTWCBleHByZXNzaW9uIHRyZWUgdG8gYW5cbiAgICBIVE1MIHN0cmluZywgZXhwYW5kaW5nIGNvbXBvbmVudHMgYW5kIG1hY3JvcyBhbG9uZyB0aGUgd2F5LlxuXG4gICAgRGVwZW5kcyBvbiBbU3hfcmVmLmV2YWxfZXhwcl0gZm9yIGV2YWx1YXRpbmcgc3ViLWV4cHJlc3Npb25zXG4gICAgZHVyaW5nIHJlbmRlcmluZyAoa2V5d29yZCBhcmcgdmFsdWVzLCBjb25kaXRpb25hbHMsIGV0Yy4pLiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFRhZyAvIGF0dHJpYnV0ZSByZWdpc3RyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbmxldCBodG1sX3RhZ3MgPSBbXG4gIFwiaHRtbFwiOyBcImhlYWRcIjsgXCJib2R5XCI7IFwidGl0bGVcIjsgXCJtZXRhXCI7IFwibGlua1wiOyBcInNjcmlwdFwiOyBcInN0eWxlXCI7IFwibm9zY3JpcHRcIjtcbiAgXCJoZWFkZXJcIjsgXCJuYXZcIjsgXCJtYWluXCI7IFwic2VjdGlvblwiOyBcImFydGljbGVcIjsgXCJhc2lkZVwiOyBcImZvb3RlclwiO1xuICBcImgxXCI7IFwiaDJcIjsgXCJoM1wiOyBcImg0XCI7IFwiaDVcIjsgXCJoNlwiOyBcImhncm91cFwiO1xuICBcImRpdlwiOyBcInBcIjsgXCJibG9ja3F1b3RlXCI7IFwicHJlXCI7IFwiZmlndXJlXCI7IFwiZmlnY2FwdGlvblwiOyBcImFkZHJlc3NcIjsgXCJoclwiO1xuICBcInVsXCI7IFwib2xcIjsgXCJsaVwiOyBcImRsXCI7IFwiZHRcIjsgXCJkZFwiOyBcIm1lbnVcIjtcbiAgXCJhXCI7IFwic3BhblwiOyBcImVtXCI7IFwic3Ryb25nXCI7IFwic21hbGxcIjsgXCJiXCI7IFwiaVwiOyBcInVcIjsgXCJzXCI7IFwic3ViXCI7IFwic3VwXCI7XG4gIFwibWFya1wiOyBcImRlbFwiOyBcImluc1wiOyBcInFcIjsgXCJjaXRlXCI7IFwiZGZuXCI7IFwiYWJiclwiOyBcImNvZGVcIjsgXCJ2YXJcIjsgXCJzYW1wXCI7XG4gIFwia2JkXCI7IFwiZGF0YVwiOyBcInRpbWVcIjsgXCJydWJ5XCI7IFwicnRcIjsgXCJycFwiOyBcImJkaVwiOyBcImJkb1wiOyBcIndiclwiOyBcImJyXCI7XG4gIFwidGFibGVcIjsgXCJ0aGVhZFwiOyBcInRib2R5XCI7IFwidGZvb3RcIjsgXCJ0clwiOyBcInRoXCI7IFwidGRcIjsgXCJjYXB0aW9uXCI7IFwiY29sZ3JvdXBcIjsgXCJjb2xcIjtcbiAgXCJmb3JtXCI7IFwiaW5wdXRcIjsgXCJ0ZXh0YXJlYVwiOyBcInNlbGVjdFwiOyBcIm9wdGlvblwiOyBcIm9wdGdyb3VwXCI7IFwiYnV0dG9uXCI7IFwibGFiZWxcIjtcbiAgXCJmaWVsZHNldFwiOyBcImxlZ2VuZFwiOyBcImRhdGFsaXN0XCI7IFwib3V0cHV0XCI7IFwicHJvZ3Jlc3NcIjsgXCJtZXRlclwiO1xuICBcImRldGFpbHNcIjsgXCJzdW1tYXJ5XCI7IFwiZGlhbG9nXCI7XG4gIFwiaW1nXCI7IFwidmlkZW9cIjsgXCJhdWRpb1wiOyBcInNvdXJjZVwiOyBcInBpY3R1cmVcIjsgXCJjYW52YXNcIjsgXCJpZnJhbWVcIjsgXCJlbWJlZFwiOyBcIm9iamVjdFwiOyBcInBhcmFtXCI7XG4gIFwic3ZnXCI7IFwicGF0aFwiOyBcImNpcmNsZVwiOyBcInJlY3RcIjsgXCJsaW5lXCI7IFwicG9seWxpbmVcIjsgXCJwb2x5Z29uXCI7IFwiZWxsaXBzZVwiO1xuICBcImdcIjsgXCJkZWZzXCI7IFwidXNlXCI7IFwidGV4dFwiOyBcInRzcGFuXCI7IFwiY2xpcFBhdGhcIjsgXCJtYXNrXCI7IFwicGF0dGVyblwiO1xuICBcImxpbmVhckdyYWRpZW50XCI7IFwicmFkaWFsR3JhZGllbnRcIjsgXCJzdG9wXCI7IFwiZmlsdGVyXCI7IFwiZmVCbGVuZFwiOyBcImZlRmxvb2RcIjtcbiAgXCJmZUdhdXNzaWFuQmx1clwiOyBcImZlT2Zmc2V0XCI7IFwiZmVNZXJnZVwiOyBcImZlTWVyZ2VOb2RlXCI7IFwiZmVDb21wb3NpdGVcIjtcbiAgXCJ0ZW1wbGF0ZVwiOyBcInNsb3RcIjtcbl1cblxubGV0IHZvaWRfZWxlbWVudHMgPSBbXG4gIFwiYXJlYVwiOyBcImJhc2VcIjsgXCJiclwiOyBcImNvbFwiOyBcImVtYmVkXCI7IFwiaHJcIjsgXCJpbWdcIjsgXCJpbnB1dFwiO1xuICBcImxpbmtcIjsgXCJtZXRhXCI7IFwicGFyYW1cIjsgXCJzb3VyY2VcIjsgXCJ0cmFja1wiOyBcIndiclwiXG5dXG5cbmxldCBib29sZWFuX2F0dHJzID0gW1xuICBcImFzeW5jXCI7IFwiYXV0b2ZvY3VzXCI7IFwiYXV0b3BsYXlcIjsgXCJjaGVja2VkXCI7IFwiY29udHJvbHNcIjsgXCJkZWZhdWx0XCI7XG4gIFwiZGVmZXJcIjsgXCJkaXNhYmxlZFwiOyBcImZvcm1ub3ZhbGlkYXRlXCI7IFwiaGlkZGVuXCI7IFwiaW5lcnRcIjsgXCJpc21hcFwiO1xuICBcImxvb3BcIjsgXCJtdWx0aXBsZVwiOyBcIm11dGVkXCI7IFwibm9tb2R1bGVcIjsgXCJub3ZhbGlkYXRlXCI7IFwib3BlblwiO1xuICBcInBsYXlzaW5saW5lXCI7IFwicmVhZG9ubHlcIjsgXCJyZXF1aXJlZFwiOyBcInJldmVyc2VkXCI7IFwic2VsZWN0ZWRcIlxuXVxuXG5sZXQgaXNfaHRtbF90YWcgbmFtZSA9IExpc3QubWVtIG5hbWUgaHRtbF90YWdzXG5sZXQgaXNfdm9pZCBuYW1lID0gTGlzdC5tZW0gbmFtZSB2b2lkX2VsZW1lbnRzXG5sZXQgaXNfYm9vbGVhbl9hdHRyIG5hbWUgPSBMaXN0Lm1lbSBuYW1lIGJvb2xlYW5fYXR0cnNcblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBIVE1MIGVzY2FwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgZXNjYXBlX2h0bWwgcyA9XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMpIGluXG4gIFN0cmluZy5pdGVyIChmdW5jdGlvblxuICAgIHwgJyYnIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIiZhbXA7XCJcbiAgICB8ICc8JyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCImbHQ7XCJcbiAgICB8ICc+JyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCImZ3Q7XCJcbiAgICB8ICdcIicgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiJnF1b3Q7XCJcbiAgICB8IGMgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiBjKSBzO1xuICBCdWZmZXIuY29udGVudHMgYnVmXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogQXR0cmlidXRlIHJlbmRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IHJlbmRlcl9hdHRycyBhdHRycyA9XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPlxuICAgIGlmIGlzX2Jvb2xlYW5fYXR0ciBrIHRoZW4gYmVnaW5cbiAgICAgIGlmIHN4X3RydXRoeSB2IHRoZW4gYmVnaW5cbiAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnICc7XG4gICAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBrXG4gICAgICBlbmRcbiAgICBlbmQgZWxzZSBpZiBub3QgKGlzX25pbCB2KSB0aGVuIGJlZ2luXG4gICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICcgJztcbiAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBrO1xuICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiPVxcXCJcIjtcbiAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiAoZXNjYXBlX2h0bWwgKHZhbHVlX3RvX3N0cmluZyB2KSk7XG4gICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICdcIidcbiAgICBlbmQpIGF0dHJzO1xuICBCdWZmZXIuY29udGVudHMgYnVmXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogSFRNTCByZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxuKCogRm9yd2FyZCByZWYg4oCUIHJlc29sdmVkIGF0IHNldHVwIHRpbWUgKilcbmxldCByZW5kZXJfdG9faHRtbF9yZWYgOiAodmFsdWUgLT4gZW52IC0+IHN0cmluZykgcmVmID1cbiAgcmVmIChmdW4gX2V4cHIgX2VudiAtPiBcIlwiKVxuXG5sZXQgcmVuZGVyX3RvX2h0bWwgZXhwciBlbnYgPSAhcmVuZGVyX3RvX2h0bWxfcmVmIGV4cHIgZW52XG5cbmxldCByZW5kZXJfY2hpbGRyZW4gY2hpbGRyZW4gZW52ID1cbiAgU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCAoZnVuIGMgLT4gcmVuZGVyX3RvX2h0bWwgYyBlbnYpIGNoaWxkcmVuKVxuXG4oKiogUGFyc2Uga2V5d29yZCBhdHRycyBhbmQgcG9zaXRpb25hbCBjaGlsZHJlbiBmcm9tIGFuIGVsZW1lbnQgY2FsbCdzIGFyZ3MuXG4gICAgQXR0cnMgYXJlIGV2YWx1YXRlZDsgY2hpbGRyZW4gYXJlIHJldHVybmVkIFVORVZBTFVBVEVEIGZvciByZW5kZXIgZGlzcGF0Y2guICopXG5sZXQgcGFyc2VfZWxlbWVudF9hcmdzIGFyZ3MgZW52ID1cbiAgbGV0IGF0dHJzID0gSGFzaHRibC5jcmVhdGUgOCBpblxuICBsZXQgY2hpbGRyZW4gPSByZWYgW10gaW5cbiAgbGV0IHNraXAgPSByZWYgZmFsc2UgaW5cbiAgbGV0IGxlbiA9IExpc3QubGVuZ3RoIGFyZ3MgaW5cbiAgTGlzdC5pdGVyaSAoZnVuIGlkeCBhcmcgLT5cbiAgICBpZiAhc2tpcCB0aGVuIHNraXAgOj0gZmFsc2VcbiAgICBlbHNlIG1hdGNoIGFyZyB3aXRoXG4gICAgfCBLZXl3b3JkIGsgd2hlbiBpZHggKyAxIDwgbGVuIC0+XG4gICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QubnRoIGFyZ3MgKGlkeCArIDEpKSAoRW52IGVudikgaW5cbiAgICAgIEhhc2h0YmwucmVwbGFjZSBhdHRycyBrIHY7XG4gICAgICBza2lwIDo9IHRydWVcbiAgICB8IFNwcmVhZCBwYWlycyAtPlxuICAgICAgTGlzdC5pdGVyIChmdW4gKGssIHYpIC0+IEhhc2h0YmwucmVwbGFjZSBhdHRycyBrIHYpIHBhaXJzXG4gICAgfCBfIC0+XG4gICAgICBjaGlsZHJlbiA6PSBhcmcgOjogIWNoaWxkcmVuXG4gICkgYXJncztcbiAgKGF0dHJzLCBMaXN0LnJldiAhY2hpbGRyZW4pXG5cbmxldCByZW5kZXJfaHRtbF9lbGVtZW50IHRhZyBhcmdzIGVudiA9XG4gIGxldCAoYXR0cnMsIGNoaWxkcmVuKSA9IHBhcnNlX2VsZW1lbnRfYXJncyBhcmdzIGVudiBpblxuICBsZXQgYXR0cl9zdHIgPSByZW5kZXJfYXR0cnMgYXR0cnMgaW5cbiAgaWYgaXNfdm9pZCB0YWcgdGhlblxuICAgIFwiPFwiIF4gdGFnIF4gYXR0cl9zdHIgXiBcIiAvPlwiXG4gIGVsc2VcbiAgICBsZXQgY29udGVudCA9IFN0cmluZy5jb25jYXQgXCJcIlxuICAgICAgKExpc3QubWFwIChmdW4gYyAtPiByZW5kZXJfdG9faHRtbCBjIGVudikgY2hpbGRyZW4pIGluXG4gICAgXCI8XCIgXiB0YWcgXiBhdHRyX3N0ciBeIFwiPlwiIF4gY29udGVudCBeIFwiPC9cIiBeIHRhZyBeIFwiPlwiXG5cbmxldCByZW5kZXJfY29tcG9uZW50IGNvbXAgYXJncyBlbnYgPVxuICBtYXRjaCBjb21wIHdpdGhcbiAgfCBDb21wb25lbnQgYyAtPlxuICAgIGxldCBrd2FyZ3MgPSBIYXNodGJsLmNyZWF0ZSA4IGluXG4gICAgbGV0IGNoaWxkcmVuX2V4cHJzID0gcmVmIFtdIGluXG4gICAgbGV0IHNraXAgPSByZWYgZmFsc2UgaW5cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggYXJncyBpblxuICAgIExpc3QuaXRlcmkgKGZ1biBpZHggYXJnIC0+XG4gICAgICBpZiAhc2tpcCB0aGVuIHNraXAgOj0gZmFsc2VcbiAgICAgIGVsc2UgbWF0Y2ggYXJnIHdpdGhcbiAgICAgIHwgS2V5d29yZCBrIHdoZW4gaWR4ICsgMSA8IGxlbiAtPlxuICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QubnRoIGFyZ3MgKGlkeCArIDEpKSAoRW52IGVudikgaW5cbiAgICAgICAgSGFzaHRibC5yZXBsYWNlIGt3YXJncyBrIHY7XG4gICAgICAgIHNraXAgOj0gdHJ1ZVxuICAgICAgfCBfIC0+XG4gICAgICAgIGNoaWxkcmVuX2V4cHJzIDo9IGFyZyA6OiAhY2hpbGRyZW5fZXhwcnNcbiAgICApIGFyZ3M7XG4gICAgbGV0IGNoaWxkcmVuID0gTGlzdC5yZXYgIWNoaWxkcmVuX2V4cHJzIGluXG4gICAgbGV0IGxvY2FsID0gZW52X21lcmdlIGMuY19jbG9zdXJlIGVudiBpblxuICAgIExpc3QuaXRlciAoZnVuIHAgLT5cbiAgICAgIGxldCB2ID0gbWF0Y2ggSGFzaHRibC5maW5kX29wdCBrd2FyZ3MgcCB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBOaWwgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgcCB2KVxuICAgICkgYy5jX3BhcmFtcztcbiAgICBpZiBjLmNfaGFzX2NoaWxkcmVuIHRoZW4gYmVnaW5cbiAgICAgIGxldCByZW5kZXJlZF9jaGlsZHJlbiA9IFN0cmluZy5jb25jYXQgXCJcIlxuICAgICAgICAoTGlzdC5tYXAgKGZ1biBjIC0+IHJlbmRlcl90b19odG1sIGMgZW52KSBjaGlsZHJlbikgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgXCJjaGlsZHJlblwiIChSYXdIVE1MIHJlbmRlcmVkX2NoaWxkcmVuKSlcbiAgICBlbmQ7XG4gICAgcmVuZGVyX3RvX2h0bWwgYy5jX2JvZHkgbG9jYWxcbiAgfCBfIC0+IFwiXCJcblxubGV0IGV4cGFuZF9tYWNybyAobSA6IG1hY3JvKSBhcmdzIF9lbnYgPVxuICBsZXQgbG9jYWwgPSBlbnZfZXh0ZW5kIG0ubV9jbG9zdXJlIGluXG4gIGxldCBwYXJhbXMgPSBtLm1fcGFyYW1zIGluXG4gIGxldCByZWMgYmluZF9wYXJhbXMgcHMgYXMnID1cbiAgICBtYXRjaCBwcywgYXMnIHdpdGhcbiAgICB8IFtdLCByZXN0IC0+XG4gICAgICAobWF0Y2ggbS5tX3Jlc3RfcGFyYW0gd2l0aFxuICAgICAgIHwgU29tZSBycCAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHJwIChMaXN0IHJlc3QpKVxuICAgICAgIHwgTm9uZSAtPiAoKSlcbiAgICB8IHAgOjogcHNfcmVzdCwgYSA6OiBhc19yZXN0IC0+XG4gICAgICBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgYSk7XG4gICAgICBiaW5kX3BhcmFtcyBwc19yZXN0IGFzX3Jlc3RcbiAgICB8IF8gOjogXywgW10gLT5cbiAgICAgIExpc3QuaXRlciAoZnVuIHAgLT4gaWdub3JlIChlbnZfYmluZCBsb2NhbCBwIE5pbCkpIChMaXN0LnJldiBwcylcbiAgaW5cbiAgYmluZF9wYXJhbXMgcGFyYW1zIGFyZ3M7XG4gIFN4X3JlZi5ldmFsX2V4cHIgbS5tX2JvZHkgKEVudiBsb2NhbClcblxubGV0IHJlYyBkb19yZW5kZXJfdG9faHRtbCAoZXhwciA6IHZhbHVlKSAoZW52IDogZW52KSA6IHN0cmluZyA9XG4gIG1hdGNoIGV4cHIgd2l0aFxuICB8IE5pbCAtPiBcIlwiXG4gIHwgQm9vbCB0cnVlIC0+IFwidHJ1ZVwiXG4gIHwgQm9vbCBmYWxzZSAtPiBcImZhbHNlXCJcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBTdHJpbmcgcyAtPiBlc2NhcGVfaHRtbCBzXG4gIHwgS2V5d29yZCBrIC0+IGVzY2FwZV9odG1sIGtcbiAgfCBSYXdIVE1MIHMgLT4gc1xuICB8IFN5bWJvbCBzIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIChTeW1ib2wgcykgKEVudiBlbnYpIGluXG4gICAgZG9fcmVuZGVyX3RvX2h0bWwgdiBlbnZcbiAgfCBMaXN0IFtdIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gW10gfSAtPiBcIlwiXG4gIHwgTGlzdCAoaGVhZCA6OiBhcmdzKSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGhlYWQgOjogYXJncyB9IC0+XG4gICAgcmVuZGVyX2xpc3RfdG9faHRtbCBoZWFkIGFyZ3MgZW52XG4gIHwgXyAtPlxuICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZW52KSBpblxuICAgIGRvX3JlbmRlcl90b19odG1sIHYgZW52XG5cbmFuZCByZW5kZXJfbGlzdF90b19odG1sIGhlYWQgYXJncyBlbnYgPVxuICBtYXRjaCBoZWFkIHdpdGhcbiAgfCBTeW1ib2wgXCI8PlwiIC0+XG4gICAgcmVuZGVyX2NoaWxkcmVuIGFyZ3MgZW52XG4gIHwgU3ltYm9sIFwicmF3IVwiIC0+XG4gICAgKCogSW5qZWN0IHByZS1yZW5kZXJlZCBIVE1MIHdpdGhvdXQgZXNjYXBpbmcgKilcbiAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QuaGQgYXJncykgKEVudiBlbnYpIGluXG4gICAgKG1hdGNoIHYgd2l0aFxuICAgICB8IFN0cmluZyBzIHwgUmF3SFRNTCBzIC0+IHNcbiAgICAgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyB2KVxuICB8IFN5bWJvbCB0YWcgd2hlbiBpc19odG1sX3RhZyB0YWcgLT5cbiAgICByZW5kZXJfaHRtbF9lbGVtZW50IHRhZyBhcmdzIGVudlxuICB8IFN5bWJvbCBcImlmXCIgLT5cbiAgICBsZXQgY29uZF92YWwgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0LmhkIGFyZ3MpIChFbnYgZW52KSBpblxuICAgIGlmIHN4X3RydXRoeSBjb25kX3ZhbCB0aGVuXG4gICAgICAoaWYgTGlzdC5sZW5ndGggYXJncyA+IDEgdGhlbiBkb19yZW5kZXJfdG9faHRtbCAoTGlzdC5udGggYXJncyAxKSBlbnYgZWxzZSBcIlwiKVxuICAgIGVsc2VcbiAgICAgIChpZiBMaXN0Lmxlbmd0aCBhcmdzID4gMiB0aGVuIGRvX3JlbmRlcl90b19odG1sIChMaXN0Lm50aCBhcmdzIDIpIGVudiBlbHNlIFwiXCIpXG4gIHwgU3ltYm9sIFwid2hlblwiIC0+XG4gICAgbGV0IGNvbmRfdmFsID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdC5oZCBhcmdzKSAoRW52IGVudikgaW5cbiAgICBpZiBzeF90cnV0aHkgY29uZF92YWwgdGhlblxuICAgICAgU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCAoZnVuIGUgLT4gZG9fcmVuZGVyX3RvX2h0bWwgZSBlbnYpIChMaXN0LnRsIGFyZ3MpKVxuICAgIGVsc2UgXCJcIlxuICB8IFN5bWJvbCBcImNvbmRcIiAtPlxuICAgIHJlbmRlcl9jb25kIGFyZ3MgZW52XG4gIHwgU3ltYm9sIFwiY2FzZVwiIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0IChoZWFkIDo6IGFyZ3MpKSAoRW52IGVudikgaW5cbiAgICBkb19yZW5kZXJfdG9faHRtbCB2IGVudlxuICB8IFN5bWJvbCAoXCJsZXRcIiB8IFwibGV0KlwiKSAtPlxuICAgIHJlbmRlcl9sZXQgYXJncyBlbnZcbiAgfCBTeW1ib2wgKFwiYmVnaW5cIiB8IFwiZG9cIikgLT5cbiAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgfCBbbGFzdF0gLT4gZG9fcmVuZGVyX3RvX2h0bWwgbGFzdCBlbnZcbiAgICAgIHwgZSA6OiByZXN0IC0+XG4gICAgICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciBlIChFbnYgZW52KSk7XG4gICAgICAgIGdvIHJlc3RcbiAgICBpbiBnbyBhcmdzXG4gIHwgU3ltYm9sIChcImRlZmluZVwiIHwgXCJkZWZjb21wXCIgfCBcImRlZm1hY3JvXCIgfCBcImRlZmlzbGFuZFwiKSAtPlxuICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoaGVhZCA6OiBhcmdzKSkgKEVudiBlbnYpKTtcbiAgICBcIlwiXG4gIHwgU3ltYm9sIFwibWFwXCIgLT5cbiAgICByZW5kZXJfbWFwIGFyZ3MgZW52IGZhbHNlXG4gIHwgU3ltYm9sIFwibWFwLWluZGV4ZWRcIiAtPlxuICAgIHJlbmRlcl9tYXAgYXJncyBlbnYgdHJ1ZVxuICB8IFN5bWJvbCBcImZpbHRlclwiIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0IChoZWFkIDo6IGFyZ3MpKSAoRW52IGVudikgaW5cbiAgICBkb19yZW5kZXJfdG9faHRtbCB2IGVudlxuICB8IFN5bWJvbCBcImZvci1lYWNoXCIgLT5cbiAgICByZW5kZXJfZm9yX2VhY2ggYXJncyBlbnZcbiAgfCBTeW1ib2wgbmFtZSAtPlxuICAgICh0cnlcbiAgICAgIGxldCB2ID0gZW52X2dldCBlbnYgbmFtZSBpblxuICAgICAgKG1hdGNoIHYgd2l0aFxuICAgICAgIHwgQ29tcG9uZW50IGMgd2hlbiBjLmNfYWZmaW5pdHkgPSBcImNsaWVudFwiIC0+IFwiXCIgICgqIHNraXAgY2xpZW50LW9ubHkgKilcbiAgICAgICB8IENvbXBvbmVudCBfIC0+IHJlbmRlcl9jb21wb25lbnQgdiBhcmdzIGVudlxuICAgICAgIHwgSXNsYW5kIF9pIC0+XG4gICAgICAgICAoKiBJc2xhbmRzOiBTU1IgdmlhIHRoZSBTWCByZW5kZXItdG8taHRtbCBmcm9tIGFkYXB0ZXItaHRtbC5zeC5cbiAgICAgICAgICAgIEl0IGhhbmRsZXMgZGVyZWYvc2lnbmFsL2NvbXB1dGVkIHRocm91Z2ggdGhlIENFSyBjb3JyZWN0bHksXG4gICAgICAgICAgICBhbmQgcmVuZGVycyBpc2xhbmQgYm9kaWVzIHdpdGggaHlkcmF0aW9uIG1hcmtlcnMuICopXG4gICAgICAgICAodHJ5XG4gICAgICAgICAgIGxldCBjYWxsX2V4cHIgPSBMaXN0IChTeW1ib2wgbmFtZSA6OiBhcmdzKSBpblxuICAgICAgICAgICBsZXQgcXVvdGVkID0gTGlzdCBbU3ltYm9sIFwicXVvdGVcIjsgY2FsbF9leHByXSBpblxuICAgICAgICAgICBsZXQgcmVuZGVyX2NhbGwgPSBMaXN0IFtTeW1ib2wgXCJyZW5kZXItdG8taHRtbFwiOyBxdW90ZWQ7IEVudiBlbnZdIGluXG4gICAgICAgICAgIGxldCByZXN1bHQgPSBTeF9yZWYuZXZhbF9leHByIHJlbmRlcl9jYWxsIChFbnYgZW52KSBpblxuICAgICAgICAgICAobWF0Y2ggcmVzdWx0IHdpdGhcbiAgICAgICAgICAgIHwgU3RyaW5nIHMgfCBSYXdIVE1MIHMgLT4gc1xuICAgICAgICAgICAgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyByZXN1bHQpXG4gICAgICAgICB3aXRoIGUgLT5cbiAgICAgICAgICAgUHJpbnRmLmVwcmludGYgXCJbc3NyLWlzbGFuZF0gfiVzIEZBSUxFRDogJXNcXG4lc1xcbiUhXCIgX2kuaV9uYW1lIChQcmludGV4Yy50b19zdHJpbmcgZSkgKFByaW50ZXhjLmdldF9iYWNrdHJhY2UgKCkpO1xuICAgICAgICAgICBcIlwiKVxuICAgICAgIHwgTWFjcm8gbSAtPlxuICAgICAgICAgbGV0IGV4cGFuZGVkID0gZXhwYW5kX21hY3JvIG0gYXJncyBlbnYgaW5cbiAgICAgICAgIGRvX3JlbmRlcl90b19odG1sIGV4cGFuZGVkIGVudlxuICAgICAgIHwgXyAtPlxuICAgICAgICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudilcbiAgICB3aXRoIEV2YWxfZXJyb3IgXyAtPlxuICAgICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudilcbiAgfCBfIC0+XG4gICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgIGRvX3JlbmRlcl90b19odG1sIHJlc3VsdCBlbnZcblxuYW5kIHJlbmRlcl9jb25kIGFyZ3MgZW52ID1cbiAgbGV0IGFzX2xpc3QgPSBmdW5jdGlvbiBMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0gLT4gU29tZSBsIHwgXyAtPiBOb25lIGluXG4gIGxldCBpc19zY2hlbWUgPSBMaXN0LmZvcl9hbGwgKGZ1biBhIC0+IG1hdGNoIGFzX2xpc3QgYSB3aXRoXG4gICAgfCBTb21lIGl0ZW1zIHdoZW4gTGlzdC5sZW5ndGggaXRlbXMgPSAyIC0+IHRydWVcbiAgICB8IF8gLT4gZmFsc2UpIGFyZ3NcbiAgaW5cbiAgaWYgaXNfc2NoZW1lIHRoZW4gYmVnaW5cbiAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgfCBjbGF1c2UgOjogcmVzdCAtPlxuICAgICAgICAobWF0Y2ggYXNfbGlzdCBjbGF1c2Ugd2l0aFxuICAgICAgICAgfCBTb21lIFt0ZXN0OyBib2R5XSAtPlxuICAgICAgICAgICBsZXQgaXNfZWxzZSA9IG1hdGNoIHRlc3Qgd2l0aFxuICAgICAgICAgICAgIHwgS2V5d29yZCBcImVsc2VcIiAtPiB0cnVlXG4gICAgICAgICAgICAgfCBTeW1ib2wgXCJlbHNlXCIgfCBTeW1ib2wgXCI6ZWxzZVwiIC0+IHRydWVcbiAgICAgICAgICAgICB8IF8gLT4gZmFsc2VcbiAgICAgICAgICAgaW5cbiAgICAgICAgICAgaWYgaXNfZWxzZSB0aGVuIGRvX3JlbmRlcl90b19odG1sIGJvZHkgZW52XG4gICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgdGVzdCAoRW52IGVudikgaW5cbiAgICAgICAgICAgICBpZiBzeF90cnV0aHkgdiB0aGVuIGRvX3JlbmRlcl90b19odG1sIGJvZHkgZW52XG4gICAgICAgICAgICAgZWxzZSBnbyByZXN0XG4gICAgICAgICB8IF8gLT4gXCJcIilcbiAgICBpbiBnbyBhcmdzXG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IFwiXCJcbiAgICAgIHwgW19dIC0+IFwiXCJcbiAgICAgIHwgdGVzdCA6OiBib2R5IDo6IHJlc3QgLT5cbiAgICAgICAgbGV0IGlzX2Vsc2UgPSBtYXRjaCB0ZXN0IHdpdGhcbiAgICAgICAgICB8IEtleXdvcmQgXCJlbHNlXCIgLT4gdHJ1ZVxuICAgICAgICAgIHwgU3ltYm9sIFwiZWxzZVwiIHwgU3ltYm9sIFwiOmVsc2VcIiAtPiB0cnVlXG4gICAgICAgICAgfCBfIC0+IGZhbHNlXG4gICAgICAgIGluXG4gICAgICAgIGlmIGlzX2Vsc2UgdGhlbiBkb19yZW5kZXJfdG9faHRtbCBib2R5IGVudlxuICAgICAgICBlbHNlXG4gICAgICAgICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIHRlc3QgKEVudiBlbnYpIGluXG4gICAgICAgICAgaWYgc3hfdHJ1dGh5IHYgdGhlbiBkb19yZW5kZXJfdG9faHRtbCBib2R5IGVudlxuICAgICAgICAgIGVsc2UgZ28gcmVzdFxuICAgIGluIGdvIGFyZ3NcbiAgZW5kXG5cbmFuZCByZW5kZXJfbGV0IGFyZ3MgZW52ID1cbiAgbGV0IGFzX2xpc3QgPSBmdW5jdGlvbiBMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0gLT4gU29tZSBsIHwgXyAtPiBOb25lIGluXG4gIGxldCBiaW5kaW5nc19leHByID0gTGlzdC5oZCBhcmdzIGluXG4gIGxldCBib2R5ID0gTGlzdC50bCBhcmdzIGluXG4gIGxldCBsb2NhbCA9IGVudl9leHRlbmQgZW52IGluXG4gIGxldCBiaW5kaW5ncyA9IG1hdGNoIGFzX2xpc3QgYmluZGluZ3NfZXhwciB3aXRoIFNvbWUgbCAtPiBsIHwgTm9uZSAtPiBbXSBpblxuICBsZXQgaXNfc2NoZW1lID0gbWF0Y2ggYmluZGluZ3Mgd2l0aFxuICAgIHwgKExpc3QgXyA6OiBfKSB8IChMaXN0UmVmIF8gOjogXykgLT4gdHJ1ZVxuICAgIHwgXyAtPiBmYWxzZVxuICBpblxuICBpZiBpc19zY2hlbWUgdGhlblxuICAgIExpc3QuaXRlciAoZnVuIGIgLT5cbiAgICAgIG1hdGNoIGFzX2xpc3QgYiB3aXRoXG4gICAgICB8IFNvbWUgW1N5bWJvbCBuYW1lOyBleHByXSB8IFNvbWUgW1N0cmluZyBuYW1lOyBleHByXSAtPlxuICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGxvY2FsKSBpblxuICAgICAgICBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIG5hbWUgdilcbiAgICAgIHwgXyAtPiAoKVxuICAgICkgYmluZGluZ3NcbiAgZWxzZSBiZWdpblxuICAgIGxldCByZWMgZ28gPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiAoKVxuICAgICAgfCAoU3ltYm9sIG5hbWUpIDo6IGV4cHIgOjogcmVzdCB8IChTdHJpbmcgbmFtZSkgOjogZXhwciA6OiByZXN0IC0+XG4gICAgICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgbG9jYWwpIGluXG4gICAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgbmFtZSB2KTtcbiAgICAgICAgZ28gcmVzdFxuICAgICAgfCBfIC0+ICgpXG4gICAgaW4gZ28gYmluZGluZ3NcbiAgZW5kO1xuICBsZXQgcmVjIHJlbmRlcl9ib2R5ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IFwiXCJcbiAgICB8IFtsYXN0XSAtPiBkb19yZW5kZXJfdG9faHRtbCBsYXN0IGxvY2FsXG4gICAgfCBlIDo6IHJlc3QgLT5cbiAgICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciBlIChFbnYgbG9jYWwpKTtcbiAgICAgIHJlbmRlcl9ib2R5IHJlc3RcbiAgaW4gcmVuZGVyX2JvZHkgYm9keVxuXG5hbmQgcmVuZGVyX21hcCBhcmdzIGVudiBpbmRleGVkID1cbiAgbGV0IChmbl92YWwsIGNvbGxfdmFsKSA9IG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgdmEgPSBTeF9yZWYuZXZhbF9leHByIGEgKEVudiBlbnYpIGluXG4gICAgICBsZXQgdmIgPSBTeF9yZWYuZXZhbF9leHByIGIgKEVudiBlbnYpIGluXG4gICAgICAobWF0Y2ggdmEsIHZiIHdpdGhcbiAgICAgICB8IChMYW1iZGEgXyB8IE5hdGl2ZUZuIF8pLCBfIC0+ICh2YSwgdmIpXG4gICAgICAgfCBfLCAoTGFtYmRhIF8gfCBOYXRpdmVGbiBfKSAtPiAodmIsIHZhKVxuICAgICAgIHwgXyAtPiAodmEsIHZiKSlcbiAgICB8IF8gLT4gKE5pbCwgTmlsKVxuICBpblxuICBsZXQgaXRlbXMgPSBtYXRjaCBjb2xsX3ZhbCB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwaSAoZnVuIGkgaXRlbSAtPlxuICAgIGxldCBjYWxsX2FyZ3MgPSBpZiBpbmRleGVkIHRoZW4gW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyBpdGVtXSBlbHNlIFtpdGVtXSBpblxuICAgIG1hdGNoIGZuX3ZhbCB3aXRoXG4gICAgfCBMYW1iZGEgbCAtPlxuICAgICAgbGV0IGxvY2FsID0gZW52X2V4dGVuZCBsLmxfY2xvc3VyZSBpblxuICAgICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgYSkpXG4gICAgICAgIGwubF9wYXJhbXMgY2FsbF9hcmdzO1xuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgbC5sX2JvZHkgbG9jYWxcbiAgICB8IF8gLT5cbiAgICAgIGxldCByZXN1bHQgPSBTeF9ydW50aW1lLnN4X2NhbGwgZm5fdmFsIGNhbGxfYXJncyBpblxuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudlxuICApIGl0ZW1zKVxuXG5hbmQgcmVuZGVyX2Zvcl9lYWNoIGFyZ3MgZW52ID1cbiAgbGV0IChmbl92YWwsIGNvbGxfdmFsKSA9IG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgdmEgPSBTeF9yZWYuZXZhbF9leHByIGEgKEVudiBlbnYpIGluXG4gICAgICBsZXQgdmIgPSBTeF9yZWYuZXZhbF9leHByIGIgKEVudiBlbnYpIGluXG4gICAgICAobWF0Y2ggdmEsIHZiIHdpdGhcbiAgICAgICB8IChMYW1iZGEgXyB8IE5hdGl2ZUZuIF8pLCBfIC0+ICh2YSwgdmIpXG4gICAgICAgfCBfLCAoTGFtYmRhIF8gfCBOYXRpdmVGbiBfKSAtPiAodmIsIHZhKVxuICAgICAgIHwgXyAtPiAodmEsIHZiKSlcbiAgICB8IF8gLT4gKE5pbCwgTmlsKVxuICBpblxuICBsZXQgaXRlbXMgPSBtYXRjaCBjb2xsX3ZhbCB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gaXRlbSAtPlxuICAgIG1hdGNoIGZuX3ZhbCB3aXRoXG4gICAgfCBMYW1iZGEgbCAtPlxuICAgICAgbGV0IGxvY2FsID0gZW52X2V4dGVuZCBsLmxfY2xvc3VyZSBpblxuICAgICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgYSkpXG4gICAgICAgIGwubF9wYXJhbXMgW2l0ZW1dO1xuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgbC5sX2JvZHkgbG9jYWxcbiAgICB8IF8gLT5cbiAgICAgIGxldCByZXN1bHQgPSBTeF9ydW50aW1lLnN4X2NhbGwgZm5fdmFsIFtpdGVtXSBpblxuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudlxuICApIGl0ZW1zKVxuXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFNldHVwIOKAlCBiaW5kIHJlbmRlciBwcmltaXRpdmVzIGluIGFuIGVudiBhbmQgd2lyZSB1cCB0aGUgcmVmICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IHNldHVwX3JlbmRlcl9lbnYgZW52ID1cbiAgcmVuZGVyX3RvX2h0bWxfcmVmIDo9IGRvX3JlbmRlcl90b19odG1sO1xuXG4gIGxldCBiaW5kIG5hbWUgZm4gPVxuICAgIGlnbm9yZSAoZW52X2JpbmQgZW52IG5hbWUgKE5hdGl2ZUZuIChuYW1lLCBmbikpKVxuICBpblxuXG4gIGJpbmQgXCJyZW5kZXItaHRtbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzcmNdIC0+XG4gICAgICBsZXQgZXhwcnMgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHNyYyBpblxuICAgICAgbGV0IGV4cHIgPSBtYXRjaCBleHBycyB3aXRoXG4gICAgICAgIHwgW2VdIC0+IGVcbiAgICAgICAgfCBbXSAtPiBOaWxcbiAgICAgICAgfCBfIC0+IExpc3QgKFN5bWJvbCBcImRvXCIgOjogZXhwcnMpXG4gICAgICBpblxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGVudilcbiAgICB8IFtleHByXSAtPlxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGVudilcbiAgICB8IFtleHByOyBFbnYgZV0gLT5cbiAgICAgIFN0cmluZyAocmVuZGVyX3RvX2h0bWwgZXhwciBlKVxuICAgIHwgXyAtPiBTdHJpbmcgXCJcIik7XG5cbiAgYmluZCBcInJlbmRlci10by1odG1sXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNyY10gLT5cbiAgICAgIGxldCBleHBycyA9IFN4X3BhcnNlci5wYXJzZV9hbGwgc3JjIGluXG4gICAgICBsZXQgZXhwciA9IG1hdGNoIGV4cHJzIHdpdGhcbiAgICAgICAgfCBbZV0gLT4gZVxuICAgICAgICB8IFtdIC0+IE5pbFxuICAgICAgICB8IF8gLT4gTGlzdCAoU3ltYm9sIFwiZG9cIiA6OiBleHBycylcbiAgICAgIGluXG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZW52KVxuICAgIHwgW2V4cHJdIC0+XG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZW52KVxuICAgIHwgW2V4cHI7IEVudiBlXSAtPlxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGUpXG4gICAgfCBfIC0+IFN0cmluZyBcIlwiKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2xpc3Rfb2ZfanNfYXJyYXkiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3RyYW1wb2xpbmUiLCJjYW1sX3RyYW1wb2xpbmVfcmV0dXJuIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJjYW1sX2NhbGwzIiwiYTIiLCJnbG9iYWxfZGF0YSIsImNzdF9iciIsImNzdF9jb2wiLCJjc3RfZW1iZWQiLCJjc3RfZmlsdGVyIiwiY3N0X2hyIiwiY3N0X2ltZyIsImNzdF9pbnB1dCIsImNzdF9saW5rIiwiY3N0X21ldGEiLCJjc3RfcGFyYW0iLCJjc3Rfc291cmNlIiwiY3N0X3diciIsImh0bWxfdGFncyIsInZvaWRfZWxlbWVudHMiLCJib29sZWFuX2F0dHJzIiwiU3hfcmVmIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliIiwiU3RkbGliX1ByaW50ZiIsIlN0ZGxpYl9MaXN0IiwiU3hfdHlwZXMiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX1ByaW50ZXhjIiwiU3hfcnVudGltZSIsIlN4X3BhcnNlciIsIlN0ZGxpYl9IYXNodGJsIiwiU3RkbGliX0J1ZmZlciIsImlzX2h0bWxfdGFnIiwibmFtZSIsImlzX3ZvaWQiLCJpc19ib29sZWFuX2F0dHIiLCJlc2NhcGVfaHRtbCIsInMiLCJidWYiLCJjIiwicmVuZGVyX2F0dHJzIiwiYXR0cnMiLCJrIiwidiIsImNzdCIsInJlbmRlcl90b19odG1sX3JlZiIsImV4cHIiLCJlbnYiLCJyZW5kZXJfdG9faHRtbCIsInJlbmRlcl9jaGlsZHJlbiIsImNoaWxkcmVuIiwicGFyc2VfZWxlbWVudF9hcmdzIiwiYXJncyIsImxlbiIsInNraXAiLCJpZHgiLCJhcmciLCJwYWlycyIsInBhcmFtIiwicmVuZGVyX2h0bWxfZWxlbWVudCIsInRhZyIsIm1hdGNoIiwiYXR0cl9zdHIiLCJjb250ZW50IiwicmVuZGVyX2NvbXBvbmVudCIsImNvbXAiLCJrd2FyZ3MiLCJjaGlsZHJlbl9leHBycyIsImxvY2FsIiwicCIsInJlbmRlcmVkX2NoaWxkcmVuIiwiZXhwYW5kX21hY3JvIiwibSIsInBhcmFtcyIsInBzIiwiYXMiLCJycCIsInBzX3Jlc3QiLCJhc19yZXN0IiwiYSIsImRvX3JlbmRlcl90b19odG1sIiwiY291bnRlciIsIm4iLCJoZWFkIiwiY3N0X2RvIiwiY3N0X3JlbmRlcl90b19odG1sIiwicmVuZGVyX2xpc3RfdG9faHRtbCIsInN3aXRjaCQiLCJjb25kX3ZhbCIsImUiLCJsYXN0IiwicmVzdCIsImkiLCJjYWxsX2V4cHIiLCJyZW5kZXJfY2FsbCIsInJlc3VsdCIsImV4cGFuZGVkIiwiZXhuIiwicmVuZGVyX2NvbmQiLCJhc19saXN0IiwibCIsImlzX3NjaGVtZSIsIml0ZW1zIiwiY3N0X2Vsc2UiLCJjbGF1c2UiLCJib2R5IiwidGVzdCIsImlzX2Vsc2UiLCJyZW5kZXJfbGV0IiwiYmluZGluZ3NfZXhwciIsImJpbmRpbmdzIiwiYiIsInJlbmRlcl9tYXAiLCJpbmRleGVkIiwidmEiLCJ2YiIsImNvbGxfdmFsIiwiZm5fdmFsIiwiaXRlbSIsImNhbGxfYXJncyIsInJlbmRlcl9mb3JfZWFjaCIsInNldHVwX3JlbmRlcl9lbnYiLCJiaW5kIiwiZm4iLCJzcmMiLCJleHBycyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyx5QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBSixHQUFBQyxJQUFBRSxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDO0FBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJ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Y0FHakI7QUFBQSxtQkFBQU4sT0FBQTtBQUFBO0FBQUEsb0JBQUE4RSxNQUFBLFNBQUFDLFFBRWM7QUFBQSxnQkFDWjtBQUFBO0FBQUEsc0JBQUEvRSxTQUdTO0FBQUE7QUFBQSxzQkFBQTJDLE1BSFQsVUFBQTNDLFNBQ1c7QUFBQTtBQUFBLHFCQUFBQSxTQUNEO0FBQUEsZ0JBR0gsdUNBQXlCO0FBQUE7QUFBQSxtQkFBQWUsUUFSbEM7QUFBQSwyQkFVUyxxQ0FBeUI7QUFBQSx1QkFWbEM7QUFBQSwwRUFBQTRCLElBQUEsTUFZUyxtQ0FBdUI7QUFBQTtBQUFBLGNBQ3pCO0FBQUEsYUFBUyxFQUFDO0FBQUE7QUFBQSxHRHhjckIiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNTU5MiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJqc29vX3J1bnRpbWUuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSJdLCJuYW1lcyI6WyJydW50aW1lIl0sIm1hcHBpbmdzIjoiT0FBQUEsVUFBQSIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjM1NjA1LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6Impzb29fcnVudGltZS5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxubW9kdWxlIEpzID0gc3RydWN0XG4gIHR5cGUgdFxuXG4gIHR5cGUgJ2EganNfYXJyYXkgPSB0XG5cbiAgdHlwZSAoJ2EsICdiKSBtZXRoX2NhbGxiYWNrID0gdFxuXG4gIGV4dGVybmFsIHN0cmluZyA6IHN0cmluZyAtPiB0ID0gXCJjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgdG9fc3RyaW5nIDogdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXCJcblxuICBleHRlcm5hbCBieXRlc3RyaW5nIDogc3RyaW5nIC0+IHQgPSBcImNhbWxfanNieXRlc19vZl9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIHRvX2J5dGVzdHJpbmcgOiB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNieXRlc1wiXG5cbiAgZXh0ZXJuYWwgYm9vbCA6IGJvb2wgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2Jvb2xcIlxuXG4gIGV4dGVybmFsIHRvX2Jvb2wgOiB0IC0+IGJvb2wgPSBcImNhbWxfanNfdG9fYm9vbFwiXG5cbiAgZXh0ZXJuYWwgYXJyYXkgOiAnYSBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fYXJyYXlcIlxuXG4gIGV4dGVybmFsIHRvX2FycmF5IDogdCAtPiAnYSBhcnJheSA9IFwiY2FtbF9qc190b19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgbnVtYmVyX29mX2Zsb2F0IDogZmxvYXQgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2Zsb2F0XCJcblxuICBleHRlcm5hbCBmbG9hdF9vZl9udW1iZXIgOiB0IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuICBleHRlcm5hbCBudW1iZXJfb2ZfaW50MzIgOiBpbnQzMiAtPiB0ID0gXCJjYW1sX2pzX2Zyb21faW50MzJcIlxuXG4gIGV4dGVybmFsIGludDMyX29mX251bWJlciA6IHQgLT4gaW50MzIgPSBcImNhbWxfanNfdG9faW50MzJcIlxuXG4gIGV4dGVybmFsIG51bWJlcl9vZl9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgLT4gdCA9IFwiY2FtbF9qc19mcm9tX25hdGl2ZWludFwiXG5cbiAgZXh0ZXJuYWwgbmF0aXZlaW50X29mX251bWJlciA6IHQgLT4gbmF0aXZlaW50ID0gXCJjYW1sX2pzX3RvX25hdGl2ZWludFwiXG5cbiAgZXh0ZXJuYWwgdHlwZW9mIDogdCAtPiB0ID0gXCJjYW1sX2pzX3R5cGVvZlwiXG5cbiAgZXh0ZXJuYWwgaW5zdGFuY2VvZiA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX2luc3RhbmNlb2ZcIlxuXG4gIGV4dGVybmFsIGRlYnVnZ2VyIDogdW5pdCAtPiB1bml0ID0gXCJkZWJ1Z2dlclwiXG5cbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiB0IC0+IHQgPSBcImNhbWxfanNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXQgOiB0IC0+IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2pzX3NldFwiXG5cbiAgZXh0ZXJuYWwgZGVsZXRlIDogdCAtPiB0IC0+IHVuaXQgPSBcImNhbWxfanNfZGVsZXRlXCJcblxuICBleHRlcm5hbCBjYWxsIDogdCAtPiB0IC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19jYWxsXCJcblxuICBleHRlcm5hbCBmdW5fY2FsbCA6IHQgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2Z1bl9jYWxsXCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGwgOiB0IC0+IHN0cmluZyAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfbWV0aF9jYWxsXCJcblxuICBleHRlcm5hbCBuZXdfb2JqIDogdCAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfbmV3XCJcblxuICBleHRlcm5hbCBuZXdfb2JqX2FyciA6IHQgLT4gdCBqc19hcnJheSAtPiB0ID0gXCJjYW1sX29qc19uZXdfYXJyXCJcblxuICBleHRlcm5hbCBvYmogOiAoc3RyaW5nICogdCkgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19vYmplY3RcIlxuXG4gIGV4dGVybmFsIGVxdWFscyA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgZXh0ZXJuYWwgc3RyaWN0X2VxdWFscyA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuXG4gIGV4dGVybmFsIHB1cmVfZXhwciA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9qc19wdXJlX2V4cHJcIlxuXG4gIGV4dGVybmFsIGV2YWxfc3RyaW5nIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V2YWxfc3RyaW5nXCJcblxuICBleHRlcm5hbCBqc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V4cHJcIlxuXG4gIGV4dGVybmFsIHB1cmVfanNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9wdXJlX2pzX2V4cHJcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrIDogKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmVcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAodCBqc19hcnJheSAtPiAnYikgLT4gKCdjLCB0IGpzX2FycmF5IC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3RcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbGJhY2sgOiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlXCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgKCdiIC0+IHQganNfYXJyYXkgLT4gJ2EpIC0+ICgnYiwgdCBqc19hcnJheSAtPiAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gIGV4dGVybmFsIHdyYXBfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrXCJcblxuICBleHRlcm5hbCB3cmFwX21ldGhfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYSwgJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHJ1bnRpbWVfdmFsdWUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNvb19ydW50aW1lX3ZhbHVlXCJcbiAgKCoqIFtydW50aW1lX3ZhbHVlIFwiRk9PXCJdIHJldHVybnMgdGhlIEphdmFTY3JpcHQgdmFsdWUgRk9PIHByb3ZpZGVkIGJ5IHRoZSBKYXZhU2NyaXB0IHJ1bnRpbWUgKHdpdGggJy8vUHJvdmlkZXM6IEZPTycpLiBUaGUgc3RyaW5nIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbC4gKilcblxuICBleHRlcm5hbCBjdXN0b21faWRlbnRpZmllciA6IE9iai50IC0+IHN0cmluZyA9IFwiY2FtbF9jdXN0b21faWRlbnRpZmllclwiXG5lbmRcblxubW9kdWxlIFN5cyA9IHN0cnVjdFxuICB0eXBlICdhIGNhbGxiYWNrID0gJ2FcblxuICBleHRlcm5hbCBjcmVhdGVfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IGNvbnRlbnQ6c3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfY3JlYXRlX2ZpbGVcIlxuXG4gIGV4dGVybmFsIHJlYWRfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IHN0cmluZyA9IFwiY2FtbF9yZWFkX2ZpbGVfY29udGVudFwiXG5cbiAgZXh0ZXJuYWwgc2V0X2NoYW5uZWxfb3V0cHV0JyA6IG91dF9jaGFubmVsIC0+IChqc19zdHJpbmc6SnMudCAtPiB1bml0KSBjYWxsYmFjayAtPiB1bml0XG4gICAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XCJcblxuICBleHRlcm5hbCBzZXRfY2hhbm5lbF9pbnB1dCcgOiBpbl9jaGFubmVsIC0+ICh1bml0IC0+IHN0cmluZykgY2FsbGJhY2sgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbFwiXG5cbiAgZXh0ZXJuYWwgbW91bnRfcG9pbnQgOiB1bml0IC0+IHN0cmluZyBsaXN0ID0gXCJjYW1sX2xpc3RfbW91bnRfcG9pbnRcIlxuXG4gIGV4dGVybmFsIG1vdW50X2F1dG9sb2FkIDogc3RyaW5nIC0+IChzdHJpbmcgLT4gc3RyaW5nIC0+IHN0cmluZyBvcHRpb24pIGNhbGxiYWNrIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tb3VudF9hdXRvbG9hZFwiXG5cbiAgZXh0ZXJuYWwgdW5tb3VudCA6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3VubW91bnRcIlxuXG4gIHR5cGUgcmVkaXJlY3Rpb25cblxuICBleHRlcm5hbCByZWRpcmVjdF9jaGFubmVsIDogb3V0X2NoYW5uZWwgLT4gaW50bzpvdXRfY2hhbm5lbCAtPiByZWRpcmVjdGlvblxuICAgID0gXCJjYW1sX21sX2NoYW5uZWxfcmVkaXJlY3RcIlxuXG4gIGV4dGVybmFsIHJlc3RvcmVfY2hhbm5lbCA6IG91dF9jaGFubmVsIC0+IHJlZGlyZWN0aW9uIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3Jlc3RvcmVcIlxuXG4gIG1vZHVsZSBDb25maWcgPSBzdHJ1Y3RcbiAgICBleHRlcm5hbCB1c2VfanNfc3RyaW5nIDogdW5pdCAtPiBib29sID0gXCJjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZ1wiXG5cbiAgICB0eXBlIGVmZmVjdHNfYmFja2VuZCA9XG4gICAgICBbIGBEaXNhYmxlZFxuICAgICAgfCBgQ3BzXG4gICAgICB8IGBEb3VibGVfdHJhbnNsYXRpb25cbiAgICAgIF1cblxuICAgIGV4dGVybmFsIGVmZmVjdHNfIDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfanNvb19mbGFnc19lZmZlY3RzXCJcblxuICAgIGxldCBlZmZlY3RzICgpID1cbiAgICAgIG1hdGNoIGVmZmVjdHNfICgpIHdpdGhcbiAgICAgIHwgXCJkaXNhYmxlZFwiIC0+IGBEaXNhYmxlZFxuICAgICAgfCBcImNwc1wiIC0+IGBDcHNcbiAgICAgIHwgXCJkb3VibGUtdHJhbnNsYXRpb25cIiAtPiBgRG91YmxlX3RyYW5zbGF0aW9uXG4gICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG4gIGVuZFxuXG4gIGxldCB2ZXJzaW9uID0gUnVudGltZV92ZXJzaW9uLnNcblxuICBsZXQgZ2l0X3ZlcnNpb24gPSBSdW50aW1lX3ZlcnNpb24uZ2l0X3ZlcnNpb25cbmVuZFxuXG5tb2R1bGUgRXJyb3IgOiBzaWdcbiAgdHlwZSB0XG5cbiAgdmFsIHJhaXNlXyA6IHQgLT4gJ2FcblxuICB2YWwgYXR0YWNoX2pzX2JhY2t0cmFjZSA6IGV4biAtPiBmb3JjZTpib29sIC0+IGV4blxuICAoKiogQXR0YWNoIGEgSmF2YVNjcmlwdCBlcnJvciB0byBhbiBPQ2FtbCBleGNlcHRpb24uICBpZiBbZm9yY2UgPSBmYWxzZV0gYW5kIGFcbiAgICBKYXZhU2NyaXB0IGVycm9yIGlzIGFscmVhZHkgYXR0YWNoZWQsIGl0IHdpbGwgZG8gbm90aGluZy4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG9cbiAgICBzdG9yZSBhbmQgcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgSmF2YVNjcmlwdCBzdGFjayB0cmFjZXMuXG5cbiAgICBBdHRhY2hpbmcgSmF2YVNjcmlwdCBlcnJvcnMgd2lsbCBoYXBwZW4gYXV0b21hdGljYWxseSB3aGVuIGNvbXBpbGluZyB3aXRoXG4gICAgWy0tZW5hYmxlIHdpdGgtanMtZXJyb3JdLiAqKVxuXG4gIHZhbCBvZl9leG4gOiBleG4gLT4gdCBvcHRpb25cbiAgKCoqIEV4dHJhY3QgYSBKYXZhU2NyaXB0IGVycm9yIGF0dGFjaGVkIHRvIGFuIE9DYW1sIGV4Y2VwdGlvbiwgaWYgYW55LiAgVGhpcyBpcyB1c2VmdWwgdG9cbiAgICAgIGluc3BlY3QgYW4gZXZlbnR1YWwgc3RhY2sgdHJhY2UsIGVzcGVjaWFsbHkgd2hlbiBzb3VyY2VtYXAgaXMgZW5hYmxlZC4gKilcblxuICBleGNlcHRpb24gRXhuIG9mIHRcbiAgKCoqIFRoZSBbRXJyb3JdIGV4Y2VwdGlvbiB3cmFwIGphdmFzY3JpcHQgZXhjZXB0aW9ucyB3aGVuIGNhdWdodCBieSBPQ2FtbCBjb2RlLlxuICAgICAgSW4gY2FzZSB0aGUgamF2YXNjcmlwdCBleGNlcHRpb24gaXMgbm90IGFuIGluc3RhbmNlIG9mIGphdmFzY3JpcHQgW0Vycm9yXSxcbiAgICAgIGl0IHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgd3JhcHBlZCBpbnRvIGEgW0ZhaWx1cmVdIGV4Y2VwdGlvbi5cbiAgKilcbmVuZCA9IHN0cnVjdFxuICB0eXBlIHRcblxuICBleGNlcHRpb24gRXhuIG9mIHRcblxuICBsZXQgXyA9IENhbGxiYWNrLnJlZ2lzdGVyX2V4Y2VwdGlvbiBcImpzRXJyb3JcIiAoRXhuIChPYmoubWFnaWMgW3x8XSkpXG5cbiAgZXh0ZXJuYWwgcmFpc2VfIDogdCAtPiAnYSA9IFwiY2FtbF90aHJvd19qc19leGNlcHRpb25cIlxuXG4gIGV4dGVybmFsIG9mX2V4biA6IGV4biAtPiB0IG9wdGlvbiA9IFwiY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXCJcblxuICBleHRlcm5hbCBhdHRhY2hfanNfYmFja3RyYWNlIDogZXhuIC0+IGZvcmNlOmJvb2wgLT4gZXhuID0gXCJjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVwiXG5lbmRcblxuW0BAQG9jYW1sLndhcm5pbmcgXCItMzItNjBcIl1cblxubW9kdWxlIEZvcl9jb21wYXRpYmlsaXR5X29ubHkgPSBzdHJ1Y3RcbiAgKCogQWRkIHByaW1pdGl2ZXMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gRXhpc3RpbmcgdXNlcnMgbWlnaHRcbiAgICAgZGVwZW5kIG9uIGl0IChlLmcuIGdlbl9qc19hcGkpLCB3ZSBkb24ndCB3YW50IHRoZSBvY2FtbCBjb21waWxlclxuICAgICB0byBjb21wbGFpbiBhYm91dCB0aGVzZSBtaXNzaW5nIHByaW1pdGl2ZXMuICopXG5cbiAgZXh0ZXJuYWwgY2FtbF9qc19mcm9tX3N0cmluZyA6IHN0cmluZyAtPiBKcy50ID0gXCJjYW1sX2pzX2Zyb21fc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nIDogSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfanNfdG9fYnl0ZV9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfanNfdG9fc3RyaW5nIDogSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfanNfdG9fc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2xpc3Rfb2ZfanNfYXJyYXkgOiAnYSBKcy5qc19hcnJheSAtPiAnYSBsaXN0ID0gXCJjYW1sX2xpc3Rfb2ZfanNfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGNhbWxfbGlzdF90b19qc19hcnJheSA6ICdhIGxpc3QgLT4gJ2EgSnMuanNfYXJyYXkgPSBcImNhbWxfbGlzdF90b19qc19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdmFyaWFibGUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfdmFyXCJcblxuICBleHRlcm5hbCBjYW1sX3N0cmluZ19vZl9hcnJheSA6ICdhIGFycmF5IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfYXJyYXlcIlxuZW5kXG5cbm1vZHVsZSBUeXBlZF9hcnJheSA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHR5cGVkQXJyYXkgPSBKcy50XG5cbiAgdHlwZSBhcnJheUJ1ZmZlciA9IEpzLnRcblxuICB0eXBlIHVpbnQ4QXJyYXkgPSBKcy50XG5cbiAgZXh0ZXJuYWwga2luZCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgLT4gKCdhLCAnYikgQmlnYXJyYXkua2luZFxuICAgID0gXCJjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGZyb21fZ2VuYXJyYXkgOlxuICAgICgnYSwgJ2IsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5HZW5hcnJheS50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXlcbiAgICA9IFwiY2FtbF9iYV90b190eXBlZF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdG9fZ2VuYXJyYXkgOlxuICAgICgnYSwgJ2IpIHR5cGVkQXJyYXkgLT4gKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnRcbiAgICA9IFwiY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5XCJcblxuICBtb2R1bGUgQmlnc3RyaW5nID0gc3RydWN0XG4gICAgdHlwZSB0ID0gKGNoYXIsIEJpZ2FycmF5LmludDhfdW5zaWduZWRfZWx0LCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuQXJyYXkxLnRcblxuICAgIGV4dGVybmFsIHRvX2FycmF5QnVmZmVyIDogdCAtPiBhcnJheUJ1ZmZlciA9IFwiYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlclwiXG5cbiAgICBleHRlcm5hbCB0b191aW50OEFycmF5IDogdCAtPiB1aW50OEFycmF5ID0gXCJiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXlcIlxuXG4gICAgZXh0ZXJuYWwgb2ZfYXJyYXlCdWZmZXIgOiBhcnJheUJ1ZmZlciAtPiB0ID0gXCJiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyXCJcblxuICAgIGV4dGVybmFsIG9mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IC0+IHQgPSBcImJpZ3N0cmluZ19vZl90eXBlZF9hcnJheVwiXG4gIGVuZFxuXG4gIGV4dGVybmFsIHN0cmluZ19vZl91aW50OEFycmF5IDogdWludDhBcnJheSAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XCJcblxuICBleHRlcm5hbCBieXRlc19vZl91aW50OEFycmF5IDogdWludDhBcnJheSAtPiBieXRlcyA9IFwiY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdWludDhBcnJheV9vZl9ieXRlcyA6IGJ5dGVzIC0+IHVpbnQ4QXJyYXkgPSBcImNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcIlxuZW5kXG5cbm1vZHVsZSBJbnQ2NCA9IHN0cnVjdFxuICBleHRlcm5hbCBjcmVhdGVfaW50NjRfbG9fbWlfaGkgOiBpbnQgLT4gaW50IC0+IGludCAtPiBJbnQ2NC50XG4gICAgPSBcImNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpXCJcbmVuZFxuXG5tb2R1bGUgRWZmZWN0IDogc2lnXG4gIGV4dGVybmFsIGFzc3VtZV9ub19wZXJmb3JtIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2Fzc3VtZV9ub19wZXJmb3JtXCJcbiAgKCoqIFBhc3NpbmcgYSBmdW5jdGlvbiBbZl0gYXMgYXJndW1lbnQgb2YgYGFzc3VtZV9ub19wZXJmb3JtYCBndWFyYW50ZWVzIHRoYXQsXG4gICAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGAtLWVmZmVjdHM9ZG91YmxlLXRyYW5zbGF0aW9uYCwgdGhlIGRpcmVjdC1zdHlsZVxuICAgICAgdmVyc2lvbiBvZiBbZl0gaXMgY2FsbGVkLCB3aGljaCBpcyBmYXN0ZXIgdGhhbiB0aGUgQ1BTIHZlcnNpb24uIEFzIGFcbiAgICAgIGNvbnNlcXVlbmNlLCBwZXJmb3JtaW5nIGFuIGVmZmVjdCBpbiBhIHRyYW5zaXRpdmUgY2FsbGVlIG9mIFtmXSB3aWxsXG4gICAgICByYWlzZSBgRWZmZWN0LlVuaGFuZGxlZGAsIHJlZ2FyZGxlc3Mgb2YgYW55IGVmZmVjdCBoYW5kbGVycyBpbnN0YWxsZWRcbiAgICAgIGJlZm9yZSB0aGUgY2FsbCB0byBgYXNzdW1lX25vX3BlcmZvcm1gLCB1bmxlc3MgYSBuZXcgZWZmZWN0IGhhbmRsZXIgd2FzXG4gICAgICBpbnN0YWxsZWQgaW4gdGhlIG1lYW50aW1lLlxuXG4gICAgICBUaGlzIGJlaGF2aW91ciBpcyB0aGUgc2FtZSB3aGVuIGRvdWJsZSB0cmFuc2xhdGlvbiBpcyBkaXNhYmxlZC4gKilcbmVuZCA9IHN0cnVjdFxuICBleHRlcm5hbCBhc3N1bWVfbm9fcGVyZm9ybSA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9hc3N1bWVfbm9fcGVyZm9ybVwiXG5lbmRcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiZ2xvYmFsX2RhdGEiLCJBc3NlcnRfZmFpbHVyZSIsIkpzb29fcnVudGltZV9SdW50aW1lX3ZlcnNpb24iLCJTdGRsaWJfQ2FsbGJhY2siLCJlZmZlY3RzIiwicGFyYW0iLCJtYXRjaCIsInZlcnNpb24iLCJnaXRfdmVyc2lvbiIsIkV4biIsIkVycm9yIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsK0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBO0FBQUEsWUFBQUMsUUFBQUM7QUFBQUEsUUFBQUMsUUNpS1k7QUFBQSxJQUFXLG9CQUVOO0FBQUEsSUFGTSx5QkFDRDtBQUFBLElBREM7QUFBQSxLQUlWO0FBQUEsSUFEbUI7QUFBQSxHQUNQO0FBQUE7QUFBQSxJQUFBQyxVRHJLekI7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLEdDd01VO0FBQUE7QUFBQSxJQUFBQztBQUFBQSxNQUE0RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR4TXRFIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzU2NTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNfb2Zfb2NhbWwuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9qc19vZl9vY2FtbC9pbXBvcnQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiBKc19vZl9vY2FtbFxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCA8ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuXG4gIGV4dGVybmFsICggPD0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcblxuICBleHRlcm5hbCAoID49ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcblxuICBleHRlcm5hbCBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbiAgZXh0ZXJuYWwgZXF1YWwgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZW5kXG5cbm1vZHVsZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGV4dGVybmFsICggPCApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuXG4gIGV4dGVybmFsICggPD0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA8PiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuXG4gIGV4dGVybmFsICggPj0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbiAgZXh0ZXJuYWwgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgbGV0IG1heCAoeCA6IGludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbiAgbGV0IG1pbiAoeCA6IGludCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIFN0cmluZyA9IHN0cnVjdFxuICBpbmNsdWRlIFN0cmluZ1xuXG4gIGxldCBlcXVhbCAoeCA6IHN0cmluZykgKHkgOiBzdHJpbmcpID0gUG9seS5lcXVhbCB4IHlcbmVuZFxuXG5tb2R1bGUgQ2hhciA9IHN0cnVjdFxuICBpbmNsdWRlIENoYXJcblxuICBsZXQgZXF1YWwgKHggOiBjaGFyKSAoeSA6IGNoYXIpID0gUG9seS5lcXVhbCB4IHlcbmVuZFxuXG5pbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX0NoYXIiLCJtYXgiLCJ4IiwieSIsIm1pbiIsIm1ha2UiLCJpbml0IiwiZW1wdHkiLCJvZl9ieXRlcyIsInRvX2J5dGVzIiwiYmxpdCIsImNvbmNhdCIsImNhdCIsImNvbXBhcmUiLCJzdGFydHNfd2l0aCIsImVuZHNfd2l0aCIsImNvbnRhaW5zX2Zyb20iLCJyY29udGFpbnNfZnJvbSIsImNvbnRhaW5zIiwic3ViIiwic3BsaXRfb25fY2hhciIsIm1hcCIsIm1hcGkiLCJmb2xkX2xlZnQiLCJmb2xkX3JpZ2h0IiwiZm9yX2FsbCIsImV4aXN0cyIsInRyaW0iLCJlc2NhcGVkIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsIml0ZXIiLCJpdGVyaSIsImluZGV4X2Zyb20iLCJpbmRleF9mcm9tX29wdCIsInJpbmRleF9mcm9tIiwicmluZGV4X2Zyb21fb3B0IiwiaW5kZXgiLCJpbmRleF9vcHQiLCJyaW5kZXgiLCJyaW5kZXhfb3B0IiwidG9fc2VxIiwidG9fc2VxaSIsIm9mX3NlcSIsImdldF91dGZfOF91Y2hhciIsImlzX3ZhbGlkX3V0Zl84IiwiZ2V0X3V0Zl8xNmJlX3VjaGFyIiwiaXNfdmFsaWRfdXRmXzE2YmUiLCJnZXRfdXRmXzE2bGVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZsZSIsImdldF91aW50OCIsImdldF9pbnQ4IiwiZ2V0X3VpbnQxNl9uZSIsImdldF91aW50MTZfYmUiLCJnZXRfdWludDE2X2xlIiwiZ2V0X2ludDE2X25lIiwiZ2V0X2ludDE2X2JlIiwiZ2V0X2ludDE2X2xlIiwiZ2V0X2ludDMyX25lIiwiaGFzaCIsInNlZWRlZF9oYXNoIiwiZ2V0X2ludDMyX2JlIiwiZ2V0X2ludDMyX2xlIiwiZ2V0X2ludDY0X25lIiwiZ2V0X2ludDY0X2JlIiwiZ2V0X2ludDY0X2xlIiwiZXF1YWwiLCJjaHIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLFlBQUFDLElBQUFDLEdBQUFDLEdDcUR3QixxQkFBdUI7QUFBQSxZQUFBQyxJQUFBRixHQUFBQyxHQUV2QixxQkFBdUI7QUFBQTtBQUFBLElBQUFFLE9EdkQvQztBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLFFBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsVUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBekMsWUFBQTtBQUFBLElBQUFFLG9CQUFBO0FBQUEsSUFBQUQsb0JBQUE7QUFBQSxJQUFBaEIsWUFBQTtBQUFBLElBQUFpRCxnQkFBQTtBQUFBLElBQUFELFNBQUE7QUFBQSxZQUFBTyxRQUFBbEUsR0FBQUMsR0NtRW9DLHVCQUFjO0FBQUEsR0RuRWxEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzU4MjUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNfb2Zfb2NhbWwuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9qc19vZl9vY2FtbC9qcy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbigqIFRoaXMgbG9jYWwgbW9kdWxlIFtKc10gaXMgbmVlZGVkIHNvIHRoYXQgdGhlIHBweF9qcyBleHRlbnNpb24gd29yayB3aXRoaW4gdGhhdCBmaWxlLiAqKVxubW9kdWxlIEpzID0gc3RydWN0XG4gIHR5cGUgKydhIHRcblxuICB0eXBlICgtJ2EsICsnYikgbWV0aF9jYWxsYmFja1xuXG4gIG1vZHVsZSBVbnNhZmUgPSBzdHJ1Y3RcbiAgICB0eXBlIHRvcFxuXG4gICAgdHlwZSBhbnkgPSB0b3AgdFxuXG4gICAgdHlwZSBhbnlfanNfYXJyYXkgPSBhbnlcblxuICAgIGV4dGVybmFsIGluamVjdCA6ICdhIC0+IGFueSA9IFwiJWlkZW50aXR5XCJcblxuICAgIGV4dGVybmFsIGNvZXJjZSA6IF8gdCAtPiBfIHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgICBleHRlcm5hbCBnZXQgOiAnYSAtPiAnYiAtPiAnYyA9IFwiY2FtbF9qc19nZXRcIlxuXG4gICAgZXh0ZXJuYWwgc2V0IDogJ2EgLT4gJ2IgLT4gJ2MgLT4gdW5pdCA9IFwiY2FtbF9qc19zZXRcIlxuXG4gICAgZXh0ZXJuYWwgZGVsZXRlIDogJ2EgLT4gJ2IgLT4gdW5pdCA9IFwiY2FtbF9qc19kZWxldGVcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbCA6ICdhIC0+ICdiIC0+IGFueSBhcnJheSAtPiAnYyA9IFwiY2FtbF9qc19jYWxsXCJcblxuICAgIGV4dGVybmFsIGZ1bl9jYWxsIDogJ2EgLT4gYW55IGFycmF5IC0+ICdiID0gXCJjYW1sX2pzX2Z1bl9jYWxsXCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbCA6ICdhIC0+IHN0cmluZyAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfbWV0aF9jYWxsXCJcblxuICAgIGV4dGVybmFsIG5ld19vYmogOiAnYSAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfbmV3XCJcblxuICAgIGV4dGVybmFsIG5ld19vYmpfYXJyIDogJ2EgLT4gYW55X2pzX2FycmF5IC0+ICdiID0gXCJjYW1sX29qc19uZXdfYXJyXCJcblxuICAgIGV4dGVybmFsIG9iaiA6IChzdHJpbmcgKiBhbnkpIGFycmF5IC0+ICdhID0gXCJjYW1sX2pzX29iamVjdFwiXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiAnYSAtPiAnYiAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogJ2EgLT4gJ2IgLT4gYm9vbCA9IFwiY2FtbF9qc19zdHJpY3RfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHB1cmVfZXhwciA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9qc19wdXJlX2V4cHJcIlxuXG4gICAgZXh0ZXJuYWwgZXZhbF9zdHJpbmcgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXZhbF9zdHJpbmdcIlxuXG4gICAgZXh0ZXJuYWwganNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19leHByXCJcblxuICAgIGV4dGVybmFsIHB1cmVfanNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9wdXJlX2pzX2V4cHJcIlxuXG4gICAgbGV0IGdsb2JhbCA9IHB1cmVfanNfZXhwciBcImdsb2JhbFRoaXNcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlXCJcblxuICAgIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAgIChhbnlfanNfYXJyYXkgLT4gJ2IpIC0+ICgnYywgYW55X2pzX2FycmF5IC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgICBleHRlcm5hbCBjYWxsYmFja193aXRoX2FyaXR5IDogaW50IC0+ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3RcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFjayA6ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0XCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICAgKCdiIC0+IGFueV9qc19hcnJheSAtPiAnYSkgLT4gKCdiLCBhbnlfanNfYXJyYXkgLT4gJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gICAgZXh0ZXJuYWwgcnVudGltZV92YWx1ZSA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc29vX3J1bnRpbWVfdmFsdWVcIlxuXG4gICAgKCogREVQUkVDQVRFRCAqKVxuICAgIGV4dGVybmFsIHZhcmlhYmxlIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX3ZhclwiXG4gIGVuZFxuXG4gICgqKioqKVxuXG4gIHR5cGUgJ2Egb3B0ID0gJ2FcblxuICB0eXBlICdhIG9wdGRlZiA9ICdhXG5cbiAgZXh0ZXJuYWwgZGVidWdnZXIgOiB1bml0IC0+IHVuaXQgPSBcImRlYnVnZ2VyXCJcblxuICBsZXQgbnVsbCA6ICdhIG9wdCA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJudWxsXCJcblxuICBleHRlcm5hbCBzb21lIDogJ2EgLT4gJ2Egb3B0ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCB1bmRlZmluZWQgOiAnYSBvcHRkZWYgPSBVbnNhZmUucHVyZV9qc19leHByIFwidW5kZWZpbmVkXCJcblxuICBleHRlcm5hbCBkZWYgOiAnYSAtPiAnYSBvcHRkZWYgPSBcIiVpZGVudGl0eVwiXG5cbiAgbW9kdWxlIHR5cGUgT1BUID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgZW1wdHkgOiAnYSB0XG5cbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuXG4gICAgdmFsIG1hcCA6ICdhIHQgLT4gKCdhIC0+ICdiKSAtPiAnYiB0XG5cbiAgICB2YWwgYmluZCA6ICdhIHQgLT4gKCdhIC0+ICdiIHQpIC0+ICdiIHRcblxuICAgIHZhbCB0ZXN0IDogJ2EgdCAtPiBib29sXG5cbiAgICB2YWwgaXRlciA6ICdhIHQgLT4gKCdhIC0+IHVuaXQpIC0+IHVuaXRcblxuICAgIHZhbCBjYXNlIDogJ2EgdCAtPiAodW5pdCAtPiAnYikgLT4gKCdhIC0+ICdiKSAtPiAnYlxuXG4gICAgdmFsIGdldCA6ICdhIHQgLT4gKHVuaXQgLT4gJ2EpIC0+ICdhXG5cbiAgICB2YWwgb3B0aW9uIDogJ2Egb3B0aW9uIC0+ICdhIHRcblxuICAgIHZhbCB0b19vcHRpb24gOiAnYSB0IC0+ICdhIG9wdGlvblxuXG4gICAgZXh0ZXJuYWwgZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuICBlbmRcblxuICBtb2R1bGUgT3B0IDogT1BUIHdpdGggdHlwZSAnYSB0ID0gJ2Egb3B0ID0gc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gJ2Egb3B0XG5cbiAgICBsZXQgZW1wdHkgPSBudWxsXG5cbiAgICBsZXQgcmV0dXJuID0gc29tZVxuXG4gICAgZXh0ZXJuYWwgZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuXG4gICAgbGV0IG1hcCB4IGYgPSBpZiBlcXVhbHMgeCBudWxsIHRoZW4gbnVsbCBlbHNlIHJldHVybiAoZiB4KVxuXG4gICAgbGV0IGJpbmQgeCBmID0gaWYgZXF1YWxzIHggbnVsbCB0aGVuIG51bGwgZWxzZSBmIHhcblxuICAgIGxldCB0ZXN0IHggPSBub3QgKGVxdWFscyB4IG51bGwpXG5cbiAgICBsZXQgaXRlciB4IGYgPSBpZiBub3QgKGVxdWFscyB4IG51bGwpIHRoZW4gZiB4XG5cbiAgICBsZXQgY2FzZSB4IGYgZyA9IGlmIGVxdWFscyB4IG51bGwgdGhlbiBmICgpIGVsc2UgZyB4XG5cbiAgICBsZXQgZ2V0IHggZiA9IGlmIGVxdWFscyB4IG51bGwgdGhlbiBmICgpIGVsc2UgeFxuXG4gICAgbGV0IG9wdGlvbiB4ID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGVtcHR5XG4gICAgICB8IFNvbWUgeCAtPiByZXR1cm4geFxuXG4gICAgbGV0IHRvX29wdGlvbiB4ID0gY2FzZSB4IChmdW4gKCkgLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeClcbiAgZW5kXG5cbiAgbW9kdWxlIE9wdGRlZiA6IE9QVCB3aXRoIHR5cGUgJ2EgdCA9ICdhIG9wdGRlZiA9IHN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9ICdhIG9wdGRlZlxuXG4gICAgbGV0IGVtcHR5ID0gdW5kZWZpbmVkXG5cbiAgICBsZXQgcmV0dXJuID0gZGVmXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHN0cmljdF9lcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfc3RyaWN0X2VxdWFsc1wiXG5cbiAgICBsZXQgbWFwIHggZiA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiB1bmRlZmluZWQgZWxzZSByZXR1cm4gKGYgeClcblxuICAgIGxldCBiaW5kIHggZiA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiB1bmRlZmluZWQgZWxzZSBmIHhcblxuICAgIGxldCB0ZXN0IHggPSBub3QgKHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQpXG5cbiAgICBsZXQgaXRlciB4IGYgPSBpZiBub3QgKHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQpIHRoZW4gZiB4XG5cbiAgICBsZXQgY2FzZSB4IGYgZyA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiBmICgpIGVsc2UgZyB4XG5cbiAgICBsZXQgZ2V0IHggZiA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiBmICgpIGVsc2UgeFxuXG4gICAgbGV0IG9wdGlvbiB4ID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGVtcHR5XG4gICAgICB8IFNvbWUgeCAtPiByZXR1cm4geFxuXG4gICAgbGV0IHRvX29wdGlvbiB4ID0gY2FzZSB4IChmdW4gKCkgLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeClcbiAgZW5kXG5cbiAgKCoqKiopXG5cbiAgbGV0IGNvZXJjZSB4IGYgZyA9IE9wdC5nZXQgKGYgeCkgKGZ1biAoKSAtPiBnIHgpXG5cbiAgbGV0IGNvZXJjZV9vcHQgeCBmIGcgPSBPcHQuZ2V0IChPcHQuYmluZCB4IGYpIChmdW4gKCkgLT4gZyB4KVxuXG4gICgqKioqKVxuXG4gIHR5cGUgKydhIG1ldGhcblxuICB0eXBlICsnYSBnZW5fcHJvcFxuXG4gIHR5cGUgJ2EgcmVhZG9ubHlfcHJvcCA9IDwgZ2V0IDogJ2EgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2Egd3JpdGVvbmx5X3Byb3AgPSA8IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2EgcHJvcCA9IDwgZ2V0IDogJ2EgOyBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICdhIG9wdGRlZl9wcm9wID0gPCBnZXQgOiAnYSBvcHRkZWYgOyBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICsnYSBjb25zdHJcblxuICAoKioqKilcblxuICB0eXBlICdhIGNhbGxiYWNrID0gKHVuaXQsICdhKSBtZXRoX2NhbGxiYWNrXG5cbiAgZXh0ZXJuYWwgd3JhcF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHdyYXBfbWV0aF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdhLCAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja1wiXG5cbiAgKCoqKiopXG5cbiAgZXh0ZXJuYWwgZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgZXh0ZXJuYWwgc3RyaWN0X2VxdWFscyA6IF8gdCAtPiBfIHQgLT4gYm9vbCA9IFwiY2FtbF9qc19zdHJpY3RfZXF1YWxzXCJcblxuICAoKioqKilcblxuICBsZXQgX3RydWUgPSBVbnNhZmUucHVyZV9qc19leHByIFwidHJ1ZVwiXG5cbiAgbGV0IF9mYWxzZSA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJmYWxzZVwiXG5cbiAgdHlwZSBtYXRjaF9yZXN1bHRfaGFuZGxlXG5cbiAgdHlwZSBzdHJpbmdfYXJyYXlcblxuICBjbGFzcyB0eXBlIG51bWJlciA9IG9iamVjdFxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZ19yYWRpeCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9GaXhlZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9FeHBvbmVudGlhbCA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0V4cG9uZW50aWFsX2RpZ2l0cyA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9QcmVjaXNpb24gOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxuICBhbmQganNfc3RyaW5nID0gb2JqZWN0XG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHZhbHVlT2YgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY2hhckF0IDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjaGFyQ29kZUF0IDogaW50IC0+IG51bWJlciB0IG1ldGhcblxuICAgIG1ldGhvZCBjb2RlUG9pbnRBdCA6IGludCAtPiBudW1iZXIgdCBvcHRkZWYgbWV0aFxuXG4gICAgKCogVGhpcyBtYXkgcmV0dXJuIE5hTi4uLiAqKVxuICAgIG1ldGhvZCBjb25jYXQgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0XzIgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0XzMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0XzQgOlxuICAgICAganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGluZGV4T2YgOiBqc19zdHJpbmcgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGluZGV4T2ZfZnJvbSA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGxhc3RJbmRleE9mIDoganNfc3RyaW5nIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBsYXN0SW5kZXhPZl9mcm9tIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgbG9jYWxlQ29tcGFyZSA6IGpzX3N0cmluZyB0IC0+IG51bWJlciB0IG1ldGhcblxuICAgIG1ldGhvZCBfbWF0Y2ggOiByZWdFeHAgdCAtPiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBub3JtYWxpemUgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgbm9ybWFsaXplX2Zvcm0gOiBub3JtYWxpemF0aW9uIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2UgOiByZWdFeHAgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZV9zdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VhcmNoIDogcmVnRXhwIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlX2VuZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXQgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXRfbGltaXRlZCA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXRfcmVnRXhwIDogcmVnRXhwIHQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGl0X3JlZ0V4cExpbWl0ZWQgOiByZWdFeHAgdCAtPiBpbnQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHN1YnN0cmluZyA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHN1YnN0cmluZ190b0VuZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb3dlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVMb3dlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9VcHBlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVVcHBlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdHJpbSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuICBhbmQgcmVnRXhwID0gb2JqZWN0XG4gICAgbWV0aG9kIGV4ZWMgOiBqc19zdHJpbmcgdCAtPiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXN0IDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBzb3VyY2UgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2xvYmFsIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpZ25vcmVDYXNlIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtdWx0aWxpbmUgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxhc3RJbmRleCA6IGludCBwcm9wXG4gIGVuZFxuXG4gIGFuZCBub3JtYWxpemF0aW9uID0ganNfc3RyaW5nXG5cbiAgdHlwZSBudW1iZXJfdCA9IG51bWJlciB0XG5cbiAgKCogc3RyaW5nIGlzIHVzZWQgYnkgcHB4X2pzLCBpdCBuZWVkcyB0byBjb21lIGJlZm9yZSBhbnkgdXNlIG9mIHRoZVxuICAgICBuZXcgc3ludGF4IGluIHRoaXMgZmlsZSAqKVxuICBleHRlcm5hbCBzdHJpbmcgOiBzdHJpbmcgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXCJcblxuICBleHRlcm5hbCB0b19zdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXCJcblxuICBsZXQgbmZjID0gc3RyaW5nIFwiTkZDXCJcblxuICBsZXQgbmZkID0gc3RyaW5nIFwiTkZEXCJcblxuICBsZXQgbmZrYyA9IHN0cmluZyBcIk5GS0NcIlxuXG4gIGxldCBuZmtkID0gc3RyaW5nIFwiTkZLRFwiXG5lbmRcblxuaW5jbHVkZSBKc1xuXG5jbGFzcyB0eXBlIHN0cmluZ19jb25zdHIgPSBvYmplY3RcbiAgbWV0aG9kIGZyb21DaGFyQ29kZSA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5lbmRcblxubGV0IHN0cmluZ19jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX1N0cmluZ1xuXG5sZXQgcmVnRXhwID0gVW5zYWZlLmdsb2JhbCMjLl9SZWdFeHBcblxubGV0IHJlZ0V4cF9jb3B5ID0gcmVnRXhwXG5cbmxldCByZWdFeHBfd2l0aEZsYWdzID0gcmVnRXhwXG5cbmNsYXNzIHR5cGUgWydhXSBqc19hcnJheSA9IG9iamVjdFxuICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvTG9jYWxlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCBjb25jYXQgOiAnYSBqc19hcnJheSB0IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBqb2luIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCBwb3AgOiAnYSBvcHRkZWYgbWV0aFxuXG4gIG1ldGhvZCBwdXNoIDogJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcHVzaF8yIDogJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcHVzaF8zIDogJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcHVzaF80IDogJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcmV2ZXJzZSA6ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzaGlmdCA6ICdhIG9wdGRlZiBtZXRoXG5cbiAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc2xpY2VfZW5kIDogaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzb3J0IDogKCdhIC0+ICdhIC0+IG51bWJlcl90KSBjYWxsYmFjayAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc29ydF9hc1N0cmluZ3MgOiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlIDogaW50IC0+IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlXzEgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzcGxpY2VfMiA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHNwbGljZV8zIDogaW50IC0+IGludCAtPiAnYSAtPiAnYSAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlXzQgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCB1bnNoaWZ0IDogJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgdW5zaGlmdF8yIDogJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgdW5zaGlmdF8zIDogJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgdW5zaGlmdF80IDogJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2Qgc29tZSA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiBib29sIHQpIGNhbGxiYWNrIC0+IGJvb2wgdCBtZXRoXG5cbiAgbWV0aG9kIGV2ZXJ5IDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gYm9vbCB0IG1ldGhcblxuICBtZXRob2QgZm9yRWFjaCA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiB1bml0KSBjYWxsYmFjayAtPiB1bml0IG1ldGhcblxuICBtZXRob2QgbWFwIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2QgZmlsdGVyIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHJlZHVjZV9pbml0IDogKCdiIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAtPiAnYiBtZXRoXG5cbiAgbWV0aG9kIHJlZHVjZSA6ICgnYSAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYSkgY2FsbGJhY2sgLT4gJ2EgbWV0aFxuXG4gIG1ldGhvZCByZWR1Y2VSaWdodF9pbml0IDpcbiAgICAoJ2IgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIC0+ICdiIG1ldGhcblxuICBtZXRob2QgcmVkdWNlUmlnaHQgOiAoJ2EgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2EpIGNhbGxiYWNrIC0+ICdhIG1ldGhcblxuICBtZXRob2QgbGVuZ3RoIDogaW50IHByb3BcbmVuZFxuXG5sZXQgb2JqZWN0X2NvbnN0cnVjdG9yID0gVW5zYWZlLmdsb2JhbCMjLl9PYmplY3RcblxubGV0IG9iamVjdF9rZXlzIG8gOiBqc19zdHJpbmcgdCBqc19hcnJheSB0ID0gb2JqZWN0X2NvbnN0cnVjdG9yIyNrZXlzIG9cblxubGV0IGFycmF5X2NvbnN0cnVjdG9yID0gVW5zYWZlLmdsb2JhbCMjLl9BcnJheVxuXG5sZXQgYXJyYXlfZW1wdHkgPSBhcnJheV9jb25zdHJ1Y3RvclxuXG5sZXQgYXJyYXlfbGVuZ3RoID0gYXJyYXlfY29uc3RydWN0b3JcblxubGV0IGFycmF5X2dldCA6ICdhICNqc19hcnJheSB0IC0+IGludCAtPiAnYSBvcHRkZWYgPSBVbnNhZmUuZ2V0XG5cbmxldCBhcnJheV9zZXQgOiAnYSAjanNfYXJyYXkgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFVuc2FmZS5zZXRcblxubGV0IGFycmF5X21hcF9wb2x5IDpcbiAgICAnYSAjanNfYXJyYXkgdCAtPiAoJ2EgLT4gaW50IC0+ICdhICNqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAjanNfYXJyYXkgdCA9XG4gZnVuIGEgY2IgLT4gKFVuc2FmZS5jb2VyY2UgYSkjI21hcCBjYlxuXG5sZXQgYXJyYXlfbWFwIGYgYSA9IGFycmF5X21hcF9wb2x5IGEgKHdyYXBfY2FsbGJhY2sgKGZ1biB4IF9pZHggXyAtPiBmIHgpKVxuXG5sZXQgYXJyYXlfbWFwaSBmIGEgPSBhcnJheV9tYXBfcG9seSBhICh3cmFwX2NhbGxiYWNrIChmdW4geCBpZHggXyAtPiBmIGlkeCB4KSlcblxuY2xhc3MgdHlwZSBtYXRjaF9yZXN1bHQgPSBvYmplY3RcbiAgaW5oZXJpdCBbanNfc3RyaW5nIHRdIGpzX2FycmF5XG5cbiAgbWV0aG9kIGluZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgaW5wdXQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5lbmRcblxubGV0IHN0cl9hcnJheSA6IHN0cmluZ19hcnJheSB0IC0+IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgPSBVbnNhZmUuY29lcmNlXG5cbmxldCBtYXRjaF9yZXN1bHQgOiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgLT4gbWF0Y2hfcmVzdWx0IHQgPSBVbnNhZmUuY29lcmNlXG5cbmNsYXNzIHR5cGUgZGF0ZSA9IG9iamVjdFxuICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvRGF0ZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9UaW1lU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0xvY2FsZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9Mb2NhbGVEYXRlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0xvY2FsZVRpbWVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHZhbHVlT2YgOiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGdldFRpbWUgOiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGdldEZ1bGxZZWFyIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDRnVsbFllYXIgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRNb250aCA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ01vbnRoIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0RGF0ZSA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ0RhdGUgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXREYXkgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRVVENEYXkgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRIb3VycyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ0hvdXJzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0TWludXRlcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ01pbnV0ZXMgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRTZWNvbmRzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDU2Vjb25kcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldE1pbGxpc2Vjb25kcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ01pbGxpc2Vjb25kcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFRpbWV6b25lT2Zmc2V0IDogaW50IG1ldGhcblxuICBtZXRob2Qgc2V0VGltZSA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0RnVsbFllYXIgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENGdWxsWWVhciA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldE1vbnRoIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDTW9udGggOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXREYXRlIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDRGF0ZSA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldEhvdXJzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDSG91cnMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRNaW51dGVzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDTWludXRlcyA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldFNlY29uZHMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENTZWNvbmRzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0TWlsbGlzZWNvbmRzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDTWlsbGlzZWNvbmRzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgdG9VVENTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvSVNPU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0pTT04gOiAnYSAtPiBqc19zdHJpbmcgdCBtZXRoXG5lbmRcblxuY2xhc3MgdHlwZSBkYXRlX2NvbnN0ciA9IG9iamVjdFxuICBtZXRob2QgcGFyc2UgOiBqc19zdHJpbmcgdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIF9VVENfbW9udGggOiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19kYXkgOiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19ob3VyIDogaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19taW4gOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19zZWMgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIF9VVENfbXMgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBub3cgOiBudW1iZXJfdCBtZXRoXG5lbmRcblxubGV0IGRhdGVfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9EYXRlXG5cbmxldCBkYXRlIDogZGF0ZV9jb25zdHIgdCA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX25vdyA6IGRhdGUgdCBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9mcm9tVGltZVZhbHVlIDogKG51bWJlcl90IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbW9udGggOiAoaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2RheSA6IChpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2hvdXIgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbWluIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9zZWMgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9tcyA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPVxuICBkYXRlX2NvbnN0clxuXG5jbGFzcyB0eXBlIG1hdGggPSBvYmplY3RcbiAgbWV0aG9kIF9FIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE4yIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE4xMCA6IG51bWJlcl90IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgX0xPRzJFIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE9HMTBFIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfUEkgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIF9TUVJUMV8yXyA6IG51bWJlcl90IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgX1NRUlQyIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBhYnMgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGFjb3MgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGFzaW4gOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGF0YW4gOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGF0YW4yIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBjZWlsIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBjb3MgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGV4cCA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgZmxvb3IgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGxvZyA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWF4IDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBtYXhfMyA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWF4XzQgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIG1pbiA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWluXzMgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIG1pbl80IDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBwb3cgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHJhbmRvbSA6IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgcm91bmQgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNpbiA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc3FydCA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgdGFuIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuZW5kXG5cbmxldCBtYXRoID0gVW5zYWZlLmdsb2JhbCMjLl9NYXRoXG5cbmNsYXNzIHR5cGUgZXJyb3IgPSBvYmplY3RcbiAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgbWV0aG9kIG1lc3NhZ2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgbWV0aG9kIHN0YWNrIDoganNfc3RyaW5nIHQgb3B0ZGVmIHByb3BcblxuICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5lbmRcblxubGV0IGVycm9yX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fRXJyb3JcblxubW9kdWxlIEpzX2Vycm9yID0gc3RydWN0XG4gIHR5cGUgZXJyb3JfdCA9IGVycm9yIHRcblxuICBpbmNsdWRlIEpzb29fcnVudGltZS5FcnJvclxuXG4gIGV4dGVybmFsIG9mX2Vycm9yIDogZXJyb3JfdCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGV4dGVybmFsIHRvX2Vycm9yIDogdCAtPiBlcnJvcl90ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCBuYW1lIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyMubmFtZVxuXG4gIGxldCBtZXNzYWdlIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyMubWVzc2FnZVxuXG4gIGxldCBzdGFjayAoZSA6IHQpIDogc3RyaW5nIG9wdGlvbiA9XG4gICAgT3B0LnRvX29wdGlvbiAoT3B0Lm1hcCAodG9fZXJyb3IgZSkjIy5zdGFjayB0b19zdHJpbmcpXG5cbiAgbGV0IHRvX3N0cmluZyBlID0gdG9fc3RyaW5nICh0b19lcnJvciBlKSMjdG9TdHJpbmdcbmVuZFxuXG5tb2R1bGUgTWFnaWMgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgVCA9IHNpZ1xuICAgIGV4Y2VwdGlvbiBFcnJvciBvZiBlcnJvciB0XG4gIGVuZFxuXG4gIHR5cGUgKCdhLCAnYikgZXEgPSBFcSA6ICgnYSwgJ2EpIGVxXG5cbiAgbGV0IChlcSA6IChlcnJvciB0LCBKc19lcnJvci50KSBlcSkgPSBPYmoubWFnaWMgRXFcblxuICBsZXQgbSA9XG4gICAgbWF0Y2ggZXEgd2l0aFxuICAgIHwgRXEgLT5cbiAgICAgICAgKG1vZHVsZSBzdHJ1Y3RcbiAgICAgICAgICBleGNlcHRpb24gRXJyb3IgPSBKc19lcnJvci5FeG5cbiAgICAgICAgZW5kIDogVClcblxuICBtb2R1bGUgRXJyb3IgPSAodmFsIG0gOiBUKVxuZW5kXG5cbmluY2x1ZGUgTWFnaWMuRXJyb3JcblxubGV0IHJhaXNlX2pzX2Vycm9yIGUgPSBKc19lcnJvci5yYWlzZV8gKEpzX2Vycm9yLm9mX2Vycm9yIGUpXG5cbmxldCBzdHJpbmdfb2ZfZXJyb3IgZSA9IEpzX2Vycm9yLnRvX3N0cmluZyAoSnNfZXJyb3Iub2ZfZXJyb3IgZSlcblxubGV0IGV4bl93aXRoX2pzX2JhY2t0cmFjZSA9IEpzX2Vycm9yLmF0dGFjaF9qc19iYWNrdHJhY2VcblxuZXh0ZXJuYWwganNfZXJyb3Jfb2ZfZXhuIDogZXhuIC0+IGVycm9yIHQgb3B0ID0gXCJjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvblwiXG5cbmNsYXNzIHR5cGUganNvbiA9IG9iamVjdFxuICBtZXRob2QgcGFyc2UgOiBqc19zdHJpbmcgdCAtPiAnYSBtZXRoXG5cbiAgbWV0aG9kIHN0cmluZ2lmeSA6ICdhIC0+IGpzX3N0cmluZyB0IG1ldGhcbmVuZFxuXG5sZXQgX0pTT04gOiBqc29uIHQgPSBVbnNhZmUuZ2xvYmFsIyMuX0pTT05cblxubGV0IGRlY29kZVVSSSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5kZWNvZGVVUkkgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBkZWNvZGVVUklDb21wb25lbnQgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZGVjb2RlVVJJQ29tcG9uZW50IFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZW5jb2RlVVJJIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmVuY29kZVVSSSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGVuY29kZVVSSUNvbXBvbmVudCAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5lbmNvZGVVUklDb21wb25lbnQgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBlc2NhcGUgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZXNjYXBlIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgdW5lc2NhcGUgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMudW5lc2NhcGUgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmV4dGVybmFsIGJvb2wgOiBib29sIC0+IGJvb2wgdCA9IFwiY2FtbF9qc19mcm9tX2Jvb2xcIlxuXG5leHRlcm5hbCB0b19ib29sIDogYm9vbCB0IC0+IGJvb2wgPSBcImNhbWxfanNfdG9fYm9vbFwiXG5cbmV4dGVybmFsIGFycmF5IDogJ2EgYXJyYXkgLT4gJ2EganNfYXJyYXkgdCA9IFwiY2FtbF9qc19mcm9tX2FycmF5XCJcblxuZXh0ZXJuYWwgdG9fYXJyYXkgOiAnYSBqc19hcnJheSB0IC0+ICdhIGFycmF5ID0gXCJjYW1sX2pzX3RvX2FycmF5XCJcblxuZXh0ZXJuYWwgYnl0ZXN0cmluZyA6IHN0cmluZyAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc2J5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHRvX2J5dGVzdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcIlxuXG5leHRlcm5hbCBmbG9hdCA6IGZsb2F0IC0+IG51bWJlcl90ID0gXCJjYW1sX2pzX2Zyb21fZmxvYXRcIlxuXG5leHRlcm5hbCB0b19mbG9hdCA6IG51bWJlcl90IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuZXh0ZXJuYWwgbnVtYmVyX29mX2Zsb2F0IDogZmxvYXQgLT4gbnVtYmVyIHQgPSBcImNhbWxfanNfZnJvbV9mbG9hdFwiXG5cbmV4dGVybmFsIGZsb2F0X29mX251bWJlciA6IG51bWJlciB0IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuZXh0ZXJuYWwgaW50MzIgOiBpbnQzMiAtPiBudW1iZXJfdCA9IFwiY2FtbF9qc19mcm9tX2ludDMyXCJcblxuZXh0ZXJuYWwgdG9faW50MzIgOiBudW1iZXJfdCAtPiBpbnQzMiA9IFwiY2FtbF9qc190b19pbnQzMlwiXG5cbmV4dGVybmFsIG5hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBudW1iZXJfdCA9IFwiY2FtbF9qc19mcm9tX25hdGl2ZWludFwiXG5cbmV4dGVybmFsIHRvX25hdGl2ZWludCA6IG51bWJlcl90IC0+IG5hdGl2ZWludCA9IFwiY2FtbF9qc190b19uYXRpdmVpbnRcIlxuXG5leHRlcm5hbCB0eXBlb2YgOiBfIHQgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNfdHlwZW9mXCJcblxuZXh0ZXJuYWwgaW5zdGFuY2VvZiA6IF8gdCAtPiBfIGNvbnN0ciAtPiBib29sID0gXCJjYW1sX2pzX2luc3RhbmNlb2ZcIlxuXG5sZXQgaXNOYU4gKGkgOiAnYSkgOiBib29sID1cbiAgdG9fYm9vbCAoVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5pc05hTiBbfCBVbnNhZmUuaW5qZWN0IGkgfF0pXG5cbmxldCBwYXJzZUludCAocyA6IGpzX3N0cmluZyB0KSA6IGludCA9XG4gIGxldCBzID0gVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5wYXJzZUludCBbfCBVbnNhZmUuaW5qZWN0IHMgfF0gaW5cbiAgaWYgaXNOYU4gcyB0aGVuIGZhaWx3aXRoIFwicGFyc2VJbnRcIiBlbHNlIHNcblxubGV0IHBhcnNlRmxvYXQgKHMgOiBqc19zdHJpbmcgdCkgOiBudW1iZXJfdCA9XG4gIGxldCBzID0gVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5wYXJzZUZsb2F0IFt8IFVuc2FmZS5pbmplY3QgcyB8XSBpblxuICBpZiBpc05hTiBzIHRoZW4gZmFpbHdpdGggXCJwYXJzZUZsb2F0XCIgZWxzZSBzXG5cbmxldCBfID1cbiAgUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciAoZnVuIGUgLT5cbiAgICAgIGlmIGluc3RhbmNlb2YgKE9iai5tYWdpYyBlIDogPCAuLiA+IHQpIGVycm9yX2NvbnN0clxuICAgICAgdGhlblxuICAgICAgICBsZXQgZSA9IEpzX2Vycm9yLm9mX2Vycm9yIChPYmoubWFnaWMgZSA6IGVycm9yIHQpIGluXG4gICAgICAgIFNvbWUgKEpzX2Vycm9yLnRvX3N0cmluZyBlKVxuICAgICAgZWxzZVxuICAgICAgICBtYXRjaCBlIHdpdGhcbiAgICAgICAgfCBKc19lcnJvci5FeG4gZSAtPiBTb21lIChKc19lcnJvci50b19zdHJpbmcgZSlcbiAgICAgICAgfCBfIC0+IE5vbmUpXG5cbmxldCBleHBvcnRfanMgKGZpZWxkIDoganNfc3RyaW5nIHQpIHggPVxuICBVbnNhZmUuc2V0XG4gICAgKFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJqc29vX2V4cG9ydHNcIilcbiAgICBmaWVsZFxuICAgIChpZlxuICAgICAgIFN0cmluZy5lcXVhbCAoSnMudG9fc3RyaW5nICh0eXBlb2YgKE9iai5tYWdpYyB4KSkpIFwiZnVuY3Rpb25cIlxuICAgICAgICgqIGZ1bmN0aW9uIHdpdGggYXJpdHkvbGVuZ3RoIGVxdWFsIHRvIHplcm8gYXJlIGFscmVhZHkgd3JhcHBlZCAqKVxuICAgICAgICYmIFVuc2FmZS5nZXQgKE9iai5tYWdpYyB4KSAoSnMuc3RyaW5nIFwibGVuZ3RoXCIpID4gMFxuICAgICB0aGVuIE9iai5tYWdpYyAod3JhcF9jYWxsYmFjayAoT2JqLm1hZ2ljIHgpKVxuICAgICBlbHNlIHgpXG5cbmxldCBleHBvcnQgZmllbGQgeCA9IGV4cG9ydF9qcyAoc3RyaW5nIGZpZWxkKSB4XG5cbmxldCBleHBvcnRfYWxsIG9iaiA9XG4gIGxldCBrZXlzID0gb2JqZWN0X2tleXMgb2JqIGluXG4gIGtleXMjI2ZvckVhY2hcbiAgICAod3JhcF9jYWxsYmFjayAoZnVuIChrZXkgOiBqc19zdHJpbmcgdCkgXyBfIC0+IGV4cG9ydF9qcyBrZXkgKFVuc2FmZS5nZXQgb2JqIGtleSkpKVxuXG4oKioqKilcblxuKCogREVQUkVDQVRFRCAqKVxuXG50eXBlIGZsb2F0X3Byb3AgPSBudW1iZXJfdCBwcm9wXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfanNfZ2V0IiwiY2FtbF9qc19zZXQiLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2siLCJjYW1sX3N0cmluZ19vZl9qc3N0cmluZyIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJnbG9iYWxfZGF0YSIsIkpzX29mX29jYW1sX0ltcG9ydCIsIlN0ZGxpYiIsIkpzb29fcnVudGltZSIsIlN0ZGxpYl9QcmludGV4YyIsImdsb2JhbCIsIm51bGwkIiwidW5kZWZpbmVkJCIsInJldHVybiQiLCJtYXAiLCJ4IiwiYmluZCIsInRlc3QiLCJpdGVyIiwiY2FzZSQiLCJnIiwiZ2V0Iiwib3B0aW9uIiwidG9fb3B0aW9uIiwiY29lcmNlIiwiY29lcmNlX29wdCIsInN0cmluZ19jb25zdHIiLCJyZWdFeHAiLCJvYmplY3RfY29uc3RydWN0b3IiLCJvYmplY3Rfa2V5cyIsInQ0IiwiYXJyYXlfY29uc3RydWN0b3IiLCJhcnJheV9tYXAiLCJ0NiIsImNiIiwiaWR4IiwicGFyYW0iLCJhcnJheV9tYXBpIiwic3RyX2FycmF5IiwibWF0Y2hfcmVzdWx0IiwiZGF0ZV9jb25zdHIiLCJtYXRoIiwiZXJyb3JfY29uc3RyIiwiaW5jbHVkZSIsInJhaXNlIiwiZXhuX3dpdGhfanNfYmFja3RyYWNlIiwib2ZfZXhuIiwiRXJyb3IiLCJuYW1lIiwidDExIiwibWVzc2FnZSIsInQxMiIsInN0YWNrIiwidDEzIiwidG9fc3RyaW5nIiwidDE0IiwicmFpc2VfanNfZXJyb3IiLCJlIiwic3RyaW5nX29mX2Vycm9yIiwiSlNPTiIsImRlY29kZVVSSSIsInMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ1bmVzY2FwZSIsImlzTmFOIiwiaSIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsImV4cG9ydF9qcyIsImZpZWxkIiwiZXhwb3J0JCIsImV4cG9ydF9hbGwiLCJvYmoiLCJrZXlzIiwidDI2Iiwia2V5IiwiSnNfb2Zfb2NhbWxfSnMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLDBCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQ3V6Qm9CO0FBQUE7QUFBQSxFRHZ6QnBCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzYwNzgsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4X2Jyb3dzZXIuZW9ianMvanNvby9kdW5lX19leGVfX1N4X2Jyb3dzZXIuY21vLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9icm93c2VyL3N4X2Jyb3dzZXIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogc3hfYnJvd3Nlci5tbCDigJQgT0NhbWwgU1gga2VybmVsIGNvbXBpbGVkIHRvIFdBU00vSlMgZm9yIGJyb3dzZXIgdXNlLlxuXG4gICAgRXhwb3NlcyB0aGUgQ0VLIG1hY2hpbmUsIGJ5dGVjb2RlIFZNLCBwYXJzZXIsIGFuZCBwcmltaXRpdmVzIGFzIGFcbiAgICBnbG9iYWwgW1N4S2VybmVsXSBvYmplY3QgdGhhdCB0aGUgSlMgcGxhdGZvcm0gbGF5ZXIgYmluZHMgdG8uXG5cbiAgICBGcmVzaCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgb2NhbWwtdm0gYnJhbmNoIOKAlCBidWlsZHMgb24gdGhlIGJ5dGVjb2RlXG4gICAgVk0gKyBsYXp5IEpJVCBpbmZyYXN0cnVjdHVyZS4gKilcblxub3BlbiBKc19vZl9vY2FtbFxub3BlbiBTeF90eXBlc1xuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIE9wYXF1ZSB2YWx1ZSBoYW5kbGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqIE5vbi1wcmltaXRpdmUgU1ggdmFsdWVzIChsYW1iZGFzLCBjb21wb25lbnRzLCBzaWduYWxzLCBldGMuKSBhcmUgICAgKilcbigqIHN0b3JlZCBoZXJlIGFuZCByZXByZXNlbnRlZCBvbiB0aGUgSlMgc2lkZSBhcyBvYmplY3RzIHdpdGggYW4gICAgICAgKilcbigqIF9fc3hfaGFuZGxlIGludGVnZXIga2V5LiAgUHJlc2VydmVzIGlkZW50aXR5IGFjcm9zcyBKU+KGlE9DYW1sLiAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IF9uZXh0X2hhbmRsZSA9IHJlZiAwXG5sZXQgX2hhbmRsZV90YWJsZSA6IChpbnQsIHZhbHVlKSBIYXNodGJsLnQgPSBIYXNodGJsLmNyZWF0ZSAyNTZcblxubGV0IGFsbG9jX2hhbmRsZSAodiA6IHZhbHVlKSA6IGludCA9XG4gIGxldCBpZCA9ICFfbmV4dF9oYW5kbGUgaW5cbiAgaW5jciBfbmV4dF9oYW5kbGU7XG4gIEhhc2h0YmwucmVwbGFjZSBfaGFuZGxlX3RhYmxlIGlkIHY7XG4gIGlkXG5cbmxldCBnZXRfaGFuZGxlIChpZCA6IGludCkgOiB2YWx1ZSA9XG4gIG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgX2hhbmRsZV90YWJsZSBpZCB3aXRoXG4gIHwgU29tZSB2IC0+IHZcbiAgfCBOb25lIC0+IHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZiBcIkludmFsaWQgU1ggaGFuZGxlOiAlZFwiIGlkKSlcblxuKCogSlMtc2lkZSBvcGFxdWUgaG9zdCBvYmplY3QgdGFibGUuXG4gICBIb3N0IG9iamVjdHMgKERPTSBlbGVtZW50cywgY29uc29sZSwgZXRjLikgYXJlIHN0b3JlZCBoZXJlIHRvIHByZXNlcnZlXG4gICBpZGVudGl0eSBhY3Jvc3MgdGhlIE9DYW1s4oaUSlMgYm91bmRhcnkuIFJlcHJlc2VudGVkIGFzIERpY3Qgd2l0aFxuICAgX19ob3N0X2hhbmRsZSBrZXkgb24gdGhlIE9DYW1sIHNpZGUuICopXG5sZXQgX25leHRfaG9zdF9oYW5kbGUgPSByZWYgMFxubGV0IF9hbGxvY19ob3N0X2hhbmRsZSA9IEpzLlVuc2FmZS5wdXJlX2pzX2V4cHJcbiAgXCIoZnVuY3Rpb24oKSB7IHZhciB0ID0ge307IHZhciBuID0gMDsgcmV0dXJuIHsgcHV0OiBmdW5jdGlvbihvYmopIHsgdmFyIGlkID0gbisrOyB0W2lkXSA9IG9iajsgcmV0dXJuIGlkOyB9LCBnZXQ6IGZ1bmN0aW9uKGlkKSB7IHJldHVybiB0W2lkXTsgfSB9OyB9KSgpXCJcbmxldCBob3N0X3B1dCAob2JqIDogSnMuVW5zYWZlLmFueSkgOiBpbnQgPVxuICBsZXQgaWQgPSAhX25leHRfaG9zdF9oYW5kbGUgaW5cbiAgaW5jciBfbmV4dF9ob3N0X2hhbmRsZTtcbiAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsIF9hbGxvY19ob3N0X2hhbmRsZSBcInB1dFwiIFt8IG9iaiB8XSk7XG4gIGlkXG5sZXQgaG9zdF9nZXRfanMgKGlkIDogaW50KSA6IEpzLlVuc2FmZS5hbnkgPVxuICBKcy5VbnNhZmUubWV0aF9jYWxsIF9hbGxvY19ob3N0X2hhbmRsZSBcImdldFwiIFt8IEpzLlVuc2FmZS5pbmplY3QgaWQgfF1cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBHbG9iYWwgZW52aXJvbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxuKCogRm9yY2UgbW9kdWxlIGluaXRpYWxpemF0aW9uIOKAlCB0aGVzZSBtb2R1bGVzIHJlZ2lzdGVyIHByaW1pdGl2ZXNcbiAgIGluIHRoZWlyIGxldCAoKSA9IC4uLiBibG9ja3MgYnV0IGFyZW4ndCByZWZlcmVuY2VkIGRpcmVjdGx5LiAqKVxubGV0ICgpID0gU3hfc2NvcGUuY2xlYXJfYWxsICgpXG5cbmxldCBnbG9iYWxfZW52ID0gbWFrZV9lbnYgKClcbmxldCBfc3hfcmVuZGVyX21vZGUgPSByZWYgZmFsc2VcblxubGV0IGNhbGxfc3hfZm4gKGZuIDogdmFsdWUpIChhcmdzIDogdmFsdWUgbGlzdCkgOiB2YWx1ZSA9XG4gIFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGZuIDo6IGFyZ3MpKSAoRW52IGdsb2JhbF9lbnYpXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogVmFsdWUgY29udmVyc2lvbjogT0NhbWwgPC0+IEpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbigqKiBUYWcgYSBKUyBmdW5jdGlvbiB3aXRoIF9fc3hfaGFuZGxlIGFuZCBfdHlwZSBwcm9wZXJ0aWVzLiAqKVxubGV0IF90YWdfZm4gPSBKcy5VbnNhZmUucHVyZV9qc19leHByXG4gIFwiKGZ1bmN0aW9uKGZuLCBoYW5kbGUsIHR5cGUpIHsgZm4uX19zeF9oYW5kbGUgPSBoYW5kbGU7IGZuLl90eXBlID0gdHlwZTsgcmV0dXJuIGZuOyB9KVwiXG5cbmxldCByZWMgdmFsdWVfdG9fanMgKHYgOiB2YWx1ZSkgOiBKcy5VbnNhZmUuYW55ID1cbiAgbWF0Y2ggdiB3aXRoXG4gIHwgTmlsIC0+IEpzLlVuc2FmZS5pbmplY3QgSnMubnVsbFxuICB8IEJvb2wgYiAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIGIpXG4gIHwgTnVtYmVyIG4gLT4gSnMuVW5zYWZlLmluamVjdCAoSnMubnVtYmVyX29mX2Zsb2F0IG4pXG4gIHwgU3RyaW5nIHMgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIHMpXG4gIHwgUmF3SFRNTCBzIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyBzKVxuICB8IFN5bWJvbCBzIC0+XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuVW5zYWZlLm9iaiBbfFxuICAgICAgKFwiX3R5cGVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIFwic3ltYm9sXCIpKTtcbiAgICAgIChcIm5hbWVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIHMpKSB8XSlcbiAgfCBLZXl3b3JkIGsgLT5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5VbnNhZmUub2JqIFt8XG4gICAgICAoXCJfdHlwZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgXCJrZXl3b3JkXCIpKTtcbiAgICAgIChcIm5hbWVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIGspKSB8XSlcbiAgfCBMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSAtPlxuICAgIGxldCBhcnIgPSBpdGVtcyB8PiBMaXN0Lm1hcCB2YWx1ZV90b19qcyB8PiBBcnJheS5vZl9saXN0IGluXG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuVW5zYWZlLm9iaiBbfFxuICAgICAgKFwiX3R5cGVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIFwibGlzdFwiKSk7XG4gICAgICAoXCJpdGVtc1wiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5hcnJheSBhcnIpKSB8XSlcbiAgfCBEaWN0IGQgLT5cbiAgICAoKiBDaGVjayBmb3IgX19ob3N0X2hhbmRsZSDigJQgcmV0dXJuIG9yaWdpbmFsIEpTIG9iamVjdCAqKVxuICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJfX2hvc3RfaGFuZGxlXCIgd2l0aFxuICAgICB8IFNvbWUgKE51bWJlciBuKSAtPiBob3N0X2dldF9qcyAoaW50X29mX2Zsb2F0IG4pXG4gICAgIHwgXyAtPlxuICAgICAgIGxldCBvYmogPSBKcy5VbnNhZmUub2JqIFt8fF0gaW5cbiAgICAgICBKcy5VbnNhZmUuc2V0IG9iaiAoSnMuc3RyaW5nIFwiX3R5cGVcIikgKEpzLnN0cmluZyBcImRpY3RcIik7XG4gICAgICAgSGFzaHRibC5pdGVyIChmdW4gayB2IC0+XG4gICAgICAgICBKcy5VbnNhZmUuc2V0IG9iaiAoSnMuc3RyaW5nIGspICh2YWx1ZV90b19qcyB2KSkgZDtcbiAgICAgICBKcy5VbnNhZmUuaW5qZWN0IG9iailcbiAgKCogQ2FsbGFibGUgdmFsdWVzOiB3cmFwIGFzIEpTIGZ1bmN0aW9ucyB3aXRoIF9fc3hfaGFuZGxlICopXG4gIHwgTGFtYmRhIF8gfCBOYXRpdmVGbiBfIHwgQ29udGludWF0aW9uIF8gfCBWbUNsb3N1cmUgXyAtPlxuICAgIGxldCBoYW5kbGUgPSBhbGxvY19oYW5kbGUgdiBpblxuICAgIGxldCBpbm5lciA9IEpzLndyYXBfY2FsbGJhY2sgKGZ1biBhcmdzX2pzIC0+XG4gICAgICB0cnlcbiAgICAgICAgbGV0IGFyZyA9IGpzX3RvX3ZhbHVlIGFyZ3NfanMgaW5cbiAgICAgICAgbGV0IGFyZ3MgPSBtYXRjaCBhcmcgd2l0aCBOaWwgLT4gW10gfCBfIC0+IFthcmddIGluXG4gICAgICAgIGxldCByZXN1bHQgPSBjYWxsX3N4X2ZuIHYgYXJncyBpblxuICAgICAgICB2YWx1ZV90b19qcyByZXN1bHRcbiAgICAgIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICAgICAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsXG4gICAgICAgICAgKEpzLlVuc2FmZS5nZXQgSnMuVW5zYWZlLmdsb2JhbCAoSnMuc3RyaW5nIFwiY29uc29sZVwiKSlcbiAgICAgICAgICBcImVycm9yXCIgW3wgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIltzeF0gXCIgXiBtc2cpKSB8XSk7XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgSnMubnVsbCkgaW5cbiAgICBKcy5VbnNhZmUuZnVuX2NhbGwgX3RhZ19mbiBbfFxuICAgICAgSnMuVW5zYWZlLmluamVjdCBpbm5lcjtcbiAgICAgIEpzLlVuc2FmZS5pbmplY3QgaGFuZGxlO1xuICAgICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nICh0eXBlX29mIHYpKSB8XVxuICAoKiBOb24tY2FsbGFibGUgY29tcG91bmQ6IHRhZ2dlZCBvYmplY3Qgd2l0aCBoYW5kbGUgKilcbiAgfCBfIC0+XG4gICAgbGV0IGhhbmRsZSA9IGFsbG9jX2hhbmRsZSB2IGluXG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuVW5zYWZlLm9iaiBbfFxuICAgICAgKFwiX3R5cGVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nICh0eXBlX29mIHYpKSk7XG4gICAgICAoXCJfX3N4X2hhbmRsZVwiLCBKcy5VbnNhZmUuaW5qZWN0IGhhbmRsZSkgfF0pXG5cbmFuZCBqc190b192YWx1ZSAoanMgOiBKcy5VbnNhZmUuYW55KSA6IHZhbHVlID1cbiAgaWYgSnMuVW5zYWZlLmVxdWFscyBqcyBKcy5udWxsIHx8IEpzLlVuc2FmZS5lcXVhbHMganMgSnMudW5kZWZpbmVkIHRoZW4gTmlsXG4gIGVsc2VcbiAgICBsZXQgdHkgPSBKcy50b19zdHJpbmcgKEpzLnR5cGVvZiBqcykgaW5cbiAgICBtYXRjaCB0eSB3aXRoXG4gICAgfCBcIm51bWJlclwiIC0+IE51bWJlciAoSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIGpzKSlcbiAgICB8IFwiYm9vbGVhblwiIC0+IEJvb2wgKEpzLnRvX2Jvb2wgKEpzLlVuc2FmZS5jb2VyY2UganMpKVxuICAgIHwgXCJzdHJpbmdcIiAtPiBTdHJpbmcgKEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmNvZXJjZSBqcykpXG4gICAgfCBcImZ1bmN0aW9uXCIgLT5cbiAgICAgIGxldCBoID0gSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwiX19zeF9oYW5kbGVcIikgaW5cbiAgICAgIGlmIG5vdCAoSnMuVW5zYWZlLmVxdWFscyBoIEpzLnVuZGVmaW5lZCkgdGhlblxuICAgICAgICBnZXRfaGFuZGxlIChKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UgaCkgfD4gaW50X29mX2Zsb2F0KVxuICAgICAgZWxzZVxuICAgICAgICAoKiBQbGFpbiBKUyBmdW5jdGlvbiDigJQgd3JhcCBhcyBOYXRpdmVGbiAqKVxuICAgICAgICBOYXRpdmVGbiAoXCJqcy1jYWxsYmFja1wiLCBmdW4gYXJncyAtPlxuICAgICAgICAgIGxldCBqc19hcmdzID0gYXJncyB8PiBMaXN0Lm1hcCB2YWx1ZV90b19qcyB8PiBBcnJheS5vZl9saXN0IGluXG4gICAgICAgICAganNfdG9fdmFsdWUgKEpzLlVuc2FmZS5mdW5fY2FsbCBqcyAoQXJyYXkubWFwIEZ1bi5pZCBqc19hcmdzKSkpXG4gICAgfCBcIm9iamVjdFwiIC0+XG4gICAgICBsZXQgaCA9IEpzLlVuc2FmZS5nZXQganMgKEpzLnN0cmluZyBcIl9fc3hfaGFuZGxlXCIpIGluXG4gICAgICBpZiBub3QgKEpzLlVuc2FmZS5lcXVhbHMgaCBKcy51bmRlZmluZWQpIHRoZW5cbiAgICAgICAgZ2V0X2hhbmRsZSAoSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIGgpIHw+IGludF9vZl9mbG9hdClcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IHR5cGVfZmllbGQgPSBKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJfdHlwZVwiKSBpblxuICAgICAgICBpZiBKcy5VbnNhZmUuZXF1YWxzIHR5cGVfZmllbGQgSnMudW5kZWZpbmVkIHRoZW4gYmVnaW5cbiAgICAgICAgICBpZiBKcy50b19ib29sIChKcy5VbnNhZmUuZ2xvYmFsIyMuX0FycmF5IyNpc0FycmF5IGpzKSB0aGVuIGJlZ2luXG4gICAgICAgICAgICBsZXQgbiA9IEpzLmZsb2F0X29mX251bWJlciAoSnMuVW5zYWZlLmNvZXJjZSAoSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwibGVuZ3RoXCIpKSkgfD4gaW50X29mX2Zsb2F0IGluXG4gICAgICAgICAgICBMaXN0IChMaXN0LmluaXQgbiAoZnVuIGkgLT5cbiAgICAgICAgICAgICAganNfdG9fdmFsdWUgKEpzLmFycmF5X2dldCAoSnMuVW5zYWZlLmNvZXJjZSBqcykgaSB8PiBKcy5PcHRkZWYudG9fb3B0aW9uIHw+IE9wdGlvbi5nZXQpKSlcbiAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgKCogT3BhcXVlIGhvc3Qgb2JqZWN0IOKAlCBzdG9yZSBpbiBKUy1zaWRlIHRhYmxlLCByZXR1cm4gRGljdCB3aXRoIF9faG9zdF9oYW5kbGUgKilcbiAgICAgICAgICAgIGxldCBpZCA9IGhvc3RfcHV0IGpzIGluXG4gICAgICAgICAgICBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDIgaW5cbiAgICAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBkIFwiX19ob3N0X2hhbmRsZVwiIChOdW1iZXIgKGZsb2F0X29mX2ludCBpZCkpO1xuICAgICAgICAgICAgRGljdCBkXG4gICAgICAgICAgZW5kXG4gICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgbGV0IHRhZyA9IEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmNvZXJjZSB0eXBlX2ZpZWxkKSBpblxuICAgICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgICAgfCBcInN5bWJvbFwiIC0+IFN5bWJvbCAoSnMudG9fc3RyaW5nIChKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJuYW1lXCIpKSlcbiAgICAgICAgICB8IFwia2V5d29yZFwiIC0+IEtleXdvcmQgKEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwibmFtZVwiKSkpXG4gICAgICAgICAgfCBcImxpc3RcIiAtPlxuICAgICAgICAgICAgbGV0IGl0ZW1zX2pzID0gSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwiaXRlbXNcIikgaW5cbiAgICAgICAgICAgIGxldCBuID0gSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIChKcy5VbnNhZmUuZ2V0IGl0ZW1zX2pzIChKcy5zdHJpbmcgXCJsZW5ndGhcIikpKSB8PiBpbnRfb2ZfZmxvYXQgaW5cbiAgICAgICAgICAgIExpc3QgKExpc3QuaW5pdCBuIChmdW4gaSAtPlxuICAgICAgICAgICAgICBqc190b192YWx1ZSAoSnMuYXJyYXlfZ2V0IChKcy5VbnNhZmUuY29lcmNlIGl0ZW1zX2pzKSBpIHw+IEpzLk9wdGRlZi50b19vcHRpb24gfD4gT3B0aW9uLmdldCkpKVxuICAgICAgICAgIHwgXCJkaWN0XCIgLT5cbiAgICAgICAgICAgIGxldCBkID0gSGFzaHRibC5jcmVhdGUgOCBpblxuICAgICAgICAgICAgbGV0IGtleXMgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX09iamVjdCMja2V5cyBqcyBpblxuICAgICAgICAgICAgbGV0IGxlbiA9IGtleXMjIy5sZW5ndGggaW5cbiAgICAgICAgICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAgICAgICAgIGxldCBrID0gSnMudG9fc3RyaW5nIChKcy5hcnJheV9nZXQga2V5cyBpIHw+IEpzLk9wdGRlZi50b19vcHRpb24gfD4gT3B0aW9uLmdldCkgaW5cbiAgICAgICAgICAgICAgaWYgayA8PiBcIl90eXBlXCIgdGhlblxuICAgICAgICAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBkIGsgKGpzX3RvX3ZhbHVlIChKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgaykpKVxuICAgICAgICAgICAgZG9uZTtcbiAgICAgICAgICAgIERpY3QgZFxuICAgICAgICAgIHwgXyAtPiBOaWxcbiAgICAgICAgZW5kXG4gICAgfCBfIC0+IE5pbFxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFNpZGUtY2hhbm5lbCByZXR1cm4gKGJ5cGFzc2VzIGpzX29mX29jYW1sIHN0cmlwcGluZyBwcm9wZXJ0aWVzKSAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgcmV0dXJuX3ZpYV9zaWRlX2NoYW5uZWwgKHYgOiBKcy5VbnNhZmUuYW55KSA6IEpzLlVuc2FmZS5hbnkgPVxuICBKcy5VbnNhZmUuc2V0IEpzLlVuc2FmZS5nbG9iYWwgKEpzLnN0cmluZyBcIl9fc3hSXCIpIHY7IHZcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBDb3JlIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IGFwaV9wYXJzZSBzcmNfanMgPVxuICBsZXQgc3JjID0gSnMudG9fc3RyaW5nIHNyY19qcyBpblxuICB0cnlcbiAgICBsZXQgdmFsdWVzID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMgaW5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5hcnJheSAodmFsdWVzIHw+IExpc3QubWFwIHZhbHVlX3RvX2pzIHw+IEFycmF5Lm9mX2xpc3QpKVxuICB3aXRoIFBhcnNlX2Vycm9yIG1zZyAtPlxuICAgIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJQYXJzZSBlcnJvcjogXCIgXiBtc2cpKVxuXG5sZXQgYXBpX2V2YWwgc3JjX2pzID1cbiAgbGV0IHNyYyA9IEpzLnRvX3N0cmluZyBzcmNfanMgaW5cbiAgdHJ5XG4gICAgbGV0IGV4cHJzID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMgaW5cbiAgICBsZXQgZW52ID0gRW52IGdsb2JhbF9lbnYgaW5cbiAgICBsZXQgcmVzdWx0ID0gTGlzdC5mb2xkX2xlZnQgKGZ1biBfYWNjIGV4cHIgLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGVudikgTmlsIGV4cHJzIGluXG4gICAgcmV0dXJuX3ZpYV9zaWRlX2NoYW5uZWwgKHZhbHVlX3RvX2pzIHJlc3VsdClcbiAgd2l0aFxuICB8IEV2YWxfZXJyb3IgbXNnIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJFcnJvcjogXCIgXiBtc2cpKVxuICB8IFBhcnNlX2Vycm9yIG1zZyAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiUGFyc2UgZXJyb3I6IFwiIF4gbXNnKSlcblxubGV0IGFwaV9ldmFsX2V4cHIgZXhwcl9qcyBfZW52X2pzID1cbiAgbGV0IGV4cHIgPSBqc190b192YWx1ZSBleHByX2pzIGluXG4gIHRyeVxuICAgIHJldHVybl92aWFfc2lkZV9jaGFubmVsICh2YWx1ZV90b19qcyAoU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZ2xvYmFsX2VudikpKVxuICB3aXRoIEV2YWxfZXJyb3IgbXNnIC0+XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIkVycm9yOiBcIiBeIG1zZykpXG5cbmxldCBhcGlfbG9hZCBzcmNfanMgPVxuICBsZXQgc3JjID0gSnMudG9fc3RyaW5nIHNyY19qcyBpblxuICB0cnlcbiAgICBsZXQgZXhwcnMgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHNyYyBpblxuICAgIGxldCBlbnYgPSBFbnYgZ2xvYmFsX2VudiBpblxuICAgIGxldCBjb3VudCA9IHJlZiAwIGluXG4gICAgTGlzdC5pdGVyIChmdW4gZXhwciAtPiBpZ25vcmUgKFN4X3JlZi5ldmFsX2V4cHIgZXhwciBlbnYpOyBpbmNyIGNvdW50KSBleHBycztcbiAgICBKcy5VbnNhZmUuaW5qZWN0ICFjb3VudFxuICB3aXRoXG4gIHwgRXZhbF9lcnJvciBtc2cgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIkVycm9yOiBcIiBeIG1zZykpXG4gIHwgUGFyc2VfZXJyb3IgbXNnIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJQYXJzZSBlcnJvcjogXCIgXiBtc2cpKVxuXG5sZXQgYXBpX3JlbmRlcl90b19odG1sIGV4cHJfanMgPVxuICBsZXQgZXhwciA9IGpzX3RvX3ZhbHVlIGV4cHJfanMgaW5cbiAgbGV0IHByZXYgPSAhX3N4X3JlbmRlcl9tb2RlIGluXG4gIF9zeF9yZW5kZXJfbW9kZSA6PSB0cnVlO1xuICAodHJ5XG4gICAgbGV0IGh0bWwgPSBTeF9yZW5kZXIucmVuZGVyX3RvX2h0bWwgZXhwciBnbG9iYWxfZW52IGluXG4gICAgX3N4X3JlbmRlcl9tb2RlIDo9IHByZXY7XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIGh0bWwpXG4gIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICBfc3hfcmVuZGVyX21vZGUgOj0gcHJldjtcbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiRXJyb3I6IFwiIF4gbXNnKSkpXG5cbmxldCBhcGlfc3RyaW5naWZ5IHZfanMgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKGluc3BlY3QgKGpzX3RvX3ZhbHVlIHZfanMpKSlcblxubGV0IGFwaV90eXBlX29mIHZfanMgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKHR5cGVfb2YgKGpzX3RvX3ZhbHVlIHZfanMpKSlcblxubGV0IGFwaV9pbnNwZWN0IHZfanMgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKGluc3BlY3QgKGpzX3RvX3ZhbHVlIHZfanMpKSlcblxubGV0IGFwaV9lbmdpbmUgKCkgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgXCJvY2FtbC12bS13YXNtXCIpXG5cbmxldCBhcGlfcmVnaXN0ZXJfbmF0aXZlIG5hbWVfanMgY2FsbGJhY2tfanMgPVxuICBsZXQgbmFtZSA9IEpzLnRvX3N0cmluZyBuYW1lX2pzIGluXG4gIGxldCBuYXRpdmVfZm4gYXJncyA9XG4gICAgbGV0IGpzX2FyZ3MgPSBhcmdzIHw+IExpc3QubWFwIHZhbHVlX3RvX2pzIHw+IEFycmF5Lm9mX2xpc3QgaW5cbiAgICBqc190b192YWx1ZSAoSnMuVW5zYWZlLmZ1bl9jYWxsIGNhbGxiYWNrX2pzIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLmFycmF5IGpzX2FyZ3MpIHxdKVxuICBpblxuICBpZ25vcmUgKGVudl9iaW5kIGdsb2JhbF9lbnYgbmFtZSAoTmF0aXZlRm4gKG5hbWUsIG5hdGl2ZV9mbikpKTtcbiAgSnMuVW5zYWZlLmluamVjdCBKcy5udWxsXG5cbmxldCBhcGlfY2FsbF9mbiBmbl9qcyBhcmdzX2pzID1cbiAgdHJ5XG4gICAgbGV0IGZuID0ganNfdG9fdmFsdWUgZm5fanMgaW5cbiAgICBsZXQgYXJncyA9IEFycmF5LnRvX2xpc3QgKEFycmF5Lm1hcCBqc190b192YWx1ZSAoSnMudG9fYXJyYXkgKEpzLlVuc2FmZS5jb2VyY2UgYXJnc19qcykpKSBpblxuICAgIHJldHVybl92aWFfc2lkZV9jaGFubmVsICh2YWx1ZV90b19qcyAoY2FsbF9zeF9mbiBmbiBhcmdzKSlcbiAgd2l0aFxuICB8IEV2YWxfZXJyb3IgbXNnIC0+XG4gICAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsXG4gICAgICAoSnMuVW5zYWZlLmdldCBKcy5VbnNhZmUuZ2xvYmFsIChKcy5zdHJpbmcgXCJjb25zb2xlXCIpKVxuICAgICAgXCJlcnJvclwiIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJbc3hdIGNhbGxGbjogXCIgXiBtc2cpKSB8XSk7XG4gICAgSnMuVW5zYWZlLmluamVjdCBKcy5udWxsXG4gIHwgZXhuIC0+XG4gICAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsXG4gICAgICAoSnMuVW5zYWZlLmdldCBKcy5VbnNhZmUuZ2xvYmFsIChKcy5zdHJpbmcgXCJjb25zb2xlXCIpKVxuICAgICAgXCJlcnJvclwiIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJbc3hdIGNhbGxGbjogXCIgXiBQcmludGV4Yy50b19zdHJpbmcgZXhuKSkgfF0pO1xuICAgIEpzLlVuc2FmZS5pbmplY3QgSnMubnVsbFxuXG5sZXQgYXBpX2lzX2NhbGxhYmxlIGZuX2pzID1cbiAgaWYgSnMuVW5zYWZlLmVxdWFscyBmbl9qcyBKcy5udWxsIHx8IEpzLlVuc2FmZS5lcXVhbHMgZm5fanMgSnMudW5kZWZpbmVkIHRoZW5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIGZhbHNlKVxuICBlbHNlXG4gICAgbGV0IGggPSBKcy5VbnNhZmUuZ2V0IGZuX2pzIChKcy5zdHJpbmcgXCJfX3N4X2hhbmRsZVwiKSBpblxuICAgIGlmIEpzLlVuc2FmZS5lcXVhbHMgaCBKcy51bmRlZmluZWQgdGhlbiBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIGZhbHNlKVxuICAgIGVsc2UgSnMuVW5zYWZlLmluamVjdCAoSnMuYm9vbCAoaXNfY2FsbGFibGUgKGdldF9oYW5kbGUgKEpzLmZsb2F0X29mX251bWJlciAoSnMuVW5zYWZlLmNvZXJjZSBoKSB8PiBpbnRfb2ZfZmxvYXQpKSkpXG5cbmxldCBhcGlfZm5fYXJpdHkgZm5fanMgPVxuICBsZXQgaCA9IEpzLlVuc2FmZS5nZXQgZm5fanMgKEpzLnN0cmluZyBcIl9fc3hfaGFuZGxlXCIpIGluXG4gIGlmIEpzLlVuc2FmZS5lcXVhbHMgaCBKcy51bmRlZmluZWQgdGhlbiBKcy5VbnNhZmUuaW5qZWN0IChKcy5udW1iZXJfb2ZfZmxvYXQgKC0xLjApKVxuICBlbHNlXG4gICAgbGV0IHYgPSBnZXRfaGFuZGxlIChKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UgaCkgfD4gaW50X29mX2Zsb2F0KSBpblxuICAgIG1hdGNoIHYgd2l0aFxuICAgIHwgTGFtYmRhIGwgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMubnVtYmVyX29mX2Zsb2F0IChmbG9hdF9vZl9pbnQgKExpc3QubGVuZ3RoIGwubF9wYXJhbXMpKSlcbiAgICB8IF8gLT4gSnMuVW5zYWZlLmluamVjdCAoSnMubnVtYmVyX29mX2Zsb2F0ICgtMS4wKSlcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBQbGF0Zm9ybSBiaW5kaW5ncyAocmVnaXN0ZXJlZCBpbiBnbG9iYWwgZW52KSAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0ICgpID1cbiAgbGV0IGJpbmQgbmFtZSBmbiA9IGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBuYW1lIChOYXRpdmVGbiAobmFtZSwgZm4pKSkgaW5cblxuICAoKiAtLS0gRXZhbHVhdGlvbiAtLS0gKilcbiAgYmluZCBcImNlay1ldmFsXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IGxldCBlID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzIGluIChtYXRjaCBlIHdpdGggaCA6OiBfIC0+IFN4X3JlZi5ldmFsX2V4cHIgaCAoRW52IGdsb2JhbF9lbnYpIHwgW10gLT4gTmlsKVxuICAgIHwgW2V4cHJdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBbZXhwcjsgZW52X3ZhbF0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGVudl92YWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstZXZhbDogZXhwZWN0ZWQgMS0yIGFyZ3NcIikpO1xuXG4gIGJpbmQgXCJldmFsLWV4cHItY2VrXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZXhwcjsgZV0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGVcbiAgICB8IFtleHByXSAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImV2YWwtZXhwci1jZWs6IGV4cGVjdGVkIDEtMiBhcmdzXCIpKTtcblxuICBiaW5kIFwiY2VrLWNhbGxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyBOaWxdIC0+IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2ZdKSAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBbZjsgTGlzdCBhbF0gLT4gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoZiA6OiBhbCkpIChFbnYgZ2xvYmFsX2VudilcbiAgICB8IFtmOyBhXSAtPiBTeF9yZWYuZXZhbF9leHByIChMaXN0IFtmOyBhXSkgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgW2ZdIC0+IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2ZdKSAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBmIDo6IHJlc3QgLT4gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoZiA6OiByZXN0KSkgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlay1jYWxsOiBleHBlY3RlZCBmdW5jdGlvbiBhbmQgYXJnc1wiKSk7XG5cbiAgYmluZCBcInN4LXBhcnNlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNyY10gLT4gTGlzdCAoU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3gtcGFyc2U6IGV4cGVjdGVkIHN0cmluZ1wiKSk7XG5cbiAgYmluZCBcInN4LXNlcmlhbGl6ZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3ZdIC0+IFN0cmluZyAoaW5zcGVjdCB2KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN4LXNlcmlhbGl6ZTogZXhwZWN0ZWQgMSBhcmdcIikpO1xuXG4gICgqIC0tLSBBc3NlcnRpb25zICYgZXF1YWxpdHkgLS0tICopXG4gIGxldCByZWMgZGVlcF9lcXVhbCBhIGIgPVxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgTmlsLCBOaWwgLT4gdHJ1ZSB8IEJvb2wgYSwgQm9vbCBiIC0+IGEgPSBiXG4gICAgfCBOdW1iZXIgYSwgTnVtYmVyIGIgLT4gYSA9IGIgfCBTdHJpbmcgYSwgU3RyaW5nIGIgLT4gYSA9IGJcbiAgICB8IFN5bWJvbCBhLCBTeW1ib2wgYiAtPiBhID0gYiB8IEtleXdvcmQgYSwgS2V5d29yZCBiIC0+IGEgPSBiXG4gICAgfCAoTGlzdCBhIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gYSB9KSwgKExpc3QgYiB8IExpc3RSZWYgeyBjb250ZW50cyA9IGIgfSkgLT5cbiAgICAgIExpc3QubGVuZ3RoIGEgPSBMaXN0Lmxlbmd0aCBiICYmIExpc3QuZm9yX2FsbDIgZGVlcF9lcXVhbCBhIGJcbiAgICB8IERpY3QgYSwgRGljdCBiIC0+XG4gICAgICBsZXQga2EgPSBIYXNodGJsLmZvbGQgKGZ1biBrIF8gYWNjIC0+IGsgOjogYWNjKSBhIFtdIGluXG4gICAgICBsZXQga2IgPSBIYXNodGJsLmZvbGQgKGZ1biBrIF8gYWNjIC0+IGsgOjogYWNjKSBiIFtdIGluXG4gICAgICBMaXN0Lmxlbmd0aCBrYSA9IExpc3QubGVuZ3RoIGtiICYmXG4gICAgICBMaXN0LmZvcl9hbGwgKGZ1biBrIC0+IEhhc2h0YmwubWVtIGIgayAmJlxuICAgICAgICBkZWVwX2VxdWFsIChIYXNodGJsLmZpbmQgYSBrKSAoSGFzaHRibC5maW5kIGIgaykpIGthXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGJpbmQgXCJlcXVhbD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFthOyBiXSAtPiBCb29sIChkZWVwX2VxdWFsIGEgYikgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZXF1YWw/OiAyIGFyZ3NcIikpO1xuICBiaW5kIFwiYXNzZXJ0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbY29uZF0gLT4gaWYgbm90IChzeF90cnV0aHkgY29uZCkgdGhlbiByYWlzZSAoRXZhbF9lcnJvciBcIkFzc2VydGlvbiBmYWlsZWRcIik7IEJvb2wgdHJ1ZVxuICAgIHwgW2NvbmQ7IG1zZ10gLT4gaWYgbm90IChzeF90cnV0aHkgY29uZCkgdGhlbiByYWlzZSAoRXZhbF9lcnJvciAoXCJBc3NlcnRpb246IFwiIF4gdmFsdWVfdG9fc3RyaW5nIG1zZykpOyBCb29sIHRydWVcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJhc3NlcnQ6IDEtMiBhcmdzXCIpKTtcblxuICBiaW5kIFwidHJ5LWNhbGxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFt0aHVua10gLT5cbiAgICAgICh0cnkgaWdub3JlIChTeF9yZWYuZXZhbF9leHByIChMaXN0IFt0aHVua10pIChFbnYgZ2xvYmFsX2VudikpO1xuICAgICAgICBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDIgaW4gSGFzaHRibC5yZXBsYWNlIGQgXCJva1wiIChCb29sIHRydWUpOyBEaWN0IGRcbiAgICAgIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICAgICAgbGV0IGQgPSBIYXNodGJsLmNyZWF0ZSAyIGluIEhhc2h0YmwucmVwbGFjZSBkIFwib2tcIiAoQm9vbCBmYWxzZSk7IEhhc2h0YmwucmVwbGFjZSBkIFwiZXJyb3JcIiAoU3RyaW5nIG1zZyk7IERpY3QgZClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ0cnktY2FsbDogMSBhcmdcIikpO1xuXG4gICgqIC0tLSBMaXN0IG11dGF0aW9uIC0tLSAqKVxuICBiaW5kIFwiYXBwZW5kIVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3RSZWYgcjsgdl0gLT4gciA6PSAhciBAIFt2XTsgTGlzdFJlZiByXG4gICAgfCBbTGlzdCBpdGVtczsgdl0gLT4gTGlzdCAoaXRlbXMgQCBbdl0pXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYXBwZW5kITogbGlzdCBhbmQgdmFsdWVcIikpO1xuXG4gICgqIC0tLSBFbnZpcm9ubWVudCBvcHMgLS0tICopXG4gICgqIFVzZSB1bndyYXBfZW52IGZvciBuaWwvZGljdCB0b2xlcmFuY2UsIG1hdGNoaW5nIHRoZSBzZXJ2ZXIga2VybmVsICopXG4gIGxldCB1dyA9IFN4X3J1bnRpbWUudW53cmFwX2VudiBpblxuICBiaW5kIFwibWFrZS1lbnZcIiAoZnVuIF8gLT4gRW52IChtYWtlX2VudiAoKSkpO1xuICBiaW5kIFwiZ2xvYmFsLWVudlwiIChmdW4gXyAtPiBFbnYgZ2xvYmFsX2Vudik7XG4gIGJpbmQgXCJlbnYtaGFzP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2U7IFN0cmluZyBrXSB8IFtlOyBLZXl3b3JkIGtdIC0+IEJvb2wgKGVudl9oYXMgKHV3IGUpIGspIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1oYXM/XCIpKTtcbiAgYmluZCBcImVudi1nZXRcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtlOyBTdHJpbmcga10gfCBbZTsgS2V5d29yZCBrXSAtPiBlbnZfZ2V0ICh1dyBlKSBrIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1nZXRcIikpO1xuICBiaW5kIFwiZW52LWJpbmQhXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbZTsgU3RyaW5nIGs7IHZdIHwgW2U7IEtleXdvcmQgazsgdl0gLT4gZW52X2JpbmQgKHV3IGUpIGsgdiB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJlbnYtYmluZCFcIikpO1xuICBiaW5kIFwiZW52LXNldCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtlOyBTdHJpbmcgazsgdl0gfCBbZTsgS2V5d29yZCBrOyB2XSAtPiBlbnZfc2V0ICh1dyBlKSBrIHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW52LXNldCFcIikpO1xuICBiaW5kIFwiZW52LWV4dGVuZFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2VdIC0+IEVudiAoZW52X2V4dGVuZCAodXcgZSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1leHRlbmRcIikpO1xuICBiaW5kIFwiZW52LW1lcmdlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbYTsgYl0gLT4gU3hfcnVudGltZS5lbnZfbWVyZ2UgYSBiIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1tZXJnZVwiKSk7XG5cbiAgKCogLS0tIFR5cGUgY29uc3RydWN0b3JzIC0tLSAqKVxuICBiaW5kIFwibWFrZS1zeW1ib2xcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTdHJpbmcgc10gLT4gU3ltYm9sIHMgfCBbdl0gLT4gU3ltYm9sICh2YWx1ZV90b19zdHJpbmcgdikgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFrZS1zeW1ib2xcIikpO1xuICBiaW5kIFwibWFrZS1rZXl3b3JkXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+IEtleXdvcmQgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLWtleXdvcmRcIikpO1xuICBiaW5kIFwia2V5d29yZC1uYW1lXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbS2V5d29yZCBrXSAtPiBTdHJpbmcgayB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJrZXl3b3JkLW5hbWVcIikpO1xuICBiaW5kIFwic3ltYm9sLW5hbWVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTeW1ib2wgc10gLT4gU3RyaW5nIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3ltYm9sLW5hbWVcIikpO1xuXG4gICgqIC0tLSBDb21wb25lbnQvSXNsYW5kIGFjY2Vzc29ycyAobXVzdCBoYW5kbGUgYm90aCB0eXBlcykgLS0tICopXG4gIGJpbmQgXCJjb21wb25lbnQtbmFtZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQ29tcG9uZW50IGNdIC0+IFN0cmluZyBjLmNfbmFtZSB8IFtJc2xhbmQgaV0gLT4gU3RyaW5nIGkuaV9uYW1lIHwgXyAtPiBTdHJpbmcgXCJcIik7XG4gIGJpbmQgXCJjb21wb25lbnQtY2xvc3VyZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQ29tcG9uZW50IGNdIC0+IEVudiBjLmNfY2xvc3VyZSB8IFtJc2xhbmQgaV0gLT4gRW52IGkuaV9jbG9zdXJlIHwgXyAtPiBEaWN0IChIYXNodGJsLmNyZWF0ZSAwKSk7XG4gIGJpbmQgXCJjb21wb25lbnQtcGFyYW1zXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgYy5jX3BhcmFtcylcbiAgICB8IFtJc2xhbmQgaV0gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBpLmlfcGFyYW1zKVxuICAgIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwiY29tcG9uZW50LWJvZHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBjXSAtPiBjLmNfYm9keSB8IFtJc2xhbmQgaV0gLT4gaS5pX2JvZHkgfCBfIC0+IE5pbCk7XG4gIGxldCBoYXNfY2hpbGRyZW5faW1wbCA9IE5hdGl2ZUZuIChcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIsIGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgY10gLT4gQm9vbCBjLmNfaGFzX2NoaWxkcmVuIHwgW0lzbGFuZCBpXSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW4gfCBfIC0+IEJvb2wgZmFsc2UpIGluXG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW5cIiBoYXNfY2hpbGRyZW5faW1wbCk7XG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIgaGFzX2NoaWxkcmVuX2ltcGwpO1xuICBiaW5kIFwiY29tcG9uZW50LWFmZmluaXR5XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgY10gLT4gU3RyaW5nIGMuY19hZmZpbml0eSB8IFtJc2xhbmQgX10gLT4gU3RyaW5nIFwiY2xpZW50XCIgfCBfIC0+IFN0cmluZyBcImF1dG9cIik7XG4gIGJpbmQgXCJjb21wb25lbnQtcGFyYW0tdHlwZXNcIiAoZnVuIF8gLT4gTmlsKTtcbiAgYmluZCBcImNvbXBvbmVudC1zZXQtcGFyYW0tdHlwZXMhXCIgKGZ1biBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIENFSyBzdGVwcGluZyAtLS0gKilcbiAgYmluZCBcIm1ha2UtY2VrLXN0YXRlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbYzsgZTsga10gLT4gU3hfcmVmLm1ha2VfY2VrX3N0YXRlIGMgZSBrIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2UtY2VrLXN0YXRlXCIpKTtcbiAgYmluZCBcImNlay1zdGVwXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbc10gLT4gU3hfcmVmLmNla19zdGVwIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLXN0ZXBcIikpO1xuICBiaW5kIFwiY2VrLXBoYXNlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbc10gLT4gU3hfcmVmLmNla19waGFzZSBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlay1waGFzZVwiKSk7XG4gIGJpbmQgXCJjZWstdmFsdWVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX3ZhbHVlIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLXZhbHVlXCIpKTtcbiAgYmluZCBcImNlay10ZXJtaW5hbD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX3Rlcm1pbmFsX3AgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstdGVybWluYWw/XCIpKTtcbiAgYmluZCBcImNlay1rb250XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbc10gLT4gU3hfcmVmLmNla19rb250IHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLWtvbnRcIikpO1xuICBiaW5kIFwiZnJhbWUtdHlwZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2ZdIC0+IFN4X3JlZi5mcmFtZV90eXBlIGYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZnJhbWUtdHlwZVwiKSk7XG5cbiAgKCogLS0tIFN0cmljdCBtb2RlIC0tLSAqKVxuICBpZ25vcmUgKGVudl9iaW5kIGdsb2JhbF9lbnYgXCIqc3RyaWN0KlwiIChCb29sIGZhbHNlKSk7XG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIipwcmltLXBhcmFtLXR5cGVzKlwiIE5pbCk7XG4gIGJpbmQgXCJzZXQtc3RyaWN0IVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+IFN4X3JlZi5fc3RyaWN0X3JlZiA6PSB2OyBpZ25vcmUgKGVudl9zZXQgZ2xvYmFsX2VudiBcIipzdHJpY3QqXCIgdik7IE5pbCB8IF8gLT4gTmlsKTtcbiAgYmluZCBcInNldC1wcmltLXBhcmFtLXR5cGVzIVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+IFN4X3JlZi5fcHJpbV9wYXJhbV90eXBlc19yZWYgOj0gdjsgaWdub3JlIChlbnZfc2V0IGdsb2JhbF9lbnYgXCIqcHJpbS1wYXJhbS10eXBlcypcIiB2KTsgTmlsIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwidmFsdWUtbWF0Y2hlcy10eXBlP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3Y7IHRdIC0+IFN4X3JlZi52YWx1ZV9tYXRjaGVzX3R5cGVfcCB2IHQgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIEFwcGx5IC0tLSAqKVxuICBiaW5kIFwiYXBwbHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IGYgOjogcmVzdCAtPlxuICAgICAgbGV0IGFsbF9hcmdzID0gbWF0Y2ggTGlzdC5yZXYgcmVzdCB3aXRoIExpc3QgbGFzdCA6OiBwcmVmaXggLT4gTGlzdC5yZXYgcHJlZml4IEAgbGFzdCB8IF8gLT4gcmVzdCBpblxuICAgICAgU3hfcnVudGltZS5zeF9jYWxsIGYgYWxsX2FyZ3NcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJhcHBseVwiKSk7XG5cbiAgKCogLS0tIFNjb3BlIHN0YWNrIC0tLSAqKVxuICAoKiBTY29wZSBwcmltaXRpdmVzIChzY29wZS1wdXNoISwgc2NvcGUtcG9wISwgY29udGV4dCwgY29sbGVjdCEsIGNvbGxlY3RlZCxcbiAgICAgZW1pdCEsIGVtaXR0ZWQsIHNjb3BlLWVtaXQhLCBzY29wZS1lbWl0dGVkLCBldGMuKSBhcmUgcmVnaXN0ZXJlZCBieVxuICAgICBTeF9zY29wZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gaW4gdGhlIHByaW1pdGl2ZXMgdGFibGUuXG4gICAgIFRoZSBDRUsgZXZhbHVhdG9yIGZhbGxzIHRocm91Z2ggdG8gdGhlIHByaW1pdGl2ZXMgdGFibGUgd2hlbiBhIHN5bWJvbFxuICAgICBpc24ndCBpbiB0aGUgZW52LCBzbyB0aGVzZSB3b3JrIGF1dG9tYXRpY2FsbHkuXG4gICAgIE9ubHkgcHJvdmlkZS1wdXNoIS9wcm92aWRlLXBvcCEgbmVlZCBleHBsaWNpdCBlbnYgYmluZGluZ3MgYXMgYWxpYXNlcy4gKilcbiAgYmluZCBcInByb3ZpZGUtcHVzaCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtuOyB2XSAtPiBTeF9ydW50aW1lLnByb3ZpZGVfcHVzaCBuIHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicHJvdmlkZS1wdXNoIVwiKSk7XG4gIGJpbmQgXCJwcm92aWRlLXBvcCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtuXSAtPiBTeF9ydW50aW1lLnByb3ZpZGVfcG9wIG4gfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicHJvdmlkZS1wb3AhXCIpKTtcblxuICAoKiAtLS0gRnJhZ21lbnQgLyByYXcgSFRNTCAtLS0gKilcbiAgYmluZCBcIjw+XCIgKGZ1biBhcmdzIC0+XG4gICAgUmF3SFRNTCAoU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCAoZnVuIGEgLT5cbiAgICAgIG1hdGNoIGEgd2l0aCBTdHJpbmcgcyB8IFJhd0hUTUwgcyAtPiBzIHwgTmlsIC0+IFwiXCJcbiAgICAgIHwgTGlzdCBfIC0+IFN4X3JlbmRlci5yZW5kZXJfdG9faHRtbCBhIGdsb2JhbF9lbnZcbiAgICAgIHwgXyAtPiB2YWx1ZV90b19zdHJpbmcgYSkgYXJncykpKTtcbiAgYmluZCBcInJhdyFcIiAoZnVuIGFyZ3MgLT5cbiAgICBSYXdIVE1MIChTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gYSAtPlxuICAgICAgbWF0Y2ggYSB3aXRoIFN0cmluZyBzIHwgUmF3SFRNTCBzIC0+IHMgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyBhKSBhcmdzKSkpO1xuXG4gIGJpbmQgXCJkZWZpbmUtcGFnZS1oZWxwZXJcIiAoZnVuIF8gLT4gTmlsKTtcblxuICAoKiAtLS0gUmVuZGVyIC0tLSAqKVxuICBTeF9yZW5kZXIuc2V0dXBfcmVuZGVyX2VudiBnbG9iYWxfZW52O1xuICBiaW5kIFwic2V0LXJlbmRlci1hY3RpdmUhXCIgKGZ1biBfIC0+IE5pbCk7XG4gIGJpbmQgXCJyZW5kZXItYWN0aXZlP1wiIChmdW4gXyAtPiBCb29sIHRydWUpO1xuICBiaW5kIFwiaXMtaHRtbC10YWc/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+IEJvb2wgKFN4X3JlbmRlci5pc19odG1sX3RhZyBzKSB8IF8gLT4gQm9vbCBmYWxzZSk7XG5cbiAgKCogLS0tIFJlbmRlciBjb25zdGFudHMgbmVlZGVkIGJ5IHdlYiBhZGFwdGVycyAtLS0gKilcbiAgbGV0IGh0bWxfdGFncyA9IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgU3hfcmVuZGVyLmh0bWxfdGFncykgaW5cbiAgbGV0IHZvaWRfZWxlbWVudHMgPSBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIFN4X3JlbmRlci52b2lkX2VsZW1lbnRzKSBpblxuICBsZXQgYm9vbGVhbl9hdHRycyA9IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgU3hfcmVuZGVyLmJvb2xlYW5fYXR0cnMpIGluXG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIkhUTUxfVEFHU1wiIGh0bWxfdGFncyk7XG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIlZPSURfRUxFTUVOVFNcIiB2b2lkX2VsZW1lbnRzKTtcbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiQk9PTEVBTl9BVFRSU1wiIGJvb2xlYW5fYXR0cnMpO1xuXG4gICgqIC0tLSBFdmFsdWF0b3IgYnJpZGdlIGZ1bmN0aW9ucyBuZWVkZWQgYnkgc3BlYyAuc3ggZmlsZXMgLS0tICopXG4gIGJpbmQgXCJldmFsLWV4cHJcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2V4cHI7IGVdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciBlIHwgW2V4cHJdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGdsb2JhbF9lbnYpIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwidHJhbXBvbGluZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+ICFTeF9wcmltaXRpdmVzLl9zeF90cmFtcG9saW5lX2ZuIHYgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJleHBhbmQtbWFjcm9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW21hYzsgcmF3OyBFbnYgZV0gLT4gU3hfcmVmLmV4cGFuZF9tYWNybyBtYWMgcmF3IChFbnYgZSkgfCBbbWFjOyByYXddIC0+IFN4X3JlZi5leHBhbmRfbWFjcm8gbWFjIHJhdyAoRW52IGdsb2JhbF9lbnYpIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwiY2FsbC1sYW1iZGFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmbl92YWw7IGNhbGxfYXJnczsgRW52IF9lXSAtPiBTeF9yZWYuY2VrX2NhbGwgZm5fdmFsIGNhbGxfYXJnc1xuICAgIHwgW2ZuX3ZhbDsgY2FsbF9hcmdzXSAtPiBTeF9yZWYuY2VrX2NhbGwgZm5fdmFsIGNhbGxfYXJnc1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNhbGwtbGFtYmRhOiBleHBlY3RlZCAoZm4gYXJncyBlbnY/KVwiKSk7XG4gIGJpbmQgXCJjZWstY2FsbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbZjsgYV0gLT4gU3hfcmVmLmNla19jYWxsIGYgYSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstY2FsbFwiKSk7XG4gIGJpbmQgXCJjZWstZXZhbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbZXhwcl0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZ2xvYmFsX2VudikgfCBbZXhwcjsgZV0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGUgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJxcS1leHBhbmQtcnVudGltZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbdGVtcGxhdGVdIC0+IFN4X3JlZi5xcV9leHBhbmQgdGVtcGxhdGUgKEVudiBnbG9iYWxfZW52KSB8IFt0ZW1wbGF0ZTsgRW52IGVdIC0+IFN4X3JlZi5xcV9leHBhbmQgdGVtcGxhdGUgKEVudiBlKSB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gVHlwZSBwcmVkaWNhdGVzIG5lZWRlZCBieSBhZGFwdGVycyAtLS0gKilcbiAgYmluZCBcInRodW5rP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1RodW5rIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJ0aHVuay1leHByXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdl0gLT4gdGh1bmtfZXhwciB2IHwgXyAtPiBOaWwpO1xuICBiaW5kIFwidGh1bmstZW52XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbdl0gLT4gdGh1bmtfZW52IHYgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJsYW1iZGE/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJtYWNybz9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtNYWNybyBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwiaXNsYW5kP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0lzbGFuZCBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwiY29tcG9uZW50P1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBfXSB8IFtJc2xhbmQgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgYmluZCBcImNhbGxhYmxlP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW05hdGl2ZUZuIF9dIHwgW0xhbWJkYSBfXSB8IFtDb21wb25lbnQgX10gfCBbSXNsYW5kIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJzcHJlYWQ/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3ByZWFkIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJjb250aW51YXRpb24/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbQ29udGludWF0aW9uIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJsYW1iZGEtcGFyYW1zXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIGxdIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgbC5sX3BhcmFtcykgfCBfIC0+IExpc3QgW10pO1xuICBiaW5kIFwibGFtYmRhLWJvZHlcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtMYW1iZGEgbF0gLT4gbC5sX2JvZHkgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJsYW1iZGEtY2xvc3VyZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBsXSAtPiBFbnYgbC5sX2Nsb3N1cmUgfCBfIC0+IERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKTtcblxuICAoKiAtLS0gQ29yZSBvcGVyYXRpb25zIG5lZWRlZCBieSBhZGFwdGVycyAtLS0gKilcbiAgYmluZCBcInNwcmVhZC1hdHRyc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbU3ByZWFkIHBhaXJzXSAtPiBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDQgaW4gTGlzdC5pdGVyIChmdW4gKGssIHYpIC0+IEhhc2h0YmwucmVwbGFjZSBkIGsgdikgcGFpcnM7IERpY3QgZCB8IF8gLT4gRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpO1xuICBiaW5kIFwibWFrZS1zcHJlYWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0RpY3QgZF0gLT4gU3ByZWFkIChIYXNodGJsLmZvbGQgKGZ1biBrIHYgYWNjIC0+IChrLCB2KSA6OiBhY2MpIGQgW10pIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwibWFrZS1yYXctaHRtbFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBSYXdIVE1MIHMgfCBbdl0gLT4gUmF3SFRNTCAodmFsdWVfdG9fc3RyaW5nIHYpIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwicmF3LWh0bWwtY29udGVudFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1Jhd0hUTUwgc10gLT4gU3RyaW5nIHMgfCBbU3RyaW5nIHNdIC0+IFN0cmluZyBzIHwgXyAtPiBTdHJpbmcgXCJcIik7XG4gIGJpbmQgXCJlbXB0eS1kaWN0P1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0RpY3QgZF0gLT4gQm9vbCAoSGFzaHRibC5sZW5ndGggZCA9IDApIHwgXyAtPiBCb29sIHRydWUpO1xuICBiaW5kIFwiaWRlbnRpY2FsP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2E7IGJdIC0+IEJvb2wgKGEgPT0gYikgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaWRlbnRpY2FsP1wiKSk7XG4gIGJpbmQgXCJmb3ItZWFjaC1pbmRleGVkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZm5fdmFsOyBMaXN0IGl0ZW1zXSB8IFtmbl92YWw7IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH1dIC0+XG4gICAgICBMaXN0Lml0ZXJpIChmdW4gaSBpdGVtIC0+XG4gICAgICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciAoTGlzdCBbZm5fdmFsOyBOdW1iZXIgKGZsb2F0X29mX2ludCBpKTsgaXRlbV0pIChFbnYgZ2xvYmFsX2VudikpXG4gICAgICApIGl0ZW1zOyBOaWxcbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gU3RyaW5nL251bWJlciBoZWxwZXJzIHVzZWQgYnkgb3JjaGVzdHJhdGlvbi9icm93c2VyIC0tLSAqKVxuICBiaW5kIFwibWFrZS1zeC1leHByXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+IFN4RXhwciBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2Utc3gtZXhwclwiKSk7XG4gIGJpbmQgXCJzeC1leHByLXNvdXJjZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N4RXhwciBzXSAtPiBTdHJpbmcgcyB8IFtTdHJpbmcgc10gLT4gU3RyaW5nIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3gtZXhwci1zb3VyY2VcIikpO1xuICBiaW5kIFwicGFyc2UtaW50XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+ICh0cnkgTnVtYmVyIChmbG9hdF9vZl9pbnQgKGludF9vZl9zdHJpbmcgcykpIHdpdGggXyAtPiBOaWwpXG4gICAgfCBbU3RyaW5nIHM7IGRlZmF1bHRfdmFsXSAtPiAodHJ5IE51bWJlciAoZmxvYXRfb2ZfaW50IChpbnRfb2Zfc3RyaW5nIHMpKSB3aXRoIF8gLT4gZGVmYXVsdF92YWwpXG4gICAgfCBbTnVtYmVyIG5dIHwgW051bWJlciBuOyBfXSAtPiBOdW1iZXIgKEZsb2F0LnJvdW5kIG4pXG4gICAgfCBbXzsgZGVmYXVsdF92YWxdIC0+IGRlZmF1bHRfdmFsIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwicGFyc2UtbnVtYmVyXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+ICh0cnkgTnVtYmVyIChmbG9hdF9vZl9zdHJpbmcgcykgd2l0aCBfIC0+IE5pbCkgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIFNlcnZlci1vbmx5IHN0dWJzIChuby1vcHMgaW4gYnJvd3NlcikgLS0tICopXG4gIGJpbmQgXCJxdWVyeVwiIChmdW4gXyAtPiBOaWwpO1xuICBiaW5kIFwiYWN0aW9uXCIgKGZ1biBfIC0+IE5pbCk7XG4gIGJpbmQgXCJyZXF1ZXN0LWFyZ1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW187IGRdIC0+IGQgfCBfIC0+IE5pbCk7XG4gIGJpbmQgXCJyZXF1ZXN0LW1ldGhvZFwiIChmdW4gXyAtPiBTdHJpbmcgXCJHRVRcIik7XG4gIGJpbmQgXCJjdHhcIiAoZnVuIF8gLT4gTmlsKTtcbiAgYmluZCBcImhlbHBlclwiIChmdW4gXyAtPiBOaWwpXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogUmVnaXN0ZXIgZ2xvYmFsIFN4S2VybmVsIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbmxldCAoKSA9XG4gIGxldCBzeCA9IEpzLlVuc2FmZS5vYmogW3x8XSBpblxuICBsZXQgd3JhcCBmbiA9IEpzLlVuc2FmZS5mdW5fY2FsbFxuICAgIChKcy5VbnNhZmUucHVyZV9qc19leHByIFwiKGZ1bmN0aW9uKGZuKSB7IHJldHVybiBmdW5jdGlvbigpIHsgZ2xvYmFsVGhpcy5fX3N4UiA9IHVuZGVmaW5lZDsgdmFyIHIgPSBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpOyByZXR1cm4gZ2xvYmFsVGhpcy5fX3N4UiAhPT0gdW5kZWZpbmVkID8gZ2xvYmFsVGhpcy5fX3N4UiA6IHI7IH07IH0pXCIpXG4gICAgW3wgSnMuVW5zYWZlLmluamVjdCAoSnMud3JhcF9jYWxsYmFjayBmbikgfF0gaW5cblxuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJwYXJzZVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfcGFyc2UpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJzdHJpbmdpZnlcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX3N0cmluZ2lmeSk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImV2YWxcIikgKHdyYXAgYXBpX2V2YWwpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJldmFsRXhwclwiKSAod3JhcCBhcGlfZXZhbF9leHByKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwicmVuZGVyVG9IdG1sXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9yZW5kZXJfdG9faHRtbCk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImxvYWRcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX2xvYWQpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJ0eXBlT2ZcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX3R5cGVfb2YpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJpbnNwZWN0XCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9pbnNwZWN0KTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiZW5naW5lXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9lbmdpbmUpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJyZWdpc3Rlck5hdGl2ZVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfcmVnaXN0ZXJfbmF0aXZlKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwibG9hZFNvdXJjZVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfbG9hZCk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImNhbGxGblwiKSAod3JhcCBhcGlfY2FsbF9mbik7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImlzQ2FsbGFibGVcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX2lzX2NhbGxhYmxlKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiZm5Bcml0eVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfZm5fYXJpdHkpO1xuXG4gIEpzLlVuc2FmZS5zZXQgSnMuVW5zYWZlLmdsb2JhbCAoSnMuc3RyaW5nIFwiU3hLZXJuZWxcIikgc3hcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9pbnRfb2Zfc3RyaW5nIiwiY2FtbF9qc19mcm9tX2FycmF5IiwiY2FtbF9qc193cmFwX2NhbGxiYWNrIiwiY2FtbF9qc3N0cmluZ19vZl9zdHJpbmciLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3N0cmluZ19vZl9qc3N0cmluZyIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTeF90eXBlcyIsIlN0ZGxpYiIsIkpzX29mX29jYW1sX0pzIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9PcHRpb24iLCJTeF9yZWYiLCJTeF9wcmltaXRpdmVzIiwiU3hfcmVuZGVyIiwiU3RkbGliX1N0cmluZyIsIlN4X3J1bnRpbWUiLCJTeF9wYXJzZXIiLCJTdGRsaWJfUHJpbnRleGMiLCJTdGRsaWJfUHJpbnRmIiwiU3hfc2NvcGUiLCJoYW5kbGVfdGFibGUiLCJuZXh0X2hhbmRsZSIsImFsbG9jX2hhbmRsZSIsInYiLCJpZCIsImdldF9oYW5kbGUiLCJtYXRjaCIsImFsbG9jX2hvc3RfaGFuZGxlIiwiZ2xvYmFsX2VudiIsImNhbGxfc3hfZm4iLCJmbiIsImFyZ3MiLCJ0YWdfZm4iLCJkdW1teSIsImNzdF9ob3N0X2hhbmRsZSIsImNzdF9kaWN0IiwiY3N0X2tleXdvcmQiLCJjc3RfbGlzdCIsImNzdF9zeW1ib2wiLCJ2YWx1ZV90b19qcyIsImIiLCJuIiwicyIsImsiLCJpdGVtcyIsImQiLCJvYmoiLCJoYW5kbGUiLCJpbm5lciIsImFyZ3NfanMiLCJhcmciLCJyZXN1bHQiLCJleG4iLCJtc2ciLCJhcnIiLCJuZXh0X2hvc3RfaGFuZGxlIiwianNfdG9fdmFsdWUiLCJ0eSIsImgiLCJqc19hcmdzIiwidHlwZV9maWVsZCIsInQwIiwidDEiLCJpIiwidGFnIiwiaXRlbXNfanMiLCJ0MyIsInQ0Iiwia2V5cyIsImxlbiIsInJldHVybl92aWFfc2lkZV9jaGFubmVsIiwiY3N0X1BhcnNlX2Vycm9yIiwiYXBpX3BhcnNlIiwic3JjX2pzIiwic3JjIiwidmFsdWVzIiwiY3N0X0Vycm9yIiwiYXBpX2V2YWwiLCJleHBycyIsImVudiIsImFjYyIsImV4cHIiLCJhcGlfZXZhbF9leHByIiwiZXhwcl9qcyIsImVudl9qcyIsImFwaV9sb2FkIiwiY291bnQiLCJzeF9yZW5kZXJfbW9kZSIsImFwaV9yZW5kZXJfdG9faHRtbCIsInByZXYiLCJodG1sIiwiYXBpX3N0cmluZ2lmeSIsInZfanMiLCJhcGlfdHlwZV9vZiIsImFwaV9pbnNwZWN0IiwiYXBpX2VuZ2luZSIsInBhcmFtIiwiYXBpX3JlZ2lzdGVyX25hdGl2ZSIsIm5hbWVfanMiLCJjYWxsYmFja19qcyIsIm5hbWUiLCJuYXRpdmVfZm4iLCJhcGlfY2FsbF9mbiIsImZuX2pzIiwiY3N0X3N4X2NhbGxGbiIsImFwaV9pc19jYWxsYWJsZSIsImFwaV9mbl9hcml0eSIsImwiLCJiaW5kIiwiY3N0X2Nla19ldmFsIiwiZSIsImVudl92YWwiLCJjc3RfY2VrX2NhbGwiLCJhIiwiYWwiLCJyZXN0IiwiZGVlcF9lcXVhbCIsImthIiwia2IiLCJjb25kIiwidGh1bmsiLCJjc3Rfb2siLCJyIiwidXciLCJjc3RfZW52X2hhcyIsImNzdF9lbnZfZ2V0IiwiY3N0X2Vudl9iaW5kIiwiY3N0X2Vudl9zZXQiLCJjc3RfZW52X2V4dGVuZCIsImNzdF9lbnZfbWVyZ2UiLCJjc3RfbWFrZV9zeW1ib2wiLCJjc3RfbWFrZV9rZXl3b3JkIiwiY3N0X2tleXdvcmRfbmFtZSIsImNzdF9zeW1ib2xfbmFtZSIsImNzdCIsImMiLCJjc3RfY29tcG9uZW50X2hhc19jaGlsZHJlbiIsImhhc19jaGlsZHJlbl9pbXBsIiwiY3N0X21ha2VfY2VrX3N0YXRlIiwiY3N0X2Nla19zdGVwIiwiY3N0X2Nla19waGFzZSIsImNzdF9jZWtfdmFsdWUiLCJjc3RfY2VrX3Rlcm1pbmFsIiwiY3N0X2Nla19rb250IiwiY3N0X2ZyYW1lX3R5cGUiLCJjc3Rfc3RyaWN0IiwiY3N0X3ByaW1fcGFyYW1fdHlwZXMiLCJ0IiwiY3N0X2FwcGx5IiwiYWxsX2FyZ3MiLCJwcmVmaXgiLCJsYXN0IiwiY3N0X3Byb3ZpZGVfcHVzaCIsImNzdF9wcm92aWRlX3BvcCIsImh0bWxfdGFncyIsInZvaWRfZWxlbWVudHMiLCJib29sZWFuX2F0dHJzIiwicmF3IiwibWFjIiwiY2FsbF9hcmdzIiwiZm5fdmFsIiwidGVtcGxhdGUiLCJwYWlycyIsImNzdF9pZGVudGljYWwiLCJpdGVtIiwiY3N0X21ha2Vfc3hfZXhwciIsImNzdF9zeF9leHByX3NvdXJjZSIsImRlZmF1bHRfdmFsIiwid3JhcCIsInN4Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLDBCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQywwQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsZUNvQjZDO0FBQUEsSUFBQUMsY0RwQjdDO0FBQUEsWUFBQUMsYUFBQUM7QUFBQUEsUUFBQUMsS0N1QkU7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQWtDO0FBQUEsR0FDaEM7QUFBQTtBQUFBO0FBQUEsTUFOMkQ7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUQ7QUFBQUEsUUFBQUUsUUFTdkQ7QUFBQSxJQUFpQyxjQUFBSCxJQUFBLFVBQzNCO0FBQUEsWUFDZ0I7QUFBQSxJQUEyQztBQUFBLEdBQUM7QUFBQTtBQUFBLElBQUFJO0FBQUFBLE1EL0IxRTtBQUFBLGdCQUFBLFFBQUE7QUFBQSxRQUFBLG9DQUFBLEtBQUEsYUFBQSxTQUFBLENBQUE7QUFBQSxrQ0FBQSxZQUFBLENBQUEsRUFBQTtBQUFBLE9BQUE7QUFBQSxPQUFBO0FBQUEsR0NzRFM7QUFBQSxPQUFBQyxhQUVRO0FBQUEsWUFBQUMsV0FBQUMsSUFBQUM7QUFBQUEsSUFJZixtRUFBcUQ7QUFBQTtBQUFBLFlBQUFDO0FBQUFBLElENUR2RDtBQUFBLElBQUE7QUFBQSxJQUFBLFNBQUE7QUFBQSxHQUFBO0FBQUE7QUFBQSxJQUFBQyxRQ29URTtBQUFBLElBQUFDLGtCRHBURjtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxZQUFBQyxZQUFBaEI7QUFBQUEsSUN1RUUsMEJBQ1M7QUFBQSxJQURUO0FBQUE7QUFBQSxXQUFBaUIsSUFBQSxNQUV3QztBQUFBO0FBQUEsV0FBQUMsSUFGeEMsTUFHYztBQUFBO0FBQUEsV0FBQUMsTUFIZDtBQUFBLE9BUzhCLDhEQUFrQjtBQUFBO0FBQUEsV0FBQUMsSUFUaEQ7QUFBQSxPQWE4Qiw2REFBa0I7QUFBQTtBQUFBLFdBQUFDLFFBYmhEO0FBQUE7QUFBQSxXQUFBQyxJQUFBLE1BQUFuQixRQXFCUztBQUFBLE9BQWtDO0FBQUEsWUFBQUEsVUFBQTtBQUFBO0FBQUEsYUFBQWUsTUFBQSxZQUFBakIsS0FDbkI7QUFBQSxTQS9DeEIsZ0NBNkVnRDtBQUFBO0FBQUE7QUFBQSxXQUFBc0IsTUE1QmpDO0FBQUEsT0FDVjtBQUFBLE9BQ0E7QUFBQTtBQUFBLGtCQUFBSCxHQUFBcEI7QUFBQUEsVUFDb0IseUNBQWMsY0FBZTtBQUFBO0FBQUE7QUFBQSxPQUFHO0FBQUE7QUFBQSxXQUFBcUIsUUEzQnpEO0FBQUE7QUFBQTtBQUFBLFdBQUFGLElBQUEsdUNBb0RnRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUFBSyxTQXJCakM7QUFBQSxRQUFBQztBQUFBQSxVQUNEO0FBQUEscUJBQUFDO0FBQUFBLGFBQ1Y7QUFBQTtBQUFBLGVBQUFDLE1BQ1k7QUFBQSxlQUFBbkIsT0FDVjtBQUFBLGVBQUFvQixTQUNhO0FBQUEsbUJBQ2I7QUFBQTtBQUFBO0FBQUEsbUJBQUFDO0FBQUFBLGtCQUFBQSxNRDVHUjtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBQUFDLE1BQUE7QUFBQTtBQUFBLGlCQ2dIc0Msd0JBQVc7QUFBQSxjQUZsQztBQUFBLGNBR1A7QUFBQTtBQUFBLFlBQXdCO0FBQUEsT0FJRSxPQUg5QjtBQUFBO0FBQUE7QUFBQSxnQkFHbUIsd0JBQVcsNEJBTWdCO0FBQUE7QUFBQSxXQUFBTixXQUhqQztBQUFBLE9BRTJCLGVBQVgsd0JBQVc7QUFBQSxxQ0FDTTtBQUFBO0FBQUE7QUFBQSxTQXJDM0I7QUFBQSxLQUFBTyxNQUFUO0FBQUEsSUFHbUIsd0RBQW1CO0FBQUEsR0FrQ0Y7QUFBQSxPQUFBQyxtQkF2R2E7QUFBQSxZQUFBQyxZQUFBVjtBQUFBQSxJQTBHL0I7QUFBQSxTQUFBVyxLQUVuQjtBQUFBLEtBQ1QscUJBRXNEO0FBQUEsS0FGdEQ7QUFBQSxVQUFBQyxNQUtVO0FBQUEsTUFDZ0M7QUFBQTtBQUFBO0FBQUEseUJBQUEzQjtBQUFBQTtBQUFBQSxrQkFBQSxJQUtkO0FBQUEsa0JBQUE0QixVQUFSO0FBQUEsaUJBQ3FCLE9BQTJCO0FBQUEsMEJBQWxEO0FBQUE7QUFBQSw0QkFBdUIsd0NEN0k3QyxzQkM2SXdFO0FBQUE7QUFBQSxnQkFMaEUsbUJBOENNO0FBQUE7QUFBQSxLQXJEVixvQkFDYztBQUFBLEtBRGQ7QUFBQSx1Q0FHcUIsNkJBa0RYO0FBQUEsU0FBQUQsSUF2Q0E7QUFBQSxLQUNnQywyQkFDdEMsd0JBcUNNO0FBQUEsU0FBQUUsYUFuQ1c7QUFBQSxLQUMwQjtBQUFBLFVBQUFDLEtBQU0sdUJBQUFDLEtBQ2hDO0FBQUEsTUFBRDtBQUFBLFdBQUFyQixJQUN3RTtBQUFBLE9BQy9FO0FBQUE7QUFBQTtBQUFBO0FBQUEsMEJBQUFzQjtBQUFBQTtBQUFBQSxtQkFBQSxJQUNVO0FBQUE7QUFBQSxrQkFBRCxPQUEyRSxZQUEzRSwrQkFBMkU7QUFBQSxvQkFBRTtBQUFBO0FBQUEsVUFBQXZDLEtBL0dyRztBQUFBLE1BQ0E7QUFBQSxNQUNPO0FBQUEsVUFBQXFCLElBaUhXO0FBQUEsTUFDUjtBQUFBLE1BQTREO0FBQUE7QUFBQSxTQUFBbUIsTUFJcEQ7QUFBQSxLQUNWO0FBQUEsOEJBRXVCLDZDQUFvRDtBQUFBLE1BRjNFO0FBQUEsMkNBQ3FCLGtDQW1CakI7QUFBQSxVQUFBQyxXQWhCYSxXQUFBeEIsTUFDMkU7QUFBQSxNQUNyRjtBQUFBO0FBQUE7QUFBQTtBQUFBLHlCQUFBc0I7QUFBQUE7QUFBQUEsa0JBQUEsSUFDVTtBQUFBO0FBQUEsaUJBQUQsT0FBaUYsWUFBakYsK0JBQWlGO0FBQUEsbUJBQUU7QUFBQTtBQUFBO0FBQUEsTUFBQWxCLE1BRXpGO0FBQUEsTUFBQXFCLEtBQ1I7QUFBQSxNQUFBQyxLQUFXO0FBQUEsTUFBQUMsT0FBQTtBQUFBLE1BQUFDLE1BQ0Q7QUFBQSxVQUNWO0FBQUE7QUFBQSxVQUFBTixJQUFBO0FBQUE7QUFBQTtBQUFBLFlBQ3dCO0FBQUE7QUFBQSxRQUFBcEIsSUFBZCx3QkFBYTtBQUFBLE9BQ047QUFBQSxnQkFDTyxnQkFBK0I7QUFBQSxRQUFuRDtBQUFBO0FBQUEsZUFEYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FHakI7QUFBQTtBQUFBLElBckQ4RDtBQUFBLEdBd0Q1RDtBQUFBLFlBQUEyQix3QkFBQS9DO0FBQUFBLElBT1o7QUFBQSxJQUFvRDtBQUFBLEdBQUc7QUFBQSxPQUFBZ0Qsa0JEN0x6RDtBQUFBLFlBQUFDLFVBQUFDO0FBQUFBLFFBQUFDLE1Db01ZO0FBQUEsSUFDVjtBQUFBO0FBQUEsTUFBQUMsU0FDZTtBQUFBLFVBQ3lCO0FBQUEsVUFBckIsbUJBQVU7QUFBQTtBQUFBO0FBQUEsVUFBQXZCO0FBQUFBLFNBQUFBLE1Edk0vQjtBQUFBO0FBQUEsU0FBQUMsTUFBQTtBQUFBLEtDeU1nQyxPQUFYO0FBQUEsY0FBVyw0Q0FBd0I7QUFBQTtBQUFBO0FBQUEsT0FBQXVCLFlEek14RDtBQUFBLFlBQUFDLFNBQUFKO0FBQUFBLFFBQUFDLE1DNE1ZO0FBQUEsSUFDVjtBQUFBO0FBQUEsTUFBQUksUUFDYztBQUFBLE1BQUFDLE1BQ1o7QUFBQSxNQUFBNUI7QUFBQUEsUUFDYTtBQUFBO0FBQUEsbUJBQUE2QixLQUFBQyxNQUFpQyx3Q0FBeUI7QUFBQTtBQUFBO0FBQUEsVUFDdkUsd0JBQXdCO0FBQUE7QUFBQTtBQUFBLFVBQUE3QjtBQUFBQSxTQUFBQSxNRGpONUI7QUFBQTtBQUFBLFVBQUFDLE1BQUE7QUFBQSxNQ21Oa0QsT0FBWCx3QkFBVyxzQ0FDeUI7QUFBQTtBQUFBLEtEcE4zRTtBQUFBLFNBQUFBLFFBQUE7QUFBQSxLQ29ObUQsT0FBWDtBQUFBLGNBQVcsOENBQXdCO0FBQUE7QUFBQTtBQUFBLFlBQUE2QixjQUFBQyxTQUFBQztBQUFBQSxRQUFBSCxPQUc5RDtBQUFBLElBQ1g7QUFBQTtBQUFBO0FBQUEsUUFDRTtBQUFBLFVBQXdCLFlBQWE7QUFBQTtBQUFBO0FBQUEsVUFBQTdCO0FBQUFBLFNBQUFBLE1Eek56QztBQUFBO0FBQUEsU0FBQUMsTUFBQTtBQUFBLEtDMk5nQyxPQUFYLHdCQUFXLHNDQUFrQjtBQUFBO0FBQUE7QUFBQSxZQUFBZ0MsU0FBQVo7QUFBQUEsUUFBQUMsTUFHdEM7QUFBQSxJQUNWO0FBQUE7QUFBQSxNQUFBSSxRQUNjO0FBQUEsTUFBQUMsTUFDWjtBQUFBLE1BQUFPLFFBQ0E7QUFBQSxLQUNBO0FBQUE7QUFBQSxnQkFBQUw7QUFBQUEsUUFBOEI7QUFBQSxRQUE2QjtBQUFBO0FBQUEsT0FBVTtBQUFBO0FBQUEsYUFBTztBQUFBO0FBQUE7QUFBQSxVQUFBN0I7QUFBQUEsU0FBQUEsTURuT2hGO0FBQUE7QUFBQSxVQUFBQyxNQUFBO0FBQUEsTUNzT2tELE9BQVgsd0JBQVcsc0NBQ3lCO0FBQUE7QUFBQSxLRHZPM0U7QUFBQSxTQUFBQSxRQUFBO0FBQUEsS0N1T21ELE9BQVg7QUFBQSxjQUFXLDhDQUF3QjtBQUFBO0FBQUE7QUFBQSxPQUFBa0MsaUJBL0svQztBQUFBLFlBQUFDLG1CQUFBTDtBQUFBQSxRQUFBRixPQWtMZixzQkFBQVEsT0FDWDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsU0FBQUMsT0FDYTtBQUFBLEtBQ1g7QUFBQSxhQUNpQjtBQUFBO0FBQUE7QUFBQSxVQUFBdEM7QUFBQUEsU0FBQUEsTURoUHJCO0FBQUE7QUFBQSxTQUFBQyxNQUFBO0FBQUEsS0NrUEk7QUFBQSxLQUM0QixPQUFYLHdCQUFXLHNDQUFtQjtBQUFBO0FBQUE7QUFBQSxZQUFBc0MsY0FBQUM7QUFBQUEsUUFBQSxJQUdaO0FBQUEsSUFBVCxPQUFYLHdCQUFXLDJCQUE2QjtBQUFBO0FBQUEsWUFBQUMsWUFBQUQ7QUFBQUEsUUFBQSxJQUdwQjtBQUFBLElBQVQsT0FBWCx3QkFBVywyQkFBNkI7QUFBQTtBQUFBLFlBQUFFLFlBQUFGO0FBQUFBLFFBQUEsSUFHcEI7QUFBQSxJQUFULE9BQVgsd0JBQVcsMkJBQTZCO0FBQUE7QUFBQSxZQUFBRyxXQUFBQyxPQUdiO0FBQUEsWUFBQUMsb0JBQUFDLFNBQUFDO0FBQUFBLFFBQUFDLE9BR2pDO0FBQUEsYUFBQUMsVUFBQXRFO0FBQUFBO0FBQUFBLE1BQUEsSUFFYTtBQUFBLE1BQUE0QixVQUFSO0FBQUEsS0FDa0QsT0FBc0IsWUFBMUUsWUFBb0QsNkJBQXNCO0FBQUE7QUFBQSxJQUVqRjtBQUFBLElBQ1A7QUFBQSxHQUF3QjtBQUFBLFlBQUEyQyxZQUFBQyxPQUFBdEQ7QUFBQUEsSUFHeEI7QUFBQTtBQUFBLE1BQUFuQixLQUNXO0FBQUE7QUFBQSxRQUNnQjtBQUFBLDZCQUF1QjtBQUFBLE1BQUFDLE9BQXJDO0FBQUEsVUFDWCx3QkFBd0IsWUFBYTtBQUFBO0FBQUE7QUFBQSxVQUFBcUI7QUFBQUEsU0FBQUEsTUQ5UXpDLDRCQUFBb0QsZ0JBQUE7QUFBQTtBQUFBO0FBQUEsT0FBQW5ELE1BQUE7QUFBQSxXQ21Sa0Msd0JBQVc7QUFBQSxNQUZsQztBQUFBLE1BR1A7QUFBQTtBQUFBO0FBQUEsVUFJNEQ7QUFBQSxVQUE5Qix3QkFBVztBQUFBLEtBRmxDO0FBQUEsS0FHUDtBQUFBO0FBQUEsR0FBd0I7QUFBQSxZQUFBb0QsZ0JBQUFGO0FBQUFBLElBR087QUFBQSxTQUFBN0MsSUFHdkI7QUFBQSxLQUMwQiwyQkFBc0M7QUFBQSxhQUM1QjtBQUFBLEtBQWIscUNBQXFGO0FBQUE7QUFBQSxJQUpwRjtBQUFBLEdBSW9GO0FBQUEsWUFBQWdELGFBQUFIO0FBQUFBLFFBQUE3QyxJQUc5RztBQUFBLElBQzBCLDJCQUFNO0FBQUEsUUFBQW5DLElBRTlCO0FBQUEsSUFDUjtBQUFBLFNBQUFvRixJQUFBO0FBQUEsS0FDaUUsc0NBQ2Q7QUFBQTtBQUFBLElBQTVDO0FBQUEsR0FBNEM7QUFBQSxZQUFBQyxLQUFBUixNQUFBdEU7QUFBQUEsSUFPM0I7QUFBQSxHQUFnRDtBQUFBLE9BQUErRSxlRGpUNUU7QUFBQSxHQ29URTtBQUFBO0FBQUEsY0FBQTlFO0FBQUFBLE1BQ0U7QUFBQSxXQUFBa0QsT0FBQTtBQUFBO0FBQUEsWUFBQXZDLElBQUEsU0FBQW9FLElBQ3dCO0FBQUEsUUFBeUIsUUFBb0U7QUFBQSxZQUFBcEQsSUFBcEU7QUFBQSxRQUF3QixrREFHbEI7QUFBQTtBQUFBLFdBQUFoQyxRQUp2RDtBQUFBLG1CQUVZLHFEQUUyQztBQUFBLE9BSnZEO0FBQUEsWUFBQXFGLFVBQUE7QUFBQSxRQUdxQiw0Q0FDa0M7QUFBQTtBQUFBO0FBQUEsTUFBaEQ7QUFBQTtBQUFBLEtBQWdEO0FBQUEsR0FFekQ7QUFBQTtBQUFBLGNBQUFoRjtBQUFBQSxNQUNFO0FBQUEsV0FBQUwsUUFBQSxTQUFBdUQsT0FBQTtBQUFBLG1CQUVZLHFEQUNnRDtBQUFBLE9BSDVEO0FBQUEsWUFBQTZCLElBQUE7QUFBQSxRQUNlLHNDQUU2QztBQUFBO0FBQUE7QUFBQSxNQUFyRDtBQUFBO0FBQUEsS0FBcUQ7QUFBQSxPQUFBRSxlRC9UaEU7QUFBQSxHQ2lVRTtBQUFBO0FBQUEsY0FBQWpGO0FBQUFBLE1BQ0U7QUFBQSxPQU1PO0FBQUE7QUFBQSxVQUFBOUIsSUFOUCxTQUFBeUIsUUFBQTtBQUFBO0FBQUEsT0FJUywrREFFdUQ7QUFBQSxVQUFBdUYsSUFOaEU7QUFBQTtBQUFBO0FBQUEsUUFDYywrREFLa0Q7QUFBQTtBQUFBO0FBQUEsT0FOaEU7QUFBQTtBQUFBLGFBQUFDLEtBQUE7QUFBQSxTQUVrQixnRUFJOEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUhwRDtBQUFBLGdFQUdvRDtBQUFBLFVBQUFDLE9BTmhFO0FBQUEsTUFLZSxrRUFDaUQ7QUFBQTtBQUFBLEdBRWxFO0FBQUE7QUFBQSxjQUFBcEY7QUFBQUEsTUFDRTtBQUFBO0FBQUE7QUFBQSxZQUFBMkMsTUFBQTtBQUFBLFFBQ3VCLHlDQUF5QjtBQUFBO0FBQUE7QUFBQSxNQUN6QztBQUFBO0FBQUEsS0FBOEM7QUFBQSxHQUV2RDtBQUFBO0FBQUEsY0FBQTNDO0FBQUFBLE1BQ0U7QUFBQSxXQUFBUixJQUFBO0FBQUEsT0FDZ0Isc0NBQVc7QUFBQTtBQUFBLE1BQ3BCO0FBQUE7QUFBQSxLQUFpRDtBQUFBLFlBQUE2RixXQUFBSCxHQUFBekU7QUFBQUE7QUFBQUEsSUFBQTtBQUFBLEtBSXhELDBCQUNjO0FBQUE7QUFBQTtBQUFBLEtBRGQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQSxNQUFBLE1BQUF5RSxNQUFBO0FBQUEsUUFDdUM7QUFBQTtBQUFBLFFBRHZDO0FBQUE7QUFBQSxZQUFBekUsTUFBQSxNQUFBeUUsTUFBQTtBQUFBLFFBRXdCO0FBQUE7QUFBQSxRQUZ4QjtBQUFBO0FBQUEsWUFBQXpFLE1BQUEsTUFBQXlFLE1BQUE7QUFBQSxRQUUyRDtBQUFBO0FBQUEsUUFGM0Q7QUFBQTtBQUFBLFlBQUF6RSxNQUFBLE1BQUF5RSxNQUFBO0FBQUEsUUFHNkI7QUFBQTtBQUFBLFFBSDdCO0FBQUE7QUFBQSxZQUFBekUsTUFBQSxNQUFBeUUsTUFBQTtBQUFBLFFBRzZEO0FBQUE7QUFBQSxZQUFBQSxNQUg3RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBQXpFLE1BQUE7QUFBQSxTQUFBeUUsTUFBQTtBQUFBLFNBQUFJO0FBQUFBLFdBT1c7QUFBQSw0QkFBQTFFLEdBQUFxRCxPQUFBaEIsS0FBNkIsbUJBQVE7QUFBQSxTQUFBc0M7QUFBQUEsV0FDckM7QUFBQSw0QkFBQTNFLEdBQUFxRCxPQUFBaEIsS0FBNkIsbUJBQVE7QUFBQSxhQUM3QjtBQUFBLGFBQWpCO0FBQUEsUUFBYztBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQUFBckM7QUFBQUEsd0JBQUEsSUFDUztBQUFBLG9CQUFlO0FBQUEsNEJBQ047QUFBQSxvQkFBbkIsT0FBa0IsV0FBbEIsd0NBQXFDO0FBQUE7QUFBQTtBQUFBLG1CQUN4QztBQUFBO0FBQUEsWUFBQXNFLE1BWlo7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBQXpFLE1BQUE7QUFBQTtBQUFBLGFBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUtrQjtBQUFBLFdBQWhCO0FBQUEsTUFBYSwrREFPSDtBQUFBO0FBQUE7QUFBQSxJQUFMO0FBQUEsR0FBSztBQUFBLEdBRWQ7QUFBQTtBQUFBLGNBQUFUO0FBQUFBLE1BQTJCO0FBQUE7QUFBQTtBQUFBLFlBQUFTLElBQUEsTUFBQXlFLElBQUE7QUFBQSxRQUErQiw0QkFBZ0I7QUFBQTtBQUFBO0FBQUEsTUFBUTtBQUFBLEtBQW1DO0FBQUEsV0FBQztBQUFBLEdBQ3RIO0FBQUE7QUFBQSxjQUFBbEY7QUFBQUEsTUFDRTtBQUFBLFdBQUFMLFFBQUEsU0FBQTZGLE9BQUE7QUFBQTtBQUFBLFFBQ21CO0FBQUEsU0FBc0I7QUFBQTtBQUFBLFFBQXVDO0FBQUE7QUFBQSxPQURoRjtBQUFBLFlBQUFsRSxNQUFBO0FBQUEsUUFFd0IsMENBQWdGO0FBQUE7QUFBQSxhQUF2QjtBQUFBLGFBQWpCO0FBQUEsUUFBcUM7QUFBQTtBQUFBO0FBQUEsTUFDOUY7QUFBQTtBQUFBLEtBQXFDO0FBQUEsV0FBQztBQUFBLEdBRS9DO0FBQUE7QUFBQSxjQUFBdEI7QUFBQUEsTUFDRTtBQUFBLFdBQUF5RixRQUFBLFNBQUFDLFNENVdKO0FBQUEsT0M4V007QUFBQSxRQUFZO0FBQUEsWUFBQTVFLE1BQ0Y7QUFBQSxRQUFvQjtBQUFBO0FBQUE7QUFBQSxhQUFBTztBQUFBQSxZQUFBQSxNRC9XcEM7QUFBQTtBQUFBLFlBQUFDLE1BQUEsUUFBQVIsTUNpWGdCO0FBQUEsUUFBb0I7QUFBQSxRQUFxQztBQUFBLFFBQXNDO0FBQUE7QUFBQTtBQUFBLE1BQ3BHO0FBQUE7QUFBQSxLQUFvQztBQUFBLEdBRzdDO0FBQUE7QUFBQSxjQUFBZDtBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQUFSLElBQUEsTUFBQXFCLFFBQUE7QUFBQSxZQUUwQixtREFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUZ2QztBQUFBO0FBQUEsZ0JBQUFyQixNQUFBLE1BQUFtRyxJQUFBO0FBQUEsWUFDeUI7QUFBQSxZQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUU1QjtBQUFBO0FBQUEsS0FBNEM7QUFBQSxPQUFBQyxLQUFDO0FBQUEsR0FLdEQsMEJBQUEzQixPQUE4QixzQ0FBYTtBQUFBLEdBQzNDLDRCQUFBQSxPQUE0Qix3QkFBYztBQUFBLE9BQUE0QixjRC9YNUM7QUFBQSxHQ2dZRTtBQUFBO0FBQUEsY0FBQTdGO0FBQUFBLE1BQTZCO0FBQUE7QUFBQTtBQUFBLHNCQUFBK0UsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBQW5FLElBQUEsVUFBZ0U7QUFBQSxhQUFULHdDQUFrQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUFRO0FBQUEsS0FBNkI7QUFBQSxPQUFBa0YsY0RoWTdJO0FBQUEsR0NpWUU7QUFBQTtBQUFBLGNBQUE5RjtBQUFBQSxNQUE0QjtBQUFBO0FBQUE7QUFBQSxzQkFBQStFLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBQUFuRSxJQUFBLFVBQTBEO0FBQUEsYUFBTSxtQ0FBc0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFBNUI7QUFBQSxLQUE0QjtBQUFBLE9BQUFtRixlRGpZcEk7QUFBQSxHQ2tZRTtBQUFBO0FBQUEsY0FBQS9GO0FBQUFBLE1BQThCO0FBQUE7QUFBQTtBQUFBLHNCQUFBK0UsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUFBdkYsSUFBQSxNQUFBb0IsSUFBQSxVQUFpRTtBQUFBLGFBQU0sc0NBQTBDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BQTlCO0FBQUEsS0FBOEI7QUFBQSxPQUFBb0YsY0RsWWpKO0FBQUEsR0NtWUU7QUFBQTtBQUFBLGNBQUFoRztBQUFBQSxNQUE2QjtBQUFBO0FBQUE7QUFBQSxzQkFBQStFLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBQXZGLElBQUEsTUFBQW9CLElBQUEsVUFBZ0U7QUFBQSxhQUFNLHNDQUF5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUE3QjtBQUFBLEtBQTZCO0FBQUEsT0FBQXFGLGlCRG5ZOUk7QUFBQSxHQ29ZRTtBQUFBO0FBQUEsY0FBQWpHO0FBQUFBLE1BQStCO0FBQUEsV0FBQStFLElBQUEsYUFBdUM7QUFBQSxPQUFaLHNDQUFtQjtBQUFBO0FBQUEsTUFBUTtBQUFBLEtBQStCO0FBQUEsT0FBQW1CLGdCRHBZdEg7QUFBQSxHQ3FZRTtBQUFBO0FBQUEsY0FBQWxHO0FBQUFBLE1BQThCO0FBQUE7QUFBQTtBQUFBLFlBQUFTLElBQUEsTUFBQXlFLElBQUE7QUFBQSxRQUEwQix1Q0FBOEQ7QUFBQTtBQUFBO0FBQUEsTUFBOUI7QUFBQSxLQUE4QjtBQUFBLE9BQUFpQixrQkRyWXhIO0FBQUEsR0N3WUU7QUFBQTtBQUFBLGNBQUFuRztBQUFBQTtBQUFBQSxNQUFBO0FBQUEsV0FBQVIsSUFBZ0M7QUFBQTtBQUFBO0FBQUEsWUFBQW1CLElBQUE7QUFBQSxRQUE4QjtBQUFBO0FBQUEsT0FBOUIsY0FBdUQsc0NBQW1CO0FBQUE7QUFBQSxNQUFRO0FBQUEsS0FBZ0M7QUFBQSxPQUFBeUYsbUJEeFlwSjtBQUFBLEdDeVlFO0FBQUE7QUFBQSxjQUFBcEc7QUFBQUEsTUFBaUM7QUFBQTtBQUFBLGdFQUFBVyxJQUFBLE1BQThCO0FBQUE7QUFBQSxNQUFpQjtBQUFBLEtBQWlDO0FBQUEsT0FBQTBGLG1CRHpZbkg7QUFBQSxHQzBZRTtBQUFBO0FBQUEsY0FBQXJHO0FBQUFBLE1BQWlDO0FBQUE7QUFBQSxnRUFBQVksSUFBQSxNQUErQjtBQUFBO0FBQUEsTUFBZ0I7QUFBQSxLQUFpQztBQUFBLE9BQUEwRixrQkQxWW5IO0FBQUEsR0MyWUU7QUFBQTtBQUFBLGNBQUF0RztBQUFBQSxNQUFnQztBQUFBO0FBQUEsZ0VBQUFXLElBQUEsTUFBOEI7QUFBQTtBQUFBLE1BQWdCO0FBQUEsS0FBZ0M7QUFBQSxPQUFBNEYsTUQzWWhILFFDMllpSDtBQUFBLEdBRy9HO0FBQUE7QUFBQSxjQUFBdkc7QUFBQUEsTUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUF3RyxJQUFBLE1BQWlDO0FBQUE7QUFBQSxXQUFqQyxrQkFBQXhFLElBQUEsTUFBaUU7QUFBQTtBQUFBO0FBQUEsTUFBdUI7QUFBQSxLQUFTO0FBQUEsR0FDbkc7QUFBQTtBQUFBLGNBQUFoQztBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw2QkFBQXdHLElBQUEsTUFBaUM7QUFBQTtBQUFBLFdBQWpDLGtCQUFBeEUsSUFBQSxNQUFpRTtBQUFBO0FBQUE7QUFBQSxNQUE0Qiw4Q0FBa0I7QUFBQTtBQUFBLEdBQ2pIO0FBQUE7QUFBQSxjQUFBaEM7QUFBQUEsTUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFBQXdHLElBQUE7QUFBQSxZQUN3QjtBQUFBO0FBQUEscUNBQUE3RixHQUFvQixjQUFRLFNBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQURqRTtBQUFBLGdCQUFBcUIsSUFBQTtBQUFBLFlBRXFCO0FBQUE7QUFBQSxxQ0FBQXJCLEdBQW9CLGNBQVEsU0FBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFDdkQ7QUFBQSxLQUFHO0FBQUEsR0FDWjtBQUFBO0FBQUEsY0FBQVg7QUFBQUEsTUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUF3RyxJQUFBLE1BQWlDO0FBQUE7QUFBQSxXQUFqQyxrQkFBQXhFLElBQUEsTUFBMEQ7QUFBQTtBQUFBO0FBQUEsTUFBZ0I7QUFBQSxLQUFHO0FBQUE7QUFBQSxJQUFBeUUsNkJEeFpqRjtBQUFBLFFDd1prRjtBQUFBLElBQUFDO0FBQUFBLE1BQUE7QUFBQTtBQUFBLGdCQUFBMUc7QUFBQUEsUUFFOUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQUFBd0csSUFBQSxNQUFpQztBQUFBO0FBQUEsYUFBakMsa0JBQUF4RSxJQUFBLE1BQXVFO0FBQUE7QUFBQTtBQUFBLFFBQTZCO0FBQUEsT0FBVTtBQUFBLEdBQ3pHO0FBQUE7QUFBQSxHQUNBO0FBQUE7QUFBQSxXQUNQO0FBQUE7QUFBQTtBQUFBLGNBQUFoQztBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw2QkFBQXdHLElBQUEsTUFBaUM7QUFBQTtBQUFBLFdBQWpDLGNBQXFFO0FBQUE7QUFBQTtBQUFBLE1BQXVCO0FBQUEsS0FBYTtBQUFBLEdBQzNHLHVDQUFBdkMsT0FBdUMsU0FBRztBQUFBLEdBQzFDLDRDQUFBQSxPQUE0QyxTQUFHO0FBQUEsT0FBQTBDLHFCRGhhakQ7QUFBQSxHQ21hRTtBQUFBO0FBQUEsY0FBQTNHO0FBQUFBLE1BQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUFBWSxJQUFBLE1BQUFtRSxJQUFBLE1BQUF5QixJQUFBO0FBQUEsU0FBNkIsb0NBQXNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFBbkM7QUFBQTtBQUFBLEtBQW1DO0FBQUEsT0FBQUksZURuYXhJO0FBQUEsR0NvYUU7QUFBQTtBQUFBLGNBQUE1RztBQUFBQSxNQUE2QiwwQkFBQVcsSUFBQSxTQUF1QiwrQkFBc0Q7QUFBQSxNQUE3QjtBQUFBLEtBQTZCO0FBQUEsT0FBQWtHLGdCRHBhNUc7QUFBQSxHQ3FhRTtBQUFBO0FBQUEsY0FBQTdHO0FBQUFBLE1BQThCLDBCQUFBVyxJQUFBLFNBQXVCLCtCQUF3RDtBQUFBLE1BQTlCO0FBQUEsS0FBOEI7QUFBQSxPQUFBbUcsZ0JEcmEvRztBQUFBLEdDc2FFO0FBQUE7QUFBQSxjQUFBOUc7QUFBQUEsTUFBOEIsMEJBQUFXLElBQUEsU0FBdUIsK0JBQXdEO0FBQUEsTUFBOUI7QUFBQSxLQUE4QjtBQUFBLE9BQUFvRyxtQkR0YS9HO0FBQUEsR0N1YUU7QUFBQTtBQUFBLGNBQUEvRztBQUFBQSxNQUFrQywwQkFBQVcsSUFBQSxTQUF1Qiw4QkFBaUU7QUFBQSxNQUFsQztBQUFBLEtBQWtDO0FBQUEsT0FBQXFHLGVEdmE1SDtBQUFBLEdDd2FFO0FBQUE7QUFBQSxjQUFBaEg7QUFBQUEsTUFBNkIsMEJBQUFXLElBQUEsU0FBdUIsK0JBQXNEO0FBQUEsTUFBN0I7QUFBQSxLQUE2QjtBQUFBLE9BQUFzRyxpQkR4YTVHO0FBQUEsR0N5YUU7QUFBQTtBQUFBLGNBQUFqSDtBQUFBQSxNQUErQiwwQkFBQTlCLElBQUEsU0FBdUIsK0JBQTBEO0FBQUEsTUFBL0I7QUFBQSxLQUErQjtBQUFBLE9BQUFnSixhRHphbEg7QUFBQSxHQzRhUztBQUFBLE9BQUFDLHVCRDVhVDtBQUFBLEdDNmFTO0FBQUEsR0FDUDtBQUFBO0FBQUEsY0FBQW5IO0FBQUFBLE1BQWdDO0FBQUEsV0FBQVIsSUFBQTtBQUFBLE9BQXVCO0FBQUEsT0FBZ0M7QUFBQSxPQUFtQztBQUFBO0FBQUEsTUFBVztBQUFBLEtBQUc7QUFBQSxHQUN4STtBQUFBO0FBQUEsY0FBQVE7QUFBQUEsTUFBMEM7QUFBQSxXQUFBUixJQUFBO0FBQUEsT0FBdUI7QUFBQSxPQUEwQztBQUFBLE9BQTZDO0FBQUE7QUFBQSxNQUFXO0FBQUEsS0FBRztBQUFBLEdBQ3RLO0FBQUE7QUFBQSxjQUFBUTtBQUFBQSxNQUF3QztBQUFBO0FBQUE7QUFBQSxZQUFBb0gsSUFBQSxNQUFBNUgsSUFBQTtBQUFBLFFBQTBCLGtDQUEwQztBQUFBO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLE9BQUE2SCxZRGhiOUc7QUFBQSxHQ21iRTtBQUFBO0FBQUEsY0FBQXJIO0FBQUFBLE1BQ0U7QUFBQSxPQUlPO0FBQUE7QUFBQSxPQUFBb0YsT0FKUDtBQUFBLE9BQUFsSCxJQUFBO0FBQUEsT0FBQXlCLFFBRXVCO0FBQUEsTUFBYTtBQUFBLFdBQUFBLFVBQUE7QUFBQTtBQUFBLFlBQUEySCxXQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUFDLFNBQUE7QUFBQSxTQUFBQyxPQUFBO0FBQUEsYUFBNkI7QUFBQSxTQUFBRixXQUFBO0FBQUE7QUFBQTtBQUFBLFdBQUFBLFdBQTdCO0FBQUEsTUFDbEMsNENBQytCO0FBQUE7QUFBQSxPQUFBRyxtQkR4YnJDO0FBQUEsR0NpY0U7QUFBQTtBQUFBLGNBQUF6SDtBQUFBQSxNQUFrQztBQUFBO0FBQUE7QUFBQSxZQUFBUixJQUFBLE1BQUFrQixJQUFBO0FBQUEsUUFBMEIsdUNBQXFFO0FBQUE7QUFBQTtBQUFBLE1BQWxDO0FBQUEsS0FBa0M7QUFBQSxPQUFBZ0gsa0JEamNuSTtBQUFBLEdDa2NFO0FBQUE7QUFBQSxjQUFBMUg7QUFBQUEsTUFBaUM7QUFBQSxXQUFBVSxJQUFBO0FBQUEsT0FBdUIsb0NBQWlFO0FBQUE7QUFBQSxNQUFqQztBQUFBLEtBQWlDO0FBQUEsR0FHekg7QUFBQTtBQUFBLGNBQUFWO0FBQUFBO0FBQUFBLE9BQUE7QUFBQSxTQUM0QjtBQUFBO0FBQUEsb0JBQUFrRjtBQUFBQSxZQUN4QiwwQkFBZ0Q7QUFBQSxZQUFoRDtBQUFBO0FBQUEsZUFDWSw4Q0FDWTtBQUFBO0FBQUE7QUFBQSxtQkFBQXZFLElBRnhCLE1BQXFDO0FBQUEsdUJBRTlCLGlDQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSGxCLGdEQUcwQjtBQUFBO0FBQUEsR0FDcEM7QUFBQTtBQUFBLGNBQUFYO0FBQUFBO0FBQUFBLE9BQUE7QUFBQSxTQUM0QjtBQUFBO0FBQUEsb0JBQUFrRjtBQUFBQSxZQUN4QjtBQUFBLDhDQUFBdkUsSUFBQSxNQUFxQztBQUFBLFlBQVMsaUNBQWlCO0FBQUE7QUFBQTtBQUFBLE1BRHpELGdEQUNpRTtBQUFBO0FBQUEsR0FFM0Usb0NBQUFzRCxPQUFvQyxTQUFHO0FBQUEsR0FHdkM7QUFBQSxHQUNBLG9DQUFBQSxPQUFvQyxTQUFHO0FBQUEsV0FBQztBQUFBLEdBQ3hDLGdDQUFBQSxPQUFnQyxTQUFTO0FBQUEsV0FBQztBQUFBLEdBQzFDO0FBQUE7QUFBQSxjQUFBakU7QUFBQUEsTUFBaUM7QUFBQTtBQUFBO0FBQUEsWUFBQVcsSUFBQTtBQUFBLFFBQW1DLHNDQUF5QjtBQUFBO0FBQUE7QUFBQSxNQUFRO0FBQUEsS0FBVTtBQUFBO0FBQUEsSUFBQWdIO0FBQUFBLE1BRzFGO0FBQUEsMkNBQUFoSCxHQUFvQixjQUFRO0FBQUEsSUFBQWlIO0FBQUFBLE1BQ3hCO0FBQUEsMkNBQUFqSCxHQUFvQixjQUFRO0FBQUEsSUFBQWtIO0FBQUFBLE1BQzVCO0FBQUEsMkNBQUFsSCxHQUFvQixjQUFRO0FBQUEsR0FDOUM7QUFBQSxHQUNBO0FBQUEsR0FDQTtBQUFBLEdBR1A7QUFBQTtBQUFBLGNBQUFYO0FBQUFBLE1BQ0U7QUFBQSxXQUFBTCxRQUFBLFNBQUF1RCxPQUFBO0FBQUEsbUJBQWlFLHFEQUFpRDtBQUFBLE9BQWxIO0FBQUEsWUFBQTZCLElBQUE7QUFBQSxRQUE2QixzQ0FBcUY7QUFBQTtBQUFBO0FBQUEsTUFBSDtBQUFBLEtBQUc7QUFBQSxHQUNwSDtBQUFBO0FBQUEsY0FBQS9FO0FBQUFBLE1BQStCO0FBQUEsV0FBQVIsSUFBQTtBQUFBLE9BQXVCLHlDQUE2QztBQUFBO0FBQUEsTUFBSDtBQUFBLEtBQUc7QUFBQSxHQUNuRztBQUFBO0FBQUEsY0FBQVE7QUFBQUEsTUFDRTtBQUFBO0FBQUE7QUFBQSxZQUFBTCxRQUFBLE1BQUFtSSxNQUFBLE1BQUFDLE1BQUE7QUFBQSxvQkFBeUYsd0RBQXVEO0FBQUEsZ0JBQWhKO0FBQUE7QUFBQSxhQUFBaEQsSUFBQTtBQUFBLFNBQXFDLCtDQUEyRztBQUFBO0FBQUE7QUFBQTtBQUFBLE1BQUg7QUFBQSxLQUFHO0FBQUEsR0FDbEo7QUFBQTtBQUFBLGNBQUEvRTtBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBLFlBQUFMLFFBQUEsTUFBQXFJLFlBQUEsTUFBQUMsU0FBQTtBQUFBLG9CQUV5QixnREFDdUM7QUFBQSxnQkFIaEU7QUFBQTtBQUFBLFNBQ2lDLGdEQUUrQjtBQUFBO0FBQUE7QUFBQSxNQUF6RDtBQUFBO0FBQUEsS0FBeUQ7QUFBQSxHQUNsRTtBQUFBO0FBQUEsY0FBQWpJO0FBQUFBLE1BQ0U7QUFBQTtBQUFBO0FBQUEsWUFBQWtGLElBQUEsTUFBQWhILElBQUE7QUFBQSxRQUEwQixtQ0FBd0Q7QUFBQTtBQUFBO0FBQUEsTUFBN0I7QUFBQSxLQUE2QjtBQUFBLEdBQ3BGO0FBQUE7QUFBQSxjQUFBOEI7QUFBQUEsTUFDRTtBQUFBLFdBQUFMLFFBQUEsU0FBQXVELE9BQUE7QUFBQSxtQkFBMEIscURBQXdGO0FBQUEsT0FBbEg7QUFBQSxZQUFBNkIsSUFBQTtBQUFBLFFBQWdGLHNDQUFrQztBQUFBO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLEdBQ3BIO0FBQUE7QUFBQSxjQUFBL0U7QUFBQUEsTUFDRTtBQUFBLFdBQUFMLFFBQUEsU0FBQXVJLFdBQUE7QUFBQSxtQkFBOEIsd0RBQThHO0FBQUEsZUFBNUk7QUFBQTtBQUFBLFlBQUFuRCxJQUFBO0FBQUEsUUFBZ0csK0NBQTRDO0FBQUE7QUFBQTtBQUFBLE1BQUg7QUFBQSxLQUFHO0FBQUEsV0FBQztBQUFBLEdBRy9JO0FBQUE7QUFBQSxjQUFBL0U7QUFBQUEsTUFBMkI7QUFBQTtBQUFBLDZEQUE2QjtBQUFBO0FBQUEsTUFBaUI7QUFBQSxLQUFVO0FBQUEsR0FDbkY7QUFBQTtBQUFBLGNBQUFBO0FBQUFBLE1BQStCO0FBQUEsV0FBQVIsSUFBQTtBQUFBLE9BQXVCLGlDQUF1QjtBQUFBO0FBQUEsTUFBSDtBQUFBLEtBQUc7QUFBQSxHQUM3RTtBQUFBO0FBQUEsY0FBQVE7QUFBQUEsTUFBOEI7QUFBQSxXQUFBUixJQUFBO0FBQUEsT0FBdUIsaUNBQXNCO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLFdBQUM7QUFBQSxHQUM1RTtBQUFBO0FBQUEsY0FBQVE7QUFBQUEsTUFBNEI7QUFBQTtBQUFBLDREQUE4QjtBQUFBO0FBQUEsTUFBaUI7QUFBQSxLQUFVO0FBQUEsV0FBQztBQUFBLEdBQ3RGO0FBQUE7QUFBQSxjQUFBQTtBQUFBQSxNQUEyQjtBQUFBO0FBQUEsNkRBQTZCO0FBQUE7QUFBQSxNQUFpQjtBQUFBLEtBQVU7QUFBQSxXQUFDO0FBQUEsR0FDcEY7QUFBQTtBQUFBLGNBQUFBO0FBQUFBLE1BQTRCO0FBQUE7QUFBQSw0REFBOEI7QUFBQTtBQUFBLE1BQWlCO0FBQUEsS0FBVTtBQUFBLFdBQUM7QUFBQSxHQUN0RjtBQUFBO0FBQUEsY0FBQUE7QUFBQUEsTUFBK0I7QUFBQTtBQUFBLG9FQUE4QztBQUFBO0FBQUEsTUFBaUI7QUFBQSxLQUFVO0FBQUEsV0FBQztBQUFBLEdBQ3pHO0FBQUE7QUFBQSxjQUFBQTtBQUFBQSxNQUE4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseUJBQTBFO0FBQUE7QUFBQTtBQUFBLE1BQWlCO0FBQUEsS0FBVTtBQUFBLFdBQUM7QUFBQSxHQUNwSTtBQUFBO0FBQUEsY0FBQUE7QUFBQUEsTUFBNEI7QUFBQTtBQUFBLDZEQUE4QjtBQUFBO0FBQUEsTUFBaUI7QUFBQSxLQUFVO0FBQUEsV0FBQztBQUFBLEdBQ3RGO0FBQUE7QUFBQSxjQUFBQTtBQUFBQSxNQUFrQztBQUFBO0FBQUEsNkRBQW9DO0FBQUE7QUFBQSxNQUFpQjtBQUFBLEtBQVU7QUFBQSxXQUFDO0FBQUEsR0FDbEc7QUFBQTtBQUFBLGNBQUFBO0FBQUFBLE1BQWtDO0FBQUE7QUFBQTtBQUFBLFlBQUE0RSxJQUFBO0FBQUEsUUFBbUM7QUFBQSxvREFBQWpFLEdBQW9CLGNBQVEsU0FBYTtBQUFBO0FBQUE7QUFBQSxNQUFRO0FBQUEsS0FBTztBQUFBLEdBQzdIO0FBQUE7QUFBQSxjQUFBWDtBQUFBQSxNQUFnQztBQUFBO0FBQUEsZ0VBQUE0RSxJQUFBLE1BQThCO0FBQUE7QUFBQSxNQUFnQjtBQUFBLEtBQUc7QUFBQSxHQUNqRjtBQUFBO0FBQUEsY0FBQTVFO0FBQUFBLE1BQW1DO0FBQUE7QUFBQSxnRUFBQTRFLElBQUEsTUFBOEI7QUFBQTtBQUFBLE1BQTRCLDhDQUFrQjtBQUFBO0FBQUEsR0FHL0c7QUFBQTtBQUFBLGNBQUE1RTtBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBLFlBQUFtSSxRQUFBLE1BQUFySCxJQUEwQztBQUFBLFFBQW9CO0FBQUE7QUFBQSxtQkFBQW1EO0FBQUFBLGVBQUF6RSxJQUFVLFVBQUFvQixJQUFBO0FBQUEsV0FBZSw2Q0FBc0I7QUFBQTtBQUFBO0FBQUEsUUFBTTtBQUFBO0FBQUE7QUFBQSxNQUFxQiw4Q0FBa0I7QUFBQTtBQUFBLEdBQzVKO0FBQUE7QUFBQSxjQUFBWjtBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBLFlBQUFjLElBQUE7QUFBQSxRQUFtQztBQUFBO0FBQUE7QUFBQSwyQkFBQUYsR0FBQXBCLEdBQUF5RCxLQUE4QiwyQkFBYTtBQUFBO0FBQUEscUJBQU87QUFBQTtBQUFBO0FBQUEsTUFBUTtBQUFBLEtBQUc7QUFBQSxHQUNsRztBQUFBO0FBQUEsY0FBQWpEO0FBQUFBO0FBQUFBLE1BQUE7QUFBQSxXQUFBUixJQUFrQztBQUFBO0FBQUE7QUFBQSxZQUFBbUIsSUFBQTtBQUFBLFFBQThCO0FBQUE7QUFBQSxPQUE5QixjQUF5RCx1Q0FBbUI7QUFBQTtBQUFBLE1BQVE7QUFBQSxLQUFHO0FBQUEsV0FBQztBQUFBLEdBQzFIO0FBQUE7QUFBQSxjQUFBWDtBQUFBQSxNQUFxQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUFXLElBQUEsTUFBd0Q7QUFBQTtBQUFBLFdBQXhELGtCQUFBQSxNQUFBLE1BQStCO0FBQUE7QUFBQTtBQUFBLE1BQXlDO0FBQUEsS0FBUztBQUFBLFdBQUM7QUFBQSxHQUN2SDtBQUFBO0FBQUEsY0FBQVg7QUFBQUEsTUFBZ0M7QUFBQTtBQUFBO0FBQUEsWUFBQWMsSUFBQTtBQUFBLFFBQWtDLDBEQUFnQjtBQUFBO0FBQUE7QUFBQSxNQUFhO0FBQUEsS0FBUztBQUFBLE9BQUFzSCxnQkR0Z0IxRztBQUFBLEdDdWdCRTtBQUFBO0FBQUEsY0FBQXBJO0FBQUFBLE1BQStCO0FBQUE7QUFBQTtBQUFBLFlBQUFTLElBQUEsTUFBQXlFLElBQUE7QUFBQSxRQUEwQjtBQUFBO0FBQUE7QUFBQSxNQUFxQjtBQUFBLEtBQStCO0FBQUEsR0FDN0c7QUFBQTtBQUFBLGNBQUFsRjtBQUFBQTtBQUFBQSxNQUFBO0FBQUEsZUFDRTtBQUFBO0FBQUEsc0JBQUFpSSxTQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0NBQUFwSCxRQUFBO0FBQUE7QUFBQSxtREFBQUEsUUFBQTtBQUFBO0FBQUE7QUFBQSxTQUVFO0FBQUE7QUFBQSxvQkFBQW1CLEdBQUFxRztBQUFBQSxZQUNTO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBa0Y7QUFBQTtBQUFBO0FBQUEsU0FDcEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUNGO0FBQUEsS0FBRztBQUFBLE9BQUFDLG1CRDlnQmQ7QUFBQSxHQ2loQkU7QUFBQTtBQUFBLGNBQUF0STtBQUFBQSxNQUFpQztBQUFBO0FBQUEsZ0VBQUFXLElBQUEsTUFBOEI7QUFBQTtBQUFBLE1BQWdCO0FBQUEsS0FBaUM7QUFBQSxPQUFBNEgscUJEamhCbEg7QUFBQSxHQ2toQkU7QUFBQTtBQUFBLGNBQUF2STtBQUFBQSxNQUFtQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUFXLElBQUEsTUFBdUQ7QUFBQTtBQUFBLFdBQXZELGtCQUFBQSxNQUFBLE1BQThCO0FBQUE7QUFBQTtBQUFBLE1BQXlDO0FBQUE7QUFBQSxLQUFtQztBQUFBLEdBQzdJO0FBQUE7QUFBQSxjQUFBWDtBQUFBQTtBQUFBQSxNQUFBO0FBQUEsZUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQUFBVSxJQUFBO0FBQUE7QUFBQSxXQUd1Qyx1Q0FBZTtBQUFBO0FBQUEsZUFBQWYsUUFIdEQsU0FBQWdCLElBQUE7QUFBQTtBQUFBLHdCQUMwQztBQUFBLGtCQUFBVSxLQUE2QjtBQUFBLFdBRHZFO0FBQUEsZUFBQW1ILGdCQUFBO0FBQUEsV0FFNkIsWUFBMEI7QUFBQSxpQkFBQW5ILEtBQTZCO0FBQUE7QUFBQSxlQUZwRjtBQUFBLDJCQUFBbUgsY0FBQSxNQUlzQjtBQUFBO0FBQUEsTUFBbUI7QUFBQSxLQUFHO0FBQUEsR0FDOUM7QUFBQTtBQUFBLGNBQUF4STtBQUFBQSxNQUFpQztBQUFBO0FBQUE7QUFBQSxZQUFBVyxJQUFBO0FBQUEsUUFBOEIsWUFBWTtBQUFBLGNBQUFVLEtBQThCO0FBQUE7QUFBQTtBQUFBLE1BQVk7QUFBQSxLQUFHO0FBQUEsR0FHeEgsdUJBQUE0QyxPQUF1QixTQUFHO0FBQUEsR0FDMUIsd0JBQUFBLE9BQXdCLFNBQUc7QUFBQSxHQUMzQjtBQUFBO0FBQUEsY0FBQWpFO0FBQUFBLE1BQWdDLDhDQUFBYyxJQUFBLE1BQTBCO0FBQUEsTUFBUztBQUFBLEtBQUc7QUFBQSxXQUFDO0FBQUEsR0FDdkUsZ0NBQUFtRCxPQUFnQyxTQUFZO0FBQUEsR0FDNUMscUJBQUFBLE9BQXFCLFNBQUc7QUFBQSxHQUN4Qix3QkFBQUEsT0FBd0IsU0FBRztBQUFBLFlBQUF3RSxLQUFBMUk7QUFBQUEsSUFVTCxPQUZSO0FBQUEsYUR6aUJoQjtBQUFBLGNBQUE7QUFBQSxzQkFBQTtBQUFBLGNBQUEsNERBQUEsQ0FBQSxDQUFBO0FBQUEsWUFBQTtBQUFBLFlDeWlCZ0IsQ0FFUSwwQkFBd0I7QUFBQTtBQUFBLE9BQUEySSxLQUhyQztBQUFBLEdBSzRCO0FBQUEsR0FDSTtBQUFBLEdBQ0w7QUFBQSxHQUNJO0FBQUEsR0FDSTtBQUFBLEdBQ1I7QUFBQSxHQUNFO0FBQUEsR0FDQztBQUFBLEdBQ0Q7QUFBQSxHQUNRO0FBQUEsR0FDSjtBQUFBLEdBQ0o7QUFBQSxHQUNJO0FBQUEsR0FDSDtBQUFBLEdBRXZDO0FBQUEsR0FBd0Q7QUFBQTtBQUFBLEVENWpCMUQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNzcyNiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRfZXhpdC5jbW8uanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL3N0ZF9leGl0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFbnN1cmUgdGhhdCBbYXRfZXhpdF0gZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBwcm9ncmFtICopXG5cbmxldCBfID0gZG9fYXRfZXhpdCgpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJTdGRsaWIiXSwibWFwcGluZ3MiOiJPQUFBQSxVQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUFDLFNBQUE7QUFBQSxHQ2lCUTtBQUFBLEdBQVk7QUFBQTtBQUFBLEVEakJwQiIsImlnbm9yZUxpc3QiOlswXX19XX0=
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3hfYnJvd3Nlci5iYy5qcyIsInNlY3Rpb25zIjpbeyJvZmZzZXQiOnsibGluZSI6MywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3hfYnJvd3Nlci5lb2Jqcy9qc29vL3N4X2Jyb3dzZXIuYmMucnVudGltZS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvYnVpbHRpbi8rbWxCeXRlcy5qcyIsIi9idWlsdGluLyttYXJzaGFsLmpzIiwiL2J1aWx0aW4vK2lvLmpzIiwiL2J1aWx0aW4vK3N5cy5qcyIsIi9idWlsdGluLytiYWNrdHJhY2UuanMiLCIvYnVpbHRpbi8rc3RkbGliLmpzIiwiL2J1aWx0aW4vK2pzbGliLmpzIiwiL2J1aWx0aW4vK2ZhaWwuanMiLCIvYnVpbHRpbi8rdW5peC5qcyIsIi9idWlsdGluLytmcy5qcyIsIi9idWlsdGluLytmc19mYWtlLmpzIiwiL2J1aWx0aW4vK2ludDY0LmpzIiwiL2J1aWx0aW4vK3N5bmMuanMiLCIvYnVpbHRpbi8rbmF0LmpzIiwiL2J1aWx0aW4vK2ZzX25vZGUuanMiLCIvYnVpbHRpbi8rYmlnYXJyYXkuanMiLCIvYnVpbHRpbi8rYmlnc3RyaW5nLmpzIiwiL2J1aWx0aW4vK2JsYWtlMi5qcyIsIi9idWlsdGluLyttZDUuanMiLCIvYnVpbHRpbi8raWVlZV83NTQuanMiLCIvYnVpbHRpbi8rb2JqLmpzIiwiL2J1aWx0aW4vK2VmZmVjdC5qcyIsIi9idWlsdGluLythcnJheS5qcyIsIi9idWlsdGluLytkb21haW4uanMiLCIvYnVpbHRpbi8raW50cy5qcyIsIi9idWlsdGluLytoYXNoLmpzIiwiL2J1aWx0aW4vK2NvbXBhcmUuanMiLCIvYnVpbHRpbi8rcnVudGltZV9ldmVudHMuanMiLCIvYnVpbHRpbi8renN0ZC5qcyIsIi9idWlsdGluLyt3ZWFrLmpzIiwiL2J1aWx0aW4vK2djLmpzIiwiL2J1aWx0aW4vK2Zvcm1hdC5qcyIsIi9idWlsdGluLytncmFwaGljcy5qcyIsIi9idWlsdGluLytqc2xpYl9qc19vZl9vY2FtbC5qcyIsIi9idWlsdGluLytsZXhpbmcuanMiLCIvYnVpbHRpbi8rcHJuZy5qcyIsIi9idWlsdGluLytwYXJzaW5nLmpzIiwiL2J1aWx0aW4vK3N0ci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIEFuIE9DYW1sIHN0cmluZyBpcyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBmaWVsZHM6XG4vLyAtIHRhZyAndCdcbi8vIC0gbGVuZ3RoICdsJ1xuLy8gLSBjb250ZW50cyAnYydcbi8vXG4vLyBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyIGEgSmF2YVNjcmlwdCBhcnJheSBvclxuLy8gYSBKYXZhU2NyaXB0IHN0cmluZy4gVGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyBjYW4gYmUgbGVzcyB0aGFuIHRoZVxuLy8gbGVuZ3RoIG9mIHRoZSBPQ2FtbCBzdHJpbmcuIEluIHRoaXMgY2FzZSwgcmVtYWluaW5nIGJ5dGVzIGFyZVxuLy8gYXNzdW1lZCB0byBiZSB6ZXJvZXMuIEFycmF5cyBhcmUgbXV0YWJsZSBidXQgY29uc3VtZXMgbW9yZSBtZW1vcnlcbi8vIHRoYW4gc3RyaW5ncy4gQSBjb21tb24gcGF0dGVybiBpcyB0byBzdGFydCBmcm9tIGFuIGVtcHR5IHN0cmluZyBhbmRcbi8vIHByb2dyZXNzaXZlbHkgZmlsbCBpdCBmcm9tIHRoZSBzdGFydC4gUGFydGlhbCBzdHJpbmdzIG1ha2VzIGl0XG4vLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcyBlZmZpY2llbnRseS5cbi8vXG4vLyBXaGVuIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gVVRGLTE2LCB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlXG4vLyBzdHJpbmcgaXMgY29tcG9zZWQgb25seSBvZiBBU0NJSSBjaGFyYWN0ZXJzIChpbiB3aGljaCBjYXNlLCBub1xuLy8gY29udmVyc2lvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQpIG9yIG5vdC5cbi8vXG4vLyBUaGUgc3RyaW5nIHRhZyBjYW4gdGh1cyB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy8gICBmdWxsIHN0cmluZyAgICAgQllURSB8IFVOS05PV046ICAgICAgMFxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IEFTQ0lJOiAgICAgICAgOVxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IE5PVF9BU0NJSTogICAgOFxuLy8gICBzdHJpbmcgcHJlZml4ICAgUEFSVElBTDogICAgICAgICAgICAgMlxuLy8gICBhcnJheSAgICAgICAgICAgQVJSQVk6ICAgICAgICAgICAgICAgNFxuLy9cbi8vIE9uZSBjYW4gdXNlIGJpdCBtYXNraW5nIHRvIGRpc2NyaW1pbmF0ZSB0aGVzZSBkaWZmZXJlbnQgY2FzZXM6XG4vLyAgIGtub3duX2VuY29kaW5nKHgpID0geCY4XG4vLyAgIGlzX2FzY2lpKHgpID0gICAgICAgeCYxXG4vLyAgIGtpbmQoeCkgPSAgICAgICAgICAgeCY2XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9zdHJfcmVwZWF0KG4sIHMpIHtcbiAgcmV0dXJuIHMucmVwZWF0KG4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXNcbi8vV2Vha2RlZlxuLy8gUHJlIEVDTUFTY3JpcHQgNSwgW2FwcGx5XSB3b3VsZCBub3Qgc3VwcG9ydCBhcnJheS1saWtlIG9iamVjdC5cbi8vIEluIHN1Y2ggc2V0dXAsIFR5cGVkX2FycmF5IHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIHBvbHlmaWxsLCBhbmQgW2YuYXBwbHldIHdvdWxkXG4vLyBmYWlsIGhlcmUuIE1hcmsgdGhlIHByaW1pdGl2ZSBhcyBXZWFrZGVmLCBzbyB0aGF0IHBlb3BsZSBjYW4gb3ZlcnJpZGUgaXQgZWFzaWx5LlxuZnVuY3Rpb24gY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsIGksIGxlbikge1xuICB2YXIgZiA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG4gIGlmIChpID09PSAwICYmIGxlbiA8PSA0MDk2ICYmIGxlbiA9PT0gYS5sZW5ndGgpIHJldHVybiBmLmFwcGx5KG51bGwsIGEpO1xuICB2YXIgcyA9IFwiXCI7XG4gIGZvciAoOyAwIDwgbGVuOyBpICs9IDEwMjQsIGxlbiAtPSAxMDI0KVxuICAgIHMgKz0gZi5hcHBseShudWxsLCBhLnNsaWNlKGksIGkgKyBNYXRoLm1pbihsZW4sIDEwMjQpKSk7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG4vL1dlYWtkZWZcbi8vIFByZSBFQ01BU2NyaXB0IDUsIFthcHBseV0gd291bGQgbm90IHN1cHBvcnQgYXJyYXktbGlrZSBvYmplY3QuXG4vLyBJbiBzdWNoIHNldHVwLCBUeXBlZF9hcnJheSB3b3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBwb2x5ZmlsbCwgYW5kIFtmLmFwcGx5XSB3b3VsZFxuLy8gZmFpbCBoZXJlLiBNYXJrIHRoZSBwcmltaXRpdmUgYXMgV2Vha2RlZiwgc28gdGhhdCBwZW9wbGUgY2FuIG92ZXJyaWRlIGl0IGVhc2lseS5cbmZ1bmN0aW9uIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoYSwgaSwgbGVuKSB7XG4gIHZhciBmID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgaWYgKGkgPT09IDAgJiYgbGVuIDw9IDQwOTYgJiYgbGVuID09PSBhLmxlbmd0aCkgcmV0dXJuIGYuYXBwbHkobnVsbCwgYSk7XG4gIHZhciBzID0gXCJcIjtcbiAgZm9yICg7IDAgPCBsZW47IGkgKz0gMTAyNCwgbGVuIC09IDEwMjQpXG4gICAgcyArPSBmLmFwcGx5KG51bGwsIGEuc3ViYXJyYXkoaSwgaSArIE1hdGgubWluKGxlbiwgMTAyNCkpKTtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29faXNfYXNjaWlcbmZ1bmN0aW9uIGpzb29faXNfYXNjaWkocykge1xuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGdldHMgYmV0dGVyIGF0IGFyb3VuZCB0aGlzIHBvaW50IGZvciBhbGwgYnJvd3NlcnNcbiAgaWYgKHMubGVuZ3RoIDwgMjQpIHtcbiAgICAvLyBTcGlkZXJtb25rZXkgZ2V0cyBtdWNoIHNsb3dlciB3aGVuIHMubGVuZ3RoID49IDI0IChvbiA2NCBiaXQgYXJjaHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBpZiAocy5jaGFyQ29kZUF0KGkpID4gMTI3KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleDogZXhwZWN0ZWRcbiAgZWxzZSByZXR1cm4gIS9bXlxceDAwLVxceDdmXS8udGVzdChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0IG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpKSB7XG4gIHN3aXRjaCAocy50ICYgNikge1xuICAgIGNhc2UgMCAvKiBCWVRFUyAqLzpcbiAgICAgIHJldHVybiBzLmMuY2hhckNvZGVBdChpKTtcbiAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgIGlmIChpID49IHMuYy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHMuYy5jaGFyQ29kZUF0KGkpO1xuICAgIGNhc2UgNCAvKiBBUlJBWSAqLzpcbiAgICAgIHJldHVybiBzLmNbaV07XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpLCBjKSB7XG4gIC8vIFRoZSBPQ2FtbCBjb21waWxlciB1c2VzIENoYXIudW5zYWZlX2NociBvbiBpbnRlZ2VycyBsYXJnZXIgdGhhbiAyNTUhXG4gIGMgJj0gMHhmZjtcbiAgaWYgKHMudCAhPT0gNCAvKiBBUlJBWSAqLykge1xuICAgIGlmIChpID09PSBzLmMubGVuZ3RoKSB7XG4gICAgICBzLmMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgIGlmIChpICsgMSA9PT0gcy5sKSBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LTk9XTiovXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICB9XG4gIHMuY1tpXSA9IGM7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldChzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSkgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQxNihzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDEpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSksXG4gICAgYjIgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKTtcbiAgcmV0dXJuIChiMiA8PCA4KSB8IGIxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0MTYocywgaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAxKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpKSxcbiAgICBiMiA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMSk7XG4gIHJldHVybiAoYjIgPDwgOCkgfCBiMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDMyKHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gMykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSxcbiAgICBiMiA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSArIDEpLFxuICAgIGIzID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpICsgMiksXG4gICAgYjQgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAzKTtcbiAgcmV0dXJuIChiNCA8PCAyNCkgfCAoYjMgPDwgMTYpIHwgKGIyIDw8IDgpIHwgYjE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQzMihzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpLFxuICAgIGIyID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkgKyAxKSxcbiAgICBiMyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgMiksXG4gICAgYjQgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocywgaSArIDMpO1xuICByZXR1cm4gKGI0IDw8IDI0KSB8IChiMyA8PCAxNikgfCAoYjIgPDwgOCkgfCBiMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDY0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gNykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkoOCk7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgYVs3IC0gal0gPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyBqKTtcbiAgfVxuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0LCBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldDY0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBhWzcgLSBqXSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLCBpICsgaik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0KHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQoX3MsIF9pLCBfYykge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfc2V0KHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MTYocywgaSwgaTE2KSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDEpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIyID0gMHhmZiAmIChpMTYgPj4gOCksXG4gICAgYjEgPSAweGZmICYgaTE2O1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGkgKyAxLCBiMik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MzIocywgaSwgaTMyKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGI0ID0gMHhmZiAmIChpMzIgPj4gMjQpLFxuICAgIGIzID0gMHhmZiAmIChpMzIgPj4gMTYpLFxuICAgIGIyID0gMHhmZiAmIChpMzIgPj4gOCksXG4gICAgYjEgPSAweGZmICYgaTMyO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGkgKyAxLCBiMik7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpICsgMiwgYjMpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDMsIGI0KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQ2NChzLCBpLCBpNjQpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoaTY0KTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocywgaSArIDcgLSBqLCBhW2pdKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczoganNvb190ZXh0X2VuY29kZXJcbnZhciBqc29vX3RleHRfZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuXG4vL1Byb3ZpZGVzOiBqc29vX3RleHRfZGVjb2RlclxudmFyIGpzb29fdGV4dF9kZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGpzb29fdGV4dF9lbmNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHtcbiAgICByZXR1cm4gbmV3IE1sQnl0ZXMoOSwgcywgcy5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHZhciBhID0ganNvb190ZXh0X2VuY29kZXIuZW5jb2RlKHMpO1xuICAgIHJldHVybiBuZXcgTWxCeXRlcyg0LCBhLCBhLmxlbmd0aCk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcywganNvb19pc19hc2NpaVxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczoganNvb190ZXh0X2RlY29kZXJcbmNsYXNzIE1sQnl0ZXMge1xuICBjb25zdHJ1Y3Rvcih0YWcsIGNvbnRlbnRzLCBsZW5ndGgpIHtcbiAgICB0aGlzLnQgPSB0YWc7XG4gICAgdGhpcy5jID0gY29udGVudHM7XG4gICAgdGhpcy5sID0gbGVuZ3RoO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgc3dpdGNoICh0aGlzLnQpIHtcbiAgICAgIGNhc2UgOTogLypCWVRFUyB8IEFTQ0lJKi9cbiAgICAgIGNhc2UgOCAvKkJZVEVTIHwgTk9UX0FTQ0lJKi86XG4gICAgICAgIHJldHVybiB0aGlzLmM7XG4gICAgICBjYXNlIDQ6IC8qIEFSUkFZICovXG4gICAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHRoaXMpO1xuICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgMCAvKkJZVEVTIHwgVU5LTk9XTiovOlxuICAgICAgICBpZiAoanNvb19pc19hc2NpaSh0aGlzLmMpKSB0aGlzLnQgPSA5OyAvKkJZVEVTIHwgQVNDSUkqL1xuICAgICAgICBlbHNlIHRoaXMudCA9IDg7IC8qQllURVMgfCBOT1RfQVNDSUkqL1xuICAgICAgICByZXR1cm4gdGhpcy5jO1xuICAgIH1cbiAgfVxuXG4gIHRvVXRmMTYoKSB7XG4gICAgaWYgKHRoaXMudCA9PT0gOSkgcmV0dXJuIHRoaXMuYztcbiAgICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXModGhpcyk7XG4gICAgcmV0dXJuIGpzb29fdGV4dF9kZWNvZGVyLmRlY29kZShhKTtcbiAgfVxuXG4gIHNsaWNlKCkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy50ID09PSA0ID8gdGhpcy5jLnNsaWNlKCkgOiB0aGlzLmM7XG4gICAgcmV0dXJuIG5ldyBNbEJ5dGVzKHRoaXMudCwgY29udGVudCwgdGhpcy5sKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocykge1xuICAvKiBBc3N1bWVzIG5vdCBCWVRFUyAqL1xuICBpZiAocy50ID09PSAyIC8qIFBBUlRJQUwgKi8pIHMuYyArPSBjYW1sX3N0cl9yZXBlYXQocy5sIC0gcy5jLmxlbmd0aCwgXCJcXDBcIik7XG4gIGVsc2Ugcy5jID0gY2FtbF9zdWJfdWludDhfYXJyYXlfdG9fanNieXRlcyhzLmMsIDAsIHMuYy5sZW5ndGgpO1xuICBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LTk9XTiovXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpIHtcbiAgLyogQXNzdW1lcyBub3QgQVJSQVkgKi9cbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShzLmwpO1xuICB2YXIgYiA9IHMuYyxcbiAgICBsID0gYi5sZW5ndGgsXG4gICAgaSA9IDA7XG4gIGZvciAoOyBpIDwgbDsgaSsrKSBhW2ldID0gYi5jaGFyQ29kZUF0KGkpO1xuICBmb3IgKGwgPSBzLmw7IGkgPCBsOyBpKyspIGFbaV0gPSAwO1xuICBzLmMgPSBhO1xuICBzLnQgPSA0OyAvKiBBUlJBWSAqL1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMocykge1xuICBpZiAocy50ICE9PSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkocyk7XG4gIHJldHVybiBzLmM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocykge1xuICB2YXIgbCA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKTtcbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShsKTtcbiAgdmFyIGkgPSAwO1xuICBmb3IgKDsgaSA8IGw7IGkrKykgYVtpXSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9jcmVhdGVfc3RyaW5nKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyaW5nLmNyZWF0ZVwiKTtcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKGxlbiA/IDIgOiA5LCBcIlwiLCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9zdHJpbmcoX2xlbikge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHJpbmcuY3JlYXRlXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcyxjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2J5dGVzKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQnl0ZXMuY3JlYXRlXCIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMobGVuID8gMiA6IDksIFwiXCIsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2FycmF5KGEpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsIDAsIGEubGVuZ3RoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGEpIHtcbiAgcmV0dXJuIGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoYSwgMCwgYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkoYSkge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91aW50OF9hcnJheShhLnNsaWNlKCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX2FycmF5KGEpIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgYSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICB9XG4gIHJldHVybiBuZXcgTWxCeXRlcyg0LCBhLCBhLmxlbmd0aCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXlcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYSkge1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoNCwgYSwgYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2NvbXBhcmUgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19jb21wYXJlKHMxLCBzMikge1xuICBzMS50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgczIudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiBzMS5jIDwgczIuYyA/IC0xIDogczEuYyA+IHMyLmMgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19lcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMikge1xuICBpZiAoczEgPT09IHMyKSByZXR1cm4gMTtcbiAgczEudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIHMyLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gczEuYyA9PT0gczIuYyA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19lcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbm90ZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiAxIC0gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG5mdW5jdGlvbiBjYW1sX2J5dGVzX25vdGVxdWFsKHMxLCBzMikge1xuICByZXR1cm4gMSAtIGNhbWxfYnl0ZXNfZXF1YWwoczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19sZXNzZXF1YWwgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIHMxLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICBzMi50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIHMxLmMgPD0gczIuYyA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHMxLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICBzMi50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIHMxLmMgPCBzMi5jID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dyZWF0ZXJlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc2VxdWFsXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19sZXNzZXF1YWwoczIsIHMxKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc3RoYW5cbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzdGhhblxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVydGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maWxsX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuLy9BbGlhczogY2FtbF9maWxsX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9maWxsX2J5dGVzKHMsIGksIGwsIGMpIHtcbiAgaWYgKGwgPiAwKSB7XG4gICAgaWYgKGkgPT09IDAgJiYgKGwgPj0gcy5sIHx8IChzLnQgPT09IDIgLyogUEFSVElBTCAqLyAmJiBsID49IHMuYy5sZW5ndGgpKSkge1xuICAgICAgaWYgKGMgPT09IDApIHtcbiAgICAgICAgcy5jID0gXCJcIjtcbiAgICAgICAgcy50ID0gMjsgLyogUEFSVElBTCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcy5jID0gY2FtbF9zdHJfcmVwZWF0KGwsIFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgICBzLnQgPSBsID09PSBzLmwgPyAwIC8qIEJZVEVTIHwgVU5LTk9XTiAqLyA6IDI7IC8qIFBBUlRJQUwgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHMudCAhPT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICAgICAgZm9yIChsICs9IGk7IGkgPCBsOyBpKyspIHMuY1tpXSA9IGM7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsaXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9ibGl0X2J5dGVzKHMxLCBpMSwgczIsIGkyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDA7XG4gIGlmIChcbiAgICBpMiA9PT0gMCAmJlxuICAgIChsZW4gPj0gczIubCB8fCAoczIudCA9PT0gMiAvKiBQQVJUSUFMICovICYmIGxlbiA+PSBzMi5jLmxlbmd0aCkpXG4gICkge1xuICAgIHMyLmMgPVxuICAgICAgczEudCA9PT0gNCAvKiBBUlJBWSAqL1xuICAgICAgICA/IGNhbWxfc3ViX3VpbnQ4X2FycmF5X3RvX2pzYnl0ZXMoczEuYywgaTEsIGxlbilcbiAgICAgICAgOiBpMSA9PT0gMCAmJiBzMS5jLmxlbmd0aCA9PT0gbGVuXG4gICAgICAgICAgPyBzMS5jXG4gICAgICAgICAgOiBzMS5jLnNsaWNlKGkxLCBpMSArIGxlbik7XG4gICAgczIudCA9IHMyLmMubGVuZ3RoID09PSBzMi5sID8gMCAvKiBCWVRFUyB8IFVOS05PV04gKi8gOiAyOyAvKiBQQVJUSUFMICovXG4gIH0gZWxzZSBpZiAoczIudCA9PT0gMiAvKiBQQVJUSUFMICovICYmIGkyID09PSBzMi5jLmxlbmd0aCkge1xuICAgIHMyLmMgKz1cbiAgICAgIHMxLnQgPT09IDQgLyogQVJSQVkgKi9cbiAgICAgICAgPyBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzKHMxLmMsIGkxLCBsZW4pXG4gICAgICAgIDogaTEgPT09IDAgJiYgczEuYy5sZW5ndGggPT09IGxlblxuICAgICAgICAgID8gczEuY1xuICAgICAgICAgIDogczEuYy5zbGljZShpMSwgaTEgKyBsZW4pO1xuICAgIHMyLnQgPSBzMi5jLmxlbmd0aCA9PT0gczIubCA/IDAgLyogQllURVMgfCBVTktOT1dOICovIDogMjsgLyogUEFSVElBTCAqL1xuICB9IGVsc2Uge1xuICAgIGlmIChzMi50ICE9PSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkoczIpO1xuICAgIHZhciBjMSA9IHMxLmMsXG4gICAgICBjMiA9IHMyLmM7XG4gICAgaWYgKHMxLnQgPT09IDQgLyogQVJSQVkgKi8pIHtcbiAgICAgIGlmIChpMiA8PSBpMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBjMltpMiArIGldID0gYzFbaTEgKyBpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgYzJbaTIgKyBpXSA9IGMxW2kxICsgaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsID0gTWF0aC5taW4obGVuLCBjMS5sZW5ndGggLSBpMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgYzJbaTIgKyBpXSA9IGMxLmNoYXJDb2RlQXQoaTEgKyBpKTtcbiAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIGMyW2kyICsgaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ibGl0X3N0cmluZyhhLCBiLCBjLCBkLCBlKSB7XG4gIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX3N0cmluZyhhKSwgYiwgYywgZCwgZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19sZW5ndGgocykge1xuICByZXR1cm4gcy5sO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb25jYXQgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29uY2F0KGEsIGIpIHtcbiAgcmV0dXJuIGEgKyBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb25jYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMsIE1sQnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbmNhdChzMSwgczIpIHtcbiAgczEudCAmIDYgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIHMyLnQgJiA2ICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMoMCwgczEuYyArIHMyLmMsIHMxLmwgKyBzMi5sKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpIHtcbiAgcmV0dXJuIHMuY2hhckNvZGVBdChpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBzLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfY29tcGFyZSBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19jb21wYXJlKHMxLCBzMikge1xuICByZXR1cm4gczEgPCBzMiA/IC0xIDogczEgPiBzMiA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19lcXVhbChzMSwgczIpIHtcbiAgaWYgKHMxID09PSBzMikgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gczEgPD0gczIgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc3RoYW4gY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHJldHVybiBzMSA8IHMyID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgcy50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzLmMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh4KSB7XG4gIHJldHVybiB4O1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3RleHRfZGVjb2Rlcl9idWZmXG52YXIganNvb190ZXh0X2RlY29kZXJfYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcblxuLy9Qcm92aWRlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWlcbi8vUmVxdWlyZXM6IGpzb29fdGV4dF9kZWNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX3RleHRfZGVjb2Rlcl9idWZmXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHJldHVybiBzO1xuICB2YXIgYSA9XG4gICAgcy5sZW5ndGggPD0ganNvb190ZXh0X2RlY29kZXJfYnVmZi5sZW5ndGhcbiAgICAgID8gbmV3IFVpbnQ4QXJyYXkoanNvb190ZXh0X2RlY29kZXJfYnVmZiwgMCwgcy5sZW5ndGgpXG4gICAgICA6IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgYVtpXSA9IHMuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4ganNvb190ZXh0X2RlY29kZXIuZGVjb2RlKGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGpzb29fdGV4dF9lbmNvZGVyXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpO1xuICB2YXIgYSA9IGpzb29fdGV4dF9lbmNvZGVyLmVuY29kZShzKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhzKSB7XG4gIHJldHVybiBuZXcgTWxCeXRlcygwLCBzLCBzLmxlbmd0aCk7XG59XG5cbi8vIFRoZSBzZWN0aW9uIGJlbG93IHNob3VsZCBiZSB1c2VkIHdoZW4gdXNlLWpzLXN0cmluZz1mYWxzZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsIGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQocywgaSwgYykge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGggY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykge1xuICByZXR1cm4gY2FtbF9tbF9ieXRlc19sZW5ndGgocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfY29tcGFyZVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29tcGFyZShzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfY29tcGFyZShzMSwgczIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19lcXVhbFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzZXF1YWxcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMxLCBzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl9qc2J5dGVzKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcy50ICYgNiAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gcy5jO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIHMudG9VdGYxNigpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZ1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyhzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9pc19tbF9ieXRlcyhzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgTWxCeXRlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JldHVybnMgYSAoZnVsbCkgc3RyaW5nIG9mIGJ5dGVzIG9yIGFuIGFycmF5XG5mdW5jdGlvbiBjYW1sX21sX2J5dGVzX2NvbnRlbnQocykge1xuICBzd2l0Y2ggKHMudCAmIDYpIHtcbiAgICBjYXNlIDIgLyogUEFSVElBTCAqLzpcbiAgICAgIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gICAgICByZXR1cm4gcy5jO1xuICAgIGRlZmF1bHQ6IC8qIEJZVEVTIG9yIEFSUkFZICovXG4gICAgICByZXR1cm4gcy5jO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaXNfbWxfc3RyaW5nKHMpIHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleDogZXhwZWN0ZWRcbiAgcmV0dXJuIHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmICEvW15cXHgwMC1cXHhmZl0vLnRlc3Qocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2lzX21sX2J5dGVzKHMpO1xufVxuXG4vLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBkZXByZWNhdGVkXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vRGVwcmVjYXRlZDogVXNlIFtjYW1sX3N0cmluZ19vZl9qc2J5dGVzXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9zdHJpbmcgbXV0YWJsZSAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RvX2pzX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL0RlcHJlY2F0ZWQ6IFVzZSBbY2FtbF9qc3N0cmluZ19vZl9zdHJpbmddIGluc3RlYWRcbmZ1bmN0aW9uIGNhbWxfdG9fanNfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vRGVwcmVjYXRlZDogVXNlIFtjYW1sX3N0cmluZ19vZl9qc3N0cmluZ10gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9qc190b19zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXSBpbnN0ZWFkXG5mdW5jdGlvbiBjYW1sX2FycmF5X29mX3N0cmluZyh4KSB7XG4gIHJldHVybiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNdIGluc3RlYWRcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfb2ZfYnl0ZXMoeCkge1xuICByZXR1cm4gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uZXdfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0RlcHJlY2F0ZWQ6IFVzZSBbY2FtbF9zdHJpbmdfb2ZfanNieXRlc10gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9uZXdfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocyk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2NvbnN0YW50c1xudmFyIGNhbWxfbWFyc2hhbF9jb25zdGFudHMgPSB7XG4gIFBSRUZJWF9TTUFMTF9CTE9DSzogMHg4MCxcbiAgUFJFRklYX1NNQUxMX0lOVDogMHg0MCxcbiAgUFJFRklYX1NNQUxMX1NUUklORzogMHgyMCxcbiAgQ09ERV9JTlQ4OiAweDAwLFxuICBDT0RFX0lOVDE2OiAweDAxLFxuICBDT0RFX0lOVDMyOiAweDAyLFxuICBDT0RFX0lOVDY0OiAweDAzLFxuICBDT0RFX1NIQVJFRDg6IDB4MDQsXG4gIENPREVfU0hBUkVEMTY6IDB4MDUsXG4gIENPREVfU0hBUkVEMzI6IDB4MDYsXG4gIENPREVfQkxPQ0szMjogMHgwOCxcbiAgQ09ERV9CTE9DSzY0OiAweDEzLFxuICBDT0RFX1NUUklORzg6IDB4MDksXG4gIENPREVfU1RSSU5HMzI6IDB4MGEsXG4gIENPREVfRE9VQkxFX0JJRzogMHgwYixcbiAgQ09ERV9ET1VCTEVfTElUVExFOiAweDBjLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfQklHOiAweDBkLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfTElUVExFOiAweDBlLFxuICBDT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzogMHgwZixcbiAgQ09ERV9ET1VCTEVfQVJSQVkzMl9MSVRUTEU6IDB4MDcsXG4gIENPREVfQ09ERVBPSU5URVI6IDB4MTAsXG4gIENPREVfSU5GSVhQT0lOVEVSOiAweDExLFxuICBDT0RFX0NVU1RPTTogMHgxMixcbiAgQ09ERV9DVVNUT01fTEVOOiAweDE4LFxuICBDT0RFX0NVU1RPTV9GSVhFRDogMHgxOSxcbn07XG5cbi8vUHJvdmlkZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG5jbGFzcyBVSW50OEFycmF5UmVhZGVyIHtcbiAgY29uc3RydWN0b3IocywgaSkge1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5pID0gaTtcbiAgfVxuXG4gIHJlYWQ4dSgpIHtcbiAgICByZXR1cm4gdGhpcy5zW3RoaXMuaSsrXTtcbiAgfVxuXG4gIHJlYWQ4cygpIHtcbiAgICByZXR1cm4gKHRoaXMuc1t0aGlzLmkrK10gPDwgMjQpID4+IDI0O1xuICB9XG5cbiAgcmVhZDE2dSgpIHtcbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzW2ldIDw8IDgpIHwgc1tpICsgMV07XG4gIH1cblxuICByZWFkMTZzKCkge1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKChzW2ldIDw8IDI0KSA+PiAxNikgfCBzW2kgKyAxXTtcbiAgfVxuXG4gIHJlYWQzMnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKHNbaV0gPDwgMjQpIHwgKHNbaSArIDFdIDw8IDE2KSB8IChzW2kgKyAyXSA8PCA4KSB8IHNbaSArIDNdKSA+Pj4gMDtcbiAgfVxuXG4gIHJlYWQzMnMoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoc1tpXSA8PCAyNCkgfCAoc1tpICsgMV0gPDwgMTYpIHwgKHNbaSArIDJdIDw8IDgpIHwgc1tpICsgM107XG4gIH1cblxuICByZWFkc3RyKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KHRoaXMucy5zdWJhcnJheShpLCBpICsgbGVuKSk7XG4gIH1cblxuICByZWFkdWludDhhcnJheShsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiB0aGlzLnMuc3ViYXJyYXkoaSwgaSArIGxlbik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogSnNTdHJpbmdSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmNsYXNzIEpzU3RyaW5nUmVhZGVyIHtcbiAgY29uc3RydWN0b3IocywgaSkge1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5pID0gaTtcbiAgfVxuXG4gIHJlYWQ4dSgpIHtcbiAgICByZXR1cm4gdGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspO1xuICB9XG5cbiAgcmVhZDhzKCkge1xuICAgIHJldHVybiAodGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspIDw8IDI0KSA+PiAyNDtcbiAgfVxuXG4gIHJlYWQxNnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfVxuXG4gIHJlYWQxNnMoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgPj4gMTYpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfVxuXG4gIHJlYWQzMnUoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsXG4gICAgICBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoXG4gICAgICAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfFxuICAgICAgICAocy5jaGFyQ29kZUF0KGkgKyAxKSA8PCAxNikgfFxuICAgICAgICAocy5jaGFyQ29kZUF0KGkgKyAyKSA8PCA4KSB8XG4gICAgICAgIHMuY2hhckNvZGVBdChpICsgMykpID4+PlxuICAgICAgMFxuICAgICk7XG4gIH1cblxuICByZWFkMzJzKCkge1xuICAgIHZhciBzID0gdGhpcy5zLFxuICAgICAgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKFxuICAgICAgKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDgpIHxcbiAgICAgIHMuY2hhckNvZGVBdChpICsgMylcbiAgICApO1xuICB9XG5cbiAgcmVhZHN0cihsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHRoaXMucy5zbGljZShpLCBpICsgbGVuKSk7XG4gIH1cblxuICByZWFkdWludDhhcnJheShsZW4pIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgdmFyIHMgPSB0aGlzLnM7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgYltqXSA9IHMuY2hhckNvZGVBdChpICsgaik7XG4gICAgfVxuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX2J5dGVzKGEpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKGEpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IEpzU3RyaW5nUmVhZGVyLCBVSW50OEFycmF5UmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyhzLCBvZnMpIHtcbiAgdmFyIGMgPSBjYW1sX21sX2J5dGVzX2NvbnRlbnQocyk7XG4gIHZhciBvZnMgPSB0eXBlb2Ygb2ZzID09PSBcIm51bWJlclwiID8gb2ZzIDogb2ZzWzBdO1xuICB2YXIgcmVhZGVyID1cbiAgICBjIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgICAgPyBuZXcgVUludDhBcnJheVJlYWRlcihjLCBvZnMpXG4gICAgICA6IG5ldyBKc1N0cmluZ1JlYWRlcihjLCBvZnMpO1xuICByZXR1cm4gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF91bm1hcnNoYWwocmVhZGVyLCBzaXplKSB7XG4gIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgc2l6ZVswXSA9IDg7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKHQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X21hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbWFyc2hhbCh3cml0ZXIsIHYsIHNpemVzKSB7XG4gIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyh2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHdyaXRlci53cml0ZSg4LCBiW2ldKTtcbiAgc2l6ZXNbMF0gPSA4O1xuICBzaXplc1sxXSA9IDg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfdW5tYXJzaGFsXG5mdW5jdGlvbiBjYW1sX2ludDMyX3VubWFyc2hhbChyZWFkZXIsIHNpemUpIHtcbiAgc2l6ZVswXSA9IDQ7XG4gIHJldHVybiByZWFkZXIucmVhZDMycygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbChyZWFkZXIsIHNpemUpIHtcbiAgc3dpdGNoIChyZWFkZXIucmVhZDh1KCkpIHtcbiAgICBjYXNlIDE6XG4gICAgICBzaXplWzBdID0gNDtcbiAgICAgIHJldHVybiByZWFkZXIucmVhZDMycygpO1xuICAgIGNhc2UgMjpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogbmF0aXZlIGludGVnZXIgdmFsdWUgdG9vIGxhcmdlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBuYXRpdmUgaW50ZWdlclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdW5tYXJzaGFsLCBjYW1sX2ludDY0X21hcnNoYWwsIGNhbWxfaW50NjRfY29tcGFyZSwgY2FtbF9pbnQ2NF9oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX3VubWFyc2hhbCwgY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NlcmlhbGl6ZSwgY2FtbF9iYV9kZXNlcmlhbGl6ZSwgY2FtbF9iYV9jb21wYXJlLCBjYW1sX2JhX2hhc2hcbnZhciBjYW1sX2N1c3RvbV9vcHMgPSB7XG4gIF9qOiB7XG4gICAgZGVzZXJpYWxpemU6IGNhbWxfaW50NjRfdW5tYXJzaGFsLFxuICAgIHNlcmlhbGl6ZTogY2FtbF9pbnQ2NF9tYXJzaGFsLFxuICAgIGZpeGVkX2xlbmd0aDogOCxcbiAgICBjb21wYXJlOiBjYW1sX2ludDY0X2NvbXBhcmUsXG4gICAgaGFzaDogY2FtbF9pbnQ2NF9oYXNoLFxuICB9LFxuICBfaToge1xuICAgIGRlc2VyaWFsaXplOiBjYW1sX2ludDMyX3VubWFyc2hhbCxcbiAgICBmaXhlZF9sZW5ndGg6IDQsXG4gIH0sXG4gIF9uOiB7XG4gICAgZGVzZXJpYWxpemU6IGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbCxcbiAgICBmaXhlZF9sZW5ndGg6IDQsXG4gIH0sXG4gIF9iaWdhcnJheToge1xuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAocmVhZGVyLCBzeikge1xuICAgICAgcmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgXCJfYmlnYXJyYXlcIik7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgIGNvbXBhcmU6IGNhbWxfYmFfY29tcGFyZSxcbiAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gIH0sXG4gIF9iaWdhcnIwMjoge1xuICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbiAocmVhZGVyLCBzeikge1xuICAgICAgcmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgXCJfYmlnYXJyMDJcIik7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgIGNvbXBhcmU6IGNhbWxfYmFfY29tcGFyZSxcbiAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gIH0sXG59O1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfZmxvYXRfb2ZfYnl0ZXMsIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogVUludDhBcnJheVJlYWRlclxuLy9SZXF1aXJlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1JlcXVpcmVzOiBjYW1sX3NldF9vb19pZFxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIpIHtcbiAgZnVuY3Rpb24gcmVhZHZscShvdmVyZmxvdykge1xuICAgIHZhciBjID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N2Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT09IDApIHtcbiAgICAgIGMgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgbjcgPSBuIDw8IDc7XG4gICAgICBpZiAobiAhPT0gbjcgPj4gNykgb3ZlcmZsb3dbMF0gPSB0cnVlO1xuICAgICAgbiA9IG43IHwgKGMgJiAweDdmKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgdmFyIG9sZF9wb3MgPSByZWFkZXIuaTtcbiAgdmFyIG1hZ2ljID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgc3dpdGNoIChtYWdpYykge1xuICAgIGNhc2UgMHg4NDk1YTZiZSAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICAgIHZhciBjb21wcmVzc2VkID0gMDtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICB2YXIgdW5jb21wcmVzc2VkX2RhdGFfbGVuID0gZGF0YV9sZW47XG4gICAgICB2YXIgbnVtX29iamVjdHMgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgdmFyIF9zaXplXzMyID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgIHZhciBfc2l6ZV82NCA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmQgLyogSW50ZXh0X21hZ2ljX251bWJlcl9jb21wcmVzc2VkICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSByZWFkZXIucmVhZDh1KCkgJiAweDNmO1xuICAgICAgdmFyIGNvbXByZXNzZWQgPSAxO1xuICAgICAgdmFyIG92ZXJmbG93ID0gW2ZhbHNlXTtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgdmFyIHVuY29tcHJlc3NlZF9kYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgdmFyIG51bV9vYmplY3RzID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgICB2YXIgX3NpemVfMzIgPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICAgIHZhciBfc2l6ZV82NCA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgICAgaWYgKG92ZXJmbG93WzBdKSB7XG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXG4gICAgICAgICAgXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmYgLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi86XG4gICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICBcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXI6IG9iamVjdCB0b28gbGFyZ2UgdG8gYmUgcmVhZCBiYWNrIG9uIGEgMzItYml0IHBsYXRmb3JtXCIsXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBiYWQgb2JqZWN0XCIpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKGhlYWRlcl9sZW4gIT09IHJlYWRlci5pIC0gb2xkX3Bvcykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBpbnZhbGlkIGhlYWRlclwiKTtcbiAgfVxuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIG9iamVjdHMgPSBbXTtcbiAgdmFyIGludGVybl9vYmpfdGFibGUgPSBudW1fb2JqZWN0cyA+IDAgPyBbXSA6IG51bGw7XG4gIHZhciBvYmpfY291bnRlciA9IDA7XG4gIGZ1bmN0aW9uIGludGVybl9yZWMocmVhZGVyKSB7XG4gICAgdmFyIGNvZGUgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgaWYgKGNvZGUgPj0gMHg0MCAvKmNzdC5QUkVGSVhfU01BTExfSU5UKi8pIHtcbiAgICAgIGlmIChjb2RlID49IDB4ODAgLypjc3QuUFJFRklYX1NNQUxMX0JMT0NLKi8pIHtcbiAgICAgICAgdmFyIHRhZyA9IGNvZGUgJiAweGY7XG4gICAgICAgIHZhciBzaXplID0gKGNvZGUgPj4gNCkgJiAweDc7XG4gICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgIGlmIChzaXplID09PSAwKSByZXR1cm4gdjtcbiAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICBpZiAodGFnID09PSAyNDgpIG9iamVjdHMucHVzaCh2KTtcbiAgICAgICAgc3RhY2sucHVzaCh2LCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2UgcmV0dXJuIGNvZGUgJiAweDNmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29kZSA+PSAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcgKi8pIHtcbiAgICAgICAgdmFyIGxlbiA9IGNvZGUgJiAweDFmO1xuICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyKGxlbik7XG4gICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICBjYXNlIDB4MDA6IC8vY3N0LkNPREVfSU5UODpcbiAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZDhzKCk7XG4gICAgICAgICAgY2FzZSAweDAxOiAvL2NzdC5DT0RFX0lOVDE2OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMTZzKCk7XG4gICAgICAgICAgY2FzZSAweDAyOiAvL2NzdC5DT0RFX0lOVDMyOlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgY2FzZSAweDAzOiAvL2NzdC5DT0RFX0lOVDY0OlxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbnRlZ2VyIHRvbyBsYXJnZVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgwNDogLy9jc3QuQ09ERV9TSEFSRUQ4OlxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIGlmIChjb21wcmVzc2VkID09PSAwKSBvZmZzZXQgPSBvYmpfY291bnRlciAtIG9mZnNldDtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29mZnNldF07XG4gICAgICAgICAgY2FzZSAweDA1OiAvL2NzdC5DT0RFX1NIQVJFRDE2OlxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICAgICAgICBpZiAoY29tcHJlc3NlZCA9PT0gMCkgb2Zmc2V0ID0gb2JqX2NvdW50ZXIgLSBvZmZzZXQ7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvZmZzZXRdO1xuICAgICAgICAgIGNhc2UgMHgwNjogLy9jc3QuQ09ERV9TSEFSRUQzMjpcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgaWYgKGNvbXByZXNzZWQgPT09IDApIG9mZnNldCA9IG9ial9jb3VudGVyIC0gb2Zmc2V0O1xuICAgICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2Zmc2V0XTtcbiAgICAgICAgICBjYXNlIDB4MDg6IC8vY3N0LkNPREVfQkxPQ0szMjpcbiAgICAgICAgICAgIHZhciBoZWFkZXIgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHRhZyA9IGhlYWRlciAmIDB4ZmY7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IGhlYWRlciA+PiAxMDtcbiAgICAgICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkgcmV0dXJuIHY7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICBpZiAodGFnID09PSAyNDgpIG9iamVjdHMucHVzaCh2KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MTM6IC8vY3N0LkNPREVfQkxPQ0s2NDpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogZGF0YSBibG9jayB0b28gbGFyZ2VcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDk6IC8vY3N0LkNPREVfU1RSSU5HODpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyKGxlbik7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGE6IC8vY3N0LkNPREVfU1RSSU5HMzI6XG4gICAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIobGVuKTtcbiAgICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgIGNhc2UgMHgwYzogLy9jc3QuQ09ERV9ET1VCTEVfTElUVExFOlxuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgdFs3IC0gaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGI6IC8vY3N0LkNPREVfRE9VQkxFX0JJRzpcbiAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHRbaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MGU6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZOF9MSVRUTEU6XG4gICAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDBkOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWThfQklHOlxuICAgICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICAgICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDA3OiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0xJVFRMRTpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgY2FzZSAweDBmOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzpcbiAgICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXModCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICBjYXNlIDB4MTA6IC8vY3N0LkNPREVfQ09ERVBPSU5URVI6XG4gICAgICAgICAgY2FzZSAweDExOiAvL2NzdC5DT0RFX0lORklYUE9JTlRFUjpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogY29kZSBwb2ludGVyXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDEyOiAvL2NzdC5DT0RFX0NVU1RPTTpcbiAgICAgICAgICBjYXNlIDB4MTg6IC8vY3N0LkNPREVfQ1VTVE9NX0xFTjpcbiAgICAgICAgICBjYXNlIDB4MTk6IC8vY3N0LkNPREVfQ1VTVE9NX0ZJWEVEOlxuICAgICAgICAgICAgdmFyIGMsXG4gICAgICAgICAgICAgIHMgPSBcIlwiO1xuICAgICAgICAgICAgd2hpbGUgKChjID0gcmVhZGVyLnJlYWQ4dSgpKSAhPT0gMCkgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgdmFyIG9wcyA9IGNhbWxfY3VzdG9tX29wc1tzXTtcbiAgICAgICAgICAgIHZhciBleHBlY3RlZF9zaXplO1xuICAgICAgICAgICAgaWYgKCFvcHMpXG4gICAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdW5rbm93biBjdXN0b20gYmxvY2sgaWRlbnRpZmllclwiKTtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICBjYXNlIDB4MTI6IC8vIGNzdC5DT0RFX0NVU1RPTSAoZGVwcmVjYXRlZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAweDE5OiAvLyBjc3QuQ09ERV9DVVNUT01fRklYRURcbiAgICAgICAgICAgICAgICBpZiAoIW9wcy5maXhlZF9sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICAgICAgICAgICAgICBcImlucHV0X3ZhbHVlOiBleHBlY3RlZCBhIGZpeGVkLXNpemUgY3VzdG9tIGJsb2NrXCIsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NpemUgPSBvcHMuZml4ZWRfbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDB4MTg6IC8vIGNzdC5DT0RFX0NVU1RPTV9MRU5cbiAgICAgICAgICAgICAgICBleHBlY3RlZF9zaXplID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIHNpemU2NFxuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWQzMnMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzaXplID0gWzBdO1xuICAgICAgICAgICAgdmFyIHYgPSBvcHMuZGVzZXJpYWxpemUocmVhZGVyLCBzaXplKTtcbiAgICAgICAgICAgIGlmIChleHBlY3RlZF9zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkX3NpemUgIT09IHNpemVbMF0pXG4gICAgICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICAgICAgICAgIFwiaW5wdXRfdmFsdWU6IGluY29ycmVjdCBsZW5ndGggb2Ygc2VyaWFsaXplZCBjdXN0b20gYmxvY2tcIixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBtZXNzYWdlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb21wcmVzc2VkKSB7XG4gICAgaWYgKGNhbWxfZGVjb21wcmVzc19pbnB1dCkge1xuICAgICAgdmFyIGRhdGEgPSByZWFkZXIucmVhZHVpbnQ4YXJyYXkoZGF0YV9sZW4pO1xuICAgICAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KHVuY29tcHJlc3NlZF9kYXRhX2xlbik7XG4gICAgICB2YXIgcmVzID0gY2FtbF9kZWNvbXByZXNzX2lucHV0KGRhdGEsIHJlcyk7XG4gICAgICB2YXIgcmVhZGVyID0gbmV3IFVJbnQ4QXJyYXlSZWFkZXIocmVzLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBjb21wcmVzc2VkIG9iamVjdCwgY2Fubm90IGRlY29tcHJlc3NcIik7XG4gICAgfVxuICB9XG4gIHZhciByZXMgPSBpbnRlcm5fcmVjKHJlYWRlcik7XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHNpemUgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBkID0gdi5sZW5ndGg7XG4gICAgaWYgKGQgPCBzaXplKSBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgIHZbZF0gPSBpbnRlcm5fcmVjKHJlYWRlcik7XG4gIH1cbiAgd2hpbGUgKG9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgIHZhciB4ID0gb2JqZWN0cy5wb3AoKTtcbiAgICBpZiAoeFsyXSA+PSAwKSBjYW1sX3NldF9vb19pZCh4KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPCA1LjEuMFxudmFyIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSA9IDIwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPj0gNS4xLjBcbnZhciBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUgPSAxNjtcblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZShzLCBvZnMpIHtcbiAgdmFyIHIgPSBuZXcgVUludDhBcnJheVJlYWRlcihjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHMpLCBvZnMpO1xuICBmdW5jdGlvbiByZWFkdmxxKG92ZXJmbG93KSB7XG4gICAgdmFyIGMgPSByLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N2Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT09IDApIHtcbiAgICAgIGMgPSByLnJlYWQ4dSgpO1xuICAgICAgdmFyIG43ID0gbiA8PCA3O1xuICAgICAgaWYgKG4gIT09IG43ID4+IDcpIG92ZXJmbG93WzBdID0gdHJ1ZTtcbiAgICAgIG4gPSBuNyB8IChjICYgMHg3Zik7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgc3dpdGNoIChyLnJlYWQzMnUoKSkge1xuICAgIGNhc2UgMHg4NDk1YTZiZSAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovOlxuICAgICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICAgIHZhciBkYXRhX2xlbiA9IHIucmVhZDMydSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAweDg0OTVhNmJkIC8qIEludGV4dF9tYWdpY19udW1iZXJfY29tcHJlc3NlZCAqLzpcbiAgICAgIHZhciBoZWFkZXJfbGVuID0gci5yZWFkOHUoKSAmIDB4M2Y7XG4gICAgICB2YXIgb3ZlcmZsb3cgPSBbZmFsc2VdO1xuICAgICAgdmFyIGRhdGFfbGVuID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgICBpZiAob3ZlcmZsb3dbMF0pIHtcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICBcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDB4ODQ5NWE2YmYgLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi86XG4gICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICBcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiBhIDMyLWJpdCBwbGF0Zm9ybVwiLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjYW1sX2ZhaWx3aXRoKFwiTWFyc2hhbC5kYXRhX3NpemU6IGJhZCBvYmplY3RcIik7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaGVhZGVyX2xlbiAtIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSArIGRhdGFfbGVuO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE9iamVjdFRhYmxlXG5jbGFzcyBNbE9iamVjdFRhYmxlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vYmpzID0gW107XG4gICAgdGhpcy5sb29rdXAgPSBuZXcgZ2xvYmFsVGhpcy5NYXAoKTtcbiAgfVxuXG4gIHN0b3JlKHYpIHtcbiAgICB0aGlzLmxvb2t1cC5zZXQodiwgdGhpcy5vYmpzLmxlbmd0aCk7XG4gICAgdGhpcy5vYmpzLnB1c2godik7XG4gIH1cblxuICByZWNhbGwodikge1xuICAgIHZhciBpID0gdGhpcy5sb29rdXAuZ2V0KHYpO1xuICAgIHJldHVybiBpID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMub2Jqcy5sZW5ndGggLSBpOyAvKiBpbmRleCBpcyByZWxhdGl2ZSAqL1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ieXRlc191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBNbE9iamVjdFRhYmxlLCBjYW1sX2xpc3RfdG9fanNfYXJyYXksIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xudmFyIGNhbWxfb3V0cHV0X3ZhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGNsYXNzIFdyaXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDIwO1xuICAgICAgdGhpcy5ibG9ja19sZW4gPSAwO1xuICAgICAgdGhpcy5vYmpfY291bnRlciA9IDA7XG4gICAgICB0aGlzLnNpemVfMzIgPSAwO1xuICAgICAgdGhpcy5zaXplXzY0ID0gMDtcbiAgICB9XG5cbiAgICB3cml0ZShzaXplLCB2YWx1ZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4OyBpID49IDA7IGkgLT0gOClcbiAgICAgICAgdGhpcy5jaHVua1t0aGlzLmNodW5rX2lkeCsrXSA9ICh2YWx1ZSA+PiBpKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgd3JpdGVfYXQocG9zLCBzaXplLCB2YWx1ZSkge1xuICAgICAgdmFyIHBvcyA9IHBvcztcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODsgaSA+PSAwOyBpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbcG9zKytdID0gKHZhbHVlID4+IGkpICYgMHhmZjtcbiAgICB9XG5cbiAgICB3cml0ZV9jb2RlKHNpemUsIGNvZGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gY29kZTtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODsgaSA+PSAwOyBpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbdGhpcy5jaHVua19pZHgrK10gPSAodmFsdWUgPj4gaSkgJiAweGZmO1xuICAgIH1cblxuICAgIHdyaXRlX3NoYXJlZChvZmZzZXQpIHtcbiAgICAgIGlmIChvZmZzZXQgPCAxIDw8IDgpXG4gICAgICAgIHRoaXMud3JpdGVfY29kZSg4LCAweDA0IC8qY3N0LkNPREVfU0hBUkVEOCovLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAob2Zmc2V0IDwgMSA8PCAxNilcbiAgICAgICAgdGhpcy53cml0ZV9jb2RlKDE2LCAweDA1IC8qY3N0LkNPREVfU0hBUkVEMTYqLywgb2Zmc2V0KTtcbiAgICAgIGVsc2UgdGhpcy53cml0ZV9jb2RlKDMyLCAweDA2IC8qY3N0LkNPREVfU0hBUkVEMzIqLywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBwb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaHVua19pZHg7XG4gICAgfVxuXG4gICAgZmluYWxpemUoKSB7XG4gICAgICB0aGlzLmJsb2NrX2xlbiA9IHRoaXMuY2h1bmtfaWR4IC0gMjA7XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDA7XG4gICAgICB0aGlzLndyaXRlKDMyLCAweDg0OTVhNmJlKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMuYmxvY2tfbGVuKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMub2JqX2NvdW50ZXIpO1xuICAgICAgdGhpcy53cml0ZSgzMiwgdGhpcy5zaXplXzMyKTtcbiAgICAgIHRoaXMud3JpdGUoMzIsIHRoaXMuc2l6ZV82NCk7XG4gICAgICByZXR1cm4gdGhpcy5jaHVuaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICh2LCBmbGFncykge1xuICAgIGZsYWdzID0gY2FtbF9saXN0X3RvX2pzX2FycmF5KGZsYWdzKTtcblxuICAgIHZhciBub19zaGFyaW5nID0gZmxhZ3MuaW5kZXhPZigwIC8qTWFyc2hhbC5Ob19zaGFyaW5nKi8pICE9PSAtMSxcbiAgICAgIGNsb3N1cmVzID0gZmxhZ3MuaW5kZXhPZigxIC8qTWFyc2hhbC5DbG9zdXJlcyovKSAhPT0gLTE7XG4gICAgLyogTWFyc2hhbC5Db21wYXRfMzIgaXMgcmVkdW5kYW50IHNpbmNlIGludGVnZXJzIGFyZSAzMi1iaXQgYW55d2F5ICovXG5cbiAgICBpZiAoY2xvc3VyZXMpXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiaW4gY2FtbF9vdXRwdXRfdmFsOiBmbGFnIE1hcnNoYWwuQ2xvc3VyZXMgaXMgbm90IHN1cHBvcnRlZC5cIixcbiAgICAgICk7XG5cbiAgICB2YXIgd3JpdGVyID0gbmV3IFdyaXRlcigpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gbm9fc2hhcmluZyA/IG51bGwgOiBuZXcgTWxPYmplY3RUYWJsZSgpO1xuXG4gICAgZnVuY3Rpb24gbWVtbyh2KSB7XG4gICAgICBpZiAobm9fc2hhcmluZykgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV4aXN0aW5nX29mZnNldCA9IGludGVybl9vYmpfdGFibGUucmVjYWxsKHYpO1xuICAgICAgaWYgKGV4aXN0aW5nX29mZnNldCkge1xuICAgICAgICB3cml0ZXIud3JpdGVfc2hhcmVkKGV4aXN0aW5nX29mZnNldCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuX29ial90YWJsZS5zdG9yZSh2KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVybl9yZWModikge1xuICAgICAgaWYgKHYuY2FtbF9jdXN0b20pIHtcbiAgICAgICAgaWYgKG1lbW8odikpIHJldHVybjtcbiAgICAgICAgdmFyIG5hbWUgPSB2LmNhbWxfY3VzdG9tO1xuICAgICAgICB2YXIgb3BzID0gY2FtbF9jdXN0b21fb3BzW25hbWVdO1xuICAgICAgICB2YXIgc3pfMzJfNjQgPSBbMCwgMF07XG4gICAgICAgIGlmICghb3BzLnNlcmlhbGl6ZSlcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChDdXN0b20pXCIpO1xuICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4MTggLypjc3QuQ09ERV9DVVNUT01fTEVOKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgaGVhZGVyX3BvcyA9IHdyaXRlci5wb3MoKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcywgMzIsIHN6XzMyXzY0WzBdKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcyArIDQsIDMyLCAwKTsgLy8gemVyb1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zICsgOCwgMzIsIHN6XzMyXzY0WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMHgxOSAvKmNzdC5DT0RFX0NVU1RPTV9GSVhFRCovKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgbmFtZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMCk7XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCAhPT0gc3pfMzJfNjRbMF0pXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFxuICAgICAgICAgICAgICBcIm91dHB1dF92YWx1ZTogaW5jb3JyZWN0IGZpeGVkIHNpemVzIHNwZWNpZmllZCBieSBcIiArIG5hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDIgKyAoKHN6XzMyXzY0WzBdICsgMykgPj4gMik7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDIgKyAoKHN6XzMyXzY0WzFdICsgNykgPj4gMyk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdlswXSA9PT0gKHZbMF0gfCAwKSkge1xuICAgICAgICBpZiAodlswXSA9PT0gMjUxKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKEFic3RyYWN0KVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FtbF9pc19jb250aW51YXRpb25fdGFnKHZbMF0pKVxuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIm91dHB1dF92YWx1ZTogY29udGludWF0aW9uIHZhbHVlXCIpO1xuICAgICAgICBpZiAodi5sZW5ndGggPiAxICYmIG1lbW8odikpIHJldHVybjtcbiAgICAgICAgaWYgKHZbMF0gPCAxNiAmJiB2Lmxlbmd0aCAtIDEgPCA4KVxuICAgICAgICAgIHdyaXRlci53cml0ZShcbiAgICAgICAgICAgIDgsXG4gICAgICAgICAgICAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovICsgdlswXSArICgodi5sZW5ndGggLSAxKSA8PCA0KSxcbiAgICAgICAgICApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoXG4gICAgICAgICAgICAzMixcbiAgICAgICAgICAgIDB4MDggLypjc3QuQ09ERV9CTE9DSzMyKi8sXG4gICAgICAgICAgICAoKHYubGVuZ3RoIC0gMSkgPDwgMTApIHwgdlswXSxcbiAgICAgICAgICApO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSB2Lmxlbmd0aDtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gdi5sZW5ndGg7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA+IDEpIHN0YWNrLnB1c2godiwgMSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXModikpIHtcbiAgICAgICAgaWYgKCFjYW1sX2lzX21sX2J5dGVzKGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIikpKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcbiAgICAgICAgICAgIFwib3V0cHV0X3ZhbHVlOiBbQnl0ZXMudF0gY2Fubm90IHNhZmVseSBiZSBtYXJzaGFsZWQgd2l0aCBbLS1lbmFibGUgdXNlLWpzLXN0cmluZ11cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgIHZhciBsZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aCh2KTtcbiAgICAgICAgaWYgKGxlbiA8IDB4MjApIHdyaXRlci53cml0ZSg4LCAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcqLyArIGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA8IDB4MTAwKVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDgsIDB4MDkgLypjc3QuQ09ERV9TVFJJTkc4Ki8sIGxlbik7XG4gICAgICAgIGVsc2Ugd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MGEgLypjc3QuQ09ERV9TVFJJTkczMiovLCBsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQodiwgaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KSB8IDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KSB8IDApO1xuICAgICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh2KSkge1xuICAgICAgICBpZiAobWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHYpO1xuICAgICAgICBpZiAobGVuIDwgMHgyMCkgd3JpdGVyLndyaXRlKDgsIDB4MjAgLypjc3QuUFJFRklYX1NNQUxMX1NUUklORyovICsgbGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuIDwgMHgxMDApXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoOCwgMHgwOSAvKmNzdC5DT0RFX1NUUklORzgqLywgbGVuKTtcbiAgICAgICAgZWxzZSB3cml0ZXIud3JpdGVfY29kZSgzMiwgMHgwYSAvKmNzdC5DT0RFX1NUUklORzMyKi8sIGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQodiwgaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KSB8IDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KSB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgIT09ICh2IHwgMCkpIHtcbiAgICAgICAgICB2YXIgdHlwZV9vZl92ID0gdHlwZW9mIHY7XG4gICAgICAgICAgaWYgKHR5cGVfb2ZfdiAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChcIiArIHR5cGVfb2ZfdiArIFwiKVwiKTtcbiAgICAgICAgICAvLyBJZiBhIGZsb2F0IGhhcHBlbnMgdG8gYmUgYW4gaW50ZWdlciBpdCBpcyBzZXJpYWxpemVkIGFzIGFuIGludGVnZXJcbiAgICAgICAgICAvLyAoSnNfb2Zfb2NhbWwgY2Fubm90IHRlbGwgd2hldGhlciB0aGUgdHlwZSBvZiBhbiBpbnRlZ2VyIG51bWJlciBpc1xuICAgICAgICAgIC8vIGZsb2F0IG9yIGludGVnZXIuKSBUaGlzIGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBjcmFzaGVzIHdoZW5cbiAgICAgICAgICAvLyB1bm1hcnNoYWxsaW5nIHVzaW5nIHRoZSBzdGFuZGFyZCBydW50aW1lLlxuICAgICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgICAgdmFyIHQgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCh2KSk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4MGMgLypjc3QuQ09ERV9ET1VCTEVfTElUVExFKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgdFs3IC0gaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAzO1xuICAgICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDI7XG4gICAgICAgIH0gZWxzZSBpZiAodiA+PSAwICYmIHYgPCAweDQwKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDB4NDAgLypjc3QuUFJFRklYX1NNQUxMX0lOVCovICsgdik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHYgPj0gLSgxIDw8IDcpICYmIHYgPCAxIDw8IDcpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSg4LCAweDAwIC8qY3N0LkNPREVfSU5UOCovLCB2KTtcbiAgICAgICAgICBlbHNlIGlmICh2ID49IC0oMSA8PCAxNSkgJiYgdiA8IDEgPDwgMTUpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSgxNiwgMHgwMSAvKmNzdC5DT0RFX0lOVDE2Ki8sIHYpO1xuICAgICAgICAgIGVsc2Ugd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDIgLypjc3QuQ09ERV9JTlQzMiovLCB2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5fcmVjKHYpO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaSA9IHN0YWNrLnBvcCgpO1xuICAgICAgdmFyIHYgPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmIChpICsgMSA8IHYubGVuZ3RoKSBzdGFjay5wdXNoKHYsIGkgKyAxKTtcbiAgICAgIGV4dGVybl9yZWModltpXSk7XG4gICAgfVxuICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSB3cml0ZXIub2JqX2NvdW50ZXIgPSBpbnRlcm5fb2JqX3RhYmxlLm9ianMubGVuZ3RoO1xuICAgIHdyaXRlci5maW5hbGl6ZSgpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3cml0ZXIuY2h1bmspO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkoY2FtbF9vdXRwdXRfdmFsKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXModiwgZmxhZ3MpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoY2FtbF9vdXRwdXRfdmFsKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlcihzLCBvZnMsIGxlbiwgdiwgZmxhZ3MpIHtcbiAgdmFyIHQgPSBjYW1sX291dHB1dF92YWwodiwgZmxhZ3MpO1xuICBpZiAodC5sZW5ndGggPiBsZW4pIGNhbWxfZmFpbHdpdGgoXCJNYXJzaGFsLnRvX2J1ZmZlcjogYnVmZmVyIG92ZXJmbG93XCIpO1xuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl91aW50OF9hcnJheSh0KSwgMCwgcywgb2ZzLCB0Lmxlbmd0aCk7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBJb1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19mZHNcbnZhciBjYW1sX3N5c19mZHMgPSBuZXcgQXJyYXkoMyk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2Nsb3NlXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19mZHNcbmZ1bmN0aW9uIGNhbWxfc3lzX2Nsb3NlKGZkKSB7XG4gIHZhciB4ID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKHgpIHtcbiAgICB4LmZpbGUuY2xvc2UoZmFsc2UpO1xuICAgIGRlbGV0ZSBjYW1sX3N5c19mZHNbZmRdO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBNbENoYW5pZFxuZnVuY3Rpb24gTWxDaGFuaWQoaWQpIHtcbiAgdGhpcy5pZCA9IGlkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogTWxGYWtlRmRfb3V0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Zkc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZVxuLy9SZXF1aXJlczogTWxDaGFuaWRcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSwgaWR4KSB7XG4gIHZhciBjaGFuaWQ7XG4gIGlmIChpZHggPT09IHVuZGVmaW5lZCkge1xuICAgIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gICAgY2hhbmlkID0gbmV3IE1sQ2hhbmlkKGlkeCk7XG4gIH0gZWxzZSBpZiAoY2FtbF9zeXNfZmRzW2lkeF0pIHtcbiAgICBjaGFuaWQgPSBjYW1sX3N5c19mZHNbaWR4XS5jaGFuaWQ7XG4gIH0gZWxzZSBjaGFuaWQgPSBuZXcgTWxDaGFuaWQoaWR4KTtcbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSB7IGZpbGU6IGZpbGUsIGNoYW5pZDogY2hhbmlkIH07XG4gIHJldHVybiBpZHggfCAwO1xufVxuZnVuY3Rpb24gY2FtbF9zeXNfb3BlbihuYW1lLCBmbGFncywgcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnJkb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmLndyb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmLmFwcGVuZCA9IDE7XG4gICAgICAgIGYud3JpdGVvbmx5ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGYuY3JlYXRlID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGYudHJ1bmNhdGUgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgZi5leGNsID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGYuYmluYXJ5ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGYudGV4dCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBmLm5vbmJsb2NrID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZsYWdzID0gZmxhZ3NbMl07XG4gIH1cbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCwgZiwgcGVybXMpO1xuICByZXR1cm4gY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlLCB1bmRlZmluZWQpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlzX25vZGUgPSBmc19ub2RlX3N1cHBvcnRlZCgpO1xuICBmdW5jdGlvbiBmaWxlKGZkLCBmbGFncykge1xuICAgIGlmIChpc19ub2RlKSB7XG4gICAgICByZXR1cm4gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpO1xuICAgIH0gZWxzZSByZXR1cm4gbmV3IE1sRmFrZUZkX291dChmZCwgZmxhZ3MpO1xuICB9XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoXG4gICAgZmlsZSgwLCB7IHJkb25seTogMSwgYWx0bmFtZTogXCIvZGV2L3N0ZGluXCIsIGlzQ2hhcmFjdGVyRGV2aWNlOiB0cnVlIH0pLFxuICAgIDAsXG4gICk7XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoXG4gICAgZmlsZSgxLCB7IGJ1ZmZlcmVkOiBpc19ub2RlID8gMSA6IDIsIHdyb25seTogMSwgaXNDaGFyYWN0ZXJEZXZpY2U6IHRydWUgfSksXG4gICAgMSxcbiAgKTtcbiAgY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChcbiAgICBmaWxlKDIsIHsgYnVmZmVyZWQ6IGlzX25vZGUgPyAxIDogMiwgd3Jvbmx5OiAxLCBpc0NoYXJhY3RlckRldmljZTogdHJ1ZSB9KSxcbiAgICAyLFxuICApO1xufSkoKTtcblxuLy8gb2NhbWwgQ2hhbm5lbHNcblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX25hbWUoY2hhbmlkLCBuYW1lKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICBjaGFuLm5hbWUgPSBuYW1lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogTWxDaGFuaWRcbmNsYXNzIGNhbWxfbWxfY2hhbm5lbHNfc3RhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKTtcbiAgICB0aGlzLm9wZW5lZCA9IG5ldyBnbG9iYWxUaGlzLlNldCgpO1xuICB9XG5cbiAgY2xvc2UoY2hhbmlkKSB7XG4gICAgdGhpcy5vcGVuZWQuZGVsZXRlKGNoYW5pZCk7XG4gIH1cblxuICBnZXQoY2hhbmlkKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChjaGFuaWQpO1xuICB9XG5cbiAgc2V0KGNoYW5pZCwgdmFsKSB7XG4gICAgaWYgKHZhbC5vcGVuZWQpIHRoaXMub3BlbmVkLmFkZChjaGFuaWQpO1xuICAgIHJldHVybiB0aGlzLm1hcC5zZXQoY2hhbmlkLCB2YWwpO1xuICB9XG5cbiAgYWxsKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW5lZC52YWx1ZXMoKTtcbiAgfVxufVxuXG52YXIgY2FtbF9tbF9jaGFubmVscyA9IG5ldyBjYW1sX21sX2NoYW5uZWxzX3N0YXRlKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2hhbm5lbF9nZXQoaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbHMuZ2V0KGlkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsX3JlZGlyZWN0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0LCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfcmVkaXJlY3QoY2FwdHVyZWQsIGludG8pIHtcbiAgdmFyIHRvX3Jlc3RvcmUgPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNhcHR1cmVkKTtcbiAgdmFyIG5ld18gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGludG8pO1xuICBjYW1sX21sX2NoYW5uZWxzLnNldChjYXB0dXJlZCwgbmV3Xyk7XG4gIHJldHVybiB0b19yZXN0b3JlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfcmVzdG9yZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9jaGFubmVsX3Jlc3RvcmUoY2FwdHVyZWQsIHRvX3Jlc3RvcmUpIHtcbiAgY2FtbF9tbF9jaGFubmVscy5zZXQoY2FwdHVyZWQsIHRvX3Jlc3RvcmUpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdCgpIHtcbiAgdmFyIGwgPSAwO1xuICB2YXIga2V5cyA9IGNhbWxfbWxfY2hhbm5lbHMuYWxsKCk7XG4gIGZvciAodmFyIGsgb2Yga2V5cykge1xuICAgIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChrKTtcbiAgICBpZiAoY2hhbi5vcGVuZWQgJiYgY2hhbi5vdXQpIGwgPSBbMCwgaywgbF07XG4gIH1cbiAgcmV0dXJuIGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9zeXNfZmRzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogY2FtbF9zeXNfb3BlblxuLy9SZXF1aXJlczogY2FtbF9pb19idWZmZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0KGZkKSB7XG4gIHZhciBmZF9kZXNjID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKGZkX2Rlc2MgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihcImZkIFwiICsgZmQgKyBcIiBkb2Vzbid0IGV4aXN0XCIpO1xuICB2YXIgZmlsZSA9IGZkX2Rlc2MuZmlsZTtcbiAgdmFyIGNoYW5pZCA9IGZkX2Rlc2MuY2hhbmlkO1xuICB2YXIgYnVmZmVyZWQgPSBmaWxlLmZsYWdzLmJ1ZmZlcmVkICE9PSB1bmRlZmluZWQgPyBmaWxlLmZsYWdzLmJ1ZmZlcmVkIDogMTtcbiAgdmFyIGNoYW5uZWwgPSB7XG4gICAgZmlsZTogZmlsZSxcbiAgICBvZmZzZXQ6IGZpbGUucG9zKCksXG4gICAgZmQ6IGZkLFxuICAgIG9wZW5lZDogdHJ1ZSxcbiAgICBvdXQ6IHRydWUsXG4gICAgYnVmZmVyX2N1cnI6IDAsXG4gICAgYnVmZmVyOiBuZXcgVWludDhBcnJheShjYW1sX2lvX2J1ZmZlcl9zaXplKSxcbiAgICBidWZmZXJlZDogYnVmZmVyZWQsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHMuc2V0KGNoYW5pZCwgY2hhbm5lbCk7XG4gIHJldHVybiBjaGFuaWQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N5c19mZHNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX2lvX2J1ZmZlcl9zaXplXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbihmZCkge1xuICB2YXIgZmRfZGVzYyA9IGNhbWxfc3lzX2Zkc1tmZF07XG4gIGlmIChmZF9kZXNjID09PSB1bmRlZmluZWQpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJmZCBcIiArIGZkICsgXCIgZG9lc24ndCBleGlzdFwiKTtcbiAgdmFyIGZpbGUgPSBmZF9kZXNjLmZpbGU7XG4gIHZhciBjaGFuaWQgPSBmZF9kZXNjLmNoYW5pZDtcbiAgdmFyIHJlZmlsbCA9IG51bGw7XG4gIHZhciBjaGFubmVsID0ge1xuICAgIGZpbGU6IGZpbGUsXG4gICAgb2Zmc2V0OiBmaWxlLnBvcygpLFxuICAgIGZkOiBmZCxcbiAgICBvcGVuZWQ6IHRydWUsXG4gICAgb3V0OiBmYWxzZSxcbiAgICBidWZmZXJfY3VycjogMCxcbiAgICBidWZmZXJfbWF4OiAwLFxuICAgIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoY2FtbF9pb19idWZmZXJfc2l6ZSksXG4gICAgcmVmaWxsOiByZWZpbGwsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHMuc2V0KGNoYW5pZCwgY2hhbm5lbCk7XG4gIHJldHVybiBjaGFuaWQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luX3dpdGhfZmxhZ3Ncbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1ZlcnNpb246ID49IDUuMVxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW5fd2l0aF9mbGFncyhmZCwgX2ZsYWdzKSB7XG4gIHJldHVybiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbihmZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dF93aXRoX2ZsYWdzXG4vL1JlcXVpcmVzOiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRcbi8vVmVyc2lvbjogPj0gNS4xXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRfd2l0aF9mbGFncyhmZCwgX2ZsYWdzKSB7XG4gIHJldHVybiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXQoZmQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuLy9BbGlhczogd2luX2ZpbGVkZXNjcl9vZl9jaGFubmVsXG5mdW5jdGlvbiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvcihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLmZkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9iaW5hcnlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUoY2hhbmlkLCBtb2RlKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICBjaGFuLmZpbGUuZmxhZ3MudGV4dCA9ICFtb2RlO1xuICBjaGFuLmZpbGUuZmxhZ3MuYmluYXJ5ID0gbW9kZTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaXNfYmluYXJ5X21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX2lzX2JpbmFyeV9tb2RlKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgcmV0dXJuIGNoYW4uZmlsZS5mbGFncy5iaW5hcnk7XG59XG5cbi8vSW5wdXQgZnJvbSBpbl9jaGFubmVsXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2xvc2VfY2hhbm5lbFxuLy9SZXF1aXJlczogY2FtbF9tbF9mbHVzaCwgY2FtbF9tbF9jaGFubmVsX2dldFxuLy9SZXF1aXJlczogY2FtbF9zeXNfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2xvc2VfY2hhbm5lbChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLm9wZW5lZCkge1xuICAgIGNoYW4ub3BlbmVkID0gZmFsc2U7XG4gICAgY2FtbF9tbF9jaGFubmVscy5jbG9zZShjaGFuaWQpO1xuICAgIGNhbWxfc3lzX2Nsb3NlKGNoYW4uZmQpO1xuICAgIGNoYW4uZmQgPSAtMTtcbiAgICBjaGFuLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLmZpbGUubGVuZ3RoKCkgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCxjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNoYW4uZmlsZS5sZW5ndGgoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX291dHB1dChjaGFuaWQsIGYpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGNoYW4ub3V0cHV0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICBmKHMpO1xuICB9O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsKGNoYW5pZCwgZikge1xuICBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCkucmVmaWxsID0gZjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVmaWxsXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yZWZpbGwoY2hhbikge1xuICBpZiAoY2hhbi5yZWZpbGwgIT0gbnVsbCkge1xuICAgIHZhciBzdHIgPSBjaGFuLnJlZmlsbCgpO1xuICAgIHZhciBzdHJfYSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHN0cik7XG4gICAgaWYgKHN0cl9hLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2hhbi5yZWZpbGwgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhbi5idWZmZXIubGVuZ3RoIDwgY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKSB7XG4gICAgICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKTtcbiAgICAgICAgYi5zZXQoY2hhbi5idWZmZXIpO1xuICAgICAgICBjaGFuLmJ1ZmZlciA9IGI7XG4gICAgICB9XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoc3RyX2EsIGNoYW4uYnVmZmVyX21heCk7XG4gICAgICBjaGFuLm9mZnNldCArPSBzdHJfYS5sZW5ndGg7XG4gICAgICBjaGFuLmJ1ZmZlcl9tYXggKz0gc3RyX2EubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbi5mZCA9PT0gLTEpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQmFkIGZpbGUgZGVzY3JpcHRvclwiKTtcbiAgICB9XG4gICAgdmFyIG5yZWFkID0gY2hhbi5maWxlLnJlYWQoXG4gICAgICBjaGFuLmJ1ZmZlcixcbiAgICAgIGNoYW4uYnVmZmVyX21heCxcbiAgICAgIGNoYW4uYnVmZmVyLmxlbmd0aCAtIGNoYW4uYnVmZmVyX21heCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY2hhbi5vZmZzZXQgKz0gbnJlYWQ7XG4gICAgY2hhbi5idWZmZXJfbWF4ICs9IG5yZWFkO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXQoY2hhbmlkLCBiLCBpLCBsKSB7XG4gIHZhciBiYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYik7XG4gIHJldHVybiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2JpZ2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2lucHV0X2Jsb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5XG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9iaWdhcnJheShjaGFuaWQsIGIsIGksIGwpIHtcbiAgdmFyIGJhID0gY2FtbF9iYV90b190eXBlZF9hcnJheShiKTtcbiAgcmV0dXJuIGNhbWxfbWxfaW5wdXRfYmxvY2soY2hhbmlkLCBiYSwgaSwgbCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfcmVmaWxsLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHZhciBuID0gbDtcbiAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgaWYgKGwgPD0gYXZhaWwpIHtcbiAgICBiYS5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciwgY2hhbi5idWZmZXJfY3VyciArIGwpLCBpKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGw7XG4gIH0gZWxzZSBpZiAoYXZhaWwgPiAwKSB7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsIGNoYW4uYnVmZmVyX2N1cnIgKyBhdmFpbCksIGkpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYXZhaWw7XG4gICAgbiA9IGF2YWlsO1xuICB9IGVsc2Uge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgICBpZiAobiA+IGF2YWlsKSBuID0gYXZhaWw7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsIGNoYW4uYnVmZmVyX2N1cnIgKyBuKSwgaSk7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBuO1xuICB9XG4gIHJldHVybiBuIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSwgY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzLCBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yZWZpbGwsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHZhciBoZWFkZXIgPSBuZXcgVWludDhBcnJheShjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBmdW5jdGlvbiBibG9jayhidWZmZXIsIG9mZnNldCwgbikge1xuICAgIHZhciByID0gMDtcbiAgICB3aGlsZSAociA8IG4pIHtcbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgICAgICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpIGJyZWFrO1xuICAgICAgYnVmZmVyW29mZnNldCArIHJdID0gY2hhbi5idWZmZXJbY2hhbi5idWZmZXJfY3Vycl07XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyKys7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHZhciByID0gYmxvY2soaGVhZGVyLCAwLCBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBpZiAociA9PT0gMCkgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICBlbHNlIGlmIChyIDwgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdFwiKTtcbiAgdmFyIGxlbiA9IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUoY2FtbF9ieXRlc19vZl91aW50OF9hcnJheShoZWFkZXIpLCAwKTtcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbiArIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSk7XG4gIGJ1Zi5zZXQoaGVhZGVyLCAwKTtcbiAgdmFyIHIgPSBibG9jayhidWYsIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSwgbGVuKTtcbiAgaWYgKHIgPCBsZW4pIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdCBcIiArIHIgKyBcIiAgXCIgKyBsZW4pO1xuICB2YXIgcmVzID0gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYnVmKSwgMCk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwKGMpIHtcbiAgcmV0dXJuIGNhbWxfaW5wdXRfdmFsdWUoYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9yZWZpbGxcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfY2hhcihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gIH1cbiAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIHZhciByZXMgPSBjaGFuLmJ1ZmZlcltjaGFuLmJ1ZmZlcl9jdXJyXTtcbiAgY2hhbi5idWZmZXJfY3VycisrO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2ludFxuLy9SZXF1aXJlczogY2FtbF9tbF9pbnB1dF9jaGFyXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2ludChjaGFuaWQpIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgcmVzID0gKChyZXMgPDwgOCkgKyBjYW1sX21sX2lucHV0X2NoYXIoY2hhbmlkKSkgfCAwO1xuICB9XG4gIHJldHVybiByZXMgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmIChjaGFuLnJlZmlsbCAhPSBudWxsKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIklsbGVnYWwgc2Vla1wiKTtcbiAgaWYgKFxuICAgIHBvcyA+PSBjaGFuLm9mZnNldCAtIGNoYW4uYnVmZmVyX21heCAmJlxuICAgIHBvcyA8PSBjaGFuLm9mZnNldCAmJlxuICAgIGNoYW4uZmlsZS5mbGFncy5iaW5hcnlcbiAgKSB7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IGNoYW4uYnVmZmVyX21heCAtIChjaGFuLm9mZnNldCAtIHBvcyk7XG4gIH0gZWxzZSB7XG4gICAgY2hhbi5maWxlLnNlZWsocG9zLCAwKTtcbiAgICBjaGFuLm9mZnNldCA9IHBvcztcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luKGNoYW5pZCwgcG9zKSB7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luXzY0KGNoYW5pZCwgcG9zKSB7XG4gIHZhciBwb3MgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19pblxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICByZXR1cm4gY2hhbi5vZmZzZXQgLSAoY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3Vycik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX2luXG4vL1JlcXVpcmVzOiBjYW1sX3Bvc19pblxuZnVuY3Rpb24gY2FtbF9tbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19pbihjaGFuaWQpIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3NfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfcG9zX2luXG5mdW5jdGlvbiBjYW1sX21sX3Bvc19pbl82NChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQoY2FtbF9wb3NfaW4oY2hhbmlkKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxfZ2V0LCBjYW1sX3JlZmlsbFxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmUoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsX2dldChjaGFuaWQpO1xuICB2YXIgcCA9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGRvIHtcbiAgICBpZiAocCA+PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID4gMCkge1xuICAgICAgICBjaGFuLmJ1ZmZlci5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciksIDApO1xuICAgICAgICBwIC09IGNoYW4uYnVmZmVyX2N1cnI7XG4gICAgICAgIGNoYW4uYnVmZmVyX21heCAtPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9tYXggPj0gY2hhbi5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtY2hhbi5idWZmZXJfbWF4IHwgMDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2X21heCA9IGNoYW4uYnVmZmVyX21heDtcbiAgICAgIGNhbWxfcmVmaWxsKGNoYW4pO1xuICAgICAgaWYgKHByZXZfbWF4ID09PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgICAgcmV0dXJuIC1jaGFuLmJ1ZmZlcl9tYXggfCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoY2hhbi5idWZmZXJbcCsrXSAhPT0gMTApO1xuICByZXR1cm4gKHAgLSBjaGFuLmJ1ZmZlcl9jdXJyKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZmx1c2hcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX2ZsdXNoKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgaWYgKCFjaGFuLm9wZW5lZCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgaWYgKCFjaGFuLmJ1ZmZlciB8fCBjaGFuLmJ1ZmZlcl9jdXJyID09PSAwKSByZXR1cm4gMDtcbiAgaWYgKGNoYW4ub3V0cHV0KSB7XG4gICAgY2hhbi5vdXRwdXQoXG4gICAgICBjYW1sX3N1Yl91aW50OF9hcnJheV90b19qc2J5dGVzKGNoYW4uYnVmZmVyLCAwLCBjaGFuLmJ1ZmZlcl9jdXJyKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IGNoYW4uYnVmZmVyX2N1cnI7ICkge1xuICAgICAgcG9zICs9IGNoYW4uZmlsZS53cml0ZShjaGFuLmJ1ZmZlciwgcG9zLCBjaGFuLmJ1ZmZlcl9jdXJyIC0gcG9zLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIGNoYW4ub2Zmc2V0ICs9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9vdXRwdXQgdG8gb3V0X2NoYW5uZWxcblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfdGFcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxfZ2V0XG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIGlmICghY2hhbi5vcGVuZWQpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQ2Fubm90IG91dHB1dCB0byBhIGNsb3NlZCBjaGFubmVsXCIpO1xuICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW4pO1xuICBpZiAoY2hhbi5idWZmZXJfY3VyciArIGJ1ZmZlci5sZW5ndGggPiBjaGFuLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGNoYW4uYnVmZmVyX2N1cnIgKyBidWZmZXIubGVuZ3RoKTtcbiAgICBiLnNldChjaGFuLmJ1ZmZlcik7XG4gICAgY2hhbi5idWZmZXIgPSBiO1xuICB9XG4gIHN3aXRjaCAoY2hhbi5idWZmZXJlZCkge1xuICAgIGNhc2UgMDogLy8gVW5idWZmZXJlZFxuICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlciwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEJ1ZmZlcmVkICh0aGUgZGVmYXVsdClcbiAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXIubGVuZ3RoKSBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6IC8vIEJ1ZmZlcmVkIChvbmx5IGZvciBzdGRvdXQgYW5kIHN0ZGVycilcbiAgICAgIHZhciBpZCA9IGJ1ZmZlci5sYXN0SW5kZXhPZigxMCk7XG4gICAgICBpZiAoaWQgPCAwKSB7XG4gICAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyLmxlbmd0aCkgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheSgwLCBpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBpZCArIDE7XG4gICAgICAgIGNhbWxfbWxfZmx1c2goY2hhbmlkKTtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheShpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoIC0gaWQgLSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX21sX291dHB1dF90YVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoY2hhbmlkLCBidWZmZXIsIG9mZnNldCwgbGVuKSB7XG4gIHZhciBidWZmZXIgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZmZlcik7XG4gIHJldHVybiBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dF9iaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV90b190eXBlZF9hcnJheSwgY2FtbF9tbF9vdXRwdXRfdGFcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9iaWdhcnJheShjaGFuaWQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW4pIHtcbiAgdmFyIGJ1ZmZlciA9IGNhbWxfYmFfdG9fdHlwZWRfYXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIGNhbWxfbWxfb3V0cHV0X3RhKGNoYW5pZCwgYnVmZmVyLCBvZmZzZXQsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF9ieXRlcywgY2FtbF9ieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCwgYnVmZmVyLCBvZmZzZXQsIGxlbikge1xuICByZXR1cm4gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoXG4gICAgY2hhbmlkLFxuICAgIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGJ1ZmZlciksXG4gICAgb2Zmc2V0LFxuICAgIGxlbixcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2NoYXIoY2hhbmlkLCBjKSB7XG4gIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLCBzLCAwLCAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcsIGNhbWxfbWxfb3V0cHV0LGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWUoY2hhbmlkLCB2LCBmbGFncykge1xuICB2YXIgcyA9IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncyk7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2Vla19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXQsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpIHtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKTtcbiAgY2hhbi5maWxlLnNlZWsocG9zLCAwKTtcbiAgY2hhbi5vZmZzZXQgPSBwb3M7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX3NlZWtfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKSB7XG4gIHJldHVybiBjYW1sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19vdXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19vdXRfNjQoY2hhbmlkLCBwb3MpIHtcbiAgdmFyIHBvcyA9IGNhbWxfaW50NjRfdG9fZmxvYXQocG9zKTtcbiAgcmV0dXJuIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbF9nZXQsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfcG9zX291dChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxfZ2V0KGNoYW5pZCk7XG4gIHJldHVybiBjaGFuLm9mZnNldCArIGNoYW4uYnVmZmVyX2N1cnI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dFxuLy9SZXF1aXJlczogY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19vdXQoY2hhbmlkKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dF82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCwgY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXRfNjQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNhbWxfcG9zX291dChjaGFuaWQpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF90YVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfaW50KGNoYW5pZCwgaSkge1xuICB2YXIgYXJyID0gWyhpID4+IDI0KSAmIDB4ZmYsIChpID4+IDE2KSAmIDB4ZmYsIChpID4+IDgpICYgMHhmZiwgaSAmIDB4ZmZdO1xuICBjYW1sX21sX291dHB1dF90YShjaGFuaWQsIG5ldyBVaW50OEFycmF5KGFyciksIDAsIDQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pc19idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldFxuZnVuY3Rpb24gY2FtbF9tbF9pc19idWZmZXJlZChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKS5idWZmZXJlZCA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsX2dldCwgY2FtbF9tbF9mbHVzaFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYnVmZmVyZWQoY2hhbmlkLCB2KSB7XG4gIGNhbWxfbWxfY2hhbm5lbF9nZXQoY2hhbmlkKS5idWZmZXJlZCA9IHY7XG4gIGlmICghdikgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gU3lzXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c19lcnJvcihtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyhjYW1sX2dsb2JhbF9kYXRhLlN5c19lcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4aXRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9BbGlhczogY2FtbF91bml4X2V4aXRcbi8vQWxpYXM6IHVuaXhfZXhpdFxuZnVuY3Rpb24gY2FtbF9zeXNfZXhpdChjb2RlKSB7XG4gIGlmIChnbG9iYWxUaGlzLnF1aXQpIGdsb2JhbFRoaXMucXVpdChjb2RlKTtcbiAgLy9ub2RlanNcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZXhpdCkgZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXQoY29kZSk7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkZ1bmN0aW9uICdleGl0JyBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuKSB7XG4gIHN3aXRjaCAoZXhuWzJdKSB7XG4gICAgY2FzZSAtODogLy8gTWF0Y2hfZmFpbHVyZVxuICAgIGNhc2UgLTExOiAvLyBBc3NlcnRfZmFpbHVyZVxuICAgIGNhc2UgLTEyOiAvLyBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZVxuICAgICAgcmV0dXJuIDE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2V4Y2VwdGlvblxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGV4bikge1xuICB2YXIgciA9IFwiXCI7XG4gIGlmIChleG5bMF0gPT09IDApIHtcbiAgICByICs9IGV4blsxXVsxXTtcbiAgICBpZiAoXG4gICAgICBleG4ubGVuZ3RoID09PSAzICYmXG4gICAgICBleG5bMl1bMF0gPT09IDAgJiZcbiAgICAgIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuWzFdKVxuICAgICkge1xuICAgICAgdmFyIGJ1Y2tldCA9IGV4blsyXTtcbiAgICAgIHZhciBzdGFydCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFydCA9IDI7XG4gICAgICB2YXIgYnVja2V0ID0gZXhuO1xuICAgIH1cbiAgICByICs9IFwiKFwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiBzdGFydCkgciArPSBcIiwgXCI7XG4gICAgICB2YXIgdiA9IGJ1Y2tldFtpXTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgciArPSB2LnRvU3RyaW5nKCk7XG4gICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgTWxCeXRlcykge1xuICAgICAgICByICs9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByICs9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfSBlbHNlIHIgKz0gXCJfXCI7XG4gICAgfVxuICAgIHIgKz0gXCIpXCI7XG4gIH0gZWxzZSBpZiAoZXhuWzBdID09PSAyNDgpIHtcbiAgICByICs9IGV4blsxXTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfZm9ybWF0X2V4Y2VwdGlvbiwgY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGVycikgJiYgKGVyclswXSA9PT0gMCB8fCBlcnJbMF0gPT09IDI0OCkpIHtcbiAgICB2YXIgaGFuZGxlciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQcmludGV4Yy5oYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXCIpO1xuICAgIGlmIChoYW5kbGVyKSBjYW1sX2NhbGxiYWNrKGhhbmRsZXIsIFtlcnIsIGZhbHNlXSk7XG4gICAgZWxzZSB7XG4gICAgICB2YXIgbXNnID0gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGVycik7XG4gICAgICB2YXIgYXRfZXhpdCA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIik7XG4gICAgICBpZiAoYXRfZXhpdCkgY2FtbF9jYWxsYmFjayhhdF9leGl0LCBbMF0pO1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gXCIgKyBtc2cpO1xuICAgICAgaWYgKGVyci5qc19lcnJvcikgdGhyb3cgZXJyLmpzX2Vycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczoganNvb19zdGF0aWNfZW52XG52YXIganNvb19zdGF0aWNfZW52ID0ge307XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3N0YXRpY19lbnZcbi8vUmVxdWlyZXM6IGpzb29fc3RhdGljX2VudlxuZnVuY3Rpb24gY2FtbF9zZXRfc3RhdGljX2VudihrLCB2KSB7XG4gIGpzb29fc3RhdGljX2VudltrXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3N5c19nZXRlbnYgKGNvbnN0KVxuLy9SZXF1aXJlczoganNvb19zdGF0aWNfZW52XG5mdW5jdGlvbiBqc29vX3N5c19nZXRlbnYobikge1xuICBpZiAoanNvb19zdGF0aWNfZW52W25dKSByZXR1cm4ganNvb19zdGF0aWNfZW52W25dO1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgLy9ub2RlanMgZW52XG4gIGlmIChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52W25dICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W25dO1xuICBpZiAoZ2xvYmFsVGhpcy5qc29vX2VudiAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5qc29vX2VudltuXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmpzb29fZW52W25dO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGVudiAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBqc29vX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldGVudihuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYgKHIgPT09IHVuZGVmaW5lZCkgY2FtbF9yYWlzZV9ub3RfZm91bmQoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRlbnZfb3B0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0ZW52X29wdChuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYgKHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHJldHVybiBbMCwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocildO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c191bnNhZmVfZ2V0ZW52XG4vL1JlcXVpcmVzOiBjYW1sX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX3Vuc2FmZV9nZXRlbnYobmFtZSkge1xuICByZXR1cm4gY2FtbF9zeXNfZ2V0ZW52KG5hbWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG52YXIgY2FtbF9hcmd2ID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gIHZhciBtYWluID0gXCJhLm91dFwiO1xuICB2YXIgYXJncyA9IFtdO1xuXG4gIGlmIChwcm9jZXNzPy5hcmd2Py5sZW5ndGggPiAxKSB7XG4gICAgdmFyIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgLy9ub2RlanNcbiAgICBtYWluID0gYXJndlsxXTtcbiAgICBhcmdzID0gYXJndi5zbGljZSgyKTtcbiAgfVxuXG4gIHZhciBwID0gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobWFpbik7XG4gIHZhciBhcmdzMiA9IFswLCBwXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKVxuICAgIGFyZ3MyLnB1c2goY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoYXJnc1tpXSkpO1xuICByZXR1cm4gYXJnczI7XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG52YXIgY2FtbF9leGVjdXRhYmxlX25hbWUgPSBjYW1sX2FyZ3ZbMV07XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldF9hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldF9hcmd2KF91bml0KSB7XG4gIHJldHVybiBbMCwgY2FtbF9hcmd2WzFdLCBjYW1sX2FyZ3ZdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2FyZ3YoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfYXJndjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfbW9kaWZ5X2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfbW9kaWZ5X2FyZ3YoYXJnKSB7XG4gIGNhbWxfYXJndiA9IGFyZztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9leGVjdXRhYmxlX25hbWVcbmZ1bmN0aW9uIGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZShfdW5pdCkge1xuICByZXR1cm4gY2FtbF9leGVjdXRhYmxlX25hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmQoY21kKSB7XG4gIHZhciBjbWQgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhjbWQpO1xuICBpZiAodHlwZW9mIHJlcXVpcmUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gICAgaWYgKGNoaWxkX3Byb2Nlc3M/LmV4ZWNTeW5jKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYyhjbWQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gIH0gZWxzZSByZXR1cm4gMTI3O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kKF9jbWQpIHtcbiAgcmV0dXJuIDEyNztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZSBtdXRhYmxlXG52YXIgY2FtbF9pbml0aWFsX3RpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAqIDAuMDAxO1xuZnVuY3Rpb24gY2FtbF9zeXNfdGltZSgpIHtcbiAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICByZXR1cm4gbm93ICogMC4wMDEgLSBjYW1sX2luaXRpYWxfdGltZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuXG4vL1JlcXVpcmVzOiBjYW1sX3N5c190aW1lXG5mdW5jdGlvbiBjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW4oX2IpIHtcbiAgcmV0dXJuIGNhbWxfc3lzX3RpbWUoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmFuZG9tX3NlZWQgbXV0YWJsZVxuLy9UaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5IHNpbmNlIE9DYW1sIDQuMC4uLlxuZnVuY3Rpb24gY2FtbF9zeXNfcmFuZG9tX3NlZWQoKSB7XG4gIGlmIChnbG9iYWxUaGlzLmNyeXB0bykge1xuICAgIGlmIChnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHZhciBhID0gZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBJbnQzMkFycmF5KDQpKTtcbiAgICAgIHJldHVybiBbMCwgYVswXSwgYVsxXSwgYVsyXSwgYVszXV07XG4gICAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcykge1xuICAgICAgdmFyIGEgPSBuZXcgSW50MzJBcnJheShnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcygxNikuYnVmZmVyKTtcbiAgICAgIHJldHVybiBbMCwgYVswXSwgYVsxXSwgYVsyXSwgYVszXV07XG4gICAgfVxuICB9XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdmFyIHggPSBub3cgXiAoMHhmZmZmZmZmZiAqIE1hdGgucmFuZG9tKCkpO1xuICByZXR1cm4gWzAsIHhdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF93b3JkX3NpemUoKSB7XG4gIHJldHVybiAzMjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfaW50X3NpemUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2ludF9zaXplKCkge1xuICByZXR1cm4gMzI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X21heF93b3NpemUgY29uc3Rcbi8vIG1heF9pbnQgLyA0IHNvIHRoYXQgdGhlIGZvbGxvd2luZyBkb2VzIG5vdCBvdmVyZmxvd1xuLy9sZXQgbWF4X3N0cmluZ19sZW5ndGggPSB3b3JkX3NpemUgLyA4ICogbWF4X2FycmF5X2xlbmd0aCAtIDE7O1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSgpIHtcbiAgcmV0dXJuICgweDdmZmZmZmZmIC8gNCkgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXgoKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIlVuaXhcIiA/IDEgOiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3dpbjMyIGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIoKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIldpbjMyXCIgPyAxIDogMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4gY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4oKSB7XG4gIHJldHVybiBvc190eXBlID09PSBcIkN5Z3dpblwiID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJqc19vZl9vY2FtbFwiKV07XG59XG5cbi8vUHJvdmlkZXM6IG9zX3R5cGVcbi8vUmVxdWlyZXM6IGpzb29faXNfd2luMzJcbnZhciBvc190eXBlID0ganNvb19pc193aW4zMiA/IFwiV2luMzJcIiA6IFwiVW5peFwiO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRfY29uZmlnIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRfY29uZmlnKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMob3NfdHlwZSksIDMyLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNhdHR5XG5mdW5jdGlvbiBjYW1sX3N5c19pc2F0dHkoX2NoYW4pIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV92YXJpYW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfdmFyaWFudChfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9wYXJhbWV0ZXJzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfcGFyYW1ldGVycyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbnZhciBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzXG4vL1JlcXVpcmVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbmZ1bmN0aW9uIGNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MoYm9vbCkge1xuICBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSBib29sO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcbi8vUmVxdWlyZXM6IGNhbWxfcnVudGltZV93YXJuaW5nc1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfcnVudGltZV93YXJuaW5ncztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3hkZ19kZWZhdWx0c1xuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfeGRnX2RlZmF1bHRzKF91bml0KSB7XG4gIHJldHVybiAwOyAvLyBlbXB0eSBsaXN0XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lzX3JlZ3VsYXJfZmlsZVxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2Vcbi8vVmVyc2lvbjogPj0gNS4xXG5mdW5jdGlvbiBjYW1sX3N5c19pc19yZWd1bGFyX2ZpbGUobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByZXR1cm4gcm9vdC5kZXZpY2UuaXNGaWxlKHJvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW9fYnVmZmVyX3NpemVcbnZhciBjYW1sX2lvX2J1ZmZlcl9zaXplID0gNjU1MzY7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lvX2J1ZmZlcl9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2lvX2J1ZmZlcl9zaXplXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfaW9fYnVmZmVyX3NpemUoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfaW9fYnVmZmVyX3NpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3RlbXBfZGlyX25hbWVcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfdGVtcF9kaXJfbmFtZShfdW5pdCkge1xuICBpZiAob3NfdHlwZSA9PT0gXCJXaW4zMlwiKSB7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHJlcXVpcmUoXCJub2RlOm9zXCIpLnRtcGRpcigpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGVtcF9kaXJfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vVmVyc2lvbjogPj0gNS40XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3N5c190ZW1wX2Rpcl9uYW1lKF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29udmVydF9zaWduYWxfbnVtYmVyXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9zeXNfY29udmVydF9zaWduYWxfbnVtYmVyKHNpZ25vKSB7XG4gIHJldHVybiBzaWdubztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmV2X2NvbnZlcnRfc2lnbmFsX251bWJlclxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfc3lzX3Jldl9jb252ZXJ0X3NpZ25hbF9udW1iZXIoc2lnbm8pIHtcbiAgcmV0dXJuIHNpZ25vO1xufVxuXG4vL0Fsd2F5c1xuLy9SZXF1aXJlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vSWY6ICF3YXNtXG5mdW5jdGlvbiBjYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyKCkge1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgaWYgKHByb2Nlc3M/Lm9uKSB7XG4gICAgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChlcnIsIG9yaWdpbikge1xuICAgICAgY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5lcnJvcikge1xuICAgICAgICBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihldmVudC5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIoKTtcbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnID0gRkxBRyhcIndpdGgtanMtZXJyb3JcIik7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KFwiT0NBTUxSVU5QQVJBTVwiKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBsID0gci5zcGxpdChcIixcIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobFtpXSA9PT0gXCJiXCIpIHtcbiAgICAgICAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGxbaV0uc3RhcnRzV2l0aChcImI9XCIpKSB7XG4gICAgICAgIGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZyA9ICtsW2ldLnNsaWNlKDIpO1xuICAgICAgfSBlbHNlIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2Vudl9mbGFnXG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA9IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZztcblxuLy9Qcm92aWRlczogY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cyBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cygpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2JhY2t0cmFjZV9zdGF0dXNcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9ydW50aW1lX2ZsYWdcbmZ1bmN0aW9uIGNhbWxfYmFja3RyYWNlX3N0YXR1cyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA/IDEgOiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSgpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UoX3VuaXQpIHtcbiAgcmV0dXJuIFswXTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuZnVuY3Rpb24gY2FtbF9yZWNvcmRfYmFja3RyYWNlKGIpIHtcbiAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZyA9IGI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlKCkge1xuICByZXR1cm4gWzBdO1xufVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aCgpIHtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90XG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90KF9zbG90KSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3QoX2J0LCBfaWR4KSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlX3Nsb3Q6IGluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2UoX2V4biwgX2J0KSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2sgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrKCkge1xuICByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90KF9yYnQpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3RcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsX2dlbiAoY29uc3QsIHNoYWxsb3cpXG4vL0lmOiAhZWZmZWN0c1xuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSBmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09PSAwKSByZXR1cm4gZiguLi5hcmdzKTtcbiAgZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgZyA9IGYoLi4uYXJncy5zbGljZSgwLCBuKSk7XG4gICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBnO1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGcsIGFyZ3Muc2xpY2UobikpO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDEpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICAgIHJldHVybiBmKC4uLm5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMik7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKyspIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDFdID0geTtcbiAgICAgICAgICByZXR1cm4gZiguLi5uYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncy5jb25jYXQoZXh0cmFfYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBnLmwgPSBkO1xuICAgIHJldHVybiBnO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbF9nZW4gKGNvbnN0LCBzaGFsbG93KVxuLy9JZjogZWZmZWN0c1xuLy9JZjogIWRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSBmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09PSAwKSB7XG4gICAgcmV0dXJuIGYoLi4uYXJncyk7XG4gIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgcmVzdCA9IGFyZ3Muc2xpY2UobiAtIDEpO1xuICAgIHZhciBrID0gYXJnc1thcmdzTGVuIC0gMV07XG4gICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgbik7XG4gICAgYXJnc1tuIC0gMV0gPSBmdW5jdGlvbiAoZykge1xuICAgICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBrKGcpO1xuICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBrO1xuICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZywgYXJncyk7XG4gICAgfTtcbiAgICByZXR1cm4gZiguLi5hcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzTGVuLS07XG4gICAgdmFyIGsgPSBhcmdzW2FyZ3NMZW5dO1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDIpO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAxXSA9IHk7XG4gICAgICAgICAgcmV0dXJuIGYoLi4ubmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4LCB5LCB6KSB7XG4gICAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAzKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKykgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgICBuYXJnc1thcmdzTGVuICsgMV0gPSB5O1xuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAyXSA9IHo7XG4gICAgICAgICAgcmV0dXJuIGYoLi4ubmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXJncy5sZW5ndGggPSBhcmdzTGVuO1xuICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgYXJncy5jb25jYXQoZXh0cmFfYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBnLmwgPSBkICsgMTtcbiAgICByZXR1cm4gayhnKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX2Nwc1xuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuLy9JZjogZWZmZWN0c1xuLy9JZjogIWRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG52YXIgY2FtbF9jYWxsX2dlbl9jcHMgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX3R1cGxlIChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfY3BzX2Nsb3N1cmVcbi8vSWY6IGVmZmVjdHNcbi8vSWY6IGRvdWJsZXRyYW5zbGF0ZVxuLy9XZWFrZGVmXG52YXIgY2FtbF9jYWxsX2dlbl90dXBsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGNhbWxfY2FsbF9nZW5fZGlyZWN0KGYsIGFyZ3MpIHtcbiAgICB2YXIgbiA9IGYubCA+PSAwID8gZi5sIDogKGYubCA9IGYubGVuZ3RoKTtcbiAgICB2YXIgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoO1xuICAgIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gICAgaWYgKGQgPT09IDApIHtcbiAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICAgIHZhciBnID0gZiguLi5hcmdzLnNsaWNlKDAsIG4pKTtcbiAgICAgIGlmICh0eXBlb2YgZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZztcbiAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2RpcmVjdChnLCBhcmdzLnNsaWNlKG4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRklYTUU6IFJlc3RvcmUgdGhlIG9wdGltaXphdGlvbiBvZiBoYW5kbGluZyBzcGVjaWFsbHkgZCA9IDEgb3IgMlxuICAgICAgdmFyIGFyZ3NfID0gYXJncy5zbGljZSgpO1xuICAgICAgYXJnc18ubGVuZ3RoID0gYXJnc0xlbjtcbiAgICAgIHZhciByZXQgPSBjYW1sX2Nwc19jbG9zdXJlKFxuICAgICAgICBmdW5jdGlvbiAoLi4uZXh0cmFfYXJncykge1xuICAgICAgICAgIGlmIChleHRyYV9hcmdzLmxlbmd0aCA9PT0gMCkgZXh0cmFfYXJncyA9IFt1bmRlZmluZWRdO1xuICAgICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2RpcmVjdChmLCBhcmdzLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fY3BzKGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0LmwgPSBkO1xuICAgICAgcmV0LmNwcy5sID0gZCArIDE7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjYW1sX2NhbGxfZ2VuX2NwcyhmLCBhcmdzKSB7XG4gICAgaWYgKCFmLmNwcykge1xuICAgICAgdmFyIGsgPSBhcmdzLnBvcCgpO1xuICAgICAgcmV0dXJuIGsoY2FtbF9jYWxsX2dlbl9kaXJlY3QoZiwgYXJncykpO1xuICAgIH1cbiAgICB2YXIgbiA9IGYuY3BzLmwgPj0gMCA/IGYuY3BzLmwgOiAoZi5jcHMubCA9IGYuY3BzLmxlbmd0aCk7XG4gICAgdmFyIGFyZ3NMZW4gPSBhcmdzLmxlbmd0aDtcbiAgICB2YXIgZCA9IG4gLSBhcmdzTGVuO1xuICAgIGlmIChkID09PSAwKSB7XG4gICAgICByZXR1cm4gZi5jcHMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIGlmIChkIDwgMCkge1xuICAgICAgdmFyIHJlc3QgPSBhcmdzLnNsaWNlKG4gLSAxKTtcbiAgICAgIHZhciBrID0gYXJnc1thcmdzTGVuIC0gMV07XG4gICAgICBhcmdzID0gYXJncy5zbGljZSgwLCBuKTtcbiAgICAgIGFyZ3NbbiAtIDFdID0gZnVuY3Rpb24gKGcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGs7XG4gICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuX2NwcyhnLCBhcmdzKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gZi5jcHMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3NMZW4tLTtcbiAgICAgIHZhciBhcmdzXyA9IGFyZ3Muc2xpY2UoKTtcbiAgICAgIGFyZ3NfLmxlbmd0aCA9IGFyZ3NMZW47XG4gICAgICB2YXIgY29udCA9IGNhbWxfY3BzX2Nsb3N1cmUoXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fZGlyZWN0KGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uICguLi5leHRyYV9hcmdzKSB7XG4gICAgICAgICAgaWYgKGV4dHJhX2FyZ3MubGVuZ3RoID09PSAwKSBleHRyYV9hcmdzID0gW3VuZGVmaW5lZF07XG4gICAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW5fY3BzKGYsIGFyZ3NfLmNvbmNhdChleHRyYV9hcmdzKSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdmFyIGsgPSBhcmdzW2FyZ3NMZW5dO1xuICAgICAgY29udC5sID0gZDtcbiAgICAgIGNvbnQuY3BzLmwgPSBkICsgMTtcbiAgICAgIHJldHVybiBrKGNvbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2NhbWxfY2FsbF9nZW5fZGlyZWN0LCBjYW1sX2NhbGxfZ2VuX2Nwc107XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuX3R1cGxlXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbi8vV2Vha2RlZlxudmFyIGNhbWxfY2FsbF9nZW4gPSBjYW1sX2NhbGxfZ2VuX3R1cGxlWzBdO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuX2Nwc1xuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlbl90dXBsZVxuLy9JZjogZWZmZWN0c1xuLy9JZjogZG91YmxldHJhbnNsYXRlXG4vL1dlYWtkZWZcbnZhciBjYW1sX2NhbGxfZ2VuX2NwcyA9IGNhbWxfY2FsbF9nZW5fdHVwbGVbMV07XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmFtZWRfdmFsdWVzXG52YXIgY2FtbF9uYW1lZF92YWx1ZXMgPSB7fTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZSAoY29uc3QsbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlKG5tLCB2KSB7XG4gIGNhbWxfbmFtZWRfdmFsdWVzW2NhbWxfanNieXRlc19vZl9zdHJpbmcobm0pXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlc1xuZnVuY3Rpb24gY2FtbF9uYW1lZF92YWx1ZShubSkge1xuICByZXR1cm4gY2FtbF9uYW1lZF92YWx1ZXNbbm1dO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dsb2JhbF9kYXRhXG52YXIgY2FtbF9nbG9iYWxfZGF0YSA9IFswXTtcblxuLy9Qcm92aWRlczogY2FtbF9idWlsZF9zeW1ib2xzXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9idWlsZF9zeW1ib2xzKHN5bWIpIHtcbiAgdmFyIHIgPSB7fTtcbiAgdmFyIG1heCA9IC0xO1xuICBpZiAoc3ltYikge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc3ltYi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkeCA9IHN5bWJbaV1bMl07XG4gICAgICBtYXggPSBNYXRoLm1heChtYXgsIGlkeCk7XG4gICAgICByW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN5bWJbaV1bMV0pXSA9IGlkeDtcbiAgICB9XG4gIH1cbiAgci5uZXh0X2lkeCA9IG1heCArIDE7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3RvcGxldmVsX3JlbG9jXG52YXIganNvb190b3BsZXZlbF9yZWxvYyA9IHVuZGVmaW5lZDtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9nbG9iYWwgKGNvbnN0LCBzaGFsbG93LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfY2FsbGJhY2ssIGNhbWxfYnVpbGRfc3ltYm9sc1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczoganNvb190b3BsZXZlbF9yZWxvY1xuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9nbG9iYWwobiwgdiwgbmFtZV9vcHQpIHtcbiAgaWYgKG5hbWVfb3B0KSB7XG4gICAgdmFyIG5hbWUgPSBuYW1lX29wdDtcbiAgICBpZiAoanNvb190b3BsZXZlbF9yZWxvYykge1xuICAgICAgbiA9IGNhbWxfY2FsbGJhY2soanNvb190b3BsZXZlbF9yZWxvYywgW25hbWVdKTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfZ2xvYmFsX2RhdGEuc3ltYm9scykge1xuICAgICAgaWYgKCFjYW1sX2dsb2JhbF9kYXRhLnN5bWlkeCkge1xuICAgICAgICBjYW1sX2dsb2JhbF9kYXRhLnN5bWlkeCA9IGNhbWxfYnVpbGRfc3ltYm9scyhjYW1sX2dsb2JhbF9kYXRhLnN5bWJvbHMpO1xuICAgICAgfVxuICAgICAgdmFyIG5pZCA9IGNhbWxfZ2xvYmFsX2RhdGEuc3ltaWR4W25hbWVdO1xuICAgICAgaWYgKG5pZCA+PSAwKSBuID0gbmlkO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIFRoZSB1bml0IGlzIHVua25vd24sIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGR5bmxpbmtpbmcgYSBwcmVjb21waWxlZCBqcyxcbiAgICAgICAgLy8gbGV0J3MgYWxsb2NhdGUgYSBmcmVzaCBpZHguXG4gICAgICAgIHZhciBuID0gY2FtbF9nbG9iYWxfZGF0YS5zeW1pZHgubmV4dF9pZHgrKztcbiAgICAgICAgY2FtbF9nbG9iYWxfZGF0YS5zeW1pZHhbbmFtZV0gPSBuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYW1sX2dsb2JhbF9kYXRhW24gKyAxXSA9IHY7XG4gIGlmIChuYW1lX29wdCkgY2FtbF9nbG9iYWxfZGF0YVtuYW1lX29wdF0gPSB2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9nbG9iYWxfZGF0YSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2dldF9nbG9iYWxfZGF0YShfdW5pdCkge1xuICByZXR1cm4gY2FtbF9nbG9iYWxfZGF0YTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19wcmludGFibGUgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9pc19wcmludGFibGUoYykge1xuICByZXR1cm4gKyhjID4gMzEgJiYgYyA8IDEyNyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfcHJpbnRfc3RhdHNcbmZ1bmN0aW9uIGNhbWxfbWF5YmVfcHJpbnRfc3RhdHMoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWJcblxuLy9Qcm92aWRlczogY2FtbF9qc19wdXJlX2V4cHIgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfcHVyZV9leHByKGYpIHtcbiAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgWzBdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9qc19zZXQobywgZiwgdikge1xuICBvW2ZdID0gdjtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2dldCAobXV0YWJsZSwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2dldChvLCBmKSB7XG4gIHJldHVybiBvW2ZdO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19kZWxldGUgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19kZWxldGUobywgZikge1xuICBkZWxldGUgb1tmXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaW5zdGFuY2VvZiAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19pbnN0YW5jZW9mKG8sIGMpIHtcbiAgcmV0dXJuIG8gaW5zdGFuY2VvZiBjID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdHlwZW9mIChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdHlwZW9mKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvO1xufVxuXG4vL1Byb3ZpZGVzOmNhbWxfdHJhbXBvbGluZVxuZnVuY3Rpb24gY2FtbF90cmFtcG9saW5lKHJlcykge1xuICB2YXIgYyA9IDE7XG4gIHdoaWxlIChyZXM/Lmpvb190cmFtcCkge1xuICAgIHJlcyA9IHJlcy5qb29fdHJhbXAuYXBwbHkobnVsbCwgcmVzLmpvb19hcmdzKTtcbiAgICBjKys7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczpjYW1sX3RyYW1wb2xpbmVfcmV0dXJuXG5mdW5jdGlvbiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGYsIGFyZ3MsIGRpcmVjdCkge1xuICByZXR1cm4geyBqb29fdHJhbXA6IGYsIGpvb19hcmdzOiBhcmdzLCBqb29fZGlyZWN0OiBkaXJlY3QgfTtcbn1cblxuLy9Qcm92aWRlczpjYW1sX3N0YWNrX2RlcHRoXG4vL0lmOiBlZmZlY3RzXG52YXIgY2FtbF9zdGFja19kZXB0aCA9IDA7XG5cbi8vUHJvdmlkZXM6Y2FtbF9zdGFja19jaGVja19kZXB0aFxuLy9JZjogZWZmZWN0c1xuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoXG5mdW5jdGlvbiBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoKCkge1xuICByZXR1cm4gLS1jYW1sX3N0YWNrX2RlcHRoID4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsYmFja1xuLy9JZjogIWVmZmVjdHNcbi8vUmVxdWlyZXM6Y2FtbF9jYWxsX2dlblxudmFyIGNhbWxfY2FsbGJhY2sgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG4vL1JlcXVpcmVzOiBjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuLCBjYW1sX3dyYXBfZXhjZXB0aW9uXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vQWxpYXM6IGNhbWxfY3BzX3RyYW1wb2xpbmVcbmZ1bmN0aW9uIGNhbWxfY2FsbGJhY2soZiwgYXJncykge1xuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfY3VycmVudF9zdGFjayA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgam9vX3RyYW1wOiBmLFxuICAgICAgam9vX2FyZ3M6IGFyZ3MuY29uY2F0KGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSksXG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBjYW1sX3N0YWNrX2RlcHRoID0gNDA7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBjYW1sX2NhbGxfZ2VuKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gICAgICAgIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgICAgICAgcmVzID0geyBqb29fdHJhbXA6IGhhbmRsZXIsIGpvb19hcmdzOiBbY2FtbF93cmFwX2V4Y2VwdGlvbihlKV0gfTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChyZXM/Lmpvb19hcmdzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9jdXJyZW50X3N0YWNrID0gc2F2ZWRfY3VycmVudF9zdGFjaztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbnZhciBjYW1sX2NhbGxiYWNrID0gY2FtbF9jYWxsX2dlbjtcblxuLy9Qcm92aWRlczogY2FtbF9pc19qc1xuZnVuY3Rpb24gY2FtbF9pc19qcygpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZyhfdW5pdCkge1xuICByZXR1cm4gRkxBRyhcInVzZS1qcy1zdHJpbmdcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc19lZmZlY3RzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHMoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKENPTkZJRyhcImVmZmVjdHNcIikpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dyYXBfZXhjZXB0aW9uIGNvbnN0IChtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSxjYW1sX3N0cmluZ19vZl9qc3N0cmluZyxjYW1sX25hbWVkX3ZhbHVlXG5mdW5jdGlvbiBjYW1sX3dyYXBfZXhjZXB0aW9uKGUpIHtcbiAgaWYgKEZMQUcoXCJleGN3cmFwXCIpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHJldHVybiBlO1xuICAgIHZhciBleG47XG4gICAgLy9TdGFja19vdmVyZmxvdzogY2hyb21lLCBzYWZhcmlcbiAgICBpZiAoXG4gICAgICBnbG9iYWxUaGlzLlJhbmdlRXJyb3IgJiZcbiAgICAgIGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLlJhbmdlRXJyb3IgJiZcbiAgICAgIGUubWVzc2FnZSAmJlxuICAgICAgZS5tZXNzYWdlLm1hdGNoKC9tYXhpbXVtIGNhbGwgc3RhY2svaSlcbiAgICApXG4gICAgICBleG4gPSBjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93O1xuICAgIC8vU3RhY2tfb3ZlcmZsb3c6IGZpcmVmb3hcbiAgICBlbHNlIGlmIChcbiAgICAgIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvciAmJlxuICAgICAgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvciAmJlxuICAgICAgZS5tZXNzYWdlICYmXG4gICAgICBlLm1lc3NhZ2UubWF0Y2goL3RvbyBtdWNoIHJlY3Vyc2lvbi9pKVxuICAgIClcbiAgICAgIGV4biA9IGNhbWxfZ2xvYmFsX2RhdGEuU3RhY2tfb3ZlcmZsb3c7XG4gICAgLy9XcmFwIEVycm9yIGluIEpzLkVycm9yIGV4Y2VwdGlvblxuICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkVycm9yICYmIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpKVxuICAgICAgZXhuID0gWzAsIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpLCBlXTtcbiAgICAvL2ZhbGxiYWNrOiB3cmFwcGVkIGluIEZhaWx1cmVcbiAgICBlbHNlXG4gICAgICBleG4gPSBbMCwgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhTdHJpbmcoZSkpXTtcbiAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXJyb3IgYXQgaGFuZCwgbGV0J3MgdXNlIGl0LlxuICAgIGlmIChlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5FcnJvcikgZXhuLmpzX2Vycm9yID0gZTtcbiAgICByZXR1cm4gZXhuO1xuICB9IGVsc2UgcmV0dXJuIGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9lbnZfZmxhZ1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZ1xuZnVuY3Rpb24gY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKGV4biwgZm9yY2UpIHtcbiAgLy8gQmFja3RyYWNlcyBhcmUgdmVyeSBleHBlbnNpdmUsIHdlIG9ubHkgZW5hYmxlIHRoZW0gd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZFxuICAvLyBhdCBjb21waWxlLXRpbWUgKC0tZW5hYmxlIHdpdGgtanMtZXJyb3IpIG9yIGF0IHN0YXJ0dXAgd2l0aCBPQ0FNTFJVTlBBUkFNPWI9MS5cbiAgLy8gTGlicmFyaWVzIHN1Y2ggYXMgQmFzZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlIGJhY2t0cmFjZXMgKHByb2dyYW1tYXRpY2FsbHkpIGJ1dFxuICAvLyBpdCdzIHdheSB0byBzbG93LiBIZXJlLCB3ZSBmb3JjZSB0aGUgZW5kLXVzZXIgdG8gb3B0LWluIHRvIGJhY2t0cmFjZXMuXG4gIGlmIChjYW1sX3JlY29yZF9iYWNrdHJhY2VfZW52X2ZsYWcgJiYgY2FtbF9yZWNvcmRfYmFja3RyYWNlX3J1bnRpbWVfZmxhZylcbiAgICByZXR1cm4gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSk7XG4gIGVsc2UgcmV0dXJuIGV4bjtcbn1cblxuLy8gRXhwZXJpbWVudGFsXG4vL1Byb3ZpZGVzOiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSkge1xuICAvL25ldmVyIHJlcmFpc2UgZm9yIGNvbnN0YW50IGV4blxuICBpZiAoIWV4bi5qc19lcnJvciB8fCBmb3JjZSB8fCBleG5bMF0gPT09IDI0OClcbiAgICBleG4uanNfZXJyb3IgPSBuZXcgZ2xvYmFsVGhpcy5FcnJvcihcIkpzIGV4Y2VwdGlvbiBjb250YWluaW5nIGJhY2t0cmFjZVwiKTtcbiAgcmV0dXJuIGV4bjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb24oZXhuKSB7XG4gIGlmIChleG4uanNfZXJyb3IpIHtcbiAgICByZXR1cm4gWzAsIGV4bi5qc19lcnJvcl07XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdGhyb3dfanNfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX3Rocm93X2pzX2V4Y2VwdGlvbihleG4pIHtcbiAgdGhyb3cgZXhuO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fYm9vbCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fYm9vbCh4KSB7XG4gIHJldHVybiAhIXg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19ib29sKHgpIHtcbiAgcmV0dXJuICt4O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2Zsb2F0IGNvbnN0IChjb25zdClcbi8vQWxpYXM6IGNhbWxfanNfZnJvbV9pbnQzMlxuLy9BbGlhczogY2FtbF9qc19mcm9tX25hdGl2ZWludFxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Zsb2F0IGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdG9fZmxvYXQoeCkge1xuICByZXR1cm4geDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9faW50MzIgY29uc3QgKGNvbnN0KVxuLy9BbGlhczogY2FtbF9qc190b19uYXRpdmVpbnRcbmZ1bmN0aW9uIGNhbWxfanNfdG9faW50MzIoeCkge1xuICByZXR1cm4geCB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9hcnJheSBtdXRhYmxlIChzaGFsbG93KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2FycmF5KGEpIHtcbiAgcmV0dXJuIGEuc2xpY2UoMSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2FycmF5IG11dGFibGUgKHNoYWxsb3cpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2FycmF5KGEpIHtcbiAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4gKyAxKTtcbiAgYlswXSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGJbaSArIDFdID0gYVtpXTtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGlzdF9vZl9qc19hcnJheSBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGlzdF9vZl9qc19hcnJheShhKSB7XG4gIHZhciBsID0gMDtcbiAgZm9yICh2YXIgaSA9IGEubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgZSA9IGFbaV07XG4gICAgbCA9IFswLCBlLCBsXTtcbiAgfVxuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9saXN0X3RvX2pzX2FycmF5IGNvbnN0IChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9saXN0X3RvX2pzX2FycmF5KGwpIHtcbiAgdmFyIGEgPSBbXTtcbiAgZm9yICg7IGwgIT09IDA7IGwgPSBsWzJdKSB7XG4gICAgYS5wdXNoKGxbMV0pO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3ZhciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc192YXIoeCkge1xuICB2YXIgeCA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHgpO1xuICAvL0NoZWNrcyB0aGF0IHggaGFzIHRoZSBmb3JtIGlkZW50Wy5pZGVudF0qXG4gIGlmICgheC5tYXRjaCgvXlthLXpBLVpfJF1bYS16QS1aXyQwLTldKihcXC5bYS16QS1aXyRdW2EtekEtWl8kMC05XSopKiQvKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAnY2FtbF9qc192YXI6IFwiJyArXG4gICAgICAgIHggK1xuICAgICAgICAnXCIgaXMgbm90IGEgdmFsaWQgSmF2YVNjcmlwdCB2YXJpYWJsZS4gY29udGludWluZyAuLicsXG4gICAgKTtcbiAgICAvL2NvbnNvbGUuZXJyb3IoXCJKcy5VbnNhZmUuZXZhbF9zdHJpbmdcIilcbiAgfVxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6XG4gIHJldHVybiBldmFsPy4oeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2NhbGwgKGNvbnN0LCBtdXRhYmxlLCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX2NhbGwoZiwgbywgYXJncykge1xuICByZXR1cm4gZi5hcHBseShvLCBjYW1sX2pzX2Zyb21fYXJyYXkoYXJncykpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5fY2FsbCAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfZnVuX2NhbGwoZiwgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGYoKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZihhWzFdKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdKTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdKTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gZihhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShudWxsLCBjYW1sX2pzX2Zyb21fYXJyYXkoYSkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19tZXRoX2NhbGwgKG11dGFibGUsIGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19tZXRoX2NhbGwobywgZiwgYXJncykge1xuICByZXR1cm4gb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhmKV0uYXBwbHkobywgY2FtbF9qc19mcm9tX2FycmF5KGFyZ3MpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfbmV3IChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19uZXcoYywgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIG5ldyBjKCk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0pO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBuZXcgYyhhWzFdLCBhWzJdKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gbmV3IGMoYVsxXSwgYVsyXSwgYVszXSk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0sIGFbMl0sIGFbM10sIGFbNF0pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBuZXcgYyhhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gbmV3IGMoYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSk7XG4gICAgY2FzZSA4OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10pO1xuICB9XG4gIGZ1bmN0aW9uIEYoKSB7XG4gICAgcmV0dXJuIGMuYXBwbHkodGhpcywgY2FtbF9qc19mcm9tX2FycmF5KGEpKTtcbiAgfVxuICBGLnByb3RvdHlwZSA9IGMucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEYoKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfb2pzX25ld19hcnIgKGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX29qc19uZXdfYXJyKGMsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBuZXcgYygpO1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gbmV3IGMoYVswXSwgYVsxXSk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMF0sIGFbMV0sIGFbMl0pO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gbmV3IGMoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIG5ldyBjKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0pO1xuICAgIGNhc2UgNzpcbiAgICAgIHJldHVybiBuZXcgYyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdKTtcbiAgfVxuICBmdW5jdGlvbiBGKCkge1xuICAgIHJldHVybiBjLmFwcGx5KHRoaXMsIGEpO1xuICB9XG4gIEYucHJvdG90eXBlID0gYy5wcm90b3R5cGU7XG4gIHJldHVybiBuZXcgRigpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXJncyA9IFt1bmRlZmluZWRdO1xuICAgIH1cbiAgICB2YXIgcmVzID0gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBjYW1sX2pzX3dyYXBfY2FsbGJhY2socmVzKSA6IHJlcztcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1xuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50cyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIFthcmdzXSk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGFyZ3MubGVuZ3RoID0gYXJpdHk7XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICB2YXIgbGVuID0gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKTtcbiAgICBhcmdzLmxlbmd0aCA9IGxlbjtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfd3JhcF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2soZikge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gICAgcmV0dXJuIHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gY2FtbF9qc193cmFwX2NhbGxiYWNrKHJlcykgOiByZXM7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgW3RoaXMsIGFyZ3NdKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGFyZ3MubGVuZ3RoID0gYXJpdHk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpO1xuICB9O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIHZhciBsZW4gPSBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICBhcmdzLmxlbmd0aCA9IGxlbjtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuLy9JZjogIWVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gZi5sID49IDAgPyBmLmwgOiAoZi5sID0gZi5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gZi5sID49IDAgPyBmLmwgOiAoZi5sID0gZi5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG5mdW5jdGlvbiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpIHtcbiAgLy8gRnVuY3Rpb25zIGhhdmUgYW4gYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFyYW1ldGVyLiBUaGlzIHNob3VsZFxuICAvLyBub3QgYmUgdmlzaWJsZSB3aGVuIGNhbGxpbmcgdGhlbSBmcm9tIEphdmFTY3JpcHRcbiAgcmV0dXJuIChmLmwgPj0gMCA/IGYubCA6IChmLmwgPSBmLmxlbmd0aCkpIC0gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19lcXVhbHMoeCwgeSkge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRG91YmxlRXF1YWxzOlxuICByZXR1cm4gKyh4ID09IHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3N0cmljdF9lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19zdHJpY3RfZXF1YWxzKHgsIHkpIHtcbiAgcmV0dXJuICsoeCA9PT0geSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXZhbF9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXZhbF9zdHJpbmcocykge1xuICAvLyBVc2VzIGFuIGluZGlyZWN0IGV2YWwgdGhyb3VnaCB0aGUgb3B0aW9uYWwgY2hhaW5pbmcgb3BlcmF0b3IuXG4gIC8vIChzZWUgaHR0cHM6Ly9tZG4uZGV2L2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2V2YWwpXG4gIC8vIFRoaXMgaXMgZmFzdGVyIGFuZCBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlcy5cbiAgLy8gQWxzbyBwcmVwZW5kcyBgXCJ1c2Ugc3RyaWN0XCJgIGRpcmVjdGl2ZSBzaW5jZSB0aGlzIGlzIG5vdCBpbmhlcml0ZWRcbiAgLy8gZnJvbSB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uIHdpdGggYW4gaW5kaXJlY3QgZXZhbC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsnICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2V4cHIgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXhwcihzKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJjYW1sX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgLy8gV2UgYWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHRoZSBhbWJpZ3VpdHkgYmV0d2VlbiBleHByZXNzaW9uc1xuICAvLyBhbmQgc3RhdGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHdlIGFjY2VwdCBpbnZhbGlkIGlucHV0cyBsaWtlXG4gIC8vIFwiYSkoYlwiLCBidXQgdGhpcyBpcyB1bmxpa2VseSB0byBiZSBhbiBpc3N1ZSBpbiBwcmFjdGljZS5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsoJyArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpICsgXCIpXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3B1cmVfanNfZXhwciBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9wdXJlX2pzX2V4cHIocykge1xuICBjb25zb2xlLmVycm9yKFwiY2FtbF9wdXJlX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc2VjdXJpdHkvbm9HbG9iYWxFdmFsOlxuICByZXR1cm4gZXZhbD8uKCdcInVzZSBzdHJpY3RcIjsoJyArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpICsgXCIpXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX29iamVjdCAob2JqZWN0X2xpdGVyYWwpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19vYmplY3QoYSkge1xuICB2YXIgbyA9IHt9O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IGFbaV07XG4gICAgb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwWzFdKV0gPSBwWzJdO1xuICB9XG4gIHJldHVybiBvO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9SYWlzZSBleGNlcHRpb25cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9jb25zdGFudCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2NvbnN0YW50KHRhZykge1xuICB0aHJvdyB0YWc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJnKHRhZywgYXJnKSB7XG4gIHRocm93IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShbMCwgdGFnLCBhcmddKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX2FyZ3MgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJncyh0YWcsIGFyZ3MpIHtcbiAgdGhyb3cgY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKFswLCB0YWddLmNvbmNhdChhcmdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcodGFnLCBtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyh0YWcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmFpbHdpdGggKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9mYWlsd2l0aChtc2cpIHtcbiAgaWYgKCFjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUpXG4gICAgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlID0gWzI0OCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkZhaWx1cmVcIiksIC0zXTtcbiAgY2FtbF9yYWlzZV93aXRoX3N0cmluZyhjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUsIG1zZyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2ludmFsaWRfYXJndW1lbnQobXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5JbnZhbGlkX2FyZ3VtZW50LCBtc2cpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRW5kX29mX2ZpbGUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRGl2aXNpb25fYnlfemVybyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vdF9mb3VuZCgpIHtcbiAgY2FtbF9yYWlzZV9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLk5vdF9mb3VuZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXR0aW1lb2ZkYXlcbi8vQWxpYXM6IHVuaXhfZ2V0dGltZW9mZGF5XG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0dGltZW9mZGF5KCkge1xuICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdGltZVxuLy9SZXF1aXJlczogY2FtbF91bml4X2dldHRpbWVvZmRheVxuLy9BbGlhczogdW5peF90aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZSgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoY2FtbF91bml4X2dldHRpbWVvZmRheSgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3RpbWVzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3RpbWVzXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZXMoKSB7XG4gIGlmIChnbG9iYWxUaGlzLnByb2Nlc3M/LmNwdVVzYWdlKSB7XG4gICAgdmFyIHQgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3B1VXNhZ2UoKTtcbiAgICByZXR1cm4gQkxPQ0soMCwgdC51c2VyIC8gMWU2LCB0LnN5c3RlbSAvIDFlNiwgMCwgMCk7XG4gIH0gZWxzZSBpZiAoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZT8ubm93KSB7XG4gICAgcmV0dXJuIEJMT0NLKDAsIGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCkgLyAxMDAwLCAwLCAwLCAwKTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RpbWVzOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dtdGltZVxuLy9BbGlhczogdW5peF9nbXRpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF9nbXRpbWUodCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSBuZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksIDAsIDEpKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIGQuZ2V0VVRDTWludXRlcygpLFxuICAgIGQuZ2V0VVRDSG91cnMoKSxcbiAgICBkLmdldFVUQ0RhdGUoKSxcbiAgICBkLmdldFVUQ01vbnRoKCksXG4gICAgZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCxcbiAgICBkLmdldFVUQ0RheSgpLFxuICAgIGRveSxcbiAgICBmYWxzZSB8IDAgLyogZm9yIFVUQyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaXMgZmFsc2UgKi8sXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbG9jYWx0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbG9jYWx0aW1lKHQpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSh0ICogMTAwMCk7XG4gIHZhciBkX251bSA9IGQuZ2V0VGltZSgpO1xuICB2YXIgamFudWFyeWZpcnN0ID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHZhciBqYW4gPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICB2YXIganVsID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCA2LCAxKTtcbiAgdmFyIHN0ZFRpbWV6b25lT2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgamFuLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAganVsLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICk7XG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGQuZ2V0U2Vjb25kcygpLFxuICAgIGQuZ2V0TWludXRlcygpLFxuICAgIGQuZ2V0SG91cnMoKSxcbiAgICBkLmdldERhdGUoKSxcbiAgICBkLmdldE1vbnRoKCksXG4gICAgZC5nZXRGdWxsWWVhcigpIC0gMTkwMCxcbiAgICBkLmdldERheSgpLFxuICAgIGRveSxcbiAgICAoZC5nZXRUaW1lem9uZU9mZnNldCgpIDwgc3RkVGltZXpvbmVPZmZzZXQpIHxcbiAgICAgIDAgLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lICBmaWVsZC4gKi8sXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta3RpbWVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbWt0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbWt0aW1lKHRtKSB7XG4gIHZhciBkID0gbmV3IERhdGUodG1bNl0gKyAxOTAwLCB0bVs1XSwgdG1bNF0sIHRtWzNdLCB0bVsyXSwgdG1bMV0pLmdldFRpbWUoKTtcbiAgdmFyIHQgPSBNYXRoLmZsb29yKGQgLyAxMDAwKTtcbiAgdmFyIHRtMiA9IGNhbWxfdW5peF9sb2NhbHRpbWUodCk7XG4gIHJldHVybiBCTE9DSygwLCB0LCB0bTIpO1xufVxuLy9Qcm92aWRlczogY2FtbF91bml4X3N0YXJ0dXAgY29uc3Rcbi8vQWxpYXM6IHdpbl9zdGFydHVwXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3RhcnR1cCgpIHt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9jbGVhbnVwIGNvbnN0XG4vL0FsaWFzOiB3aW5fY2xlYW51cFxuZnVuY3Rpb24gY2FtbF91bml4X2NsZWFudXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkIGNvbnN0XG4vL0FsaWFzOiB3aW5faGFuZGxlX2ZkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkKHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZVxuLy9BbGlhczogdW5peF9pc2F0dHlcbmZ1bmN0aW9uIGNhbWxfdW5peF9pc2F0dHkoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQpO1xuICBpZiAoIWZpbGUuaXNhdHR5KSByZXR1cm4gMDtcbiAgcmV0dXJuIGZpbGUuaXNhdHR5KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vQWxpYXM6IHVuaXhfaXNhdHR5XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3VuaXhfaXNhdHR5KF9maWxlRGVzY3JpcHRvcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogdW5peF9lcnJvclxudmFyIHVuaXhfZXJyb3IgPSBbXG4gIC8qID09PVVuaXguZXJyb3I9PT1cbiAgICpcbiAgICogVGhpcyBhcnJheSBpcyBpbiBvcmRlciBvZiB0aGUgdmFyaWFudCBpbiBPQ2FtbFxuICAgKi9cbiAgXCJFMkJJR1wiLFxuICBcIkVBQ0NFU1wiLFxuICBcIkVBR0FJTlwiLFxuICBcIkVCQURGXCIsXG4gIFwiRUJVU1lcIixcbiAgXCJFQ0hJTERcIixcbiAgXCJFREVBRExLXCIsXG4gIFwiRURPTVwiLFxuICBcIkVFWElTVFwiLFxuICBcIkVGQVVMVFwiLFxuICBcIkVGQklHXCIsXG4gIFwiRUlOVFJcIixcbiAgXCJFSU5WQUxcIixcbiAgXCJFSU9cIixcbiAgXCJFSVNESVJcIixcbiAgXCJFTUZJTEVcIixcbiAgXCJFTUxJTktcIixcbiAgXCJFTkFNRVRPT0xPTkdcIixcbiAgXCJFTkZJTEVcIixcbiAgXCJFTk9ERVZcIixcbiAgXCJFTk9FTlRcIixcbiAgXCJFTk9FWEVDXCIsXG4gIFwiRU5PTENLXCIsXG4gIFwiRU5PTUVNXCIsXG4gIFwiRU5PU1BDXCIsXG4gIFwiRU5PU1lTXCIsXG4gIFwiRU5PVERJUlwiLFxuICBcIkVOT1RFTVBUWVwiLFxuICBcIkVOT1RUWVwiLFxuICBcIkVOWElPXCIsXG4gIFwiRVBFUk1cIixcbiAgXCJFUElQRVwiLFxuICBcIkVSQU5HRVwiLFxuICBcIkVST0ZTXCIsXG4gIFwiRVNQSVBFXCIsXG4gIFwiRVNSQ0hcIixcbiAgXCJFWERFVlwiLFxuICBcIkVXT1VMREJMT0NLXCIsXG4gIFwiRUlOUFJPR1JFU1NcIixcbiAgXCJFQUxSRUFEWVwiLFxuICBcIkVOT1RTT0NLXCIsXG4gIFwiRURFU1RBRERSUkVRXCIsXG4gIFwiRU1TR1NJWkVcIixcbiAgXCJFUFJPVE9UWVBFXCIsXG4gIFwiRU5PUFJPVE9PUFRcIixcbiAgXCJFUFJPVE9OT1NVUFBPUlRcIixcbiAgXCJFU09DS1ROT1NVUFBPUlRcIixcbiAgXCJFT1BOT1RTVVBQXCIsXG4gIFwiRVBGTk9TVVBQT1JUXCIsXG4gIFwiRUFGTk9TVVBQT1JUXCIsXG4gIFwiRUFERFJJTlVTRVwiLFxuICBcIkVBRERSTk9UQVZBSUxcIixcbiAgXCJFTkVURE9XTlwiLFxuICBcIkVORVRVTlJFQUNIXCIsXG4gIFwiRU5FVFJFU0VUXCIsXG4gIFwiRUNPTk5BQk9SVEVEXCIsXG4gIFwiRUNPTk5SRVNFVFwiLFxuICBcIkVOT0JVRlNcIixcbiAgXCJFSVNDT05OXCIsXG4gIFwiRU5PVENPTk5cIixcbiAgXCJFU0hVVERPV05cIixcbiAgXCJFVE9PTUFOWVJFRlNcIixcbiAgXCJFVElNRURPVVRcIixcbiAgXCJFQ09OTlJFRlVTRURcIixcbiAgXCJFSE9TVERPV05cIixcbiAgXCJFSE9TVFVOUkVBQ0hcIixcbiAgXCJFTE9PUFwiLFxuICBcIkVPVkVSRkxPV1wiLFxuXTtcblxuLy9Qcm92aWRlczogbWFrZV91bml4X2Vycl9hcmdzXG4vL1JlcXVpcmVzOiB1bml4X2Vycm9yLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIHN5c2NhbGwsIHBhdGgsIGVycm5vKSB7XG4gIHZhciB2YXJpYW50ID0gdW5peF9lcnJvci5pbmRleE9mKGNvZGUpO1xuICBpZiAodmFyaWFudCA8IDApIHtcbiAgICAvLyBEZWZhdWx0IGlmIHVuZGVmaW5lZFxuICAgIGlmIChlcnJubyA9PSBudWxsKSB7XG4gICAgICBlcnJubyA9IC05OTk5O1xuICAgIH1cbiAgICAvLyBJZiBub25lIG9mIHRoZSBhYm92ZSB2YXJpYW50cywgZmFsbGJhY2sgdG8gRVVOS05PV05FUlIoaW50KVxuICAgIC8vIGVycm5vIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlXG4gICAgdmFyaWFudCA9IEJMT0NLKDAsIC1lcnJubyk7XG4gIH1cbiAgdmFyIGFyZ3MgPSBbXG4gICAgdmFyaWFudCxcbiAgICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhzeXNjYWxsIHx8IFwiXCIpLFxuICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHBhdGggfHwgXCJcIiksXG4gIF07XG4gIHJldHVybiBhcmdzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmVycm9yXG4vL1JlcXVpcmVzOiB1bml4X2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N0cmVycm9yKGVycm5vKSB7XG4gIGNvbnN0IHV0aWwgPSByZXF1aXJlKFwibm9kZTp1dGlsXCIpO1xuICBpZiAoZXJybm8gPj0gMCkge1xuICAgIGNvbnN0IGNvZGUgPSB1bml4X2Vycm9yW2Vycm5vXTtcbiAgICByZXR1cm4gdXRpbFxuICAgICAgLmdldFN5c3RlbUVycm9yTWFwKClcbiAgICAgIC5lbnRyaWVzKClcbiAgICAgIC5maW5kKCh4KSA9PiB4WzFdWzBdID09PSBjb2RlKVsxXVsxXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdXRpbC5nZXRTeXN0ZW1FcnJvck1lc3NhZ2UoZXJybm8pO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyZXJyb3Jcbi8vUmVxdWlyZXM6IHVuaXhfZXJyb3Jcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3RyZXJyb3IoZXJybm8pIHtcbiAgY29uc3QgY29kZSA9IHVuaXhfZXJyb3JbZXJybm9dO1xuICByZXR1cm4gY29kZSB8fCBcIlVua25vd24gZXJyb3IgXCIgKyBlcnJubztcbn1cblxuLy9Qcm92aWRlczogdW5peF9lcnJvcl9tZXNzYWdlXG4vL0FsaWFzOiBjYW1sX3VuaXhfZXJyb3JfbWVzc2FnZVxuLy9SZXF1aXJlczogY2FtbF9zdHJlcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIHVuaXhfZXJyb3JfbWVzc2FnZShlcnIpIHtcbiAgY29uc3QgZXJybm8gPSB0eXBlb2YgZXJyID09PSBcIm51bWJlclwiID8gZXJyIDogLWVyclsxXTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNhbWxfc3RyZXJyb3IoZXJybm8pKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NoZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19jaGRpclxuLy9BbGlhczogdW5peF9jaGRpclxuZnVuY3Rpb24gY2FtbF91bml4X2NoZGlyKGRpcikge1xuICByZXR1cm4gY2FtbF9zeXNfY2hkaXIoZGlyLCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChcbiAgICByb290LnJlc3QsXG4gICAgLyogbGFyZ2UgKi8gZmFsc2UsXG4gICAgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdF82NFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdF82NFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXRfNjQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXRfNjQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChcbiAgICByb290LnJlc3QsXG4gICAgLyogbGFyZ2UgKi8gdHJ1ZSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KFxuICAgIHJvb3QucmVzdCxcbiAgICAvKiBsYXJnZSAqLyBmYWxzZSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdF82NFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRfNjRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdF82NChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0XzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KFxuICAgIHJvb3QucmVzdCxcbiAgICAvKiBsYXJnZSAqLyB0cnVlLFxuICAgIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NobW9kXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9jaG1vZFxuZnVuY3Rpb24gY2FtbF91bml4X2NobW9kKG5hbWUsIHBlcm1zKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UuY2htb2QpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2NobW9kOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmNobW9kKHJvb3QucmVzdCwgcGVybXMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVuYW1lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3Jcbi8vQWxpYXM6IHVuaXhfcmVuYW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVuYW1lKG8sIG4pIHtcbiAgdmFyIG9fcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG8pO1xuICB2YXIgbl9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobik7XG4gIGlmIChvX3Jvb3QuZGV2aWNlICE9PSBuX3Jvb3QuZGV2aWNlKVxuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gMSwgXCJFWERFVlwiLCBcInJlbmFtZVwiKTtcbiAgaWYgKCFvX3Jvb3QuZGV2aWNlLnJlbmFtZSkgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogbm90IGltcGxlbWVudGVkXCIpO1xuICBvX3Jvb3QuZGV2aWNlLnJlbmFtZShvX3Jvb3QucmVzdCwgbl9yb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbWtkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9ta2RpcihuYW1lLCBwZXJtKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubWtkaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X21rZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLm1rZGlyKHJvb3QucmVzdCwgcGVybSwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JtZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9ybWRpclxuZnVuY3Rpb24gY2FtbF91bml4X3JtZGlyKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5ybWRpcikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfcm1kaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uucm1kaXIocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG4vL0FsaWFzOiB1bml4X2xpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9saW5rKGZvbGxvdywgc3JjLCBkc3QpIHtcbiAgdmFyIHNyY19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uoc3JjKTtcbiAgdmFyIGRzdF9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2UoZHN0KTtcbiAgaWYgKCFzcmNfcm9vdC5kZXZpY2UubGluaykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfbGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIC8vIFdlIGNhbid0IGNvbnRyb2wgd2hldGhlciBhICdzcmMnIHN5bWxpbmsgaXMgZm9sbG93ZWQgb3Igbm90LlxuICAvLyBTbyB3ZSBmYWlsIHdoZW4gJ2ZvbGxvdycgaXMgc2V0LCBhcyBkb2N1bWVudGVkIGluIHRoZSBVbml4IG1vZHVsZS5cbiAgaWYgKHR5cGVvZiBmb2xsb3cgIT09IFwibnVtYmVyXCIpXG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoLyogcmFpc2UgVW5peF9lcnJvciAqLyAxLCBcIkVOT1NZU1wiLCBcImxpbmtcIik7XG4gIGlmIChzcmNfcm9vdC5kZXZpY2UgIT09IGRzdF9yb290LmRldmljZSlcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRVhERVZcIiwgXCJsaW5rXCIpO1xuICByZXR1cm4gc3JjX3Jvb3QuZGV2aWNlLmxpbmsoXG4gICAgc3JjX3Jvb3QucmVzdCxcbiAgICBkc3Rfcm9vdC5yZXN0LFxuICAgIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3N5bWxpbmtcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9BbGlhczogdW5peF9zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3ltbGluayh0b19kaXIsIHNyYywgZHN0KSB7XG4gIHZhciBkc3Rfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKGRzdCk7XG4gIGlmICghZHN0X3Jvb3QuZGV2aWNlLnN5bWxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N5bWxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gZHN0X3Jvb3QuZGV2aWNlLnN5bWxpbmsoXG4gICAgdG9fZGlyLFxuICAgIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHNyYyksXG4gICAgZHN0X3Jvb3QucmVzdCxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9yZWFkbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfcmVhZGxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkbGluayhuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVhZGxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3JlYWRsaW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnJlYWRsaW5rKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3VubGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfdW5saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfdW5saW5rKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS51bmxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3VubGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdXRpbWVzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF91dGltZXNcbmZ1bmN0aW9uIGNhbWxfdW5peF91dGltZXMobmFtZSwgYXRpbWUsIG10aW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudXRpbWVzKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF91dGltZXM6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByb290LmRldmljZS51dGltZXMocm9vdC5yZXN0LCBhdGltZSwgbXRpbWUsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdHJ1bmNhdGVcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3RydW5jYXRlXG5mdW5jdGlvbiBjYW1sX3VuaXhfdHJ1bmNhdGUobmFtZSwgbGVuKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudHJ1bmNhdGUpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RydW5jYXRlOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UudHJ1bmNhdGUocm9vdC5yZXN0LCBsZW4sIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdHJ1bmNhdGVfNjRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2ludDY0X3RvX2Zsb2F0XG4vL0FsaWFzOiB1bml4X3RydW5jYXRlXzY0XG5mdW5jdGlvbiBjYW1sX3VuaXhfdHJ1bmNhdGVfNjQobmFtZSwgbGVuKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudHJ1bmNhdGUpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3RydW5jYXRlXzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UudHJ1bmNhdGUoXG4gICAgcm9vdC5yZXN0LFxuICAgIGNhbWxfaW50NjRfdG9fZmxvYXQobGVuKSxcbiAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUsXG4gICk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfYWNjZXNzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9hY2Nlc3NcbmZ1bmN0aW9uIGNhbWxfdW5peF9hY2Nlc3MobmFtZSwgZmxhZ3MpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnIgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgZi53ID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGYueCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBmLmYgPSAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmxhZ3MgPSBmbGFnc1syXTtcbiAgfVxuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLmFjY2Vzcykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfYWNjZXNzOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcm9vdC5kZXZpY2UuYWNjZXNzKHJvb3QucmVzdCwgZiwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9vcGVuXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9zeXNfZmRzLCBNbENoYW5pZFxuLy9BbGlhczogdW5peF9vcGVuXG5mdW5jdGlvbiBjYW1sX3VuaXhfb3BlbihuYW1lLCBmbGFncywgcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUgKGZsYWdzKSB7XG4gICAgc3dpdGNoIChmbGFnc1sxXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmLnJkb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmLndyb25seSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBmLnJkd3IgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgZi5ub25ibG9jayA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBmLmFwcGVuZCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgICBmLmNyZWF0ZSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICBmLnRydW5jYXRlID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGYuZXhjbCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBmLm5vY3R0eSA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5OlxuICAgICAgICBmLmRzeW5jID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBmLnN5bmMgPSAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmxhZ3MgPSBmbGFnc1syXTtcbiAgfVxuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgZmlsZSA9IHJvb3QuZGV2aWNlLm9wZW4ocm9vdC5yZXN0LCBmLCBwZXJtcywgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgdmFyIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gIHZhciBjaGFuaWQgPSBuZXcgTWxDaGFuaWQoaWR4KTtcbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSB7IGZpbGU6IGZpbGUsIGNoYW5pZDogY2hhbmlkIH07XG4gIHJldHVybiBpZHggfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2ZkcywgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3JcbmZ1bmN0aW9uIGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgY21kKSB7XG4gIHZhciBmZF9kZXNjID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYgKGZkX2Rlc2MgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgY21kKTtcbiAgcmV0dXJuIGZkX2Rlc2MuZmlsZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZzdGF0XG4vL0FsaWFzOiB1bml4X2ZzdGF0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfdW5peF9mc3RhdChmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmc3RhdFwiKTtcbiAgaWYgKCFmaWxlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3RhdCgvKiBsYXJnZSAqLyBmYWxzZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9mc3RhdF82NFxuLy9BbGlhczogdW5peF9mc3RhdF82NFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX3VuaXhfZnN0YXRfNjQoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiZnN0YXRcIik7XG4gIGlmICghZmlsZS5zdGF0KSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9mc3RhdDY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3RhdCgvKiBsYXJnZSAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZjaG1vZFxuLy9BbGlhczogdW5peF9mY2htb2Rcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF91bml4X2ZjaG1vZChmZCwgcGVybXMpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiZmNobW9kXCIpO1xuICBpZiAoIWZpbGUuY2htb2QpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZjaG1vZDogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiBmaWxlLmNobW9kKHBlcm1zKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZzeW5jXG4vL0FsaWFzOiB1bml4X2ZzeW5jXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfdW5peF9mc3luYyhmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmc3luY1wiKTtcbiAgaWYgKCFmaWxlLnN5bmMpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2ZzeW5jOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIGZpbGUuc3luYygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfd3JpdGVcbi8vQWxpYXM6IHVuaXhfd3JpdGVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF91bml4X3dyaXRlKGZkLCBidWYsIHBvcywgbGVuKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcIndyaXRlXCIpO1xuICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgdmFyIHdyaXR0ZW4gPSAwO1xuICB3aGlsZSAobGVuID4gMCkge1xuICAgIHZhciBuID0gZmlsZS53cml0ZShhLCBwb3MsIGxlbiwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbiAgICB3cml0dGVuICs9IG47XG4gICAgcG9zICs9IG47XG4gICAgbGVuIC09IG47XG4gIH1cbiAgcmV0dXJuIHdyaXR0ZW47XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zaW5nbGVfd3JpdGVcbi8vQWxpYXM6IHVuaXhfc2luZ2xlX3dyaXRlXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfdW5peF9zaW5nbGVfd3JpdGUoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwid3JpdGVcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICByZXR1cm4gZmlsZS53cml0ZShcbiAgICBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZiksXG4gICAgcG9zLFxuICAgIGxlbixcbiAgICAvKiByYWlzZSB1bml4X2Vycm9yICovIDEsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF93cml0ZV9iaWdhcnJheVxuLy9BbGlhczogY2FtbF91bml4X2xvb2t1cF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5LCBjYW1sX3VuaXhfbG9va3VwX2ZpbGVcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX3VuaXhfd3JpdGVfYmlnYXJyYXkoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGEgPSBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJ1Zik7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcIndyaXRlXCIpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdoaWxlIChsZW4gPiAwKSB7XG4gICAgdmFyIG4gPSBmaWxlLndyaXRlKGEsIHBvcywgbGVuLCAvKiByYWlzZSB1bml4X2Vycm9yICovIDEpO1xuICAgIHdyaXR0ZW4gKz0gbjtcbiAgICBwb3MgKz0gbjtcbiAgICBsZW4gLT0gbjtcbiAgfVxuICByZXR1cm4gd3JpdHRlbjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRcbi8vQWxpYXM6IHVuaXhfcmVhZFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVhZChmZCwgYnVmLCBwb3MsIGxlbikge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJyZWFkXCIpO1xuICByZXR1cm4gZmlsZS5yZWFkKFxuICAgIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKSxcbiAgICBwb3MsXG4gICAgbGVuLFxuICAgIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSxcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRfYmlnYXJyYXlcbi8vQWxpYXM6IHVuaXhfcmVhZF9iaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV90b190eXBlZF9hcnJheSwgY2FtbF91bml4X2xvb2t1cF9maWxlXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF91bml4X3JlYWRfYmlnYXJyYXkoZmQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgdmFyIGEgPSBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJ1Zik7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcInJlYWRcIik7XG4gIHJldHVybiBmaWxlLnJlYWQoYSwgcG9zLCBsZW4sIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc2Vla1xuLy9BbGlhczogdW5peF9sc2Vla1xuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlXG5mdW5jdGlvbiBjYW1sX3VuaXhfbHNlZWsoZmQsIGxlbiwgd2hlbmNlKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImxzZWVrXCIpO1xuICByZXR1cm4gZmlsZS5zZWVrKGxlbiwgd2hlbmNlLCAvKiByYWlzZSB1bml4X2Vycm9yICovIDEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbHNlZWtfNjRcbi8vQWxpYXM6IHVuaXhfbHNlZWtfNjRcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9pbnQ2NF90b19mbG9hdFxuZnVuY3Rpb24gY2FtbF91bml4X2xzZWVrXzY0KGZkLCBsZW4sIHdoZW5jZSkge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJsc2Vla1wiKTtcbiAgcmV0dXJuIGZpbGUuc2VlayhjYW1sX2ludDY0X3RvX2Zsb2F0KGxlbiksIHdoZW5jZSwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Z0cnVuY2F0ZVxuLy9BbGlhczogdW5peF9mdHJ1bmNhdGVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF91bml4X2Z0cnVuY2F0ZShmZCwgbGVuKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImZ0cnVuY2F0ZVwiKTtcbiAgaWYgKCFmaWxlLnRydW5jYXRlKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9mdHJ1bmNhdGU6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBmaWxlLnRydW5jYXRlKGxlbiwgLyogcmFpc2UgdW5peF9lcnJvciAqLyAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9mdHJ1bmNhdGVfNjRcbi8vQWxpYXM6IHVuaXhfZnRydW5jYXRlXzY0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9va3VwX2ZpbGUsIGNhbWxfZmFpbHdpdGgsIGNhbWxfaW50NjRfdG9fZmxvYXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9mdHJ1bmNhdGVfNjQoZmQsIGxlbikge1xuICB2YXIgZmlsZSA9IGNhbWxfdW5peF9sb29rdXBfZmlsZShmZCwgXCJmdHJ1bmNhdGVcIik7XG4gIGlmICghZmlsZS50cnVuY2F0ZSkge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfZnRydW5jYXRlXzY0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZmlsZS50cnVuY2F0ZShjYW1sX2ludDY0X3RvX2Zsb2F0KGxlbiksIC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfY2xvc2Vcbi8vQWxpYXM6IHVuaXhfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZVxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlKGZkKSB7XG4gIHZhciBmaWxlID0gY2FtbF91bml4X2xvb2t1cF9maWxlKGZkLCBcImNsb3NlXCIpO1xuICBmaWxlLmNsb3NlKC8qIHJhaXNlIHVuaXhfZXJyb3IgKi8gMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaW5jaGFubmVsX29mX2ZpbGVkZXNjclxuLy9BbGlhczogdW5peF9pbmNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB3aW5faW5jaGFubmVsX29mX2ZpbGVkZXNjclxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvb2t1cF9maWxlLCBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblxuZnVuY3Rpb24gY2FtbF91bml4X2luY2hhbm5lbF9vZl9maWxlZGVzY3IoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwiaW5fY2hhbm5lbF9vZl9kZXNjclwiKTtcbiAgZmlsZS5jaGVja19zdHJlYW1fc2VtYW50aWNzKFwiaW5fY2hhbm5lbF9vZl9kZXNjclwiKTtcbiAgcmV0dXJuIGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luKGZkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X291dGNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB1bml4X291dGNoYW5uZWxfb2ZfZmlsZWRlc2NyXG4vL0FsaWFzOiB3aW5fb3V0Y2hhbm5lbF9vZl9maWxlZGVzY3Jcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb29rdXBfZmlsZSwgY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XG5mdW5jdGlvbiBjYW1sX3VuaXhfb3V0Y2hhbm5lbF9vZl9maWxlZGVzY3IoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3VuaXhfbG9va3VwX2ZpbGUoZmQsIFwib3V0X2NoYW5uZWxfb2ZfZGVzY3JcIik7XG4gIGZpbGUuY2hlY2tfc3RyZWFtX3NlbWFudGljcyhcIm91dF9jaGFubmVsX29mX2Rlc2NyXCIpO1xuICByZXR1cm4gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0KGZkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldHVpZFxuLy9BbGlhczogdW5peF9nZXR1aWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXR1aWQoX3VuaXQpIHtcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZ2V0dWlkKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXR1aWQoKTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldGV1aWRcbi8vQWxpYXM6IHVuaXhfZ2V0ZXVpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldGV1aWQoX3VuaXQpIHtcbiAgaWYgKGdsb2JhbFRoaXMucHJvY2Vzcz8uZ2V0ZXVpZCkge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0ZXVpZCgpO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0Z2lkXG4vL0FsaWFzOiB1bml4X2dldGdpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldGdpZChfdW5pdCkge1xuICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzPy5nZXRnaWQpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5wcm9jZXNzLmdldGdpZCgpO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0ZWdpZFxuLy9BbGlhczogdW5peF9nZXRlZ2lkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0ZWdpZChfdW5pdCkge1xuICBpZiAoZ2xvYmFsVGhpcy5wcm9jZXNzPy5nZXRlZ2lkKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXRlZ2lkKCk7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXRwd25hbVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vQWxpYXM6IHVuaXhfZ2V0cHduYW1cbi8vQWxpYXM6IGNhbWxfdW5peF9nZXRwd3VpZFxuLy9BbGlhczogdW5peF9nZXRwd3VpZFxuLy9BbGlhczogY2FtbF91bml4X2dldGdybmFtXG4vL0FsaWFzOiB1bml4X2dldGdybmFtXG4vL0FsaWFzOiBjYW1sX3VuaXhfZ2V0Z3JnaWRcbi8vQWxpYXM6IHVuaXhfZ2V0Z3JnaWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXRwd25hbShfdW5pdCkge1xuICBjYW1sX3JhaXNlX25vdF9mb3VuZCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaGFzX3N5bWxpbmtcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0FsaWFzOiB1bml4X2hhc19zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfaGFzX3N5bWxpbmsoX3VuaXQpIHtcbiAgcmV0dXJuIGZzX25vZGVfc3VwcG9ydGVkKCkgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X29wZW5kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X29wZW5kaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShwYXRoKTtcbiAgaWYgKCFyb290LmRldmljZS5vcGVuZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9vcGVuZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFyIGRpcl9oYW5kbGUgPSByb290LmRldmljZS5vcGVuZGlyKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIHsgcG9pbnRlcjogZGlyX2hhbmRsZSwgcGF0aDogcGF0aCB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG4vL0FsaWFzOiB1bml4X3JlYWRkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkZGlyKGRpcl9oYW5kbGUpIHtcbiAgdmFyIGVudHJ5O1xuICB0cnkge1xuICAgIGVudHJ5ID0gZGlyX2hhbmRsZS5wb2ludGVyLnJlYWRTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgXCJyZWFkZGlyXCIpO1xuICB9XG4gIGlmIChlbnRyeSA9PT0gbnVsbCkge1xuICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoZW50cnkubmFtZSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Nsb3NlZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuLy9BbGlhczogdW5peF9jbG9zZWRpclxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlZGlyKGRpcl9oYW5kbGUpIHtcbiAgdHJ5IHtcbiAgICBkaXJfaGFuZGxlLnBvaW50ZXIuY2xvc2VTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcigvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIFwiRUJBREZcIiwgXCJjbG9zZWRpclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmV3aW5kZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfY2xvc2VkaXIsIGNhbWxfdW5peF9vcGVuZGlyXG4vL0FsaWFzOiB1bml4X3Jld2luZGRpclxuZnVuY3Rpb24gY2FtbF91bml4X3Jld2luZGRpcihkaXJfaGFuZGxlKSB7XG4gIGNhbWxfdW5peF9jbG9zZWRpcihkaXJfaGFuZGxlKTtcbiAgdmFyIG5ld19kaXJfaGFuZGxlID0gY2FtbF91bml4X29wZW5kaXIoZGlyX2hhbmRsZS5wYXRoKTtcbiAgZGlyX2hhbmRsZS5wb2ludGVyID0gbmV3X2Rpcl9oYW5kbGUucG9pbnRlcjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kZmlyc3Rcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF91bml4X29wZW5kaXIsIGNhbWxfdW5peF9yZWFkZGlyXG4vL0FsaWFzOiB3aW5fZmluZGZpcnN0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZGZpcnN0KHBhdGgpIHtcbiAgLy8gVGhlIFdpbmRvd3MgY29kZSBhZGRzIHRoaXMgZ2xvYiB0byB0aGUgcGF0aCwgc28gd2UgbmVlZCB0byByZW1vdmUgaXRcbiAgdmFyIHBhdGhfanMgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwYXRoKTtcbiAgcGF0aF9qcyA9IHBhdGhfanMucmVwbGFjZSgvKF58W1xcXFwvXSlcXCpcXC5cXCokLywgXCJcIik7XG4gIHBhdGggPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhwYXRoX2pzKTtcbiAgLy8gKi4qIGlzIG5vdyBzdHJpcHBlZFxuICB2YXIgZGlyX2hhbmRsZSA9IGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpO1xuICB2YXIgZmlyc3RfZW50cnkgPSBjYW1sX3VuaXhfcmVhZGRpcihkaXJfaGFuZGxlKTtcbiAgLy8gVGhlIFdpbmRvd3MgYmluZGluZ3MgdHlwZSBkaXJfaGFuZGxlIGFzIGFuIGBpbnRgIGJ1dCBpdCdzIG5vdCBpbiBKU1xuICByZXR1cm4gWzAsIGZpcnN0X2VudHJ5LCBkaXJfaGFuZGxlXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbmRuZXh0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9BbGlhczogd2luX2ZpbmRuZXh0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZG5leHQoZGlyX2hhbmRsZSkge1xuICByZXR1cm4gY2FtbF91bml4X3JlYWRkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9jbG9zZWRpclxuLy9BbGlhczogd2luX2ZpbmRjbG9zZVxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbmRjbG9zZShkaXJfaGFuZGxlKSB7XG4gIHJldHVybiBjYW1sX3VuaXhfY2xvc2VkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nIGNvbnN0XG4vL0FsaWFzOiB1bml4X2luZXRfYWRkcl9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmdzLCBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihyYWlzZV91bml4LCBjb2RlLCBjbWQsIG1zZywgcGF0aCkge1xuICB2YXIgdW5peF9lcnJvciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJVbml4LlVuaXhfZXJyb3JcIik7XG4gIGlmIChyYWlzZV91bml4ICYmIHVuaXhfZXJyb3IpXG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIGNtZCwgcGF0aCkpO1xuICBlbHNlIHtcbiAgICB2YXIgbXNnID0gY29kZSArIFwiOiBcIiArIG1zZyArIFwiLCBcIiArIGNtZDtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSBtc2cgKz0gXCIgJ1wiICsgcGF0aCArIFwiJ1wiO1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG1zZyk7XG4gIH1cbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gRHVtbXkgZmlsZXN5c3RlbVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3RyYWlsaW5nX3NsYXNoKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIiA/IG5hbWUgKyBcIi9cIiA6IG5hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VycmVudF9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfdHJhaWxpbmdfc2xhc2gsIGZzX25vZGVfc3VwcG9ydGVkXG5pZiAoZnNfbm9kZV9zdXBwb3J0ZWQoKSAmJiBnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmN3ZClcbiAgdmFyIGNhbWxfY3VycmVudF9kaXIgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5lbHNlIHZhciBjYW1sX2N1cnJlbnRfZGlyID0gXCIvc3RhdGljXCI7XG5jYW1sX2N1cnJlbnRfZGlyID0gY2FtbF90cmFpbGluZ19zbGFzaChjYW1sX2N1cnJlbnRfZGlyKTtcblxuLy9Qcm92aWRlczogY2FtbF9nZXRfcm9vdFxuLy9SZXF1aXJlczogcGF0aF9pc19hYnNvbHV0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfcm9vdChwYXRoKSB7XG4gIHZhciB4ID0gcGF0aF9pc19hYnNvbHV0ZShwYXRoKTtcbiAgaWYgKCF4KSByZXR1cm47XG4gIHJldHVybiB4WzBdICsgXCIvXCI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcm9vdFxuLy9SZXF1aXJlczogY2FtbF9nZXRfcm9vdCwgY2FtbF9jdXJyZW50X2RpciwgY2FtbF9mYWlsd2l0aFxudmFyIGNhbWxfcm9vdCA9XG4gIGNhbWxfZ2V0X3Jvb3QoY2FtbF9jdXJyZW50X2RpcikgfHxcbiAgY2FtbF9mYWlsd2l0aChcInVuYWJsZSB0byBjb21wdXRlIGNhbWxfcm9vdFwiKTtcblxuLy9Qcm92aWRlczogTWxGaWxlXG5mdW5jdGlvbiBNbEZpbGUoKSB7fVxuXG4vL1Byb3ZpZGVzOiBwYXRoX2lzX2Fic29sdXRlXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9SZXF1aXJlczoganNvb19pc193aW4zMlxuZnVuY3Rpb24gbWFrZV9wYXRoX2lzX2Fic29sdXRlKCkge1xuICBmdW5jdGlvbiBwb3NpeChwYXRoKSB7XG4gICAgaWYgKHBhdGguY2hhckF0KDApID09PSBcIi9cIikgcmV0dXJuIFtcIlwiLCBwYXRoLnNsaWNlKDEpXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiB3aW4zMihwYXRoKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvYjNmY2MyNDVmYjI1NTM5OTA5ZWYxZDVlYWEwMWRiZjkyZTE2ODYzMy9saWIvcGF0aC5qcyNMNTZcbiAgICB2YXIgc3BsaXREZXZpY2VSZSA9XG4gICAgICAvXihbYS16QS1aXTp8W1xcXFwvXXsyfVteXFxcXC9dK1tcXFxcL10rW15cXFxcL10rKT8oW1xcXFwvXSk/KFtcXHNcXFNdKj8pJC87XG4gICAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhwYXRoKTtcbiAgICB2YXIgZGV2aWNlID0gcmVzdWx0WzFdIHx8IFwiXCI7XG4gICAgdmFyIGlzVW5jID0gZGV2aWNlLmxlbmd0aCA+IDAgJiYgZGV2aWNlLmNoYXJBdCgxKSAhPT0gXCI6XCI7XG5cbiAgICAvLyBVTkMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZVxuICAgIGlmIChyZXN1bHRbMl0gfHwgaXNVbmMpIHtcbiAgICAgIHZhciByb290ID0gcmVzdWx0WzFdIHx8IFwiXCI7XG4gICAgICB2YXIgc2VwID0gcmVzdWx0WzJdIHx8IFwiXCI7XG4gICAgICByZXR1cm4gW3Jvb3QsIHBhdGguc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKV07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4ganNvb19pc193aW4zMiA/IHdpbjMyIDogcG9zaXg7XG59XG52YXIgcGF0aF9pc19hYnNvbHV0ZSA9IG1ha2VfcGF0aF9pc19hYnNvbHV0ZSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfcGF0aFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpclxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfbWFrZV9wYXRoKG5hbWUpIHtcbiAgbmFtZSA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpO1xuICBpZiAoIXBhdGhfaXNfYWJzb2x1dGUobmFtZSkpIG5hbWUgPSBjYW1sX2N1cnJlbnRfZGlyICsgbmFtZTtcbiAgdmFyIGNvbXAwID0gcGF0aF9pc19hYnNvbHV0ZShuYW1lKTtcbiAgdmFyIGNvbXAgPSBjb21wMFsxXS5zcGxpdCgvWy9cXFxcXS8pO1xuICB2YXIgbmNvbXAgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChjb21wW2ldKSB7XG4gICAgICBjYXNlIFwiLi5cIjpcbiAgICAgICAgbmNvbXAucG9wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIi5cIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbmNvbXAucHVzaChjb21wW2ldKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIG5jb21wLnVuc2hpZnQoY29tcDBbMF0pO1xuICBuY29tcC5vcmlnID0gbmFtZTtcbiAgcmV0dXJuIG5jb21wO1xufVxuXG4vL1Byb3ZpZGVzOmpzb29fbW91bnRfcG9pbnRcbi8vUmVxdWlyZXM6IE1sRmFrZURldmljZSwgTWxOb2RlRGV2aWNlLCBjYW1sX3Jvb3QsIGZzX25vZGVfc3VwcG9ydGVkXG52YXIganNvb19tb3VudF9wb2ludCA9IFtdO1xuaWYgKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgICBwYXRoOiBjYW1sX3Jvb3QsXG4gICAgZGV2aWNlOiBuZXcgTWxOb2RlRGV2aWNlKGNhbWxfcm9vdCksXG4gIH0pO1xufSBlbHNlIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgICBwYXRoOiBjYW1sX3Jvb3QsXG4gICAgZGV2aWNlOiBuZXcgTWxGYWtlRGV2aWNlKGNhbWxfcm9vdCksXG4gIH0pO1xufVxuanNvb19tb3VudF9wb2ludC5wdXNoKHtcbiAgcGF0aDogXCIvc3RhdGljL1wiLFxuICBkZXZpY2U6IG5ldyBNbEZha2VEZXZpY2UoXCIvc3RhdGljL1wiKSxcbn0pO1xuXG4vL1Byb3ZpZGVzOmNhbWxfbGlzdF9tb3VudF9wb2ludFxuLy9SZXF1aXJlczoganNvb19tb3VudF9wb2ludCwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbGlzdF9tb3VudF9wb2ludCgpIHtcbiAgdmFyIHByZXYgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb2xkID0gcHJldjtcbiAgICBwcmV2ID0gWzAsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGpzb29fbW91bnRfcG9pbnRbaV0ucGF0aCksIG9sZF07XG4gIH1cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8vUHJvdmlkZXM6IHJlc29sdmVfZnNfZGV2aWNlXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfcGF0aCwganNvb19tb3VudF9wb2ludCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfZ2V0X3Jvb3QsIE1sTm9kZURldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpIHtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBwYXRoLmpvaW4oXCIvXCIpO1xuICB2YXIgbmFtZV9zbGFzaCA9IGNhbWxfdHJhaWxpbmdfc2xhc2gobmFtZSk7XG4gIHZhciByZXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtID0ganNvb19tb3VudF9wb2ludFtpXTtcbiAgICBpZiAoXG4gICAgICBuYW1lX3NsYXNoLnNlYXJjaChtLnBhdGgpID09PSAwICYmXG4gICAgICAoIXJlcyB8fCByZXMucGF0aC5sZW5ndGggPCBtLnBhdGgubGVuZ3RoKVxuICAgIClcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgcGF0aDogbS5wYXRoLFxuICAgICAgICBkZXZpY2U6IG0uZGV2aWNlLFxuICAgICAgICByZXN0OiBuYW1lLnNsaWNlKG0ucGF0aC5sZW5ndGgsIG5hbWUubGVuZ3RoKSxcbiAgICAgIH07XG4gIH1cbiAgaWYgKCFyZXMgJiYgZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgIHZhciByb290ID0gY2FtbF9nZXRfcm9vdChuYW1lKTtcbiAgICBpZiAocm9vdD8ubWF0Y2goL15bYS16QS1aXTpcXC8kLykpIHtcbiAgICAgIHZhciBtID0geyBwYXRoOiByb290LCBkZXZpY2U6IG5ldyBNbE5vZGVEZXZpY2Uocm9vdCkgfTtcbiAgICAgIGpzb29fbW91bnRfcG9pbnQucHVzaChtKTtcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgcGF0aDogbS5wYXRoLFxuICAgICAgICBkZXZpY2U6IG0uZGV2aWNlLFxuICAgICAgICByZXN0OiBuYW1lLnNsaWNlKG0ucGF0aC5sZW5ndGgsIG5hbWUubGVuZ3RoKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHJldHVybiByZXM7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwibm8gZGV2aWNlIGZvdW5kIGZvciBcIiArIG5hbWVfc2xhc2gpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21vdW50X2F1dG9sb2FkXG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIGNhbWxfbWFrZV9wYXRoLCBqc29vX21vdW50X3BvaW50LCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX21vdW50X2F1dG9sb2FkKG5hbWUsIGYpIHtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKHBhdGguam9pbihcIi9cIikpO1xuICBqc29vX21vdW50X3BvaW50LnB1c2goeyBwYXRoOiBuYW1lLCBkZXZpY2U6IG5ldyBNbEZha2VEZXZpY2UobmFtZSwgZikgfSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VubW91bnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfbWFrZV9wYXRoLCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3VubW91bnQobmFtZSkge1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocGF0aC5qb2luKFwiL1wiKSk7XG4gIHZhciBpZHggPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29vX21vdW50X3BvaW50Lmxlbmd0aDsgaSsrKVxuICAgIGlmIChqc29vX21vdW50X3BvaW50W2ldLnBhdGggPT09IG5hbWUpIGlkeCA9IGk7XG4gIGlmIChpZHggPiAtMSkganNvb19tb3VudF9wb2ludC5zcGxpY2UoaWR4LCAxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGN3ZFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vQWxpYXM6IGNhbWxfdW5peF9nZXRjd2Rcbi8vQWxpYXM6IHVuaXhfZ2V0Y3dkXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRjd2QoKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhjYW1sX2N1cnJlbnRfZGlyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY2hkaXJcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9kaXIsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N5c19jaGRpcihkaXIsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShkaXIpO1xuICBpZiAocm9vdC5kZXZpY2UuaXNfZGlyKHJvb3QucmVzdCkpIHtcbiAgICBpZiAocm9vdC5yZXN0KVxuICAgICAgY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocm9vdC5wYXRoICsgcm9vdC5yZXN0KTtcbiAgICBlbHNlIGNhbWxfY3VycmVudF9kaXIgPSByb290LnBhdGg7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAocm9vdC5kZXZpY2UuZXhpc3RzKHJvb3QucmVzdCkpIHtcbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgIHJhaXNlX3VuaXgsXG4gICAgICBcIkVOT1RESVJcIixcbiAgICAgIFwiY2hkaXJcIixcbiAgICAgIFwibm90IGEgZGlyZWN0b3J5XCIsXG4gICAgICBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhkaXIpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoZGlyKSwgcmFpc2VfdW5peCk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShuYW1lLCByYWlzZV91bml4KSB7XG4gIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgIHJhaXNlX3VuaXgsXG4gICAgXCJFTk9FTlRcIixcbiAgICBcIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIixcbiAgICBuYW1lLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19maWxlX2V4aXN0c1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX2ZpbGVfZXhpc3RzKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeShuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBhID0gcm9vdC5kZXZpY2UucmVhZGRpcihyb290LnJlc3QpO1xuICB2YXIgbCA9IG5ldyBBcnJheShhLmxlbmd0aCArIDEpO1xuICBsWzBdID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBsW2kgKyAxXSA9IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGFbaV0pO1xuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVtb3ZlXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfcmVtb3ZlKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc19kaXJlY3Rvcnlcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19pc19kaXJlY3RvcnkobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgYSA9IHJvb3QuZGV2aWNlLmlzX2Rpcihyb290LnJlc3QpO1xuICByZXR1cm4gYSA/IDEgOiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZW5hbWVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZW5hbWUobywgbikge1xuICB2YXIgb19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobyk7XG4gIHZhciBuX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuKTtcbiAgaWYgKG9fcm9vdC5kZXZpY2UgIT09IG5fcm9vdC5kZXZpY2UpXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogY2Fubm90IG1vdmUgZmlsZSBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtXCIpO1xuICBpZiAoIW9fcm9vdC5kZXZpY2UucmVuYW1lKSBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zeXNfcmVuYW1lOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIG9fcm9vdC5kZXZpY2UucmVuYW1lKG9fcm9vdC5yZXN0LCBuX3Jvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX21rZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfbWtkaXIobmFtZSwgcGVybSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByb290LmRldmljZS5ta2Rpcihyb290LnJlc3QsIHBlcm0pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcm1kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19ybWRpcihuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJvb3QuZGV2aWNlLnJtZGlyKHJvb3QucmVzdCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX21hcF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2JhX21hcF9maWxlKF92ZmQsIF9raW5kLCBfbGF5b3V0LCBfc2hhcmVkLCBfZGltcywgX3Bvcykge1xuICAvLyB2YXIgZGF0YSA9IGNhbWxfc3lzX2Zkc1t2ZmRdO1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9iYV9tYXBfZmlsZSBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfbWFwX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGUoYXJndiwgX2FyZ24pIHtcbiAgLy8gYXJnbiA9PT0gNlxuICByZXR1cm4gY2FtbF9iYV9tYXBfZmlsZShhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdLCBhcmd2WzNdLCBhcmd2WzRdLCBhcmd2WzVdKTtcbn1cblxuLy9Qcm92aWRlczoganNvb19jcmVhdGVfZmlsZV9leHRlcm5cbmZ1bmN0aW9uIGpzb29fY3JlYXRlX2ZpbGVfZXh0ZXJuKG5hbWUsIGNvbnRlbnQpIHtcbiAgaWYgKGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZSkgZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpO1xuICBlbHNlIHtcbiAgICBpZiAoIWdsb2JhbFRoaXMuanNvb19mc190bXApIGdsb2JhbFRoaXMuanNvb19mc190bXAgPSBbXTtcbiAgICBnbG9iYWxUaGlzLmpzb29fZnNfdG1wLnB1c2goeyBuYW1lOiBuYW1lLCBjb250ZW50OiBjb250ZW50IH0pO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZzX2luaXRcbi8vUmVxdWlyZXM6IGpzb29fY3JlYXRlX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfZnNfaW5pdCgpIHtcbiAgdmFyIHRtcCA9IGdsb2JhbFRoaXMuanNvb19mc190bXA7XG4gIGlmICh0bXApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykge1xuICAgICAganNvb19jcmVhdGVfZmlsZSh0bXBbaV0ubmFtZSwgdG1wW2ldLmNvbnRlbnQpO1xuICAgIH1cbiAgfVxuICBnbG9iYWxUaGlzLmpzb29fY3JlYXRlX2ZpbGUgPSBqc29vX2NyZWF0ZV9maWxlO1xuICBnbG9iYWxUaGlzLmpzb29fZnNfdG1wID0gW107XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVnaXN0ZXIpIGNhbWxfZmFpbHdpdGgoXCJjYW5ub3QgcmVnaXN0ZXIgZmlsZVwiKTtcbiAgcm9vdC5kZXZpY2UucmVnaXN0ZXIocm9vdC5yZXN0LCBjb250ZW50KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29fY3JlYXRlX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2ZpbGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBqc29vX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpIHtcbiAgdmFyIG5hbWUgPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhuYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNvbnRlbnQpO1xuICByZXR1cm4gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWFkX2ZpbGVfY29udGVudFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlYWRfZmlsZV9jb250ZW50KG5hbWUpIHtcbiAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiA/IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG5hbWUpIDogbmFtZTtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpKSB7XG4gICAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCwgeyByZG9ubHk6IDEgfSk7XG4gICAgdmFyIGxlbiA9IGZpbGUubGVuZ3RoKCk7XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZmlsZS5yZWFkKGJ1ZiwgMCwgbGVuLCBmYWxzZSk7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGJ1Zik7XG4gIH1cbiAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSkpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogTWxGYWtlRGV2aWNlXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlLCBNbEZha2VGZCwgY2FtbF9jcmVhdGVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfYXJyYXksIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuY2xhc3MgTWxGYWtlRGV2aWNlIHtcbiAgY29uc3RydWN0b3Iocm9vdCwgZikge1xuICAgIHRoaXMuY29udGVudCA9IHt9O1xuICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgdGhpcy5sb29rdXBGdW4gPSBmO1xuICB9XG5cbiAgbm0obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJvb3QgKyBuYW1lO1xuICB9XG5cbiAgY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSkge1xuICAgIHZhciBjb21wID0gbmFtZS5zcGxpdChcIi9cIik7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgcmVzICs9IGNvbXBbaV0gKyBcIi9cIjtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbcmVzXSkgY29udGludWU7XG4gICAgICB0aGlzLmNvbnRlbnRbcmVzXSA9IFN5bWJvbChcImRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cblxuICBzbGFzaChuYW1lKSB7XG4gICAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpID8gbmFtZSA6IG5hbWUgKyBcIi9cIjtcbiAgfVxuXG4gIGxvb2t1cChuYW1lKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRbbmFtZV0gJiYgdGhpcy5sb29rdXBGdW4pIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLmxvb2t1cEZ1bihcbiAgICAgICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcodGhpcy5yb290KSxcbiAgICAgICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobmFtZSksXG4gICAgICApO1xuICAgICAgaWYgKHJlcyAhPT0gMCkge1xuICAgICAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX3N0cmluZyhyZXNbMV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleGlzdHMobmFtZSwgZG9fbm90X2xvb2t1cCkge1xuICAgIC8vIFRoZSByb290IG9mIHRoZSBkZXZpY2UgZXhpc3RzXG4gICAgaWYgKG5hbWUgPT09IFwiXCIpIHJldHVybiAxO1xuICAgIC8vIENoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgICBpZiAodGhpcy5jb250ZW50W25hbWVfc2xhc2hdKSByZXR1cm4gMTtcbiAgICAvLyBDaGVjayBpZiBhIGZpbGUgZXhpc3RzXG4gICAgaWYgKCFkb19ub3RfbG9va3VwKSB0aGlzLmxvb2t1cChuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50W25hbWVdID8gMSA6IDA7XG4gIH1cblxuICBpc0ZpbGUobmFtZSkge1xuICAgIGlmICh0aGlzLmV4aXN0cyhuYW1lKSAmJiAhdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICByZW5hbWVfZGlyKG9sZG5hbWUsIG5ld25hbWUpIHtcbiAgICBpZiAodGhpcy5leGlzdHMobmV3bmFtZSkpIHtcbiAgICAgIGlmICghdGhpcy5pc19kaXIobmV3bmFtZSkpIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgICAgdGhpcy5ubShuZXduYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWFkZGlyKG5ld25hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuZXduYW1lKSArIFwiIDogZGlyZWN0b3J5IG5vdCBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9sZF9zbGFzaCA9IHRoaXMuc2xhc2gob2xkbmFtZSk7XG4gICAgdmFyIG5ld19zbGFzaCA9IHRoaXMuc2xhc2gobmV3bmFtZSk7XG4gICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuZXdfc2xhc2gpO1xuICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLnJlYWRkaXIob2xkbmFtZSkpIHtcbiAgICAgIHRoaXMucmVuYW1lKG9sZF9zbGFzaCArIGYsIG5ld19zbGFzaCArIGYpO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5jb250ZW50W29sZF9zbGFzaF07XG4gIH1cblxuICByZW5hbWUob2xkbmFtZSwgbmV3bmFtZSkge1xuICAgIGlmICghdGhpcy5leGlzdHMob2xkbmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG9sZG5hbWUpICsgXCIgOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICAgIGlmICh0aGlzLmlzX2RpcihvbGRuYW1lKSkge1xuICAgICAgdGhpcy5yZW5hbWVfZGlyKG9sZG5hbWUsIG5ld25hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5leGlzdHMobmV3bmFtZSkgJiYgdGhpcy5pc19kaXIobmV3bmFtZSkpIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgICAgdGhpcy5ubShuZXduYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFtuZXduYW1lXSA9IHRoaXMuY29udGVudFtvbGRuYW1lXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNvbnRlbnRbb2xkbmFtZV07XG4gICAgfVxuICB9XG5cbiAgbWtkaXIobmFtZSwgX21vZGUsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5leGlzdHMobmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFRVhJU1RcIixcbiAgICAgICAgXCJta2RpclwiLFxuICAgICAgICBcImZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICk7XG4gICAgdmFyIHBhcmVudCA9IC9eKC4qKVxcL1teL10rLy5leGVjKG5hbWUpO1xuICAgIHBhcmVudCA9IHBhcmVudD8uWzFdIHx8IFwiXCI7XG4gICAgaWYgKCF0aGlzLmV4aXN0cyhwYXJlbnQpKVxuICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgIFwiRU5PRU5UXCIsXG4gICAgICAgIFwibWtkaXJcIixcbiAgICAgICAgXCJubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsXG4gICAgICAgIHRoaXMubm0obmFtZSksXG4gICAgICApO1xuICAgIGlmICghdGhpcy5pc19kaXIocGFyZW50KSlcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICByYWlzZV91bml4LFxuICAgICAgICBcIkVOT1RESVJcIixcbiAgICAgICAgXCJta2RpclwiLFxuICAgICAgICBcIm5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgKTtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKHRoaXMuc2xhc2gobmFtZSkpO1xuICB9XG5cbiAgcm1kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHZhciBuYW1lX3NsYXNoID0gbmFtZSA9PT0gXCJcIiA/IFwiXCIgOiB0aGlzLnNsYXNoKG5hbWUpO1xuICAgIGlmICghdGhpcy5leGlzdHMobmFtZSkpXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFTk9FTlRcIixcbiAgICAgICAgXCJybWRpclwiLFxuICAgICAgICBcIm5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIixcbiAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICk7XG4gICAgaWYgKCF0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICByYWlzZV91bml4LFxuICAgICAgICBcIkVOT1RESVJcIixcbiAgICAgICAgXCJybWRpclwiLFxuICAgICAgICBcIm5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgKTtcbiAgICBmb3IgKHZhciBuIGluIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKG4uc3RhcnRzV2l0aChuYW1lX3NsYXNoKSAmJiBuICE9PSBuYW1lX3NsYXNoKVxuICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICByYWlzZV91bml4LFxuICAgICAgICAgIFwiRU5PVEVNUFRZXCIsXG4gICAgICAgICAgXCJybWRpclwiLFxuICAgICAgICAgIFwiZGlyZWN0b3J5IG5vdCBlbXB0eVwiLFxuICAgICAgICAgIHRoaXMubm0obmFtZSksXG4gICAgICAgICk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF07XG4gIH1cblxuICByZWFkZGlyKG5hbWUpIHtcbiAgICB2YXIgbmFtZV9zbGFzaCA9IG5hbWUgPT09IFwiXCIgPyBcIlwiIDogdGhpcy5zbGFzaChuYW1lKTtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKG5hbWUpKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgICB2YXIgc2VlbiA9IHt9O1xuICAgIHZhciBhID0gW107XG4gICAgZm9yICh2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmIChuLnN0YXJ0c1dpdGgobmFtZV9zbGFzaCkgJiYgbiAhPT0gbmFtZV9zbGFzaCkge1xuICAgICAgICB2YXIgbGFzdCA9IG4uaW5kZXhPZihcIi9cIiwgbmFtZV9zbGFzaC5sZW5ndGgpO1xuICAgICAgICBpZiAobGFzdCA8IDApIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtID0gbi5zbGljZShuYW1lX3NsYXNoLmxlbmd0aCwgbGFzdCk7XG4gICAgICAgIGlmIChtICYmICFzZWVuW21dKSB7XG4gICAgICAgICAgc2VlblttXSA9IHRydWU7XG4gICAgICAgICAgYS5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG5cbiAgb3BlbmRpcihuYW1lLCByYWlzZV91bml4KSB7XG4gICAgdmFyIGEgPSB0aGlzLnJlYWRkaXIobmFtZSk7XG4gICAgdmFyIGMgPSBmYWxzZTtcbiAgICB2YXIgaSA9IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlYWRTeW5jOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjKVxuICAgICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICAgIFwiRUJBREZcIixcbiAgICAgICAgICAgIFwicmVhZGRpclwiLFxuICAgICAgICAgICAgXCJiYWQgZmlsZSBkZXNjcmlwdG9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGkgPT09IGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGVudHJ5ID0gYVtpXTtcbiAgICAgICAgaSsrO1xuICAgICAgICByZXR1cm4geyBuYW1lOiBlbnRyeSB9O1xuICAgICAgfSxcbiAgICAgIGNsb3NlU3luYzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYylcbiAgICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgICBcIkVCQURGXCIsXG4gICAgICAgICAgICBcInJlYWRkaXJcIixcbiAgICAgICAgICAgIFwiYmFkIGZpbGUgZGVzY3JpcHRvclwiLFxuICAgICAgICAgICk7XG4gICAgICAgIGMgPSB0cnVlO1xuICAgICAgICBhID0gW107XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpc19kaXIobmFtZSkge1xuICAgIGlmIChuYW1lID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgbmFtZV9zbGFzaCA9IHRoaXMuc2xhc2gobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lX3NsYXNoXSA/IDEgOiAwO1xuICB9XG5cbiAgdW5saW5rKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKG5hbWUsIHRydWUpKSB7XG4gICAgICAvLyBbdHJ1ZV0gbWVhbnMgbm8gXCJsb29rdXBcIiBpZiBub3QgZm91bmQuXG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFTk9FTlRcIixcbiAgICAgICAgXCJ1bmxpbmtcIixcbiAgICAgICAgXCJubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIsXG4gICAgICAgIG5hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5jb250ZW50W25hbWVdO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgYWNjZXNzKG5hbWUsIF9mbGFncywgcmFpc2VfdW5peCkge1xuICAgIHRoaXMubG9va3VwKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICBcIkVBQ0NFU1NcIixcbiAgICAgICAgICBcImFjY2Vzc1wiLFxuICAgICAgICAgIFwicGVybWlzc2lvbiBkZW5pZWQsXCIsXG4gICAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUodGhpcy5ubShuYW1lKSwgcmFpc2VfdW5peCk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgb3BlbihuYW1lLCBmLCBfcGVybXMsIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgZmlsZTtcbiAgICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgICBpZiAodGhpcy5jb250ZW50W25hbWVdKSB7XG4gICAgICBpZiAodGhpcy5pc19kaXIobmFtZSkpXG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgXCJFSVNESVJcIixcbiAgICAgICAgICBcIm9wZW5cIixcbiAgICAgICAgICBcImlsbGVnYWwgb3BlcmF0aW9uIG9uIGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICAgdGhpcy5ubShuYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIGlmIChmLmNyZWF0ZSAmJiBmLmV4Y2wpXG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgICAgXCJFRVhJU1RcIixcbiAgICAgICAgICBcIm9wZW5cIixcbiAgICAgICAgICBcImZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICAgIGlmIChmLnRydW5jYXRlKSBmaWxlLnRydW5jYXRlKDApO1xuICAgIH0gZWxzZSBpZiAoZi5jcmVhdGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSh0aGlzLm5tKG5hbWUpLCByYWlzZV91bml4KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNbEZha2VGZCh0aGlzLm5tKG5hbWUpLCBmaWxlLCBmKTtcbiAgfVxuXG4gIHRydW5jYXRlKG5hbWUsIGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHZhciBmaWxlO1xuICAgIHRoaXMubG9va3VwKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSlcbiAgICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgICBcIkVJU0RJUlwiLFxuICAgICAgICAgIFwib3BlblwiLFxuICAgICAgICAgIFwiaWxsZWdhbCBvcGVyYXRpb24gb24gYSBkaXJlY3RvcnlcIixcbiAgICAgICAgICB0aGlzLm5tKG5hbWUpLFxuICAgICAgICApO1xuICAgICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICAgIGZpbGUudHJ1bmNhdGUobGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUodGhpcy5ubShuYW1lKSwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXIobmFtZSwgY29udGVudCkge1xuICAgIHZhciBmaWxlO1xuICAgIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pXG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmaWxlIGFscmVhZHkgZXhpc3RzXCIpO1xuICAgIGlmIChjYW1sX2lzX21sX2J5dGVzKGNvbnRlbnQpKSBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY29udGVudCk7XG4gICAgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKGNvbnRlbnQpKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGNvbnRlbnQpKTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoY29udGVudCkpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKVxuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjb250ZW50KSk7XG4gICAgZWxzZSBpZiAoY29udGVudC50b1N0cmluZykge1xuICAgICAgdmFyIGJ5dGVzID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoXG4gICAgICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNvbnRlbnQudG9TdHJpbmcoKSksXG4gICAgICApO1xuICAgICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGJ5dGVzKTtcbiAgICB9XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBmaWxlO1xuICAgIH0gZWxzZVxuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXG4gICAgICAgIHRoaXMubm0obmFtZSkgKyBcIiA6IHJlZ2lzdGVyaW5nIGZpbGUgd2l0aCBpbnZhbGlkIGNvbnRlbnQgdHlwZVwiLFxuICAgICAgKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBNbEZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ibGl0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XG5jbGFzcyBNbEZha2VGaWxlIGV4dGVuZHMgTWxGaWxlIHtcbiAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gY29udGVudDtcbiAgfVxuXG4gIHRydW5jYXRlKGxlbikge1xuICAgIHZhciBvbGQgPSB0aGlzLmRhdGE7XG4gICAgdmFyIG9sZF9sZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aChvbGQpO1xuICAgIHRoaXMuZGF0YSA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbiB8IDApO1xuICAgIGNhbWxfYmxpdF9ieXRlcyhvbGQsIDAsIHRoaXMuZGF0YSwgMCwgTWF0aC5taW4obGVuLCBvbGRfbGVuKSk7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHRoaXMuZGF0YSk7XG4gIH1cblxuICB3cml0ZShvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gICAgaWYgKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgICB2YXIgbmV3X3N0ciA9IGNhbWxfY3JlYXRlX2J5dGVzKG9mZnNldCArIGxlbik7XG4gICAgICB2YXIgb2xkX2RhdGEgPSB0aGlzLmRhdGE7XG4gICAgICB0aGlzLmRhdGEgPSBuZXdfc3RyO1xuICAgICAgY2FtbF9ibGl0X2J5dGVzKG9sZF9kYXRhLCAwLCB0aGlzLmRhdGEsIDAsIGNsZW4pO1xuICAgIH1cbiAgICBjYW1sX2JsaXRfYnl0ZXMoXG4gICAgICBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5KGJ1ZiksXG4gICAgICBwb3MsXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICBvZmZzZXQsXG4gICAgICBsZW4sXG4gICAgKTtcbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgcmVhZChvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gICAgaWYgKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgICBsZW4gPSBjbGVuIC0gb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgdmFyIGRhdGEgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4gfCAwKTtcbiAgICAgIGNhbWxfYmxpdF9ieXRlcyh0aGlzLmRhdGEsIG9mZnNldCwgZGF0YSwgMCwgbGVuKTtcbiAgICAgIGJ1Zi5zZXQoY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhkYXRhKSwgcG9zKTtcbiAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkX291dFxuLy9SZXF1aXJlczogTWxGYWtlRmlsZSwgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3JcbmNsYXNzIE1sRmFrZUZkX291dCBleHRlbmRzIE1sRmFrZUZpbGUge1xuICBjb25zdHJ1Y3RvcihmZCwgZmxhZ3MpIHtcbiAgICBzdXBlcihjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgdGhpcy5sb2cgPSBmdW5jdGlvbiAoX3MpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgaWYgKGZkID09PSAxICYmIHR5cGVvZiBjb25zb2xlLmxvZyA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGVsc2UgaWYgKGZkID09PSAyICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aGlzLmxvZyA9IGNvbnNvbGUuZXJyb3I7XG4gICAgZWxzZSBpZiAodHlwZW9mIGNvbnNvbGUubG9nID09PSBcImZ1bmN0aW9uXCIpIHRoaXMubG9nID0gY29uc29sZS5sb2c7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdHJ1bmNhdGUoX2xlbiwgcmFpc2VfdW5peCkge1xuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgcmFpc2VfdW5peCxcbiAgICAgIFwiRUlOVkFMXCIsXG4gICAgICBcImZ0cnVuY2F0ZVwiLFxuICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgKTtcbiAgfVxuXG4gIHdyaXRlKGJ1ZiwgcG9zLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgd3JpdHRlbiA9IGxlbjtcbiAgICBpZiAodGhpcy5sb2cpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGVuID4gMCAmJlxuICAgICAgICBwb3MgPj0gMCAmJlxuICAgICAgICBwb3MgKyBsZW4gPD0gYnVmLmxlbmd0aCAmJlxuICAgICAgICBidWZbcG9zICsgbGVuIC0gMV0gPT09IDEwXG4gICAgICApXG4gICAgICAgIGxlbi0tO1xuICAgICAgLy8gRG8gbm90IG91dHB1dCB0aGUgbGFzdCBcXG4gaWYgcHJlc2VudFxuICAgICAgLy8gYXMgY29uc29sZSBsb2dnaW5nIGRpc3BsYXkgYSBuZXdsaW5lIGF0IHRoZSBlbmRcbiAgICAgIHZhciBzcmMgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pO1xuICAgICAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoYnVmKSwgcG9zLCBzcmMsIDAsIGxlbik7XG4gICAgICB0aGlzLmxvZyhzcmMudG9VdGYxNigpKTtcbiAgICAgIHJldHVybiB3cml0dGVuO1xuICAgIH1cbiAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgIHJhaXNlX3VuaXgsXG4gICAgICBcIkVCQURGXCIsXG4gICAgICBcIndyaXRlXCIsXG4gICAgICBcImJhZCBmaWxlIGRlc2NyaXB0b3JcIixcbiAgICApO1xuICB9XG5cbiAgcmVhZChfYnVmLCBfcG9zLCBfbGVuLCByYWlzZV91bml4KSB7XG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IocmFpc2VfdW5peCwgXCJFQkFERlwiLCBcInJlYWRcIiwgXCJiYWQgZmlsZSBkZXNjcmlwdG9yXCIpO1xuICB9XG5cbiAgc2VlayhfbGVuLCBfd2hlbmNlLCByYWlzZV91bml4KSB7XG4gICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IocmFpc2VfdW5peCwgXCJFU1BJUEVcIiwgXCJsc2Vla1wiLCBcImlsbGVnYWwgc2Vla1wiKTtcbiAgfVxuICBwb3MoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5sb2cgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGVja19zdHJlYW1fc2VtYW50aWNzKF9jbWQpIHt9XG59XG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvclxuY2xhc3MgTWxGYWtlRmQge1xuICBjb25zdHJ1Y3RvcihuYW1lLCBmaWxlLCBmbGFncykge1xuICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgIHRoaXMuc2Vla2VkID0gZmFsc2U7XG4gIH1cblxuICBlcnJfY2xvc2VkKGNtZCwgcmFpc2VfdW5peCkge1xuICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKHJhaXNlX3VuaXgsIFwiRUJBREZcIiwgY21kLCBcImJhZCBmaWxlIGRlc2NyaXB0b3JcIik7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgaWYgKHRoaXMuZmlsZSkgcmV0dXJuIHRoaXMuZmlsZS5sZW5ndGgoKTtcbiAgICB0aGlzLmVycl9jbG9zZWQoXCJsZW5ndGhcIik7XG4gIH1cblxuICB0cnVuY2F0ZShsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5maWxlKSB7XG4gICAgICBpZiAoISh0aGlzLmZsYWdzLndyb25seSB8fCB0aGlzLmZsYWdzLnJkd3IpKVxuICAgICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgICByYWlzZV91bml4LFxuICAgICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgICAgXCJ0cnVuY2F0ZVwiLFxuICAgICAgICAgIFwiaW52YWxpZCBhcmd1bWVudFwiLFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZS50cnVuY2F0ZShsZW4pO1xuICAgIH1cbiAgICB0aGlzLmVycl9jbG9zZWQoXCJ0cnVuY2F0ZVwiLCByYWlzZV91bml4KTtcbiAgfVxuXG4gIHdyaXRlKGJ1ZiwgcG9zLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5maWxlICYmICh0aGlzLmZsYWdzLndyb25seSB8fCB0aGlzLmZsYWdzLnJkd3IpKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICBsZW4gPSB0aGlzLmZpbGUud3JpdGUob2Zmc2V0LCBidWYsIHBvcywgbGVuKTtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IGxlbjtcbiAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIHRoaXMuZXJyX2Nsb3NlZChcIndyaXRlXCIsIHJhaXNlX3VuaXgpO1xuICB9XG5cbiAgcmVhZChidWYsIHBvcywgbGVuLCByYWlzZV91bml4KSB7XG4gICAgaWYgKHRoaXMuZmlsZSAmJiAhdGhpcy5mbGFncy53cm9ubHkpIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgIGxlbiA9IHRoaXMuZmlsZS5yZWFkKG9mZnNldCwgYnVmLCBwb3MsIGxlbik7XG4gICAgICB0aGlzLm9mZnNldCArPSBsZW47XG4gICAgICByZXR1cm4gbGVuO1xuICAgIH1cbiAgICB0aGlzLmVycl9jbG9zZWQoXCJyZWFkXCIsIHJhaXNlX3VuaXgpO1xuICB9XG5cbiAgc2VlayhvZmZzZXQsIHdoZW5jZSwgcmFpc2VfdW5peCkge1xuICAgIHN3aXRjaCAod2hlbmNlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKVxuICAgICAgY2FtbF9yYWlzZV9zeXN0ZW1fZXJyb3IoXG4gICAgICAgIHJhaXNlX3VuaXgsXG4gICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgIFwibHNlZWtcIixcbiAgICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgICApO1xuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHRoaXMuc2Vla2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG5cbiAgcG9zKCkge1xuICAgIHJldHVybiB0aGlzLm9mZnNldDtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5maWxlKSB0aGlzLmVycl9jbG9zZWQoXCJjbG9zZVwiKTtcbiAgICB0aGlzLmZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGVja19zdHJlYW1fc2VtYW50aWNzKGNtZCkge1xuICAgIGlmICghdGhpcy5maWxlKSByZXR1cm4gdGhpcy5lcnJfY2xvc2VkKGNtZCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgfVxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG52YXIgY2FtbF9pbnQ2NF9vZmZzZXQgPSBNYXRoLnBvdygyLCAtMjQpO1xuXG4vL1Byb3ZpZGVzOiBNbEludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldCwgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuY2xhc3MgTWxJbnQ2NCB7XG4gIGNvbnN0cnVjdG9yKGxvLCBtaSwgaGkpIHtcbiAgICB0aGlzLmxvID0gbG8gJiAweGZmZmZmZjtcbiAgICB0aGlzLm1pID0gbWkgJiAweGZmZmZmZjtcbiAgICB0aGlzLmhpID0gaGkgJiAweGZmZmY7XG4gICAgdGhpcy5jYW1sX2N1c3RvbSA9IFwiX2pcIjtcbiAgfVxuXG4gIHN0YXRpYyBVTlNJR05FRF9NQVggPSBuZXcgTWxJbnQ2NCgweGZmZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZik7XG4gIHN0YXRpYyBTSUdORURfTUFYID0gbmV3IE1sSW50NjQoMHhmZmZmZmYsIDB4ZmZmZmZmLCAweDdmZmYpO1xuICBzdGF0aWMgU0lHTkVEX01JTiA9IG5ldyBNbEludDY0KDB4MDAwMDAwLCAweDAwMDAwMCwgMHg4MDAwKTtcblxuICBzbGljZSgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbywgdGhpcy5taSwgdGhpcy5oaSk7XG4gIH1cblxuICB1Y29tcGFyZSh4KSB7XG4gICAgaWYgKHRoaXMuaGkgPiB4LmhpKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5oaSA8IHguaGkpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5taSA+IHgubWkpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLm1pIDwgeC5taSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmxvID4geC5sbykgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubG8gPCB4LmxvKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb21wYXJlKHgpIHtcbiAgICB2YXIgaGkgPSB0aGlzLmhpIDw8IDE2O1xuICAgIHZhciB4aGkgPSB4LmhpIDw8IDE2O1xuICAgIGlmIChoaSA+IHhoaSkgcmV0dXJuIDE7XG4gICAgaWYgKGhpIDwgeGhpKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubWkgPiB4Lm1pKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5taSA8IHgubWkpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5sbyA+IHgubG8pIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxvIDwgeC5sbykgcmV0dXJuIC0xO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbmVnKCkge1xuICAgIHZhciBsbyA9IC10aGlzLmxvO1xuICAgIHZhciBtaSA9IC10aGlzLm1pICsgKGxvID4+IDI0KTtcbiAgICB2YXIgaGkgPSAtdGhpcy5oaSArIChtaSA+PiAyNCk7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xuICB9XG5cbiAgYWRkKHgpIHtcbiAgICB2YXIgbG8gPSB0aGlzLmxvICsgeC5sbztcbiAgICB2YXIgbWkgPSB0aGlzLm1pICsgeC5taSArIChsbyA+PiAyNCk7XG4gICAgdmFyIGhpID0gdGhpcy5oaSArIHguaGkgKyAobWkgPj4gMjQpO1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbiAgfVxuXG4gIHN1Yih4KSB7XG4gICAgdmFyIGxvID0gdGhpcy5sbyAtIHgubG87XG4gICAgdmFyIG1pID0gdGhpcy5taSAtIHgubWkgKyAobG8gPj4gMjQpO1xuICAgIHZhciBoaSA9IHRoaXMuaGkgLSB4LmhpICsgKG1pID4+IDI0KTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG4gIH1cblxuICBtdWwoeCkge1xuICAgIHZhciBsbyA9IHRoaXMubG8gKiB4LmxvO1xuICAgIHZhciBtaSA9ICgobG8gKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArIHRoaXMubWkgKiB4LmxvICsgdGhpcy5sbyAqIHgubWk7XG4gICAgdmFyIGhpID1cbiAgICAgICgobWkgKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArXG4gICAgICB0aGlzLmhpICogeC5sbyArXG4gICAgICB0aGlzLm1pICogeC5taSArXG4gICAgICB0aGlzLmxvICogeC5oaTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG4gIH1cblxuICBpc1plcm8oKSB7XG4gICAgcmV0dXJuICh0aGlzLmxvIHwgdGhpcy5taSB8IHRoaXMuaGkpID09PSAwO1xuICB9XG5cbiAgaXNOZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGkgPDwgMTYgPCAwO1xuICB9XG5cbiAgYW5kKHgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyAmIHgubG8sIHRoaXMubWkgJiB4Lm1pLCB0aGlzLmhpICYgeC5oaSk7XG4gIH1cblxuICBvcih4KSB7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG8gfCB4LmxvLCB0aGlzLm1pIHwgeC5taSwgdGhpcy5oaSB8IHguaGkpO1xuICB9XG5cbiAgeG9yKHgpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyBeIHgubG8sIHRoaXMubWkgXiB4Lm1pLCB0aGlzLmhpIF4geC5oaSk7XG4gIH1cblxuICBzaGlmdF9sZWZ0KHMpIHtcbiAgICBzID0gcyAmIDYzO1xuICAgIGlmIChzID09PSAwKSByZXR1cm4gdGhpcztcbiAgICBpZiAocyA8IDI0KSB7XG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgIHRoaXMubG8gPDwgcyxcbiAgICAgICAgKHRoaXMubWkgPDwgcykgfCAodGhpcy5sbyA+PiAoMjQgLSBzKSksXG4gICAgICAgICh0aGlzLmhpIDw8IHMpIHwgKHRoaXMubWkgPj4gKDI0IC0gcykpLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHMgPCA0OClcbiAgICAgIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAgICAgMCxcbiAgICAgICAgdGhpcy5sbyA8PCAocyAtIDI0KSxcbiAgICAgICAgKHRoaXMubWkgPDwgKHMgLSAyNCkpIHwgKHRoaXMubG8gPj4gKDQ4IC0gcykpLFxuICAgICAgKTtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQoMCwgMCwgdGhpcy5sbyA8PCAocyAtIDQ4KSk7XG4gIH1cblxuICBzaGlmdF9yaWdodF91bnNpZ25lZChzKSB7XG4gICAgcyA9IHMgJiA2MztcbiAgICBpZiAocyA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKHMgPCAyNClcbiAgICAgIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAgICAgKHRoaXMubG8gPj4gcykgfCAodGhpcy5taSA8PCAoMjQgLSBzKSksXG4gICAgICAgICh0aGlzLm1pID4+IHMpIHwgKHRoaXMuaGkgPDwgKDI0IC0gcykpLFxuICAgICAgICB0aGlzLmhpID4+IHMsXG4gICAgICApO1xuICAgIGlmIChzIDwgNDgpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICAgdGhpcy5oaSA+PiAocyAtIDI0KSxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMuaGkgPj4gKHMgLSA0OCksIDAsIDApO1xuICB9XG5cbiAgc2hpZnRfcmlnaHQocykge1xuICAgIHMgPSBzICYgNjM7XG4gICAgaWYgKHMgPT09IDApIHJldHVybiB0aGlzO1xuICAgIHZhciBoID0gKHRoaXMuaGkgPDwgMTYpID4+IDE2O1xuICAgIGlmIChzIDwgMjQpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgICAodGhpcy5taSA+PiBzKSB8IChoIDw8ICgyNCAtIHMpKSxcbiAgICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiBzKSA+Pj4gMTYsXG4gICAgICApO1xuICAgIHZhciBzaWduID0gKHRoaXMuaGkgPDwgMTYpID4+IDMxO1xuICAgIGlmIChzIDwgNDgpXG4gICAgICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiAocyAtIDI0KSkgPj4gMTYsXG4gICAgICAgIHNpZ24gJiAweGZmZmYsXG4gICAgICApO1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NCgodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAzMiksIHNpZ24sIHNpZ24pO1xuICB9XG5cbiAgbHNsMSgpIHtcbiAgICB0aGlzLmhpID0gKHRoaXMuaGkgPDwgMSkgfCAodGhpcy5taSA+PiAyMyk7XG4gICAgdGhpcy5taSA9ICgodGhpcy5taSA8PCAxKSB8ICh0aGlzLmxvID4+IDIzKSkgJiAweGZmZmZmZjtcbiAgICB0aGlzLmxvID0gKHRoaXMubG8gPDwgMSkgJiAweGZmZmZmZjtcbiAgfVxuXG4gIGxzcjEoKSB7XG4gICAgdGhpcy5sbyA9ICgodGhpcy5sbyA+Pj4gMSkgfCAodGhpcy5taSA8PCAyMykpICYgMHhmZmZmZmY7XG4gICAgdGhpcy5taSA9ICgodGhpcy5taSA+Pj4gMSkgfCAodGhpcy5oaSA8PCAyMykpICYgMHhmZmZmZmY7XG4gICAgdGhpcy5oaSA9IHRoaXMuaGkgPj4+IDE7XG4gIH1cblxuICB1ZGl2bW9kKHgpIHtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgbW9kdWx1cyA9IHRoaXMuc2xpY2UoKTtcbiAgICB2YXIgZGl2aXNvciA9IHguc2xpY2UoKTtcbiAgICB2YXIgcXVvdGllbnQgPSBuZXcgTWxJbnQ2NCgwLCAwLCAwKTtcbiAgICB3aGlsZSAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+IDApIHtcbiAgICAgIG9mZnNldCsrO1xuICAgICAgZGl2aXNvci5sc2wxKCk7XG4gICAgfVxuICAgIHdoaWxlIChvZmZzZXQgPj0gMCkge1xuICAgICAgb2Zmc2V0LS07XG4gICAgICBxdW90aWVudC5sc2wxKCk7XG4gICAgICBpZiAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+PSAwKSB7XG4gICAgICAgIHF1b3RpZW50LmxvKys7XG4gICAgICAgIG1vZHVsdXMgPSBtb2R1bHVzLnN1YihkaXZpc29yKTtcbiAgICAgIH1cbiAgICAgIGRpdmlzb3IubHNyMSgpO1xuICAgIH1cbiAgICByZXR1cm4geyBxdW90aWVudDogcXVvdGllbnQsIG1vZHVsdXM6IG1vZHVsdXMgfTtcbiAgfVxuXG4gIGRpdih5KSB7XG4gICAgdmFyIHggPSB0aGlzO1xuICAgIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCk7XG4gICAgdmFyIHNpZ24gPSB4LmhpIF4geS5oaTtcbiAgICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gICAgaWYgKHkuaGkgJiAweDgwMDApIHkgPSB5Lm5lZygpO1xuICAgIHZhciBxID0geC51ZGl2bW9kKHkpLnF1b3RpZW50O1xuICAgIGlmIChzaWduICYgMHg4MDAwKSBxID0gcS5uZWcoKTtcbiAgICByZXR1cm4gcTtcbiAgfVxuXG4gIG1vZCh5KSB7XG4gICAgdmFyIHggPSB0aGlzO1xuICAgIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlKCk7XG4gICAgdmFyIHNpZ24gPSB4LmhpO1xuICAgIGlmICh4LmhpICYgMHg4MDAwKSB4ID0geC5uZWcoKTtcbiAgICBpZiAoeS5oaSAmIDB4ODAwMCkgeSA9IHkubmVnKCk7XG4gICAgdmFyIHIgPSB4LnVkaXZtb2QoeSkubW9kdWx1cztcbiAgICBpZiAoc2lnbiAmIDB4ODAwMCkgciA9IHIubmVnKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICB0b0ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5sbyB8ICh0aGlzLm1pIDw8IDI0KTtcbiAgfVxuXG4gIHRvRmxvYXQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLmhpIDw8IDE2KSAqIE1hdGgucG93KDIsIDMyKSArIHRoaXMubWkgKiBNYXRoLnBvdygyLCAyNCkgKyB0aGlzLmxvXG4gICAgKTtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuaGkgPj4gOCxcbiAgICAgIHRoaXMuaGkgJiAweGZmLFxuICAgICAgdGhpcy5taSA+PiAxNixcbiAgICAgICh0aGlzLm1pID4+IDgpICYgMHhmZixcbiAgICAgIHRoaXMubWkgJiAweGZmLFxuICAgICAgdGhpcy5sbyA+PiAxNixcbiAgICAgICh0aGlzLmxvID4+IDgpICYgMHhmZixcbiAgICAgIHRoaXMubG8gJiAweGZmLFxuICAgIF07XG4gIH1cblxuICBsbzMyKCkge1xuICAgIHJldHVybiB0aGlzLmxvIHwgKCh0aGlzLm1pICYgMHhmZikgPDwgMjQpO1xuICB9XG5cbiAgaGkzMigpIHtcbiAgICByZXR1cm4gKCh0aGlzLm1pID4+PiA4KSAmIDB4ZmZmZikgfCAodGhpcy5oaSA8PCAxNik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF91bHQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdWx0KHgsIHkpIHtcbiAgcmV0dXJuIHgudWNvbXBhcmUoeSkgPCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NvbXBhcmUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY29tcGFyZSh4LCB5LCBfdG90YWwpIHtcbiAgcmV0dXJuIHguY29tcGFyZSh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9uZWcgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbmVnKHgpIHtcbiAgcmV0dXJuIHgubmVnKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYWRkIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FkZCh4LCB5KSB7XG4gIHJldHVybiB4LmFkZCh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zdWIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc3ViKHgsIHkpIHtcbiAgcmV0dXJuIHguc3ViKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X211bCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbXVsKHgsIHkpIHtcbiAgcmV0dXJuIHgubXVsKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2lzX3plcm8gY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaXNfemVybyh4KSB7XG4gIHJldHVybiAreC5pc1plcm8oKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSh4KSB7XG4gIHJldHVybiAreC5pc05lZygpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2FuZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9hbmQoeCwgeSkge1xuICByZXR1cm4geC5hbmQoeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb3IoeCwgeSkge1xuICByZXR1cm4geC5vcih5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF94b3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfeG9yKHgsIHkpIHtcbiAgcmV0dXJuIHgueG9yKHkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfbGVmdCh4LCBzKSB7XG4gIHJldHVybiB4LnNoaWZ0X2xlZnQocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgcykge1xuICByZXR1cm4geC5zaGlmdF9yaWdodF91bnNpZ25lZChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCh4LCBzKSB7XG4gIHJldHVybiB4LnNoaWZ0X3JpZ2h0KHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2RpdlxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9kaXYoeCwgeSkge1xuICByZXR1cm4geC5kaXYoeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbW9kXG5mdW5jdGlvbiBjYW1sX2ludDY0X21vZCh4LCB5KSB7XG4gIHJldHVybiB4Lm1vZCh5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuLy9BbGlhczogY2FtbF9pbnQ2NF9vZl9pbnRcbi8vQWxpYXM6IGNhbWxfaW50NjRfb2ZfbmF0aXZlaW50XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2ludDMyKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHggJiAweGZmZmZmZiwgKHggPj4gMjQpICYgMHhmZmZmZmYsICh4ID4+IDMxKSAmIDB4ZmZmZik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9faW50MzIgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50NjRfdG9faW50XG4vL0FsaWFzOiBjYW1sX2ludDY0X3RvX25hdGl2ZWludFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19pbnQzMih4KSB7XG4gIHJldHVybiB4LnRvSW50KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fZmxvYXQoeCkge1xuICByZXR1cm4geC50b0Zsb2F0KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2Zsb2F0KHgpIHtcbiAgaWYgKHggPCAwKSB4ID0gTWF0aC5jZWlsKHgpO1xuICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgeCAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0KSAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0ICogY2FtbF9pbnQ2NF9vZmZzZXQpICYgMHhmZmZmLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zvcm1hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9mb3JtYXQsIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfaXNfbmVnYXRpdmUsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2ludDMyLCBjYW1sX2ludDY0X3RvX2ludDMyXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9mb3JtYXQoZm10LCB4KSB7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGYuc2lnbmVkY29udiAmJiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlKHgpKSB7XG4gICAgZi5zaWduID0gLTE7XG4gICAgeCA9IGNhbWxfaW50NjRfbmVnKHgpO1xuICB9XG4gIHZhciBidWZmZXIgPSBcIlwiO1xuICB2YXIgd2Jhc2UgPSBjYW1sX2ludDY0X29mX2ludDMyKGYuYmFzZSk7XG4gIHZhciBjdnRibCA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuICBkbyB7XG4gICAgdmFyIHAgPSB4LnVkaXZtb2Qod2Jhc2UpO1xuICAgIHggPSBwLnF1b3RpZW50O1xuICAgIGJ1ZmZlciA9IGN2dGJsLmNoYXJBdChjYW1sX2ludDY0X3RvX2ludDMyKHAubW9kdWx1cykpICsgYnVmZmVyO1xuICB9IHdoaWxlICghY2FtbF9pbnQ2NF9pc196ZXJvKHgpKTtcbiAgaWYgKGYucHJlYyA+PSAwKSB7XG4gICAgZi5maWxsZXIgPSBcIiBcIjtcbiAgICB2YXIgbiA9IGYucHJlYyAtIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBidWZmZXIgPSBjYW1sX3N0cl9yZXBlYXQobiwgXCIwXCIpICsgYnVmZmVyO1xuICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIGJ1ZmZlcik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcGFyc2VfZGlnaXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfdWx0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2FkZCwgY2FtbF9pbnQ2NF9tdWwsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9zdHJpbmcocykge1xuICB2YXIgciA9IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZShzKTtcbiAgdmFyIGkgPSByWzBdLFxuICAgIHNpZ24gPSByWzFdLFxuICAgIGJhc2UgPSByWzJdLFxuICAgIHNpZ25lZG5lc3MgPSByWzNdO1xuICB2YXIgYmFzZTY0ID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihiYXNlKTtcbiAgdmFyIHRocmVzaG9sZCA9IE1sSW50NjQuVU5TSUdORURfTUFYLnVkaXZtb2QoYmFzZTY0KS5xdW90aWVudDtcbiAgdmFyIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICB2YXIgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGNhbWxfZmFpbHdpdGgoXCJJbnQ2NC5vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICBmb3IgKDs7KSB7XG4gICAgaSsrO1xuICAgIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICAgIGlmIChjID09PSA5NSkgY29udGludWU7XG4gICAgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gICAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgYnJlYWs7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIGJhc2UgKiByZXMgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQodGhyZXNob2xkLCByZXMpKSBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICAgIGQgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICAgIHJlcyA9IGNhbWxfaW50NjRfYWRkKGNhbWxfaW50NjRfbXVsKGJhc2U2NCwgcmVzKSwgZCk7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIGFkZGl0aW9uIChiYXNlICogcmVzKSArIGQgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQocmVzLCBkKSkgY2FtbF9mYWlsd2l0aChcIkludDY0Lm9mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPT0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICBpZiAoXG4gICAgc2lnbmVkbmVzcyAmJlxuICAgIGNhbWxfaW50NjRfdWx0KHNpZ24gPCAwID8gTWxJbnQ2NC5TSUdORURfTUlOIDogTWxJbnQ2NC5TSUdORURfTUFYLCByZXMpXG4gIClcbiAgICBjYW1sX2ZhaWx3aXRoKFwiSW50NjQub2Zfc3RyaW5nXCIpO1xuICBpZiAoc2lnbiA8IDApIHJlcyA9IGNhbWxfaW50NjRfbmVnKHJlcyk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaShsbywgbWksIGhpKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsbywgaGkpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KFxuICAgIGxvICYgMHhmZmZmZmYsXG4gICAgKChsbyA+Pj4gMjQpICYgMHhmZikgfCAoKGhpICYgMHhmZmZmKSA8PCA4KSxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmZmZixcbiAgKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbG8zMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9sbzMyKHYpIHtcbiAgcmV0dXJuIHYubG8zMigpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2hpMzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaGkzMih2KSB7XG4gIHJldHVybiB2LmhpMzIoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICAoYVs3XSA8PCAwKSB8IChhWzZdIDw8IDgpIHwgKGFbNV0gPDwgMTYpLFxuICAgIChhWzRdIDw8IDApIHwgKGFbM10gPDwgOCkgfCAoYVsyXSA8PCAxNiksXG4gICAgKGFbMV0gPDwgMCkgfCAoYVswXSA8PCA4KSxcbiAgKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fYnl0ZXMoeCkge1xuICByZXR1cm4geC50b0FycmF5KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaGFzaCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9oYXNoKHYpIHtcbiAgcmV0dXJuIHYubG8zMigpIF4gdi5oaTMyKCk7XG59XG4iLCIvL1Byb3ZpZGVzOiBNbE11dGV4XG5jbGFzcyBNbE11dGV4IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2NrZWQgPSBmYWxzZTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X25ld1xuLy9SZXF1aXJlczogTWxNdXRleFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9uZXcoX3VuaXQpIHtcbiAgcmV0dXJuIG5ldyBNbE11dGV4KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfbG9ja1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9sb2NrKHQpIHtcbiAgaWYgKHQubG9ja2VkKSBjYW1sX2ZhaWx3aXRoKFwiTXV0ZXgubG9jazogbXV0ZXggYWxyZWFkeSBsb2NrZWQuIENhbm5vdCB3YWl0LlwiKTtcbiAgZWxzZSB0LmxvY2tlZCA9IHRydWU7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X3RyeV9sb2NrXG5mdW5jdGlvbiBjYW1sX21sX211dGV4X3RyeV9sb2NrKHQpIHtcbiAgaWYgKCF0LmxvY2tlZCkge1xuICAgIHQubG9ja2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF91bmxvY2tcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHQpIHtcbiAgdC5sb2NrZWQgPSBmYWxzZTtcbiAgcmV0dXJuIDA7XG59XG4iLCIvL1Byb3ZpZGVzOiBpbml0aWFsaXplX25hdFxuLy9SZXF1aXJlczogY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBzZXJpYWxpemVfbmF0LCBkZXNlcmlhbGl6ZV9uYXQsIGNhbWxfaGFzaF9uYXRcbmZ1bmN0aW9uIGluaXRpYWxpemVfbmF0KCkge1xuICBjYW1sX2N1c3RvbV9vcHMuX25hdCA9IHtcbiAgICBkZXNlcmlhbGl6ZTogZGVzZXJpYWxpemVfbmF0LFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplX25hdCxcbiAgICBoYXNoOiBjYW1sX2hhc2hfbmF0LFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5hdFxuY2xhc3MgTWxOYXQge1xuICBjb25zdHJ1Y3Rvcih4KSB7XG4gICAgdGhpcy5kYXRhID0gbmV3IEludDMyQXJyYXkoeCk7XG4gICAgLy8gRm9yIG51bSA8IDEuNVxuICAgIC8vIGxlbmd0aF9uYXQgaXNuJ3QgZXh0ZXJuYWwsIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGUgT2JqLnNpemVcbiAgICAvLyB3b3JrIG91dCByaWdodC5cbiAgICAvLyBXZSBhZGQgKzIgdG8gdGhlIGFycmF5IGxlbmd0aDpcbiAgICAvLyAtICsxIGZvciB0aGUgdGFnXG4gICAgLy8gLSArMSBmb3IgdGhlIGN1c3RvbV9vcHMgc2xvdFxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aCArIDI7XG4gICAgdGhpcy5jYW1sX2N1c3RvbSA9IFwiX25hdFwiO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9uYXRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY2FtbF9oYXNoX25hdCh4KSB7XG4gIHZhciBsZW4gPSBudW1fZGlnaXRzX25hdCh4LCAwLCB4LmRhdGEubGVuZ3RoKTtcbiAgdmFyIGggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHguZGF0YVtpXSk7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGxlbmd0aF9uYXRcbmZ1bmN0aW9uIGxlbmd0aF9uYXQoeCkge1xuICByZXR1cm4geC5kYXRhLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogbmF0X29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gbmF0X29mX2FycmF5KGwpIHtcbiAgcmV0dXJuIG5ldyBNbE5hdChsKTtcbn1cblxuLy9Qcm92aWRlczogY3JlYXRlX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGNyZWF0ZV9uYXQoc2l6ZSkge1xuICB2YXIgYXJyID0gbmV3IE1sTmF0KHNpemUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIGFyci5kYXRhW2ldID0gLTE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLy9Qcm92aWRlczogc2V0X3RvX3plcm9fbmF0XG5mdW5jdGlvbiBzZXRfdG9femVyb19uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0LmRhdGFbb2ZzICsgaV0gPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBibGl0X25hdFxuZnVuY3Rpb24gYmxpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMiwgbGVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQxLmRhdGFbb2ZzMSArIGldID0gbmF0Mi5kYXRhW29mczIgKyBpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdFxuZnVuY3Rpb24gc2V0X2RpZ2l0X25hdChuYXQsIG9mcywgZGlnaXQpIHtcbiAgbmF0LmRhdGFbb2ZzXSA9IGRpZ2l0O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbnRoX2RpZ2l0X25hdFxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdChuYXQsIG9mcykge1xuICByZXR1cm4gbmF0LmRhdGFbb2ZzXTtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdF9uYXRpdmVcbmZ1bmN0aW9uIHNldF9kaWdpdF9uYXRfbmF0aXZlKG5hdCwgb2ZzLCBkaWdpdCkge1xuICBuYXQuZGF0YVtvZnNdID0gZGlnaXQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBudGhfZGlnaXRfbmF0X25hdGl2ZVxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdF9uYXRpdmUobmF0LCBvZnMpIHtcbiAgcmV0dXJuIG5hdC5kYXRhW29mc107XG59XG5cbi8vUHJvdmlkZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBudW1fZGlnaXRzX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChuYXQuZGF0YVtvZnMgKyBpXSAhPT0gMCkgcmV0dXJuIGkgKyAxO1xuICB9XG4gIHJldHVybiAxOyAvLyAwIGNvdW50cyBhcyAxIGRpZ2l0XG59XG5cbi8vUHJvdmlkZXM6IG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdFxuZnVuY3Rpb24gbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0KG5hdCwgb2ZzKSB7XG4gIHZhciBhID0gbmF0LmRhdGFbb2ZzXTtcbiAgdmFyIGIgPSAwO1xuICBpZiAoYSAmIDB4ZmZmZjAwMDApIHtcbiAgICBiICs9IDE2O1xuICAgIGEgPj4+PSAxNjtcbiAgfVxuICBpZiAoYSAmIDB4ZmYwMCkge1xuICAgIGIgKz0gODtcbiAgICBhID4+Pj0gODtcbiAgfVxuICBpZiAoYSAmIDB4ZjApIHtcbiAgICBiICs9IDQ7XG4gICAgYSA+Pj49IDQ7XG4gIH1cbiAgaWYgKGEgJiAxMikge1xuICAgIGIgKz0gMjtcbiAgICBhID4+Pj0gMjtcbiAgfVxuICBpZiAoYSAmIDIpIHtcbiAgICBiICs9IDE7XG4gICAgYSA+Pj49IDE7XG4gIH1cbiAgaWYgKGEgJiAxKSB7XG4gICAgYiArPSAxO1xuICB9XG4gIHJldHVybiAzMiAtIGI7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X2ludFxuZnVuY3Rpb24gaXNfZGlnaXRfaW50KG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdID49IDApIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfemVyb1xuZnVuY3Rpb24gaXNfZGlnaXRfemVybyhuYXQsIG9mcykge1xuICBpZiAobmF0LmRhdGFbb2ZzXSA9PT0gMCkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpc19kaWdpdF9ub3JtYWxpemVkXG5mdW5jdGlvbiBpc19kaWdpdF9ub3JtYWxpemVkKF9uYXQsIF9vZnMpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X29kZFxuZnVuY3Rpb24gaXNfZGlnaXRfb2RkKG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdICYgMSkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpbmNyX25hdFxuZnVuY3Rpb24gaW5jcl9uYXQobmF0LCBvZnMsIGxlbiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQuZGF0YVtvZnMgKyBpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQuZGF0YVtvZnMgKyBpXSA9IHggfCAwO1xuICAgIGlmICh4ID09PSB4ID4+PiAwKSB7XG4gICAgICBjYXJyeSA9IDA7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FycnkgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2Fycnk7XG59XG5cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogYWRkX25hdFxuLy9SZXF1aXJlczogaW5jcl9uYXRcbmZ1bmN0aW9uIGFkZF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0MS5kYXRhW29mczEgKyBpXSA+Pj4gMCkgKyAobmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQxLmRhdGFbb2ZzMSArIGldID0geDtcbiAgICBpZiAoeCA9PT0geCA+Pj4gMCkge1xuICAgICAgY2FycnkgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmNyX25hdChuYXQxLCBvZnMxICsgbGVuMiwgbGVuMSAtIGxlbjIsIGNhcnJ5KTtcbn1cblxuLy9Qcm92aWRlczogY29tcGxlbWVudF9uYXRcbmZ1bmN0aW9uIGNvbXBsZW1lbnRfbmF0KG5hdCwgb2ZzLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW29mcyArIGldID0gKC0xID4+PiAwKSAtIChuYXQuZGF0YVtvZnMgKyBpXSA+Pj4gMCk7XG4gIH1cbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vUHJvdmlkZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBkZWNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgYm9ycm93ID0gY2FycnlfaW4gPT09IDEgPyAwIDogMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciB4ID0gKG5hdC5kYXRhW29mcyArIGldID4+PiAwKSAtIGJvcnJvdztcbiAgICBuYXQuZGF0YVtvZnMgKyBpXSA9IHg7XG4gICAgaWYgKHggPj0gMCkge1xuICAgICAgYm9ycm93ID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3Jyb3cgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm9ycm93ID09PSAxID8gMCA6IDE7XG59XG5cbi8vIG9jYW1sIGZsaXBzIGNhcnJ5X2luXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IHN1Yl9uYXRcbi8vUmVxdWlyZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBzdWJfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIGNhcnJ5X2luKSB7XG4gIHZhciBib3Jyb3cgPSBjYXJyeV9pbiA9PT0gMSA/IDAgOiAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4ID0gKG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDApIC0gKG5hdDIuZGF0YVtvZnMyICsgaV0gPj4+IDApIC0gYm9ycm93O1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSB4O1xuICAgIGlmICh4ID49IDApIHtcbiAgICAgIGJvcnJvdyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvcnJvdyA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWNyX25hdChuYXQxLCBvZnMxICsgbGVuMiwgbGVuMSAtIGxlbjIsIGJvcnJvdyA9PT0gMSA/IDAgOiAxKTtcbn1cblxuLy8gbmF0MSArPSBuYXQyICogbmF0M1tvZnMzXVxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBtdWx0X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogYWRkX25hdCwgbmF0X29mX2FycmF5XG5mdW5jdGlvbiBtdWx0X2RpZ2l0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBhID0gbmF0My5kYXRhW29mczNdID4+PiAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4MSA9XG4gICAgICAobmF0MS5kYXRhW29mczEgKyBpXSA+Pj4gMCkgK1xuICAgICAgKG5hdDIuZGF0YVtvZnMyICsgaV0gPj4+IDApICogKGEgJiAweDAwMDBmZmZmKSArXG4gICAgICBjYXJyeTtcbiAgICB2YXIgeDIgPSAobmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgKiAoYSA+Pj4gMTYpO1xuICAgIGNhcnJ5ID0gTWF0aC5mbG9vcih4MiAvIDY1NTM2KTtcbiAgICB2YXIgeDMgPSB4MSArICh4MiAlIDY1NTM2KSAqIDY1NTM2O1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSB4MztcbiAgICBjYXJyeSArPSBNYXRoLmZsb29yKHgzIC8gNDI5NDk2NzI5Nik7XG4gIH1cblxuICBpZiAobGVuMiA8IGxlbjEgJiYgY2FycnkpIHtcbiAgICByZXR1cm4gYWRkX25hdChcbiAgICAgIG5hdDEsXG4gICAgICBvZnMxICsgbGVuMixcbiAgICAgIGxlbjEgLSBsZW4yLFxuICAgICAgbmF0X29mX2FycmF5KFtjYXJyeV0pLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcnJ5O1xuICB9XG59XG5cbi8vIG5hdDEgKz0gbmF0MiAqIG5hdDNcbi8vIGxlbjEgPj0gbGVuMiArIGxlbjMuXG4vL1Byb3ZpZGVzOiBtdWx0X25hdFxuLy9SZXF1aXJlczogbXVsdF9kaWdpdF9uYXRcbmZ1bmN0aW9uIG11bHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMsIGxlbjMpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4zOyBpKyspIHtcbiAgICBjYXJyeSArPSBtdWx0X2RpZ2l0X25hdChcbiAgICAgIG5hdDEsXG4gICAgICBvZnMxICsgaSxcbiAgICAgIGxlbjEgLSBpLFxuICAgICAgbmF0MixcbiAgICAgIG9mczIsXG4gICAgICBsZW4yLFxuICAgICAgbmF0MyxcbiAgICAgIG9mczMgKyBpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyBuYXQxID0gMiAqIG5hdDEgKyBuYXQyICogbmF0MlxuLy8gbGVuMSA+PSAyICogbGVuMlxuLy9Qcm92aWRlczogc3F1YXJlX25hdFxuLy9SZXF1aXJlczogbXVsdF9uYXQsIGFkZF9uYXRcbmZ1bmN0aW9uIHNxdWFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgY2FycnkgPSAwO1xuICBjYXJyeSArPSBhZGRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDEsIG9mczEsIGxlbjEsIDApO1xuICBjYXJyeSArPSBtdWx0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQyLCBvZnMyLCBsZW4yKTtcbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X2xlZnRfbmF0XG5mdW5jdGlvbiBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBuYml0cykge1xuICBpZiAobmJpdHMgPT09IDApIHtcbiAgICBuYXQyLmRhdGFbb2ZzMl0gPSAwO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciB3cmFwID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4xOyBpKyspIHtcbiAgICB2YXIgYSA9IG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDA7XG4gICAgbmF0MS5kYXRhW29mczEgKyBpXSA9IChhIDw8IG5iaXRzKSB8IHdyYXA7XG4gICAgd3JhcCA9IGEgPj4+ICgzMiAtIG5iaXRzKTtcbiAgfVxuICBuYXQyLmRhdGFbb2ZzMl0gPSB3cmFwO1xuICByZXR1cm4gMDtcbn1cblxuLy8gQXNzdW1pbmcgYyA+IGEsIHJldHVybnMgW3F1b3RpZW50LCByZW1haW5kZXJdIG9mIChhPDwzMiArIGIpL2Ncbi8vUHJvdmlkZXM6IGRpdl9oZWxwZXJcbmZ1bmN0aW9uIGRpdl9oZWxwZXIoYSwgYiwgYykge1xuICB2YXIgeCA9IGEgKiA2NTUzNiArIChiID4+PiAxNik7XG4gIHZhciB5ID0gTWF0aC5mbG9vcih4IC8gYykgKiA2NTUzNjtcbiAgdmFyIHogPSAoeCAlIGMpICogNjU1MzY7XG4gIHZhciB3ID0geiArIChiICYgMHgwMDAwZmZmZik7XG4gIHJldHVybiBbeSArIE1hdGguZmxvb3IodyAvIGMpLCB3ICUgY107XG59XG5cbi8vIG5hdDFbb2ZzMStsZW5dIDwgbmF0MltvZnMyXVxuLy9Qcm92aWRlczogZGl2X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogZGl2X2hlbHBlclxuZnVuY3Rpb24gZGl2X2RpZ2l0X25hdChuYXRxLCBvZnNxLCBuYXRyLCBvZnNyLCBuYXQxLCBvZnMxLCBsZW4sIG5hdDIsIG9mczIpIHtcbiAgdmFyIHJlbSA9IG5hdDEuZGF0YVtvZnMxICsgbGVuIC0gMV0gPj4+IDA7XG4gIC8vIG5hdHFbb2ZzcStsZW4tMV0gaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIChkdWUgdG8gdGhlIE1TRCByZXF1aXJlbWVudCksXG4gIC8vIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uXG4gIGZvciAodmFyIGkgPSBsZW4gLSAyOyBpID49IDA7IGktLSkge1xuICAgIHZhciB4ID0gZGl2X2hlbHBlcihyZW0sIG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAsIG5hdDIuZGF0YVtvZnMyXSA+Pj4gMCk7XG4gICAgbmF0cS5kYXRhW29mc3EgKyBpXSA9IHhbMF07XG4gICAgcmVtID0geFsxXTtcbiAgfVxuICBuYXRyLmRhdGFbb2Zzcl0gPSByZW07XG4gIHJldHVybiAwO1xufVxuXG4vLyBuYXQxW25hdDI6XSA6PSBuYXQxIC8gbmF0MlxuLy8gbmF0MVs6bmF0Ml0gOj0gbmF0MSAlIG5hdDJcbi8vIGxlbjEgPiBsZW4yLCBuYXQyW29mczIrbGVuMi0xXSA+IG5hdDFbb2ZzMStsZW4xLTFdXG4vL1Byb3ZpZGVzOiBkaXZfbmF0XG4vL1JlcXVpcmVzOiBkaXZfZGlnaXRfbmF0LCBkaXZfaGVscGVyLCBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQsIHNoaWZ0X2xlZnRfbmF0LCBzaGlmdF9yaWdodF9uYXQsIGNyZWF0ZV9uYXQsIHNldF90b196ZXJvX25hdCwgbXVsdF9kaWdpdF9uYXQsIHN1Yl9uYXQsIGNvbXBhcmVfbmF0LCBuYXRfb2ZfYXJyYXlcbmZ1bmN0aW9uIGRpdl9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICBpZiAobGVuMiA9PT0gMSkge1xuICAgIGRpdl9kaWdpdF9uYXQobmF0MSwgb2ZzMSArIDEsIG5hdDEsIG9mczEsIG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHMgPSBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQobmF0Miwgb2ZzMiArIGxlbjIgLSAxKTtcbiAgc2hpZnRfbGVmdF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpO1xuICBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7XG5cbiAgdmFyIGQgPSAobmF0Mi5kYXRhW29mczIgKyBsZW4yIC0gMV0gPj4+IDApICsgMTtcbiAgdmFyIGEgPSBjcmVhdGVfbmF0KGxlbjIgKyAxKTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IGxlbjI7IGktLSkge1xuICAgIC8vIERlY2VudCBsb3dlciBib3VuZCBvbiBxdW9cbiAgICB2YXIgcXVvID1cbiAgICAgIGQgPT09IDQyOTQ5NjcyOTZcbiAgICAgICAgPyBuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwXG4gICAgICAgIDogZGl2X2hlbHBlcihcbiAgICAgICAgICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAsXG4gICAgICAgICAgICBuYXQxLmRhdGFbb2ZzMSArIGkgLSAxXSA+Pj4gMCxcbiAgICAgICAgICAgIGQsXG4gICAgICAgICAgKVswXTtcbiAgICBzZXRfdG9femVyb19uYXQoYSwgMCwgbGVuMiArIDEpO1xuICAgIG11bHRfZGlnaXRfbmF0KGEsIDAsIGxlbjIgKyAxLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoW3F1b10pLCAwKTtcbiAgICBzdWJfbmF0KG5hdDEsIG9mczEgKyBpIC0gbGVuMiwgbGVuMiArIDEsIGEsIDAsIGxlbjIgKyAxLCAxKTtcblxuICAgIHdoaWxlIChcbiAgICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gIT09IDAgfHxcbiAgICAgIGNvbXBhcmVfbmF0KG5hdDEsIG9mczEgKyBpIC0gbGVuMiwgbGVuMiwgbmF0Miwgb2ZzMiwgbGVuMikgPj0gMFxuICAgICkge1xuICAgICAgcXVvID0gcXVvICsgMTtcbiAgICAgIHN1Yl9uYXQobmF0MSwgb2ZzMSArIGkgLSBsZW4yLCBsZW4yICsgMSwgbmF0Miwgb2ZzMiwgbGVuMiwgMSk7XG4gICAgfVxuXG4gICAgbmF0MS5kYXRhW29mczEgKyBpXSA9IHF1bztcbiAgfVxuXG4gIHNoaWZ0X3JpZ2h0X25hdChuYXQxLCBvZnMxLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7IC8vIHNoaWZ0IHJlbWFpbmRlclxuICBzaGlmdF9yaWdodF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpOyAvLyByZXN0b3JlXG4gIHJldHVybiAwO1xufVxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X3JpZ2h0X25hdFxuZnVuY3Rpb24gc2hpZnRfcmlnaHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIG5iaXRzKSB7XG4gIGlmIChuYml0cyA9PT0gMCkge1xuICAgIG5hdDIuZGF0YVtvZnMyXSA9IDA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIHdyYXAgPSAwO1xuICBmb3IgKHZhciBpID0gbGVuMSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGEgPSBuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwO1xuICAgIG5hdDEuZGF0YVtvZnMxICsgaV0gPSAoYSA+Pj4gbmJpdHMpIHwgd3JhcDtcbiAgICB3cmFwID0gYSA8PCAoMzIgLSBuYml0cyk7XG4gIH1cbiAgbmF0Mi5kYXRhW29mczJdID0gd3JhcDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgaWYgKG5hdDEuZGF0YVtvZnMxXSA+IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIDE7XG4gIGlmIChuYXQxLmRhdGFbb2ZzMV0gPCBuYXQyLmRhdGFbb2ZzMl0pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfbmF0XG4vL1JlcXVpcmVzOiBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgYSA9IG51bV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIGxlbjEpO1xuICB2YXIgYiA9IG51bV9kaWdpdHNfbmF0KG5hdDIsIG9mczIsIGxlbjIpO1xuICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChuYXQxLmRhdGFbb2ZzMSArIGldID4+PiAwID4gbmF0Mi5kYXRhW29mczIgKyBpXSA+Pj4gMCkgcmV0dXJuIDE7XG4gICAgaWYgKG5hdDEuZGF0YVtvZnMxICsgaV0gPj4+IDAgPCBuYXQyLmRhdGFbb2ZzMiArIGldID4+PiAwKSByZXR1cm4gLTE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGxhbmRfZGlnaXRfbmF0XG5mdW5jdGlvbiBsYW5kX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSAmPSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBsb3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBsb3JfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdIHw9IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGx4b3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBseG9yX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSBePSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXJpYWxpemVfbmF0XG5mdW5jdGlvbiBzZXJpYWxpemVfbmF0KHdyaXRlciwgbmF0LCBzeikge1xuICB2YXIgbGVuID0gbmF0LmRhdGEubGVuZ3RoO1xuICB3cml0ZXIud3JpdGUoMzIsIGxlbik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB3cml0ZXIud3JpdGUoMzIsIG5hdC5kYXRhW2ldKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHN6WzFdID0gbGVuICogODtcbn1cblxuLy9Qcm92aWRlczogZGVzZXJpYWxpemVfbmF0XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gZGVzZXJpYWxpemVfbmF0KHJlYWRlciwgc3opIHtcbiAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBuYXQgPSBuZXcgTWxOYXQobGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW2ldID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHJldHVybiBuYXQ7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBqc29vX2lzX3dpbjMyXG52YXIganNvb19pc193aW4zMiA9XG4gIGdsb2JhbFRoaXMuRGVubz8uYnVpbGQ/Lm9zID09PSBcIndpbmRvd3NcIiB8fFxuICBnbG9iYWxUaGlzLnByb2Nlc3M/LnBsYXRmb3JtID09PSBcIndpbjMyXCI7XG5cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcz8udmVyc2lvbnM/Lm5vZGUgIT09IHVuZGVmaW5lZDtcbn1cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVEZXZpY2Vcbi8vUmVxdWlyZXM6IE1sTm9kZUZkLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yLCBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHNcbi8vUmVxdWlyZXM6IGpzb29faXNfd2luMzJcbmNsYXNzIE1sTm9kZURldmljZSB7XG4gIGNvbnN0cnVjdG9yKHJvb3QpIHtcbiAgICB0aGlzLmZzID0gcmVxdWlyZShcIm5vZGU6ZnNcIik7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcbiAgfVxuXG4gIG5tKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yb290ICsgbmFtZTtcbiAgfVxuXG4gIGV4aXN0cyhuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmModGhpcy5ubShuYW1lKSkgPyAxIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIGlzRmlsZShuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRmlsZSgpID8gMSA6IDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgbWtkaXIobmFtZSwgbW9kZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLm1rZGlyU3luYyh0aGlzLm5tKG5hbWUpLCB7IG1vZGU6IG1vZGUgfSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgcm1kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnJtZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICByZWFkZGlyKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZnMucmVhZGRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGlzX2RpcihuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRGlyZWN0b3J5KCkgPyAxIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICB1bmxpbmsobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnVubGlua1N5bmModGhpcy5ubShuYW1lKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgdXRpbWVzKG5hbWUsIGF0aW1lLCBtdGltZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXRpbWUgPT09IDAgJiYgbXRpbWUgPT09IDApIHtcbiAgICAgICAgYXRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgIG10aW1lID0gYXRpbWU7XG4gICAgICB9XG4gICAgICB0aGlzLmZzLnV0aW1lc1N5bmModGhpcy5ubShuYW1lKSwgYXRpbWUsIG10aW1lKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICB0cnVuY2F0ZShuYW1lLCBsZW4sIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy50cnVuY2F0ZVN5bmModGhpcy5ubShuYW1lKSwgbGVuIHwgMCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgYWNjZXNzKG5hbWUsIGYsIHJhaXNlX3VuaXgpIHtcbiAgICB2YXIgY29uc3RzID0gdGhpcy5mcy5jb25zdGFudHM7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIga2V5IGluIGYpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5SX09LO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwid1wiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuV19PSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICByZXMgfD0ganNvb19pc193aW4zMiA/IGNvbnN0cy5SX09LIDogY29uc3RzLlhfT0s7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5GX09LO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy5hY2Nlc3NTeW5jKHRoaXMubm0obmFtZSksIHJlcyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbihuYW1lLCBmLCBwZXJtcywgcmFpc2VfdW5peCkge1xuICAgIHZhciBjb25zdHMgPSB0aGlzLmZzLmNvbnN0YW50cztcbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gZikge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcInJkb25seVwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19SRE9OTFk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ3cm9ubHlcIjpcbiAgICAgICAgICByZXMgfD0gY29uc3RzLk9fV1JPTkxZO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmR3clwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19SRFdSO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXBwZW5kXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0FQUEVORDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImNyZWF0ZVwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19DUkVBVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRydW5jYXRlXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX1RSVU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZXhjbFwiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19FWENMO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0JJTkFSWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICByZXMgfD0gY29uc3RzLk9fVEVYVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm5vbmJsb2NrXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX05PTkJMT0NLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibm9jdHR5XCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX05PQ1RUWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRzeW5jXCI6XG4gICAgICAgICAgcmVzIHw9IGNvbnN0cy5PX0RTWU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3luY1wiOlxuICAgICAgICAgIHJlcyB8PSBjb25zdHMuT19TWU5DO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgdmFyIGZkID0gdGhpcy5mcy5vcGVuU3luYyh0aGlzLm5tKG5hbWUpLCByZXMsIHBlcm1zKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQsIGYpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBzbGFzaChuYW1lKSB7XG4gICAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpID8gbmFtZSA6IG5hbWUgKyBcIi9cIjtcbiAgfVxuXG4gIHJlbmFtZShvLCBuLCByYWlzZV91bml4KSB7XG4gICAgaWYgKGpzb29faXNfd2luMzIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLm5tKG4pO1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5ubShvKTtcbiAgICAgICAgdmFyIHRhcmdldF9zdGF0cywgc291cmNlX3N0YXRzO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRhcmdldF9zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmModGFyZ2V0LCB7XG4gICAgICAgICAgICB0aHJvd0lmTm9FbnRyeTogZmFsc2UsXG4gICAgICAgICAgfSkpICYmXG4gICAgICAgICAgKHNvdXJjZV9zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmMoc291cmNlLCB7XG4gICAgICAgICAgICB0aHJvd0lmTm9FbnRyeTogZmFsc2UsXG4gICAgICAgICAgfSkpICYmXG4gICAgICAgICAgc291cmNlX3N0YXRzLmlzRGlyZWN0b3J5KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHRhcmdldF9zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2xhc2godGFyZ2V0KS5zdGFydHNXaXRoKHRoaXMuc2xhc2goc291cmNlKSkpXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcy5ybWRpclN5bmModGFyZ2V0KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRU5PVERJUjogbm90IGEgZGlyZWN0b3J5LCByZW5hbWUgJyR7c291cmNlfScgLT4gJyR7dGFyZ2V0fSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oZXJyLCB7XG4gICAgICAgICAgICAgIGVycm5vOiAtMjAsXG4gICAgICAgICAgICAgIGNvZGU6IFwiRU5PVERJUlwiLFxuICAgICAgICAgICAgICBzeXNjYWxsOiBcInJlbmFtZVwiLFxuICAgICAgICAgICAgICBwYXRoOiB0YXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcy5yZW5hbWVTeW5jKHRoaXMubm0obyksIHRoaXMubm0obikpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZnMucmVuYW1lU3luYyh0aGlzLm5tKG8pLCB0aGlzLm5tKG4pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXQobmFtZSwgbGFyZ2UsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5zdGF0U3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICAgIHJldHVybiBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHMoanNfc3RhdHMsIGxhcmdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgbHN0YXQobmFtZSwgbGFyZ2UsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5sc3RhdFN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgICByZXR1cm4gb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzKGpzX3N0YXRzLCBsYXJnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGNobW9kKG5hbWUsIHBlcm1zLCByYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZnMuY2htb2RTeW5jKHRoaXMubm0obmFtZSksIHBlcm1zKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBsaW5rKHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmxpbmtTeW5jKHRoaXMubm0odGFyZ2V0KSwgdGhpcy5ubShwYXRoKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG5cbiAgc3ltbGluayh0b19kaXIsIHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLnN5bWxpbmtTeW5jKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHRoaXMubm0ocGF0aCksXG4gICAgICAgIHRvX2RpciA9PT0gMCA/IG51bGwgOiB0b19kaXJbMV0gPyBcImRpclwiIDogXCJmaWxlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRsaW5rKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGxpbmsgPSB0aGlzLmZzLnJlYWRsaW5rU3luYyh0aGlzLm5tKG5hbWUpLCBcInV0ZjhcIik7XG4gICAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobGluayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5kaXIobmFtZSwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mcy5vcGVuZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IG9jYW1sX3N0YXRzX2Zyb21fbm9kZV9zdGF0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdFxuZnVuY3Rpb24gb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzKGpzX3N0YXRzLCBsYXJnZSkge1xuICAvKiA9PT1Vbml4LmZpbGVfa2luZD09PVxuICAgKiB0eXBlIGZpbGVfa2luZCA9XG4gICAqICAgICBTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgKCoqIFJlZ3VsYXIgZmlsZSAqKVxuICAgKiAgIHwgU19ESVIgICAgICAgICAgICAgICAgICAgICAgICgqKiBEaXJlY3RvcnkgKilcbiAgICogICB8IFNfQ0hSICAgICAgICAgICAgICAgICAgICAgICAoKiogQ2hhcmFjdGVyIGRldmljZSAqKVxuICAgKiAgIHwgU19CTEsgICAgICAgICAgICAgICAgICAgICAgICgqKiBCbG9jayBkZXZpY2UgKilcbiAgICogICB8IFNfTE5LICAgICAgICAgICAgICAgICAgICAgICAoKiogU3ltYm9saWMgbGluayAqKVxuICAgKiAgIHwgU19GSUZPICAgICAgICAgICAgICAgICAgICAgICgqKiBOYW1lZCBwaXBlICopXG4gICAqICAgfCBTX1NPQ0sgICAgICAgICAgICAgICAgICAgICAgKCoqIFNvY2tldCAqKVxuICAgKi9cbiAgdmFyIGZpbGVfa2luZDtcbiAgaWYgKGpzX3N0YXRzLmlzRmlsZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMDtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgZmlsZV9raW5kID0gMTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0NoYXJhY3RlckRldmljZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMjtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0Jsb2NrRGV2aWNlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAzO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBmaWxlX2tpbmQgPSA0O1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzRklGTygpKSB7XG4gICAgZmlsZV9raW5kID0gNTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc1NvY2tldCgpKSB7XG4gICAgZmlsZV9raW5kID0gNjtcbiAgfVxuICAvKiA9PT1Vbml4LnN0YXRzPT09XG4gICAqIHR5cGUgc3RhdHMgPVxuICAgKiAgeyBzdF9kZXYgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIERldmljZSBudW1iZXIgKilcbiAgICogICAgc3RfaW5vIDogaW50OyAgICAgICAgICAgICAgICgqKiBJbm9kZSBudW1iZXIgKilcbiAgICogICAgc3Rfa2luZCA6IGZpbGVfa2luZDsgICAgICAgICgqKiBLaW5kIG9mIHRoZSBmaWxlICopXG4gICAqICAgIHN0X3Blcm0gOiBmaWxlX3Blcm07ICAgICAgICAoKiogQWNjZXNzIHJpZ2h0cyAqKVxuICAgKiAgICBzdF9ubGluayA6IGludDsgICAgICAgICAgICAgKCoqIE51bWJlciBvZiBsaW5rcyAqKVxuICAgKiAgICBzdF91aWQgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIFVzZXIgaWQgb2YgdGhlIG93bmVyICopXG4gICAqICAgIHN0X2dpZCA6IGludDsgICAgICAgICAgICAgICAoKiogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cCAqKVxuICAgKiAgICBzdF9yZGV2IDogaW50OyAgICAgICAgICAgICAgKCoqIERldmljZSBJRCAoaWYgc3BlY2lhbCBmaWxlKSAqKVxuICAgKiAgICBzdF9zaXplIDogaW50OyAgICAgICAgICAgICAgKCoqIFNpemUgaW4gYnl0ZXMgKilcbiAgICogICAgc3RfYXRpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IGFjY2VzcyB0aW1lICopXG4gICAqICAgIHN0X210aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSAqKVxuICAgKiAgICBzdF9jdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3Qgc3RhdHVzIGNoYW5nZSB0aW1lICopXG4gICAqICB9XG4gICAqL1xuICByZXR1cm4gQkxPQ0soXG4gICAgMCxcbiAgICBqc19zdGF0cy5kZXYsXG4gICAganNfc3RhdHMuaW5vIHwgMCxcbiAgICBmaWxlX2tpbmQsXG4gICAganNfc3RhdHMubW9kZSxcbiAgICBqc19zdGF0cy5ubGluayxcbiAgICBqc19zdGF0cy51aWQsXG4gICAganNfc3RhdHMuZ2lkLFxuICAgIGpzX3N0YXRzLnJkZXYsXG4gICAgbGFyZ2UgPyBjYW1sX2ludDY0X29mX2Zsb2F0KGpzX3N0YXRzLnNpemUpIDoganNfc3RhdHMuc2l6ZSB8IDAsXG4gICAganNfc3RhdHMuYXRpbWVNcyAvIDEwMDAsXG4gICAganNfc3RhdHMubXRpbWVNcyAvIDEwMDAsXG4gICAganNfc3RhdHMuY3RpbWVNcyAvIDEwMDAsXG4gICk7XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZURldmljZVxuLy9JZjogYnJvd3NlclxuY2xhc3MgTWxOb2RlRGV2aWNlIHt9XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL1JlcXVpcmVzOiBNbEZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX3NldCwgY2FtbF9yYWlzZV9zeXNfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yLCBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvciwgb2NhbWxfc3RhdHNfZnJvbV9ub2RlX3N0YXRzXG5jbGFzcyBNbE5vZGVGZCBleHRlbmRzIE1sRmlsZSB7XG4gIGNvbnN0cnVjdG9yKGZkLCBmbGFncykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mcyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpO1xuICAgIHRoaXMuZmQgPSBmZDtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBzdGF0cyA9IHRoaXMuZnMuZnN0YXRTeW5jKGZkKTtcbiAgICAgIGZsYWdzLm5vU2VlayA9XG4gICAgICAgIHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHwgc3RhdHMuaXNGSUZPKCkgfHwgc3RhdHMuaXNTb2NrZXQoKTtcbiAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5mbGFncy5hcHBlbmQgPyBzdGF0cy5zaXplIDogMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFRoZSBmc3RhdCB3aWxsIGZhaWwgb24gc3RhbmRhcmQgc3RyZWFtcyB1bmRlciBXaW5kb3dzIHdpdGggbm9kZVxuICAgICAgLy8gMTggKGFuZCBsb3dlcikuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbGlidXYvbGlidXYvcHVsbC8zODExLlxuICAgICAgZmxhZ3Mubm9TZWVrID0gdHJ1ZTtcbiAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5zZWVrZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHRydW5jYXRlKGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmZ0cnVuY2F0ZVN5bmModGhpcy5mZCwgbGVuIHwgMCk7XG4gICAgICBpZiAodGhpcy5vZmZzZXQgPiBsZW4pIHRoaXMub2Zmc2V0ID0gbGVuO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgICB9XG4gIH1cblxuICBpc2F0dHkoKSB7XG4gICAgdmFyIHR0eSA9IHJlcXVpcmUoXCJub2RlOnR0eVwiKTtcbiAgICByZXR1cm4gdHR5LmlzYXR0eSh0aGlzLmZkKSA/IDEgOiAwO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5mcy5mc3RhdFN5bmModGhpcy5mZCkuc2l6ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZShidWYsIGJ1Zl9vZmZzZXQsIGxlbiwgcmFpc2VfdW5peCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mbGFncy5ub1NlZWsgfHwgIXRoaXMuc2Vla2VkKSB7XG4gICAgICAgIHZhciB3cml0dGVuID0gdGhpcy5mcy53cml0ZVN5bmModGhpcy5mZCwgYnVmLCBidWZfb2Zmc2V0LCBsZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHdyaXR0ZW4gPSB0aGlzLmZzLndyaXRlU3luYyhcbiAgICAgICAgICB0aGlzLmZkLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBidWZfb2Zmc2V0LFxuICAgICAgICAgIGxlbixcbiAgICAgICAgICB0aGlzLm9mZnNldCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2Zmc2V0ICs9IHdyaXR0ZW47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgICByZXR1cm4gd3JpdHRlbjtcbiAgfVxuXG4gIHJlYWQoYSwgYnVmX29mZnNldCwgbGVuLCByYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZsYWdzLm5vU2VlayB8fCAhdGhpcy5zZWVrZWQpIHtcbiAgICAgICAgdmFyIHJlYWQgPSB0aGlzLmZzLnJlYWRTeW5jKHRoaXMuZmQsIGEsIGJ1Zl9vZmZzZXQsIGxlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVhZCA9IHRoaXMuZnMucmVhZFN5bmModGhpcy5mZCwgYSwgYnVmX29mZnNldCwgbGVuLCB0aGlzLm9mZnNldCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCArPSByZWFkO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIHNlZWsob2Zmc2V0LCB3aGVuY2UsIHJhaXNlX3VuaXgpIHtcbiAgICBpZiAodGhpcy5mbGFncy5ub1NlZWspIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKHJhaXNlX3VuaXgsIFwiRVNQSVBFXCIsIFwibHNlZWtcIiwgXCJpbGxlZ2FsIHNlZWtcIik7XG4gICAgfVxuICAgIHN3aXRjaCAod2hlbmNlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c3RlbV9lcnJvcihcbiAgICAgICAgcmFpc2VfdW5peCxcbiAgICAgICAgXCJFSU5WQUxcIixcbiAgICAgICAgXCJsc2Vla1wiLFxuICAgICAgICBcImludmFsaWQgYXJndW1lbnRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHRoaXMuc2Vla2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5vZmZzZXQ7XG4gIH1cblxuICBwb3MoKSB7XG4gICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICB9XG5cbiAgc3RhdChsYXJnZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIganNfc3RhdHMgPSB0aGlzLmZzLmZzdGF0U3luYyh0aGlzLmZkKTtcbiAgICAgIHJldHVybiBvY2FtbF9zdGF0c19mcm9tX25vZGVfc3RhdHMoanNfc3RhdHMsIGxhcmdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgICB9XG4gIH1cblxuICBjaG1vZChwZXJtcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmZzLmZjaG1vZFN5bmModGhpcy5mZCwgcGVybXMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gMSk7XG4gICAgfVxuICB9XG5cbiAgc3luYygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcy5mc3luY1N5bmModGhpcy5mZCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgLyogcmFpc2UgVW5peF9lcnJvciAqLyAxKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyYWlzZV91bml4KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZnMuY2xvc2VTeW5jKHRoaXMuZmQpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYW1sX3JhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrX3N0cmVhbV9zZW1hbnRpY3MoY21kKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBqc19zdGF0cyA9IHRoaXMuZnMuZnN0YXRTeW5jKHRoaXMuZmQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCAvKiByYWlzZSBVbml4X2Vycm9yICovIDEsIGNtZCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGpzX3N0YXRzLmlzRmlsZSgpIHx8XG4gICAgICAgIGpzX3N0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICAgICAganNfc3RhdHMuaXNGSUZPKCkgfHxcbiAgICAgICAganNfc3RhdHMuaXNTb2NrZXQoKVxuICAgICAgKVxuICAgIClcbiAgICAgIGNhbWxfcmFpc2Vfc3lzdGVtX2Vycm9yKFxuICAgICAgICAvKiByYWlzZSBVbml4X2Vycm9yICovIDEsXG4gICAgICAgIFwiRUlOVkFMXCIsXG4gICAgICAgIGNtZCxcbiAgICAgICAgXCJpbnZhbGlkIGFyZ3VtZW50XCIsXG4gICAgICApO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL0lmOiBicm93c2VyXG5jbGFzcyBNbE5vZGVGZCB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlXG4vL1JlcXVpcmVzOiBNbE5vZGVGZFxuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpIHtcbiAgaWYgKGZsYWdzLmFsdG5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGZzID0gcmVxdWlyZShcIm5vZGU6ZnNcIik7XG4gICAgICB2YXIgZmQyID0gZnMub3BlblN5bmMoZmxhZ3MuYWx0bmFtZSwgXCJyc1wiKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQyLCBmbGFncyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gbmV3IE1sTm9kZUZkKGZkLCBmbGFncyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5fZm9yX25vZGVcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5fZm9yX25vZGUoX2ZkLCBfZmxhZ3MpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm9kZWpzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfYXJncywgbWFrZV91bml4X2Vycl9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4LCBjbWQpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKFwiVW5peC5Vbml4X2Vycm9yXCIpO1xuICBpZiAocmFpc2VfdW5peCAmJiB1bml4X2Vycm9yKSB7XG4gICAgdmFyIGFyZ3MgPSBtYWtlX3VuaXhfZXJyX2FyZ3MoXG4gICAgICBlcnIuY29kZSxcbiAgICAgIGNtZCB8fCBlcnIuc3lzY2FsbCxcbiAgICAgIGVyci5wYXRoLFxuICAgICAgZXJyLmVycm5vLFxuICAgICk7XG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZCwgQW5keSBSYXlcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbi8vXG4vLyBCaWdhcnJheS5cbi8vXG4vLyAtIGFsbCBiaWdhcnJheSB0eXBlcyBpbmNsdWRpbmcgSW50NjQgYW5kIENvbXBsZXguXG4vLyAtIGZvcnRyYW4gKyBjIGxheW91dHNcbi8vIC0gc3ViL3NsaWNlL3Jlc2hhcGVcbi8vIC0gcmV0YWluIGZhc3QgcGF0aCBmb3IgMWQgYXJyYXkgYWNjZXNzXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfaW5pdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9iYV9pbml0KCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9zaXplKGRpbXMpIHtcbiAgdmFyIG5fZGltcyA9IGRpbXMubGVuZ3RoO1xuICB2YXIgc2l6ZSA9IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbl9kaW1zOyBpKyspIHtcbiAgICBpZiAoZGltc1tpXSA8IDApXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5jcmVhdGU6IG5lZ2F0aXZlIGRpbWVuc2lvblwiKTtcbiAgICBzaXplID0gc2l6ZSAqIGRpbXNbaV07XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5wYWNrRmxvYXQxNlxudmFyIGNhbWxfdW5wYWNrRmxvYXQxNiA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBwb3cgPSBNYXRoLnBvdztcblxuICB2YXIgRVhQX01BU0sxNiA9IDMxOyAvLyAyICoqIDUgLSAxXG4gIHZhciBTSUdOSUZJQ0FORF9NQVNLMTYgPSAxMDIzOyAvLyAyICoqIDEwIC0gMVxuICB2YXIgTUlOX1NVQk5PUk1BTDE2ID0gcG93KDIsIC0yNCk7IC8vIDIgKiogLTEwICogMiAqKiAtMTRcbiAgdmFyIFNJR05JRklDQU5EX0RFTk9NMTYgPSAwLjAwMDk3NjU2MjU7IC8vIDIgKiogLTEwXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChieXRlcykge1xuICAgIHZhciBzaWduID0gYnl0ZXMgPj4+IDE1O1xuICAgIHZhciBleHBvbmVudCA9IChieXRlcyA+Pj4gMTApICYgRVhQX01BU0sxNjtcbiAgICB2YXIgc2lnbmlmaWNhbmQgPSBieXRlcyAmIFNJR05JRklDQU5EX01BU0sxNjtcbiAgICBpZiAoZXhwb25lbnQgPT09IEVYUF9NQVNLMTYpXG4gICAgICByZXR1cm4gc2lnbmlmaWNhbmQgPT09IDBcbiAgICAgICAgPyBzaWduID09PSAwXG4gICAgICAgICAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICA6IE51bWJlci5OYU47XG4gICAgaWYgKGV4cG9uZW50ID09PSAwKVxuICAgICAgcmV0dXJuIHNpZ25pZmljYW5kICogKHNpZ24gPT09IDAgPyBNSU5fU1VCTk9STUFMMTYgOiAtTUlOX1NVQk5PUk1BTDE2KTtcbiAgICB2YXIgciA9XG4gICAgICBwb3coMiwgZXhwb25lbnQgLSAxNSkgKlxuICAgICAgKHNpZ24gPT09IDBcbiAgICAgICAgPyAxICsgc2lnbmlmaWNhbmQgKiBTSUdOSUZJQ0FORF9ERU5PTTE2XG4gICAgICAgIDogLTEgLSBzaWduaWZpY2FuZCAqIFNJR05JRklDQU5EX0RFTk9NMTYpO1xuICAgIHJldHVybiByO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9wYWNrRmxvYXQxNlxudmFyIGNhbWxfcGFja0Zsb2F0MTYgPSAoZnVuY3Rpb24gKCkge1xuICBjb25zdCBJTlZFUlNFX09GX0VQU0lMT04gPSAxIC8gTnVtYmVyLkVQU0lMT047XG5cbiAgZnVuY3Rpb24gcm91bmRUaWVzVG9FdmVuKG51bSkge1xuICAgIHJldHVybiBudW0gKyBJTlZFUlNFX09GX0VQU0lMT04gLSBJTlZFUlNFX09GX0VQU0lMT047XG4gIH1cblxuICBjb25zdCBGTE9BVDE2X01JTl9WQUxVRSA9IDYuMTAzNTE1NjI1ZS01O1xuICBjb25zdCBGTE9BVDE2X01BWF9WQUxVRSA9IDY1NTA0O1xuICBjb25zdCBGTE9BVDE2X0VQU0lMT04gPSAwLjAwMDk3NjU2MjU7XG5cbiAgY29uc3QgRkxPQVQxNl9FUFNJTE9OX01VTFRJUExJRURfQllfRkxPQVQxNl9NSU5fVkFMVUUgPVxuICAgIEZMT0FUMTZfRVBTSUxPTiAqIEZMT0FUMTZfTUlOX1ZBTFVFO1xuICBjb25zdCBGTE9BVDE2X0VQU0lMT05fREVWSURFRF9CWV9FUFNJTE9OID1cbiAgICBGTE9BVDE2X0VQU0lMT04gKiBJTlZFUlNFX09GX0VQU0lMT047XG5cbiAgZnVuY3Rpb24gcm91bmRUb0Zsb2F0MTYobnVtKSB7XG4gICAgY29uc3QgbnVtYmVyID0gK251bTtcblxuICAgIC8vIE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLTBcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXIpIHx8IG51bWJlciA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvLyBmaW5pdGUgZXhjZXB0IDAsIC0wXG4gICAgY29uc3Qgc2lnbiA9IG51bWJlciA+IDAgPyAxIDogLTE7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBNYXRoLmFicyhudW1iZXIpO1xuXG4gICAgLy8gc21hbGwgbnVtYmVyXG4gICAgaWYgKGFic29sdXRlIDwgRkxPQVQxNl9NSU5fVkFMVUUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNpZ24gKlxuICAgICAgICByb3VuZFRpZXNUb0V2ZW4oXG4gICAgICAgICAgYWJzb2x1dGUgLyBGTE9BVDE2X0VQU0lMT05fTVVMVElQTElFRF9CWV9GTE9BVDE2X01JTl9WQUxVRSxcbiAgICAgICAgKSAqXG4gICAgICAgIEZMT0FUMTZfRVBTSUxPTl9NVUxUSVBMSUVEX0JZX0ZMT0FUMTZfTUlOX1ZBTFVFXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXAgPSAoMSArIEZMT0FUMTZfRVBTSUxPTl9ERVZJREVEX0JZX0VQU0lMT04pICogYWJzb2x1dGU7XG4gICAgY29uc3QgcmVzdWx0ID0gdGVtcCAtICh0ZW1wIC0gYWJzb2x1dGUpO1xuXG4gICAgLy8gbGFyZ2UgbnVtYmVyXG4gICAgaWYgKHJlc3VsdCA+IEZMT0FUMTZfTUFYX1ZBTFVFIHx8IE51bWJlci5pc05hTihyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gc2lnbiAqIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbiAqIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGJhc2UgYWxnb3JpdGhtOiBodHRwOi8vZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcblxuICBjb25zdCBiYXNlVGFibGUgPSBuZXcgVWludDE2QXJyYXkoNTEyKTtcbiAgY29uc3Qgc2hpZnRUYWJsZSA9IG5ldyBVaW50OEFycmF5KDUxMik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGNvbnN0IGUgPSBpIC0gMTI3O1xuXG4gICAgLy8gdmVyeSBzbWFsbCBudW1iZXIgKDAsIC0wKVxuICAgIGlmIChlIDwgLTI0KSB7XG4gICAgICBiYXNlVGFibGVbaV0gPSAweDAwMDA7XG4gICAgICBiYXNlVGFibGVbaSB8IDB4MTAwXSA9IDB4ODAwMDtcbiAgICAgIHNoaWZ0VGFibGVbaV0gPSAyNDtcbiAgICAgIHNoaWZ0VGFibGVbaSB8IDB4MTAwXSA9IDI0O1xuXG4gICAgICAvLyBzbWFsbCBudW1iZXIgKGRlbm9ybSlcbiAgICB9IGVsc2UgaWYgKGUgPCAtMTQpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IDB4MDQwMCA+PiAoLWUgLSAxNCk7XG4gICAgICBiYXNlVGFibGVbaSB8IDB4MTAwXSA9ICgweDA0MDAgPj4gKC1lIC0gMTQpKSB8IDB4ODAwMDtcbiAgICAgIHNoaWZ0VGFibGVbaV0gPSAtZSAtIDE7XG4gICAgICBzaGlmdFRhYmxlW2kgfCAweDEwMF0gPSAtZSAtIDE7XG5cbiAgICAgIC8vIG5vcm1hbCBudW1iZXJcbiAgICB9IGVsc2UgaWYgKGUgPD0gMTUpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IChlICsgMTUpIDw8IDEwO1xuICAgICAgYmFzZVRhYmxlW2kgfCAweDEwMF0gPSAoKGUgKyAxNSkgPDwgMTApIHwgMHg4MDAwO1xuICAgICAgc2hpZnRUYWJsZVtpXSA9IDEzO1xuICAgICAgc2hpZnRUYWJsZVtpIHwgMHgxMDBdID0gMTM7XG5cbiAgICAgIC8vIGxhcmdlIG51bWJlciAoSW5maW5pdHksIC1JbmZpbml0eSlcbiAgICB9IGVsc2UgaWYgKGUgPCAxMjgpIHtcbiAgICAgIGJhc2VUYWJsZVtpXSA9IDB4N2MwMDtcbiAgICAgIGJhc2VUYWJsZVtpIHwgMHgxMDBdID0gMHhmYzAwO1xuICAgICAgc2hpZnRUYWJsZVtpXSA9IDI0O1xuICAgICAgc2hpZnRUYWJsZVtpIHwgMHgxMDBdID0gMjQ7XG5cbiAgICAgIC8vIHN0YXkgKE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZVRhYmxlW2ldID0gMHg3YzAwO1xuICAgICAgYmFzZVRhYmxlW2kgfCAweDEwMF0gPSAweGZjMDA7XG4gICAgICBzaGlmdFRhYmxlW2ldID0gMTM7XG4gICAgICBzaGlmdFRhYmxlW2kgfCAweDEwMF0gPSAxMztcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNCk7XG4gIGNvbnN0IGZsb2F0VmlldyA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgY29uc3QgdWludDMyVmlldyA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAobnVtKSB7XG4gICAgZmxvYXRWaWV3WzBdID0gcm91bmRUb0Zsb2F0MTYobnVtKTtcbiAgICBjb25zdCBmID0gdWludDMyVmlld1swXTtcbiAgICBjb25zdCBlID0gKGYgPj4gMjMpICYgMHgxZmY7XG4gICAgcmV0dXJuIGJhc2VUYWJsZVtlXSArICgoZiAmIDB4MDA3ZmZmZmYpID4+IHNoaWZ0VGFibGVbZV0pO1xuICB9O1xufSkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKSB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgNzpcbiAgICBjYXNlIDEwOlxuICAgIGNhc2UgMTE6XG4gICAgICByZXR1cm4gMjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlX2J1ZmZlcihraW5kLCBzaXplKSB7XG4gIHZhciB2aWV3O1xuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlIDA6XG4gICAgICB2aWV3ID0gRmxvYXQzMkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgdmlldyA9IEZsb2F0NjRBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZpZXcgPSBJbnQ4QXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2aWV3ID0gVWludDhBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZpZXcgPSBJbnQxNkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgdmlldyA9IFVpbnQxNkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OlxuICAgICAgdmlldyA9IEludDMyQXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICB2aWV3ID0gSW50MzJBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHZpZXcgPSBJbnQzMkFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgdmlldyA9IEludDMyQXJyYXk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEwOlxuICAgICAgdmlldyA9IEZsb2F0MzJBcnJheTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6XG4gICAgICB2aWV3ID0gRmxvYXQ2NEFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjpcbiAgICAgIHZpZXcgPSBVaW50OEFycmF5O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMzpcbiAgICAgIHZpZXcgPSBVaW50MTZBcnJheTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmICghdmlldykgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuY3JlYXRlOiB1bnN1cHBvcnRlZCBraW5kXCIpO1xuICB2YXIgZGF0YSA9IG5ldyB2aWV3KHNpemUgKiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpKTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3VzdG9tX25hbWVcbnZhciBjYW1sX2JhX2N1c3RvbV9uYW1lID0gXCJfYmlnYXJyMDJcIjtcblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9jdXN0b21fbmFtZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGksIGNhbWxfaW50NjRfaGkzMiwgY2FtbF9pbnQ2NF9sbzMyXG4vL1JlcXVpcmVzOiBjYW1sX3BhY2tGbG9hdDE2LCBjYW1sX3VucGFja0Zsb2F0MTZcbmNsYXNzIE1sX0JpZ2FycmF5IHtcbiAgY29uc3RydWN0b3Ioa2luZCwgbGF5b3V0LCBkaW1zLCBidWZmZXIpIHtcbiAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIHRoaXMuZGltcyA9IGRpbXM7XG4gICAgdGhpcy5kYXRhID0gYnVmZmVyO1xuICAgIHRoaXMuY2FtbF9jdXN0b20gPSBjYW1sX2JhX2N1c3RvbV9uYW1lO1xuICB9XG5cbiAgb2Zmc2V0KGFyZykge1xuICAgIHZhciBvZnMgPSAwO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSBhcmcgPSBbYXJnXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImJpZ2FycmF5LmpzOiBpbnZhbGlkIG9mZnNldFwiKTtcbiAgICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPT0gYXJnLmxlbmd0aClcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmdldC9zZXQ6IGJhZCBudW1iZXIgb2YgZGltZW5zaW9uc1wiKTtcbiAgICBpZiAodGhpcy5sYXlvdXQgPT09IDAgLyogY19sYXlvdXQgKi8pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmdbaV0gPCAwIHx8IGFyZ1tpXSA+PSB0aGlzLmRpbXNbaV0pIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgICAgb2ZzID0gb2ZzICogdGhpcy5kaW1zW2ldICsgYXJnW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy5kaW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChhcmdbaV0gPCAxIHx8IGFyZ1tpXSA+IHRoaXMuZGltc1tpXSkge1xuICAgICAgICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBvZnMgPSBvZnMgKiB0aGlzLmRpbXNbaV0gKyAoYXJnW2ldIC0gMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZnM7XG4gIH1cblxuICBnZXQob2ZzKSB7XG4gICAgc3dpdGNoICh0aGlzLmtpbmQpIHtcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gSW50NjRcbiAgICAgICAgdmFyIGwgPSB0aGlzLmRhdGFbb2ZzICogMiArIDBdO1xuICAgICAgICB2YXIgaCA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMV07XG4gICAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsLCBoKTtcbiAgICAgIGNhc2UgMTA6XG4gICAgICBjYXNlIDExOlxuICAgICAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgICAgICB2YXIgciA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMF07XG4gICAgICAgIHZhciBpID0gdGhpcy5kYXRhW29mcyAqIDIgKyAxXTtcbiAgICAgICAgcmV0dXJuIFsyNTQsIHIsIGldO1xuICAgICAgY2FzZSAxMzpcbiAgICAgICAgcmV0dXJuIGNhbWxfdW5wYWNrRmxvYXQxNih0aGlzLmRhdGFbb2ZzXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW29mc107XG4gICAgfVxuICB9XG5cbiAgc2V0KG9mcywgdikge1xuICAgIHN3aXRjaCAodGhpcy5raW5kKSB7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIC8vIEludDY0XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSBjYW1sX2ludDY0X2xvMzIodik7XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMV0gPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSB2WzFdO1xuICAgICAgICB0aGlzLmRhdGFbb2ZzICogMiArIDFdID0gdlsyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLmRhdGFbb2ZzXSA9IGNhbWxfcGFja0Zsb2F0MTYodik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5kYXRhW29mc10gPSB2O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmaWxsKHYpIHtcbiAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgY2FzZSA3OlxuICAgICAgICAvLyBJbnQ2NFxuICAgICAgICB2YXIgYSA9IGNhbWxfaW50NjRfbG8zMih2KTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmZpbGwoYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IGkgJSAyID09PSAwID8gYSA6IGI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgICAgIHZhciBpbSA9IHZbMV07XG4gICAgICAgIHZhciByZSA9IHZbMl07XG4gICAgICAgIGlmIChpbSA9PT0gcmUpIHtcbiAgICAgICAgICB0aGlzLmRhdGEuZmlsbChpbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IGkgJSAyID09PSAwID8gaW0gOiByZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLmRhdGEuZmlsbChjYW1sX3BhY2tGbG9hdDE2KHYpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyZShiLCB0b3RhbCkge1xuICAgIGlmICh0aGlzLmxheW91dCAhPT0gYi5sYXlvdXQgfHwgdGhpcy5raW5kICE9PSBiLmtpbmQpIHtcbiAgICAgIHZhciBrMSA9IHRoaXMua2luZCB8ICh0aGlzLmxheW91dCA8PCA4KTtcbiAgICAgIHZhciBrMiA9IGIua2luZCB8IChiLmxheW91dCA8PCA4KTtcbiAgICAgIHJldHVybiBrMiAtIGsxO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPT0gYi5kaW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGIuZGltcy5sZW5ndGggLSB0aGlzLmRpbXMubGVuZ3RoO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGltcy5sZW5ndGg7IGkrKylcbiAgICAgIGlmICh0aGlzLmRpbXNbaV0gIT09IGIuZGltc1tpXSkgcmV0dXJuIHRoaXMuZGltc1tpXSA8IGIuZGltc1tpXSA/IC0xIDogMTtcbiAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAxMDpcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIC8vIEZsb2F0c1xuICAgICAgICB2YXIgeCwgeTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4ID0gdGhpcy5kYXRhW2ldO1xuICAgICAgICAgIHkgPSBiLmRhdGFbaV07XG4gICAgICAgICAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKHggPiB5KSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoeCAhPT0geSkge1xuICAgICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTih4KSkgcmV0dXJuIDE7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTih5KSkgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gSW50NjRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAvLyBDaGVjayBoaWdoZXN0IGJpdHMgZmlyc3RcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA8IGIuZGF0YVtpICsgMV0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA+IGIuZGF0YVtpICsgMV0pIHJldHVybiAxO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPj4+IDAgPCBiLmRhdGFbaV0gPj4+IDApIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID4+PiAwID4gYi5kYXRhW2ldID4+PiAwKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGFhID0gY2FtbF91bnBhY2tGbG9hdDE2KHRoaXMuZGF0YVtpXSk7XG4gICAgICAgICAgdmFyIGJiID0gY2FtbF91bnBhY2tGbG9hdDE2KGIuZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGFhIDwgYmIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYWEgPiBiYikgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDg6XG4gICAgICBjYXNlIDk6XG4gICAgICBjYXNlIDEyOlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPCBiLmRhdGFbaV0pIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID4gYi5kYXRhW2ldKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlfY18xXzFcbi8vUmVxdWlyZXM6IE1sX0JpZ2FycmF5LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmNsYXNzIE1sX0JpZ2FycmF5X2NfMV8xIGV4dGVuZHMgTWxfQmlnYXJyYXkge1xuICBvZmZzZXQoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCA9PT0gMSkgYXJnID0gYXJnWzBdO1xuICAgICAgZWxzZSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJNbF9CaWdhcnJheV9jXzFfMS5vZmZzZXRcIik7XG4gICAgfVxuICAgIGlmIChhcmcgPCAwIHx8IGFyZyA+PSB0aGlzLmRpbXNbMF0pIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICByZXR1cm4gYXJnO1xuICB9XG5cbiAgZ2V0KG9mcykge1xuICAgIHJldHVybiB0aGlzLmRhdGFbb2ZzXTtcbiAgfVxuXG4gIHNldChvZnMsIHYpIHtcbiAgICB0aGlzLmRhdGFbb2ZzXSA9IHY7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBmaWxsKHYpIHtcbiAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NvbXBhcmVcbmZ1bmN0aW9uIGNhbWxfYmFfY29tcGFyZShhLCBiLCB0b3RhbCkge1xuICByZXR1cm4gYS5jb21wYXJlKGIsIHRvdGFsKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBNbF9CaWdhcnJheSwgTWxfQmlnYXJyYXlfY18xXzEsIGNhbWxfYmFfZ2V0X3NpemUsIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSkge1xuICB2YXIgc2l6ZV9wZXJfZWxlbWVudCA9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCk7XG4gIGlmIChjYW1sX2JhX2dldF9zaXplKGRpbXMpICogc2l6ZV9wZXJfZWxlbWVudCAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJsZW5ndGggZG9lc24ndCBtYXRjaCBkaW1zXCIpO1xuICB9XG4gIGlmIChcbiAgICBsYXlvdXQgPT09IDAgJiYgLy8gY19sYXlvdXRcbiAgICBkaW1zLmxlbmd0aCA9PT0gMSAmJiAvLyBBcnJheTFcbiAgICBzaXplX3Blcl9lbGVtZW50ID09PSAxICYmXG4gICAga2luZCAhPT0gMTMgLy8gZmxvYXQxNlxuICApXG4gICAgLy8gMS10by0xIG1hcHBpbmdcbiAgICByZXR1cm4gbmV3IE1sX0JpZ2FycmF5X2NfMV8xKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG4gIHJldHVybiBuZXcgTWxfQmlnYXJyYXkoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlKGtpbmQsIGxheW91dCwgZGltc19tbCkge1xuICB2YXIgZGltcyA9IGNhbWxfanNfZnJvbV9hcnJheShkaW1zX21sKTtcbiAgdmFyIGRhdGEgPSBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGNhbWxfYmFfY2hhbmdlX2xheW91dChiYSwgbGF5b3V0KSB7XG4gIGlmIChiYS5sYXlvdXQgPT09IGxheW91dCkgcmV0dXJuIGJhO1xuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIG5ld19kaW1zW2ldID0gYmEuZGltc1tiYS5kaW1zLmxlbmd0aCAtIGkgLSAxXTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBsYXlvdXQsIG5ld19kaW1zLCBiYS5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9raW5kXG5mdW5jdGlvbiBjYW1sX2JhX2tpbmQoYmEpIHtcbiAgcmV0dXJuIGJhLmtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbGF5b3V0XG5mdW5jdGlvbiBjYW1sX2JhX2xheW91dChiYSkge1xuICByZXR1cm4gYmEubGF5b3V0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX251bV9kaW1zXG5mdW5jdGlvbiBjYW1sX2JhX251bV9kaW1zKGJhKSB7XG4gIHJldHVybiBiYS5kaW1zLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1cbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9kaW0oYmEsIGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gYmEuZGltcy5sZW5ndGgpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmRpbVwiKTtcbiAgcmV0dXJuIGJhLmRpbXNbaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzFcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8xKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzJcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8yKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzNcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8zKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfZ2VuZXJpYyhiYSwgaSkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSk7XG4gIHJldHVybiBiYS5nZXQob2ZzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQxNihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMpO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHJldHVybiBiMSB8IChiMiA8PCA4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQzMihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAzID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMgKyAwKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcyArIDEpO1xuICB2YXIgYjMgPSBiYS5nZXQob2ZzICsgMik7XG4gIHZhciBiNCA9IGJhLmdldChvZnMgKyAzKTtcbiAgcmV0dXJuIChiMSA8PCAwKSB8IChiMiA8PCA4KSB8IChiMyA8PCAxNikgfCAoYjQgPDwgMjQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDY0KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYgKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyArIDApO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHZhciBiMyA9IGJhLmdldChvZnMgKyAyKTtcbiAgdmFyIGI0ID0gYmEuZ2V0KG9mcyArIDMpO1xuICB2YXIgYjUgPSBiYS5nZXQob2ZzICsgNCk7XG4gIHZhciBiNiA9IGJhLmdldChvZnMgKyA1KTtcbiAgdmFyIGI3ID0gYmEuZ2V0KG9mcyArIDYpO1xuICB2YXIgYjggPSBiYS5nZXQob2ZzICsgNyk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKFtiOCwgYjcsIGI2LCBiNSwgYjQsIGIzLCBiMiwgYjFdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMShiYSwgaTApIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoaTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMlxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMihiYSwgaTAsIGkxKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KFtpMCwgaTFdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0XzNcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0XzMoYmEsIGkwLCBpMSwgaTIpIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoW2kwLCBpMSwgaTJdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfZ2VuZXJpYyhiYSwgaSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSksIHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQxNihiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmIChvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGJhLnNldChvZnMgKyAwLCB2ICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAxLCAodiA+Pj4gOCkgJiAweGZmKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfc2V0MzIoYmEsIGkwLCB2KSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZiAob2ZzICsgMyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBiYS5zZXQob2ZzICsgMCwgdiAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzICsgMSwgKHYgPj4+IDgpICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAyLCAodiA+Pj4gMTYpICYgMHhmZik7XG4gIGJhLnNldChvZnMgKyAzLCAodiA+Pj4gMjQpICYgMHhmZik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDY0KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYgKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIHYgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgYmEuc2V0KG9mcyArIGksIHZbNyAtIGldKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzFcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzEoYmEsIGkwLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoaTApLCB2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzJcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzIoYmEsIGkwLCBpMSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KFtpMCwgaTFdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8zXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8zKGJhLCBpMCwgaTEsIGkyLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoW2kwLCBpMSwgaTJdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2ZpbGxcbmZ1bmN0aW9uIGNhbWxfYmFfZmlsbChiYSwgdikge1xuICBiYS5maWxsKHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9ibGl0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfYmxpdChzcmMsIGRzdCkge1xuICBpZiAoZHN0LmRpbXMubGVuZ3RoICE9PSBzcmMuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuYmxpdDogZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRzdC5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkc3QuZGltc1tpXSAhPT0gc3JjLmRpbXNbaV0pXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5ibGl0OiBkaW1lbnNpb24gbWlzbWF0Y2hcIik7XG4gIGRzdC5kYXRhLnNldChzcmMuZGF0YSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3N1YlxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfc3ViKGJhLCBvZnMsIGxlbikge1xuICB2YXIgY2hhbmdlZF9kaW07XG4gIHZhciBtdWwgPSAxO1xuICBpZiAoYmEubGF5b3V0ID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gMDtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoIC0gMTsgaSsrKSBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gYmEuZGltcy5sZW5ndGggLSAxO1xuICAgIG9mcyA9IG9mcyAtIDE7XG4gIH1cbiAgaWYgKG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgKyBsZW4gPiBiYS5kaW1zW2NoYW5nZWRfZGltXSkge1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnN1YjogYmFkIHN1Yi1hcnJheVwiKTtcbiAgfVxuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBuZXdfZGltc1tpXSA9IGJhLmRpbXNbaV07XG4gIG5ld19kaW1zW2NoYW5nZWRfZGltXSA9IGxlbjtcbiAgbXVsICo9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoYmEua2luZCk7XG4gIHZhciBuZXdfZGF0YSA9IGJhLmRhdGEuc3ViYXJyYXkob2ZzICogbXVsLCAob2ZzICsgbGVuKSAqIG11bCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBuZXdfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NsaWNlXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX3NsaWNlKGJhLCB2aW5kKSB7XG4gIHZpbmQgPSBjYW1sX2pzX2Zyb21fYXJyYXkodmluZCk7XG4gIHZhciBudW1faW5kcyA9IHZpbmQubGVuZ3RoO1xuICB2YXIgaW5kZXggPSBbXTtcbiAgdmFyIHN1Yl9kaW1zID0gW107XG4gIHZhciBvZnM7XG5cbiAgaWYgKG51bV9pbmRzID4gYmEuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuc2xpY2U6IHRvbyBtYW55IGluZGljZXNcIik7XG5cbiAgLy8gQ29tcHV0ZSBvZmZzZXQgYW5kIGNoZWNrIGJvdW5kc1xuICBpZiAoYmEubGF5b3V0ID09PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1faW5kczsgaSsrKSBpbmRleFtpXSA9IHZpbmRbaV07XG4gICAgZm9yICg7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBpbmRleFtpXSA9IDA7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKG51bV9pbmRzKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzICsgaV0gPSB2aW5kW2ldO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGggLSBudW1faW5kczsgaSsrKSBpbmRleFtpXSA9IDE7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKDAsIGJhLmRpbXMubGVuZ3RoIC0gbnVtX2luZHMpO1xuICB9XG4gIG9mcyA9IGJhLm9mZnNldChpbmRleCk7XG4gIHZhciBzaXplID0gY2FtbF9iYV9nZXRfc2l6ZShzdWJfZGltcyk7XG4gIHZhciBzaXplX3Blcl9lbGVtZW50ID0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChiYS5raW5kKTtcbiAgdmFyIG5ld19kYXRhID0gYmEuZGF0YS5zdWJhcnJheShcbiAgICBvZnMgKiBzaXplX3Blcl9lbGVtZW50LFxuICAgIChvZnMgKyBzaXplKSAqIHNpemVfcGVyX2VsZW1lbnQsXG4gICk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBzdWJfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3Jlc2hhcGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbmZ1bmN0aW9uIGNhbWxfYmFfcmVzaGFwZShiYSwgdmluZCkge1xuICB2aW5kID0gY2FtbF9qc19mcm9tX2FycmF5KHZpbmQpO1xuICB2YXIgbmV3X2RpbSA9IFtdO1xuICB2YXIgbnVtX2RpbXMgPSB2aW5kLmxlbmd0aDtcblxuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBiYWQgbnVtYmVyIG9mIGRpbWVuc2lvbnNcIik7XG4gIH1cbiAgdmFyIG51bV9lbHRzID0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZGltczsgaSsrKSB7XG4gICAgbmV3X2RpbVtpXSA9IHZpbmRbaV07XG4gICAgaWYgKG5ld19kaW1baV0gPCAwKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogbmVnYXRpdmUgZGltZW5zaW9uXCIpO1xuICAgIG51bV9lbHRzID0gbnVtX2VsdHMgKiBuZXdfZGltW2ldO1xuICB9XG5cbiAgdmFyIHNpemUgPSBjYW1sX2JhX2dldF9zaXplKGJhLmRpbXMpO1xuICAvLyBDaGVjayB0aGF0IHNpemVzIGFncmVlXG4gIGlmIChudW1fZWx0cyAhPT0gc2l6ZSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBzaXplIG1pc21hdGNoXCIpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGJhLmxheW91dCwgbmV3X2RpbSwgYmEuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9wYWNrRmxvYXQxNlxuZnVuY3Rpb24gY2FtbF9iYV9zZXJpYWxpemUod3JpdGVyLCBiYSwgc3opIHtcbiAgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zLmxlbmd0aCk7XG4gIHdyaXRlci53cml0ZSgzMiwgYmEua2luZCB8IChiYS5sYXlvdXQgPDwgOCkpO1xuICBpZiAoYmEuY2FtbF9jdXN0b20gPT09IFwiX2JpZ2FycjAyXCIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYmEuZGltc1tpXSA8IDB4ZmZmZikgd3JpdGVyLndyaXRlKDE2LCBiYS5kaW1zW2ldKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIDB4ZmZmZik7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgMCk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGltc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zW2ldKTtcbiAgc3dpdGNoIChiYS5raW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd3JpdGVyLndyaXRlKDgsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OiAvLyBJbnQxNkFycmF5XG4gICAgY2FzZSA1OiAvLyBVaW50MTZBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgxNiwgYmEuZGF0YVtpXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDY6IC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGF0YVtpXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6IC8vIEludDMyQXJyYXkgKGludClcbiAgICBjYXNlIDk6IC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA3OiAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGJhLmdldChpKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEZsb2F0NjRBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoYmEuZ2V0KGkpKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOiAvLyBGbG9hdDE2QXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAwOiAvLyBGbG9hdDMyQXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYiA9IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChiYS5nZXQoaSkpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICAgIHZhciBqID0gYmEuZ2V0KGkpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChqWzFdKSk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGpbMl0pKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgICB2YXIgY29tcGxleCA9IGJhLmdldChpKTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChjb21wbGV4WzFdKSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUoOCwgYltqXSk7XG4gICAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoY29tcGxleFsyXSkpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlKDgsIGJbal0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgc3pbMF0gPSAoNCArIGJhLmRpbXMubGVuZ3RoKSAqIDQ7XG4gIHN6WzFdID0gKDQgKyBiYS5kaW1zLmxlbmd0aCkgKiA4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2Rlc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXMsIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbi8vUmVxdWlyZXM6IGNhbWxfdW5wYWNrRmxvYXQxNlxuZnVuY3Rpb24gY2FtbF9iYV9kZXNlcmlhbGl6ZShyZWFkZXIsIHN6LCBuYW1lKSB7XG4gIHZhciBudW1fZGltcyA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIGlmIChudW1fZGltcyA8IDAgfHwgbnVtX2RpbXMgPiAxNilcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHdyb25nIG51bWJlciBvZiBiaWdhcnJheSBkaW1lbnNpb25zXCIpO1xuICB2YXIgdGFnID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgdmFyIGtpbmQgPSB0YWcgJiAweGZmO1xuICB2YXIgbGF5b3V0ID0gKHRhZyA+PiA4KSAmIDE7XG4gIHZhciBkaW1zID0gW107XG4gIGlmIChuYW1lID09PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykge1xuICAgICAgdmFyIHNpemVfZGltID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICAgIGlmIChzaXplX2RpbSA9PT0gMHhmZmZmKSB7XG4gICAgICAgIHZhciBzaXplX2RpbV9oaSA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIHZhciBzaXplX2RpbV9sbyA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIGlmIChzaXplX2RpbV9oaSAhPT0gMClcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGJpZ2FycmF5IGRpbWVuc2lvbiBvdmVyZmxvdyBpbiAzMmJpdFwiKTtcbiAgICAgICAgc2l6ZV9kaW0gPSBzaXplX2RpbV9sbztcbiAgICAgIH1cbiAgICAgIGRpbXMucHVzaChzaXplX2RpbSk7XG4gICAgfVxuICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykgZGltcy5wdXNoKHJlYWRlci5yZWFkMzJ1KCkpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoZGltcyk7XG4gIHZhciBkYXRhID0gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIHNpemUpO1xuICB2YXIgYmEgPSBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkOHMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OiAvLyBJbnQxNkFycmF5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnMoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTogLy8gVWludDE2QXJyYXlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDE2dSgpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OiAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA4OiAvLyBJbnQzMkFycmF5IChpbnQpXG4gICAgY2FzZSA5OiAvLyBJbnQzMkFycmF5IChuYXRpdmVpbnQpXG4gICAgICB2YXIgc2l4dHkgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICBpZiAoc2l4dHkpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXG4gICAgICAgICAgXCJpbnB1dF92YWx1ZTogY2Fubm90IHJlYWQgYmlnYXJyYXkgd2l0aCA2NC1iaXQgT0NhbWwgaW50c1wiLFxuICAgICAgICApO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6IC8vIChpbnQ2NClcbiAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgIHZhciBpbnQ2NCA9IGNhbWxfaW50NjRfb2ZfYnl0ZXModCk7XG4gICAgICAgIGJhLnNldChpLCBpbnQ2NCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6IC8vIEZsb2F0NjRBcnJheVxuICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIGYgPSBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KSk7XG4gICAgICAgIGJhLnNldChpLCBmKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6IC8vIEZsb2F0MTZBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDA6IC8vIEZsb2F0MzJBcnJheVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICAgIGJhLnNldChpLCBmKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgdmFyIHJlID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgICB2YXIgaW0gPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICAgIGJhLnNldChpLCBbMjU0LCByZSwgaW1dKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIHJlID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgdmFyIGltID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgICBiYS5zZXQoaSwgWzI1NCwgcmUsIGltXSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICBzelswXSA9ICg0ICsgbnVtX2RpbXMpICogNDtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV9mcm9tXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9EZXByZWNhdGVkOiBVc2UgW2NhbWxfYmFfY3JlYXRlX3Vuc2FmZV0gaW5zdGVhZFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfZnJvbShkYXRhMSwgZGF0YTIsIF9qc3R5cCwga2luZCwgbGF5b3V0LCBkaW1zKSB7XG4gIGlmIChkYXRhMiB8fCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpID09PSAyKSB7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFxuICAgICAgXCJjYW1sX2JhX2NyZWF0ZV9mcm9tOiB1c2UgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGExKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9oYXNoIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2hhc2hfbWl4X2ludCwgY2FtbF9oYXNoX21peF9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF91bnBhY2tGbG9hdDE2LCBjYW1sX2hhc2hfbWl4X2Zsb2F0MTYsIGNhbWxfaGFzaF9taXhfZmxvYXQzMlxuZnVuY3Rpb24gY2FtbF9iYV9oYXNoKGJhKSB7XG4gIHZhciBudW1fZWx0cyA9IGNhbWxfYmFfZ2V0X3NpemUoYmEuZGltcyk7XG4gIHZhciBoID0gMDtcbiAgc3dpdGNoIChiYS5raW5kKSB7XG4gICAgY2FzZSAyOiAvL0ludDhBcnJheVxuICAgIGNhc2UgMzogLy9VaW50OEFycmF5XG4gICAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiAyNTYpIG51bV9lbHRzID0gMjU2O1xuICAgICAgdmFyIHcgPSAwLFxuICAgICAgICBpID0gMDtcbiAgICAgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9lbHRzOyBpICs9IDQpIHtcbiAgICAgICAgdyA9XG4gICAgICAgICAgKGJhLmRhdGFbaSArIDBdICYgMHhmZikgfFxuICAgICAgICAgICgoYmEuZGF0YVtpICsgMV0gJiAweGZmKSA8PCA4KSB8XG4gICAgICAgICAgKChiYS5kYXRhW2kgKyAyXSAmIDB4ZmYpIDw8IDE2KSB8XG4gICAgICAgICAgKGJhLmRhdGFbaSArIDNdIDw8IDI0KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICAgICAgfVxuICAgICAgdyA9IDA7XG4gICAgICBzd2l0Y2ggKG51bV9lbHRzICYgMykge1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICAgIHcgPSBiYS5kYXRhW2kgKyAyXSA8PCAxNjtcbiAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgICB3IHw9IGJhLmRhdGFbaSArIDFdIDw8IDg7XG4gICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB3IHw9IGJhLmRhdGFbaSArIDBdO1xuICAgICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDogLy8gSW50MTZBcnJheVxuICAgIGNhc2UgNTogLy8gVWludDE2QXJyYXlcbiAgICAgIGlmIChudW1fZWx0cyA+IDEyOCkgbnVtX2VsdHMgPSAxMjg7XG4gICAgICB2YXIgdyA9IDAsXG4gICAgICAgIGkgPSAwO1xuICAgICAgZm9yIChpID0gMDsgaSArIDIgPD0gbnVtX2VsdHM7IGkgKz0gMikge1xuICAgICAgICB3ID0gKGJhLmRhdGFbaSArIDBdICYgMHhmZmZmKSB8IChiYS5kYXRhW2kgKyAxXSA8PCAxNik7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICAgIH1cbiAgICAgIGlmICgobnVtX2VsdHMgJiAxKSAhPT0gMCkgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA2OiAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6IC8vIEludDMyQXJyYXkgKGludClcbiAgICBjYXNlIDk6IC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6IC8vIEludDMyQXJyYXkgKGludDY0KVxuICAgICAgaWYgKG51bV9lbHRzID4gMzIpIG51bV9lbHRzID0gMzI7XG4gICAgICBudW1fZWx0cyAqPSAyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSB7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgbnVtX2VsdHMgKj0gMjtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgMDogLy8gRmxvYXQzMkFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiA2NCkgbnVtX2VsdHMgPSA2NDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKylcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQzMihoLCBiYS5kYXRhW2ldKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgbnVtX2VsdHMgKj0gMjtcbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgMTogLy8gRmxvYXQ2NEFycmF5XG4gICAgICBpZiAobnVtX2VsdHMgPiAzMikgbnVtX2VsdHMgPSAzMjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCwgYmEuZGF0YVtpXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgaWYgKG51bV9lbHRzID4gMTI4KSBudW1fZWx0cyA9IDEyODtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykge1xuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdDE2KGgsIGJhLmRhdGFbaV0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXQxNlxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQxNihoYXNoLCBkKSB7XG4gIC8qIE5vcm1hbGl6ZSBOYU5zICovXG4gIGlmICgoZCAmIDB4N2MwMCkgPT09IDB4N2MwMCAmJiAoZCAmIDB4MDNmZikgIT09IDApIHtcbiAgICBkID0gMHg3YzAxO1xuICB9IGVsc2UgaWYgKGQgPT09IDB4ODAwMCkge1xuICAgIC8qIE5vcm1hbGl6ZSAtMCBpbnRvICswICovXG4gICAgZCA9IDA7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0MzJcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQzMihoYXNoLCB2KSB7XG4gIHZhciBpID0gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KHYpO1xuICAvKiBOb3JtYWxpemUgTmFOcyAqL1xuICBpZiAoKGkgJiAweDdmODAwMDAwKSA9PT0gMHg3ZjgwMDAwMCAmJiAoaSAmIDB4N2ZmZmZmKSAhPT0gMCkge1xuICAgIGkgPSAweDdmODAwMDAxO1xuICB9IGVsc2UgaWYgKGkgPT09ICgweDgwMDAwMDAwIHwgMCkpIHtcbiAgICAvKiBOb3JtYWxpemUgLTAgaW50byArMCAqL1xuICAgIC8vIFRoaXMgY29kZSBwYXRoIGlzIG5vdCB1c2VkIGJ5IGNhbWxfaGFzaCBiZWNhdXNlIDAgYW5kIC0wIGxvb2tcbiAgICAvLyBsaWtlIGludGVnZXJzXG4gICAgaSA9IDA7XG4gIH1cbiAgaGFzaCA9IGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGkpO1xuICByZXR1cm4gaGFzaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV90b190eXBlZF9hcnJheSBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJhKSB7XG4gIHJldHVybiBiYS5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkodGEpIHtcbiAgdmFyIGtpbmQ7XG4gIGlmICh0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkga2luZCA9IDA7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSBraW5kID0gMTtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIGtpbmQgPSAyO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIGtpbmQgPSAzO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSBraW5kID0gMztcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQxNkFycmF5KSBraW5kID0gNDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkga2luZCA9IDU7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgSW50MzJBcnJheSkga2luZCA9IDY7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgcmV0dXJuIGtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5KHRhKSB7XG4gIHZhciBraW5kID0gY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5KHRhKTtcbiAgdmFyIHRhID1cbiAgICAvKiBOZWVkZWQgdG8gYXZvaWQgdW5zaWduZWQgc2V0dGVycyBvdmVyZmxvd2luZ1xuICAgICAgICAgdGhlIHJhbmdlIG9mIE9DYW1sIFtpbnQzMl0gdmFsdWVzLiAqL1xuICAgIHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXlcbiAgICAgID8gbmV3IEludDMyQXJyYXkodGEuYnVmZmVyLCB0YS5ieXRlT2Zmc2V0LCB0YS5sZW5ndGgpXG4gICAgICA6IHRhO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG4iLCIvLy8vLy8vLy8gQklHU1RSSU5HXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9iaWdzdHJpbmcoaCwgYnMpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsIGJzLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyIG11dGFibGVcbmZ1bmN0aW9uIGJpZ3N0cmluZ190b19hcnJheV9idWZmZXIoYnMpIHtcbiAgcmV0dXJuIGJzLmRhdGEuYnVmZmVyO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkgbXV0YWJsZVxuZnVuY3Rpb24gYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5KGJzKSB7XG4gIHJldHVybiBicy5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlcihhYikge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShhYik7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoMTIsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheShiYSkge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShcbiAgICBiYS5idWZmZXIsXG4gICAgYmEuYnl0ZU9mZnNldCxcbiAgICBiYS5sZW5ndGggKiBiYS5CWVRFU19QRVJfRUxFTUVOVCxcbiAgKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSgxMiwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfbWVtY21wXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19tZW1jbXAoczEsIHBvczEsIHMyLCBwb3MyLCBsZW4pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBhID0gY2FtbF9iYV9nZXRfMShzMSwgcG9zMSArIGkpO1xuICAgIHZhciBiID0gY2FtbF9iYV9nZXRfMShzMiwgcG9zMiArIGkpO1xuICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYShiYTEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYgKDEyICE9PSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZiAobGVuID09PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczEgPSBiYTEub2Zmc2V0KHBvczEpO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmIChvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmIChvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGJhMS5kYXRhLnN1YmFycmF5KG9mczEsIG9mczEgKyBsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2UsIHBvczIpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pIHtcbiAgaWYgKDEyICE9PSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMyID0gYmEyLm9mZnNldChwb3MyKTtcbiAgaWYgKHBvczEgKyBsZW4gPiBjYW1sX21sX3N0cmluZ19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYgKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcoc3RyMSkuc3ViYXJyYXkocG9zMSwgcG9zMSArIGxlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSwgb2ZzMik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhKHN0cjEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmEyLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmIChwb3MxICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYgKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzdHIxKS5zdWJhcnJheShwb3MxLCBwb3MxICsgbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLCBvZnMyKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19ieXRlcyhiYTEsIHBvczEsIGJ5dGVzMiwgcG9zMiwgbGVuKSB7XG4gIGlmICgxMiAhPT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMSA9IGJhMS5vZmZzZXQocG9zMSk7XG4gIGlmIChvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmIChwb3MyICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoYnl0ZXMyKSkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBiYTEuZGF0YS5zdWJhcnJheShvZnMxLCBvZnMxICsgbGVuKTtcbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfdWludDhfYXJyYXkoc2xpY2UpLCAwLCBieXRlczIsIHBvczIsIGxlbik7XG4gIHJldHVybiAwO1xufVxuIiwiLy9Qcm92aWRlczogYmxha2UyYlxuLy9WZXJzaW9uOiA+PSA1LjJcbnZhciBibGFrZTJiID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gQmxha2UyQiBpbiBwdXJlIEphdmFzY3JpcHRcbiAgLy8gQWRhcHRlZCBmcm9tIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaW4gUkZDNzY5M1xuICAvLyBQb3J0ZWQgdG8gSmF2YXNjcmlwdCBieSBEQyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9kY3Bvc2NoXG5cbiAgLy8gNjQtYml0IHVuc2lnbmVkIGFkZGl0aW9uXG4gIC8vIFNldHMgdlthLGErMV0gKz0gdltiLGIrMV1cbiAgLy8gdiBzaG91bGQgYmUgYSBVaW50MzJBcnJheVxuICBmdW5jdGlvbiBBREQ2NEFBKHYsIGEsIGIpIHtcbiAgICBjb25zdCBvMCA9IHZbYV0gKyB2W2JdO1xuICAgIGxldCBvMSA9IHZbYSArIDFdICsgdltiICsgMV07XG4gICAgaWYgKG8wID49IDB4MTAwMDAwMDAwKSB7XG4gICAgICBvMSsrO1xuICAgIH1cbiAgICB2W2FdID0gbzA7XG4gICAgdlthICsgMV0gPSBvMTtcbiAgfVxuXG4gIC8vIDY0LWJpdCB1bnNpZ25lZCBhZGRpdGlvblxuICAvLyBTZXRzIHZbYSxhKzFdICs9IGJcbiAgLy8gYjAgaXMgdGhlIGxvdyAzMiBiaXRzIG9mIGIsIGIxIHJlcHJlc2VudHMgdGhlIGhpZ2ggMzIgYml0c1xuICBmdW5jdGlvbiBBREQ2NEFDKHYsIGEsIGIwLCBiMSkge1xuICAgIGxldCBvMCA9IHZbYV0gKyBiMDtcbiAgICBpZiAoYjAgPCAwKSB7XG4gICAgICBvMCArPSAweDEwMDAwMDAwMDtcbiAgICB9XG4gICAgbGV0IG8xID0gdlthICsgMV0gKyBiMTtcbiAgICBpZiAobzAgPj0gMHgxMDAwMDAwMDApIHtcbiAgICAgIG8xKys7XG4gICAgfVxuICAgIHZbYV0gPSBvMDtcbiAgICB2W2EgKyAxXSA9IG8xO1xuICB9XG5cbiAgLy8gTGl0dGxlLWVuZGlhbiBieXRlIGFjY2Vzc1xuICBmdW5jdGlvbiBCMkJfR0VUMzIoYXJyLCBpKSB7XG4gICAgcmV0dXJuIGFycltpXSBeIChhcnJbaSArIDFdIDw8IDgpIF4gKGFycltpICsgMl0gPDwgMTYpIF4gKGFycltpICsgM10gPDwgMjQpO1xuICB9XG5cbiAgLy8gRyBNaXhpbmcgZnVuY3Rpb25cbiAgLy8gVGhlIFJPVFJzIGFyZSBpbmxpbmVkIGZvciBzcGVlZFxuICBmdW5jdGlvbiBCMkJfRyhhLCBiLCBjLCBkLCBpeCwgaXkpIHtcbiAgICBjb25zdCB4MCA9IG1baXhdO1xuICAgIGNvbnN0IHgxID0gbVtpeCArIDFdO1xuICAgIGNvbnN0IHkwID0gbVtpeV07XG4gICAgY29uc3QgeTEgPSBtW2l5ICsgMV07XG5cbiAgICBBREQ2NEFBKHYsIGEsIGIpOyAvLyB2W2EsYSsxXSArPSB2W2IsYisxXSAuLi4gaW4gSlMgd2UgbXVzdCBzdG9yZSBhIHVpbnQ2NCBhcyB0d28gdWludDMyc1xuICAgIEFERDY0QUModiwgYSwgeDAsIHgxKTsgLy8gdlthLCBhKzFdICs9IHggLi4uIHgwIGlzIHRoZSBsb3cgMzIgYml0cyBvZiB4LCB4MSBpcyB0aGUgaGlnaCAzMiBiaXRzXG5cbiAgICAvLyB2W2QsZCsxXSA9ICh2W2QsZCsxXSB4b3IgdlthLGErMV0pIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IDMyIGJpdHNcbiAgICBsZXQgeG9yMCA9IHZbZF0gXiB2W2FdO1xuICAgIGxldCB4b3IxID0gdltkICsgMV0gXiB2W2EgKyAxXTtcbiAgICB2W2RdID0geG9yMTtcbiAgICB2W2QgKyAxXSA9IHhvcjA7XG5cbiAgICBBREQ2NEFBKHYsIGMsIGQpO1xuXG4gICAgLy8gdltiLGIrMV0gPSAodltiLGIrMV0geG9yIHZbYyxjKzFdKSByb3RhdGVkIHJpZ2h0IGJ5IDI0IGJpdHNcbiAgICB4b3IwID0gdltiXSBeIHZbY107XG4gICAgeG9yMSA9IHZbYiArIDFdIF4gdltjICsgMV07XG4gICAgdltiXSA9ICh4b3IwID4+PiAyNCkgXiAoeG9yMSA8PCA4KTtcbiAgICB2W2IgKyAxXSA9ICh4b3IxID4+PiAyNCkgXiAoeG9yMCA8PCA4KTtcblxuICAgIEFERDY0QUEodiwgYSwgYik7XG4gICAgQURENjRBQyh2LCBhLCB5MCwgeTEpO1xuXG4gICAgLy8gdltkLGQrMV0gPSAodltkLGQrMV0geG9yIHZbYSxhKzFdKSByb3RhdGVkIHJpZ2h0IGJ5IDE2IGJpdHNcbiAgICB4b3IwID0gdltkXSBeIHZbYV07XG4gICAgeG9yMSA9IHZbZCArIDFdIF4gdlthICsgMV07XG4gICAgdltkXSA9ICh4b3IwID4+PiAxNikgXiAoeG9yMSA8PCAxNik7XG4gICAgdltkICsgMV0gPSAoeG9yMSA+Pj4gMTYpIF4gKHhvcjAgPDwgMTYpO1xuXG4gICAgQURENjRBQSh2LCBjLCBkKTtcblxuICAgIC8vIHZbYixiKzFdID0gKHZbYixiKzFdIHhvciB2W2MsYysxXSkgcm90YXRlZCByaWdodCBieSA2MyBiaXRzXG4gICAgeG9yMCA9IHZbYl0gXiB2W2NdO1xuICAgIHhvcjEgPSB2W2IgKyAxXSBeIHZbYyArIDFdO1xuICAgIHZbYl0gPSAoeG9yMSA+Pj4gMzEpIF4gKHhvcjAgPDwgMSk7XG4gICAgdltiICsgMV0gPSAoeG9yMCA+Pj4gMzEpIF4gKHhvcjEgPDwgMSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXphdGlvbiBWZWN0b3JcbiAgY29uc3QgQkxBS0UyQl9JVjMyID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAweGYzYmNjOTA4LCAweDZhMDllNjY3LCAweDg0Y2FhNzNiLCAweGJiNjdhZTg1LCAweGZlOTRmODJiLCAweDNjNmVmMzcyLFxuICAgIDB4NWYxZDM2ZjEsIDB4YTU0ZmY1M2EsIDB4YWRlNjgyZDEsIDB4NTEwZTUyN2YsIDB4MmIzZTZjMWYsIDB4OWIwNTY4OGMsXG4gICAgMHhmYjQxYmQ2YiwgMHgxZjgzZDlhYiwgMHgxMzdlMjE3OSwgMHg1YmUwY2QxOSxcbiAgXSk7XG5cbiAgY29uc3QgU0lHTUE4ID0gW1xuICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE0LCAxMCwgNCwgOCwgOSwgMTUsXG4gICAgMTMsIDYsIDEsIDEyLCAwLCAyLCAxMSwgNywgNSwgMywgMTEsIDgsIDEyLCAwLCA1LCAyLCAxNSwgMTMsIDEwLCAxNCwgMywgNixcbiAgICA3LCAxLCA5LCA0LCA3LCA5LCAzLCAxLCAxMywgMTIsIDExLCAxNCwgMiwgNiwgNSwgMTAsIDQsIDAsIDE1LCA4LCA5LCAwLCA1LFxuICAgIDcsIDIsIDQsIDEwLCAxNSwgMTQsIDEsIDExLCAxMiwgNiwgOCwgMywgMTMsIDIsIDEyLCA2LCAxMCwgMCwgMTEsIDgsIDMsIDQsXG4gICAgMTMsIDcsIDUsIDE1LCAxNCwgMSwgOSwgMTIsIDUsIDEsIDE1LCAxNCwgMTMsIDQsIDEwLCAwLCA3LCA2LCAzLCA5LCAyLCA4LFxuICAgIDExLCAxMywgMTEsIDcsIDE0LCAxMiwgMSwgMywgOSwgNSwgMCwgMTUsIDQsIDgsIDYsIDIsIDEwLCA2LCAxNSwgMTQsIDksIDExLFxuICAgIDMsIDAsIDgsIDEyLCAyLCAxMywgNywgMSwgNCwgMTAsIDUsIDEwLCAyLCA4LCA0LCA3LCA2LCAxLCA1LCAxNSwgMTEsIDksIDE0LFxuICAgIDMsIDEyLCAxMywgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTQsIDEwLFxuICAgIDQsIDgsIDksIDE1LCAxMywgNiwgMSwgMTIsIDAsIDIsIDExLCA3LCA1LCAzLFxuICBdO1xuXG4gIC8vIFRoZXNlIGFyZSBvZmZzZXRzIGludG8gYSB1aW50NjQgYnVmZmVyLlxuICAvLyBNdWx0aXBseSB0aGVtIGFsbCBieSAyIHRvIG1ha2UgdGhlbSBvZmZzZXRzIGludG8gYSB1aW50MzIgYnVmZmVyLFxuICAvLyBiZWNhdXNlIHRoaXMgaXMgSmF2YXNjcmlwdCBhbmQgd2UgZG9uJ3QgaGF2ZSB1aW50NjRzXG4gIGNvbnN0IFNJR01BODIgPSBuZXcgVWludDhBcnJheShcbiAgICBTSUdNQTgubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geCAqIDI7XG4gICAgfSksXG4gICk7XG5cbiAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24uICdsYXN0JyBmbGFnIGluZGljYXRlcyBsYXN0IGJsb2NrLlxuICAvLyBOb3RlIHdlJ3JlIHJlcHJlc2VudGluZyAxNiB1aW50NjRzIGFzIDMyIHVpbnQzMnNcbiAgY29uc3QgdiA9IG5ldyBVaW50MzJBcnJheSgzMik7XG4gIGNvbnN0IG0gPSBuZXcgVWludDMyQXJyYXkoMzIpO1xuICBmdW5jdGlvbiBibGFrZTJiQ29tcHJlc3MoY3R4LCBsYXN0KSB7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgLy8gaW5pdCB3b3JrIHZhcmlhYmxlc1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICB2W2ldID0gY3R4LmhbaV07XG4gICAgICB2W2kgKyAxNl0gPSBCTEFLRTJCX0lWMzJbaV07XG4gICAgfVxuXG4gICAgLy8gbG93IDY0IGJpdHMgb2Ygb2Zmc2V0XG4gICAgdlsyNF0gPSB2WzI0XSBeIGN0eC50O1xuICAgIHZbMjVdID0gdlsyNV0gXiAoY3R4LnQgLyAweDEwMDAwMDAwMCk7XG4gICAgLy8gaGlnaCA2NCBiaXRzIG5vdCBzdXBwb3J0ZWQsIG9mZnNldCBtYXkgbm90IGJlIGhpZ2hlciB0aGFuIDIqKjUzLTFcblxuICAgIC8vIGxhc3QgYmxvY2sgZmxhZyBzZXQgP1xuICAgIGlmIChsYXN0KSB7XG4gICAgICB2WzI4XSA9IH52WzI4XTtcbiAgICAgIHZbMjldID0gfnZbMjldO1xuICAgIH1cblxuICAgIC8vIGdldCBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgIG1baV0gPSBCMkJfR0VUMzIoY3R4LmIsIDQgKiBpKTtcbiAgICB9XG5cbiAgICAvLyB0d2VsdmUgcm91bmRzIG9mIG1peGluZ1xuICAgIC8vIHVuY29tbWVudCB0aGUgRGVidWdQcmludCBjYWxscyB0byBsb2cgdGhlIGNvbXB1dGF0aW9uXG4gICAgLy8gYW5kIG1hdGNoIHRoZSBSRkMgc2FtcGxlIGRvY3VtZW50YXRpb25cbiAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgQjJCX0coMCwgOCwgMTYsIDI0LCBTSUdNQTgyW2kgKiAxNiArIDBdLCBTSUdNQTgyW2kgKiAxNiArIDFdKTtcbiAgICAgIEIyQl9HKDIsIDEwLCAxOCwgMjYsIFNJR01BODJbaSAqIDE2ICsgMl0sIFNJR01BODJbaSAqIDE2ICsgM10pO1xuICAgICAgQjJCX0coNCwgMTIsIDIwLCAyOCwgU0lHTUE4MltpICogMTYgKyA0XSwgU0lHTUE4MltpICogMTYgKyA1XSk7XG4gICAgICBCMkJfRyg2LCAxNCwgMjIsIDMwLCBTSUdNQTgyW2kgKiAxNiArIDZdLCBTSUdNQTgyW2kgKiAxNiArIDddKTtcbiAgICAgIEIyQl9HKDAsIDEwLCAyMCwgMzAsIFNJR01BODJbaSAqIDE2ICsgOF0sIFNJR01BODJbaSAqIDE2ICsgOV0pO1xuICAgICAgQjJCX0coMiwgMTIsIDIyLCAyNCwgU0lHTUE4MltpICogMTYgKyAxMF0sIFNJR01BODJbaSAqIDE2ICsgMTFdKTtcbiAgICAgIEIyQl9HKDQsIDE0LCAxNiwgMjYsIFNJR01BODJbaSAqIDE2ICsgMTJdLCBTSUdNQTgyW2kgKiAxNiArIDEzXSk7XG4gICAgICBCMkJfRyg2LCA4LCAxOCwgMjgsIFNJR01BODJbaSAqIDE2ICsgMTRdLCBTSUdNQTgyW2kgKiAxNiArIDE1XSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGN0eC5oW2ldID0gY3R4LmhbaV0gXiB2W2ldIF4gdltpICsgMTZdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJldXNhYmxlIHBhcmFtZXRlckJsb2NrXG4gIGNvbnN0IHBhcmFtZXRlckJsb2NrID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vICAwOiBvdXRsZW4sIGtleWxlbiwgZmFub3V0LCBkZXB0aFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vICA0OiBsZWFmIGxlbmd0aCwgc2VxdWVudGlhbCBtb2RlXG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gIDg6IG5vZGUgb2Zmc2V0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMTI6IG5vZGUgb2Zmc2V0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMTY6IG5vZGUgZGVwdGgsIGlubmVyIGxlbmd0aCwgcmZ1XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMjA6IHJmdVxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vIDI0OiByZnVcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyAyODogcmZ1XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gMzI6IHNhbHRcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyAzNjogc2FsdFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsIC8vIDQwOiBzYWx0XG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCwgLy8gNDQ6IHNhbHRcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA0ODogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA1MjogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA1NjogcGVyc29uYWxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLCAvLyA2MDogcGVyc29uYWxcbiAgXSk7XG5cbiAgLy8gQ3JlYXRlcyBhIEJMQUtFMmIgaGFzaGluZyBjb250ZXh0XG4gIC8vIFJlcXVpcmVzIGFuIG91dHB1dCBsZW5ndGggYmV0d2VlbiAxIGFuZCA2NCBieXRlc1xuICAvLyBUYWtlcyBhbiBvcHRpb25hbCBVaW50OEFycmF5IGtleVxuICBmdW5jdGlvbiBibGFrZTJiSW5pdChvdXRsZW4sIGtleSkge1xuICAgIGlmIChvdXRsZW4gPT09IDAgfHwgb3V0bGVuID4gNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgb3V0cHV0IGxlbmd0aCwgZXhwZWN0ZWQgMCA8IGxlbmd0aCA8PSA2NFwiKTtcbiAgICB9XG4gICAgaWYgKGtleS5sZW5ndGggPiA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBrZXksIGV4cGVjdGVkIFVpbnQ4QXJyYXkgd2l0aCAwIDwgbGVuZ3RoIDw9IDY0XCIpO1xuICAgIH1cblxuICAgIC8vIHN0YXRlLCAncGFyYW0gYmxvY2snXG4gICAgY29uc3QgY3R4ID0ge1xuICAgICAgYjogbmV3IFVpbnQ4QXJyYXkoMTI4KSxcbiAgICAgIGg6IG5ldyBVaW50MzJBcnJheSgxNiksXG4gICAgICB0OiAwLCAvLyBpbnB1dCBjb3VudFxuICAgICAgYzogMCwgLy8gcG9pbnRlciB3aXRoaW4gYnVmZmVyXG4gICAgICBvdXRsZW46IG91dGxlbiwgLy8gb3V0cHV0IGxlbmd0aCBpbiBieXRlc1xuICAgIH07XG5cbiAgICAvLyBpbml0aWFsaXplIHBhcmFtZXRlckJsb2NrIGJlZm9yZSB1c2FnZVxuICAgIHBhcmFtZXRlckJsb2NrLmZpbGwoMCk7XG4gICAgcGFyYW1ldGVyQmxvY2tbMF0gPSBvdXRsZW47XG4gICAgcGFyYW1ldGVyQmxvY2tbMV0gPSBrZXkubGVuZ3RoO1xuICAgIHBhcmFtZXRlckJsb2NrWzJdID0gMTsgLy8gZmFub3V0XG4gICAgcGFyYW1ldGVyQmxvY2tbM10gPSAxOyAvLyBkZXB0aFxuXG4gICAgLy8gaW5pdGlhbGl6ZSBoYXNoIHN0YXRlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBjdHguaFtpXSA9IEJMQUtFMkJfSVYzMltpXSBeIEIyQl9HRVQzMihwYXJhbWV0ZXJCbG9jaywgaSAqIDQpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID4gMCkge1xuICAgICAgYmxha2UyYlVwZGF0ZShjdHgsIGtleSk7XG4gICAgICAvLyBhdCB0aGUgZW5kXG4gICAgICBjdHguYyA9IDEyODtcbiAgICB9XG5cbiAgICByZXR1cm4gY3R4O1xuICB9XG5cbiAgLy8gVXBkYXRlcyBhIEJMQUtFMmIgc3RyZWFtaW5nIGhhc2hcbiAgLy8gUmVxdWlyZXMgaGFzaCBjb250ZXh0IGFuZCBVaW50OEFycmF5IChieXRlIGFycmF5KVxuICBmdW5jdGlvbiBibGFrZTJiVXBkYXRlKGN0eCwgaW5wdXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY3R4LmMgPT09IDEyOCkge1xuICAgICAgICAvLyBidWZmZXIgZnVsbCA/XG4gICAgICAgIGN0eC50ICs9IGN0eC5jOyAvLyBhZGQgY291bnRlcnNcbiAgICAgICAgYmxha2UyYkNvbXByZXNzKGN0eCwgZmFsc2UpOyAvLyBjb21wcmVzcyAobm90IGxhc3QpXG4gICAgICAgIGN0eC5jID0gMDsgLy8gY291bnRlciB0byB6ZXJvXG4gICAgICB9XG4gICAgICBjdHguYltjdHguYysrXSA9IGlucHV0W2ldO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbXBsZXRlcyBhIEJMQUtFMmIgc3RyZWFtaW5nIGhhc2hcbiAgLy8gUmV0dXJucyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgbWVzc2FnZSBkaWdlc3RcbiAgZnVuY3Rpb24gYmxha2UyYkZpbmFsKGN0eCkge1xuICAgIGN0eC50ICs9IGN0eC5jOyAvLyBtYXJrIGxhc3QgYmxvY2sgb2Zmc2V0XG5cbiAgICB3aGlsZSAoY3R4LmMgPCAxMjgpIHtcbiAgICAgIC8vIGZpbGwgdXAgd2l0aCB6ZXJvc1xuICAgICAgY3R4LmJbY3R4LmMrK10gPSAwO1xuICAgIH1cbiAgICBibGFrZTJiQ29tcHJlc3MoY3R4LCB0cnVlKTsgLy8gZmluYWwgYmxvY2sgZmxhZyA9IDFcblxuICAgIC8vIGxpdHRsZSBlbmRpYW4gY29udmVydCBhbmQgc3RvcmVcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShjdHgub3V0bGVuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN0eC5vdXRsZW47IGkrKykge1xuICAgICAgb3V0W2ldID0gY3R4LmhbaSA+PiAyXSA+PiAoOCAqIChpICYgMykpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIHJldHVybiB7IEluaXQ6IGJsYWtlMmJJbml0LCBVcGRhdGU6IGJsYWtlMmJVcGRhdGUsIEZpbmFsOiBibGFrZTJiRmluYWwgfTtcbn0pKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxha2UyX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGJsYWtlMmJcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX2JsYWtlMl9jcmVhdGUoaGFzaGxlbiwga2V5KSB7XG4gIGtleSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKGtleSk7XG4gIGlmIChrZXkubGVuZ3RoID4gNjQpIHtcbiAgICBrZXkuc3ViYXJyYXkoMCwgNjQpO1xuICB9XG4gIHJldHVybiBibGFrZTJiLkluaXQoaGFzaGxlbiwga2V5KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBibGFrZTJiXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBfaGFzaGxlbikge1xuICAvLyBjdHgub3V0bGVuID09PSBoYXNobGVuXG4gIHZhciByID0gYmxha2UyYi5GaW5hbChjdHgpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfdWludDhfYXJyYXkocik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogYmxha2UyYlxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfdXBkYXRlKGN0eCwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgaW5wdXQgPSBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyhidWYpO1xuICBpbnB1dCA9IGlucHV0LnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKTtcbiAgYmxha2UyYi5VcGRhdGUoY3R4LCBpbnB1dCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsYWtlMl91cGRhdGVcbi8vUmVxdWlyZXM6IGJsYWtlMmJcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX2JsYWtlMl91cGRhdGUoY3R4LCBidWYsIG9mcywgbGVuKSB7XG4gIHZhciBpbnB1dCA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmKTtcbiAgaW5wdXQgPSBpbnB1dC5zdWJhcnJheShvZnMsIG9mcyArIGxlbik7XG4gIGJsYWtlMmIuVXBkYXRlKGN0eCwgaW5wdXQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfc3RyaW5nKGhhc2hsZW4sIGtleSwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleSk7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9ibGFrZTJfc3RyaW5nKGhhc2hsZW4sIGtleSwgYnVmX3N0ciwgb2ZzLCBsZW4pIHtcbiAgdmFyIGN0eCA9IGNhbWxfYmxha2UyX2NyZWF0ZShoYXNobGVuLCBrZXkpO1xuICB2YXIgYnVmID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoYnVmX3N0cik7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGFrZTJfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfdXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl9maW5hbFxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfYmxha2UyX2J5dGVzKGhhc2hsZW4sIGtleSwgYnVmLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleSk7XG4gIGNhbWxfYmxha2UyX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfZmluYWwoY3R4LCBoYXNobGVuKTtcbn1cblxuLy9Qcm92aWRlczogYmxha2UyX2pzX2Zvcl93YXNtX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfY3JlYXRlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiB3YXNtXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX2NyZWF0ZShoYXNobGVuLCBrZXkpIHtcbiAgY29uc3Qga2V5X2pzb29fc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhrZXkpO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfY3JlYXRlKGhhc2hsZW4sIGtleV9qc29vX3N0cmluZyk7XG59XG5cbi8vUHJvdmlkZXM6IGJsYWtlMl9qc19mb3Jfd2FzbV9maW5hbFxuLy9SZXF1aXJlczogY2FtbF9ibGFrZTJfZmluYWwsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vSWY6IHdhc21cbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBibGFrZTJfanNfZm9yX3dhc21fZmluYWwoY3R4LCBoYXNobGVuKSB7XG4gIHJldHVybiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNhbWxfYmxha2UyX2ZpbmFsKGN0eCwgaGFzaGxlbikpO1xufVxuXG4vL1Byb3ZpZGVzOiBibGFrZTJfanNfZm9yX3dhc21fdXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2JsYWtlMl91cGRhdGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vSWY6IHdhc21cbi8vVmVyc2lvbjogPj0gNS4yLCA8IDUuM1xuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pIHtcbiAgY29uc3QgYnVmX2pzb29fc3RyaW5nID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhidWYpO1xuICByZXR1cm4gY2FtbF9ibGFrZTJfdXBkYXRlKGN0eCwgYnVmX2pzb29fc3RyaW5nLCBvZnMsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGJsYWtlMl9qc19mb3Jfd2FzbV91cGRhdGVcbi8vUmVxdWlyZXM6IGNhbWxfYmxha2UyX3VwZGF0ZSwgY2FtbF9ieXRlc19vZl9qc2J5dGVzXG4vL0lmOiB3YXNtXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gYmxha2UyX2pzX2Zvcl93YXNtX3VwZGF0ZShjdHgsIGJ1Ziwgb2ZzLCBsZW4pIHtcbiAgY29uc3QgYnVmX2pzb29fc3RyaW5nID0gY2FtbF9ieXRlc19vZl9qc2J5dGVzKGJ1Zik7XG4gIHJldHVybiBjYW1sX2JsYWtlMl91cGRhdGUoY3R4LCBidWZfanNvb19zdHJpbmcsIG9mcywgbGVuKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX21kNV9jaGFuXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl91aW50OF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9tbF9pbnB1dF9ibG9ja1xuLy9SZXF1aXJlczogY2FtbF9NRDVJbml0LCBjYW1sX01ENVVwZGF0ZSwgY2FtbF9NRDVGaW5hbFxuZnVuY3Rpb24gY2FtbF9tZDVfY2hhbihjaGFuaWQsIHRvcmVhZCkge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSg0MDk2KTtcbiAgaWYgKHRvcmVhZCA8IDApIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIHJlYWQgPSBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTtcbiAgICAgIGlmIChyZWFkID09PSAwKSBicmVhaztcbiAgICAgIGNhbWxfTUQ1VXBkYXRlKGN0eCwgYnVmZmVyLnN1YmFycmF5KDAsIHJlYWQpLCByZWFkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHRvcmVhZCA+IDApIHtcbiAgICAgIHZhciByZWFkID0gY2FtbF9tbF9pbnB1dF9ibG9jayhcbiAgICAgICAgY2hhbmlkLFxuICAgICAgICBidWZmZXIsXG4gICAgICAgIDAsXG4gICAgICAgIHRvcmVhZCA+IGJ1ZmZlci5sZW5ndGggPyBidWZmZXIubGVuZ3RoIDogdG9yZWFkLFxuICAgICAgKTtcbiAgICAgIGlmIChyZWFkID09PSAwKSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gICAgICBjYW1sX01ENVVwZGF0ZShjdHgsIGJ1ZmZlci5zdWJhcnJheSgwLCByZWFkKSwgcmVhZCk7XG4gICAgICB0b3JlYWQgLT0gcmVhZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9zdHJpbmcsIGNhbWxfbWQ1X2J5dGVzXG5mdW5jdGlvbiBjYW1sX21kNV9zdHJpbmcocywgb2ZzLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfbWQ1X2J5dGVzKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpLCBvZnMsIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1VHJhbnNmb3JtXG52YXIgY2FtbF9NRDVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBhZGQoeCwgeSkge1xuICAgIHJldHVybiAoeCArIHkpIHwgMDtcbiAgfVxuICBmdW5jdGlvbiB4eChxLCBhLCBiLCB4LCBzLCB0KSB7XG4gICAgYSA9IGFkZChhZGQoYSwgcSksIGFkZCh4LCB0KSk7XG4gICAgcmV0dXJuIGFkZCgoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xuICB9XG4gIGZ1bmN0aW9uIGZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICByZXR1cm4geHgoKGIgJiBjKSB8ICh+YiAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuICBmdW5jdGlvbiBnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gICAgcmV0dXJuIHh4KChiICYgZCkgfCAoYyAmIH5kKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gaGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICAgIHJldHVybiB4eChiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xuICB9XG4gIGZ1bmN0aW9uIGlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgICByZXR1cm4geHgoYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAodywgYnVmZmVyKSB7XG4gICAgdmFyIGEgPSB3WzBdLFxuICAgICAgYiA9IHdbMV0sXG4gICAgICBjID0gd1syXSxcbiAgICAgIGQgPSB3WzNdO1xuXG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclswXSwgNywgMHhkNzZhYTQ3OCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxXSwgMTIsIDB4ZThjN2I3NTYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMl0sIDE3LCAweDI0MjA3MGRiKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzNdLCAyMiwgMHhjMWJkY2VlZSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcls0XSwgNywgMHhmNTdjMGZhZik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcls1XSwgMTIsIDB4NDc4N2M2MmEpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbNl0sIDE3LCAweGE4MzA0NjEzKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzddLCAyMiwgMHhmZDQ2OTUwMSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlcls4XSwgNywgMHg2OTgwOThkOCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlcls5XSwgMTIsIDB4OGI0NGY3YWYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMTBdLCAxNywgMHhmZmZmNWJiMSk7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsxMV0sIDIyLCAweDg5NWNkN2JlKTtcbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWzEyXSwgNywgMHg2YjkwMTEyMik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxM10sIDEyLCAweGZkOTg3MTkzKTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWzE0XSwgMTcsIDB4YTY3OTQzOGUpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbMTVdLCAyMiwgMHg0OWI0MDgyMSk7XG5cbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzFdLCA1LCAweGY2MWUyNTYyKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzZdLCA5LCAweGMwNDBiMzQwKTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWzExXSwgMTQsIDB4MjY1ZTVhNTEpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbMF0sIDIwLCAweGU5YjZjN2FhKTtcbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzVdLCA1LCAweGQ2MmYxMDVkKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzEwXSwgOSwgMHgwMjQ0MTQ1Myk7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE0LCAweGQ4YTFlNjgxKTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzRdLCAyMCwgMHhlN2QzZmJjOCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlcls5XSwgNSwgMHgyMWUxY2RlNik7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsxNF0sIDksIDB4YzMzNzA3ZDYpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbM10sIDE0LCAweGY0ZDUwZDg3KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzhdLCAyMCwgMHg0NTVhMTRlZCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDUsIDB4YTllM2U5MDUpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbMl0sIDksIDB4ZmNlZmEzZjgpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbN10sIDE0LCAweDY3NmYwMmQ5KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzEyXSwgMjAsIDB4OGQyYTRjOGEpO1xuXG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlcls1XSwgNCwgMHhmZmZhMzk0Mik7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlcls4XSwgMTEsIDB4ODc3MWY2ODEpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbMTFdLCAxNiwgMHg2ZDlkNjEyMik7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsxNF0sIDIzLCAweGZkZTUzODBjKTtcbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWzFdLCA0LCAweGE0YmVlYTQ0KTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWzRdLCAxMSwgMHg0YmRlY2ZhOSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlcls3XSwgMTYsIDB4ZjZiYjRiNjApO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbMTBdLCAyMywgMHhiZWJmYmM3MCk7XG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDQsIDB4Mjg5YjdlYzYpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMF0sIDExLCAweGVhYTEyN2ZhKTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWzNdLCAxNiwgMHhkNGVmMzA4NSk7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlcls2XSwgMjMsIDB4MDQ4ODFkMDUpO1xuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbOV0sIDQsIDB4ZDlkNGQwMzkpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMTJdLCAxMSwgMHhlNmRiOTllNSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE2LCAweDFmYTI3Y2Y4KTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWzJdLCAyMywgMHhjNGFjNTY2NSk7XG5cbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzBdLCA2LCAweGY0MjkyMjQ0KTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzddLCAxMCwgMHg0MzJhZmY5Nyk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNF0sIDE1LCAweGFiOTQyM2E3KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzVdLCAyMSwgMHhmYzkzYTAzOSk7XG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsxMl0sIDYsIDB4NjU1YjU5YzMpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbM10sIDEwLCAweDhmMGNjYzkyKTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWzEwXSwgMTUsIDB4ZmZlZmY0N2QpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbMV0sIDIxLCAweDg1ODQ1ZGQxKTtcbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzhdLCA2LCAweDZmYTg3ZTRmKTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzE1XSwgMTAsIDB4ZmUyY2U2ZTApO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbNl0sIDE1LCAweGEzMDE0MzE0KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzEzXSwgMjEsIDB4NGUwODExYTEpO1xuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbNF0sIDYsIDB4Zjc1MzdlODIpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbMTFdLCAxMCwgMHhiZDNhZjIzNSk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsyXSwgMTUsIDB4MmFkN2QyYmIpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbOV0sIDIxLCAweGViODZkMzkxKTtcblxuICAgIHdbMF0gPSBhZGQoYSwgd1swXSk7XG4gICAgd1sxXSA9IGFkZChiLCB3WzFdKTtcbiAgICB3WzJdID0gYWRkKGMsIHdbMl0pO1xuICAgIHdbM10gPSBhZGQoZCwgd1szXSk7XG4gIH07XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUluaXRcbmZ1bmN0aW9uIGNhbWxfTUQ1SW5pdCgpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig2NCk7XG4gIHZhciBiMzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgdmFyIGI4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIHtcbiAgICBsZW46IDAsXG4gICAgdzogbmV3IFVpbnQzMkFycmF5KFsweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2XSksXG4gICAgYjMyOiBiMzIsXG4gICAgYjg6IGI4LFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENVVwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9NRDVUcmFuc2Zvcm1cbmZ1bmN0aW9uIGNhbWxfTUQ1VXBkYXRlKGN0eCwgaW5wdXQsIGlucHV0X2xlbikge1xuICB2YXIgaW5fYnVmID0gY3R4LmxlbiAmIDB4M2Y7XG4gIHZhciBpbnB1dF9wb3MgPSAwO1xuICBjdHgubGVuICs9IGlucHV0X2xlbjtcbiAgaWYgKGluX2J1Zikge1xuICAgIHZhciBtaXNzaW5nID0gNjQgLSBpbl9idWY7XG4gICAgaWYgKGlucHV0X2xlbiA8IG1pc3NpbmcpIHtcbiAgICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoMCwgaW5wdXRfbGVuKSwgaW5fYnVmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheSgwLCBtaXNzaW5nKSwgaW5fYnVmKTtcbiAgICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gICAgaW5wdXRfbGVuIC09IG1pc3Npbmc7XG4gICAgaW5wdXRfcG9zICs9IG1pc3Npbmc7XG4gIH1cbiAgd2hpbGUgKGlucHV0X2xlbiA+PSA2NCkge1xuICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoaW5wdXRfcG9zLCBpbnB1dF9wb3MgKyA2NCksIDApO1xuICAgIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgICBpbnB1dF9sZW4gLT0gNjQ7XG4gICAgaW5wdXRfcG9zICs9IDY0O1xuICB9XG4gIGlmIChpbnB1dF9sZW4pXG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheShpbnB1dF9wb3MsIGlucHV0X3BvcyArIGlucHV0X2xlbiksIDApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX01ENVRyYW5zZm9ybVxuZnVuY3Rpb24gY2FtbF9NRDVGaW5hbChjdHgpIHtcbiAgdmFyIGluX2J1ZiA9IGN0eC5sZW4gJiAweDNmO1xuICBjdHguYjhbaW5fYnVmXSA9IDB4ODA7XG4gIGluX2J1ZisrO1xuICBpZiAoaW5fYnVmID4gNTYpIHtcbiAgICBmb3IgKHZhciBqID0gaW5fYnVmOyBqIDwgNjQ7IGorKykge1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gICAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTY7IGorKykge1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaiA9IGluX2J1ZjsgaiA8IDU2OyBqKyspIHtcbiAgICAgIGN0eC5iOFtqXSA9IDA7XG4gICAgfVxuICB9XG4gIGN0eC5iMzJbMTRdID0gY3R4LmxlbiA8PCAzO1xuICBjdHguYjMyWzE1XSA9IChjdHgubGVuID4+IDI5KSAmIDB4MWZmZmZmZmY7XG4gIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgdmFyIHQgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKSB0W2kgKiA0ICsgal0gPSAoY3R4LndbaV0gPj4gKDggKiBqKSkgJiAweGZmO1xuICByZXR1cm4gdDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMsIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX01ENUluaXQsIGNhbWxfTUQ1VXBkYXRlLCBjYW1sX01ENUZpbmFsXG5mdW5jdGlvbiBjYW1sX21kNV9ieXRlcyhzLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBhID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzKTtcbiAgY2FtbF9NRDVVcGRhdGUoY3R4LCBhLnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKSwgbGVuKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczoganNvb19kYXRhdmlld1xudmFyIGpzb29fZGF0YXZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtcblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaVxuLy9SZXF1aXJlczoganNvb19kYXRhdmlld1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpIHtcbiAganNvb19kYXRhdmlldy5zZXRGbG9hdDY0KDAsIHgsIHRydWUpO1xuICB2YXIgbG8zMiA9IGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDAsIHRydWUpO1xuICB2YXIgaGkzMiA9IGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDQsIHRydWUpO1xuICB2YXIgbG8gPSBsbzMyICYgMHhmZmZmZmY7XG4gIHZhciBtaSA9IChsbzMyID4+PiAyNCkgfCAoKGhpMzIgPDwgOCkgJiAweGZmZmZmZik7XG4gIHZhciBoaSA9IChoaTMyID4+PiAxNikgJiAweGZmZmY7XG4gIC8vIFY4IHVzZXMgc2lnbmFsaW5nIE5hTnMgYXMgc2VudGluZWwuIFNvLCBOYU5zIGFyZSBtYWRlIHF1aWV0IHdoZW5cbiAgLy8gdGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5LiBNYWtlIHRoZW0gcXVpZXQgaGVyZSBzbyB0aGF0IHdlIGdldFxuICAvLyBjb25zaXN0ZW50IHJlc3VsdHMuXG4gIGlmICgoaGkgJiAweDdmZjgpID09PSAweDdmZjAgJiYgKG1pIHwgbG8gfCAoaGkgJiAweGYpKSAhPT0gMCkgaGkgfD0gODtcbiAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKGxvLCBtaSwgaGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZGF0YXZpZXdcbmZ1bmN0aW9uIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdCh4KSB7XG4gIGpzb29fZGF0YXZpZXcuc2V0RmxvYXQzMigwLCB4LCB0cnVlKTtcbiAgcmV0dXJuIGpzb29fZGF0YXZpZXcuZ2V0VWludDMyKDAsIHRydWUpIHwgMDtcbn1cblxuLy9GUCBsaXRlcmFscyBjYW4gYmUgd3JpdHRlbiB1c2luZyB0aGUgaGV4YWRlY2ltYWxcbi8vbm90YXRpb24gMHg8bWFudGlzc2EgaW4gaGV4PnA8ZXhwb25lbnQ+IGZyb20gSVNPIEM5OS5cbi8vaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWhleGZsb2F0L2Jsb2IvbWFzdGVyL2hleGZsb2F0LmpzXG4vL1Byb3ZpZGVzOiBjYW1sX2hleHN0cmluZ19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQoeCwgcHJlYywgc3R5bGUpIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHgpKSByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJuYW5cIik7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHggPiAwID8gXCJpbmZpbml0eVwiIDogXCItaW5maW5pdHlcIik7XG4gIH1cbiAgdmFyIHNpZ24gPSB4ID09PSAwICYmIDEgLyB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPyAxIDogeCA+PSAwID8gMCA6IDE7XG4gIGlmIChzaWduKSB4ID0gLXg7XG4gIHZhciBleHAgPSAwO1xuICBpZiAoeCA9PT0gMCkge1xuICB9IGVsc2UgaWYgKHggPCAxKSB7XG4gICAgd2hpbGUgKHggPCAxICYmIGV4cCA+IC0xMDIyKSB7XG4gICAgICB4ICo9IDI7XG4gICAgICBleHAtLTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHggPj0gMikge1xuICAgICAgeCAvPSAyO1xuICAgICAgZXhwKys7XG4gICAgfVxuICB9XG4gIHZhciBleHBfc2lnbiA9IGV4cCA8IDAgPyBcIlwiIDogXCIrXCI7XG4gIHZhciBzaWduX3N0ciA9IFwiXCI7XG4gIGlmIChzaWduKSBzaWduX3N0ciA9IFwiLVwiO1xuICBlbHNlIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlIDQzIC8qICcrJyAqLzpcbiAgICAgICAgc2lnbl9zdHIgPSBcIitcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMyIC8qICcgJyAqLzpcbiAgICAgICAgc2lnbl9zdHIgPSBcIiBcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHByZWMgPj0gMCAmJiBwcmVjIDwgMTMpIHtcbiAgICAvKiBJZiBhIHByZWNpc2lvbiBpcyBnaXZlbiwgYW5kIGlzIHNtYWxsLCByb3VuZCBtYW50aXNzYSBhY2NvcmRpbmdseSAqL1xuICAgIHZhciBjc3QgPSBNYXRoLnBvdygyLCBwcmVjICogNCk7XG4gICAgeCA9IE1hdGgucm91bmQoeCAqIGNzdCkgLyBjc3Q7XG4gIH1cbiAgdmFyIHhfc3RyID0geC50b1N0cmluZygxNik7XG4gIGlmIChwcmVjID49IDApIHtcbiAgICB2YXIgaWR4ID0geF9zdHIuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIHhfc3RyICs9IFwiLlwiICsgY2FtbF9zdHJfcmVwZWF0KHByZWMsIFwiMFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNpemUgPSBpZHggKyAxICsgcHJlYztcbiAgICAgIGlmICh4X3N0ci5sZW5ndGggPCBzaXplKVxuICAgICAgICB4X3N0ciArPSBjYW1sX3N0cl9yZXBlYXQoc2l6ZSAtIHhfc3RyLmxlbmd0aCwgXCIwXCIpO1xuICAgICAgZWxzZSB4X3N0ciA9IHhfc3RyLnNsaWNlKDAsIHNpemUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXG4gICAgc2lnbl9zdHIgKyBcIjB4XCIgKyB4X3N0ciArIFwicFwiICsgZXhwX3NpZ24gKyBleHAudG9TdHJpbmcoMTApLFxuICApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZGF0YXZpZXdcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyh4KSB7XG4gIHZhciBsbyA9IHgubG87XG4gIHZhciBtaSA9IHgubWk7XG4gIHZhciBoaSA9IHguaGk7XG4gIC8vIFY4IHVzZXMgc2lnbmFsaW5nIE5hTnMgYXMgc2VudGluZWwuIFNvLCBOYU5zIGFyZSBtYWRlIHF1aWV0IHdoZW5cbiAgLy8gdGhleSBhcmUgc3RvcmVkIGluIGFuIGFycmF5LiBNYWtlIHRoZW0gcXVpZXQgaGVyZSBzbyB0aGF0IHdlIGdldFxuICAvLyBjb25zaXN0ZW50IHJlc3VsdHMuXG4gIGlmICgoaGkgJiAweDdmZjgpID09PSAweDdmZjAgJiYgKG1pIHwgbG8gfCAoaGkgJiAweGYpKSAhPT0gMCkgaGkgfD0gODtcbiAganNvb19kYXRhdmlldy5zZXRVaW50MzIoMCwgbG8gfCAobWkgPDwgMjQpLCB0cnVlKTtcbiAganNvb19kYXRhdmlldy5zZXRVaW50MzIoNCwgKG1pID4+PiA4KSB8IChoaSA8PCAxNiksIHRydWUpO1xuICByZXR1cm4ganNvb19kYXRhdmlldy5nZXRGbG9hdDY0KDAsIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25leHRhZnRlcl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfYWRkLCBjYW1sX2ludDY0X3N1YixjYW1sX2ludDY0X29mX2ludDMyXG5mdW5jdGlvbiBjYW1sX25leHRhZnRlcl9mbG9hdCh4LCB5KSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oeCkgfHwgTnVtYmVyLmlzTmFOKHkpKSByZXR1cm4gTnVtYmVyLk5hTjtcbiAgaWYgKHggPT09IHkpIHJldHVybiB5O1xuICBpZiAoeCA9PT0gMCkge1xuICAgIGlmICh5IDwgMCkgcmV0dXJuIC1NYXRoLnBvdygyLCAtMTA3NCk7XG4gICAgZWxzZSByZXR1cm4gTWF0aC5wb3coMiwgLTEwNzQpO1xuICB9XG4gIHZhciBiaXRzID0gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpO1xuICB2YXIgb25lID0gY2FtbF9pbnQ2NF9vZl9pbnQzMigxKTtcbiAgaWYgKHggPCB5ID09PSB4ID4gMCkgYml0cyA9IGNhbWxfaW50NjRfYWRkKGJpdHMsIG9uZSk7XG4gIGVsc2UgYml0cyA9IGNhbWxfaW50NjRfc3ViKGJpdHMsIG9uZSk7XG4gIHJldHVybiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoYml0cyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdHJ1bmNfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdHJ1bmNfZmxvYXQoeCkge1xuICByZXR1cm4gTWF0aC50cnVuYyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzIGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2RhdGF2aWV3XG5mdW5jdGlvbiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMoeCkge1xuICBqc29vX2RhdGF2aWV3LnNldFVpbnQzMigwLCB4LCB0cnVlKTtcbiAgcmV0dXJuIGpzb29fZGF0YXZpZXcuZ2V0RmxvYXQzMigwLCB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jbGFzc2lmeV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jbGFzc2lmeV9mbG9hdCh4KSB7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPj0gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpIHJldHVybiAwO1xuICAgIGlmICh4ICE9PSAwKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuICByZXR1cm4gTnVtYmVyLmlzTmFOKHgpID8gNCA6IDM7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX21vZGZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbW9kZl9mbG9hdCh4KSB7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICB2YXIgbmVnID0gMSAvIHggPCAwO1xuICAgIHggPSBNYXRoLmFicyh4KTtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoeCk7XG4gICAgdmFyIGYgPSB4IC0gaTtcbiAgICBpZiAobmVnKSB7XG4gICAgICBpID0gLWk7XG4gICAgICBmID0gLWY7XG4gICAgfVxuICAgIHJldHVybiBbMCwgZiwgaV07XG4gIH1cbiAgaWYgKE51bWJlci5pc05hTih4KSkgcmV0dXJuIFswLCBOdW1iZXIuTmFOLCBOdW1iZXIuTmFOXTtcbiAgcmV0dXJuIFswLCAxIC8geCwgeF07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xkZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xkZXhwX2Zsb2F0KHgsIGV4cCkge1xuICBleHAgfD0gMDtcbiAgaWYgKGV4cCA+IDEwMjMpIHtcbiAgICBleHAgLT0gMTAyMztcbiAgICB4ICo9IE1hdGgucG93KDIsIDEwMjMpO1xuICAgIGlmIChleHAgPiAxMDIzKSB7XG4gICAgICAvLyBpbiBjYXNlIHggaXMgc3Vibm9ybWFsXG4gICAgICBleHAgLT0gMTAyMztcbiAgICAgIHggKj0gTWF0aC5wb3coMiwgMTAyMyk7XG4gICAgfVxuICB9XG4gIGlmIChleHAgPCAtMTAyMykge1xuICAgIGV4cCArPSAxMDIzO1xuICAgIHggKj0gTWF0aC5wb3coMiwgLTEwMjMpO1xuICB9XG4gIHggKj0gTWF0aC5wb3coMiwgZXhwKTtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZyZXhwX2Zsb2F0KHgpIHtcbiAgaWYgKHggPT09IDAgfHwgIU51bWJlci5pc0Zpbml0ZSh4KSkgcmV0dXJuIFswLCB4LCAwXTtcbiAgdmFyIG5lZyA9IHggPCAwO1xuICBpZiAobmVnKSB4ID0gLXg7XG4gIHZhciBleHAgPSBNYXRoLm1heCgtMTAyMywgTWF0aC5mbG9vcihNYXRoLmxvZzIoeCkpICsgMSk7XG4gIHggKj0gTWF0aC5wb3coMiwgLWV4cCk7XG4gIHdoaWxlICh4IDwgMC41KSB7XG4gICAgeCAqPSAyO1xuICAgIGV4cC0tO1xuICB9XG4gIHdoaWxlICh4ID49IDEpIHtcbiAgICB4ICo9IDAuNTtcbiAgICBleHArKztcbiAgfVxuICBpZiAobmVnKSB4ID0gLXg7XG4gIHJldHVybiBbMCwgeCwgZXhwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9jb21wYXJlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Zsb2F0X2NvbXBhcmUoeCwgeSkge1xuICBpZiAoeCA9PT0geSkgcmV0dXJuIDA7XG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICBpZiAoeCA+IHkpIHJldHVybiAxO1xuICBpZiAoIU51bWJlci5pc05hTih4KSkgcmV0dXJuIDE7XG4gIGlmICghTnVtYmVyLmlzTmFOKHkpKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvcHlzaWduX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NvcHlzaWduX2Zsb2F0KHgsIHkpIHtcbiAgaWYgKHkgPT09IDApIHkgPSAxIC8geTtcbiAgeCA9IE1hdGguYWJzKHgpO1xuICByZXR1cm4geSA8IDAgPyAteCA6IHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2lnbmJpdF9mbG9hdCBjb25zdFxuLy9BbGlhczogY2FtbF9zaWduYml0XG5mdW5jdGlvbiBjYW1sX3NpZ25iaXRfZmxvYXQoeCkge1xuICBpZiAoeCA9PT0gMCkgeCA9IDEgLyB4O1xuICByZXR1cm4geCA8IDAgPyAxIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9leHBtMV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9leHBtMV9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmV4cG0xKHgpO1xufVxuLy9Qcm92aWRlczogY2FtbF9leHAyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2V4cDJfZmxvYXQoeCkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzFwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzFwX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGgubG9nMXAoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzJfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMl9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmxvZzIoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2h5cG90X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2h5cG90X2Zsb2F0KHgsIHkpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzEwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzEwX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGgubG9nMTAoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Nvc2hfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29zaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLmNvc2goeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Fjb3NoX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Fjb3NoX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYWNvc2goeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3NpbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc2luaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLnNpbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2FzaW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2FzaW5oX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYXNpbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3RhbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdGFuaF9mbG9hdCh4KSB7XG4gIHJldHVybiBNYXRoLnRhbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2F0YW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2F0YW5oX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguYXRhbmgoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3JvdW5kX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3JvdW5kX2Zsb2F0KHgpIHtcbiAgaWYgKHggPj0gMCkge1xuICAgIHZhciB5ID0gTWF0aC5mbG9vcih4KTtcbiAgICByZXR1cm4geCAtIHkgPj0gMC41ID8geSArIDEgOiB5O1xuICB9IGVsc2Uge1xuICAgIHZhciB5ID0gTWF0aC5jZWlsKHgpO1xuICAgIHJldHVybiB5IC0geCA+PSAwLjUgPyB5IC0gMSA6IHk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfY2JydF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jYnJ0X2Zsb2F0KHgpIHtcbiAgcmV0dXJuIE1hdGguY2JydCh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZXJmX2Zsb2F0KHgpIHtcbiAgdmFyIGExID0gMC4yNTQ4Mjk1OTI7XG4gIHZhciBhMiA9IC0wLjI4NDQ5NjczNjtcbiAgdmFyIGEzID0gMS40MjE0MTM3NDE7XG4gIHZhciBhNCA9IC0xLjQ1MzE1MjAyNztcbiAgdmFyIGE1ID0gMS4wNjE0MDU0Mjk7XG4gIHZhciBwID0gMC4zMjc1OTExO1xuXG4gIHZhciBzaWduID0gMTtcbiAgaWYgKHggPCAwKSB7XG4gICAgc2lnbiA9IC0xO1xuICB9XG4gIHggPSBNYXRoLmFicyh4KTtcbiAgdmFyIHQgPSAxLjAgLyAoMS4wICsgcCAqIHgpO1xuICB2YXIgeSA9XG4gICAgMS4wIC0gKCgoKGE1ICogdCArIGE0KSAqIHQgKyBhMykgKiB0ICsgYTIpICogdCArIGExKSAqIHQgKiBNYXRoLmV4cCgteCAqIHgpO1xuXG4gIHJldHVybiBzaWduICogeTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZjX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2VyZl9mbG9hdFxuZnVuY3Rpb24gY2FtbF9lcmZjX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIDEgLSBjYW1sX2VyZl9mbG9hdCh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbWFfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZm1hX2Zsb2F0KHgsIHksIHopIHtcbiAgdmFyIFNQTElUID0gTWF0aC5wb3coMiwgMjcpICsgMTtcbiAgdmFyIE1JTl9WQUxVRSA9IE1hdGgucG93KDIsIC0xMDIyKTtcbiAgdmFyIEVQU0lMT04gPSBNYXRoLnBvdygyLCAtNTIpO1xuICB2YXIgQyA9IDQxNjtcbiAgdmFyIEEgPSBNYXRoLnBvdygyLCArQyk7XG4gIHZhciBCID0gTWF0aC5wb3coMiwgLUMpO1xuXG4gIGZ1bmN0aW9uIG11bHRpcGx5KGEsIGIpIHtcbiAgICB2YXIgYXQgPSBTUExJVCAqIGE7XG4gICAgdmFyIGFoaSA9IGF0IC0gKGF0IC0gYSk7XG4gICAgdmFyIGFsbyA9IGEgLSBhaGk7XG4gICAgdmFyIGJ0ID0gU1BMSVQgKiBiO1xuICAgIHZhciBiaGkgPSBidCAtIChidCAtIGIpO1xuICAgIHZhciBibG8gPSBiIC0gYmhpO1xuICAgIHZhciBwID0gYSAqIGI7XG4gICAgdmFyIGUgPSBhaGkgKiBiaGkgLSBwICsgYWhpICogYmxvICsgYWxvICogYmhpICsgYWxvICogYmxvO1xuICAgIHJldHVybiB7XG4gICAgICBwOiBwLFxuICAgICAgZTogZSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkKGEsIGIpIHtcbiAgICB2YXIgcyA9IGEgKyBiO1xuICAgIHZhciB2ID0gcyAtIGE7XG4gICAgdmFyIGUgPSBhIC0gKHMgLSB2KSArIChiIC0gdik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHM6IHMsXG4gICAgICBlOiBlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhZGp1c3QoeCwgeSkge1xuICAgIHJldHVybiB4ICE9PSAwICYmIHkgIT09IDAgJiYgU1BMSVQgKiB4IC0gKFNQTElUICogeCAtIHgpID09PSB4XG4gICAgICA/IHggKiAoMSArICh4IDwgMCA/IC0xIDogKzEpICogKHkgPCAwID8gLTEgOiArMSkgKiBFUFNJTE9OKVxuICAgICAgOiB4O1xuICB9XG5cbiAgaWYgKHggPT09IDAgfHwgeSA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKHgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoeSkpIHtcbiAgICByZXR1cm4geCAqIHkgKyB6O1xuICB9XG4gIGlmICh6ID09PSAwKSB7XG4gICAgcmV0dXJuIHggKiB5O1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHopKSB7XG4gICAgcmV0dXJuIHo7XG4gIH1cblxuICB2YXIgc2NhbGUgPSAxO1xuICB3aGlsZSAoTWF0aC5hYnMoeCkgPiBBKSB7XG4gICAgc2NhbGUgKj0gQTtcbiAgICB4ICo9IEI7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpID4gQSkge1xuICAgIHNjYWxlICo9IEE7XG4gICAgeSAqPSBCO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMSAvIDApIHtcbiAgICByZXR1cm4geCAqIHkgKiBzY2FsZTtcbiAgfVxuICB3aGlsZSAoTWF0aC5hYnMoeCkgPCBCKSB7XG4gICAgc2NhbGUgKj0gQjtcbiAgICB4ICo9IEE7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpIDwgQikge1xuICAgIHNjYWxlICo9IEI7XG4gICAgeSAqPSBBO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMCkge1xuICAgIHJldHVybiB6O1xuICB9XG5cbiAgdmFyIHhzID0geDtcbiAgdmFyIHlzID0geTtcbiAgdmFyIHpzID0geiAvIHNjYWxlO1xuXG4gIGlmIChNYXRoLmFicyh6cykgPiAoTWF0aC5hYnMoeHMgKiB5cykgKiA0KSAvIEVQU0lMT04pIHtcbiAgICByZXR1cm4gejtcbiAgfVxuICBpZiAoTWF0aC5hYnMoenMpIDwgKCgoTWF0aC5hYnMoeHMgKiB5cykgKiBFUFNJTE9OKSAvIDQpICogRVBTSUxPTikgLyA0KSB7XG4gICAgenMgPSAoeiA8IDAgPyAtMSA6ICsxKSAqIE1JTl9WQUxVRTtcbiAgfVxuXG4gIHZhciB4eSA9IG11bHRpcGx5KHhzLCB5cyk7XG4gIHZhciBzID0gYWRkKHh5LnAsIHpzKTtcbiAgdmFyIHUgPSBhZGQoeHkuZSwgcy5lKTtcbiAgdmFyIGkgPSBhZGQocy5zLCB1LnMpO1xuXG4gIHZhciBmID0gaS5zICsgYWRqdXN0KGkuZSwgdS5lKTtcbiAgaWYgKGYgPT09IDApIHtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIHZhciBmcyA9IGYgKiBzY2FsZTtcbiAgaWYgKE1hdGguYWJzKGZzKSA+IE1JTl9WQUxVRSkge1xuICAgIHJldHVybiBmcztcbiAgfVxuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgd2FzIGV4dHJhIHJvdW5kaW5nIGZvciBhIGRlbm9ybWFsaXplZCB2YWx1ZS5cbiAgcmV0dXJuIGZzICsgYWRqdXN0KGYgLSBmcyAvIHNjYWxlLCBpLmUpICogc2NhbGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9mbG9hdChmbXQsIHgpIHtcbiAgZnVuY3Rpb24gdG9GaXhlZCh4LCBkcCkge1xuICAgIGlmIChNYXRoLmFicyh4KSA8IDEuMCkge1xuICAgICAgcmV0dXJuIHgudG9GaXhlZChkcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlID0gTnVtYmVyLnBhcnNlSW50KHgudG9TdHJpbmcoKS5zcGxpdChcIitcIilbMV0pO1xuICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICBlIC09IDIwO1xuICAgICAgICB4IC89IE1hdGgucG93KDEwLCBlKTtcbiAgICAgICAgeCArPSBjYW1sX3N0cl9yZXBlYXQoZSwgXCIwXCIpO1xuICAgICAgICBpZiAoZHAgPiAwKSB7XG4gICAgICAgICAgeCA9IHggKyBcIi5cIiArIGNhbWxfc3RyX3JlcGVhdChkcCwgXCIwXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSBlbHNlIHJldHVybiB4LnRvRml4ZWQoZHApO1xuICAgIH1cbiAgfVxuICB2YXIgcyxcbiAgICBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgdmFyIHByZWMgPSBmLnByZWMgPCAwID8gNiA6IGYucHJlYztcbiAgaWYgKHggPCAwIHx8ICh4ID09PSAwICYmIDEgLyB4ID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpKSB7XG4gICAgZi5zaWduID0gLTE7XG4gICAgeCA9IC14O1xuICB9XG4gIGlmIChOdW1iZXIuaXNOYU4oeCkpIHtcbiAgICBzID0gXCJuYW5cIjtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICB9IGVsc2UgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICBzID0gXCJpbmZcIjtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICB9IGVsc2VcbiAgICBzd2l0Y2ggKGYuY29udikge1xuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgdmFyIHMgPSB4LnRvRXhwb25lbnRpYWwocHJlYyk7XG4gICAgICAgIC8vIGV4cG9uZW50IHNob3VsZCBiZSBhdCBsZWFzdCB0d28gZGlnaXRzXG4gICAgICAgIHZhciBpID0gcy5sZW5ndGg7XG4gICAgICAgIGlmIChzLmNoYXJBdChpIC0gMykgPT09IFwiZVwiKVxuICAgICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgLSAxKSArIFwiMFwiICsgcy5zbGljZShpIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImZcIjpcbiAgICAgICAgcyA9IHRvRml4ZWQoeCwgcHJlYyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImdcIjpcbiAgICAgICAgcHJlYyA9IHByZWMgPyBwcmVjIDogMTtcbiAgICAgICAgcyA9IHgudG9FeHBvbmVudGlhbChwcmVjIC0gMSk7XG4gICAgICAgIHZhciBqID0gcy5pbmRleE9mKFwiZVwiKTtcbiAgICAgICAgdmFyIGV4cCA9ICtzLnNsaWNlKGogKyAxKTtcbiAgICAgICAgaWYgKGV4cCA8IC00IHx8IHggPj0gMWUyMSB8fCB4LnRvRml4ZWQoMCkubGVuZ3RoID4gcHJlYykge1xuICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICB2YXIgaSA9IGogLSAxO1xuICAgICAgICAgIHdoaWxlIChzLmNoYXJBdChpKSA9PT0gXCIwXCIpIGktLTtcbiAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT09IFwiLlwiKSBpLS07XG4gICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpICsgcy5zbGljZShqKTtcbiAgICAgICAgICBpID0gcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PT0gXCJlXCIpXG4gICAgICAgICAgICBzID0gcy5zbGljZSgwLCBpIC0gMSkgKyBcIjBcIiArIHMuc2xpY2UoaSAtIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwID0gcHJlYztcbiAgICAgICAgICBpZiAoZXhwIDwgMCkge1xuICAgICAgICAgICAgcCAtPSBleHAgKyAxO1xuICAgICAgICAgICAgcyA9IHgudG9GaXhlZChwKTtcbiAgICAgICAgICB9IGVsc2Ugd2hpbGUgKCgocyA9IHgudG9GaXhlZChwKSksIHMubGVuZ3RoID4gcHJlYyArIDEpKSBwLS07XG4gICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICAgIHZhciBpID0gcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgd2hpbGUgKHMuY2hhckF0KGkpID09PSBcIjBcIikgaS0tO1xuICAgICAgICAgICAgaWYgKHMuY2hhckF0KGkpID09PSBcIi5cIikgaS0tO1xuICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X29mX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX3N0cmluZyhzKSB7XG4gIHZhciByZXM7XG4gIHZhciByX2Zsb2F0ID0gL14gKlstK10/KD86XFxkKlxcLj9cXGQrfFxcZCtcXC4/XFxkKikoPzpbZUVdWy0rXT9cXGQrKT8kLztcbiAgcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocyk7XG4gIHJlcyA9ICtzO1xuICAvL0Zhc3QgcGF0aFxuICBpZiAoIU51bWJlci5pc05hTihyZXMpICYmIHJfZmxvYXQudGVzdChzKSkgcmV0dXJuIHJlcztcbiAgcyA9IHMucmVwbGFjZSgvXy9nLCBcIlwiKTtcbiAgcmVzID0gK3M7XG4gIGlmICgoIU51bWJlci5pc05hTihyZXMpICYmIHJfZmxvYXQudGVzdChzKSkgfHwgL15bKy1dP25hbiQvaS50ZXN0KHMpKVxuICAgIHJldHVybiByZXM7XG4gIHZhciBtID0gL14gKihbKy1dPykweChbMC05YS1mXSspXFwuPyhbMC05YS1mXSopKHAoWystXT9bMC05XSspKT8kL2kuZXhlYyhzKTtcbiAgLy8gICAgICAgICAgMSAgICAgICAgMiAgICAgICAgICAgICAzICAgICAgICAgICA1XG4gIGlmIChtKSB7XG4gICAgdmFyIG0zID0gbVszXS5yZXBsYWNlKC8wKyQvLCBcIlwiKTtcbiAgICB2YXIgbWFudGlzc2EgPSBOdW1iZXIucGFyc2VJbnQobVsxXSArIG1bMl0gKyBtMywgMTYpO1xuICAgIHZhciBleHBvbmVudCA9ICgrbVs1XSB8fCAwKSAtIDQgKiBtMy5sZW5ndGg7XG4gICAgcmVzID0gbWFudGlzc2EgKiBNYXRoLnBvdygyLCBleHBvbmVudCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoL15cXCs/aW5mKGluaXR5KT8kL2kudGVzdChzKSkgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgaWYgKC9eLWluZihpbml0eSk/JC9pLnRlc3QocykpIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGNhbWxfZmFpbHdpdGgoXCJmbG9hdF9vZl9zdHJpbmdcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuZnVuY3Rpb24gY2FtbF91cGRhdGVfZHVtbXkoeCwgeSkge1xuICBpZiAoeS5mdW4pIHtcbiAgICB4LmZ1biA9IHkuZnVuO1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgeC5mdW4gPSB5O1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBpID0geS5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHhbaV0gPSB5W2ldO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19kdW1teV9pbmZpeFxuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuLy9WZXJzaW9uOiA8IDUuNFxuZnVuY3Rpb24gY2FtbF9hbGxvY19kdW1teV9pbmZpeCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYoeCkge1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYuZnVuLCBbeF0pO1xuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FsbG9jX2R1bW15X2xhenlcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2FsbG9jX2R1bW15X2xhenkoX3VuaXQpIHtcbiAgcmV0dXJuIFswLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91cGRhdGVfZHVtbXlfbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfdXBkYXRlX2R1bW15X2xhenkoZHVtbXksIG5ld3ZhbCkge1xuICBzd2l0Y2ggKGNhbWxfb2JqX3RhZyhuZXd2YWwpKSB7XG4gICAgY2FzZSAyNDY6IC8vIExhenlcbiAgICBjYXNlIDI0NDogLy8gRm9yY2luZ1xuICAgIGNhc2UgMjUwOiAvLyBGb3J3YXJkXG4gICAgICBjYW1sX3VwZGF0ZV9kdW1teShkdW1teSwgbmV3dmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBkdW1teVsxXSA9IG5ld3ZhbDtcbiAgICAgIGR1bW15WzBdID0gMjUwO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9pc19tbF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfb2JqX3RhZyh4KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHhbMF0gPT09IHhbMF0gPj4+IDApIHJldHVybiB4WzBdO1xuICBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKHgpKSByZXR1cm4gMjUyO1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh4KSkgcmV0dXJuIDI1MjtcbiAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiAyNDc7XG4gIGVsc2UgaWYgKHg/LmNhbWxfY3VzdG9tKSByZXR1cm4gMjU1O1xuICBlbHNlIHJldHVybiAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9zZXRfdGFnIChtdXRhYmxlLCBjb25zdClcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF90YWcoeCwgdGFnKSB7XG4gIHhbMF0gPSB0YWc7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9vYmpfYmxvY2sgY29uc3QgKGNvbnN0LGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfYmxvY2sodGFnLCBzaXplKSB7XG4gIC8vIFRPRE86IGZhaWwgZm9yIHZhbHVlIHRoYXQgYXJlIG5vdCByZXByZXNlbnRlZCBhcyBhbiBhcnJheVxuICB2YXIgbyA9IG5ldyBBcnJheShzaXplICsgMSk7XG4gIG9bMF0gPSB0YWc7XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHNpemU7IGkrKykgb1tpXSA9IDA7XG4gIHJldHVybiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial93aXRoX3RhZ1xuZnVuY3Rpb24gY2FtbF9vYmpfd2l0aF90YWcodGFnLCB4KSB7XG4gIHZhciBsID0geC5sZW5ndGg7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gdGFnO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGw7IGkrKykgYVtpXSA9IHhbaV07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9kdXAgbXV0YWJsZSAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfb2JqX2R1cCh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIiA/IHggOiB4LnNsaWNlKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RydW5jYXRlIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfdHJ1bmNhdGUoeCwgcykge1xuICBpZiAocyA8PSAwIHx8IHMgKyAxID4geC5sZW5ndGgpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIk9iai50cnVuY2F0ZVwiKTtcbiAgaWYgKHgubGVuZ3RoICE9PSBzICsgMSkgeC5sZW5ndGggPSBzICsgMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX21ha2VfZm9yd2FyZFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfbWFrZV9mb3J3YXJkKGIsIHYpIHtcbiAgYlswXSA9IDI1MDtcbiAgYlsxXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcCh4LCBpLCBvbGQsIG4pIHtcbiAgaWYgKHhbaSArIDFdID09PSBvbGQpIHtcbiAgICB4W2kgKyAxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2lzX3NoYXJlZFxuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfb2JqX2lzX3NoYXJlZChfeCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X21ha2VfZm9yd2FyZCBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGF6eV9tYWtlX2ZvcndhcmQodikge1xuICByZXR1cm4gWzI1MCwgdl07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWV0aG9kX2NhY2hlXG52YXIgY2FtbF9tZXRob2RfY2FjaGUgPSBbXTtcblxuLy9Qcm92aWRlczogY2FtbF9vb19jYWNoZV9pZCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9tZXRob2RfY2FjaGVcbmZ1bmN0aW9uIGNhbWxfb29fY2FjaGVfaWQoKSB7XG4gIHZhciBjYWNoZWlkID0gY2FtbF9tZXRob2RfY2FjaGUubGVuZ3RoO1xuICBjYW1sX21ldGhvZF9jYWNoZVtjYWNoZWlkXSA9IDA7XG4gIGNhY2hlaWQ7XG59XG5cbi8vLy8vLy8vLy8vLy8gQ2FtbGludGVybmFsT09cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NhY2hlZF9tZXRob2QgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWV0aG9kX2NhY2hlXG5mdW5jdGlvbiBjYW1sX2dldF9jYWNoZWRfbWV0aG9kKG9iaiwgdGFnLCBjYWNoZWlkKSB7XG4gIHZhciBtZXRocyA9IG9ialsxXTtcbiAgdmFyIG9mcyA9IGNhbWxfbWV0aG9kX2NhY2hlW2NhY2hlaWRdO1xuICBpZiAobWV0aHNbb2ZzICsgNF0gPT09IHRhZykge1xuICAgIHJldHVybiBtZXRoc1tvZnMgKyAzXTtcbiAgfVxuICB2YXIgbGkgPSAzLFxuICAgIGhpID0gbWV0aHNbMV0gKiAyICsgMSxcbiAgICBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkgKyBoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSArIDFdKSBoaSA9IG1pIC0gMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgY2FtbF9tZXRob2RfY2FjaGVbY2FjaGVpZF0gPSBsaSAtIDM7XG4gIHJldHVybiBtZXRoc1tsaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X3B1YmxpY19tZXRob2QgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X3B1YmxpY19tZXRob2Qob2JqLCB0YWcpIHtcbiAgdmFyIG1ldGhzID0gb2JqWzFdO1xuICB2YXIgbGkgPSAzLFxuICAgIGhpID0gbWV0aHNbMV0gKiAyICsgMSxcbiAgICBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkgKyBoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSArIDFdKSBoaSA9IG1pIC0gMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgLyogcmV0dXJuIDAgaWYgdGFnIGlzIG5vdCB0aGVyZSAqL1xuICByZXR1cm4gdGFnID09PSBtZXRoc1tsaSArIDFdID8gbWV0aHNbbGldIDogMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vb19sYXN0X2lkXG52YXIgY2FtbF9vb19sYXN0X2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9zZXRfb29faWRcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9zZXRfb29faWQoYikge1xuICBiWzJdID0gY2FtbF9vb19sYXN0X2lkKys7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXNoX29vX2lkIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX29vX2xhc3RfaWRcbmZ1bmN0aW9uIGNhbWxfZnJlc2hfb29faWQoKSB7XG4gIHJldHVybiBjYW1sX29vX2xhc3RfaWQrKztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfcmF3X2ZpZWxkXG5mdW5jdGlvbiBjYW1sX29ial9yYXdfZmllbGQobywgaSkge1xuICByZXR1cm4gb1tpICsgMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF9yYXdfZmllbGQobywgaSwgdikge1xuICByZXR1cm4gKG9baSArIDFdID0gdik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3JlYWNoYWJsZV93b3Jkc1xuZnVuY3Rpb24gY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzKF9vKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9hZGRfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX29ial9hZGRfb2Zmc2V0KF92LCBfb2Zmc2V0KSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJPYmouYWRkX29mZnNldCBpcyBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial91cGRhdGVfdGFnXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9vYmpfdXBkYXRlX3RhZyhiLCBvLCBuKSB7XG4gIGlmIChiWzBdID09PSBvKSB7XG4gICAgYlswXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZ1xuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZyhvKSB7XG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KG8pICYmXG4gICAgb1swXSA9PT0gb1swXSA+Pj4gMCAmJlxuICAgIGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ2LCAyNDQpXG4gICkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZFxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZChvKSB7XG4gIGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ0LCAyNTApO1xuICByZXR1cm4gMDsgLy8gdW5pdFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVzZXRfdG9fbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZXNldF90b19sYXp5KG8pIHtcbiAgY2FtbF9vYmpfdXBkYXRlX3RhZyhvLCAyNDQsIDI0Nik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVhZF9yZXN1bHRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3RhZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZWFkX3Jlc3VsdChvKSB7XG4gIHJldHVybiBjYW1sX29ial90YWcobykgPT09IDI1MCA/IG9bMV0gOiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbi8vVmVyc2lvbjogPCA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcoX3QpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodCkge1xuICByZXR1cm4gdCA9PT0gMjQ1ID8gMSA6IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2lkZW50aWZpZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2N1c3RvbV9pZGVudGlmaWVyKG8pIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG8uY2FtbF9jdXN0b20gfHwgXCJcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZ2NfcmFtcF91cFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfbWxfZ2NfcmFtcF91cChmKSB7XG4gIHZhciBhID0gY2FtbF9jYWxsYmFjayhmLCBbMF0pO1xuICB2YXIgc3VzcGVuZGVkID0gMDtcbiAgcmV0dXJuIFswLCBhLCBzdXNwZW5kZWRdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2djX3JhbXBfZG93blxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfbWxfZ2NfcmFtcF9kb3duKF9zdXNwZW5kZWRfY29sbGVjdGlvbl93b3JrKSB7XG4gIHJldHVybiAwO1xufVxuIiwiLypcblRvIGRlYWwgd2l0aCBlZmZlY3RzLCB0aGUgZXhlY3V0aW9uIGNvbnRleHQgaXMgaW50dWl0aXZlbHkgY29tcG9zZWQgb2ZcbmEgc3RhY2sgb2YgZmliZXJzLiBFYWNoIGZpYmVyIGhhcyBhIGN1cnJlbnQgbG93LWxldmVsIGNvbnRpbnVhdGlvblxuKG9uZS1hcmd1bWVudCBKYXZhU2NyaXB0IGZ1bmN0aW9uKSwgYSBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kXG5hIHRyaXBsZSBvZiBoYW5kbGVycywgd2hpY2ggYXJlIGludm9rZWQgd2hlbiB0aGUgZmliZXIgdGVybWluYXRlc1xuKGVpdGhlciB3aXRoIGEgdmFsdWUgb3IgYW4gZXhjZXB0aW9uKSBvciB3aGVuIGFuIGVmZmVjdCBpcyBwZXJmb3JtZWQuXG5UaGUgbG93LWxldmVsIGNvbnRpbnVhdGlvbiBvZiB0aGUgdG9wbW9zdCBmaWJlciAod2hpY2ggaXMgY3VycmVudGx5XG5leGVjdXRpbmcpIGlzIHBhc3NlZCBmcm9tIGZ1bmN0aW9uIHRvIGZ1bmN0aW9uIGFzIGFuIGFkZGl0aW9uYWxcbmFyZ3VtZW50LiBJdHMgc3RhY2sgb2YgZXhjZXB0aW9uIGhhbmRsZXJzIGlzIHN0b3JlZCBpblxuW2NhbWxfY3VycmVudF9zdGFjay54XS5cbkV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgcHVzaGVkIGludG8gdGhpcyBzdGFja1xud2hlbiBlbnRlcmluZyBhIFt0cnkgLi4uIHdpdGggLi4uXSBhbmQgcG9wcGVkIG9uIGV4aXQuXG5IYW5kbGVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2N1cnJlbnRfc3RhY2suaF1cbmFuZCB0aGUgcmVtYWluaW5nIGZpYmVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2N1cnJlbnRfc3RhY2suZV0uXG5UbyBpbnN0YWxsIGFuIGVmZmVjdCBoYW5kbGVyLCB3ZSBwdXNoIGEgbmV3IGZpYmVyIGludG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LlxuXG5XZSBoYXZlIGJhc2ljYWxseSB0aGUgZm9sbG93aW5nIHR5cGUgZm9yIHJlaWZpZWQgY29udGludWF0aW9ucyAodHlwZVxuW2NvbnRpbnVhdGlvbl0gaW4gbW9kdWxlIFtFZmZlY3RdIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KTpcblxuICB0eXBlICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiA9ICgnYSwgJ2IpIHN0YWNrIHJlZlxuXG4gIGFuZCAoXywgXykgc3RhY2sgPVxuICAgICAgQ29ucyA6ICgnYiAtPiB1bml0KSAqICAgICAgICAgICAgICgqIGxvdy1sZXZlbCBjb250aW51YXRpb24gKilcbiAgICAgICAgICAgICAoZXhuIC0+IHVuaXQpIGxpc3QgKiAgICAgICAoKiBleGNlcHRpb24gaGFuZGxlcnMgKilcbiAgICAgICAgICAgICAoJ2IsICdjKSBoYW5kbGVyICpcbiAgICAgICAgICAgICAoJ2EsICdiKSBzdGFja1xuICAgICAgICAgICAgIC0+ICgnYSwgJ2MpIHN0YWNrXG4gICAgfCBFbXB0eSA6ICgnYSwgJ2EpIHN0YWNrXG5cbiAgYW5kICgnYSwnYikgaGFuZGxlciA9ICAgKCogQXMgaW4gbW9kdWxlIEVmZmVjdCBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5ICopXG4gICAgeyByZXRjOiAnYSAtPiAnYjtcbiAgICAgIGV4bmM6IGV4biAtPiAnYjtcbiAgICAgIGVmZmM6ICdjLidjIEVmZmVjdC50IC0+ICgoJ2MsJ2IpIGNvbnRpbnVhdGlvbiAtPiAnYikgb3B0aW9uIH1cblxuQ29udGludWF0aW9ucyBhcmUgb25lLXNob3QuIEEgY29udGludWF0aW9uIFtyZWYgRW1wdHldIGhhcyBhbHJlYWR5XG5iZWVuIHJlc3VtZWQuXG5cbkEgY29udGludWF0aW9uIGlzIGJhc2ljYWxseSBjb21wb3NlZCBvZiBhIGxpc3Qgb2YgZmliZXJzLCB3aGljaCBlYWNoXG5oYXMgaXRzIGxvdy1sZXZlbCBjb250aW51YXRpb24sIGl0cyBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kIGFcbnRyaXBsZSBvZiBoYW5kbGVycyB0byBkZWFsIHdpdGggd2hlbiB0aGUgZmliZXIgdGVybWluYXRlcyBvciBhblxuZWZmZWN0IGlzIHBlcmZvcm1lZC4gV2hlbiByZXN1bWluZyBhIGNvbnRpbnVhdGlvbiwgdGhlIGlubmVybW9zdCBmaWJlclxuaXMgcmVzdW1lZCBmaXJzdC5cblxuVGhlIGhhbmRsZXJzIGFyZSBDUFMtdHJhbnNmb3JtZWQgZnVuY3Rpb25zOiB0aGV5IGFjdHVhbGx5IHRha2UgYW5cbmFkZGl0aW9uYWwgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBjdXJyZW50IGxvdy1sZXZlbCBjb250aW51YXRpb24uXG4qL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vIFRoaXMgaGFzIHRoZSBzaGFwZSB7aywgeCwgaCwgZX0gd2hlcmVcbi8vIC0gaCBpcyBhIHRyaXBsZSBvZiBoYW5kbGVycyAoc2VlIGVmZmVjdC5tbClcbi8vIC0gayBpcyB0aGUgbG93IGxldmVsIGNvbnRpbnVhdGlvblxuLy8gLSB4IGlzIHRoZSBleGNlcHRpb24gc3RhY2tcbi8vIC0gZSBpcyB0aGUgZmliZXIgc3RhY2sgb2YgdGhlIHBhcmVudCBmaWJlci5cbnZhciBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcblxuLy9Qcm92aWRlczogY2FtbF9wdXNoX3RyYXBcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wdXNoX3RyYXAoaGFuZGxlcikge1xuICBjYW1sX2N1cnJlbnRfc3RhY2sueCA9IHsgaDogaGFuZGxlciwgdDogY2FtbF9jdXJyZW50X3N0YWNrLnggfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3BfdHJhcFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3BvcF90cmFwKCkge1xuICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KVxuICAgIHJldHVybiBmdW5jdGlvbiAoeCkge1xuICAgICAgdGhyb3cgeDtcbiAgICB9O1xuICB2YXIgaCA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfdW5oYW5kbGVkXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG5cbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3VuaGFuZGxlZChlZmYpIHtcbiAgdmFyIGV4biA9IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4bihlZmYpO1xuICB0aHJvdyBleG47XG59XG5cbi8vUHJvdmlkZXM6Y2FtbF9yZXN1bWVfc3RhY2tcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfcmFpc2VfY29uc3RhbnRcbi8vUmVxdWlyZXM6IGNhbWxfcG9wX2ZpYmVyLCBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgbGFzdCwgaykge1xuICBpZiAoIXN0YWNrKVxuICAgIGNhbWxfcmFpc2VfY29uc3RhbnQoXG4gICAgICBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LkNvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcIiksXG4gICAgKTtcbiAgaWYgKGxhc3QgPT09IDApIHtcbiAgICBsYXN0ID0gc3RhY2s7XG4gICAgLy8gUHJlIE9DYW1sIDUuMiwgbGFzdCB3YXMgbm90IHBvcHVsYXRlZC5cbiAgICB3aGlsZSAobGFzdC5lICE9PSAwKSBsYXN0ID0gbGFzdC5lO1xuICB9XG4gIGNhbWxfY3VycmVudF9zdGFjay5rID0gaztcbiAgbGFzdC5lID0gY2FtbF9jdXJyZW50X3N0YWNrO1xuICBjYW1sX2N1cnJlbnRfc3RhY2sgPSBzdGFjaztcbiAgcmV0dXJuIHN0YWNrLms7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9wX2ZpYmVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3BvcF9maWJlcigpIHtcbiAgLy8gTW92ZSB0byB0aGUgcGFyZW50IGZpYmVyLCByZXR1cm5pbmcgdGhlIHBhcmVudCdzIGxvdy1sZXZlbCBjb250aW51YXRpb25cbiAgdmFyIGMgPSBjYW1sX2N1cnJlbnRfc3RhY2suZTtcbiAgY2FtbF9jdXJyZW50X3N0YWNrLmUgPSAwO1xuICBjYW1sX2N1cnJlbnRfc3RhY2sgPSBjO1xuICByZXR1cm4gYy5rO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG5cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfZnJlc2hfb29faWRcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG4oZWZmKSB7XG4gIHZhciBleG4gPSBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LlVuaGFuZGxlZFwiKTtcbiAgaWYgKGV4bikgZXhuID0gWzAsIGV4biwgZWZmXTtcbiAgZWxzZSB7XG4gICAgZXhuID0gW1xuICAgICAgMjQ4LFxuICAgICAgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkVmZmVjdC5VbmhhbmRsZWRcIiksXG4gICAgICBjYW1sX2ZyZXNoX29vX2lkKDApLFxuICAgIF07XG4gIH1cbiAgcmV0dXJuIGV4bjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4biwgY2FtbF9jdXJyZW50X3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9wZXJmb3JtX2VmZmVjdChlZmYsIGswKSB7XG4gIGlmIChjYW1sX2N1cnJlbnRfc3RhY2suZSA9PT0gMCkge1xuICAgIHZhciBleG4gPSBjYW1sX21ha2VfdW5oYW5kbGVkX2VmZmVjdF9leG4oZWZmKTtcbiAgICB0aHJvdyBleG47XG4gIH1cbiAgLy8gR2V0IGN1cnJlbnQgZWZmZWN0IGhhbmRsZXJcbiAgdmFyIGhhbmRsZXIgPSBjYW1sX2N1cnJlbnRfc3RhY2suaFszXTtcbiAgdmFyIGxhc3RfZmliZXIgPSBjYW1sX2N1cnJlbnRfc3RhY2s7XG4gIGxhc3RfZmliZXIuayA9IGswO1xuICB2YXIgY29udCA9IFsyNDUgLypjb250aW51YXRpb24qLywgbGFzdF9maWJlciwgbGFzdF9maWJlcl07XG4gIC8vIE1vdmUgdG8gcGFyZW50IGZpYmVyIGFuZCBleGVjdXRlIHRoZSBlZmZlY3QgaGFuZGxlciB0aGVyZVxuICAvLyBUaGUgaGFuZGxlciBpcyBkZWZpbmVkIGluIFN0ZGxpYi5FZmZlY3QsIHNvIHdlIGtub3cgdGhhdCB0aGUgYXJpdHkgbWF0Y2hlc1xuICB2YXIgazEgPSBjYW1sX3BvcF9maWJlcigpO1xuICByZXR1cm4gY2FtbF9zdGFja19jaGVja19kZXB0aCgpXG4gICAgPyBjYW1sX2dldF9jcHNfZnVuKGhhbmRsZXIpKGVmZiwgY29udCwgbGFzdF9maWJlciwgazEpXG4gICAgOiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGhhbmRsZXIsIFtlZmYsIGNvbnQsIGxhc3RfZmliZXIsIGsxXSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVwZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4biwgY2FtbF9jdXJyZW50X3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX3Jlc3VtZV9zdGFjaywgY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjXG4vL1JlcXVpcmVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9yZXBlcmZvcm1fZWZmZWN0KGVmZiwgY29udCwgbGFzdCwgazApIHtcbiAgaWYgKGNhbWxfY3VycmVudF9zdGFjay5lID09PSAwKSB7XG4gICAgdmFyIGV4biA9IGNhbWxfbWFrZV91bmhhbmRsZWRfZWZmZWN0X2V4bihlZmYpO1xuICAgIHZhciBzdGFjayA9IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KTtcbiAgICBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgbGFzdCwgazApO1xuICAgIHRocm93IGV4bjtcbiAgfVxuICAvLyBHZXQgY3VycmVudCBlZmZlY3QgaGFuZGxlclxuICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay5oWzNdO1xuICB2YXIgbGFzdF9maWJlciA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgbGFzdF9maWJlci5rID0gazA7XG4gIGxhc3QuZSA9IGxhc3RfZmliZXI7XG4gIGNvbnRbMl0gPSBsYXN0X2ZpYmVyO1xuICAvLyBNb3ZlIHRvIHBhcmVudCBmaWJlciBhbmQgZXhlY3V0ZSB0aGUgZWZmZWN0IGhhbmRsZXIgdGhlcmVcbiAgLy8gVGhlIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiBTdGRsaWIuRWZmZWN0LCBzbyB3ZSBrbm93IHRoYXQgdGhlIGFyaXR5IG1hdGNoZXNcbiAgdmFyIGsxID0gY2FtbF9wb3BfZmliZXIoKTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKVxuICAgID8gY2FtbF9nZXRfY3BzX2Z1bihoYW5kbGVyKShlZmYsIGNvbnQsIGxhc3RfZmliZXIsIGsxKVxuICAgIDogY2FtbF90cmFtcG9saW5lX3JldHVybihoYW5kbGVyLCBbZWZmLCBjb250LCBsYXN0X2ZpYmVyLCBrMV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9jcHNfZnVuXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiAhZG91YmxldHJhbnNsYXRlXG5mdW5jdGlvbiBjYW1sX2dldF9jcHNfZnVuKGYpIHtcbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2Nwc19mdW5cbi8vSWY6IGVmZmVjdHNcbi8vSWY6IGRvdWJsZXRyYW5zbGF0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfY3BzX2Z1bihmKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvIGdldCB0aGUgZWZmZWN0IGhhbmRsZXIuIElmIHRoZVxuICAvLyBlZmZlY3QgaGFuZGxlciBoYXMgbm8gQ1BTIGZ1bmN0aW9uLCB3ZSBrbm93IHRoYXQgd2UgY2FuIGRpcmVjdGx5XG4gIC8vIGNhbGwgdGhlIGRpcmVjdCB2ZXJzaW9uIGluc3RlYWQuXG4gIHJldHVybiBmLmNwcyA/IGYuY3BzIDogZjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfY2FsbF9nZW4sIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5fY3BzLCBjYW1sX2N1cnJlbnRfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrX2NhbGwoZiwgeCkge1xuICB2YXIgYXJncyA9IFt4LCBjYW1sX3BvcF9maWJlcigpXTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKVxuICAgID8gY2FtbF9jYWxsX2dlbl9jcHMoZiwgYXJncylcbiAgICA6IGNhbWxfdHJhbXBvbGluZV9yZXR1cm4oZiwgYXJncywgMCk7XG59XG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrX2h2YWwoeCkge1xuICAvLyBDYWxsIFtodl0gaW4gdGhlIHBhcmVudCBmaWJlclxuICB2YXIgZiA9IGNhbWxfY3VycmVudF9zdGFjay5oWzFdO1xuICByZXR1cm4gY2FtbF9hbGxvY19zdGFja19jYWxsKGYsIHgpO1xufVxuZnVuY3Rpb24gY2FtbF9hbGxvY19zdGFja19oZXhuKGUpIHtcbiAgLy8gQ2FsbCBbaHhdIGluIHRoZSBwYXJlbnQgZmliZXJcbiAgdmFyIGYgPSBjYW1sX2N1cnJlbnRfc3RhY2suaFsyXTtcbiAgcmV0dXJuIGNhbWxfYWxsb2Nfc3RhY2tfY2FsbChmLCBlKTtcbn1cbmZ1bmN0aW9uIGNhbWxfYWxsb2Nfc3RhY2soaHYsIGh4LCBoZikge1xuICB2YXIgaGFuZGxlcnMgPSBbMCwgaHYsIGh4LCBoZl07XG4gIHJldHVybiB7XG4gICAgazogY2FtbF9hbGxvY19zdGFja19odmFsLFxuICAgIHg6IHsgaDogY2FtbF9hbGxvY19zdGFja19oZXhuLCB0OiAwIH0sXG4gICAgaDogaGFuZGxlcnMsXG4gICAgZTogMCxcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9JZjogIWVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrKF9odiwgX2h4LCBfaGYpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KSB7XG4gIHZhciBzdGFjayA9IGNvbnRbMV07XG4gIGNvbnRbMV0gPSAwO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGNcbi8vUmVxdWlyZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGMoXG4gIGNvbnQsXG4gIGh2YWwsXG4gIGhleG4sXG4gIGhlZmYsXG4pIHtcbiAgdmFyIHN0YWNrID0gY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjKGNvbnQpO1xuICBpZiAoc3RhY2sgPT09IDApIHJldHVybiBzdGFjaztcbiAgdmFyIGxhc3QgPSBjb250WzJdO1xuICBsYXN0LmhbMV0gPSBodmFsO1xuICBsYXN0LmhbMl0gPSBoZXhuO1xuICBsYXN0LmhbM10gPSBoZWZmO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2tcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrKCkge1xuICByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9uZXdcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9uZXcoX3VuaXQpIHtcbiAgcmV0dXJuIHsgY29uZGl0aW9uOiAxIH07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3dhaXRcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl93YWl0KF90LCBfbXV0ZXh0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3Rcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3QoX3QpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbFxuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbChfdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczoganNvb19lZmZlY3Rfbm90X3N1cHBvcnRlZFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy8hSWY6IGVmZmVjdHNcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBqc29vX2VmZmVjdF9ub3Rfc3VwcG9ydGVkKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiRWZmZWN0IGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3VtZVxuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuX2NwcywgY2FtbF9jdXJyZW50X3N0YWNrLCBjYW1sX3dyYXBfZXhjZXB0aW9uLCBjYW1sX3Jlc3VtZV9zdGFja1xuLy9JZjogZWZmZWN0c1xuLy9JZjogZG91YmxldHJhbnNsYXRlXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9yZXN1bWUoZiwgYXJnLCBzdGFjaywgbGFzdCkge1xuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfY3VycmVudF9zdGFjayA9IGNhbWxfY3VycmVudF9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2N1cnJlbnRfc3RhY2sgPSB7IGs6IDAsIHg6IDAsIGg6IDAsIGU6IDAgfTtcbiAgICB2YXIgayA9IGNhbWxfcmVzdW1lX3N0YWNrKHN0YWNrLCBsYXN0LCBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfSk7XG4gICAgLyogTm90ZTogZiBpcyBub3QgYW4gb3JkaW5hcnkgZnVuY3Rpb24gYnV0IGEgKGRpcmVjdC1zdHlsZSwgQ1BTKSBjbG9zdXJlIHBhaXIgKi9cbiAgICB2YXIgcmVzID0geyBqb29fdHJhbXA6IGYsIGpvb19hcmdzOiBbYXJnLCBrXSwgam9vX2RpcmVjdDogMCB9O1xuICAgIGRvIHtcbiAgICAgIC8qIEF2b2lkcyB0cmFtcG9saW5pbmcgdG9vIG9mdGVuIHdoaWxlIHN0aWxsIGF2b2lkaW5nIHN0YWNrIG92ZXJmbG93LiBTZWVcbiAgICAgICAgIFtjYW1sX2NhbGxiYWNrXS4gKi9cbiAgICAgIGNhbWxfc3RhY2tfZGVwdGggPSA0MDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IHJlcy5qb29fZGlyZWN0XG4gICAgICAgICAgPyByZXMuam9vX3RyYW1wLmFwcGx5KG51bGwsIHJlcy5qb29fYXJncylcbiAgICAgICAgICA6IGNhbWxfY2FsbF9nZW5fY3BzKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfY3VycmVudF9zdGFjay54KSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfY3VycmVudF9zdGFjay54Lmg7XG4gICAgICAgIGNhbWxfY3VycmVudF9zdGFjay54ID0gY2FtbF9jdXJyZW50X3N0YWNrLngudDtcbiAgICAgICAgcmVzID0ge1xuICAgICAgICAgIGpvb190cmFtcDogaGFuZGxlcixcbiAgICAgICAgICBqb29fYXJnczogW2NhbWxfd3JhcF9leGNlcHRpb24oZSldLFxuICAgICAgICAgIGpvb19kaXJlY3Q6IDEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSB3aGlsZSAocmVzPy5qb29fYXJncyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9jdXJyZW50X3N0YWNrID0gc2F2ZWRfY3VycmVudF9zdGFjaztcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Nwc19jbG9zdXJlXG4vL0lmOiBlZmZlY3RzXG4vL0lmOiBkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfY3BzX2Nsb3N1cmUoZGlyZWN0X2YsIGNwc19mKSB7XG4gIGRpcmVjdF9mLmNwcyA9IGNwc19mO1xuICByZXR1cm4gZGlyZWN0X2Y7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXNzdW1lX25vX3BlcmZvcm1cbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbi8vSWY6IGVmZmVjdHNcbi8vSWY6ICFkb3VibGV0cmFuc2xhdGVcbmZ1bmN0aW9uIGNhbWxfYXNzdW1lX25vX3BlcmZvcm0oZikge1xuICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBbMF0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBBcnJheVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X3N1YiBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X3N1YihhLCBpLCBsZW4pIHtcbiAgdmFyIGEyID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICBhMlswXSA9IDA7XG4gIGZvciAodmFyIGkyID0gMSwgaTEgPSBpICsgMTsgaTIgPD0gbGVuOyBpMisrLCBpMSsrKSB7XG4gICAgYTJbaTJdID0gYVtpMV07XG4gIH1cbiAgcmV0dXJuIGEyO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfc3ViIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfc3ViXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X3N1YihhLCBpLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfc3ViKGEsIGksIGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9zdWIgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9zdWJcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfc3ViKGEsIGksIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9zdWIoYSwgaSwgbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9hcHBlbmQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKSB7XG4gIHZhciBsMSA9IGExLmxlbmd0aCxcbiAgICBsMiA9IGEyLmxlbmd0aDtcbiAgdmFyIGwgPSBsMSArIGwyIC0gMTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGFbMF0gPSAwO1xuICB2YXIgaSA9IDEsXG4gICAgaiA9IDE7XG4gIGZvciAoOyBpIDwgbDE7IGkrKykgYVtpXSA9IGExW2ldO1xuICBmb3IgKDsgaSA8IGw7IGkrKywgaisrKSBhW2ldID0gYTJbal07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfYXBwZW5kIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYXBwZW5kXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2FwcGVuZChhMSwgYTIpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfYXBwZW5kKGExLCBhMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9hcHBlbmQgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9hcHBlbmRcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfYXBwZW5kKGExLCBhMikge1xuICByZXR1cm4gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9jb25jYXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9jb25jYXQgbXV0YWJsZVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5pZm9ybV9hcnJheV9jb25jYXQgbXV0YWJsZVxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfdW5pZm9ybV9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgaWYgKGkyIDw9IGkxKSB7XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gbGVuOyBqKyspIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGogPSBsZW47IGogPj0gMTsgai0tKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2JsaXRcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ibGl0XG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF91bmlmb3JtX2FycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICByZXR1cm4gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pO1xufVxuXG4vLy8vLy8vLy8vLy8vIFBlcnZhc2l2ZVxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9BbGlhczogY2FtbF9hcnJheV9zZXRfZmxvYXRcbi8vQWxpYXM6IGNhbWxfZmxvYXRhcnJheV9zZXRcbi8vQWxpYXM6IGNhbWxfYXJyYXlfc2V0X2FkZHJcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfc2V0KGFycmF5LCBpbmRleCwgbmV3dmFsKSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBhcnJheVtpbmRleCArIDFdID0gbmV3dmFsO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9nZXQgbXV0YWJsZSAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL0FsaWFzOiBjYW1sX2FycmF5X2dldF9mbG9hdFxuLy9BbGlhczogY2FtbF9mbG9hdGFycmF5X2dldFxuLy9BbGlhczogY2FtbF9hcnJheV9nZXRfYWRkclxuZnVuY3Rpb24gY2FtbF9hcnJheV9nZXQoYXJyYXksIGluZGV4KSB7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJyYXlbaW5kZXggKyAxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9maWxsXG5mdW5jdGlvbiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnJheVtvZnMgKyBpICsgMV0gPSB2O1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfZmlsbFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2ZpbGxfdW5ib3hlZFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2ZpbGxfdW5ib3hlZChhcnJheSwgb2ZzLCBsZW4sIHYpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfZmlsbChhcnJheSwgb2ZzLCBsZW4sIHYpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfZmlsbFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9maWxsXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF91bmlmb3JtX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jaGVja19ib3VuZCAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL0FsaWFzOiBjYW1sX2NoZWNrX2JvdW5kX2dlblxuLy9BbGlhczogY2FtbF9jaGVja19ib3VuZF9mbG9hdFxuZnVuY3Rpb24gY2FtbF9jaGVja19ib3VuZChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID4+PiAwID49IGFycmF5Lmxlbmd0aCAtIDEpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X21ha2UgY29uc3QgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9hcnJheV9tYWtlKGxlbiwgaW5pdCkge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDQpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gaW5pdDtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFrZV92ZWN0IGNvbnN0IChjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfbWFrZVxuZnVuY3Rpb24gY2FtbF9tYWtlX3ZlY3QobGVuLCBpbml0KSB7XG4gIHJldHVybiBjYW1sX2FycmF5X21ha2UobGVuLCBpbml0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYWtlX2Zsb2F0X3ZlY3QgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9tYWtlX2Zsb2F0X3ZlY3QobGVuKSB7XG4gIGlmIChsZW4gPj4+IDAgPj0gKCgweDdmZmZmZmZmIC8gOCkgfCAwKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gKGxlbiArIDEpIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXSA9IDI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2NyZWF0ZV9mbG9hdCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9hcnJheV9jcmVhdGVfZmxvYXQobGVuKSB7XG4gIGlmIChsZW4gPj4+IDAgPj0gKCgweDdmZmZmZmZmIC8gOCkgfCAwKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gKGxlbiArIDEpIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXSA9IDI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiO1xufVxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2NyZWF0ZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlKGxlbikge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDgpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAyNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSAwO1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X21ha2UgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9tYWtlKGxlbiwgaW5pdCkge1xuICBpZiAobGVuID4+PiAwID49ICgoMHg3ZmZmZmZmZiAvIDgpIHwgMCkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IChsZW4gKyAxKSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF0gPSAyNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSBpbml0O1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X21ha2VfdW5ib3hlZCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2Zsb2F0YXJyYXlfbWFrZVxuLy9WZXJzaW9uOiA+PSA1LjNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9tYWtlX3VuYm94ZWQobGVuLCBpbml0KSB7XG4gIHJldHVybiBjYW1sX2Zsb2F0YXJyYXlfbWFrZShsZW4sIGluaXQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaWZvcm1fYXJyYXlfbWFrZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X21ha2Vcbi8vVmVyc2lvbjogPj0gNS4zXG5mdW5jdGlvbiBjYW1sX3VuaWZvcm1fYXJyYXlfbWFrZShsZW4sIGluaXQpIHtcbiAgcmV0dXJuIGNhbWxfYXJyYXlfbWFrZShsZW4sIGluaXQpO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzXG4vL1ZlcnNpb246ID49IDVcbnZhciBjYW1sX2RvbWFpbl9kbHMgPSBbMF07XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfc2V0KGEpIHtcbiAgY2FtbF9kb21haW5fZGxzID0gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzX2NvbXBhcmVfYW5kX3NldFxuLy9SZXF1aXJlczogY2FtbF9kb21haW5fZGxzXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9kb21haW5fZGxzX2NvbXBhcmVfYW5kX3NldChvbGQsIG4pIHtcbiAgaWYgKGNhbWxfZG9tYWluX2RscyAhPT0gb2xkKSByZXR1cm4gMDtcbiAgY2FtbF9kb21haW5fZGxzID0gbjtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfZ2V0KF91bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9kbHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2xvYWRcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9hdG9taWNfbG9hZChyZWYpIHtcbiAgcmV0dXJuIHJlZlsxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfbG9hZF9maWVsZFxuLy9WZXJzaW9uOiA+PSA1LjRcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2xvYWRfZmllbGQoYiwgaSkge1xuICByZXR1cm4gYltpICsgMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2Nhc1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXMocmVmLCBvLCBuKSB7XG4gIGlmIChyZWZbMV0gPT09IG8pIHtcbiAgICByZWZbMV0gPSBuO1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19jYXNfZmllbGRcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXNfZmllbGQoYiwgaSwgbywgbikge1xuICBpZiAoYltpICsgMV0gPT09IG8pIHtcbiAgICBiW2kgKyAxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2ZldGNoX2FkZFxuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGQocmVmLCBpKSB7XG4gIHZhciBvbGQgPSByZWZbMV07XG4gIHJlZlsxXSArPSBpO1xuICByZXR1cm4gb2xkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19mZXRjaF9hZGRfZmllbGRcbi8vVmVyc2lvbjogPj0gNS40XG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGRfZmllbGQoYiwgaSwgbikge1xuICB2YXIgb2xkID0gYltpICsgMV07XG4gIGJbaSArIDFdICs9IG47XG4gIHJldHVybiBvbGQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2V4Y2hhbmdlKHJlZiwgdikge1xuICB2YXIgciA9IHJlZlsxXTtcbiAgcmVmWzFdID0gdjtcbiAgcmV0dXJuIHI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlX2ZpZWxkXG4vL1ZlcnNpb246ID49IDUuNFxuZnVuY3Rpb24gY2FtbF9hdG9taWNfZXhjaGFuZ2VfZmllbGQoYiwgaSwgdikge1xuICB2YXIgciA9IGJbaSArIDFdO1xuICBiW2kgKyAxXSA9IHY7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19tYWtlX2NvbnRlbmRlZFxuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX21ha2VfY29udGVuZGVkKGEpIHtcbiAgcmV0dXJuIFswLCBhXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXG4vL1ZlcnNpb246ID49IDUuMCwgPCA1LjJcbnZhciBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fID0gWzBdO1xuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuKF91bml0KSB7XG4gIHJldHVybiBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudChfdW5pdCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faW5kZXhcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1ZlcnNpb246ID49IDUuMDNcbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX2luZGV4KF91bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9pZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5faWRcbi8vVmVyc2lvbjogPj0gNVxudmFyIGNhbWxfZG9tYWluX2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjJcbnZhciBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4ID0gMTtcbmZ1bmN0aW9uIGNhbWxfZG9tYWluX3NwYXduKGYsIHRlcm1fc3luYykge1xuICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgWzBdKTtcbiAgY2FtbF9kb21haW5faWQgPSBvbGQ7XG4gIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHRlcm1fc3luY1syXSk7XG4gIC8vVE9ETzogZml4IGV4biBjYXNlXG4gIHRlcm1fc3luY1sxXSA9IFswLCBbMCwgcmVzXV07XG4gIHJldHVybiBpZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuLy9WZXJzaW9uOiA+PSA1LjAsIDwgNS4yXG52YXIgY2FtbF9kb21haW5fbGF0ZXN0X2lkeCA9IDE7XG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9zcGF3bihmLCBtdXRleCkge1xuICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgdmFyIF9yZXMgPSBjYW1sX2NhbGxiYWNrKGYsIFswXSk7XG4gIGNhbWxfZG9tYWluX2lkID0gb2xkO1xuICBjYW1sX21sX211dGV4X3VubG9jayhtdXRleCk7XG4gIHJldHVybiBpZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faWRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5faWQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfZG9tYWluX2lkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4KF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfaW50IGNvbnN0IChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZywgY2FtbF9zdHJfcmVwZWF0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0FsaWFzOiBjYW1sX2ludDMyX2Zvcm1hdFxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfZm9ybWF0XG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9pbnQoZm10LCBpKSB7XG4gIGlmIChjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGZtdCkgPT09IFwiJWRcIilcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiICsgaSk7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgaWYgKGYuc2lnbmVkY29udikge1xuICAgICAgZi5zaWduID0gLTE7XG4gICAgICBpID0gLWk7XG4gICAgfSBlbHNlIGkgPj4+PSAwO1xuICB9XG4gIHZhciBzID0gaS50b1N0cmluZyhmLmJhc2UpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9IFwiIFwiO1xuICAgIHZhciBuID0gZi5wcmVjIC0gcy5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBzID0gY2FtbF9zdHJfcmVwZWF0KG4sIFwiMFwiKSArIHM7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2Uocykge1xuICB2YXIgaSA9IDAsXG4gICAgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpLFxuICAgIGJhc2UgPSAxMCxcbiAgICBzaWduID0gMSxcbiAgICBzaWduZWRuZXNzID0gMTtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBzd2l0Y2ggKGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkpIHtcbiAgICAgIGNhc2UgNDU6XG4gICAgICAgIGkrKztcbiAgICAgICAgc2lnbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDM6XG4gICAgICAgIGkrKztcbiAgICAgICAgc2lnbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoaSArIDEgPCBsZW4gJiYgY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA9PT0gNDgpXG4gICAgc3dpdGNoIChjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKSkge1xuICAgICAgY2FzZSAxMjA6XG4gICAgICBjYXNlIDg4OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgYmFzZSA9IDE2O1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTE6XG4gICAgICBjYXNlIDc5OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgYmFzZSA9IDg7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk4OlxuICAgICAgY2FzZSA2NjpcbiAgICAgICAgc2lnbmVkbmVzcyA9IDA7XG4gICAgICAgIGJhc2UgPSAyO1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMTc6XG4gICAgICBjYXNlIDg1OlxuICAgICAgICBzaWduZWRuZXNzID0gMDtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBbaSwgc2lnbiwgYmFzZSwgc2lnbmVkbmVzc107XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZGlnaXRcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZGlnaXQoYykge1xuICBpZiAoYyA+PSA0OCAmJiBjIDw9IDU3KSByZXR1cm4gYyAtIDQ4O1xuICBpZiAoYyA+PSA2NSAmJiBjIDw9IDkwKSByZXR1cm4gYyAtIDU1O1xuICBpZiAoYyA+PSA5NyAmJiBjIDw9IDEyMikgcmV0dXJuIGMgLSA4NztcbiAgcmV0dXJuIC0xO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludF9vZl9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfcGFyc2VfZGlnaXQsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IGNhbWxfaW50MzJfb2Zfc3RyaW5nXG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaW50X29mX3N0cmluZyhzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlKHMpO1xuICB2YXIgaSA9IHJbMF0sXG4gICAgc2lnbiA9IHJbMV0sXG4gICAgYmFzZSA9IHJbMl0sXG4gICAgc2lnbmVkbmVzcyA9IHJbM107XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIHZhciB0aHJlc2hvbGQgPSAtMSA+Pj4gMDtcbiAgdmFyIGMgPSBpIDwgbGVuID8gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA6IDA7XG4gIHZhciBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBkO1xuICBmb3IgKGkrKzsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gICAgaWYgKGMgPT09IDk1KSBjb250aW51ZTtcbiAgICBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBicmVhaztcbiAgICByZXMgPSBiYXNlICogcmVzICsgZDtcbiAgICBpZiAocmVzID4gdGhyZXNob2xkKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPT0gbGVuKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgLy8gRm9yIGJhc2UgZGlmZmVyZW50IGZyb20gMTAsIHdlIGV4cGVjdCBhbiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbixcbiAgLy8gaGVuY2UgYW55IHZhbHVlIG9mICdyZXMnIChsZXNzIHRoYW4gJ3RocmVzaG9sZCcpIGlzIGFjY2VwdGFibGUuXG4gIC8vIEJ1dCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIHJlc3VsdCBiYWNrIHRvIGEgc2lnbmVkIGludGVnZXIuXG4gIHJlcyA9IHNpZ24gKiByZXM7XG4gIGlmIChzaWduZWRuZXNzICYmIChyZXMgfCAwKSAhPT0gcmVzKVxuICAgIC8qIFNpZ25lZCByZXByZXNlbnRhdGlvbiBleHBlY3RlZCwgYWxsb3cgLTJeKG5iaXRzLTEpIHRvIDJeKG5iaXRzLTEpIC0gMSAqL1xuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICByZXR1cm4gcmVzIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tdWwgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50MzJfbXVsXG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9tdWxcbi8vQWxpYXM6ICVpbnRfbXVsXG5mdW5jdGlvbiBjYW1sX211bChhLCBiKSB7XG4gIHJldHVybiBNYXRoLmltdWwoYSwgYik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGl2XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL0FsaWFzOiBjYW1sX2ludDMyX2RpdlxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfZGl2XG4vL0FsaWFzOiAlaW50X2RpdlxuZnVuY3Rpb24gY2FtbF9kaXYoeCwgeSkge1xuICBpZiAoeSA9PT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSgpO1xuICByZXR1cm4gKHggLyB5KSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbW9kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL0FsaWFzOiBjYW1sX2ludDMyX21vZFxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfbW9kXG4vL0FsaWFzOiAlaW50X21vZFxuZnVuY3Rpb24gY2FtbF9tb2QoeCwgeSkge1xuICBpZiAoeSA9PT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSgpO1xuICByZXR1cm4geCAlIHk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnN3YXAxNiBjb25zdFxuZnVuY3Rpb24gY2FtbF9ic3dhcDE2KHgpIHtcbiAgcmV0dXJuICgoeCAmIDB4MDBmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2Jzd2FwIGNvbnN0XG4vL0FsaWFzOiBjYW1sX25hdGl2ZWludF9ic3dhcFxuZnVuY3Rpb24gY2FtbF9pbnQzMl9ic3dhcCh4KSB7XG4gIHJldHVybiAoXG4gICAgKCh4ICYgMHgwMDAwMDBmZikgPDwgMjQpIHxcbiAgICAoKHggJiAweDAwMDBmZjAwKSA8PCA4KSB8XG4gICAgKCh4ICYgMHgwMGZmMDAwMCkgPj4+IDgpIHxcbiAgICAoKHggJiAweGZmMDAwMDAwKSA+Pj4gMjQpXG4gICk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Jzd2FwIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ludDY0X2Jzd2FwKHgpIHtcbiAgdmFyIHkgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHgpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhbeVs3XSwgeVs2XSwgeVs1XSwgeVs0XSwgeVszXSwgeVsyXSwgeVsxXSwgeVswXV0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBIYXNodGJsXG5cbi8vZnVuY3Rpb24gUk9UTDMyKHgsbikgeyByZXR1cm4gKCh4IDw8IG4pIHwgKHggPj4+ICgzMi1uKSkpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ludFxuLy9SZXF1aXJlczogY2FtbF9tdWxcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfaW50KGgsIGQpIHtcbiAgZCA9IGNhbWxfbXVsKGQsIDB4Y2M5ZTJkNTEgfCAwKTtcbiAgZCA9IChkIDw8IDE1KSB8IChkID4+PiAoMzIgLSAxNSkpOyAvLyBST1RMMzIoZCwgMTUpO1xuICBkID0gY2FtbF9tdWwoZCwgMHgxYjg3MzU5Myk7XG4gIGggXj0gZDtcbiAgaCA9IChoIDw8IDEzKSB8IChoID4+PiAoMzIgLSAxMykpOyAvL1JPVEwzMihoLCAxMyk7XG4gIHJldHVybiAoKChoICsgKGggPDwgMikpIHwgMCkgKyAoMHhlNjU0NmI2NCB8IDApKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfbXVsXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpIHtcbiAgaCBePSBoID4+PiAxNjtcbiAgaCA9IGNhbWxfbXVsKGgsIDB4ODVlYmNhNmIgfCAwKTtcbiAgaCBePSBoID4+PiAxMztcbiAgaCA9IGNhbWxfbXVsKGgsIDB4YzJiMmFlMzUgfCAwKTtcbiAgaCBePSBoID4+PiAxNjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbG8zMiwgY2FtbF9pbnQ2NF9oaTMyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2Zsb2F0KGhhc2gsIHYwKSB7XG4gIHZhciBpNjQgPSBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQodjApO1xuICB2YXIgbCA9IGNhbWxfaW50NjRfbG8zMihpNjQpO1xuICB2YXIgaCA9IGNhbWxfaW50NjRfaGkzMihpNjQpO1xuICAvKiBOb3JtYWxpemUgTmFOcyAqL1xuICBpZiAoKGggJiAweDdmZjAwMDAwKSA9PT0gMHg3ZmYwMDAwMCAmJiAobCB8IChoICYgMHhmZmZmZikpICE9PSAwKSB7XG4gICAgaCA9IDB4N2ZmMDAwMDA7XG4gICAgbCA9IDB4MDAwMDAwMDE7XG4gIH0gZWxzZSBpZiAoaCA9PT0gKDB4ODAwMDAwMDAgfCAwKSAmJiBsID09PSAwKSB7XG4gICAgLyogTm9ybWFsaXplIC0wIGludG8gKzAgKi9cbiAgICAvLyBUaGlzIGNvZGUgcGF0aCBpcyBub3QgdXNlZCBieSBjYW1sX2hhc2ggYmVjYXVzZSAwIGFuZCAtMCBsb29rXG4gICAgLy8gbGlrZSBpbnRlZ2Vyc1xuICAgIGggPSAwO1xuICB9XG4gIGhhc2ggPSBjYW1sX2hhc2hfbWl4X2ludChoYXNoLCBsKTtcbiAgaGFzaCA9IGNhbWxfaGFzaF9taXhfaW50KGhhc2gsIGgpO1xuICByZXR1cm4gaGFzaDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfaW50NjRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2xvMzIsIGNhbWxfaW50NjRfaGkzMlxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9pbnQ2NChoLCB2KSB7XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBjYW1sX2ludDY0X2xvMzIodikpO1xuICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgY2FtbF9pbnQ2NF9oaTMyKHYpKTtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfanNieXRlcyhoLCBzKSB7XG4gIHZhciBsZW4gPSBzLmxlbmd0aCxcbiAgICBpLFxuICAgIHc7XG4gIGZvciAoaSA9IDA7IGkgKyA0IDw9IGxlbjsgaSArPSA0KSB7XG4gICAgdyA9XG4gICAgICBzLmNoYXJDb2RlQXQoaSkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgfFxuICAgICAgKHMuY2hhckNvZGVBdChpICsgMikgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSArIDMpIDw8IDI0KTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgdyA9IDA7XG4gIHN3aXRjaCAobGVuICYgMykge1xuICAgIGNhc2UgMzpcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgIHcgPSBzLmNoYXJDb2RlQXQoaSArIDIpIDw8IDE2O1xuICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgY2FzZSAyOlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgdyB8PSBzLmNoYXJDb2RlQXQoaSArIDEpIDw8IDg7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDE6XG4gICAgICB3IHw9IHMuY2hhckNvZGVBdChpKTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgfVxuICBoIF49IGxlbjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9ieXRlc19hcnIoaCwgcykge1xuICB2YXIgbGVuID0gcy5sZW5ndGgsXG4gICAgaSxcbiAgICB3O1xuICBmb3IgKGkgPSAwOyBpICsgNCA8PSBsZW47IGkgKz0gNCkge1xuICAgIHcgPSBzW2ldIHwgKHNbaSArIDFdIDw8IDgpIHwgKHNbaSArIDJdIDw8IDE2KSB8IChzW2kgKyAzXSA8PCAyNCk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICB9XG4gIHcgPSAwO1xuICBzd2l0Y2ggKGxlbiAmIDMpIHtcbiAgICBjYXNlIDM6XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICB3ID0gc1tpICsgMl0gPDwgMTY7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDI6XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICB3IHw9IHNbaSArIDFdIDw8IDg7XG4gICAgLy8gZmFsbHRocm91Z2hcbiAgICBjYXNlIDE6XG4gICAgICB3IHw9IHNbaV07XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgaCBePSBsZW47XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdikge1xuICB2YXIgY29udGVudCA9IGNhbWxfbWxfYnl0ZXNfY29udGVudCh2KTtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNvbnRlbnQpO1xuICAvKiBBUlJBWSAqLyBlbHNlIHJldHVybiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdikge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmcodikpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2ggbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBjYW1sX2hhc2hfbWl4X2ZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0LCBjYW1sX2hhc2hfbWl4X3N0cmluZywgY2FtbF9oYXNoX21peF9ieXRlcywgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuZnVuY3Rpb24gY2FtbF9oYXNoKGNvdW50LCBsaW1pdCwgc2VlZCwgb2JqKSB7XG4gIHZhciBxdWV1ZSwgcmQsIHdyLCBzeiwgbnVtLCBoLCB2LCBpLCBsZW47XG4gIHN6ID0gbGltaXQ7XG4gIGlmIChzeiA8IDAgfHwgc3ogPiAyNTYpIHN6ID0gMjU2O1xuICBudW0gPSBjb3VudDtcbiAgaCA9IHNlZWQ7XG4gIHF1ZXVlID0gW29ial07XG4gIHJkID0gMDtcbiAgd3IgPSAxO1xuICB3aGlsZSAocmQgPCB3ciAmJiBudW0gPiAwKSB7XG4gICAgdiA9IHF1ZXVlW3JkKytdO1xuICAgIGlmICh2Py5jYW1sX2N1c3RvbSkge1xuICAgICAgaWYgKFxuICAgICAgICBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0gJiZcbiAgICAgICAgY2FtbF9jdXN0b21fb3BzW3YuY2FtbF9jdXN0b21dLmhhc2hcbiAgICAgICkge1xuICAgICAgICB2YXIgaGggPSBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCh2KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGhoKTtcbiAgICAgICAgbnVtLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHYpICYmIHZbMF0gPT09ICh2WzBdIHwgMCkpIHtcbiAgICAgIHN3aXRjaCAodlswXSkge1xuICAgICAgICBjYXNlIDI0ODpcbiAgICAgICAgICAvLyBPYmplY3RcbiAgICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdlsyXSk7XG4gICAgICAgICAgbnVtLS07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUwOlxuICAgICAgICAgIC8vIEZvcndhcmRcbiAgICAgICAgICBxdWV1ZVstLXJkXSA9IHZbMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh2WzBdKSkge1xuICAgICAgICAgICAgLyogQWxsIGNvbnRpbnVhdGlvbnMgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZSxcbiAgICAgICAgICAgICBzaW5jZSB3ZSBoYXZlIG5vIGlkZWEgaG93IHRvIGRpc3Rpbmd1aXNoIHRoZW0uICovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRhZyA9ICgodi5sZW5ndGggLSAxKSA8PCAxMCkgfCB2WzBdO1xuICAgICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB0YWcpO1xuICAgICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IHYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh3ciA+PSBzeikgYnJlYWs7XG4gICAgICAgICAgICBxdWV1ZVt3cisrXSA9IHZbaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdik7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHYpKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdik7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIHYpO1xuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh2ID09PSAodiB8IDApKSB7XG4gICAgICAvLyBJbnRlZ2VyXG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdiArIHYgKyAxKTtcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLCB2KTtcbiAgICAgIG51bS0tO1xuICAgIH1cbiAgfVxuICBoID0gY2FtbF9oYXNoX21peF9maW5hbChoKTtcbiAgcmV0dXJuIGggJiAweDNmZmZmZmZmO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsLCBjYW1sX2hhc2hfbWl4X3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1LjBcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2hhc2goaCwgdikge1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsIHYpO1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfZmluYWwoaCk7XG4gIHJldHVybiBoICYgMHgzZmZmZmZmZjtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWxfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSkge1xuICBpZiAodHlwZW9mIGEgPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIDEwMDA7IC8vIGludF90YWcgKHdlIHVzZSBpdCBmb3IgYWxsIG51bWJlcnMpXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMoYSkpXG4gICAgcmV0dXJuIDI1MjsgLy8gc3RyaW5nX3RhZ1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyhhKSlcbiAgICByZXR1cm4gMTI1MjsgLy8gb2NhbWwgc3RyaW5nIChpZiBkaWZmZXJlbnQgZnJvbSBieXRlcylcbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBhWzBdID09PSBhWzBdID4+PiAwICYmIGFbMF0gPD0gMjU1KSB7XG4gICAgLy8gTG9vayBsaWtlIGFuIG9jYW1sIGJsb2NrXG4gICAgdmFyIHRhZyA9IGFbMF0gfCAwO1xuICAgIC8vIGlnbm9yZSBkb3VibGVfYXJyYXlfdGFnIGJlY2F1c2Ugd2UgY2Fubm90IGFjY3VyYXRlbHkgc2V0XG4gICAgLy8gdGhpcyB0YWcgd2hlbiB3ZSBjcmVhdGUgYW4gYXJyYXkgb2YgZmxvYXQuXG4gICAgcmV0dXJuIHRhZyA9PT0gMjU0ID8gMCA6IHRhZztcbiAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgU3RyaW5nKVxuICAgIHJldHVybiAxMjUyMDsgLy8gamF2YXNjcmlwdCBzdHJpbmcsIGxpa2Ugc3RyaW5nX3RhZyAoMjUyKVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gMTI1MjA7IC8vIGphdmFzY3JpcHQgc3RyaW5nLCBsaWtlIHN0cmluZ190YWcgKDI1MilcbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE51bWJlcilcbiAgICByZXR1cm4gMTAwMDsgLy8gaW50X3RhZyAod2UgdXNlIGl0IGZvciBhbGwgbnVtYmVycylcbiAgZWxzZSBpZiAoYT8uY2FtbF9jdXN0b20pXG4gICAgcmV0dXJuIDEyNTU7IC8vIGxpa2UgY3VzdG9tX3RhZyAoMjU1KVxuICBlbHNlIGlmIChhPy5jb21wYXJlKVxuICAgIHJldHVybiAxMjU2OyAvLyBsaWtlIGN1c3RvbV90YWcgKDI1NSlcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gMTI0NzsgLy8gbGlrZSBjbG9zdXJlX3RhZyAoMjQ3KVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIDEyNTE7XG4gIHJldHVybiAxMDAxOyAvL291dF9vZl9oZWFwX3RhZ1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX29wc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGEpIHtcbiAgcmV0dXJuIChcbiAgICBjYW1sX2N1c3RvbV9vcHNbYS5jYW1sX2N1c3RvbV0gJiYgY2FtbF9jdXN0b21fb3BzW2EuY2FtbF9jdXN0b21dLmNvbXBhcmVcbiAgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShudW0sIGN1c3RvbSwgc3dhcCwgdG90YWwpIHtcbiAgdmFyIGNvbXAgPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oY3VzdG9tKTtcbiAgaWYgKGNvbXApIHtcbiAgICB2YXIgeCA9IHN3YXAgPiAwID8gY29tcChjdXN0b20sIG51bSwgdG90YWwpIDogY29tcChudW0sIGN1c3RvbSwgdG90YWwpO1xuICAgIGlmICh0b3RhbCAmJiBOdW1iZXIuaXNOYU4oeCkpIHJldHVybiBzd2FwOyAvLyB0b3RhbCAmJiBuYW5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKCt4KSkgcmV0dXJuICt4OyAvLyBuYW5cbiAgICBpZiAoKHggfCAwKSAhPT0gMCkgcmV0dXJuIHggfCAwOyAvLyAhbmFuXG4gIH1cbiAgcmV0dXJuIHN3YXA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWwgKGNvbnN0LCBjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ludF9jb21wYXJlLCBjYW1sX3N0cmluZ19jb21wYXJlLCBjYW1sX2J5dGVzX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tLCBjYW1sX2NvbXBhcmVfdmFsX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWwoYSwgYiwgdG90YWwpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIGZvciAoOzspIHtcbiAgICBpZiAoISh0b3RhbCAmJiBhID09PSBiKSkge1xuICAgICAgdmFyIHRhZ19hID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSk7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZiAodGFnX2EgPT09IDI1MCkge1xuICAgICAgICBhID0gYVsxXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdfYiA9IGNhbWxfY29tcGFyZV92YWxfdGFnKGIpO1xuICAgICAgLy8gZm9yd2FyZF90YWcgP1xuICAgICAgaWYgKHRhZ19iID09PSAyNTApIHtcbiAgICAgICAgYiA9IGJbMV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0YWdzIGFyZSBkaWZmZXJlbnRcbiAgICAgIGlmICh0YWdfYSAhPT0gdGFnX2IpIHtcbiAgICAgICAgaWYgKHRhZ19hID09PSAxMDAwKSB7XG4gICAgICAgICAgaWYgKHRhZ19iID09PSAxMjU1KSB7XG4gICAgICAgICAgICAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShhLCBiLCAtMSwgdG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ19iID09PSAxMDAwKSB7XG4gICAgICAgICAgaWYgKHRhZ19hID09PSAxMjU1KSB7XG4gICAgICAgICAgICAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShiLCBhLCAxLCB0b3RhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWdfYSA8IHRhZ19iID8gLTEgOiAxO1xuICAgICAgfVxuICAgICAgLy8gdGFnX2EgPSB0YWdfYlxuICAgICAgc3dpdGNoICh0YWdfYSkge1xuICAgICAgICAvLyAyNDY6IExhenlfdGFnIGhhbmRsZWQgYmVsbG93XG4gICAgICAgIGNhc2UgMjQ3OiAvLyBDbG9zdXJlX3RhZ1xuICAgICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI0ODogLy8gT2JqZWN0XG4gICAgICAgICAgdmFyIHggPSBjYW1sX2ludF9jb21wYXJlKGFbMl0sIGJbMl0pIHwgMDtcbiAgICAgICAgICBpZiAoeCAhPT0gMCkgcmV0dXJuIHg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ5OiAvLyBJbmZpeFxuICAgICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1MDogLy8gRm9yd2FyZCB0YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGFib3ZlXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBGb3J3YXJkX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjUxOiAvL0Fic3RyYWN0XG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGFic3RyYWN0IHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI1MjogLy8gT0NhbWwgYnl0ZXNcbiAgICAgICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICAgICAgdmFyIHggPSBjYW1sX2J5dGVzX2NvbXBhcmUoYSwgYikgfCAwO1xuICAgICAgICAgICAgaWYgKHggIT09IDApIHJldHVybiB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTM6IC8vIERvdWJsZV90YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBEb3VibGVfdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheV90YWdcbiAgICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGluIGNhbWxfY29tcGFyZV92YWxfdGFnXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFxuICAgICAgICAgICAgXCJlcXVhbDogZ290IERvdWJsZV9hcnJheV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTU6IC8vIEN1c3RvbV90YWdcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IEN1c3RvbV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyNDc6IC8vIEZ1bmN0aW9uXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjU1OiAvLyBDdXN0b21cbiAgICAgICAgICB2YXIgY29tcCA9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShhKTtcbiAgICAgICAgICBpZiAoY29tcCAhPT0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jYW1sX2N1c3RvbSA8IGIuY2FtbF9jdXN0b20gPyAtMSA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY29tcCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogYWJzdHJhY3QgdmFsdWVcIik7XG4gICAgICAgICAgdmFyIHggPSBjb21wKGEsIGIsIHRvdGFsKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHgpKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBVTk9SREVSRURcbiAgICAgICAgICAgIHJldHVybiB0b3RhbCA/IC0xIDogeDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggIT09ICh4IHwgMCkpIHtcbiAgICAgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoeCAhPT0gMCkgcmV0dXJuIHggfCAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyNTY6IC8vIGNvbXBhcmUgZnVuY3Rpb25cbiAgICAgICAgICB2YXIgeCA9IGEuY29tcGFyZShiLCB0b3RhbCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTih4KSkge1xuICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgVU5PUkRFUkVEXG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAtMSA6IHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh4ICE9PSAoeCB8IDApKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggIT09IDApIHJldHVybiB4IHwgMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDAwOiAvLyBOdW1iZXJcbiAgICAgICAgICBhID0gK2E7XG4gICAgICAgICAgYiA9ICtiO1xuICAgICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOdW1iZXIuTmFOO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYSkpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oYikpIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwMTogLy8gVGhlIHJlc3RcbiAgICAgICAgICAvLyBIZXJlIHdlIGNhbiBiZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAgICAgICAgIC8vIDEuIEphdmFTY3JpcHQgcHJpbWl0aXZlIHR5cGVzXG4gICAgICAgICAgLy8gMi4gSmF2YVNjcmlwdCBvYmplY3QgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgICAvLyAzLiBKYXZhU2NyaXB0IG9iamVjdCB0aGFuIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHByaW1pdGl2ZSB0eXBlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gKDMpIHdpbGwgcmFpc2UgYSBbVHlwZUVycm9yXVxuICAgICAgICAgIC8vICgyKSB3aWxsIGNvZXJjZSB0byBwcmltaXRpdmUgdHlwZXMgdXNpbmcgW3ZhbHVlT2ZdIG9yIFt0b1N0cmluZ11cbiAgICAgICAgICAvLyAoMikgYW5kICgzKSwgYWZ0ZXIgZXZlbnR1YWwgY29lcmNpb25cbiAgICAgICAgICAvLyAtIGlmIGEgYW5kIGIgYXJlIHN0cmluZ3MsIGFwcGx5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvblxuICAgICAgICAgIC8vIC0gaWYgYSBvciBiIGFyZSBub3Qgc3RyaW5ncywgY29udmVydCBhIGFuZCBiIHRvIG51bWJlclxuICAgICAgICAgIC8vICAgYW5kIGFwcGx5IHN0YW5kYXJkIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAxIDogTnVtYmVyLk5hTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MTogLy8gSmF2YVNjcmlwdCBTeW1ib2wsIG5vIG9yZGVyaW5nLlxuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgPyAxIDogTnVtYmVyLk5hTjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MjogLy8gb2NhbWwgc3RyaW5nc1xuICAgICAgICAgIHZhciBhID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhhKTtcbiAgICAgICAgICB2YXIgYiA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoYik7XG4gICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI1MjA6IC8vIGphdmFzY3JpcHQgc3RyaW5nc1xuICAgICAgICAgIHZhciBhID0gYS50b1N0cmluZygpO1xuICAgICAgICAgIHZhciBiID0gYi50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBMYXp5X3RhZyBvciBCbG9jayB3aXRoIG90aGVyIHRhZ1xuICAgICAgICAgIGlmIChjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodGFnX2EpKSB7XG4gICAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBjb250aW51YXRpb24gdmFsdWVcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGEubGVuZ3RoIDwgYi5sZW5ndGggPyAtMSA6IDE7XG4gICAgICAgICAgaWYgKGEubGVuZ3RoID4gMSkgc3RhY2sucHVzaChhLCBiLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgdmFyIGkgPSBzdGFjay5wb3AoKTtcbiAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmIChpICsgMSA8IGEubGVuZ3RoKSBzdGFjay5wdXNoKGEsIGIsIGkgKyAxKTtcbiAgICBhID0gYVtpXTtcbiAgICBiID0gYltpXTtcbiAgfVxufVxuXG4vLyBNYXkgcmFpc2Vcbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9jb21wYXJlKGEsIGIpIHtcbiAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWwoYSwgYiwgdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50X2NvbXBhcmUgY29uc3Rcbi8vQWxpYXM6IGNhbWxfaW50MzJfY29tcGFyZVxuLy9BbGlhczogY2FtbF9uYXRpdmVpbnRfY29tcGFyZVxuZnVuY3Rpb24gY2FtbF9pbnRfY29tcGFyZShhLCBiKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIHJldHVybiAxO1xufVxuXG4vLyBNYXkgcmFpc2Vcbi8vUHJvdmlkZXM6IGNhbWxfZXF1YWwgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA9PT0gMCk7XG59XG5cbi8vIE1heSByYWlzZVxuLy9Qcm92aWRlczogY2FtbF9ub3RlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ub3RlcXVhbCh4LCB5KSB7XG4gIHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCwgeSwgZmFsc2UpICE9PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ncmVhdGVyZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA+PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJ0aGFuIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2dyZWF0ZXJ0aGFuKHgsIHkpIHtcbiAgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LCB5LCBmYWxzZSkgPiAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3NlcXVhbCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9sZXNzZXF1YWwoeCwgeSkge1xuICByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgsIHksIGZhbHNlKSA8PSAwKTtcbn1cblxuLy8gTWF5IHJhaXNlXG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3N0aGFuIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2xlc3N0aGFuKHgsIHkpIHtcbiAgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LCB5LCBmYWxzZSkgPCAwKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4XG4vL1ZlcnNpb246ID49IDUuMVxudmFyIGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4ID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3JlZ2lzdGVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9ldmVudF9pbmRleFxuLy9WZXJzaW9uOiA+PSA1LjFcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZWdpc3RlcihldmVudF9uYW1lLCBldmVudF90YWcsIGV2ZW50X3R5cGUpIHtcbiAgY2FtbF9jdXN0b21fZXZlbnRfaW5kZXggKz0gMTtcbiAgcmV0dXJuIFswLCBjYW1sX2N1c3RvbV9ldmVudF9pbmRleCwgZXZlbnRfbmFtZSwgZXZlbnRfdHlwZSwgZXZlbnRfdGFnXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlXG4vL1ZlcnNpb246ID49IDUuMVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlKF9ldmVudCwgX2V2ZW50X2NvbnRlbnQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZXNvbHZlXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3Jlc29sdmUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3J1bnRpbWVfZXZlbnRzX3N0YXJ0XG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfc3RhcnRcbi8vVmVyc2lvbjogPj0gNS4wLCA8IDUuMlxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV9ldmVudHNfcGF1c2Vcbi8vVmVyc2lvbjogPj0gNS4yXG5mdW5jdGlvbiBjYW1sX21sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19wYXVzZVxuLy9WZXJzaW9uOiA+PSA1LjAsIDwgNS4yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX2V2ZW50c19hcmVfYWN0aXZlXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19hcmVfYWN0aXZlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19yZXN1bWVcbi8vVmVyc2lvbjogPj01LjAsIDwgNS4yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3Jlc3VtZSgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV9ldmVudHNfcmVzdW1lXG4vL1ZlcnNpb246ID49IDUuMlxuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19yZXN1bWUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3Jcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3IoX3RhcmdldCkge1xuICByZXR1cm4ge307XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfZnJlZV9jdXJzb3Jcbi8vVmVyc2lvbjogPj0gNS4wXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2ZyZWVfY3Vyc29yKF9jdXJzb3IpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfcmVhZF9wb2xsXG4vL1ZlcnNpb246ID49IDUuMFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19yZWFkX3BvbGwoX2N1cnNvciwgX2NhbGxiYWNrcywgX251bSkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX2V2ZW50c19wYXRoIGNvbnN0XG4vL1ZlcnNpb246ID49IDUuM1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX2V2ZW50c19wYXRoKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy9Qcm92aWRlczogenN0ZF9kZWNvbXByZXNzXG4vL1ZlcnNpb246ID49IDUuMVxudmFyIHpzdGRfZGVjb21wcmVzcyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIGFsaWFzZXMgZm9yIHNob3J0ZXIgY29tcHJlc3NlZCBjb2RlIChtb3N0IG1pbmlmZXJzIGRvbid0IGRvIHRoaXMpXG4gIHZhciBhYiA9IEFycmF5QnVmZmVyLFxuICAgIHU4ID0gVWludDhBcnJheSxcbiAgICB1MTYgPSBVaW50MTZBcnJheSxcbiAgICBpMTYgPSBJbnQxNkFycmF5LFxuICAgIGkzMiA9IEludDMyQXJyYXk7XG4gIHZhciBzbGMgPSBmdW5jdGlvbiAodiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuc2xpY2UpIHJldHVybiB1OC5wcm90b3R5cGUuc2xpY2UuY2FsbCh2LCBzLCBlKTtcbiAgICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKSBzID0gMDtcbiAgICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aCkgZSA9IHYubGVuZ3RoO1xuICAgIHZhciBuID0gbmV3IHU4KGUgLSBzKTtcbiAgICBuLnNldCh2LnN1YmFycmF5KHMsIGUpKTtcbiAgICByZXR1cm4gbjtcbiAgfTtcbiAgdmFyIGZpbGwgPSBmdW5jdGlvbiAodiwgbiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuZmlsbCkgcmV0dXJuIHU4LnByb3RvdHlwZS5maWxsLmNhbGwodiwgbiwgcywgZSk7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMCkgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpIGUgPSB2Lmxlbmd0aDtcbiAgICBmb3IgKDsgcyA8IGU7ICsrcykgdltzXSA9IG47XG4gICAgcmV0dXJuIHY7XG4gIH07XG4gIHZhciBjcHcgPSBmdW5jdGlvbiAodiwgdCwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuY29weVdpdGhpbilcbiAgICAgIHJldHVybiB1OC5wcm90b3R5cGUuY29weVdpdGhpbi5jYWxsKHYsIHQsIHMsIGUpO1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKSBlID0gdi5sZW5ndGg7XG4gICAgd2hpbGUgKHMgPCBlKSB7XG4gICAgICB2W3QrK10gPSB2W3MrK107XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ29kZXMgZm9yIGVycm9ycyBnZW5lcmF0ZWQgd2l0aGluIHRoaXMgbGlicmFyeVxuICAgKi9cbiAgLy8gZXJyb3IgY29kZXNcbiAgdmFyIGVjID0gW1xuICAgIFwiaW52YWxpZCB6c3RkIGRhdGFcIixcbiAgICBcIndpbmRvdyBzaXplIHRvbyBsYXJnZSAoPjIwNDZNQilcIixcbiAgICBcImludmFsaWQgYmxvY2sgdHlwZVwiLFxuICAgIFwiRlNFIGFjY3VyYWN5IHRvbyBoaWdoXCIsXG4gICAgXCJtYXRjaCBkaXN0YW5jZSB0b28gZmFyIGJhY2tcIixcbiAgICBcInVuZXhwZWN0ZWQgRU9GXCIsXG4gIF07XG4gIHZhciBlcnIgPSBmdW5jdGlvbiAoaW5kLCBtc2csIG50KSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobXNnIHx8IGVjW2luZF0pO1xuICAgIGUuY29kZSA9IGluZDtcbiAgICBpZiAoIW50KSB0aHJvdyBlO1xuICAgIHJldHVybiBlO1xuICB9O1xuICB2YXIgcmIgPSBmdW5jdGlvbiAoZCwgYiwgbikge1xuICAgIHZhciBpID0gMCxcbiAgICAgIG8gPSAwO1xuICAgIGZvciAoOyBpIDwgbjsgKytpKSBvIHw9IGRbYisrXSA8PCAoaSA8PCAzKTtcbiAgICByZXR1cm4gbztcbiAgfTtcbiAgdmFyIGI0ID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICByZXR1cm4gKGRbYl0gfCAoZFtiICsgMV0gPDwgOCkgfCAoZFtiICsgMl0gPDwgMTYpIHwgKGRbYiArIDNdIDw8IDI0KSkgPj4+IDA7XG4gIH07XG4gIC8vIHJlYWQgWnN0YW5kYXJkIGZyYW1lIGhlYWRlclxuICB2YXIgcnpmaCA9IGZ1bmN0aW9uIChkYXQsIHcpIHtcbiAgICB2YXIgbjMgPSBkYXRbMF0gfCAoZGF0WzFdIDw8IDgpIHwgKGRhdFsyXSA8PCAxNik7XG4gICAgaWYgKG4zID09PSAweDJmYjUyOCAmJiBkYXRbM10gPT09IDI1Mykge1xuICAgICAgLy8gWnN0YW5kYXJkXG4gICAgICB2YXIgZmxnID0gZGF0WzRdO1xuICAgICAgLy8gICAgc2luZ2xlIHNlZ21lbnQgICAgICAgY2hlY2tzdW0gICAgICAgICAgICAgZGljdCBmbGFnICAgICBmcmFtZSBjb250ZW50IGZsYWdcbiAgICAgIHZhciBzcyA9IChmbGcgPj4gNSkgJiAxLFxuICAgICAgICBjYyA9IChmbGcgPj4gMikgJiAxLFxuICAgICAgICBkZiA9IGZsZyAmIDMsXG4gICAgICAgIGZjZiA9IGZsZyA+PiA2O1xuICAgICAgaWYgKGZsZyAmIDgpIGVycigwKTtcbiAgICAgIC8vIGJ5dGVcbiAgICAgIHZhciBidCA9IDYgLSBzcztcbiAgICAgIC8vIGRpY3QgYnl0ZXNcbiAgICAgIHZhciBkYiA9IGRmID09PSAzID8gNCA6IGRmO1xuICAgICAgLy8gZGljdGlvbmFyeSBpZFxuICAgICAgdmFyIGRpID0gcmIoZGF0LCBidCwgZGIpO1xuICAgICAgYnQgKz0gZGI7XG4gICAgICAvLyBmcmFtZSBzaXplIGJ5dGVzXG4gICAgICB2YXIgZnNiID0gZmNmID8gMSA8PCBmY2YgOiBzcztcbiAgICAgIC8vIGZyYW1lIHNvdXJjZSBzaXplXG4gICAgICB2YXIgZnNzID0gcmIoZGF0LCBidCwgZnNiKSArIChmY2YgPT09IDEgJiYgMjU2KTtcbiAgICAgIC8vIHdpbmRvdyBzaXplXG4gICAgICB2YXIgd3MgPSBmc3M7XG4gICAgICBpZiAoIXNzKSB7XG4gICAgICAgIC8vIHdpbmRvdyBkZXNjcmlwdG9yXG4gICAgICAgIHZhciB3YiA9IDEgPDwgKDEwICsgKGRhdFs1XSA+PiAzKSk7XG4gICAgICAgIHdzID0gd2IgKyAod2IgPj4gMykgKiAoZGF0WzVdICYgNyk7XG4gICAgICB9XG4gICAgICBpZiAod3MgPiAyMTQ1Mzg2NDk2KSBlcnIoMSk7XG4gICAgICB2YXIgYnVmID0gbmV3IHU4KCh3ID09PSAxID8gZnNzIHx8IHdzIDogdyA/IDAgOiB3cykgKyAxMik7XG4gICAgICAoYnVmWzBdID0gMSksIChidWZbNF0gPSA0KSwgKGJ1Zls4XSA9IDgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYjogYnQgKyBmc2IsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGw6IDAsXG4gICAgICAgIGQ6IGRpLFxuICAgICAgICB3OiB3ICYmIHcgIT09IDEgPyB3IDogYnVmLnN1YmFycmF5KDEyKSxcbiAgICAgICAgZTogd3MsXG4gICAgICAgIG86IG5ldyBpMzIoYnVmLmJ1ZmZlciwgMCwgMyksXG4gICAgICAgIHU6IGZzcyxcbiAgICAgICAgYzogY2MsXG4gICAgICAgIG06IE1hdGgubWluKDEzMTA3Miwgd3MpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCgobjMgPj4gNCkgfCAoZGF0WzNdIDw8IDIwKSkgPT09IDB4MTg0ZDJhNSkge1xuICAgICAgLy8gc2tpcHBhYmxlXG4gICAgICByZXR1cm4gYjQoZGF0LCA0KSArIDg7XG4gICAgfVxuICAgIGVycigwKTtcbiAgfTtcbiAgLy8gbW9zdCBzaWduaWZpY2FudCBiaXQgZm9yIG5vbnplcm9cbiAgdmFyIG1zYiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgYml0cyA9IDA7XG4gICAgZm9yICg7IDEgPDwgYml0cyA8PSB2YWw7ICsrYml0cyk7XG4gICAgcmV0dXJuIGJpdHMgLSAxO1xuICB9O1xuICAvLyByZWFkIGZpbml0ZSBzdGF0ZSBlbnRyb3B5XG4gIHZhciByZnNlID0gZnVuY3Rpb24gKGRhdCwgYnQsIG1hbCkge1xuICAgIC8vIHRhYmxlIHBvc1xuICAgIHZhciB0cG9zID0gKGJ0IDw8IDMpICsgNDtcbiAgICAvLyBhY2N1cmFjeSBsb2dcbiAgICB2YXIgYWwgPSAoZGF0W2J0XSAmIDE1KSArIDU7XG4gICAgaWYgKGFsID4gbWFsKSBlcnIoMyk7XG4gICAgLy8gc2l6ZVxuICAgIHZhciBzeiA9IDEgPDwgYWw7XG4gICAgLy8gcHJvYmFiaWxpdGllcyBzeW1ib2xzICByZXBlYXQgICBpbmRleCAgIGhpZ2ggdGhyZXNob2xkXG4gICAgdmFyIHByb2JzID0gc3osXG4gICAgICBzeW0gPSAtMSxcbiAgICAgIHJlID0gLTEsXG4gICAgICBpID0gLTEsXG4gICAgICBodCA9IHN6O1xuICAgIC8vIG9wdGltaXphdGlvbjogc2luZ2xlIGFsbG9jYXRpb24gaXMgbXVjaCBmYXN0ZXJcbiAgICB2YXIgYnVmID0gbmV3IGFiKDUxMiArIChzeiA8PCAyKSk7XG4gICAgdmFyIGZyZXEgPSBuZXcgaTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICAvLyBzYW1lIHZpZXcgYXMgZnJlcVxuICAgIHZhciBkc3RhdGUgPSBuZXcgdTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICB2YXIgbnN0YXRlID0gbmV3IHUxNihidWYsIDUxMiwgc3opO1xuICAgIHZhciBiYjEgPSA1MTIgKyAoc3ogPDwgMSk7XG4gICAgdmFyIHN5bXMgPSBuZXcgdTgoYnVmLCBiYjEsIHN6KTtcbiAgICB2YXIgbmJpdHMgPSBuZXcgdTgoYnVmLCBiYjEgKyBzeik7XG4gICAgd2hpbGUgKHN5bSA8IDI1NSAmJiBwcm9icyA+IDApIHtcbiAgICAgIHZhciBiaXRzID0gbXNiKHByb2JzICsgMSk7XG4gICAgICB2YXIgY2J0ID0gdHBvcyA+PiAzO1xuICAgICAgLy8gbWFza1xuICAgICAgdmFyIG1zayA9ICgxIDw8IChiaXRzICsgMSkpIC0gMTtcbiAgICAgIHZhciB2YWwgPVxuICAgICAgICAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PlxuICAgICAgICAgICh0cG9zICYgNykpICZcbiAgICAgICAgbXNrO1xuICAgICAgLy8gbWFzayAoMSBmZXdlciBiaXQpXG4gICAgICB2YXIgbXNrMWZiID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgLy8gbWF4IHNtYWxsIHZhbHVlXG4gICAgICB2YXIgbXN2ID0gbXNrIC0gcHJvYnMgLSAxO1xuICAgICAgLy8gc21hbGwgdmFsdWVcbiAgICAgIHZhciBzdmFsID0gdmFsICYgbXNrMWZiO1xuICAgICAgaWYgKHN2YWwgPCBtc3YpICh0cG9zICs9IGJpdHMpLCAodmFsID0gc3ZhbCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdHBvcyArPSBiaXRzICsgMTtcbiAgICAgICAgaWYgKHZhbCA+IG1zazFmYikgdmFsIC09IG1zdjtcbiAgICAgIH1cbiAgICAgIGZyZXFbKytzeW1dID0gLS12YWw7XG4gICAgICBpZiAodmFsID09PSAtMSkge1xuICAgICAgICBwcm9icyArPSB2YWw7XG4gICAgICAgIHN5bXNbLS1odF0gPSBzeW07XG4gICAgICB9IGVsc2UgcHJvYnMgLT0gdmFsO1xuICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8vIHJlcGVhdCBieXRlXG4gICAgICAgICAgdmFyIHJidCA9IHRwb3MgPj4gMztcbiAgICAgICAgICByZSA9ICgoZGF0W3JidF0gfCAoZGF0W3JidCArIDFdIDw8IDgpKSA+PiAodHBvcyAmIDcpKSAmIDM7XG4gICAgICAgICAgdHBvcyArPSAyO1xuICAgICAgICAgIHN5bSArPSByZTtcbiAgICAgICAgfSB3aGlsZSAocmUgPT09IDMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3ltID4gMjU1IHx8IHByb2JzKSBlcnIoMCk7XG4gICAgdmFyIHN5bXBvcyA9IDA7XG4gICAgLy8gc3ltIHN0ZXAgKGNvcHJpbWUgd2l0aCBzeiAtIGZvcm11bGEgZnJvbSB6c3RkIHNvdXJjZSlcbiAgICB2YXIgc3N0ZXAgPSAoc3ogPj4gMSkgKyAoc3ogPj4gMykgKyAzO1xuICAgIC8vIHN5bSBtYXNrXG4gICAgdmFyIHNtYXNrID0gc3ogLSAxO1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDw9IHN5bTsgKytzKSB7XG4gICAgICB2YXIgc2YgPSBmcmVxW3NdO1xuICAgICAgaWYgKHNmIDwgMSkge1xuICAgICAgICBkc3RhdGVbc10gPSAtc2Y7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBpcyBzcGxpdCBpbnRvIHR3byBsb29wcyBpbiB6c3RkIHRvIGF2b2lkIGJyYW5jaGluZywgYnV0IGFzIEpTIGlzIGhpZ2hlci1sZXZlbCB0aGF0IGlzIHVubmVjZXNzYXJ5XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgc2Y7ICsraSkge1xuICAgICAgICBzeW1zW3N5bXBvc10gPSBzO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgc3ltcG9zID0gKHN5bXBvcyArIHNzdGVwKSAmIHNtYXNrO1xuICAgICAgICB9IHdoaWxlIChzeW1wb3MgPj0gaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZnRlciBzcHJlYWRpbmcgc3ltYm9scywgc2hvdWxkIGJlIHplcm8gYWdhaW5cbiAgICBpZiAoc3ltcG9zKSBlcnIoMCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHN6OyArK2kpIHtcbiAgICAgIC8vIG5leHQgc3RhdGVcbiAgICAgIHZhciBucyA9IGRzdGF0ZVtzeW1zW2ldXSsrO1xuICAgICAgLy8gbnVtIGJpdHNcbiAgICAgIHZhciBuYiA9IChuYml0c1tpXSA9IGFsIC0gbXNiKG5zKSk7XG4gICAgICBuc3RhdGVbaV0gPSAobnMgPDwgbmIpIC0gc3o7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAodHBvcyArIDcpID4+IDMsXG4gICAgICB7XG4gICAgICAgIGI6IGFsLFxuICAgICAgICBzOiBzeW1zLFxuICAgICAgICBuOiBuYml0cyxcbiAgICAgICAgdDogbnN0YXRlLFxuICAgICAgfSxcbiAgICBdO1xuICB9O1xuICAvLyByZWFkIGh1ZmZtYW5cbiAgdmFyIHJodSA9IGZ1bmN0aW9uIChkYXQsIGJ0KSB7XG4gICAgLy8gIGluZGV4ICB3ZWlnaHQgY291bnRcbiAgICB2YXIgaSA9IDAsXG4gICAgICB3YyA9IC0xO1xuICAgIC8vICAgIGJ1ZmZlciAgICAgICAgICAgICBoZWFkZXIgYnl0ZVxuICAgIHZhciBidWYgPSBuZXcgdTgoMjkyKSxcbiAgICAgIGhiID0gZGF0W2J0XTtcbiAgICAvLyBodWZmbWFuIHdlaWdodHNcbiAgICB2YXIgaHcgPSBidWYuc3ViYXJyYXkoMCwgMjU2KTtcbiAgICAvLyByYW5rIGNvdW50XG4gICAgdmFyIHJjID0gYnVmLnN1YmFycmF5KDI1NiwgMjY4KTtcbiAgICAvLyByYW5rIGluZGV4XG4gICAgdmFyIHJpID0gbmV3IHUxNihidWYuYnVmZmVyLCAyNjgpO1xuICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgYnQgaXMgMSBsZXNzIHRoYW4gZXhwZWN0ZWRcbiAgICBpZiAoaGIgPCAxMjgpIHtcbiAgICAgIC8vIGVuZCBieXRlLCBmc2UgZGVjb2RlIHRhYmxlXG4gICAgICB2YXIgX2EgPSByZnNlKGRhdCwgYnQgKyAxLCA2KSxcbiAgICAgICAgZWJ0ID0gX2FbMF0sXG4gICAgICAgIGZkdCA9IF9hWzFdO1xuICAgICAgYnQgKz0gaGI7XG4gICAgICB2YXIgZXBvcyA9IGVidCA8PCAzO1xuICAgICAgLy8gbGFzdCBieXRlXG4gICAgICB2YXIgbGIgPSBkYXRbYnRdO1xuICAgICAgaWYgKCFsYikgZXJyKDApO1xuICAgICAgLy8gIHN0YXRlMSAgIHN0YXRlMiAgIHN0YXRlMSBiaXRzICAgc3RhdGUyIGJpdHNcbiAgICAgIHZhciBzdDEgPSAwLFxuICAgICAgICBzdDIgPSAwLFxuICAgICAgICBidHIxID0gZmR0LmIsXG4gICAgICAgIGJ0cjIgPSBidHIxO1xuICAgICAgLy8gZnNlIHBvc1xuICAgICAgLy8gcHJlLWluY3JlbWVudCB0byBhY2NvdW50IGZvciBvcmlnaW5hbCBkZWZpY2l0IG9mIDFcbiAgICAgIHZhciBmcG9zID0gKCsrYnQgPDwgMykgLSA4ICsgbXNiKGxiKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgZnBvcyAtPSBidHIxO1xuICAgICAgICBpZiAoZnBvcyA8IGVwb3MpIGJyZWFrO1xuICAgICAgICB2YXIgY2J0ID0gZnBvcyA+PiAzO1xuICAgICAgICBzdDEgKz1cbiAgICAgICAgICAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKGZwb3MgJiA3KSkgJiAoKDEgPDwgYnRyMSkgLSAxKTtcbiAgICAgICAgaHdbKyt3Y10gPSBmZHQuc1tzdDFdO1xuICAgICAgICBmcG9zIC09IGJ0cjI7XG4gICAgICAgIGlmIChmcG9zIDwgZXBvcykgYnJlYWs7XG4gICAgICAgIGNidCA9IGZwb3MgPj4gMztcbiAgICAgICAgc3QyICs9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChmcG9zICYgNykpICYgKCgxIDw8IGJ0cjIpIC0gMSk7XG4gICAgICAgIGh3Wysrd2NdID0gZmR0LnNbc3QyXTtcbiAgICAgICAgYnRyMSA9IGZkdC5uW3N0MV07XG4gICAgICAgIHN0MSA9IGZkdC50W3N0MV07XG4gICAgICAgIGJ0cjIgPSBmZHQubltzdDJdO1xuICAgICAgICBzdDIgPSBmZHQudFtzdDJdO1xuICAgICAgfVxuICAgICAgaWYgKCsrd2MgPiAyNTUpIGVycigwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2MgPSBoYiAtIDEyNztcbiAgICAgIGZvciAoOyBpIDwgd2M7IGkgKz0gMikge1xuICAgICAgICB2YXIgYnl0ZSA9IGRhdFsrK2J0XTtcbiAgICAgICAgaHdbaV0gPSBieXRlID4+IDQ7XG4gICAgICAgIGh3W2kgKyAxXSA9IGJ5dGUgJiAxNTtcbiAgICAgIH1cbiAgICAgICsrYnQ7XG4gICAgfVxuICAgIC8vIHdlaWdodCBleHBvbmVudGlhbCBzdW1cbiAgICB2YXIgd2VzID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgdmFyIHd0ID0gaHdbaV07XG4gICAgICAvLyBiaXRzIG11c3QgYmUgYXQgbW9zdCAxMSwgc2FtZSBhcyB3ZWlnaHRcbiAgICAgIGlmICh3dCA+IDExKSBlcnIoMCk7XG4gICAgICB3ZXMgKz0gd3QgJiYgMSA8PCAod3QgLSAxKTtcbiAgICB9XG4gICAgLy8gbWF4IGJpdHNcbiAgICB2YXIgbWIgPSBtc2Iod2VzKSArIDE7XG4gICAgLy8gdGFibGUgc2l6ZVxuICAgIHZhciB0cyA9IDEgPDwgbWI7XG4gICAgLy8gcmVtYWluaW5nIHN1bVxuICAgIHZhciByZW0gPSB0cyAtIHdlcztcbiAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDJcbiAgICBpZiAocmVtICYgKHJlbSAtIDEpKSBlcnIoMCk7XG4gICAgaHdbd2MrK10gPSBtc2IocmVtKSArIDE7XG4gICAgZm9yIChpID0gMDsgaSA8IHdjOyArK2kpIHtcbiAgICAgIHZhciB3dCA9IGh3W2ldO1xuICAgICAgKytyY1soaHdbaV0gPSB3dCAmJiBtYiArIDEgLSB3dCldO1xuICAgIH1cbiAgICAvLyBodWYgYnVmXG4gICAgdmFyIGhidWYgPSBuZXcgdTgodHMgPDwgMSk7XG4gICAgLy8gICAgc3ltYm9scyAgICAgICAgICAgICAgICAgICAgICBudW0gYml0c1xuICAgIHZhciBzeW1zID0gaGJ1Zi5zdWJhcnJheSgwLCB0cyksXG4gICAgICBuYiA9IGhidWYuc3ViYXJyYXkodHMpO1xuICAgIHJpW21iXSA9IDA7XG4gICAgZm9yIChpID0gbWI7IGkgPiAwOyAtLWkpIHtcbiAgICAgIHZhciBwdiA9IHJpW2ldO1xuICAgICAgZmlsbChuYiwgaSwgcHYsIChyaVtpIC0gMV0gPSBwdiArIHJjW2ldICogKDEgPDwgKG1iIC0gaSkpKSk7XG4gICAgfVxuICAgIGlmIChyaVswXSAhPT0gdHMpIGVycigwKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgdmFyIGJpdHMgPSBod1tpXTtcbiAgICAgIGlmIChiaXRzKSB7XG4gICAgICAgIHZhciBjb2RlID0gcmlbYml0c107XG4gICAgICAgIGZpbGwoc3ltcywgaSwgY29kZSwgKHJpW2JpdHNdID0gY29kZSArICgxIDw8IChtYiAtIGJpdHMpKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgYnQsXG4gICAgICB7XG4gICAgICAgIG46IG5iLFxuICAgICAgICBiOiBtYixcbiAgICAgICAgczogc3ltcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfTtcbiAgLy8gVGFibGVzIGdlbmVyYXRlZCB1c2luZyB0aGlzOlxuICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDFhcnJvd3ovYTk3OTQ1MmQ0MzU1OTkyY2JmOGYyNTdjYmZmYzllZGRcbiAgLy8gZGVmYXVsdCBsaXRlcmFsIGxlbmd0aCB0YWJsZVxuICB2YXIgZGxsdCA9IC8qI19fUFVSRV9fKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgICA4MSwgMTYsIDk5LCAxNDAsIDQ5LCAxOTgsIDI0LCA5OSwgMTIsIDMzLCAxOTYsIDI0LCA5OSwgMTAyLCAxMDIsIDEzNCwgNzAsXG4gICAgICAxNDYsIDQsXG4gICAgXSksXG4gICAgMCxcbiAgICA2LFxuICApWzFdO1xuICAvLyBkZWZhdWx0IG1hdGNoIGxlbmd0aCB0YWJsZVxuICB2YXIgZG1sdCA9IC8qI19fUFVSRV9fKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgICAzMywgMjAsIDE5NiwgMjQsIDk5LCAxNDAsIDMzLCAxMzIsIDE2LCA2NiwgOCwgMzMsIDEzMiwgMTYsIDY2LCA4LCAzMywgNjgsXG4gICAgICA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgMzYsIDksXG4gICAgXSksXG4gICAgMCxcbiAgICA2LFxuICApWzFdO1xuICAvLyBkZWZhdWx0IG9mZnNldCBjb2RlIHRhYmxlXG4gIHZhciBkb2N0ID0gLyojX19QVVJFX18gKi8gcmZzZShcbiAgICAvKiNfX1BVUkVfXyovIG5ldyB1OChbMzIsIDEzMiwgMTYsIDY2LCAxMDIsIDcwLCA2OCwgNjgsIDY4LCA2OCwgMzYsIDczLCAyXSksXG4gICAgMCxcbiAgICA1LFxuICApWzFdO1xuICAvLyBiaXRzIHRvIGJhc2VsaW5lXG4gIHZhciBiMmJsID0gZnVuY3Rpb24gKGIsIHMpIHtcbiAgICB2YXIgbGVuID0gYi5sZW5ndGgsXG4gICAgICBibCA9IG5ldyBpMzIobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBibFtpXSA9IHM7XG4gICAgICBzICs9IDEgPDwgYltpXTtcbiAgICB9XG4gICAgcmV0dXJuIGJsO1xuICB9O1xuICAvLyBsaXRlcmFsIGxlbmd0aCBiaXRzXG4gIHZhciBsbGIgPSAvKiNfX1BVUkVfXyAqLyBuZXcgdTgoXG4gICAgLyojX19QVVJFX18gKi8gbmV3IGkzMihbXG4gICAgICAwLCAwLCAwLCAwLCAxNjg0MzAwOSwgNTA1Mjg3NzAsIDEzNDY3ODAyMCwgMjAyMDUwMDU3LCAyNjk0MjIwOTMsXG4gICAgXSkuYnVmZmVyLFxuICAgIDAsXG4gICAgMzYsXG4gICk7XG4gIC8vIGxpdGVyYWwgbGVuZ3RoIGJhc2VsaW5lXG4gIHZhciBsbGJsID0gLyojX19QVVJFX18gKi8gYjJibChsbGIsIDApO1xuICAvLyBtYXRjaCBsZW5ndGggYml0c1xuICB2YXIgbWxiID0gLyojX19QVVJFX18gKi8gbmV3IHU4KFxuICAgIC8qI19fUFVSRV9fICovIG5ldyBpMzIoW1xuICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTY4NDMwMDksIDUwNTI4NzcwLCAxMTc3NjkyMjAsIDE4NTIwNzA0OCxcbiAgICAgIDI1MjU3OTA4NCwgMTYsXG4gICAgXSkuYnVmZmVyLFxuICAgIDAsXG4gICAgNTMsXG4gICk7XG4gIC8vIG1hdGNoIGxlbmd0aCBiYXNlbGluZVxuICB2YXIgbWxibCA9IC8qI19fUFVSRV9fICovIGIyYmwobWxiLCAzKTtcbiAgLy8gZGVjb2RlIGh1ZmZtYW4gc3RyZWFtXG4gIHZhciBkaHUgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGxlbiA9IGRhdC5sZW5ndGgsXG4gICAgICBzcyA9IG91dC5sZW5ndGgsXG4gICAgICBsYiA9IGRhdFtsZW4gLSAxXSxcbiAgICAgIG1zayA9ICgxIDw8IGh1LmIpIC0gMSxcbiAgICAgIGViID0gLWh1LmI7XG4gICAgaWYgKCFsYikgZXJyKDApO1xuICAgIHZhciBzdCA9IDAsXG4gICAgICBidHIgPSBodS5iLFxuICAgICAgcG9zID0gKGxlbiA8PCAzKSAtIDggKyBtc2IobGIpIC0gYnRyLFxuICAgICAgaSA9IC0xO1xuICAgIHdoaWxlIChwb3MgPiBlYiAmJiBpIDwgc3MpIHtcbiAgICAgIHZhciBjYnQgPSBwb3MgPj4gMztcbiAgICAgIHZhciB2YWwgPVxuICAgICAgICAoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+IChwb3MgJiA3KTtcbiAgICAgIHN0ID0gKChzdCA8PCBidHIpIHwgdmFsKSAmIG1zaztcbiAgICAgIG91dFsrK2ldID0gaHUuc1tzdF07XG4gICAgICBwb3MgLT0gYnRyID0gaHUubltzdF07XG4gICAgfVxuICAgIGlmIChwb3MgIT09IGViIHx8IGkgKyAxICE9PSBzcykgZXJyKDApO1xuICB9O1xuICAvLyBkZWNvZGUgaHVmZm1hbiBzdHJlYW0gNHhcbiAgLy8gVE9ETzogdXNlIHdvcmtlcnMgdG8gcGFyYWxsZWxpemVcbiAgdmFyIGRodTQgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGJ0ID0gNjtcbiAgICB2YXIgc3MgPSBvdXQubGVuZ3RoLFxuICAgICAgc3oxID0gKHNzICsgMykgPj4gMixcbiAgICAgIHN6MiA9IHN6MSA8PCAxLFxuICAgICAgc3ozID0gc3oxICsgc3oyO1xuICAgIGRodShcbiAgICAgIGRhdC5zdWJhcnJheShidCwgKGJ0ICs9IGRhdFswXSB8IChkYXRbMV0gPDwgOCkpKSxcbiAgICAgIG91dC5zdWJhcnJheSgwLCBzejEpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoXG4gICAgICBkYXQuc3ViYXJyYXkoYnQsIChidCArPSBkYXRbMl0gfCAoZGF0WzNdIDw8IDgpKSksXG4gICAgICBvdXQuc3ViYXJyYXkoc3oxLCBzejIpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoXG4gICAgICBkYXQuc3ViYXJyYXkoYnQsIChidCArPSBkYXRbNF0gfCAoZGF0WzVdIDw8IDgpKSksXG4gICAgICBvdXQuc3ViYXJyYXkoc3oyLCBzejMpLFxuICAgICAgaHUsXG4gICAgKTtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0KSwgb3V0LnN1YmFycmF5KHN6MyksIGh1KTtcbiAgfTtcbiAgLy8gcmVhZCBac3RhbmRhcmQgYmxvY2tcbiAgdmFyIHJ6YiA9IGZ1bmN0aW9uIChkYXQsIHN0LCBvdXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJ0ID0gc3QuYjtcbiAgICAvLyAgICBieXRlIDAgICAgICAgIGJsb2NrIHR5cGVcbiAgICB2YXIgYjAgPSBkYXRbYnRdLFxuICAgICAgYnR5cGUgPSAoYjAgPj4gMSkgJiAzO1xuICAgIHN0LmwgPSBiMCAmIDE7XG4gICAgdmFyIHN6ID0gKGIwID4+IDMpIHwgKGRhdFtidCArIDFdIDw8IDUpIHwgKGRhdFtidCArIDJdIDw8IDEzKTtcbiAgICAvLyBlbmQgYnl0ZSBmb3IgYmxvY2tcbiAgICB2YXIgZWJ0ID0gKGJ0ICs9IDMpICsgc3o7XG4gICAgaWYgKGJ0eXBlID09PSAxKSB7XG4gICAgICBpZiAoYnQgPj0gZGF0Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgc3QuYiA9IGJ0ICsgMTtcbiAgICAgIGlmIChvdXQpIHtcbiAgICAgICAgZmlsbChvdXQsIGRhdFtidF0sIHN0LnksIChzdC55ICs9IHN6KSk7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsbChuZXcgdTgoc3opLCBkYXRbYnRdKTtcbiAgICB9XG4gICAgaWYgKGVidCA+IGRhdC5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoYnR5cGUgPT09IDApIHtcbiAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICBpZiAob3V0KSB7XG4gICAgICAgIG91dC5zZXQoZGF0LnN1YmFycmF5KGJ0LCBlYnQpLCBzdC55KTtcbiAgICAgICAgc3QueSArPSBzejtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzbGMoZGF0LCBidCwgZWJ0KTtcbiAgICB9XG4gICAgaWYgKGJ0eXBlID09PSAyKSB7XG4gICAgICAvLyAgICBieXRlIDMgICAgICAgIGxpdCBidHlwZSAgICAgc2l6ZSBmb3JtYXRcbiAgICAgIHZhciBiMyA9IGRhdFtidF0sXG4gICAgICAgIGxidCA9IGIzICYgMyxcbiAgICAgICAgc2YgPSAoYjMgPj4gMikgJiAzO1xuICAgICAgLy8gbGl0IHNyYyBzaXplICBsaXQgY21wIHN6IDQgc3RyZWFtc1xuICAgICAgdmFyIGxzcyA9IGIzID4+IDQsXG4gICAgICAgIGxjcyA9IDAsXG4gICAgICAgIHM0ID0gMDtcbiAgICAgIGlmIChsYnQgPCAyKSB7XG4gICAgICAgIGlmIChzZiAmIDEpIGxzcyB8PSAoZGF0WysrYnRdIDw8IDQpIHwgKHNmICYgMiAmJiBkYXRbKytidF0gPDwgMTIpO1xuICAgICAgICBlbHNlIGxzcyA9IGIzID4+IDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzNCA9IHNmO1xuICAgICAgICBpZiAoc2YgPCAyKVxuICAgICAgICAgIChsc3MgfD0gKGRhdFsrK2J0XSAmIDYzKSA8PCA0KSxcbiAgICAgICAgICAgIChsY3MgPSAoZGF0W2J0XSA+PiA2KSB8IChkYXRbKytidF0gPDwgMikpO1xuICAgICAgICBlbHNlIGlmIChzZiA9PT0gMilcbiAgICAgICAgICAobHNzIHw9IChkYXRbKytidF0gPDwgNCkgfCAoKGRhdFsrK2J0XSAmIDMpIDw8IDEyKSksXG4gICAgICAgICAgICAobGNzID0gKGRhdFtidF0gPj4gMikgfCAoZGF0WysrYnRdIDw8IDYpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIChsc3MgfD0gKGRhdFsrK2J0XSA8PCA0KSB8ICgoZGF0WysrYnRdICYgNjMpIDw8IDEyKSksXG4gICAgICAgICAgICAobGNzID0gKGRhdFtidF0gPj4gNikgfCAoZGF0WysrYnRdIDw8IDIpIHwgKGRhdFsrK2J0XSA8PCAxMCkpO1xuICAgICAgfVxuICAgICAgKytidDtcbiAgICAgIC8vIGFkZCBsaXRlcmFscyB0byBlbmQgLSBjYW4gbmV2ZXIgb3ZlcmxhcCB3aXRoIGJhY2tyZWZlcmVuY2VzIGJlY2F1c2UgdW51c2VkIGxpdGVyYWxzIGFsd2F5cyBhcHBlbmRlZFxuICAgICAgdmFyIGJ1ZiA9IG91dCA/IG91dC5zdWJhcnJheShzdC55LCBzdC55ICsgc3QubSkgOiBuZXcgdTgoc3QubSk7XG4gICAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgbGl0ZXJhbHNcbiAgICAgIHZhciBzcGwgPSBidWYubGVuZ3RoIC0gbHNzO1xuICAgICAgaWYgKGxidCA9PT0gMCkgYnVmLnNldChkYXQuc3ViYXJyYXkoYnQsIChidCArPSBsc3MpKSwgc3BsKTtcbiAgICAgIGVsc2UgaWYgKGxidCA9PT0gMSkgZmlsbChidWYsIGRhdFtidCsrXSwgc3BsKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBodWZmbWFuIHRhYmxlXG4gICAgICAgIHZhciBodSA9IHN0Lmg7XG4gICAgICAgIGlmIChsYnQgPT09IDIpIHtcbiAgICAgICAgICB2YXIgaHVkID0gcmh1KGRhdCwgYnQpO1xuICAgICAgICAgIC8vIHN1YnRyYWN0IGRlc2NyaXB0aW9uIGxlbmd0aFxuICAgICAgICAgIGxjcyArPSBidCAtIChidCA9IGh1ZFswXSk7XG4gICAgICAgICAgc3QuaCA9IGh1ID0gaHVkWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKCFodSkgZXJyKDApO1xuICAgICAgICAoczQgPyBkaHU0IDogZGh1KShkYXQuc3ViYXJyYXkoYnQsIChidCArPSBsY3MpKSwgYnVmLnN1YmFycmF5KHNwbCksIGh1KTtcbiAgICAgIH1cbiAgICAgIC8vIG51bSBzZXF1ZW5jZXNcbiAgICAgIHZhciBucyA9IGRhdFtidCsrXTtcbiAgICAgIGlmIChucykge1xuICAgICAgICBpZiAobnMgPT09IDI1NSkgbnMgPSAoZGF0W2J0KytdIHwgKGRhdFtidCsrXSA8PCA4KSkgKyAweDdmMDA7XG4gICAgICAgIGVsc2UgaWYgKG5zID4gMTI3KSBucyA9ICgobnMgLSAxMjgpIDw8IDgpIHwgZGF0W2J0KytdO1xuICAgICAgICAvLyBzeW1ib2wgY29tcHJlc3Npb24gbW9kZXNcbiAgICAgICAgdmFyIHNjbSA9IGRhdFtidCsrXTtcbiAgICAgICAgaWYgKHNjbSAmIDMpIGVycigwKTtcbiAgICAgICAgdmFyIGR0cyA9IFtkbWx0LCBkb2N0LCBkbGx0XTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPiAtMTsgLS1pKSB7XG4gICAgICAgICAgdmFyIG1kID0gKHNjbSA+PiAoKGkgPDwgMSkgKyAyKSkgJiAzO1xuICAgICAgICAgIGlmIChtZCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gcmxlIGJ1ZlxuICAgICAgICAgICAgdmFyIHJidWYgPSBuZXcgdTgoWzAsIDAsIGRhdFtidCsrXV0pO1xuICAgICAgICAgICAgZHRzW2ldID0ge1xuICAgICAgICAgICAgICBzOiByYnVmLnN1YmFycmF5KDIsIDMpLFxuICAgICAgICAgICAgICBuOiByYnVmLnN1YmFycmF5KDAsIDEpLFxuICAgICAgICAgICAgICB0OiBuZXcgdTE2KHJidWYuYnVmZmVyLCAwLCAxKSxcbiAgICAgICAgICAgICAgYjogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChtZCA9PT0gMikge1xuICAgICAgICAgICAgLy8gYWNjdXJhY3kgbG9nIDggZm9yIG9mZnNldHMsIDkgZm9yIG90aGVyc1xuICAgICAgICAgICAgKF9hID0gcmZzZShkYXQsIGJ0LCA5IC0gKGkgJiAxKSkpLCAoYnQgPSBfYVswXSksIChkdHNbaV0gPSBfYVsxXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtZCA9PT0gMykge1xuICAgICAgICAgICAgaWYgKCFzdC50KSBlcnIoMCk7XG4gICAgICAgICAgICBkdHNbaV0gPSBzdC50W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgX2IgPSAoc3QudCA9IGR0cyksXG4gICAgICAgICAgbWx0ID0gX2JbMF0sXG4gICAgICAgICAgb2N0ID0gX2JbMV0sXG4gICAgICAgICAgbGx0ID0gX2JbMl07XG4gICAgICAgIHZhciBsYiA9IGRhdFtlYnQgLSAxXTtcbiAgICAgICAgaWYgKCFsYikgZXJyKDApO1xuICAgICAgICB2YXIgc3BvcyA9IChlYnQgPDwgMykgLSA4ICsgbXNiKGxiKSAtIGxsdC5iLFxuICAgICAgICAgIGNidCA9IHNwb3MgPj4gMyxcbiAgICAgICAgICBvdWJ0ID0gMDtcbiAgICAgICAgdmFyIGxzdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IGxsdC5iKSAtIDEpO1xuICAgICAgICBjYnQgPSAoc3BvcyAtPSBvY3QuYikgPj4gMztcbiAgICAgICAgdmFyIG9zdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG9jdC5iKSAtIDEpO1xuICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbHQuYikgPj4gMztcbiAgICAgICAgdmFyIG1zdCA9XG4gICAgICAgICAgKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG1sdC5iKSAtIDEpO1xuICAgICAgICBmb3IgKCsrbnM7IC0tbnM7ICkge1xuICAgICAgICAgIHZhciBsbGMgPSBsbHQuc1tsc3RdO1xuICAgICAgICAgIHZhciBsYnRyID0gbGx0Lm5bbHN0XTtcbiAgICAgICAgICB2YXIgbWxjID0gbWx0LnNbbXN0XTtcbiAgICAgICAgICB2YXIgbWJ0ciA9IG1sdC5uW21zdF07XG4gICAgICAgICAgdmFyIG9mYyA9IG9jdC5zW29zdF07XG4gICAgICAgICAgdmFyIG9idHIgPSBvY3Qubltvc3RdO1xuICAgICAgICAgIGNidCA9IChzcG9zIC09IG9mYykgPj4gMztcbiAgICAgICAgICB2YXIgb2ZwID0gMSA8PCBvZmM7XG4gICAgICAgICAgdmFyIG9mZiA9XG4gICAgICAgICAgICBvZnAgK1xuICAgICAgICAgICAgKCgoZGF0W2NidF0gfFxuICAgICAgICAgICAgICAoZGF0W2NidCArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICAgKGRhdFtjYnQgKyAyXSA8PCAxNikgfFxuICAgICAgICAgICAgICAoZGF0W2NidCArIDNdIDw8IDI0KSkgPj4+XG4gICAgICAgICAgICAgIChzcG9zICYgNykpICZcbiAgICAgICAgICAgICAgKG9mcCAtIDEpKTtcbiAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbGJbbWxjXSkgPj4gMztcbiAgICAgICAgICB2YXIgbWwgPVxuICAgICAgICAgICAgbWxibFttbGNdICtcbiAgICAgICAgICAgICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PlxuICAgICAgICAgICAgICAoc3BvcyAmIDcpKSAmXG4gICAgICAgICAgICAgICgoMSA8PCBtbGJbbWxjXSkgLSAxKSk7XG4gICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbGxiW2xsY10pID4+IDM7XG4gICAgICAgICAgdmFyIGxsID1cbiAgICAgICAgICAgIGxsYmxbbGxjXSArXG4gICAgICAgICAgICAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj5cbiAgICAgICAgICAgICAgKHNwb3MgJiA3KSkgJlxuICAgICAgICAgICAgICAoKDEgPDwgbGxiW2xsY10pIC0gMSkpO1xuICAgICAgICAgIGNidCA9IChzcG9zIC09IGxidHIpID4+IDM7XG4gICAgICAgICAgbHN0ID1cbiAgICAgICAgICAgIGxsdC50W2xzdF0gK1xuICAgICAgICAgICAgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmXG4gICAgICAgICAgICAgICgoMSA8PCBsYnRyKSAtIDEpKTtcbiAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtYnRyKSA+PiAzO1xuICAgICAgICAgIG1zdCA9XG4gICAgICAgICAgICBtbHQudFttc3RdICtcbiAgICAgICAgICAgICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJlxuICAgICAgICAgICAgICAoKDEgPDwgbWJ0cikgLSAxKSk7XG4gICAgICAgICAgY2J0ID0gKHNwb3MgLT0gb2J0cikgPj4gMztcbiAgICAgICAgICBvc3QgPVxuICAgICAgICAgICAgb2N0LnRbb3N0XSArXG4gICAgICAgICAgICAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICZcbiAgICAgICAgICAgICAgKCgxIDw8IG9idHIpIC0gMSkpO1xuICAgICAgICAgIGlmIChvZmYgPiAzKSB7XG4gICAgICAgICAgICBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgIHN0Lm9bMV0gPSBzdC5vWzBdO1xuICAgICAgICAgICAgc3Qub1swXSA9IG9mZiAtPSAzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gb2ZmIC0gKGxsICE9PSAwKTtcbiAgICAgICAgICAgIGlmIChpZHgpIHtcbiAgICAgICAgICAgICAgb2ZmID0gaWR4ID09PSAzID8gc3Qub1swXSAtIDEgOiBzdC5vW2lkeF07XG4gICAgICAgICAgICAgIGlmIChpZHggPiAxKSBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgICAgc3Qub1sxXSA9IHN0Lm9bMF07XG4gICAgICAgICAgICAgIHN0Lm9bMF0gPSBvZmY7XG4gICAgICAgICAgICB9IGVsc2Ugb2ZmID0gc3Qub1swXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsbDsgKytpKSB7XG4gICAgICAgICAgICBidWZbb3VidCArIGldID0gYnVmW3NwbCArIGldO1xuICAgICAgICAgIH1cbiAgICAgICAgICAob3VidCArPSBsbCksIChzcGwgKz0gbGwpO1xuICAgICAgICAgIHZhciBzdGluID0gb3VidCAtIG9mZjtcbiAgICAgICAgICBpZiAoc3RpbiA8IDApIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSAtc3RpbjtcbiAgICAgICAgICAgIHZhciBicyA9IHN0LmUgKyBzdGluO1xuICAgICAgICAgICAgaWYgKGxlbiA+IG1sKSBsZW4gPSBtbDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgYnVmW291YnQgKyBpXSA9IHN0LndbYnMgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChvdWJ0ICs9IGxlbiksIChtbCAtPSBsZW4pLCAoc3RpbiA9IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1sOyArK2kpIHtcbiAgICAgICAgICAgIGJ1ZltvdWJ0ICsgaV0gPSBidWZbc3RpbiArIGldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdWJ0ICs9IG1sO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdWJ0ICE9PSBzcGwpIHtcbiAgICAgICAgICB3aGlsZSAoc3BsIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgYnVmW291YnQrK10gPSBidWZbc3BsKytdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIG91YnQgPSBidWYubGVuZ3RoO1xuICAgICAgICBpZiAob3V0KSBzdC55ICs9IG91YnQ7XG4gICAgICAgIGVsc2UgYnVmID0gc2xjKGJ1ZiwgMCwgb3VidCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgc3QueSArPSBsc3M7XG4gICAgICAgICAgaWYgKHNwbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsc3M7ICsraSkge1xuICAgICAgICAgICAgICBidWZbaV0gPSBidWZbc3BsICsgaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNwbCkgYnVmID0gc2xjKGJ1Ziwgc3BsKTtcbiAgICAgIH1cbiAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICBlcnIoMik7XG4gIH07XG4gIC8vIGNvbmNhdFxuICB2YXIgY2N0ID0gZnVuY3Rpb24gKGJ1ZnMsIG9sKSB7XG4gICAgaWYgKGJ1ZnMubGVuZ3RoID09PSAxKSByZXR1cm4gYnVmc1swXTtcbiAgICB2YXIgYnVmID0gbmV3IHU4KG9sKTtcbiAgICBmb3IgKHZhciBpID0gMCwgYiA9IDA7IGkgPCBidWZzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgY2hrID0gYnVmc1tpXTtcbiAgICAgIGJ1Zi5zZXQoY2hrLCBiKTtcbiAgICAgIGIgKz0gY2hrLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfTtcbiAgLyoqXG4gICAqIERlY29tcHJlc3NlcyBac3RhbmRhcmQgZGF0YVxuICAgKiBAcGFyYW0gZGF0IFRoZSBpbnB1dCBkYXRhXG4gICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBidWZmZXIuIElmIHVuc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZVxuICAgKiAgICAgICAgICAgIGV4YWN0bHkgZW5vdWdoIG1lbW9yeSB0byBmaXQgdGhlIGRlY29tcHJlc3NlZCBkYXRhLiBJZiB5b3VyXG4gICAqICAgICAgICAgICAgZGF0YSBoYXMgbXVsdGlwbGUgZnJhbWVzIGFuZCB5b3Uga25vdyB0aGUgb3V0cHV0IHNpemUsIHNwZWNpZnlpbmdcbiAgICogICAgICAgICAgICBpdCB3aWxsIHlpZWxkIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBkYXRhXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZGVjb21wcmVzcyhkYXQsIGJ1Zikge1xuICAgIHZhciBidCA9IDAsXG4gICAgICBidWZzID0gW10sXG4gICAgICBuYiA9ICshYnVmLFxuICAgICAgb2wgPSAwO1xuICAgIHdoaWxlIChkYXQubGVuZ3RoKSB7XG4gICAgICB2YXIgc3QgPSByemZoKGRhdCwgbmIgfHwgYnVmKTtcbiAgICAgIGlmICh0eXBlb2Ygc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKG5iKSB7XG4gICAgICAgICAgYnVmID0gbnVsbDtcbiAgICAgICAgICBpZiAoc3Qudy5sZW5ndGggPT09IHN0LnUpIHtcbiAgICAgICAgICAgIGJ1ZnMucHVzaCgoYnVmID0gc3QudykpO1xuICAgICAgICAgICAgb2wgKz0gc3QudTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmcy5wdXNoKGJ1Zik7XG4gICAgICAgICAgc3QuZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCFzdC5sKSB7XG4gICAgICAgICAgdmFyIGJsayA9IHJ6YihkYXQsIHN0LCBidWYpO1xuICAgICAgICAgIGlmICghYmxrKSBlcnIoNSk7XG4gICAgICAgICAgaWYgKGJ1Zikgc3QuZSA9IHN0Lnk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZzLnB1c2goYmxrKTtcbiAgICAgICAgICAgIG9sICs9IGJsay5sZW5ndGg7XG4gICAgICAgICAgICBjcHcoc3QudywgMCwgYmxrLmxlbmd0aCk7XG4gICAgICAgICAgICBzdC53LnNldChibGssIHN0LncubGVuZ3RoIC0gYmxrLmxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ0ID0gc3QuYiArIHN0LmMgKiA0O1xuICAgICAgfSBlbHNlIGJ0ID0gc3Q7XG4gICAgICBkYXQgPSBkYXQuc3ViYXJyYXkoYnQpO1xuICAgIH1cbiAgICByZXR1cm4gY2N0KGJ1ZnMsIG9sKTtcbiAgfTtcbn0pKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGVjb21wcmVzc19pbnB1dFxuLy9WZXJzaW9uOiA8IDUuMS4wXG52YXIgY2FtbF9kZWNvbXByZXNzX2lucHV0ID0gbnVsbDtcblxuLy9Qcm92aWRlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1ZlcnNpb246ID49IDUuMS4wXG4vL1ZlcnNpb246IDwgNS4xLjFcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xudmFyIGNhbWxfZGVjb21wcmVzc19pbnB1dCA9IHpzdGRfZGVjb21wcmVzcztcblxuLy9Qcm92aWRlczogY2FtbF9kZWNvbXByZXNzX2lucHV0XG4vL1ZlcnNpb246ID49IDUuMS4xXG4vL1ZlcnNpb246IDwgNS4yLjBcbnZhciBjYW1sX2RlY29tcHJlc3NfaW5wdXQgPSBudWxsO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2RlY29tcHJlc3NfaW5wdXRcbi8vVmVyc2lvbjogPj0gNS4yXG4vL1JlcXVpcmVzOiB6c3RkX2RlY29tcHJlc3NcbnZhciBjYW1sX2RlY29tcHJlc3NfaW5wdXQgPSB6c3RkX2RlY29tcHJlc3M7XG5cbi8vUHJvdmlkZXM6IGNhbWxfenN0ZF9pbml0aWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2RlY29tcHJlc3NfaW5wdXRcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xuLy9WZXJzaW9uOiA+PSA1LjEuMVxuZnVuY3Rpb24gY2FtbF96c3RkX2luaXRpYWxpemUoX3VuaXQpIHtcbiAgY2FtbF9kZWNvbXByZXNzX2lucHV0ID0genN0ZF9kZWNvbXByZXNzO1xuICByZXR1cm4gMTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBXZWFrIEFQSVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxudmFyIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ID0gMztcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG52YXIgY2FtbF9lcGhlX2RhdGFfb2Zmc2V0ID0gMjtcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX25vbmVcbnZhciBjYW1sX2VwaGVfbm9uZSA9IHsgY2FtbF9lcGhlX25vbmU6IDAgfTtcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3NldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfZGF0YV9vcHRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9zZXRfa2V5KHgsIGksIHYpIHtcbiAgdmFyIG9sZCA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB2IGluc3RhbmNlb2YgT2JqZWN0KSB2ID0gbmV3IGdsb2JhbFRoaXMuV2Vha1JlZih2KTtcbiAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gdjtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdCh4LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3Vuc2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX25vbmVcbmZ1bmN0aW9uIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSkge1xuICB2YXIgb2xkID0gY2FtbF9lcGhlX2dldF9kYXRhKHgpO1xuICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdCh4LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF93ZWFrX2NyZWF0ZVxuZnVuY3Rpb24gY2FtbF9lcGhlX2NyZWF0ZShuKSB7XG4gIHJldHVybiBjYW1sX3dlYWtfY3JlYXRlKG4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX25vbmVcbmZ1bmN0aW9uIGNhbWxfd2Vha19jcmVhdGUobikge1xuICB2YXIgYWxlbiA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgbjtcbiAgdmFyIHggPSBuZXcgQXJyYXkoYWxlbik7XG4gIHhbMF0gPSAyNTE7XG4gIHhbMV0gPSBcImNhbWxfZXBoZV9saXN0X2hlYWRcIjtcbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhbGVuOyBpKyspIHtcbiAgICB4W2ldID0gY2FtbF9lcGhlX25vbmU7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfa2V5LCBjYW1sX2VwaGVfdW5zZXRfa2V5XG5mdW5jdGlvbiBjYW1sX3dlYWtfc2V0KHgsIGksIHYpIHtcbiAgaWYgKHYgPT09IDApIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9rZXkoeCwgaSwgdlsxXSk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG4vL0FsaWFzOiBjYW1sX3dlYWtfZ2V0XG5cbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfa2V5KHgsIGkpIHtcbiAgdmFyIHdlYWsgPSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV07XG4gIGlmICh3ZWFrID09PSBjYW1sX2VwaGVfbm9uZSkgcmV0dXJuIDA7XG4gIGlmIChnbG9iYWxUaGlzLldlYWtSZWYgJiYgd2VhayBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgIHdlYWsgPSB3ZWFrLmRlcmVmKCk7XG4gICAgaWYgKHdlYWsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gY2FtbF9lcGhlX25vbmU7XG4gICAgICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWzAsIHdlYWtdO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlfY29weVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2dldF9rZXksY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuLy9BbGlhczogY2FtbF93ZWFrX2dldF9jb3B5XG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2tleV9jb3B5KHgsIGkpIHtcbiAgdmFyIHkgPSBjYW1sX2VwaGVfZ2V0X2tleSh4LCBpKTtcbiAgaWYgKHkgPT09IDApIHJldHVybiB5O1xuICB2YXIgeiA9IHlbMV07XG4gIGlmIChBcnJheS5pc0FycmF5KHopKSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiB5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfa2V5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG4vL0FsaWFzOiBjYW1sX3dlYWtfY2hlY2tcbmZ1bmN0aW9uIGNhbWxfZXBoZV9jaGVja19rZXkoeCwgaSkge1xuICB2YXIgd2VhayA9IHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXTtcbiAgaWYgKHdlYWsgPT09IGNhbWxfZXBoZV9ub25lKSByZXR1cm4gMDtcbiAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB3ZWFrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgd2VhayA9IHdlYWsuZGVyZWYoKTtcbiAgICBpZiAod2VhayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfYmxpdF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuLy9BbGlhczogY2FtbF93ZWFrX2JsaXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9ibGl0X2tleShhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIHZhciBvbGQgPSBjYW1sX2VwaGVfZ2V0X2RhdGEoYTEpO1xuICAvLyBtaW51cyBvbmUgYmVjYXVzZSBjYW1sX2FycmF5X2JsaXQgd29ya3Mgb24gb2NhbWwgYXJyYXlcbiAgY2FtbF9hcnJheV9ibGl0KFxuICAgIGExLFxuICAgIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTEgLSAxLFxuICAgIGEyLFxuICAgIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTIgLSAxLFxuICAgIGxlbixcbiAgKTtcbiAgY2FtbF9lcGhlX3NldF9kYXRhX29wdChhMiwgb2xkKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9ibGl0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YSwgY2FtbF9lcGhlX3NldF9kYXRhX29wdFxuZnVuY3Rpb24gY2FtbF9lcGhlX2JsaXRfZGF0YShzcmMsIGRzdCkge1xuICB2YXIgb2xkID0gY2FtbF9lcGhlX2dldF9kYXRhKHNyYyk7XG4gIGNhbWxfZXBoZV9zZXRfZGF0YV9vcHQoZHN0LCBvbGQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfbm9uZVxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhKHgpIHtcbiAgdmFyIGRhdGEgPSB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF07XG4gIGlmIChkYXRhID09PSBjYW1sX2VwaGVfbm9uZSkgcmV0dXJuIDA7XG4gIGZvciAodmFyIGkgPSBjYW1sX2VwaGVfa2V5X29mZnNldDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgayA9IHhbaV07XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiBrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICB2YXIgZCA9IGsuZGVyZWYoKTtcbiAgICAgIGlmIChkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeFtpXSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBjYW1sX2VwaGVfbm9uZTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoZ2xvYmFsVGhpcy5XZWFrTWFwKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLmdldChrKTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbMCwgZGF0YV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhX2NvcHkoeCkge1xuICB2YXIgciA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKHIgPT09IDApIHJldHVybiAwO1xuICB2YXIgeiA9IHJbMV07XG4gIGlmIChBcnJheS5pc0FycmF5KHopKSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldCwgY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGEoeCwgZGF0YSkge1xuICBmb3IgKHZhciBpID0geC5sZW5ndGggLSAxOyBpID49IGNhbWxfZXBoZV9rZXlfb2Zmc2V0OyBpLS0pIHtcbiAgICB2YXIgayA9IHhbaV07XG4gICAgaWYgKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiBrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICB2YXIgZCA9IGsuZGVyZWYoKTtcbiAgICAgIGlmIChkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeFtpXSA9IGNhbWxfZXBoZV9ub25lO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnbG9iYWxUaGlzLldlYWtNYXApIHtcbiAgICAgICAgZGF0YSA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKS5zZXQoaywgZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGRhdGE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFfb3B0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGFfb3B0KHgsIGRhdGFfb3B0KSB7XG4gIGlmIChkYXRhX29wdCA9PT0gMCkgY2FtbF9lcGhlX3Vuc2V0X2RhdGEoeCk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9kYXRhKHgsIGRhdGFfb3B0WzFdKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9ub25lXG5mdW5jdGlvbiBjYW1sX2VwaGVfdW5zZXRfZGF0YSh4KSB7XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGNhbWxfZXBoZV9ub25lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NoZWNrX2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuZnVuY3Rpb24gY2FtbF9lcGhlX2NoZWNrX2RhdGEoeCkge1xuICB2YXIgZGF0YSA9IGNhbWxfZXBoZV9nZXRfZGF0YSh4KTtcbiAgaWYgKGRhdGEgPT09IDApIHJldHVybiAwO1xuICBlbHNlIHJldHVybiAxO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9nY19taW5vclxuZnVuY3Rpb24gY2FtbF9nY19taW5vcihfdW5pdCkge1xuICAvL2F2YWlsYWJsZSB3aXRoIFtub2RlIC0tZXhwb3NlLWdjXVxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuZ2MgPT09IFwiZnVuY3Rpb25cIikgZ2xvYmFsVGhpcy5nYyh0cnVlKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX21ham9yKF91bml0KSB7XG4gIC8vYXZhaWxhYmxlIHdpdGggW25vZGUgLS1leHBvc2UtZ2NdXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5nYyA9PT0gXCJmdW5jdGlvblwiKSBnbG9iYWxUaGlzLmdjKCk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9nY19mdWxsX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX2Z1bGxfbWFqb3IoX3VuaXQpIHtcbiAgLy9hdmFpbGFibGUgd2l0aCBbbm9kZSAtLWV4cG9zZS1nY11cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmdjID09PSBcImZ1bmN0aW9uXCIpIGdsb2JhbFRoaXMuZ2MoKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2NvbXBhY3Rpb25cbmZ1bmN0aW9uIGNhbWxfZ2NfY29tcGFjdGlvbihfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfY291bnRlcnNcbmZ1bmN0aW9uIGNhbWxfZ2NfY291bnRlcnMoX3VuaXQpIHtcbiAgcmV0dXJuIFsyNTQsIDAsIDAsIDBdO1xufVxuLy9Qcm92aWRlczogY2FtbF9nY19xdWlja19zdGF0XG5mdW5jdGlvbiBjYW1sX2djX3F1aWNrX3N0YXQoX3VuaXQpIHtcbiAgcmV0dXJuIFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19zdGF0XG4vL1JlcXVpcmVzOiBjYW1sX2djX3F1aWNrX3N0YXRcbmZ1bmN0aW9uIGNhbWxfZ2Nfc3RhdCh1bml0KSB7XG4gIHJldHVybiBjYW1sX2djX3F1aWNrX3N0YXQodW5pdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2Nfc2V0XG5mdW5jdGlvbiBjYW1sX2djX3NldChfY29udHJvbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19nZXRcbmZ1bmN0aW9uIGNhbWxfZ2NfZ2V0KF91bml0KSB7XG4gIHJldHVybiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVnaXN0ZXIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXIoX2YsIF94KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlXG52YXIgYWxsX2ZpbmFsaXplcnMgPSBuZXcgZ2xvYmFsVGhpcy5TZXQoKTtcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWUoY2IsIGEpIHtcbiAgaWYgKGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgYSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHZhciB4ID0gbmV3IGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHgpIHtcbiAgICAgIGFsbF9maW5hbGl6ZXJzLmRlbGV0ZSh4KTtcbiAgICAgIGNiKDApO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICAgIHgucmVnaXN0ZXIoYSwgeCk7XG4gICAgYWxsX2ZpbmFsaXplcnMuYWRkKHgpO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlbGVhc2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVsZWFzZShfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0YXJ0XG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc3RhcnQoX3JhdGUsIF9zdGFja19zaXplLCBfdHJhY2tlcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0b3BcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zdG9wKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21lbXByb2ZfZGlzY2FyZFxuLy9WZXJzaW9uOiA+PSA1LjJcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9kaXNjYXJkKF90KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V2ZW50bG9nX3Jlc3VtZVxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9ldmVudGxvZ19yZXN1bWUoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcGF1c2Vcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfZXZlbnRsb2dfcGF1c2UoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudFxuLy9WZXJzaW9uOiA8IDUuMFxuZnVuY3Rpb24gY2FtbF9nY19odWdlX2ZhbGxiYWNrX2NvdW50KF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yX3NsaWNlXG5mdW5jdGlvbiBjYW1sX2djX21ham9yX3NsaWNlKF93b3JrKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21pbm9yX3dvcmRzXG5mdW5jdGlvbiBjYW1sX2djX21pbm9yX3dvcmRzKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9taW5vcl9mcmVlXG5mdW5jdGlvbiBjYW1sX2dldF9taW5vcl9mcmVlKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9tYWpvcl9idWNrZXRcbi8vVmVyc2lvbjogPCA1LjBcbmZ1bmN0aW9uIGNhbWxfZ2V0X21ham9yX2J1Y2tldChfbikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWFqb3JfY3JlZGl0XG4vL1ZlcnNpb246IDwgNS4wXG5mdW5jdGlvbiBjYW1sX2dldF9tYWpvcl9jcmVkaXQoX24pIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEZvcm1hdFxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2Zvcm1hdFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpIHtcbiAgZm10ID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhmbXQpO1xuICB2YXIgbGVuID0gZm10Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IDMxKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJmb3JtYXRfaW50OiBmb3JtYXQgdG9vIGxvbmdcIik7XG4gIHZhciBmID0ge1xuICAgIGp1c3RpZnk6IFwiK1wiLFxuICAgIHNpZ25zdHlsZTogXCItXCIsXG4gICAgZmlsbGVyOiBcIiBcIixcbiAgICBhbHRlcm5hdGU6IGZhbHNlLFxuICAgIGJhc2U6IDAsXG4gICAgc2lnbmVkY29udjogZmFsc2UsXG4gICAgd2lkdGg6IDAsXG4gICAgdXBwZXJjYXNlOiBmYWxzZSxcbiAgICBzaWduOiAxLFxuICAgIHByZWM6IC0xLFxuICAgIGNvbnY6IFwiZlwiLFxuICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuICAgIHN3aXRjaCAoYykge1xuICAgICAgY2FzZSBcIi1cIjpcbiAgICAgICAgZi5qdXN0aWZ5ID0gXCItXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIitcIjpcbiAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGYuc2lnbnN0eWxlID0gYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOlxuICAgICAgICBmLmZpbGxlciA9IFwiMFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIjXCI6XG4gICAgICAgIGYuYWx0ZXJuYXRlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMVwiOlxuICAgICAgY2FzZSBcIjJcIjpcbiAgICAgIGNhc2UgXCIzXCI6XG4gICAgICBjYXNlIFwiNFwiOlxuICAgICAgY2FzZSBcIjVcIjpcbiAgICAgIGNhc2UgXCI2XCI6XG4gICAgICBjYXNlIFwiN1wiOlxuICAgICAgY2FzZSBcIjhcIjpcbiAgICAgIGNhc2UgXCI5XCI6XG4gICAgICAgIGYud2lkdGggPSAwO1xuICAgICAgICB3aGlsZSAoKChjID0gZm10LmNoYXJDb2RlQXQoaSkgLSA0OCksIGMgPj0gMCAmJiBjIDw9IDkpKSB7XG4gICAgICAgICAgZi53aWR0aCA9IGYud2lkdGggKiAxMCArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGktLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiLlwiOlxuICAgICAgICBmLnByZWMgPSAwO1xuICAgICAgICBpKys7XG4gICAgICAgIHdoaWxlICgoKGMgPSBmbXQuY2hhckNvZGVBdChpKSAtIDQ4KSwgYyA+PSAwICYmIGMgPD0gOSkpIHtcbiAgICAgICAgICBmLnByZWMgPSBmLnByZWMgKiAxMCArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGktLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTtcbiAgICAgICAgZi5iYXNlID0gMTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgZi5iYXNlID0gMTA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgZi5iYXNlID0gMTY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgZi5iYXNlID0gMTY7XG4gICAgICAgIGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICBmLmJhc2UgPSA4O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlXCI6XG4gICAgICBjYXNlIFwiZlwiOlxuICAgICAgY2FzZSBcImdcIjpcbiAgICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTtcbiAgICAgICAgZi5jb252ID0gYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcIkZcIjpcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7XG4gICAgICAgIGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgICAgZi5jb252ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcmF3YnVmZmVyKSB7XG4gIGlmIChmLnVwcGVyY2FzZSkgcmF3YnVmZmVyID0gcmF3YnVmZmVyLnRvVXBwZXJDYXNlKCk7XG4gIHZhciBsZW4gPSByYXdidWZmZXIubGVuZ3RoO1xuICAvKiBBZGp1c3QgbGVuIHRvIHJlZmxlY3QgYWRkaXRpb25hbCBjaGFycyAoc2lnbiwgZXRjKSAqL1xuICBpZiAoZi5zaWduZWRjb252ICYmIChmLnNpZ24gPCAwIHx8IGYuc2lnbnN0eWxlICE9PSBcIi1cIikpIGxlbisrO1xuICBpZiAoZi5hbHRlcm5hdGUpIHtcbiAgICBpZiAoZi5iYXNlID09PSA4KSBsZW4gKz0gMTtcbiAgICBpZiAoZi5iYXNlID09PSAxNikgbGVuICs9IDI7XG4gIH1cbiAgLyogRG8gdGhlIGZvcm1hdHRpbmcgKi9cbiAgdmFyIGJ1ZmZlciA9IFwiXCI7XG4gIGlmIChmLmp1c3RpZnkgPT09IFwiK1wiICYmIGYuZmlsbGVyID09PSBcIiBcIilcbiAgICBmb3IgKHZhciBpID0gbGVuOyBpIDwgZi53aWR0aDsgaSsrKSBidWZmZXIgKz0gXCIgXCI7XG4gIGlmIChmLnNpZ25lZGNvbnYpIHtcbiAgICBpZiAoZi5zaWduIDwgMCkgYnVmZmVyICs9IFwiLVwiO1xuICAgIGVsc2UgaWYgKGYuc2lnbnN0eWxlICE9PSBcIi1cIikgYnVmZmVyICs9IGYuc2lnbnN0eWxlO1xuICB9XG4gIGlmIChmLmFsdGVybmF0ZSAmJiBmLmJhc2UgPT09IDgpIGJ1ZmZlciArPSBcIjBcIjtcbiAgaWYgKGYuYWx0ZXJuYXRlICYmIGYuYmFzZSA9PT0gMTYpIGJ1ZmZlciArPSBmLnVwcGVyY2FzZSA/IFwiMFhcIiA6IFwiMHhcIjtcbiAgaWYgKGYuanVzdGlmeSA9PT0gXCIrXCIgJiYgZi5maWxsZXIgPT09IFwiMFwiKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSBcIjBcIjtcbiAgYnVmZmVyICs9IHJhd2J1ZmZlcjtcbiAgaWYgKGYuanVzdGlmeSA9PT0gXCItXCIpIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSBcIiBcIjtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoYnVmZmVyKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcblxuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVcbnZhciBjYW1sX2dyX3N0YXRlO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZVxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2dldCgpIHtcbiAgaWYgKGNhbWxfZ3Jfc3RhdGUpIHtcbiAgICByZXR1cm4gY2FtbF9ncl9zdGF0ZTtcbiAgfVxuICB0aHJvdyBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoW1xuICAgIDAsXG4gICAgY2FtbF9uYW1lZF92YWx1ZShcIkdyYXBoaWNzLkdyYXBoaWNfZmFpbHVyZVwiKSxcbiAgICBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiTm90IGluaXRpYWxpemVkXCIpLFxuICBdKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlLGNhbWxfZ3Jfc3RhdGVfaW5pdFxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9zZXQoY3R4KSB7XG4gIGNhbWxfZ3Jfc3RhdGUgPSBjdHg7XG4gIGNhbWxfZ3Jfc3RhdGVfaW5pdCgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9vcGVuX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fZ3JhcGgoaW5mbykge1xuICB2YXIgaW5mbyA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKGluZm8pO1xuICBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIHZhciByZXMgPSBpbmZvLm1hdGNoKFwiKF58LCkgKlwiICsgbmFtZSArIFwiICo9ICooW2EtekEtWjAtOV9dKykgKigsfCQpXCIpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXNbMl07XG4gIH1cbiAgdmFyIHNwZWNzID0gW107XG4gIGlmICghKGluZm8gPT09IFwiXCIpKSBzcGVjcy5wdXNoKGluZm8pO1xuICB2YXIgdGFyZ2V0ID0gZ2V0KFwidGFyZ2V0XCIpO1xuICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0gXCJcIjtcbiAgdmFyIHN0YXR1cyA9IGdldChcInN0YXR1c1wiKTtcbiAgaWYgKCFzdGF0dXMpIHNwZWNzLnB1c2goXCJzdGF0dXM9MVwiKTtcblxuICB2YXIgdyA9IGdldChcIndpZHRoXCIpO1xuICB3ID0gdyA/IE51bWJlci5wYXJzZUludCh3KSA6IDIwMDtcbiAgc3BlY3MucHVzaChcIndpZHRoPVwiICsgdyk7XG5cbiAgdmFyIGggPSBnZXQoXCJoZWlnaHRcIik7XG4gIGggPSBoID8gTnVtYmVyLnBhcnNlSW50KGgpIDogMjAwO1xuICBzcGVjcy5wdXNoKFwiaGVpZ2h0PVwiICsgaCk7XG5cbiAgdmFyIHdpbiA9IGdsb2JhbFRoaXMub3BlbihcImFib3V0OmJsYW5rXCIsIHRhcmdldCwgc3BlY3Muam9pbihcIixcIikpO1xuICBpZiAoIXdpbikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJHcmFwaGljcy5vcGVuX2dyYXBoOiBjYW5ub3Qgb3BlbiB0aGUgd2luZG93XCIpO1xuICB9XG4gIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gIHZhciBjYW52YXMgPSBkb2MuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gdztcbiAgY2FudmFzLmhlaWdodCA9IGg7XG4gIHZhciBjdHggPSBjYW1sX2dyX3N0YXRlX2NyZWF0ZShjYW52YXMsIHcsIGgpO1xuICBjdHguc2V0X3RpdGxlID0gZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgZG9jLnRpdGxlID0gdGl0bGU7XG4gIH07XG4gIGNhbWxfZ3Jfc3RhdGVfc2V0KGN0eCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIGJvZHkuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcbiAgYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9pbml0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3NldF9jb2xvcixjYW1sX2dyX21vdmV0byxjYW1sX2dyX3Jlc2l6ZV93aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgsY2FtbF9ncl9zZXRfdGV4dF9zaXplLGNhbWxfZ3Jfc2V0X2ZvbnRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9pbml0KCkge1xuICBjYW1sX2dyX21vdmV0byhjYW1sX2dyX3N0YXRlLngsIGNhbWxfZ3Jfc3RhdGUueSk7XG4gIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyhjYW1sX2dyX3N0YXRlLndpZHRoLCBjYW1sX2dyX3N0YXRlLmhlaWdodCk7XG4gIGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgoY2FtbF9ncl9zdGF0ZS5saW5lX3dpZHRoKTtcbiAgY2FtbF9ncl9zZXRfdGV4dF9zaXplKGNhbWxfZ3Jfc3RhdGUudGV4dF9zaXplKTtcbiAgY2FtbF9ncl9zZXRfZm9udChjYW1sX2dyX3N0YXRlLmZvbnQpO1xuICBjYW1sX2dyX3NldF9jb2xvcihjYW1sX2dyX3N0YXRlLmNvbG9yKTtcbiAgY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlKGNhbWxfZ3Jfc3RhdGUudGl0bGUpO1xuICAvL2NhbWxfZ3JfcmVzaXplX3dpbmRvdyBtaWdodCByZXNldCBzb21lIGNhbnZhcycgcHJvcGVydGllc1xuICBjYW1sX2dyX3N0YXRlLmNvbnRleHQudGV4dEJhc2VsaW5lID0gXCJib3R0b21cIjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfY3JlYXRlKGNhbnZhcywgdywgaCkge1xuICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjYW52YXM6IGNhbnZhcyxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHcsXG4gICAgaGVpZ2h0OiBoLFxuICAgIGxpbmVfd2lkdGg6IDEsXG4gICAgZm9udDogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcImZpeGVkXCIpLFxuICAgIHRleHRfc2l6ZTogMjYsXG4gICAgY29sb3I6IDB4MDAwMDAwLFxuICAgIHRpdGxlOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpLFxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RvY19vZl9zdGF0ZVxuZnVuY3Rpb24gY2FtbF9ncl9kb2Nfb2Zfc3RhdGUoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmNhbnZhcy5vd25lckRvY3VtZW50KSByZXR1cm4gc3RhdGUuY2FudmFzLm93bmVyRG9jdW1lbnQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xvc2VfZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2Nsb3NlX2dyYXBoKCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY2FudmFzLndpZHRoID0gMDtcbiAgcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUobmFtZSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMudGl0bGUgPSBuYW1lO1xuICB2YXIganNuYW1lID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIGlmIChzLnNldF90aXRsZSkgcy5zZXRfdGl0bGUoanNuYW1lKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcmVzaXplX3dpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyh3LCBoKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy53aWR0aCA9IHc7XG4gIHMuaGVpZ2h0ID0gaDtcbiAgaWYgKHcgIT09IHMuY2FudmFzLndpZHRoKSBzLmNhbnZhcy53aWR0aCA9IHc7XG4gIGlmIChoICE9PSBzLmNhbnZhcy5oZWlnaHQpIHMuY2FudmFzLmhlaWdodCA9IGg7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2NsZWFyX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jbGVhcl9ncmFwaCgpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHMuY2FudmFzLndpZHRoLCBzLmNhbnZhcy5oZWlnaHQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zaXplX3hcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NpemVfeCgpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy53aWR0aDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3koKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMuaGVpZ2h0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2NvbG9yKGNvbG9yKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgZnVuY3Rpb24gY29udmVydChudW1iZXIpIHtcbiAgICB2YXIgc3RyID0gXCJcIiArIG51bWJlci50b1N0cmluZygxNik7XG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCAyKSBzdHIgPSBcIjBcIiArIHN0cjtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHZhciByID0gKGNvbG9yID4+IDE2KSAmIDB4ZmYsXG4gICAgZyA9IChjb2xvciA+PiA4KSAmIDB4ZmYsXG4gICAgYiA9IChjb2xvciA+PiAwKSAmIDB4ZmY7XG4gIHMuY29sb3IgPSBjb2xvcjtcbiAgdmFyIGNfc3RyID0gXCIjXCIgKyBjb252ZXJ0KHIpICsgY29udmVydChnKSArIGNvbnZlcnQoYik7XG4gIHMuY29udGV4dC5maWxsU3R5bGUgPSBjX3N0cjtcbiAgcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gY19zdHI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9wbG90XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9wbG90KHgsIHkpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW0gPSBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKDEsIDEpO1xuICB2YXIgZCA9IGltLmRhdGE7XG4gIHZhciBjb2xvciA9IHMuY29sb3I7XG4gIGRbMF0gPSAoY29sb3IgPj4gMTYpICYgMHhmZjsgLy9yXG4gIChkWzFdID1cbiAgICAoY29sb3IgPj4gOCkgJlxuICAgIDB4ZmYpLCAvL2dcbiAgICAoZFsyXSA9IChjb2xvciA+PiAwKSAmIDB4ZmYpOyAvL2JcbiAgZFszXSA9IDB4ZmY7IC8vYVxuICBzLnggPSB4O1xuICBzLnkgPSB5O1xuICBzLmNvbnRleHQucHV0SW1hZ2VEYXRhKGltLCB4LCBzLmhlaWdodCAtIHkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9wb2ludF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcG9pbnRfY29sb3IoeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbSA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoeCwgcy5oZWlnaHQgLSB5LCAxLCAxKTtcbiAgdmFyIGQgPSBpbS5kYXRhO1xuICByZXR1cm4gKGRbMF0gPDwgMTYpICsgKGRbMV0gPDwgOCkgKyBkWzJdO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9tb3ZldG9cbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX21vdmV0byh4LCB5KSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy54ID0geDtcbiAgcy55ID0geTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF94XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3goKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3koKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfbGluZXRvXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9saW5ldG8oeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgcy5jb250ZXh0Lm1vdmVUbyhzLngsIHMuaGVpZ2h0IC0gcy55KTtcbiAgcy5jb250ZXh0LmxpbmVUbyh4LCBzLmhlaWdodCAtIHkpO1xuICBzLmNvbnRleHQuc3Ryb2tlKCk7XG4gIHMueCA9IHg7XG4gIHMueSA9IHk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X3JlY3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfcmVjdCh4LCB5LCB3LCBoKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LnN0cm9rZVJlY3QoeCwgcy5oZWlnaHQgLSB5LCB3LCAtaCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2FyY19hdXhcbmZ1bmN0aW9uIGNhbWxfZ3JfYXJjX2F1eChjdHgsIGN4LCBjeSwgcnksIHJ4LCBhMSwgYTIpIHtcbiAgd2hpbGUgKGExID4gYTIpIGEyICs9IDM2MDtcbiAgYTEgLz0gMTgwO1xuICBhMiAvPSAxODA7XG4gIHZhciByb3QgPSAwLFxuICAgIHhQb3MsXG4gICAgeVBvcyxcbiAgICB4UG9zX3ByZXYsXG4gICAgeVBvc19wcmV2O1xuICB2YXIgc3BhY2UgPSAyO1xuICB2YXIgbnVtID0gKCgoYTIgLSBhMSkgKiBNYXRoLlBJICogKChyeCArIHJ5KSAvIDIpKSAvIHNwYWNlKSB8IDA7XG4gIHZhciBkZWx0YSA9ICgoYTIgLSBhMSkgKiBNYXRoLlBJKSAvIG51bTtcbiAgdmFyIGkgPSBhMSAqIE1hdGguUEk7XG4gIGZvciAodmFyIGogPSAwOyBqIDw9IG51bTsgaisrKSB7XG4gICAgeFBvcyA9XG4gICAgICBjeCAtXG4gICAgICByeCAqIE1hdGguc2luKGkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgK1xuICAgICAgcnkgKiBNYXRoLmNvcyhpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHhQb3MgPSB4UG9zLnRvRml4ZWQoMik7XG4gICAgeVBvcyA9XG4gICAgICBjeSArXG4gICAgICByeSAqIE1hdGguY29zKGkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgK1xuICAgICAgcnggKiBNYXRoLnNpbihpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHlQb3MgPSB5UG9zLnRvRml4ZWQoMik7XG4gICAgaWYgKGogPT09IDApIHtcbiAgICAgIGN0eC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgfSBlbHNlIGlmICh4UG9zX3ByZXYgIT09IHhQb3MgfHwgeVBvc19wcmV2ICE9PSB5UG9zKSB7XG4gICAgICBjdHgubGluZVRvKHhQb3MsIHlQb3MpO1xuICAgIH1cbiAgICB4UG9zX3ByZXYgPSB4UG9zO1xuICAgIHlQb3NfcHJldiA9IHlQb3M7XG4gICAgaSAtPSBkZWx0YTsgLy9jY3dcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2FyYyh4LCB5LCByeCwgcnksIGExLCBhMikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCwgeCwgcy5oZWlnaHQgLSB5LCByeCwgcnksIGExLCBhMik7XG4gIHMuY29udGV4dC5zdHJva2UoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9saW5lX3dpZHRoKHcpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmxpbmVfd2lkdGggPSB3O1xuICBzLmNvbnRleHQubGluZVdpZHRoID0gdztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZmlsbF9yZWN0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX3JlY3QoeCwgeSwgdywgaCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5maWxsUmVjdCh4LCBzLmhlaWdodCAtIHksIHcsIC1oKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcG9seVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9wb2x5KGFyKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBzLmNvbnRleHQubW92ZVRvKGFyWzFdWzFdLCBzLmhlaWdodCAtIGFyWzFdWzJdKTtcbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhci5sZW5ndGg7IGkrKylcbiAgICBzLmNvbnRleHQubGluZVRvKGFyW2ldWzFdLCBzLmhlaWdodCAtIGFyW2ldWzJdKTtcbiAgcy5jb250ZXh0LmxpbmVUbyhhclsxXVsxXSwgcy5oZWlnaHQgLSBhclsxXVsyXSk7XG4gIHMuY29udGV4dC5maWxsKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfYXJjXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldCwgY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2ZpbGxfYXJjKHgsIHksIHJ4LCByeSwgYTEsIGEyKSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjYW1sX2dyX2FyY19hdXgocy5jb250ZXh0LCB4LCBzLmhlaWdodCAtIHksIHJ4LCByeSwgYTEsIGEyKTtcbiAgcy5jb250ZXh0LmZpbGwoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyKHN0cikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBtID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KHN0cik7XG4gIHZhciBkeCA9IG0ud2lkdGg7XG4gIHMuY29udGV4dC5maWxsVGV4dChzdHIsIHMueCwgcy5oZWlnaHQgLSBzLnkpO1xuICBzLnggKz0gZHggfCAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19jaGFyKGMpIHtcbiAgY2FtbF9ncl9kcmF3X3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyaW5nKHN0cikge1xuICBjYW1sX2dyX2RyYXdfc3RyKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN0cikpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfZm9udFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF9mb250KGYpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmZvbnQgPSBmO1xuICBzLmNvbnRleHQuZm9udCA9IHMudGV4dF9zaXplICsgXCJweCBcIiArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMuZm9udCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF90ZXh0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9zZXRfdGV4dF9zaXplKHNpemUpIHtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLnRleHRfc2l6ZSA9IHNpemU7XG4gIHMuY29udGV4dC5mb250ID0gcy50ZXh0X3NpemUgKyBcInB4IFwiICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocy5mb250KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3JfdGV4dF9zaXplKHR4dCkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciB3ID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHR4dCkpLndpZHRoO1xuICByZXR1cm4gWzAsIHcsIHMudGV4dF9zaXplXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9tYWtlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9tYWtlX2ltYWdlKGFycikge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBoID0gYXJyLmxlbmd0aCAtIDE7XG4gIHZhciB3ID0gYXJyWzFdLmxlbmd0aCAtIDE7XG4gIHZhciBpbSA9IHMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEodywgaCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB3OyBqKyspIHtcbiAgICAgIHZhciBjID0gYXJyW2kgKyAxXVtqICsgMV07XG4gICAgICB2YXIgbyA9IGkgKiAodyAqIDQpICsgaiAqIDQ7XG4gICAgICBpZiAoYyA9PT0gLTEpIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDJdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAoYyA+PiAxNikgJiAweGZmO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IChjID4+IDgpICYgMHhmZjtcbiAgICAgICAgaW0uZGF0YVtvICsgMl0gPSAoYyA+PiAwKSAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGltO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kdW1wX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kdW1wX2ltYWdlKGltKSB7XG4gIHZhciBkYXRhID0gWzBdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltLmhlaWdodDsgaSsrKSB7XG4gICAgZGF0YVtpICsgMV0gPSBbMF07XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbS53aWR0aDsgaisrKSB7XG4gICAgICB2YXIgbyA9IGkgKiAoaW0ud2lkdGggKiA0KSArIGogKiA0LFxuICAgICAgICByID0gaW0uZGF0YVtvICsgMF0sXG4gICAgICAgIGcgPSBpbS5kYXRhW28gKyAxXSxcbiAgICAgICAgYiA9IGltLmRhdGFbbyArIDJdO1xuICAgICAgZGF0YVtpICsgMV1baiArIDFdID0gKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19pbWFnZShpbSwgeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIGlmICghaW0uaW1hZ2UpIHtcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSBzLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBzLmhlaWdodDtcbiAgICBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLnB1dEltYWdlRGF0YShpbSwgMCwgMCk7XG4gICAgdmFyIGltYWdlID0gbmV3IGdsb2JhbFRoaXMuSW1hZ2UoKTtcbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzLmNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCB4LCBzLmhlaWdodCAtIGltLmhlaWdodCAtIHkpO1xuICAgICAgaW0uaW1hZ2UgPSBpbWFnZTtcbiAgICB9O1xuICAgIGltYWdlLnNyYyA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG4gIH0gZWxzZSB7XG4gICAgcy5jb250ZXh0LmRyYXdJbWFnZShpbS5pbWFnZSwgeCwgcy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3JlYXRlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jcmVhdGVfaW1hZ2UoeCwgeSkge1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHgsIHkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9ibGl0X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9ibGl0X2ltYWdlKGltLCB4LCB5KSB7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltMiA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoXG4gICAgeCxcbiAgICBzLmhlaWdodCAtIGltLmhlaWdodCAtIHksXG4gICAgaW0ud2lkdGgsXG4gICAgaW0uaGVpZ2h0LFxuICApO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltMi5kYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgaW0uZGF0YVtpXSA9IGltMi5kYXRhW2ldO1xuICAgIGltLmRhdGFbaSArIDFdID0gaW0yLmRhdGFbaSArIDFdO1xuICAgIGltLmRhdGFbaSArIDJdID0gaW0yLmRhdGFbaSArIDJdO1xuICAgIGltLmRhdGFbaSArIDNdID0gaW0yLmRhdGFbaSArIDNdO1xuICB9XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19oYW5kbGVyXG5mdW5jdGlvbiBjYW1sX2dyX3NpZ2lvX2hhbmRsZXIoKSB7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19zaWduYWxcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2lnaW9fc2lnbmFsKCkge1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2FpdF9ldmVudFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93YWl0X2V2ZW50KF9ldmwpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfd2FpdF9ldmVudCBub3QgSW1wbGVtZW50ZWQ6IHVzZSBHcmFwaGljc19qcyBpbnN0ZWFkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N5bmNocm9uaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3N5bmNocm9uaXplKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9zeW5jaHJvbml6ZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3JlbWVtYmVyX21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVtZW1iZXJfbW9kZSgpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3JfcmVtZW1iZXJfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Rpc3BsYXlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9kaXNwbGF5X21vZGUoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Rpc3BsYXlfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2luZG93X2lkXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3dpbmRvd19pZChfYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93aW5kb3dfaWQgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX29wZW5fc3Vid2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fc3Vid2luZG93KF9hLCBfYiwgX2MsIF9kKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX29wZW5fc3Vid2luZG93IG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93KF9hKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Nsb3NlX3N1YndpbmRvdyBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWI6IGNvZGUgc3BlY2lmaWMgdG8gSnNfb2Zfb2NhbWxcblxuLy9Qcm92aWRlczogY2FtbF9qc19odG1sX2VzY2FwZSBjb25zdCAoY29uc3QpXG52YXIgY2FtbF9qc19yZWdleHBzID0geyBhbXA6IC8mL2csIGx0OiAvPC9nLCBxdW90OiAvXCIvZywgYWxsOiAvWyY8XCJdLyB9O1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VzY2FwZShzKSB7XG4gIGlmICghY2FtbF9qc19yZWdleHBzLmFsbC50ZXN0KHMpKSByZXR1cm4gcztcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMuYW1wLCBcIiZhbXA7XCIpXG4gICAgLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLmx0LCBcIiZsdDtcIilcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMucXVvdCwgXCImcXVvdDtcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaHRtbF9lbnRpdGllc1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VudGl0aWVzKHMpIHtcbiAgdmFyIGVudGl0eSA9IC9eJiM/WzAtOWEtekEtWl0rOyQvO1xuICBpZiAocy5tYXRjaChlbnRpdHkpKSB7XG4gICAgdmFyIHN0cixcbiAgICAgIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICB0ZW1wLmlubmVySFRNTCA9IHM7XG4gICAgc3RyID0gdGVtcC50ZXh0Q29udGVudCB8fCB0ZW1wLmlubmVyVGV4dDtcbiAgICB0ZW1wID0gbnVsbDtcbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZ2V0X2NvbnNvbGUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfZ2V0X2NvbnNvbGUoKSB7XG4gIHZhciBjID0gY29uc29sZTtcbiAgdmFyIG0gPSBbXG4gICAgXCJsb2dcIixcbiAgICBcImRlYnVnXCIsXG4gICAgXCJpbmZvXCIsXG4gICAgXCJ3YXJuXCIsXG4gICAgXCJlcnJvclwiLFxuICAgIFwiYXNzZXJ0XCIsXG4gICAgXCJkaXJcIixcbiAgICBcImRpcnhtbFwiLFxuICAgIFwidHJhY2VcIixcbiAgICBcImdyb3VwXCIsXG4gICAgXCJncm91cENvbGxhcHNlZFwiLFxuICAgIFwiZ3JvdXBFbmRcIixcbiAgICBcInRpbWVcIixcbiAgICBcInRpbWVFbmRcIixcbiAgXTtcbiAgZnVuY3Rpb24gZigpIHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgaWYgKCFjW21baV1dKSBjW21baV1dID0gZjtcbiAgcmV0dXJuIGM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlKF91bml0KSB7XG4gIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZVwiKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FtbF9mYWlsd2l0aChcIkZhaWxlZCB0byBjcmVhdGUgWE1MSHR0cFJlcXVlc3RcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uKGV4bikge1xuICBpZiAoZXhuLmpzX2Vycm9yKSB7XG4gICAgcmV0dXJuIGV4bi5qc19lcnJvcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKi9cbi8qICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKi9cbi8qICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2l0aCAgICAgKi9cbi8qICB0aGUgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmlsZSAuLi9MSUNFTlNFLiAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogJElkOiBsZXhpbmcuYyA2MDQ1IDIwMDQtMDEtMDEgMTY6NDI6NDNaIGRvbGlnZXogJCAqL1xuXG4vKiBUaGUgdGFibGUtZHJpdmVuIGF1dG9tYXRvbiBmb3IgbGV4ZXJzIGdlbmVyYXRlZCBieSBjYW1sbGV4LiAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9sZXhfYXJyYXkocykge1xuICBzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKTtcbiAgdmFyIGwgPSBzLmxlbmd0aCAvIDI7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICBhW2ldID0gKChzLmNoYXJDb2RlQXQoMiAqIGkpIHwgKHMuY2hhckNvZGVBdCgyICogaSArIDEpIDw8IDgpKSA8PCAxNikgPj4gMTY7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfbGV4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfbGV4X2VuZ2luZSh0YmwsIHN0YXJ0X3N0YXRlLCBsZXhidWYpIHtcbiAgdmFyIGxleF9idWZmZXIgPSAyO1xuICB2YXIgbGV4X2J1ZmZlcl9sZW4gPSAzO1xuICB2YXIgbGV4X3N0YXJ0X3BvcyA9IDU7XG4gIHZhciBsZXhfY3Vycl9wb3MgPSA2O1xuICB2YXIgbGV4X2xhc3RfcG9zID0gNztcbiAgdmFyIGxleF9sYXN0X2FjdGlvbiA9IDg7XG4gIHZhciBsZXhfZW9mX3JlYWNoZWQgPSA5O1xuICB2YXIgbGV4X2Jhc2UgPSAxO1xuICB2YXIgbGV4X2JhY2t0cmsgPSAyO1xuICB2YXIgbGV4X2RlZmF1bHQgPSAzO1xuICB2YXIgbGV4X3RyYW5zID0gNDtcbiAgdmFyIGxleF9jaGVjayA9IDU7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cblxuICB2YXIgYyxcbiAgICBzdGF0ZSA9IHN0YXJ0X3N0YXRlO1xuXG4gIHZhciBidWZmZXIgPSBsZXhidWZbbGV4X2J1ZmZlcl07XG5cbiAgaWYgKHN0YXRlID49IDApIHtcbiAgICAvKiBGaXJzdCBlbnRyeSAqL1xuICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9zdGFydF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSAtMTtcbiAgfSBlbHNlIHtcbiAgICAvKiBSZWVudHJ5IGFmdGVyIHJlZmlsbCAqL1xuICAgIHN0YXRlID0gLXN0YXRlIC0gMTtcbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgLyogTG9va3VwIGJhc2UgYWRkcmVzcyBvciBhY3Rpb24gbnVtYmVyIGZvciBjdXJyZW50IHN0YXRlICovXG4gICAgdmFyIGJhc2UgPSB0YmwubGV4X2Jhc2Vbc3RhdGVdO1xuICAgIGlmIChiYXNlIDwgMCkgcmV0dXJuIC1iYXNlIC0gMTtcbiAgICAvKiBTZWUgaWYgaXQncyBhIGJhY2t0cmFjayBwb2ludCAqL1xuICAgIHZhciBiYWNrdHJrID0gdGJsLmxleF9iYWNrdHJrW3N0YXRlXTtcbiAgICBpZiAoYmFja3RyayA+PSAwKSB7XG4gICAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSBiYWNrdHJrO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgd2UgbmVlZCBhIHJlZmlsbCAqL1xuICAgIGlmIChsZXhidWZbbGV4X2N1cnJfcG9zXSA+PSBsZXhidWZbbGV4X2J1ZmZlcl9sZW5dKSB7XG4gICAgICBpZiAobGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPT09IDApIHJldHVybiAtc3RhdGUgLSAxO1xuICAgICAgZWxzZSBjID0gMjU2O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBSZWFkIG5leHQgaW5wdXQgY2hhciAqL1xuICAgICAgYyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldChidWZmZXIsIGxleGJ1ZltsZXhfY3Vycl9wb3NdKTtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdKys7XG4gICAgfVxuICAgIC8qIERldGVybWluZSBuZXh0IHN0YXRlICovXG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09PSBzdGF0ZSkgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlIHN0YXRlID0gdGJsLmxleF9kZWZhdWx0W3N0YXRlXTtcbiAgICAvKiBJZiBubyB0cmFuc2l0aW9uIG9uIHRoaXMgY2hhciwgcmV0dXJuIHRvIGxhc3QgYmFja3RyYWNrIHBvaW50ICovXG4gICAgaWYgKHN0YXRlIDwgMCkge1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gPSBsZXhidWZbbGV4X2xhc3RfcG9zXTtcbiAgICAgIGlmIChsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9PT0gLTEpIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZSByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogTmV3IGxleGVyIGVuZ2luZSwgd2l0aCBtZW1vcnkgb2YgcG9zaXRpb25zICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX25ld19sZXhfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0XG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fbWVtKHMsIGksIG1lbSwgY3Vycl9wb3MpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBkc3QgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaSsrO1xuICAgIGlmIChkc3QgPT09IDB4ZmYpIHJldHVybjtcbiAgICB2YXIgc3JjID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGkrKztcbiAgICBpZiAoc3JjID09PSAweGZmKSBtZW1bZHN0ICsgMV0gPSBjdXJyX3BvcztcbiAgICBlbHNlIG1lbVtkc3QgKyAxXSA9IG1lbVtzcmMgKyAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fdGFnKHMsIGksIG1lbSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGRzdCA9IHMuY2hhckNvZGVBdChpKTtcbiAgICBpKys7XG4gICAgaWYgKGRzdCA9PT0gMHhmZikgcmV0dXJuO1xuICAgIHZhciBzcmMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaSsrO1xuICAgIGlmIChzcmMgPT09IDB4ZmYpIG1lbVtkc3QgKyAxXSA9IC0xO1xuICAgIGVsc2UgbWVtW2RzdCArIDFdID0gbWVtW3NyYyArIDFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbWxfbmV3X2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9tZW0gPSAxMDtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuICB2YXIgbGV4X2Jhc2VfY29kZSA9IDY7XG4gIHZhciBsZXhfYmFja3Rya19jb2RlID0gNztcbiAgdmFyIGxleF9kZWZhdWx0X2NvZGUgPSA4O1xuICB2YXIgbGV4X3RyYW5zX2NvZGUgPSA5O1xuICB2YXIgbGV4X2NoZWNrX2NvZGUgPSAxMDtcbiAgdmFyIGxleF9jb2RlID0gMTE7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHRfY29kZSkge1xuICAgIHRibC5sZXhfYmFzZV9jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9iYXNlX2NvZGVdKTtcbiAgICB0YmwubGV4X2JhY2t0cmtfY29kZSA9IGNhbWxfbGV4X2FycmF5KHRibFtsZXhfYmFja3Rya19jb2RlXSk7XG4gICAgdGJsLmxleF9jaGVja19jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF9jaGVja19jb2RlXSk7XG4gICAgdGJsLmxleF90cmFuc19jb2RlID0gY2FtbF9sZXhfYXJyYXkodGJsW2xleF90cmFuc19jb2RlXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0X2NvZGUgPSBjYW1sX2xleF9hcnJheSh0YmxbbGV4X2RlZmF1bHRfY29kZV0pO1xuICB9XG4gIGlmICh0YmwubGV4X2NvZGUgPT0gbnVsbClcbiAgICB0YmwubGV4X2NvZGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRibFtsZXhfY29kZV0pO1xuXG4gIHZhciBjLFxuICAgIHN0YXRlID0gc3RhcnRfc3RhdGU7XG5cbiAgdmFyIGJ1ZmZlciA9IGxleGJ1ZltsZXhfYnVmZmVyXTtcblxuICBpZiAoc3RhdGUgPj0gMCkge1xuICAgIC8qIEZpcnN0IGVudHJ5ICovXG4gICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X3N0YXJ0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIC8qIFJlZW50cnkgYWZ0ZXIgcmVmaWxsICovXG4gICAgc3RhdGUgPSAtc3RhdGUgLSAxO1xuICB9XG4gIGZvciAoOzspIHtcbiAgICAvKiBMb29rdXAgYmFzZSBhZGRyZXNzIG9yIGFjdGlvbiBudW1iZXIgZm9yIGN1cnJlbnQgc3RhdGUgKi9cbiAgICB2YXIgYmFzZSA9IHRibC5sZXhfYmFzZVtzdGF0ZV07XG4gICAgaWYgKGJhc2UgPCAwKSB7XG4gICAgICB2YXIgcGNfb2ZmID0gdGJsLmxleF9iYXNlX2NvZGVbc3RhdGVdO1xuICAgICAgY2FtbF9sZXhfcnVuX3RhZyh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dKTtcbiAgICAgIHJldHVybiAtYmFzZSAtIDE7XG4gICAgfVxuICAgIC8qIFNlZSBpZiBpdCdzIGEgYmFja3RyYWNrIHBvaW50ICovXG4gICAgdmFyIGJhY2t0cmsgPSB0YmwubGV4X2JhY2t0cmtbc3RhdGVdO1xuICAgIGlmIChiYWNrdHJrID49IDApIHtcbiAgICAgIHZhciBwY19vZmYgPSB0YmwubGV4X2JhY2t0cmtfY29kZVtzdGF0ZV07XG4gICAgICBjYW1sX2xleF9ydW5fdGFnKHRibC5sZXhfY29kZSwgcGNfb2ZmLCBsZXhidWZbbGV4X21lbV0pO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gYmFja3RyaztcbiAgICB9XG4gICAgLyogU2VlIGlmIHdlIG5lZWQgYSByZWZpbGwgKi9cbiAgICBpZiAobGV4YnVmW2xleF9jdXJyX3Bvc10gPj0gbGV4YnVmW2xleF9idWZmZXJfbGVuXSkge1xuICAgICAgaWYgKGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID09PSAwKSByZXR1cm4gLXN0YXRlIC0gMTtcbiAgICAgIGVsc2UgYyA9IDI1NjtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogUmVhZCBuZXh0IGlucHV0IGNoYXIgKi9cbiAgICAgIGMgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQoYnVmZmVyLCBsZXhidWZbbGV4X2N1cnJfcG9zXSk7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSsrO1xuICAgIH1cbiAgICAvKiBEZXRlcm1pbmUgbmV4dCBzdGF0ZSAqL1xuICAgIHZhciBwc3RhdGUgPSBzdGF0ZTtcbiAgICBpZiAodGJsLmxleF9jaGVja1tiYXNlICsgY10gPT09IHN0YXRlKSBzdGF0ZSA9IHRibC5sZXhfdHJhbnNbYmFzZSArIGNdO1xuICAgIGVsc2Ugc3RhdGUgPSB0YmwubGV4X2RlZmF1bHRbc3RhdGVdO1xuICAgIC8qIElmIG5vIHRyYW5zaXRpb24gb24gdGhpcyBjaGFyLCByZXR1cm4gdG8gbGFzdCBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICBpZiAoc3RhdGUgPCAwKSB7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSA9IGxleGJ1ZltsZXhfbGFzdF9wb3NdO1xuICAgICAgaWYgKGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID09PSAtMSkgY2FtbF9mYWlsd2l0aChcImxleGluZzogZW1wdHkgdG9rZW5cIik7XG4gICAgICBlbHNlIHJldHVybiBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogSWYgc29tZSB0cmFuc2l0aW9uLCBnZXQgYW5kIHBlcmZvcm0gbWVtb3J5IG1vdmVzICovXG4gICAgICB2YXIgYmFzZV9jb2RlID0gdGJsLmxleF9iYXNlX2NvZGVbcHN0YXRlXSxcbiAgICAgICAgcGNfb2ZmO1xuICAgICAgaWYgKHRibC5sZXhfY2hlY2tfY29kZVtiYXNlX2NvZGUgKyBjXSA9PT0gcHN0YXRlKVxuICAgICAgICBwY19vZmYgPSB0YmwubGV4X3RyYW5zX2NvZGVbYmFzZV9jb2RlICsgY107XG4gICAgICBlbHNlIHBjX29mZiA9IHRibC5sZXhfZGVmYXVsdF9jb2RlW3BzdGF0ZV07XG4gICAgICBpZiAocGNfb2ZmID4gMClcbiAgICAgICAgY2FtbF9sZXhfcnVuX21lbShcbiAgICAgICAgICB0YmwubGV4X2NvZGUsXG4gICAgICAgICAgcGNfb2ZmLFxuICAgICAgICAgIGxleGJ1ZltsZXhfbWVtXSxcbiAgICAgICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSxcbiAgICAgICAgKTtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfbHhtX01cbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1XG52YXIgY2FtbF9seG1fTSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKFxuICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIjB4ZDEzNDI1NDNkZTgyZWY5NVwiKSxcbik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbHhtX2RhYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9WZXJzaW9uOiA+PSA1XG52YXIgY2FtbF9seG1fZGFiYSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKFxuICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIjB4ZGFiYTBiNmViMDkzMjJlM1wiKSxcbik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbHhtX25leHQgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3hvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9hZGRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbXVsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2x4bV9NXG4vL1JlcXVpcmVzOiBjYW1sX2x4bV9kYWJhXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfbHhtX25leHQodikge1xuICBmdW5jdGlvbiBzaGlmdF9sKHgsIGspIHtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0KHgsIGspO1xuICB9XG4gIGZ1bmN0aW9uIHNoaWZ0X3IoeCwgaykge1xuICAgIHJldHVybiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIGspO1xuICB9XG4gIGZ1bmN0aW9uIG9yKGEsIGIpIHtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9vcihhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiB4b3IoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X3hvcihhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBhZGQoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X2FkZChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBtdWwoYSwgYikge1xuICAgIHJldHVybiBjYW1sX2ludDY0X211bChhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiByb3RsKHgsIGspIHtcbiAgICByZXR1cm4gb3Ioc2hpZnRfbCh4LCBrKSwgc2hpZnRfcih4LCA2NCAtIGspKTtcbiAgfVxuICBmdW5jdGlvbiBnZXQoYSwgaSkge1xuICAgIHJldHVybiBjYW1sX2JhX2dldF8xKGEsIGkpO1xuICB9XG4gIGZ1bmN0aW9uIHNldChhLCBpLCB4KSB7XG4gICAgcmV0dXJuIGNhbWxfYmFfc2V0XzEoYSwgaSwgeCk7XG4gIH1cbiAgdmFyIE0gPSBjYW1sX2x4bV9NO1xuICB2YXIgZGFiYSA9IGNhbWxfbHhtX2RhYmE7XG4gIHZhciB6LCBxMCwgcTE7XG4gIHZhciBzdCA9IHY7XG4gIHZhciBhID0gZ2V0KHN0LCAwKTtcbiAgdmFyIHMgPSBnZXQoc3QsIDEpO1xuICB2YXIgeDAgPSBnZXQoc3QsIDIpO1xuICB2YXIgeDEgPSBnZXQoc3QsIDMpO1xuICAvKiBDb21iaW5pbmcgb3BlcmF0aW9uICovXG4gIHogPSBhZGQocywgeDApO1xuICAvKiBNaXhpbmcgZnVuY3Rpb24gKi9cbiAgeiA9IG11bCh4b3Ioeiwgc2hpZnRfcih6LCAzMikpLCBkYWJhKTtcbiAgeiA9IG11bCh4b3Ioeiwgc2hpZnRfcih6LCAzMikpLCBkYWJhKTtcbiAgeiA9IHhvcih6LCBzaGlmdF9yKHosIDMyKSk7XG4gIC8qIExDRyB1cGRhdGUgKi9cbiAgc2V0KHN0LCAxLCBhZGQobXVsKHMsIE0pLCBhKSk7XG4gIC8qIFhCRyB1cGRhdGUgKi9cbiAgdmFyIHEwID0geDA7XG4gIHZhciBxMSA9IHgxO1xuICBxMSA9IHhvcihxMSwgcTApO1xuICBxMCA9IHJvdGwocTAsIDI0KTtcbiAgcTAgPSB4b3IoeG9yKHEwLCBxMSksIHNoaWZ0X2wocTEsIDE2KSk7XG4gIHExID0gcm90bChxMSwgMzcpO1xuICBzZXQoc3QsIDIsIHEwKTtcbiAgc2V0KHN0LCAzLCBxMSk7XG4gIC8qIFJldHVybiByZXN1bHQgKi9cbiAgcmV0dXJuIHo7XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICovXG4vKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICovXG4vKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdpdGggICAgICovXG4vKiAgdGhlIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZpbGUgLi4vTElDRU5TRS4gICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qICRJZDogcGFyc2luZy5jIDg5ODMgMjAwOC0wOC0wNiAwOTozODoyNVogeGxlcm95ICQgKi9cblxuLyogVGhlIFBEQSBhdXRvbWF0b24gZm9yIHBhcnNlcnMgZ2VuZXJhdGVkIGJ5IGNhbWx5YWNjICovXG5cbi8qIFRoZSBwdXNoZG93biBhdXRvbWF0YSAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlcl90cmFjZVxudmFyIGNhbWxfcGFyc2VyX3RyYWNlID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfbGV4X2FycmF5LCBjYW1sX3BhcnNlcl90cmFjZSxjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXQsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfZmRzXG5mdW5jdGlvbiBjYW1sX3BhcnNlX2VuZ2luZSh0YWJsZXMsIGVudiwgY21kLCBhcmcpIHtcbiAgdmFyIEVSUkNPREUgPSAyNTY7XG5cbiAgLy92YXIgU1RBUlQgPSAwO1xuICAvL3ZhciBUT0tFTl9SRUFEID0gMTtcbiAgLy92YXIgU1RBQ0tTX0dST1dOXzEgPSAyO1xuICAvL3ZhciBTVEFDS1NfR1JPV05fMiA9IDM7XG4gIC8vdmFyIFNFTUFOVElDX0FDVElPTl9DT01QVVRFRCA9IDQ7XG4gIC8vdmFyIEVSUk9SX0RFVEVDVEVEID0gNTtcbiAgdmFyIGxvb3AgPSA2O1xuICB2YXIgdGVzdHNoaWZ0ID0gNztcbiAgdmFyIHNoaWZ0ID0gODtcbiAgdmFyIHNoaWZ0X3JlY292ZXIgPSA5O1xuICB2YXIgcmVkdWNlID0gMTA7XG5cbiAgdmFyIFJFQURfVE9LRU4gPSAwO1xuICB2YXIgUkFJU0VfUEFSU0VfRVJST1IgPSAxO1xuICB2YXIgR1JPV19TVEFDS1NfMSA9IDI7XG4gIHZhciBHUk9XX1NUQUNLU18yID0gMztcbiAgdmFyIENPTVBVVEVfU0VNQU5USUNfQUNUSU9OID0gNDtcbiAgdmFyIENBTExfRVJST1JfRlVOQ1RJT04gPSA1O1xuXG4gIHZhciBlbnZfc19zdGFjayA9IDE7XG4gIHZhciBlbnZfdl9zdGFjayA9IDI7XG4gIHZhciBlbnZfc3ltYl9zdGFydF9zdGFjayA9IDM7XG4gIHZhciBlbnZfc3ltYl9lbmRfc3RhY2sgPSA0O1xuICB2YXIgZW52X3N0YWNrc2l6ZSA9IDU7XG4gIHZhciBlbnZfc3RhY2tiYXNlID0gNjtcbiAgdmFyIGVudl9jdXJyX2NoYXIgPSA3O1xuICB2YXIgZW52X2x2YWwgPSA4O1xuICB2YXIgZW52X3N5bWJfc3RhcnQgPSA5O1xuICB2YXIgZW52X3N5bWJfZW5kID0gMTA7XG4gIHZhciBlbnZfYXNwID0gMTE7XG4gIHZhciBlbnZfcnVsZV9sZW4gPSAxMjtcbiAgdmFyIGVudl9ydWxlX251bWJlciA9IDEzO1xuICB2YXIgZW52X3NwID0gMTQ7XG4gIHZhciBlbnZfc3RhdGUgPSAxNTtcbiAgdmFyIGVudl9lcnJmbGFnID0gMTY7XG5cbiAgLy8gdmFyIF90YmxfYWN0aW9ucyA9IDE7XG4gIHZhciB0YmxfdHJhbnNsX2NvbnN0ID0gMjtcbiAgdmFyIHRibF90cmFuc2xfYmxvY2sgPSAzO1xuICB2YXIgdGJsX2xocyA9IDQ7XG4gIHZhciB0YmxfbGVuID0gNTtcbiAgdmFyIHRibF9kZWZyZWQgPSA2O1xuICB2YXIgdGJsX2Rnb3RvID0gNztcbiAgdmFyIHRibF9zaW5kZXggPSA4O1xuICB2YXIgdGJsX3JpbmRleCA9IDk7XG4gIHZhciB0YmxfZ2luZGV4ID0gMTA7XG4gIHZhciB0YmxfdGFibGVzaXplID0gMTE7XG4gIHZhciB0YmxfdGFibGUgPSAxMjtcbiAgdmFyIHRibF9jaGVjayA9IDEzO1xuICAvLyB2YXIgX3RibF9lcnJvcl9mdW5jdGlvbiA9IDE0O1xuICB2YXIgdGJsX25hbWVzX2NvbnN0ID0gMTU7XG4gIHZhciB0YmxfbmFtZXNfYmxvY2sgPSAxNjtcblxuICBmdW5jdGlvbiBsb2coeCkge1xuICAgIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh4ICsgXCJcXG5cIik7XG4gICAgY2FtbF9tbF9vdXRwdXQoY2FtbF9zeXNfZmRzWzJdLmNoYW5pZCwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuX25hbWUobmFtZXMsIG51bWJlcikge1xuICAgIHZhciBzdHIgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lcyk7XG4gICAgaWYgKHN0clswXSA9PT0gXCJcXHgwMFwiKSByZXR1cm4gXCI8dW5rbm93biB0b2tlbj5cIjtcbiAgICByZXR1cm4gc3RyLnNwbGl0KFwiXFx4MDBcIilbbnVtYmVyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50X3Rva2VuKHN0YXRlLCB0b2spIHtcbiAgICB2YXIgdG9rZW4sIGtpbmQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodG9rKSkge1xuICAgICAgdG9rZW4gPSB0b2tlbl9uYW1lKHRhYmxlc1t0YmxfbmFtZXNfYmxvY2tdLCB0b2tbMF0pO1xuICAgICAgaWYgKHR5cGVvZiB0b2tbMV0gPT09IFwibnVtYmVyXCIpIGtpbmQgPSBcIlwiICsgdG9rWzFdO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHRva1sxXSA9PT0gXCJzdHJpbmdcIikga2luZCA9IHRva1sxXTtcbiAgICAgIGVsc2UgaWYgKHRva1sxXSBpbnN0YW5jZW9mIE1sQnl0ZXMpIGtpbmQgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRva1sxXSk7XG4gICAgICBlbHNlIGtpbmQgPSBcIl9cIjtcbiAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogcmVhZCB0b2tlbiBcIiArIHRva2VuICsgXCIoXCIgKyBraW5kICsgXCIpXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbiA9IHRva2VuX25hbWUodGFibGVzW3RibF9uYW1lc19jb25zdF0sIHRvayk7XG4gICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlYWQgdG9rZW4gXCIgKyB0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YWJsZXMuZGdvdG8pIHtcbiAgICB0YWJsZXMuZGVmcmVkID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF9kZWZyZWRdKTtcbiAgICB0YWJsZXMuc2luZGV4ID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF9zaW5kZXhdKTtcbiAgICB0YWJsZXMuY2hlY2sgPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2NoZWNrXSk7XG4gICAgdGFibGVzLnJpbmRleCA9IGNhbWxfbGV4X2FycmF5KHRhYmxlc1t0YmxfcmluZGV4XSk7XG4gICAgdGFibGVzLnRhYmxlID0gY2FtbF9sZXhfYXJyYXkodGFibGVzW3RibF90YWJsZV0pO1xuICAgIHRhYmxlcy5sZW4gPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2xlbl0pO1xuICAgIHRhYmxlcy5saHMgPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2xoc10pO1xuICAgIHRhYmxlcy5naW5kZXggPSBjYW1sX2xleF9hcnJheSh0YWJsZXNbdGJsX2dpbmRleF0pO1xuICAgIHRhYmxlcy5kZ290byA9IGNhbWxfbGV4X2FycmF5KHRhYmxlc1t0YmxfZGdvdG9dKTtcbiAgfVxuXG4gIHZhciByZXMgPSAwLFxuICAgIG4sXG4gICAgbjEsXG4gICAgbjIsXG4gICAgc3RhdGUxO1xuXG4gIC8vIFJFU1RPUkVcbiAgdmFyIHNwID0gZW52W2Vudl9zcF07XG4gIHZhciBzdGF0ZSA9IGVudltlbnZfc3RhdGVdO1xuICB2YXIgZXJyZmxhZyA9IGVudltlbnZfZXJyZmxhZ107XG5cbiAgdGhlX2xvb3A6IGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGNtZCkge1xuICAgICAgY2FzZSAwOiAvL1NUQVJUOlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgZXJyZmxhZyA9IDA7XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIDY6IC8vbG9vcDpcbiAgICAgICAgbiA9IHRhYmxlcy5kZWZyZWRbc3RhdGVdO1xuICAgICAgICBpZiAobiAhPT0gMCkge1xuICAgICAgICAgIGNtZCA9IHJlZHVjZTtcbiAgICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID49IDApIHtcbiAgICAgICAgICBjbWQgPSB0ZXN0c2hpZnQ7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gUkVBRF9UT0tFTjtcbiAgICAgICAgYnJlYWsgdGhlX2xvb3A7XG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgbGV4ZXIgYW5kIHVwZGF0ZXMgKi9cbiAgICAgIC8qIHN5bWJfc3RhcnQgYW5kIHN5bWJfZW5kICovXG4gICAgICBjYXNlIDE6IC8vVE9LRU5fUkVBRDpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfYmxvY2tdW2FyZ1swXSArIDFdO1xuICAgICAgICAgIGVudltlbnZfbHZhbF0gPSBhcmdbMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfY29uc3RdW2FyZyArIDFdO1xuICAgICAgICAgIGVudltlbnZfbHZhbF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgcHJpbnRfdG9rZW4oc3RhdGUsIGFyZyk7XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIDc6IC8vdGVzdHNoaWZ0OlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRmFsbHRocm91Z2hTd2l0Y2hDbGF1c2U6XG4gICAgICAgIG4xID0gdGFibGVzLnNpbmRleFtzdGF0ZV07XG4gICAgICAgIG4yID0gbjEgKyBlbnZbZW52X2N1cnJfY2hhcl07XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuMSAhPT0gMCAmJlxuICAgICAgICAgIG4yID49IDAgJiZcbiAgICAgICAgICBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09PSBlbnZbZW52X2N1cnJfY2hhcl1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY21kID0gc2hpZnQ7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgbjEgPSB0YWJsZXMucmluZGV4W3N0YXRlXTtcbiAgICAgICAgbjIgPSBuMSArIGVudltlbnZfY3Vycl9jaGFyXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG4xICE9PSAwICYmXG4gICAgICAgICAgbjIgPj0gMCAmJlxuICAgICAgICAgIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT09IGVudltlbnZfY3Vycl9jaGFyXVxuICAgICAgICApIHtcbiAgICAgICAgICBuID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgICAgICBjbWQgPSByZWR1Y2U7XG4gICAgICAgICAgY29udGludWUgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycmZsYWcgPD0gMCkge1xuICAgICAgICAgIHJlcyA9IENBTExfRVJST1JfRlVOQ1RJT047XG4gICAgICAgICAgYnJlYWsgdGhlX2xvb3A7XG4gICAgICAgIH1cbiAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgZXJyb3IgZnVuY3Rpb24gKi9cbiAgICAgIGNhc2UgNTogLy9FUlJPUl9ERVRFQ1RFRDpcbiAgICAgICAgaWYgKGVycmZsYWcgPCAzKSB7XG4gICAgICAgICAgZXJyZmxhZyA9IDM7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgc3RhdGUxID0gZW52W2Vudl9zX3N0YWNrXVtzcCArIDFdO1xuICAgICAgICAgICAgbjEgPSB0YWJsZXMuc2luZGV4W3N0YXRlMV07XG4gICAgICAgICAgICBuMiA9IG4xICsgRVJSQ09ERTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbjEgIT09IDAgJiZcbiAgICAgICAgICAgICAgbjIgPj0gMCAmJlxuICAgICAgICAgICAgICBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PT0gRVJSQ09ERVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiUmVjb3ZlcmluZyBpbiBzdGF0ZSBcIiArIHN0YXRlMSk7XG4gICAgICAgICAgICAgIGNtZCA9IHNoaWZ0X3JlY292ZXI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIHRoZV9sb29wO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBsb2coXCJEaXNjYXJkaW5nIHN0YXRlIFwiICsgc3RhdGUxKTtcbiAgICAgICAgICAgICAgaWYgKHNwIDw9IGVudltlbnZfc3RhY2tiYXNlXSkge1xuICAgICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiTm8gbW9yZSBzdGF0ZXMgdG8gZGlzY2FyZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLyogVGhlIE1MIGNvZGUgcmFpc2VzIFBhcnNlX2Vycm9yICovXG4gICAgICAgICAgICAgIHNwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbnZbZW52X2N1cnJfY2hhcl0gPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7IC8qIFRoZSBNTCBjb2RlIHJhaXNlcyBQYXJzZV9lcnJvciAqL1xuICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgbG9nKFwiRGlzY2FyZGluZyBsYXN0IHRva2VuIHJlYWRcIik7XG4gICAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gLTE7XG4gICAgICAgICAgY21kID0gbG9vcDtcbiAgICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgLy8gVW5yZWFjaGFibGVcbiAgICAgIGNhc2UgODogLy9zaGlmdDpcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOlxuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSAtMTtcbiAgICAgICAgaWYgKGVycmZsYWcgPiAwKSBlcnJmbGFnLS07XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgY2FzZSA5OiAvL3NoaWZ0X3JlY292ZXI6XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogc2hpZnQgdG8gc3RhdGUgXCIgKyB0YWJsZXMudGFibGVbbjJdKTtcbiAgICAgICAgc3RhdGUgPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgICBzcCsrO1xuICAgICAgICBpZiAoc3AgPj0gZW52W2Vudl9zdGFja3NpemVdKSB7XG4gICAgICAgICAgcmVzID0gR1JPV19TVEFDS1NfMTtcbiAgICAgICAgICBicmVhayB0aGVfbG9vcDtcbiAgICAgICAgfVxuICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIHJlc2l6ZXMgdGhlIHN0YWNrcyAqL1xuICAgICAgY2FzZSAyOiAvL1NUQUNLU19HUk9XTl8xOlxuICAgICAgICBlbnZbZW52X3Nfc3RhY2tdW3NwICsgMV0gPSBzdGF0ZTtcbiAgICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9sdmFsXTtcbiAgICAgICAgZW52W2Vudl9zeW1iX3N0YXJ0X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX3N0YXJ0XTtcbiAgICAgICAgZW52W2Vudl9zeW1iX2VuZF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9lbmRdO1xuICAgICAgICBjbWQgPSBsb29wO1xuICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcblxuICAgICAgY2FzZSAxMDogLy9yZWR1Y2U6XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9GYWxsdGhyb3VnaFN3aXRjaENsYXVzZTpcbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlZHVjZSBieSBydWxlIFwiICsgbik7XG4gICAgICAgIHZhciBtID0gdGFibGVzLmxlbltuXTtcbiAgICAgICAgZW52W2Vudl9hc3BdID0gc3A7XG4gICAgICAgIGVudltlbnZfcnVsZV9udW1iZXJdID0gbjtcbiAgICAgICAgZW52W2Vudl9ydWxlX2xlbl0gPSBtO1xuICAgICAgICBzcCA9IHNwIC0gbSArIDE7XG4gICAgICAgIG0gPSB0YWJsZXMubGhzW25dO1xuICAgICAgICBzdGF0ZTEgPSBlbnZbZW52X3Nfc3RhY2tdW3NwXTtcbiAgICAgICAgbjEgPSB0YWJsZXMuZ2luZGV4W21dO1xuICAgICAgICBuMiA9IG4xICsgc3RhdGUxO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbjEgIT09IDAgJiZcbiAgICAgICAgICBuMiA+PSAwICYmXG4gICAgICAgICAgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PT0gc3RhdGUxXG4gICAgICAgIClcbiAgICAgICAgICBzdGF0ZSA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICAgIGVsc2Ugc3RhdGUgPSB0YWJsZXMuZGdvdG9bbV07XG4gICAgICAgIGlmIChzcCA+PSBlbnZbZW52X3N0YWNrc2l6ZV0pIHtcbiAgICAgICAgICByZXMgPSBHUk9XX1NUQUNLU18yO1xuICAgICAgICAgIGJyZWFrIHRoZV9sb29wO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgLyogVGhlIE1MIGNvZGUgcmVzaXplcyB0aGUgc3RhY2tzICovXG4gICAgICBjYXNlIDM6IC8vU1RBQ0tTX0dST1dOXzI6XG4gICAgICAgIHJlcyA9IENPTVBVVEVfU0VNQU5USUNfQUNUSU9OO1xuICAgICAgICBicmVhayB0aGVfbG9vcDtcbiAgICAgIC8qIFRoZSBNTCBjb2RlIGNhbGxzIHRoZSBzZW1hbnRpYyBhY3Rpb24gKi9cbiAgICAgIGNhc2UgNDogLy9TRU1BTlRJQ19BQ1RJT05fQ09NUFVURUQ6XG4gICAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgICBlbnZbZW52X3Zfc3RhY2tdW3NwICsgMV0gPSBhcmc7XG4gICAgICAgIHZhciBhc3AgPSBlbnZbZW52X2FzcF07XG4gICAgICAgIGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgICAgaWYgKHNwID4gYXNwKSB7XG4gICAgICAgICAgLyogVGhpcyBpcyBhbiBlcHNpbG9uIHByb2R1Y3Rpb24uIFRha2Ugc3ltYl9zdGFydCBlcXVhbCB0byBzeW1iX2VuZC4gKi9cbiAgICAgICAgICBlbnZbZW52X3N5bWJfc3RhcnRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBjbWQgPSBsb29wO1xuICAgICAgICBjb250aW51ZSB0aGVfbG9vcDtcbiAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgfVxuICB9XG4gIC8vIFNBVkVcbiAgZW52W2Vudl9zcF0gPSBzcDtcbiAgZW52W2Vudl9zdGF0ZV0gPSBzdGF0ZTtcbiAgZW52W2Vudl9lcnJmbGFnXSA9IGVycmZsYWc7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3BhcnNlcl90cmFjZVxuLy9SZXF1aXJlczogY2FtbF9wYXJzZXJfdHJhY2VcbmZ1bmN0aW9uIGNhbWxfc2V0X3BhcnNlcl90cmFjZShib29sKSB7XG4gIHZhciBvbGRmbGFnID0gY2FtbF9wYXJzZXJfdHJhY2U7XG4gIGNhbWxfcGFyc2VyX3RyYWNlID0gYm9vbDtcbiAgcmV0dXJuIG9sZGZsYWc7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMjAgLSBIdWdvIEhldXphcmRcbi8vIENvcHlyaWdodCAoQykgMjAyMCAtIFNoYWNoYXIgSXR6aGFreVxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNC4wNy9vdGhlcmxpYnMvc3RyL3N0cnN0dWJzLmNcbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2NvcS9qc2NvcS9ibG9iL3Y4LjExL2NvcS1qcy9qc19zdHViL3N0ci5qc1xuXG4vL1Byb3ZpZGVzOiByZV9tYXRjaFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9qc19mcm9tX2FycmF5LCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfZ2V0XG5cbnZhciByZV9tYXRjaCA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciByZV93b3JkX2xldHRlcnMgPSBbXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiAweDAwLTB4MUY6IG5vbmUgKi8sIDB4MDAsIDB4MDAsIDB4ZmYsXG4gICAgMHgwMyAvKiAweDIwLTB4M0Y6IGRpZ2l0cyAwLTkgKi8sIDB4ZmUsIDB4ZmYsIDB4ZmYsXG4gICAgMHg4NyAvKiAweDQwLTB4NUY6IEEgdG8gWiwgXyAqLywgMHhmZSwgMHhmZiwgMHhmZixcbiAgICAweDA3IC8qIDB4NjAtMHg3RjogYSB0byB6ICovLCAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDB4ODAtMHg5Rjogbm9uZSAqLyxcbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIDB4QTAtMHhCRjogbm9uZSAqLywgMHhmZiwgMHhmZiwgMHg3ZixcbiAgICAweGZmIC8qIDB4QzAtMHhERjogTGF0aW4tMSBhY2NlbnRlZCB1cHBlcmNhc2UgKi8sIDB4ZmYsIDB4ZmYsIDB4N2YsXG4gICAgMHhmZiAvKiAweEUwLTB4RkY6IExhdGluLTEgYWNjZW50ZWQgbG93ZXJjYXNlICovLFxuICBdO1xuXG4gIHZhciBvcGNvZGVzID0ge1xuICAgIENIQVI6IDAsXG4gICAgQ0hBUk5PUk06IDEsXG4gICAgU1RSSU5HOiAyLFxuICAgIFNUUklOR05PUk06IDMsXG4gICAgQ0hBUkNMQVNTOiA0LFxuICAgIEJPTDogNSxcbiAgICBFT0w6IDYsXG4gICAgV09SREJPVU5EQVJZOiA3LFxuICAgIEJFR0dST1VQOiA4LFxuICAgIEVOREdST1VQOiA5LFxuICAgIFJFRkdST1VQOiAxMCxcbiAgICBBQ0NFUFQ6IDExLFxuICAgIFNJTVBMRU9QVDogMTIsXG4gICAgU0lNUExFU1RBUjogMTMsXG4gICAgU0lNUExFUExVUzogMTQsXG4gICAgR09UTzogMTUsXG4gICAgUFVTSEJBQ0s6IDE2LFxuICAgIFNFVE1BUks6IDE3LFxuICAgIENIRUNLUFJPR1JFU1M6IDE4LFxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzX3dvcmRfbGV0dGVyKGMpIHtcbiAgICByZXR1cm4gKHJlX3dvcmRfbGV0dGVyc1tjID4+IDNdID4+IChjICYgNykpICYgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluX2JpdHNldChzLCBpKSB7XG4gICAgcmV0dXJuIChjYW1sX3N0cmluZ19nZXQocywgaSA+PiAzKSA+PiAoaSAmIDcpKSAmIDE7XG4gIH1cblxuICBmdW5jdGlvbiByZV9tYXRjaF9pbXBsKHJlLCBzLCBwb3MsIHBhcnRpYWwpIHtcbiAgICB2YXIgcHJvZyA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsxXSksXG4gICAgICBjcG9vbCA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsyXSksXG4gICAgICBub3JtdGFibGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHJlWzNdKSxcbiAgICAgIG51bWdyb3VwcyA9IHJlWzRdIHwgMCxcbiAgICAgIG51bXJlZ2lzdGVycyA9IHJlWzVdIHwgMDtcblxuICAgIHZhciBzID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocyk7XG5cbiAgICB2YXIgcGMgPSAwLFxuICAgICAgcXVpdCA9IGZhbHNlLFxuICAgICAgc3RhY2sgPSBbXSxcbiAgICAgIGdyb3VwcyA9IG5ldyBBcnJheShudW1ncm91cHMpLFxuICAgICAgcmVfcmVnaXN0ZXIgPSBuZXcgQXJyYXkobnVtcmVnaXN0ZXJzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBncm91cHNbaV0gPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgIH1cbiAgICBncm91cHNbMF0uc3RhcnQgPSBwb3M7XG5cbiAgICB2YXIgYmFja3RyYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoaXRlbS51bmRvKSB7XG4gICAgICAgICAgaXRlbS51bmRvLm9ialtpdGVtLnVuZG8ucHJvcF0gPSBpdGVtLnVuZG8udmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MpIHtcbiAgICAgICAgICBwYyA9IGl0ZW0ucG9zLnBjO1xuICAgICAgICAgIHBvcyA9IGl0ZW0ucG9zLnR4dDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1aXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICB2YXIgcHVzaCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBzdGFjay5wdXNoKGl0ZW0pO1xuICAgIH07XG5cbiAgICB2YXIgYWNjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZ3JvdXBzWzBdLmVuZCA9IHBvcztcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoMSArIGdyb3Vwcy5sZW5ndGggKiAyKTtcbiAgICAgIHJlc3VsdFswXSA9IDA7IC8vIHRhZ1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGcgPSBncm91cHNbaV07XG4gICAgICAgIGlmIChnLnN0YXJ0IDwgMCB8fCBnLmVuZCA8IDApIHtcbiAgICAgICAgICBnLnN0YXJ0ID0gZy5lbmQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbMiAqIGkgKyAxXSA9IGcuc3RhcnQ7XG4gICAgICAgIHJlc3VsdFsyICogaSArIDEgKyAxXSA9IGcuZW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHByZWZpeF9tYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYXJ0aWFsKSByZXR1cm4gYWNjZXB0KCk7XG4gICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgIH07XG5cbiAgICAvKiBNYWluIERGQSBpbnRlcnByZXRlciBsb29wICovXG4gICAgd2hpbGUgKCFxdWl0KSB7XG4gICAgICB2YXIgb3AgPSBwcm9nW3BjXSAmIDB4ZmYsXG4gICAgICAgIHNhcmcgPSBwcm9nW3BjXSA+PiA4LFxuICAgICAgICB1YXJnID0gc2FyZyAmIDB4ZmYsXG4gICAgICAgIGMgPSBzW3Bvc10sXG4gICAgICAgIGdyb3VwO1xuXG4gICAgICBwYysrO1xuXG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSOlxuICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmVmaXhfbWF0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gdWFyZykgcG9zKys7XG4gICAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkNIQVJOT1JNOlxuICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmVmaXhfbWF0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9ybXRhYmxlLmNoYXJDb2RlQXQoYykgPT09IHVhcmcpIHBvcysrO1xuICAgICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TVFJJTkc6XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7XG4gICAgICAgICAgICBpIDwgYXJnLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09IGFyZy5jaGFyQ29kZUF0KGkpKSBjID0gc1srK3Bvc107XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLlNUUklOR05PUk06XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7XG4gICAgICAgICAgICBpIDwgYXJnLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSBhcmcuY2hhckNvZGVBdChpKSkgYyA9IHNbKytwb3NdO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSQ0xBU1M6XG4gICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZWZpeF9tYXRjaCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuQk9MOlxuICAgICAgICAgIGlmIChwb3MgPiAwICYmIHNbcG9zIC0gMV0gIT09IDEwIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuRU9MOlxuICAgICAgICAgIGlmIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09IDEwIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuV09SREJPVU5EQVJZOlxuICAgICAgICAgIGlmIChwb3MgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHByZWZpeF9tYXRjaCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc193b3JkX2xldHRlcihzWzBdKSkgYnJlYWs7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc193b3JkX2xldHRlcihzW3BvcyAtIDFdKSkgYnJlYWs7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzX3dvcmRfbGV0dGVyKHNbcG9zIC0gMV0pICE9PSBpc193b3JkX2xldHRlcihzW3Bvc10pKSBicmVhaztcbiAgICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkJFR0dST1VQOlxuICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICAgIHB1c2goeyB1bmRvOiB7IG9iajogZ3JvdXAsIHByb3A6IFwic3RhcnRcIiwgdmFsdWU6IGdyb3VwLnN0YXJ0IH0gfSk7XG4gICAgICAgICAgZ3JvdXAuc3RhcnQgPSBwb3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5FTkRHUk9VUDpcbiAgICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgICBwdXNoKHsgdW5kbzogeyBvYmo6IGdyb3VwLCBwcm9wOiBcImVuZFwiLCB2YWx1ZTogZ3JvdXAuZW5kIH0gfSk7XG4gICAgICAgICAgZ3JvdXAuZW5kID0gcG9zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuUkVGR1JPVVA6XG4gICAgICAgICAgZ3JvdXAgPSBncm91cHNbdWFyZ107XG4gICAgICAgICAgaWYgKGdyb3VwLnN0YXJ0IDwgMCB8fCBncm91cC5lbmQgPCAwKSB7XG4gICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpID0gZ3JvdXAuc3RhcnQ7IGkgPCBncm91cC5lbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNbaV0gIT09IHNbcG9zXSkge1xuICAgICAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVPUFQ6XG4gICAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHBvcysrO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuU0lNUExFU1RBUjpcbiAgICAgICAgICB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSkgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuU0lNUExFUExVUzpcbiAgICAgICAgICBpZiAocG9zID09PSBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcHJlZml4X21hdGNoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgICAgfSB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSk7XG4gICAgICAgICAgfSBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIG9wY29kZXMuQUNDRVBUOlxuICAgICAgICAgIHJldHVybiBhY2NlcHQoKTtcbiAgICAgICAgY2FzZSBvcGNvZGVzLkdPVE86XG4gICAgICAgICAgcGMgPSBwYyArIHNhcmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5QVVNIQkFDSzpcbiAgICAgICAgICBwdXNoKHsgcG9zOiB7IHBjOiBwYyArIHNhcmcsIHR4dDogcG9zIH0gfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugb3Bjb2Rlcy5TRVRNQVJLOlxuICAgICAgICAgIHB1c2goe1xuICAgICAgICAgICAgdW5kbzogeyBvYmo6IHJlX3JlZ2lzdGVyLCBwcm9wOiB1YXJnLCB2YWx1ZTogcmVfcmVnaXN0ZXJbdWFyZ10gfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZV9yZWdpc3Rlclt1YXJnXSA9IHBvcztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBvcGNvZGVzLkNIRUNLUFJPR1JFU1M6XG4gICAgICAgICAgaWYgKHJlX3JlZ2lzdGVyW3VhcmddID09PSBwb3MpIGJhY2t0cmFjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZWNvZGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHJlX21hdGNoX2ltcGw7XG59KSgpO1xuXG4vL1Byb3ZpZGVzOiByZV9zZWFyY2hfZm9yd2FyZFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19nZXRcbmZ1bmN0aW9uIHJlX3NlYXJjaF9mb3J3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYgKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfZm9yd2FyZFwiKTtcbiAgdmFyIHN0YXJ0Y2hhcnMgPSByZVs2XSB8IDA7XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIGlmIChzdGFydGNoYXJzID49IDApIHtcbiAgICBzdGFydGNoYXJzID0gcmVbMl1bc3RhcnRjaGFycyArIDFdO1xuICAgIGRvIHtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgcG9zIDwgbGVuICYmXG4gICAgICAgIGNhbWxfc3RyaW5nX2dldChzdGFydGNoYXJzLCBjYW1sX3N0cmluZ19nZXQocywgcG9zKSkgPT09IDBcbiAgICAgIClcbiAgICAgICAgcG9zKys7XG4gICAgICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gICAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgICAgcG9zKys7XG4gICAgfSB3aGlsZSAocG9zIDw9IGxlbik7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIHBvcysrO1xuICAgIH0gd2hpbGUgKHBvcyA8PSBsZW4pO1xuICB9XG4gIHJldHVybiBbMF07IC8qIFt8fF0gOiBpbnQgYXJyYXkgKi9cbn1cblxuLy9Qcm92aWRlczogcmVfc2VhcmNoX2JhY2t3YXJkXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2dldFxuZnVuY3Rpb24gcmVfc2VhcmNoX2JhY2t3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYgKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfYmFja3dhcmRcIik7XG4gIHZhciBzdGFydGNoYXJzID0gcmVbNl0gfCAwO1xuICBpZiAoc3RhcnRjaGFycyA+PSAwKSB7XG4gICAgc3RhcnRjaGFycyA9IHJlWzJdW3N0YXJ0Y2hhcnMgKyAxXTtcbiAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpO1xuICAgIGRvIHtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgcG9zID4gMCAmJlxuICAgICAgICBwb3MgPCBsZW4gJiZcbiAgICAgICAgY2FtbF9zdHJpbmdfZ2V0KHN0YXJ0Y2hhcnMsIGNhbWxfc3RyaW5nX2dldChzLCBwb3MpKSA9PT0gMFxuICAgICAgKVxuICAgICAgICBwb3MtLTtcbiAgICAgIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgICBwb3MtLTtcbiAgICB9IHdoaWxlIChwb3MgPj0gMCk7XG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIHBvcy0tO1xuICAgIH0gd2hpbGUgKHBvcyA+PSAwKTtcbiAgfVxuICByZXR1cm4gWzBdOyAvKiBbfHxdIDogaW50IGFycmF5ICovXG59XG5cbi8vUHJvdmlkZXM6IHJlX3N0cmluZ19tYXRjaFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zdHJpbmdfbWF0Y2gocmUsIHMsIHBvcykge1xuICBpZiAocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnN0cmluZ19tYXRjaFwiKTtcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3BhcnRpYWxfbWF0Y2hcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfcGFydGlhbF9tYXRjaChyZSwgcywgcG9zKSB7XG4gIGlmIChwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIucGFydGlhbF9tYXRjaFwiKTtcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDEpO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3JlcGxhY2VtZW50X3RleHRcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vLyBleHRlcm5hbCByZV9yZXBsYWNlbWVudF90ZXh0OiBzdHJpbmcgLT4gaW50IGFycmF5IC0+IHN0cmluZyAtPiBzdHJpbmdcbmZ1bmN0aW9uIHJlX3JlcGxhY2VtZW50X3RleHQocmVwbCwgZ3JvdXBzLCBvcmlnKSB7XG4gIHZhciByZXBsID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhyZXBsKTtcbiAgdmFyIGxlbiA9IHJlcGwubGVuZ3RoO1xuICB2YXIgb3JpZyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcob3JpZyk7XG4gIHZhciByZXMgPSBcIlwiOyAvL3Jlc3VsdFxuICB2YXIgbiA9IDA7IC8vIGN1cnJlbnQgcG9zaXRpb25cbiAgdmFyIGN1cjsgLy9jdXJyZW50IGNoYXJcbiAgdmFyIHN0YXJ0LCBlbmQsIGM7XG4gIHdoaWxlIChuIDwgbGVuKSB7XG4gICAgY3VyID0gcmVwbC5jaGFyQXQobisrKTtcbiAgICBpZiAoY3VyICE9PSBcIlxcXFxcIikge1xuICAgICAgcmVzICs9IGN1cjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG4gPT09IGxlbikgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiBpbGxlZ2FsIGJhY2tzbGFzaCBzZXF1ZW5jZVwiKTtcbiAgICAgIGN1ciA9IHJlcGwuY2hhckF0KG4rKyk7XG4gICAgICBzd2l0Y2ggKGN1cikge1xuICAgICAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgICAgIHJlcyArPSBjdXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCIwXCI6XG4gICAgICAgIGNhc2UgXCIxXCI6XG4gICAgICAgIGNhc2UgXCIyXCI6XG4gICAgICAgIGNhc2UgXCIzXCI6XG4gICAgICAgIGNhc2UgXCI0XCI6XG4gICAgICAgIGNhc2UgXCI1XCI6XG4gICAgICAgIGNhc2UgXCI2XCI6XG4gICAgICAgIGNhc2UgXCI3XCI6XG4gICAgICAgIGNhc2UgXCI4XCI6XG4gICAgICAgIGNhc2UgXCI5XCI6XG4gICAgICAgICAgYyA9ICtjdXI7XG4gICAgICAgICAgaWYgKGMgKiAyID49IGdyb3Vwcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiByZWZlcmVuY2UgdG8gdW5tYXRjaGVkIGdyb3VwXCIpO1xuICAgICAgICAgIHN0YXJ0ID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjICogMik7XG4gICAgICAgICAgZW5kID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjICogMiArIDEpO1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gLTEpXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiU3RyLnJlcGxhY2U6IHJlZmVyZW5jZSB0byB1bm1hdGNoZWQgZ3JvdXBcIik7XG4gICAgICAgICAgcmVzICs9IG9yaWcuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVzICs9IFwiXFxcXFwiICsgY3VyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhyZXMpO1xufVxuIl0sIm5hbWVzIjpbImNzdF9PdXRfb2ZfbWVtb3J5IiwiY3N0X1N5c19lcnJvciIsImNzdF9GYWlsdXJlIiwiY3N0X0ludmFsaWRfYXJndW1lbnQiLCJjc3RfRW5kX29mX2ZpbGUiLCJjc3RfRGl2aXNpb25fYnlfemVybyIsImNzdF9Ob3RfZm91bmQiLCJjc3RfTWF0Y2hfZmFpbHVyZSIsImNzdF9TdGFja19vdmVyZmxvdyIsImNzdF9TeXNfYmxvY2tlZF9pbyIsImNzdF9Bc3NlcnRfZmFpbHVyZSIsImNzdF9VbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSJdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQTtBQUFBO0FBQUEsR0FBQTtBQUFBO0FBQUE7QUFBQSxRQUFBO0FBQUEsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUFBO0FBQUEsSUFBQTtBQUFBLElBQUE7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O0FBQUE7QUFBQTtBQUFBLFdBR3FCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FNUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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Q0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBQ0osSUFBSTtBQUFBLFNBRUosT0FBTztBQUFBLFNBQ1AsT0FBTztBQUFBLFNBQ1AsT0FBTztBQUFBLFNBQ1AsT0FBTyxhQTdFRixDQThFTjtBQUFBLE9BbkdzQjtBQUFBLE9BQUQ7QUFB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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0p6YUE7QUFBQSxPQUFBQSxvQkFBQTtBQUFBO0FBQUEsT0FBQUMsZ0JBQUE7QUFBQTtBQUFBLE9BQUFDLGNBQUE7QUFBQTtBQUFBLE9BQUFDLHVCQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUFDLGtCQUFBO0FBQUE7QUFBQSxPQUFBQyx1QkFBQTtBQUFBO0FBQUE7QUFBQSxPQUFBQyxnQkFBQTtBQUFBO0FBQUEsT0FBQUMsb0JBQUE7QUFBQTtBQUFBLE9BQUFDLHFCQUFBO0FBQUE7QUFBQSxPQUFBQyxxQkFBQTtBQUFBO0FBQUEsT0FBQUMscUJBQUE7QUFBQTtBQUFBO0FBQUEsT0FBQUMsaUNBQUEiLCJpZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOF19fSx7Im9mZnNldCI6eyJsaW5lIjo5MzE0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2NhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgVmF1Z29uLCBFTlNUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUGFkZGluZyBwb3NpdGlvbi4gKilcbnR5cGUgcGFkdHkgPVxuICB8IExlZnQgICAoKiBUZXh0IGlzIGxlZnQganVzdGlmaWVkICgnLScgb3B0aW9uKS4gICAgICAgICAgICAgICAqKVxuICB8IFJpZ2h0ICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCAobm8gJy0nIG9wdGlvbikuICAgICAgICAgICAqKVxuICB8IFplcm9zICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCBieSB6ZXJvcyAoc2VlICcwJyBvcHRpb24pLiAqKVxuXG4oKioqKVxuXG4oKiBJbnRlZ2VyIGNvbnZlcnNpb24uICopXG50eXBlIGludF9jb252ID1cbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCAgICAgICAgKCogICVkIHwgJStkIHwgJSBkICAqKVxuICB8IEludF9pIHwgSW50X3BpIHwgSW50X3NpICAgICAgICAoKiAgJWkgfCAlK2kgfCAlIGkgICopXG4gIHwgSW50X3ggfCBJbnRfQ3ggICAgICAgICAgICAgICAgICgqICAleCB8ICUjeCAgICAgICAgKilcbiAgfCBJbnRfWCB8IEludF9DWCAgICAgICAgICAgICAgICAgKCogICVYIHwgJSNYICAgICAgICAqKVxuICB8IEludF9vIHwgSW50X0NvICAgICAgICAgICAgICAgICAoKiAgJW8gfCAlI28gICAgICAgICopXG4gIHwgSW50X3UgICAgICAgICAgICAgICAgICAgICAgICAgICgqICAldSAgICAgICAgICAgICAgKilcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgICAgICAgKCogICUjZCB8ICUjaSB8ICUjdSAqKVxuXG4oKiBGbG9hdCBjb252ZXJzaW9uLiAqKVxudHlwZSBmbG9hdF9mbGFnX2NvbnYgPVxuICB8IEZsb2F0X2ZsYWdfICAgICAgICAgICAgICAgICAgICAoKiAlW2ZlRWdHRmhIXSAqKVxuICB8IEZsb2F0X2ZsYWdfcCAgICAgICAgICAgICAgICAgICAoKiAlK1tmZUVnR0ZoSF0gKilcbiAgfCBGbG9hdF9mbGFnX3MgICAgICAgICAgICAgICAgICAgKCogJSBbZmVFZ0dGaEhdICopXG50eXBlIGZsb2F0X2tpbmRfY29udiA9XG4gIHwgRmxvYXRfZiAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZiB8ICUrZiB8ICUgZiAgKilcbiAgfCBGbG9hdF9lICAgICAgICAgICAgICAgICAgICAgICAgKCogICVlIHwgJStlIHwgJSBlICAqKVxuICB8IEZsb2F0X0UgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUUgfCAlK0UgfCAlIEUgICopXG4gIHwgRmxvYXRfZyAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZyB8ICUrZyB8ICUgZyAgKilcbiAgfCBGbG9hdF9HICAgICAgICAgICAgICAgICAgICAgICAgKCogICVHIHwgJStHIHwgJSBHICAqKVxuICB8IEZsb2F0X0YgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUYgfCAlK0YgfCAlIEYgICopXG4gIHwgRmxvYXRfaCAgICAgICAgICAgICAgICAgICAgICAgICgqICAlaCB8ICUraCB8ICUgaCAgKilcbiAgfCBGbG9hdF9IICAgICAgICAgICAgICAgICAgICAgICAgKCogICVIIHwgJStIIHwgJSBIICAqKVxuICB8IEZsb2F0X0NGICAgICAgICAgICAgICAgICAgICAgICAoKiAgJSNGfCAlKyNGfCAlICNGICopXG50eXBlIGZsb2F0X2NvbnYgPSBmbG9hdF9mbGFnX2NvbnYgKiBmbG9hdF9raW5kX2NvbnZcblxuKCoqKilcblxuKCogQ2hhciBzZXRzIChzZWUgJVsuLi5dKSBhcmUgYml0bWFwcyBpbXBsZW1lbnRlZCBhcyAzMi1jaGFyIHN0cmluZ3MuICopXG50eXBlIGNoYXJfc2V0ID0gc3RyaW5nXG5cbigqKiopXG5cbigqIENvdW50ZXIgdXNlZCBpbiBTY2FuZi4gKilcbnR5cGUgY291bnRlciA9XG4gIHwgTGluZV9jb3VudGVyICAgICAoKiAgJWwgICAgICAqKVxuICB8IENoYXJfY291bnRlciAgICAgKCogICVuICAgICAgKilcbiAgfCBUb2tlbl9jb3VudGVyICAgICgqICAlTiwgJUwgICopXG5cbigqKiopXG5cbigqIFBhZGRpbmcgb2Ygc3RyaW5ncyBhbmQgbnVtYmVycy4gKilcbnR5cGUgKCdhLCAnYikgcGFkZGluZyA9XG4gICgqIE5vIHBhZGRpbmcgKGV4OiBcIiVkXCIpICopXG4gIHwgTm9fcGFkZGluZyAgOiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIExpdGVyYWwgcGFkZGluZyAoZXg6IFwiJThkXCIpICopXG4gIHwgTGl0X3BhZGRpbmcgOiBwYWR0eSAqIGludCAtPiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIFBhZGRpbmcgYXMgZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUqZFwiKSAqKVxuICB8IEFyZ19wYWRkaW5nIDogcGFkdHkgLT4gKGludCAtPiAnYSwgJ2EpIHBhZGRpbmdcblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZCxcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwYWRkaW5nIG9wdGlvbiAobm8gZXh0cmEgYXJndW1lbnQpICopXG50eXBlIHBhZF9vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIFByZWNpc2lvbiBvZiBmbG9hdHMgYW5kICcwJy1wYWRkaW5nIG9mIGludGVnZXJzLiAqKVxudHlwZSAoJ2EsICdiKSBwcmVjaXNpb24gPVxuICAoKiBObyBwcmVjaXNpb24gKGV4OiBcIiVmXCIpICopXG4gIHwgTm9fcHJlY2lzaW9uIDogKCdhLCAnYSkgcHJlY2lzaW9uXG4gICgqIExpdGVyYWwgcHJlY2lzaW9uIChleDogXCIlLjNmXCIpICopXG4gIHwgTGl0X3ByZWNpc2lvbiA6IGludCAtPiAoJ2EsICdhKSBwcmVjaXNpb25cbiAgKCogUHJlY2lzaW9uIGFzIGV4dHJhIGFyZ3VtZW50IChleDogXCIlLipmXCIpICopXG4gIHwgQXJnX3ByZWNpc2lvbiA6IChpbnQgLT4gJ2EsICdhKSBwcmVjaXNpb25cblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZixcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwcmVjaXNpb24gb3B0aW9uIChubyBleHRyYSBhcmd1bWVudCkgKilcbnR5cGUgcHJlY19vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIHNlZSB0aGUgQ3VzdG9tIGZvcm1hdCBjb21iaW5hdG9yICopXG50eXBlICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgPVxuICB8IEN1c3RvbV96ZXJvIDogKCdhLCBzdHJpbmcsICdhKSBjdXN0b21fYXJpdHlcbiAgfCBDdXN0b21fc3VjYyA6ICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgLT5cbiAgICAoJ2EsICd4IC0+ICdiLCAneCAtPiAnYykgY3VzdG9tX2FyaXR5XG5cbigqKiopXG5cbigqICAgICAgICBSZWxhdGlvbmFsIGZvcm1hdCB0eXBlc1xuXG5JbiB0aGUgZmlyc3QgZm9ybWF0K2dhZHRzIGltcGxlbWVudGF0aW9uLCB0aGUgdHlwZSBmb3IgJSguLiUpIGluIHRoZVxuZm10IEdBRFQgd2FzIGFzIGZvbGxvd3M6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKiAoJ2QxLCAncTEsICdkMiwgJ3EyKSByZWFkZXJfbmJfdW5pZmllciAqXG4gICAgKCd4LCAnYiwgJ2MsICdkMSwgJ3ExLCAndSkgZm10dHkgKlxuICAgICgndSwgJ2IsICdjLCAncTEsICdlMSwgJ2YpIGZtdCAtPlxuICAgICAgKCgneCwgJ2IsICdjLCAnZDIsICdxMiwgJ3UpIGZvcm1hdDYgLT4gJ3gsICdiLCAnYywgJ2QxLCAnZTEsICdmKSBmbXRcblxuTm90aWNlIHRoYXQgdGhlICd1IHBhcmFtZXRlciBpbiAnZiBwb3NpdGlvbiBpbiB0aGUgZm9ybWF0IGFyZ3VtZW50XG4oKCd4LCAuLiwgJ3UpIGZvcm1hdDYgLT4gLi4pIGlzIGVxdWFsIHRvIHRoZSAndSBwYXJhbWV0ZXIgaW4gJ2FcbnBvc2l0aW9uIGluIHRoZSBmb3JtYXQgdGFpbCAoKCd1LCAuLiwgJ2YpIGZtdCkuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbnR5cGUgb2YgdGhlIGV4cGVjdGVkIGZvcm1hdCBwYXJhbWV0ZXIgZGVwZW5kcyBvZiB3aGVyZSB0aGUgJSguLi4lKVxuYXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nOlxuXG4gICMgUHJpbnRmLnByaW50ZiBcIiUoJSlcIlxuICAtIDogKHVuaXQsIG91dF9jaGFubmVsLCB1bml0LCAnX2EsICdfYSwgdW5pdClcbiAgICAgIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2IC0+IHVuaXRcbiAgPSA8ZnVuPlxuICAjIFByaW50Zi5wcmludGYgXCIlKCUpJWRcIlxuICAtIDogKGludCAtPiB1bml0LCBvdXRfY2hhbm5lbCwgdW5pdCwgJ19hLCAnX2EsIGludCAtPiB1bml0KVxuICAgICAgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDYgLT4gaW50IC0+IHVuaXRcbiAgPSA8ZnVuPlxuXG5PbiB0aGUgY29udHJhcnksIHRoZSBsZWdhY3kgdHlwZXIgZ2l2ZXMgYSBjbGV2ZXIgdHlwZSB0aGF0IGRvZXMgbm90XG5kZXBlbmQgb24gdGhlIHBvc2l0aW9uIG9mICUoLi4lKSBpbiB0aGUgZm9ybWF0IHN0cmluZy4gRm9yIGV4YW1wbGUsXG4lKCUpIHdpbGwgaGF2ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSk6IGl0IGNhblxuYmUgY29uY2F0ZW5hdGVkIHRvIGFueSBmb3JtYXQgdHlwZSwgYW5kIG9ubHkgZW5mb3JjZXMgdGhlIGNvbnN0cmFpbnRcbnRoYXQgaXRzICdhIGFuZCAnZiBwYXJhbWV0ZXJzIGFyZSBlcXVhbCAobm8gZm9ybWF0IGFyZ3VtZW50cykgYW5kICdkXG5hbmQgJ2UgYXJlIGVxdWFsIChubyByZWFkZXIgYXJndW1lbnQpLlxuXG5UaGUgd2Vha2VuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIEdBRFQgdmVyc2lvbiBicm9rZSB1c2VyXG5jb2RlIChpbiBmYWN0IGl0IGVzc2VudGlhbGx5IG1hZGUgJSguLi4lKSB1bnVzYWJsZSBleGNlcHQgYXQgdGhlIGxhc3RcbnBvc2l0aW9uIG9mIGEgZm9ybWF0KS4gSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB3b3VsZCBub3Qgd29ya1xuYW55bW9yZTpcblxuICBmdW4gc2VwIC0+XG4gICAgRm9ybWF0LnByaW50ZiBcImZvbyUoJSliYXIlKCUpYmF6XCIgc2VwIHNlcFxuXG5BcyB0aGUgdHlwZS1jaGVja2VyIHdvdWxkIHJlcXVpcmUgdHdvICppbmNvbXBhdGlibGUqIHR5cGVzIGZvciB0aGUgJSglKVxuaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cblxuVGhlIHNvbHV0aW9uIHRvIHJlZ2FpbiBhIGdlbmVyYWwgdHlwZSBmb3IgJSguLiUpIGlzIHRvIGdlbmVyYWxpemUgdGhpc1xudGVjaG5pcXVlLCBub3Qgb25seSBvbiB0aGUgJ2QsICdlIHBhcmFtZXRlcnMsIGJ1dCBvbiBhbGwgc2l4XG5wYXJhbWV0ZXJzIG9mIGEgZm9ybWF0OiB3ZSBpbnRyb2R1Y2UgYSBcInJlbGF0aW9uYWxcIiB0eXBlXG4gICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG53aG9zZSB2YWx1ZXMgYXJlIHByb29mcyB0aGF0ICgnYTEsIC4uLCAnZjEpIGFuZCAoJ2EyLCAuLiwgJ2YyKSBtb3JhbGx5XG5jb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZvcm1hdCB0eXBlOiAnYTEgaXMgb2J0YWluZWQgZnJvbSAnZjEsJ2IxLCdjMVxuaW4gdGhlIGV4YWN0IHNhbWUgd2F5IHRoYXQgJ2EyIGlzIG9idGFpbmVkIGZyb20gJ2YyLCdiMiwnYzIsIGV0Yy5cblxuRm9yIGV4YW1wbGUsIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHR3byBmb3JtYXQgdHlwZXMgYmVnaW5uaW5nIHdpdGggYSBDaGFyXG5wYXJhbWV0ZXIgaXMgYXMgZm9sbG93czpcblxufCBDaGFyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgICopXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgIChjaGFyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgIGNoYXIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbkluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSB0ZXJtIHN0cnVjdHVyZSBvZiBmbXR0eV9yZWwgaXMgKGFsbW9zdFsxXSlcbmlzb21vcnBoaWMgdG8gdGhlIGZtdHR5IG9mIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbjogZXZlcnlcbmNvbnN0cnVjdG9yIGlzIHJlLXJlYWQgd2l0aCBhIGJpbmFyeSwgcmVsYXRpb25hbCB0eXBlLCBpbnN0ZWFkIG9mIHRoZVxucHJldmlvdXMgdW5hcnkgdHlwaW5nLiBmbXR0eSBjYW4gdGhlbiBiZSByZS1kZWZpbmVkIGFzIHRoZSBkaWFnb25hbCBvZlxuZm10dHlfcmVsOlxuXG4gIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5ID1cbiAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICAgJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfcmVsXG5cbk9uY2Ugd2UgaGF2ZSB0aGlzIGZtdHR5X3JlbCB0eXBlIGluIHBsYWNlLCB3ZSBjYW4gZ2l2ZSB0aGUgbW9yZVxuZ2VuZXJhbCB0eXBlIHRvICUoLi4uJSk6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKlxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzIsICdiLCAnYywgJ2oyLCAnZCwgJ2EpIGZtdHR5X3JlbCAqXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiLCAnYywgJ2oyLCAnZSwgJ2YpIGZtdFxuXG5XZSBhY2NlcHQgYW55IGZvcm1hdCAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYpICh0aGlzIGlzXG5jb21wbGV0ZWx5IHVucmVsYXRlZCB0byB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmb3JtYXQpLCBidXQgYWxzb1xucmVxdWlyZSBhIHByb29mIHRoYXQgdGhpcyBmb3JtYXQgaXMgaW4gcmVsYXRpb24gdG8gYW5vdGhlciBmb3JtYXQgdGhhdFxuaXMgY29uY2F0ZW5hYmxlIHRvIHRoZSBmb3JtYXQgdGFpbC4gV2hlbiBleGVjdXRpbmcgYSAlKC4uLiUpIGZvcm1hdFxuKGluIGNhbWxpbnRlcm5hbEZvcm1hdC5tbDptYWtlX3ByaW50ZiBvciBzY2FuZi5tbDptYWtlX3NjYW5mKSwgd2VcbnRyYW5zdHlwZSB0aGUgZm9ybWF0IGFsb25nIHRoaXMgcmVsYXRpb24gdXNpbmcgdGhlICdyZWNhc3QnIGZ1bmN0aW9uXG50byB0cmFuc3Bvc2UgYmV0d2VlbiByZWxhdGVkIGZvcm1hdCB0eXBlcy5cblxuICB2YWwgcmVjYXN0IDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEpIGZtdFxuICAtPiAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICAtPiAoJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10XG5cbk5PVEUgWzFdOiB0aGUgdHlwaW5nIG9mIEZvcm1hdF9zdWJzdF90eSByZXF1aXJlcyBub3Qgb25lIGZvcm1hdCB0eXBlLCBidXRcbnR3bywgb25lIHRvIGVzdGFibGlzaCB0aGUgbGluayBiZXR3ZWVuIHRoZSBmb3JtYXQgYXJndW1lbnQgYW5kIHRoZVxuZmlyc3Qgc2l4IHBhcmFtZXRlcnMsIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSBsaW5rIGJldHdlZW4gdGhlIGZvcm1hdFxuYXJndW1lbnQgYW5kIHRoZSBsYXN0IHNpeCBwYXJhbWV0ZXJzLlxuXG58IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2QxLCAnYTEpIGZtdHR5X3JlbCAqXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2QyLCAnYTIpIGZtdHR5X3JlbCAqXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzEsICdiMSwgJ2MxLCAnajEsICdlMSwgJ2YxLFxuICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiMiwgJ2MyLCAnajIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuV2hlbiB3ZSBnZW5lcmF0ZSBhIGZvcm1hdCBBU1QsIHdlIGdlbmVyYXRlIGV4YWN0bHkgdGhlIHNhbWUgd2l0bmVzc1xuZm9yIGJvdGggcmVsYXRpb25zLCBhbmQgdGhlIHdpdG5lc3MtY29udmVyc2lvbiBmdW5jdGlvbnMgaW5cbmNhbWxpbnRlcm5hbEZvcm1hdCBkbyByZWx5IG9uIHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSwgdGhlXG5mdW5jdGlvbiB0aGF0IHByb3ZlcyB0aGF0IHRoZSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlXG5cbiAgdmFsIHRyYW5zIDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgLT4gKCdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcbiAgLT4gKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcblxuZG9lcyBhc3N1bWUgdGhhdCB0aGUgdHdvIGlucHV0cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdGVybSBzdHJ1Y3R1cmVcbihhbmQgaXMgb25seSBldmVyeSB1c2VkIGZvciBhcmd1bWVudCB3aXRuZXNzZXMgb2YgdGhlXG5Gb3JtYXRfc3Vic3RfdHkgY29uc3RydWN0b3IpLlxuKilcblxuKCogVHlwZSBvZiBhIGJsb2NrIHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgYmxvY2tfdHlwZSA9XG4gIHwgUHBfaGJveCAgICgqIEhvcml6b250YWwgYmxvY2sgbm8gbGluZSBicmVha2luZyAqKVxuICB8IFBwX3Zib3ggICAoKiBWZXJ0aWNhbCBibG9jayBlYWNoIGJyZWFrIGxlYWRzIHRvIGEgbmV3IGxpbmUgKilcbiAgfCBQcF9odmJveCAgKCogSG9yaXpvbnRhbC12ZXJ0aWNhbCBibG9jazogc2FtZSBhcyB2Ym94LCBleGNlcHQgaWYgdGhpcyBibG9ja1xuICAgICAgICAgICAgICAgICBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgc2luZ2xlIGxpbmUgKilcbiAgfCBQcF9ob3Zib3ggKCogSG9yaXpvbnRhbCBvciBWZXJ0aWNhbCBibG9jazogYnJlYWtzIGxlYWQgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgb25seSB3aGVuIG5lY2Vzc2FyeSB0byBwcmludCB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgKilcbiAgfCBQcF9ib3ggICAgKCogSG9yaXpvbnRhbCBvciBJbmRlbnQgYmxvY2s6IGJyZWFrcyBsZWFkIHRvIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrLCBvclxuICAgICAgICAgICAgICAgICB3aGVuIGl0IGxlYWRzIHRvIGEgbmV3IGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUgKilcbiAgfCBQcF9maXRzICAgKCogSW50ZXJuYWwgdXNhZ2U6IHdoZW4gYSBibG9jayBmaXRzIG9uIGEgc2luZ2xlIGxpbmUgKilcblxuKCogRm9ybWF0dGluZyBlbGVtZW50IHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgZm9ybWF0dGluZ19saXQgPVxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXSAgICopXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEB9ICAgKilcbiAgfCBCcmVhayBvZiBzdHJpbmcgKiBpbnQgKiBpbnQgICAgICAgICAgKCogQCwgfCBAICB8IEA7IHwgQDs8PiAqKVxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAPyAgICopXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBcXG4gICopXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAuICAgKilcbiAgfCBNYWdpY19zaXplIG9mIHN0cmluZyAqIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQDxuPiAqKVxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAQCAgICopXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAlJSAgKilcbiAgfCBTY2FuX2luZGljIG9mIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQFggICAqKVxuXG4oKiBGb3JtYXR0aW5nIGVsZW1lbnQgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW4gPVxuICB8IE9wZW5fdGFnIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gICAgICAoKiBAeyAgICopXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuXG4gIHwgT3Blbl9ib3ggOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAgICAgICgqIEBbICAgKilcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW5cblxuKCoqKilcblxuKCogTGlzdCBvZiBmb3JtYXQgdHlwZSBlbGVtZW50cy4gKilcbigqIEluIHBhcnRpY3VsYXIgdXNlZCB0byByZXByZXNlbnQgJSguLi4lKSBhbmQgJXsuLi4lfSBjb250ZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgPVxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X3JlbFxuYW5kICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgPVxuICB8IENoYXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGNoYXIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBjaGFyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IFN0cmluZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKHN0cmluZyAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIHN0cmluZyAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50MzJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVsZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50MzIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQzMiAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBOYXRpdmVpbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJW5kICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChuYXRpdmVpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBuYXRpdmVpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50NjRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVMZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50NjQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQ2NCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBGbG9hdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWYgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChmbG9hdCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGZsb2F0IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEJvb2xfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQiAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGJvb2wgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBib29sIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRm9ybWF0X2FyZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV7Li4uJX0gKilcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAqXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpXG4gICAgICAgICAgIGZtdHR5X3JlbFxuICB8IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzEsICdiMSwgJ2MxLCAnajEsICdkMSwgJ2ExKSBmbXR0eV9yZWwgKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZDIsICdhMikgZm10dHlfcmVsICpcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZTIsICdmMilcbiAgICAgICAgICAgZm10dHlfcmVsXG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzLiAqKVxuICB8IEFscGhhX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYSAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnYjEgLT4gJ3ggLT4gJ2MxKSAtPiAneCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnYjIgLT4gJ3ggLT4gJ2MyKSAtPiAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBUaGV0YV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2IxIC0+ICdjMSkgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2IyIC0+ICdjMikgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgQW55X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBVc2VkIGZvciBjdXN0b20gZm9ybWF0cyAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ3ggLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3Rvci4gKilcbiAgfCBSZWFkZXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXIgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgneCAtPiAnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICd4IC0+ICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IElnbm9yZWRfcmVhZGVyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3IgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRW5kX29mX2ZtdHR5IDpcbiAgICAgICgnZjEsICdiMSwgJ2MxLCAnZDEsICdkMSwgJ2YxLFxuICAgICAgICdmMiwgJ2IyLCAnYzIsICdkMiwgJ2QyLCAnZjIpIGZtdHR5X3JlbFxuXG4oKioqKVxuXG4oKiBMaXN0IG9mIGZvcm1hdCBlbGVtZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10ID1cbiAgfCBDaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlUyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQzMiAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IE5hdGl2ZWludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVuW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgbmF0aXZlaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQ2NCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZsb2F0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbZmVFZ0dGaEhdICopXG4gICAgICBmbG9hdF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgZmxvYXQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBCb29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2JCXSAqKVxuICAgICAgKCd4LCBib29sIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRmx1c2ggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogYWJjICopXG4gICAgICBzdHJpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDaGFyX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiB4ICopXG4gICAgICBjaGFyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgfCBGb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAley4uLiV9ICopXG4gICAgICBwYWRfb3B0aW9uICogKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5ICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAgIHBhZF9vcHRpb24gKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYiwgJ2MsICdqMiwgJ2QsICdhKSBmbXR0eV9yZWwgKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IsICdjLCAnajIsICdlLCAnZikgZm10XG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3IuICopXG4gIHwgQWxwaGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAneCAtPiAnYykgLT4gJ3ggLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgVGhldGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAnYykgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yOiAqKVxuICB8IEZvcm1hdHRpbmdfbGl0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBfICopXG4gICAgICBmb3JtYXR0aW5nX2xpdCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdHRpbmdfZ2VuIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXyAqKVxuICAgICAgKCdhMSwgJ2IsICdjLCAnZDEsICdlMSwgJ2YxKSBmb3JtYXR0aW5nX2dlbiAqXG4gICAgICAoJ2YxLCAnYiwgJ2MsICdlMSwgJ2UyLCAnZjIpIGZtdCAtPiAoJ2ExLCAnYiwgJ2MsICdkMSwgJ2UyLCAnZjIpIGZtdFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBSZWFkZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3ggLT4gJ2EsICdiLCAnYywgKCdiIC0+ICd4KSAtPiAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2NoYXJfc2V0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKHN0cmluZyAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2dldF9jb3VudGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW25sTkxdICopXG4gICAgICBjb3VudGVyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoaW50IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fbmV4dF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUwYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSWdub3JlZF9wYXJhbSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8gKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBpZ25vcmVkICogKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogQ3VzdG9tIHByaW50aW5nIGZvcm1hdCAoUFIjNjQ1MiwgR1BSIzE0MClcblxuICAgICBXZSBpbmNsdWRlIGEgdHlwZSBDdXN0b20gb2YgXCJjdXN0b20gY29udmVydGVyc1wiLCB3aGVyZSBhblxuICAgICBhcmJpdHJhcnkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgb3IgbW9yZVxuICAgICBhcmd1bWVudHMuIFRoZXJlIGlzIG5vIHN5bnRheCBmb3IgY3VzdG9tIGNvbnZlcnRlcnMsIGl0IGlzIG9ubHlcbiAgICAgaW50ZW5kZWQgZm9yIGN1c3RvbSBwcm9jZXNzb3JzIHRoYXQgd2lzaCB0byByZWx5IG9uIHRoZVxuICAgICBzdGRsaWItZGVmaW5lZCBmb3JtYXQgR0FEVHMuXG5cbiAgICAgRm9yIGluc3RhbmNlIGEgcHJlLXByb2Nlc3NvciBjb3VsZCBjaG9vc2UgdG8gaW50ZXJwcmV0IHN0cmluZ3NcbiAgICAgcHJlZml4ZWQgd2l0aCBbXCIhXCJdIGFzIGZvcm1hdCBzdHJpbmdzIHdoZXJlIFsle3sgLi4uIH19XSBpc1xuICAgICBhIHNwZWNpYWwgZm9ybSB0byBwYXNzIGEgdG9fc3RyaW5nIGZ1bmN0aW9uLCBzbyB0aGF0IG9uZSBjb3VsZFxuICAgICB3cml0ZTpcblxuICAgICB7W1xuICAgICAgIHR5cGUgdCA9IHsgeCA6IGludDsgeSA6IGludCB9XG5cbiAgICAgICBsZXQgc3RyaW5nX29mX3QgdCA9IFByaW50Zi5zcHJpbnRmIFwieyB4ID0gJWQ7IHkgPSAlZCB9XCIgdC54IHQueVxuXG4gICAgICAgUHJpbnRmLnByaW50ZiAhXCJ0ID0gJXt7c3RyaW5nX29mX3R9fVwiIHsgeCA9IDQyOyB5ID0gNDIgfVxuICAgICBdfVxuICAqKVxuICB8IEN1c3RvbSA6XG4gICAgICAoJ2EsICd4LCAneSkgY3VzdG9tX2FyaXR5ICogKHVuaXQgLT4gJ3gpICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCd5LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIGVuZCBvZiBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uICopXG4gIHwgRW5kX29mX2Zvcm1hdCA6XG4gICAgICAgICgnZiwgJ2IsICdjLCAnZSwgJ2UsICdmKSBmbXRcblxuKCoqKilcblxuKCogVHlwZSBmb3IgaWdub3JlZCBwYXJhbWV0ZXJzIChzZWUgXCIlX1wiKS4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZCA9XG4gIHwgSWdub3JlZF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9jICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfY2FtbF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2QgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfbmF0aXZlaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbmQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfTGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZmxvYXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfZiAqKVxuICAgICAgcGFkX29wdGlvbiAqIHByZWNfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9ib29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9CICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV97Li4uJX0gKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXyguLi4lKSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZFxuICB8IElnbm9yZWRfcmVhZGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICgnYiAtPiAneCkgLT4gJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfW25sTkxdICopXG4gICAgICBjb3VudGVyIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8wYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcblxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID1cbiAgRm9ybWF0IG9mICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgKiBzdHJpbmdcblxubGV0IHJlYyBlcmFzZV9yZWwgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYsXG4gICBnLCBoLCBpLCBqLCBrLCBsKSBmbXR0eV9yZWwgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5XG49IGZ1bmN0aW9uXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBTdHJpbmdfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludF90eSByZXN0IC0+XG4gICAgSW50X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBOYXRpdmVpbnRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgQm9vbF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGVyYXNlX3JlbCByZXN0KVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCBfdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTEsIGVyYXNlX3JlbCByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBBbHBoYV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIFRoZXRhX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBSZWFkZXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCB0eXBlIGNvbmNhdGVuYXRpb24gKilcblxuKCogQ29uY2F0ZW5hdGUgdHdvIGZvcm1hdCB0eXBlcy4gKilcbigqIFVzZWQgYnk6XG4gICAqIHJlYWRlcl9uYl91bmlmaWVyX29mX2ZtdHR5IHRvIGNvdW50IHJlYWRlcnMgaW4gYW4gZm10dHksXG4gICAqIFNjYW5mLnRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgdG8gZXh0cmFjdCByZWFkZXJzIGluc2lkZSAlKC4uLiUpLFxuICAgKiBDYW1saW50ZXJuYWxGb3JtYXQuZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgdG8gZXh0cmFjdCBmb3JtYXQgdHlwZS4gKilcblxuKCpcbmxldCByZWMgY29uY2F0X2ZtdHR5IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggLlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChmLCBiLCBjLCBlLCBnLCBoKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXR0eSA9XG4qKVxubGV0IHJlYyBjb25jYXRfZm10dHkgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgICAgICBnMSBqMSBnMiBqMlxuICAuXG4gICAgKGcxLCBiMSwgYzEsIGoxLCBkMSwgYTEsXG4gICAgIGcyLCBiMiwgYzIsIGoyLCBkMiwgYTIpIGZtdHR5X3JlbCAtPlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWwgLT5cbiAgICAoZzEsIGIxLCBjMSwgajEsIGUxLCBmMSxcbiAgICAgZzIsIGIyLCBjMiwgajIsIGUyLCBmMikgZm10dHlfcmVsID1cbmZ1biBmbXR0eTEgZm10dHkyIC0+IG1hdGNoIGZtdHR5MSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgU3RyaW5nX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBJbnRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIE5hdGl2ZWludF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIEJvb2xfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgQWxwaGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgVGhldGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgUmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBFbmRfb2ZfZm10dHkgLT4gZm10dHkyXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgY29uY2F0ZW5hdGlvbiAqKVxuXG4oKiBDb25jYXRlbmF0ZSB0d28gZm9ybWF0cy4gKilcbmxldCByZWMgY29uY2F0X2ZtdCA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIC5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKGYsIGIsIGMsIGUsIGcsIGgpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXQgPVxuZnVuIGZtdDEgZm10MiAtPiBtYXRjaCBmbXQxIHdpdGhcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBTdHJpbmcgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBDYW1sX3N0cmluZyAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludDMyIChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgQ2hhciAocmVzdCkgLT5cbiAgICBDaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIENhbWxfY2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIEJvb2wgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIEFscGhhIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBUaGV0YSByZXN0IC0+XG4gICAgVGhldGEgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEN1c3RvbSAoYXJpdHksIGYsIHJlc3QpIC0+XG4gICAgQ3VzdG9tIChhcml0eSwgZiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgUmVhZGVyIHJlc3QgLT5cbiAgICBSZWFkZXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBGbHVzaCAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIFN0cmluZ19saXRlcmFsIChzdHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIENoYXJfbGl0ZXJhbCAgIChjaHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnICAgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3QgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgIFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFNjYW5fbmV4dF9jaGFyIChyZXN0KSAtPlxuICAgIFNjYW5fbmV4dF9jaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgSWdub3JlZF9wYXJhbSAoaWduLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgLT5cbiAgICBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgZm10MlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJlcmFzZV9yZWwiLCJwYXJhbSIsInJlc3QiLCJ0eSIsInR5MSIsImNvbmNhdF9mbXR0eSIsImZtdHR5MSIsImZtdHR5MiIsInR5MiIsImNvbmNhdF9mbXQiLCJmbXQxIiwiZm10MiIsInBhZCIsInByZWMiLCJpY29udiIsImZjb252Iiwic3RyIiwiY2hyIiwiZm10dHkiLCJmbXRpbmdfbGl0IiwiZm10aW5nX2dlbiIsImNoYXJfc2V0Iiwid2lkdGhfb3B0IiwiY291bnRlciIsImlnbiIsImYiLCJhcml0eSJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxVQUFBQztBQUFBQSxJQytnQlEsOEJBa0NZO0FBQUEsSUFsQ1o7QUFBQTtBQUFBLFdBQUFDLE9BQUEsVUFLSSwyQkFBZ0I7QUFBQTtBQUFBLFdBQUFBLFNBTHBCLFVBT00sNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQVB0QixVQVNHLDZCQUFnQjtBQUFBO0FBQUEsV0FBQUEsU0FUbkIsVUFXSyw2QkFBZ0I7QUFBQTtBQUFBLFdBQUFBLFNBWHJCLFVBZVMsNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQWZ6QixVQWFLLDZCQUFnQjtBQUFBO0FBQUEsV0FBQUEsU0FickIsVUFpQkssNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQWpCckIsVUFtQkksNkJBQWdCO0FBQUE7QUFBQSxXQUFBQSxTQW5CcEIsVUFBQUMsS0FBQTtBQUFBLE9BcUJlLGlDQUFjO0FBQUE7QUFBQSxXQUFBRCxTQXJCN0IsVUFBQUUsTUFBQTtBQUFBLE9BdUJ1Qix1Q0FBYztBQUFBO0FBQUEsV0FBQUYsU0F2QnJDLFVBeUJLLDhCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUF6QnJCLFVBMkJLLCtCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUEzQnJCLFVBNkJHLCtCQUFnQjtBQUFBO0FBQUEsV0FBQUEsVUE3Qm5CLFVBK0JNLCtCQUFnQjtBQUFBLG1CQUFBQSxVQS9CdEIsVUFpQ2Ms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QUEsT0F3RGUsa0RBQW9CO0FBQUE7QUFBQSxXQUFBbEIsVUF4RG5DLFNBOEJOLHNDQUFzQjtBQUFBO0FBQUEsV0FBQUEsVUE5QmhCLFNBQUFtQixXQUFBLFNBQUFDLFlBQUE7QUFBQSxPQTZDdUIsMkRBQW9CO0FBQUE7QUFBQSxXQUFBcEIsVUE3QzNDLFNBQUFxQixVQUFBO0FBQUEsT0ErQ2MsK0NBQW9CO0FBQUE7QUFBQSxXQUFBckIsVUEvQ2xDLFNBaURFLHNDQUFzQjtBQUFBO0FBQUEsV0FBQUEsVUFqRHhCLFNBQUFzQixNQUFBO0FBQUEsT0FtRE8sMkNBQW9CO0FBQUE7QUFBQSxXQUFBdEIsVUFuRDNCLFNBQUF1QixJQUFBLFNBQUFDLFFBQUE7QUFBQSxPQTRCSyxnREFBb0I7QUFBQTtBQUFBLEdBK0JsQztBQUFBLEdEanJCUiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjk0ODksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RkbGliLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFeGNlcHRpb25zICopXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlXCJcblxubGV0ICgpID1cbiAgKCogZm9yIHJ1bnRpbWUvZmFpbF9uYXQuYyAqKVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlBlcnZhc2l2ZXMuYXJyYXlfYm91bmRfZXJyb3JcIlxuICAgIChJbnZhbGlkX2FyZ3VtZW50IFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKVxuXG5leHRlcm5hbCByYWlzZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlXCJcbmV4dGVybmFsIHJhaXNlX25vdHJhY2UgOiBleG4gLT4gJ2EgPSBcIiVyYWlzZV9ub3RyYWNlXCJcblxubGV0IGZhaWx3aXRoIHMgPSByYWlzZShGYWlsdXJlIHMpXG5sZXQgaW52YWxpZF9hcmcgcyA9IHJhaXNlKEludmFsaWRfYXJndW1lbnQgcylcblxuZXhjZXB0aW9uIEV4aXRcbmV4Y2VwdGlvbiBNYXRjaF9mYWlsdXJlID0gTWF0Y2hfZmFpbHVyZVxuZXhjZXB0aW9uIEFzc2VydF9mYWlsdXJlID0gQXNzZXJ0X2ZhaWx1cmVcbmV4Y2VwdGlvbiBJbnZhbGlkX2FyZ3VtZW50ID0gSW52YWxpZF9hcmd1bWVudFxuZXhjZXB0aW9uIEZhaWx1cmUgPSBGYWlsdXJlXG5leGNlcHRpb24gTm90X2ZvdW5kID0gTm90X2ZvdW5kXG5leGNlcHRpb24gT3V0X29mX21lbW9yeSA9IE91dF9vZl9tZW1vcnlcbmV4Y2VwdGlvbiBTdGFja19vdmVyZmxvdyA9IFN0YWNrX292ZXJmbG93XG5leGNlcHRpb24gU3lzX2Vycm9yID0gU3lzX2Vycm9yXG5leGNlcHRpb24gRW5kX29mX2ZpbGUgPSBFbmRfb2ZfZmlsZVxuZXhjZXB0aW9uIERpdmlzaW9uX2J5X3plcm8gPSBEaXZpc2lvbl9ieV96ZXJvXG5leGNlcHRpb24gU3lzX2Jsb2NrZWRfaW8gPSBTeXNfYmxvY2tlZF9pb1xuZXhjZXB0aW9uIFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlID0gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGVcblxuKCogQ29tcG9zaXRpb24gb3BlcmF0b3JzICopXG5cbmV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5leHRlcm5hbCAoIEBAICkgOiAoJ2EgLT4gJ2IpIC0+ICdhIC0+ICdiID0gXCIlYXBwbHlcIlxuXG4oKiBEZWJ1Z2dpbmcgKilcblxuZXh0ZXJuYWwgX19MT0NfXyA6IHN0cmluZyA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19GSUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfRklMRVwiXG5leHRlcm5hbCBfX0xJTkVfXyA6IGludCA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fTU9EVUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfTU9EVUxFXCJcbmV4dGVybmFsIF9fUE9TX18gOiBzdHJpbmcgKiBpbnQgKiBpbnQgKiBpbnQgPSBcIiVsb2NfUE9TXCJcbmV4dGVybmFsIF9fRlVOQ1RJT05fXyA6IHN0cmluZyA9IFwiJWxvY19GVU5DVElPTlwiXG5cbmV4dGVybmFsIF9fTE9DX09GX18gOiAnYSAtPiBzdHJpbmcgKiAnYSA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19MSU5FX09GX18gOiAnYSAtPiBpbnQgKiAnYSA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fUE9TX09GX18gOiAnYSAtPiAoc3RyaW5nICogaW50ICogaW50ICogaW50KSAqICdhID0gXCIlbG9jX1BPU1wiXG5cbigqIENvbXBhcmlzb25zICopXG5cbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5leHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5leHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5leHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbmV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuXG5sZXQgbWluIHggeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbmV4dGVybmFsICggPT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcVwiXG5leHRlcm5hbCAoICE9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXFcIlxuXG4oKiBCb29sZWFuIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuXG4oKiBJbnRlZ2VyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgKCB+LSApIDogaW50IC0+IGludCA9IFwiJW5lZ2ludFwiXG5leHRlcm5hbCAoIH4rICkgOiBpbnQgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5leHRlcm5hbCAoICsgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsICggLSApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgKCAqICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW11bGludFwiXG5leHRlcm5hbCAoIC8gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbmV4dGVybmFsICggbW9kICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW1vZGludFwiXG5cbmxldCBhYnMgeCA9IGlmIHggPj0gMCB0aGVuIHggZWxzZSAteFxuXG5leHRlcm5hbCAoIGxhbmQgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsICggbG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsICggbHhvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxuXG5sZXQgbG5vdCB4ID0geCBseG9yICgtMSlcblxuZXh0ZXJuYWwgKCBsc2wgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNsaW50XCJcbmV4dGVybmFsICggbHNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5leHRlcm5hbCAoIGFzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhc3JpbnRcIlxuXG5sZXQgbWF4X2ludCA9ICgtMSkgbHNyIDFcbmxldCBtaW5faW50ID0gbWF4X2ludCArIDFcblxuKCogRmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCAoIH4tLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVuZWdmbG9hdFwiXG5leHRlcm5hbCAoIH4rLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCAoICsuICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFkZGZsb2F0XCJcbmV4dGVybmFsICggLS4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlc3ViZmxvYXRcIlxuZXh0ZXJuYWwgKCAqLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVtdWxmbG9hdFwiXG5leHRlcm5hbCAoIC8uICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWRpdmZsb2F0XCJcbmV4dGVybmFsICggKiogKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Bvd2VyX2Zsb2F0XCIgXCJwb3dcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc19mbG9hdFwiIFwiYWNvc1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbl9mbG9hdFwiIFwiYXNpblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbl9mbG9hdFwiIFwiYXRhblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW4yX2Zsb2F0XCIgXCJhdGFuMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBoeXBvdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICA9IFwiY2FtbF9oeXBvdF9mbG9hdFwiIFwiY2FtbF9oeXBvdFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NfZmxvYXRcIiBcImNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zaF9mbG9hdFwiIFwiY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NoX2Zsb2F0XCIgXCJjYW1sX2Fjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZ19mbG9hdFwiIFwibG9nXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzEwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMTBfZmxvYXRcIiBcImxvZzEwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luaF9mbG9hdFwiIFwiY2FtbF9hc2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5fZmxvYXRcIiBcInRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuaF9mbG9hdFwiIFwidGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5oX2Zsb2F0XCIgXCJjYW1sX2F0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNlaWwgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jZWlsX2Zsb2F0XCIgXCJjZWlsXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb29yIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZmxvb3JfZmxvYXRcIiBcImZsb29yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFic19mbG9hdCA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWJzZmxvYXRcIlxuZXh0ZXJuYWwgY29weXNpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZF9mbG9hdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Ztb2RfZmxvYXRcIiBcImZtb2RcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbmV4dGVybmFsIGZsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBmbG9hdF9vZl9pbnQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIHRydW5jYXRlIDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBpbnRfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgaW5maW5pdHkgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgbmVnX2luZmluaXR5ID1cbiAgZmxvYXRfb2ZfYml0cyAweEZGX0YwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IG5hbiA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9GOF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBtYXhfZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRUZfRkZfRkZfRkZfRkZfRkZfRkZMXG5sZXQgbWluX2Zsb2F0ID1cbiAgZmxvYXRfb2ZfYml0cyAweDAwXzEwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IGVwc2lsb25fZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4M0NfQjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5cbnR5cGUgZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuXG4oKiBTdHJpbmcgYW5kIGJ5dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZXMgU3RyaW5nIGFuZCBCeXRlcyAqKVxuXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgYnl0ZXNfbGVuZ3RoIDogYnl0ZXMgLT4gaW50ID0gXCIlYnl0ZXNfbGVuZ3RoXCJcbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZSA6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgc3RyaW5nX2JsaXQgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfYmxpdCA6IGJ5dGVzIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyA6IGJ5dGVzIC0+IHN0cmluZyA9IFwiJWJ5dGVzX3RvX3N0cmluZ1wiXG5cbmxldCAoIF4gKSBzMSBzMiA9XG4gIGxldCBsMSA9IHN0cmluZ19sZW5ndGggczEgYW5kIGwyID0gc3RyaW5nX2xlbmd0aCBzMiBpblxuICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSAobDEgKyBsMikgaW5cbiAgc3RyaW5nX2JsaXQgczEgMCBzIDAgbDE7XG4gIHN0cmluZ19ibGl0IHMyIDAgcyBsMSBsMjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbigqIENoYXJhY3RlciBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlIENoYXIgKilcblxuZXh0ZXJuYWwgaW50X29mX2NoYXIgOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaGFyX29mX2ludCA6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxubGV0IGNoYXJfb2ZfaW50IG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJjaGFyX29mX2ludFwiIGVsc2UgdW5zYWZlX2NoYXJfb2ZfaW50IG5cblxuKCogVW5pdCBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4oKiBQYWlyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgZnN0IDogJ2EgKiAnYiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCBzbmQgOiAnYSAqICdiIC0+ICdiID0gXCIlZmllbGQxXCJcblxuKCogUmVmZXJlbmNlcyAqKVxuXG50eXBlICdhIHJlZiA9IHsgbXV0YWJsZSBjb250ZW50cyA6ICdhIH1cbmV4dGVybmFsIHJlZiA6ICdhIC0+ICdhIHJlZiA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsICggISApIDogJ2EgcmVmIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsICggOj0gKSA6ICdhIHJlZiAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcbmV4dGVybmFsIGluY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVpbmNyXCJcbmV4dGVybmFsIGRlY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVkZWNyXCJcblxuKCogUmVzdWx0IHR5cGUgKilcblxudHlwZSAoJ2EsJ2IpIHJlc3VsdCA9IE9rIG9mICdhIHwgRXJyb3Igb2YgJ2JcblxuKCogU3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcbmV4dGVybmFsIGZvcm1hdF9mbG9hdCA6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcblxubGV0IHN0cmluZ19vZl9ib29sIGIgPVxuICBpZiBiIHRoZW4gXCJ0cnVlXCIgZWxzZSBcImZhbHNlXCJcbmxldCBib29sX29mX3N0cmluZyA9IGZ1bmN0aW9uXG4gIHwgXCJ0cnVlXCIgLT4gdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBmYWxzZVxuICB8IF8gLT4gaW52YWxpZF9hcmcgXCJib29sX29mX3N0cmluZ1wiXG5cbmxldCBib29sX29mX3N0cmluZ19vcHQgPSBmdW5jdGlvblxuICB8IFwidHJ1ZVwiIC0+IFNvbWUgdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBTb21lIGZhbHNlXG4gIHwgXyAtPiBOb25lXG5cbmxldCBzdHJpbmdfb2ZfaW50IG4gPVxuICBmb3JtYXRfaW50IFwiJWRcIiBuXG5cbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxuXG5sZXQgaW50X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5leHRlcm5hbCBzdHJpbmdfZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcblxubGV0IHZhbGlkX2Zsb2F0X2xleGVtIHMgPVxuICBsZXQgbCA9IHN0cmluZ19sZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA+PSBsIHRoZW4gcyBeIFwiLlwiIGVsc2VcbiAgICBtYXRjaCBzdHJpbmdfZ2V0IHMgaSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IGxvb3AgKGkgKyAxKVxuICAgIHwgXyAtPiBzXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgc3RyaW5nX29mX2Zsb2F0IGYgPSB2YWxpZF9mbG9hdF9sZXhlbSAoZm9ybWF0X2Zsb2F0IFwiJS4xMmdcIiBmKVxuXG5leHRlcm5hbCBmbG9hdF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcblxubGV0IGZsb2F0X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGZsb2F0X29mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbigqIExpc3Qgb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZSBMaXN0ICopXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjICggQCApIGwxIGwyID1cbiAgbWF0Y2ggbDEgd2l0aFxuICB8IFtdIC0+IGwyXG4gIHwgaDEgOjogW10gLT4gaDEgOjogbDJcbiAgfCBoMSA6OiBoMiA6OiBbXSAtPiBoMSA6OiBoMiA6OiBsMlxuICB8IGgxIDo6IGgyIDo6IGgzIDo6IHRsIC0+IGgxIDo6IGgyIDo6IGgzIDo6ICh0bCBAIGwyKVxuXG4oKiBJL08gb3BlcmF0aW9ucyAqKVxuXG50eXBlIGluX2NoYW5uZWxcbnR5cGUgb3V0X2NoYW5uZWxcblxuZXh0ZXJuYWwgb3Blbl9kZXNjcmlwdG9yX291dCA6IGludCAtPiBvdXRfY2hhbm5lbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XCJcbmV4dGVybmFsIG9wZW5fZGVzY3JpcHRvcl9pbiA6IGludCAtPiBpbl9jaGFubmVsID0gXCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblwiXG5cbmxldCBzdGRpbiA9IG9wZW5fZGVzY3JpcHRvcl9pbiAwXG5sZXQgc3Rkb3V0ID0gb3Blbl9kZXNjcmlwdG9yX291dCAxXG5sZXQgc3RkZXJyID0gb3Blbl9kZXNjcmlwdG9yX291dCAyXG5cbigqIEdlbmVyYWwgb3V0cHV0IGZ1bmN0aW9ucyAqKVxuXG50eXBlIG9wZW5fZmxhZyA9XG4gICAgT3Blbl9yZG9ubHkgfCBPcGVuX3dyb25seSB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdCB8IE9wZW5fdHJ1bmMgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeSB8IE9wZW5fdGV4dCB8IE9wZW5fbm9uYmxvY2tcblxuZXh0ZXJuYWwgb3Blbl9kZXNjIDogc3RyaW5nIC0+IG9wZW5fZmxhZyBsaXN0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfc3lzX29wZW5cIlxuXG5leHRlcm5hbCBzZXRfb3V0X2NoYW5uZWxfbmFtZTogb3V0X2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX291dF9nZW4gbW9kZSBwZXJtIG5hbWUgPVxuICBsZXQgYyA9IG9wZW5fZGVzY3JpcHRvcl9vdXQob3Blbl9kZXNjIG5hbWUgbW9kZSBwZXJtKSBpblxuICBzZXRfb3V0X2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5fb3V0IG5hbWUgPVxuICBvcGVuX291dF9nZW4gW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX3RydW5jOyBPcGVuX3RleHRdIDBvNjY2IG5hbWVcblxubGV0IG9wZW5fb3V0X2JpbiBuYW1lID1cbiAgb3Blbl9vdXRfZ2VuIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl90cnVuYzsgT3Blbl9iaW5hcnldIDBvNjY2IG5hbWVcblxuZXh0ZXJuYWwgZmx1c2ggOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2ZsdXNoXCJcblxuZXh0ZXJuYWwgb3V0X2NoYW5uZWxzX2xpc3QgOiB1bml0IC0+IG91dF9jaGFubmVsIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dF9jaGFubmVsc19saXN0XCJcblxubGV0IGZsdXNoX2FsbCAoKSA9XG4gIGxldCByZWMgaXRlciA9IGZ1bmN0aW9uXG4gICAgICBbXSAtPiAoKVxuICAgIHwgYTo6bCAtPlxuICAgICAgICBiZWdpbiB0cnlcbiAgICAgICAgICAgIGZsdXNoIGFcbiAgICAgICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgICAgICgpICgqIGlnbm9yZSBjaGFubmVscyBjbG9zZWQgZHVyaW5nIGEgcHJlY2VkaW5nIGZsdXNoLiAqKVxuICAgICAgICBlbmQ7XG4gICAgICAgIGl0ZXIgbFxuICBpbiBpdGVyIChvdXRfY2hhbm5lbHNfbGlzdCAoKSlcblxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dCA6IG91dF9jaGFubmVsIC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dF9zdHJpbmcgOiBvdXRfY2hhbm5lbCAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRcIlxuXG5leHRlcm5hbCBvdXRwdXRfY2hhciA6IG91dF9jaGFubmVsIC0+IGNoYXIgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5cbmxldCBvdXRwdXRfYnl0ZXMgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXQgb2MgcyAwIChieXRlc19sZW5ndGggcylcblxubGV0IG91dHB1dF9zdHJpbmcgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXRfc3RyaW5nIG9jIHMgMCAoc3RyaW5nX2xlbmd0aCBzKVxuXG5sZXQgb3V0cHV0IG9jIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwib3V0cHV0XCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0IG9jIHMgb2ZzIGxlblxuXG5sZXQgb3V0cHV0X3N1YnN0cmluZyBvYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gc3RyaW5nX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJvdXRwdXRfc3Vic3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0X3N0cmluZyBvYyBzIG9mcyBsZW5cblxuZXh0ZXJuYWwgb3V0cHV0X2J5dGUgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5leHRlcm5hbCBvdXRwdXRfYmluYXJ5X2ludCA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9pbnRcIlxuXG5leHRlcm5hbCBtYXJzaGFsX3RvX2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiAnYSAtPiB1bml0IGxpc3QgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxubGV0IG91dHB1dF92YWx1ZSBjaGFuIHYgPSBtYXJzaGFsX3RvX2NoYW5uZWwgY2hhbiB2IFtdXG5cbmV4dGVybmFsIHNlZWtfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRcIlxuZXh0ZXJuYWwgcG9zX291dCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3Nfb3V0XCJcbmV4dGVybmFsIG91dF9jaGFubmVsX2xlbmd0aCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2Vfb3V0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2Nsb3NlX2NoYW5uZWxcIlxubGV0IGNsb3NlX291dCBvYyA9IGZsdXNoIG9jOyBjbG9zZV9vdXRfY2hhbm5lbCBvY1xubGV0IGNsb3NlX291dF9ub2VyciBvYyA9XG4gICh0cnkgZmx1c2ggb2Mgd2l0aCBfIC0+ICgpKTtcbiAgKHRyeSBjbG9zZV9vdXRfY2hhbm5lbCBvYyB3aXRoIF8gLT4gKCkpXG5leHRlcm5hbCBzZXRfYmluYXJ5X21vZGVfb3V0IDogb3V0X2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZVwiXG5cbigqIEdlbmVyYWwgaW5wdXQgZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIHNldF9pbl9jaGFubmVsX25hbWU6IGluX2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX2luX2dlbiBtb2RlIHBlcm0gbmFtZSA9XG4gIGxldCBjID0gb3Blbl9kZXNjcmlwdG9yX2luKG9wZW5fZGVzYyBuYW1lIG1vZGUgcGVybSkgaW5cbiAgc2V0X2luX2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5faW4gbmFtZSA9XG4gIG9wZW5faW5fZ2VuIFtPcGVuX3Jkb25seTsgT3Blbl90ZXh0XSAwIG5hbWVcblxubGV0IG9wZW5faW5fYmluIG5hbWUgPVxuICBvcGVuX2luX2dlbiBbT3Blbl9yZG9ubHk7IE9wZW5fYmluYXJ5XSAwIG5hbWVcblxuZXh0ZXJuYWwgaW5wdXRfY2hhciA6IGluX2NoYW5uZWwgLT4gY2hhciA9IFwiY2FtbF9tbF9pbnB1dF9jaGFyXCJcblxuZXh0ZXJuYWwgdW5zYWZlX2lucHV0IDogaW5fY2hhbm5lbCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX2lucHV0XCJcblxubGV0IGlucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9pbnB1dCBpYyBzIG9mcyBsZW5cblxubGV0IHJlYyB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gKCkgZWxzZSBiZWdpblxuICAgIGxldCByID0gdW5zYWZlX2lucHV0IGljIHMgb2ZzIGxlbiBpblxuICAgIGlmIHIgPSAwXG4gICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIChvZnMgKyByKSAobGVuIC0gcilcbiAgZW5kXG5cbmxldCByZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJyZWFsbHlfaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIGxlbiBpblxuICByZWFsbHlfaW5wdXQgaWMgcyAwIGxlbjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbmV4dGVybmFsIGlucHV0X3NjYW5fbGluZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X3NjYW5fbGluZVwiXG5cbmxldCBpbnB1dF9saW5lIGNoYW4gPVxuICBsZXQgcmVjIGJ1aWxkX3Jlc3VsdCBidWYgcG9zID0gZnVuY3Rpb25cbiAgICBbXSAtPiBidWZcbiAgfCBoZCA6OiB0bCAtPlxuICAgICAgbGV0IGxlbiA9IGJ5dGVzX2xlbmd0aCBoZCBpblxuICAgICAgYnl0ZXNfYmxpdCBoZCAwIGJ1ZiAocG9zIC0gbGVuKSBsZW47XG4gICAgICBidWlsZF9yZXN1bHQgYnVmIChwb3MgLSBsZW4pIHRsIGluXG4gIGxldCByZWMgc2NhbiBhY2N1IGxlbiA9XG4gICAgbGV0IG4gPSBpbnB1dF9zY2FuX2xpbmUgY2hhbiBpblxuICAgIGlmIG4gPSAwIHRoZW4gYmVnaW4gICAgICAgICAgICAgICAgICAgKCogbiA9IDA6IHdlIGFyZSBhdCBFT0YgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgfCBfICAtPiBidWlsZF9yZXN1bHQgKGJ5dGVzX2NyZWF0ZSBsZW4pIGxlbiBhY2N1XG4gICAgZW5kIGVsc2UgaWYgbiA+IDAgdGhlbiBiZWdpbiAgICAgICAgICAoKiBuID4gMDogbmV3bGluZSBmb3VuZCBpbiBidWZmZXIgKilcbiAgICAgIGxldCByZXMgPSBieXRlc19jcmVhdGUgKG4gLSAxKSBpblxuICAgICAgaWdub3JlICh1bnNhZmVfaW5wdXQgY2hhbiByZXMgMCAobiAtIDEpKTtcbiAgICAgIGlnbm9yZSAoaW5wdXRfY2hhciBjaGFuKTsgICAgICAgICAgICgqIHNraXAgdGhlIG5ld2xpbmUgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByZXNcbiAgICAgIHwgIF8gLT4gbGV0IGxlbiA9IGxlbiArIG4gLSAxIGluXG4gICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdCAoYnl0ZXNfY3JlYXRlIGxlbikgbGVuIChyZXMgOjogYWNjdSlcbiAgICBlbmQgZWxzZSBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICgqIG4gPCAwOiBuZXdsaW5lIG5vdCBmb3VuZCAqKVxuICAgICAgbGV0IGJlZyA9IGJ5dGVzX2NyZWF0ZSAoLW4pIGluXG4gICAgICBpZ25vcmUodW5zYWZlX2lucHV0IGNoYW4gYmVnIDAgKC1uKSk7XG4gICAgICBzY2FuIChiZWcgOjogYWNjdSkgKGxlbiAtIG4pXG4gICAgZW5kXG4gIGluIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgKHNjYW4gW10gMClcblxuZXh0ZXJuYWwgaW5wdXRfYnl0ZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2NoYXJcIlxuZXh0ZXJuYWwgaW5wdXRfYmluYXJ5X2ludCA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2ludFwiXG5leHRlcm5hbCBpbnB1dF92YWx1ZSA6IGluX2NoYW5uZWwgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVcIlxuZXh0ZXJuYWwgc2Vla19pbiA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pblwiXG5leHRlcm5hbCBwb3NfaW4gOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3NfaW5cIlxuZXh0ZXJuYWwgaW5fY2hhbm5lbF9sZW5ndGggOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2VfaW4gOiBpbl9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfY2xvc2VfY2hhbm5lbFwiXG5sZXQgY2xvc2VfaW5fbm9lcnIgaWMgPSAodHJ5IGNsb3NlX2luIGljIHdpdGggXyAtPiAoKSlcbmV4dGVybmFsIHNldF9iaW5hcnlfbW9kZV9pbiA6IGluX2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXCJcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBvdXRwdXQgKilcblxubGV0IHByaW50X2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZG91dCBjXG5sZXQgcHJpbnRfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCBzXG5sZXQgcHJpbnRfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRvdXQgc1xubGV0IHByaW50X2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmludF9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByaW50X2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3Rkb3V0IHM7IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5sZXQgcHJpbnRfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5cbigqIE91dHB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgZXJyb3IgKilcblxubGV0IHByZXJyX2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZGVyciBjXG5sZXQgcHJlcnJfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciBzXG5sZXQgcHJlcnJfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRlcnIgc1xubGV0IHByZXJyX2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmVycl9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByZXJyX2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3RkZXJyIHM7IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5sZXQgcHJlcnJfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5cbigqIElucHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBpbnB1dCAqKVxuXG5sZXQgcmVhZF9saW5lICgpID0gZmx1c2ggc3Rkb3V0OyBpbnB1dF9saW5lIHN0ZGluXG5sZXQgcmVhZF9pbnQgKCkgPSBpbnRfb2Zfc3RyaW5nKHJlYWRfbGluZSgpKVxubGV0IHJlYWRfaW50X29wdCAoKSA9IGludF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxubGV0IHJlYWRfZmxvYXQgKCkgPSBmbG9hdF9vZl9zdHJpbmcocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9mbG9hdF9vcHQgKCkgPSBmbG9hdF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxuXG4oKiBPcGVyYXRpb25zIG9uIGxhcmdlIGZpbGVzICopXG5cbm1vZHVsZSBMYXJnZUZpbGUgPVxuICBzdHJ1Y3RcbiAgICBleHRlcm5hbCBzZWVrX291dCA6IG91dF9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRfNjRcIlxuICAgIGV4dGVybmFsIHBvc19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3Nfb3V0XzY0XCJcbiAgICBleHRlcm5hbCBvdXRfY2hhbm5lbF9sZW5ndGggOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICAgIGV4dGVybmFsIHNlZWtfaW4gOiBpbl9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pbl82NFwiXG4gICAgZXh0ZXJuYWwgcG9zX2luIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3NfaW5fNjRcIlxuICAgIGV4dGVybmFsIGluX2NoYW5uZWxfbGVuZ3RoIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICBlbmRcblxuKCogRm9ybWF0cyAqKVxuXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gICA9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxuICAgPSBGb3JtYXQgb2YgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mbXRcbiAgICAgICAgICAgICAgICogc3RyaW5nXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0ID0gKCdhLCAnYiwgJ2MsICdjLCAnYywgJ2QpIGZvcm1hdDZcblxudHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MsICdjKSBmb3JtYXQ0XG5cbmxldCBzdHJpbmdfb2ZfZm9ybWF0IChGb3JtYXQgKF9mbXQsIHN0cikpID0gc3RyXG5cbmV4dGVybmFsIGZvcm1hdF9vZl9zdHJpbmcgOlxuICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPSBcIiVpZGVudGl0eVwiXG5cbmxldCAoIF5eICkgKEZvcm1hdCAoZm10MSwgc3RyMSkpIChGb3JtYXQgKGZtdDIsIHN0cjIpKSA9XG4gIEZvcm1hdCAoQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmNvbmNhdF9mbXQgZm10MSBmbXQyLFxuICAgICAgICAgIHN0cjEgXiBcIiUsXCIgXiBzdHIyKVxuXG4oKiBNaXNjZWxsYW5lb3VzICopXG5cbmV4dGVybmFsIHN5c19leGl0IDogaW50IC0+ICdhID0gXCJjYW1sX3N5c19leGl0XCJcblxuKCogZm9yIGF0X2V4aXQgKilcbnR5cGUgJ2EgYXRvbWljX3RcbmV4dGVybmFsIGF0b21pY19tYWtlIDogJ2EgLT4gJ2EgYXRvbWljX3QgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCBhdG9taWNfZ2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgPSBcIiVhdG9taWNfbG9hZFwiXG5leHRlcm5hbCBhdG9taWNfY29tcGFyZV9hbmRfc2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgLT4gJ2EgLT4gYm9vbFxuICA9IFwiJWF0b21pY19jYXNcIlxuXG5sZXQgZXhpdF9mdW5jdGlvbiA9IGF0b21pY19tYWtlIGZsdXNoX2FsbFxuXG5sZXQgcmVjIGF0X2V4aXQgZiA9XG4gICgqIE1QUiM3MjUzLCBNUFIjNzc5NjogbWFrZSBzdXJlIFwiZlwiIGlzIGV4ZWN1dGVkIG9ubHkgb25jZSAqKVxuICBsZXQgZl95ZXRfdG9fcnVuID0gYXRvbWljX21ha2UgdHJ1ZSBpblxuICBsZXQgb2xkX2V4aXQgPSBhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24gaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBpZiBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGZfeWV0X3RvX3J1biB0cnVlIGZhbHNlIHRoZW4gZiAoKSA7XG4gICAgb2xkX2V4aXQgKClcbiAgaW5cbiAgbGV0IHN1Y2Nlc3MgPSBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGV4aXRfZnVuY3Rpb24gb2xkX2V4aXQgbmV3X2V4aXQgaW5cbiAgaWYgbm90IHN1Y2Nlc3MgdGhlbiBhdF9leGl0IGZcblxubGV0IGRvX2RvbWFpbl9sb2NhbF9hdF9leGl0ID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgKCFkb19kb21haW5fbG9jYWxfYXRfZXhpdCkgKCk7XG4gIChhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24pICgpXG5cbmxldCBleGl0IHJldGNvZGUgPVxuICBkb19hdF9leGl0ICgpO1xuICBzeXNfZXhpdCByZXRjb2RlXG5cbmxldCBfID0gcmVnaXN0ZXJfbmFtZWRfdmFsdWUgXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIiBkb19hdF9leGl0XG5cbigqTU9EVUxFX0FMSUFTRVMqKVxubW9kdWxlIEFyZyAgICAgICAgICAgID0gQXJnXG5tb2R1bGUgQXJyYXkgICAgICAgICAgPSBBcnJheVxubW9kdWxlIEFycmF5TGFiZWxzICAgID0gQXJyYXlMYWJlbHNcbm1vZHVsZSBBdG9taWMgICAgICAgICA9IEF0b21pY1xubW9kdWxlIEJpZ2FycmF5ICAgICAgID0gQmlnYXJyYXlcbm1vZHVsZSBCb29sICAgICAgICAgICA9IEJvb2xcbm1vZHVsZSBCdWZmZXIgICAgICAgICA9IEJ1ZmZlclxubW9kdWxlIEJ5dGVzICAgICAgICAgID0gQnl0ZXNcbm1vZHVsZSBCeXRlc0xhYmVscyAgICA9IEJ5dGVzTGFiZWxzXG5tb2R1bGUgQ2FsbGJhY2sgICAgICAgPSBDYWxsYmFja1xubW9kdWxlIENoYXIgICAgICAgICAgID0gQ2hhclxubW9kdWxlIENvbXBsZXggICAgICAgID0gQ29tcGxleFxubW9kdWxlIENvbmRpdGlvbiAgICAgID0gQ29uZGl0aW9uXG5tb2R1bGUgRGlnZXN0ICAgICAgICAgPSBEaWdlc3Rcbm1vZHVsZSBEb21haW4gICAgICAgICA9IERvbWFpblxubW9kdWxlIER5bmFycmF5ICAgICAgID0gRHluYXJyYXlcbm1vZHVsZSBFZmZlY3QgICAgICAgICA9IEVmZmVjdFxubW9kdWxlIEVpdGhlciAgICAgICAgID0gRWl0aGVyXG5tb2R1bGUgRXBoZW1lcm9uICAgICAgPSBFcGhlbWVyb25cbm1vZHVsZSBGaWxlbmFtZSAgICAgICA9IEZpbGVuYW1lXG5tb2R1bGUgRmxvYXQgICAgICAgICAgPSBGbG9hdFxubW9kdWxlIEZvcm1hdCAgICAgICAgID0gRm9ybWF0XG5tb2R1bGUgRnVuICAgICAgICAgICAgPSBGdW5cbm1vZHVsZSBHYyAgICAgICAgICAgICA9IEdjXG5tb2R1bGUgSGFzaHRibCAgICAgICAgPSBIYXNodGJsXG5tb2R1bGUgSW5fY2hhbm5lbCAgICAgPSBJbl9jaGFubmVsXG5tb2R1bGUgSW50ICAgICAgICAgICAgPSBJbnRcbm1vZHVsZSBJbnQzMiAgICAgICAgICA9IEludDMyXG5tb2R1bGUgSW50NjQgICAgICAgICAgPSBJbnQ2NFxubW9kdWxlIExhenkgICAgICAgICAgID0gTGF6eVxubW9kdWxlIExleGluZyAgICAgICAgID0gTGV4aW5nXG5tb2R1bGUgTGlzdCAgICAgICAgICAgPSBMaXN0XG5tb2R1bGUgTGlzdExhYmVscyAgICAgPSBMaXN0TGFiZWxzXG5tb2R1bGUgTWFwICAgICAgICAgICAgPSBNYXBcbm1vZHVsZSBNYXJzaGFsICAgICAgICA9IE1hcnNoYWxcbm1vZHVsZSBNb3JlTGFiZWxzICAgICA9IE1vcmVMYWJlbHNcbm1vZHVsZSBNdXRleCAgICAgICAgICA9IE11dGV4XG5tb2R1bGUgTmF0aXZlaW50ICAgICAgPSBOYXRpdmVpbnRcbm1vZHVsZSBPYmogICAgICAgICAgICA9IE9ialxubW9kdWxlIE9vICAgICAgICAgICAgID0gT29cbm1vZHVsZSBPcHRpb24gICAgICAgICA9IE9wdGlvblxubW9kdWxlIE91dF9jaGFubmVsICAgID0gT3V0X2NoYW5uZWxcbm1vZHVsZSBQYXJzaW5nICAgICAgICA9IFBhcnNpbmdcbm1vZHVsZSBQcmludGV4YyAgICAgICA9IFByaW50ZXhjXG5tb2R1bGUgUHJpbnRmICAgICAgICAgPSBQcmludGZcbm1vZHVsZSBRdWV1ZSAgICAgICAgICA9IFF1ZXVlXG5tb2R1bGUgUmFuZG9tICAgICAgICAgPSBSYW5kb21cbm1vZHVsZSBSZXN1bHQgICAgICAgICA9IFJlc3VsdFxubW9kdWxlIFNjYW5mICAgICAgICAgID0gU2NhbmZcbm1vZHVsZSBTZW1hcGhvcmUgICAgICA9IFNlbWFwaG9yZVxubW9kdWxlIFNlcSAgICAgICAgICAgID0gU2VxXG5tb2R1bGUgU2V0ICAgICAgICAgICAgPSBTZXRcbm1vZHVsZSBTdGFjayAgICAgICAgICA9IFN0YWNrXG5tb2R1bGUgU3RkTGFiZWxzICAgICAgPSBTdGRMYWJlbHNcbm1vZHVsZSBTdHJpbmcgICAgICAgICA9IFN0cmluZ1xubW9kdWxlIFN0cmluZ0xhYmVscyAgID0gU3RyaW5nTGFiZWxzXG5tb2R1bGUgU3lzICAgICAgICAgICAgPSBTeXNcbm1vZHVsZSBUeXBlICAgICAgICAgICA9IFR5cGVcbm1vZHVsZSBVY2hhciAgICAgICAgICA9IFVjaGFyXG5tb2R1bGUgVW5pdCAgICAgICAgICAgPSBVbml0XG5tb2R1bGUgV2VhayAgICAgICAgICAgPSBXZWFrXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYXRvbWljX2NhcyIsImNhbWxfYXRvbWljX2xvYWQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfZmxvYXRfb2Zfc3RyaW5nIiwiY2FtbF9pbnRfb2Zfc3RyaW5nIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX21sX2NoYW5uZWxfc2l6ZSIsImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0IiwiY2FtbF9tbF9jbG9zZV9jaGFubmVsIiwiY2FtbF9tbF9mbHVzaCIsImNhbWxfbWxfaW5wdXQiLCJjYW1sX21sX2lucHV0X2NoYXIiLCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbiIsImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dCIsImNhbWxfbWxfb3V0cHV0IiwiY2FtbF9tbF9vdXRwdXRfYnl0ZXMiLCJjYW1sX21sX291dHB1dF9jaGFyIiwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUiLCJjYW1sX21sX3NldF9jaGFubmVsX25hbWUiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19jb25jYXQiLCJjYW1sX3N0cmluZ19vZl9ieXRlcyIsImNhbWxfc3lzX29wZW4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImdsb2JhbF9kYXRhIiwiQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzIiwiSW52YWxpZF9hcmd1bWVudCIsIkZhaWx1cmUiLCJNYXRjaF9mYWlsdXJlIiwiQXNzZXJ0X2ZhaWx1cmUiLCJOb3RfZm91bmQiLCJPdXRfb2ZfbWVtb3J5IiwiU3RhY2tfb3ZlcmZsb3ciLCJTeXNfZXJyb3IiLCJFbmRfb2ZfZmlsZSIsIkRpdmlzaW9uX2J5X3plcm8iLCJTeXNfYmxvY2tlZF9pbyIsIlVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlIiwiZmFpbHdpdGgiLCJzIiwiaW52YWxpZF9hcmciLCJFeGl0IiwibWluIiwieCIsInkiLCJtYXgiLCJhYnMiLCJsbm90IiwiY2hhcl9vZl9pbnQiLCJuIiwiY3N0X2ZhbHNlIiwiY3N0X3RydWUiLCJzdHJpbmdfb2ZfYm9vbCIsImIiLCJib29sX29mX3N0cmluZyIsInBhcmFtIiwiYm9vbF9vZl9zdHJpbmdfb3B0Iiwic3RyaW5nX29mX2ludCIsImludF9vZl9zdHJpbmdfb3B0IiwiZXhuIiwidmFsaWRfZmxvYXRfbGV4ZW0iLCJzMSIsImwiLCJpIiwibWF0Y2giLCJzdHJpbmdfb2ZfZmxvYXQiLCJmbG9hdF9vZl9zdHJpbmdfb3B0Iiwic3ltYm9sIiwibDEiLCJsMiIsImgxIiwiaDIiLCJ0bCIsImgzIiwiYmxvY2siLCJkc3QiLCJvZmZzZXQiLCJzdGRpbiIsInN0ZG91dCIsInN0ZGVyciIsIm9wZW5fb3V0X2dlbiIsIm1vZGUiLCJwZXJtIiwibmFtZSIsImMiLCJvcGVuX291dCIsIm9wZW5fb3V0X2JpbiIsImZsdXNoX2FsbCIsImEiLCJvdXRwdXRfYnl0ZXMiLCJvYyIsIm91dHB1dF9zdHJpbmciLCJvdXRwdXQiLCJvZnMiLCJsZW4iLCJvdXRwdXRfc3Vic3RyaW5nIiwib3V0cHV0X3ZhbHVlIiwiY2hhbiIsInYiLCJjbG9zZV9vdXQiLCJjbG9zZV9vdXRfbm9lcnIiLCJvcGVuX2luX2dlbiIsIm9wZW5faW4iLCJvcGVuX2luX2JpbiIsImlucHV0IiwiaWMiLCJ1bnNhZmVfcmVhbGx5X2lucHV0IiwiciIsInJlYWxseV9pbnB1dCIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJpbnB1dF9saW5lIiwiYnVpbGRfcmVzdWx0IiwiYnVmIiwicG9zIiwiaGQiLCJhY2N1IiwiYmVnIiwicmVzIiwiY2xvc2VfaW5fbm9lcnIiLCJwcmludF9jaGFyIiwicHJpbnRfc3RyaW5nIiwicHJpbnRfYnl0ZXMiLCJwcmludF9pbnQiLCJwcmludF9mbG9hdCIsInByaW50X2VuZGxpbmUiLCJwcmludF9uZXdsaW5lIiwicHJlcnJfY2hhciIsInByZXJyX3N0cmluZyIsInByZXJyX2J5dGVzIiwicHJlcnJfaW50IiwicHJlcnJfZmxvYXQiLCJwcmVycl9lbmRsaW5lIiwicHJlcnJfbmV3bGluZSIsInJlYWRfbGluZSIsInJlYWRfaW50IiwicmVhZF9pbnRfb3B0IiwicmVhZF9mbG9hdCIsInJlYWRfZmxvYXRfb3B0Iiwic3RyaW5nX29mX2Zvcm1hdCIsInN0ciIsInN0cjIiLCJmbXQyIiwic3RyMSIsImZtdDEiLCJzMiIsImV4aXRfZnVuY3Rpb24iLCJhdF9leGl0Iiwib2xkX2V4aXQiLCJmX3lldF90b19ydW4iLCJuZXdfZXhpdCIsInN1Y2Nlc3MiLCJkb19kb21haW5fbG9jYWxfYXRfZXhpdCIsImRvX2F0X2V4aXQiLCJleGl0IiwicmV0Y29kZSIsIlN0ZGxpYiJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLHFCQUFB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHJrQi9EIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6OTk1NywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9zeXMubWwuaW4iXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiBAY29uZmlndXJlX2lucHV0QCAqKVxuIzMgXCJzeXMubWwuaW5cIlxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGJhY2tlbmRfdHlwZSA9XG4gIHwgTmF0aXZlXG4gIHwgQnl0ZWNvZGVcbiAgfCBPdGhlciBvZiBzdHJpbmdcbigqIFN5c3RlbSBpbnRlcmZhY2UgKilcblxuZXh0ZXJuYWwgZ2V0X2NvbmZpZzogdW5pdCAtPiBzdHJpbmcgKiBpbnQgKiBib29sID0gXCJjYW1sX3N5c19nZXRfY29uZmlnXCJcbmV4dGVybmFsIGdldF9leGVjdXRhYmxlX25hbWUgOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lXCJcbmV4dGVybmFsIGFyZ3YgOiBzdHJpbmcgYXJyYXkgPSBcIiVzeXNfYXJndlwiXG5leHRlcm5hbCBiaWdfZW5kaWFuIDogdW5pdCAtPiBib29sID0gXCIlYmlnX2VuZGlhblwiXG5leHRlcm5hbCB3b3JkX3NpemUgOiB1bml0IC0+IGludCA9IFwiJXdvcmRfc2l6ZVwiXG5leHRlcm5hbCBpbnRfc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlaW50X3NpemVcIlxuZXh0ZXJuYWwgbWF4X3dvc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlbWF4X3dvc2l6ZVwiXG5leHRlcm5hbCB1bml4IDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX3VuaXhcIlxuZXh0ZXJuYWwgd2luMzIgOiB1bml0IC0+IGJvb2wgPSBcIiVvc3R5cGVfd2luMzJcIlxuZXh0ZXJuYWwgY3lnd2luIDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX2N5Z3dpblwiXG5leHRlcm5hbCBnZXRfYmFja2VuZF90eXBlIDogdW5pdCAtPiBiYWNrZW5kX3R5cGUgPSBcIiViYWNrZW5kX3R5cGVcIlxuXG5sZXQgZXhlY3V0YWJsZV9uYW1lID0gZ2V0X2V4ZWN1dGFibGVfbmFtZSgpXG5sZXQgKG9zX3R5cGUsIF8sIF8pID0gZ2V0X2NvbmZpZygpXG5sZXQgYmFja2VuZF90eXBlID0gZ2V0X2JhY2tlbmRfdHlwZSAoKVxubGV0IGJpZ19lbmRpYW4gPSBiaWdfZW5kaWFuICgpXG5sZXQgd29yZF9zaXplID0gd29yZF9zaXplICgpXG5sZXQgaW50X3NpemUgPSBpbnRfc2l6ZSAoKVxubGV0IHVuaXggPSB1bml4ICgpXG5sZXQgd2luMzIgPSB3aW4zMiAoKVxubGV0IGN5Z3dpbiA9IGN5Z3dpbiAoKVxubGV0IG1heF9hcnJheV9sZW5ndGggPSBtYXhfd29zaXplICgpXG5sZXQgbWF4X2Zsb2F0YXJyYXlfbGVuZ3RoID0gbWF4X2FycmF5X2xlbmd0aCAvICg2NCAvIHdvcmRfc2l6ZSlcbmxldCBtYXhfc3RyaW5nX2xlbmd0aCA9IHdvcmRfc2l6ZSAvIDggKiBtYXhfYXJyYXlfbGVuZ3RoIC0gMVxuZXh0ZXJuYWwgcnVudGltZV92YXJpYW50IDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfcnVudGltZV92YXJpYW50XCJcbmV4dGVybmFsIHJ1bnRpbWVfcGFyYW1ldGVycyA6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3J1bnRpbWVfcGFyYW1ldGVyc1wiXG5cbmV4dGVybmFsIGZpbGVfZXhpc3RzOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfZmlsZV9leGlzdHNcIlxuZXh0ZXJuYWwgaXNfZGlyZWN0b3J5IDogc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3lzX2lzX2RpcmVjdG9yeVwiXG5leHRlcm5hbCBpc19yZWd1bGFyX2ZpbGUgOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNfcmVndWxhcl9maWxlXCJcbmV4dGVybmFsIHJlbW92ZTogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbW92ZVwiXG5leHRlcm5hbCByZW5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbmFtZVwiXG5leHRlcm5hbCBnZXRlbnY6IHN0cmluZyAtPiBzdHJpbmcgPSBcImNhbWxfc3lzX2dldGVudlwiXG5cbmxldCBnZXRlbnZfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChnZXRlbnYgcylcbiAgd2l0aCBOb3RfZm91bmQgLT4gTm9uZVxuXG5leHRlcm5hbCBjb21tYW5kOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFwiXG5leHRlcm5hbCB0aW1lOiB1bml0IC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9zeXNfdGltZVwiIFwiY2FtbF9zeXNfdGltZV91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGNoZGlyOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfY2hkaXJcIlxuZXh0ZXJuYWwgbWtkaXI6IHN0cmluZyAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9zeXNfbWtkaXJcIlxuZXh0ZXJuYWwgcm1kaXI6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19ybWRpclwiXG5leHRlcm5hbCBnZXRjd2Q6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3N5c19nZXRjd2RcIlxuZXh0ZXJuYWwgcmVhZGRpciA6IHN0cmluZyAtPiBzdHJpbmcgYXJyYXkgPSBcImNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5XCJcblxubGV0IGludGVyYWN0aXZlID0gcmVmIGZhbHNlXG5cbnR5cGUgc2lnbmFsX2JlaGF2aW9yID1cbiAgICBTaWduYWxfZGVmYXVsdFxuICB8IFNpZ25hbF9pZ25vcmVcbiAgfCBTaWduYWxfaGFuZGxlIG9mIChpbnQgLT4gdW5pdClcblxuZXh0ZXJuYWwgc2lnbmFsIDogaW50IC0+IHNpZ25hbF9iZWhhdmlvciAtPiBzaWduYWxfYmVoYXZpb3JcbiAgICAgICAgICAgICAgICA9IFwiY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyXCJcblxubGV0IHNldF9zaWduYWwgc2lnX251bSBzaWdfYmVoID0gaWdub3JlKHNpZ25hbCBzaWdfbnVtIHNpZ19iZWgpXG5cbmxldCBzaWdhYnJ0ID0gLTFcbmxldCBzaWdhbHJtID0gLTJcbmxldCBzaWdmcGUgPSAtM1xubGV0IHNpZ2h1cCA9IC00XG5sZXQgc2lnaWxsID0gLTVcbmxldCBzaWdpbnQgPSAtNlxubGV0IHNpZ2tpbGwgPSAtN1xubGV0IHNpZ3BpcGUgPSAtOFxubGV0IHNpZ3F1aXQgPSAtOVxubGV0IHNpZ3NlZ3YgPSAtMTBcbmxldCBzaWd0ZXJtID0gLTExXG5sZXQgc2lndXNyMSA9IC0xMlxubGV0IHNpZ3VzcjIgPSAtMTNcbmxldCBzaWdjaGxkID0gLTE0XG5sZXQgc2lnY29udCA9IC0xNVxubGV0IHNpZ3N0b3AgPSAtMTZcbmxldCBzaWd0c3RwID0gLTE3XG5sZXQgc2lndHRpbiA9IC0xOFxubGV0IHNpZ3R0b3UgPSAtMTlcbmxldCBzaWd2dGFscm0gPSAtMjBcbmxldCBzaWdwcm9mID0gLTIxXG5sZXQgc2lnYnVzID0gLTIyXG5sZXQgc2lncG9sbCA9IC0yM1xubGV0IHNpZ3N5cyA9IC0yNFxubGV0IHNpZ3RyYXAgPSAtMjVcbmxldCBzaWd1cmcgPSAtMjZcbmxldCBzaWd4Y3B1ID0gLTI3XG5sZXQgc2lneGZzeiA9IC0yOFxuXG5leGNlcHRpb24gQnJlYWtcblxubGV0IGNhdGNoX2JyZWFrIG9uID1cbiAgaWYgb24gdGhlblxuICAgIHNldF9zaWduYWwgc2lnaW50IChTaWduYWxfaGFuZGxlKGZ1biBfIC0+IHJhaXNlIEJyZWFrKSlcbiAgZWxzZVxuICAgIHNldF9zaWduYWwgc2lnaW50IFNpZ25hbF9kZWZhdWx0XG5cblxuZXh0ZXJuYWwgZW5hYmxlX3J1bnRpbWVfd2FybmluZ3M6IGJvb2wgLT4gdW5pdCA9XG4gIFwiY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5nc1wiXG5leHRlcm5hbCBydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQ6IHVuaXQgLT4gYm9vbCA9XG4gIFwiY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcIlxuXG4oKiBUaGUgdmVyc2lvbiBzdHJpbmcgaXMgZm91bmQgaW4gZmlsZSAuLi9WRVJTSU9OICopXG5cbmxldCBvY2FtbF92ZXJzaW9uID0gXCJAVkVSU0lPTkBcIlxuXG5sZXQgZGV2ZWxvcG1lbnRfdmVyc2lvbiA9IEBPQ0FNTF9ERVZFTE9QTUVOVF9WRVJTSU9OQFxuXG50eXBlIGV4dHJhX3ByZWZpeCA9IFBsdXMgfCBUaWxkZVxuXG50eXBlIGV4dHJhX2luZm8gPSBleHRyYV9wcmVmaXggKiBzdHJpbmdcblxudHlwZSBvY2FtbF9yZWxlYXNlX2luZm8gPSB7XG4gIG1ham9yIDogaW50O1xuICBtaW5vciA6IGludDtcbiAgcGF0Y2hsZXZlbCA6IGludDtcbiAgZXh0cmEgOiBleHRyYV9pbmZvIG9wdGlvblxufVxuXG5sZXQgb2NhbWxfcmVsZWFzZSA9IHtcbiAgbWFqb3IgPSBAT0NBTUxfVkVSU0lPTl9NQUpPUkA7XG4gIG1pbm9yID0gQE9DQU1MX1ZFUlNJT05fTUlOT1JAO1xuICBwYXRjaGxldmVsID0gQE9DQU1MX1ZFUlNJT05fUEFUQ0hMRVZFTEA7XG4gIGV4dHJhID0gQE9DQU1MX1JFTEVBU0VfRVhUUkFAXG59XG5cbigqIE9wdGltaXphdGlvbiAqKVxuXG5leHRlcm5hbCBvcGFxdWVfaWRlbnRpdHkgOiAnYSAtPiAnYSA9IFwiJW9wYXF1ZVwiXG5cbm1vZHVsZSBJbW1lZGlhdGU2NCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBOb25faW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0XG4gIGVuZFxuICBtb2R1bGUgdHlwZSBJbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlXVxuICBlbmRcblxuICBtb2R1bGUgTWFrZShJbW1lZGlhdGUgOiBJbW1lZGlhdGUpKE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlKSA9IHN0cnVjdFxuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGU2NF1cbiAgICB0eXBlICdhIHJlcHIgPVxuICAgICAgfCBJbW1lZGlhdGUgOiBJbW1lZGlhdGUudCByZXByXG4gICAgICB8IE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlLnQgcmVwclxuICAgIGV4dGVybmFsIG1hZ2ljIDogXyByZXByIC0+IHQgcmVwciA9IFwiJWlkZW50aXR5XCJcbiAgICBsZXQgcmVwciA9XG4gICAgICBpZiB3b3JkX3NpemUgPSA2NCB0aGVuXG4gICAgICAgIG1hZ2ljIEltbWVkaWF0ZVxuICAgICAgZWxzZVxuICAgICAgICBtYWdpYyBOb25faW1tZWRpYXRlXG4gIGVuZFxuZW5kXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJTdGRsaWIiLCJleGVjdXRhYmxlX25hbWUiLCJvc190eXBlIiwidW5peCIsIndpbjMyIiwiY3lnd2luIiwibWF4X2FycmF5X2xlbmd0aCIsIm1heF9mbG9hdGFycmF5X2xlbmd0aCIsIm1heF9zdHJpbmdfbGVuZ3RoIiwiZ2V0ZW52X29wdCIsInMiLCJleG4iLCJzZXRfc2lnbmFsIiwic2lnX251bSIsInNpZ19iZWgiLCJCcmVhayIsImNhdGNoX2JyZWFrIiwib24iLCJNYWtlIiwiSW1tZWRpYXRlIiwiTm9uX2ltbWVkaWF0ZSIsIlN0ZGxpYl9TeXMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxrQkNtQ3NCO0FBQUEsSUFBQUMsVUFDQTtBQUFBLElBQUFDLE9BQVk7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLFlBQUFDLFdBQUFDO0FBQUFBLElBdUJoQyxZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTUQzRFg7QUFBQSwyQkM0RG9CO0FBQUEsS0Q1RHBCO0FBQUE7QUFBQSxHQzREd0I7QUFBQSxZQUFBQyxXQUFBQyxTQUFBQyxTQXFCdUM7QUFBQSxPQUFBQyxRQTdDN0I7QUFBQSxZQUFBQyxZQUFBQyxJQStFaEMsaUJBR2tDO0FBQUEsWUFBQUMsS0FBQUMsV0FBQUMsZUFzRDVCO0FBQUE7QUFBQSxJQUFBQztBQUFBQSxNQXhJMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwQ2xDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAwNDYsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvb2JqLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBPcGVyYXRpb25zIG9uIGludGVybmFsIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMgKilcblxudHlwZSB0XG5cbnR5cGUgcmF3X2RhdGEgPSBuYXRpdmVpbnRcblxuZXh0ZXJuYWwgcmVwciA6ICdhIC0+IHQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBvYmogOiB0IC0+ICdhID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgbWFnaWMgOiAnYSAtPiAnYiA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGlzX2ludCA6IHQgLT4gYm9vbCA9IFwiJW9ial9pc19pbnRcIlxubGV0IFtAaW5saW5lIGFsd2F5c10gaXNfYmxvY2sgYSA9IG5vdCAoaXNfaW50IGEpXG5leHRlcm5hbCB0YWcgOiB0IC0+IGludCA9IFwiY2FtbF9vYmpfdGFnXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpemUgOiB0IC0+IGludCA9IFwiJW9ial9zaXplXCJcbmV4dGVybmFsIHJlYWNoYWJsZV93b3JkcyA6IHQgLT4gaW50ID0gXCJjYW1sX29ial9yZWFjaGFibGVfd29yZHNcIlxuZXh0ZXJuYWwgZmllbGQgOiB0IC0+IGludCAtPiB0ID0gXCIlb2JqX2ZpZWxkXCJcbmV4dGVybmFsIHNldF9maWVsZCA6IHQgLT4gaW50IC0+IHQgLT4gdW5pdCA9IFwiJW9ial9zZXRfZmllbGRcIlxuZXh0ZXJuYWwgZmxvYXRhcnJheV9nZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdGFycmF5X2dldFwiXG5leHRlcm5hbCBmbG9hdGFycmF5X3NldCA6XG4gICAgZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiY2FtbF9mbG9hdGFycmF5X3NldFwiXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBkb3VibGVfZmllbGQgeCBpID0gZmxvYXRhcnJheV9nZXQgKG9iaiB4IDogZmxvYXRhcnJheSkgaVxubGV0IFtAaW5saW5lIGFsd2F5c10gc2V0X2RvdWJsZV9maWVsZCB4IGkgdiA9XG4gIGZsb2F0YXJyYXlfc2V0IChvYmogeCA6IGZsb2F0YXJyYXkpIGkgdlxuZXh0ZXJuYWwgcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgPSBcImNhbWxfb2JqX3Jhd19maWVsZFwiXG5leHRlcm5hbCBzZXRfcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfb2JqX3NldF9yYXdfZmllbGRcIlxuXG5leHRlcm5hbCBuZXdfYmxvY2sgOiBpbnQgLT4gaW50IC0+IHQgPSBcImNhbWxfb2JqX2Jsb2NrXCJcbmV4dGVybmFsIGR1cCA6IHQgLT4gdCA9IFwiY2FtbF9vYmpfZHVwXCJcbmV4dGVybmFsIGFkZF9vZmZzZXQgOiB0IC0+IEludDMyLnQgLT4gdCA9IFwiY2FtbF9vYmpfYWRkX29mZnNldFwiXG5leHRlcm5hbCB3aXRoX3RhZyA6IGludCAtPiB0IC0+IHQgPSBcImNhbWxfb2JqX3dpdGhfdGFnXCJcblxubGV0IGZpcnN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl90YWcgPSAwXG5sZXQgbGFzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3JfdGFnID0gMjQzXG5cbmxldCBmb3JjaW5nX3RhZyA9IDI0NFxubGV0IGNvbnRfdGFnID0gMjQ1XG5sZXQgbGF6eV90YWcgPSAyNDZcbmxldCBjbG9zdXJlX3RhZyA9IDI0N1xubGV0IG9iamVjdF90YWcgPSAyNDhcbmxldCBpbmZpeF90YWcgPSAyNDlcbmxldCBmb3J3YXJkX3RhZyA9IDI1MFxuXG5sZXQgbm9fc2Nhbl90YWcgPSAyNTFcblxubGV0IGFic3RyYWN0X3RhZyA9IDI1MVxubGV0IHN0cmluZ190YWcgPSAyNTJcbmxldCBkb3VibGVfdGFnID0gMjUzXG5sZXQgZG91YmxlX2FycmF5X3RhZyA9IDI1NFxubGV0IGN1c3RvbV90YWcgPSAyNTVcblxuXG5sZXQgaW50X3RhZyA9IDEwMDBcbmxldCBvdXRfb2ZfaGVhcF90YWcgPSAxMDAxXG5sZXQgdW5hbGlnbmVkX3RhZyA9IDEwMDJcblxubW9kdWxlIEV4dGVuc2lvbl9jb25zdHJ1Y3RvciA9XG5zdHJ1Y3RcbiAgdHlwZSB0ID0gZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXG4gIGxldCBvZl92YWwgeCA9XG4gICAgbGV0IHggPSByZXByIHggaW5cbiAgICBsZXQgc2xvdCA9XG4gICAgICBpZiAoaXNfYmxvY2sgeCkgJiYgKHRhZyB4KSA8PiBvYmplY3RfdGFnICYmIChzaXplIHgpID49IDEgdGhlbiBmaWVsZCB4IDBcbiAgICAgIGVsc2UgeFxuICAgIGluXG4gICAgbGV0IG5hbWUgPVxuICAgICAgaWYgKGlzX2Jsb2NrIHNsb3QpICYmICh0YWcgc2xvdCkgPSBvYmplY3RfdGFnIHRoZW4gZmllbGQgc2xvdCAwXG4gICAgICBlbHNlIGludmFsaWRfYXJnIFwiT2JqLmV4dGVuc2lvbl9jb25zdHJ1Y3RvclwiXG4gICAgaW5cbiAgICAgIGlmICh0YWcgbmFtZSkgPSBzdHJpbmdfdGFnIHRoZW4gKG9iaiBzbG90IDogdClcbiAgICAgIGVsc2UgaW52YWxpZF9hcmcgXCJPYmouZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXCJcblxuICBsZXQgW0BpbmxpbmUgYWx3YXlzXSBuYW1lIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDApIDogc3RyaW5nKVxuXG4gIGxldCBbQGlubGluZSBhbHdheXNdIGlkIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDEpIDogaW50KVxuZW5kXG5cbm1vZHVsZSBFcGhlbWVyb24gPSBzdHJ1Y3RcbiAgdHlwZSBvYmpfdCA9IHRcblxuICB0eXBlIHQgKCoqIGVwaGVtZXJvbiAqKVxuXG4gICAoKiogVG8gY2hhbmdlIGluIHN5bmMgd2l0aCB3ZWFrLmggKilcbiAgbGV0IGFkZGl0aW9uYWxfdmFsdWVzID0gMlxuICBsZXQgbWF4X2VwaGVfbGVuZ3RoID0gU3lzLm1heF9hcnJheV9sZW5ndGggLSBhZGRpdGlvbmFsX3ZhbHVlc1xuXG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiB0ID0gXCJjYW1sX2VwaGVfY3JlYXRlXCJcbiAgbGV0IGNyZWF0ZSBsID1cbiAgICBpZiBub3QgKDAgPD0gbCAmJiBsIDw9IG1heF9lcGhlX2xlbmd0aCkgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJPYmouRXBoZW1lcm9uLmNyZWF0ZVwiO1xuICAgIGNyZWF0ZSBsXG5cbiAgbGV0IGxlbmd0aCB4ID0gc2l6ZShyZXByIHgpIC0gYWRkaXRpb25hbF92YWx1ZXNcblxuICBsZXQgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIG1zZyA9XG4gICAgaWYgbm90ICgwIDw9IG8gJiYgbyA8IGxlbmd0aCBlKSB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBtc2dcblxuICBleHRlcm5hbCBnZXRfa2V5OiB0IC0+IGludCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfa2V5XCJcbiAgbGV0IGdldF9rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmdldF9rZXlcIjtcbiAgICBnZXRfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGdldF9rZXlfY29weTogdCAtPiBpbnQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2tleV9jb3B5XCJcbiAgbGV0IGdldF9rZXlfY29weSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uZ2V0X2tleV9jb3B5XCI7XG4gICAgZ2V0X2tleV9jb3B5IGUgb1xuXG4gIGV4dGVybmFsIHNldF9rZXk6IHQgLT4gaW50IC0+IG9ial90IC0+IHVuaXQgPSBcImNhbWxfZXBoZV9zZXRfa2V5XCJcbiAgbGV0IHNldF9rZXkgZSBvIHggPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uc2V0X2tleVwiO1xuICAgIHNldF9rZXkgZSBvIHhcblxuICBleHRlcm5hbCB1bnNldF9rZXk6IHQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9rZXlcIlxuICBsZXQgdW5zZXRfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi51bnNldF9rZXlcIjtcbiAgICB1bnNldF9rZXkgZSBvXG5cbiAgZXh0ZXJuYWwgY2hlY2tfa2V5OiB0IC0+IGludCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfa2V5XCJcbiAgbGV0IGNoZWNrX2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uY2hlY2tfa2V5XCI7XG4gICAgY2hlY2tfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGJsaXRfa2V5IDogdCAtPiBpbnQgLT4gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9lcGhlX2JsaXRfa2V5XCJcblxuICBsZXQgYmxpdF9rZXkgZTEgbzEgZTIgbzIgbCA9XG4gICAgaWYgbCA8IDAgfHwgbzEgPCAwIHx8IG8xID4gbGVuZ3RoIGUxIC0gbFxuICAgICAgIHx8IG8yIDwgMCB8fCBvMiA+IGxlbmd0aCBlMiAtIGxcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiT2JqLkVwaGVtZXJvbi5ibGl0X2tleVwiXG4gICAgZWxzZSBpZiBsIDw+IDAgdGhlbiBibGl0X2tleSBlMSBvMSBlMiBvMiBsXG5cbiAgZXh0ZXJuYWwgZ2V0X2RhdGE6IHQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2RhdGFcIlxuICBleHRlcm5hbCBnZXRfZGF0YV9jb3B5OiB0IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9kYXRhX2NvcHlcIlxuICBleHRlcm5hbCBzZXRfZGF0YTogdCAtPiBvYmpfdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2RhdGFcIlxuICBleHRlcm5hbCB1bnNldF9kYXRhOiB0IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9kYXRhXCJcbiAgZXh0ZXJuYWwgY2hlY2tfZGF0YTogdCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfZGF0YVwiXG4gIGV4dGVybmFsIGJsaXRfZGF0YSA6IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfYmxpdF9kYXRhXCJcblxuZW5kXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfY2hlY2tfYm91bmQiLCJjYW1sX29ial90YWciLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9TeXMiLCJpc19ibG9jayIsImEiLCJkb3VibGVfZmllbGQiLCJ4IiwiaSIsInNldF9kb3VibGVfZmllbGQiLCJ2Iiwib2ZfdmFsIiwic2xvdCIsImNzdF9PYmpfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIiwibmFtZSIsImlkIiwibWF4X2VwaGVfbGVuZ3RoIiwiY3JlYXRlIiwibCIsImxlbmd0aCIsInJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IiwiZSIsIm8iLCJtc2ciLCJnZXRfa2V5IiwiZ2V0X2tleV9jb3B5Iiwic2V0X2tleSIsInVuc2V0X2tleSIsImNoZWNrX2tleSIsImJsaXRfa2V5IiwiZTEiLCJvMSIsImUyIiwibzIiLCJTdGRsaWJfT2JqIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLFlBQUFDLFNBQUFDLEdDeUJrQyxtQ0FBYztBQUFBLFlBQUFDLGFBQUFDLEdBQUFDLEdBU1Isb0NBQXFDO0FBQUEsWUFBQUMsaUJBQUFGLEdBQUFDLEdBQUFFO0FBQUFBLElBRTNFO0FBQUEsSUFBdUM7QUFBQTtBQUFBLFlBQUFDLE9BQUFKO0FBQUFBO0FBQUFBLEtBQUFLO0FBQUFBLE9Bd0NoQztBQUFBLFVBQWdCO0FBQUE7QUFBQSxLQUFBQyxnQ0Q1RXpCO0FBQUE7QUFBQTtBQUFBLEtDZ0ZTLHFCQUFtQixnQ0FBQUMsT0FBeUM7QUFBQSxTQUFBQSxPQUMxRDtBQUFBO0FBQUEsSUFFRjtBQUFBO0FBQUEsY0FDRSxtREFBdUM7QUFBQTtBQUFBLFlBQUFBLEtBQUFGLE1BR3BCO0FBQUEsWUFBQUcsR0FBQUgsTUFHQTtBQUFBLE9BQUFJLGtCRDFGOUI7QUFBQSxZQUFBQyxPQUFBQztBQUFBQSxRQUFBLElDd0dJO0FBQUEsY0FDRTtBQUFBLElBQ0Ysa0NBQVE7QUFBQTtBQUFBLFlBQUFDLE9BQUFaLEdBRUssd0JBQWdDO0FBQUEsWUFBQWEsd0JBQUFDLEdBQUFDLEdBQUFDO0FBQUFBLFFBQUEsSUFHN0Msb0JBQXNCLG1CQUF0QjtBQUFBLGVBQ0UsNkJBQWU7QUFBQTtBQUFBLFlBQUFDLFFBQUFILEdBQUFDO0FBQUFBLElBSWpCO0FBQUEsSUFDQSxzQ0FBVztBQUFBO0FBQUEsWUFBQUcsYUFBQUosR0FBQUM7QUFBQUEsSUFJWDtBQUFBLElBQ0EsMkNBQWdCO0FBQUE7QUFBQSxZQUFBSSxRQUFBTCxHQUFBQyxHQUFBZjtBQUFBQSxJQUloQjtBQUFBLElBQ0EseUNBQWE7QUFBQTtBQUFBLFlBQUFvQixVQUFBTixHQUFBQztBQUFBQSxJQUliO0FBQUEsSUFDQSx3Q0FBYTtBQUFBO0FBQUEsWUFBQU0sVUFBQVAsR0FBQUM7QUFBQUEsSUFJYjtBQUFBLElBQ0Esd0NBQWE7QUFBQTtBQUFBLFlBQUFPLFNBQUFDLElBQUFDLElBQUFDLElBQUFDLElBQUFmO0FBQUFBLElBTWI7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUEyQix5Q0FDTjtBQUFBO0FBQUEsVUFFaEI7QUFBQSxjQUFlO0FBQUEsS0FBZjtBQUFBO0FBQUEsSUFEQSxxREFDcUM7QUFBQTtBQUFBO0FBQUEsSUFBQWdCO0FBQUFBLE1EbEo5QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEwMTcyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2F0b21pYy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTdGVwaGVuIERvbGFuLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTctMjAxOCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAhJ2EgdFxuXG5leHRlcm5hbCBtYWtlIDogJ2EgLT4gJ2EgdCA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsIG1ha2VfY29udGVuZGVkIDogJ2EgLT4gJ2EgdCA9IFwiY2FtbF9hdG9taWNfbWFrZV9jb250ZW5kZWRcIlxuZXh0ZXJuYWwgZ2V0IDogJ2EgdCAtPiAnYSA9IFwiJWF0b21pY19sb2FkXCJcbmV4dGVybmFsIGV4Y2hhbmdlIDogJ2EgdCAtPiAnYSAtPiAnYSA9IFwiJWF0b21pY19leGNoYW5nZVwiXG5leHRlcm5hbCBjb21wYXJlX2FuZF9zZXQgOiAnYSB0IC0+ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVhdG9taWNfY2FzXCJcbmV4dGVybmFsIGZldGNoX2FuZF9hZGQgOiBpbnQgdCAtPiBpbnQgLT4gaW50ID0gXCIlYXRvbWljX2ZldGNoX2FkZFwiXG5leHRlcm5hbCBpZ25vcmUgOiAnYSAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxubGV0IHNldCByIHggPSBpZ25vcmUgKGV4Y2hhbmdlIHIgeClcbmxldCBpbmNyIHIgPSBpZ25vcmUgKGZldGNoX2FuZF9hZGQgciAxKVxubGV0IGRlY3IgciA9IGlnbm9yZSAoZmV0Y2hfYW5kX2FkZCByICgtMSkpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYXRvbWljX2V4Y2hhbmdlIiwiY2FtbF9hdG9taWNfZmV0Y2hfYWRkIiwic2V0IiwiciIsIngiLCJpbmNyIiwiZGVjciIsIlN0ZGxpYl9BdG9taWMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLFlBQUFDLElBQUFDLEdBQUFDLEdDd0JjLHFDQUFxQjtBQUFBLFlBQUFDLEtBQUFGLEdBQ3RCLHNDQUEwQjtBQUFBLFlBQUFHLEtBQUFILEdBQzFCLHVDQUE2QjtBQUFBO0FBQUEsSUFBQUk7QUFBQUEsTUQxQjFDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAyMDEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvY2FtbGludGVybmFsTGF6eS5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSW50ZXJuYWxzIG9mIGZvcmNpbmcgbGF6eSB2YWx1ZXMuICopXG5cbnR5cGUgJ2EgdCA9ICdhIGxhenlfdFxuXG5leGNlcHRpb24gVW5kZWZpbmVkXG5cbigqIFt1cGRhdGVfdG9fZm9yY2luZyBibGtdIHRyaWVzIHRvIHVwZGF0ZSBhIFtibGtdIHdpdGggW2xhenlfdGFnXSB0b1xuICAgW2ZvcmNpbmdfdGFnXSB1c2luZyBjb21wYXJlLWFuZC1zd2FwIChDQVMpLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGUgaGVhZGVyIHdvcmQgYnkgYSBjb25jdXJyZW50IEdDIHRocmVhZC4gUmV0dXJucyBbMF0gaWYgdGhlXG4gICBDQVMgaXMgc3VjY2Vzc2Z1bC4gSWYgdGhlIENBUyBmYWlscywgdGhlbiB0aGUgdGFnIHdhcyBvYnNlcnZlZCB0byBiZVxuICAgc29tZXRoaW5nIG90aGVyIHRoYW4gW2xhenlfdGFnXSBkdWUgdG8gYSBjb25jdXJyZW50IG11dGF0b3IuIEluIHRoaXMgY2FzZSxcbiAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIFsxXS4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3JjaW5nIDogT2JqLnQgLT4gaW50ID1cbiAgXCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmdcIiBbQEBub2FsbG9jXVxuXG4oKiBbcmVzZXRfdG9fbGF6eSBibGtdIGV4cGVjdHMgW2Jsa10gdG8gYmUgYSBsYXp5IG9iamVjdCB3aXRoIFtPYmouZm9yY2luZ190YWddXG4gICBhbmQgdXBkYXRlcyB0aGUgdGFnIHRvIFtPYmoubGF6eV90YWddLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGlzIG9iamVjdCdzIGhlYWRlciBieSBhIGNvbmN1cnJlbnQgR0MgdGhyZWFkLiAqKVxuZXh0ZXJuYWwgcmVzZXRfdG9fbGF6eSA6IE9iai50IC0+IHVuaXQgPSBcImNhbWxfbGF6eV9yZXNldF90b19sYXp5XCIgW0BAbm9hbGxvY11cblxuKCogW3VwZGF0ZV90b19mb3J3YXJkIGJsa10gZXhwZWN0cyBbYmxrXSB0byBiZSBhIGxhenkgb2JqZWN0IHdpdGhcbiAgIFtPYmouZm9yY2luZ190YWddIGFuZCB1cGRhdGVzIHRoZSB0YWcgdG8gW09iai5mb3J3YXJkX3RhZ10sIHRha2luZyBjYXJlIHRvXG4gICBoYW5kbGUgY29uY3VycmVudCBtYXJraW5nIG9mIHRoaXMgb2JqZWN0J3MgaGVhZGVyIGJ5IGEgY29uY3VycmVudCBHQyB0aHJlYWQuXG4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3J3YXJkIDogT2JqLnQgLT4gdW5pdCA9XG4gIFwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkXCIgW0BAbm9hbGxvY11cblxuKCogQXNzdW1lcyBbYmxrXSBpcyBhIGJsb2NrIHdpdGggdGFnIGZvcmNpbmcgKilcbmxldCBkb19mb3JjZV9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICB0cnlcbiAgICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciByZXN1bHQpO1xuICAgIHVwZGF0ZV90b19mb3J3YXJkIGI7XG4gICAgcmVzdWx0XG4gIHdpdGggZSAtPlxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciAoZnVuICgpIC0+IHJhaXNlIGUpKTtcbiAgICByZXNldF90b19sYXp5IGI7XG4gICAgcmFpc2UgZVxuXG4oKiBBc3N1bWVzIFtibGtdIGlzIGEgYmxvY2sgd2l0aCB0YWcgZm9yY2luZyAqKVxubGV0IGRvX2ZvcmNlX3ZhbF9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgdXBkYXRlX3RvX2ZvcndhcmQgYjtcbiAgcmVzdWx0XG5cbigqIENhbGxlZCBieSBbZm9yY2VfZ2VuXSAqKVxubGV0IGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCAoYmxrIDogJ2FyZyBsYXp5X3QpID1cbiAgKCogV2UgZXhwZWN0IHRoZSB0YWcgdG8gYmUgW2xhenlfdGFnXSwgYnV0IG1heSBiZSBvdGhlciB0YWdzIGR1ZSB0b1xuICAgICBjb25jdXJyZW50IGZvcmNpbmcgb2YgbGF6eSB2YWx1ZXMuICopXG4gIG1hdGNoIHVwZGF0ZV90b19mb3JjaW5nIChPYmoucmVwciBibGspIHdpdGhcbiAgfCAwIHdoZW4gb25seV92YWwgLT4gZG9fZm9yY2VfdmFsX2Jsb2NrIGJsa1xuICB8IDAgLT4gZG9fZm9yY2VfYmxvY2sgYmxrXG4gIHwgXyAtPiByYWlzZSBVbmRlZmluZWRcblxuKCogdXNlZCBpbiB0aGUgJWxhenlfZm9yY2UgcHJpbWl0aXZlICopXG5sZXQgZm9yY2VfbGF6eV9ibG9jayBibGsgPSBmb3JjZV9nZW5fbGF6eV9ibG9jayB+b25seV92YWw6ZmFsc2UgYmxrXG5cbigqIFtmb3JjZV9nZW4gfm9ubHlfdmFsOmZhbHNlXSBpcyBub3QgdXNlZCwgc2luY2UgW0xhenkuZm9yY2VdIGlzXG4gICBkZWNsYXJlZCBhcyBhIHByaW1pdGl2ZSB3aG9zZSBjb2RlIGlubGluZXMgdGhlIHRhZyB0ZXN0cyBvZiBpdHNcbiAgIGFyZ3VtZW50LCBleGNlcHQgd2hlbiBhZmwgaW5zdHJ1bWVudGF0aW9uIGlzIHR1cm5lZCBvbi4gKilcbmxldCBmb3JjZV9nZW4gfm9ubHlfdmFsIChsenYgOiAnYXJnIGxhenlfdCkgPVxuICAoKiBVc2luZyBbU3lzLm9wYXF1ZV9pZGVudGl0eV0gcHJldmVudHMgdHdvIHBvdGVudGlhbCBwcm9ibGVtczpcbiAgICAgLSBJZiB0aGUgdmFsdWUgaXMga25vd24gdG8gaGF2ZSBGb3J3YXJkX3RhZywgdGhlbiBpdCBjb3VsZCBoYXZlIGJlZW5cbiAgICAgICBzaG9ydGN1dCBkdXJpbmcgR0MsIHNvIHRoYXQgaW5mb3JtYXRpb24gbXVzdCBiZSBmb3Jnb3R0ZW4gKHNlZSBHUFIjNzEzXG4gICAgICAgYW5kIGlzc3VlICM3MzAxKS4gVGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhdCB0aGUgbW9tZW50IHNpbmNlXG4gICAgICAgW09iai50YWddIGlzIG5vdCBzaW1wbGlmaWVkIGJ5IHRoZSBjb21waWxlciwgYW5kIEdQUiM3MTMgYWxzb1xuICAgICAgIGVuc3VyZXMgdGhhdCBubyB2YWx1ZSB3aWxsIGJlIGtub3duIHRvIGhhdmUgRm9yd2FyZF90YWcuXG4gICAgIC0gSWYgdGhlIHZhbHVlIGlzIGtub3duIHRvIGJlIGltbXV0YWJsZSwgdGhlbiBpZiB0aGUgY29tcGlsZXJcbiAgICAgICBjYW5ub3QgcHJvdmUgdGhhdCB0aGUgbGFzdCBicmFuY2ggaXMgbm90IHRha2VuIGl0IHdpbGwgaXNzdWUgYVxuICAgICAgIHdhcm5pbmcgNTkgKG1vZGlmaWNhdGlvbiBvZiBhbiBpbW11dGFibGUgdmFsdWUpICopXG4gIGxldCBsenYgPSBTeXMub3BhcXVlX2lkZW50aXR5IGx6diBpblxuICBsZXQgeCA9IE9iai5yZXByIGx6diBpblxuICAoKiBTVEFSVCBubyBzYWZlIHBvaW50cy4gSWYgYSBHQyBvY2N1cnMgaGVyZSwgdGhlbiB0aGUgb2JqZWN0IFt4XSBtYXkgYmVcbiAgICAgc2hvcnQtY2lyY3VpdGVkLCBhbmQgZ2V0dGluZyB0aGUgZmlyc3QgZmllbGQgb2YgW3hdIHdvdWxkIGdldCB1cyB0aGUgd3JvbmdcbiAgICAgdmFsdWUuIEx1Y2tpbHksIHRoZSBjb21waWxlciBkb2VzIG5vdCBpbnNlcnQgR0Mgc2FmZSBwb2ludHMgYXQgdGhpcyBwbGFjZSxcbiAgICAgc28gaXQgaXMgb2suICopXG4gIGxldCB0ID0gT2JqLnRhZyB4IGluXG4gIGlmIHQgPSBPYmouZm9yd2FyZF90YWcgdGhlblxuICAgIChPYmoub2JqIChPYmouZmllbGQgeCAwKSA6ICdhcmcpXG4gICgqIEVORCBubyBzYWZlIHBvaW50cyAqKVxuICBlbHNlIGlmIHQgPSBPYmouZm9yY2luZ190YWcgdGhlbiByYWlzZSBVbmRlZmluZWRcbiAgZWxzZSBpZiB0IDw+IE9iai5sYXp5X3RhZyB0aGVuIChPYmoub2JqIHggOiAnYXJnKVxuICBlbHNlIGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCBsenZcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJTdGRsaWJfT2JqIiwiVW5kZWZpbmVkIiwiZm9yY2VfZ2VuX2xhenlfYmxvY2siLCJvbmx5X3ZhbCIsImJsayIsImNsb3N1cmUiLCJyZXN1bHQiLCJlIiwicGFyYW0iLCJmb3JjZV9sYXp5X2Jsb2NrIiwiZm9yY2VfZ2VuIiwibHp2IiwidCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBLFlBQUFDLHFCQUFBQyxVQUFBQztBQUFBQSxJQ3VFUTtBQUFBLEtBR0M7QUFBQSxJQUZFO0FBQUEsU0FBQUMsWUFaYztBQUFBLEtBQ3ZCO0FBQUEsU0FBQUMsV0FDYTtBQUFBLEtBQ2I7QUFBQSxLQUNBO0FBQUEsS0FBbUI7QUFBQTtBQUFBLFFBQUFELFVBbkJJO0FBQUEsSUFDdkI7QUFBQSxJQUErQjtBQUFBLFNBQUFDLFNBRWhCO0FBQUEsS0FDYjtBQUFBLEtBQ0E7QUFBQTtBQUFBO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsSURsREo7QUFBQSxLQ3FESSxrQkFBQUMsT0FBdUMsd0NBQU87QUFBQSxLQUM5QztBQUFBLEtBQWU7QUFBQTtBQUFBLEdBb0JLO0FBQUEsWUFBQUMsaUJBQUFMLEtBR0csbUNBQXdDO0FBQUEsWUFBQU0sVUFBQVAsVUFBQVE7QUFBQUEsUUFBQUMsSUFxQnpEO0FBQUEsSUFDUix5QkFDMEI7QUFBQSxJQUVyQix3QkFBNEI7QUFBQSxJQUM1QixtQ0FDQSxtQ0FBa0M7QUFBQTtBQUFBLEdEeEd6QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEwMjU4LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2xhenkubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbTGF6eV06IGRlZmVycmVkIGNvbXB1dGF0aW9ucyAqKVxuXG5cbigqXG4gICBXQVJOSU5HOiBzb21lIHB1cnBsZSBtYWdpYyBpcyBnb2luZyBvbiBoZXJlLiAgRG8gbm90IHRha2UgdGhpcyBmaWxlXG4gICBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBwcm9ncmFtIGluIE9DYW1sLlxuKilcblxuXG4oKiBXZSBtYWtlIHVzZSBvZiB0d28gc3BlY2lhbCB0YWdzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lOlxuICAgW2xhenlfdGFnXSBhbmQgW2ZvcndhcmRfdGFnXS5cblxuICAgQSB2YWx1ZSBvZiB0eXBlIFsnYSBMYXp5LnRdIGNhbiBiZSBvbmUgb2YgdGhyZWUgdGhpbmdzOlxuICAgMS4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2xhenlfdGFnXS4gIEl0cyBmaWVsZCBpcyBhIGNsb3N1cmUgb2ZcbiAgICAgIHR5cGUgW3VuaXQgLT4gJ2FdIHRoYXQgY29tcHV0ZXMgdGhlIHZhbHVlLlxuICAgMi4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2ZvcndhcmRfdGFnXS4gIEl0cyBmaWVsZCBpcyB0aGUgdmFsdWVcbiAgICAgIG9mIHR5cGUgWydhXSB0aGF0IHdhcyBjb21wdXRlZC5cbiAgIDMuIEFueXRoaW5nIGVsc2UgZXhjZXB0IGEgZmxvYXQuICBUaGlzIGhhcyB0eXBlIFsnYV0gYW5kIGlzIHRoZSB2YWx1ZVxuICAgICAgdGhhdCB3YXMgY29tcHV0ZWQuXG4gICBFeGNlcHRpb25zIGFyZSBzdG9yZWQgaW4gZm9ybWF0ICgxKS5cbiAgIFRoZSBHQyB3aWxsIG1hZ2ljYWxseSBjaGFuZ2UgdGhpbmdzIGZyb20gKDIpIHRvICgzKSBhY2NvcmRpbmcgdG8gaXRzXG4gICBmYW5jeS5cblxuICAgSWYgT0NhbWwgd2FzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgLWZsYXQtZmxvYXQtYXJyYXkgb3B0aW9uICh3aGljaCBpc1xuICAgY3VycmVudGx5IHRoZSBkZWZhdWx0KSwgdGhlIGZvbGxvd2luZyBpcyBhbHNvIHRydWU6XG4gICBXZSBjYW5ub3QgdXNlIHJlcHJlc2VudGF0aW9uICgzKSBmb3IgYSBbZmxvYXQgTGF6eS50XSBiZWNhdXNlXG4gICBbY2FtbF9tYWtlX2FycmF5XSBhc3N1bWVzIHRoYXQgb25seSBhIFtmbG9hdF0gdmFsdWUgY2FuIGhhdmUgdGFnXG4gICBbRG91YmxlX3RhZ10uXG5cbiAgIFdlIGhhdmUgdG8gdXNlIHRoZSBidWlsdC1pbiB0eXBlIGNvbnN0cnVjdG9yIFtsYXp5X3RdIHRvXG4gICBsZXQgdGhlIGNvbXBpbGVyIGltcGxlbWVudCB0aGUgc3BlY2lhbCB0eXBpbmcgYW5kIGNvbXBpbGF0aW9uXG4gICBydWxlcyBmb3IgdGhlIFtsYXp5XSBrZXl3b3JkLlxuKilcblxudHlwZSAnYSB0ID0gJ2EgQ2FtbGludGVybmFsTGF6eS50XG5cbmV4Y2VwdGlvbiBVbmRlZmluZWQgPSBDYW1saW50ZXJuYWxMYXp5LlVuZGVmaW5lZFxuZXh0ZXJuYWwgbWFrZV9mb3J3YXJkIDogJ2EgLT4gJ2EgbGF6eV90ID0gXCJjYW1sX2xhenlfbWFrZV9mb3J3YXJkXCJcbmV4dGVybmFsIGZvcmNlIDogJ2EgdCAtPiAnYSA9IFwiJWxhenlfZm9yY2VcIlxuXG5sZXQgZm9yY2VfdmFsIGwgPSBDYW1saW50ZXJuYWxMYXp5LmZvcmNlX2dlbiB+b25seV92YWw6dHJ1ZSBsXG5cbmxldCBmcm9tX2Z1biAoZiA6IHVuaXQgLT4gJ2FyZykgPVxuICBsZXQgeCA9IE9iai5uZXdfYmxvY2sgT2JqLmxhenlfdGFnIDEgaW5cbiAgT2JqLnNldF9maWVsZCB4IDAgKE9iai5yZXByIGYpO1xuICAoT2JqLm9iaiB4IDogJ2FyZyB0KVxuXG5sZXQgZnJvbV92YWwgKHYgOiAnYXJnKSA9XG4gIGxldCB0ID0gT2JqLnRhZyAoT2JqLnJlcHIgdikgaW5cbiAgaWYgdCA9IE9iai5mb3J3YXJkX3RhZyB8fCB0ID0gT2JqLmxhenlfdGFnIHx8XG4gICAgIHQgPSBPYmouZm9yY2luZ190YWcgfHwgdCA9IE9iai5kb3VibGVfdGFnIHRoZW4gYmVnaW5cbiAgICBtYWtlX2ZvcndhcmQgdlxuICBlbmQgZWxzZSBiZWdpblxuICAgIChPYmoubWFnaWMgdiA6ICdhcmcgdClcbiAgZW5kXG5cbmxldCBpc192YWwgKGwgOiAnYXJnIHQpID0gT2JqLnRhZyAoT2JqLnJlcHIgbCkgPD4gT2JqLmxhenlfdGFnXG5cbmxldCBtYXAgZiB4ID1cbiAgbGF6eSAoZiAoZm9yY2UgeCkpXG5cbmxldCBtYXBfdmFsIGYgeCA9XG4gIGlmIGlzX3ZhbCB4XG4gIHRoZW4gZnJvbV92YWwgKGYgKGZvcmNlIHgpKVxuICBlbHNlIGxhenkgKGYgKGZvcmNlIHgpKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX29ial90YWciLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJDYW1saW50ZXJuYWxMYXp5IiwiU3RkbGliX09iaiIsIlVuZGVmaW5lZCIsImZvcmNlX3ZhbCIsImwiLCJmcm9tX2Z1biIsIngiLCJmcm9tX3ZhbCIsInYiLCJ0IiwiaXNfdmFsIiwibWFwIiwicGFyYW0iLCJtYXBfdmFsIl0sIm1hcHBpbmdzIjoiT0FBQUEsVUFBQSx5QkFBQUMsZUFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsWUFBQUMsVUFBQUMsR0N1RGtCLDJDQUEyQztBQUFBLFlBQUFDLFNBQUFSO0FBQUFBLFFBQUFTLElBR25EO0FBQUEsSUFDUjtBQUFBLElBQThCO0FBQUEsR0FDVjtBQUFBLFlBQUFDLFNBQUFDO0FBQUFBLFFBQUFDLElBR1o7QUFBQSxJQUNSO0FBQUE7QUFBQTtBQUFBLEtBSUc7QUFBQSxJQUgrQyx3Q0FJL0M7QUFBQTtBQUFBLFlBQUFDLE9BQUFOO0FBQUFBLFFBQUEsSUFFcUI7QUFBQSx3Q0FBb0I7QUFBQSxHQUFnQjtBQUFBLFlBQUFPLElBQUFkLEdBQUFTO0FBQUFBLElBRzVEO0FBQUEscUJBQUFNO0FBQUFBLGlCQUFBLElEMUVGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNDMEVFO0FBQUEsR0FBa0I7QUFBQSxZQUFBQyxRQUFBaEIsR0FBQVM7QUFBQUEsSUFHZjtBQUFBLEtBRUU7QUFBQSxzQkFBQU07QUFBQUEsa0JBQUEsSUQvRVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUMrRU87QUFBQSxZQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFTLE9BQWEsU0FBYixpQkFDUztBQUFBO0FBQUEsR0QvRXpCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTAzMzksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc2VxLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFNpbW9uIENydWFuZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW1NlcV06IGZ1bmN0aW9uYWwgaXRlcmF0b3JzICopXG5cbnR5cGUgKydhIG5vZGUgPVxuICB8IE5pbFxuICB8IENvbnMgb2YgJ2EgKiAnYSB0XG5cbmFuZCAnYSB0ID0gdW5pdCAtPiAnYSBub2RlXG5cbmxldCBlbXB0eSAoKSA9IE5pbFxuXG5sZXQgcmV0dXJuIHggKCkgPSBDb25zICh4LCBlbXB0eSlcblxubGV0IGNvbnMgeCBuZXh0ICgpID0gQ29ucyAoeCwgbmV4dClcblxubGV0IHJlYyBhcHBlbmQgc2VxMSBzZXEyICgpID1cbiAgbWF0Y2ggc2VxMSgpIHdpdGhcbiAgfCBOaWwgLT4gc2VxMigpXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT4gQ29ucyAoeCwgYXBwZW5kIG5leHQgc2VxMilcblxubGV0IHJlYyBtYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+IENvbnMgKGYgeCwgbWFwIGYgbmV4dClcblxubGV0IHJlYyBmaWx0ZXJfbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBuZXh0ICgpXG4gICAgICAgIHwgU29tZSB5IC0+IENvbnMgKHksIGZpbHRlcl9tYXAgZiBuZXh0KVxuXG5sZXQgcmVjIGZpbHRlciBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgIGlmIGYgeFxuICAgICAgdGhlbiBDb25zICh4LCBmaWx0ZXIgZiBuZXh0KVxuICAgICAgZWxzZSBmaWx0ZXIgZiBuZXh0ICgpXG5cbmxldCByZWMgY29uY2F0IHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgIGFwcGVuZCB4IChjb25jYXQgbmV4dCkgKClcblxubGV0IHJlYyBmbGF0X21hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgYXBwZW5kIChmIHgpIChmbGF0X21hcCBmIG5leHQpICgpXG5cbmxldCBjb25jYXRfbWFwID0gZmxhdF9tYXBcblxubGV0IHJlYyBmb2xkX2xlZnQgZiBhY2Mgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgICB8IE5pbCAtPiBhY2NcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGxldCBhY2MgPSBmIGFjYyB4IGluXG4gICAgICAgIGZvbGRfbGVmdCBmIGFjYyBuZXh0XG5cbmxldCByZWMgaXRlciBmIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gKClcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGYgeDtcbiAgICAgICAgaXRlciBmIG5leHRcblxubGV0IHJlYyB1bmZvbGQgZiB1ICgpID1cbiAgbWF0Y2ggZiB1IHdpdGhcbiAgfCBOb25lIC0+IE5pbFxuICB8IFNvbWUgKHgsIHUnKSAtPiBDb25zICh4LCB1bmZvbGQgZiB1JylcblxubGV0IGlzX2VtcHR5IHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoXywgXykgLT5cbiAgICAgIGZhbHNlXG5cbmxldCB1bmNvbnMgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIFNvbWUgKHgsIHhzKVxuICB8IE5pbCAtPlxuICAgICAgTm9uZVxuXG5cblxubGV0IHJlYyBsZW5ndGhfYXV4IGFjY3UgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zIChfLCB4cykgLT5cbiAgICAgIGxlbmd0aF9hdXggKGFjY3UgKyAxKSB4c1xuXG5sZXRbQGlubGluZV0gbGVuZ3RoIHhzID1cbiAgbGVuZ3RoX2F1eCAwIHhzXG5cbmxldCByZWMgaXRlcmlfYXV4IGYgaSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgKClcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGYgaSB4O1xuICAgICAgaXRlcmlfYXV4IGYgKGkrMSkgeHNcblxubGV0W0BpbmxpbmVdIGl0ZXJpIGYgeHMgPVxuICBpdGVyaV9hdXggZiAwIHhzXG5cbmxldCByZWMgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IGkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGxldCBhY2N1ID0gZiBhY2N1IGkgeCBpblxuICAgICAgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IChpKzEpIHhzXG5cbmxldFtAaW5saW5lXSBmb2xkX2xlZnRpIGYgYWNjdSB4cyA9XG4gIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSAwIHhzXG5cbmxldCByZWMgZm9yX2FsbCBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggJiYgZm9yX2FsbCBwIHhzXG5cbmxldCByZWMgZXhpc3RzIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggfHwgZXhpc3RzIHAgeHNcblxubGV0IHJlYyBmaW5kIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGlmIHAgeCB0aGVuIFNvbWUgeCBlbHNlIGZpbmQgcCB4c1xuXG5sZXQgZmluZF9pbmRleCBwIHhzID1cbiAgbGV0IHJlYyBhdXggaSB4cyA9IG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5vbmVcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBpZiBwIHggdGhlbiBTb21lIGkgZWxzZSBhdXggKGkrMSkgeHMgaW5cbiAgYXV4IDAgeHNcblxubGV0IHJlYyBmaW5kX21hcCBmIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgZmluZF9tYXAgZiB4c1xuICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+XG4gICAgICAgICAgcmVzdWx0XG5cbmxldCBmaW5kX21hcGkgZiB4cyA9XG4gIGxldCByZWMgYXV4IGkgeHMgPSBtYXRjaCB4cygpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGF1eCAoaSsxKSB4c1xuICAgICAgICB8IFNvbWUgXyBhcyByZXN1bHQgLT5cbiAgICAgICAgICAgIHJlc3VsdCBpblxuICBhdXggMCB4c1xuXG4oKiBbaXRlcjJdLCBbZm9sZF9sZWZ0Ml0sIFtmb3JfYWxsMl0sIFtleGlzdHMyXSwgW21hcDJdLCBbemlwXSB3b3JrIGFsc28gaW5cbiAgIHRoZSBjYXNlIHdoZXJlIHRoZSB0d28gc2VxdWVuY2VzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIFRoZXkgc3RvcCBhcyBzb29uXG4gICBhcyBvbmUgc2VxdWVuY2UgaXMgZXhoYXVzdGVkLiBUaGVpciBiZWhhdmlvciBpcyBzbGlnaHRseSBhc3ltbWV0cmljOiB3aGVuXG4gICBbeHNdIGlzIGVtcHR5LCB0aGV5IGRvIG5vdCBmb3JjZSBbeXNdOyBob3dldmVyLCB3aGVuIFt5c10gaXMgZW1wdHksIFt4c10gaXNcbiAgIGZvcmNlZCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24gW3hzKCldIHR1cm5zIG91dFxuICAgdG8gYmUgdXNlbGVzcy4gKilcblxubGV0IHJlYyBpdGVyMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICAoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgICgpXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5O1xuICAgICAgICAgIGl0ZXIyIGYgeHMgeXNcblxubGV0IHJlYyBmb2xkX2xlZnQyIGYgYWNjdSB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgYWNjdVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGFjY3VcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgbGV0IGFjY3UgPSBmIGFjY3UgeCB5IGluXG4gICAgICAgICAgZm9sZF9sZWZ0MiBmIGFjY3UgeHMgeXNcblxubGV0IHJlYyBmb3JfYWxsMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgdHJ1ZVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBmIHggeSAmJiBmb3JfYWxsMiBmIHhzIHlzXG5cbmxldCByZWMgZXhpc3RzMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBmYWxzZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5IHx8IGV4aXN0czIgZiB4cyB5c1xuXG5sZXQgcmVjIGVxdWFsIGVxIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gIHwgTmlsLCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cyksIENvbnMgKHksIHlzKSAtPlxuICAgICAgZXEgeCB5ICYmIGVxdWFsIGVxIHhzIHlzXG4gIHwgTmlsLCBDb25zIChfLCBfKVxuICB8IENvbnMgKF8sIF8pLCBOaWwgLT5cbiAgICAgIGZhbHNlXG5cbmxldCByZWMgY29tcGFyZSBjbXAgeHMgeXMgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgfCBOaWwsIE5pbCAtPlxuICAgICAgMFxuICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBsZXQgYyA9IGNtcCB4IHkgaW5cbiAgICAgIGlmIGMgPD4gMCB0aGVuIGMgZWxzZSBjb21wYXJlIGNtcCB4cyB5c1xuICB8IE5pbCwgQ29ucyAoXywgXykgLT5cbiAgICAgIC0xXG4gIHwgQ29ucyAoXywgXyksIE5pbCAtPlxuICAgICAgKzFcblxuXG5cbigqIFtpbml0X2F1eCBmIGkgal0gaXMgdGhlIHNlcXVlbmNlIFtmIGksIC4uLiwgZiAoai0xKV0uICopXG5cbmxldCByZWMgaW5pdF9hdXggZiBpIGogKCkgPVxuICBpZiBpIDwgaiB0aGVuIGJlZ2luXG4gICAgQ29ucyAoZiBpLCBpbml0X2F1eCBmIChpICsgMSkgailcbiAgZW5kXG4gIGVsc2VcbiAgICBOaWxcblxubGV0IGluaXQgbiBmID1cbiAgaWYgbiA8IDAgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU2VxLmluaXRcIlxuICBlbHNlXG4gICAgaW5pdF9hdXggZiAwIG5cblxubGV0IHJlYyByZXBlYXQgeCAoKSA9XG4gIENvbnMgKHgsIHJlcGVhdCB4KVxuXG5sZXQgcmVjIGZvcmV2ZXIgZiAoKSA9XG4gIENvbnMgKGYoKSwgZm9yZXZlciBmKVxuXG4oKiBUaGlzIHByZWxpbWluYXJ5IGRlZmluaXRpb24gb2YgW2N5Y2xlXSByZXF1aXJlcyB0aGUgc2VxdWVuY2UgW3hzXVxuICAgdG8gYmUgbm9uZW1wdHkuIEFwcGx5aW5nIGl0IHRvIGFuIGVtcHR5IHNlcXVlbmNlIHdvdWxkIHByb2R1Y2UgYVxuICAgc2VxdWVuY2UgdGhhdCBkaXZlcmdlcyB3aGVuIGl0IGlzIGZvcmNlZC4gKilcblxubGV0IHJlYyBjeWNsZV9ub25lbXB0eSB4cyAoKSA9XG4gIGFwcGVuZCB4cyAoY3ljbGVfbm9uZW1wdHkgeHMpICgpXG5cbigqIFtjeWNsZSB4c10gY2hlY2tzIHdoZXRoZXIgW3hzXSBpcyBlbXB0eSBhbmQsIGlmIHNvLCByZXR1cm5zIGFuIGVtcHR5XG4gICBzZXF1ZW5jZS4gT3RoZXJ3aXNlLCBbY3ljbGUgeHNdIHByb2R1Y2VzIG9uZSBjb3B5IG9mIFt4c10gZm9sbG93ZWRcbiAgIHdpdGggdGhlIGluZmluaXRlIHNlcXVlbmNlIFtjeWNsZV9ub25lbXB0eSB4c10uIFRodXMsIHRoZSBub25lbXB0aW5lc3NcbiAgIGNoZWNrIGlzIHBlcmZvcm1lZCBqdXN0IG9uY2UuICopXG5cbmxldCBjeWNsZSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMnKSAtPlxuICAgICAgQ29ucyAoeCwgYXBwZW5kIHhzJyAoY3ljbGVfbm9uZW1wdHkgeHMpKVxuXG4oKiBbaXRlcmF0ZTEgZiB4XSBpcyB0aGUgc2VxdWVuY2UgW2YgeCwgZiAoZiB4KSwgLi4uXS5cbiAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKGl0ZXJhdGUgZiB4KV0uXG4gICBbaXRlcmF0ZTFdIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0uICopXG5cbmxldCByZWMgaXRlcmF0ZTEgZiB4ICgpID1cbiAgbGV0IHkgPSBmIHggaW5cbiAgQ29ucyAoeSwgaXRlcmF0ZTEgZiB5KVxuXG4oKiBbaXRlcmF0ZSBmIHhdIGlzIHRoZSBzZXF1ZW5jZSBbeCwgZiB4LCAuLi5dLiAqKVxuXG4oKiBUaGUgcmVhc29uIHdoeSB3ZSBnaXZlIHRoaXMgc2xpZ2h0bHkgaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0sXG4gICBhcyBvcHBvc2VkIHRvIHRoZSBtb3JlIG5haXZlIGRlZmluaXRpb24gdGhhdCBtYXkgY29tZSB0byBtaW5kLCBpcyB0aGF0XG4gICB3ZSBhcmUgY2FyZWZ1bCB0byBhdm9pZCBldmFsdWF0aW5nIFtmIHhdIHVudGlsIHRoaXMgZnVuY3Rpb24gY2FsbCBpc1xuICAgYWN0dWFsbHkgbmVjZXNzYXJ5LiBUaGUgbmFpdmUgZGVmaW5pdGlvbiAobm90IHNob3duIGhlcmUpIGNvbXB1dGVzIHRoZVxuICAgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBzZXF1ZW5jZSwgW2YgeF0sIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IGlzXG4gICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICopXG5cbmxldCBpdGVyYXRlIGYgeCA9XG4gIGNvbnMgeCAoaXRlcmF0ZTEgZiB4KVxuXG5cblxubGV0IHJlYyBtYXBpX2F1eCBmIGkgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoZiBpIHgsIG1hcGlfYXV4IGYgKGkrMSkgeHMpXG5cbmxldFtAaW5saW5lXSBtYXBpIGYgeHMgPVxuICBtYXBpX2F1eCBmIDAgeHNcblxuKCogW3RhaWxfc2NhbiBmIHMgeHNdIGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKHNjYW4gZiBzIHhzKV0uXG4gICBbdGFpbF9zY2FuXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW3NjYW5dLiAqKVxuXG4oKiBUaGlzIHNsaWdodGx5IGluZGlyZWN0IGRlZmluaXRpb24gb2YgW3NjYW5dIGlzIG1lYW50IHRvIGF2b2lkIGNvbXB1dGluZ1xuICAgZWxlbWVudHMgdG9vIGVhcmx5OyBzZWUgdGhlIGFib3ZlIGNvbW1lbnQgYWJvdXQgW2l0ZXJhdGUxXSBhbmQgW2l0ZXJhdGVdLiAqKVxuXG5sZXQgcmVjIHRhaWxfc2NhbiBmIHMgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbGV0IHMgPSBmIHMgeCBpblxuICAgICAgQ29ucyAocywgdGFpbF9zY2FuIGYgcyB4cylcblxubGV0IHNjYW4gZiBzIHhzID1cbiAgY29ucyBzICh0YWlsX3NjYW4gZiBzIHhzKVxuXG4oKiBbdGFrZV0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW3Rha2UgMCB4c10gcmV0dXJucyBbZW1wdHldXG4gICBpbW1lZGlhdGVseSwgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCByZWMgdGFrZV9hdXggbiB4cyA9XG4gIGlmIG4gPSAwIHRoZW5cbiAgICBlbXB0eVxuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICAgIENvbnMgKHgsIHRha2VfYXV4IChuLTEpIHhzKVxuXG5sZXQgdGFrZSBuIHhzID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcS50YWtlXCI7XG4gIHRha2VfYXV4IG4geHNcblxuKCogW2ZvcmNlX2Ryb3AgbiB4c10gaXMgZXF1aXZhbGVudCB0byBbZHJvcCBuIHhzICgpXS5cbiAgIFtmb3JjZV9kcm9wIG4geHNdIHJlcXVpcmVzIFtuID4gMF0uXG4gICBbZm9yY2VfZHJvcF0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtkcm9wXS4gKilcblxubGV0IHJlYyBmb3JjZV9kcm9wIG4geHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKF8sIHhzKSAtPlxuICAgICAgbGV0IG4gPSBuIC0gMSBpblxuICAgICAgaWYgbiA9IDAgdGhlblxuICAgICAgICB4cygpXG4gICAgICBlbHNlXG4gICAgICAgIGZvcmNlX2Ryb3AgbiB4c1xuXG4oKiBbZHJvcF0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW2Ryb3AgMCB4c10gcmV0dXJucyBbeHNdIGltbWVkaWF0ZWx5LFxuICAgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCBkcm9wIG4geHMgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VxLmRyb3BcIlxuICBlbHNlIGlmIG4gPSAwIHRoZW5cbiAgICB4c1xuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBmb3JjZV9kcm9wIG4geHNcblxubGV0IHJlYyB0YWtlX3doaWxlIHAgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgaWYgcCB4IHRoZW4gQ29ucyAoeCwgdGFrZV93aGlsZSBwIHhzKSBlbHNlIE5pbFxuXG5sZXQgcmVjIGRyb3Bfd2hpbGUgcCB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIGFzIG5vZGUgLT5cbiAgICAgIGlmIHAgeCB0aGVuIGRyb3Bfd2hpbGUgcCB4cyAoKSBlbHNlIG5vZGVcblxubGV0IHJlYyBncm91cCBlcSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zIChjb25zIHggKHRha2Vfd2hpbGUgKGVxIHgpIHhzKSwgZ3JvdXAgZXEgKGRyb3Bfd2hpbGUgKGVxIHgpIHhzKSlcblxuZXhjZXB0aW9uIEZvcmNlZF90d2ljZVxuXG5tb2R1bGUgU3VzcGVuc2lvbiA9IHN0cnVjdFxuXG4gIHR5cGUgJ2Egc3VzcGVuc2lvbiA9XG4gICAgdW5pdCAtPiAnYVxuXG4gICgqIENvbnZlcnNpb25zLiAqKVxuXG4gIGxldCB0b19sYXp5IDogJ2Egc3VzcGVuc2lvbiAtPiAnYSBMYXp5LnQgPVxuICAgIExhenkuZnJvbV9mdW5cbiAgICAoKiBmdW4gcyAtPiBsYXp5IChzKCkpICopXG5cbiAgbGV0IGZyb21fbGF6eSAocyA6ICdhIExhenkudCkgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBmdW4gKCkgLT4gTGF6eS5mb3JjZSBzXG5cbiAgKCogW21lbW9pemVdIHR1cm5zIGFuIGFyYml0cmFyeSBzdXNwZW5zaW9uIGludG8gYSBwZXJzaXN0ZW50IHN1c3BlbnNpb24uICopXG5cbiAgbGV0IG1lbW9pemUgKHMgOiAnYSBzdXNwZW5zaW9uKSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGZyb21fbGF6eSAodG9fbGF6eSBzKVxuXG4gICgqIFtmYWlsdXJlXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBmYWlscyB3aGVuIGZvcmNlZC4gKilcblxuICBsZXQgZmFpbHVyZSA6IF8gc3VzcGVuc2lvbiA9XG4gICAgZnVuICgpIC0+XG4gICAgICAoKiBBIHN1c3BlbnNpb24gY3JlYXRlZCBieSBbb25jZV0gaGFzIGJlZW4gZm9yY2VkIHR3aWNlLiAqKVxuICAgICAgcmFpc2UgRm9yY2VkX3R3aWNlXG5cbiAgKCogSWYgW2ZdIGlzIGEgc3VzcGVuc2lvbiwgdGhlbiBbb25jZSBmXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBjYW4gYmUgZm9yY2VkXG4gICAgIGF0IG1vc3Qgb25jZS4gSWYgaXQgaXMgZm9yY2VkIG1vcmUgdGhhbiBvbmNlLCB0aGVuIFtGb3JjZWRfdHdpY2VdIGlzXG4gICAgIHJhaXNlZC4gKilcblxuICBsZXQgb25jZSAoZiA6ICdhIHN1c3BlbnNpb24pIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgbGV0IGFjdGlvbiA9IEF0b21pYy5tYWtlIGYgaW5cbiAgICBmdW4gKCkgLT5cbiAgICAgICgqIEdldCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IHN0b3JlZCBpbiBbYWN0aW9uXSwgYW5kIHdyaXRlIHRoZVxuICAgICAgICAgZnVuY3Rpb24gW2ZhaWx1cmVdIGluIGl0cyBwbGFjZSwgc28gdGhlIG5leHQgYWNjZXNzIHdpbGwgcmVzdWx0XG4gICAgICAgICBpbiBhIGNhbGwgdG8gW2ZhaWx1cmUoKV0uICopXG4gICAgICBsZXQgZiA9IEF0b21pYy5leGNoYW5nZSBhY3Rpb24gZmFpbHVyZSBpblxuICAgICAgZigpXG5cbmVuZCAoKiBTdXNwZW5zaW9uICopXG5cbmxldCByZWMgbWVtb2l6ZSB4cyA9XG4gIFN1c3BlbnNpb24ubWVtb2l6ZSAoZnVuICgpIC0+XG4gICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgQ29ucyAoeCwgbWVtb2l6ZSB4cylcbiAgKVxuXG5sZXQgcmVjIG9uY2UgeHMgPVxuICBTdXNwZW5zaW9uLm9uY2UgKGZ1biAoKSAtPlxuICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgIENvbnMgKHgsIG9uY2UgeHMpXG4gIClcblxuXG5sZXQgcmVjIHppcCB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKCh4LCB5KSwgemlwIHhzIHlzKVxuXG5sZXQgcmVjIG1hcDIgZiB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKGYgeCB5LCBtYXAyIGYgeHMgeXMpXG5cbmxldCByZWMgaW50ZXJsZWF2ZSB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgeXMoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoeCwgaW50ZXJsZWF2ZSB5cyB4cylcblxuKCogW3NvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIChjb25zIHggeHMpIHlzXS5cblxuICAgW3NvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIHhzIChjb25zIHkgeXMpXS5cblxuICAgW3NvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c10gaXMgZXF1aXZhbGVudCB0b1xuICAgICBbc29ydGVkX21lcmdlIGNtcCAoY29ucyB4IHhzKSAoY29ucyB5IHlzKV0uXG5cbiAgIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBhcmUgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgaW4gdGhlIGRlZmluaXRpb25cbiAgIG9mIFtzb3J0ZWRfbWVyZ2VdLiAqKVxuXG5sZXQgcmVjIHNvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzICgpID1cbiAgbWF0Y2ggeXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBDb25zICh4LCB4cylcbiAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5hbmQgc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIENvbnMgKHksIHlzKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cbmFuZCBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXMgPVxuICBpZiBjbXAgeCB5IDw9IDAgdGhlblxuICAgIENvbnMgKHgsIHNvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzKVxuICBlbHNlXG4gICAgQ29ucyAoeSwgc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXMpXG5cbmxldCBzb3J0ZWRfbWVyZ2UgY21wIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gICAgfCBOaWwsIE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IE5pbCwgY1xuICAgIHwgYywgTmlsIC0+XG4gICAgICAgIGNcbiAgICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5cbmxldCByZWMgbWFwX2ZzdCB4eXMgKCkgPVxuICBtYXRjaCB4eXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICgoeCwgXyksIHh5cykgLT5cbiAgICAgIENvbnMgKHgsIG1hcF9mc3QgeHlzKVxuXG5sZXQgcmVjIG1hcF9zbmQgeHlzICgpID1cbiAgbWF0Y2ggeHlzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoKF8sIHkpLCB4eXMpIC0+XG4gICAgICBDb25zICh5LCBtYXBfc25kIHh5cylcblxubGV0IHVuemlwIHh5cyA9XG4gIG1hcF9mc3QgeHlzLCBtYXBfc25kIHh5c1xuXG5sZXQgc3BsaXQgPVxuICB1bnppcFxuXG4oKiBbZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgIFtmaWx0ZXJfbWFwIEVpdGhlci5maW5kX2xlZnQgKG1hcCBmIHhzKV0uICopXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgRWl0aGVyLkxlZnQgeSAtPlxuICAgICAgICAgIENvbnMgKHksIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzKVxuICAgICAgfCBFaXRoZXIuUmlnaHQgXyAtPlxuICAgICAgICAgIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzICgpXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IEVpdGhlci5MZWZ0IF8gLT5cbiAgICAgICAgICBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMgKClcbiAgICAgIHwgRWl0aGVyLlJpZ2h0IHogLT5cbiAgICAgICAgICBDb25zICh6LCBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMpXG5cbmxldCBwYXJ0aXRpb25fbWFwIGYgeHMgPVxuICBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyxcbiAgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzXG5cbmxldCBwYXJ0aXRpb24gcCB4cyA9XG4gIGZpbHRlciBwIHhzLCBmaWx0ZXIgKGZ1biB4IC0+IG5vdCAocCB4KSkgeHNcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW3BlZWwgeHNzXSBpcyBhIHBhaXIgb2ZcbiAgIHRoZSBmaXJzdCBjb2x1bW4gKGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMpIGFuZCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZVxuICAgbWF0cml4IChhIHNlcXVlbmNlIG9mIHNob3J0ZXIgcm93cykuIFRoZXNlIHR3byBzZXF1ZW5jZXMgaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBUaGUgcm93cyBvZiB0aGUgbWF0cml4IFt4c3NdIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBBbiBlbXB0eSByb3cgaXMgaWdub3JlZC4gKilcblxuKCogQmVjYXVzZSBbcGVlbF0gdXNlcyBbdW56aXBdLCBpdHMgYXJndW1lbnQgbXVzdCBiZSBwZXJzaXN0ZW50LiBUaGUgc2FtZVxuICAgcmVtYXJrIGFwcGxpZXMgdG8gW3RyYW5zcG9zZV0sIFtkaWFnb25hbHNdLCBbcHJvZHVjdF0sIGV0Yy4gKilcblxubGV0IHBlZWwgeHNzID1cbiAgdW56aXAgKGZpbHRlcl9tYXAgdW5jb25zIHhzcylcblxubGV0IHJlYyB0cmFuc3Bvc2UgeHNzICgpID1cbiAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgeHNzIGluXG4gIGlmIGlzX2VtcHR5IGhlYWRzIHRoZW4gYmVnaW5cbiAgICBhc3NlcnQgKGlzX2VtcHR5IHRhaWxzKTtcbiAgICBOaWxcbiAgZW5kXG4gIGVsc2VcbiAgICBDb25zIChoZWFkcywgdHJhbnNwb3NlIHRhaWxzKVxuXG4oKiBUaGUgaW50ZXJuYWwgZnVuY3Rpb24gW2RpYWdvbmFsc10gdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQsIFtyZW1haW5kZXJzXSxcbiAgIHdoaWNoIGNvbnRhaW5zIHRoZSByZW1haW5kZXJzIG9mIHRoZSByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgIGRpc2NvdmVyZWQuICopXG5cbmxldCByZWMgZGlhZ29uYWxzIHJlbWFpbmRlcnMgeHNzICgpID1cbiAgbWF0Y2ggeHNzKCkgd2l0aFxuICB8IENvbnMgKHhzLCB4c3MpIC0+XG4gICAgICBiZWdpbiBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgbm9uZW1wdHkgcm93IFt4IDo6IHhzXS4gVGh1cywgdGhlIG5leHQgZGlhZ29uYWxcbiAgICAgICAgICAgICBpcyBbeCA6OiBoZWFkc106IHRoaXMgZGlhZ29uYWwgYmVnaW5zIHdpdGggW3hdIGFuZCBjb250aW51ZXMgd2l0aFxuICAgICAgICAgICAgIHRoZSBmaXJzdCBlbGVtZW50IG9mIGV2ZXJ5IHJvdyBpbiBbcmVtYWluZGVyc10uIEluIHRoZSByZWN1cnNpdmVcbiAgICAgICAgICAgICBjYWxsLCB0aGUgYXJndW1lbnQgW3JlbWFpbmRlcnNdIGlzIGluc3RhbnRpYXRlZCB3aXRoIFt4cyA6OlxuICAgICAgICAgICAgIHRhaWxzXSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3csIFt4c10sXG4gICAgICAgICAgICAgYW5kIHRoYXQgd2Uga2VlcCB0aGUgdGFpbHMgb2YgdGhlIHByZS1leGlzdGluZyByZW1haW5pbmcgcm93cy4gKilcbiAgICAgICAgICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCByZW1haW5kZXJzIGluXG4gICAgICAgICAgQ29ucyAoY29ucyB4IGhlYWRzLCBkaWFnb25hbHMgKGNvbnMgeHMgdGFpbHMpIHhzcylcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgZW1wdHkgcm93LiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgZGlhZ29uYWwgaXNcbiAgICAgICAgICAgICBqdXN0IFtoZWFkc10sIGFuZCBbcmVtYWluZGVyc10gaXMgaW5zdGFudGlhdGVkIHdpdGgganVzdCBbdGFpbHNdLFxuICAgICAgICAgICAgIGFzIHdlIGRvIG5vdCBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3cuICopXG4gICAgICAgICAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgcmVtYWluZGVycyBpblxuICAgICAgICAgIENvbnMgKGhlYWRzLCBkaWFnb25hbHMgdGFpbHMgeHNzKVxuICAgICAgZW5kXG4gIHwgTmlsIC0+XG4gICAgICAoKiBUaGVyZSBhcmUgbm8gbW9yZSByb3dzIHRvIGJlIGRpc2NvdmVyZWQuIFRoZXJlIHJlbWFpbnMgdG8gZXhoYXVzdFxuICAgICAgICAgdGhlIHJlbWFpbmluZyByb3dzLiAqKVxuICAgICAgdHJhbnNwb3NlIHJlbWFpbmRlcnMgKClcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW2RpYWdvbmFscyB4c3NdIGlzXG4gICB0aGUgc2VxdWVuY2Ugb2YgaXRzIGRpYWdvbmFscy5cblxuICAgVGhlIGZpcnN0IGRpYWdvbmFsIGNvbnRhaW5zIGp1c3QgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBmaXJzdCByb3cuIFRoZSBzZWNvbmQgZGlhZ29uYWwgY29udGFpbnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBzZWNvbmQgcm93IGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHJvdzsgYW5kIHNvIG9uLlxuICAgVGhpcyBraW5kIG9mIGRpYWdvbmFsIGlzIGluIGZhY3Qgc29tZXRpbWVzIGtub3duIGFzIGFuIGFudGlkaWFnb25hbC5cblxuICAgLSBFdmVyeSBkaWFnb25hbCBpcyBhIGZpbml0ZSBzZXF1ZW5jZS5cbiAgIC0gVGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCBbeHNzXSBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIGlzIG5vdCByZXF1aXJlZCB0byBiZSBmaW5pdGUgKGluIGVpdGhlciBkaXJlY3Rpb24pLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIG11c3QgYmUgcGVyc2lzdGVudC4gKilcblxubGV0IGRpYWdvbmFscyB4c3MgPVxuICBkaWFnb25hbHMgZW1wdHkgeHNzXG5cbmxldCBtYXBfcHJvZHVjdCBmIHhzIHlzID1cbiAgY29uY2F0IChkaWFnb25hbHMgKFxuICAgIG1hcCAoZnVuIHggLT5cbiAgICAgIG1hcCAoZnVuIHkgLT5cbiAgICAgICAgZiB4IHlcbiAgICAgICkgeXNcbiAgICApIHhzXG4gICkpXG5cbmxldCBwcm9kdWN0IHhzIHlzID1cbiAgbWFwX3Byb2R1Y3QgKGZ1biB4IHkgLT4gKHgsIHkpKSB4cyB5c1xuXG5sZXQgb2ZfZGlzcGVuc2VyIGl0ID1cbiAgbGV0IHJlYyBjICgpID1cbiAgICBtYXRjaCBpdCgpIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgTmlsXG4gICAgfCBTb21lIHggLT5cbiAgICAgICAgQ29ucyAoeCwgYylcbiAgaW5cbiAgY1xuXG5sZXQgdG9fZGlzcGVuc2VyIHhzID1cbiAgbGV0IHMgPSByZWYgeHMgaW5cbiAgZnVuICgpIC0+XG4gICAgbWF0Y2ggKCFzKSgpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgcyA6PSB4cztcbiAgICAgICAgU29tZSB4XG5cblxuXG5sZXQgcmVjIGludHMgaSAoKSA9XG4gIENvbnMgKGksIGludHMgKGkgKyAxKSlcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiQXNzZXJ0X2ZhaWx1cmUiLCJTdGRsaWJfQXRvbWljIiwiQ2FtbGludGVybmFsTGF6eSIsIlN0ZGxpYiIsIlN0ZGxpYl9MYXp5IiwiZW1wdHkiLCJwYXJhbSIsInJldHVybiQiLCJ4IiwiY29ucyIsIm5leHQiLCJhcHBlbmQiLCJzZXExIiwic2VxMiIsIm1hdGNoIiwibWFwIiwic2VxIiwiZmlsdGVyX21hcCIsInkiLCJmaWx0ZXIiLCJjb25jYXQiLCJmbGF0X21hcCIsImZvbGRfbGVmdCIsImFjYyIsIml0ZXIiLCJ1bmZvbGQiLCJ1IiwiaXNfZW1wdHkiLCJ4cyIsInVuY29ucyIsImxlbmd0aCIsImFjY3UiLCJpdGVyaSIsImkiLCJmb2xkX2xlZnRpIiwiZm9yX2FsbCIsInAiLCJleGlzdHMiLCJmaW5kIiwiZmluZF9pbmRleCIsImZpbmRfbWFwIiwicmVzdWx0IiwiZmluZF9tYXBpIiwiaXRlcjIiLCJ5cyIsImZvbGRfbGVmdDIiLCJmb3JfYWxsMiIsImV4aXN0czIiLCJlcXVhbCIsImVxIiwiY29tcGFyZSIsImNtcCIsImMiLCJpbml0X2F1eCIsImoiLCJpbml0IiwibiIsInJlcGVhdCIsImZvcmV2ZXIiLCJjeWNsZV9ub25lbXB0eSIsImN5Y2xlIiwiaXRlcmF0ZTEiLCJpdGVyYXRlIiwibWFwaV9hdXgiLCJtYXBpIiwidGFpbF9zY2FuIiwicyIsInNjYW4iLCJ0YWtlX2F1eCIsInRha2UiLCJkcm9wIiwidGFrZV93aGlsZSIsImRyb3Bfd2hpbGUiLCJub2RlIiwiZ3JvdXAiLCJGb3JjZWRfdHdpY2UiLCJ0b19sYXp5IiwiZmFpbHVyZSIsIm1lbW9pemUiLCJvbmNlIiwiYWN0aW9uIiwiemlwIiwibWFwMiIsImludGVybGVhdmUiLCJzb3J0ZWRfbWVyZ2UxIiwic29ydGVkX21lcmdlIiwibWFwX2ZzdCIsInh5cyIsIm1hcF9zbmQiLCJ1bnppcCIsImZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCIsImZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAiLCJ6IiwicGFydGl0aW9uX21hcCIsInBhcnRpdGlvbiIsInBlZWwiLCJ4c3MiLCJ0cmFuc3Bvc2UiLCJ0YWlscyIsImhlYWRzIiwicmVtYWluZGVycyIsIm1hcF9wcm9kdWN0IiwicHJvZHVjdCIsIm9mX2Rpc3BlbnNlciIsIml0IiwidG9fZGlzcGVuc2VyIiwiaW50cyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUosR0FBQUMsSUFBQUUsSUFBQUU7QUFBQUEsSUFB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LFNBQUFOLElBRk07QUFBQSxLQUlOO0FBQUEsSUFBVztBQUFBLElBRWpCO0FBQUEsR0FBQztBQUFBLFlBQUFpRyxhQUFBN0U7QUFBQUEsUUFBQXNDLElBR0Q7QUFBQSxJQUNBLGdCQUFBNUQ7QUFBQUEsU0FBQVEsUUFDUTtBQUFBLEtBQU0sWUFFUjtBQUFBLFNBQUFjLEtBRlEsVUFBQXBCLElBQUE7QUFBQSxLQUlSO0FBQUEsS0FDQSxjQUFNLENBTlo7QUFBQSxHQU1ZO0FBQUEsWUFBQWtHLEtBQUF6RSxHQUFBM0I7QUFBQUEsUUFBQSxJQUtIO0FBQUEsSUFBWSwwQkFBWixvQkFBWTtBQUFBLEdBQUM7QUFBQSxHRDdyQnhCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTEwMzIsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvb3B0aW9uLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAnYSBvcHRpb24gPSBOb25lIHwgU29tZSBvZiAnYVxuXG5sZXQgbm9uZSA9IE5vbmVcbmxldCBzb21lIHYgPSBTb21lIHZcbmxldCB2YWx1ZSBvIH5kZWZhdWx0ID0gbWF0Y2ggbyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBkZWZhdWx0XG5sZXQgZ2V0ID0gZnVuY3Rpb24gU29tZSB2IC0+IHYgfCBOb25lIC0+IGludmFsaWRfYXJnIFwib3B0aW9uIGlzIE5vbmVcIlxubGV0IGJpbmQgbyBmID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBmIHZcbmxldCBqb2luID0gZnVuY3Rpb24gU29tZSBvIC0+IG8gfCBOb25lIC0+IE5vbmVcbmxldCBtYXAgZiBvID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBTb21lIChmIHYpXG5sZXQgZm9sZCB+bm9uZSB+c29tZSA9IGZ1bmN0aW9uIFNvbWUgdiAtPiBzb21lIHYgfCBOb25lIC0+IG5vbmVcbmxldCBpdGVyIGYgPSBmdW5jdGlvbiBTb21lIHYgLT4gZiB2IHwgTm9uZSAtPiAoKVxubGV0IGlzX25vbmUgPSBmdW5jdGlvbiBOb25lIC0+IHRydWUgfCBTb21lIF8gLT4gZmFsc2VcbmxldCBpc19zb21lID0gZnVuY3Rpb24gTm9uZSAtPiBmYWxzZSB8IFNvbWUgXyAtPiB0cnVlXG5cbmxldCBlcXVhbCBlcSBvMCBvMSA9IG1hdGNoIG8wLCBvMSB3aXRoXG58IFNvbWUgdjAsIFNvbWUgdjEgLT4gZXEgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiB0cnVlXG58IF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgY21wIG8wIG8xID0gbWF0Y2ggbzAsIG8xIHdpdGhcbnwgU29tZSB2MCwgU29tZSB2MSAtPiBjbXAgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiAwXG58IE5vbmUsIFNvbWUgXyAtPiAtMVxufCBTb21lIF8sIE5vbmUgLT4gMVxuXG5sZXQgdG9fcmVzdWx0IH5ub25lID0gZnVuY3Rpb24gTm9uZSAtPiBFcnJvciBub25lIHwgU29tZSB2IC0+IE9rIHZcbmxldCB0b19saXN0ID0gZnVuY3Rpb24gTm9uZSAtPiBbXSB8IFNvbWUgdiAtPiBbdl1cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBOb25lIC0+IFNlcS5lbXB0eSB8IFNvbWUgdiAtPiBTZXEucmV0dXJuIHZcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX1NlcSIsIlN0ZGxpYiIsInNvbWUiLCJ2IiwidmFsdWUiLCJvIiwiZGVmYXVsdCQiLCJnZXQiLCJwYXJhbSIsImJpbmQiLCJqb2luIiwibWFwIiwiZm9sZCIsIm5vbmUiLCJpdGVyIiwiaXNfbm9uZSIsImlzX3NvbWUiLCJlcXVhbCIsImVxIiwibzAiLCJvMSIsInYxIiwidjAiLCJjb21wYXJlIiwiY21wIiwidG9fcmVzdWx0IiwidG9fbGlzdCIsInRvX3NlcSJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsWUFBQUMsS0FBQUMsR0NrQmEsY0FBTTtBQUFBLFlBQUFDLE1BQUFDLEdBQUFDO0FBQUFBLElBQ0ksUUFBbUM7QUFBQSxRQUFBSCxJQUFuQztBQUFBLElBQXVCO0FBQUEsR0FBbUI7QUFBQSxZQUFBSSxJQUFBQztBQUFBQSxJQUN2RCxZQUErQiw2Q0FBNEI7QUFBQSxRQUFBTCxJQUEzRDtBQUFBLElBQW1CO0FBQUEsR0FBd0M7QUFBQSxZQUFBTSxLQUFBSixHQUFBVjtBQUFBQSxJQUN0RCxRQUFxQjtBQUFBLFFBQUFRLElBQXJCO0FBQUEsSUFBc0MsdUJBQUc7QUFBQTtBQUFBLFlBQUFPLEtBQUFGLE9BQzdDLFlBQStCLGNBQUFILElBQS9CLFVBQW1CLFNBQWdCO0FBQUEsWUFBQU0sSUFBQWhCLEdBQUFVO0FBQUFBLElBQ2hDLFFBQXFCO0FBQUEsUUFBQUYsSUFBckI7QUFBQSxJQUEyQyw0QkFBSztBQUFBO0FBQUEsWUFBQVMsS0FBQUMsTUFBQVgsTUFBQU07QUFBQUEsSUFDckQsWUFBa0Q7QUFBQSxRQUFBTCxJQUFsRDtBQUFBLElBQWlDLDBCQUFxQjtBQUFBO0FBQUEsWUFBQVcsS0FBQW5CLEdBQUFhO0FBQUFBLElBQ3RELFlBQXFDO0FBQUEsUUFBQUwsSUFBckM7QUFBQSxJQUF1Qix1QkFBZ0I7QUFBQTtBQUFBLFlBQUFZLFFBQUFQLE9BQ2xDLG9CQUF1QztBQUFBLFlBQUFRLFFBQUFSLE9BQ3ZDLG9CQUF1QztBQUFBLFlBQUFTLE1BQUFDLElBQUFDLElBQUFDO0FBQUFBLElBRWhDO0FBQUEsZ0JBQUFDLEtBQUEsT0FBQUMsS0FBQSxPQUNDLDZCQUVWO0FBQUE7QUFBQSxrQkFESTtBQUFBLElBQ1Q7QUFBQSxHQUFLO0FBQUEsWUFBQUMsUUFBQUMsS0FBQUwsSUFBQUM7QUFBQUEsSUFFWSwyQkFJTDtBQUFBLFFBQUFFLEtBSks7QUFBQSxhQUlOO0FBQUEsUUFBQUQsS0FKTTtBQUFBLElBQ0YsOEJBR0g7QUFBQTtBQUFBLFlBQUFJLFVBQUFaLE1BQUFMO0FBQUFBLElBRUwsWUFBeUI7QUFBQSxRQUFBTCxJQUF6QjtBQUFBLElBQWdEO0FBQUEsR0FBSTtBQUFBLFlBQUF1QixRQUFBbEI7QUFBQUEsSUFDcEQsWUFBaUI7QUFBQSxRQUFBTCxJQUFqQjtBQUFBLElBQWdDO0FBQUEsR0FBRztBQUFBLFlBQUF3QixPQUFBbkI7QUFBQUEsSUFDcEMsWUFBaUI7QUFBQSxRQUFBTCxJQUFqQixjQUF1QztBQUFBLHVCRDFDcEQsZ0JDMENvRDtBQUFBLEdBQVk7QUFBQSxHRDFDaEUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMTE0MCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9jaGFyLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBDaGFyYWN0ZXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBjb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaHI6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgY2hyIG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJDaGFyLmNoclwiIGVsc2UgdW5zYWZlX2NociBuXG5cbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZTogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCBieXRlc191bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuXG5sZXQgZXNjYXBlZCA9IGZ1bmN0aW9uXG4gIHwgJ1xcJycgLT4gXCJcXFxcJ1wiXG4gIHwgJ1xcXFwnIC0+IFwiXFxcXFxcXFxcIlxuICB8ICdcXG4nIC0+IFwiXFxcXG5cIlxuICB8ICdcXHQnIC0+IFwiXFxcXHRcIlxuICB8ICdcXHInIC0+IFwiXFxcXHJcIlxuICB8ICdcXGInIC0+IFwiXFxcXGJcIlxuICB8ICcgJyAuLiAnficgYXMgYyAtPlxuICAgICAgbGV0IHMgPSBieXRlc19jcmVhdGUgMSBpblxuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDAgYztcbiAgICAgIHVuc2FmZV90b19zdHJpbmcgc1xuICB8IGMgLT5cbiAgICAgIGxldCBuID0gY29kZSBjIGluXG4gICAgICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSA0IGluXG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMCAnXFxcXCc7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMSAodW5zYWZlX2NociAoNDggKyBuIC8gMTAwKSk7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMiAodW5zYWZlX2NociAoNDggKyAobiAvIDEwKSBtb2QgMTApKTtcbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAzICh1bnNhZmVfY2hyICg0OCArIG4gbW9kIDEwKSk7XG4gICAgICB1bnNhZmVfdG9fc3RyaW5nIHNcblxubGV0IGxvd2VyY2FzZV9hc2NpaSA9IGZ1bmN0aW9uXG4gIHwgJ0EnIC4uICdaJyBhcyBjIC0+IHVuc2FmZV9jaHIoY29kZSBjICsgMzIpXG4gIHwgYyAtPiBjXG5cbmxldCB1cHBlcmNhc2VfYXNjaWkgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgYXMgYyAtPiB1bnNhZmVfY2hyKGNvZGUgYyAtIDMyKVxuICB8IGMgLT4gY1xuXG50eXBlIHQgPSBjaGFyXG5cbmxldCBjb21wYXJlIGMxIGMyID0gY29kZSBjMSAtIGNvZGUgYzJcbmxldCBlcXVhbCAoYzE6IHQpIChjMjogdCkgPSBjb21wYXJlIGMxIGMyID0gMFxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfaGFzaCIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiU3RkbGliIiwiY2hyIiwibiIsImVzY2FwZWQiLCJjIiwicyIsImxvd2VyY2FzZV9hc2NpaSIsInVwcGVyY2FzZV9hc2NpaSIsImNvbXBhcmUiLCJjMSIsImMyIiwiZXF1YWwiLCJzZWVkZWRfaGFzaCIsInNlZWQiLCJ4IiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLElBQUFDO0FBQUFBLElDcUJFLHVCQUFxRDtBQUFBLElBQTVCLHVDQUF3QztBQUFBO0FBQUEsWUFBQUMsUUFBQUM7QUFBQUE7QUFBQUE7QUFBQUEsS0FPckQ7QUFBQSxtQkFFRjtBQUFBLE1BRkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU1GO0FBQUE7QUFBQSxVQUZBO0FBQUE7QUFBQSxVQURBO0FBQUE7QUFBQSxVQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFMRSxZQUNGO0FBQUE7QUFBQSxTQUFBQyxNQU9FO0FBQUEsS0FDUjtBQUFBLEtBQ0EsZ0NBUWtCO0FBQUE7QUFBQSxRQUFBQSxJQUxWO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsOEJBQWtCO0FBQUE7QUFBQSxZQUFBQyxnQkFBQUYsR0FFRix5Q0FFWjtBQUFBLFlBQUFHLGdCQUFBSCxHQUVZLHlDQUVaO0FBQUEsWUFBQUksUUFBQUMsSUFBQUMsSUFJVSxtQkFBaUI7QUFBQSxZQUFBQyxNQUFBRixJQUFBQyxJQUNJLG1DQUFJO0FBQUEsWUFBQUUsWUFBQUMsTUFBQUMsR0FJcEIsa0NBQStCO0FBQUEsWUFBQUMsS0FBQUQsR0FDM0MsK0JBQTRCO0FBQUEsR0RoRXpDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTEyMTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvdWNoYXIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERhbmllbCBDLiBCdWVuemxpICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcblxubGV0IGVycl9ub19wcmVkID0gXCJVKzAwMDAgaGFzIG5vIHByZWRlY2Vzc29yXCJcbmxldCBlcnJfbm9fc3VjYyA9IFwiVSsxMEZGRkYgaGFzIG5vIHN1Y2Nlc3NvclwiXG5sZXQgZXJyX25vdF9zdiBpID0gZm9ybWF0X2ludCBcIiVYXCIgaSBeIFwiIGlzIG5vdCBhbiBVbmljb2RlIHNjYWxhciB2YWx1ZVwiXG5sZXQgZXJyX25vdF9sYXRpbjEgdSA9IFwiVStcIiBeIGZvcm1hdF9pbnQgXCIlMDRYXCIgdSBeIFwiIGlzIG5vdCBhIGxhdGluMSBjaGFyYWN0ZXJcIlxuXG50eXBlIHQgPSBpbnRcblxubGV0IG1pbiA9IDB4MDAwMFxubGV0IG1heCA9IDB4MTBGRkZGXG5sZXQgbG9fYm91bmQgPSAweEQ3RkZcbmxldCBoaV9ib3VuZCA9IDB4RTAwMFxuXG5sZXQgYm9tID0gMHhGRUZGXG5sZXQgcmVwID0gMHhGRkZEXG5cbmxldCBzdWNjIHUgPVxuICBpZiB1ID0gbG9fYm91bmQgdGhlbiBoaV9ib3VuZCBlbHNlXG4gIGlmIHUgPSBtYXggdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fc3VjYyBlbHNlXG4gIHUgKyAxXG5cbmxldCBwcmVkIHUgPVxuICBpZiB1ID0gaGlfYm91bmQgdGhlbiBsb19ib3VuZCBlbHNlXG4gIGlmIHUgPSBtaW4gdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fcHJlZCBlbHNlXG4gIHUgLSAxXG5cbmxldCBpc192YWxpZCBpID0gKG1pbiA8PSBpICYmIGkgPD0gbG9fYm91bmQpIHx8IChoaV9ib3VuZCA8PSBpICYmIGkgPD0gbWF4KVxubGV0IG9mX2ludCBpID0gaWYgaXNfdmFsaWQgaSB0aGVuIGkgZWxzZSBpbnZhbGlkX2FyZyAoZXJyX25vdF9zdiBpKVxuZXh0ZXJuYWwgdW5zYWZlX29mX2ludCA6IGludCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdG9faW50IDogdCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBpc19jaGFyIHUgPSB1IDwgMjU2XG5sZXQgb2ZfY2hhciBjID0gQ2hhci5jb2RlIGNcbmxldCB0b19jaGFyIHUgPVxuICBpZiB1ID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgKGVycl9ub3RfbGF0aW4xIHUpIGVsc2VcbiAgQ2hhci51bnNhZmVfY2hyIHVcblxubGV0IHVuc2FmZV90b19jaGFyID0gQ2hhci51bnNhZmVfY2hyXG5cbmxldCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9ICggPSApXG5sZXQgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmxldCBoYXNoID0gdG9faW50XG5cbigqIFVURiBjb2RlY3MgdG9vbHMgKilcblxudHlwZSB1dGZfZGVjb2RlID0gaW50XG4oKiBUaGlzIGlzIGFuIGludCBbMHhEVVVVVVVVXSBkZWNvbXBvc2VkIGFzIGZvbGxvd3M6XG4gICAtIFtEXSBpcyBmb3VyIGJpdHMgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiwgdGhlIGhpZ2hlc3QgYml0IGlzIHNldCBpZiB0aGVcbiAgICAgZGVjb2RlIGlzIHZhbGlkLiBUaGUgdGhyZWUgbG93ZXIgYml0cyBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG4gICAgIGZyb20gdGhlIHNvdXJjZSB0aGF0IHdlcmUgY29uc3VtZWQgYnkgdGhlIGRlY29kZS5cbiAgIC0gW1VVVVVVVV0gaXMgdGhlIGRlY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgb3IgdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnRcbiAgICAgY2hhcmFjdGVyIFUrRkZGRCBpZiBmb3IgaW52YWxpZCBkZWNvZGVzLiAqKVxuXG5sZXQgdmFsaWRfYml0ID0gMjdcbmxldCBkZWNvZGVfYml0cyA9IDI0XG5cbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2lzX3ZhbGlkIGQgPSAoZCBsc3IgdmFsaWRfYml0KSA9IDFcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2xlbmd0aCBkID0gKGQgbHNyIGRlY29kZV9iaXRzKSBsYW5kIDBiMTExXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV91Y2hhciBkID0gdW5zYWZlX29mX2ludCAoZCBsYW5kIDB4RkZGRkZGKVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGUgbiB1ID0gKCg4IGxvciBuKSBsc2wgZGVjb2RlX2JpdHMpIGxvciAodG9faW50IHUpXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9pbnZhbGlkIG4gPSAobiBsc2wgZGVjb2RlX2JpdHMpIGxvciByZXBcblxubGV0IHV0Zl84X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+IDFcbnwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDNcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgdXRmXzE2X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2Zvcm1hdF9pbnQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJnbG9iYWxfZGF0YSIsIkFzc2VydF9mYWlsdXJlIiwiU3RkbGliIiwic3VjYyIsInUiLCJwcmVkIiwiaXNfdmFsaWQiLCJpIiwib2ZfaW50IiwiaXNfY2hhciIsIm9mX2NoYXIiLCJjIiwidG9fY2hhciIsInVuc2FmZV90b19jaGFyIiwiZXF1YWwiLCJjb21wYXJlIiwiaGFzaCIsInV0Zl9kZWNvZGVfaXNfdmFsaWQiLCJkIiwidXRmX2RlY29kZV9sZW5ndGgiLCJ1dGZfZGVjb2RlX3VjaGFyIiwidXRmX2RlY29kZSIsIm4iLCJ1dGZfZGVjb2RlX2ludmFsaWQiLCJjc3RfdWNoYXJfbWwiLCJ1dGZfOF9ieXRlX2xlbmd0aCIsInV0Zl8xNl9ieXRlX2xlbmd0aCIsIlN0ZGxpYl9VY2hhciJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLEtBQUFDO0FBQUFBLElDaUNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQ2dCO0FBQUEseUJBQ1g7QUFBQTtBQUFBLFlBQUFDLEtBQUFEO0FBQUFBLElBR0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFDZ0I7QUFBQSx5QkFDWDtBQUFBO0FBQUEsWUFBQUUsU0FBQUM7QUFBQUEsUUFBQSxJQUVVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQTBEO0FBQUEsWUFBQUMsT0FBQUQ7QUFBQUEsSUFDekQsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBLE9BeEJFO0FBQUEsZUFBakI7QUFBQSxJQXdCZ0Q7QUFBQTtBQUFBLFlBQUFFLFFBQUFMLEdBSW5ELHVCQUFPO0FBQUEsWUFBQU0sUUFBQUMsR0FDUCxTQUFXO0FBQUEsWUFBQUMsUUFBQVI7QUFBQUEsSUFFekIsYUFDQTtBQUFBO0FBQUE7QUFBQSxPQS9CNEI7QUFBQTtBQUFBLFNBQWtEO0FBQUEsSUE4QmhDLDhCQUM3QjtBQUFBO0FBQUEsWUFBQVMsZUFBQSxHRG5EbkI7QUFBQSxZQUFBQyxNQUFBO0FBQUEsT0FBQUMsVUFBQTtBQUFBLFlBQUFDLEtBQUE7QUFBQSxZQUFBQyxvQkFBQUMsR0N3RXFDLG9DQUFxQjtBQUFBLFlBQUFDLGtCQUFBRCxHQUN2QiwwQkFBOEI7QUFBQSxZQUFBRSxpQkFBQUYsR0FDL0Isb0JBQStCO0FBQUEsWUFBQUcsV0FBQUMsR0FBQWxCLEdBQ25DLHlCQUEwQztBQUFBLFlBQUFtQixtQkFBQUQsR0FDcEMsdUJBQTJCO0FBQUE7QUFBQSxJQUFBRSxlRDVFL0Q7QUFBQTtBQUFBO0FBQUEsWUFBQUMsa0JBQUFyQjtBQUFBQSxJQytFUyxVQUFTO0FBQUEsSUFDVCxhQUFlO0FBQUEsSUFDZixjQUFlO0FBQUEsSUFDZixlQUFlO0FBQUEsSUFDZjtBQUFBLEtBQ0Y7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQSxXRHBGbkI7QUFBQSxZQUFBc0IsbUJBQUF0QjtBQUFBQSxJQ3VGUyxVQUFTO0FBQUEsSUFDVCxlQUFlO0FBQUEsSUFDZjtBQUFBLEtBQ0Y7QUFBQSxJQURtQjtBQUFBLEdBQ1A7QUFBQTtBQUFBLElBQUF1QjtBQUFBQSxNRDFGbkIiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMTMzMCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9saXN0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgbGlzdHMuICopXG50eXBlICdhIHQgPSAnYSBsaXN0ID0gW10gfCAoOjopIG9mICdhICogJ2EgbGlzdFxuXG4oKiBMaXN0IG9wZXJhdGlvbnMgKilcblxubGV0IHJlYyBsZW5ndGhfYXV4IGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gbGVuXG4gIHwgXzo6bCAtPiBsZW5ndGhfYXV4IChsZW4gKyAxKSBsXG5cbmxldCBsZW5ndGggbCA9IGxlbmd0aF9hdXggMCBsXG5cbmxldCBjb25zIGEgbCA9IGE6OmxcblxubGV0IGhkID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcImhkXCJcbiAgfCBhOjpfIC0+IGFcblxubGV0IHRsID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcInRsXCJcbiAgfCBfOjpsIC0+IGxcblxubGV0IG50aCBsIG4gPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5udGhcIiBlbHNlXG4gIGxldCByZWMgbnRoX2F1eCBsIG4gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gZmFpbHdpdGggXCJudGhcIlxuICAgIHwgYTo6bCAtPiBpZiBuID0gMCB0aGVuIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IG50aF9vcHQgbCBuID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QubnRoXCIgZWxzZVxuICBsZXQgcmVjIG50aF9hdXggbCBuID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgbiA9IDAgdGhlbiBTb21lIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IGFwcGVuZCA9IChAKVxuXG5sZXQgcmVjIHJldl9hcHBlbmQgbDEgbDIgPVxuICBtYXRjaCBsMSB3aXRoXG4gICAgW10gLT4gbDJcbiAgfCBhIDo6IGwgLT4gcmV2X2FwcGVuZCBsIChhIDo6IGwyKVxuXG5sZXQgcmV2IGwgPSByZXZfYXBwZW5kIGwgW11cblxubGV0W0B0YWlsX21vZF9jb25zXSByZWMgaW5pdCBpIGxhc3QgZiA9XG4gIGlmIGkgPiBsYXN0IHRoZW4gW11cbiAgZWxzZSBpZiBpID0gbGFzdCB0aGVuIFtmIGldXG4gIGVsc2VcbiAgICBsZXQgcjEgPSBmIGkgaW5cbiAgICBsZXQgcjIgPSBmIChpKzEpIGluXG4gICAgcjEgOjogcjIgOjogaW5pdCAoaSsyKSBsYXN0IGZcblxubGV0IGluaXQgbGVuIGYgPVxuICBpZiBsZW4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LmluaXRcIiBlbHNlXG4gIGluaXQgMCAobGVuIC0gMSkgZlxuXG5sZXQgcmVjIGZsYXR0ZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgbDo6ciAtPiBsIEAgZmxhdHRlbiByXG5cbmxldCBjb25jYXQgPSBmbGF0dGVuXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IFthMV0gLT5cbiAgICAgIGxldCByMSA9IGYgYTEgaW5cbiAgICAgIFtyMV1cbiAgfCBhMTo6YTI6OmwgLT5cbiAgICAgIGxldCByMSA9IGYgYTEgaW5cbiAgICAgIGxldCByMiA9IGYgYTIgaW5cbiAgICAgIHIxOjpyMjo6bWFwIGYgbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBtYXBpIGkgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW11cbiAgfCBbYTFdIC0+XG4gICAgICBsZXQgcjEgPSBmIGkgYTEgaW5cbiAgICAgIFtyMV1cbiAgfCBhMTo6YTI6OmwgLT5cbiAgICAgIGxldCByMSA9IGYgaSBhMSBpblxuICAgICAgbGV0IHIyID0gZiAoaSsxKSBhMiBpblxuICAgICAgcjE6OnIyOjptYXBpIChpKzIpIGYgbFxuXG5sZXQgbWFwaSBmIGwgPSBtYXBpIDAgZiBsXG5cbmxldCByZXZfbWFwIGYgbCA9XG4gIGxldCByZWMgcm1hcF9mIGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdVxuICAgIHwgYTo6bCAtPiBybWFwX2YgKGYgYSA6OiBhY2N1KSBsXG4gIGluXG4gIHJtYXBfZiBbXSBsXG5cblxubGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+ICgpXG4gIHwgYTo6bCAtPiBmIGE7IGl0ZXIgZiBsXG5cbmxldCByZWMgaXRlcmkgaSBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoKVxuICB8IGE6OmwgLT4gZiBpIGE7IGl0ZXJpIChpICsgMSkgZiBsXG5cbmxldCBpdGVyaSBmIGwgPSBpdGVyaSAwIGYgbFxuXG5sZXQgcmVjIGZvbGRfbGVmdCBmIGFjY3UgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICAgIFtdIC0+IGFjY3VcbiAgfCBhOjpsIC0+IGZvbGRfbGVmdCBmIChmIGFjY3UgYSkgbFxuXG5sZXQgcmVjIGZvbGRfcmlnaHQgZiBsIGFjY3UgPVxuICBtYXRjaCBsIHdpdGhcbiAgICBbXSAtPiBhY2N1XG4gIHwgYTo6bCAtPiBmIGEgKGZvbGRfcmlnaHQgZiBsIGFjY3UpXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIG1hcDIgZiBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChbYTFdLCBbYjFdKSAtPlxuICAgICAgbGV0IHIxID0gZiBhMSBiMSBpblxuICAgICAgW3IxXVxuICB8IChhMTo6YTI6OmwxLCBiMTo6YjI6OmwyKSAtPlxuICAgICAgbGV0IHIxID0gZiBhMSBiMSBpblxuICAgICAgbGV0IHIyID0gZiBhMiBiMiBpblxuICAgICAgcjE6OnIyOjptYXAyIGYgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0Lm1hcDJcIlxuXG5sZXQgcmV2X21hcDIgZiBsMSBsMiA9XG4gIGxldCByZWMgcm1hcDJfZiBhY2N1IGwxIGwyID1cbiAgICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgfCAoW10sIFtdKSAtPiBhY2N1XG4gICAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHJtYXAyX2YgKGYgYTEgYTIgOjogYWNjdSkgbDEgbDJcbiAgICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmV2X21hcDJcIlxuICBpblxuICBybWFwMl9mIFtdIGwxIGwyXG5cblxubGV0IHJlYyBpdGVyMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+ICgpXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmIGExIGEyOyBpdGVyMiBmIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5pdGVyMlwiXG5cbmxldCByZWMgZm9sZF9sZWZ0MiBmIGFjY3UgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZm9sZF9sZWZ0MiBmIChmIGFjY3UgYTEgYTIpIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb2xkX2xlZnQyXCJcblxubGV0IHJlYyBmb2xkX3JpZ2h0MiBmIGwxIGwyIGFjY3UgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZiBhMSBhMiAoZm9sZF9yaWdodDIgZiBsMSBsMiBhY2N1KVxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9sZF9yaWdodDJcIlxuXG5sZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gdHJ1ZVxuICB8IGE6OmwgLT4gcCBhICYmIGZvcl9hbGwgcCBsXG5cbmxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBwIGEgfHwgZXhpc3RzIHAgbFxuXG5sZXQgcmVjIGZvcl9hbGwyIHAgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gdHJ1ZVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcCBhMSBhMiAmJiBmb3JfYWxsMiBwIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb3JfYWxsMlwiXG5cbmxldCByZWMgZXhpc3RzMiBwIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGZhbHNlXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBwIGExIGEyIHx8IGV4aXN0czIgcCBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZXhpc3RzMlwiXG5cbmxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtIHggbFxuXG5sZXQgcmVjIG1lbXEgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IGEgPT0geCB8fCBtZW1xIHggbFxuXG5sZXQgcmVjIGFzc29jIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGIgZWxzZSBhc3NvYyB4IGxcblxubGV0IHJlYyBhc3NvY19vcHQgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gTm9uZVxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIFNvbWUgYiBlbHNlIGFzc29jX29wdCB4IGxcblxubGV0IHJlYyBhc3NxIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGEgPT0geCB0aGVuIGIgZWxzZSBhc3NxIHggbFxuXG5sZXQgcmVjIGFzc3Ffb3B0IHggPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgfCAoYSxiKTo6bCAtPiBpZiBhID09IHggdGhlbiBTb21lIGIgZWxzZSBhc3NxX29wdCB4IGxcblxubGV0IHJlYyBtZW1fYXNzb2MgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gZmFsc2VcbiAgfCAoYSwgXykgOjogbCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtX2Fzc29jIHggbFxuXG5sZXQgcmVjIG1lbV9hc3NxIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IGZhbHNlXG4gIHwgKGEsIF8pIDo6IGwgLT4gYSA9PSB4IHx8IG1lbV9hc3NxIHggbFxuXG5sZXQgcmVjIHJlbW92ZV9hc3NvYyB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT5cbiAgICAgIGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGwgZWxzZSBwYWlyIDo6IHJlbW92ZV9hc3NvYyB4IGxcblxubGV0IHJlYyByZW1vdmVfYXNzcSB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT4gaWYgYSA9PSB4IHRoZW4gbCBlbHNlIHBhaXIgOjogcmVtb3ZlX2Fzc3EgeCBsXG5cbmxldCByZWMgZmluZCBwID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4geCBlbHNlIGZpbmQgcCBsXG5cbmxldCByZWMgZmluZF9vcHQgcCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kX29wdCBwIGxcblxubGV0IGZpbmRfaW5kZXggcCA9XG4gIGxldCByZWMgYXV4IGkgPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgcCBhIHRoZW4gU29tZSBpIGVsc2UgYXV4IChpKzEpIGwgaW5cbiAgYXV4IDBcblxubGV0IHJlYyBmaW5kX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBsIC0+XG4gICAgIGJlZ2luIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+IHJlc3VsdFxuICAgICAgIHwgTm9uZSAtPiBmaW5kX21hcCBmIGxcbiAgICAgZW5kXG5cbmxldCBmaW5kX21hcGkgZiA9XG4gIGxldCByZWMgYXV4IGkgPSBmdW5jdGlvblxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHJlc3VsdCAtPiByZXN1bHRcbiAgICAgICB8IE5vbmUgLT4gYXV4IChpKzEpIGxcbiAgICAgZW5kIGluXG4gIGF1eCAwXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIGZpbmRfYWxsIHAgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHggOjogZmluZF9hbGwgcCBsIGVsc2UgZmluZF9hbGwgcCBsXG5cbmxldCBmaWx0ZXIgPSBmaW5kX2FsbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaWx0ZXJpIHAgaSA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB4OjpsIC0+XG4gICAgICBsZXQgaScgPSBpICsgMSBpblxuICAgICAgaWYgcCBpIHggdGhlbiB4IDo6IGZpbHRlcmkgcCBpJyBsIGVsc2UgZmlsdGVyaSBwIGknIGxcblxubGV0IGZpbHRlcmkgcCBsID0gZmlsdGVyaSBwIDAgbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiBsIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBsXG4gICAgICB8IFNvbWUgdiAtPiB2IDo6IGZpbHRlcl9tYXAgZiBsXG5cbmxldFtAdGFpbF9tb2RfY29uc10gcmVjIGNvbmNhdF9tYXAgZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB4Ojp4cyAtPiBwcmVwZW5kX2NvbmNhdF9tYXAgKGYgeCkgZiB4c1xuYW5kW0B0YWlsX21vZF9jb25zXSBwcmVwZW5kX2NvbmNhdF9tYXAgeXMgZiB4cyA9XG4gIG1hdGNoIHlzIHdpdGhcbiAgfCBbXSAtPiBjb25jYXRfbWFwIGYgeHNcbiAgfCB5IDo6IHlzIC0+IHkgOjogcHJlcGVuZF9jb25jYXRfbWFwIHlzIGYgeHNcblxubGV0IGZvbGRfbGVmdF9tYXAgZiBhY2N1IGwgPVxuICBsZXQgcmVjIGF1eCBhY2N1IGxfYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2N1LCByZXYgbF9hY2N1XG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICAgbGV0IGFjY3UsIHggPSBmIGFjY3UgeCBpblxuICAgICAgICBhdXggYWNjdSAoeCA6OiBsX2FjY3UpIGwgaW5cbiAgYXV4IGFjY3UgW10gbFxuXG5sZXQgcGFydGl0aW9uIHAgbCA9XG4gIGxldCByZWMgcGFydCB5ZXMgbm8gPSBmdW5jdGlvblxuICB8IFtdIC0+IChyZXYgeWVzLCByZXYgbm8pXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHBhcnQgKHggOjogeWVzKSBubyBsIGVsc2UgcGFydCB5ZXMgKHggOjogbm8pIGwgaW5cbiAgcGFydCBbXSBbXSBsXG5cbmxldCBwYXJ0aXRpb25fbWFwIHAgbCA9XG4gIGxldCByZWMgcGFydCBsZWZ0IHJpZ2h0ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiAocmV2IGxlZnQsIHJldiByaWdodClcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggcCB4IHdpdGhcbiAgICAgICB8IEVpdGhlci5MZWZ0IHYgLT4gcGFydCAodiA6OiBsZWZ0KSByaWdodCBsXG4gICAgICAgfCBFaXRoZXIuUmlnaHQgdiAtPiBwYXJ0IGxlZnQgKHYgOjogcmlnaHQpIGxcbiAgICAgZW5kXG4gIGluXG4gIHBhcnQgW10gW10gbFxuXG5sZXQgcmVjIHNwbGl0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoW10sIFtdKVxuICB8ICh4LHkpOjpsIC0+XG4gICAgICBsZXQgKHJ4LCByeSkgPSBzcGxpdCBsIGluICh4OjpyeCwgeTo6cnkpXG5cbmxldCByZWMgY29tYmluZSBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gKGExLCBhMikgOjogY29tYmluZSBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuY29tYmluZVwiXG5cbigqKiBzb3J0aW5nICopXG5cbmxldCByZWMgbWVyZ2UgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgbDIgLT4gbDJcbiAgfCBsMSwgW10gLT4gbDFcbiAgfCBoMSA6OiB0MSwgaDIgOjogdDIgLT5cbiAgICAgIGlmIGNtcCBoMSBoMiA8PSAwXG4gICAgICB0aGVuIGgxIDo6IG1lcmdlIGNtcCB0MSBsMlxuICAgICAgZWxzZSBoMiA6OiBtZXJnZSBjbXAgbDEgdDJcblxuXG5sZXQgc3RhYmxlX3NvcnQgY21wIGwgPVxuICBsZXQgcmVjIHJldl9tZXJnZSBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyIDw9IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID0gaWYgY21wIHgxIHgyIDw9IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPD0gMCB0aGVuXG4gICAgICAgICAgICBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPD0gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA8PSAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHJldl9zb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHJldl9zb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2VfcmV2IHMxIHMyIFtdLCB0bClcbiAgYW5kIHJldl9zb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9IGlmIGNtcCB4MSB4MiA+IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPiAwIHRoZW5cbiAgICAgICAgICAgIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzID4gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA+IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSBzb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHNvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZSBzMSBzMiBbXSwgdGwpXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggbCBpblxuICBpZiBsZW4gPCAyIHRoZW4gbCBlbHNlIGZzdCAoc29ydCBsZW4gbClcblxuXG5sZXQgc29ydCA9IHN0YWJsZV9zb3J0XG5sZXQgZmFzdF9zb3J0ID0gc3RhYmxlX3NvcnRcblxuKCogTm90ZTogb24gYSB2ZXJ5IGxvbmcgbGlzdCAobGVuZ3RoIG92ZXIgYWJvdXQgMTAwMDAwKSwgaXQgdXNlZCB0byBiZVxuICAgZmFzdGVyIHRvIGNvbnZlcnQgdGhlIGxpc3QgdG8gYW4gYXJyYXksIHNvcnQgdGhlIGFycmF5LCBhbmQgY29udmVydFxuICAgYmFjaywgdHJ1bmNhdGluZyB0aGUgYXJyYXkgb2JqZWN0IGFmdGVyIHByZXBlbmRpbmcgZWFjaCB0aG91c2FuZFxuICAgZW50cmllcyB0byB0aGUgcmVzdWx0aW5nIGxpc3QuIEltcG9zc2libGUgbm93IHRoYXQgT2JqLnRydW5jYXRlIGhhc1xuICAgYmVlbiByZW1vdmVkLiAqKVxuXG4oKiogc29ydGluZyArIHJlbW92aW5nIGR1cGxpY2F0ZXMgKilcblxubGV0IHNvcnRfdW5pcSBjbXAgbCA9XG4gIGxldCByZWMgcmV2X21lcmdlIGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBsZXQgYyA9IGNtcCBoMSBoMiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJldl9tZXJnZSB0MSB0MiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgbGV0IGMgPSBjbXAgaDEgaDIgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiByZXZfbWVyZ2VfcmV2IHQxIHQyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSBpZiBjID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gcmV2X3NvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gcmV2X3NvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZV9yZXYgczEgczIgW10sIHRsKVxuICBhbmQgcmV2X3NvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSBzb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2UgczEgczIgW10sIHRsKVxuICBpblxuICBsZXQgbGVuID0gbGVuZ3RoIGwgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIGwgZWxzZSBmc3QgKHNvcnQgbGVuIGwpXG5cblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aHMgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF8gLT4gLTFcbiAgfCBfLCBbXSAtPiAxXG4gIHwgXyA6OiBsMSwgXyA6OiBsMiAtPiBjb21wYXJlX2xlbmd0aHMgbDEgbDJcblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aF93aXRoIGwgbiA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+XG4gICAgaWYgbiA9IDAgdGhlbiAwIGVsc2VcbiAgICAgIGlmIG4gPiAwIHRoZW4gLTEgZWxzZSAxXG4gIHwgXyA6OiBsIC0+XG4gICAgaWYgbiA8PSAwIHRoZW4gMSBlbHNlXG4gICAgICBjb21wYXJlX2xlbmd0aF93aXRoIGwgKG4tMSlcblxubGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiB0cnVlXG4gIHwgXyA6OiBfIC0+IGZhbHNlXG5cbigqKiB7MSBDb21wYXJpc29ufSAqKVxuXG4oKiBOb3RlOiB3ZSBhcmUgKm5vdCogc2hvcnRjdXR0aW5nIHRoZSBsaXN0IGJ5IHVzaW5nXG4gICBbTGlzdC5jb21wYXJlX2xlbmd0aHNdIGZpcnN0OyB0aGlzIG1heSBiZSBzbG93ZXIgb24gbG9uZyBsaXN0c1xuICAgaW1tZWRpYXRlbHkgc3RhcnQgd2l0aCBkaXN0aW5jdCBlbGVtZW50cy4gSXQgaXMgYWxzbyBpbmNvcnJlY3QgZm9yXG4gICBbY29tcGFyZV0gYmVsb3csIGFuZCBpdCBpcyBiZXR0ZXIgKHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlzZSkgdG9cbiAgIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBmb3IgYm90aCBmdW5jdGlvbnMuICopXG5sZXQgcmVjIGVxdWFsIGVxIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gdHJ1ZVxuICB8IFtdLCBfOjpfIHwgXzo6XywgW10gLT4gZmFsc2VcbiAgfCBhMTo6bDEsIGEyOjpsMiAtPiBlcSBhMSBhMiAmJiBlcXVhbCBlcSBsMSBsMlxuXG5sZXQgcmVjIGNvbXBhcmUgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfOjpfIC0+IC0xXG4gIHwgXzo6XywgW10gLT4gMVxuICB8IGExOjpsMSwgYTI6OmwyIC0+XG4gICAgbGV0IGMgPSBjbXAgYTEgYTIgaW5cbiAgICBpZiBjIDw+IDAgdGhlbiBjXG4gICAgZWxzZSBjb21wYXJlIGNtcCBsMSBsMlxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGwgPVxuICBsZXQgcmVjIGF1eCBsICgpID0gbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBTZXEuTmlsXG4gICAgfCB4IDo6IHRhaWwgLT4gU2VxLkNvbnMgKHgsIGF1eCB0YWlsKVxuICBpblxuICBhdXggbFxuXG5sZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBvZl9zZXEgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBTZXEuTmlsIC0+IFtdXG4gIHwgU2VxLkNvbnMgKHgxLCBzZXEpIC0+XG4gICAgICBiZWdpbiBtYXRjaCBzZXEgKCkgd2l0aFxuICAgICAgfCBTZXEuTmlsIC0+IFt4MV1cbiAgICAgIHwgU2VxLkNvbnMgKHgyLCBzZXEpIC0+IHgxIDo6IHgyIDo6IG9mX3NlcSBzZXFcbiAgICAgIGVuZFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NvbXBhcmUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsMyIsImEyIiwiU3RkbGliIiwibGVuZ3RoIiwibCIsImxlbiIsInBhcmFtIiwiY29ucyIsImEiLCJoZCIsInRsIiwiY3N0X0xpc3RfbnRoIiwibnRoIiwibiIsIm50aF9vcHQiLCJhcHBlbmQiLCJyZXZfYXBwZW5kIiwibDEiLCJsMiIsInJldiIsImluaXQiLCJsYXN0IiwiaSIsInIxIiwicjIiLCJibG9jayIsImRzdCIsIm9mZnNldCIsImZsYXR0ZW4iLCJyIiwibWFwIiwibWF0Y2giLCJtYXBpIiwicmV2X21hcCIsImFjY3UiLCJpdGVyIiwiaXRlcmkiLCJmb2xkX2xlZnQiLCJmb2xkX3JpZ2h0IiwibWFwMiIsImNzdF9MaXN0X21hcDIiLCJiMiIsImIxIiwicmV2X21hcDIiLCJpdGVyMiIsImZvbGRfbGVmdDIiLCJmb2xkX3JpZ2h0MiIsImZvcl9hbGwiLCJwIiwiZXhpc3RzIiwiZm9yX2FsbDIiLCJleGlzdHMyIiwibWVtIiwieCIsIm1lbXEiLCJhc3NvYyIsImIiLCJhc3NvY19vcHQiLCJhc3NxIiwiYXNzcV9vcHQiLCJtZW1fYXNzb2MiLCJtZW1fYXNzcSIsInJlbW92ZV9hc3NvYyIsInBhaXIiLCJyZW1vdmVfYXNzcSIsImZpbmQiLCJmaW5kX29wdCIsImZpbmRfaW5kZXgiLCJmaW5kX21hcCIsInJlc3VsdCIsImZpbmRfbWFwaSIsImZpbmRfYWxsIiwiZmlsdGVyaSIsImZpbHRlcl9tYXAiLCJ2IiwiY29uY2F0X21hcCIsInhzIiwieXMiLCJ5IiwiZm9sZF9sZWZ0X21hcCIsImxfYWNjdSIsInBhcnRpdGlvbiIsInllcyIsIm5vIiwicGFydGl0aW9uX21hcCIsImxlZnQiLCJyaWdodCIsInNwbGl0IiwicnkiLCJyeCIsImNvbWJpbmUiLCJtZXJnZSIsImNtcCIsInQyIiwiaDIiLCJ0MSIsImgxIiwic3RhYmxlX3NvcnQiLCJzb3J0IiwieDIiLCJ4MSIsInMiLCJ4MyIsIm4xIiwibjIiLCJzMSIsInMyIiwicmV2X3NvcnQiLCJzb3J0X3VuaXEiLCJjIiwiY29tcGFyZV9sZW5ndGhzIiwiY29tcGFyZV9sZW5ndGhfd2l0aCIsImlzX2VtcHR5IiwiZXF1YWwiLCJlcSIsImNvbXBhcmUiLCJ0b19zZXEiLCJhdXgiLCJ0YWlsIiwib2Zfc2VxIiwic2VxIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdB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LEtBQWY7QUFBQTtBQUFBO0FBQUEsR0FDc0I7QUFBQSxZQUFBTyxPQUFBaEg7QUFBQUEsYUFBQWlILElBQUFqSCxHQUFBRTtBQUFBQSxLQUtMLFFBQ1Q7QUFBQSxTQUFBZ0gsT0FEUyxNQUFBakUsSUFBQTtBQUFBLEtBRW1CLDBCQUFSLHNCQUFRO0FBQUEsSUFBQztBQUFBLElBRXZDO0FBQUEsR0FBSztBQUFBLFlBQUFrRSxPQUFBQztBQUFBQSxRQUFBekYsUUFHQztBQUFBLElBQU0sWUFDQztBQUFBLFFBQUF5RixRQURELFVBQUFwQixLQUFBLFVBQUFyRSxVQUdJO0FBQUEsSUFBTSxjQUNMO0FBQUE7QUFBQSxLQUFBeUYsUUFESztBQUFBLEtBQUFyQixLQUFBO0FBQUEsS0FBQTFFLFFBRU07QUFBQSxLQUFBQyxNQUFZO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUE2RixRQUFBO0FBQUE7QUFBQSxTQUFBekYsVUFMbEM7QUFBQSxLQUFNO0FBQUE7QUFBQSxPQUFBeUYsUUFBQTtBQUFBLE9BQUFwQixPQUFBO0FBQUEsT0FBQXJFLFVBR0k7QUFBQSxNQUFNO0FBQUEsV0FBQXlGLFFBQUEsWUFBQXJCLE9BQUEsWUFBQXpFLFFBRU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQURYO0FBQUE7QUFBQTtBQUFBLE1BSEo7QUFBQSxLQUlxQztBQUFBO0FBQUEsR0FDM0M7QUFBQSxHRHprQlQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxMjY3NiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbnQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGludFxuXG5sZXQgemVybyA9IDBcbmxldCBvbmUgPSAxXG5sZXQgbWludXNfb25lID0gLTFcbmV4dGVybmFsIG5lZyA6IGludCAtPiBpbnQgPSBcIiVuZWdpbnRcIlxuZXh0ZXJuYWwgYWRkIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgc3ViIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgbXVsIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtdWxpbnRcIlxuZXh0ZXJuYWwgZGl2IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgcmVtIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtb2RpbnRcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5sZXQgYWJzIHggPSBpZiB4ID49IDAgdGhlbiB4IGVsc2UgLXhcbmxldCBtYXhfaW50ID0gKC0xKSBsc3IgMVxubGV0IG1pbl9pbnQgPSBtYXhfaW50ICsgMVxuZXh0ZXJuYWwgbG9nYW5kIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsIGxvZ3hvciA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIleG9yaW50XCJcbmxldCBsb2dub3QgeCA9IGxvZ3hvciB4ICgtMSlcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzbGludFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYXNyaW50XCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5sZXQgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuXG4oKlxuZXh0ZXJuYWwgaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfaW50X29mX3N0cmluZ1wiXG5sZXQgb2Zfc3RyaW5nIHMgPSB0cnkgU29tZSAoaW50X29mX3N0cmluZyBzKSB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG4qKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5sZXQgdG9fc3RyaW5nIHggPSBmb3JtYXRfaW50IFwiJWRcIiB4XG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfaGFzaCIsImFicyIsIngiLCJsb2dub3QiLCJlcXVhbCIsImNvbXBhcmUiLCJtaW4iLCJ5IiwibWF4IiwidG9fc3RyaW5nIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUEseUJBQUFDLFlBQUE7QUFBQSxZQUFBQyxJQUFBQyxHQzRCWSwyQkFBd0I7QUFBQSxZQUFBQyxPQUFBRCxHQU1yQixjQUFhO0FBQUEsWUFBQUUsTUFBQSxNRGxDNUI7QUFBQSxPQUFBQyxVQUFBO0FBQUEsWUFBQUMsSUFBQUosR0FBQUssR0N3Q2tCLHFCQUF1QjtBQUFBLFlBQUFDLElBQUFOLEdBQUFLLEdBQ3ZCLHFCQUF1QjtBQUFBLFlBQUFFLFVBQUFQLEdBVU47QUFBQSxZQUFBUSxZQUFBQyxNQUFBVCxHQUlWLGtDQUErQjtBQUFBLFlBQUFVLEtBQUFWLEdBQzNDLCtCQUE0QjtBQUFBLEdEeER6QyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjEyNzE0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2J5dGVzLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBCeXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMgKilcblxuKCogV0FSTklORzogU29tZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBzdHJpbmcubWwuXG4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIFwiZHVwbGljYXRlZFwiIGNvbW1lbnQgYWJvdmUgdGhlaXIgZGVmaW5pdGlvbi5cbiopXG5cbmV4dGVybmFsIGxlbmd0aCA6IGJ5dGVzIC0+IGludCA9IFwiJWJ5dGVzX2xlbmd0aFwiXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc19zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCB1bnNhZmVfZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfZmlsbCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gY2hhciAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9maWxsX2J5dGVzXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuZXh0ZXJuYWwgdW5zYWZlX29mX3N0cmluZyA6IHN0cmluZyAtPiBieXRlcyA9IFwiJWJ5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHVuc2FmZV9ibGl0IDogYnl0ZXMgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB1bnNhZmVfYmxpdF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5sZXQgbWFrZSBuIGMgPVxuICBsZXQgcyA9IGNyZWF0ZSBuIGluXG4gIHVuc2FmZV9maWxsIHMgMCBuIGM7XG4gIHNcblxubGV0IGluaXQgbiBmID1cbiAgbGV0IHMgPSBjcmVhdGUgbiBpblxuICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHMgaSAoZiBpKVxuICBkb25lO1xuICBzXG5cbmxldCBlbXB0eSA9IGNyZWF0ZSAwXG5cbmxldCBjb3B5IHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gIHVuc2FmZV9ibGl0IHMgMCByIDAgbGVuO1xuICByXG5cbmxldCB0b19zdHJpbmcgYiA9IHVuc2FmZV90b19zdHJpbmcgKGNvcHkgYilcbmxldCBvZl9zdHJpbmcgcyA9IGNvcHkgKHVuc2FmZV9vZl9zdHJpbmcgcylcblxubGV0IHN1YiBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5zdWIgLyBCeXRlcy5zdWJcIlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgcyBvZnMgciAwIGxlbjtcbiAgICByXG4gIGVuZFxuXG5sZXQgc3ViX3N0cmluZyBiIG9mcyBsZW4gPSB1bnNhZmVfdG9fc3RyaW5nIChzdWIgYiBvZnMgbGVuKVxuXG4oKiBhZGRpdGlvbiB3aXRoIGFuIG92ZXJmbG93IGNoZWNrICopXG5sZXQgKCsrKSBhIGIgPVxuICBsZXQgYyA9IGEgKyBiIGluXG4gIG1hdGNoIGEgPCAwLCBiIDwgMCwgYyA8IDAgd2l0aFxuICB8IHRydWUgLCB0cnVlICwgZmFsc2VcbiAgfCBmYWxzZSwgZmFsc2UsIHRydWUgIC0+IGludmFsaWRfYXJnIFwiQnl0ZXMuZXh0ZW5kXCIgKCogb3ZlcmZsb3cgKilcbiAgfCBfIC0+IGNcblxubGV0IGV4dGVuZCBzIGxlZnQgcmlnaHQgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgKysgbGVmdCArKyByaWdodCBpblxuICBsZXQgciA9IGNyZWF0ZSBsZW4gaW5cbiAgbGV0IChzcmNvZmYsIGRzdG9mZikgPSBpZiBsZWZ0IDwgMCB0aGVuIC1sZWZ0LCAwIGVsc2UgMCwgbGVmdCBpblxuICBsZXQgY3B5bGVuID0gSW50Lm1pbiAobGVuZ3RoIHMgLSBzcmNvZmYpIChsZW4gLSBkc3RvZmYpIGluXG4gIGlmIGNweWxlbiA+IDAgdGhlbiB1bnNhZmVfYmxpdCBzIHNyY29mZiByIGRzdG9mZiBjcHlsZW47XG4gIHJcblxubGV0IGZpbGwgcyBvZnMgbGVuIGMgPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5maWxsIC8gQnl0ZXMuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgcyBvZnMgbGVuIGNcblxubGV0IGJsaXQgczEgb2ZzMSBzMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBzMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggczIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ5dGVzLmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IHMxIG9mczEgczIgb2ZzMiBsZW5cblxubGV0IGJsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBzdHJpbmdfbGVuZ3RoIHMxIC0gbGVuXG4gICAgICAgICAgICAgfHwgb2ZzMiA8IDAgfHwgb2ZzMiA+IGxlbmd0aCBzMiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmJsaXQgLyBCeXRlcy5ibGl0X3N0cmluZ1wiXG4gIGVsc2UgdW5zYWZlX2JsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpdGVyIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZih1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGl0ZXJpIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgZW5zdXJlX2dlICh4OmludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIkJ5dGVzLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZW1wdHlcbiAgfCBsIC0+IGxldCBzZXBsZW4gPSBsZW5ndGggc2VwIGluXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoY3JlYXRlIChzdW1fbGVuZ3RocyAwIHNlcGxlbiBsKSlcbiAgICAgICAgICAgIDAgc2VwIHNlcGxlbiBsXG5cbmxldCBjYXQgczEgczIgPVxuICBsZXQgbDEgPSBsZW5ndGggczEgaW5cbiAgbGV0IGwyID0gbGVuZ3RoIHMyIGluXG4gIGxldCByID0gY3JlYXRlIChsMSArIGwyKSBpblxuICB1bnNhZmVfYmxpdCBzMSAwIHIgMCBsMTtcbiAgdW5zYWZlX2JsaXQgczIgMCByIGwxIGwyO1xuICByXG5cblxuZXh0ZXJuYWwgY2hhcl9jb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGNoYXJfY2hyOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IGxlbiAmJiBpc19zcGFjZSAodW5zYWZlX2dldCBzICFpKSBkb1xuICAgIGluY3IgaVxuICBkb25lO1xuICBsZXQgaiA9IHJlZiAobGVuIC0gMSkgaW5cbiAgd2hpbGUgIWogPj0gIWkgJiYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAhaikgZG9cbiAgICBkZWNyIGpcbiAgZG9uZTtcbiAgaWYgIWogPj0gIWkgdGhlblxuICAgIHN1YiBzICFpICghaiAtICFpICsgMSlcbiAgZWxzZVxuICAgIGVtcHR5XG5cbmxldCB1bnNhZmVfZXNjYXBlIHMgPVxuICAoKiBXZSBwZXJmb3JtIHR3byBwYXNzZXMgb24gdGhlIGlucHV0IHNlcXVlbmNlLCBvbmUgdG8gY29tcHV0ZSB0aGVcbiAgICAgcmVzdWx0IHNpemUgYW5kIG9uZSB0byB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgICMxMTUwOCwgIzExNTA5OiBUaGlzIGxvZ2ljIHdvdWxkIGJlIGluY29ycmVjdCBpbiBwcmVzZW5jZSBvZlxuICAgICBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiB0byB0aGUgaW5wdXQsIG1ha2luZyB0aGUgdXNlIG9mXG4gICAgIFt1bnNhZmVfc2V0XSBiZWxvdyBtZW1vcnktdW5zYWZlLlxuXG4gICAgIFByZWNvbmRpdGlvbjogVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCBvbjpcbiAgICAgLSBhbiBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZVxuICAgICAtIGEgdW5pcXVlbHktb3duZWQgYnl0ZSBzZXF1ZW5jZSAodGhlIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcClcblxuICAgICBJbiBlaXRoZXIgY2FzZSB3ZSByZXR1cm4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlLlxuICAqKVxuICBsZXQgbiA9IHJlZiAwIGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICBuIDo9ICFuICtcbiAgICAgIChtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgfCAnXFxcIicgfCAnXFxcXCcgfCAnXFxuJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxiJyAtPiAyXG4gICAgICAgfCAnICcgLi4gJ34nIC0+IDFcbiAgICAgICB8IF8gLT4gNClcbiAgZG9uZTtcbiAgaWYgIW4gPSBsZW5ndGggcyB0aGVuIHNcbiAgZWxzZSBiZWdpblxuICAgIGxldCBzJyA9IGNyZWF0ZSAhbiBpblxuICAgIG4gOj0gMDtcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgICBiZWdpbiBtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICB8ICgnXFxcIicgfCAnXFxcXCcpIGFzIGMgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICduJ1xuICAgICAgfCAnXFx0JyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ3QnXG4gICAgICB8ICdcXHInIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAncidcbiAgICAgIHwgJ1xcYicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICdiJ1xuICAgICAgfCAoJyAnIC4uICd+JykgYXMgYyAtPiB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgYyAtPlxuICAgICAgICAgIGxldCBhID0gY2hhcl9jb2RlIGMgaW5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSAvIDEwMCkpO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyAoYSAvIDEwKSBtb2QgMTApKTtcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSBtb2QgMTApKTtcbiAgICAgIGVuZDtcbiAgICAgIGluY3IgblxuICAgIGRvbmU7XG4gICAgcydcbiAgZW5kXG5cbmxldCBlc2NhcGVkIGIgPVxuICBsZXQgYiA9IGNvcHkgYiBpblxuICAoKiBXZSBjb3B5IG91ciBpbnB1dCB0byBvYnRhaW4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlIFtiXVxuICAgICB0byBzYXRpc2Z5IFt1bnNhZmVfZXNjYXBlXSdzIHByZWNvbmRpdGlvbiAqKVxuICB1bnNhZmVfZXNjYXBlIGJcblxubGV0IG1hcCBmIHMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGwgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBzIGkpKSBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCBtYXBpIGYgcyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgbCA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgcyBpKSkgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZTtcbiAgIXJcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IHMgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgcyBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgdXBwZXJjYXNlX2FzY2lpIHMgPSBtYXAgQ2hhci51cHBlcmNhc2VfYXNjaWkgc1xubGV0IGxvd2VyY2FzZV9hc2NpaSBzID0gbWFwIENoYXIubG93ZXJjYXNlX2FzY2lpIHNcblxubGV0IGFwcGx5MSBmIHMgPVxuICBpZiBsZW5ndGggcyA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNvcHkgcyBpblxuICAgIHVuc2FmZV9zZXQgciAwIChmKHVuc2FmZV9nZXQgcyAwKSk7XG4gICAgclxuICBlbmRcblxubGV0IGNhcGl0YWxpemVfYXNjaWkgcyA9IGFwcGx5MSBDaGFyLnVwcGVyY2FzZV9hc2NpaSBzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPSBhcHBseTEgQ2hhci5sb3dlcmNhc2VfYXNjaWkgc1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHN0YXJ0c193aXRoIH5wcmVmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fcHJlID0gbGVuZ3RoIHByZWZpeCBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3ByZSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyBpIDw+IHVuc2FmZV9nZXQgcHJlZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gbGVuX3MgPj0gbGVuX3ByZSAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGVuZHNfd2l0aCB+c3VmZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3N1ZiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgbGV0IGRpZmYgPSBsZW5fcyAtIGxlbl9zdWYgaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9zdWYgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgKGRpZmYgKyBpKSA8PiB1bnNhZmVfZ2V0IHN1ZmZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGRpZmYgPj0gMCAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWMgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgaW5kZXhfcmVjIHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIGluZGV4X3JlY19vcHQgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgaW5kZXhfcmVjX29wdCBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9vcHQgcyBjID0gaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgaW5kZXhfcmVjIHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMuaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgaW5kZXhfcmVjX29wdCBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4IHMgYyA9IHJpbmRleF9yZWMgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb20gLyBCeXRlcy5yaW5kZXhfZnJvbVwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjIHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfb3B0IHMgYyA9IHJpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5yaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgcmluZGV4X3JlY19vcHQgcyBpIGNcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5jb250YWluc19mcm9tIC8gQnl0ZXMuY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChpbmRleF9yZWMgcyBsIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zIHMgYyA9IGNvbnRhaW5zX2Zyb20gcyAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG50eXBlIHQgPSBieXRlc1xuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5leHRlcm5hbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2J5dGVzX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpID0gbGVuZ3RoIHMgdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBnZXQgcyBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBzID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA9IGxlbmd0aCBzIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gZ2V0IHMgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBuID0gcmVmIDAgaW5cbiAgbGV0IGJ1ZiA9IHJlZiAobWFrZSAyNTYgJ1xcMDAwJykgaW5cbiAgbGV0IHJlc2l6ZSAoKSA9XG4gICAgKCogcmVzaXplICopXG4gICAgbGV0IG5ld19sZW4gPSBJbnQubWluICgyICogbGVuZ3RoICFidWYpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgIGlmIGxlbmd0aCAhYnVmID0gbmV3X2xlbiB0aGVuIGZhaWx3aXRoIFwiQnl0ZXMub2Zfc2VxOiBjYW5ub3QgZ3JvdyBieXRlc1wiO1xuICAgIGxldCBuZXdfYnVmID0gbWFrZSBuZXdfbGVuICdcXDAwMCcgaW5cbiAgICBibGl0ICFidWYgMCBuZXdfYnVmIDAgIW47XG4gICAgYnVmIDo9IG5ld19idWZcbiAgaW5cbiAgU2VxLml0ZXJcbiAgICAoZnVuIGMgLT5cbiAgICAgICBpZiAhbiA9IGxlbmd0aCAhYnVmIHRoZW4gcmVzaXplKCk7XG4gICAgICAgc2V0ICFidWYgIW4gYztcbiAgICAgICBpbmNyIG4pXG4gICAgaTtcbiAgc3ViICFidWYgMCAhblxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nL2RlY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG4oKiBUaGUgZ2V0XyBmdW5jdGlvbnMgYXJlIGFsbCBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxuXG5leHRlcm5hbCB1bnNhZmVfZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNnVcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbmV4dGVybmFsIGdldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNlwiXG5leHRlcm5hbCBnZXRfaW50MzJfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgPSBcIiVjYW1sX2J5dGVzX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfYnl0ZXNfZ2V0NjRcIlxuXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVjYW1sX2J5dGVzX3NldDE2dVwiXG5leHRlcm5hbCBzZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIHNldF9pbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZcIlxuZXh0ZXJuYWwgc2V0X2ludDMyX25lIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMyXCJcbmV4dGVybmFsIHNldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NFwiXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5sZXQgdW5zYWZlX2dldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiBzd2FwMTYgKHVuc2FmZV9nZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSB1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IHVuc2FmZV9nZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX2dldF91aW50MTZfbmUgYiBpXG4gIGVsc2Ugc3dhcDE2ICh1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGkpXG5cbmxldCBnZXRfaW50OCBiIGkgPVxuICAoKGdldF91aW50OCBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gOCkpIGFzciAoU3lzLmludF9zaXplIC0gOClcblxubGV0IGdldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgKGdldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIGdldF91aW50MTZfbmUgYiBpXG5cbmxldCBnZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiAoZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IGdldF9pbnQxNl9uZSBiIGkgPVxuICAoKGdldF91aW50MTZfbmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9sZSBiIGkgPVxuICAoKGdldF91aW50MTZfbGUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9iZSBiIGkgPVxuICAoKGdldF91aW50MTZfYmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQzMl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiAoZ2V0X2ludDMyX25lIGIgaSlcbiAgZWxzZSBnZXRfaW50MzJfbmUgYiBpXG5cbmxldCBnZXRfaW50MzJfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIChnZXRfaW50MzJfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQzMl9uZSBiIGlcblxubGV0IGdldF9pbnQ2NF9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCAoZ2V0X2ludDY0X25lIGIgaSlcbiAgZWxzZSBnZXRfaW50NjRfbmUgYiBpXG5cbmxldCBnZXRfaW50NjRfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IChnZXRfaW50NjRfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQ2NF9uZSBiIGlcblxubGV0IHVuc2FmZV9zZXRfdWludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSB4XG5cbmxldCB1bnNhZmVfc2V0X3VpbnQxNl9iZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIHggZWxzZVxuICB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuXG5sZXQgc2V0X2ludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSBzZXRfaW50MTZfbmUgYiBpIHhcblxubGV0IHNldF9pbnQxNl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHNldF9pbnQxNl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDMyX2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MzJfbmUgYiBpIChzd2FwMzIgeClcbiAgZWxzZSBzZXRfaW50MzJfbmUgYiBpIHhcblxubGV0IHNldF9pbnQzMl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQzMl9uZSBiIGkgKHN3YXAzMiB4KVxuICBlbHNlIHNldF9pbnQzMl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDY0X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50NjRfbmUgYiBpIChzd2FwNjQgeClcbiAgZWxzZSBzZXRfaW50NjRfbmUgYiBpIHhcblxubGV0IHNldF9pbnQ2NF9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQ2NF9uZSBiIGkgKHN3YXA2NCB4KVxuICBlbHNlIHNldF9pbnQ2NF9uZSBiIGkgeFxuXG5sZXQgc2V0X3VpbnQ4ID0gc2V0X2ludDhcbmxldCBzZXRfdWludDE2X25lID0gc2V0X2ludDE2X25lXG5sZXQgc2V0X3VpbnQxNl9iZSA9IHNldF9pbnQxNl9iZVxubGV0IHNldF91aW50MTZfbGUgPSBzZXRfaW50MTZfbGVcblxuKCogVVRGIGNvZGVjcyBhbmQgdmFsaWRhdGlvbnMgKilcblxubGV0IGRlY19pbnZhbGlkID0gVWNoYXIudXRmX2RlY29kZV9pbnZhbGlkXG5sZXRbQGlubGluZV0gZGVjX3JldCBuIHUgPSBVY2hhci51dGZfZGVjb2RlIG4gKFVjaGFyLnVuc2FmZV9vZl9pbnQgdSlcblxuKCogSW4gY2FzZSBvZiBkZWNvZGluZyBlcnJvciwgaWYgd2UgZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIHdlXG4gICBjb25zdW1lIHRoZSBieXRlLCBvdGhlcndpc2Ugd2UgY29uc3VtZSB0aGUgW25dIGJ5dGVzIHByZWNlZGluZ1xuICAgdGhlIGVycm9yaW5nIGJ5dGUuXG5cbiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGNsaWVudCB1c2VzIGRlY29kZXMgd2l0aG91dCBjYXJpbmcgYWJvdXRcbiAgIHZhbGlkaXR5IGl0IG5hdHVyYWxseSByZXBsYWNlIGJvZ3VzIGRhdGEgd2l0aCBVY2hhci5yZXAgYWNjb3JkaW5nXG4gICB0byB0aGUgV0hBVFdHIEVuY29kaW5nIHN0YW5kYXJkLiBPdGhlciBzY2hlbWVzIGFyZSBwb3NzaWJsZSBieVxuICAgY29uc3VsdGluZyB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgb24gaW52YWxpZCBkZWNvZGVzLiBGb3IgbW9yZVxuICAgZGV0YWlscyBzZWUgaHR0cHM6Ly9oc2l2b25lbi5maS9icm9rZW4tdXRmLTgvXG5cbiAgIEZvciB0aGlzIHJlYXNvbiBpbiBbZ2V0X3V0Zl84X3VjaGFyXSB3ZSBncmFkdWFsbHkgY2hlY2sgdGhlIG5leHRcbiAgIGJ5dGUgaXMgYXZhaWxhYmxlIHJhdGhlciB0aGFuIGRvaW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgZmlyc3QgYnl0ZS4gQ29udHJhc3Qgd2l0aCBbaXNfdmFsaWRfdXRmXzhdLiAqKVxuXG4oKiBVVEYtOCAqKVxuXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194QkYgYiA9IGIgbHNyIDYgPD4gMGIxMFxubGV0W0BpbmxpbmVdIG5vdF9pbl94QTBfdG9feEJGIGIgPSBiIGxzciA1IDw+IDBiMTAxXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194OUYgYiA9IGIgbHNyIDUgPD4gMGIxMDBcbmxldFtAaW5saW5lXSBub3RfaW5feDkwX3RvX3hCRiBiID0gYiA8IDB4OTAgfHwgMHhCRiA8IGJcbmxldFtAaW5saW5lXSBub3RfaW5feDgwX3RvX3g4RiBiID0gYiBsc3IgNCA8PiAweDhcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzIgYjAgYjEgPVxuICAoKGIwIGxhbmQgMHgxRikgbHNsIDYpIGxvclxuICAoKGIxIGxhbmQgMHgzRikpXG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl8zIGIwIGIxIGIyID1cbiAgKChiMCBsYW5kIDB4MEYpIGxzbCAxMikgbG9yXG4gICgoYjEgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSlcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMgPVxuICAoKGIwIGxhbmQgMHgwNykgbHNsIDE4KSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpIGxzbCAxMikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjMgbGFuZCAweDNGKSlcblxubGV0IGdldF91dGZfOF91Y2hhciBiIGkgPVxuICBsZXQgYjAgPSBnZXRfdWludDggYiBpIGluICgqIHJhaXNlcyBpZiBbaV0gaXMgbm90IGEgdmFsaWQgaW5kZXguICopXG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQ4IGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgbWF0Y2ggQ2hhci51bnNhZmVfY2hyIGIwIHdpdGggKCogU2VlIFRoZSBVbmljb2RlIFN0YW5kYXJkLCBUYWJsZSAzLjcgKilcbiAgfCAnXFx4MDAnIC4uICdcXHg3RicgLT4gZGVjX3JldCAxIGIwXG4gIHwgJ1xceEMyJyAuLiAnXFx4REYnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGRlY19yZXQgMiAodXRmXzhfdWNoYXJfMiBiMCBiMSlcbiAgfCAnXFx4RTAnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3hBMF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhFMScgLi4gJ1xceEVDJyB8ICdcXHhFRScgLi4gJ1xceEVGJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RUQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OUYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhGMCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDkwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjEnIC4uICdcXHhGMycgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OEYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgXyAtPiBkZWNfaW52YWxpZCAxXG5cbmxldCBzZXRfdXRmXzhfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50OCBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIG1hdGNoIFVjaGFyLnRvX2ludCB1IHdpdGhcbiAgfCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+XG4gICAgICBzZXRfdWludDggYiBpIHU7XG4gICAgICAxXG4gIHwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICAoc2V0X3VpbnQ4IGIgaSAoMHhDMCBsb3IgKHUgbHNyIDYpKTtcbiAgICAgICBzZXQgYiBsYXN0ICgweDgwIGxvciAodSBsYW5kIDB4M0YpKTtcbiAgICAgICAyKVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RTAgbG9yICh1IGxzciAxMikpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgMylcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RjAgbG9yICh1IGxzciAxOCkpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgMTIpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIChpICsgMikgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgNClcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgaXNfdmFsaWRfdXRmXzggYiA9XG4gIGxldCByZWMgbG9vcCBtYXggYiBpID1cbiAgICBpZiBpID4gbWF4IHRoZW4gdHJ1ZSBlbHNlXG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDggaW5cbiAgICBtYXRjaCBDaGFyLnVuc2FmZV9jaHIgKGdldCBiIGkpIHdpdGhcbiAgICB8ICdcXHgwMCcgLi4gJ1xceDdGJyAtPiBsb29wIG1heCBiIChpICsgMSlcbiAgICB8ICdcXHhDMicgLi4gJ1xceERGJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFMCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94QTBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEUxJyAuLiAnXFx4RUMnIHwgJ1xceEVFJyAuLiAnXFx4RUYnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFRCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feDlGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYwJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g5MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYxJyAuLiAnXFx4RjMnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RjQnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3g4RiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkJFICopXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2YmVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfYmUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmJlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkxFICopXG5cbmxldCBnZXRfdXRmXzE2bGVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2bGVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfbGUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmxpdF9ieXRlcyIsImNhbWxfYnN3YXAxNiIsImNhbWxfYnl0ZXNfZ2V0IiwiY2FtbF9ieXRlc19nZXQxNiIsImNhbWxfYnl0ZXNfZ2V0MzIiLCJjYW1sX2J5dGVzX2dldDY0IiwiY2FtbF9ieXRlc19vZl9zdHJpbmciLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ieXRlc19zZXQ2NCIsImNhbWxfYnl0ZXNfdW5zYWZlX2dldCIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9maWxsX2J5dGVzIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJkdW1teSIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX1VjaGFyIiwiQXNzZXJ0X2ZhaWx1cmUiLCJTdGRsaWJfU3lzIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9TZXEiLCJTdGRsaWJfQ2hhciIsIm1ha2UiLCJuIiwiYyIsInMiLCJpbml0IiwiaSIsImVtcHR5IiwiY29weSIsImxlbiIsInIiLCJ0b19zdHJpbmciLCJiIiwib2Zfc3RyaW5nIiwic3ViIiwib2ZzIiwic3ViX3N0cmluZyIsInN5bWJvbCIsImEiLCJtYXRjaCIsImV4dGVuZCIsImxlZnQiLCJyaWdodCIsImRzdG9mZiIsInNyY29mZiIsImNweWxlbiIsImZpbGwiLCJibGl0IiwiczEiLCJvZnMxIiwiczIiLCJvZnMyIiwiYmxpdF9zdHJpbmciLCJpdGVyIiwiaXRlcmkiLCJjb25jYXQiLCJzZXAiLCJsIiwic2VwbGVuIiwiYWNjIiwicGFyYW0iLCJwb3MiLCJoZCIsInRsIiwieCIsImRzdCIsImNhdCIsImwxIiwibDIiLCJpc19zcGFjZSIsInRyaW0iLCJqIiwidW5zYWZlX2VzY2FwZSIsImVzY2FwZWQiLCJtYXAiLCJtYXBpIiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImV4aXN0cyIsInAiLCJmb3JfYWxsIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiYXBwbHkxIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJpbmRleF9yZWMiLCJsaW0iLCJpbmRleCIsImluZGV4X3JlY19vcHQiLCJpbmRleF9vcHQiLCJpbmRleF9mcm9tIiwiaW5kZXhfZnJvbV9vcHQiLCJyaW5kZXhfcmVjIiwicmluZGV4IiwicmluZGV4X2Zyb20iLCJyaW5kZXhfcmVjX29wdCIsInJpbmRleF9vcHQiLCJyaW5kZXhfZnJvbV9vcHQiLCJjb250YWluc19mcm9tIiwiZXhuIiwiY29udGFpbnMiLCJyY29udGFpbnNfZnJvbSIsImNvbXBhcmUiLCJzcGxpdF9vbl9jaGFyIiwidG9fc2VxIiwiYXV4IiwidG9fc2VxaSIsIm9mX3NlcSIsImJ1ZiIsIm5ld19sZW4iLCJuZXdfYnVmIiwidW5zYWZlX2dldF91aW50MTZfbGUiLCJ1bnNhZmVfZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQ4IiwiZ2V0X3VpbnQxNl9sZSIsImdldF91aW50MTZfYmUiLCJnZXRfaW50MTZfbmUiLCJnZXRfaW50MTZfbGUiLCJnZXRfaW50MTZfYmUiLCJnZXRfaW50MzJfbGUiLCJnZXRfaW50MzJfYmUiLCJnZXRfaW50NjRfbGUiLCJnZXRfaW50NjRfYmUiLCJ1bnNhZmVfc2V0X3VpbnQxNl9sZSIsInVuc2FmZV9zZXRfdWludDE2X2JlIiwic2V0X2ludDE2X2xlIiwic2V0X2ludDE2X2JlIiwic2V0X2ludDMyX2xlIiwic2V0X2ludDMyX2JlIiwic2V0X2ludDY0X2xlIiwic2V0X2ludDY0X2JlIiwiZGVjX2ludmFsaWQiLCJkZWNfcmV0IiwidSIsIm5vdF9pbl94ODBfdG9feEJGIiwibm90X2luX3hBMF90b194QkYiLCJub3RfaW5feDgwX3RvX3g5RiIsIm5vdF9pbl94OTBfdG9feEJGIiwibm90X2luX3g4MF90b194OEYiLCJ1dGZfOF91Y2hhcl8zIiwiYjAiLCJiMSIsImIyIiwidXRmXzhfdWNoYXJfNCIsImIzIiwiZ2V0X3V0Zl84X3VjaGFyIiwibWF4IiwiY3N0X2J5dGVzX21sIiwic2V0X3V0Zl84X3VjaGFyIiwic2V0IiwibGFzdCIsImlzX3ZhbGlkX3V0Zl84IiwiY3N0X2luZGV4X291dF9vZl9ib3VuZHMiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJoaSIsImxvIiwic2V0X3V0Zl8xNmJlX3VjaGFyIiwiaXNfdmFsaWRfdXRmXzE2YmUiLCJnZXRfdXRmXzE2bGVfdWNoYXIiLCJzZXRfdXRmXzE2bGVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZsZSIsIlN0ZGxpYl9CeXRlcyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEs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cCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvc3RyaW5nLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTdHJpbmcgb3BlcmF0aW9ucywgYmFzZWQgb24gYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBieXRlcy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBieXRlcy5tbC5cbiAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgXCJkdXBsaWNhdGVkXCIgY29tbWVudCBhYm92ZSB0aGVpciBkZWZpbml0aW9uLlxuKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6IHN0cmluZyAtPiBpbnQgLT4gIGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5tb2R1bGUgQiA9IEJ5dGVzXG5cbmxldCBidHMgPSBCLnVuc2FmZV90b19zdHJpbmdcbmxldCBib3MgPSBCLnVuc2FmZV9vZl9zdHJpbmdcblxubGV0IG1ha2UgbiBjID1cbiAgQi5tYWtlIG4gYyB8PiBidHNcbmxldCBpbml0IG4gZiA9XG4gIEIuaW5pdCBuIGYgfD4gYnRzXG5sZXQgZW1wdHkgPSBcIlwiXG5sZXQgb2ZfYnl0ZXMgPSBCLnRvX3N0cmluZ1xubGV0IHRvX2J5dGVzID0gQi5vZl9zdHJpbmdcbmxldCBzdWIgcyBvZnMgbGVuID1cbiAgQi5zdWIgKGJvcyBzKSBvZnMgbGVuIHw+IGJ0c1xubGV0IGJsaXQgPVxuICBCLmJsaXRfc3RyaW5nXG5cbmxldCBlbnN1cmVfZ2UgKHg6aW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiU3RyaW5nLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gXCJcIlxuICB8IGwgLT4gbGV0IHNlcGxlbiA9IGxlbmd0aCBzZXAgaW4gYnRzIEBAXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoQi5jcmVhdGUgKHN1bV9sZW5ndGhzIDAgc2VwbGVuIGwpKVxuICAgICAgICAgICAgMCBzZXAgc2VwbGVuIGxcblxubGV0IGNhdCA9ICggXiApXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpdGVyIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiAodW5zYWZlX2dldCBzIGkpIGRvbmVcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGl0ZXJpIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IHMgaSkgZG9uZVxuXG5sZXQgbWFwIGYgcyA9XG4gIEIubWFwIGYgKGJvcyBzKSB8PiBidHNcbmxldCBtYXBpIGYgcyA9XG4gIEIubWFwaSBmIChib3MgcykgfD4gYnRzXG5sZXQgZm9sZF9yaWdodCBmIHggYSA9XG4gIEIuZm9sZF9yaWdodCBmIChib3MgeCkgYVxubGV0IGZvbGRfbGVmdCBmIGEgeCA9XG4gIEIuZm9sZF9sZWZ0IGYgYSAoYm9zIHgpXG5sZXQgZXhpc3RzIGYgcyA9XG4gIEIuZXhpc3RzIGYgKGJvcyBzKVxubGV0IGZvcl9hbGwgZiBzID1cbiAgQi5mb3JfYWxsIGYgKGJvcyBzKVxuXG4oKiBCZXdhcmU6IHdlIGNhbm5vdCB1c2UgQi50cmltIG9yIEIuZXNjYXBlIGJlY2F1c2UgdGhleSBhbHdheXMgbWFrZSBhXG4gICBjb3B5LCBidXQgU3RyaW5nLm1saSBzcGVsbHMgb3V0IHNvbWUgY2FzZXMgd2hlcmUgd2UgYXJlIG5vdCBhbGxvd2VkXG4gICB0byBtYWtlIGEgY29weS4gKilcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBpZiBzID0gXCJcIiB0aGVuIHNcbiAgZWxzZSBpZiBpc19zcGFjZSAodW5zYWZlX2dldCBzIDApIHx8IGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgKGxlbmd0aCBzIC0gMSkpXG4gICAgdGhlbiBidHMgKEIudHJpbSAoYm9zIHMpKVxuICBlbHNlIHNcblxubGV0IGVzY2FwZWQgcyA9XG4gIGxldCBiID0gYm9zIHMgaW5cbiAgKCogV2Ugc2F0aXNmeSBbdW5zYWZlX2VzY2FwZV0ncyBwcmVjb25kaXRpb24gYnkgcGFzc2luZyBhblxuICAgICBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZSBbYl0uICopXG4gIGJ0cyAoQi51bnNhZmVfZXNjYXBlIGIpXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjX29wdCBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSBpbmRleF9yZWNfb3B0IHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgICBpbmRleF9yZWMgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXggcyBjID0gcmluZGV4X3JlYyBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9vcHQgcyBjID0gcmluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID1cbiAgQi51cHBlcmNhc2VfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9XG4gIEIubG93ZXJjYXNlX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgY2FwaXRhbGl6ZV9hc2NpaSBzID1cbiAgQi5jYXBpdGFsaXplX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPVxuICBCLnVuY2FwaXRhbGl6ZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgc3RhcnRzX3dpdGggfnByZWZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9wcmUgPSBsZW5ndGggcHJlZml4IGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fcHJlIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIGkgPD4gdW5zYWZlX2dldCBwcmVmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBsZW5fcyA+PSBsZW5fcHJlICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2ggOiBpbnQgLT4gc3RyaW5nIC0+IGludCA9IFwiY2FtbF9zdHJpbmdfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2ggMCB4XG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG50eXBlIHQgPSBzdHJpbmdcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3RyaW5nX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID0gYm9zIHMgfD4gQi50b19zZXFcblxubGV0IHRvX3NlcWkgcyA9IGJvcyBzIHw+IEIudG9fc2VxaVxuXG5sZXQgb2Zfc2VxIGcgPSBCLm9mX3NlcSBnIHw+IGJ0c1xuXG4oKiBVVEYgZGVjb2RlcnMgYW5kIHZhbGlkYXRvcnMgKilcblxubGV0IGdldF91dGZfOF91Y2hhciBzIGkgPSBCLmdldF91dGZfOF91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfOCBzID0gQi5pc192YWxpZF91dGZfOCAoYm9zIHMpXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzE2YmVfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzE2YmUgcyA9IEIuaXNfdmFsaWRfdXRmXzE2YmUgKGJvcyBzKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl8xNmxlX3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIHMgPSBCLmlzX3ZhbGlkX3V0Zl8xNmxlIChib3MgcylcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZy9kZWNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogc3RyaW5nIC0+IGludCAtPiBpbnQgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQxNl9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9zdHJpbmdfZ2V0MTZcIlxuZXh0ZXJuYWwgZ2V0X2ludDMyX25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQzMiA9IFwiJWNhbWxfc3RyaW5nX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX3N0cmluZ19nZXQ2NFwiXG5cbmxldCBnZXRfaW50OCBzIGkgPSBCLmdldF9pbnQ4IChib3MgcykgaVxubGV0IGdldF91aW50MTZfbGUgcyBpID0gQi5nZXRfdWludDE2X2xlIChib3MgcykgaVxubGV0IGdldF91aW50MTZfYmUgcyBpID0gQi5nZXRfdWludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9uZSBzIGkgPSBCLmdldF9pbnQxNl9uZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfbGUgcyBpID0gQi5nZXRfaW50MTZfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X2JlIHMgaSA9IEIuZ2V0X2ludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQzMl9sZSBzIGkgPSBCLmdldF9pbnQzMl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MzJfYmUgcyBpID0gQi5nZXRfaW50MzJfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDY0X2xlIHMgaSA9IEIuZ2V0X2ludDY0X2xlIChib3MgcykgaVxubGV0IGdldF9pbnQ2NF9iZSBzIGkgPSBCLmdldF9pbnQ2NF9iZSAoYm9zIHMpIGlcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ibGl0X3N0cmluZyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2VxdWFsIiwiY2FtbF9zdHJpbmdfaGFzaCIsImNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX0J5dGVzIiwiYnRzIiwiYm9zIiwibWFrZSIsIm4iLCJjIiwiaW5pdCIsIm9mX2J5dGVzIiwidG9fYnl0ZXMiLCJzdWIiLCJzIiwib2ZzIiwibGVuIiwiYmxpdCIsImNzdCIsImNvbmNhdCIsInNlcCIsImwiLCJzZXBsZW4iLCJhY2MiLCJwYXJhbSIsInBvcyIsImhkIiwidGwiLCJ4IiwiZHN0IiwiY2F0IiwiaXRlciIsImkiLCJpdGVyaSIsIm1hcCIsIm1hcGkiLCJmb2xkX3JpZ2h0IiwiYSIsImZvbGRfbGVmdCIsImV4aXN0cyIsImZvcl9hbGwiLCJpc19zcGFjZSIsInRyaW0iLCJlc2NhcGVkIiwiYiIsImluZGV4X3JlYyIsImxpbSIsImluZGV4IiwiaW5kZXhfcmVjX29wdCIsImluZGV4X29wdCIsImluZGV4X2Zyb20iLCJpbmRleF9mcm9tX29wdCIsInJpbmRleF9yZWMiLCJyaW5kZXgiLCJyaW5kZXhfZnJvbSIsInJpbmRleF9yZWNfb3B0IiwicmluZGV4X29wdCIsInJpbmRleF9mcm9tX29wdCIsImNvbnRhaW5zX2Zyb20iLCJleG4iLCJjb250YWlucyIsInJjb250YWluc19mcm9tIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJoYXNoIiwic3BsaXRfb25fY2hhciIsImoiLCJyIiwiY29tcGFyZSIsInRvX3NlcSIsInRvX3NlcWkiLCJvZl9zZXEiLCJnIiwiZ2V0X3V0Zl84X3VjaGFyIiwiaXNfdmFsaWRfdXRmXzgiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZiZSIsImdldF91dGZfMTZsZV91Y2hhciIsImlzX3ZhbGlkX3V0Zl8xNmxlIiwiZ2V0X2ludDgiLCJnZXRfdWludDE2X2xlIiwiZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQxNl9uZSIsImdldF9pbnQxNl9sZSIsImdldF9pbnQxNl9iZSIsImdldF9pbnQzMl9sZSIsImdldF9pbnQzMl9iZSIsImdldF9pbnQ2NF9sZSIsImdldF9pbnQ2NF9iZSIsIlN0ZGxpYl9TdHJpbmciXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHlCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxZQUFBQyxLQUFBQyxHQUFBQyxHQ21DRSxPQUFVLElBQVYsaUNBQWlCO0FBQUEsWUFBQUMsS0FBQUYsR0FBQVYsR0FFakIsT0FBVSxJQUFWLGlDQUFpQjtBQUFBLE9BQUFhLFdEckNuQixpQkFBQUMs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O0FBQUFBLFFBQUEsSUFDQztBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUEyRCxjQUFBN0UsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE0RCxhQUFBOUUsR0FBQWtCO0FBQUFBLFFBQUEsSUFDWDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE2RCxhQUFBL0UsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUE4RCxhQUFBaEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUErRCxhQUFBakYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFnRSxhQUFBbEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFpRSxhQUFBbkYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBLFlBQUFrRSxhQUFBcEYsR0FBQWtCO0FBQUFBLFFBQUEsSUFDVDtBQUFBLElBQU8sd0NBQUU7QUFBQTtBQUFBO0FBQUEsSUFBQW1FO0FBQUFBLE1EblIvQyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjE0MzY5LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2FycmF5Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgYXJyYXlzLiAqKVxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxuKCogQXJyYXkgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBsZW5ndGggOiAnYSBhcnJheSAtPiBpbnQgPSBcIiVhcnJheV9sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV9zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgbWFrZTogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG5leHRlcm5hbCBjcmVhdGU6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuZXh0ZXJuYWwgdW5zYWZlX3N1YiA6ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfc3ViXCJcbmV4dGVybmFsIGFwcGVuZF9wcmltIDogJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfYXBwZW5kXCJcbmV4dGVybmFsIGNvbmNhdCA6ICdhIGFycmF5IGxpc3QgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfY29uY2F0XCJcbmV4dGVybmFsIHVuc2FmZV9ibGl0IDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9hcnJheV9ibGl0XCJcbmV4dGVybmFsIHVuc2FmZV9maWxsIDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2FycmF5X2ZpbGxcIlxuZXh0ZXJuYWwgY3JlYXRlX2Zsb2F0OiBpbnQgLT4gZmxvYXQgYXJyYXkgPSBcImNhbWxfbWFrZV9mbG9hdF92ZWN0XCJcblxubW9kdWxlIEZsb2F0YXJyYXkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGZsb2F0YXJyYXkgPSBcImNhbWxfZmxvYXRhcnJheV9jcmVhdGVcIlxuICBleHRlcm5hbCBsZW5ndGggOiBmbG9hdGFycmF5IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdFxuICAgICAgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9zZXRcIlxuZW5kXG5cbmxldCBpbml0IGwgZiA9XG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlXG4gIGlmIGwgPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5pbml0XCJcbiAgKCogU2VlICM2NTc1LiBXZSBtdXN0IG5vdCBldmFsdWF0ZSBbZiAwXSB3aGVuIFtsIDw9IDBdLlxuICAgICBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtYXhpbXVtIGFycmF5IHNpemUsIGJ1dCB0aGlzIGRlcGVuZHNcbiAgICAgb24gd2hldGhlciB3ZSBjcmVhdGUgYSBmbG9hdCBhcnJheSBvciBhIHJlZ3VsYXIgb25lLi4uICopXG4gIGVsc2VcbiAgIGxldCByZXMgPSBjcmVhdGUgbCAoZiAwKSBpblxuICAgZm9yIGkgPSAxIHRvIHByZWQgbCBkb1xuICAgICB1bnNhZmVfc2V0IHJlcyBpIChmIGkpXG4gICBkb25lO1xuICAgcmVzXG5cbmxldCBtYWtlX21hdHJpeCBzeCBzeSBpbml0ID1cbiAgKCogV2UgcmFpc2UgZXZlbiBpZiBbc3ggPSAwICYmIHN5IDwgMF06ICopXG4gIGlmIHN5IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkubWFrZV9tYXRyaXhcIjtcbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICAgIHVuc2FmZV9zZXQgcmVzIHggKGNyZWF0ZSBzeSBpbml0KVxuICAgIGRvbmU7XG4gIGVuZDtcbiAgcmVzXG5cbmxldCBpbml0X21hdHJpeCBzeCBzeSBmID1cbiAgKCogV2UgcmFpc2UgZXZlbiBpZiBbc3ggPSAwICYmIHN5IDwgMF06ICopXG4gIGlmIHN5IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuaW5pdF9tYXRyaXhcIjtcbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gICgqIFdlIG11c3Qgbm90IGV2YWx1YXRlIFtmIHggMF0gd2hlbiBbc3kgPD0gMF06ICopXG4gIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICAgIGxldCByb3cgPSBjcmVhdGUgc3kgKGYgeCAwKSBpblxuICAgICAgZm9yIHkgPSAxIHRvIHByZWQgc3kgZG9cbiAgICAgICAgdW5zYWZlX3NldCByb3cgeSAoZiB4IHkpXG4gICAgICBkb25lO1xuICAgICAgdW5zYWZlX3NldCByZXMgeCByb3dcbiAgICBkb25lO1xuICBlbmQ7XG4gIHJlc1xuXG5sZXQgY29weSBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpbiBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSB1bnNhZmVfc3ViIGEgMCBsXG5cbmxldCBhcHBlbmQgYTEgYTIgPVxuICBsZXQgbDEgPSBsZW5ndGggYTEgaW5cbiAgaWYgbDEgPSAwIHRoZW4gY29weSBhMlxuICBlbHNlIGlmIGxlbmd0aCBhMiA9IDAgdGhlbiB1bnNhZmVfc3ViIGExIDAgbDFcbiAgZWxzZSBhcHBlbmRfcHJpbSBhMSBhMlxuXG5sZXQgc3ViIGEgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuc3ViXCJcbiAgZWxzZSB1bnNhZmVfc3ViIGEgb2ZzIGxlblxuXG5sZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHZcblxubGV0IGJsaXQgYTEgb2ZzMSBhMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBhMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggYTIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IGExIG9mczEgYTIgb2ZzMiBsZW5cblxubGV0IGl0ZXIgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBpdGVyMiBmIGEgYiA9XG4gIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gIGVsc2VcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxubGV0IG1hcCBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZih1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZih1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwX2lucGxhY2UgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgYSBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gIGRvbmVcblxubGV0IG1hcGlfaW5wbGFjZSBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgdW5zYWZlX3NldCBhIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICBkb25lXG5cbmxldCBtYXAyIGYgYSBiID1cbiAgbGV0IGxhID0gbGVuZ3RoIGEgaW5cbiAgbGV0IGxiID0gbGVuZ3RoIGIgaW5cbiAgaWYgbGEgPD4gbGIgdGhlblxuICAgIGludmFsaWRfYXJnIFwiQXJyYXkubWFwMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICBlbHNlIGJlZ2luXG4gICAgaWYgbGEgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGNyZWF0ZSBsYSAoZiAodW5zYWZlX2dldCBhIDApICh1bnNhZmVfZ2V0IGIgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbGEgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG4gIGVuZFxuXG5sZXQgaXRlcmkgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBtYXBpIGYgYSA9XG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIChmIDAgKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCB0b19saXN0IGEgPVxuICBsZXQgcmVjIHRvbGlzdCBpIHJlcyA9XG4gICAgaWYgaSA8IDAgdGhlbiByZXMgZWxzZSB0b2xpc3QgKGkgLSAxKSAodW5zYWZlX2dldCBhIGkgOjogcmVzKSBpblxuICB0b2xpc3QgKGxlbmd0aCBhIC0gMSkgW11cblxuKCogQ2Fubm90IHVzZSBMaXN0Lmxlbmd0aCBoZXJlIGJlY2F1c2UgdGhlIExpc3QgbW9kdWxlIGRlcGVuZHMgb24gQXJyYXkuICopXG5sZXQgcmVjIGxpc3RfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY3VcbiAgfCBfOjp0IC0+IGxpc3RfbGVuZ3RoIChzdWNjIGFjY3UpIHRcblxubGV0IG9mX2xpc3QgPSBmdW5jdGlvblxuICAgIFtdIC0+IFt8fF1cbiAgfCBoZDo6dGwgYXMgbCAtPlxuICAgICAgbGV0IGEgPSBjcmVhdGUgKGxpc3RfbGVuZ3RoIDAgbCkgaGQgaW5cbiAgICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgICBbXSAtPiBhXG4gICAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpKzEpIHRsIGluXG4gICAgICBmaWxsIDEgdGxcblxubGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFyXG5cbmxldCBmb2xkX2xlZnRfbWFwIGYgYWNjIGlucHV0X2FycmF5ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBpbnB1dF9hcnJheSBpblxuICBpZiBsZW4gPSAwIHRoZW4gKGFjYywgW3x8XSkgZWxzZSBiZWdpblxuICAgIGxldCBhY2MsIGVsdCA9IGYgYWNjICh1bnNhZmVfZ2V0IGlucHV0X2FycmF5IDApIGluXG4gICAgbGV0IG91dHB1dF9hcnJheSA9IGNyZWF0ZSBsZW4gZWx0IGluXG4gICAgbGV0IGFjYyA9IHJlZiBhY2MgaW5cbiAgICBmb3IgaSA9IDEgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IGFjYycsIGVsdCA9IGYgIWFjYyAodW5zYWZlX2dldCBpbnB1dF9hcnJheSBpKSBpblxuICAgICAgYWNjIDo9IGFjYyc7XG4gICAgICB1bnNhZmVfc2V0IG91dHB1dF9hcnJheSBpIGVsdDtcbiAgICBkb25lO1xuICAgICFhY2MsIG91dHB1dF9hcnJheVxuICBlbmRcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbDIgcCBsMSBsMiA9XG4gIGxldCBuMSA9IGxlbmd0aCBsMVxuICBhbmQgbjIgPSBsZW5ndGggbDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmZvcl9hbGwyXCJcbiAgZWxzZSBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4xIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBsMSBpKSAodW5zYWZlX2dldCBsMiBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZXhpc3RzMiBwIGwxIGwyID1cbiAgbGV0IG4xID0gbGVuZ3RoIGwxXG4gIGFuZCBuMiA9IGxlbmd0aCBsMiBpblxuICBpZiBuMSA8PiBuMiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZXhpc3RzMlwiXG4gIGVsc2UgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuMSB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGwxIGkpICh1bnNhZmVfZ2V0IGwyIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IG1lbSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGEgaSkgeCA9IDAgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgbWVtcSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiB4ID09ICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9vcHQgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICBlbHNlIGxvb3AgKHN1Y2MgaSlcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX2luZGV4IHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gU29tZSBpXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9tYXAgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIChzdWNjIGkpXG4gICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX21hcGkgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiBpICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgfCBOb25lIC0+IGxvb3AgKHN1Y2MgaSlcbiAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICBpblxuICBsb29wIDBcblxubGV0IHNwbGl0IHggPVxuICBpZiB4ID0gW3x8XSB0aGVuIFt8fF0sIFt8fF1cbiAgZWxzZSBiZWdpblxuICAgIGxldCBhMCwgYjAgPSB1bnNhZmVfZ2V0IHggMCBpblxuICAgIGxldCBuID0gbGVuZ3RoIHggaW5cbiAgICBsZXQgYSA9IGNyZWF0ZSBuIGEwIGluXG4gICAgbGV0IGIgPSBjcmVhdGUgbiBiMCBpblxuICAgIGZvciBpID0gMSB0byBuIC0gMSBkb1xuICAgICAgbGV0IGFpLCBiaSA9IHVuc2FmZV9nZXQgeCBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSBhaTtcbiAgICAgIHVuc2FmZV9zZXQgYiBpIGJpXG4gICAgZG9uZTtcbiAgICBhLCBiXG4gIGVuZFxuXG5sZXQgY29tYmluZSBhIGIgPVxuICBsZXQgbmEgPSBsZW5ndGggYSBpblxuICBsZXQgbmIgPSBsZW5ndGggYiBpblxuICBpZiBuYSA8PiBuYiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuY29tYmluZVwiO1xuICBpZiBuYSA9IDAgdGhlbiBbfHxdXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgeCA9IGNyZWF0ZSBuYSAodW5zYWZlX2dldCBhIDAsIHVuc2FmZV9nZXQgYiAwKSBpblxuICAgIGZvciBpID0gMSB0byBuYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgeCBpICh1bnNhZmVfZ2V0IGEgaSwgdW5zYWZlX2dldCBiIGkpXG4gICAgZG9uZTtcbiAgICB4XG4gIGVuZFxuXG5leGNlcHRpb24gQm90dG9tIG9mIGludFxubGV0IHNvcnQgY21wIGEgPVxuICBsZXQgbWF4c29uIGwgaSA9XG4gICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICBsZXQgeCA9IHJlZiBpMzEgaW5cbiAgICBpZiBpMzErMiA8IGwgdGhlbiBiZWdpblxuICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgaWYgY21wIChnZXQgYSAheCkgKGdldCBhIChpMzErMikpIDwgMCB0aGVuIHggOj0gaTMxKzI7XG4gICAgICAheFxuICAgIGVuZCBlbHNlXG4gICAgICBpZiBpMzErMSA8IGwgJiYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDBcbiAgICAgIHRoZW4gaTMxKzFcbiAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgaW5cbiAgbGV0IHJlYyB0cmlja2xlZG93biBsIGkgZSA9XG4gICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgaWYgY21wIChnZXQgYSBqKSBlID4gMCB0aGVuIGJlZ2luXG4gICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBzZXQgYSBpIGU7XG4gICAgZW5kO1xuICBpblxuICBsZXQgdHJpY2tsZSBsIGkgZSA9IHRyeSB0cmlja2xlZG93biBsIGkgZSB3aXRoIEJvdHRvbSBpIC0+IHNldCBhIGkgZSBpblxuICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICBidWJibGVkb3duIGwgalxuICBpblxuICBsZXQgYnViYmxlIGwgaSA9IHRyeSBidWJibGVkb3duIGwgaSB3aXRoIEJvdHRvbSBpIC0+IGkgaW5cbiAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICBsZXQgZmF0aGVyID0gKGkgLSAxKSAvIDMgaW5cbiAgICBhc3NlcnQgKGkgPD4gZmF0aGVyKTtcbiAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgZmF0aGVyKTtcbiAgICAgIGlmIGZhdGhlciA+IDAgdGhlbiB0cmlja2xldXAgZmF0aGVyIGUgZWxzZSBzZXQgYSAwIGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHNldCBhIGkgZTtcbiAgICBlbmQ7XG4gIGluXG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgZm9yIGkgPSAobCArIDEpIC8gMyAtIDEgZG93bnRvIDAgZG8gdHJpY2tsZSBsIGkgKGdldCBhIGkpOyBkb25lO1xuICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgbGV0IGUgPSAoZ2V0IGEgaSkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSAwKTtcbiAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gIGRvbmU7XG4gIGlmIGwgPiAxIHRoZW4gKGxldCBlID0gKGdldCBhIDEpIGluIHNldCBhIDEgKGdldCBhIDApOyBzZXQgYSAwIGUpXG5cblxubGV0IGN1dG9mZiA9IDVcbmxldCBzdGFibGVfc29ydCBjbXAgYSA9XG4gIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgbGV0IHNyYzFyID0gc3JjMW9mcyArIHNyYzFsZW4gYW5kIHNyYzJyID0gc3JjMm9mcyArIHNyYzJsZW4gaW5cbiAgICBsZXQgcmVjIGxvb3AgaTEgczEgaTIgczIgZCA9XG4gICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBkc3QgZCBzMTtcbiAgICAgICAgbGV0IGkxID0gaTEgKyAxIGluXG4gICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgIGxvb3AgaTEgKGdldCBhIGkxKSBpMiBzMiAoZCArIDEpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgZHN0IGQgczI7XG4gICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICBpZiBpMiA8IHNyYzJyIHRoZW5cbiAgICAgICAgICBsb29wIGkxIHMxIGkyIChnZXQgc3JjMiBpMikgKGQgKyAxKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYmxpdCBhIGkxIGRzdCAoZCArIDEpIChzcmMxciAtIGkxKVxuICAgICAgZW5kXG4gICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gIGluXG4gIGxldCBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBlID0gKGdldCBhIChzcmNvZnMgKyBpKSkgaW5cbiAgICAgIGxldCBqID0gcmVmIChkc3RvZnMgKyBpIC0gMSkgaW5cbiAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgc2V0IGRzdCAoIWogKyAxKSAoZ2V0IGRzdCAhaik7XG4gICAgICAgIGRlY3IgajtcbiAgICAgIGRvbmU7XG4gICAgICBzZXQgZHN0ICghaiArIDEpIGU7XG4gICAgZG9uZTtcbiAgaW5cbiAgbGV0IHJlYyBzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICBpZiBsZW4gPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gZWxzZSBiZWdpblxuICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgbGV0IGwyID0gbGVuIC0gbDEgaW5cbiAgICAgIHNvcnR0byAoc3Jjb2ZzICsgbDEpIGRzdCAoZHN0b2ZzICsgbDEpIGwyO1xuICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICBtZXJnZSAoc3Jjb2ZzICsgbDIpIGwxIGRzdCAoZHN0b2ZzICsgbDEpIGwyIGRzdCBkc3RvZnM7XG4gICAgZW5kO1xuICBpblxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byAwIGEgMCBsIGVsc2UgYmVnaW5cbiAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgIGxldCBsMiA9IGwgLSBsMSBpblxuICAgIGxldCB0ID0gbWFrZSBsMiAoZ2V0IGEgMCkgaW5cbiAgICBzb3J0dG8gbDEgdCAwIGwyO1xuICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgbWVyZ2UgbDIgbDEgdCAwIGwyIGEgMDtcbiAgZW5kXG5cblxubGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbmxldCBzaHVmZmxlIH5yYW5kIGEgPSAoKiBGaXNoZXItWWF0ZXMgKilcbiAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDEgZG9cbiAgICBsZXQgaiA9IHJhbmQgKGkgKyAxKSBpblxuICAgIGxldCB2ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICB1bnNhZmVfc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgdW5zYWZlX3NldCBhIGogdlxuICBkb25lXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgYSA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPCBsZW5ndGggYVxuICAgIHRoZW5cbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gICAgZWxzZSBTZXEuTmlsXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGEgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICB0aGVuXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICBlbHNlIFNlcS5OaWxcbiAgaW5cbiAgYXV4IDBcblxubGV0IG9mX3Jldl9saXN0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbfHxdXG4gIHwgaGQ6OnRsIGFzIGwgLT5cbiAgICAgIGxldCBsZW4gPSBsaXN0X2xlbmd0aCAwIGwgaW5cbiAgICAgIGxldCBhID0gY3JlYXRlIGxlbiBoZCBpblxuICAgICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICAgIFtdIC0+IGFcbiAgICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICAgIGluXG4gICAgICBmaWxsIChsZW4tMikgdGxcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gIG9mX3Jldl9saXN0IGxcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9hcnJheV9zdWIiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImdsb2JhbF9kYXRhIiwiU3RkbGliX1NlcSIsIkFzc2VydF9mYWlsdXJlIiwiU3RkbGliIiwiaW5pdCIsImwiLCJyZXMiLCJpIiwibWFrZV9tYXRyaXgiLCJzeCIsInN5IiwieCIsImluaXRfbWF0cml4Iiwicm93IiwieSIsImNvcHkiLCJhIiwiYXBwZW5kIiwiYTIiLCJsMSIsInN1YiIsIm9mcyIsImxlbiIsImZpbGwiLCJ2IiwiYmxpdCIsIm9mczEiLCJvZnMyIiwiaXRlciIsIml0ZXIyIiwiYiIsIm1hcCIsInIiLCJtYXBfaW5wbGFjZSIsIm1hcGlfaW5wbGFjZSIsIm1hcDIiLCJsYSIsImxiIiwiaXRlcmkiLCJtYXBpIiwidG9fbGlzdCIsImxpc3RfbGVuZ3RoIiwiYWNjdSIsInBhcmFtIiwidCIsIm9mX2xpc3QiLCJ0bCIsImhkIiwiZm9sZF9sZWZ0IiwiZm9sZF9sZWZ0X21hcCIsImFjYyIsImlucHV0X2FycmF5IiwibWF0Y2giLCJlbHQiLCJvdXRwdXRfYXJyYXkiLCJmb2xkX3JpZ2h0IiwiZXhpc3RzIiwicCIsIm4iLCJmb3JfYWxsIiwiZm9yX2FsbDIiLCJsMiIsIm4xIiwibjIiLCJleGlzdHMyIiwibWVtIiwibWVtcSIsImZpbmRfb3B0IiwiZmluZF9pbmRleCIsImZpbmRfbWFwIiwiZmluZF9tYXBpIiwic3BsaXQiLCJiMCIsImJpIiwiYWkiLCJjb21iaW5lIiwibmEiLCJuYiIsIkJvdHRvbSIsInNvcnQiLCJjbXAiLCJtYXhzb24iLCJpMzEiLCJlIiwiaiIsImV4biIsImZhdGhlciIsInN0YWJsZV9zb3J0IiwibWVyZ2UiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdCIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiIsInMxIiwiaTEiLCJpMiIsImQiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwic2h1ZmZsZSIsInJhbmQiLCJ0b19zZXEiLCJhdXgiLCJ0b19zZXFpIiwib2Zfc2VxIiwiU3RkbGliX0FycmF5Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxZQUFBQyxLQUFBQyxHQUFBVDtBQUFBQSxJQytDRSxZQUFjO0FBQUEsSUFDZCxVQUFjLHlDQVNWO0FBQUEsUUFBQVUsTUFKTyxrQkFBUyx1QkFDbkI7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLE1BQ21CO0FBQUEsY0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFFeEI7QUFBQSxHQUFHO0FBQUEsWUFBQUMsWUFBQUMsSUFBQUMsSUFBQU47QUFBQUEsSUFJSixXQUFlO0FBQUEsUUFBQUUsTUFDTDtBQUFBLElBQ1Y7QUFBQSxhQUFlO0FBQUE7QUFBQSxVQUFBSyxJQUFBO0FBQUE7QUFBQSxPQUVNO0FBQUEsZUFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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O0FBQUEsSUFBQXlHO0FBQUFBLE1EcGVmIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTUxMjQsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvZmxvYXQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgT2plZGEgQmFyLCBMZXhpRmkgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIG5lZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlbmVnZmxvYXRcIlxuZXh0ZXJuYWwgYWRkIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVhZGRmbG9hdFwiXG5leHRlcm5hbCBzdWIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJXN1YmZsb2F0XCJcbmV4dGVybmFsIG11bCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlbXVsZmxvYXRcIlxuZXh0ZXJuYWwgZGl2IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVkaXZmbG9hdFwiXG5leHRlcm5hbCByZW0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbW9kX2Zsb2F0XCIgXCJmbW9kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZtYSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2ZtYV9mbG9hdFwiIFwiY2FtbF9mbWFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5cbmxldCB6ZXJvID0gMC5cbmxldCBvbmUgPSAxLlxubGV0IG1pbnVzX29uZSA9IC0xLlxubGV0IGluZmluaXR5ID0gU3RkbGliLmluZmluaXR5XG5sZXQgbmVnX2luZmluaXR5ID0gU3RkbGliLm5lZ19pbmZpbml0eVxubGV0IG5hbiA9IFN0ZGxpYi5uYW5cbmxldCBxdWlldF9uYW4gPSBuYW5cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgc2lnbmFsaW5nX25hbiA9IGZsb2F0X29mX2JpdHMgMHg3Rl9GMF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBpc19maW5pdGUgKHg6IGZsb2F0KSA9IHggLS4geCA9IDAuXG5sZXQgaXNfaW5maW5pdGUgKHg6IGZsb2F0KSA9IDEuIC8uIHggPSAwLlxubGV0IGlzX25hbiAoeDogZmxvYXQpID0geCA8PiB4XG5cbmxldCBwaSA9IDB4MS45MjFmYjU0NDQyZDE4cCsxXG5sZXQgbWF4X2Zsb2F0ID0gU3RkbGliLm1heF9mbG9hdFxubGV0IG1pbl9mbG9hdCA9IFN0ZGxpYi5taW5fZmxvYXRcbmxldCBlcHNpbG9uID0gU3RkbGliLmVwc2lsb25fZmxvYXRcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcbmxldCBvZl9zdHJpbmdfb3B0ID0gU3RkbGliLmZsb2F0X29mX3N0cmluZ19vcHRcbmxldCB0b19zdHJpbmcgPSBTdGRsaWIuc3RyaW5nX29mX2Zsb2F0XG50eXBlIGZwY2xhc3MgPSBTdGRsaWIuZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcG93IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjYnJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2JydF9mbG9hdFwiIFwiY2FtbF9jYnJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cDIgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHAyX2Zsb2F0XCIgXCJjYW1sX2V4cDJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzJfZmxvYXRcIiBcImNhbWxfbG9nMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zaF9mbG9hdFwiIFwiY2FtbF9hY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXJmIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmX2Zsb2F0XCIgXCJjYW1sX2VyZlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBlcmZjIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmY19mbG9hdFwiIFwiY2FtbF9lcmZjXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRydW5jIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdHJ1bmNfZmxvYXRcIiBcImNhbWxfdHJ1bmNcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcm91bmQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9yb3VuZF9mbG9hdFwiIFwiY2FtbF9yb3VuZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2VpbF9mbG9hdFwiIFwiY2VpbFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb29yX2Zsb2F0XCIgXCJmbG9vclwiXG5bQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgaXNfaW50ZWdlciB4ID0geCA9IHRydW5jIHggJiYgaXNfZmluaXRlIHhcblxuZXh0ZXJuYWwgbmV4dF9hZnRlciA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gID0gXCJjYW1sX25leHRhZnRlcl9mbG9hdFwiIFwiY2FtbF9uZXh0YWZ0ZXJcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgc3VjYyB4ID0gbmV4dF9hZnRlciB4IGluZmluaXR5XG5sZXQgcHJlZCB4ID0gbmV4dF9hZnRlciB4IG5lZ19pbmZpbml0eVxuXG5leHRlcm5hbCBjb3B5X3NpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpZ25fYml0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGJvb2xcbiAgPSBcImNhbWxfc2lnbmJpdF9mbG9hdFwiIFwiY2FtbF9zaWduYml0XCIgW0BAbm9hbGxvY11cblxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbnR5cGUgdCA9IGZsb2F0XG5leHRlcm5hbCBjb21wYXJlIDogZmxvYXQgLT4gZmxvYXQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5sZXQgZXF1YWwgeCB5ID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldFtAaW5saW5lXSBtaW4gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuICBlbHNlIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIHlcblxubGV0W0BpbmxpbmVdIG1heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geCB0aGVuIHggZWxzZSB5XG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuXG5sZXRbQGlubGluZV0gbWluX21heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB8fCBpc19uYW4geSB0aGVuIChuYW4sIG5hbilcbiAgZWxzZSBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW4gKHgsIHkpIGVsc2UgKHksIHgpXG5cbmxldFtAaW5saW5lXSBtaW5fbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIHhcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuIHggZWxzZSB5XG5cbmxldFtAaW5saW5lXSBtYXhfbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIHlcbiAgZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSB4XG5cbmxldFtAaW5saW5lXSBtaW5fbWF4X251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB0aGVuICh5LHkpXG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiAoeCx4KVxuICBlbHNlIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlbiAoeCx5KSBlbHNlICh5LHgpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5cbm1vZHVsZSBBcnJheSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IGZsb2F0YXJyYXlcblxuICBleHRlcm5hbCBsZW5ndGggOiB0IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gdCA9IFwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiB0IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiB0IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcblxuICBsZXQgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGZvciBpID0gb2ZzIHRvIG9mcyArIGxlbiAtIDEgZG8gdW5zYWZlX3NldCBhIGkgdiBkb25lXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXQ6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0ID1cbiAgICBcImNhbWxfZmxvYXRhcnJheV9ibGl0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY2hlY2sgYSBvZnMgbGVuIG1zZyA9XG4gICAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyArIGxlbiA8IDAgfHwgb2ZzICsgbGVuID4gbGVuZ3RoIGEgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgbGV0IG1ha2UgbiB2ID1cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIG4gaW5cbiAgICB1bnNhZmVfZmlsbCByZXN1bHQgMCBuIHY7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGluaXQgbCBmID1cbiAgICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaW5pdFwiXG4gICAgZWxzZVxuICAgICAgbGV0IHJlcyA9IGNyZWF0ZSBsIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgICAgZG9uZTtcbiAgICAgIHJlc1xuXG4gIGxldCBtYWtlX21hdHJpeCBzeCBzeSB2ID1cbiAgICAoKiBXZSByYWlzZSBldmVuIGlmIFtzeCA9IDAgJiYgc3kgPCAwXTogKilcbiAgICBpZiBzeSA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5Lm1ha2VfbWF0cml4XCI7XG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2Ugc3ggKGNyZWF0ZSAwKSBpblxuICAgIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgICBmb3IgeCA9IDAgdG8gc3ggLSAxIGRvXG4gICAgICAgIEFycmF5LnVuc2FmZV9zZXQgcmVzIHggKG1ha2Ugc3kgdilcbiAgICAgIGRvbmU7XG4gICAgZW5kO1xuICAgIHJlc1xuXG4gIGxldCBpbml0X21hdHJpeCBzeCBzeSBmID1cbiAgICAoKiBXZSByYWlzZSBldmVuIGlmIFtzeCA9IDAgJiYgc3kgPCAwXTogKilcbiAgICBpZiBzeSA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5LmluaXRfbWF0cml4XCI7XG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2Ugc3ggKGNyZWF0ZSAwKSBpblxuICAgIGlmIHN5ID4gMCB0aGVuIGJlZ2luXG4gICAgICBmb3IgeCA9IDAgdG8gc3ggLSAxIGRvXG4gICAgICAgIGxldCByb3cgPSBjcmVhdGUgc3kgaW5cbiAgICAgICAgZm9yIHkgPSAwIHRvIHN5IC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgcm93IHkgKGYgeCB5KVxuICAgICAgICBkb25lO1xuICAgICAgICBBcnJheS51bnNhZmVfc2V0IHJlcyB4IHJvd1xuICAgICAgZG9uZTtcbiAgICBlbmQ7XG4gICAgcmVzXG5cbiAgbGV0IGFwcGVuZCBhMSBhMiA9XG4gICAgbGV0IGwxID0gbGVuZ3RoIGExIGluXG4gICAgbGV0IGwyID0gbGVuZ3RoIGEyIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAobDEgKyBsMikgaW5cbiAgICB1bnNhZmVfYmxpdCBhMSAwIHJlc3VsdCAwIGwxO1xuICAgIHVuc2FmZV9ibGl0IGEyIDAgcmVzdWx0IGwxIGwyO1xuICAgIHJlc3VsdFxuXG4gICgqIG5leHQgMyBmdW5jdGlvbnM6IG1vZGlmaWVkIGNvcHkgb2YgY29kZSBmcm9tIHN0cmluZy5tbCAqKVxuICBsZXQgZW5zdXJlX2dlICh4OmludCkgeSA9XG4gICAgaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuY29uY2F0XCJcblxuICBsZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIGFjYykgYWNjKSB0bFxuXG4gIGxldCBjb25jYXQgbCA9XG4gICAgbGV0IGxlbiA9IHN1bV9sZW5ndGhzIDAgbCBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgbGV0IHJlYyBsb29wIGwgaSA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IChpID0gbGVuKVxuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICBsZXQgaGxlbiA9IGxlbmd0aCBoZCBpblxuICAgICAgICB1bnNhZmVfYmxpdCBoZCAwIHJlc3VsdCBpIGhsZW47XG4gICAgICAgIGxvb3AgdGwgKGkgKyBobGVuKVxuICAgIGluXG4gICAgbG9vcCBsIDA7XG4gICAgcmVzdWx0XG5cbiAgbGV0IHN1YiBhIG9mcyBsZW4gPVxuICAgIGNoZWNrIGEgb2ZzIGxlbiBcIkZsb2F0LkFycmF5LnN1YlwiO1xuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgYSBvZnMgcmVzdWx0IDAgbGVuO1xuICAgIHJlc3VsdFxuXG4gIGxldCBjb3B5IGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGwgaW5cbiAgICB1bnNhZmVfYmxpdCBhIDAgcmVzdWx0IDAgbDtcbiAgICByZXN1bHRcblxuICBsZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gICAgY2hlY2sgYSBvZnMgbGVuIFwiRmxvYXQuQXJyYXkuZmlsbFwiO1xuICAgIHVuc2FmZV9maWxsIGEgb2ZzIGxlbiB2XG5cbiAgbGV0IGJsaXQgc3JjIHNvZnMgZHN0IGRvZnMgbGVuID1cbiAgICBjaGVjayBzcmMgc29mcyBsZW4gXCJGbG9hdC5hcnJheS5ibGl0XCI7XG4gICAgY2hlY2sgZHN0IGRvZnMgbGVuIFwiRmxvYXQuYXJyYXkuYmxpdFwiO1xuICAgIHVuc2FmZV9ibGl0IHNyYyBzb2ZzIGRzdCBkb2ZzIGxlblxuXG4gIGxldCB0b19saXN0IGEgPVxuICAgIExpc3QuaW5pdCAobGVuZ3RoIGEpICh1bnNhZmVfZ2V0IGEpXG5cbiAgbGV0IG9mX2xpc3QgbCA9XG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAoTGlzdC5sZW5ndGggbCkgaW5cbiAgICBsZXQgcmVjIGZpbGwgaSBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiByZXN1bHRcbiAgICAgIHwgaCA6OiB0IC0+IHVuc2FmZV9zZXQgcmVzdWx0IGkgaDsgZmlsbCAoaSArIDEpIHRcbiAgICBpblxuICAgIGZpbGwgMCBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBpdGVyIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlcjIgZiBhIGIgPVxuICAgIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaXRlcjI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgICBlbHNlXG4gICAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxuICBsZXQgbWFwIGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBtYXBfaW5wbGFjZSBmIGEgPVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgYSBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZVxuXG4gIGxldCBtYXAyIGYgYSBiID1cbiAgICBsZXQgbGEgPSBsZW5ndGggYSBpblxuICAgIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gICAgaWYgbGEgPD4gbGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5tYXAyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsYSAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXJpIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbiAgbGV0IG1hcGkgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgbWFwaV9pbnBsYWNlIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCBhIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmVcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gICAgZG9uZTtcbiAgICAhclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9sZF9yaWdodCBmIGEgeCA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgICByIDo9IGYgKHVuc2FmZV9nZXQgYSBpKSAhclxuICAgIGRvbmU7XG4gICAgIXJcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGV4aXN0cyBwIGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb3JfYWxsIHAgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiBsb29wIChpICsgMSlcbiAgICAgIGVsc2UgZmFsc2UgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG1lbSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYSBpKSB4ID0gMCB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ICopXG4gIGxldCBtZW1faWVlZSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHggPSAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZmluZF9vcHQgcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZpbmRfaW5kZXggcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIFNvbWUgaVxuICAgICAgZWxzZSBsb29wIChpICsgMSkgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZpbmRfbWFwIGYgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgICAgZWxzZVxuICAgICAgICBtYXRjaCBmICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICAgIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmaW5kX21hcGkgZiBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIG1hdGNoIGYgaSAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBleGNlcHRpb24gQm90dG9tIG9mIGludFxuICBsZXQgc29ydCBjbXAgYSA9XG4gICAgbGV0IG1heHNvbiBsIGkgPVxuICAgICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICAgIGxldCB4ID0gcmVmIGkzMSBpblxuICAgICAgaWYgaTMxKzIgPCBsIHRoZW4gYmVnaW5cbiAgICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgICBpZiBjbXAgKGdldCBhICF4KSAoZ2V0IGEgKGkzMSsyKSkgPCAwIHRoZW4geCA6PSBpMzErMjtcbiAgICAgICAgIXhcbiAgICAgIGVuZCBlbHNlXG4gICAgICAgIGlmIGkzMSsxIDwgbCAmJiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMFxuICAgICAgICB0aGVuIGkzMSsxXG4gICAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgICBpblxuICAgIGxldCByZWMgdHJpY2tsZWRvd24gbCBpIGUgPVxuICAgICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgICBpZiBjbXAgKGdldCBhIGopIGUgPiAwIHRoZW4gYmVnaW5cbiAgICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IHRyaWNrbGUgbCBpIGUgPSB0cnkgdHJpY2tsZWRvd24gbCBpIGUgd2l0aCBCb3R0b20gaSAtPiBzZXQgYSBpIGUgaW5cbiAgICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICBidWJibGVkb3duIGwgalxuICAgIGluXG4gICAgbGV0IGJ1YmJsZSBsIGkgPSB0cnkgYnViYmxlZG93biBsIGkgd2l0aCBCb3R0b20gaSAtPiBpIGluXG4gICAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICAgIGxldCBmYXRoZXIgPSAoaSAtIDEpIC8gMyBpblxuICAgICAgYXNzZXJ0IChpIDw+IGZhdGhlcik7XG4gICAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgYSBpIChnZXQgYSBmYXRoZXIpO1xuICAgICAgICBpZiBmYXRoZXIgPiAwIHRoZW4gdHJpY2tsZXVwIGZhdGhlciBlIGVsc2Ugc2V0IGEgMCBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGZvciBpID0gKGwgKyAxKSAvIDMgLSAxIGRvd250byAwIGRvIHRyaWNrbGUgbCBpIChnZXQgYSBpKTsgZG9uZTtcbiAgICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgICBsZXQgZSA9IChnZXQgYSBpKSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgMCk7XG4gICAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gICAgZG9uZTtcbiAgICBpZiBsID4gMSB0aGVuIChsZXQgZSA9IChnZXQgYSAxKSBpbiBzZXQgYSAxIChnZXQgYSAwKTsgc2V0IGEgMCBlKVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCwgZXhjZXB0IGZvciB0aGUgY2FsbCB0byBbY3JlYXRlXSAqKVxuICBsZXQgY3V0b2ZmID0gNVxuICBsZXQgc3RhYmxlX3NvcnQgY21wIGEgPVxuICAgIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgICBsZXQgc3JjMXIgPSBzcmMxb2ZzICsgc3JjMWxlbiBhbmQgc3JjMnIgPSBzcmMyb2ZzICsgc3JjMmxlbiBpblxuICAgICAgbGV0IHJlYyBsb29wIGkxIHMxIGkyIHMyIGQgPVxuICAgICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMxO1xuICAgICAgICAgIGxldCBpMSA9IGkxICsgMSBpblxuICAgICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSAoZ2V0IGEgaTEpIGkyIHMyIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMyO1xuICAgICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICAgIGlmIGkyIDwgc3JjMnIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSBzMSBpMiAoZ2V0IHNyYzIgaTIpIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IGEgaTEgZHN0IChkICsgMSkgKHNyYzFyIC0gaTEpXG4gICAgICAgIGVuZFxuICAgICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gICAgaW5cbiAgICBsZXQgaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgbGV0IGUgPSAoZ2V0IGEgKHNyY29mcyArIGkpKSBpblxuICAgICAgICBsZXQgaiA9IHJlZiAoZHN0b2ZzICsgaSAtIDEpIGluXG4gICAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgICBzZXQgZHN0ICghaiArIDEpIChnZXQgZHN0ICFqKTtcbiAgICAgICAgICBkZWNyIGo7XG4gICAgICAgIGRvbmU7XG4gICAgICAgIHNldCBkc3QgKCFqICsgMSkgZTtcbiAgICAgIGRvbmU7XG4gICAgaW5cbiAgICBsZXQgcmVjIHNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgaWYgbGVuIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgICBsZXQgbDIgPSBsZW4gLSBsMSBpblxuICAgICAgICBzb3J0dG8gKHNyY29mcyArIGwxKSBkc3QgKGRzdG9mcyArIGwxKSBsMjtcbiAgICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICAgIG1lcmdlIChzcmNvZnMgKyBsMikgbDEgZHN0IChkc3RvZnMgKyBsMSkgbDIgZHN0IGRzdG9mcztcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gMCBhIDAgbCBlbHNlIGJlZ2luXG4gICAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgICAgbGV0IGwyID0gbCAtIGwxIGluXG4gICAgICBsZXQgdCA9IGNyZWF0ZSBsMiBpblxuICAgICAgc29ydHRvIGwxIHQgMCBsMjtcbiAgICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgICBtZXJnZSBsMiBsMSB0IDAgbDIgYSAwO1xuICAgIGVuZFxuXG4gIGxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgc2h1ZmZsZSB+cmFuZCBhID0gKCogRmlzaGVyLVlhdGVzICopXG4gICAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDEgZG9cbiAgICAgIGxldCBqID0gcmFuZCAoaSArIDEpIGluXG4gICAgICBsZXQgdiA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICB1bnNhZmVfc2V0IGEgaiB2XG4gICAgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgdG9fc2VxIGEgPVxuICAgIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgICB0aGVuXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IHRvX3NlcWkgYSA9XG4gICAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICAgIHRoZW5cbiAgICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9yZXZfbGlzdCBsID1cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggbCBpblxuICAgIGxldCBhID0gY3JlYXRlIGxlbiBpblxuICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgW10gLT4gYVxuICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICBpblxuICAgIGZpbGwgKGxlbi0xKSBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9zZXEgaSA9XG4gICAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gICAgb2ZfcmV2X2xpc3QgbFxuXG5cbiAgbGV0IG1hcF90b19hcnJheSBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsID0gMCB0aGVuIFt8IHxdIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gQXJyYXkubWFrZSBsIChmICh1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgICAgQXJyYXkudW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG5cbiAgbGV0IG1hcF9mcm9tX2FycmF5IGYgYSA9XG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIChBcnJheS51bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbmVuZFxuXG5tb2R1bGUgQXJyYXlMYWJlbHMgPSBBcnJheVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9mbG9hdF9jb21wYXJlIiwiY2FtbF9mbG9hdGFycmF5X2JsaXQiLCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlIiwiY2FtbF9oYXNoIiwiY2FtbF9tYWtlX3ZlY3QiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX25leHRhZnRlcl9mbG9hdCIsImNhbWxfc2lnbmJpdF9mbG9hdCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU2VxIiwiU3RkbGliX0xpc3QiLCJBc3NlcnRfZmFpbHVyZSIsIlN0ZGxpYiIsImluZmluaXR5IiwibmVnX2luZmluaXR5IiwibmFuIiwiaXNfZmluaXRlIiwieCIsImlzX2luZmluaXRlIiwiaXNfbmFuIiwibWF4X2Zsb2F0IiwibWluX2Zsb2F0IiwiZXBzaWxvbiIsIm9mX3N0cmluZ19vcHQiLCJ0b19zdHJpbmciLCJpc19pbnRlZ2VyIiwic3VjYyIsInByZWQiLCJlcXVhbCIsInkiLCJtaW4iLCJtYXgiLCJtaW5fbWF4IiwibWluX251bSIsIm1heF9udW0iLCJtaW5fbWF4X251bSIsInNlZWRlZF9oYXNoIiwic2VlZCIsImhhc2giLCJ1bnNhZmVfZmlsbCIsImEiLCJvZnMiLCJsZW4iLCJ2IiwiaSIsImNoZWNrIiwibXNnIiwibWFrZSIsIm4iLCJyZXN1bHQiLCJpbml0IiwibCIsInJlcyIsIm1ha2VfbWF0cml4Iiwic3giLCJzeSIsImluaXRfbWF0cml4Iiwicm93IiwiYXBwZW5kIiwiYTIiLCJsMSIsImwyIiwiY3N0X2Zsb2F0X21sIiwiY29uY2F0IiwiYWNjIiwicGFyYW0iLCJ0bCIsImhkIiwiaGxlbiIsInN1YiIsImNvcHkiLCJmaWxsIiwiYmxpdCIsInNyYyIsInNvZnMiLCJkc3QiLCJkb2ZzIiwiY3N0X0Zsb2F0X2FycmF5X2JsaXQiLCJ0b19saXN0Iiwib2ZfbGlzdCIsInQiLCJoIiwiaXRlciIsIml0ZXIyIiwiYiIsIm1hcCIsInIiLCJtYXBfaW5wbGFjZSIsIm1hcDIiLCJsYSIsImxiIiwiaXRlcmkiLCJtYXBpIiwibWFwaV9pbnBsYWNlIiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImV4aXN0cyIsInAiLCJmb3JfYWxsIiwibWVtIiwibWVtX2llZWUiLCJmaW5kX29wdCIsImZpbmRfaW5kZXgiLCJmaW5kX21hcCIsImZpbmRfbWFwaSIsIkJvdHRvbSIsInNvcnQiLCJjbXAiLCJtYXhzb24iLCJpMzEiLCJlIiwiaiIsImV4biIsImZhdGhlciIsInN0YWJsZV9zb3J0IiwibWVyZ2UiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiIsInMxIiwiaTEiLCJpMiIsImQiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwic2h1ZmZsZSIsInJhbmQiLCJ0b19zZXEiLCJhdXgiLCJ0b19zZXFpIiwib2Zfc2VxIiwibWFwX3RvX2FycmF5IiwibWFwX2Zyb21fYXJyYXkiLCJTdGRsaWJfRmxvYXQiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMseUJBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7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QUFBQTtBQUFBLFNBQUExQyxJQUFBO0FBQUE7QUFBQSxNQUNpQjtBQUFBLGNBQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUUzQztBQUFBLEdBQUM7QUFBQTtBQUFBLElBQUFnRztBQUFBQSxNQXJrQnVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkRyQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdDcUM0RDtBQUFBO0FBQUEsRURyQzVEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTU5OTMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvaW50MzIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbSW50MzJdOiAzMi1iaXQgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnIDogaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9uZWdcIlxuZXh0ZXJuYWwgYWRkIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hZGRcIlxuZXh0ZXJuYWwgc3ViIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9zdWJcIlxuZXh0ZXJuYWwgbXVsIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tdWxcIlxuZXh0ZXJuYWwgZGl2IDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9kaXZcIlxuZXh0ZXJuYWwgcmVtIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hbmRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX29yXCJcbmV4dGVybmFsIGxvZ3hvciA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2xzclwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogaW50MzIgLT4gaW50ID0gXCIlaW50MzJfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IGludDMyIC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDMyX3RvX2Zsb2F0XCIgXCJjYW1sX2ludDMyX3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQzMiAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCB6ZXJvID0gMGxcbmxldCBvbmUgPSAxbFxubGV0IG1pbnVzX29uZSA9IC0xbFxubGV0IHN1Y2MgbiA9IGFkZCBuIDFsXG5sZXQgcHJlZCBuID0gc3ViIG4gMWxcbmxldCBhYnMgbiA9IGlmIG4gPj0gMGwgdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBtaW5faW50ID0gMHg4MDAwMDAwMGxcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRmxcbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMWwpXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBtYXRjaCBTeXMud29yZF9zaXplIHdpdGhcbiAgfCAzMiAtPlxuICAgICAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgICAgIGZ1biBuIC0+XG4gICAgICAgIGlmIG4gPj0gMGwgJiYgbiA8PSBtYXhfaW50IHRoZW5cbiAgICAgICAgICBTb21lICh0b19pbnQgbilcbiAgICAgICAgZWxzZVxuICAgICAgICAgIE5vbmVcbiAgfCA2NCAtPlxuICAgICAgKCogU28gdGhhdCBpdCBjb21waWxlcyBpbiAzMi1iaXQgKilcbiAgICAgIGxldCBtYXNrID0gMHhGRkZGIGxzbCAxNiBsb3IgMHhGRkZGIGluXG4gICAgICBmdW4gbiAtPiBTb21lICh0b19pbnQgbiBsYW5kIG1hc2spXG4gIHwgXyAtPlxuICAgICAgYXNzZXJ0IGZhbHNlXG5cbmV4dGVybmFsIGZvcm1hdCA6IHN0cmluZyAtPiBpbnQzMiAtPiBzdHJpbmcgPSBcImNhbWxfaW50MzJfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50MzIgPSBcImNhbWxfaW50MzJfb2Zfc3RyaW5nXCJcblxubGV0IG9mX3N0cmluZ19vcHQgcyA9XG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBpbnQzMlxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IHggPSB5XG5cbmxldCB1bnNpZ25lZF9jb21wYXJlIG4gbSA9XG4gIGNvbXBhcmUgKHN1YiBuIG1pbl9pbnQpIChzdWIgbSBtaW5faW50KVxuXG5sZXQgdW5zaWduZWRfbHQgbiBtID1cbiAgc3ViIG4gbWluX2ludCA8IHN1YiBtIG1pbl9pbnRcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lIGJpdG5lc3MuXG4gICBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfbHQgbiBkIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9sdCByIGQgdGhlbiBxIGVsc2Ugc3VjYyBxXG5cbmxldCB1bnNpZ25lZF9yZW0gbiBkID1cbiAgc3ViIG4gKG11bCAodW5zaWduZWRfZGl2IG4gZCkgZClcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCAwIHhcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ncmVhdGVyZXF1YWwiLCJjYW1sX2hhc2giLCJjYW1sX2ludF9jb21wYXJlIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tdWwiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWIiLCJTdGRsaWJfU3lzIiwiQXNzZXJ0X2ZhaWx1cmUiLCJzdWNjIiwibiIsInByZWQiLCJhYnMiLCJsb2dub3QiLCJtYXRjaCIsIm1heF9pbnQiLCJ1bnNpZ25lZF90b19pbnQiLCJ0b19zdHJpbmciLCJvZl9zdHJpbmdfb3B0IiwicyIsImV4biIsImVxdWFsIiwidW5zaWduZWRfY29tcGFyZSIsIm0iLCJ5IiwieCIsInVuc2lnbmVkX2x0IiwibWluIiwibWF4IiwiemVybyIsIm9uZSIsInVuc2lnbmVkX2RpdiIsImQiLCJxIiwiciIsInVuc2lnbmVkX3JlbSIsInNlZWRlZF9oYXNoIiwic2VlZCIsImhhc2giLCJTdGRsaWJfSW50MzIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDK0NxQjtBQUFBLFlBQUFDLEtBQUFELEdBQ0E7QUFBQSxZQUFBRSxJQUFBRixHQUNOLDRDQUF5QjtBQUFBLFlBQUFHLE9BQUFILEdBR1g7QUFBQSxPQUFBSSxRRHBEN0I7QUFBQTtBQUFBO0FBQUEsS0FBQUMsVUN5RG9CO0FBQUEsS0FBQUM7QUFBQUEsT0FDZCxTQUFBTjtBQUFBQSxRQUNLLDhCQUFXO0FBQUEsU0FDWjtBQUFBLFFBRUE7QUFBQSxPQUFJO0FBQUE7QUFBQSxJRDlEZDtBQUFBLEtDb0VNO0FBQUE7QUFBQSxRQUFBTSxrQkFGQSxTQUFBTixHQUFTLG1CQUF5QjtBQUFBO0FBQUEsWUFBQU8sVUFBQVAsR0FLdEIsdUNBQWE7QUFBQSxZQUFBUSxjQUFBQztBQUFBQSxJQUs3QixZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTUQ1RVg7QUFBQSw4QkM2RW9CO0FBQUEsS0Q3RXBCO0FBQUE7QUFBQSxHQzZFd0I7QUFBQSxPQUFBQyxRRDdFeEI7QUFBQSxZQUFBQyxpQkFBQVosR0FBQWE7QUFBQUEsUUFBQUMsSUNxRjBCLG9CQUFBQyxJQUFoQjtBQUFBLElBSmtCLDZCQUlhO0FBQUE7QUFBQSxZQUFBQyxZQUFBaEIsR0FBQWE7QUFBQUEsSUFHdkMsNERBQTZCO0FBQUE7QUFBQSxZQUFBSSxJQUFBRixHQUFBRCxHQUVWLG1DQUFvQjtBQUFBLFlBQUFJLElBQUFILEdBQUFELEdBQ3BCLHNDQUFvQjtBQUFBLE9BQUFLLE9EM0Z6QyxHQUFBQyxNQUFBO0FBQUEsWUFBQUMsYUFBQXJCLEdBQUFzQjtBQUFBQSxJQ2lHSyx3QkFDRSxxQ0FJa0M7QUFBQSxRQUFBQyxJQUZsQix1Q0FBQUMsSUFDTDtBQUFBLElBQ1gsd0NBQWtDO0FBQUE7QUFBQSxZQUFBQyxhQUFBekIsR0FBQXNCO0FBQUFBLElBRzVCLFdBQUwsU0FBSywwQkFBcUI7QUFBQTtBQUFBLFlBQUFJLFlBQUFDLE1BQUFaLEdBSVQsa0NBQStCO0FBQUEsWUFBQWEsS0FBQWIsR0FDM0MsK0JBQTRCO0FBQUE7QUFBQSxJQUFBYztBQUFBQSxNRDlHekMiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxNjA5MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbnQ2NC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtJbnQ2NF06IDY0LWJpdCBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWcgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X25lZ1wiXG5leHRlcm5hbCBhZGQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FkZFwiXG5leHRlcm5hbCBzdWIgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X3N1YlwiXG5leHRlcm5hbCBtdWwgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X211bFwiXG5leHRlcm5hbCBkaXYgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2RpdlwiXG5leHRlcm5hbCByZW0gOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X21vZFwiXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FuZFwiXG5leHRlcm5hbCBsb2dvciA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfbHNyXCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQgOiBpbnQ2NCAtPiBpbnQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9vZl9mbG9hdFwiIFwiY2FtbF9pbnQ2NF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfdG9fZmxvYXRcIiBcImNhbWxfaW50NjRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMiA6IGludDMyIC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzIgOiBpbnQ2NCAtPiBpbnQzMiA9IFwiJWludDY0X3RvX2ludDMyXCJcbmV4dGVybmFsIG9mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX25hdGl2ZWludFwiXG5leHRlcm5hbCB0b19uYXRpdmVpbnQgOiBpbnQ2NCAtPiBuYXRpdmVpbnQgPSBcIiVpbnQ2NF90b19uYXRpdmVpbnRcIlxuXG5sZXQgemVybyA9IDBMXG5sZXQgb25lID0gMUxcbmxldCBtaW51c19vbmUgPSAtMUxcbmxldCBzdWNjIG4gPSBhZGQgbiAxTFxubGV0IHByZWQgbiA9IHN1YiBuIDFMXG5sZXQgYWJzIG4gPSBpZiBuID49IDBMIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgbWluX2ludCA9IDB4ODAwMDAwMDAwMDAwMDAwMExcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGTFxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xTClcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gIGZ1biBuIC0+XG4gICAgaWYgbiA+PSAwTCAmJiBuIDw9IG1heF9pbnQgdGhlblxuICAgICAgU29tZSAodG9faW50IG4pXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gaW50NjQgLT4gc3RyaW5nID0gXCJjYW1sX2ludDY0X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDY0ID0gXCJjYW1sX2ludDY0X29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50NjRfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbnR5cGUgdCA9IGludDY0XG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmxldCBlcXVhbCAoeDogdCkgKHk6IHQpID0geCA9IHlcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCB1bnNpZ25lZF9sdCBuIG0gPVxuICBzdWIgbiBtaW5faW50IDwgc3ViIG0gbWluX2ludFxuXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuKCogVW5zaWduZWQgZGl2aXNpb24gZnJvbSBzaWduZWQgZGl2aXNpb24gb2YgdGhlIHNhbWUgYml0bmVzcy5cbiAgIFNlZSBXYXJyZW4gSnIuLCBIZW5yeSBTLiAoMjAxMykuIEhhY2tlcidzIERlbGlnaHQgKDIgZWQuKSwgU2VjIDktMy5cbiopXG5sZXQgdW5zaWduZWRfZGl2IG4gZCA9XG4gIGlmIGQgPCB6ZXJvIHRoZW5cbiAgICBpZiB1bnNpZ25lZF9sdCBuIGQgdGhlbiB6ZXJvIGVsc2Ugb25lXG4gIGVsc2VcbiAgICBsZXQgcSA9IHNoaWZ0X2xlZnQgKGRpdiAoc2hpZnRfcmlnaHRfbG9naWNhbCBuIDEpIGQpIDEgaW5cbiAgICBsZXQgciA9IHN1YiBuIChtdWwgcSBkKSBpblxuICAgIGlmIHVuc2lnbmVkX2x0IHIgZCB0aGVuIHEgZWxzZSBzdWNjIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2dyZWF0ZXJlcXVhbCIsImNhbWxfaGFzaCIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9jb21wYXJlIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X211bCIsImNhbWxfaW50NjRfc3ViIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsInplcm8iLCJvbmUiLCJtaW51c19vbmUiLCJtaW5faW50IiwibWF4X2ludCIsIlN0ZGxpYiIsInN1Y2MiLCJuIiwicHJlZCIsImFicyIsImxvZ25vdCIsInVuc2lnbmVkX3RvX2ludCIsInRvX3N0cmluZyIsIm9mX3N0cmluZ19vcHQiLCJzIiwiZXhuIiwiY29tcGFyZSIsIngiLCJ5IiwiZXF1YWwiLCJ1bnNpZ25lZF9jb21wYXJlIiwibSIsInVuc2lnbmVkX2x0IiwibWluIiwibWF4IiwidW5zaWduZWRfZGl2IiwiZCIsInEiLCJyIiwidW5zaWduZWRfcmVtIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsNkJBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxNQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDNkNhLDJCQUFRO0FBQUEsWUFBQUMsS0FBQUQsR0FDUiwyQkFBUTtBQUFBLFlBQUFFLElBQUFGO0FBQUFBLElBQ04scUNBQW9CLHlCQUFLO0FBQUE7QUFBQSxZQUFBRyxPQUFBSCxHQUd6QixtQ0FBYztBQUFBO0FBQUEsSUFBQUgsWUFHYjtBQUFBLFFBQ2Q7QUFBQSxZQUFBTyxnQkFBQUo7QUFBQUEsSUFDSyw4QkFBVztBQUFBLEtBQ1o7QUFBQSxJQUVBO0FBQUEsR0FBSTtBQUFBLFlBQUFLLFVBQUFMLEdBR1EseUNBQWE7QUFBQSxZQUFBTSxjQUFBQztBQUFBQSxJQUs3QixZQUFTO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsTURsRVg7QUFBQSw4QkNtRW9CO0FBQUEsS0RuRXBCO0FBQUE7QUFBQSxHQ21Fd0I7QUFBQSxZQUFBQyxRQUFBQyxHQUFBQyxHQVdJLCtCQUFrQjtBQUFBLE9BQUFDLFFBeEI1QztBQUFBLFlBQUFDLGlCQUFBYixHQUFBYztBQUFBQSxRQUFBSCxJQTRCd0IsNEJBQUFELElBQWhCO0FBQUEsSUFKa0IsK0JBSWE7QUFBQTtBQUFBLFlBQUFLLFlBQUFmLEdBQUFjO0FBQUFBLElBR3ZDO0FBQUEseUNBQWdCLDJCQUFhO0FBQUE7QUFBQSxZQUFBRSxJQUFBTixHQUFBQyxHQUVWLG1DQUFvQjtBQUFBLFlBQUFNLElBQUFQLEdBQUFDLEdBQ3BCLHNDQUFvQjtBQUFBLFlBQUFPLGFBQUFsQixHQUFBbUI7QUFBQUEsSUFNcEMsMkJBQ0UscUNBSWtDO0FBQUE7QUFBQSxLQUFBQztBQUFBQSxPQUY3QjtBQUFBLFNBQVc7QUFBQSxXQUFLO0FBQUE7QUFBQSxLQUFBQyxJQUNoQixrQkFBTTtBQUFBLElBQ1gsK0JBdERNLG9CQXNENEI7QUFBQTtBQUFBLFlBQUFDLGFBQUF0QixHQUFBbUI7QUFBQUEsSUFHNUIsT0FBWCxrQkFBTSxlQUFLLHVCQUFxQjtBQUFBO0FBQUEsWUFBQUksWUFBQUMsTUFBQWQsR0FJVCxrQ0FBK0I7QUFBQSxZQUFBZSxLQUFBZixHQUMzQywrQkFBNEI7QUFBQSxHQXJEdkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEdERGIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTYxOTksImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvbmF0aXZlaW50Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW05hdGl2ZWludF06IHByb2Nlc3Nvci1uYXRpdmUgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X25lZ1wiXG5leHRlcm5hbCBhZGQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FkZFwiXG5leHRlcm5hbCBzdWI6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X3N1YlwiXG5leHRlcm5hbCBtdWw6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X211bFwiXG5leHRlcm5hbCBkaXY6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2RpdlwiXG5leHRlcm5hbCByZW06IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X21vZFwiXG5leHRlcm5hbCBsb2dhbmQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FuZFwiXG5leHRlcm5hbCBsb2dvcjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNsXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0OiBuYXRpdmVpbnQgLT4gaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNyXCJcbmV4dGVybmFsIG9mX2ludDogaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50OiBuYXRpdmVpbnQgLT4gaW50ID0gXCIlbmF0aXZlaW50X3RvX2ludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IG5hdGl2ZWludFxuICA9IFwiY2FtbF9uYXRpdmVpbnRfb2ZfZmxvYXRcIiBcImNhbWxfbmF0aXZlaW50X29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBuYXRpdmVpbnQgLT4gZmxvYXRcbiAgPSBcImNhbWxfbmF0aXZlaW50X3RvX2Zsb2F0XCIgXCJjYW1sX25hdGl2ZWludF90b19mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG9mX2ludDMyOiBpbnQzMiAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzI6IG5hdGl2ZWludCAtPiBpbnQzMiA9IFwiJW5hdGl2ZWludF90b19pbnQzMlwiXG5cbmxldCB6ZXJvID0gMG5cbmxldCBvbmUgPSAxblxubGV0IG1pbnVzX29uZSA9IC0xblxubGV0IHN1Y2MgbiA9IGFkZCBuIDFuXG5sZXQgcHJlZCBuID0gc3ViIG4gMW5cbmxldCBhYnMgbiA9IGlmIG4gPj0gMG4gdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBzaXplID0gU3lzLndvcmRfc2l6ZVxubGV0IG1pbl9pbnQgPSBzaGlmdF9sZWZ0IDFuIChzaXplIC0gMSlcbmxldCBtYXhfaW50ID0gc3ViIG1pbl9pbnQgMW5cbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMW4pXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBsZXQgbWF4X2ludCA9IG9mX2ludCBTdGRsaWIubWF4X2ludCBpblxuICBmdW4gbiAtPlxuICAgIGlmIG4gPj0gMG4gJiYgbiA8PSBtYXhfaW50IHRoZW5cbiAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IG5hdGl2ZWludCAtPiBzdHJpbmcgPSBcImNhbWxfbmF0aXZlaW50X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nOiBzdHJpbmcgLT4gbmF0aXZlaW50ID0gXCJjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgdHJ5IFNvbWUgKG9mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbnR5cGUgdCA9IG5hdGl2ZWludFxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IHVuc2lnbmVkX2x0IG4gbSA9XG4gIHN1YiBuIG1pbl9pbnQgPCBzdWIgbSBtaW5faW50XG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZSBiaXRuZXNzLlxuICAgU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2x0IG4gZCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfbHQgciBkIHRoZW4gcSBlbHNlIHN1Y2MgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZ3JlYXRlcmVxdWFsIiwiY2FtbF9oYXNoIiwiY2FtbF9pbnRfY29tcGFyZSIsImNhbWxfbGVzc2VxdWFsIiwiY2FtbF9sZXNzdGhhbiIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbXVsIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImdsb2JhbF9kYXRhIiwiU3RkbGliIiwiU3RkbGliX1N5cyIsInN1Y2MiLCJuIiwicHJlZCIsImFicyIsInNpemUiLCJtaW5faW50IiwibWF4X2ludCIsImxvZ25vdCIsInVuc2lnbmVkX3RvX2ludCIsInRvX3N0cmluZyIsIm9mX3N0cmluZ19vcHQiLCJzIiwiZXhuIiwiZXF1YWwiLCJ4IiwieSIsInVuc2lnbmVkX2NvbXBhcmUiLCJtIiwidW5zaWduZWRfbHQiLCJtaW4iLCJtYXgiLCJ6ZXJvIiwib25lIiwidW5zaWduZWRfZGl2IiwiZCIsInEiLCJyIiwidW5zaWduZWRfcmVtIiwic2VlZGVkX2hhc2giLCJzZWVkIiwiaGFzaCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLFlBQUFDLEtBQUFDLEdDMkNxQjtBQUFBLFlBQUFDLEtBQUFELEdBQ0E7QUFBQSxZQUFBRSxJQUFBRixHQUNOLDRDQUF5QjtBQUFBO0FBQUEsSUFBQUcsT0Q3Q3hDO0FBQUEsSUFBQUMsVUMrQ2M7QUFBQSxJQUFBQyxVQUNBO0FBQUEsWUFBQUMsT0FBQU4sR0FDZTtBQUFBLE9BQUFLLFlBR2I7QUFBQSxZQUFBRSxnQkFBQVA7QUFBQUEsSUFFVCw4QkFBVyw4QkFDWjtBQUFBLElBRUE7QUFBQSxHQUFJO0FBQUEsWUFBQVEsVUFBQVIsR0FHUSx1Q0FBYTtBQUFBLFlBQUFTLGNBQUFDO0FBQUFBLElBSzdCLFlBQVM7QUFBQSxVQUFBQztBQUFBQSxTQUFBQSxNRGpFWDtBQUFBLDhCQ2tFb0I7QUFBQSxLRGxFcEI7QUFBQTtBQUFBLEdDa0V3QjtBQUFBLFlBQUFDLE1BQUFDLEdBQUFDLEdBSUksMkNBQ1MsQ0FBSTtBQUFBLFlBQUFDLGlCQUFBZixHQUFBZ0I7QUFBQUEsUUFBQUYsSUFHZixpQkFBQUQsSUFBaEI7QUFBQSxJQUprQiw2QkFJYTtBQUFBO0FBQUEsWUFBQUksWUFBQWpCLEdBQUFnQjtBQUFBQSxJQUd2QyxzREFBNkI7QUFBQTtBQUFBLFlBQUFFLElBQUFMLEdBQUFDLEdBRVYsbUNBQW9CO0FBQUEsWUFBQUssSUFBQU4sR0FBQUMsR0FDcEIsc0NBQW9CO0FBQUEsT0FBQU0sT0RoRnpDLEdBQUFDLE1BQUE7QUFBQSxZQUFBQyxhQUFBdEIsR0FBQXVCO0FBQUFBLElDc0ZLLHdCQUNFLHFDQUlrQztBQUFBLFFBQUFDLElBRmxCLHVDQUFBQyxJQUNMO0FBQUEsSUFDWCx3Q0FBa0M7QUFBQTtBQUFBLFlBQUFDLGFBQUExQixHQUFBdUI7QUFBQUEsSUFHNUIsV0FBTCxTQUFLLDBCQUFxQjtBQUFBO0FBQUEsWUFBQUksWUFBQUMsTUFBQWYsR0FJVCxrQ0FBK0I7QUFBQSxZQUFBZ0IsS0FBQWhCLEdBQzNDLCtCQUE0QjtBQUFBLEdBOUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRHJERiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjE2MjkwLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2J1ZmZlci5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgIFBpZXJyZSBXZWlzIGFuZCBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTkgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogRXh0ZW5zaWJsZSBidWZmZXJzICopXG5cbigqIFRoZSBbaW5uZXJfYnVmZmVyXSB0eXBlIGVuc3VyZXMgdGhhdCB0aGUgW2xlbmd0aF0gYW5kIFtidWZmZXJdIGZpZWxkcyBhcmVcbiAgIGFsd2F5cyBzeW5jaHJvbml6ZWQsIFtsZW5ndGggPSBCeXRlcy5sZW5ndGggYnVmZmVyXSwgZXZlbiBpbiBwcmVzZW5jZVxuICAgb2YgZGF0YSByYWNlcy5cbiopXG50eXBlIGlubmVyX2J1ZmZlciA9IHtcbiAgYnVmZmVyOiBieXRlcztcbiAgbGVuZ3RoOiBpbnQ7XG59XG5cbnR5cGUgdCA9XG4ge211dGFibGUgaW5uZXIgOiBpbm5lcl9idWZmZXI7XG4gIG11dGFibGUgcG9zaXRpb24gOiBpbnQ7XG4gIGluaXRpYWxfYnVmZmVyIDogYnl0ZXN9XG4oKiBJbnZhcmlhbnRzOiBhbGwgcGFydHMgb2YgdGhlIGNvZGUgcHJlc2VydmUgdGhlIGludmFyaWFudHMgdGhhdDpcbiAgIC0gW2lubmVyLmxlbmd0aCA9IEJ5dGVzLmxlbmd0aCBpbm5lci5idWZmZXJdXG4gICBJbiBhYnNlbmNlIG9mIGRhdGEgcmFjZXMsIHdlIGFsc28gaGF2ZVxuICAgLSBbMCA8PSBiLnBvc2l0aW9uIDw9IGIuaW5uZXIubGVuZ3RoXVxuXG4gICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBbYi5wb3NpdGlvbiA9IGIuaW5uZXIubGVuZ3RoXSBpcyBsZWdhbCxcbiAgIGl0IG1lYW5zIHRoYXQgdGhlIGJ1ZmZlciBpcyBmdWxsIGFuZCB3aWxsIGhhdmUgdG8gYmUgZXh0ZW5kZWRcbiAgIGJlZm9yZSBhbnkgZnVydGhlciBhZGRpdGlvbi4gKilcblxubGV0IGNyZWF0ZSBuID1cbiBsZXQgbiA9IGlmIG4gPCAxIHRoZW4gMSBlbHNlIG4gaW5cbiBsZXQgbiA9IGlmIG4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiBTeXMubWF4X3N0cmluZ19sZW5ndGggZWxzZSBuIGluXG4gbGV0IHMgPSBCeXRlcy5jcmVhdGUgbiBpblxuIHsgaW5uZXIgPSB7IGJ1ZmZlciA9IHM7IGxlbmd0aCA9IG59OyBwb3NpdGlvbiA9IDA7IGluaXRpYWxfYnVmZmVyID0gc31cblxubGV0IGNvbnRlbnRzIGIgPSBCeXRlcy5zdWJfc3RyaW5nIGIuaW5uZXIuYnVmZmVyIDAgYi5wb3NpdGlvblxubGV0IHRvX2J5dGVzIGIgPSBCeXRlcy5zdWIgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBzdWIgYiBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGIucG9zaXRpb24gLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5zdWJcIlxuICBlbHNlIEJ5dGVzLnN1Yl9zdHJpbmcgYi5pbm5lci5idWZmZXIgb2ZzIGxlblxuXG5cbmxldCBibGl0IHNyYyBzcmNvZmYgZHN0IGRzdG9mZiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IHNyY29mZiA8IDAgfHwgc3Jjb2ZmID4gc3JjLnBvc2l0aW9uIC0gbGVuXG4gICAgICAgICAgICAgfHwgZHN0b2ZmIDwgMCB8fCBkc3RvZmYgPiAoQnl0ZXMubGVuZ3RoIGRzdCkgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5ibGl0XCJcbiAgZWxzZVxuICAgIEJ5dGVzLmJsaXQgc3JjLmlubmVyLmJ1ZmZlciBzcmNvZmYgZHN0IGRzdG9mZiBsZW5cblxuXG5sZXQgbnRoIGIgb2ZzID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBpZiBvZnMgPCAwIHx8IG9mcyA+PSBwb3NpdGlvbiB8fCBwb3NpdGlvbiA+IGxlbmd0aCB0aGVuXG4gICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5udGhcIlxuICBlbHNlIEJ5dGVzLnVuc2FmZV9nZXQgYnVmZmVyIG9mc1xuXG5cbmxldCBsZW5ndGggYiA9IGIucG9zaXRpb25cblxubGV0IGNsZWFyIGIgPSBiLnBvc2l0aW9uIDwtIDBcblxubGV0IHJlc2V0IGIgPVxuICBiLnBvc2l0aW9uIDwtIDA7XG4gIGxldCBpbm5lciA9XG4gICAgeyBidWZmZXIgPSBiLmluaXRpYWxfYnVmZmVyOyBsZW5ndGggPSBCeXRlcy5sZW5ndGggYi5pbml0aWFsX2J1ZmZlciB9XG4gIGluXG4gIGIuaW5uZXIgPC0gaW5uZXJcblxuKCogW3Jlc2l6ZSBiIG1vcmVdIGVuc3VyZXMgdGhhdCBbYi5wb3NpdGlvbiArIG1vcmUgPD0gYi5pbm5lci5sZW5ndGhdIGhvbGRzXG4gICBieSBkeW5hbWljYWxseSBleHRlbmRpbmcgW2IuaW5uZXJdIGlmIG5lY2Vzc2FyeSAtLSBhbmQgdGh1c1xuICAgaW5jcmVhc2luZyBbYi5pbm5lci5sZW5ndGhdLlxuKilcbmxldCByZXNpemUgYiBtb3JlID1cbiAgbGV0IG9sZF9wb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCBvbGRfbGVuID0gYi5pbm5lci5sZW5ndGggaW5cbiAgbGV0IG5ld19sZW4gPSByZWYgb2xkX2xlbiBpblxuICB3aGlsZSBvbGRfcG9zICsgbW9yZSA+ICFuZXdfbGVuIGRvIG5ld19sZW4gOj0gMiAqICFuZXdfbGVuIGRvbmU7XG4gIGlmICFuZXdfbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gYmVnaW5cbiAgICBpZiBvbGRfcG9zICsgbW9yZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICB0aGVuIG5ld19sZW4gOj0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgZWxzZSBmYWlsd2l0aCBcIkJ1ZmZlci5hZGQ6IGNhbm5vdCBncm93IGJ1ZmZlclwiXG4gIGVuZDtcbiAgbGV0IG5ld19idWZmZXIgPSBCeXRlcy5jcmVhdGUgIW5ld19sZW4gaW5cbiAgKCogUFIjNjE0ODogbGV0J3Mga2VlcCB1c2luZyBbYmxpdF0gcmF0aGVyIHRoYW4gW3Vuc2FmZV9ibGl0XSBpblxuICAgICB0aGlzIHRyaWNreSBmdW5jdGlvbiB0aGF0IGlzIHNsb3cgYW55d2F5LiAqKVxuICBCeXRlcy5ibGl0IGIuaW5uZXIuYnVmZmVyIDAgbmV3X2J1ZmZlciAwIGIucG9zaXRpb247XG4gIGIuaW5uZXIgPC0geyBidWZmZXIgPSBuZXdfYnVmZmVyOyBsZW5ndGggPSAhbmV3X2xlbiB9XG5cbigqIE5vdGU6XG4gICAgU29tZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGhhdmUgYSBmYXN0IHBhdGggd2hlbiB0aGUgaW5uZXJcbiAgYnVmZmVyIGRvZXNuJ3QgbmVlZCB0byBiZSBleHRlbmRlZC5cbiAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB1bnNhZmUgYWNjZXNzZXMgb24gdGhlXG4gIGNvbnRlbnRzIG9mIHRoZSBbaW5uZXJdIGZpZWxkIHNpbmNlIGl0cyBmaWVsZHMgYXJlIGltbXV0YWJsZS5cbiAgSW4gcHJlc2VuY2Ugb2YgZGF0YSByYWNlcywgd2UgbWF5IGFjY2VzcyB0aGUgd3JvbmcgaW5uZXIgYnVmZmVyLCBidXQgd2VcbiAgd2lsbCB1c2UgdGhpcyBidWZmZXIgc2FmZWx5LlxuICBBcyBzb29uIGFzIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBidWZmZXIsIHdlIGZhbGwgYmFjayB0byBzYWZlIGFjY2Vzc2VzLlxuKilcblxubGV0IGFkZF9jaGFyIGIgYyA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyO2xlbmd0aH0gPSBiLmlubmVyIGluXG4gIGlmIHBvcyA+PSBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMTtcbiAgICBCeXRlcy5zZXQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBjXG4gICkgZWxzZVxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgYnVmZmVyIHBvcyBjO1xuICBiLnBvc2l0aW9uIDwtIHBvcyArIDFcblxubGV0IHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heCA9IDRcbmxldCB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4ID0gNFxuXG5sZXQgcmVjIGFkZF91dGZfOF91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl84X3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl84X3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgcmVjIGFkZF91dGZfMTZiZV91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfMTZiZV91Y2hhciBiLmlubmVyLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzE2YmVfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCByZWMgYWRkX3V0Zl8xNmxlX3VjaGFyIGIgdSA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGlmIHBvcyA+PSBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl8xNmxlX3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfMTZsZV91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IGFkZF9zdWJzdHJpbmcgYiBzIG9mZnNldCBsZW4gPVxuICBpZiBvZmZzZXQgPCAwIHx8IGxlbiA8IDAgfHwgb2Zmc2V0ID4gU3RyaW5nLmxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX3N1YnN0cmluZy9hZGRfc3ViYnl0ZXNcIjtcbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyBsZW4gaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIGxlbjtcbiAgICBCeXRlcy5ibGl0X3N0cmluZyBzIG9mZnNldCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlblxuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyBvZmZzZXQgYnVmZmVyIHBvc2l0aW9uIGxlbjtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9zdWJieXRlcyBiIHMgb2Zmc2V0IGxlbiA9XG4gIGFkZF9zdWJzdHJpbmcgYiAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzKSBvZmZzZXQgbGVuXG5cbmxldCBhZGRfc3RyaW5nIGIgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjsgbGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiBsZW47XG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcyAwIGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gbGVuO1xuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyAwIGJ1ZmZlciBwb3NpdGlvbiBsZW47XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfYnl0ZXMgYiBzID0gYWRkX3N0cmluZyBiIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHMpXG5cbmxldCBhZGRfYnVmZmVyIGIgYnMgPVxuICBhZGRfc3ViYnl0ZXMgYiBicy5pbm5lci5idWZmZXIgMCBicy5wb3NpdGlvblxuXG4oKiB0aGlzIChwcml2YXRlKSBmdW5jdGlvbiBjb3VsZCBtb3ZlIGludG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgKilcbmxldCByZWFsbHlfaW5wdXRfdXBfdG8gaWMgYnVmIG9mcyBsZW4gPVxuICBsZXQgcmVjIGxvb3AgaWMgYnVmIH5hbHJlYWR5X3JlYWQgfm9mcyB+dG9fcmVhZCA9XG4gICAgaWYgdG9fcmVhZCA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGlucHV0IGljIGJ1ZiBvZnMgdG9fcmVhZCBpblxuICAgICAgaWYgciA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGFscmVhZHlfcmVhZCA9IGFscmVhZHlfcmVhZCArIHIgaW5cbiAgICAgICAgbGV0IG9mcyA9IG9mcyArIHIgaW5cbiAgICAgICAgbGV0IHRvX3JlYWQgPSB0b19yZWFkIC0gciBpblxuICAgICAgICBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkIH5vZnMgfnRvX3JlYWRcbiAgICAgIGVuZFxuICAgIGVuZFxuICBpbiBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkOjAgfm9mcyB+dG9fcmVhZDpsZW5cblxuXG5sZXQgdW5zYWZlX2FkZF9jaGFubmVsX3VwX3RvIGIgaWMgbGVuID1cbiAgaWYgYi5wb3NpdGlvbiArIGxlbiA+IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgbGVuO1xuICBsZXQgbiA9IHJlYWxseV9pbnB1dF91cF90byBpYyBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlbiBpblxuICBiLnBvc2l0aW9uIDwtIGIucG9zaXRpb24gKyBuO1xuICBuXG5cbmxldCBhZGRfY2hhbm5lbCBiIGljIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gICAoKiBQUiM1MDA0ICopXG4gICAgaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX2NoYW5uZWxcIjtcbiAgbGV0IG4gPSB1bnNhZmVfYWRkX2NoYW5uZWxfdXBfdG8gYiBpYyBsZW4gaW5cbiAgKCogSXQgaXMgaW50ZW50aW9uYWwgdGhhdCBhIGNvbnN1bWVyIGNhdGNoaW5nIEVuZF9vZl9maWxlXG4gICAgIHdpbGwgc2VlIHRoZSBkYXRhIHdyaXR0ZW4gKHNlZSAjNjcxOSwgIzcxMzYpLiAqKVxuICBpZiBuIDwgbGVuIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGU7XG4gICgpXG5cbmxldCBvdXRwdXRfYnVmZmVyIG9jIGIgPVxuICBvdXRwdXQgb2MgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBjbG9zaW5nID0gZnVuY3Rpb25cbiAgfCAnKCcgLT4gJyknXG4gIHwgJ3snIC0+ICd9J1xuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbigqIG9wZW5pbmcgYW5kIGNsb3Npbmc6IG9wZW4gYW5kIGNsb3NlIGNoYXJhY3RlcnMsIHR5cGljYWxseSAoIGFuZCApXG4gICBrOiBiYWxhbmNlIG9mIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnNcbiAgIHM6IHRoZSBzdHJpbmcgd2hlcmUgd2UgYXJlIHNlYXJjaGluZ1xuICAgc3RhcnQ6IHRoZSBpbmRleCB3aGVyZSB3ZSBzdGFydCB0aGUgc2VhcmNoLiAqKVxubGV0IGFkdmFuY2VfdG9fY2xvc2luZyBvcGVuaW5nIGNsb3NpbmcgayBzIHN0YXJ0ID1cbiAgbGV0IHJlYyBhZHZhbmNlIGsgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgICBpZiBzLltpXSA9IG9wZW5pbmcgdGhlbiBhZHZhbmNlIChrICsgMSkgKGkgKyAxKSBsaW0gZWxzZVxuICAgIGlmIHMuW2ldID0gY2xvc2luZyB0aGVuXG4gICAgICBpZiBrID0gMCB0aGVuIGkgZWxzZSBhZHZhbmNlIChrIC0gMSkgKGkgKyAxKSBsaW1cbiAgICBlbHNlIGFkdmFuY2UgayAoaSArIDEpIGxpbSBpblxuICBhZHZhbmNlIGsgc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxubGV0IGFkdmFuY2VfdG9fbm9uX2FscGhhIHMgc3RhcnQgPVxuICBsZXQgcmVjIGFkdmFuY2UgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gbGltIGVsc2VcbiAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgfCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgLT4gYWR2YW5jZSAoaSArIDEpIGxpbVxuICAgIHwgXyAtPiBpIGluXG4gIGFkdmFuY2Ugc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxuKCogV2UgYXJlIGp1c3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBpZGVudCBpbiBzLCBzdGFydGluZyBhdCBzdGFydC4gKilcbmxldCBmaW5kX2lkZW50IHMgc3RhcnQgbGltID1cbiAgaWYgc3RhcnQgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgbWF0Y2ggcy5bc3RhcnRdIHdpdGhcbiAgKCogUGFyZW50aGVzaXplZCBpZGVudCA/ICopXG4gIHwgJygnIHwgJ3snIGFzIGMgLT5cbiAgICAgbGV0IG5ld19zdGFydCA9IHN0YXJ0ICsgMSBpblxuICAgICBsZXQgc3RvcCA9IGFkdmFuY2VfdG9fY2xvc2luZyBjIChjbG9zaW5nIGMpIDAgcyBuZXdfc3RhcnQgaW5cbiAgICAgU3RyaW5nLnN1YiBzIG5ld19zdGFydCAoc3RvcCAtIHN0YXJ0IC0gMSksIHN0b3AgKyAxXG4gICgqIFJlZ3VsYXIgaWRlbnQgKilcbiAgfCBfIC0+XG4gICAgIGxldCBzdG9wID0gYWR2YW5jZV90b19ub25fYWxwaGEgcyBzdGFydCBpblxuICAgICBpZiBzdG9wID0gc3RhcnQgdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICAgICBTdHJpbmcuc3ViIHMgc3RhcnQgKHN0b3AgLSBzdGFydCksIHN0b3BcblxuKCogU3Vic3RpdHV0ZSAkaWRlbnQsICQoaWRlbnQpLCBvciAke2lkZW50fSBpbiBzLFxuICAgIGFjY29yZGluZyB0byB0aGUgZnVuY3Rpb24gbWFwcGluZyBmLiAqKVxubGV0IGFkZF9zdWJzdGl0dXRlIGIgZiBzID1cbiAgbGV0IGxpbSA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIHN1YnN0IHByZXZpb3VzIGkgPVxuICAgIGlmIGkgPCBsaW0gdGhlbiBiZWdpblxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnJCcgYXMgY3VycmVudCB3aGVuIHByZXZpb3VzID0gJ1xcXFwnIC0+XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCAnICcgKGkgKyAxKVxuICAgICAgfCAnJCcgLT5cbiAgICAgICAgIGxldCBqID0gaSArIDEgaW5cbiAgICAgICAgIGJlZ2luIG1hdGNoIGZpbmRfaWRlbnQgcyBqIGxpbSB3aXRoXG4gICAgICAgICB8IGlkZW50LCBuZXh0X2kgLT5cbiAgICAgICAgICAgYWRkX3N0cmluZyBiIChmIGlkZW50KTtcbiAgICAgICAgICAgc3Vic3QgJyAnIG5leHRfaVxuICAgICAgICAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+XG4gICAgICAgICAgIGFkZF9jaGFyIGIgJyQnO1xuICAgICAgICAgICBzdWJzdCAnICcgalxuICAgICAgICAgZW5kXG4gICAgICB8IGN1cnJlbnQgLT5cbiAgICAgICAgIGlmIHByZXZpb3VzID0gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBwcmV2aW91cztcbiAgICAgICAgIGlmIGN1cnJlbnQgPD4gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgY3VycmVudCAoaSArIDEpXG4gICAgZW5kIGVsc2VcbiAgICBpZiBwcmV2aW91cyA9ICdcXFxcJyB0aGVuIGFkZF9jaGFyIGIgcHJldmlvdXMgaW5cbiAgc3Vic3QgJyAnIDBcblxubGV0IHRydW5jYXRlIGIgbGVuID1cbiAgICBpZiBsZW4gPCAwIHx8IGxlbiA+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiQnVmZmVyLnRydW5jYXRlXCJcbiAgICBlbHNlXG4gICAgICBiLnBvc2l0aW9uIDwtIGxlblxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgYWRkX3NlcSBiIHNlcSA9IFNlcS5pdGVyIChhZGRfY2hhciBiKSBzZXFcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGIgPSBjcmVhdGUgMzIgaW5cbiAgYWRkX3NlcSBiIGk7XG4gIGJcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDE2IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQxNnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NHVcIlxuZXh0ZXJuYWwgc2V0X2ludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG5leHRlcm5hbCBzZXRfaW50MTYgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDE2XCJcbmV4dGVybmFsIHNldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMlwiXG5leHRlcm5hbCBzZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjRcIlxuXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5cbmxldCBhZGRfaW50OCBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyAxIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiAxO1xuICAgIHNldF9pbnQ4IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDggYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgMiBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMjtcbiAgICBzZXRfaW50MTYgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MTYgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MzJfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgNCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgNDtcbiAgICBzZXRfaW50MzIgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MzIgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50NjRfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgOCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgODtcbiAgICBzZXRfaW50NjQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50NjQgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbGUgYiB4ID1cbiAgYWRkX2ludDE2X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDE2X2JlIGIgeCA9XG4gIGFkZF9pbnQxNl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwMTYgeClcblxubGV0IGFkZF9pbnQzMl9sZSBiIHggPVxuICBhZGRfaW50MzJfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50MzJfYmUgYiB4ID1cbiAgYWRkX2ludDMyX25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXAzMiB4KVxuXG5sZXQgYWRkX2ludDY0X2xlIGIgeCA9XG4gIGFkZF9pbnQ2NF9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQ2NF9iZSBiIHggPVxuICBhZGRfaW50NjRfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDY0IHgpXG5cbmxldCBhZGRfdWludDggPSBhZGRfaW50OFxubGV0IGFkZF91aW50MTZfbmUgPSBhZGRfaW50MTZfbmVcbmxldCBhZGRfdWludDE2X2xlID0gYWRkX2ludDE2X2xlXG5sZXQgYWRkX3VpbnQxNl9iZSA9IGFkZF9pbnQxNl9iZVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2JsaXRfc3RyaW5nIiwiY2FtbF9ic3dhcDE2IiwiY2FtbF9ieXRlc19nZXQiLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ieXRlc19zZXQ2NCIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQnl0ZXMiLCJTdGRsaWJfU3lzIiwiU3RkbGliX1NlcSIsIlN0ZGxpYiIsIlN0ZGxpYl9TdHJpbmciLCJBc3NlcnRfZmFpbHVyZSIsImR1bW15IiwiY3JlYXRlIiwibiIsInMiLCJjb250ZW50cyIsImIiLCJ0b19ieXRlcyIsInN1YiIsIm9mcyIsImxlbiIsImJsaXQiLCJzcmMiLCJzcmNvZmYiLCJkc3QiLCJkc3RvZmYiLCJudGgiLCJwb3NpdGlvbiIsIm1hdGNoIiwibGVuZ3RoIiwiYnVmZmVyIiwiY2xlYXIiLCJyZXNldCIsImlubmVyIiwicmVzaXplIiwibW9yZSIsIm9sZF9wb3MiLCJvbGRfbGVuIiwibmV3X2xlbiIsIm5ld19idWZmZXIiLCJhZGRfY2hhciIsImMiLCJwb3MiLCJhZGRfdXRmXzhfdWNoYXIiLCJ1IiwidWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4IiwidWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heCIsImFkZF91dGZfMTZiZV91Y2hhciIsImFkZF91dGZfMTZsZV91Y2hhciIsImFkZF9zdWJzdHJpbmciLCJvZmZzZXQiLCJuZXdfcG9zaXRpb24iLCJhZGRfc3ViYnl0ZXMiLCJhZGRfc3RyaW5nIiwiYWRkX2J5dGVzIiwiYWRkX2J1ZmZlciIsImJzIiwiYWRkX2NoYW5uZWwiLCJpYyIsInRvX3JlYWQiLCJidWYiLCJhbHJlYWR5X3JlYWQiLCJyIiwib3V0cHV0X2J1ZmZlciIsIm9jIiwiYWRkX3N1YnN0aXR1dGUiLCJsaW0iLCJwcmV2aW91cyIsImkiLCJzdGFydCIsIm9wZW5pbmciLCJzdG9wIiwidmFsIiwibmV3X3N0YXJ0IiwiY2xvc2luZyIsImsiLCJleG4iLCJuZXh0X2kiLCJpZGVudCIsInRydW5jYXRlIiwidG9fc2VxIiwiYXV4IiwicGFyYW0iLCJ4IiwidG9fc2VxaSIsImFkZF9zZXEiLCJzZXEiLCJvZl9zZXEiLCJhZGRfaW50OCIsImFkZF9pbnQxNl9uZSIsImFkZF9pbnQzMl9uZSIsImFkZF9pbnQ2NF9uZSIsImFkZF9pbnQxNl9sZSIsImFkZF9pbnQxNl9iZSIsImFkZF9pbnQzMl9sZSIsImFkZF9pbnQzMl9iZSIsImFkZF9pbnQ2NF9sZSIsImFkZF9pbnQ2NF9iZSJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHVCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLFlBQUFDLE9BQUFDO0FBQUFBO0FBQUFBLEtBQUFBLE1Dd0NDO0FBQUEsS0FBQUEsTUFDQTtBQUFBLEtBQUFDLElBQ1E7QUFBQSxJQUNSO0FBQUEsR0FBc0U7QUFBQSxZQUFBQyxTQUFBQyxHQUV0RCxtREFBNEM7QUFBQSxZQUFBQyxTQUFBRCxHQUM1QyxtREFBcUM7QUFBQSxZQUFBRSxJQUFBRixHQUFBRyxLQUFBQztBQUFBQSxJQUdwRDtBQUFBLEtBRUssb0RBQXVDO0FBQUEsSUFEdkMseUNBQ3VDO0FBQUE7QUFBQSxZQUFBQyxLQUFBQyxLQUFBQyxRQUFBQyxLQUFBQyxRQUFBTDtBQUFBQSxJQUk1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBSUUsdUVBQWlEO0FBQUEsSUFGOUMsMENBRThDO0FBQUE7QUFBQSxZQUFBTSxJQUFBVixHQUFBRztBQUFBQSxRQUFBUSxXQUluRCxNQUFBQyxRQUNBLE1BQUFDLFNBQUEsVUFBQUMsU0FBQTtBQUFBLElBQ0E7QUFBQSxLQUVLLGlEQUEyQjtBQUFBLElBRC9CLHlDQUMrQjtBQUFBO0FBQUEsWUFBQUQsT0FBQWIsR0FHbkIsWUFBVTtBQUFBLFlBQUFlLE1BQUFmLEdBRVgsbUJBQWU7QUFBQSxZQUFBZ0IsTUFBQWhCO0FBQUFBLElBRzNCO0FBQUEsUUFBQWlCLFFBQ0E7QUFBQSxJQUdBO0FBQUE7QUFBQSxHQUFnQjtBQUFBLFlBQUFDLE9BQUFsQixHQUFBbUI7QUFBQUEsUUFBQUMsVUFPaEIsTUFBQUMsVUFDQSxTQUFBQyxVQUVBO0FBQUE7QUFBQTtBQUFBLEtBQW1DO0FBQUE7QUFBQTtBQUFBLEtBQUFBO0FBQUFBLE9BQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBR087QUFBQTtBQUFBLEtBQUFDLGFBRVU7QUFBQSxJQUdqQjtBQUFBLElBQW1EO0FBQUEsR0FDRTtBQUFBLFlBQUFDLFNBQUF4QixHQUFBeUI7QUFBQUEsUUFBQUMsTUFhckQsTUFBQWQsUUFDQSxNQUFBQyxTQUFBLFVBQUFDLFNBQUE7QUFBQSxJQUNBO0FBQUEsS0FDRTtBQUFBLEtBQ0E7QUFBQTtBQUFBO0FBQUEsS0FFQTtBQUFBLElBQ0Y7QUFBQTtBQUFBLEdBQXFCO0FBQUEsWUFBQWEsZ0JBQUEzQixHQUFBNEI7QUFBQUEsSUFNckI7QUFBQSxTQUFBRixNQUFBLE1BQUFHLDhCRDdIRjtBQUFBLEtDOEhFLG1CQUE4QjtBQUFBLFNBQUFoQyxJQUN0QjtBQUFBLEtBQ1IsWUFFSztBQUFBLEtBREM7QUFBQTtBQUFBLEdBQ3NCO0FBQUEsT0FBQWlDLCtCRGxJOUI7QUFBQSxZQUFBQyxtQkFBQS9CLEdBQUE0QjtBQUFBQSxJQ3FJRTtBQUFBLFNBQUFGLE1BQUE7QUFBQSxLQUNBLG1CQUE4QjtBQUFBLFNBQUE3QixJQUN0QjtBQUFBLEtBQ1IsWUFFSztBQUFBLEtBREM7QUFBQTtBQUFBLEdBQ3NCO0FBQUEsWUFBQW1DLG1CQUFBaEMsR0FBQTRCO0FBQUFBLElBRzVCO0FBQUEsU0FBQUYsTUFBQTtBQUFBLEtBQ0EsbUJBQThCO0FBQUEsU0FBQTdCLElBQ3RCO0FBQUEsS0FDUixZQUVLO0FBQUEsS0FEQztBQUFBO0FBQUEsR0FDc0I7QUFBQSxZQUFBb0MsY0FBQWpDLEdBQUFGLEdBQUFvQyxRQUFBOUI7QUFBQUEsUUFBQSxJQUc1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFDSztBQUFBO0FBQUEsS0FBQU8sV0FDTDtBQUFBLEtBQUFDLFFBQ0E7QUFBQSxLQUFBQyxTQUFBO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUFxQixlQUNBO0FBQUEsSUFDQTtBQUFBLEtBQ0U7QUFBQSxLQUNBO0FBQUE7QUFBQTtBQUFBLEtBRUE7QUFBQSxJQUNGO0FBQUE7QUFBQSxHQUEwQjtBQUFBLFlBQUFDLGFBQUFwQyxHQUFBRixHQUFBb0MsUUFBQTlCO0FBQUFBLElBR1YsT0FBMEIsaUJBQTFCLDRDQUFxQztBQUFBO0FBQUEsWUFBQWlDLFdBQUFyQyxHQUFBRjtBQUFBQTtBQUFBQSxLQUFBTSxNQUdyRDtBQUFBLEtBQUFPLFdBQ0E7QUFBQSxLQUFBQyxRQUNBO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUFDLFNBQUE7QUFBQSxLQUFBcUIsZUFDQTtBQUFBLElBQ0E7QUFBQSxLQUNFO0FBQUEsS0FDQTtBQUFBO0FBQUE7QUFBQSxLQUVBO0FBQUEsSUFDRjtBQUFBO0FBQUEsR0FBMEI7QUFBQSxZQUFBRyxVQUFBdEMsR0FBQUY7QUFBQUEsSUFFSyxPQUEwQixjQUExQiwrQkFBMEI7QUFBQTtBQUFBLFlBQUF5QyxXQUFBdkMsR0FBQXdDLElBR3pELDBDQUE0QztBQUFBLFlBQUFDLFlBQUF6QyxHQUFBMEMsSUFBQUM7QUFBQUEsUUFBQSxJQTBCNUM7QUFBQSxVQUNFO0FBQUEsSUFQRixxQ0FBMEM7QUFBQTtBQUFBLEtBQUF4QyxRQUMxQztBQUFBLEtBQUF5QyxNQUFBO0FBQUEsS0FBQUMsZUFMRztBQUFBLEtBQUExQyxNQUFBO0FBQUEsS0FBQXdDLFVBQUE7QUFBQTtBQUFBLEtBWEQ7QUFBQSxVQUFBRyxJQUVVO0FBQUEsTUFDUjtBQUFBO0FBQUEsUUFBQUQsaUJBQ0s7QUFBQSxRQUFBMUMsUUFFSDtBQUFBLFFBQUF3QyxZQUNBO0FBQUEsT0FDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVNOO0FBQUEsS0FTQTtBQUFBLE1BQWdCO0FBQUEsS0FDaEI7QUFBQTtBQUFBLEdBQUU7QUFBQSxZQUFBSSxjQUFBQyxJQUFBaEQ7QUFBQUEsSUFHRixrREFBcUM7QUFBQTtBQUFBLFdEdE52QztBQUFBLFlBQUFpRCxlQUFBakQsR0FBQWQsR0FBQVk7QUFBQUEsUUFBQW9ELFFDb1FFLDBCQUFBQyxXQXVCQSxJQUFBQyxNQUFBO0FBQUE7QUFBQSxLQXJCRTtBQUFBLGNBb0JBO0FBQUEsaUJBQXdCLHlCQUNmO0FBQUE7QUFBQSxTQUFBRCxhQXBCRDtBQUFBLEtBQUs7QUFBQSxNQUNXO0FBQUEsT0FDbkI7QUFBQSxXQUFBQyxNQUFrQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FBQUMsUUFHbEI7QUFBQSxPQUNBO0FBQUEsUUF6QlAsbUJBQXFCO0FBQUEsWUFBQUMsVUFDZjtBQUFBO0FBQUE7QUFBQSxTQUFTO0FBQUEsY0FBQUosUUFMZiwwQkFBQUUsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBSkU7QUFBQSxpQkFBQXhDLFFBQ007QUFBQSxhQUFLO0FBQUE7QUFBQSxvQ0FBQTJDLFNBQUE7QUFBQTtBQUFBLHdDQUFBQSxTQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0NBQUFBLFNBQUE7QUFBQTtBQUFBLHNDQUFBQSxTQUFBO0FBQUEsaUJBQUFILE1BQ3FDO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQUFHLFNBRmhEO0FBQUE7QUFBQSxXQWtCQztBQUFBLFlBQXFCO0FBQUE7QUFBQSxZQUFBQztBQUFBQSxjQUNZO0FBQUEsZUFBakM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQUFDLFlBUEE7QUFBQSxTQWhDUztBQUFBLGNBQUFDLFVBQ0g7QUFBQTtBQUFBLFVBREc7QUFBQSxXQUdMO0FBQUEsY0FBQUEsVUFERTtBQUFBO0FBQUEsYUFBQVIsTUFjVCwwQkFBQVMsSUFBQSxHQUFBSixPQUFBO0FBQUE7QUFBQSxVQUxFLGdCQUFpQjtBQUFBLFVBQ2Q7QUFBQSxlQUFBSCxJQUFxQixjQUFBTyxNQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBQ3JCO0FBQUEsV0FDRDtBQUFBO0FBQUEsYUFBQUg7QUFBQUEsZUFvQndDO0FBQUEsZ0JBQXpDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQUFBSixNQXBCc0IsY0FBQU8sTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFBUCxNQUNsQjtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQUFRO0FBQUFBLFlBQUFBLE1Edk9UO0FBQUE7QUFBQSxRQ2tSVztBQUFBLFFBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQUFBQyxTQUxoQixRQUFBQyxRQUFBO0FBQUEsT0FFRSxjQUFhO0FBQUEsT0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT3hCLG9CQUF3QjtBQUFBLE1BQ3hCLHNCQUF3QjtBQUFBLFVBQUFWLE1BQ3hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUdJO0FBQUEsWUFBQVcsU0FBQS9ELEdBQUFJO0FBQUFBLElBR1QsNEJBR0U7QUFBQSxJQUZBLDhDQUVpQjtBQUFBO0FBQUEsWUFBQTRELE9BQUFoRTtBQUFBQSxhQUFBaUUsSUFBQWIsR0FBQWM7QUFBQUEsS0FPbkIsY0FBd0I7QUFBQSxTQUFBQyxJQUVkLGdDQUNLO0FBQUEsS0FBUywwQkFBVCxtQkFBUztBQUFBLElBQUM7QUFBQSxJQUUzQixtQkQ3U0Ysa0JDNlNFO0FBQUEsR0FBSztBQUFBLFlBQUFDLFFBQUFwRTtBQUFBQSxhQUFBaUUsSUFBQWIsR0FBQWM7QUFBQUEsS0FLSCxjQUF3QjtBQUFBLFNBQUFDLElBRWQsZ0NBQ1M7QUFBQSxLQUFTLGtDQUFULG1CQUFTO0FBQUEsSUFBQztBQUFBLElBRS9CLG1CRHZURixrQkN1VEU7QUFBQSxHQUFLO0FBQUEsWUFBQUUsUUFBQXJFLEdBQUFzRTtBQUFBQSxJQUVrQyw0Q0FBWiw2QkFBZ0I7QUFBQTtBQUFBLFlBQUFDLE9BQUFuQixPQUFBcEQsSUFHbkMsWUFDUixlQUFXLFNBQ1Y7QUFBQSxZQUFBd0UsU0FBQXhFLEdBQUFtRTtBQUFBQTtBQUFBQSxLQUFBeEQsV0FtQkQ7QUFBQSxLQUFBQyxRQUNBO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUFDLFNBQUE7QUFBQSxLQUFBcUIsZUFDQTtBQUFBLElBQ0E7QUFBQSxLQUNFO0FBQUEsS0FDQTtBQUFBO0FBQUE7QUFBQSxLQUVBO0FBQUEsSUFDRjtBQUFBO0FBQUEsR0FBMEI7QUFBQSxZQUFBc0MsYUFBQXpFLEdBQUFtRTtBQUFBQTtBQUFBQSxLQUFBeEQsV0FHMUI7QUFBQSxLQUFBQyxRQUNBO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUFDLFNBQUE7QUFBQSxLQUFBcUIsZUFDQTtBQUFBLElBQ0E7QUFBQSxLQUNFO0FBQUEsS0FDQTtBQUFBO0FBQUE7QUFBQSxLQUVBO0FBQUEsSUFDRjtBQUFBO0FBQUEsR0FBMEI7QUFBQSxZQUFBdUMsYUFBQTFFLEdBQUFtRTtBQUFBQTtBQUFBQSxLQUFBeEQsV0FHMUI7QUFBQSxLQUFBQyxRQUNBO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUFDLFNBQUE7QUFBQSxLQUFBcUIsZUFDQTtBQUFBLElBQ0E7QUFBQSxLQUNFO0FBQUEsS0FDQTtBQUFBO0FBQUE7QUFBQSxLQUVBO0FBQUEsSUFDRjtBQUFBO0FBQUEsR0FBMEI7QUFBQSxZQUFBd0MsYUFBQTNFLEdBQUFtRTtBQUFBQTtBQUFBQSxLQUFBeEQsV0FHMUI7QUFBQSxLQUFBQyxRQUNBO0FBQUEsS0FBQUMsU0FBQTtBQUFBLEtBQUFDLFNBQUE7QUFBQSxLQUFBcUIsZUFDQTtBQUFBLElBQ0E7QUFBQSxLQUNFO0FBQUEsS0FDQTtBQUFBO0FBQUE7QUFBQSxLQUVBO0FBQUEsSUFDRjtBQUFBO0FBQUEsR0FBMEI7QUFBQSxZQUFBeUMsYUFBQTVFLEdBQUFtRTtBQUFBQSxRQUFBLElBRzFCLGlCQUF1QztBQUFBLElBQXZDLHlCQUF1RDtBQUFBO0FBQUEsWUFBQVUsYUFBQTdFLEdBQUFtRTtBQUFBQSxRQUFBQSxNQUd2RCxxQkFBOEM7QUFBQSxJQUE5QywyQkFBdUQ7QUFBQTtBQUFBLFlBQUFXLGFBQUE5RSxHQUFBbUU7QUFBQUEsUUFBQSxJQUd2RCxpQkFBdUM7QUFBQSxJQUF2Qyx5QkFBdUQ7QUFBQTtBQUFBLFlBQUFZLGFBQUEvRSxHQUFBbUU7QUFBQUEsUUFBQUEsTUFHdkQscUJBQThDO0FBQUEsSUFBOUMsMkJBQXVEO0FBQUE7QUFBQSxZQUFBYSxhQUFBaEYsR0FBQW1FO0FBQUFBLFFBQUEsSUFHdkQsaUJBQXVDO0FBQUEsSUFBdkMseUJBQXVEO0FBQUE7QUFBQSxZQUFBYyxhQUFBakYsR0FBQW1FO0FBQUFBLFFBQUFBLE1BR3ZELHFCQUE4QztBQUFBLElBQTlDLDJCQUF1RDtBQUFBO0FBQUEsR0Q1WXpEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTY3NzcsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvbXV0ZXgubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgWGF2aWVyIExlcm95IGFuZCBQYXNjYWwgQ3VvcSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk1IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdFxuZXh0ZXJuYWwgY3JlYXRlOiB1bml0IC0+IHQgPSBcImNhbWxfbWxfbXV0ZXhfbmV3XCJcbmV4dGVybmFsIGxvY2s6IHQgLT4gdW5pdCA9IFwiY2FtbF9tbF9tdXRleF9sb2NrXCJcbmV4dGVybmFsIHRyeV9sb2NrOiB0IC0+IGJvb2wgPSBcImNhbWxfbWxfbXV0ZXhfdHJ5X2xvY2tcIlxuZXh0ZXJuYWwgdW5sb2NrOiB0IC0+IHVuaXQgPSBcImNhbWxfbWxfbXV0ZXhfdW5sb2NrXCJcblxuKCogcHJpdmF0ZSByZS1leHBvcnQgKilcbmV4dGVybmFsIHJlcmFpc2UgOiBleG4gLT4gJ2EgPSBcIiVyZXJhaXNlXCJcblxuKCogY2Fubm90IGlubGluZSwgb3RoZXJ3aXNlIGZsYW1iZGEgbWlnaHQgbW92ZSBjb2RlIGFyb3VuZC4gKilcbmxldFtAaW5saW5lIG5ldmVyXSBwcm90ZWN0IG0gZiA9XG4gIGxvY2sgbTtcbiAgbWF0Y2ggZigpIHdpdGhcbiAgfCB4IC0+XG4gICAgdW5sb2NrIG07IHhcbiAgfCBleGNlcHRpb24gZSAtPlxuICAgICgqIE5PVEU6IFt1bmxvY2tdIGRvZXMgbm90IHBvbGwgZm9yIGFzeW5jaHJvbm91cyBleGNlcHRpb25zICopXG4gICAgdW5sb2NrIG07XG4gICAgcmVyYWlzZSBlXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfbXV0ZXhfbG9jayIsImNhbWxfbWxfbXV0ZXhfdW5sb2NrIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJwcm90ZWN0IiwibSIsIngiLCJlIiwiU3RkbGliX011dGV4Il0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyx1QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFFBQUFDLEdBQUFIO0FBQUFBLElDMEJFO0FBQUEsSUFBTSxRQUFBSSxJQUNBO0FBQUEsVUFBQUM7QUFBQUEsU0FBQUEsSUQzQlI7QUFBQSxLQ2dDSTtBQUFBLEtBQVE7QUFBQTtBQUFBLElBSFI7QUFBQSxJQUFRO0FBQUEsR0FJQztBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTURqQ2IiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoxNjgxNywiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSJdLCJuYW1lcyI6WyJydW50aW1lIiwiU3RkbGliX0NvbmRpdGlvbiJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQztBQUFBQSxNQUFBIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTY4MzUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvZG9tYWluLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICBLQyBTaXZhcmFtYWtyaXNobmFuLCBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFN0ZXBoZW4gRG9sYW4sIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgVG9tIEtlbGx5LCBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5ICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOSBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5IEx0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5tb2R1bGUgUmF3ID0gc3RydWN0XG4gICgqIExvdy1sZXZlbCBwcmltaXRpdmVzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lICopXG4gIHR5cGUgdCA9IHByaXZhdGUgaW50XG5cbiAgKCogVGhlIGxheW91dHMgb2YgW3N0YXRlXSBhbmQgW3Rlcm1fc3luY10gYXJlIGhhcmQtY29kZWQgaW5cbiAgICAgW3J1bnRpbWUvZG9tYWluLmNdICopXG5cbiAgdHlwZSAnYSBzdGF0ZSA9XG4gICAgfCBSdW5uaW5nXG4gICAgfCBGaW5pc2hlZCBvZiAoJ2EsIGV4bikgcmVzdWx0IFtAd2FybmluZyBcIi11bnVzZWQtY29uc3RydWN0b3JcIl1cblxuICB0eXBlICdhIHRlcm1fc3luYyA9IHtcbiAgICAoKiBwcm90ZWN0ZWQgYnkgW211dF0gKilcbiAgICBtdXRhYmxlIHN0YXRlIDogJ2Egc3RhdGUgW0B3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXSA7XG4gICAgbXV0IDogTXV0ZXgudCA7XG4gICAgY29uZCA6IENvbmRpdGlvbi50IDtcbiAgfVxuXG4gIGV4dGVybmFsIHNwYXduIDogKHVuaXQgLT4gJ2EpIC0+ICdhIHRlcm1fc3luYyAtPiB0XG4gICAgPSBcImNhbWxfZG9tYWluX3NwYXduXCJcbiAgZXh0ZXJuYWwgc2VsZiA6IHVuaXQgLT4gdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9pZFwiIFtAQG5vYWxsb2NdXG4gIGV4dGVybmFsIGNwdV9yZWxheCA6IHVuaXQgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcIlxuICBleHRlcm5hbCBnZXRfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50OiB1bml0IC0+IGludFxuICAgID0gXCJjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFwiIFtAQG5vYWxsb2NdXG5lbmRcblxubGV0IGNwdV9yZWxheCAoKSA9IFJhdy5jcHVfcmVsYXggKClcblxudHlwZSBpZCA9IFJhdy50XG5cbnR5cGUgJ2EgdCA9IHtcbiAgZG9tYWluIDogUmF3LnQ7XG4gIHRlcm1fc3luYyA6ICdhIFJhdy50ZXJtX3N5bmM7XG59XG5cbm1vZHVsZSBETFMgPSBzdHJ1Y3RcblxuICBtb2R1bGUgT2JqX29wdCA6IHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBub25lIDogdFxuICAgIHZhbCBzb21lIDogJ2EgLT4gdFxuICAgIHZhbCBpc19zb21lIDogdCAtPiBib29sXG5cbiAgICAoKiogW3Vuc2FmZV9nZXQgb2JqXSBtYXkgb25seSBiZSBjYWxsZWQgc2FmZWx5XG4gICAgICAgIGlmIFtpc19zb21lXSBpcyB0cnVlLlxuXG4gICAgICAgIFt1bnNhZmVfZ2V0IChzb21lIHYpXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIFtPYmoub2JqIChPYmoucmVwciB2KV0uICopXG4gICAgdmFsIHVuc2FmZV9nZXQgOiB0IC0+ICdhXG4gIGVuZCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IE9iai50XG4gICAgbGV0IG5vbmUgPSBPYmoucmVwciAocmVmIDApXG4gICAgbGV0IHNvbWUgdiA9IE9iai5yZXByIHZcbiAgICBsZXQgaXNfc29tZSBvYmogPSAob2JqICE9IG5vbmUpXG4gICAgbGV0IHVuc2FmZV9nZXQgb2JqID0gT2JqLm9iaiBvYmpcbiAgZW5kXG5cbiAgdHlwZSBkbHNfc3RhdGUgPSBPYmpfb3B0LnQgYXJyYXlcblxuICBleHRlcm5hbCBnZXRfZGxzX3N0YXRlIDogdW5pdCAtPiBkbHNfc3RhdGUgPSBcIiVkbHNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXRfZGxzX3N0YXRlIDogZGxzX3N0YXRlIC0+IHVuaXQgPVxuICAgIFwiY2FtbF9kb21haW5fZGxzX3NldFwiIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY29tcGFyZV9hbmRfc2V0X2Rsc19zdGF0ZSA6IGRsc19zdGF0ZSAtPiBkbHNfc3RhdGUgLT4gYm9vbCA9XG4gICAgXCJjYW1sX2RvbWFpbl9kbHNfY29tcGFyZV9hbmRfc2V0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlX2RscyAoKSA9XG4gICAgbGV0IHN0ID0gQXJyYXkubWFrZSA4IE9ial9vcHQubm9uZSBpblxuICAgIHNldF9kbHNfc3RhdGUgc3RcblxuICBsZXQgXyA9IGNyZWF0ZV9kbHMgKClcblxuICB0eXBlICdhIGtleSA9IGludCAqICh1bml0IC0+ICdhKVxuXG4gIGxldCBrZXlfY291bnRlciA9IEF0b21pYy5tYWtlIDBcblxuICB0eXBlIGtleV9pbml0aWFsaXplciA9XG4gICAgS0k6ICdhIGtleSAqICgnYSAtPiAnYSkgLT4ga2V5X2luaXRpYWxpemVyXG5cbiAgbGV0IHBhcmVudF9rZXlzID0gQXRvbWljLm1ha2UgKFtdIDoga2V5X2luaXRpYWxpemVyIGxpc3QpXG5cbiAgbGV0IHJlYyBhZGRfcGFyZW50X2tleSBraSA9XG4gICAgbGV0IGwgPSBBdG9taWMuZ2V0IHBhcmVudF9rZXlzIGluXG4gICAgaWYgbm90IChBdG9taWMuY29tcGFyZV9hbmRfc2V0IHBhcmVudF9rZXlzIGwgKGtpIDo6IGwpKVxuICAgIHRoZW4gYWRkX3BhcmVudF9rZXkga2lcblxuICBsZXQgbmV3X2tleSA/c3BsaXRfZnJvbV9wYXJlbnQgaW5pdF9vcnBoYW4gPVxuICAgIGxldCBpZHggPSBBdG9taWMuZmV0Y2hfYW5kX2FkZCBrZXlfY291bnRlciAxIGluXG4gICAgbGV0IGsgPSAoaWR4LCBpbml0X29ycGhhbikgaW5cbiAgICBiZWdpbiBtYXRjaCBzcGxpdF9mcm9tX3BhcmVudCB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHNwbGl0IC0+IGFkZF9wYXJlbnRfa2V5IChLSShrLCBzcGxpdCkpXG4gICAgZW5kO1xuICAgIGtcblxuICAoKiBJZiBuZWNlc3NhcnksIGdyb3cgdGhlIGN1cnJlbnQgZG9tYWluJ3MgbG9jYWwgc3RhdGUgYXJyYXkgc3VjaCB0aGF0IFtpZHhdXG4gICAqIGlzIGEgdmFsaWQgaW5kZXggaW4gdGhlIGFycmF5LiAqKVxuICBsZXQgcmVjIG1heWJlX2dyb3cgaWR4ID1cbiAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgbGV0IHN6ID0gQXJyYXkubGVuZ3RoIHN0IGluXG4gICAgaWYgaWR4IDwgc3ogdGhlbiBzdFxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgY29tcHV0ZV9uZXdfc2l6ZSBzID1cbiAgICAgICAgaWYgaWR4IDwgcyB0aGVuIHMgZWxzZSBjb21wdXRlX25ld19zaXplICgyICogcylcbiAgICAgIGluXG4gICAgICBsZXQgbmV3X3N6ID0gY29tcHV0ZV9uZXdfc2l6ZSBzeiBpblxuICAgICAgbGV0IG5ld19zdCA9IEFycmF5Lm1ha2UgbmV3X3N6IE9ial9vcHQubm9uZSBpblxuICAgICAgQXJyYXkuYmxpdCBzdCAwIG5ld19zdCAwIHN6O1xuICAgICAgKCogV2Ugd2FudCBhIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc2FmZSB3aXRoIHJlc3BlY3QgdG9cbiAgICAgICAgIHNpbmdsZS1kb21haW4gbXVsdGktdGhyZWFkaW5nOiByZXRyeSBpZiB0aGUgRExTIHN0YXRlIGhhc1xuICAgICAgICAgY2hhbmdlZCB1bmRlciBvdXIgZmVldC5cbiAgICAgICAgIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHJldHJpZXMgd2lsbCBiZSB2ZXJ5IHNtYWxsIGluXG4gICAgICAgICBjb250ZW5kZWQgc2NlbmFyaW9zLCBhcyB0aGUgYXJyYXkgb25seSBncm93cywgd2l0aFxuICAgICAgICAgZXhwb25lbnRpYWwgcmVzaXppbmcuICopXG4gICAgICBpZiBjb21wYXJlX2FuZF9zZXRfZGxzX3N0YXRlIHN0IG5ld19zdFxuICAgICAgdGhlbiBuZXdfc3RcbiAgICAgIGVsc2UgbWF5YmVfZ3JvdyBpZHhcbiAgICBlbmRcblxuICBsZXQgc2V0ICh0eXBlIGEpIChpZHgsIF9pbml0KSAoeCA6IGEpID1cbiAgICBsZXQgc3QgPSBtYXliZV9ncm93IGlkeCBpblxuICAgICgqIFtTeXMub3BhcXVlX2lkZW50aXR5XSBlbnN1cmVzIHRoYXQgZmxhbWJkYSBkb2VzIG5vdCBsb29rIGF0IHRoZSB0eXBlIG9mXG4gICAgICogW3hdLCB3aGljaCBtYXkgYmUgYSBbZmxvYXRdIGFuZCBjb25jbHVkZSB0aGF0IHRoZSBbc3RdIGlzIGEgZmxvYXQgYXJyYXkuXG4gICAgICogV2UgZG8gbm90IHdhbnQgT0NhbWwncyBmbG9hdCBhcnJheSBvcHRpbWlzYXRpb24ga2lja2luZyBpbiBoZXJlLiAqKVxuICAgIHN0LihpZHgpIDwtIE9ial9vcHQuc29tZSAoU3lzLm9wYXF1ZV9pZGVudGl0eSB4KVxuXG5cbiAgbGV0W0BpbmxpbmUgbmV2ZXJdIGFycmF5X2NvbXBhcmVfYW5kX3NldCBhIGkgb2xkdmFsIG5ld3ZhbCA9XG4gICAgKCogTm90ZTogd2UgY2Fubm90IHVzZSBbQHBvbGwgZXJyb3JdIGR1ZSB0byB0aGVcbiAgICAgICBhbGxvY2F0aW9ucyBvbiBhLihpKSBpbiB0aGUgRG91YmxlX2FycmF5IGNhc2UuICopXG4gICAgbGV0IGN1cnZhbCA9IGEuKGkpIGluXG4gICAgaWYgY3VydmFsID09IG9sZHZhbCB0aGVuIChcbiAgICAgIEFycmF5LnVuc2FmZV9zZXQgYSBpIG5ld3ZhbDtcbiAgICAgIHRydWVcbiAgICApIGVsc2UgZmFsc2VcblxuICBsZXQgZ2V0ICh0eXBlIGEpICgoaWR4LCBpbml0KSA6IGEga2V5KSA6IGEgPVxuICAgIGxldCBzdCA9IG1heWJlX2dyb3cgaWR4IGluXG4gICAgbGV0IG9iaiA9IHN0LihpZHgpIGluXG4gICAgaWYgT2JqX29wdC5pc19zb21lIG9ialxuICAgIHRoZW4gKE9ial9vcHQudW5zYWZlX2dldCBvYmogOiBhKVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCB2IDogYSA9IGluaXQgKCkgaW5cbiAgICAgIGxldCBuZXdfb2JqID0gT2JqX29wdC5zb21lIChTeXMub3BhcXVlX2lkZW50aXR5IHYpIGluXG4gICAgICAoKiBBdCB0aGlzIHBvaW50LCBbc3RdIG9yIFtzdC4oaWR4KV0gbWF5IGhhdmUgYmVlbiBjaGFuZ2VkXG4gICAgICAgICBieSBhbm90aGVyIHRocmVhZCBvbiB0aGUgc2FtZSBkb21haW4uXG5cbiAgICAgICAgIElmIFtzdF0gY2hhbmdlZCwgaXQgd2FzIHJlc2l6ZWQgaW50byBhIGxhcmdlciB2YWx1ZSxcbiAgICAgICAgIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBuZXcgdmFsdWUuXG5cbiAgICAgICAgIElmIFtzdC4oaWR4KV0gY2hhbmdlZCwgd2UgZHJvcCB0aGUgY3VycmVudCB2YWx1ZSB0byBhdm9pZFxuICAgICAgICAgbGV0dGluZyBvdGhlciB0aHJlYWRzIG9ic2VydmUgYSAncmV2ZXJ0JyB0aGF0IGZvcmdldHNcbiAgICAgICAgIHByZXZpb3VzIG1vZGlmaWNhdGlvbnMuICopXG4gICAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgICBpZiBhcnJheV9jb21wYXJlX2FuZF9zZXQgc3QgaWR4IG9iaiBuZXdfb2JqXG4gICAgICB0aGVuIHZcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgKCogaWYgc3QuKGlkeCkgY2hhbmdlZCwgc29tZW9uZSBtdXN0IGhhdmUgaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgdGhlIGtleSBpbiB0aGUgbWVhbnRpbWUuICopXG4gICAgICAgIGxldCB1cGRhdGVkX29iaiA9IHN0LihpZHgpIGluXG4gICAgICAgIGlmIE9ial9vcHQuaXNfc29tZSB1cGRhdGVkX29ialxuICAgICAgICB0aGVuIChPYmpfb3B0LnVuc2FmZV9nZXQgdXBkYXRlZF9vYmogOiBhKVxuICAgICAgICBlbHNlIGFzc2VydCBmYWxzZVxuICAgICAgZW5kXG4gICAgZW5kXG5cbiAgdHlwZSBrZXlfdmFsdWUgPSBLViA6ICdhIGtleSAqICdhIC0+IGtleV92YWx1ZVxuXG4gIGxldCBnZXRfaW5pdGlhbF9rZXlzICgpIDoga2V5X3ZhbHVlIGxpc3QgPVxuICAgIExpc3QubWFwXG4gICAgICAoZnVuIChLSSAoaywgc3BsaXQpKSAtPiBLViAoaywgKHNwbGl0IChnZXQgaykpKSlcbiAgICAgIChBdG9taWMuZ2V0IHBhcmVudF9rZXlzKVxuXG4gIGxldCBzZXRfaW5pdGlhbF9rZXlzIChsOiBrZXlfdmFsdWUgbGlzdCkgPVxuICAgIExpc3QuaXRlciAoZnVuIChLViAoaywgdikpIC0+IHNldCBrIHYpIGxcbmVuZFxuXG4oKioqKioqKiogSWRlbnRpdHkgKioqKioqKioqKilcblxubGV0IGdldF9pZCB7IGRvbWFpbjsgXyB9ID0gZG9tYWluXG5cbmxldCBzZWxmICgpID0gUmF3LnNlbGYgKClcblxubGV0IGlzX21haW5fZG9tYWluICgpID0gKHNlbGYgKCkgOj4gaW50KSA9IDBcblxuKCoqKioqKioqIENhbGxiYWNrcyAqKioqKioqKioqKVxuXG4oKiBmaXJzdCBzcGF3biwgZG9tYWluIHN0YXJ0dXAgYW5kIGF0IGV4aXQgZnVuY3Rpb25hbGl0eSAqKVxubGV0IGZpcnN0X2RvbWFpbl9zcGF3bmVkID0gQXRvbWljLm1ha2UgZmFsc2VcblxubGV0IGZpcnN0X3NwYXduX2Z1bmN0aW9uID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBiZWZvcmVfZmlyc3Rfc3Bhd24gZiA9XG4gIGlmIEF0b21pYy5nZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdGhlblxuICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiZmlyc3QgZG9tYWluIGFscmVhZHkgc3Bhd25lZFwiKVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG9sZF9mID0gIWZpcnN0X3NwYXduX2Z1bmN0aW9uIGluXG4gICAgbGV0IG5ld19mICgpID0gb2xkX2YgKCk7IGYgKCkgaW5cbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSBuZXdfZlxuICBlbmRcblxubGV0IGRvX2JlZm9yZV9maXJzdF9zcGF3biAoKSA9XG4gIGlmIG5vdCAoQXRvbWljLmdldCBmaXJzdF9kb21haW5fc3Bhd25lZCkgdGhlbiBiZWdpblxuICAgIEF0b21pYy5zZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdHJ1ZTtcbiAgICAhZmlyc3Rfc3Bhd25fZnVuY3Rpb24oKTtcbiAgICAoKiBSZWxlYXNlIHRoZSBvbGQgZnVuY3Rpb24gKilcbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSAoZnVuICgpIC0+ICgpKVxuICBlbmRcblxubGV0IGF0X2V4aXRfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPiAoZnVuICgpIC0+ICgpKSlcblxubGV0IGF0X2V4aXQgZiA9XG4gIGxldCBvbGRfZXhpdCA6IHVuaXQgLT4gdW5pdCA9IERMUy5nZXQgYXRfZXhpdF9rZXkgaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBmICgpOyBvbGRfZXhpdCAoKVxuICBpblxuICBETFMuc2V0IGF0X2V4aXRfa2V5IG5ld19leGl0XG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgbGV0IGYgOiB1bml0IC0+IHVuaXQgPSBETFMuZ2V0IGF0X2V4aXRfa2V5IGluXG4gIGYgKClcblxubGV0IF8gPSBTdGRsaWIuZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQgOj0gZG9fYXRfZXhpdFxuXG4oKioqKioqKiBDcmVhdGlvbiBhbmQgVGVybWluYXRpb24gKioqKioqKiopXG5cbmxldCBzcGF3biBmID1cbiAgZG9fYmVmb3JlX2ZpcnN0X3NwYXduICgpO1xuICBsZXQgcGsgPSBETFMuZ2V0X2luaXRpYWxfa2V5cyAoKSBpblxuXG4gICgqIFt0ZXJtX3N5bmNdIGlzIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgam9pbmluZyBkb21haW5zICopXG4gIGxldCB0ZXJtX3N5bmMgPVxuICAgIFJhdy57IHN0YXRlID0gUnVubmluZyA7XG4gICAgICAgICAgbXV0ID0gTXV0ZXguY3JlYXRlICgpIDtcbiAgICAgICAgICBjb25kID0gQ29uZGl0aW9uLmNyZWF0ZSAoKSB9XG4gIGluXG5cbiAgbGV0IGJvZHkgKCkgPVxuICAgIG1hdGNoXG4gICAgICBETFMuY3JlYXRlX2RscyAoKTtcbiAgICAgIERMUy5zZXRfaW5pdGlhbF9rZXlzIHBrO1xuICAgICAgbGV0IHJlcyA9IGYgKCkgaW5cbiAgICAgIHJlc1xuICAgIHdpdGhcbiAgICAoKiBSdW4gdGhlIFthdF9leGl0XSBjYWxsYmFja3Mgd2hlbiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGVpdGhlclxuICAgICAgIHRlcm1pbmF0ZXMgbm9ybWFsbHkgb3IgZXhjZXB0aW9uYWxseS4gKilcbiAgICB8IHJlcyAtPlxuICAgICAgICAoKiBJZiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIHRlcm1pbmF0ZWQgbm9ybWFsbHksIGJ1dCB0aGVcbiAgICAgICAgICAgW2F0X2V4aXRdIGNhbGxiYWNrcyByYWlzZWQgYW4gZXhjZXB0aW9uLCB0aGVuIHJldHVybiB0aGVcbiAgICAgICAgICAgZXhjZXB0aW9uLiAqKVxuICAgICAgICBkb19hdF9leGl0ICgpO1xuICAgICAgICByZXNcbiAgICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICAgICAgKCogSWYgYm90aCB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGFuZCB0aGUgW2F0X2V4aXRdIGNhbGxiYWNrc1xuICAgICAgICAgICByYWlzZSBleGNlcHRpb25zLCB0aGVuIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGZyb20gdGhlXG4gICAgICAgICAgIFthdF9leGl0XSBjYWxsYmFja3MgYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLiAqKVxuICAgICAgICAodHJ5IGRvX2F0X2V4aXQgKCkgd2l0aCBfIC0+ICgpKTtcbiAgICAgICAgcmFpc2UgZXhuXG4gIGluXG4gIGxldCBkb21haW4gPSBSYXcuc3Bhd24gYm9keSB0ZXJtX3N5bmMgaW5cbiAgeyBkb21haW4gOyB0ZXJtX3N5bmMgfVxuXG5sZXQgam9pbiB7IHRlcm1fc3luYyA7IF8gfSA9XG4gIGxldCBvcGVuIFJhdyBpblxuICBsZXQgcmVjIGxvb3AgKCkgPVxuICAgIG1hdGNoIHRlcm1fc3luYy5zdGF0ZSB3aXRoXG4gICAgfCBSdW5uaW5nIC0+XG4gICAgICAgIENvbmRpdGlvbi53YWl0IHRlcm1fc3luYy5jb25kIHRlcm1fc3luYy5tdXQ7XG4gICAgICAgIGxvb3AgKClcbiAgICB8IEZpbmlzaGVkIHJlcyAtPlxuICAgICAgICByZXNcbiAgaW5cbiAgbWF0Y2ggTXV0ZXgucHJvdGVjdCB0ZXJtX3N5bmMubXV0IGxvb3Agd2l0aFxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIGV4IC0+IHJhaXNlIGV4XG5cbmxldCByZWNvbW1lbmRlZF9kb21haW5fY291bnQgPSBSYXcuZ2V0X3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF9kb21haW5fZGxzX2dldCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9kb21haW5faWQiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImR1bW15IiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQ29uZGl0aW9uIiwiU3RkbGliX011dGV4IiwiU3RkbGliX0F0b21pYyIsIlN0ZGxpYiIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9MaXN0IiwiQXNzZXJ0X2ZhaWx1cmUiLCJjcHVfcmVsYXgiLCJwYXJhbSIsIm5vbmUiLCJjcmVhdGVfZGxzIiwic3QiLCJrZXlfY291bnRlciIsInBhcmVudF9rZXlzIiwibmV3X2tleSIsInNwbGl0X2Zyb21fcGFyZW50IiwiaW5pdF9vcnBoYW4iLCJpZHgiLCJrIiwic3BsaXQiLCJraSIsImwiLCJtYXliZV9ncm93Iiwic3oiLCJuZXdfc3oiLCJuZXdfc3QiLCJzIiwic2V0IiwieCIsImdldCIsImluaXQiLCJvbGR2YWwiLCJuZXdfb2JqIiwiY3VydmFsIiwidXBkYXRlZF9vYmoiLCJzZXRfaW5pdGlhbF9rZXlzIiwidiIsImdldF9pZCIsImRvbWFpbiIsInNlbGYiLCJpc19tYWluX2RvbWFpbiIsImZpcnN0X2RvbWFpbl9zcGF3bmVkIiwiZmlyc3Rfc3Bhd25fZnVuY3Rpb24iLCJiZWZvcmVfZmlyc3Rfc3Bhd24iLCJvbGRfZiIsIm5ld19mIiwiYXRfZXhpdF9rZXkiLCJhdF9leGl0Iiwib2xkX2V4aXQiLCJuZXdfZXhpdCIsImRvX2F0X2V4aXQiLCJzcGF3biIsInBrIiwidGVybV9zeW5jIiwiYm9keSIsInJlcyIsImV4biIsImpvaW4iLCJsb29wIiwibWF0Y2giLCJleCIsInJlY29tbWVuZGVkX2RvbWFpbl9jb3VudCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsU0FBQTtB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bUMsWUFERDtBQUFBLGFBQUFDLEtBQUE5QztBQUFBQSxLQUtaLElBQ0UsZUFDQSwwQkFBQStDLE1BQ1U7QUFBQSxXQUFBQztBQUFBQSxVQUFBQSxNRHRRaEI7QUFBQSxVQ3FSYSxxQkFBQUE7QUFBQUEsTUFDTDtBQUFBO0FBQUEsS0FQQTtBQUFBLEtBQWE7QUFBQSxJQU9KO0FBQUEsUUFBQWxCLFNBRUY7QUFBQSxJQUNiO0FBQUEsR0FBc0I7QUFBQSxZQUFBbUIsS0FBQWpEO0FBQUFBLFFBQUE2QyxZQUVmO0FBQUEsYUFBQUssS0FBQWxEO0FBQUFBLEtBR0w7QUFBQSxVQUFBbUQsUUFBQTtBQUFBLG9CQUFBSixNQUFBLFVBS0k7QUFBQSxNQUhBO0FBQUE7QUFBQSxJQUdHO0FBQUEsUUFBQUksUUFFSDtBQUFBLElBQWdDLHVCQUFBL0IsSUFBQSxVQUM1QjtBQUFBLFFBQUFnQyxLQUQ0QjtBQUFBO0FBQUEsR0FFaEI7QUFBQSxPQUFBQywyQkFqRWdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR0T3hEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MTcwMzEsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvY2FtbGludGVybmFsRm9ybWF0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbm9pdCBWYXVnb24sIEVOU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAoKiBUb29scyB0byBtYW5pcHVsYXRlIHNjYW5uaW5nIHNldCBvZiBjaGFycyAoc2VlICVbLi4uXSkgKilcblxudHlwZSBtdXRhYmxlX2NoYXJfc2V0ID0gYnl0ZXNcblxuKCogQ3JlYXRlIGEgZnJlc2gsIGVtcHR5LCBtdXRhYmxlIGNoYXIgc2V0LiAqKVxubGV0IGNyZWF0ZV9jaGFyX3NldCAoKSA9IEJ5dGVzLm1ha2UgMzIgJ1xcMDAwJ1xuXG4oKiBBZGQgYSBjaGFyIGluIGEgbXV0YWJsZSBjaGFyIHNldC4gKilcbmxldCBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyA9XG4gIGxldCBpbmQgPSBpbnRfb2ZfY2hhciBjIGluXG4gIGxldCBzdHJfaW5kID0gaW5kIGxzciAzIGFuZCBtYXNrID0gMSBsc2wgKGluZCBsYW5kIDBiMTExKSBpblxuICBCeXRlcy5zZXQgY2hhcl9zZXQgc3RyX2luZFxuICAgIChjaGFyX29mX2ludCAoaW50X29mX2NoYXIgKEJ5dGVzLmdldCBjaGFyX3NldCBzdHJfaW5kKSBsb3IgbWFzaykpXG5cbmxldCBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgPVxuICBCeXRlcy50b19zdHJpbmcgY2hhcl9zZXRcblxuKCogQ29tcHV0ZSB0aGUgY29tcGxlbWVudCBvZiBhIGNoYXIgc2V0LiAqKVxubGV0IHJldl9jaGFyX3NldCBjaGFyX3NldCA9XG4gIGxldCBjaGFyX3NldCcgPSBjcmVhdGVfY2hhcl9zZXQgKCkgaW5cbiAgZm9yIGkgPSAwIHRvIDMxIGRvXG4gICAgQnl0ZXMuc2V0IGNoYXJfc2V0JyBpXG4gICAgICAoY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IGkpIGx4b3IgMHhGRikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGNoYXJfc2V0J1xuXG4oKiBSZXR1cm4gdHJ1ZSBpZiBhIGBjJyBpcyBpbiBgY2hhcl9zZXQnLiAqKVxubGV0IGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgPVxuICBsZXQgaW5kID0gaW50X29mX2NoYXIgYyBpblxuICBsZXQgc3RyX2luZCA9IGluZCBsc3IgMyBhbmQgbWFzayA9IDEgbHNsIChpbmQgbGFuZCAwYjExMSkgaW5cbiAgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IHN0cl9pbmQpIGxhbmQgbWFzaykgPD4gMFxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKCogSWdub3JlZCBwYXJhbSBjb252ZXJzaW9uICopXG5cbigqIEdBRFQgdXNlZCB0byBhYnN0cmFjdCBhbiBleGlzdGVudGlhbCB0eXBlIHBhcmFtZXRlci4gKilcbigqIFNlZSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiID0gUGFyYW1fZm9ybWF0X0VCQiA6XG4gICAgKCd4IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiXG5cbigqIENvbXB1dGUgYSBwYWRkaW5nIGFzc29jaWF0ZWQgdG8gYSBwYWRfb3B0aW9uIChzZWUgXCIlXzQyZFwiKS4gKilcbmxldCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wYWRkaW5nXG4gIHwgU29tZSB3aWR0aCAtPiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuXG4oKiBDb21wdXRlIGEgcHJlY2lzaW9uIGFzc29jaWF0ZWQgdG8gYSBwcmVjX29wdGlvbiAoc2VlIFwiJV8uNDJmXCIpLiAqKVxubGV0IHByZWNfb2ZfcHJlY19vcHQgcHJlY19vcHQgPSBtYXRjaCBwcmVjX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wcmVjaXNpb25cbiAgfCBTb21lIG5kZWMgLT4gTGl0X3ByZWNpc2lvbiBuZGVjXG5cbigqIFR1cm4gYW4gaWdub3JlZCBwYXJhbSBpbnRvIGl0cyBlcXVpdmFsZW50IG5vdC1pZ25vcmVkIGZvcm1hdCBub2RlLiAqKVxuKCogVXNlZCBmb3IgZm9ybWF0IHByZXR0eS1wcmludGluZyBhbmQgU2NhbmYuICopXG5sZXQgcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+ICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYXJhbV9mb3JtYXRfZWJiID1cbmZ1biBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2hhciBmbXQpXG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDYW1sX2NoYXIgZm10KVxuICB8IElnbm9yZWRfc3RyaW5nIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEludCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2ludDMyIChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoSW50MzIgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChOYXRpdmVpbnQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQ2NCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEludDY0IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfZmxvYXQgKHBhZF9vcHQsIHByZWNfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChGbG9hdCAoKEZsb2F0X2ZsYWdfLCBGbG9hdF9mKSxcbiAgICAgICAgICAgICAgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgcHJlY19vZl9wcmVjX29wdCBwcmVjX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2Jvb2wgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEJvb2wgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgZm10KSlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHkpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIGZtdCkpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChSZWFkZXIgZm10KVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXQpKVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10KSlcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10KVxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUeXBlcyAqKVxuXG50eXBlICgnYiwgJ2MpIGFjY19mb3JtYXR0aW5nX2dlbiA9XG4gIHwgQWNjX29wZW5fdGFnIG9mICgnYiwgJ2MpIGFjY1xuICB8IEFjY19vcGVuX2JveCBvZiAoJ2IsICdjKSBhY2NcblxuKCogUmV2ZXJzZWQgbGlzdCBvZiBwcmludGluZyBhdG9tcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBwcmludGYgYXJndW1lbnRzLiAqKVxuYW5kICgnYiwgJ2MpIGFjYyA9XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IG9mICgnYiwgJ2MpIGFjYyAqIGZvcm1hdHRpbmdfbGl0XG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gb2YgKCdiLCAnYykgYWNjICogKCdiLCAnYykgYWNjX2Zvcm1hdHRpbmdfZ2VuXG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nICAgICAoKiBMaXRlcmFsIHN0cmluZyAqKVxuICB8IEFjY19jaGFyX2xpdGVyYWwgICBvZiAoJ2IsICdjKSBhY2MgKiBjaGFyICAgICAgICgqIExpdGVyYWwgY2hhciAqKVxuICB8IEFjY19kYXRhX3N0cmluZyAgICBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmcgICAgICgqIEdlbmVyYXRlZCBzdHJpbmcgKilcbiAgfCBBY2NfZGF0YV9jaGFyICAgICAgb2YgKCdiLCAnYykgYWNjICogY2hhciAgICAgICAoKiBHZW5lcmF0ZWQgY2hhciAqKVxuICB8IEFjY19kZWxheSAgICAgICAgICBvZiAoJ2IsICdjKSBhY2MgKiAoJ2IgLT4gJ2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBEZWxheWVkIHByaW50aW5nICglYSwgJXQpICopXG4gIHwgQWNjX2ZsdXNoICAgICAgICAgIG9mICgnYiwgJ2MpIGFjYyAgICAgICAgICAgICAgKCogRmx1c2ggKilcbiAgfCBBY2NfaW52YWxpZF9hcmcgICAgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nXG4gICAgICAoKiBSYWlzZSBJbnZhbGlkX2FyZ3VtZW50IG1zZyAqKVxuICB8IEVuZF9vZl9hY2NcblxuKCogTGlzdCBvZiBoZXRlcm9nZW5lb3VzIHZhbHVlcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBzY2FuZiBjYWxsYmFjayBhcmd1bWVudHMuICopXG50eXBlICgnYSwgJ2IpIGhldGVyX2xpc3QgPVxuICB8IENvbnMgOiAnYyAqICgnYSwgJ2IpIGhldGVyX2xpc3QgLT4gKCdjIC0+ICdhLCAnYikgaGV0ZXJfbGlzdFxuICB8IE5pbCA6ICgnYiwgJ2IpIGhldGVyX2xpc3RcblxuKCogRXhpc3RlbnRpYWwgQmxhY2sgQm94ZXMuICopXG4oKiBVc2VkIHRvIGFic3RyYWN0IHNvbWUgZXhpc3RlbnRpYWwgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRkaW5nIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkZGluZ19mbXR0eV9lYmIgPSBQYWRkaW5nX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZGRpbmdfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRwcmVjIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkcHJlY19mbXR0eV9lYmIgPSBQYWRwcmVjX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICd6KSBwcmVjaXNpb24gKiAoJ3osICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZHByZWNfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcgYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3BhZGRpbmdfZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcGFkZGluZ19mbXRfZWJiID0gUGFkZGluZ19mbXRfRUJCIDpcbiAgICAgKF8sICd4IC0+ICdhKSBwYWRkaW5nICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwYWRkaW5nX2ZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wcmVjaXNpb25fZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcHJlY2lzaW9uX2ZtdF9lYmIgPSBQcmVjaXNpb25fZm10X0VCQiA6XG4gICAgIChfLCAneCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwcmVjaXNpb25fZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcGFkcHJlY19mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmIgPSBQYWRwcmVjX2ZtdF9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAncCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmJcblxuKCogQWJzdHJhY3QgdGhlICdhIGFuZCAnZCBwYXJhbWV0ZXJzIG9mIGFuIGZtdC4gKilcbigqIE91dHB1dCB0eXBlIG9mIHRoZSBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbi4gKilcbnR5cGUgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiID0gRm10X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhbiBmbXR0eSBhbmQgYW4gZm10LiAqKVxuKCogU2VlIHRoZSB0eXBlX2Zvcm1hdF9nZW4gZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRfZm10dHlfZWJiID0gRm10X2ZtdHR5X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBmbXQgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGFuIGZtdHR5IGFuZCBhbiBmbXQuICopXG4oKiBTZWUgdGhlIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYiA9IEZtdHR5X2ZtdF9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgZm10dHkgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10X2ZtdHR5X2ViYiAtPlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgZm10dHkgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIGZvcm1hdCB0eXBlcy4gKilcbnR5cGUgZm10dHlfZWJiID0gRm10dHlfRUJCIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+IGZtdHR5X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgcGFkZGluZyB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgcGFkZGluZ3MuICopXG50eXBlIHBhZGRpbmdfZWJiID0gUGFkZGluZ19FQkIgOiAoJ2EsICdiKSBwYWRkaW5nIC0+IHBhZGRpbmdfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBwcmVjaXNpb24gdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIHByZWNpc2lvbnMuICopXG50eXBlIHByZWNpc2lvbl9lYmIgPSBQcmVjaXNpb25fRUJCIDogKCdhLCAnYikgcHJlY2lzaW9uIC0+IHByZWNpc2lvbl9lYmJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBDb25zdGFudHMgKilcblxuKCogRGVmYXVsdCBwcmVjaXNpb24gZm9yIGZsb2F0IHByaW50aW5nLiAqKVxubGV0IGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252ID1cbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRyB8IEZsb2F0X2ggfCBGbG9hdF9IXG4gIHwgRmxvYXRfQ0YgLT4gLTZcbiAgKCogRm9yICVoICVIIGFuZCAlI0YgZm9ybWF0cywgYSBuZWdhdGl2ZSBwcmVjaXNpb24gbWVhbnMgXCJhcyBtYW55IGRpZ2l0cyBhc1xuICAgICBuZWNlc3NhcnlcIi4gIEZvciB0aGUgb3RoZXIgRlAgZm9ybWF0cywgd2UgdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWVcbiAgICAgb2YgdGhlIHByZWNpc2lvbiwgaGVuY2UgNiBkaWdpdHMgYnkgZGVmYXVsdC4gKilcbiAgfCBGbG9hdF9GIC0+IDEyXG4gICgqIERlZmF1bHQgcHJlY2lzaW9uIGZvciBPQ2FtbCBmbG9hdCBwcmludGluZyAoJUYpLiAqKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEV4dGVybmFscyAqKVxuXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQ6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDMyOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5leHRlcm5hbCBmb3JtYXRfbmF0aXZlaW50OiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ2NDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxuZXh0ZXJuYWwgaGV4c3RyaW5nX29mX2Zsb2F0OiBmbG9hdCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0XCJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICgqIFRvb2xzIHRvIHByZXR0eS1wcmludCBmb3JtYXRzICopXG5cbigqIFR5cGUgb2YgZXh0ZW5zaWJsZSBjaGFyYWN0ZXIgYnVmZmVycy4gKilcbnR5cGUgYnVmZmVyID0ge1xuICBtdXRhYmxlIGluZCA6IGludDtcbiAgbXV0YWJsZSBieXRlcyA6IGJ5dGVzO1xufVxuXG4oKiBDcmVhdGUgYSBmcmVzaCBidWZmZXIuICopXG5sZXQgYnVmZmVyX2NyZWF0ZSBpbml0X3NpemUgPSB7IGluZCA9IDA7IGJ5dGVzID0gQnl0ZXMuY3JlYXRlIGluaXRfc2l6ZSB9XG5cbigqIENoZWNrIHNpemUgb2YgdGhlIGJ1ZmZlciBhbmQgZ3JvdyBpdCBpZiBuZWVkZWQuICopXG5sZXQgYnVmZmVyX2NoZWNrX3NpemUgYnVmIG92ZXJoZWFkID1cbiAgbGV0IGxlbiA9IEJ5dGVzLmxlbmd0aCBidWYuYnl0ZXMgaW5cbiAgbGV0IG1pbl9sZW4gPSBidWYuaW5kICsgb3ZlcmhlYWQgaW5cbiAgaWYgbWluX2xlbiA+IGxlbiB0aGVuIChcbiAgICBsZXQgbmV3X2xlbiA9IEludC5tYXggKGxlbiAqIDIpIG1pbl9sZW4gaW5cbiAgICBsZXQgbmV3X3N0ciA9IEJ5dGVzLmNyZWF0ZSBuZXdfbGVuIGluXG4gICAgQnl0ZXMuYmxpdCBidWYuYnl0ZXMgMCBuZXdfc3RyIDAgbGVuO1xuICAgIGJ1Zi5ieXRlcyA8LSBuZXdfc3RyO1xuICApXG5cbigqIEFkZCB0aGUgY2hhcmFjdGVyIGBjJyB0byB0aGUgYnVmZmVyIGBidWYnLiAqKVxubGV0IGJ1ZmZlcl9hZGRfY2hhciBidWYgYyA9XG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiAxO1xuICBCeXRlcy5zZXQgYnVmLmJ5dGVzIGJ1Zi5pbmQgYztcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgMVxuXG4oKiBBZGQgdGhlIHN0cmluZyBgcycgdG8gdGhlIGJ1ZmZlciBgYnVmJy4gKilcbmxldCBidWZmZXJfYWRkX3N0cmluZyBidWYgcyA9XG4gIGxldCBzdHJfbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiBzdHJfbGVuO1xuICBTdHJpbmcuYmxpdCBzIDAgYnVmLmJ5dGVzIGJ1Zi5pbmQgc3RyX2xlbjtcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgc3RyX2xlblxuXG4oKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4gKilcbmxldCBidWZmZXJfY29udGVudHMgYnVmID1cbiAgQnl0ZXMuc3ViX3N0cmluZyBidWYuYnl0ZXMgMCBidWYuaW5kXG5cbigqKiopXG5cbigqIENvbnZlcnQgYW4gaW50ZWdlciBjb252ZXJzaW9uIHRvIGNoYXIuICopXG5sZXQgY2hhcl9vZl9pY29udiBpY29udiA9IG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCB8IEludF9DZCAtPiAnZCcgfCBJbnRfaSB8IEludF9waSB8IEludF9zaVxuICB8IEludF9DaSAtPiAnaScgfCBJbnRfeCB8IEludF9DeCAtPiAneCcgfCBJbnRfWCB8IEludF9DWCAtPiAnWCcgfCBJbnRfb1xuICB8IEludF9DbyAtPiAnbycgfCBJbnRfdSB8IEludF9DdSAtPiAndSdcblxuKCogQ29udmVydCBhIGZsb2F0IGNvbnZlcnNpb24gdG8gY2hhci4gKilcbigqIGBjRicgd2lsbCBiZSAnRicgZm9yIGRpc3BsYXlpbmcgZm9ybWF0IGFuZCAnZycgdG8gY2FsbCBsaWJjIHByaW50ZiAqKVxubGV0IGNoYXJfb2ZfZmNvbnYgPyhjRj0nRicpIGZjb252ID0gbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIC0+ICdmJyB8IEZsb2F0X2UgLT4gJ2UnXG4gIHwgRmxvYXRfRSAtPiAnRScgfCBGbG9hdF9nIC0+ICdnJ1xuICB8IEZsb2F0X0cgLT4gJ0cnIHwgRmxvYXRfRiAtPiBjRlxuICB8IEZsb2F0X2ggLT4gJ2gnIHwgRmxvYXRfSCAtPiAnSCdcbiAgfCBGbG9hdF9DRiAtPiAnRidcblxuXG4oKiBDb252ZXJ0IGEgc2Nhbm5pbmcgY291bnRlciB0byBjaGFyLiAqKVxubGV0IGNoYXJfb2ZfY291bnRlciBjb3VudGVyID0gbWF0Y2ggY291bnRlciB3aXRoXG4gIHwgTGluZV9jb3VudGVyICAtPiAnbCdcbiAgfCBDaGFyX2NvdW50ZXIgIC0+ICduJ1xuICB8IFRva2VuX2NvdW50ZXIgLT4gJ04nXG5cbigqKiopXG5cbigqIFByaW50IGEgY2hhcl9zZXQgaW4gYSBidWZmZXIgd2l0aCB0aGUgT0NhbWwgZm9ybWF0IGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0ID1cbiAgbGV0IHJlYyBwcmludF9zdGFydCBzZXQgPVxuICAgIGxldCBpc19hbG9uZSBjID1cbiAgICAgIGxldCBiZWZvcmUsIGFmdGVyID0gQ2hhci4oY2hyIChjb2RlIGMgLSAxKSwgY2hyIChjb2RlIGMgKyAxKSkgaW5cbiAgICAgIGlzX2luX2NoYXJfc2V0IHNldCBjXG4gICAgICAmJiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCBiZWZvcmUgJiYgaXNfaW5fY2hhcl9zZXQgc2V0IGFmdGVyKSBpblxuICAgIGlmIGlzX2Fsb25lICddJyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nO1xuICAgIHByaW50X291dCBzZXQgMTtcbiAgICBpZiBpc19hbG9uZSAnLScgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICctJztcbiAgYW5kIHByaW50X291dCBzZXQgaSA9XG4gICAgaWYgaSA8IDI1NiB0aGVuXG4gICAgICBpZiBpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGkpIHRoZW4gcHJpbnRfZmlyc3Qgc2V0IGlcbiAgICAgIGVsc2UgcHJpbnRfb3V0IHNldCAoaSArIDEpXG4gIGFuZCBwcmludF9maXJzdCBzZXQgaSA9XG4gICAgbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnXFwyNTUnIC0+IHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICB8ICddJyB8ICctJyAtPiBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgfCBfIC0+IHByaW50X3NlY29uZCBzZXQgKGkgKyAxKTtcbiAgYW5kIHByaW50X3NlY29uZCBzZXQgaSA9XG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBpKSB0aGVuXG4gICAgICBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICAgIHwgJ1xcMjU1JyAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAyNTQ7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICAgIHwgJ10nIHwgJy0nIHdoZW4gbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IChpICsgMSkpKSAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgICBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgICB8IF8gd2hlbiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgKGkgKyAxKSkpIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIGk7XG4gICAgICAgIHByaW50X291dCBzZXQgKGkgKyAyKTtcbiAgICAgIHwgXyAtPlxuICAgICAgICBwcmludF9pbiBzZXQgKGkgLSAxKSAoaSArIDIpO1xuICAgIGVsc2UgKFxuICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgIHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICApXG4gIGFuZCBwcmludF9pbiBzZXQgaSBqID1cbiAgICBpZiBqID0gMjU2IHx8IG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBqKSkgdGhlbiAoXG4gICAgICBwcmludF9jaGFyIGJ1ZiBpO1xuICAgICAgcHJpbnRfY2hhciBidWYgKGludF9vZl9jaGFyICctJyk7XG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaiAtIDEpO1xuICAgICAgaWYgaiA8IDI1NiB0aGVuIHByaW50X291dCBzZXQgKGogKyAxKTtcbiAgICApIGVsc2VcbiAgICAgIHByaW50X2luIHNldCBpIChqICsgMSk7XG4gIGFuZCBwcmludF9jaGFyIGJ1ZiBpID0gbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnJScgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICAgIHwgJ0AnIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICdAJztcbiAgICB8IGMgICAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGluXG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ1snO1xuICBwcmludF9zdGFydCAoXG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgJ1xcMDAwJ1xuICAgIHRoZW4gKCBidWZmZXJfYWRkX2NoYXIgYnVmICdeJzsgcmV2X2NoYXJfc2V0IGNoYXJfc2V0IClcbiAgICBlbHNlIGNoYXJfc2V0XG4gICk7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nXG5cbigqKiopXG5cbigqIFByaW50IGEgcGFkdHkgaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wYWR0eSBidWYgcGFkdHkgPSBtYXRjaCBwYWR0eSB3aXRoXG4gIHwgTGVmdCAgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLSdcbiAgfCBSaWdodCAtPiAoKVxuICB8IFplcm9zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJzAnXG5cbigqIFByaW50IHRoZSAnXycgb2YgYW4gaWdub3JlZCBmbGFnIGlmIG5lZWRlZC4gKilcbmxldCBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZyA9XG4gIGlmIGlnbl9mbGFnIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXydcblxuKCoqKilcblxubGV0IGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgd2lkdGggLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIHdpZHRoKVxuXG4oKioqKVxuXG4oKiBQcmludCBwYWRkaW5nIGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcGFkZGluZyA6IHR5cGUgYSBiIC4gYnVmZmVyIC0+IChhLCBiKSBwYWRkaW5nIC0+IHVuaXQgPVxuZnVuIGJ1ZiBwYWQgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nIC0+ICgpXG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCBuKSAtPlxuICAgIGJwcmludF9wYWR0eSBidWYgcGFkdHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wYWRkaW5nIHBhZHR5IC0+XG4gICAgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcqJ1xuXG4oKiBQcmludCBwcmVjaXNpb24gaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wcmVjaXNpb24gOiB0eXBlIGEgYiAuIGJ1ZmZlciAtPiAoYSwgYikgcHJlY2lzaW9uIC0+IHVuaXQgPVxuICBmdW4gYnVmIHByZWMgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uIC0+ICgpXG4gIHwgTGl0X3ByZWNpc2lvbiBuIC0+XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLic7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wcmVjaXNpb24gLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIuKlwiXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBvciAnIycgYXNzb2NpYXRlZCB0byBhbiBpbnQgY29udmVyc2lvbi4gKilcbmxldCBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnYgPSBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X3BkIHwgSW50X3BpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgSW50X3NkIHwgSW50X3NpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgSW50X0N4IHwgSW50X0NYIHwgSW50X0NvIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcjJ1xuICB8IEludF9kIHwgSW50X2kgfCBJbnRfeCB8IEludF9YIHwgSW50X28gfCBJbnRfdSAtPiAoKVxuXG4oKiBQcmludCBhbiBjb21wbGV0ZSBpbnQgZm9ybWF0IGluIGEgYnVmZmVyIChleDogXCIlMy4qZFwiKS4gKilcbmxldCBicHJpbnRfaW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9pY29udiBpY29udilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBhbmQvb3IgJyMnIGFzc29jaWF0ZWQgdG8gYSBmbG9hdCBjb252ZXJzaW9uLiAqKVxubGV0IGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udiA9XG4gIGJlZ2luIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZmxhZ19wIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgRmxvYXRfZmxhZ19zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgRmxvYXRfZmxhZ18gLT4gKCkgZW5kO1xuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X0NGIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyMnXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0dcbiAgfCBGbG9hdF9GIHwgRmxvYXRfaCB8IEZsb2F0X0ggLT4gKClcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmbG9hdCBmb3JtYXQgaW4gYSBidWZmZXIgKGV4OiBcIiUrKi4zZlwiKS4gKilcbmxldCBicHJpbnRfZmxvYXRfZm10IGJ1ZiBpZ25fZmxhZyBmY29udiBwYWQgcHJlYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2Zjb252IGZjb252KVxuXG4oKiBDb21wdXRlIHRoZSBsaXRlcmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEZvcm1hdHRpbmdfbGl0LiAqKVxuKCogVXNlZCBieSBQcmludGYgYW5kIFNjYW5mIHdoZXJlIGZvcm1hdHRpbmcgaXMgbm90IGludGVycHJldGVkLiAqKVxubGV0IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmb3JtYXR0aW5nX2xpdCA9IG1hdGNoIGZvcm1hdHRpbmdfbGl0IHdpdGhcbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAtPiBcIkBdXCJcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAtPiBcIkB9XCJcbiAgfCBCcmVhayAoc3RyLCBfLCBfKSAgICAtPiBzdHJcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAtPiBcIkA/XCJcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAtPiBcIkBcXG5cIlxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgIC0+IFwiQC5cIlxuICB8IE1hZ2ljX3NpemUgKHN0ciwgXykgIC0+IHN0clxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgIC0+IFwiQEBcIlxuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgIC0+IFwiQCVcIlxuICB8IFNjYW5faW5kaWMgYyAtPiBcIkBcIiBeIChTdHJpbmcubWFrZSAxIGMpXG5cbigqKiopXG5cbigqIFByaW50IGEgbGl0ZXJhbCBjaGFyIGluIGEgYnVmZmVyLCBlc2NhcGUgJyUnIGJ5IFwiJSVcIi4gKilcbmxldCBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBjaHIgPSBtYXRjaCBjaHIgd2l0aFxuICB8ICclJyAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlJVwiXG4gIHwgXyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGNoclxuXG4oKiBQcmludCBhIGxpdGVyYWwgc3RyaW5nIGluIGEgYnVmZmVyLCBlc2NhcGUgYWxsICclJyBieSBcIiUlXCIuICopXG5sZXQgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBzdHIgPVxuICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzdHIgLSAxIGRvXG4gICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgc3RyLltpXVxuICBkb25lXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwcmV0dHktcHJpbnRpbmcgKilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmb3JtYXQgdHlwZSAoYW4gZm10dHkpIGluIGEgYnVmZmVyLiAqKVxubGV0IHJlYyBicHJpbnRfZm10dHkgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgICBidWZmZXIgLT4gKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIGZtdHR5X3JlbCAtPiB1bml0ID1cbmZ1biBidWYgZm10dHkgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVjXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXNcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlaVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludDMyX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVsaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJW5pXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlTGlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEZsb2F0X3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVmXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQm9vbF90eSByZXN0ICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJUJcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBBbHBoYV90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlYVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFRoZXRhX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV0XCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQW55X3R5IHJlc3QgICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJT9cIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBSZWFkZXJfdHkgcmVzdCAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlclwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVfclwiO1xuICAgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IEZvcm1hdF9hcmdfdHkgKHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIle1wiOyBicHJpbnRfZm10dHkgYnVmIHN1Yl9mbXR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlfVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgRm9ybWF0X3N1YnN0X3R5IChzdWJfZm10dHksIF8sIHJlc3QpIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJShcIjsgYnByaW50X2ZtdHR5IGJ1ZiBzdWJfZm10dHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgRW5kX29mX2ZtdHR5IC0+ICgpXG5cbigqKiopXG5cbmxldCByZWMgaW50X29mX2N1c3RvbV9hcml0eSA6IHR5cGUgYSBiIGMgLlxuICAoYSwgYiwgYykgY3VzdG9tX2FyaXR5IC0+IGludCA9XG4gIGZ1bmN0aW9uXG4gIHwgQ3VzdG9tX3plcm8gLT4gMFxuICB8IEN1c3RvbV9zdWNjIHggLT4gMSArIGludF9vZl9jdXN0b21fYXJpdHkgeFxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfZm10IGJ1ZiBmbXQgPVxuICBsZXQgcmVjIGZtdGl0ZXIgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYm9vbCAtPiB1bml0ID1cbiAgZnVuIGZtdCBpZ25fZmxhZyAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdzJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdTJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2ludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ2wnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICduJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICdMJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2Zsb2F0X2ZtdCBidWYgaWduX2ZsYWcgZmNvbnYgcGFkIHByZWM7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IENoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnYyc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdDJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQic7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBBbHBoYSByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdhJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAndCc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpIC0+XG4gICAgICBmb3IgX2kgPSAxIHRvIGludF9vZl9jdXN0b21fYXJpdHkgYXJpdHkgZG9cbiAgICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICc/JztcbiAgICAgIGRvbmU7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBSZWFkZXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAncic7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsdXNoIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUhXCI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIHN0cjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgY2hyO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0OyBidWZmZXJfYWRkX2NoYXIgYnVmICd7JztcbiAgICAgIGJwcmludF9mbXR0eSBidWYgZm10dHk7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICd9JztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICBicHJpbnRfZm10dHkgYnVmIGZtdHR5OyBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKSc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgd2lkdGhfb3B0OyBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0O1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfY291bnRlciBjb3VudGVyKTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgXCIwY1wiOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICAgIGZtdGl0ZXIgZm10JyB0cnVlO1xuXG4gICAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgKHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0KTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggZm10aW5nX2dlbiB3aXRoXG4gICAgICB8IE9wZW5fdGFnIChGb3JtYXQgKF8sIHN0cikpIC0+XG4gICAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIkB7XCI7IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzdHJcbiAgICAgIHwgT3Blbl9ib3ggKEZvcm1hdCAoXywgc3RyKSkgLT5cbiAgICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiQFtcIjsgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHN0clxuICAgICAgZW5kO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+ICgpXG5cbiAgaW4gZm10aXRlciBmbXQgZmFsc2VcblxuKCoqKilcblxuKCogQ29udmVydCBhIGZvcm1hdCB0byBzdHJpbmcuICopXG5sZXQgc3RyaW5nX29mX2ZtdCBmbXQgPVxuICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICBicHJpbnRfZm10IGJ1ZiBmbXQ7XG4gIGJ1ZmZlcl9jb250ZW50cyBidWZcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVHlwZSBleHRyYWN0aW9uICopXG5cbnR5cGUgKF8sIF8pIGVxID0gUmVmbCA6ICgnYSwgJ2EpIGVxXG5cbigqIEludmFyaWFudDogdGhpcyBmdW5jdGlvbiBpcyB0aGUgaWRlbnRpdHkgb24gdmFsdWVzLlxuXG4gICBJbiBwYXJ0aWN1bGFyLCBpZiAodHkxLCB0eTIpIGhhdmUgZXF1YWwgdmFsdWVzLCB0aGVuXG4gICAodHJhbnMgKHN5bW0gdHkxKSB0eTIpIHJlc3BlY3RzIHRoZSAndHJhbnMnIHByZWNvbmRpdGlvbi4gKilcbmxldCByZWMgc3ltbSA6IHR5cGUgYTEgYjEgYzEgZDEgZTEgZjEgYTIgYjIgYzIgZDIgZTIgZjIgLlxuICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4tPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMixcbiAgICBhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXR0eV9yZWxcbj0gZnVuY3Rpb25cbiAgfCBDaGFyX3R5IHJlc3QgLT4gQ2hhcl90eSAoc3ltbSByZXN0KVxuICB8IEludF90eSByZXN0IC0+IEludF90eSAoc3ltbSByZXN0KVxuICB8IEludDMyX3R5IHJlc3QgLT4gSW50MzJfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnQ2NF90eSByZXN0IC0+IEludDY0X3R5IChzeW1tIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gTmF0aXZlaW50X3R5IChzeW1tIHJlc3QpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPiBGbG9hdF90eSAoc3ltbSByZXN0KVxuICB8IEJvb2xfdHkgcmVzdCAtPiBCb29sX3R5IChzeW1tIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT4gU3RyaW5nX3R5IChzeW1tIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPiBUaGV0YV90eSAoc3ltbSByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT4gQWxwaGFfdHkgKHN5bW0gcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPiBBbnlfdHkgKHN5bW0gcmVzdClcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPiBSZWFkZXJfdHkgKHN5bW0gcmVzdClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+IElnbm9yZWRfcmVhZGVyX3R5IChzeW1tIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIHN5bW0gcmVzdClcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkyLCB0eTEsIHN5bW0gcmVzdClcbiAgfCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG5cbmxldCByZWMgZm10dHlfcmVsX2RldCA6IHR5cGUgYTEgYiBjIGQxIGUxIGYxIGEyIGQyIGUyIGYyIC5cbiAgKGExLCBiLCBjLCBkMSwgZTEsIGYxLFxuICAgYTIsIGIsIGMsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoZjEsIGYyKSBlcSAtPiAoYTEsIGEyKSBlcSlcbiAgKiAoKGExLCBhMikgZXEgLT4gKGYxLCBmMikgZXEpXG4gICogKChlMSwgZTIpIGVxIC0+IChkMSwgZDIpIGVxKVxuICAqICgoZDEsIGQyKSBlcSAtPiAoZTEsIGUyKSBlcSlcbj0gZnVuY3Rpb25cbiAgfCBFbmRfb2ZfZm10dHkgLT5cbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbClcbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG4gIHwgRm9ybWF0X2FyZ190eSAoX3R5LCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgbGV0IGFnLCBnYSwgZGosIGpkID0gZm10dHlfcmVsX2RldCB0eSBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZyBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGdhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gbGV0IFJlZmwgPSBkaiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGpkIFJlZmwgaW4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG5cbigqIFByZWNvbmRpdGlvbjogd2UgYXNzdW1lIHRoYXQgdGhlIHR3byBmbXR0eV9yZWwgYXJndW1lbnRzIGhhdmUgZXF1YWxcbiAgIHZhbHVlcyAoYXQgcG9zc2libHkgZGlzdGluY3QgdHlwZXMpOyB0aGlzIGludmFyaWFudCBjb21lcyBmcm9tIHRoZSB3YXlcbiAgIGZtdHR5X3JlbCB3aXRuZXNzZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSB0eXBlLWNoZWNrZXJcblxuICAgVGhlIGNvZGUgYmVsb3cgdXNlcyAoYXNzZXJ0IGZhbHNlKSB3aGVuIHRoaXMgYXNzdW1wdGlvbiBpcyBicm9rZW4uIFRoZVxuICAgY29kZSBwYXR0ZXJuIGlzIHRoZSBmb2xsb3dpbmc6XG5cbiAgICAgfCBGb28geCwgRm9vIHkgLT5cbiAgICAgICAoKiBjYXNlIHdoZXJlIGluZGVlZCBib3RoIHZhbHVlc1xuICAgICAgICAgIHN0YXJ0IHdpdGggY29uc3RydWN0b3IgRm9vICopXG4gICAgIHwgRm9vIF8sIF9cbiAgICAgfCBfLCBGb28gXyAtPlxuICAgICAgICgqIGRpZmZlcmVudCBoZWFkIGNvbnN0cnVjdG9yczogYnJva2VuIHByZWNvbmRpdGlvbiAqKVxuICAgICAgIGFzc2VydCBmYWxzZVxuKilcbmFuZCB0cmFucyA6IHR5cGVcbiAgYTEgYjEgYzEgZDEgZTEgZjFcbiAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgYTMgYjMgYzMgZDMgZTMgZjNcbi5cbiAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIsXG4gICAgYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHlfcmVsXG4tPiAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eV9yZWxcbj0gZnVuIHR5MSB0eTIgLT4gbWF0Y2ggdHkxLCB0eTIgd2l0aFxuICB8IENoYXJfdHkgcmVzdDEsIENoYXJfdHkgcmVzdDIgLT4gQ2hhcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgU3RyaW5nX3R5IHJlc3QxLCBTdHJpbmdfdHkgcmVzdDIgLT4gU3RyaW5nX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBCb29sX3R5IHJlc3QxLCBCb29sX3R5IHJlc3QyIC0+IEJvb2xfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludF90eSByZXN0MSwgSW50X3R5IHJlc3QyIC0+IEludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50MzJfdHkgcmVzdDEsIEludDMyX3R5IHJlc3QyIC0+IEludDMyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnQ2NF90eSByZXN0MSwgSW50NjRfdHkgcmVzdDIgLT4gSW50NjRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IE5hdGl2ZWludF90eSByZXN0MSwgTmF0aXZlaW50X3R5IHJlc3QyIC0+IE5hdGl2ZWludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRmxvYXRfdHkgcmVzdDEsIEZsb2F0X3R5IHJlc3QyIC0+IEZsb2F0X3R5ICh0cmFucyByZXN0MSByZXN0MilcblxuICB8IEFscGhhX3R5IHJlc3QxLCBBbHBoYV90eSByZXN0MiAtPiBBbHBoYV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQWxwaGFfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBBbHBoYV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgVGhldGFfdHkgcmVzdDEsIFRoZXRhX3R5IHJlc3QyIC0+IFRoZXRhX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBUaGV0YV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIFRoZXRhX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBBbnlfdHkgcmVzdDEsIEFueV90eSByZXN0MiAtPiBBbnlfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEFueV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEFueV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgUmVhZGVyX3R5IHJlc3QxLCBSZWFkZXJfdHkgcmVzdDIgLT4gUmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBSZWFkZXJfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBSZWFkZXJfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QxLCBJZ25vcmVkX3JlYWRlcl90eSByZXN0MiAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIElnbm9yZWRfcmVhZGVyX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBGb3JtYXRfYXJnX3R5ICh0eTEsIHJlc3QxKSwgRm9ybWF0X2FyZ190eSAodHkyLCByZXN0MikgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0cmFucyB0eTEgdHkyLCB0cmFucyByZXN0MSByZXN0MilcbiAgfCBGb3JtYXRfYXJnX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRm9ybWF0X2FyZ190eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTExLCB0eTEyLCByZXN0MSksXG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTIxLCB0eTIyLCByZXN0MikgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEyKSB0eTIxIGluXG4gICAgbGV0IF8sIGYyLCBfLCBmNCA9IGZtdHR5X3JlbF9kZXQgdHkgaW5cbiAgICBsZXQgUmVmbCA9IGYyIFJlZmwgaW5cbiAgICBsZXQgUmVmbCA9IGY0IFJlZmwgaW5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MTEsIHR5MjIsIHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZvcm1hdF9zdWJzdF90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEZvcm1hdF9zdWJzdF90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRW5kX29mX2ZtdHR5LCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG4gIHwgRW5kX29mX2ZtdHR5LCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEVuZF9vZl9mbXR0eSAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHJlYyBmbXR0eV9vZl9mb3JtYXR0aW5nX2dlbiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm9ybWF0dGluZ19nZW4gLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGZvcm1hdHRpbmdfZ2VuIC0+IG1hdGNoIGZvcm1hdHRpbmdfZ2VuIHdpdGhcbiAgfCBPcGVuX3RhZyAoRm9ybWF0IChmbXQsIF8pKSAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgT3Blbl9ib3ggKEZvcm1hdCAoZm10LCBfKSkgLT4gZm10dHlfb2ZfZm10IGZtdFxuXG4oKiBFeHRyYWN0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIChhbiBmbXR0eSkgb2YgYSBmb3JtYXQuICopXG5hbmQgZm10dHlfb2ZfZm10IDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBmbXR0eSAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuXG4gIHwgSW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBJbnQzMiAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnQzMl90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBOYXRpdmVpbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoTmF0aXZlaW50X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEludDY0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludDY0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEZsb2F0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuXG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAgICAgICAgICAgLT5cbiAgICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChCb29sX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG4gIHwgQWxwaGEgcmVzdCAgICAgICAgICAgICAgICAgLT4gQWxwaGFfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgIC0+IFRoZXRhX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAgICAtPiBmbXR0eV9vZl9jdXN0b20gYXJpdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFJlYWRlciByZXN0ICAgICAgICAgICAgICAgIC0+IFJlYWRlcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGb3JtYXRfYXJnIChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0IChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5LCB0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGbHVzaCByZXN0ICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAgICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+IFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT4gSW50X3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAtPiBmbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdFxuICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpICAtPlxuICAgIGNvbmNhdF9mbXR0eSAoZm10dHlfb2ZfZm9ybWF0dGluZ19nZW4gZm10aW5nX2dlbikgKGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgLT4gRW5kX29mX2ZtdHR5XG5cbmFuZCBmbXR0eV9vZl9jdXN0b20gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICh5LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gYXJpdHkgZm10dHkgLT4gbWF0Y2ggYXJpdHkgd2l0aFxuICB8IEN1c3RvbV96ZXJvIC0+IGZtdHR5XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT4gQW55X3R5IChmbXR0eV9vZl9jdXN0b20gYXJpdHkgZm10dHkpXG5cbigqIEV4dHJhY3QgdGhlIGZtdHR5IG9mIGFuIGlnbm9yZWQgcGFyYW1ldGVyIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mXG4gICB0aGUgZm9ybWF0LiAqKVxuYW5kIGZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gY29uY2F0X2ZtdHR5IGZtdHR5IChmbXR0eV9vZl9mbXQgZm10KVxuICB8IElnbm9yZWRfcmVhZGVyICAgICAgICAgICAgICAgICAgLT4gSWdub3JlZF9yZWFkZXJfdHkgKGZtdHR5X29mX2ZtdCBmbXQpXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwYWRkaW5nIGlzIHRha2VuIGFzIGFuIGV4dHJhIGFyZ3VtZW50IChleDogXCIlKnNcIikuICopXG5hbmQgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSA6IHR5cGUgeCBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIGEpIHBhZGRpbmcgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwYWQgZm10dHkgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgICAgLT4gZm10dHlcbiAgICB8IExpdF9wYWRkaW5nIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wYWRkaW5nIF8gLT4gSW50X3R5IGZtdHR5XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwcmVjaXNpb24gaXMgdGFrZW4gYXMgYW4gZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUuKmZcIikuKilcbmFuZCBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgOiB0eXBlIHggYSBiIGMgZCBlIGYgLlxuICAgICh4LCBhKSBwcmVjaXNpb24gLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwcmVjIGZtdHR5IC0+IG1hdGNoIHByZWMgd2l0aFxuICAgIHwgTm9fcHJlY2lzaW9uICAgIC0+IGZtdHR5XG4gICAgfCBMaXRfcHJlY2lzaW9uIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wcmVjaXNpb24gICAtPiBJbnRfdHkgZm10dHlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgdHlwaW5nICopXG5cbigqIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIGZvcm1hdCBkb2VzIG5vdCBtYXRjaCBhIGdpdmVuIGZvcm1hdCB0eXBlLiAqKVxuZXhjZXB0aW9uIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIHBhZGRpbmcuICopXG4oKiBUYWtlIGFuIEludF90eSBmcm9tIHRoZSBmbXR0eSBpZiB0aGUgaW50ZWdlciBzaG91bGQgYmUga2VwdCBhcyBhcmd1bWVudC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkZGluZyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRkaW5nX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIGZtdHR5IC0+IG1hdGNoIHBhZCwgZm10dHkgd2l0aFxuICB8IE5vX3BhZGRpbmcsIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKE5vX3BhZGRpbmcsIGZtdHR5KVxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKExpdF9wYWRkaW5nIChwYWR0eSx3KSxmbXR0eSlcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgSW50X3R5IHJlc3QgLT4gUGFkZGluZ19mbXR0eV9FQkIgKEFyZ19wYWRkaW5nIHBhZHR5LHJlc3QpXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIENvbnZlcnQgYSAodXBhZGRpbmcsIHVwcmVjaXNpb24pIHRvIGEgKHBhZGRpbmcsIHByZWNpc2lvbikuICopXG4oKiBUYWtlIG9uZSBvciB0d28gSW50X3R5IGZyb20gdGhlIGZtdHR5IGlmIG5lZWRlZC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkcHJlYyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IHogLlxuICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeikgcHJlY2lzaW9uIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRwcmVjX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIHByZWMgZm10dHkgLT4gbWF0Y2ggcHJlYywgdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIE5vX3ByZWNpc2lvbiwgcmVzdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAsIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgTGl0X3ByZWNpc2lvbiBwLCByZXN0KVxuICB8IEFyZ19wcmVjaXNpb24sIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEludF90eSByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIEFyZ19wcmVjaXNpb24sIHJlc3QpXG4gIHwgXywgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBJZiB0eXBpbmcgc3VjY2VlZCwgZ2VuZXJhdGUgYSBjb3B5IG9mIHRoZSBmb3JtYXQgd2l0aCB0aGUgc2FtZVxuICAgIHR5cGUgcGFyYW1ldGVycyBhcyB0aGUgZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCByZWMgdHlwZV9mb3JtYXQgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjIgIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+IG1hdGNoIHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkgd2l0aFxuICB8IEZtdF9mbXR0eV9FQkIgKGZtdCcsIEVuZF9vZl9mbXR0eSkgLT4gZm10J1xuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG5hbmQgdHlwZV9mb3JtYXRfZ2VuIDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRfZm10dHlfZWJiXG49IGZ1biBmbXQgZm10dHkgLT4gbWF0Y2ggZm10LCBmbXR0eSB3aXRoXG4gIHwgQ2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXIgZm10JywgZm10dHknKVxuICB8IENhbWxfY2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfY2hhciBmbXQnLCBmbXR0eScpXG4gIHwgU3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKFN0cmluZyAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfc3RyaW5nIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50MzJfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludDMyIChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgTmF0aXZlaW50X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludDY0X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgRmxvYXRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEJvb2wgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEJvb2xfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEJvb2wgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbHVzaCBmbXRfcmVzdCwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGbHVzaCBmbXQnLCBmbXR0eScpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU3RyaW5nX2xpdGVyYWwgKHN0ciwgZm10JyksIGZtdHR5JylcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXJfbGl0ZXJhbCAoY2hyLCBmbXQnKSwgZm10dHknKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5LCBmbXRfcmVzdCksXG4gICAgRm9ybWF0X2FyZ190eSAoc3ViX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgc3ViX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWJfZm10dHknIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5JywgZm10JyksIGZtdHR5JylcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViX2ZtdHR5MSwgX3N1Yl9mbXR0eTIsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWJfZm10dHkxKSB0aGVuXG4gICAgICByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID1cbiAgICAgIHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCAoZXJhc2VfcmVsIGZtdHR5X3Jlc3QpXG4gICAgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eTEsIGZtdCcpLCBmbXR0eScpXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBBbHBoYSBmbXRfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChBbHBoYSBmbXQnLCBmbXR0eScpXG4gIHwgVGhldGEgZm10X3Jlc3QsIFRoZXRhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoVGhldGEgZm10JywgZm10dHknKVxuXG4gICgqIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXQnKSwgZm10dHknKVxuICB8IEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nX2dlbiwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgdHlwZV9mb3JtYXR0aW5nX2dlbiBmb3JtYXR0aW5nX2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0XG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IFJlYWRlciBmbXRfcmVzdCwgUmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoUmVhZGVyIGZtdCcsIGZtdHR5JylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXRfcmVzdCksIFN0cmluZ190eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdCcpLCBmbXR0eScpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpLCBJbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXQnKSwgZm10dHknKVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICB0eXBlX2lnbm9yZWRfcGFyYW0gaWduIHJlc3QgZm10dHlfcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCwgZm10dHlfcmVzdCAtPiBGbXRfZm10dHlfRUJCIChFbmRfb2ZfZm9ybWF0LCBmbXR0eV9yZXN0KVxuXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbmFuZCB0eXBlX2Zvcm1hdHRpbmdfZ2VuIDogdHlwZSBhMSBhMyBiMSBiMyBjMSBjMyBkMSBkMyBlMSBlMiBlMyBmMSBmMiBmMyAuXG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZvcm1hdHRpbmdfZ2VuIC0+XG4gICAgKGYxLCBiMSwgYzEsIGUxLCBlMiwgZjIpIGZtdCAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eSAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXRfZm10dHlfZWJiID1cbmZ1biBmb3JtYXR0aW5nX2dlbiBmbXQwIGZtdHR5MCAtPiBtYXRjaCBmb3JtYXR0aW5nX2dlbiB3aXRoXG4gIHwgT3Blbl90YWcgKEZvcm1hdCAoZm10MSwgc3RyKSkgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MiwgZm10dHkyKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQxIGZtdHR5MCBpblxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQzLCBmbXR0eTMpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDAgZm10dHkyIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdDIsIHN0cikpLCBmbXQzKSwgZm10dHkzKVxuICB8IE9wZW5fYm94IChGb3JtYXQgKGZtdDEsIHN0cikpIC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDIsIGZtdHR5MikgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MSBmbXR0eTAgaW5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MywgZm10dHkzKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQwIGZtdHR5MiBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQyLCBzdHIpKSwgZm10MyksIGZtdHR5MylcblxuKCogVHlwZSBhbiBJZ25vcmVkX3BhcmFtIG5vZGUgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuYW5kIHR5cGVfaWdub3JlZF9wYXJhbSA6IHR5cGUgcCBxIHggeSB6IHQgdSB2IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgeSwgeiwgdCwgcSwgcCkgaWdub3JlZCAtPlxuICAgIChwLCB5LCB6LCBxLCB1LCB2KSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10X2ZtdHR5X2ViYiA9XG5mdW4gaWduIGZtdCBmbXR0eSAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50IF8gICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50MzIgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfbmF0aXZlaW50IF8gICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50NjQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZmxvYXQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSAtPlxuICAgIHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgKElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSkgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSkgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5JywgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSkgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5IGZtdCBmbXR0eSBpblxuICAgIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQnKSxcbiAgICAgICAgICAgICAgICAgICBmbXR0eScpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT4gKFxuICAgIG1hdGNoIGZtdHR5IHdpdGhcbiAgICB8IElnbm9yZWRfcmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3JlYWRlciwgZm10JyksIGZtdHR5JylcbiAgICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG5cbmFuZCB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIDogdHlwZSBhMSBhMiBiMSBiMiBjMSBjMiBkMSBkMiBlMSBlMiBmMSBmMiAuXG4gICAgKGEyLCBiMiwgYzIsIGQyLCBkMiwgYTIpIGlnbm9yZWQgLT5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdF9mbXR0eV9lYmJcbj0gZnVuIGlnbiBmbXQgZm10dHkgLT5cbiAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5IGluXG4gIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbiwgZm10JyksIGZtdHR5JylcblxuKCogVHlwaW5nIG9mIHRoZSBjb21wbGV4IGNhc2U6IFwiJV8oLi4uJSlcIi4gKilcbmFuZCB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiA6IHR5cGUgdyB4IHkgeiBwIHMgdCB1IGEgYiBjIGQgZSBmIC5cbiAgICAodywgeCwgeSwgeiwgcywgcCkgZm10dHkgLT5cbiAgICAocCwgeCwgeSwgcywgdCwgdSkgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eV9mbXRfZWJiID1cbmZ1biBzdWJfZm10dHkgZm10IGZtdHR5IC0+IG1hdGNoIHN1Yl9mbXR0eSwgZm10dHkgd2l0aFxuICB8IENoYXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQ2hhcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0LCBTdHJpbmdfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludDMyX3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnQzMl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnQzMl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0LCBOYXRpdmVpbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnQ2NF90eSBzdWJfZm10dHlfcmVzdCwgSW50NjRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50NjRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEZsb2F0X3R5IHN1Yl9mbXR0eV9yZXN0LCBGbG9hdF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGbG9hdF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgQm9vbF90eSBzdWJfZm10dHlfcmVzdCwgQm9vbF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChCb29sX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBBbHBoYV90eSBzdWJfZm10dHlfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQWxwaGFfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFRoZXRhX3R5IHN1Yl9mbXR0eV9yZXN0LCBUaGV0YV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChUaGV0YV90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0LCBSZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBzdWJfZm10dHlfcmVzdCwgSWdub3JlZF9yZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSWdub3JlZF9yZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuXG4gIHwgRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eSwgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiBzdWIyX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWIyX2ZtdHR5JyB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5Jywgc3ViX2ZtdHR5X3Jlc3QnKSwgZm10JylcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHksICBzdWIyX2ZtdHR5LCAgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgICgqIFRPRE8gZGVmaW5lIEZtdHR5X3JlbF9FQkIgdG8gcmVtb3ZlIHRob3NlIGVyYXNlX3JlbCAqKVxuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHknKVxuICAgIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5JylcbiAgICB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IHN1Yl9mbXR0eScgPSB0cmFucyAoc3ltbSBzdWIxX2ZtdHR5Jykgc3ViMl9mbXR0eScgaW5cbiAgICBsZXQgXywgZjIsIF8sIGY0ID0gZm10dHlfcmVsX2RldCBzdWJfZm10dHknIGluXG4gICAgbGV0IFJlZmwgPSBmMiBSZWZsIGluXG4gICAgbGV0IFJlZmwgPSBmNCBSZWZsIGluXG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gKGVyYXNlX3JlbCBzdWJfZm10dHlfcmVzdCkgZm10IGZtdHR5X3Jlc3RcbiAgICBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbSBzdWJfZm10dHlfcmVzdCcpLFxuICAgICAgICAgICAgICAgICAgIGZtdCcpXG4gIHwgRW5kX29mX2ZtdHR5LCBmbXR0eSAtPlxuICAgIEZtdHR5X2ZtdF9FQkIgKEVuZF9vZl9mbXR0eSwgdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSlcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBgcmVjYXN0YCBpcyBhIGJpdCBkaXNhcHBvaW50aW5nLiBUaGVcbiAgIGludmFyaWFudCBwcm92aWRlZCBieSB0aGUgdHlwZSBhcmUgdmVyeSBzdHJvbmc6IHRoZSBpbnB1dCBmb3JtYXQnc1xuICAgdHlwZSBpcyBpbiByZWxhdGlvbiB0byB0aGUgb3V0cHV0IHR5cGUncyBhcyB3aXRuZXNzZWQgYnkgdGhlXG4gICBmbXR0eV9yZWwgYXJndW1lbnQuIE9uZSB3b3VsZCBhdCBmaXJzdCBleHBlY3QgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgdG90YWwsIGFuZCBpbXBsZW1lbnRhYmxlIGJ5IGV4aGF1c3RpdmUgcGF0dGVybiBtYXRjaGluZy4gSW5zdGVhZCxcbiAgIHdlIHJldXNlIHRoZSBoaWdobHkgcGFydGlhbCBhbmQgbXVjaCBsZXNzIHdlbGwtZGVmaW5lZCBmdW5jdGlvblxuICAgYHR5cGVfZm9ybWF0YCB0aGF0IGhhcyBsb3N0IGFsbCBrbm93bGVkZ2Ugb2YgdGhlIGNvcnJlc3BvbmRlbmNlXG4gICBiZXR3ZWVuIHRoZSBhcmd1bWVudCdzIHR5cGVzLlxuXG4gICBCZXNpZGVzIHRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXVzZXMgYSBsb3Qgb2YgdGhlXG4gICBgdHlwZV9mb3JtYXRgIGxvZ2ljIChlZy46IHNlZWluZyBJbnRfdHkgaW4gdGhlIGZtdHR5IHBhcmFtZXRlciBkb2VzXG4gICBub3QgbGV0IHlvdSBtYXRjaCBvbiBJbnQgb25seSwgYXMgeW91IG1heSBpbiBmYWN0IGhhdmUgRmxvYXRcbiAgIChBcmdfcGFkZGluZywgLi4uKSAoXCIlLipkXCIpIGJlZ2lubmluZyB3aXRoIGFuIEludF90eSksIGl0IGlzIGFsc29cbiAgIGEgcGFydGlhbCBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgdHlwaW5nIGluZm9ybWF0aW9uIGluIGEgZm9ybWF0IGlzXG4gICBub3QgcXVpdGUgZW5vdWdoIHRvIHJlY29uc3RydWN0IGl0IHVuYW1iaWd1b3VzbHkuIEZvciBleGFtcGxlLCB0aGVcbiAgIGZvcm1hdCB0eXBlcyBvZiBcIiVkJV9yXCIgYW5kIFwiJV9yJWRcIiBoYXZlIHRoZSBzYW1lIGZvcm1hdDZcbiAgIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGFyZSBub3QgYXQgYWxsIGV4Y2hhbmdlYWJsZSwgYW5kIHB1dHRpbmcgb25lXG4gICBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgbXVzdCByZXN1bHQgaW4gYSBkeW5hbWljIGZhaWx1cmUuXG5cbiAgIEdpdmVuIHRoYXQ6XG4gICAtIHdlJ2QgaGF2ZSB0byBkdXBsaWNhdGUgYSBsb3Qgb2Ygbm9uLXRyaXZpYWwgdHlwaW5nIGxvZ2ljIGZyb20gdHlwZV9mb3JtYXRcbiAgIC0gdGhpcyB3b3VsZG4ndCBldmVuIGVsaW1pbmF0ZSAoYWxsKSB0aGUgZHluYW1pYyBmYWlsdXJlc1xuICAgd2UgZGVjaWRlZCB0byBqdXN0IHJldXNlIHR5cGVfZm9ybWF0IGRpcmVjdGx5IGZvciBub3cuXG4qKVxubGV0IHJlY2FzdCA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMlxuICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+XG4gIHR5cGVfZm9ybWF0IGZtdCAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUHJpbnRpbmcgdG9vbHMgKilcblxuKCogQWRkIHBhZGRpbmcgc3BhY2VzIGFyb3VuZCBhIHN0cmluZy4gKilcbmxldCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCBzdHIgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHdpZHRoLCBwYWR0eSA9XG4gICAgYWJzIHdpZHRoLFxuICAgICgqIHdoaWxlIGxpdGVyYWwgcGFkZGluZyB3aWR0aHMgYXJlIGFsd2F5cyBub24tbmVnYXRpdmUsXG4gICAgICAgZHluYW1pY2FsbHktc2V0IHdpZHRocyAoQXJnX3BhZGRpbmcsIGVnLiAlKmQpIG1heSBiZSBuZWdhdGl2ZTtcbiAgICAgICB3ZSBpbnRlcnByZXQgdGhvc2UgYXMgc3BlY2lmeWluZyBhIHBhZGRpbmctdG8tdGhlLWxlZnQ7IHRoaXNcbiAgICAgICBtZWFucyB0aGF0ICcwJyBtYXkgZ2V0IGRyb3BwZWQgZXZlbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQsXG4gICAgICAgYnV0OlxuICAgICAgIC0gdGhpcyBpcyB3aGF0IHRoZSBsZWdhY3kgaW1wbGVtZW50YXRpb24gZG9lcywgYW5kXG4gICAgICAgICB3ZSBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IGlmIHBvc3NpYmxlXG4gICAgICAgLSB3ZSBjb3VsZCBvbmx5IHNpZ25hbCB0aGlzIGlzc3VlIGJ5IGZhaWxpbmcgYXQgcnVudGltZSxcbiAgICAgICAgIHdoaWNoIGlzIG5vdCB2ZXJ5IG5pY2UuLi4gKilcbiAgICBpZiB3aWR0aCA8IDAgdGhlbiBMZWZ0IGVsc2UgcGFkdHkgaW5cbiAgaWYgd2lkdGggPD0gbGVuIHRoZW4gc3RyIGVsc2VcbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSB3aWR0aCAoaWYgcGFkdHkgPSBaZXJvcyB0aGVuICcwJyBlbHNlICcgJykgaW5cbiAgICBiZWdpbiBtYXRjaCBwYWR0eSB3aXRoXG4gICAgfCBMZWZ0ICAtPiBTdHJpbmcuYmxpdCBzdHIgMCByZXMgMCBsZW5cbiAgICB8IFJpZ2h0IC0+IFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAwICYmIChzdHIuWzBdID0gJysnIHx8IHN0ci5bMF0gPSAnLScgfHwgc3RyLlswXSA9ICcgJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMCBzdHIuWzBdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzICh3aWR0aCAtIGxlbiArIDEpIChsZW4gLSAxKVxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAxICYmIHN0ci5bMF0gPSAnMCcgJiYgKHN0ci5bMV0gPSAneCcgfHwgc3RyLlsxXSA9ICdYJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMSBzdHIuWzFdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzICh3aWR0aCAtIGxlbiArIDIpIChsZW4gLSAyKVxuICAgIHwgWmVyb3MgLT5cbiAgICAgIFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIGVuZDtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBBZGQgJzAnIHBhZGRpbmcgdG8gaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gKilcbmxldCBmaXhfaW50X3ByZWNpc2lvbiBwcmVjIHN0ciA9XG4gIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIG1hdGNoIHN0ci5bMF0gd2l0aFxuICB8ICgnKycgfCAnLScgfCAnICcpIGFzIGMgd2hlbiBwcmVjICsgMSA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMSkgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAwIGM7XG4gICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzIChwcmVjIC0gbGVuICsgMikgKGxlbiAtIDEpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIHdoZW4gcHJlYyArIDIgPiBsZW4gJiYgbGVuID4gMSAmJiAoc3RyLlsxXSA9ICd4JyB8fCBzdHIuWzFdID0gJ1gnKSAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMikgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAxIHN0ci5bMV07XG4gICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzIChwcmVjIC0gbGVuICsgNCkgKGxlbiAtIDIpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHdoZW4gcHJlYyA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIHByZWMgJzAnIGluXG4gICAgU3RyaW5nLmJsaXQgc3RyIDAgcmVzIChwcmVjIC0gbGVuKSBsZW47XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCBfIC0+XG4gICAgc3RyXG5cbigqIEVzY2FwZSBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGluZyBjb252ZW50aW9uLiAqKVxubGV0IHN0cmluZ190b19jYW1sX3N0cmluZyBzdHIgPVxuICBsZXQgc3RyID0gU3RyaW5nLmVzY2FwZWQgc3RyIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKGwgKyAyKSAnXFxcIicgaW5cbiAgU3RyaW5nLnVuc2FmZV9ibGl0IHN0ciAwIHJlcyAxIGw7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfaW50L2ludDMyL25hdGl2ZWludC9pbnQ2NCBmaXJzdCBhcmd1bWVudFxuICAgZnJvbSBhbiBpbnRfY29udi4gKilcbmxldCBmb3JtYXRfb2ZfaWNvbnYgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWRcIiB8IEludF9wZCAtPiBcIiUrZFwiIHwgSW50X3NkIC0+IFwiJSBkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVpXCIgfCBJbnRfcGkgLT4gXCIlK2lcIiB8IEludF9zaSAtPiBcIiUgaVwiXG4gIHwgSW50X3ggLT4gXCIleFwiIHwgSW50X0N4IC0+IFwiJSN4XCJcbiAgfCBJbnRfWCAtPiBcIiVYXCIgfCBJbnRfQ1ggLT4gXCIlI1hcIlxuICB8IEludF9vIC0+IFwiJW9cIiB8IEludF9DbyAtPiBcIiUjb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIldVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZMID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVMZFwiIHwgSW50X3BkIC0+IFwiJStMZFwiIHwgSW50X3NkIC0+IFwiJSBMZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlTGlcIiB8IEludF9waSAtPiBcIiUrTGlcIiB8IEludF9zaSAtPiBcIiUgTGlcIlxuICB8IEludF94IC0+IFwiJUx4XCIgfCBJbnRfQ3ggLT4gXCIlI0x4XCJcbiAgfCBJbnRfWCAtPiBcIiVMWFwiIHwgSW50X0NYIC0+IFwiJSNMWFwiXG4gIHwgSW50X28gLT4gXCIlTG9cIiB8IEludF9DbyAtPiBcIiUjTG9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJUx1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udmwgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWxkXCIgfCBJbnRfcGQgLT4gXCIlK2xkXCIgfCBJbnRfc2QgLT4gXCIlIGxkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVsaVwiIHwgSW50X3BpIC0+IFwiJStsaVwiIHwgSW50X3NpIC0+IFwiJSBsaVwiXG4gIHwgSW50X3ggLT4gXCIlbHhcIiB8IEludF9DeCAtPiBcIiUjbHhcIlxuICB8IEludF9YIC0+IFwiJWxYXCIgfCBJbnRfQ1ggLT4gXCIlI2xYXCJcbiAgfCBJbnRfbyAtPiBcIiVsb1wiIHwgSW50X0NvIC0+IFwiJSNsb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlbHVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252biA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlbmRcIiB8IEludF9wZCAtPiBcIiUrbmRcIiB8IEludF9zZCAtPiBcIiUgbmRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJW5pXCIgfCBJbnRfcGkgLT4gXCIlK25pXCIgfCBJbnRfc2kgLT4gXCIlIG5pXCJcbiAgfCBJbnRfeCAtPiBcIiVueFwiIHwgSW50X0N4IC0+IFwiJSNueFwiXG4gIHwgSW50X1ggLT4gXCIlblhcIiB8IEludF9DWCAtPiBcIiUjblhcIlxuICB8IEludF9vIC0+IFwiJW5vXCIgfCBJbnRfQ28gLT4gXCIlI25vXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVudVwiXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfZmxvYXQgZmlyc3QgYXJndW1lbnQgZnJvbSBhIGZsb2F0X2NvbnYuICopXG5sZXQgZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMgPVxuICAgIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgICBsZXQgc3ltYiA9IGNoYXJfb2ZfZmNvbnYgfmNGOidnJyBmY29udiBpblxuICAgIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gICAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy4nO1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBwcmVjKTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmIHN5bWI7XG4gICAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG5sZXQgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgcyA9XG4gIG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgLT5cbiAgICBsZXQgZGlnaXRzID1cbiAgICAgIGxldCBuID0gcmVmIDAgaW5cbiAgICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgIHwgJzAnLi4nOScgLT4gaW5jciBuXG4gICAgICAgIHwgXyAtPiAoKVxuICAgICAgZG9uZTtcbiAgICAgICFuXG4gICAgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAoZGlnaXRzIC0gMSkgLyAzKSBpblxuICAgIGxldCBwb3MgPSByZWYgMCBpblxuICAgIGxldCBwdXQgYyA9IEJ5dGVzLnNldCBidWYgIXBvcyBjOyBpbmNyIHBvcyBpblxuICAgIGxldCBsZWZ0ID0gcmVmICgoZGlnaXRzIC0gMSkgbW9kIDMgKyAxKSBpblxuICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgfCAnMCcuLic5JyBhcyBjIC0+XG4gICAgICAgICAgaWYgIWxlZnQgPSAwIHRoZW4gKHB1dCAnXyc7IGxlZnQgOj0gMyk7IGRlY3IgbGVmdDsgcHV0IGNcbiAgICAgIHwgYyAtPiBwdXQgY1xuICAgIGRvbmU7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgfCBfIC0+IHNcblxuKCogQ29udmVydCBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIGNvbnZlcnNpb24uICopXG5sZXQgY29udmVydF9pbnQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50IChmb3JtYXRfb2ZfaWNvbnYgaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQzMiBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQzMiAoZm9ybWF0X29mX2ljb252bCBpY29udikgbilcbmxldCBjb252ZXJ0X25hdGl2ZWludCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9uYXRpdmVpbnQgKGZvcm1hdF9vZl9pY29udm4gaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQ2NCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQ2NCAoZm9ybWF0X29mX2ljb252TCBpY29udikgbilcblxuKCogQ29udmVydCBhIGZsb2F0IHRvIHN0cmluZy4gKilcbigqIEZpeCBzcGVjaWFsIGNhc2Ugb2YgXCJPQ2FtbCBmbG9hdCBmb3JtYXRcIi4gKilcbmxldCBjb252ZXJ0X2Zsb2F0IGZjb252IHByZWMgeCA9XG4gIGxldCBoZXggKCkgPVxuICAgIGxldCBzaWduID1cbiAgICAgIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gICAgICB8IEZsb2F0X2ZsYWdfcCAtPiAnKydcbiAgICAgIHwgRmxvYXRfZmxhZ19zIC0+ICcgJ1xuICAgICAgfCBfIC0+ICctJyBpblxuICAgIGhleHN0cmluZ19vZl9mbG9hdCB4IHByZWMgc2lnbiBpblxuICBsZXQgYWRkX2RvdF9pZl9uZWVkZWQgc3RyID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZXQgcmVjIGlzX3ZhbGlkIGkgPVxuICAgICAgaWYgaSA9IGxlbiB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltpXSB3aXRoXG4gICAgICAgIHwgJy4nIHwgJ2UnIHwgJ0UnIC0+IHRydWVcbiAgICAgICAgfCBfIC0+IGlzX3ZhbGlkIChpICsgMSkgaW5cbiAgICBpZiBpc192YWxpZCAwIHRoZW4gc3RyIGVsc2Ugc3RyIF4gXCIuXCIgaW5cbiAgbGV0IGNhbWxfc3BlY2lhbF92YWwgc3RyID0gbWF0Y2ggY2xhc3NpZnlfZmxvYXQgeCB3aXRoXG4gICAgfCBGUF9ub3JtYWwgfCBGUF9zdWJub3JtYWwgfCBGUF96ZXJvIC0+IHN0clxuICAgIHwgRlBfaW5maW5pdGUgLT4gaWYgeCA8IDAuMCB0aGVuIFwibmVnX2luZmluaXR5XCIgZWxzZSBcImluZmluaXR5XCJcbiAgICB8IEZQX25hbiAtPiBcIm5hblwiIGluXG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfaCAtPiBoZXggKClcbiAgfCBGbG9hdF9IIC0+IFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGhleCAoKSlcbiAgfCBGbG9hdF9DRiAtPiBjYW1sX3NwZWNpYWxfdmFsIChoZXggKCkpXG4gIHwgRmxvYXRfRiAtPlxuICAgIGxldCBzdHIgPSBmb3JtYXRfZmxvYXQgKGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjKSB4IGluXG4gICAgY2FtbF9zcGVjaWFsX3ZhbCAoYWRkX2RvdF9pZl9uZWVkZWQgc3RyKVxuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HIC0+XG4gICAgZm9ybWF0X2Zsb2F0IChmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYykgeFxuXG4oKiBDb252ZXJ0IGEgY2hhciB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBmb3JtYXRfY2FtbF9jaGFyIGMgPVxuICBsZXQgc3RyID0gQ2hhci5lc2NhcGVkIGMgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgcmVzID0gQnl0ZXMubWFrZSAobCArIDIpICdcXCcnIGluXG4gIFN0cmluZy51bnNhZmVfYmxpdCBzdHIgMCByZXMgMSBsO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBDb252ZXJ0IGEgZm9ybWF0IHR5cGUgdG8gc3RyaW5nICopXG5sZXQgc3RyaW5nX29mX2ZtdHR5IGZtdHR5ID1cbiAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTtcbiAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBwcmludGluZyBmdW5jdGlvbiAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBwcmludGluZyBmdW5jdGlvbi4gKilcbigqIFVzZWQgdG8gZ2VuZXJhdGUgUHJpbnRmIGFuZCBGb3JtYXQgcHJpbnRpbmcgZnVuY3Rpb25zLiAqKVxuKCogUGFyYW1ldGVyczpcbiAgICAgazogYSBjb250aW51YXRpb24gZmluYWxseSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gICAgIG86IHRoZSBvdXRwdXQgc3RyZWFtIChzZWUgaywgJWEgYW5kICV0KS5cbiAgICAgYWNjOiByZXYgbGlzdCBvZiBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzaCwgZm9ybWF0dGluZywgLi4uKS5cbiAgICAgZm10OiB0aGUgZm9ybWF0LiAqKVxubGV0IHJlYyBtYWtlX3ByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IENoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX2NoYXIgKGFjYywgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZm9ybWF0X2NhbWxfY2hhciBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgKGZ1biBzdHIgLT4gc3RyKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ190b19jYW1sX3N0cmluZ1xuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50IGljb252XG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludDMyIGljb252XG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9uYXRpdmVpbnQgaWNvbnZcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50NjQgaWNvbnZcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2Zsb2F0X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgZmNvbnZcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ19vZl9ib29sXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIGZ1biBmIHggLT4gbWFrZV9wcmludGYgayAoQWNjX2RlbGF5IChhY2MsIGZ1biBvIC0+IGYgbyB4KSkgcmVzdFxuICB8IFRoZXRhIHJlc3QgLT5cbiAgICBmdW4gZiAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGVsYXkgKGFjYywgZikpIHJlc3RcbiAgfCBDdXN0b20gKGFyaXR5LCBmLCByZXN0KSAtPlxuICAgIG1ha2VfY3VzdG9tIGsgYWNjIHJlc3QgYXJpdHkgKGYgKCkpXG4gIHwgUmVhZGVyIF8gLT5cbiAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICopXG4gICAgKCogSW5kZWVkLCBzaW5jZSBwcmludGYgYW5kIGNvLiB0YWtlIGEgZm9ybWF0NCBhcyBhcmd1bWVudCwgdGhlICdkIGFuZCAnZVxuICAgICAgIHR5cGUgcGFyYW1ldGVycyBvZiBmbXQgYXJlIG9idmlvdXNseSBlcXVhbHMuIFRoZSBSZWFkZXIgaXMgdGhlXG4gICAgICAgb25seSBjb25zdHJ1Y3RvciB3aGljaCB0b3VjaCAnZCBhbmQgJ2UgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtYXRcbiAgICAgICB0eXBlLCBpdCBhZGRzIGFuICgtPikgdG8gdGhlICdkIHBhcmFtZXRlcnMuIENvbnNlcXVlbnRseSwgYSBmb3JtYXQ0XG4gICAgICAgY2Fubm90IGNvbnRhaW4gYSBSZWFkZXIgbm9kZSwgZXhjZXB0IGluIHRoZSBzdWItZm9ybWF0IGFzc29jaWF0ZWQgdG9cbiAgICAgICBhbiAley4uLiV9LiBJdCdzIG5vdCBhIHByb2JsZW0gYmVjYXVzZSBtYWtlX3ByaW50ZiBkbyBub3QgY2FsbFxuICAgICAgIGl0c2VsZiByZWN1cnNpdmVseSBvbiB0aGUgc3ViLWZvcm1hdCBhc3NvY2lhdGVkIHRvICV7Li4uJX0uICopXG4gICAgYXNzZXJ0IGZhbHNlXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mbHVzaCBhY2MpIHJlc3RcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX3N0cmluZ19saXRlcmFsIChhY2MsIHN0cikpIHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfY2hhcl9saXRlcmFsIChhY2MsIGNocikpIHJlc3RcblxuICB8IEZvcm1hdF9hcmcgKF8sIHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSBzdHJpbmdfb2ZfZm10dHkgc3ViX2ZtdHR5IGluXG4gICAgKGZ1biBzdHIgLT5cbiAgICAgIGlnbm9yZSBzdHI7XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHkpKSByZXN0KVxuICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpIC0+XG4gICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+IG1ha2VfcHJpbnRmIGsgYWNjXG4gICAgICAoY29uY2F0X2ZtdCAocmVjYXN0IGZtdCBmbXR0eSkgcmVzdClcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+XG4gICAgbGV0IG5ld19hY2MgPSBBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVbXCIpIGluXG4gICAgZnVuIF8gLT4gbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPlxuICAgICgqIFRoaXMgY2FzZSBzaG91bGQgYmUgcmVmdXNlZCBmb3IgUHJpbnRmLiAqKVxuICAgICgqIEFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqKVxuICAgICgqIEludGVycHJldCAlbCwgJW4gYW5kICVMIGFzICV1LiAqKVxuICAgIGZ1biBuIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmb3JtYXRfaW50IFwiJXVcIiBuKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfY2hhciAoYWNjLCBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgbWFrZV9pZ25vcmVkX3BhcmFtIGsgYWNjIGlnbiByZXN0XG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19saXQgKGFjYywgZm10aW5nX2xpdCkpIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl90YWcga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl9ib3gga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBrIGFjY1xuXG4oKiBEZWxheSB0aGUgZXJyb3IgKEludmFsaWRfYXJndW1lbnQgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpLiAqKVxuKCogR2VuZXJhdGUgZnVuY3Rpb25zIHRvIHRha2UgcmVtYWluaW5nIGFyZ3VtZW50cyAoYWZ0ZXIgdGhlIFwiJV9cIikuICopXG5hbmQgbWFrZV9pZ25vcmVkX3BhcmFtIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgZm10dHkgZm10XG4gIHwgSWdub3JlZF9yZWFkZXIgICAgICAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcblxuXG4oKiBTcGVjaWFsIGNhc2Ugb2YgcHJpbnRmIFwiJV8oXCIuICopXG5hbmQgbWFrZV9mcm9tX2ZtdHR5IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgZm10dHkgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50X3R5IHJlc3QgICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBSZWFkZXJfdHkgXyAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBGb3JtYXRfYXJnX3R5IChfLCByZXN0KSAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogSW5zZXJ0IGFuIEFjY19pbnZhbGlkX2FyZyBpbiB0aGUgYWNjdW11bGF0b3IgYW5kIGNvbnRpbnVlIHRvIGdlbmVyYXRlXG4gICBjbG9zdXJlcyB0byBnZXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICopXG5hbmQgbWFrZV9pbnZhbGlkX2FyZyA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPlxuICBtYWtlX3ByaW50ZiBrIChBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpKSBmbXRcblxuKCogRml4IHBhZGRpbmcsIHRha2UgaXQgYXMgYW4gZXh0cmEgaW50ZWdlciBhcmd1bWVudCBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9wYWRkaW5nIDogdHlwZSB4IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHogLT4gYSkgcGFkZGluZyAtPiAoeiAtPiBzdHJpbmcpIC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCB0cmFucyAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHJhbnMgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCAodHJhbnMgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHkgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcblxuKCogRml4IHBhZGRpbmcgYW5kIHByZWNpc2lvbiBmb3IgaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0LiAqKVxuKCogVGFrZSBvbmUgb3IgdHdvIGV4dHJhIGludGVnZXIgYXJndW1lbnRzIGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IChpbnRfY29udiAtPiB6IC0+IHN0cmluZykgLT5cbiAgICBpbnRfY29udiAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgcHJlYyB0cmFucyBpY29udiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gdHJhbnMgaWNvbnYgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuXG4oKiBDb252ZXJ0IGEgZmxvYXQsIGZpeCBwYWRkaW5nIGFuZCBwcmVjaXNpb24gaWYgbmVlZGVkLiAqKVxuKCogVGFrZSB0aGUgZmxvYXQgYXJndW1lbnQgYW5kIG9uZSBvciB0d28gZXh0cmEgaW50ZWdlciBhcmd1bWVudHMgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfZmxvYXRfcGFkZGluZ19wcmVjaXNpb24gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgZmxvYXQgLT4gYSkgcHJlY2lzaW9uIC0+IGZsb2F0X2NvbnYgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHByZWMgZmNvbnYgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiBwIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbmFuZCBtYWtlX2N1c3RvbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4geCAtPiB5ID1cbiAgZnVuIGsgYWNjIHJlc3QgYXJpdHkgZiAtPiBtYXRjaCBhcml0eSB3aXRoXG4gIHwgQ3VzdG9tX3plcm8gLT4gbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIGYpKSByZXN0XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbWFrZV9jdXN0b20gayBhY2MgcmVzdCBhcml0eSAoZiB4KVxuXG5sZXQgY29uc3QgeCBfID0geFxuXG5sZXQgcmVjIG1ha2VfaXByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPiBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuICBmdW4gayBvIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgQ2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBDYW1sX3N0cmluZyAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfc3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9zdHJpbmcgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50MzIgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IE5hdGl2ZWludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50NjQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBCb29sIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQm9vbCAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEJvb2wgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEFscGhhIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfY3VzdG9tX2FyaXR5IGsgbyByZXN0IGFyaXR5XG4gICAgfCBSZWFkZXIgXyAtPlxuICAgICAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICBTZWUgdGhlXG4gICAgICAgICAgIG5vdGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FzZSBmb3IgbWFrZV9wcmludGYuICopXG4gICAgICAgIGFzc2VydCBmYWxzZVxuICAgIHwgRmx1c2ggcmVzdCAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBGb3JtYXRfYXJnIChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+XG4gICAgICAgICAgbWFrZV9pcHJpbnRmIGsgb1xuICAgICAgICAgICAgKGNvbmNhdF9mbXQgKHJlY2FzdCBmbXQgZm10dHkpIHJlc3QpXG4gICAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pZ25vcmVkX3BhcmFtIChmdW4gXyAtPiBrIG8pIChFbmRfb2ZfYWNjKSBpZ24gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIChmdW4ga29jIC0+IG1ha2VfaXByaW50ZiBrIGtvYyByZXN0KSBvIGZtdCdcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiAoZnVuIGtvYyAtPiBtYWtlX2lwcmludGYgayBrb2MgcmVzdCkgbyBmbXQnXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgICAgIGsgb1xuYW5kIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIDpcbiAgdHlwZSB4IHkgeiBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+IHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IHggPVxuICBmdW4gayBvIGZtdCBwYWQgcHJlYyAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAgICwgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IE5vX3BhZGRpbmcgICAsIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBOb19wYWRkaW5nICAgLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTGl0X3BhZGRpbmcgXywgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IExpdF9wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpKVxuYW5kIGZuX29mX2N1c3RvbV9hcml0eSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT5cbiAgc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IHkgPVxuICBmdW4gayBvIGZtdCAtPiBmdW5jdGlvblxuICAgIHwgQ3VzdG9tX3plcm8gLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyBmbXRcbiAgICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+XG4gICAgICAgIGNvbnN0IChmbl9vZl9jdXN0b21fYXJpdHkgayBvIGZtdCBhcml0eSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQ29udGludWF0aW9ucyBmb3IgbWFrZV9wcmludGYgKilcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhbiBvdXRwdXRfc3RyZWFtLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgb3V0cHV0X2FjYyBvIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQHtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQFtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X2NoYXIgbyBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBmIG9cbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IGZsdXNoIG9cbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gb3V0cHV0X2FjYyBvIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIGJ1ZnB1dF9hY2MgYiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQHtcIjsgYnVmcHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkBbXCI7IGJ1ZnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBmIGJcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gYnVmcHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IGJ1ZnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBEaWZmZXIgZnJvbSBidWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiAlYSBhbmQgJXQuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBzdHJwdXRfYWNjIGIgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkB7XCI7IHN0cnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAW1wiOyBzdHJwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiAoZiAoKSlcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gc3RycHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEVycm9yIG1hbmFnZW1lbnQgKilcblxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBwcmV0dHktcHJpbnRlZCBlcnJvciBtZXNzYWdlLiAqKVxubGV0IGZhaWx3aXRoX21lc3NhZ2UgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyNTYgaW5cbiAgbGV0IGsgYWNjID0gc3RycHV0X2FjYyBidWYgYWNjOyBmYWlsd2l0aCAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdHRpbmcgdG9vbHMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhbiBvcGVuIGJsb2NrIGRlc2NyaXB0aW9uIChpbmRlbnQsIGJsb2NrX3R5cGUpICopXG5sZXQgb3Blbl9ib3hfb2Zfc3RyaW5nIHN0ciA9XG4gIGlmIHN0ciA9IFwiXCIgdGhlbiAoMCwgUHBfYm94KSBlbHNlXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGV0IGludmFsaWRfYm94ICgpID0gZmFpbHdpdGhfbWVzc2FnZSBcImludmFsaWQgYm94IGRlc2NyaXB0aW9uICVTXCIgc3RyIGluXG4gICAgbGV0IHJlYyBwYXJzZV9zcGFjZXMgaSA9XG4gICAgICBpZiBpID0gbGVuIHRoZW4gaSBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5baV0gd2l0aFxuICAgICAgICB8ICcgJyB8ICdcXHQnIC0+IHBhcnNlX3NwYWNlcyAoaSArIDEpXG4gICAgICAgIHwgXyAtPiBpXG4gICAgYW5kIHBhcnNlX2x3b3JkIGkgaiA9XG4gICAgICBpZiBqID0gbGVuIHRoZW4gaiBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5bal0gd2l0aFxuICAgICAgICB8ICdhJyAuLiAneicgLT4gcGFyc2VfbHdvcmQgaSAoaiArIDEpXG4gICAgICAgIHwgXyAtPiBqXG4gICAgYW5kIHBhcnNlX2ludCBpIGogPVxuICAgICAgaWYgaiA9IGxlbiB0aGVuIGogZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2pdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IHBhcnNlX2ludCBpIChqICsgMSlcbiAgICAgICAgfCBfIC0+IGogaW5cbiAgICBsZXQgd3N0YXJ0ID0gcGFyc2Vfc3BhY2VzIDAgaW5cbiAgICBsZXQgd2VuZCA9IHBhcnNlX2x3b3JkIHdzdGFydCB3c3RhcnQgaW5cbiAgICBsZXQgYm94X25hbWUgPSBTdHJpbmcuc3ViIHN0ciB3c3RhcnQgKHdlbmQgLSB3c3RhcnQpIGluXG4gICAgbGV0IG5zdGFydCA9IHBhcnNlX3NwYWNlcyB3ZW5kIGluXG4gICAgbGV0IG5lbmQgPSBwYXJzZV9pbnQgbnN0YXJ0IG5zdGFydCBpblxuICAgIGxldCBpbmRlbnQgPVxuICAgICAgaWYgbnN0YXJ0ID0gbmVuZCB0aGVuIDAgZWxzZVxuICAgICAgICB0cnkgaW50X29mX3N0cmluZyAoU3RyaW5nLnN1YiBzdHIgbnN0YXJ0IChuZW5kIC0gbnN0YXJ0KSlcbiAgICAgICAgd2l0aCBGYWlsdXJlIF8gLT4gaW52YWxpZF9ib3ggKCkgaW5cbiAgICBsZXQgZXhwX2VuZCA9IHBhcnNlX3NwYWNlcyBuZW5kIGluXG4gICAgaWYgZXhwX2VuZCA8PiBsZW4gdGhlbiBpbnZhbGlkX2JveCAoKTtcbiAgICBsZXQgYm94X3R5cGUgPSBtYXRjaCBib3hfbmFtZSB3aXRoXG4gICAgICB8IFwiXCIgfCBcImJcIiAtPiBQcF9ib3hcbiAgICAgIHwgXCJoXCIgICAgICAtPiBQcF9oYm94XG4gICAgICB8IFwidlwiICAgICAgLT4gUHBfdmJveFxuICAgICAgfCBcImh2XCIgICAgIC0+IFBwX2h2Ym94XG4gICAgICB8IFwiaG92XCIgICAgLT4gUHBfaG92Ym94XG4gICAgICB8IF8gICAgICAgIC0+IGludmFsaWRfYm94ICgpIGluXG4gICAgKGluZGVudCwgYm94X3R5cGUpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUGFyc2luZyB0b29scyAqKVxuXG4oKiBDcmVhdGUgYSBwYWRkaW5nX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcgYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcGFkZGluZyB0byBkaXNqb2luIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnQgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3BhZGRpbmdfZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgICAoXywgXywgXywgXywgXykgcGFkZGluZ19mbXRfZWJiID1cbmZ1biBwYWQgZm10IC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAgICAgICAgIC0+IFBhZGRpbmdfZm10X0VCQiAoTm9fcGFkZGluZywgZm10KVxuICB8IExpdF9wYWRkaW5nIChzLCB3KSAtPiBQYWRkaW5nX2ZtdF9FQkIgKExpdF9wYWRkaW5nIChzLCB3KSwgZm10KVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRkaW5nX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIGZtdClcblxuKCogQ3JlYXRlIGEgcHJlY2lzaW9uX2ZtdF9lYmIgZnJvbSBhIHByZWNpc2lvbiBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50IGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wcmVjaXNpb25fZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcHJlY2lzaW9uIC0+IChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAgIChfLCBfLCBfLCBfLCBfKSBwcmVjaXNpb25fZm10X2ViYiA9XG5mdW4gcHJlYyBmbXQgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uICAgIC0+IFByZWNpc2lvbl9mbXRfRUJCIChOb19wcmVjaXNpb24sIGZtdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKExpdF9wcmVjaXNpb24gcCwgZm10KVxuICB8IEFyZ19wcmVjaXNpb24gICAtPiBQcmVjaXNpb25fZm10X0VCQiAoQXJnX3ByZWNpc2lvbiwgZm10KVxuXG4oKiBDcmVhdGUgYSBwYWRwcmVjX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHBhZGRpbmcgYW5kIHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnRzXG4gICBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcGFkcHJlY19mbXRfZWJiIDogdHlwZSB4IHkgeiB0IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+XG4gICAgKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgIChfLCBfLCBfLCBfLCBfKSBwYWRwcmVjX2ZtdF9lYmIgPVxuZnVuIHBhZCBwcmVjIGZtdCAtPlxuICBsZXQgUHJlY2lzaW9uX2ZtdF9FQkIgKHByZWMsIGZtdCcpID0gbWFrZV9wcmVjaXNpb25fZm10X2ViYiBwcmVjIGZtdCBpblxuICBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgICAgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKE5vX3BhZGRpbmcsIHByZWMsIGZtdCcpXG4gIHwgTGl0X3BhZGRpbmcgKHMsIHcpIC0+IFBhZHByZWNfZm10X0VCQiAoTGl0X3BhZGRpbmcgKHMsIHcpLCBwcmVjLCBmbXQnKVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIHByZWMsIGZtdCcpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwYXJzaW5nICopXG5cbigqIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGZvcm1hdCBhbmQgY3JlYXRlIGEgZm10X2ViYi4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSBpbiBjYXNlIG9mIGludmFsaWQgZm9ybWF0LiAqKVxubGV0IGZtdF9lYmJfb2Zfc3RyaW5nID9sZWdhY3lfYmVoYXZpb3Igc3RyID1cbiAgKCogUGFyYW1ldGVycyBuYW1pbmcgY29udmVudGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gbGl0X3N0YXJ0OiBzdGFydCBvZiB0aGUgbGl0ZXJhbCBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBzdHJfaW5kOiBjdXJyZW50IGluZGV4IGluIHRoZSBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIGVuZF9pbmQ6IGVuZCBvZiB0aGUgY3VycmVudCAoc3ViLSlmb3JtYXQuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gcGN0X2luZDogaW5kZXggb2YgdGhlICclJyBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICopXG4gICgqICAgLSB6ZXJvOiAgaXMgdGhlICcwJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIG1pbnVzOiBpcyB0aGUgJy0nIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gcGx1czogIGlzIHRoZSAnKycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBoYXNoOiAgaXMgdGhlICcjJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHNwYWNlOiBpcyB0aGUgJyAnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gaWduOiAgIGlzIHRoZSAnXycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBwYWQ6IHBhZGRpbmcgb2YgdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHByZWM6IHByZWNpc2lvbiBvZiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gc3ltYjogY2hhciByZXByZXNlbnRpbmcgdGhlIGNvbnZlcnNpb24gKCdjJywgJ3MnLCAnZCcsIC4uLikuICopXG4gICgqICAgLSBjaGFyX3NldDogc2V0IG9mIGNoYXJhY3RlcnMgYXMgYml0bWFwIChzZWUgc2NhbmYgJVsuLi5dKS4gICAgKilcblxuICBsZXQgbGVnYWN5X2JlaGF2aW9yID0gbWF0Y2ggbGVnYWN5X2JlaGF2aW9yIHdpdGhcbiAgICB8IFNvbWUgZmxhZyAtPiBmbGFnXG4gICAgfCBOb25lIC0+IHRydWVcbiAgKCogIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQsIHRoZSBmb3JtYXQgcGFyc2VyIHRyaWVzIHRvIGJlaGF2ZSBhc1xuICAgICAgdGhlIDw0LjAyIGltcGxlbWVudGF0aW9ucywgaW4gcGFydGljdWxhciBpdCBpZ25vcmVzIG1vc3QgYmVuaWduXG4gICAgICBub25zZW5zaWNhbCBmb3JtYXRzLiBXaGVuIHRoZSBmbGFnIGlzIGRpc2FibGVkLCBpdCB3aWxsIHJlamVjdCBhbnlcbiAgICAgIGZvcm1hdCB0aGF0IGlzIG5vdCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWNhdGlvbi5cblxuICAgICAgQSB0eXBpY2FsIGV4YW1wbGUgd291bGQgYmUgXCIlKyBkXCI6IHNwZWNpZnlpbmcgYm90aCAnKycgKGlmIHRoZVxuICAgICAgbnVtYmVyIGlzIHBvc2l0aXZlLCBwYWQgd2l0aCBhICcrJyB0byBnZXQgdGhlIHNhbWUgd2lkdGggYXNcbiAgICAgIG5lZ2F0aXZlIG51bWJlcnMpIGFuZCAnICcgKGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUsIHBhZCB3aXRoXG4gICAgICBhIHNwYWNlKSBkb2VzIG5vdCBtYWtlIHNlbnNlLCBidXQgdGhlIGxlZ2FjeSAoPCA0LjAyKVxuICAgICAgaW1wbGVtZW50YXRpb24gd2FzIGhhcHB5IHRvIGp1c3QgaWdub3JlIHRoZSBzcGFjZS5cbiAgKilcbiAgaW5cblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UuICopXG4gIGxldCBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIHN0cl9pbmQgbXNnID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAlc1wiXG4gICAgICBzdHIgc3RyX2luZCBtc2dcbiAgaW5cblxuICAoKiBVc2VkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IChvciB0aGUgY3VycmVudCBzdWItZm9ybWF0KSB3YXMgZW5jb3VudGVyZWRcbiAgICAgIHVuZXhwZWN0ZWRseS4gKilcbiAgbGV0IHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kID1cbiAgICBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIGVuZF9pbmRcbiAgICAgIFwidW5leHBlY3RlZCBlbmQgb2YgZm9ybWF0XCJcbiAgaW5cblxuICAoKiBVc2VkIGZvciAlMGM6IG5vIG90aGVyIHdpZHRocyBhcmUgaW1wbGVtZW50ZWQgKilcbiAgbGV0IGludmFsaWRfbm9ubnVsbF9jaGFyX3dpZHRoIHN0cl9pbmQgPVxuICAgIGludmFsaWRfZm9ybWF0X21lc3NhZ2Ugc3RyX2luZFxuICAgICAgXCJub24temVybyB3aWR0aHMgYXJlIHVuc3VwcG9ydGVkIGZvciAlYyBjb252ZXJzaW9uc1wiXG4gIGluXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiBvcHRpb24gZGVwZW5kZW5jeVxuICAgICBwcm9ibGVtLiAqKVxuICBsZXQgaW52YWxpZF9mb3JtYXRfd2l0aG91dCBzdHJfaW5kIGMgcyA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJyVjJyB3aXRob3V0ICVzXCJcbiAgICAgIHN0ciBzdHJfaW5kIGMgc1xuICBpblxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiB1bmV4cGVjdGVkXG4gICAgIGNoYXJhY3Rlci4gKilcbiAgbGV0IGV4cGVjdGVkX2NoYXJhY3RlciBzdHJfaW5kIGV4cGVjdGVkIHJlYWQgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJXMgZXhwZWN0ZWQsIHJlYWQgJUNcIlxuICAgICAgc3RyIHN0cl9pbmQgZXhwZWN0ZWQgcmVhZFxuICBpblxuXG4gICgqIFBhcnNlIHRoZSBzdHJpbmcgZnJvbSBiZWdfaW5kIChpbmNsdWRlZCkgdG8gZW5kX2luZCAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIHBhcnNlIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGJlZ19pbmQgZW5kX2luZCAtPiBwYXJzZV9saXRlcmFsIGJlZ19pbmQgYmVnX2luZCBlbmRfaW5kXG5cbiAgKCogUmVhZCBsaXRlcmFsIGNoYXJhY3RlcnMgdXAgdG8gJyUnIG9yICdAJyBzcGVjaWFsIGNoYXJhY3RlcnMuICopXG4gIGFuZCBwYXJzZV9saXRlcmFsIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBsaXRfc3RhcnQgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBFbmRfb2ZfZm9ybWF0IGVsc2VcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZV9mb3JtYXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIGZtdF9yZXN0XG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlX2FmdGVyX2F0IChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBmbXRfcmVzdFxuICAgICAgfCBfIC0+XG4gICAgICAgIHBhcnNlX2xpdGVyYWwgbGl0X3N0YXJ0IChzdHJfaW5kICsgMSkgZW5kX2luZFxuXG4gICgqIFBhcnNlIGEgZm9ybWF0IGFmdGVyICclJyAqKVxuICBhbmQgcGFyc2VfZm9ybWF0IDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgZW5kX2luZCAtPiBwYXJzZV9pZ24gcGN0X2luZCAocGN0X2luZCArIDEpIGVuZF9pbmRcblxuICBhbmQgcGFyc2VfaWduIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdfJyAtPiBwYXJzZV9mbGFncyBwY3RfaW5kIChzdHJfaW5kKzEpIGVuZF9pbmQgdHJ1ZVxuICAgICAgfCBfIC0+IHBhcnNlX2ZsYWdzIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGZhbHNlXG5cbiAgYW5kIHBhcnNlX2ZsYWdzIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiXG4gID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGlnbiAtPlxuICAgIGxldCB6ZXJvID0gcmVmIGZhbHNlIGFuZCBtaW51cyA9IHJlZiBmYWxzZVxuICAgIGFuZCBwbHVzID0gcmVmIGZhbHNlIGFuZCBzcGFjZSA9IHJlZiBmYWxzZVxuICAgIGFuZCBoYXNoID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IHNldF9mbGFnIHN0cl9pbmQgZmxhZyA9XG4gICAgICAoKiBpbiBsZWdhY3kgbW9kZSwgZHVwbGljYXRlIGZsYWdzIGFyZSBhY2NlcHRlZCAqKVxuICAgICAgaWYgIWZsYWcgJiYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBkdXBsaWNhdGUgZmxhZyAlQ1wiXG4gICAgICAgICAgc3RyIHN0cl9pbmQgc3RyLltzdHJfaW5kXTtcbiAgICAgIGZsYWcgOj0gdHJ1ZTtcbiAgICBpblxuICAgIGxldCByZWMgcmVhZF9mbGFncyBzdHJfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJzAnIC0+IHNldF9mbGFnIHN0cl9pbmQgemVybzsgIHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnLScgLT4gc2V0X2ZsYWcgc3RyX2luZCBtaW51czsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcrJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHBsdXM7ICByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJyMnIC0+IHNldF9mbGFnIHN0cl9pbmQgaGFzaDsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcgJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHNwYWNlOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgXyAtPlxuICAgICAgICBwYXJzZV9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kXG4gICAgICAgICAgIXplcm8gIW1pbnVzICFwbHVzICFoYXNoICFzcGFjZSBpZ25cbiAgICAgIGVuZFxuICAgIGluXG4gICAgcmVhZF9mbGFncyBzdHJfaW5kXG5cbiAgKCogVHJ5IHRvIHJlYWQgYSBkaWdpdGFsIG9yIGEgJyonIHBhZGRpbmcuICopXG4gIGFuZCBwYXJzZV9wYWRkaW5nIDogdHlwZSBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgemVybyBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBsZXQgcGFkdHkgPSBtYXRjaCB6ZXJvLCBtaW51cyB3aXRoXG4gICAgICB8IGZhbHNlLCBmYWxzZSAtPiBSaWdodFxuICAgICAgfCBmYWxzZSwgdHJ1ZSAgLT4gTGVmdFxuICAgICAgfCAgdHJ1ZSwgZmFsc2UgLT4gWmVyb3NcbiAgICAgIHwgIHRydWUsIHRydWUgIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExlZnRcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJy0nIFwiMFwiIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+XG4gICAgICBsZXQgbmV3X2luZCwgd2lkdGggPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIG5ld19pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIChMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSlcbiAgICB8ICcqJyAtPlxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2VcbiAgICAgICAgaWduIChBcmdfcGFkZGluZyBwYWR0eSlcbiAgICB8IF8gLT5cbiAgICAgIGJlZ2luIG1hdGNoIHBhZHR5IHdpdGhcbiAgICAgIHwgTGVmdCAgLT5cbiAgICAgICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICctJyBcInBhZGRpbmdcIjtcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgfCBaZXJvcyAtPlxuICAgICAgICAgKCogYSAnMCcgcGFkZGluZyBpbmRpY2F0aW9uIG5vdCBmb2xsb3dlZCBieSBhbnl0aGluZyBzaG91bGRcbiAgICAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYSBSaWdodCBwYWRkaW5nIG9mIHdpZHRoIDAuIFRoaXMgaXMgdXNlZFxuICAgICAgICAgICBieSBzY2FubmluZyBjb252ZXJzaW9ucyAlMHMgYW5kICUwYyAqKVxuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICAoTGl0X3BhZGRpbmcgKFJpZ2h0LCAwKSlcbiAgICAgIHwgUmlnaHQgLT5cbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgZW5kXG5cbiAgKCogSXMgcHJlY2lzaW9uIGRlZmluZWQ/ICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wYWRkaW5nIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJy4nIC0+XG4gICAgICBwYXJzZV9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICBwYWRcbiAgICB8IHN5bWIgLT5cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgTm9fcHJlY2lzaW9uIHBhZCBzeW1iXG5cbiAgKCogUmVhZCB0aGUgZGlnaXRhbCBvciAnKicgcHJlY2lzaW9uLiAqKVxuICBhbmQgcGFyc2VfcHJlY2lzaW9uIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9saXRlcmFsIG1pbnVzIHN0cl9pbmQgPVxuICAgICAgbGV0IG5ld19pbmQsIHByZWMgPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgbmV3X2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgcGFkIChMaXRfcHJlY2lzaW9uIHByZWMpIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX2xpdGVyYWwgbWludXMgc3RyX2luZFxuICAgIHwgKCcrJyB8ICctJykgYXMgc3ltYiB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPlxuICAgICAgKCogTGVnYWN5IG1vZGUgd291bGQgYWNjZXB0IGFuZCBpZ25vcmUgJysnIG9yICctJyBiZWZvcmUgdGhlXG4gICAgICAgICBpbnRlZ2VyIGRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgcHJlY2lzaW9uOyBub3RlIHRoYXQgdGhpc1xuICAgICAgICAgY2Fubm90IGhhcHBlbiBmb3IgcGFkZGluZyB3aWR0aCwgYXMgJysnIGFuZCAnLScgYWxyZWFkeSBoYXZlXG4gICAgICAgICBhIHNlbWFudGljcyB0aGVyZS5cblxuICAgICAgICAgVGhhdCBzYWlkLCB0aGUgaWRlYSAoc3VwcG9ydGVkIGJ5IHRoaXMgdHdlYWspIHRoYXQgd2lkdGggYW5kXG4gICAgICAgICBwcmVjaXNpb24gbGl0ZXJhbHMgYXJlIFwiaW50ZWdlciBsaXRlcmFsc1wiIGluIHRoZSBPQ2FtbCBzZW5zZSBpc1xuICAgICAgICAgc3RpbGwgYmxhdGFudGx5IHdyb25nLCBhcyAxMjNfNDU2IG9yIDB4RkYgYXJlIHJlamVjdGVkLiAqKVxuICAgICAgcGFyc2VfbGl0ZXJhbCAobWludXMgfHwgc3ltYiA9ICctJykgKHN0cl9pbmQgKyAxKVxuICAgIHwgJyonIC0+XG4gICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlXG4gICAgICAgIGlnbiBwYWQgQXJnX3ByZWNpc2lvblxuICAgIHwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogbm90ZSB0aGF0IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBkaWQgbm90IGlnbm9yZSAnLicgd2l0aG91dFxuICAgICAgICAgICBhIG51bWJlciAoYXMgaXQgZG9lcyBmb3IgcGFkZGluZyBpbmRpY2F0aW9ucyksIGJ1dFxuICAgICAgICAgICBpbnRlcnByZXRzIGl0IGFzICcuMCcgKilcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBwYWQgKExpdF9wcmVjaXNpb24gMClcbiAgICAgIGVsc2VcbiAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICcuJyBcInByZWNpc2lvblwiXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIGNvbnZlcnNpb24uICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wcmVjaXNpb24gOiB0eXBlIHggeSB6IHQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIHByZWMgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9jb252ICh0eXBlIHUpICh0eXBlIHYpIChwYWRwcmVjIDogKHUsIHYpIHBhZGRpbmcpID1cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgcHJlYyBwYWRwcmVjIHN0ci5bc3RyX2luZF0gaW5cbiAgICAoKiBpbiBsZWdhY3kgbW9kZSwgc29tZSBmb3JtYXRzICglcyBhbmQgJVMpIGFjY2VwdCBhIHdlaXJkIG1peCBvZlxuICAgICAgIHBhZGRpbmcgYW5kIHByZWNpc2lvbiwgd2hpY2ggaXMgbWVyZ2VkIGFzIGEgc2luZ2xlIHBhZGRpbmdcbiAgICAgICBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGluICUuMTBzIHRoZSBwcmVjaXNpb24gaXMgaW1wbGljaXRseVxuICAgICAgIHVuZGVyc3Rvb2QgYXMgcGFkZGluZyAlMTBzLCBidXQgdGhlIGxlZnQtcGFkZGluZyBjb21wb25lbnQgbWF5XG4gICAgICAgYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGxlZnQgcGFkZGluZyBvciBhIG5lZ2F0aXZlIHByZWNpc2lvbjpcbiAgICAgICAlLS4zcyBhbmQgJS4tM3MgYXJlIGVxdWl2YWxlbnQgdG8gJS0zcyAqKVxuICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgfCBOb19wYWRkaW5nIC0+IChcbiAgICAgIG1hdGNoIG1pbnVzLCBwcmVjIHdpdGhcbiAgICAgICAgfCBfLCBOb19wcmVjaXNpb24gLT4gcGFyc2VfY29udiBOb19wYWRkaW5nXG4gICAgICAgIHwgZmFsc2UsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoUmlnaHQsIG4pKVxuICAgICAgICB8IHRydWUsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoTGVmdCwgbikpXG4gICAgICAgIHwgZmFsc2UsIEFyZ19wcmVjaXNpb24gLT4gcGFyc2VfY29udiAoQXJnX3BhZGRpbmcgUmlnaHQpXG4gICAgICAgIHwgdHJ1ZSwgQXJnX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IChBcmdfcGFkZGluZyBMZWZ0KVxuICAgIClcbiAgICB8IHBhZCAtPiBwYXJzZV9jb252IHBhZFxuXG4gICgqIENhc2UgYW5hbHlzaXMgb24gY29udmVyc2lvbi4gKilcbiAgYW5kIHBhcnNlX2NvbnZlcnNpb24gOiB0eXBlIHggeSB6IHQgdSB2IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+ICh4LCB5KSBwYWRkaW5nIC0+XG4gICAgICAgICh6LCB0KSBwcmVjaXNpb24gLT4gKHUsIHYpIHBhZGRpbmcgLT4gY2hhciAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCBwcmVjIHBhZHByZWMgc3ltYiAtPlxuICAgICgqIEZsYWdzIHVzZWQgdG8gY2hlY2sgb3B0aW9uIHVzYWdlcy9jb21wYXRpYmlsaXRpZXMuICopXG4gICAgbGV0IHBsdXNfdXNlZCAgPSByZWYgZmFsc2UgYW5kIGhhc2hfdXNlZCA9IHJlZiBmYWxzZVxuICAgIGFuZCBzcGFjZV91c2VkID0gcmVmIGZhbHNlIGFuZCBpZ25fdXNlZCAgID0gcmVmIGZhbHNlXG4gICAgYW5kIHBhZF91c2VkICAgPSByZWYgZmFsc2UgYW5kIHByZWNfdXNlZCAgPSByZWYgZmFsc2UgaW5cblxuICAgICgqIEFjY2VzcyB0byBvcHRpb25zLCB1cGRhdGUgZmxhZ3MuICopXG4gICAgbGV0IGdldF9wbHVzICAgICgpID0gcGx1c191c2VkICA6PSB0cnVlOyBwbHVzXG4gICAgYW5kIGdldF9oYXNoICAgKCkgPSBoYXNoX3VzZWQgOj0gdHJ1ZTsgaGFzaFxuICAgIGFuZCBnZXRfc3BhY2UgICAoKSA9IHNwYWNlX3VzZWQgOj0gdHJ1ZTsgc3BhY2VcbiAgICBhbmQgZ2V0X2lnbiAgICAgKCkgPSBpZ25fdXNlZCAgIDo9IHRydWU7IGlnblxuICAgIGFuZCBnZXRfcGFkICAgICAoKSA9IHBhZF91c2VkICAgOj0gdHJ1ZTsgcGFkXG4gICAgYW5kIGdldF9wcmVjICAgICgpID0gcHJlY191c2VkICA6PSB0cnVlOyBwcmVjXG4gICAgYW5kIGdldF9wYWRwcmVjICgpID0gcGFkX3VzZWQgICA6PSB0cnVlOyBwYWRwcmVjIGluXG5cbiAgICBsZXQgZ2V0X2ludF9wYWQgKCkgOiAoeCx5KSBwYWRkaW5nID1cbiAgICAgICgqICU1LjNkIGlzIGFjY2VwdGVkIGFuZCBtZWFuaW5nZnVsOiBwYWQgdG8gbGVuZ3RoIDUgd2l0aFxuICAgICAgICAgc3BhY2VzLCBidXQgZmlyc3QgcGFkIHdpdGggemVyb3MgdXB0byBsZW5ndGggMyAoMC1wYWRkaW5nXG4gICAgICAgICBpcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgXCJwcmVjaXNpb25cIiBmb3IgaW50ZWdlciBmb3JtYXRzKS5cblxuICAgICAgICAgJTA1LjNkIGlzIHJlZHVuZGFudDogcGFkIHRvIGxlbmd0aCA1ICp3aXRoIHplcm9zKiwgYnV0XG4gICAgICAgICBmaXJzdCBwYWQgd2l0aCB6ZXJvcy4uLiBUbyBhZGQgaW5zdWx0IHRvIHRoZSBpbmp1cnksIHRoZVxuICAgICAgICAgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIDAtcGFkZGluZyBpbmRpY2F0aW9uIGFuZFxuICAgICAgICAgZG9lcyB0aGUgNSBwYWRkaW5nIHdpdGggc3BhY2VzIGluc3RlYWQuIFdlIHJldXNlIHRoaXNcbiAgICAgICAgIGludGVycHJldGF0aW9uIGZvciBjb21wYXRpYmlsaXR5LCBidXQgc3RhdGljYWxseSByZWplY3QgdGhpc1xuICAgICAgICAgZm9ybWF0IHdoZW4gdGhlIGxlZ2FjeSBtb2RlIGlzIGRpc2FibGVkLCB0byBwcm90ZWN0IHN0cmljdFxuICAgICAgICAgdXNlcnMgZnJvbSB0aGlzIGNvcm5lciBjYXNlLiAqKVxuICAgICAgIG1hdGNoIGdldF9wYWQgKCksIGdldF9wcmVjICgpIHdpdGhcbiAgICAgICAgIHwgcGFkLCBOb19wcmVjaXNpb24gLT4gcGFkXG4gICAgICAgICB8IE5vX3BhZGRpbmcsIF8gICAgIC0+IE5vX3BhZGRpbmdcbiAgICAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCBuKSwgXyAtPlxuICAgICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIG4pXG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IEFyZ19wYWRkaW5nIFplcm9zLCBfIC0+XG4gICAgICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IExpdF9wYWRkaW5nIF8gYXMgcGFkLCBfIC0+IHBhZFxuICAgICAgICAgfCBBcmdfcGFkZGluZyBfIGFzIHBhZCwgXyAtPiBwYWQgaW5cblxuICAgICgqIENoZWNrIHRoYXQgcGFkdHkgPD4gWmVyb3MuICopXG4gICAgbGV0IGNoZWNrX25vXzAgc3ltYiAodHlwZSBhIGIpIChwYWQgOiAoYSwgYikgcGFkZGluZykgOiAoYSxiKSBwYWRkaW5nID1cbiAgICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gcGFkXG4gICAgICB8IExpdF9wYWRkaW5nICgoTGVmdCB8IFJpZ2h0KSwgXykgLT4gcGFkXG4gICAgICB8IEFyZ19wYWRkaW5nIChMZWZ0IHwgUmlnaHQpIC0+IHBhZFxuICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiMFwiXG4gICAgICB8IEFyZ19wYWRkaW5nIFplcm9zIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCIwXCJcbiAgICBpblxuXG4gICAgKCogR2V0IHBhZGRpbmcgYXMgYSBwYWRfb3B0aW9uIChzZWUgXCIlX1wiLCBcIiV7XCIsIFwiJShcIiBhbmQgXCIlW1wiKS5cbiAgICAgICAobm8gbmVlZCBmb3IgbGVnYWN5IG1vZGUgdHdlYWtpbmcsIHRob3NlIHdlcmUgcmVqZWN0ZWQgYnkgdGhlXG4gICAgICAgbGVnYWN5IHBhcnNlciBhcyB3ZWxsKSAqKVxuICAgIGxldCBvcHRfb2ZfcGFkIGMgKHR5cGUgYSkgKHR5cGUgYikgKHBhZCA6IChhLCBiKSBwYWRkaW5nKSA9IG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gTm9uZVxuICAgICAgfCBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKSAtPiBTb21lIHdpZHRoXG4gICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIFNvbWUgd2lkdGhcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicwJ1wiXG4gICAgICB8IExpdF9wYWRkaW5nIChMZWZ0LCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gU29tZSB3aWR0aFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJy0nXCJcbiAgICAgIHwgQXJnX3BhZGRpbmcgXyAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicqJ1wiXG4gICAgaW5cbiAgICBsZXQgZ2V0X3BhZF9vcHQgYyA9IG9wdF9vZl9wYWQgYyAoZ2V0X3BhZCAoKSkgaW5cbiAgICBsZXQgZ2V0X3BhZHByZWNfb3B0IGMgPSBvcHRfb2ZfcGFkIGMgKGdldF9wYWRwcmVjICgpKSBpblxuXG4gICAgKCogR2V0IHByZWNpc2lvbiBhcyBhIHByZWNfb3B0aW9uIChzZWUgXCIlX2ZcIikuXG4gICAgICAgKG5vIG5lZWQgZm9yIGxlZ2FjeSBtb2RlIHR3ZWFraW5nLCB0aG9zZSB3ZXJlIHJlamVjdGVkIGJ5IHRoZVxuICAgICAgIGxlZ2FjeSBwYXJzZXIgYXMgd2VsbCkgKilcbiAgICBsZXQgZ2V0X3ByZWNfb3B0ICgpID0gbWF0Y2ggZ2V0X3ByZWMgKCkgd2l0aFxuICAgICAgfCBOb19wcmVjaXNpb24gICAgICAgLT4gTm9uZVxuICAgICAgfCBMaXRfcHJlY2lzaW9uIG5kZWMgLT4gU29tZSBuZGVjXG4gICAgICB8IEFyZ19wcmVjaXNpb24gICAgICAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJ18nIFwiJyonXCJcbiAgICBpblxuXG4gICAgbGV0IGZtdF9yZXN1bHQgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICcsJyAtPlxuICAgICAgcGFyc2Ugc3RyX2luZCBlbmRfaW5kXG4gICAgfCAnYycgLT5cbiAgICAgIGxldCBjaGFyX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICVjICopXG4gICAgICAgIGlmIGdldF9pZ24gKClcbiAgICAgICAgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NoYXIsIGZtdF9yZXN0KSlcbiAgICAgICAgZWxzZSBGbXRfRUJCIChDaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBzY2FuX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICUwYyAqKVxuICAgICAgICBpZiBnZXRfaWduICgpXG4gICAgICAgIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9zY2FuX25leHRfY2hhciwgZm10X3Jlc3QpKVxuICAgICAgICBlbHNlIEZtdF9FQkIgKFNjYW5fbmV4dF9jaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBiZWdpbiBtYXRjaCBnZXRfcGFkX29wdCAnYycgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gY2hhcl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIDAgLT4gc2Nhbl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIF9uIC0+XG4gICAgICAgICAgIGlmIG5vdCBsZWdhY3lfYmVoYXZpb3JcbiAgICAgICAgICAgdGhlbiBpbnZhbGlkX25vbm51bGxfY2hhcl93aWR0aCBzdHJfaW5kXG4gICAgICAgICAgIGVsc2UgKCogbGVnYWN5IGlnbm9yZXMgJWMgd2lkdGhzICopIGNoYXJfZm9ybWF0IGZtdF9yZXN0XG4gICAgICBlbmRcbiAgICB8ICdDJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NhbWxfY2hhcixmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKENhbWxfY2hhciBmbXRfcmVzdClcbiAgICB8ICdzJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zdHJpbmcgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKFN0cmluZyAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdTJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9jYW1sX3N0cmluZyAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnZCcgfCAnaScgfCAneCcgfCAnWCcgfCAnbycgfCAndScgLT5cbiAgICAgIGxldCBpY29udiA9IGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAoZ2V0X3NwYWNlICgpKSBzeW1iIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChJbnQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdOJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gVG9rZW5fY291bnRlciBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCkpXG4gICAgfCAnbCcgfCAnbicgfCAnTCcgd2hlbiBzdHJfaW5kPWVuZF9pbmQgfHwgbm90IChpc19pbnRfYmFzZSBzdHIuW3N0cl9pbmRdKSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gY291bnRlcl9vZl9jaGFyIHN5bWIgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpKVxuICAgIHwgJ2wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQzMiAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDMyIChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnbicgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSlcbiAgICAgICAgICAoZ2V0X2hhc2ggKCkpIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX25hdGl2ZWludCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKE5hdGl2ZWludCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ0wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQ2NCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDY0IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnZicgfCAnZScgfCAnRScgfCAnZycgfCAnRycgfCAnRicgfCAnaCcgfCAnSCcgLT5cbiAgICAgIGxldCBmY29udiA9XG4gICAgICAgIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmRcbiAgICAgICAgICAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSkgKGdldF9zcGFjZSAoKSkgc3ltYiBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZmxvYXQgKGdldF9wYWRfb3B0ICdfJywgZ2V0X3ByZWNfb3B0ICgpKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChGbG9hdCAoZmNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2InIHwgJ0InIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Jvb2wgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEJvb2wgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnYScgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChBbHBoYSBmbXRfcmVzdClcbiAgICB8ICd0JyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKFRoZXRhIGZtdF9yZXN0KVxuICAgIHwgJ3InIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfcmVhZGVyLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKFJlYWRlciBmbXRfcmVzdClcbiAgICB8ICchJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZsdXNoIGZtdF9yZXN0KVxuICAgIHwgKCclJyB8ICdAJykgYXMgYyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoYywgZm10X3Jlc3QpKVxuICAgIHwgJ3snIC0+XG4gICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCAnfScgaW5cbiAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIHN1Yl9lbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2ZtdHR5ID0gZm10dHlfb2ZfZm10IHN1Yl9mbXQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ3snLCBzdWJfZm10dHksIGZtdF9yZXN0KSlcbiAgICB8ICcoJyAtPlxuICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCBzdHJfaW5kIGVuZF9pbmQgJyknIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdWJfZW5kICsgMikgZW5kX2luZCBpblxuICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgc3ViX2VuZCBpblxuICAgICAgbGV0IHN1Yl9mbXR0eSA9IGZtdHR5X29mX2ZtdCBzdWJfZm10IGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X3N1YnN0IChnZXRfcGFkX29wdCAnKCcsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpKVxuICAgIHwgJ1snIC0+XG4gICAgICBsZXQgbmV4dF9pbmQsIGNoYXJfc2V0ID0gcGFyc2VfY2hhcl9zZXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAoZ2V0X3BhZF9vcHQgJ18nLCBjaGFyX3NldCkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2NoYXJfc2V0IChnZXRfcGFkX29wdCAnWycsIGNoYXJfc2V0LCBmbXRfcmVzdCkpXG4gICAgfCAnLScgfCAnKycgfCAnIycgfCAnICcgfCAnXycgLT5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgXFxcbiAgICAgICAgIGZsYWcgJUMgaXMgb25seSBhbGxvd2VkIGFmdGVyIHRoZSAnJSUnLCBiZWZvcmUgcGFkZGluZyBhbmQgcHJlY2lzaW9uXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgc3ltYlxuICAgIHwgXyAtPlxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgaW52YWxpZCBjb252ZXJzaW9uIFxcXCIlJSVjXFxcIlwiIHN0ciAoc3RyX2luZCAtIDEpIHN5bWJcbiAgICBpblxuICAgICgqIENoZWNrIGZvciB1bnVzZWQgb3B0aW9ucywgYW5kIHJlamVjdCB0aGVtIGFzIGluY29tcGF0aWJsZS5cblxuICAgICAgIFN1Y2ggY2hlY2tzIG5lZWQgdG8gYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoZSBsZWdhY3lcbiAgICAgICBwYXJzZXIgc2lsZW50bHkgaWdub3JlZCBpbmNvbXBhdGlibGUgZmxhZ3MuICopXG4gICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuIGJlZ2luXG4gICAgaWYgbm90ICFwbHVzX3VzZWQgJiYgcGx1cyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicrJ1wiO1xuICAgIGlmIG5vdCAhaGFzaF91c2VkICYmIGhhc2ggdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIjtcbiAgICBpZiBub3QgIXNwYWNlX3VzZWQgJiYgc3BhY2UgdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInICdcIjtcbiAgICBpZiBub3QgIXBhZF91c2VkICAmJiBQYWRkaW5nX0VCQiBwYWQgPD4gUGFkZGluZ19FQkIgTm9fcGFkZGluZyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcImBwYWRkaW5nJ1wiO1xuICAgIGlmIG5vdCAhcHJlY191c2VkICYmIFByZWNpc2lvbl9FQkIgcHJlYyA8PiBQcmVjaXNpb25fRUJCIE5vX3ByZWNpc2lvbiB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgKGlmIGlnbiB0aGVuICdfJyBlbHNlIHN5bWIpXG4gICAgICAgIFwiYHByZWNpc2lvbidcIjtcbiAgICBpZiBpZ24gJiYgcGx1cyB0aGVuIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnXycgXCInKydcIjtcbiAgICBlbmQ7XG4gICAgKCogdGhpcyBsYXN0IHRlc3QgbXVzdCBub3QgYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsXG4gICAgICAgYXMgaWdub3JpbmcgaXQgd291bGQgdHlwaWNhbGx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0eXBpbmdcbiAgICAgICB0aGFuIHdoYXQgdGhlIGxlZ2FjeSBwYXJzZXIgdXNlZCAqKVxuICAgIGlmIG5vdCAhaWduX3VzZWQgJiYgaWduIHRoZW5cbiAgICAgIGJlZ2luIG1hdGNoIHN5bWIgd2l0aFxuICAgICAgICAoKiBhcmd1bWVudC1sZXNzIGZvcm1hdHMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIGluIGxlZ2FjeSBtb2RlICopXG4gICAgICAgIHwgKCdAJyB8ICclJyB8ICchJyB8ICcsJykgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gKClcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInXydcIlxuICAgICAgZW5kO1xuICAgIGZtdF9yZXN1bHRcblxuICAoKiBQYXJzZSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIChhZnRlciAnQCcpLiAqKVxuICBhbmQgcGFyc2VfYWZ0ZXJfYXQgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKCdAJywgRW5kX29mX2Zvcm1hdCkpXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdbJyAtPlxuICAgICAgICBwYXJzZV90YWcgZmFsc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICddJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQ2xvc2VfYm94LCBmbXRfcmVzdCkpXG4gICAgICB8ICd7JyAtPlxuICAgICAgICBwYXJzZV90YWcgdHJ1ZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ30nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChDbG9zZV90YWcsIGZtdF9yZXN0KSlcbiAgICAgIHwgJywnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChCcmVhayAoXCJALFwiLCAwLCAwKSwgZm10X3Jlc3QpKVxuICAgICAgfCAnICcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEJyZWFrIChcIkAgXCIsIDEsIDApLCBmbXRfcmVzdCkpXG4gICAgICB8ICc7JyAtPlxuICAgICAgICBwYXJzZV9nb29kX2JyZWFrIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnPycgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZGbHVzaCwgZm10X3Jlc3QpKVxuICAgICAgfCAnXFxuJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRm9yY2VfbmV3bGluZSwgZm10X3Jlc3QpKVxuICAgICAgfCAnLicgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZsdXNoX25ld2xpbmUsIGZtdF9yZXN0KSlcbiAgICAgIHwgJzwnIC0+XG4gICAgICAgIHBhcnNlX21hZ2ljX3NpemUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRXNjYXBlZF9hdCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgd2hlbiBzdHJfaW5kICsgMSA8IGVuZF9pbmQgJiYgc3RyLltzdHJfaW5kICsgMV0gPSAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEVzY2FwZWRfcGVyY2VudCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoQ2hhcl9saXRlcmFsICgnQCcsIGZtdF9yZXN0KSlcbiAgICAgIHwgYyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoU2Nhbl9pbmRpYyBjLCBmbXRfcmVzdCkpXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIG9wdGlvbmFsIDxuYW1lPiBhZnRlciBcIkB7XCIgb3IgXCJAW1wiLiAqKVxuICBhbmQgcGFyc2VfdGFnIDogdHlwZSBlIGYgLiBib29sIC0+IGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gaXNfb3Blbl90YWcgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgdHJ5XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnPCcgLT5cbiAgICAgICAgbGV0IGluZCA9IFN0cmluZy5pbmRleF9mcm9tIHN0ciAoc3RyX2luZCArIDEpICc+JyBpblxuICAgICAgICBpZiBpbmQgPj0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN1Yl9zdHIgPSBTdHJpbmcuc3ViIHN0ciBzdHJfaW5kIChpbmQgLSBzdHJfaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCAoaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IHN1Yl9mb3JtYXQgPSBGb3JtYXQgKHN1Yl9mbXQsIHN1Yl9zdHIpIGluXG4gICAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgICBpZiBpc19vcGVuX3RhZyB0aGVuIE9wZW5fdGFnIHN1Yl9mb3JtYXQgZWxzZSBPcGVuX2JveCBzdWJfZm9ybWF0IGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nLCBmbXRfcmVzdCkpXG4gICAgICB8IF8gLT5cbiAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2Zvcm1hdCA9IEZvcm1hdCAoRW5kX29mX2Zvcm1hdCwgXCJcIikgaW5cbiAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgaWYgaXNfb3Blbl90YWcgdGhlbiBPcGVuX3RhZyBzdWJfZm9ybWF0IGVsc2UgT3Blbl9ib3ggc3ViX2Zvcm1hdCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmcsIGZtdF9yZXN0KSlcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgb3B0aW9uYWwgPHdpZHRoIG9mZnNldD4gYWZ0ZXIgXCJAO1wiLiAqKVxuICBhbmQgcGFyc2VfZ29vZF9icmVhayA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBsZXQgbmV4dF9pbmQsIGZvcm1hdHRpbmdfbGl0ID1cbiAgICAgIHRyeVxuICAgICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB8fCBzdHIuW3N0cl9pbmRdIDw+ICc8JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN0cl9pbmRfMSA9IHBhcnNlX3NwYWNlcyAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzFdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IChcbiAgICAgICAgICBsZXQgc3RyX2luZF8yLCB3aWR0aCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8xIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIGxldCBzdHJfaW5kXzMgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF8yIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8zXSB3aXRoXG4gICAgICAgICAgICAgIHwgJz4nIC0+XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZC0yKSAoc3RyX2luZF8zLXN0cl9pbmQrMykgaW5cbiAgICAgICAgICAgICAgICBzdHJfaW5kXzMgKyAxLCBCcmVhayAocywgd2lkdGgsIDApXG4gICAgICAgICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgICAgICAgIGxldCBzdHJfaW5kXzQsIG9mZnNldCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8zIGVuZF9pbmQgaW5cbiAgICAgICAgICAgICAgICBsZXQgc3RyX2luZF81ID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfNCBlbmRfaW5kIGluXG4gICAgICAgICAgICAgICAgaWYgc3RyLltzdHJfaW5kXzVdIDw+ICc+JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kLTIpIChzdHJfaW5kXzUtc3RyX2luZCszKSBpblxuICAgICAgICAgICAgICAgIHN0cl9pbmRfNSArIDEsIEJyZWFrIChzLCB3aWR0aCwgb2Zmc2V0KVxuICAgICAgICAgICAgICB8IF8gLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgIClcbiAgICAgICAgfCBfIC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgd2l0aCBOb3RfZm91bmQgfCBGYWlsdXJlIF8gLT5cbiAgICAgICAgc3RyX2luZCwgQnJlYWsgKFwiQDtcIiwgMSwgMClcbiAgICBpblxuICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIHRoZSBzaXplIGluIGEgPG4+LiAqKVxuICBhbmQgcGFyc2VfbWFnaWNfc2l6ZSA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBtYXRjaFxuICAgICAgdHJ5XG4gICAgICAgIGxldCBzdHJfaW5kXzEgPSBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8xXSB3aXRoXG4gICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgIGxldCBzdHJfaW5kXzIsIHNpemUgPSBwYXJzZV9pbnRlZ2VyIHN0cl9pbmRfMSBlbmRfaW5kIGluXG4gICAgICAgICAgbGV0IHN0cl9pbmRfMyA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzIgZW5kX2luZCBpblxuICAgICAgICAgIGlmIHN0ci5bc3RyX2luZF8zXSA8PiAnPicgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZCAtIDIpIChzdHJfaW5kXzMgLSBzdHJfaW5kICsgMykgaW5cbiAgICAgICAgICBTb21lIChzdHJfaW5kXzMgKyAxLCBNYWdpY19zaXplIChzLCBzaXplKSlcbiAgICAgICAgfCBfIC0+IE5vbmVcbiAgICAgIHdpdGggTm90X2ZvdW5kIHwgRmFpbHVyZSBfIC0+XG4gICAgICAgIE5vbmVcbiAgICB3aXRoXG4gICAgfCBTb21lIChuZXh0X2luZCwgZm9ybWF0dGluZ19saXQpIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuICAgIHwgTm9uZSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChTY2FuX2luZGljICc8JywgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIGFuZCBjb25zdHJ1Y3QgYSBjaGFyIHNldC4gKilcbiAgYW5kIHBhcnNlX2NoYXJfc2V0IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcblxuICAgIGxldCBjaGFyX3NldCA9IGNyZWF0ZV9jaGFyX3NldCAoKSBpblxuICAgIGxldCBhZGRfY2hhciBjID1cbiAgICAgIGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCBjO1xuICAgIGluXG4gICAgbGV0IGFkZF9yYW5nZSBjIGMnID1cbiAgICAgIGZvciBpID0gaW50X29mX2NoYXIgYyB0byBpbnRfb2ZfY2hhciBjJyBkb1xuICAgICAgICBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgKGNoYXJfb2ZfaW50IGkpO1xuICAgICAgZG9uZTtcbiAgICBpblxuXG4gICAgbGV0IGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZCA9XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6ICclJScgYWxvbmUgaXMgbm90IGFjY2VwdGVkIGluIGNoYXJhY3RlciBzZXRzLCBcXFxuICAgICAgICAgdXNlICUlJSUgaW5zdGVhZCBhdCBwb3NpdGlvbiAlZC5cIiBzdHIgc3RyX2luZFxuICAgIGluXG5cbiAgICAoKiBQYXJzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgY2hhciBzZXQuICopXG4gICAgbGV0IHJlYyBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGxldCBjID0gc3RyLltzdHJfaW5kXSBpblxuICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICAgKCogUGFyc2UgdGhlIGNvbnRlbnQgb2YgYSBjaGFyIHNldCB1bnRpbCB0aGUgZmlyc3QgJ10nLiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9jb250ZW50IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICddJyAtPlxuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnLScgLT5cbiAgICAgICAgYWRkX2NoYXIgJy0nO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCBjIC0+XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcblxuICAgICgqIFRlc3QgZm9yIHJhbmdlIGluIGNoYXIgc2V0LiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICctJyAtPlxuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9taW51cyAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyB3aGVuIGMgPSAnJScgLT5cbiAgICAgICAgYWRkX2NoYXIgYyc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGlmIGMgPSAnJScgdGhlbiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmQ7XG4gICAgICAgICgqIG5vdGUgdGhhdCAnQCcgYWxvbmUgaXMgYWNjZXB0ZWQsIGFzIGRvbmUgYnkgdGhlIGxlZ2FjeVxuICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjsgdGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWNhbGx5IHJlcXVpcmVzICVAXG4gICAgICAgICAgIHNvIHdlIGNvdWxkIHdhcm4gb24gdGhhdCAqKVxuICAgICAgICBhZGRfY2hhciBjO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjJ1xuXG4gICAgKCogTWFuYWdlIHJhbmdlIGluIGNoYXIgc2V0IChleGNlcHQgaWYgdGhlICctJyB0aGUgbGFzdCBjaGFyIGJlZm9yZSAnXScpICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2FmdGVyX21pbnVzIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIGFkZF9jaGFyICctJztcbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJyUnIC0+XG4gICAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyAtPlxuICAgICAgICAgICAgYWRkX3JhbmdlIGMgYyc7XG4gICAgICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMikgZW5kX2luZFxuICAgICAgICAgIHwgXyAtPiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmRcbiAgICAgICAgZW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGFkZF9yYW5nZSBjIGMnO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgIGluXG4gICAgbGV0IHN0cl9pbmQsIHJldmVyc2UgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgICB8ICdeJyAtPiBzdHJfaW5kICsgMSwgdHJ1ZVxuICAgICAgICB8IF8gLT4gc3RyX2luZCwgZmFsc2UgaW5cbiAgICBsZXQgbmV4dF9pbmQgPSBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICBsZXQgY2hhcl9zZXQgPSBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgaW5cbiAgICBuZXh0X2luZCwgKGlmIHJldmVyc2UgdGhlbiByZXZfY2hhcl9zZXQgY2hhcl9zZXQgZWxzZSBjaGFyX3NldClcblxuICAoKiBDb25zdW1lIGFsbCBuZXh0IHNwYWNlcywgcmFpc2UgYW4gRmFpbHVyZSBpZiBlbmRfaW5kIGlzIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGlmIHN0ci5bc3RyX2luZF0gPSAnICcgdGhlbiBwYXJzZV9zcGFjZXMgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGVsc2Ugc3RyX2luZFxuXG4gICgqIFJlYWQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZyb20gdGhlIHN0cmluZywgcmFpc2UgYSBGYWlsdXJlIGlmIGVuZF9pbmQgaXNcbiAgICAgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCBhY2MgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gYWNjICogMTAgKyAoaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICcwJykgaW5cbiAgICAgIGlmIG5ld19hY2MgPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogaW50ZWdlciAlZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxpbWl0ICVkXCJcbiAgICAgICAgICBzdHIgbmV3X2FjYyBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICAgIGVsc2VcbiAgICAgICAgcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG5ld19hY2NcbiAgICB8IF8gLT4gc3RyX2luZCwgYWNjXG5cbiAgKCogUmVhZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgZnJvbSB0aGUgc3RyaW5nLCByYWlzZSBhIEZhaWx1cmVcbiAgICAgaWYgZW5kX2luZCBpcyByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2VfaW50ZWdlciBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwXG4gICAgfCAnLScgLT4gKFxuICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgLT5cbiAgICAgICAgbGV0IG5leHRfaW5kLCBuID0gcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIDAgaW5cbiAgICAgICAgbmV4dF9pbmQsIC1uXG4gICAgICB8IGMgLT5cbiAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJkaWdpdFwiIGNcbiAgICApXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIEFkZCBhIGxpdGVyYWwgdG8gYSBmb3JtYXQgZnJvbSBhIGxpdGVyYWwgY2hhcmFjdGVyIHN1Yi1zZXF1ZW5jZS4gKilcbiAgYW5kIGFkZF9saXRlcmFsIDogdHlwZSBhIGQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gKGEsIF8sIF8sIGQsIGUsIGYpIGZtdCAtPlxuICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gbGl0X3N0YXJ0IHN0cl9pbmQgZm10IC0+IG1hdGNoIHN0cl9pbmQgLSBsaXRfc3RhcnQgd2l0aFxuICAgIHwgMCAgICAtPiBGbXRfRUJCIGZtdFxuICAgIHwgMSAgICAtPiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKHN0ci5bbGl0X3N0YXJ0XSwgZm10KSlcbiAgICB8IHNpemUgLT4gRm10X0VCQiAoU3RyaW5nX2xpdGVyYWwgKFN0cmluZy5zdWIgc3RyIGxpdF9zdGFydCBzaXplLCBmbXQpKVxuXG4gICgqIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN1Yi1mb3JtYXRcbiAgICAgKGkuZS4gdGhlIGNvcnJlc3BvbmRpbmcgXCIlfVwiIG9yIFwiJSlcIikgKilcbiAgYW5kIHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuXG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IHVuY2xvc2VkIHN1Yi1mb3JtYXQsIFxcXG4gICAgICAgICBleHBlY3RlZCBcXFwiJSUlY1xcXCIgYXQgY2hhcmFjdGVyIG51bWJlciAlZFwiIHN0ciBjIGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnJScgLT5cbiAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgaWYgc3RyLltzdHJfaW5kICsgMV0gPSBjIHRoZW4gKCogRW5kIG9mIGZvcm1hdCBmb3VuZCAqKSBzdHJfaW5kIGVsc2VcbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMV0gd2l0aFxuICAgICAgICB8ICdfJyAtPlxuICAgICAgICAgICgqIFNlYXJjaCBmb3IgXCIlXyhcIiBvciBcIiVfe1wiLiAqKVxuICAgICAgICAgIGlmIHN0cl9pbmQgKyAyID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDJdIHdpdGhcbiAgICAgICAgICB8ICd7JyAtPlxuICAgICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDMpIGVuZF9pbmQgJ30nIGluXG4gICAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCAnKScgaW5cbiAgICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgICAgfCBfIC0+IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCBjXG4gICAgICAgICAgZW5kXG4gICAgICAgIHwgJ3snIC0+XG4gICAgICAgICAgKCogJXsuLi4lfSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICd9JyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgKCogJSguLi4lKSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICcpJyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJ30nIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICUoLi4uJX0uICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJyknXCIgJ30nXG4gICAgICAgIHwgJyknIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICV7Li4uJSkuICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJ30nXCIgJyknXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIGVuZFxuICAgIHwgXyAtPiBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICgqIENoZWNrIGlmIHN5bWIgaXMgYSB2YWxpZCBpbnQgY29udmVyc2lvbiBhZnRlciBcIiVsXCIsIFwiJW5cIiBvciBcIiVMXCIgKilcbiAgYW5kIGlzX2ludF9iYXNlIHN5bWIgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICdkJyB8ICdpJyB8ICd4JyB8ICdYJyB8ICdvJyB8ICd1JyAtPiB0cnVlXG4gICAgfCBfIC0+IGZhbHNlXG5cbiAgKCogQ29udmVydCBhIGNoYXIgKGwsIG4gb3IgTCkgdG8gaXRzIGFzc29jaWF0ZWQgY291bnRlci4gKilcbiAgYW5kIGNvdW50ZXJfb2ZfY2hhciBzeW1iID0gbWF0Y2ggc3ltYiB3aXRoXG4gICAgfCAnbCcgLT4gTGluZV9jb3VudGVyICB8ICduJyAtPiBDaGFyX2NvdW50ZXJcbiAgICB8ICdMJyAtPiBUb2tlbl9jb3VudGVyIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzeW1iKSB0byBpdHMgYXNzb2NpYXRlZCBpbnRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBzcGFjZSBzeW1iID1cbiAgICBtYXRjaCBwbHVzLCBoYXNoLCBzcGFjZSwgc3ltYiB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnZCcgLT4gSW50X2QgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ2knIC0+IEludF9pXG4gICAgfCBmYWxzZSwgZmFsc2UsICB0cnVlLCAnZCcgLT4gSW50X3NkIHwgZmFsc2UsIGZhbHNlLCAgdHJ1ZSwgJ2knIC0+IEludF9zaVxuICAgIHwgIHRydWUsIGZhbHNlLCBmYWxzZSwgJ2QnIC0+IEludF9wZCB8ICB0cnVlLCBmYWxzZSwgZmFsc2UsICdpJyAtPiBJbnRfcGlcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd4JyAtPiBJbnRfeCAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnWCcgLT4gSW50X1hcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICd4JyAtPiBJbnRfQ3ggfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnWCcgLT4gSW50X0NYXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnbycgLT4gSW50X29cbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdvJyAtPiBJbnRfQ29cbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd1JyAtPiBJbnRfdVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2QnIC0+IEludF9DZFxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2knIC0+IEludF9DaVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ3UnIC0+IEludF9DdVxuICAgIHwgXywgdHJ1ZSwgXywgJ3gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DeFxuICAgIHwgXywgdHJ1ZSwgXywgJ1gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DWFxuICAgIHwgXywgdHJ1ZSwgXywgJ28nIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9Db1xuICAgIHwgXywgdHJ1ZSwgXywgKCdkJyB8ICdpJyB8ICd1JykgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGZhbHNlIHNwYWNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIlxuICAgIHwgdHJ1ZSwgXywgdHJ1ZSwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogcGx1cyBhbmQgc3BhY2U6IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHBsdXMgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIGZhbHNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiXG4gICAgfCBmYWxzZSwgXywgdHJ1ZSwgXyAgICAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBmYWxzZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyAnXCJcbiAgICB8IHRydWUsIF8sIGZhbHNlLCBfICAgIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgZmFsc2UgaGFzaCBzcGFjZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJysnXCJcbiAgICB8IGZhbHNlLCBfLCBmYWxzZSwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzcGFjZSwgc3ltYikgdG8gaXRzIGFzc29jaWF0ZWQgZmxvYXRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIHNwYWNlIHN5bWIgPVxuICAgIGxldCBmbGFnID0gbWF0Y2ggcGx1cywgc3BhY2Ugd2l0aFxuICAgIHwgZmFsc2UsIGZhbHNlIC0+IEZsb2F0X2ZsYWdfXG4gICAgfCBmYWxzZSwgIHRydWUgLT4gRmxvYXRfZmxhZ19zXG4gICAgfCAgdHJ1ZSwgZmFsc2UgLT4gRmxvYXRfZmxhZ19wXG4gICAgfCAgdHJ1ZSwgIHRydWUgLT5cbiAgICAgICgqIHBsdXMgYW5kIHNwYWNlOiBsZWdhY3kgaW1wbGVtZW50YXRpb24gcHJlZmVycyBwbHVzICopXG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBGbG9hdF9mbGFnX3BcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiIGluXG4gICAgbGV0IGtpbmQgPSBtYXRjaCBoYXNoLCBzeW1iIHdpdGhcbiAgICB8IF8sICdmJyAtPiBGbG9hdF9mXG4gICAgfCBfLCAnZScgLT4gRmxvYXRfZVxuICAgIHwgXywgJ0UnIC0+IEZsb2F0X0VcbiAgICB8IF8sICdnJyAtPiBGbG9hdF9nXG4gICAgfCBfLCAnRycgLT4gRmxvYXRfR1xuICAgIHwgXywgJ2gnIC0+IEZsb2F0X2hcbiAgICB8IF8sICdIJyAtPiBGbG9hdF9IXG4gICAgfCBmYWxzZSwgJ0YnIC0+IEZsb2F0X0ZcbiAgICB8IHRydWUsICdGJyAtPiBGbG9hdF9DRlxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgaW5cbiAgICBmbGFnLCBraW5kXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGluY29tcGF0aWJsZSBvcHRpb25zLiopXG4gIGFuZCBpbmNvbXBhdGlibGVfZmxhZyA6IHR5cGUgYSAuIGludCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmcgLT4gYSA9XG4gICAgZnVuIHBjdF9pbmQgc3RyX2luZCBzeW1iIG9wdGlvbiAtPlxuICAgICAgbGV0IHN1YmZtdCA9IFN0cmluZy5zdWIgc3RyIHBjdF9pbmQgKHN0cl9pbmQgLSBwY3RfaW5kKSBpblxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgJXMgaXMgaW5jb21wYXRpYmxlIHdpdGggJyVjJyBpbiBzdWItZm9ybWF0ICVTXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgb3B0aW9uIHN5bWIgc3ViZm10XG5cbiAgaW4gcGFyc2UgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAoKiBHdWFyZGVkIHN0cmluZyB0byBmb3JtYXQgY29udmVyc2lvbnMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2ZtdHR5IHN0ciBmbXR0eSA9XG4gIGxldCBGbXRfRUJCIGZtdCA9IGZtdF9lYmJfb2Zfc3RyaW5nIHN0ciBpblxuICB0cnkgRm9ybWF0ICh0eXBlX2Zvcm1hdCBmbXQgZm10dHksIHN0cilcbiAgd2l0aCBUeXBlX21pc21hdGNoIC0+XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJiYWQgaW5wdXQ6IGZvcm1hdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gJVMgYW5kICVTXCJcbiAgICAgIHN0ciAoc3RyaW5nX29mX2ZtdHR5IGZtdHR5KVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBhbiBvdGhlciBmb3JtYXQuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCBzdHIgKEZvcm1hdCAoZm10Jywgc3RyJykpID1cbiAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgc3RyIGluXG4gIHRyeSBGb3JtYXQgKHR5cGVfZm9ybWF0IGZtdCAoZm10dHlfb2ZfZm10IGZtdCcpLCBzdHIpXG4gIHdpdGggVHlwZV9taXNtYXRjaCAtPlxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiYmFkIGlucHV0OiBmb3JtYXQgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICVTIGFuZCAlU1wiIHN0ciBzdHInXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmxpdF9zdHJpbmciLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9mb3JtYXRfZmxvYXQiLCJjYW1sX2Zvcm1hdF9pbnQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX25vdGVxdWFsIiwiY2FtbF9zdHJpbmdfZ2V0IiwiY2FtbF9zdHJpbmdfdW5zYWZlX2dldCIsImNhbWxfdHJhbXBvbGluZSIsImNhbWxfdHJhbXBvbGluZV9yZXR1cm4iLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImNhbWxfY2FsbDQiLCJhMyIsImNhbWxfY2FsbDUiLCJhNCIsImR1bW15IiwiZ2xvYmFsX2RhdGEiLCJBc3NlcnRfZmFpbHVyZSIsIkNhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcyIsIlN0ZGxpYiIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX1N5cyIsIlN0ZGxpYl9DaGFyIiwiU3RkbGliX0J5dGVzIiwiU3RkbGliX0ludCIsImNyZWF0ZV9jaGFyX3NldCIsInBhcmFtIiwiYWRkX2luX2NoYXJfc2V0IiwiY2hhcl9zZXQiLCJjIiwic3RyX2luZCIsIm1hc2siLCJmcmVlemVfY2hhcl9zZXQiLCJyZXZfY2hhcl9zZXQiLCJpIiwiaXNfaW5fY2hhcl9zZXQiLCJwYWRfb2ZfcGFkX29wdCIsInBhZF9vcHQiLCJ3aWR0aCIsInBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCIsImlnbiIsImZtdCIsImljb252IiwicHJlY19vcHQiLCJuZGVjIiwiZm10dHkiLCJ3aWR0aF9vcHQiLCJjb3VudGVyIiwiZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24iLCJmY29udiIsImJ1ZmZlcl9jcmVhdGUiLCJpbml0X3NpemUiLCJidWZmZXJfY2hlY2tfc2l6ZSIsImJ1ZiIsIm92ZXJoZWFkIiwibGVuIiwibWluX2xlbiIsIm5ld19sZW4iLCJuZXdfc3RyIiwiYnVmZmVyX2FkZF9jaGFyIiwiYnVmZmVyX2FkZF9zdHJpbmciLCJzIiwic3RyX2xlbiIsImJ1ZmZlcl9jb250ZW50cyIsImNoYXJfb2ZfaWNvbnYiLCJjaGFyX29mX2Zjb252Iiwib3B0IiwiY0YiLCJicHJpbnRfY2hhcl9zZXQiLCJwcmludF9jaGFyIiwic2V0IiwiaXNfYWxvbmUiLCJhZnRlciIsImJlZm9yZSIsInN3aXRjaGVyIiwiaiIsImJwcmludF9wYWR0eSIsInBhZHR5IiwiYnByaW50X2lnbm9yZWRfZmxhZyIsImlnbl9mbGFnIiwiYnByaW50X3BhZF9vcHQiLCJicHJpbnRfcGFkZGluZyIsInBhZCIsIm4iLCJicHJpbnRfcHJlY2lzaW9uIiwicHJlYyIsImJwcmludF9pY29udl9mbGFnIiwiYnByaW50X2FsdGludF9mbXQiLCJicHJpbnRfZmNvbnZfZmxhZyIsInN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCIsImZvcm1hdHRpbmdfbGl0Iiwic3RyIiwiYnByaW50X2NoYXJfbGl0ZXJhbCIsImNociIsImJwcmludF9zdHJpbmdfbGl0ZXJhbCIsImNzdF9MaSIsImNzdF9pIiwiY3N0X2xpIiwiY3N0X25pIiwiYnByaW50X2ZtdHR5Iiwic3ViX2ZtdHR5IiwiaW50X29mX2N1c3RvbV9hcml0eSIsIngiLCJjc3QiLCJzdHJpbmdfb2ZfZm10IiwiZm10aXRlciIsInJlc3QiLCJmbXRpbmdfbGl0IiwiZm10aW5nX2dlbiIsImFyaXR5Iiwic3ltbSIsInR5IiwidHkyIiwidHkxIiwiZm10dHlfcmVsX2RldCIsIm1hdGNoIiwiZGUiLCJhZiIsImpkIiwiZ2EiLCJjc3RfY2FtbGludGVybmFsRm9ybWF0X21sIiwidHJhbnMiLCJyZXN0MSIsInJlc3QyIiwidHkxMiIsInR5MTEiLCJ0eTIyIiwidHkyMSIsImY0IiwiZjIiLCJmbXR0eV9vZl9mbXQiLCJ0eV9yZXN0IiwicHJlY190eSIsImZvcm1hdHRpbmdfZ2VuIiwiZm10dHlfb2ZfY3VzdG9tIiwiZm10dHlfb2ZfcGFkZGluZ19mbXR0eSIsImZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSIsIlR5cGVfbWlzbWF0Y2giLCJ0eXBlX3BhZGRpbmciLCJ3IiwidHlwZV9wYWRwcmVjIiwicCIsInR5cGVfZm9ybWF0IiwidHlwZV9mb3JtYXRfZ2VuIiwiZm10dHkwIiwiZm10dHlfcmVzdCIsImZtdF9yZXN0Iiwic3ViX2ZtdHR5MSIsImZtdDEiLCJmbXR0eTIiLCJmbXQyIiwiZm10dHkzIiwiZm10MyIsInR5cGVfaWdub3JlZF9wYXJhbV9vbmUiLCJ0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGkiLCJzdWJfZm10dHlfcmVzdCIsInN1YjJfZm10dHkiLCJzdWIxX2ZtdHR5IiwicmVjYXN0IiwiZml4X3BhZGRpbmciLCJyZXMiLCJmaXhfaW50X3ByZWNpc2lvbiIsInN0cmluZ190b19jYW1sX3N0cmluZyIsImwiLCJmb3JtYXRfb2ZfZmNvbnYiLCJzeW1iIiwidHJhbnNmb3JtX2ludF9hbHQiLCJwb3MiLCJwdXQiLCJsZWZ0IiwiY3N0X3UiLCJjb252ZXJ0X2ludCIsImNvbnZlcnRfaW50MzIiLCJjb252ZXJ0X25hdGl2ZWludCIsImNvbnZlcnRfaW50NjQiLCJjb252ZXJ0X2Zsb2F0IiwiaGV4Iiwic2lnbiIsImNhbWxfc3BlY2lhbF92YWwiLCJzdHJpbmdfb2ZfZm10dHkiLCJtYWtlX3ByaW50ZiIsImsiLCJhY2MiLCJrYWNjIiwibmV3X2FjYyIsIm8iLCJtYWtlX2lnbm9yZWRfcGFyYW0iLCJtYWtlX2Zyb21fZm10dHkiLCJtYWtlX2ludmFsaWRfYXJnIiwibWFrZV9wYWRkaW5nIiwibWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24iLCJtYWtlX2N1c3RvbSIsIm1ha2VfaXByaW50ZiIsImtvYyIsImZuX29mX2N1c3RvbV9hcml0eSIsIm91dHB1dF9hY2MiLCJtc2ciLCJidWZwdXRfYWNjIiwiYiIsInN0cnB1dF9hY2MiLCJmYWlsd2l0aF9tZXNzYWdlIiwib3Blbl9ib3hfb2Zfc3RyaW5nIiwiaW52YWxpZF9ib3giLCJwYXJzZV9zcGFjZXMiLCJ3c3RhcnQiLCJ3ZW5kIiwiYm94X25hbWUiLCJuc3RhcnQiLCJuZW5kIiwiaW5kZW50IiwiZXhuIiwiZXhwX2VuZCIsImJveF90eXBlIiwibWFrZV9wYWRkaW5nX2ZtdF9lYmIiLCJtYWtlX3BhZHByZWNfZm10X2ViYiIsImNzdF9hdF9jaGFyYWN0ZXJfbnVtYmVyIiwiY3N0X2ludmFsaWRfZm9ybWF0Iiwic3ViX2Zvcm1hdCIsImZtdF9lYmJfb2Zfc3RyaW5nIiwibGVnYWN5X2JlaGF2aW9yIiwiZmxhZyIsImludmFsaWRfZm9ybWF0X21lc3NhZ2UiLCJpbnZhbGlkX2Zvcm1hdF93aXRob3V0IiwiZXhwZWN0ZWRfY2hhcmFjdGVyIiwiZXhwZWN0ZWQiLCJyZWFkIiwiY3N0X3VuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCIsInBhcnNlIiwibGl0X3N0YXJ0IiwiZW5kX2luZCIsImNzdF8wIiwicGFyc2VfZmxhZ3MiLCJwY3RfaW5kIiwic2V0X2ZsYWciLCJ6ZXJvIiwibWludXMiLCJwbHVzIiwic3BhY2UiLCJoYXNoIiwibmV3X2luZCIsImNzdF9wcmVjaXNpb24iLCJwYXJzZV9hZnRlcl9wYWRkaW5nIiwicGFyc2VfbGl0ZXJhbCIsInBhcnNlX2FmdGVyX3ByZWNpc2lvbiIsInBhcnNlX2NvbnYiLCJwYWRwcmVjIiwicGFyc2VfY29udmVyc2lvbiIsInBsdXNfdXNlZCIsImdldF9wbHVzIiwiaGFzaF91c2VkIiwiZ2V0X2hhc2giLCJzcGFjZV91c2VkIiwiZ2V0X3NwYWNlIiwiaWduX3VzZWQiLCJnZXRfaWduIiwicGFkX3VzZWQiLCJnZXRfcGFkIiwicHJlY191c2VkIiwiZ2V0X3ByZWMiLCJnZXRfcGFkcHJlYyIsImdldF9pbnRfcGFkIiwiY2hlY2tfbm9fMCIsIm9wdF9vZl9wYWQiLCJnZXRfcGFkX29wdCIsImdldF9wYWRwcmVjX29wdCIsImZtdF9yZXN1bHQiLCJzdWJfZW5kIiwic3ViX2ZtdCIsImlnbm9yZWQiLCJuZXh0X2luZCIsImNoYXJfZm9ybWF0Iiwia2luZCIsInBhcnNlX2FmdGVyX2F0Iiwic3RyX2luZF8xIiwic3RyX2luZF8yIiwic3RyX2luZF8zIiwib2Zmc2V0Iiwic3RyX2luZF80Iiwic3RyX2luZF81Iiwic2l6ZSIsInBhcnNlX3RhZyIsImlzX29wZW5fdGFnIiwiaW5kIiwic3ViX3N0ciIsImZvcm1hdHRpbmciLCJwYXJzZV9jaGFyX3NldCIsImFkZF9yYW5nZSIsImZhaWxfc2luZ2xlX3BlcmNlbnQiLCJwYXJzZV9jaGFyX3NldF9jb250ZW50IiwicGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciIsInJldmVyc2UiLCJwYXJzZV9wb3NpdGl2ZSIsInBhcnNlX2ludGVnZXIiLCJhZGRfbGl0ZXJhbCIsInNlYXJjaF9zdWJmb3JtYXRfZW5kIiwiY29tcHV0ZV9pbnRfY29udiIsImluY29tcGF0aWJsZV9mbGFnIiwib3B0aW9uIiwic3ViZm10IiwiY3N0X2FuZCIsImNzdF9iYWRfaW5wdXRfZm9ybWF0X3R5cGVfbWlzbSIsImZvcm1hdF9vZl9zdHJpbmdfZm10dHkiLCJmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyx5QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMseUJBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FB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MjE4ODUsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvcHJpbnRmLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBYYXZpZXIgTGVyb3kgYW5kIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxubGV0IGtmcHJpbnRmIGsgbyAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgbyBhY2M7IGsgbykgRW5kX29mX2FjYyBmbXRcbmxldCBrYnByaW50ZiBrIGIgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZiAoZnVuIGFjYyAtPiBidWZwdXRfYWNjIGIgYWNjOyBrIGIpIEVuZF9vZl9hY2MgZm10XG5sZXQgaWtmcHJpbnRmIGsgb2MgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgayBvYyBmbXRcbmxldCBpa2JwcmludGYgPSBpa2ZwcmludGZcblxubGV0IGZwcmludGYgb2MgZm10ID0ga2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGJwcmludGYgYiBmbXQgPSBrYnByaW50ZiBpZ25vcmUgYiBmbXRcbmxldCBpZnByaW50ZiBvYyBmbXQgPSBpa2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGlicHJpbnRmIGIgZm10ID0gaWticHJpbnRmIGlnbm9yZSBiIGZtdFxubGV0IHByaW50ZiBmbXQgPSBmcHJpbnRmIHN0ZG91dCBmbXRcbmxldCBlcHJpbnRmIGZtdCA9IGZwcmludGYgc3RkZXJyIGZtdFxuXG5sZXQga3NwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBrJyBhY2MgPVxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gICAgc3RycHV0X2FjYyBidWYgYWNjO1xuICAgIGsgKEJ1ZmZlci5jb250ZW50cyBidWYpIGluXG4gIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10XG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAtPiBzKSBmbXRcblxubGV0IGtwcmludGYgPSBrc3ByaW50ZlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfQnVmZmVyIiwiQ2FtbGludGVybmFsRm9ybWF0IiwiU3RkbGliIiwia2ZwcmludGYiLCJrIiwibyIsInBhcmFtIiwiZm10IiwiYWNjIiwia2JwcmludGYiLCJiIiwiaWtmcHJpbnRmIiwib2MiLCJmcHJpbnRmIiwiYnByaW50ZiIsImlmcHJpbnRmIiwiaWJwcmludGYiLCJwcmludGYiLCJlcHJpbnRmIiwia3NwcmludGYiLCJidWYiLCJzcHJpbnRmIiwicyJdLCJtYXBwaW5ncyI6Ik9BQUFBLFVBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxZQUFBQyxTQUFBQyxHQUFBQyxHQUFBQztBQUFBQSxRQUFBQyxNQ2tCYTtBQUFBLElBQ1g7QUFBQTtBQUFBLHNCQUFBQztBQUFBQSxjQUF3QjtBQUFBLGNBQWdCLHVCQUFLO0FBQUE7QUFBQTtBQUFBLGlCQUFnQjtBQUFBO0FBQUEsWUFBQUMsU0FBQUwsR0FBQU0sR0FBQUo7QUFBQUEsUUFBQUMsTUFDbEQ7QUFBQSxJQUNYO0FBQUE7QUFBQSxzQkFBQUM7QUFBQUEsY0FBd0I7QUFBQSxjQUFnQix1QkFBSztBQUFBO0FBQUE7QUFBQSxpQkFBZ0I7QUFBQTtBQUFBLFlBQUFHLFVBQUFQLEdBQUFRLElBQUFOO0FBQUFBLFFBQUFDLE1BQ2pEO0FBQUEsSUFDWixtREFBcUI7QUFBQTtBQUFBLFlBQUFNLFFBQUFELElBQUFMO0FBQUFBLElBR0YsNEJEMUJyQixvQkMwQjJDO0FBQUE7QUFBQSxZQUFBTyxRQUFBSixHQUFBSCxLQUN2Qiw0QkQzQnBCLG1CQzJCeUM7QUFBQSxZQUFBUSxTQUFBSCxJQUFBTDtBQUFBQSxJQUNuQiw2QkQ1QnRCLG9CQzRCNkM7QUFBQTtBQUFBLFlBQUFTLFNBQUFOLEdBQUFIO0FBQUFBLElBQ3hCLDZCRDdCckIsbUJDNkIyQztBQUFBO0FBQUEsWUFBQVUsT0FBQVYsS0FDMUIsK0JBQWtCO0FBQUEsWUFBQVcsUUFBQVgsS0FDakIsK0JBQWtCO0FBQUEsWUFBQVksU0FBQWYsR0FBQUU7QUFBQUEsUUFBQUMsTUFFdkI7QUFBQSxhQUFBSCxJQUFBSTtBQUFBQSxTQUFBWSxNQUVDO0FBQUEsS0FDVjtBQUFBLEtBQ0UsT0FBcUIsY0FBckIsaUNBQXFCO0FBQUE7QUFBQSxJQUN6QixvREFBNkI7QUFBQTtBQUFBLFlBQUFDLFFBQUFkLEtBRWIseUJBQUFlLEdBQW1CLFNBQUMsT0FBSztBQUFBLEdEeEMzQyIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjIxOTcxLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL3ByaW50ZXhjLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIFByaW50ZlxuXG50eXBlIHQgPSBleG4gPSAuLlxuXG5sZXQgcHJpbnRlcnMgPSBBdG9taWMubWFrZSBbXVxuXG5sZXQgbG9jZm10ID0gZm9ybWF0X29mX3N0cmluZyBcIkZpbGUgXFxcIiVzXFxcIiwgbGluZSAlZCwgY2hhcmFjdGVycyAlZC0lZDogJXNcIlxuXG5sZXQgZmllbGQgeCBpID1cbiAgbGV0IGYgPSBPYmouZmllbGQgeCBpIGluXG4gIGlmIG5vdCAoT2JqLmlzX2Jsb2NrIGYpIHRoZW5cbiAgICBzcHJpbnRmIFwiJWRcIiAoT2JqLm1hZ2ljIGYgOiBpbnQpICAgICAgICAgICAoKiBjYW4gYWxzbyBiZSBhIGNoYXIgKilcbiAgZWxzZSBpZiBPYmoudGFnIGYgPSBPYmouc3RyaW5nX3RhZyB0aGVuXG4gICAgc3ByaW50ZiBcIiVTXCIgKE9iai5tYWdpYyBmIDogc3RyaW5nKVxuICBlbHNlIGlmIE9iai50YWcgZiA9IE9iai5kb3VibGVfdGFnIHRoZW5cbiAgICBzdHJpbmdfb2ZfZmxvYXQgKE9iai5tYWdpYyBmIDogZmxvYXQpXG4gIGVsc2VcbiAgICBcIl9cIlxuXG5sZXQgcmVjIG90aGVyX2ZpZWxkcyB4IGkgPVxuICBpZiBpID49IE9iai5zaXplIHggdGhlbiBcIlwiXG4gIGVsc2Ugc3ByaW50ZiBcIiwgJXMlc1wiIChmaWVsZCB4IGkpIChvdGhlcl9maWVsZHMgeCAoaSsxKSlcblxubGV0IGZpZWxkcyB4ID1cbiAgbWF0Y2ggT2JqLnNpemUgeCB3aXRoXG4gIHwgMCAtPiBcIlwiXG4gIHwgMSAtPiBcIlwiXG4gIHwgMiAtPiBzcHJpbnRmIFwiKCVzKVwiIChmaWVsZCB4IDEpXG4gIHwgXyAtPiBzcHJpbnRmIFwiKCVzJXMpXCIgKGZpZWxkIHggMSkgKG90aGVyX2ZpZWxkcyB4IDIpXG5cbmxldCB1c2VfcHJpbnRlcnMgeCA9XG4gIGxldCByZWMgY29udiA9IGZ1bmN0aW9uXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICAobWF0Y2ggaGQgeCB3aXRoXG4gICAgICAgICB8IE5vbmUgfCBleGNlcHRpb24gXyAtPiBjb252IHRsXG4gICAgICAgICB8IFNvbWUgcyAtPiBTb21lIHMpXG4gICAgfCBbXSAtPiBOb25lIGluXG4gIGNvbnYgKEF0b21pYy5nZXQgcHJpbnRlcnMpXG5cbmxldCBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgeCA9XG4gIGlmIE9iai50YWcgeCA8PiAwIHRoZW5cbiAgICAoKE9iai5tYWdpYyAoT2JqLmZpZWxkIHggMCkgOiBzdHJpbmcpLCBOb25lKVxuICBlbHNlXG4gICAgbGV0IGNvbnN0cnVjdG9yID1cbiAgICAgIChPYmoubWFnaWMgKE9iai5maWVsZCAoT2JqLmZpZWxkIHggMCkgMCkgOiBzdHJpbmcpIGluXG4gICAgKGNvbnN0cnVjdG9yLCBTb21lIChmaWVsZHMgeCkpXG5cbmxldCBzdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHQgPVxuICBsZXQgY29uc3RydWN0b3IsIGZpZWxkc19vcHQgPSBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgdCBpblxuICBtYXRjaCBmaWVsZHNfb3B0IHdpdGhcbiAgfCBOb25lIC0+IGNvbnN0cnVjdG9yXG4gIHwgU29tZSBmIC0+IGNvbnN0cnVjdG9yIF4gZlxuXG5sZXQgdG9fc3RyaW5nX2RlZmF1bHQgPSBmdW5jdGlvblxuICB8IE91dF9vZl9tZW1vcnkgLT4gXCJPdXQgb2YgbWVtb3J5XCJcbiAgfCBTdGFja19vdmVyZmxvdyAtPiBcIlN0YWNrIG92ZXJmbG93XCJcbiAgfCBNYXRjaF9mYWlsdXJlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis1KSBcIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbGVkXCJcbiAgfCBBc3NlcnRfZmFpbHVyZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJBc3NlcnRpb24gZmFpbGVkXCJcbiAgfCBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJVbmRlZmluZWQgcmVjdXJzaXZlIG1vZHVsZVwiXG4gIHwgeCAtPlxuICAgICAgc3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvciAoT2JqLnJlcHIgeClcblxubGV0IHRvX3N0cmluZyBlID1cbiAgbWF0Y2ggdXNlX3ByaW50ZXJzIGUgd2l0aFxuICB8IFNvbWUgcyAtPiBzXG4gIHwgTm9uZSAtPiB0b19zdHJpbmdfZGVmYXVsdCBlXG5cbmxldCBwcmludCBmY3QgYXJnID1cbiAgdHJ5XG4gICAgZmN0IGFyZ1xuICB3aXRoIHggLT5cbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZmx1c2ggc3RkZXJyO1xuICAgIHJhaXNlIHhcblxubGV0IGNhdGNoIGZjdCBhcmcgPVxuICB0cnlcbiAgICBmY3QgYXJnXG4gIHdpdGggeCAtPlxuICAgIGZsdXNoIHN0ZG91dDtcbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZXhpdCAyXG5cbnR5cGUgcmF3X2JhY2t0cmFjZV9zbG90XG50eXBlIHJhd19iYWNrdHJhY2VfZW50cnkgPSBwcml2YXRlIGludFxudHlwZSByYXdfYmFja3RyYWNlID0gcmF3X2JhY2t0cmFjZV9lbnRyeSBhcnJheVxuXG5sZXQgcmF3X2JhY2t0cmFjZV9lbnRyaWVzIGJ0ID0gYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2U6XG4gIHVuaXQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2VcIlxuXG5leHRlcm5hbCByYWlzZV93aXRoX2JhY2t0cmFjZTogZXhuIC0+IHJhd19iYWNrdHJhY2UgLT4gJ2FcbiAgPSBcIiVyYWlzZV93aXRoX2JhY2t0cmFjZVwiXG5cbigqIERpc2FibGUgd2FybmluZyAzNzogdmFsdWVzIGFyZSBjb25zdHJ1Y3RlZCBpbiB0aGUgcnVudGltZSAqKVxudHlwZVtAd2FybmluZyBcIi0zN1wiXSBiYWNrdHJhY2Vfc2xvdCA9XG4gIHwgS25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgICA6IGJvb2w7XG4gICAgICBmaWxlbmFtZSAgIDogc3RyaW5nO1xuICAgICAgc3RhcnRfbG51bSA6IGludDtcbiAgICAgIHN0YXJ0X2NoYXIgOiBpbnQ7XG4gICAgICBlbmRfb2Zmc2V0IDogaW50OyAoKiBSZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2Ygc3RhcnRfbG51bSAqKVxuICAgICAgZW5kX2xudW0gICA6IGludDtcbiAgICAgIGVuZF9jaGFyICAgOiBpbnQ7ICgqIFJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBlbmRfbG51bSBsaW5lICopXG4gICAgICBpc19pbmxpbmUgIDogYm9vbDtcbiAgICAgIGRlZm5hbWUgICAgOiBzdHJpbmc7XG4gICAgfVxuICB8IFVua25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgOiBib29sXG4gICAgfVxuXG5leHRlcm5hbCBjb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdDpcbiAgcmF3X2JhY2t0cmFjZV9zbG90IC0+IGJhY2t0cmFjZV9zbG90ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XCJcblxuZXh0ZXJuYWwgY29udmVydF9yYXdfYmFja3RyYWNlOlxuICByYXdfYmFja3RyYWNlIC0+IGJhY2t0cmFjZV9zbG90IGFycmF5ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZVwiXG5cbmxldCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UgYnQgPVxuICB0cnkgU29tZSAoY29udmVydF9yYXdfYmFja3RyYWNlIGJ0KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgcG9zIHNsb3QgPVxuICBsZXQgaW5mbyBpc19yYWlzZSA9XG4gICAgaWYgaXNfcmFpc2UgdGhlblxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGF0XCIgZWxzZSBcIlJlLXJhaXNlZCBhdFwiXG4gICAgZWxzZVxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGJ5IHByaW1pdGl2ZSBvcGVyYXRpb24gYXRcIiBlbHNlIFwiQ2FsbGVkIGZyb21cIlxuICBpblxuICBtYXRjaCBzbG90IHdpdGhcbiAgfCBVbmtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGlmIGwuaXNfcmFpc2UgdGhlblxuICAgICAgICAoKiBjb21waWxlci1pbnNlcnRlZCByZS1yYWlzZSwgc2tpcHBlZCAqKSBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIFNvbWUgKHNwcmludGYgXCIlcyB1bmtub3duIGxvY2F0aW9uXCIgKGluZm8gZmFsc2UpKVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGxldCBsaW5lcyA9XG4gICAgICAgIGlmIGwuc3RhcnRfbG51bSA9IGwuZW5kX2xudW0gdGhlblxuICAgICAgICAgIFByaW50Zi5zcHJpbnRmIFwiICVkXCIgbC5zdGFydF9sbnVtXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBQcmludGYuc3ByaW50ZiBcInMgJWQtJWRcIiBsLnN0YXJ0X2xudW0gbC5lbmRfbG51bVxuICAgICAgaW5cbiAgICAgIFNvbWUgKHNwcmludGYgXCIlcyAlcyBpbiBmaWxlIFxcXCIlc1xcXCIlcywgbGluZSVzLCBjaGFyYWN0ZXJzICVkLSVkXCJcbiAgICAgICAgICAgICAgKGluZm8gbC5pc19yYWlzZSkgbC5kZWZuYW1lIGwuZmlsZW5hbWVcbiAgICAgICAgICAgICAgKGlmIGwuaXNfaW5saW5lIHRoZW4gXCIgKGlubGluZWQpXCIgZWxzZSBcIlwiKVxuICAgICAgICAgICAgICBsaW5lcyBsLnN0YXJ0X2NoYXIgbC5lbmRfY2hhcilcblxubGV0IHByaW50X2V4Y2VwdGlvbl9iYWNrdHJhY2Ugb3V0Y2hhbiBiYWNrdHJhY2UgPVxuICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICB8IE5vbmUgLT5cbiAgICAgIGZwcmludGYgb3V0Y2hhblxuICAgICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBhIC0gMSBkb1xuICAgICAgICBtYXRjaCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgaSBhLihpKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIHN0ciAtPiBmcHJpbnRmIG91dGNoYW4gXCIlc1xcblwiIHN0clxuICAgICAgZG9uZVxuXG5sZXQgcHJpbnRfcmF3X2JhY2t0cmFjZSBvdXRjaGFuIHJhd19iYWNrdHJhY2UgPVxuICBwcmludF9leGNlcHRpb25fYmFja3RyYWNlIG91dGNoYW4gKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG4oKiBjb25mdXNpbmdseSBuYW1lZDogcHJpbnRzIHRoZSBnbG9iYWwgY3VycmVudCBiYWNrdHJhY2UgKilcbmxldCBwcmludF9iYWNrdHJhY2Ugb3V0Y2hhbiA9XG4gIHByaW50X3Jhd19iYWNrdHJhY2Ugb3V0Y2hhbiAoZ2V0X3Jhd19iYWNrdHJhY2UgKCkpXG5cbmxldCBiYWNrdHJhY2VfdG9fc3RyaW5nIGJhY2t0cmFjZSA9XG4gIG1hdGNoIGJhY2t0cmFjZSB3aXRoXG4gIHwgTm9uZSAtPlxuICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDEwMjQgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggYSAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZm9ybWF0X2JhY2t0cmFjZV9zbG90IGkgYS4oaSkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBzdHIgLT4gYnByaW50ZiBiIFwiJXNcXG5cIiBzdHJcbiAgICAgIGRvbmU7XG4gICAgICBCdWZmZXIuY29udGVudHMgYlxuXG5sZXQgcmF3X2JhY2t0cmFjZV90b19zdHJpbmcgcmF3X2JhY2t0cmFjZSA9XG4gIGJhY2t0cmFjZV90b19zdHJpbmcgKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2UgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19yYWlzZVxuICB8IFVua25vd25fbG9jYXRpb24gbCAtPiBsLmlzX3JhaXNlXG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9pc19pbmxpbmUgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19pbmxpbmVcbiAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcblxudHlwZSBsb2NhdGlvbiA9IHtcbiAgZmlsZW5hbWUgOiBzdHJpbmc7XG4gIGxpbmVfbnVtYmVyIDogaW50O1xuICBzdGFydF9jaGFyIDogaW50O1xuICBlbmRfY2hhciA6IGludDtcbiAgZW5kX2xpbmUgOiBpbnQ7XG4gIGVuZF9jb2wgOiBpbnQ7XG59XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvbiA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgU29tZSB7XG4gICAgICBmaWxlbmFtZSAgICA9IGwuZmlsZW5hbWU7XG4gICAgICBsaW5lX251bWJlciA9IGwuc3RhcnRfbG51bTtcbiAgICAgIHN0YXJ0X2NoYXIgID0gbC5zdGFydF9jaGFyO1xuICAgICAgZW5kX2NoYXIgICAgPSBsLmVuZF9vZmZzZXQ7XG4gICAgICBlbmRfbGluZSAgICA9IGwuZW5kX2xudW07XG4gICAgICBlbmRfY29sICAgICA9IGwuZW5kX2NoYXI7XG4gICAgfVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfXG4gIHwgS25vd25fbG9jYXRpb24geyBkZWZuYW1lID0gXCJcIiB9IC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IFNvbWUgbC5kZWZuYW1lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHMgcmF3X2JhY2t0cmFjZSA9XG4gICgqIFRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IFNvbWUgaXNcbiAgICAgcmV0dXJuZWQgb25seSBpZiBhIHBhcnQgb2YgdGhlIHRyYWNlIGlzIHVzYWJsZS4gVGhpcyBnaXZlcyB1c1xuICAgICBhIGJpdCBtb3JlIHdvcmsgdGhhbiBqdXN0IGNvbnZlcnRfcmF3X2JhY2t0cmFjZSwgYnV0IGl0IG1ha2VzIHRoZVxuICAgICBBUEkgbW9yZSB1c2VyLWZyaWVuZGx5IC0tIG90aGVyd2lzZSBtb3N0IHVzZXJzIHdvdWxkIGhhdmUgdG9cbiAgICAgcmVpbXBsZW1lbnQgdGhlIFwiUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIHNvcnJ5XCIgbG9naWNcbiAgICAgdGhlbXNlbHZlcy4gKilcbiAgbWF0Y2ggY29udmVydF9yYXdfYmFja3RyYWNlIHJhd19iYWNrdHJhY2Ugd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGJhY2t0cmFjZSAtPlxuICAgICAgbGV0IHVzYWJsZV9zbG90ID0gZnVuY3Rpb25cbiAgICAgICAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcbiAgICAgICAgfCBLbm93bl9sb2NhdGlvbiBfIC0+IHRydWUgaW5cbiAgICAgIGxldCByZWMgZXhpc3RzX3VzYWJsZSA9IGZ1bmN0aW9uXG4gICAgICAgIHwgKC0xKSAtPiBmYWxzZVxuICAgICAgICB8IGkgLT4gdXNhYmxlX3Nsb3QgYmFja3RyYWNlLihpKSB8fCBleGlzdHNfdXNhYmxlIChpIC0gMSkgaW5cbiAgICAgIGlmIGV4aXN0c191c2FibGUgKEFycmF5Lmxlbmd0aCBiYWNrdHJhY2UgLSAxKVxuICAgICAgdGhlbiBTb21lIGJhY2t0cmFjZVxuICAgICAgZWxzZSBOb25lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHNfb2ZfcmF3X2VudHJ5IGVudHJ5ID1cbiAgYmFja3RyYWNlX3Nsb3RzIFt8IGVudHJ5IHxdXG5cbm1vZHVsZSBTbG90ID0gc3RydWN0XG4gIHR5cGUgdCA9IGJhY2t0cmFjZV9zbG90XG4gIGxldCBmb3JtYXQgPSBmb3JtYXRfYmFja3RyYWNlX3Nsb3RcbiAgbGV0IGlzX3JhaXNlID0gYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2VcbiAgbGV0IGlzX2lubGluZSA9IGJhY2t0cmFjZV9zbG90X2lzX2lubGluZVxuICBsZXQgbG9jYXRpb24gPSBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvblxuICBsZXQgbmFtZSA9IGJhY2t0cmFjZV9zbG90X2RlZm5hbWVcbmVuZFxuXG5sZXQgcmF3X2JhY2t0cmFjZV9sZW5ndGggYnQgPSBBcnJheS5sZW5ndGggYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2Vfc2xvdCA6XG4gIHJhd19iYWNrdHJhY2UgLT4gaW50IC0+IHJhd19iYWNrdHJhY2Vfc2xvdCA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3RcIlxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3QgOlxuICByYXdfYmFja3RyYWNlX3Nsb3QgLT4gcmF3X2JhY2t0cmFjZV9zbG90IG9wdGlvblxuICA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdFwiXG5cbigqIGNvbmZ1c2luZ2x5IG5hbWVkOlxuICAgcmV0dXJucyB0aGUgKnN0cmluZyogY29ycmVzcG9uZGluZyB0byB0aGUgZ2xvYmFsIGN1cnJlbnQgYmFja3RyYWNlICopXG5sZXQgZ2V0X2JhY2t0cmFjZSAoKSA9IHJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIChnZXRfcmF3X2JhY2t0cmFjZSAoKSlcblxuZXh0ZXJuYWwgcmVjb3JkX2JhY2t0cmFjZTogYm9vbCAtPiB1bml0ID0gXCJjYW1sX3JlY29yZF9iYWNrdHJhY2VcIlxuZXh0ZXJuYWwgYmFja3RyYWNlX3N0YXR1czogdW5pdCAtPiBib29sID0gXCJjYW1sX2JhY2t0cmFjZV9zdGF0dXNcIlxuXG5sZXQgcmVjIHJlZ2lzdGVyX3ByaW50ZXIgZm4gPVxuICBsZXQgb2xkX3ByaW50ZXJzID0gQXRvbWljLmdldCBwcmludGVycyBpblxuICBsZXQgbmV3X3ByaW50ZXJzID0gZm4gOjogb2xkX3ByaW50ZXJzIGluXG4gIGxldCBzdWNjZXNzID0gQXRvbWljLmNvbXBhcmVfYW5kX3NldCBwcmludGVycyBvbGRfcHJpbnRlcnMgbmV3X3ByaW50ZXJzIGluXG4gIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmVnaXN0ZXJfcHJpbnRlciBmblxuXG5leHRlcm5hbCBnZXRfY2FsbHN0YWNrOiBpbnQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2tcIlxuXG5sZXQgZXhuX3Nsb3QgeCA9XG4gIGxldCB4ID0gT2JqLnJlcHIgeCBpblxuICBpZiBPYmoudGFnIHggPSAwIHRoZW4gT2JqLmZpZWxkIHggMCBlbHNlIHhcblxubGV0IGV4bl9zbG90X2lkIHggPVxuICBsZXQgc2xvdCA9IGV4bl9zbG90IHggaW5cbiAgKE9iai5vYmogKE9iai5maWVsZCBzbG90IDEpIDogaW50KVxuXG5sZXQgZXhuX3Nsb3RfbmFtZSB4ID1cbiAgbGV0IHNsb3QgPSBleG5fc2xvdCB4IGluXG4gIChPYmoub2JqIChPYmouZmllbGQgc2xvdCAwKSA6IHN0cmluZylcblxuZXh0ZXJuYWwgZ2V0X2RlYnVnX2luZm9fc3RhdHVzIDogdW5pdCAtPiBpbnQgPSBcImNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXNcIlxuXG4oKiBEZXNjcmlwdGlvbnMgZm9yIGVycm9ycyBpbiBzdGFydHVwLmguIFNlZSBhbHNvIGJhY2t0cmFjZS5jICopXG5sZXQgZXJyb3JzID0gW3wgXCJcIjtcbiAgKCogRklMRV9OT1RfRk9VTkQgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIG5vdCBmb3VuZClcIjtcbiAgKCogQkFEX0JZVEVDT0RFICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQpXCI7XG4gICgqIFdST05HX01BR0lDICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBoYXMgd3JvbmcgbWFnaWMgbnVtYmVyKVwiO1xuICAoKiBOT19GRFMgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQ7XFxuIFxcXG4gICAgICAtLSB0b28gbWFueSBvcGVuIGZpbGVzLiBUcnkgcnVubmluZyB3aXRoIE9DQU1MUlVOUEFSQU09Yj0yKVwiXG58XVxuXG5sZXQgZGVmYXVsdF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBleG4gcmF3X2JhY2t0cmFjZSA9XG4gIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlO1xuICBsZXQgc3RhdHVzID0gZ2V0X2RlYnVnX2luZm9fc3RhdHVzICgpIGluXG4gIGlmIHN0YXR1cyA8IDAgdGhlblxuICAgIHByZXJyX2VuZGxpbmUgZXJyb3JzLihhYnMgc3RhdHVzKTtcbiAgZmx1c2ggc3RkZXJyXG5cbmxldCB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA9IHJlZiBkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyXG5cbmxldCBzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZm4gPSB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA6PSBmblxuXG5sZXQgZW1wdHlfYmFja3RyYWNlIDogcmF3X2JhY2t0cmFjZSA9IFt8IHxdXG5cbmxldCB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgPVxuICB0cnlcbiAgICBnZXRfcmF3X2JhY2t0cmFjZSAoKVxuICB3aXRoIF8gKCogT3V0X29mX21lbW9yeT8gKikgLT5cbiAgICBlbXB0eV9iYWNrdHJhY2VcblxubGV0IGhhbmRsZV91bmNhdWdodF9leGNlcHRpb24nIGV4biBkZWJ1Z2dlcl9pbl91c2UgPVxuICB0cnlcbiAgICAoKiBHZXQgdGhlIGJhY2t0cmFjZSBub3csIGluIGNhc2Ugb25lIG9mIHRoZSBbYXRfZXhpdF0gZnVuY3Rpb25cbiAgICAgICBkZXN0cm95cyBpdC4gKilcbiAgICBsZXQgcmF3X2JhY2t0cmFjZSA9XG4gICAgICBpZiBkZWJ1Z2dlcl9pbl91c2UgKCogU2FtZSB0ZXN0IGFzIGluIFtydW50aW1lL3ByaW50ZXhjLmNdICopIHRoZW5cbiAgICAgICAgZW1wdHlfYmFja3RyYWNlXG4gICAgICBlbHNlXG4gICAgICAgIHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKVxuICAgIGluXG4gICAgKHRyeSBTdGRsaWIuZG9fYXRfZXhpdCAoKSB3aXRoIF8gLT4gKCkpO1xuICAgIHRyeVxuICAgICAgIXVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGV4biByYXdfYmFja3RyYWNlXG4gICAgd2l0aCBleG4nIC0+XG4gICAgICBsZXQgcmF3X2JhY2t0cmFjZScgPSB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICAgICAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZTtcbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvciBpbiB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlcjogZXhjZXB0aW9uICVzXFxuXCJcbiAgICAgICAgKHRvX3N0cmluZyBleG4nKTtcbiAgICAgIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2UnO1xuICAgICAgZmx1c2ggc3RkZXJyXG4gIHdpdGhcbiAgICB8IE91dF9vZl9tZW1vcnkgLT5cbiAgICAgICAgcHJlcnJfZW5kbGluZVxuICAgICAgICAgIFwiRmF0YWwgZXJyb3I6IG91dCBvZiBtZW1vcnkgaW4gdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXJcIlxuXG4oKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBbY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25dIGluXG4gICBbcnVudGltZS9wcmludGV4Yy5jXSB3aGljaCBleHBlY3RzIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuICopXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbiBleG4gZGVidWdnZXJfaW5fdXNlID1cbiAgdHJ5XG4gICAgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbicgZXhuIGRlYnVnZ2VyX2luX3VzZVxuICB3aXRoIF8gLT5cbiAgICAoKiBUaGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCAqKVxuICAgICgpXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgKCkgPVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlByaW50ZXhjLmhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cIlxuICAgIGhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfb2JqX3RhZyIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsNSIsImEyIiwiYTMiLCJhNCIsImNhbWxfY2FsbDciLCJhNSIsImE2IiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfUHJpbnRmIiwiU3RkbGliX0F0b21pYyIsIlN0ZGxpYiIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfT2JqIiwicHJpbnRlcnMiLCJmaWVsZCIsIngiLCJpIiwiY3N0Iiwib3RoZXJfZmllbGRzIiwidXNlX3ByaW50ZXJzIiwicGFyYW0iLCJ0bCIsImhkIiwidmFsIiwicyIsInN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0byIsInQiLCJjb25zdHJ1Y3RvciIsIm1hdGNoIiwiZmllbGRzX29wdCIsImNzdF9jaGFyYWN0ZXJzIiwibG9jZm10IiwidG9fc3RyaW5nX2RlZmF1bHQiLCJjaGFyIiwibGluZSIsImZpbGUiLCJ0b19zdHJpbmciLCJlIiwiY3N0X1VuY2F1Z2h0X2V4Y2VwdGlvbiIsImNzdF9VbmNhdWdodF9leGNlcHRpb25fcyIsInByaW50IiwiZmN0IiwiYXJnIiwiY2F0Y2gkIiwicmF3X2JhY2t0cmFjZV9lbnRyaWVzIiwiYnQiLCJjb252ZXJ0X3Jhd19iYWNrdHJhY2UiLCJmb3JtYXRfYmFja3RyYWNlX3Nsb3QiLCJwb3MiLCJzbG90IiwiaW5mbyIsImlzX3JhaXNlIiwibGluZXMiLCJjc3RfcyIsImNzdF9Qcm9ncmFtX25vdF9saW5rZWRfd2l0aF9nXyIsInByaW50X3Jhd19iYWNrdHJhY2UiLCJvdXRjaGFuIiwicmF3X2JhY2t0cmFjZSIsImJhY2t0cmFjZSIsImEiLCJzdHIiLCJwcmludF9iYWNrdHJhY2UiLCJyYXdfYmFja3RyYWNlX3RvX3N0cmluZyIsImIiLCJiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZSIsImJhY2t0cmFjZV9zbG90X2lzX2lubGluZSIsImJhY2t0cmFjZV9zbG90X2xvY2F0aW9uIiwiYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSIsImJhY2t0cmFjZV9zbG90cyIsImJhY2t0cmFjZV9zbG90c19vZl9yYXdfZW50cnkiLCJlbnRyeSIsInJhd19iYWNrdHJhY2VfbGVuZ3RoIiwiZ2V0X2JhY2t0cmFjZSIsInJlZ2lzdGVyX3ByaW50ZXIiLCJmbiIsIm9sZF9wcmludGVycyIsIm5ld19wcmludGVycyIsInN1Y2Nlc3MiLCJleG5fc2xvdCIsImV4bl9zbG90X2lkIiwiZXhuX3Nsb3RfbmFtZSIsImVycm9ycyIsImNzdF9GYXRhbF9lcnJvcl9leGNlcHRpb24iLCJjc3RfRmF0YWxfZXJyb3JfZXhjZXB0aW9uX3MiLCJkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW4iLCJleG4iLCJzdGF0dXMiLCJ1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsInNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsImVtcHR5X2JhY2t0cmFjZSIsImhhbmRsZV91bmNhdWdodF9leGNlcHRpb24iLCJkZWJ1Z2dlcl9pbl91c2UiLCJTdGRsaWJfUHJpbnRleGMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxpQ0FBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBSixHQUFBQyxJQUFBRSxJ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QUFBQSxZQW1Cd0M7QUFBQSxPQUF0QztBQUFBLE9BQ0E7QUFBQSxlQUVFO0FBQUEsT0FERjtBQUFBLE9BRUE7QUFBQSxlQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FBQTRCO0FBQUFBLFVBQUFBLE1EeldOO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0M0V1E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBQUFBLEtBVUo7QUFBQSxHQUFFO0FBQUEsR0FNSjtBQUFBO0FBQUE7QUFBQSxJQUFBTztBQUFBQSxNQUMyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEN1g3QiIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjIyNDUzLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2Z1bi5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgaWQgOiAnYSAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmxldCBjb25zdCBjIF8gPSBjXG5sZXQgY29tcG9zZSBmIGcgeCA9IGYgKGcgeClcbmxldCBmbGlwIGYgeCB5ID0gZiB5IHhcbmxldCBuZWdhdGUgcCB2ID0gbm90IChwIHYpXG5cbmV4Y2VwdGlvbiBGaW5hbGx5X3JhaXNlZCBvZiBleG5cblxubGV0ICgpID0gUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciBAQCBmdW5jdGlvblxufCBGaW5hbGx5X3JhaXNlZCBleG4gLT4gU29tZSAoXCJGdW4uRmluYWxseV9yYWlzZWQ6IFwiIF4gUHJpbnRleGMudG9fc3RyaW5nIGV4bilcbnwgXyAtPiBOb25lXG5cbmxldCBwcm90ZWN0IH4oZmluYWxseSA6IHVuaXQgLT4gdW5pdCkgd29yayA9XG4gIGxldCBmaW5hbGx5X25vX2V4biAoKSA9XG4gICAgdHJ5IGZpbmFsbHkgKCkgd2l0aCBlIC0+XG4gICAgICBsZXQgYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgKEZpbmFsbHlfcmFpc2VkIGUpIGJ0XG4gIGluXG4gIG1hdGNoIHdvcmsgKCkgd2l0aFxuICB8IHJlc3VsdCAtPiBmaW5hbGx5X25vX2V4biAoKSA7IHJlc3VsdFxuICB8IGV4Y2VwdGlvbiB3b3JrX2V4biAtPlxuICAgICAgbGV0IHdvcmtfYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgZmluYWxseV9ub19leG4gKCkgO1xuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2Ugd29ya19leG4gd29ya19idFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZSIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfUHJpbnRleGMiLCJTdGRsaWIiLCJjb25zdCQiLCJjIiwicGFyYW0iLCJjb21wb3NlIiwiZyIsIngiLCJmbGlwIiwieSIsIm5lZ2F0ZSIsInAiLCJ2IiwiRmluYWxseV9yYWlzZWQiLCJleG4iLCJkdW1teSIsInByb3RlY3QiLCJmaW5hbGx5JCIsIndvcmsiLCJmaW5hbGx5X25vX2V4biIsImUiLCJidCIsInJlc3VsdCIsIndvcmtfZXhuIiwid29ya19idCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDZCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLFlBQUFDLE9BQUFDLEdBQUFDLE9DZ0JnQixTQUFDO0FBQUEsWUFBQUMsUUFBQVYsR0FBQVcsR0FBQUMsR0FDSyxPQUFLLGNBQUwsaUJBQUs7QUFBQSxZQUFBQyxLQUFBYixHQUFBWSxHQUFBRSxHQUNWLDBCQUFLO0FBQUEsWUFBQUMsT0FBQUMsR0FBQUMsR0FDRCwyQkFBSztBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTURuQjFCO0FBQUEsR0N1QlM7QUFBQTtBQUFBLGNBQUFUO0FBQUFBLE1BQTZCLGdDQUUvQjtBQUFBLFVBQUFVLE1BRitCLGNBQ2lCO0FBQUEsTUFBMUIsNERBQWlEO0FBQUEsS0FDbkU7QUFBQSxPQUFBQyxRQUFBO0FBQUEsWUFBQUMsUUFBQUMsVUFBQUM7QUFBQUEsYUFBQUMsZUFBQWY7QUFBQUEsS0FJUCxJQUFJO0FBQUEsV0FBQWdCO0FBQUFBO0FBQUFBLE9BQUFBLElEN0JSO0FBQUEsT0FBQUMsS0M4QmU7QUFBQSxPQUFBUCxNQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBbUQ7QUFBQSxJQUV2RCxRQUFBUSxTQUFNO0FBQUEsVUFBQUM7QUFBQUE7QUFBQUEsTUFBQUEsV0RqQ1I7QUFBQSxNQUFBQyxVQ29Db0I7QUFBQSxLQUNkO0FBQUEsS0FBaUI7QUFBQTtBQUFBO0FBQUEsSUFIVDtBQUFBLElBQWlCO0FBQUEsR0FJcUI7QUFBQSxHQWJ6QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR6QlgiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMjUyNCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9pbl9jaGFubmVsLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBpbl9jaGFubmVsXG5cbnR5cGUgb3Blbl9mbGFnID0gU3RkbGliLm9wZW5fZmxhZyA9XG4gIHwgT3Blbl9yZG9ubHlcbiAgfCBPcGVuX3dyb25seVxuICB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdFxuICB8IE9wZW5fdHJ1bmNcbiAgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeVxuICB8IE9wZW5fdGV4dFxuICB8IE9wZW5fbm9uYmxvY2tcblxubGV0IHN0ZGluID0gU3RkbGliLnN0ZGluXG5sZXQgb3Blbl9iaW4gPSBTdGRsaWIub3Blbl9pbl9iaW5cbmxldCBvcGVuX3RleHQgPSBTdGRsaWIub3Blbl9pblxubGV0IG9wZW5fZ2VuID0gU3RkbGliLm9wZW5faW5fZ2VuXG5cbmxldCB3aXRoX29wZW4gb3BlbmZ1biBzIGYgPVxuICBsZXQgaWMgPSBvcGVuZnVuIHMgaW5cbiAgRnVuLnByb3RlY3QgfmZpbmFsbHk6KGZ1biAoKSAtPiBTdGRsaWIuY2xvc2VfaW5fbm9lcnIgaWMpXG4gICAgKGZ1biAoKSAtPiBmIGljKVxuXG5sZXQgd2l0aF9vcGVuX2JpbiBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5faW5fYmluIHMgZlxuXG5sZXQgd2l0aF9vcGVuX3RleHQgcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX2luIHMgZlxuXG5sZXQgd2l0aF9vcGVuX2dlbiBmbGFncyBwZXJtIHMgZiA9XG4gIHdpdGhfb3BlbiAoU3RkbGliLm9wZW5faW5fZ2VuIGZsYWdzIHBlcm0pIHMgZlxuXG5sZXQgc2VlayA9IFN0ZGxpYi5MYXJnZUZpbGUuc2Vla19pblxubGV0IHBvcyA9IFN0ZGxpYi5MYXJnZUZpbGUucG9zX2luXG5sZXQgbGVuZ3RoID0gU3RkbGliLkxhcmdlRmlsZS5pbl9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlID0gU3RkbGliLmNsb3NlX2luXG5sZXQgY2xvc2Vfbm9lcnIgPSBTdGRsaWIuY2xvc2VfaW5fbm9lcnJcblxubGV0IGlucHV0X2NoYXIgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfY2hhciBpYyB3aXRoXG4gIHwgYyAtPiBTb21lIGNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXRfYnl0ZSBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9ieXRlIGljIHdpdGhcbiAgfCBuIC0+IFNvbWUgblxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dF9saW5lIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IHMgLT4gU29tZSBzXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0ID0gU3RkbGliLmlucHV0XG5cbmV4dGVybmFsIHVuc2FmZV9pbnB1dF9iaWdhcnJheSA6XG4gIHQgLT4gXyBCaWdhcnJheS5BcnJheTEudCAtPiBpbnQgLT4gaW50IC0+IGludFxuICA9IFwiY2FtbF9tbF9pbnB1dF9iaWdhcnJheVwiXG5cbmxldCBpbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCaWdhcnJheS5BcnJheTEuZGltIGJ1ZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRfYmlnYXJyYXlcIlxuICBlbHNlIHVuc2FmZV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlblxuXG5sZXQgcmVhbGx5X2lucHV0IGljIGJ1ZiBwb3MgbGVuID1cbiAgbWF0Y2ggU3RkbGliLnJlYWxseV9pbnB1dCBpYyBidWYgcG9zIGxlbiB3aXRoXG4gIHwgKCkgLT4gU29tZSAoKVxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCByZWMgdW5zYWZlX3JlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gU29tZSAoKSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSB1bnNhZmVfaW5wdXRfYmlnYXJyYXkgaWMgYnVmIG9mcyBsZW4gaW5cbiAgICBpZiByID0gMFxuICAgIHRoZW4gTm9uZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgKG9mcyArIHIpIChsZW4gLSByKVxuICBlbmRcblxubGV0IHJlYWxseV9pbnB1dF9iaWdhcnJheSBpYyBidWYgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCaWdhcnJheS5BcnJheTEuZGltIGJ1ZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwicmVhbGx5X2lucHV0X2JpZ2FycmF5XCJcbiAgZWxzZSB1bnNhZmVfcmVhbGx5X2lucHV0X2JpZ2FycmF5IGljIGJ1ZiBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIG1hdGNoIFN0ZGxpYi5yZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiB3aXRoXG4gIHwgcyAtPiBTb21lIHNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG4oKiBSZWFkIHVwIHRvIFtsZW5dIGJ5dGVzIGludG8gW2J1Zl0sIHN0YXJ0aW5nIGF0IFtvZnNdLiBSZXR1cm4gdG90YWwgYnl0ZXNcbiAgIHJlYWQuICopXG5sZXQgcmVhZF91cHRvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIG9mcyBsZW4gPVxuICAgIGlmIGxlbiA9IDAgdGhlbiBvZnNcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IFN0ZGxpYi5pbnB1dCBpYyBidWYgb2ZzIGxlbiBpblxuICAgICAgaWYgciA9IDAgdGhlblxuICAgICAgICBvZnNcbiAgICAgIGVsc2VcbiAgICAgICAgbG9vcCAob2ZzICsgcikgKGxlbiAtIHIpXG4gICAgZW5kXG4gIGluXG4gIGxvb3Agb2ZzIGxlbiAtIG9mc1xuXG4oKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIHJldHVybiBhIGJ1ZmZlciB3aXRoID49IChvZnMgKyBuKSBieXRlcyBvZiBzdG9yYWdlLFxuICAgYW5kIHN1Y2ggdGhhdCBpdCBjb2luY2lkZXMgd2l0aCBbYnVmXSBhdCBpbmRpY2VzIDwgW29mc10uXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZXF1YWwgdG8gW2J1Zl0gaXRzZWxmIGlmIGl0IGFscmVhZHkgaGFzIHN1ZmZpY2llbnRcbiAgIGZyZWUgc3BhY2UuXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgKmZld2VyKiB0aGFuIFtvZnMgKyBuXSBieXRlcyBvZiBzdG9yYWdlIGlmIHRoaXNcbiAgIG51bWJlciBpcyA+IFtTeXMubWF4X3N0cmluZ19sZW5ndGhdLiBIb3dldmVyIHRoZSByZXR1cm5lZCBidWZmZXIgd2lsbFxuICAgKmFsd2F5cyogaGF2ZSA+IFtvZnNdIGJ5dGVzIG9mIHN0b3JhZ2UuIEluIHRoZSBsaW1pdGluZyBjYXNlIHdoZW4gW29mcyA9IGxlblxuICAgPSBTeXMubWF4X3N0cmluZ19sZW5ndGhdIChzbyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXNpemUgdGhlIGJ1ZmZlciBhdFxuICAgYWxsKSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcblxubGV0IGVuc3VyZSBidWYgb2ZzIG4gPVxuICBsZXQgbGVuID0gQnl0ZXMubGVuZ3RoIGJ1ZiBpblxuICBpZiBsZW4gPj0gb2ZzICsgbiB0aGVuIGJ1ZlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG5ld19sZW4gPSByZWYgbGVuIGluXG4gICAgd2hpbGUgIW5ld19sZW4gPCBvZnMgKyBuIGRvXG4gICAgICBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiArIDFcbiAgICBkb25lO1xuICAgIGxldCBuZXdfbGVuID0gIW5ld19sZW4gaW5cbiAgICBsZXQgbmV3X2xlbiA9XG4gICAgICBpZiBuZXdfbGVuIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIG5ld19sZW5cbiAgICAgIGVsc2UgaWYgb2ZzIDwgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgICBlbHNlXG4gICAgICAgIGZhaWx3aXRoIFwiSW5fY2hhbm5lbC5pbnB1dF9hbGw6IGNoYW5uZWwgY29udGVudCBcXFxuICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoXCJcbiAgICBpblxuICAgIGxldCBuZXdfYnVmID0gQnl0ZXMuY3JlYXRlIG5ld19sZW4gaW5cbiAgICBCeXRlcy5ibGl0IGJ1ZiAwIG5ld19idWYgMCBvZnM7XG4gICAgbmV3X2J1ZlxuICBlbmRcblxubGV0IGlucHV0X2FsbCBpYyA9XG4gIGxldCBjaHVua19zaXplID0gNjU1MzYgaW4gKCogSU9fQlVGRkVSX1NJWkUgKilcbiAgbGV0IGluaXRpYWxfc2l6ZSA9XG4gICAgdHJ5XG4gICAgICBTdGRsaWIuaW5fY2hhbm5lbF9sZW5ndGggaWMgLSBTdGRsaWIucG9zX2luIGljXG4gICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgLTFcbiAgaW5cbiAgbGV0IGluaXRpYWxfc2l6ZSA9IGlmIGluaXRpYWxfc2l6ZSA8IDAgdGhlbiBjaHVua19zaXplIGVsc2UgaW5pdGlhbF9zaXplIGluXG4gIGxldCBpbml0aWFsX3NpemUgPVxuICAgIGlmIGluaXRpYWxfc2l6ZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgaW5pdGlhbF9zaXplXG4gICAgZWxzZVxuICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gIGluXG4gIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgaW5pdGlhbF9zaXplIGluXG4gIGxldCBucmVhZCA9IHJlYWRfdXB0byBpYyBidWYgMCBpbml0aWFsX3NpemUgaW5cbiAgaWYgbnJlYWQgPCBpbml0aWFsX3NpemUgdGhlbiAoKiBFT0YgcmVhY2hlZCwgYnVmZmVyIHBhcnRpYWxseSBmaWxsZWQgKilcbiAgICBCeXRlcy5zdWJfc3RyaW5nIGJ1ZiAwIG5yZWFkXG4gIGVsc2UgYmVnaW4gKCogbnJlYWQgPSBpbml0aWFsX3NpemUsIG1heWJlIEVPRiByZWFjaGVkICopXG4gICAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICAgIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+XG4gICAgICAgICgqIEVPRiByZWFjaGVkLCBidWZmZXIgaXMgY29tcGxldGVseSBmaWxsZWQgKilcbiAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgICB8IGMgLT5cbiAgICAgICAgKCogRU9GIG5vdCByZWFjaGVkICopXG4gICAgICAgIGxldCByZWMgbG9vcCBidWYgb2ZzID1cbiAgICAgICAgICBsZXQgYnVmID0gZW5zdXJlIGJ1ZiBvZnMgY2h1bmtfc2l6ZSBpblxuICAgICAgICAgIGxldCByZW0gPSBCeXRlcy5sZW5ndGggYnVmIC0gb2ZzIGluXG4gICAgICAgICAgKCogW3JlbV0gY2FuIGJlIDwgW2NodW5rX3NpemVdIGlmIGJ1ZmZlciBzaXplIGNsb3NlIHRvXG4gICAgICAgICAgICAgW1N5cy5tYXhfc3RyaW5nX2xlbmd0aF0gKilcbiAgICAgICAgICBsZXQgciA9IHJlYWRfdXB0byBpYyBidWYgb2ZzIHJlbSBpblxuICAgICAgICAgIGlmIHIgPCByZW0gdGhlbiAoKiBFT0YgcmVhY2hlZCAqKVxuICAgICAgICAgICAgQnl0ZXMuc3ViX3N0cmluZyBidWYgMCAob2ZzICsgcilcbiAgICAgICAgICBlbHNlICgqIHIgPSByZW0gKilcbiAgICAgICAgICAgIGxvb3AgYnVmIChvZnMgKyByZW0pXG4gICAgICAgIGluXG4gICAgICAgIGxldCBidWYgPSBlbnN1cmUgYnVmIG5yZWFkIChjaHVua19zaXplICsgMSkgaW5cbiAgICAgICAgQnl0ZXMuc2V0IGJ1ZiBucmVhZCBjO1xuICAgICAgICBsb29wIGJ1ZiAobnJlYWQgKyAxKVxuICBlbmRcblxubGV0IFtAdGFpbF9tb2RfY29uc10gcmVjIGlucHV0X2xpbmVzIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IGxpbmUgLT4gbGluZSA6OiBpbnB1dF9saW5lcyBpY1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBbXVxuXG5sZXQgcmVjIGZvbGRfbGluZXMgZiBhY2N1IGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IGxpbmUgLT4gZm9sZF9saW5lcyBmIChmIGFjY3UgbGluZSkgaWNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gYWNjdVxuXG5sZXQgc2V0X2JpbmFyeV9tb2RlID0gU3RkbGliLnNldF9iaW5hcnlfbW9kZV9pblxuXG5leHRlcm5hbCBpc19iaW5hcnlfbW9kZSA6IGluX2NoYW5uZWwgLT4gYm9vbCA9IFwiY2FtbF9tbF9pc19iaW5hcnlfbW9kZVwiXG5cbmV4dGVybmFsIGlzYXR0eSA6IHQgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNhdHR5XCJcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9iYV9kaW1fMSIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX21sX2lucHV0X2JpZ2FycmF5IiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9CeXRlcyIsIlN0ZGxpYl9TeXMiLCJTdGRsaWJfRnVuIiwic3RkaW4iLCJvcGVuX2JpbiIsIm9wZW5fdGV4dCIsIm9wZW5fZ2VuIiwid2l0aF9vcGVuIiwib3BlbmZ1biIsInMiLCJpYyIsInBhcmFtIiwid2l0aF9vcGVuX2JpbiIsIndpdGhfb3Blbl90ZXh0Iiwid2l0aF9vcGVuX2dlbiIsImZsYWdzIiwicGVybSIsInNlZWsiLCJwb3MiLCJsZW5ndGgiLCJjbG9zZSIsImNsb3NlX25vZXJyIiwiaW5wdXRfY2hhciIsImMiLCJleG4iLCJpbnB1dF9ieXRlIiwibiIsImlucHV0X2xpbmUiLCJpbnB1dCIsImlucHV0X2JpZ2FycmF5IiwiYnVmIiwib2ZzIiwibGVuIiwicmVhbGx5X2lucHV0IiwicmVhbGx5X2lucHV0X2JpZ2FycmF5IiwiciIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJyZWFkX3VwdG8iLCJlbnN1cmUiLCJuZXdfbGVuIiwibmV3X2J1ZiIsImlucHV0X2FsbCIsImluaXRpYWxfc2l6ZSIsImNodW5rX3NpemUiLCJucmVhZCIsInJlbSIsImlucHV0X2xpbmVzIiwibGluZSIsImJsb2NrIiwiZHN0Iiwib2Zmc2V0IiwiZm9sZF9saW5lcyIsImFjY3UiLCJzZXRfYmluYXJ5X21vZGUiLCJTdGRsaWJfSW5fY2hhbm5lbCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLG9CQUFBO0FB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QUEsUUFBQXdCLFFDb01ZLGtCQUFBQyxNQUFRLE9BQUFDLFNBQUE7QUFBQTtBQUFBLEtBRGxCLFFBQUFILFNBQU07QUFBQSxXQUFBdkI7QUFBQUEsVUFBQUEsUURuTVI7QUFBQTtBQUFBLE1DcU02QjtBQUFBLE1BREs7QUFBQTtBQUFBLFNBQUF5QixRQUF0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FDbUI7QUFBQSxZQUFBRSxXQUFBekQsR0FBQTBELFFBQUExQztBQUFBQSxRQUFBMEMsT0FHN0I7QUFBQTtBQUFBLGFBQUFMLE9BQU07QUFBQSxXQUFBdkI7QUFBQUEsVUFBQUEsTUR4TVI7QUFBQSw2QkMwTTZCO0FBQUEsTUQxTTdCO0FBQUE7QUFBQSxTQUFBNEIsU0N5TXlCO0FBQUEsS0FBYTtBQUFBO0FBQUEsR0FDTDtBQUFBO0FBQUEsSUFBQUMsa0JEMU1qQztBQUFBLElBQUFDO0FBQUFBLE1BQUEiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMjc5MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9kaWdlc3QubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFV0aWxpdHkgZnVuY3Rpb25zICopXG5cbmxldCBoZXhfb2Zfc3RyaW5nIGQgPVxuICBsZXQgY2hhcl9oZXggbiA9XG4gICAgQ2hhci5jaHIgKGlmIG4gPCAxMCB0aGVuIENoYXIuY29kZSAnMCcgKyBuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIENoYXIuY29kZSAnYScgKyBuIC0gMTApIGluXG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIGQgaW5cbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAobGVuICogMikgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICBsZXQgeCA9IENoYXIuY29kZSBkLltpXSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIpIChjaGFyX2hleCAoeCBsc3IgNCkpO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIrMSkgKGNoYXJfaGV4ICh4IGxhbmQgMHgwZikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc3VsdFxuXG5sZXQgc3RyaW5nX29mX2hleCBzID1cbiAgbGV0IGRpZ2l0IGMgPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJzAnLi4nOScgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJzAnXG4gICAgfCAnQScuLidGJyAtPiBDaGFyLmNvZGUgYyAtIENoYXIuY29kZSAnQScgKyAxMFxuICAgIHwgJ2EnLi4nZicgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJ2EnICsgMTBcbiAgICB8IF8gLT4gaW52YWxpZF9hcmcgXCJEaWdlc3Qub2ZfaGV4XCIgaW5cbiAgbGV0IGJ5dGUgaSA9IGRpZ2l0IHMuW2ldIGxzbCA0ICsgZGlnaXQgcy5baSsxXSBpblxuICBTdHJpbmcuaW5pdCAoU3RyaW5nLmxlbmd0aCBzIC8gMikgKGZ1biBpIC0+IENoYXIuY2hyIChieXRlICgyICogaSkpKVxuXG4oKiBHZW5lcmljIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgdCA9IHN0cmluZ1xuICB2YWwgaGFzaF9sZW5ndGggOiBpbnRcbiAgdmFsIGNvbXBhcmUgOiB0IC0+IHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sXG4gIHZhbCBzdHJpbmcgOiBzdHJpbmcgLT4gdFxuICB2YWwgYnl0ZXMgOiBieXRlcyAtPiB0XG4gIHZhbCBzdWJzdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0XG4gIHZhbCBzdWJieXRlcyA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdFxuICB2YWwgY2hhbm5lbCA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHRcbiAgdmFsIGZpbGUgOiBzdHJpbmcgLT4gdFxuICB2YWwgb3V0cHV0IDogb3V0X2NoYW5uZWwgLT4gdCAtPiB1bml0XG4gIHZhbCBpbnB1dCA6IGluX2NoYW5uZWwgLT4gdFxuICB2YWwgdG9faGV4IDogdCAtPiBzdHJpbmdcbiAgdmFsIG9mX2hleCA6IHN0cmluZyAtPiB0XG5lbmRcblxuKCogQkxBS0UyIGhhc2hpbmcsIHBhcmFtZXRlcml6ZWQgYnkgaGFzaCBzaXplICopXG5cbm1vZHVsZSBCTEFLRTIgKFg6IHNpZyB2YWwgaGFzaF9sZW5ndGggOiBpbnQgZW5kKSA6IFMgPSBzdHJ1Y3RcblxuICB0eXBlIHQgPSBzdHJpbmdcblxuICBsZXQgaGFzaF9sZW5ndGggPVxuICAgIGlmIFguaGFzaF9sZW5ndGggPCAxIHx8IFguaGFzaF9sZW5ndGggPiA2NFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3QuQkxBS0UyOiB3cm9uZyBoYXNoIHNpemVcIjtcbiAgICBYLmhhc2hfbGVuZ3RoXG5cbiAgbGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxuICBsZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuICB0eXBlIHN0YXRlXG5cbiAgZXh0ZXJuYWwgY3JlYXRlX2dlbjogaW50IC0+IHN0cmluZyAtPiBzdGF0ZSA9IFwiY2FtbF9ibGFrZTJfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgdXBkYXRlOiBzdGF0ZSAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2JsYWtlMl91cGRhdGVcIlxuICBleHRlcm5hbCBmaW5hbDogc3RhdGUgLT4gaW50IC0+IHQgPSBcImNhbWxfYmxha2UyX2ZpbmFsXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3N0cmluZzogaW50IC0+IHN0cmluZyAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0XG4gICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGFrZTJfc3RyaW5nXCJcblxuICBsZXQgY3JlYXRlICgpID0gY3JlYXRlX2dlbiBoYXNoX2xlbmd0aCBcIlwiXG5cbiAgbGV0IHN0cmluZyBzdHIgPVxuICAgIHVuc2FmZV9zdHJpbmcgaGFzaF9sZW5ndGggXCJcIiBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbiAgbGV0IGJ5dGVzIGIgPVxuICAgIHN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKVxuXG4gIGxldCBzdWJzdHJpbmcgc3RyIG9mcyBsZW4gPVxuICAgIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBTdHJpbmcubGVuZ3RoIHN0ciAtIGxlblxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3Quc3Vic3RyaW5nXCI7XG4gICAgdW5zYWZlX3N0cmluZyBoYXNoX2xlbmd0aCBcIlwiIHN0ciBvZnMgbGVuXG5cbiAgbGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9XG4gICAgc3Vic3RyaW5nIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGIpIG9mcyBsZW5cblxuICBsZXQgY2hhbm5lbCBpYyB0b3JlYWQgPVxuICAgIGxldCBidWZfc2l6ZSA9IDQwOTYgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIGJ1Zl9zaXplIGluXG4gICAgbGV0IGN0eCA9IGNyZWF0ZSAoKSBpblxuICAgIGlmIHRvcmVhZCA8IDAgdGhlbiBiZWdpblxuICAgICAgbGV0IHJlYyBkb19yZWFkICgpID1cbiAgICAgICAgbGV0IG4gPSBJbl9jaGFubmVsLmlucHV0IGljIGJ1ZiAwIGJ1Zl9zaXplIGluXG4gICAgICAgIGlmIG4gPSAwXG4gICAgICAgIHRoZW4gZmluYWwgY3R4IGhhc2hfbGVuZ3RoXG4gICAgICAgIGVsc2UgKHVwZGF0ZSBjdHggKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmKSAwIG47IGRvX3JlYWQgKCkpXG4gICAgICBpbiBkb19yZWFkICgpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgZG9fcmVhZCB0b3JlYWQgPVxuICAgICAgICBpZiB0b3JlYWQgPSAwIHRoZW4gZmluYWwgY3R4IGhhc2hfbGVuZ3RoIGVsc2UgYmVnaW5cbiAgICAgICAgICBsZXQgbiA9IEluX2NoYW5uZWwuaW5wdXQgaWMgYnVmIDAgKEludC5taW4gYnVmX3NpemUgdG9yZWFkKSBpblxuICAgICAgICAgIGlmIG4gPSAwXG4gICAgICAgICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgIHVwZGF0ZSBjdHggKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmKSAwIG47XG4gICAgICAgICAgICBkb19yZWFkICh0b3JlYWQgLSBuKVxuICAgICAgICAgIGVuZFxuICAgICAgICBlbmRcbiAgICAgIGluIGRvX3JlYWQgdG9yZWFkXG4gICAgZW5kXG5cbiAgbGV0IGZpbGUgZmlsZW5hbWUgPVxuICAgIEluX2NoYW5uZWwud2l0aF9vcGVuX2JpbiBmaWxlbmFtZSAoZnVuIGljIC0+IGNoYW5uZWwgaWMgKC0xKSlcblxuICBsZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID0gb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG4gIGxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIGhhc2hfbGVuZ3RoXG5cbiAgbGV0IHRvX2hleCBkID1cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gaGFzaF9sZW5ndGggdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgICBoZXhfb2Zfc3RyaW5nIGRcblxuICBsZXQgb2ZfaGV4IHMgPVxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA8PiBoYXNoX2xlbmd0aCAqIDIgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC5vZl9oZXhcIjtcbiAgICBzdHJpbmdfb2ZfaGV4IHNcblxuZW5kXG5cbm1vZHVsZSBCTEFLRTEyOCA9IEJMQUtFMihzdHJ1Y3QgbGV0IGhhc2hfbGVuZ3RoID0gMTYgZW5kKVxubW9kdWxlIEJMQUtFMjU2ID0gQkxBS0UyKHN0cnVjdCBsZXQgaGFzaF9sZW5ndGggPSAzMiBlbmQpXG5tb2R1bGUgQkxBS0U1MTIgPSBCTEFLRTIoc3RydWN0IGxldCBoYXNoX2xlbmd0aCA9IDY0IGVuZClcblxuKCogTUQ1IGhhc2hpbmcgKilcblxubW9kdWxlIE1ENSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IHN0cmluZ1xuXG4gIGxldCBoYXNoX2xlbmd0aCA9IDE2XG5cbiAgbGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxuICBsZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuICBleHRlcm5hbCB1bnNhZmVfc3RyaW5nOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9zdHJpbmdcIlxuICBleHRlcm5hbCBjaGFubmVsOiBpbl9jaGFubmVsIC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9jaGFuXCJcblxuICBsZXQgc3RyaW5nIHN0ciA9XG4gICAgdW5zYWZlX3N0cmluZyBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbiAgbGV0IGJ5dGVzIGIgPSBzdHJpbmcgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYilcblxuICBsZXQgc3Vic3RyaW5nIHN0ciBvZnMgbGVuID1cbiAgICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gU3RyaW5nLmxlbmd0aCBzdHIgLSBsZW5cbiAgICB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LnN1YnN0cmluZ1wiXG4gICAgZWxzZSB1bnNhZmVfc3RyaW5nIHN0ciBvZnMgbGVuXG5cbiAgbGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9IHN1YnN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKSBvZnMgbGVuXG5cbiAgbGV0IGZpbGUgZmlsZW5hbWUgPVxuICAgIEluX2NoYW5uZWwud2l0aF9vcGVuX2JpbiBmaWxlbmFtZSAoZnVuIGljIC0+IGNoYW5uZWwgaWMgKC0xKSlcblxuICBsZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID0gb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG4gIGxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIDE2XG5cbiAgbGV0IHRvX2hleCBkID1cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gMTYgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgICBoZXhfb2Zfc3RyaW5nIGRcblxuICBsZXQgb2ZfaGV4IHMgPVxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA8PiAzMiB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LmZyb21faGV4XCI7XG4gICAgc3RyaW5nX29mX2hleCBzXG5cbmVuZFxuXG4oKiBEZWZhdWx0IGV4cG9ydGVkIGltcGxlbWVudGF0aW9uIGlzIE1ENSAqKVxuXG5pbmNsdWRlIE1ENVxuXG5sZXQgZnJvbV9oZXggPSBvZl9oZXhcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9ibGFrZTJfZmluYWwiLCJjYW1sX2JsYWtlMl9zdHJpbmciLCJjYW1sX2JsYWtlMl91cGRhdGUiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWQ1X2NoYW4iLCJjYW1sX21kNV9zdHJpbmciLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19nZXQiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9Jbl9jaGFubmVsIiwiU3RkbGliX0J5dGVzIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9TdHJpbmciLCJTdGRsaWJfQ2hhciIsImhleF9vZl9zdHJpbmciLCJkIiwiY2hhcl9oZXgiLCJuIiwibGVuIiwicmVzdWx0IiwiaSIsIngiLCJjc3RfRGlnZXN0X29mX2hleCIsInN0cmluZ19vZl9oZXgiLCJzIiwiZGlnaXQiLCJjIiwiY3N0X0RpZ2VzdF9zdWJzdHJpbmciLCJjc3RfRGlnZXN0X3RvX2hleCIsIkJMQUtFMiIsIlgiLCJoYXNoX2xlbmd0aCIsImNvbXBhcmUiLCJlcXVhbCIsImNzdCIsInN0cmluZyIsInN0ciIsImJ5dGVzIiwiYiIsInN1YnN0cmluZyIsIm9mcyIsInN1YmJ5dGVzIiwiY2hhbm5lbCIsImljIiwidG9yZWFkIiwiYnVmIiwiY3R4IiwiYnVmX3NpemUiLCJmaWxlIiwiZmlsZW5hbWUiLCJvdXRwdXQiLCJjaGFuIiwiZGlnZXN0IiwiaW5wdXQiLCJ0b19oZXgiLCJvZl9oZXgiLCJCTEFLRTEyOCIsIkJMQUtFMjU2IiwiQkxBS0U1MTIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLG9CQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxZQUFBQyxjQUFBQztBQUFBQSxhQUFBQyxTQUFBQztBQUFBQSxTQUFBLElDbUJJO0FBQUEsd0NBQ2dEO0FBQUE7QUFBQTtBQUFBLEtBQUFDLE1BQ2xEO0FBQUEsS0FBQUMsU0FDYTtBQUFBLFNBQ2I7QUFBQTtBQUFBLFNBQUFDLElBQUE7QUFBQTtBQUFBLFVBQUFDLElBQ29CO0FBQUEsTUFDZ0MseUNBQXBCO0FBQUEsTUFDMEIsbURBQXhCO0FBQUEsY0FBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElB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O0FBQUFBLElBRzFDO0FBQUEsS0FBOEI7QUFBQSxJQUM5Qix1QkFBZTtBQUFBO0FBQUEsWUFBQXdDLE9BQUEvQjtBQUFBQSxJQUdmO0FBQUEsS0FBOEI7QUFBQSxJQUM5Qix1QkFBZTtBQUFBO0FBQUEsR0R0TG5CIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjMwMTYsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvYmlnYXJyYXkubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgTWFudWVsIFNlcnJhbm8gZXQgWGF2aWVyIExlcm95LCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAwIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbQmlnYXJyYXldOiBsYXJnZSwgbXVsdGktZGltZW5zaW9uYWwsIG51bWVyaWNhbCBhcnJheXMgKilcblxuKCogVGhlc2UgdHlwZXMgaW4gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGFibGVzIGluXG4gICAuLi90eXBpbmcvdHlwZW9wdC5tbCAqKVxuXG50eXBlIGZsb2F0MTZfZWx0ID0gRmxvYXQxNl9lbHRcbnR5cGUgZmxvYXQzMl9lbHQgPSBGbG9hdDMyX2VsdFxudHlwZSBmbG9hdDY0X2VsdCA9IEZsb2F0NjRfZWx0XG50eXBlIGludDhfc2lnbmVkX2VsdCA9IEludDhfc2lnbmVkX2VsdFxudHlwZSBpbnQ4X3Vuc2lnbmVkX2VsdCA9IEludDhfdW5zaWduZWRfZWx0XG50eXBlIGludDE2X3NpZ25lZF9lbHQgPSBJbnQxNl9zaWduZWRfZWx0XG50eXBlIGludDE2X3Vuc2lnbmVkX2VsdCA9IEludDE2X3Vuc2lnbmVkX2VsdFxudHlwZSBpbnQzMl9lbHQgPSBJbnQzMl9lbHRcbnR5cGUgaW50NjRfZWx0ID0gSW50NjRfZWx0XG50eXBlIGludF9lbHQgPSBJbnRfZWx0XG50eXBlIG5hdGl2ZWludF9lbHQgPSBOYXRpdmVpbnRfZWx0XG50eXBlIGNvbXBsZXgzMl9lbHQgPSBDb21wbGV4MzJfZWx0XG50eXBlIGNvbXBsZXg2NF9lbHQgPSBDb21wbGV4NjRfZWx0XG5cbigqIEtlZXAgdGhlIG9yZGVyIG9mIHRoZXNlIGNvbnN0cnVjdG9ycyBpbiBzeW5jIHdpdGggdGhlIGNhbWxfYmFfa2luZFxuICAgZW51bWVyYXRpb24gaW4gYmlnYXJyYXkuaCAqKVxuXG50eXBlICgnYSwgJ2IpIGtpbmQgPVxuICB8IEZsb2F0MzIgOiAoZmxvYXQsIGZsb2F0MzJfZWx0KSBraW5kXG4gIHwgRmxvYXQ2NCA6IChmbG9hdCwgZmxvYXQ2NF9lbHQpIGtpbmRcbiAgfCBJbnQ4X3NpZ25lZCA6IChpbnQsIGludDhfc2lnbmVkX2VsdCkga2luZFxuICB8IEludDhfdW5zaWduZWQgOiAoaW50LCBpbnQ4X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDE2X3NpZ25lZCA6IChpbnQsIGludDE2X3NpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQxNl91bnNpZ25lZCA6IChpbnQsIGludDE2X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDMyIDogKGludDMyLCBpbnQzMl9lbHQpIGtpbmRcbiAgfCBJbnQ2NCA6IChpbnQ2NCwgaW50NjRfZWx0KSBraW5kXG4gIHwgSW50IDogKGludCwgaW50X2VsdCkga2luZFxuICB8IE5hdGl2ZWludCA6IChuYXRpdmVpbnQsIG5hdGl2ZWludF9lbHQpIGtpbmRcbiAgfCBDb21wbGV4MzIgOiAoQ29tcGxleC50LCBjb21wbGV4MzJfZWx0KSBraW5kXG4gIHwgQ29tcGxleDY0IDogKENvbXBsZXgudCwgY29tcGxleDY0X2VsdCkga2luZFxuICB8IENoYXIgOiAoY2hhciwgaW50OF91bnNpZ25lZF9lbHQpIGtpbmRcbiAgfCBGbG9hdDE2IDogKGZsb2F0LCBmbG9hdDE2X2VsdCkga2luZFxuXG50eXBlIGNfbGF5b3V0ID0gQ19sYXlvdXRfdHlwXG50eXBlIGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRfdHlwICgqKilcblxudHlwZSAnYSBsYXlvdXQgPVxuICAgIENfbGF5b3V0OiBjX2xheW91dCBsYXlvdXRcbiAgfCBGb3J0cmFuX2xheW91dDogZm9ydHJhbl9sYXlvdXQgbGF5b3V0XG5cbmxldCBmbG9hdDE2ID0gRmxvYXQxNlxubGV0IGZsb2F0MzIgPSBGbG9hdDMyXG5sZXQgZmxvYXQ2NCA9IEZsb2F0NjRcbmxldCBpbnQ4X3NpZ25lZCA9IEludDhfc2lnbmVkXG5sZXQgaW50OF91bnNpZ25lZCA9IEludDhfdW5zaWduZWRcbmxldCBpbnQxNl9zaWduZWQgPSBJbnQxNl9zaWduZWRcbmxldCBpbnQxNl91bnNpZ25lZCA9IEludDE2X3Vuc2lnbmVkXG5sZXQgaW50MzIgPSBJbnQzMlxubGV0IGludDY0ID0gSW50NjRcbmxldCBpbnQgPSBJbnRcbmxldCBuYXRpdmVpbnQgPSBOYXRpdmVpbnRcbmxldCBjb21wbGV4MzIgPSBDb21wbGV4MzJcbmxldCBjb21wbGV4NjQgPSBDb21wbGV4NjRcbmxldCBjaGFyID0gQ2hhclxuXG5sZXQga2luZF9zaXplX2luX2J5dGVzIDogdHlwZSBhIGIuIChhLCBiKSBraW5kIC0+IGludCA9IGZ1bmN0aW9uXG4gIHwgRmxvYXQxNiAtPiAyXG4gIHwgRmxvYXQzMiAtPiA0XG4gIHwgRmxvYXQ2NCAtPiA4XG4gIHwgSW50OF9zaWduZWQgLT4gMVxuICB8IEludDhfdW5zaWduZWQgLT4gMVxuICB8IEludDE2X3NpZ25lZCAtPiAyXG4gIHwgSW50MTZfdW5zaWduZWQgLT4gMlxuICB8IEludDMyIC0+IDRcbiAgfCBJbnQ2NCAtPiA4XG4gIHwgSW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgTmF0aXZlaW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgQ29tcGxleDMyIC0+IDhcbiAgfCBDb21wbGV4NjQgLT4gMTZcbiAgfCBDaGFyIC0+IDFcblxuKCogS2VlcCB0aG9zZSBjb25zdGFudHMgaW4gc3luYyB3aXRoIHRoZSBjYW1sX2JhX2xheW91dCBlbnVtZXJhdGlvblxuICAgaW4gYmlnYXJyYXkuaCAqKVxuXG5sZXQgY19sYXlvdXQgPSBDX2xheW91dFxubGV0IGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRcblxubW9kdWxlIEdlbmFycmF5ID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHRcbiAgZXh0ZXJuYWwgY3JlYXRlOiAoJ2EsICdiKSBraW5kIC0+ICdjIGxheW91dCAtPiBpbnQgYXJyYXkgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgPSBcImNhbWxfYmFfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgYXJyYXkgLT4gJ2FcbiAgICAgPSBcImNhbWxfYmFfZ2V0X2dlbmVyaWNcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCBhcnJheSAtPiAnYSAtPiB1bml0XG4gICAgID0gXCJjYW1sX2JhX3NldF9nZW5lcmljXCJcblxuICBsZXQgcmVjIGNsb29wIGFyciBpZHggZiBjb2wgbWF4ID1cbiAgICBpZiBjb2wgPSBBcnJheS5sZW5ndGggaWR4IHRoZW4gc2V0IGFyciBpZHggKGYgaWR4KVxuICAgIGVsc2UgZm9yIGogPSAwIHRvIHByZWQgbWF4Lihjb2wpIGRvXG4gICAgICAgICAgIGlkeC4oY29sKSA8LSBqO1xuICAgICAgICAgICBjbG9vcCBhcnIgaWR4IGYgKHN1Y2MgY29sKSBtYXhcbiAgICAgICAgIGRvbmVcbiAgbGV0IHJlYyBmbG9vcCBhcnIgaWR4IGYgY29sIG1heCA9XG4gICAgaWYgY29sIDwgMCB0aGVuIHNldCBhcnIgaWR4IChmIGlkeClcbiAgICBlbHNlIGZvciBqID0gMSB0byBtYXguKGNvbCkgZG9cbiAgICAgICAgICAgaWR4Lihjb2wpIDwtIGo7XG4gICAgICAgICAgIGZsb29wIGFyciBpZHggZiAocHJlZCBjb2wpIG1heFxuICAgICAgICAgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltcyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbXMgaW5cbiAgICBsZXQgZGxlbiA9IEFycmF5Lmxlbmd0aCBkaW1zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDApIGYgMCBkaW1zOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDEpIGYgKHByZWQgZGxlbikgZGltczsgYXJyXG5cbiAgZXh0ZXJuYWwgbnVtX2RpbXM6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiY2FtbF9iYV9udW1fZGltc1wiXG4gIGV4dGVybmFsIG50aF9kaW06ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfYmFfZGltXCJcbiAgbGV0IGRpbXMgYSA9XG4gICAgbGV0IG4gPSBudW1fZGltcyBhIGluXG4gICAgbGV0IGQgPSBBcnJheS5tYWtlIG4gMCBpblxuICAgIGZvciBpID0gMCB0byBuLTEgZG8gZC4oaSkgPC0gbnRoX2RpbSBhIGkgZG9uZTtcbiAgICBkXG5cbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChBcnJheS5mb2xkX2xlZnQgKCAqICkgMSAoZGltcyBhcnIpKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzbGljZV9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgYXJyYXkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc2xpY2VcIlxuICBleHRlcm5hbCBzbGljZV9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IGFycmF5IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3NsaWNlXCJcbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbmVuZFxuXG5tb2R1bGUgQXJyYXkwID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0ID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3x8XVxuICBsZXQgZ2V0IGFyciA9IEdlbmFycmF5LmdldCBhcnIgW3x8XVxuICBsZXQgc2V0IGFyciA9IEdlbmFycmF5LnNldCBhcnIgW3x8XVxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9IGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpXG5cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcblxuICBsZXQgb2ZfdmFsdWUga2luZCBsYXlvdXQgdiA9XG4gICAgbGV0IGEgPSBjcmVhdGUga2luZCBsYXlvdXQgaW5cbiAgICBzZXQgYSB2O1xuICAgIGFcbiAgbGV0IGluaXQgPSBvZl92YWx1ZVxuZW5kXG5cbm1vZHVsZSBBcnJheTEgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW18XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzFcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlY2FtbF9iYV9zZXRfMVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8xXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMVwiXG4gIGV4dGVybmFsIGRpbTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbSBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsICdjKSB0ID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZSAodHlwZSB0KSAoYSA6IChfLCBfLCB0KSBHZW5hcnJheS50KSBuID1cbiAgICBtYXRjaCBsYXlvdXQgYSB3aXRoXG4gICAgfCBDX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdIDogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XTogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0gZG8gdW5zYWZlX3NldCBhcnIgaSAoZiBpKSBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDEgdG8gZGltIGRvIHVuc2FmZV9zZXQgYXJyIGkgKGYgaSkgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0gZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgKEFycmF5Lmxlbmd0aCBkYXRhKSBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGRhdGEgLSAxIGRvIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIGRhdGEuKGkpIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5tb2R1bGUgQXJyYXkyID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltMTsgZGltMnxdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzJcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWNhbWxfYmFfc2V0XzJcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhXG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzJcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMlwiXG4gIGV4dGVybmFsIGRpbTE6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBkaW0yOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8yXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDpcbiAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZV9sZWZ0IGEgbiA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XVxuICBsZXQgc2xpY2VfcmlnaHQgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltMSBkb1xuICAgICAgZm9yIGogPSAwIHRvIHByZWQgZGltMiBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGYgPVxuICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICBmb3IgaSA9IDEgdG8gZGltMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbTEgZGltMiBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbTEgZGltMiBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gZGltMSAtIDEgZG9cbiAgICAgIGxldCByb3cgPSBkYXRhLihpKSBpblxuICAgICAgaWYgQXJyYXkubGVuZ3RoIHJvdyA8PiBkaW0yIHRoZW5cbiAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTIub2ZfYXJyYXk6IG5vbi1yZWN0YW5ndWxhciBkYXRhXCIpO1xuICAgICAgZm9yIGogPSAwIHRvIGRpbTIgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSByb3cuKGopXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbm1vZHVsZSBBcnJheTMgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbTE7IGRpbTI7IGRpbTN8XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfM1wiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfc2V0XzNcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYVxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8zXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8zXCJcbiAgZXh0ZXJuYWwgZGltMTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGRpbTI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzJcIlxuICBleHRlcm5hbCBkaW0zOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8zXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKSAqIChkaW0zIGFycilcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6XG4gICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlX2xlZnRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG47IG18XVxuICBsZXQgc2xpY2VfcmlnaHRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xuOyBtfF1cbiAgbGV0IHNsaWNlX2xlZnRfMiBhIG4gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF1cbiAgbGV0IHNsaWNlX3JpZ2h0XzIgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0xIGRvXG4gICAgICBmb3IgaiA9IDAgdG8gcHJlZCBkaW0yIGRvXG4gICAgICAgIGZvciBrID0gMCB0byBwcmVkIGRpbTMgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogayAoZiBpIGogaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgZm9yIGsgPSAxIHRvIGRpbTMgZG9cbiAgICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICAgIGZvciBpID0gMSB0byBkaW0xIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIGsgKGYgaSBqIGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGRpbTMgPSBpZiBkaW0yID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBkaW0xIC0gMSBkb1xuICAgICAgbGV0IHJvdyA9IGRhdGEuKGkpIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggcm93IDw+IGRpbTIgdGhlblxuICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICBmb3IgaiA9IDAgdG8gZGltMiAtIDEgZG9cbiAgICAgICAgbGV0IGNvbCA9IHJvdy4oaikgaW5cbiAgICAgICAgaWYgQXJyYXkubGVuZ3RoIGNvbCA8PiBkaW0zIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICAgIGZvciBrID0gMCB0byBkaW0zIC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSAoayArIG9mcykgY29sLihrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MDogKCdhLCAnYiwgJ2MpIEFycmF5MC50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MTogKCdhLCAnYiwgJ2MpIEFycmF5MS50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MjogKCdhLCAnYiwgJ2MpIEFycmF5Mi50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MzogKCdhLCAnYiwgJ2MpIEFycmF5My50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmxldCBhcnJheTBfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAwIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkwX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTFfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAxIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkxX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTJfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAyIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkyX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTNfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAzIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkzX29mX2dlbmFycmF5XCJcblxuZXh0ZXJuYWwgcmVzaGFwZTpcbiAgICgnYSwgJ2IsICdjKSBHZW5hcnJheS50IC0+IGludCBhcnJheSAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcImNhbWxfYmFfcmVzaGFwZVwiXG5sZXQgcmVzaGFwZV8wIGEgPSByZXNoYXBlIGEgW3x8XVxubGV0IHJlc2hhcGVfMSBhIGRpbTEgPSByZXNoYXBlIGEgW3xkaW0xfF1cbmxldCByZXNoYXBlXzIgYSBkaW0xIGRpbTIgPSByZXNoYXBlIGEgW3xkaW0xO2RpbTJ8XVxubGV0IHJlc2hhcGVfMyBhIGRpbTEgZGltMiBkaW0zID0gcmVzaGFwZSBhIFt8ZGltMTtkaW0yO2RpbTN8XVxuXG4oKiBGb3JjZSBjYW1sX2JhX2dldF97MSwyLDMsTn0gdG8gYmUgbGlua2VkIGluLCBzaW5jZSB3ZSBkb24ndCByZWZlclxuICAgdG8gdGhvc2UgcHJpbWl0aXZlcyBkaXJlY3RseSBpbiB0aGlzIGZpbGUgKilcblxubGV0IF8gPVxuICBsZXQgXyA9IEdlbmFycmF5LmdldCBpblxuICBsZXQgXyA9IEFycmF5MS5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTIuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkzLmdldCBpblxuICAoKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMlwiXVxuZXh0ZXJuYWwgZ2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8xXCJcbmV4dGVybmFsIGdldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfMlwiXG5leHRlcm5hbCBnZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzNcIlxuZXh0ZXJuYWwgc2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8xXCJcbmV4dGVybmFsIHNldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfMlwiXG5leHRlcm5hbCBzZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzNcIlxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2JhX2NoYW5nZV9sYXlvdXQiLCJjYW1sX2JhX2NyZWF0ZSIsImNhbWxfYmFfZGltXzEiLCJjYW1sX2JhX2RpbV8yIiwiY2FtbF9iYV9raW5kIiwiY2FtbF9iYV9udW1fZGltcyIsImNhbWxfYmFfcmVzaGFwZSIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2JhX3NldF8yIiwiY2FtbF9iYV9zZXRfMyIsImNhbWxfYmFfc2V0X2dlbmVyaWMiLCJjYW1sX2JhX3NsaWNlIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tdWwiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiY2FtbF9jYWxsMyIsImEyIiwiZHVtbXkiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYiIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9TeXMiLCJraW5kX3NpemVfaW5fYnl0ZXMiLCJwYXJhbSIsImNsb29wIiwiYXJyIiwiaWR4IiwiY29sIiwibWF4IiwiaiIsImZsb29wIiwiaW5pdCIsImtpbmQiLCJsYXlvdXQiLCJkaW1zIiwiZGxlbiIsImEiLCJuIiwiZCIsImkiLCJzaXplX2luX2J5dGVzIiwiY3JlYXRlIiwiZ2V0Iiwic2V0Iiwib2ZfdmFsdWUiLCJ2IiwiZGltIiwic2xpY2UiLCJvZl9hcnJheSIsImRhdGEiLCJiYSIsIm9mcyIsImRpbTEiLCJkaW0yIiwic2xpY2VfbGVmdCIsInNsaWNlX3JpZ2h0Iiwicm93IiwiZGltMyIsInNsaWNlX2xlZnRfMSIsIm0iLCJzbGljZV9yaWdodF8xIiwic2xpY2VfbGVmdF8yIiwic2xpY2VfcmlnaHRfMiIsImsiLCJjc3RfQmlnYXJyYXlfQXJyYXkzX29mX2FycmF5X24iLCJhcnJheTBfb2ZfZ2VuYXJyYXkiLCJhcnJheTFfb2ZfZ2VuYXJyYXkiLCJhcnJheTJfb2ZfZ2VuYXJyYXkiLCJhcnJheTNfb2ZfZ2VuYXJyYXkiLCJyZXNoYXBlXzAiLCJyZXNoYXBlXzEiLCJyZXNoYXBlXzIiLCJyZXNoYXBlXzMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUosR0FBQUMsSUFBQUUsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFBQUE7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Z0IsTUFBQUMsTUFBQUk7QUFBQUEsSUFDbEIsZ0RBQTRCO0FBQUE7QUFBQSxHQVUzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUQ1WkYiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyMzUxNCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRsaWIuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9vY2FtbC9yYW5kb20ubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICopXG4oKiAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDYW1iaXVtLCBDb2xsZWdlIGRlIEZyYW5jZSBhbmQgSW5yaWEgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqKVxuXG5leHRlcm5hbCByYW5kb21fc2VlZDogdW5pdCAtPiBpbnQgYXJyYXkgPSBcImNhbWxfc3lzX3JhbmRvbV9zZWVkXCJcblxubW9kdWxlIFN0YXRlID0gc3RydWN0XG5cbiAgb3BlbiBCaWdhcnJheVxuXG4gIHR5cGUgdCA9IChpbnQ2NCwgaW50NjRfZWx0LCBjX2xheW91dCkgQXJyYXkxLnRcblxuICBleHRlcm5hbCBuZXh0OiB0IC0+IChpbnQ2NFtAdW5ib3hlZF0pXG4gICAgICA9IFwiY2FtbF9seG1fbmV4dFwiIFwiY2FtbF9seG1fbmV4dF91bmJveGVkXCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlICgpIDogdCA9XG4gICAgQXJyYXkxLmNyZWF0ZSBJbnQ2NCBDX2xheW91dCA0XG5cbiAgbGV0IHNldCBzIGkxIGkyIGkzIGk0ID1cbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDAgKEludDY0LmxvZ29yIGkxIDFMKTsgKCogbXVzdCBiZSBvZGQgKilcbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDEgaTI7XG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAyIChpZiBpMyA8PiAwTCB0aGVuIGkzIGVsc2UgMUwpOyAoKiBtdXN0IG5vdCBiZSAwICopXG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAzIChpZiBpNCA8PiAwTCB0aGVuIGk0IGVsc2UgMkwpICgqIG11c3Qgbm90IGJlIDAgKilcblxuICBsZXQgbWsgaTEgaTIgaTMgaTQgPVxuICAgIGxldCBzID0gY3JlYXRlICgpIGluXG4gICAgc2V0IHMgaTEgaTIgaTMgaTQ7IHNcblxuICBsZXQgc2VyaWFsaXphdGlvbl9wcmVmaXggPVxuICAgIFwibHhtMTpcIlxuICAgICgqIFwibHhtXCIgZGVub3RlcyB0aGUgYWxnb3JpdGhtIGN1cnJlbnRseSBpbiB1c2UsIGFuZCAnMScgaXNcbiAgICAgICBhIHZlcnNpb24gbnVtYmVyLiBXZSBzaG91bGQgdXBkYXRlIHRoaXMgcHJlZml4IGlmIHdlIGNoYW5nZVxuICAgICAgIHRoZSBSYW5kb20gYWxnb3JpdGhtIG9yIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCwgc28gdGhhdCB1c2Vyc1xuICAgICAgIGdldCBhIGNsZWFuIGVycm9yIGluc3RlYWQgb2YgYmVsaWV2aW5nIHRoYXQgdGhleSBmYWl0aGZ1bGx5XG4gICAgICAgcmVwcm9kdWNlIHRoZWlyIHByZXZpb3VzIHN0YXRlIGFuZCBpbiBmYWN0IGdldCBhIGRpZmZlcmVudFxuICAgICAgIHN0cmVhbS5cblxuICAgICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBjb25zdHJhaW50IHRvIGtlZXAgdGhlIHNhbWVcbiAgICAgICBcIjxuYW1lPjx2ZXI+OjxkYXRhPlwiIGZvcm1hdCBvciBtZXNzYWdlIHNpemUgaW4gZnV0dXJlIHZlcnNpb25zLFxuICAgICAgIHdlIGNvdWxkIGNoYW5nZSB0aGUgZm9ybWF0IGNvbXBsZXRlbHkgaWYgd2Ugd2FudGVkIGFzIGxvbmdcbiAgICAgICBhcyB0aGVyZSBpcyBubyBjb25mdXNpb24gcG9zc2libGUgd2l0aCB0aGUgcHJldmlvdXMgZm9ybWF0cy4gKilcblxuICBsZXQgc2VyaWFsaXphdGlvbl9wcmVmaXhfbGVuID1cbiAgICBTdHJpbmcubGVuZ3RoIHNlcmlhbGl6YXRpb25fcHJlZml4XG5cbiAgbGV0IHRvX2JpbmFyeV9zdHJpbmcgcyA9XG4gICAgbGV0IHByZWZpeCA9IHNlcmlhbGl6YXRpb25fcHJlZml4IGluXG4gICAgbGV0IHByZWZsZW4gPSBzZXJpYWxpemF0aW9uX3ByZWZpeF9sZW4gaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChwcmVmbGVuICsgNCAqIDgpIGluXG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcHJlZml4IDAgYnVmIDAgcHJlZmxlbjtcbiAgICBmb3IgaSA9IDAgdG8gMyBkb1xuICAgICAgQnl0ZXMuc2V0X2ludDY0X2xlIGJ1ZiAocHJlZmxlbiArIGkgKiA4KSAoQXJyYXkxLmdldCBzIGkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGJ1ZlxuXG4gIGxldCBvZl9iaW5hcnlfc3RyaW5nIGJ1ZiA9XG4gICAgbGV0IHByZWZpeCA9IHNlcmlhbGl6YXRpb25fcHJlZml4IGluXG4gICAgbGV0IHByZWZsZW4gPSBzZXJpYWxpemF0aW9uX3ByZWZpeF9sZW4gaW5cbiAgICBpZiBTdHJpbmcubGVuZ3RoIGJ1ZiA8PiBwcmVmbGVuICsgNCAqIDhcbiAgICAgICB8fCBub3QgKFN0cmluZy5zdGFydHNfd2l0aCB+cHJlZml4IGJ1ZilcbiAgICB0aGVuXG4gICAgICBmYWlsd2l0aFxuICAgICAgICAoXCJSYW5kb20uU3RhdGUub2ZfYmluYXJ5X3N0cmluZzogZXhwZWN0ZWQgYSBmb3JtYXQgXFxcbiAgICAgICAgICBjb21wYXRpYmxlIHdpdGggT0NhbWwgXCIgXiBTeXMub2NhbWxfdmVyc2lvbik7XG4gICAgbGV0IGkxID0gU3RyaW5nLmdldF9pbnQ2NF9sZSBidWYgKHByZWZsZW4gKyAwICogOCkgaW5cbiAgICBsZXQgaTIgPSBTdHJpbmcuZ2V0X2ludDY0X2xlIGJ1ZiAocHJlZmxlbiArIDEgKiA4KSBpblxuICAgIGxldCBpMyA9IFN0cmluZy5nZXRfaW50NjRfbGUgYnVmIChwcmVmbGVuICsgMiAqIDgpIGluXG4gICAgbGV0IGk0ID0gU3RyaW5nLmdldF9pbnQ2NF9sZSBidWYgKHByZWZsZW4gKyAzICogOCkgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuXG4gIGxldCBhc3NpZ24gKGRzdDogdCkgKHNyYzogdCkgPVxuICAgIEFycmF5MS5ibGl0IHNyYyBkc3RcblxuICBsZXQgY29weSBzID1cbiAgICBsZXQgcycgPSBjcmVhdGUoKSBpbiBhc3NpZ24gcycgczsgcydcblxuICAoKiBUaGUgc2VlZCBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEl0IGNhbiBiZSBqdXN0IG9uZSBpbnRlZ2VyLFxuICAgICBidXQgaXQgY2FuIGFsc28gYmUgMTIgb3IgbW9yZSBieXRlcy4gIFRvIGhpZGUgdGhlIGRpZmZlcmVuY2UsXG4gICAgIHdlIHNlcmlhbGl6ZSB0aGUgYXJyYXkgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcywgdGhlbiBoYXNoIHRoZVxuICAgICBzZXF1ZW5jZSB3aXRoIE1ENSAoRGlnZXN0LmJ5dGVzKS4gIE1ENSBnaXZlcyBvbmx5IDEyOCBiaXRzIHdoaWxlXG4gICAgIHdlIG5lZWQgMjU2IGJpdHMsIHNvIHdlIGhhc2ggdHdpY2Ugd2l0aCBkaWZmZXJlbnQgc3VmZml4ZXMuICopXG4gIGxldCByZWluaXQgcyBzZWVkID1cbiAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBzZWVkIGluXG4gICAgbGV0IGIgPSBCeXRlcy5jcmVhdGUgKG4gKiA4ICsgMSkgaW5cbiAgICBmb3IgaSA9IDAgdG8gbi0xIGRvXG4gICAgICBCeXRlcy5zZXRfaW50NjRfbGUgYiAoaSAqIDgpIChJbnQ2NC5vZl9pbnQgc2VlZC4oaSkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMSc7XG4gICAgbGV0IGQxID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMic7XG4gICAgbGV0IGQyID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBzZXQgcyAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMSAwKVxuICAgICAgICAgIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQxIDgpXG4gICAgICAgICAgKFN0cmluZy5nZXRfaW50NjRfbGUgZDIgMClcbiAgICAgICAgICAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMiA4KVxuXG4gIGxldCBtYWtlIHNlZWQgPVxuICAgIGxldCBzID0gY3JlYXRlKCkgaW4gcmVpbml0IHMgc2VlZDsgc1xuXG4gIGxldCBtYWtlX3NlbGZfaW5pdCAoKSA9XG4gICAgbWFrZSAocmFuZG9tX3NlZWQgKCkpXG5cbiAgbGV0IG1pbl9pbnQzMSA9IC0weDQwMDBfMDAwMFxuICAgICAgKCogPSAtMnteMzB9LCB3aGljaCBpcyBbbWluX2ludF0gZm9yIDMxLWJpdCBpbnRlZ2VycyAqKVxuICBsZXQgbWF4X2ludDMxID0gMHgzRkZGX0ZGRkZcbiAgICAgICgqID0gIDJ7XjMwfS0xLCB3aGljaCBpcyBbbWF4X2ludF0gZm9yIDMxLWJpdCBpbnRlZ2VycyAqKVxuICAoKiBhdm9pZCBpbnRlZ2VyIGxpdGVyYWxzIGZvciB0aGVzZSwgMzItYml0IE9DYW1sIHdvdWxkIHJlamVjdCB0aGVtOiAqKVxuICBsZXQgbWluX2ludDMyID0gLSgxIGxzbCAzMSlcbiAgICAgICgqID0gLTB4ODAwMF8wMDAwIG9uIHBsYXRmb3JtcyB3aGVyZSBbU3lzLmludF9zaXplID49IDMyXSAqKVxuICBsZXQgbWF4X2ludDMyID0gKDEgbHNsIDMxKSAtIDFcbiAgICAgICgqID0gIDB4N0ZGRl9GRkZGIG9uIHBsYXRmb3JtcyB3aGVyZSBbU3lzLmludF9zaXplID49IDMyXSAqKVxuXG4gICgqIFJldHVybiAzMCByYW5kb20gYml0cyBhcyBhbiBpbnRlZ2VyIDAgPD0geCA8IDJeMzAgKilcbiAgbGV0IGJpdHMgcyA9XG4gICAgSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWF4X2ludDMxXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtuXSAoZXhjbHVkZWQpLlxuICAgICBbYm91bmRdIG1heSBiZSBhbnkgcG9zaXRpdmUgW2ludF0uICBbbWFza10gbXVzdCBiZSBvZiB0aGUgZm9ybSBbMnteaX0tMV1cbiAgICAgYW5kIGdyZWF0ZXIgb3IgZXF1YWwgdG8gW25dLiAgTGFyZ2VyIHZhbHVlcyBvZiBbbWFza10gbWFrZSB0aGUgZnVuY3Rpb25cbiAgICAgcnVuIGZhc3RlciAoZmV3ZXIgc2FtcGxlcyBhcmUgcmVqZWN0ZWQpLiAgU21hbGxlciB2YWx1ZXMgb2YgW21hc2tdXG4gICAgIGFyZSB1c2FibGUgb24gYSB3aWRlciByYW5nZSBvZiBPQ2FtbCBpbXBsZW1lbnRhdGlvbnMuICAqKVxuICBsZXQgcmVjIGludF9hdXggcyBuIG1hc2sgPVxuICAgICgqIFdlIHN0YXJ0IGJ5IGRyYXdpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciBpbiB0aGUgWyBbMCwgbWFza10gXSByYW5nZSAqKVxuICAgIGxldCByID0gSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWFzayBpblxuICAgIGxldCB2ID0gciBtb2QgbiBpblxuICAgICgqIEZvciB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcmVzdWx0IGJldHdlZW4gMCBpbmNsdWRlZCBhbmQgW25dXG4gICAgICogZXhjbHVkZWQsIHRoZSByYW5kb20gbnVtYmVyIFtyXSBtdXN0IGhhdmUgYmVlbiBkcmF3biB1bmlmb3JtbHkgaW5cbiAgICAgKiBhbiBpbnRlcnZhbCB3aG9zZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiBbbl0uIFRvIGFjaGlldmUgdGhpcyxcbiAgICAgKiB3ZSB1c2UgcmVqZWN0aW9uIHNhbXBsaW5nIG9uIHRoZSBncmVhdGVzdCBpbnRlcnZhbCBbIFswLCBrKm4tMV0gXVxuICAgICAqIHRoYXQgZml0cyBpbiBbIFswLCBtYXNrXSBdLiAgVGhhdCBpcywgd2UgcmVqZWN0IHRoZVxuICAgICAqIHNhbXBsZSBpZiBpdCBmYWxscyBvdXRzaWRlIG9mIHRoaXMgaW50ZXJ2YWwsIGFuZCBkcmF3IGFnYWluLlxuICAgICAqIFRoaXMgaXMgd2hhdCB0aGUgdGVzdCBiZWxvdyBkb2VzLCB3aGlsZSBjYXJlZnVseSBhdm9pZGluZ1xuICAgICAqIG92ZXJmbG93cyBhbmQgc3BhcmluZyBhIGRpdmlzaW9uIFttYXNrIC8gbl0uICopXG4gICAgaWYgciAtIHYgPiBtYXNrIC0gbiArIDEgdGhlbiBpbnRfYXV4IHMgbiBtYXNrIGVsc2UgdlxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuXG4gICAgIFRoZSBib3VuZCBtdXN0IGZpdCBpbiAzMS1iaXQgc2lnbmVkIGludGVnZXJzLlxuICAgICBUaGlzIGZ1bmN0aW9uIHlpZWxkcyB0aGUgc2FtZSBvdXRwdXQgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZWdlciBzaXplLiAqKVxuICBsZXQgaW50IHMgYm91bmQgPVxuICAgIGlmIGJvdW5kID4gbWF4X2ludDMxIHx8IGJvdW5kIDw9IDBcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiUmFuZG9tLmludFwiXG4gICAgZWxzZSBpbnRfYXV4IHMgYm91bmQgbWF4X2ludDMxXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS5cbiAgICAgW2JvdW5kXSBtYXkgYmUgYW55IHBvc2l0aXZlIFtpbnRdLiAqKVxuICBsZXQgZnVsbF9pbnQgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMCB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIlJhbmRvbS5mdWxsX2ludFwiXG4gICAgKCogV2hlbiB0aGUgYm91bmQgZml0cyBpbiAzMS1iaXQgc2lnbmVkIGludGVnZXJzLCB3ZSB1c2UgdGhlIHNhbWUgbWFza1xuICAgICAgIGFzIGluIGZ1bmN0aW9uIFtpbnRdIHNvIGFzIHRvIHlpZWxkIHRoZSBzYW1lIG91dHB1dCBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgc3VwcG9ydGVkIGJ5IE9DYW1sICgzMi1iaXQgT0NhbWwsIDY0LWJpdCBPQ2FtbCwgYW5kIEphdmFTY3JpcHQpLlxuICAgICAgIFdoZW4gdGhlIGJvdW5kIGZpdHMgaW4gMzItYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIFttYXhfaW50MzJdXG4gICAgICAgYXMgdGhlIG1hc2sgc28gYXMgdG8geWllbGQgdGhlIHNhbWUgb3V0cHV0IG9uIGFsbCBwbGF0Zm9ybXMgd2hlcmVcbiAgICAgICBbU3lzLmludF9zaXplID49IDMyXSAoaS5lLiBKYXZhU2NyaXB0IGFuZCA2NC1iaXQgT0NhbWwpLiAqKVxuICAgIGVsc2VcbiAgICAgIGludF9hdXggcyBib3VuZFxuICAgICAgICAoaWYgYm91bmQgPD0gbWF4X2ludDMxIHRoZW4gbWF4X2ludDMxXG4gICAgICAgICBlbHNlIGlmIGJvdW5kIDw9IG1heF9pbnQzMiB0aGVuIG1heF9pbnQzMlxuICAgICAgICAgZWxzZSBtYXhfaW50KVxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgVGhlIFtuYml0c10gcGFyYW1ldGVyIGlzIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHNpZ25lZCBpbnRlZ2Vyc1xuICAgICB3ZSBkcmF3IGZyb20gW3NdLlxuICAgICBXZSBtdXN0IGhhdmUgWy0ye15uYml0cyAtIDF9IDw9IG1pbiA8PSBtYXggPCAye15uYml0cyAtIDF9XS5cbiAgICAgTW9yZW92ZXIsIGZvciB0aGUgaXRlcmF0aW9uIHRvIGNvbnZlcmdlIHF1aWNrbHksIHRoZSBpbnRlcnZhbFxuICAgICBbW21pbiwgbWF4XV0gc2hvdWxkIGhhdmUgd2lkdGggYXQgbGVhc3QgWzJ7Xm5iaXRzIC0gMX1dLlxuICAgICBBcyB0aGUgd2lkdGggYXBwcm9hY2hlcyB0aGlzIGxvd2VyIGxpbWl0LCB0aGUgYXZlcmFnZSBudW1iZXIgb2ZcbiAgICAgZHJhd3MgYXBwcm9hY2hlcyAyLCB3aXRoIGEgcXVpdGUgaGlnaCBzdGFuZGFyZCBkZXZpYXRpb24gKDIgKyBlcHNpbG9uKS4gKilcbiAgbGV0IHJlYyBpbnRfaW5fbGFyZ2VfcmFuZ2UgcyB+bWluIH5tYXggfm5iaXRzID1cbiAgICBsZXQgZHJvcCA9IFN5cy5pbnRfc2l6ZSAtIG5iaXRzIGluXG4gICAgKCogVGhlIGJpdHNoaWZ0cyByZXBsaWNhdGUgdGhlIFtuYml0c10tdGggYml0IChzaWduIGJpdCkgdG8gaGlnaGVyIGJpdHM6ICopXG4gICAgbGV0IHIgPSAoKEludDY0LnRvX2ludCAobmV4dCBzKSkgbHNsIGRyb3ApIGFzciBkcm9wIGluXG4gICAgaWYgciA8IG1pbiB8fCByID4gbWF4IHRoZW4gaW50X2luX2xhcmdlX3JhbmdlIHMgfm1pbiB+bWF4IH5uYml0cyBlbHNlIHJcblxuICAoKiBSZXR1cm4gYW4gaW50ZWdlciBiZXR3ZWVuIFttaW5dIChpbmNsdWRlZCkgYW5kIFttYXhdIChpbmNsdWRlZCkuXG4gICAgIFttYXNrXSBpcyBhcyBkZXNjcmliZWQgZm9yIFtpbnRfYXV4XS5cbiAgICAgW25iaXRzXSBpcyBhcyBkZXNjcmliZWQgZm9yIFtpbnRfaW5fbGFyZ2VfcmFuZ2VdLiAqKVxuICBsZXQgaW50X2luX3JhbmdlX2F1eCBzIH5taW4gfm1heCB+bWFzayB+bmJpdHMgPVxuICAgIGxldCBzcGFuID0gbWF4IC0gbWluICsgMSBpblxuICAgIGlmIHNwYW4gPD0gbWFzayAoKiBbc3Bhbl0gaXMgc21hbGwgZW5vdWdoICopXG4gICAgJiYgc3BhbiA+IDAgICAgICgqIG5vIG92ZXJmbG93IG9jY3VycmVkIHdoZW4gY29tcHV0aW5nIFtzcGFuXSAqKVxuICAgIHRoZW5cbiAgICAgICgqIEp1c3QgZHJhdyBhIG51bWJlciBpbiBbWzAsIHNwYW4pXSBhbmQgc2hpZnQgaXQgYnkgW21pbl0uICopXG4gICAgICBtaW4gKyBpbnRfYXV4IHMgc3BhbiBtYXNrXG4gICAgZWxzZVxuICAgICAgKCogU3BhbiB0b28gbGFyZ2UsIHVzZSB0aGUgYWx0ZXJuYXRpdmUgZHJhd2luZyBtZXRob2QuICopXG4gICAgICBpbnRfaW5fbGFyZ2VfcmFuZ2UgcyB+bWluIH5tYXggfm5iaXRzXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiBbbWluXSAoaW5jbHVkZWQpIGFuZCBbbWF4XSAoaW5jbHVkZWQpLlxuICAgICBXZSBtdXN0IGhhdmUgW21pbiA8PSBtYXhdLiAqKVxuICBsZXQgaW50X2luX3JhbmdlIHMgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXggdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uaW50X2luX3JhbmdlXCI7XG4gICAgKCogV2hlbiBib3RoIGJvdW5kcyBmaXQgaW4gMzEtYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIHBhcmFtZXRlcnNcbiAgICAgICBbbWFza10gYW5kIFtuYml0c10gYXBwcm9wcmlhdGUgZm9yIDMxLWJpdCBpbnRlZ2Vycywgc28gYXMgdG9cbiAgICAgICB5aWVsZCB0aGUgc2FtZSBvdXRwdXQgb24gYWxsIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkgT0NhbWwuXG4gICAgICAgV2hlbiBib3RoIGJvdW5kcyBmaXQgaW4gMzItYml0IHNpZ25lZCBpbnRlZ2Vycywgd2UgdXNlIHBhcmFtZXRlcnNcbiAgICAgICBbbWFza10gYW5kIFtuYml0c10gYXBwcm9wcmlhdGUgZm9yIDMyLWJpdCBpbnRlZ2Vycywgc28gYXMgdG9cbiAgICAgICB5aWVsZCB0aGUgc2FtZSBvdXRwdXQgb24gSmF2YVNjcmlwdCBhbmQgb24gNjQtYml0IE9DYW1sLiAqKVxuICAgIGlmIG1pbiA+PSBtaW5faW50MzEgJiYgbWF4IDw9IG1heF9pbnQzMSB0aGVuXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQzMSB+bmJpdHM6MzFcbiAgICBlbHNlIGlmIG1pbiA+PSBtaW5faW50MzIgJiYgbWF4IDw9IG1heF9pbnQzMiB0aGVuXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQzMiB+bmJpdHM6MzJcbiAgICBlbHNlXG4gICAgICBpbnRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IH5tYXNrOm1heF9pbnQgfm5iaXRzOlN5cy5pbnRfc2l6ZVxuXG4gICgqIFJldHVybiAzMiByYW5kb20gYml0cyBhcyBhbiBbaW50MzJdICopXG4gIGxldCBiaXRzMzIgcyA9XG4gICAgSW50NjQudG9faW50MzIgKG5leHQgcylcblxuICAoKiBSZXR1cm4gYW4gW2ludDMyXSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDMyYXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzMzIgcykgMSBpblxuICAgIGxldCB2ID0gSW50MzIucmVtIHIgbiBpblxuICAgICgqIEV4cGxhbmF0aW9uIG9mIHRoaXMgdGVzdDogc2VlIGNvbW1lbnQgaW4gW2ludF9hdXhdLiAqKVxuICAgIGlmIEludDMyLihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxbClcbiAgICB0aGVuIGludDMyYXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQzMiBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwbFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJcIlxuICAgIGVsc2UgaW50MzJhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBbaW50MzJdIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgV2UgbXVzdCBoYXZlIFttaW4gPD0gbWF4XS4gKilcbiAgbGV0IHJlYyBpbnQzMl9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggPVxuICAgIGxldCByID0gSW50NjQudG9faW50MzIgKG5leHQgcykgaW5cbiAgICBpZiByIDwgbWluIHx8IHIgPiBtYXggdGhlbiBpbnQzMl9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggZWxzZSByXG5cbiAgbGV0IGludDMyX2luX3JhbmdlIHMgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXggdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJfaW5fcmFuZ2VcIlxuICAgIGVsc2VcbiAgICAgIGxldCBzcGFuID0gSW50MzIuc3VjYyAoSW50MzIuc3ViIG1heCBtaW4pIGluXG4gICAgICAoKiBFeHBsYW5hdGlvbiBvZiB0aGlzIHRlc3Q6IHNlZSBjb21tZW50IGluIFtpbnRfaW5fcmFuZ2VfYXV4XS4gKilcbiAgICAgIGlmIHNwYW4gPD0gSW50MzIuemVybyB0aGVuXG4gICAgICAgIGludDMyX2luX3JhbmdlX2F1eCBzIH5taW4gfm1heFxuICAgICAgZWxzZVxuICAgICAgICBJbnQzMi5hZGQgbWluIChpbnQzMmF1eCBzIHNwYW4pXG5cbiAgKCogUmV0dXJuIDY0IHJhbmRvbSBiaXRzIGFzIGFuIFtpbnQ2NF0gKilcbiAgbGV0IGJpdHM2NCBzID1cbiAgICBuZXh0IHNcblxuICAoKiBSZXR1cm4gYW4gW2ludDY0XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDY0YXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzNjQgcykgMSBpblxuICAgIGxldCB2ID0gSW50NjQucmVtIHIgbiBpblxuICAgICgqIEV4cGxhbmF0aW9uIG9mIHRoaXMgdGVzdDogc2VlIGNvbW1lbnQgaW4gW2ludF9hdXhdLiAqKVxuICAgIGlmIEludDY0LihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxTClcbiAgICB0aGVuIGludDY0YXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQ2NCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwTFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50NjRcIlxuICAgIGVsc2UgaW50NjRhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBbaW50NjRdIGJldHdlZW4gW21pbl0gKGluY2x1ZGVkKSBhbmQgW21heF0gKGluY2x1ZGVkKS5cbiAgICAgV2UgbXVzdCBoYXZlIFttaW4gPD0gbWF4XS4gKilcbiAgbGV0IHJlYyBpbnQ2NF9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXggPVxuICAgIGxldCByID0gbmV4dCBzIGluXG4gICAgaWYgciA8IG1pbiB8fCByID4gbWF4IHRoZW4gaW50NjRfaW5fcmFuZ2VfYXV4IHMgfm1pbiB+bWF4IGVsc2UgclxuXG4gIGxldCBpbnQ2NF9pbl9yYW5nZSBzIH5taW4gfm1heCA9XG4gICAgaWYgbWluID4gbWF4IHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiUmFuZG9tLmludDY0X2luX3JhbmdlXCJcbiAgICBlbHNlXG4gICAgICBsZXQgc3BhbiA9IEludDY0LnN1Y2MgKEludDY0LnN1YiBtYXggbWluKSBpblxuICAgICAgKCogRXhwbGFuYXRpb24gb2YgdGhpcyB0ZXN0OiBzZWUgY29tbWVudCBpbiBbaW50X2luX3JhbmdlX2F1eF0uICopXG4gICAgICBpZiBzcGFuIDw9IEludDY0Lnplcm8gdGhlblxuICAgICAgICBpbnQ2NF9pbl9yYW5nZV9hdXggcyB+bWluIH5tYXhcbiAgICAgIGVsc2VcbiAgICAgICAgSW50NjQuYWRkIG1pbiAoaW50NjRhdXggcyBzcGFuKVxuXG4gICgqIFJldHVybiAzMiBvciA2NCByYW5kb20gYml0cyBhcyBhIFtuYXRpdmVpbnRdICopXG4gIGxldCBuYXRpdmViaXRzID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGJpdHMzMiBzKVxuICAgIGVsc2UgZnVuIHMgLT4gSW50NjQudG9fbmF0aXZlaW50IChiaXRzNjQgcylcblxuICAoKiBSZXR1cm4gYSBbbmF0aXZlaW50XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50ID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyBib3VuZCAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGludDMyIHMgKE5hdGl2ZWludC50b19pbnQzMiBib3VuZCkpXG4gICAgZWxzZSBmdW4gcyBib3VuZCAtPiBJbnQ2NC50b19uYXRpdmVpbnQgKGludDY0IHMgKEludDY0Lm9mX25hdGl2ZWludCBib3VuZCkpXG5cbiAgKCogUmV0dXJuIGEgW25hdGl2ZWludF0gYmV0d2VlbiBbbWluXSAoaW5jbHVkZWQpIGFuZCBbbWF4XSAoaW5jbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50X2luX3JhbmdlID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyB+bWluIH5tYXggLT5cbiAgICAgIE5hdGl2ZWludC5vZl9pbnQzMiAoaW50MzJfaW5fcmFuZ2Ugc1xuICAgICAgICB+bWluOihOYXRpdmVpbnQudG9faW50MzIgbWluKSB+bWF4OihOYXRpdmVpbnQudG9faW50MzIgbWF4KSlcbiAgICBlbHNlIGZ1biBzIH5taW4gfm1heCAtPlxuICAgICAgSW50NjQudG9fbmF0aXZlaW50IChpbnQ2NF9pbl9yYW5nZSBzXG4gICAgICAgIH5taW46KEludDY0Lm9mX25hdGl2ZWludCBtaW4pIH5tYXg6KEludDY0Lm9mX25hdGl2ZWludCBtYXgpKVxuXG4gICgqIFJldHVybiBhIGZsb2F0IDAgPCB4IDwgMSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlXG4gICAgIG11bHRpcGxlcyBvZiAyXi01MyAqKVxuICBsZXQgcmVjIHJhd2Zsb2F0IHMgPVxuICAgIGxldCBiID0gbmV4dCBzIGluXG4gICAgbGV0IG4gPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIGIgMTEgaW5cbiAgICBpZiBuIDw+IDBMIHRoZW4gSW50NjQudG9fZmxvYXQgbiAqLiAweDEucC01MyBlbHNlIHJhd2Zsb2F0IHNcblxuICAoKiBSZXR1cm4gYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIFtib3VuZF0gKilcbiAgbGV0IGZsb2F0IHMgYm91bmQgPSByYXdmbG9hdCBzICouIGJvdW5kXG5cbiAgKCogUmV0dXJuIGEgcmFuZG9tIEJvb2xlYW4gKilcbiAgbGV0IGJvb2wgcyA9IG5leHQgcyA8IDBMXG5cbiAgKCogU3BsaXQgYSBuZXcgUFJORyBvZmYgdGhlIGdpdmVuIFBSTkcgKilcbiAgbGV0IHNwbGl0IHMgPVxuICAgIGxldCBpMSA9IGJpdHM2NCBzIGluIGxldCBpMiA9IGJpdHM2NCBzIGluXG4gICAgbGV0IGkzID0gYml0czY0IHMgaW4gbGV0IGk0ID0gYml0czY0IHMgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuZW5kXG5cbmxldCBta19kZWZhdWx0ICgpID1cbiAgKCogVGhpcyBpcyB0aGUgc3RhdGUgb2J0YWluZWQgd2l0aCBbU3RhdGUubWFrZSBbfCAzMTQxNTkyNjUgfF1dLiAqKVxuICBTdGF0ZS5tayAoLTYxOTY4NzQyODk1Njc3MDUwOTdMKVxuICAgICAgICAgICA1ODY1NzMyNDk4MzM3MTMxODlMXG4gICAgICAgICAgICgtODU5MTI2ODgwMzg2NTA0MzQwN0wpXG4gICAgICAgICAgIDYzODg2MTM1OTU4NDk3NzIwNDRMXG5cbmxldCByYW5kb21fa2V5ID1cbiAgRG9tYWluLkRMUy5uZXdfa2V5IH5zcGxpdF9mcm9tX3BhcmVudDpTdGF0ZS5zcGxpdCBta19kZWZhdWx0XG5cbmxldCBiaXRzICgpID0gU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBpbnQgYm91bmQgPSBTdGF0ZS5pbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgZnVsbF9pbnQgYm91bmQgPSBTdGF0ZS5mdWxsX2ludCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnRfaW5fcmFuZ2Ugfm1pbiB+bWF4ID1cbiAgU3RhdGUuaW50X2luX3JhbmdlIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSB+bWluIH5tYXhcbmxldCBpbnQzMiBib3VuZCA9IFN0YXRlLmludDMyIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGludDMyX2luX3JhbmdlIH5taW4gfm1heCA9XG4gIFN0YXRlLmludDMyX2luX3JhbmdlIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSB+bWluIH5tYXhcbmxldCBuYXRpdmVpbnQgYm91bmQgPSBTdGF0ZS5uYXRpdmVpbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgbmF0aXZlaW50X2luX3JhbmdlIH5taW4gfm1heCA9XG4gIFN0YXRlLm5hdGl2ZWludF9pbl9yYW5nZSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgfm1pbiB+bWF4XG5sZXQgaW50NjQgYm91bmQgPSBTdGF0ZS5pbnQ2NCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnQ2NF9pbl9yYW5nZSB+bWluIH5tYXggPVxuICBTdGF0ZS5pbnQ2NF9pbl9yYW5nZSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgfm1pbiB+bWF4XG5sZXQgZmxvYXQgc2NhbGUgPSBTdGF0ZS5mbG9hdCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgc2NhbGVcbmxldCBib29sICgpID0gU3RhdGUuYm9vbCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBiaXRzMzIgKCkgPSBTdGF0ZS5iaXRzMzIgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgYml0czY0ICgpID0gU3RhdGUuYml0czY0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IG5hdGl2ZWJpdHMgKCkgPSBTdGF0ZS5uYXRpdmViaXRzIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG5sZXQgZnVsbF9pbml0IHNlZWQgPSBTdGF0ZS5yZWluaXQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIHNlZWRcbmxldCBpbml0IHNlZWQgPSBmdWxsX2luaXQgW3wgc2VlZCB8XVxubGV0IHNlbGZfaW5pdCAoKSA9IGZ1bGxfaW5pdCAocmFuZG9tX3NlZWQoKSlcblxuKCogU3BsaXR0aW5nICopXG5cbmxldCBzcGxpdCAoKSA9IFN0YXRlLnNwbGl0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG4oKiBNYW5pcHVsYXRpbmcgdGhlIGN1cnJlbnQgc3RhdGUuICopXG5cbmxldCBnZXRfc3RhdGUgKCkgPSBTdGF0ZS5jb3B5IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IHNldF9zdGF0ZSBzID0gU3RhdGUuYXNzaWduIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBzXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfYmFfYmxpdCIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2J5dGVzX3NldCIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9ncmVhdGVydGhhbiIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X29mX2ludDMyIiwiY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lIiwiY2FtbF9pbnQ2NF9zdWIiLCJjYW1sX2ludDY0X3RvX2ludDMyIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9seG1fbmV4dCIsImNhbWxfbW9kIiwiY2FtbF9ub3RlcXVhbCIsImNhbWxfc3lzX3JhbmRvbV9zZWVkIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImNhbWxfY2FsbDIiLCJhMSIsImNhbWxfY2FsbDMiLCJhMiIsImdsb2JhbF9kYXRhIiwiU3RkbGliX0RvbWFpbiIsIlN0ZGxpYl9TeXMiLCJTdGRsaWJfSW50MzIiLCJTdGRsaWJfSW50NjQiLCJTdGRsaWIiLCJTdGRsaWJfQnl0ZXMiLCJTdGRsaWJfRGlnZXN0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9CaWdhcnJheSIsIlN0ZGxpYl9OYXRpdmVpbnQiLCJjcmVhdGUiLCJwYXJhbSIsInNldCIsInMiLCJpMSIsImkyIiwiaTMiLCJpNCIsIm1rIiwic2VyaWFsaXphdGlvbl9wcmVmaXgiLCJ0b19iaW5hcnlfc3RyaW5nIiwiYnVmIiwiaSIsIm9mX2JpbmFyeV9zdHJpbmciLCJjb3B5Iiwic3JjIiwiZHN0IiwicmVpbml0Iiwic2VlZCIsIm4iLCJiIiwiZDEiLCJkMiIsIm1ha2UiLCJtYWtlX3NlbGZfaW5pdCIsImJpdHMiLCJpbnRfYXV4IiwibWFzayIsInIiLCJ2IiwibWF4X2ludDMxIiwiaW50IiwiYm91bmQiLCJtYXhfaW50MzIiLCJmdWxsX2ludCIsImludF9pbl9yYW5nZV9hdXgiLCJtaW4iLCJtYXgiLCJuYml0cyIsInNwYW4iLCJkcm9wIiwiaW50X2luX3JhbmdlIiwiYml0czMyIiwiaW50MzJhdXgiLCJpbnQzMiIsImludDMyX2luX3JhbmdlIiwiaW50NjRhdXgiLCJpbnQ2NCIsImludDY0X2luX3JhbmdlIiwibmF0aXZlYml0cyIsIm5hdGl2ZWludCIsIm5hdGl2ZWludF9pbl9yYW5nZSIsImZsb2F0IiwiYm9vbCIsInNwbGl0IiwibWtfZGVmYXVsdCIsInJhbmRvbV9rZXkiLCJzY2FsZSIsImJpdHM2NCIsImZ1bGxfaW5pdCIsImluaXQiLCJzZWxmX2luaXQiLCJnZXRfc3RhdGUiLCJzZXRfc3RhdGUiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw2QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUNBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsdUJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsbUJBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsT0FBQUMsT0M4Qkksa0RB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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRURwVjlEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MjM5MDgsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvcm9vdC8ub3BhbS81LjIuMC9saWIvb2NhbWwvaGFzaHRibC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSGFzaCB0YWJsZXMgKilcblxuKCogV2UgZG8gZHluYW1pYyBoYXNoaW5nLCBhbmQgcmVzaXplIHRoZSB0YWJsZSBhbmQgcmVoYXNoIHRoZSBlbGVtZW50c1xuICAgd2hlbiB0aGUgbG9hZCBmYWN0b3IgYmVjb21lcyB0b28gaGlnaC4gKilcblxudHlwZSAoJ2EsICdiKSB0ID1cbiAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgIG11dGFibGUgZGF0YTogKCdhLCAnYikgYnVja2V0bGlzdCBhcnJheTsgICgqIHRoZSBidWNrZXRzICopXG4gICAgc2VlZDogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICgqIGZvciByYW5kb21pemF0aW9uICopXG4gICAgbXV0YWJsZSBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgKCogaW5pdGlhbCBhcnJheSBzaXplICopXG4gIH1cblxuYW5kICgnYSwgJ2IpIGJ1Y2tldGxpc3QgPVxuICAgIEVtcHR5XG4gIHwgQ29ucyBvZiB7IG11dGFibGUga2V5OiAnYTtcbiAgICAgICAgICAgICAgbXV0YWJsZSBkYXRhOiAnYjtcbiAgICAgICAgICAgICAgbXV0YWJsZSBuZXh0OiAoJ2EsICdiKSBidWNrZXRsaXN0IH1cblxuKCogVGhlIHNpZ24gb2YgaW5pdGlhbF9zaXplIGVuY29kZXMgdGhlIGZhY3QgdGhhdCBhIHRyYXZlcnNhbCBpc1xuICAgb25nb2luZyBvciBub3QuXG5cbiAgIFRoaXMgZGlzYWJsZXMgdGhlIGVmZmljaWVudCBpbiBwbGFjZSBpbXBsZW1lbnRhdGlvbiBvZiByZXNpemluZy5cbiopXG5cbmxldCBvbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gIHx8IGguaW5pdGlhbF9zaXplIDwgMFxuXG5sZXQgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgaC5pbml0aWFsX3NpemUgPC0gLSBoLmluaXRpYWxfc2l6ZVxuXG4oKiBUbyBwaWNrIHJhbmRvbSBzZWVkcyBpZiByZXF1ZXN0ZWQgKilcblxubGV0IHJhbmRvbWl6ZWRfZGVmYXVsdCA9XG4gIGxldCBwYXJhbXMgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiT0NBTUxSVU5QQVJBTVwiIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJDQU1MUlVOUEFSQU1cIiB3aXRoIE5vdF9mb3VuZCAtPiBcIlwiIGluXG4gIFN0cmluZy5jb250YWlucyBwYXJhbXMgJ1InXG5cbmxldCByYW5kb21pemVkID0gQXRvbWljLm1ha2UgcmFuZG9taXplZF9kZWZhdWx0XG5cbmxldCByYW5kb21pemUgKCkgPSBBdG9taWMuc2V0IHJhbmRvbWl6ZWQgdHJ1ZVxubGV0IGlzX3JhbmRvbWl6ZWQgKCkgPSBBdG9taWMuZ2V0IHJhbmRvbWl6ZWRcblxubGV0IHBybmdfa2V5ID0gRG9tYWluLkRMUy5uZXdfa2V5IFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdFxuXG4oKiBGdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGJlZm9yZSB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgbXVzdCBlaXRoZXIgYmVcbiAgIGluZGVwZW5kZW50IG9mIHRoZSBoYXNoIGZ1bmN0aW9uIG9yIHRha2UgaXQgYXMgYSBwYXJhbWV0ZXIgKHNlZSAjMjIwMiBhbmRcbiAgIGNvZGUgYmVsb3cgdGhlIGZ1bmN0b3IgZGVmaW5pdGlvbnMuICopXG5cbigqIENyZWF0aW5nIGEgZnJlc2gsIGVtcHR5IHRhYmxlICopXG5cbmxldCByZWMgcG93ZXJfMl9hYm92ZSB4IG4gPVxuICBpZiB4ID49IG4gdGhlbiB4XG4gIGVsc2UgaWYgeCAqIDIgPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIHhcbiAgZWxzZSBwb3dlcl8yX2Fib3ZlICh4ICogMikgblxuXG5sZXQgY3JlYXRlID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBpbml0aWFsX3NpemUgPVxuICBsZXQgcyA9IHBvd2VyXzJfYWJvdmUgMTYgaW5pdGlhbF9zaXplIGluXG4gIGxldCBzZWVkID1cbiAgICBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcHJuZ19rZXkpIGVsc2UgMFxuICBpblxuICB7IGluaXRpYWxfc2l6ZSA9IHM7IHNpemUgPSAwOyBzZWVkID0gc2VlZDsgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eSB9XG5cbmxldCBjbGVhciBoID1cbiAgaWYgaC5zaXplID4gMCB0aGVuIGJlZ2luXG4gICAgaC5zaXplIDwtIDA7XG4gICAgQXJyYXkuZmlsbCBoLmRhdGEgMCAoQXJyYXkubGVuZ3RoIGguZGF0YSkgRW1wdHlcbiAgZW5kXG5cbmxldCByZXNldCBoID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gICAgfHwgbGVuID0gYWJzIGguaW5pdGlhbF9zaXplIHRoZW5cbiAgICBjbGVhciBoXG4gIGVsc2UgYmVnaW5cbiAgICBoLnNpemUgPC0gMDtcbiAgICBoLmRhdGEgPC0gQXJyYXkubWFrZSAoYWJzIGguaW5pdGlhbF9zaXplKSBFbXB0eVxuICBlbmRcblxubGV0IGNvcHlfYnVja2V0bGlzdCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gRW1wdHlcbiAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICBsZXQgcmVjIGxvb3AgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIHwgQ29ucyBwcmVjIC0+ICBwcmVjLm5leHQgPC0gclxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgbG9vcCByIG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgIGxvb3AgciBuZXh0O1xuICAgICAgclxuXG5sZXQgY29weSBoID0geyBoIHdpdGggZGF0YSA9IEFycmF5Lm1hcCBjb3B5X2J1Y2tldGxpc3QgaC5kYXRhIH1cblxubGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbmxldCBpbnNlcnRfYWxsX2J1Y2tldHMgaW5kZXhmdW4gaW5wbGFjZSBvZGF0YSBuZGF0YSA9XG4gIGxldCBuc2l6ZSA9IEFycmF5Lmxlbmd0aCBuZGF0YSBpblxuICBsZXQgbmRhdGFfdGFpbCA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGFzIGNlbGwgLT5cbiAgICAgICAgbGV0IGNlbGwgPVxuICAgICAgICAgIGlmIGlucGxhY2UgdGhlbiBjZWxsXG4gICAgICAgICAgZWxzZSBDb25zIHtrZXk7IGRhdGE7IG5leHQgPSBFbXB0eX1cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5pZHggPSBpbmRleGZ1biBrZXkgaW5cbiAgICAgICAgYmVnaW4gbWF0Y2ggbmRhdGFfdGFpbC4obmlkeCkgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IG5kYXRhLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gY2VsbDtcbiAgICAgICAgZW5kO1xuICAgICAgICBuZGF0YV90YWlsLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICBpbnNlcnRfYnVja2V0IG5leHRcbiAgaW5cbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBvZGF0YSAtIDEgZG9cbiAgICBpbnNlcnRfYnVja2V0IG9kYXRhLihpKVxuICBkb25lO1xuICBpZiBpbnBsYWNlIHRoZW5cbiAgICBmb3IgaSA9IDAgdG8gbnNpemUgLSAxIGRvXG4gICAgICBtYXRjaCBuZGF0YV90YWlsLihpKSB3aXRoXG4gICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gRW1wdHlcbiAgICBkb25lXG5cbmxldCByZXNpemUgaW5kZXhmdW4gaCA9XG4gIGxldCBvZGF0YSA9IGguZGF0YSBpblxuICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgbGV0IG5zaXplID0gb3NpemUgKiAyIGluXG4gIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiBiZWdpblxuICAgIGxldCBuZGF0YSA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgICBsZXQgaW5wbGFjZSA9IG5vdCAob25nb2luZ190cmF2ZXJzYWwgaCkgaW5cbiAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICAgICgqIHNvIHRoYXQgaW5kZXhmdW4gc2VlcyB0aGUgbmV3IGJ1Y2tldCBjb3VudCAqKVxuICAgIGluc2VydF9hbGxfYnVja2V0cyAoaW5kZXhmdW4gaCkgaW5wbGFjZSBvZGF0YSBuZGF0YVxuICBlbmRcblxubGV0IGl0ZXIgZiBoID1cbiAgbGV0IHJlYyBkb19idWNrZXQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgKClcbiAgICB8IENvbnN7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBmIGtleSBkYXRhOyBkb19idWNrZXQgbmV4dCBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBkb19idWNrZXQgZC4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbmxldCByZWMgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBwcmVjID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBFbXB0eVxuICAgICAgZW5kXG4gIHwgKENvbnMgKHtrZXk7IGRhdGE7IG5leHR9IGFzIGMpKSBhcyBzbG90IC0+XG4gICAgICBiZWdpbiBtYXRjaCBmIGtleSBkYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgcHJlYyBuZXh0XG4gICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBzbG90XG4gICAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIHNsb3RcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgYy5kYXRhIDwtIGRhdGE7XG4gICAgICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBzbG90IG5leHRcbiAgICAgIGVuZFxuXG5sZXQgZmlsdGVyX21hcF9pbnBsYWNlIGYgaCA9XG4gIGxldCBkID0gaC5kYXRhIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIEVtcHR5IGguZGF0YS4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaFxuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxubGV0IGZvbGQgZiBoIGluaXQgPVxuICBsZXQgcmVjIGRvX2J1Y2tldCBiIGFjY3UgPVxuICAgIG1hdGNoIGIgd2l0aFxuICAgICAgRW1wdHkgLT5cbiAgICAgICAgYWNjdVxuICAgIHwgQ29uc3trZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIGRvX2J1Y2tldCBuZXh0IChmIGtleSBkYXRhIGFjY3UpIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgIGxldCBhY2N1ID0gcmVmIGluaXQgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBhY2N1IDo9IGRvX2J1Y2tldCBkLihpKSAhYWNjdVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgICFhY2N1XG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG50eXBlIHN0YXRpc3RpY3MgPSB7XG4gIG51bV9iaW5kaW5nczogaW50O1xuICBudW1fYnVja2V0czogaW50O1xuICBtYXhfYnVja2V0X2xlbmd0aDogaW50O1xuICBidWNrZXRfaGlzdG9ncmFtOiBpbnQgYXJyYXlcbn1cblxubGV0IHJlYyBidWNrZXRfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFjY3VcbiAgfCBDb25ze25leHR9IC0+IGJ1Y2tldF9sZW5ndGggKGFjY3UgKyAxKSBuZXh0XG5cbmxldCBzdGF0cyBoID1cbiAgbGV0IG1ibCA9XG4gICAgQXJyYXkuZm9sZF9sZWZ0IChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aCAwIGIpKSAwIGguZGF0YSBpblxuICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gIEFycmF5Lml0ZXJcbiAgICAoZnVuIGIgLT5cbiAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgIGguZGF0YTtcbiAgeyBudW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgdGJsID1cbiAgKCogY2FwdHVyZSBjdXJyZW50IGFycmF5LCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHRhYmxlIGlzIHJlc2l6ZWQgd2VcbiAgICAga2VlcCBpdGVyYXRpbmcgb24gdGhlIHNhbWUgYXJyYXkgKilcbiAgbGV0IHRibF9kYXRhID0gdGJsLmRhdGEgaW5cbiAgKCogc3RhdGU6IGluZGV4ICogbmV4dCBidWNrZXQgdG8gdHJhdmVyc2UgKilcbiAgbGV0IHJlYyBhdXggaSBidWNrICgpID0gbWF0Y2ggYnVjayB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBpZiBpID0gQXJyYXkubGVuZ3RoIHRibF9kYXRhXG4gICAgICAgIHRoZW4gU2VxLk5pbFxuICAgICAgICBlbHNlIGF1eChpKzEpIHRibF9kYXRhLihpKSAoKVxuICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBTZXEuQ29ucyAoKGtleSwgZGF0YSksIGF1eCBpIG5leHQpXG4gIGluXG4gIGF1eCAwIEVtcHR5XG5cbmxldCB0b19zZXFfa2V5cyBtID0gU2VxLm1hcCBmc3QgKHRvX3NlcSBtKVxuXG5sZXQgdG9fc2VxX3ZhbHVlcyBtID0gU2VxLm1hcCBzbmQgKHRvX3NlcSBtKVxuXG4oKiBGdW5jdG9yaWFsIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBIYXNoZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBoYXNoOiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkSGFzaGVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgc2VlZGVkX2hhc2g6IGludCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhJ2EgdFxuICAgIHZhbCBjcmVhdGU6IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHk6ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBhZGQ6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgcmVtb3ZlOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQ6ICdhIHQgLT4ga2V5IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9hbGw6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICAgIHZhbCBpdGVyOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBsZW5ndGg6ICdhIHQgLT4gaW50XG4gICAgdmFsIHN0YXRzOiAnYSB0IC0+IHN0YXRpc3RpY3NcbiAgICB2YWwgdG9fc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3NlcV9rZXlzIDogXyB0IC0+IGtleSBTZXEudFxuICAgIHZhbCB0b19zZXFfdmFsdWVzIDogJ2EgdCAtPiAnYSBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFNlZWRlZFMgPVxuICBzaWdcbiAgICB0eXBlIGtleVxuICAgIHR5cGUgISdhIHRcbiAgICB2YWwgY3JlYXRlIDogP3JhbmRvbTpib29sIC0+IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICAgIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gICAgdmFsIGl0ZXIgOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZCA6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgc3RhdHM6ICdhIHQgLT4gc3RhdGlzdGljc1xuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIE1ha2VTZWVkZWQoSDogU2VlZGVkSGFzaGVkVHlwZSk6IChTZWVkZWRTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgdHlwZSBrZXkgPSBILnRcbiAgICB0eXBlICdhIGhhc2h0YmwgPSAoa2V5LCAnYSkgdFxuICAgIHR5cGUgJ2EgdCA9ICdhIGhhc2h0YmxcbiAgICBsZXQgY3JlYXRlID0gY3JlYXRlXG4gICAgbGV0IGNsZWFyID0gY2xlYXJcbiAgICBsZXQgcmVzZXQgPSByZXNldFxuICAgIGxldCBjb3B5ID0gY29weVxuXG4gICAgbGV0IGtleV9pbmRleCBoIGtleSA9XG4gICAgICAoSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5KSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcblxuICAgIGxldCBhZGQgaCBrZXkgZGF0YSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgbGV0IGJ1Y2tldCA9IENvbnN7a2V5OyBkYXRhOyBuZXh0PWguZGF0YS4oaSl9IGluXG4gICAgICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuXG4gICAgbGV0IHJlYyByZW1vdmVfYnVja2V0IGggaSBrZXkgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgKClcbiAgICAgIHwgKENvbnMge2tleT1rOyBuZXh0fSkgYXMgYyAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGJlZ2luXG4gICAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICAgIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBuZXh0XG4gICAgICAgICAgZW5kXG4gICAgICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbiAgICBsZXQgcmVtb3ZlIGgga2V5ID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG4gICAgbGV0IHJlYyBmaW5kX3JlYyBrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsgdGhlbiBkYXRhIGVsc2UgZmluZF9yZWMga2V5IG5leHRcblxuICAgIGxldCBmaW5kIGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMSB0aGVuIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMiB0aGVuIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazMgdGhlbiBkMyBlbHNlIGZpbmRfcmVjIGtleSBuZXh0M1xuXG4gICAgbGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgayB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG4gICAgbGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazEgdGhlbiBTb21lIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazIgdGhlbiBTb21lIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGszIHRoZW4gU29tZSBkMyBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dDNcblxuICAgIGxldCBmaW5kX2FsbCBoIGtleSA9XG4gICAgICBsZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgW11cbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YT1kOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGQgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbiAgICBsZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICAgICAgZWxzZSByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBuZXh0XG5cbiAgICBsZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgICAgIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICAgICAgZW5kXG5cbiAgICBsZXQgcmVjIG1lbV9pbl9idWNrZXQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBDb25ze2tleT1rOyBuZXh0fSAtPlxuICAgICAgICAgIEguZXF1YWwgayBrZXkgfHwgbWVtX2luX2J1Y2tldCBrZXkgbmV4dFxuXG4gICAgbGV0IG1lbSBoIGtleSA9XG4gICAgICBtZW1faW5fYnVja2V0IGtleSBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgICBsZXQgaXRlciA9IGl0ZXJcbiAgICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlID0gZmlsdGVyX21hcF9pbnBsYWNlXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCBzdGF0cyA9IHN0YXRzXG4gICAgbGV0IHRvX3NlcSA9IHRvX3NlcVxuICAgIGxldCB0b19zZXFfa2V5cyA9IHRvX3NlcV9rZXlzXG4gICAgbGV0IHRvX3NlcV92YWx1ZXMgPSB0b19zZXFfdmFsdWVzXG4gIGVuZFxuXG5tb2R1bGUgTWFrZShIOiBIYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4oKiBQb2x5bW9ycGhpYyBoYXNoIGZ1bmN0aW9uLWJhc2VkIHRhYmxlcyAqKVxuKCogQ29kZSBpbmNsdWRlZCBiZWxvdyB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgdG8gZ3VhcmQgYWdhaW5zdCBhY2NpZGVudGFsXG4gICB1c2UgLSBzZWUgIzIyMDIgKilcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5sZXQgaGFzaF9wYXJhbSBuMSBuMiB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gbjEgbjIgMCB4XG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxuXG5sZXQga2V5X2luZGV4IGgga2V5ID1cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDRcbiAgdGhlbiAoc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIGguc2VlZCBrZXkpIGxhbmQgKEFycmF5Lmxlbmd0aCBoLmRhdGEgLSAxKVxuICBlbHNlIGludmFsaWRfYXJnIFwiSGFzaHRibDogdW5zdXBwb3J0ZWQgaGFzaCB0YWJsZSBmb3JtYXRcIlxuXG5sZXQgYWRkIGgga2V5IGRhdGEgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICBsZXQgYnVja2V0ID0gQ29uc3trZXk7IGRhdGE7IG5leHQ9aC5kYXRhLihpKX0gaW5cbiAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG5cbmxldCByZWMgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IHByZWMgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICAoKVxuICB8IChDb25zIHtrZXk9azsgbmV4dH0pIGFzIGMgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGJlZ2luXG4gICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIG5leHRcbiAgICAgIGVuZFxuICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbmxldCByZW1vdmUgaCBrZXkgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG5sZXQgcmVjIGZpbmRfcmVjIGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIGRhdGEgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dFxuXG5sZXQgZmluZCBoIGtleSA9XG4gIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrMSA9IDAgdGhlbiBkMSBlbHNlXG4gICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMiA9IDAgdGhlbiBkMiBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgaWYgY29tcGFyZSBrZXkgazMgPSAwIHRoZW4gZDMgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dDNcblxubGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgTm9uZVxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG5sZXQgZmluZF9vcHQgaCBrZXkgPVxuICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICB8IEVtcHR5IC0+IE5vbmVcbiAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsxID0gMCB0aGVuIFNvbWUgZDEgZWxzZVxuICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGsyID0gMCB0aGVuIFNvbWUgZDIgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMyA9IDAgdGhlbiBTb21lIGQzIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0M1xuXG5sZXQgZmluZF9hbGwgaCBrZXkgPVxuICBsZXRbQHRhaWxfbW9kX2NvbnNdIHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIFtdXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGRhdGEgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgZWxzZSBmaW5kX2luX2J1Y2tldCBuZXh0IGluXG4gIGZpbmRfaW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIChzbG90LmtleSA8LSBrZXk7IHNsb3QuZGF0YSA8LSBkYXRhOyBmYWxzZSlcbiAgICAgIGVsc2UgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbmV4dFxuXG5sZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgbGV0IGwgPSBoLmRhdGEuKGkpIGluXG4gIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgIGguZGF0YS4oaSkgPC0gQ29uc3trZXk7IGRhdGE7IG5leHQ9bH07XG4gICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICBlbmRcblxubGV0IHJlYyBtZW1faW5fYnVja2V0IGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29uc3trZXk9azsgbmV4dH0gLT5cbiAgICAgIGNvbXBhcmUgayBrZXkgPSAwIHx8IG1lbV9pbl9idWNrZXQga2V5IG5leHRcblxubGV0IG1lbSBoIGtleSA9XG4gIG1lbV9pbl9idWNrZXQga2V5IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgYWRkX3NlcSB0YmwgaSA9XG4gIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxubGV0IHJlcGxhY2Vfc2VxIHRibCBpID1cbiAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiByZXBsYWNlIHRibCBrIHYpIGlcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgdGJsXG5cbmxldCByZWJ1aWxkID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBoID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IChBcnJheS5sZW5ndGggaC5kYXRhKSBpblxuICBsZXQgc2VlZCA9XG4gICAgaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKERvbWFpbi5ETFMuZ2V0IHBybmdfa2V5KVxuICAgIGVsc2UgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDQgdGhlbiBoLnNlZWRcbiAgICBlbHNlIDAgaW5cbiAgbGV0IGgnID0ge1xuICAgIHNpemUgPSBoLnNpemU7XG4gICAgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eTtcbiAgICBzZWVkID0gc2VlZDtcbiAgICBpbml0aWFsX3NpemUgPSBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNCB0aGVuIGguaW5pdGlhbF9zaXplIGVsc2Ugc1xuICB9IGluXG4gIGluc2VydF9hbGxfYnVja2V0cyAoa2V5X2luZGV4IGgnKSBmYWxzZSBoLmRhdGEgaCcuZGF0YTtcbiAgaCdcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfY29tcGFyZSIsImNhbWxfaGFzaCIsImNhbWxfbWFrZV92ZWN0IiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9zeXNfZ2V0ZW52IiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJjYW1sX2NhbGwzIiwiYTIiLCJnbG9iYWxfZGF0YSIsIlN0ZGxpYl9TeXMiLCJTdGRsaWIiLCJTdGRsaWJfQXRvbWljIiwiU3RkbGliX0RvbWFpbiIsIlN0ZGxpYl9SYW5kb20iLCJTdGRsaWJfU2VxIiwiU3RkbGliX0ludCIsIlN0ZGxpYl9BcnJheSIsIlN0ZGxpYl9TdHJpbmciLCJvbmdvaW5nX3RyYXZlcnNhbCIsImgiLCJmbGlwX29uZ29pbmdfdHJhdmVyc2FsIiwicGFyYW1zIiwiZXhuIiwicmFuZG9taXplZF9kZWZhdWx0IiwicmFuZG9taXplZCIsInJhbmRvbWl6ZSIsInBhcmFtIiwiaXNfcmFuZG9taXplZCIsInBybmdfa2V5IiwicG93ZXJfMl9hYm92ZSIsIngiLCJuIiwiY3JlYXRlIiwib3B0IiwiaW5pdGlhbF9zaXplIiwicmFuZG9tIiwicyIsInNlZWQiLCJjbGVhciIsInJlc2V0IiwibGVuIiwiY29weV9idWNrZXRsaXN0Iiwia2V5IiwiZGF0YSIsIm5leHQiLCJwcmVjIiwiY29weSIsImxlbmd0aCIsImluc2VydF9hbGxfYnVja2V0cyIsImluZGV4ZnVuIiwiaW5wbGFjZSIsIm9kYXRhIiwibmRhdGEiLCJuc2l6ZSIsIm5kYXRhX3RhaWwiLCJpIiwiY2VsbCIsIm5pZHgiLCJtYXRjaCIsInJlc2l6ZSIsIm9zaXplIiwiaXRlciIsIm9sZF90cmF2IiwiZCIsImZpbHRlcl9tYXBfaW5wbGFjZSIsInNsb3QiLCJmb2xkIiwiaW5pdCIsImFjY3UiLCJiIiwiYnVja2V0X2xlbmd0aCIsInN0YXRzIiwibWJsIiwibSIsImhpc3RvIiwibCIsInRvX3NlcSIsInRibCIsInRibF9kYXRhIiwiYXV4IiwiYnVjayIsInRvX3NlcV9rZXlzIiwidG9fc2VxX3ZhbHVlcyIsIk1ha2VTZWVkZWQiLCJIIiwia2V5X2luZGV4IiwiYWRkIiwiYnVja2V0IiwicmVtb3ZlIiwiayIsImZpbmQiLCJrMSIsImQxIiwibmV4dDEiLCJrMiIsImQyIiwibmV4dDIiLCJrMyIsImQzIiwibmV4dDMiLCJmaW5kX29wdCIsImZpbmRfYWxsIiwiYmxvY2siLCJkc3QiLCJvZmZzZXQiLCJyZXBsYWNlIiwibWVtIiwiYWRkX3NlcSIsInYiLCJyZXBsYWNlX3NlcSIsIm9mX3NlcSIsIk1ha2UiLCJlcXVhbCIsInNlZWRlZF9oYXNoIiwiaW5jbHVkZSIsInN6IiwiaGFzaCIsImhhc2hfcGFyYW0iLCJuMSIsIm4yIiwicmVidWlsZCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFKLEdBQUFDLElBQUFFLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFD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QUFBO0FBQUEsU0FFUDtBQUFBLEtBQUFsQixNQUVTO0FBQUEsSUFJVDtBQUFBLGtCQUFtQjtBQUFBLElBQW1DO0FBQUEsR0FDcEQ7QUFBQSxHQTlqQnlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEM0Q3RCIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjI0NzIyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6InN0ZGxpYi5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL2NhbGxiYWNrLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBSZWdpc3RlcmluZyBPQ2FtbCB2YWx1ZXMgd2l0aCB0aGUgQyBydW50aW1lIGZvciBsYXRlciBjYWxsYmFja3MgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gT2JqLnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgcmVnaXN0ZXIgbmFtZSB2ID1cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSAoT2JqLnJlcHIgdilcblxubGV0IHJlZ2lzdGVyX2V4Y2VwdGlvbiBuYW1lIChleG4gOiBleG4pID1cbiAgbGV0IGV4biA9IE9iai5yZXByIGV4biBpblxuICBsZXQgc2xvdCA9IGlmIE9iai50YWcgZXhuID0gT2JqLm9iamVjdF90YWcgdGhlbiBleG4gZWxzZSBPYmouZmllbGQgZXhuIDAgaW5cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSBzbG90XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWUiLCJTdGRsaWJfT2JqIiwicmVnaXN0ZXJfZXhjZXB0aW9uIiwibmFtZSIsImV4biIsInNsb3QiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsNEJBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsWUFBQUMsbUJBQUFDLE1BQUFDO0FBQUFBO0FBQUFBLEtBQUEsSUN5QmdCO0FBQUEsS0FBQUMsT0FBQTtBQUFBLElBQ2QsNENBQThCO0FBQUE7QUFBQSxHRDFCaEMiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyNDc0NSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfdHlwZXMubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogQ29yZSB0eXBlcyBmb3IgdGhlIFNYIGxhbmd1YWdlLlxuXG4gICAgVGhlIFt2YWx1ZV0gc3VtIHR5cGUgcmVwcmVzZW50cyBldmVyeSBwb3NzaWJsZSBTWCBydW50aW1lIHZhbHVlLlxuICAgIE9DYW1sJ3MgYWxnZWJyYWljIHR5cGVzIG1ha2UgdGhlIENFSyBtYWNoaW5lJ3MgZnJhbWUgZGlzcGF0Y2ggYVxuICAgIHBhdHRlcm4gbWF0Y2gg4oCUIGV4YWN0bHkgd2hhdCB0aGUgc3BlYyBkZXNjcmliZXMuICopXG5cbigqKiB7MSBTeW1ib2wgaW50ZXJuaW5nfSAqKVxuXG4oKiogTWFwIHN5bWJvbCBuYW1lcyB0byBzbWFsbCBpbnRlZ2VycyBmb3IgTygxKSBlbnYgbG9va3Vwcy5cbiAgICBUaGUgaW50ZXJuIHRhYmxlIGlzIHBvcHVsYXRlZCBvbmNlIHBlciB1bmlxdWUgc3ltYm9sIG5hbWU7XG4gICAgYWxsIHN1YnNlcXVlbnQgZW52IG9wZXJhdGlvbnMgdXNlIHRoZSBpbnRlZ2VyIGtleS4gKilcblxubGV0IHN5bV90b19pZCA6IChzdHJpbmcsIGludCkgSGFzaHRibC50ID0gSGFzaHRibC5jcmVhdGUgNTEyXG5sZXQgaWRfdG9fc3ltIDogKGludCwgc3RyaW5nKSBIYXNodGJsLnQgPSBIYXNodGJsLmNyZWF0ZSA1MTJcbmxldCBzeW1fbmV4dCAgPSByZWYgMFxuXG5sZXQgaW50ZXJuIHMgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHN5bV90b19pZCBzIHdpdGhcbiAgfCBTb21lIGlkIC0+IGlkXG4gIHwgTm9uZSAtPlxuICAgIGxldCBpZCA9ICFzeW1fbmV4dCBpblxuICAgIGluY3Igc3ltX25leHQ7XG4gICAgSGFzaHRibC5yZXBsYWNlIHN5bV90b19pZCBzIGlkO1xuICAgIEhhc2h0YmwucmVwbGFjZSBpZF90b19zeW0gaWQgcztcbiAgICBpZFxuXG5sZXQgdW5pbnRlcm4gaWQgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGlkX3RvX3N5bSBpZCB3aXRoXG4gIHwgU29tZSBzIC0+IHNcbiAgfCBOb25lIC0+IFwiPHN5bTpcIiBeIHN0cmluZ19vZl9pbnQgaWQgXiBcIj5cIlxuXG5cbigqKiB7MSBFbnZpcm9ubWVudH0gKilcblxuKCoqIExleGljYWwgc2NvcGUgY2hhaW4uICBFYWNoIGZyYW1lIGhvbGRzIGEgbXV0YWJsZSBiaW5kaW5nIHRhYmxlXG4gICAga2V5ZWQgYnkgaW50ZXJuZWQgc3ltYm9sIElEcyBmb3IgZmFzdCBsb29rdXAuICopXG50eXBlIGVudiA9IHtcbiAgYmluZGluZ3MgOiAoaW50LCB2YWx1ZSkgSGFzaHRibC50O1xuICBwYXJlbnQgICA6IGVudiBvcHRpb247XG59XG5cbigqKiB7MSBWYWx1ZXN9ICopXG5cbmFuZCB2YWx1ZSA9XG4gIHwgTmlsXG4gIHwgQm9vbCAgIG9mIGJvb2xcbiAgfCBOdW1iZXIgb2YgZmxvYXRcbiAgfCBTdHJpbmcgb2Ygc3RyaW5nXG4gIHwgU3ltYm9sIG9mIHN0cmluZ1xuICB8IEtleXdvcmQgb2Ygc3RyaW5nXG4gIHwgTGlzdCAgIG9mIHZhbHVlIGxpc3RcbiAgfCBEaWN0ICAgb2YgZGljdFxuICB8IExhbWJkYSBvZiBsYW1iZGFcbiAgfCBDb21wb25lbnQgb2YgY29tcG9uZW50XG4gIHwgSXNsYW5kIG9mIGlzbGFuZFxuICB8IE1hY3JvICBvZiBtYWNyb1xuICB8IFRodW5rICBvZiB2YWx1ZSAqIGVudlxuICB8IENvbnRpbnVhdGlvbiBvZiAodmFsdWUgLT4gdmFsdWUpICogZGljdCBvcHRpb25cbiAgfCBOYXRpdmVGbiBvZiBzdHJpbmcgKiAodmFsdWUgbGlzdCAtPiB2YWx1ZSlcbiAgfCBTaWduYWwgb2Ygc2lnbmFsXG4gIHwgUmF3SFRNTCBvZiBzdHJpbmdcbiAgfCBTcHJlYWQgb2YgKHN0cmluZyAqIHZhbHVlKSBsaXN0XG4gIHwgU3hFeHByIG9mIHN0cmluZyAgKCoqIE9wYXF1ZSBTWCB3aXJlLWZvcm1hdCBzdHJpbmcg4oCUIGFzZXIgb3V0cHV0LiAqKVxuICB8IEVudiBvZiBlbnYgICgqKiBGaXJzdC1jbGFzcyBlbnZpcm9ubWVudCDigJQgdXNlZCBieSBDRUsgbWFjaGluZSBzdGF0ZSBkaWN0cy4gKilcbiAgfCBMaXN0UmVmIG9mIHZhbHVlIGxpc3QgcmVmICAoKiogTXV0YWJsZSBsaXN0IOKAlCBKUy1zdHlsZSBhcnJheSBmb3IgYXBwZW5kISAqKVxuICB8IENla1N0YXRlIG9mIGNla19zdGF0ZSAgKCoqIE9wdGltaXplZCBDRUsgbWFjaGluZSBzdGF0ZSDigJQgYXZvaWRzIERpY3QgYWxsb2NhdGlvbi4gKilcbiAgfCBDZWtGcmFtZSBvZiBjZWtfZnJhbWUgICgqKiBPcHRpbWl6ZWQgQ0VLIGNvbnRpbnVhdGlvbiBmcmFtZS4gKilcbiAgfCBWbUNsb3N1cmUgb2Ygdm1fY2xvc3VyZSAgKCoqIFZNLWNvbXBpbGVkIGNsb3N1cmUg4oCUIGNhbGxhYmxlIHdpdGhpbiB0aGUgVk0gd2l0aG91dCBhbGxvY2F0aW5nIGEgbmV3IFZNLiAqKVxuXG4oKiogQ0VLIG1hY2hpbmUgc3RhdGUg4oCUIHJlY29yZCBpbnN0ZWFkIG9mIERpY3QgZm9yIHBlcmZvcm1hbmNlLlxuICAgIDUgZmllbGRzIMOXIDU1SyBzdGVwcy9zZWMgPSAyNzVLIEhhc2h0YmwgYWxsb2NhdGlvbnMvc2VjIGVsaW1pbmF0ZWQuICopXG5hbmQgY2VrX3N0YXRlID0ge1xuICBjc19jb250cm9sIDogdmFsdWU7XG4gIGNzX2VudiAgICAgOiB2YWx1ZTtcbiAgY3Nfa29udCAgICA6IHZhbHVlO1xuICBjc19waGFzZSAgIDogc3RyaW5nO1xuICBjc192YWx1ZSAgIDogdmFsdWU7XG59XG5cbigqKiBDRUsgY29udGludWF0aW9uIGZyYW1lIOKAlCB0YWdnZWQgcmVjb3JkIGNvdmVyaW5nIGFsbCAyOSBmcmFtZSB0eXBlcy5cbiAgICBGaWVsZHMgYXJlIG5hbWVkIGdlbmVyaWNhbGx5OyBub3QgYWxsIGFyZSB1c2VkIGJ5IGV2ZXJ5IGZyYW1lIHR5cGUuXG4gICAgRWxpbWluYXRlcyB+MTAwSyBIYXNodGJsIGFsbG9jYXRpb25zIHBlciBwYWdlIHJlbmRlci4gKilcbmFuZCBjZWtfZnJhbWUgPSB7XG4gIGNmX3R5cGUgICAgICA6IHN0cmluZzsgICAgICAgICgqIGZyYW1lIHR5cGUgdGFnOiBcImlmXCIsIFwibGV0XCIsIFwiY2FsbFwiLCBldGMuICopXG4gIGNmX2VudiAgICAgICA6IHZhbHVlOyAgICAgICAgICgqIGVudmlyb25tZW50IOKAlCBldmVyeSBmcmFtZSBoYXMgdGhpcyAqKVxuICBjZl9uYW1lICAgICAgOiB2YWx1ZTsgICAgICAgICAoKiBsZXQvZGVmaW5lL3NldC9zY29wZTogYmluZGluZyBuYW1lICopXG4gIGNmX2JvZHkgICAgICA6IHZhbHVlOyAgICAgICAgICgqIHdoZW4vbGV0OiBib2R5IGV4cHIgKilcbiAgY2ZfcmVtYWluaW5nIDogdmFsdWU7ICAgICAgICAgKCogYmVnaW4vY29uZC9tYXAvZXRjOiByZW1haW5pbmcgZXhwcnMgKilcbiAgY2ZfZiAgICAgICAgIDogdmFsdWU7ICAgICAgICAgKCogY2FsbC9tYXAvZmlsdGVyL2V0YzogZnVuY3Rpb24gKilcbiAgY2ZfYXJncyAgICAgIDogdmFsdWU7ICAgICAgICAgKCogY2FsbDogcmF3IGFyZ3M7IGFyZzogZXZhbGVkIGFyZ3MgKilcbiAgY2ZfcmVzdWx0cyAgIDogdmFsdWU7ICAgICAgICAgKCogbWFwL2ZpbHRlci9kaWN0OiBhY2N1bXVsYXRlZCByZXN1bHRzICopXG4gIGNmX2V4dHJhICAgICA6IHZhbHVlOyAgICAgICAgICgqIGV4dHJhIGZpZWxkOiBzY2hlbWUsIGluZGV4ZWQsIHZhbHVlLCBwaGFzZSwgZXRjLiAqKVxuICBjZl9leHRyYTIgICAgOiB2YWx1ZTsgICAgICAgICAoKiBzZWNvbmQgZXh0cmE6IGVtaXR0ZWQsIGV0Yy4gKilcbn1cblxuKCoqIE11dGFibGUgc3RyaW5nLWtleWVkIHRhYmxlIChTWCBkaWN0cyBzdXBwb3J0IFtkaWN0LXNldCFdKS4gKilcbmFuZCBkaWN0ID0gKHN0cmluZywgdmFsdWUpIEhhc2h0YmwudFxuXG5hbmQgbGFtYmRhID0ge1xuICBsX3BhcmFtcyAgOiBzdHJpbmcgbGlzdDtcbiAgbF9ib2R5ICAgIDogdmFsdWU7XG4gIGxfY2xvc3VyZSA6IGVudjtcbiAgbXV0YWJsZSBsX25hbWUgOiBzdHJpbmcgb3B0aW9uO1xuICBtdXRhYmxlIGxfY29tcGlsZWQgOiB2bV9jbG9zdXJlIG9wdGlvbjsgICgqKiBMYXp5IEpJVCBjYWNoZSAqKVxufVxuXG5hbmQgY29tcG9uZW50ID0ge1xuICBjX25hbWUgICAgICAgICA6IHN0cmluZztcbiAgY19wYXJhbXMgICAgICAgOiBzdHJpbmcgbGlzdDtcbiAgY19oYXNfY2hpbGRyZW4gOiBib29sO1xuICBjX2JvZHkgICAgICAgICA6IHZhbHVlO1xuICBjX2Nsb3N1cmUgICAgICA6IGVudjtcbiAgY19hZmZpbml0eSAgICAgOiBzdHJpbmc7ICAoKiogXCJhdXRvXCIgfCBcImNsaWVudFwiIHwgXCJzZXJ2ZXJcIiAqKVxuICBtdXRhYmxlIGNfY29tcGlsZWQgOiB2bV9jbG9zdXJlIG9wdGlvbjsgICgqKiBMYXp5IEpJVCBjYWNoZSAqKVxufVxuXG5hbmQgaXNsYW5kID0ge1xuICBpX25hbWUgICAgICAgICA6IHN0cmluZztcbiAgaV9wYXJhbXMgICAgICAgOiBzdHJpbmcgbGlzdDtcbiAgaV9oYXNfY2hpbGRyZW4gOiBib29sO1xuICBpX2JvZHkgICAgICAgICA6IHZhbHVlO1xuICBpX2Nsb3N1cmUgICAgICA6IGVudjtcbn1cblxuYW5kIG1hY3JvID0ge1xuICBtX3BhcmFtcyAgICAgOiBzdHJpbmcgbGlzdDtcbiAgbV9yZXN0X3BhcmFtIDogc3RyaW5nIG9wdGlvbjtcbiAgbV9ib2R5ICAgICAgIDogdmFsdWU7XG4gIG1fY2xvc3VyZSAgICA6IGVudjtcbiAgbV9uYW1lICAgICAgIDogc3RyaW5nIG9wdGlvbjtcbn1cblxuYW5kIHNpZ25hbCA9IHtcbiAgbXV0YWJsZSBzX3ZhbHVlICAgICAgIDogdmFsdWU7XG4gIG11dGFibGUgc19zdWJzY3JpYmVycyA6ICh1bml0IC0+IHVuaXQpIGxpc3Q7XG4gIG11dGFibGUgc19kZXBzICAgICAgICA6IHNpZ25hbCBsaXN0O1xufVxuXG4oKiogezEgQnl0ZWNvZGUgVk0gdHlwZXN9XG5cbiAgICBEZWZpbmVkIGhlcmUgKG5vdCBpbiBzeF92bS5tbCkgYmVjYXVzZSBbdm1fY29kZS5jb25zdGFudHNdIHJlZmVyZW5jZXNcbiAgICBbdmFsdWVdIGFuZCBbbGFtYmRhLmxfY29tcGlsZWRdIHJlZmVyZW5jZXMgW3ZtX2Nsb3N1cmVdIOKAlCBtdXR1YWxcbiAgICByZWN1cnNpb24gcmVxdWlyZXMgYWxsIHR5cGVzIGluIG9uZSBbYW5kXSBjaGFpbi4gKilcblxuKCoqIENvbXBpbGVkIGZ1bmN0aW9uIGJvZHkg4oCUIGJ5dGVjb2RlICsgY29uc3RhbnQgcG9vbC4gKilcbmFuZCB2bV9jb2RlID0ge1xuICB2Y19hcml0eSAgICAgOiBpbnQ7XG4gIHZjX2xvY2FscyAgICA6IGludDtcbiAgdmNfYnl0ZWNvZGUgIDogaW50IGFycmF5O1xuICB2Y19jb25zdGFudHMgOiB2YWx1ZSBhcnJheTtcbn1cblxuKCoqIFVwdmFsdWUgY2VsbCDigJQgc2hhcmVkIG11dGFibGUgcmVmZXJlbmNlIHRvIGEgY2FwdHVyZWQgdmFyaWFibGUuICopXG5hbmQgdm1fdXB2YWx1ZV9jZWxsID0ge1xuICBtdXRhYmxlIHV2X3ZhbHVlIDogdmFsdWU7XG59XG5cbigqKiBDbG9zdXJlIOKAlCBjb21waWxlZCBjb2RlICsgY2FwdHVyZWQgdXB2YWx1ZXMgKyBsaXZlIGVudiByZWZlcmVuY2UuICopXG5hbmQgdm1fY2xvc3VyZSA9IHtcbiAgdm1fY29kZSAgICAgOiB2bV9jb2RlO1xuICB2bV91cHZhbHVlcyA6IHZtX3VwdmFsdWVfY2VsbCBhcnJheTtcbiAgdm1fbmFtZSAgICAgOiBzdHJpbmcgb3B0aW9uO1xuICB2bV9lbnZfcmVmICA6IChzdHJpbmcsIHZhbHVlKSBIYXNodGJsLnQ7XG4gIHZtX2Nsb3N1cmVfZW52IDogZW52IG9wdGlvbjsgICgqKiBPcmlnaW5hbCBjbG9zdXJlIGVudiBmb3IgaW5uZXIgZnVuY3Rpb25zICopXG59XG5cblxuKCoqIHsxIEZvcndhcmQgcmVmIGZvciBjYWxsaW5nIFZNIGNsb3N1cmVzIGZyb20gb3V0c2lkZSB0aGUgVk19ICopXG5cbmxldCBfdm1fY2FsbF9jbG9zdXJlX3JlZiA6ICh2bV9jbG9zdXJlIC0+IHZhbHVlIGxpc3QgLT4gdmFsdWUpIHJlZiA9XG4gIHJlZiAoZnVuIF8gXyAtPiByYWlzZSAoRmFpbHVyZSBcIlZNIGNhbGxfY2xvc3VyZSBub3QgaW5pdGlhbGl6ZWRcIikpXG5cblxuKCoqIHsxIEVycm9yc30gKilcblxuZXhjZXB0aW9uIEV2YWxfZXJyb3Igb2Ygc3RyaW5nXG5leGNlcHRpb24gUGFyc2VfZXJyb3Igb2Ygc3RyaW5nXG5cblxuKCoqIHsxIEVudmlyb25tZW50IG9wZXJhdGlvbnN9ICopXG5cbmxldCBtYWtlX2VudiAoKSA9XG4gIHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gTm9uZSB9XG5cbmxldCBlbnZfZXh0ZW5kIHBhcmVudCA9XG4gIHsgYmluZGluZ3MgPSBIYXNodGJsLmNyZWF0ZSAxNjsgcGFyZW50ID0gU29tZSBwYXJlbnQgfVxuXG5sZXQgZW52X2JpbmQgZW52IG5hbWUgdiA9XG4gIEhhc2h0YmwucmVwbGFjZSBlbnYuYmluZGluZ3MgKGludGVybiBuYW1lKSB2OyBOaWxcblxuKCogSW50ZXJuYWw6IHNjb3BlLWNoYWluIGxvb2t1cCB3aXRoIHByZS1pbnRlcm5lZCBJRCAqKVxubGV0IHJlYyBlbnZfaGFzX2lkIGVudiBpZCA9XG4gIEhhc2h0YmwubWVtIGVudi5iaW5kaW5ncyBpZCB8fFxuICBtYXRjaCBlbnYucGFyZW50IHdpdGggU29tZSBwIC0+IGVudl9oYXNfaWQgcCBpZCB8IE5vbmUgLT4gZmFsc2VcblxubGV0IGVudl9oYXMgZW52IG5hbWUgPSBlbnZfaGFzX2lkIGVudiAoaW50ZXJuIG5hbWUpXG5cbmxldCByZWMgZW52X2dldF9pZCBlbnYgaWQgbmFtZSA9XG4gIG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZW52LmJpbmRpbmdzIGlkIHdpdGhcbiAgfCBTb21lIHYgLT4gdlxuICB8IE5vbmUgLT5cbiAgICBtYXRjaCBlbnYucGFyZW50IHdpdGhcbiAgICB8IFNvbWUgcCAtPiBlbnZfZ2V0X2lkIHAgaWQgbmFtZVxuICAgIHwgTm9uZSAtPlxuICAgICAgcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5kZWZpbmVkIHN5bWJvbDogXCIgXiBuYW1lKSlcblxubGV0IGVudl9nZXQgZW52IG5hbWUgPSBlbnZfZ2V0X2lkIGVudiAoaW50ZXJuIG5hbWUpIG5hbWVcblxubGV0IHJlYyBlbnZfc2V0X2lkIGVudiBpZCB2ID1cbiAgaWYgSGFzaHRibC5tZW0gZW52LmJpbmRpbmdzIGlkIHRoZW5cbiAgICAoSGFzaHRibC5yZXBsYWNlIGVudi5iaW5kaW5ncyBpZCB2OyBOaWwpXG4gIGVsc2VcbiAgICBtYXRjaCBlbnYucGFyZW50IHdpdGhcbiAgICB8IFNvbWUgcCAtPiBlbnZfc2V0X2lkIHAgaWQgdlxuICAgIHwgTm9uZSAtPiBIYXNodGJsLnJlcGxhY2UgZW52LmJpbmRpbmdzIGlkIHY7IE5pbFxuXG5sZXQgZW52X3NldCBlbnYgbmFtZSB2ID0gZW52X3NldF9pZCBlbnYgKGludGVybiBuYW1lKSB2XG5cbmxldCBlbnZfbWVyZ2UgYmFzZSBvdmVybGF5ID1cbiAgaWYgYmFzZSA9PSBvdmVybGF5IHRoZW5cbiAgICB7IGJpbmRpbmdzID0gSGFzaHRibC5jcmVhdGUgMTY7IHBhcmVudCA9IFNvbWUgYmFzZSB9XG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgcmVjIGlzX2Rlc2NlbmRhbnQgZSBkZXB0aCA9XG4gICAgICBpZiBkZXB0aCA+IDEwMCB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIGUgPT0gYmFzZSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbWF0Y2ggZS5wYXJlbnQgd2l0aCBTb21lIHAgLT4gaXNfZGVzY2VuZGFudCBwIChkZXB0aCArIDEpIHwgTm9uZSAtPiBmYWxzZVxuICAgIGluXG4gICAgaWYgaXNfZGVzY2VuZGFudCBvdmVybGF5IDAgdGhlblxuICAgICAgeyBiaW5kaW5ncyA9IEhhc2h0YmwuY3JlYXRlIDE2OyBwYXJlbnQgPSBTb21lIGJhc2UgfVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCBlID0geyBiaW5kaW5ncyA9IEhhc2h0YmwuY3JlYXRlIDE2OyBwYXJlbnQgPSBTb21lIGJhc2UgfSBpblxuICAgICAgSGFzaHRibC5pdGVyIChmdW4gaWQgdiAtPlxuICAgICAgICBpZiBub3QgKGVudl9oYXNfaWQgYmFzZSBpZCkgdGhlbiBIYXNodGJsLnJlcGxhY2UgZS5iaW5kaW5ncyBpZCB2XG4gICAgICApIG92ZXJsYXkuYmluZGluZ3M7XG4gICAgICBlXG4gICAgZW5kXG4gIGVuZFxuXG5cbigqKiB7MSBWYWx1ZSBleHRyYWN0aW9uIGhlbHBlcnN9ICopXG5cbmxldCB2YWx1ZV90b19zdHJpbmcgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHMgfCBTeW1ib2wgcyAtPiBzIHwgS2V5d29yZCBrIC0+IGtcbiAgfCBOdW1iZXIgbiAtPiBpZiBGbG9hdC5pc19pbnRlZ2VyIG4gdGhlbiBzdHJpbmdfb2ZfaW50IChpbnRfb2ZfZmxvYXQgbikgZWxzZSBQcmludGYuc3ByaW50ZiBcIiVnXCIgblxuICB8IEJvb2wgdHJ1ZSAtPiBcInRydWVcIiB8IEJvb2wgZmFsc2UgLT4gXCJmYWxzZVwiXG4gIHwgTmlsIC0+IFwiXCIgfCBfIC0+IFwiPHZhbHVlPlwiXG5cbmxldCB2YWx1ZV90b19zdHJpbmdfbGlzdCA9IGZ1bmN0aW9uXG4gIHwgTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0gLT4gTGlzdC5tYXAgdmFsdWVfdG9fc3RyaW5nIGl0ZW1zXG4gIHwgXyAtPiBbXVxuXG5sZXQgdmFsdWVfdG9fYm9vbCA9IGZ1bmN0aW9uXG4gIHwgQm9vbCBiIC0+IGIgfCBOaWwgLT4gZmFsc2UgfCBfIC0+IHRydWVcblxubGV0IHZhbHVlX3RvX3N0cmluZ19vcHQgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IFNvbWUgcyB8IFN5bWJvbCBzIC0+IFNvbWUgcyB8IE5pbCAtPiBOb25lIHwgXyAtPiBOb25lXG5cblxuKCoqIHsxIENvbnN0cnVjdG9ycyDigJQgYWNjZXB0IFt2YWx1ZV0gYXJncyBmcm9tIHRyYW5zcGlsZWQgY29kZX0gKilcblxubGV0IHVud3JhcF9lbnZfdmFsID0gZnVuY3Rpb25cbiAgfCBFbnYgZSAtPiBlXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2VfbGFtYmRhOiBleHBlY3RlZCBlbnYgZm9yIGNsb3N1cmVcIilcblxubGV0IG1ha2VfbGFtYmRhIHBhcmFtcyBib2R5IGNsb3N1cmUgPVxuICBsZXQgcHMgPSBtYXRjaCBwYXJhbXMgd2l0aFxuICAgIHwgTGlzdCBpdGVtcyAtPiBMaXN0Lm1hcCB2YWx1ZV90b19zdHJpbmcgaXRlbXNcbiAgICB8IF8gLT4gdmFsdWVfdG9fc3RyaW5nX2xpc3QgcGFyYW1zXG4gIGluXG4gIExhbWJkYSB7IGxfcGFyYW1zID0gcHM7IGxfYm9keSA9IGJvZHk7IGxfY2xvc3VyZSA9IHVud3JhcF9lbnZfdmFsIGNsb3N1cmU7IGxfbmFtZSA9IE5vbmU7IGxfY29tcGlsZWQgPSBOb25lIH1cblxubGV0IG1ha2VfY29tcG9uZW50IG5hbWUgcGFyYW1zIGhhc19jaGlsZHJlbiBib2R5IGNsb3N1cmUgYWZmaW5pdHkgPVxuICBsZXQgbiA9IHZhbHVlX3RvX3N0cmluZyBuYW1lIGluXG4gIGxldCBwcyA9IHZhbHVlX3RvX3N0cmluZ19saXN0IHBhcmFtcyBpblxuICBsZXQgaGMgPSB2YWx1ZV90b19ib29sIGhhc19jaGlsZHJlbiBpblxuICBsZXQgYWZmID0gbWF0Y2ggYWZmaW5pdHkgd2l0aCBTdHJpbmcgcyAtPiBzIHwgXyAtPiBcImF1dG9cIiBpblxuICBDb21wb25lbnQge1xuICAgIGNfbmFtZSA9IG47IGNfcGFyYW1zID0gcHM7IGNfaGFzX2NoaWxkcmVuID0gaGM7XG4gICAgY19ib2R5ID0gYm9keTsgY19jbG9zdXJlID0gdW53cmFwX2Vudl92YWwgY2xvc3VyZTsgY19hZmZpbml0eSA9IGFmZjtcbiAgICBjX2NvbXBpbGVkID0gTm9uZTtcbiAgfVxuXG5sZXQgbWFrZV9pc2xhbmQgbmFtZSBwYXJhbXMgaGFzX2NoaWxkcmVuIGJvZHkgY2xvc3VyZSA9XG4gIGxldCBuID0gdmFsdWVfdG9fc3RyaW5nIG5hbWUgaW5cbiAgbGV0IHBzID0gdmFsdWVfdG9fc3RyaW5nX2xpc3QgcGFyYW1zIGluXG4gIGxldCBoYyA9IHZhbHVlX3RvX2Jvb2wgaGFzX2NoaWxkcmVuIGluXG4gIElzbGFuZCB7XG4gICAgaV9uYW1lID0gbjsgaV9wYXJhbXMgPSBwczsgaV9oYXNfY2hpbGRyZW4gPSBoYztcbiAgICBpX2JvZHkgPSBib2R5OyBpX2Nsb3N1cmUgPSB1bndyYXBfZW52X3ZhbCBjbG9zdXJlO1xuICB9XG5cbmxldCBtYWtlX21hY3JvIHBhcmFtcyByZXN0X3BhcmFtIGJvZHkgY2xvc3VyZSBuYW1lID1cbiAgbGV0IHBzID0gdmFsdWVfdG9fc3RyaW5nX2xpc3QgcGFyYW1zIGluXG4gIGxldCBycCA9IHZhbHVlX3RvX3N0cmluZ19vcHQgcmVzdF9wYXJhbSBpblxuICBsZXQgbiA9IHZhbHVlX3RvX3N0cmluZ19vcHQgbmFtZSBpblxuICBNYWNybyB7XG4gICAgbV9wYXJhbXMgPSBwczsgbV9yZXN0X3BhcmFtID0gcnA7XG4gICAgbV9ib2R5ID0gYm9keTsgbV9jbG9zdXJlID0gdW53cmFwX2Vudl92YWwgY2xvc3VyZTsgbV9uYW1lID0gbjtcbiAgfVxuXG5sZXQgbWFrZV90aHVuayBleHByIGVudiA9IFRodW5rIChleHByLCB1bndyYXBfZW52X3ZhbCBlbnYpXG5cbmxldCBtYWtlX3N5bWJvbCBuYW1lID0gU3ltYm9sICh2YWx1ZV90b19zdHJpbmcgbmFtZSlcbmxldCBtYWtlX2tleXdvcmQgbmFtZSA9IEtleXdvcmQgKHZhbHVlX3RvX3N0cmluZyBuYW1lKVxuXG5cbigqKiB7MSBUeXBlIGluc3BlY3Rpb259ICopXG5cbmxldCB0eXBlX29mID0gZnVuY3Rpb25cbiAgfCBOaWwgICAgICAgICAgICAtPiBcIm5pbFwiXG4gIHwgQm9vbCBfICAgICAgICAgLT4gXCJib29sZWFuXCJcbiAgfCBOdW1iZXIgXyAgICAgICAtPiBcIm51bWJlclwiXG4gIHwgU3RyaW5nIF8gICAgICAgLT4gXCJzdHJpbmdcIlxuICB8IFN5bWJvbCBfICAgICAgIC0+IFwic3ltYm9sXCJcbiAgfCBLZXl3b3JkIF8gICAgICAtPiBcImtleXdvcmRcIlxuICB8IExpc3QgXyB8IExpc3RSZWYgXyAtPiBcImxpc3RcIlxuICB8IERpY3QgXyAgICAgICAgIC0+IFwiZGljdFwiXG4gIHwgTGFtYmRhIF8gICAgICAgLT4gXCJsYW1iZGFcIlxuICB8IENvbXBvbmVudCBfICAgIC0+IFwiY29tcG9uZW50XCJcbiAgfCBJc2xhbmQgXyAgICAgICAtPiBcImlzbGFuZFwiXG4gIHwgTWFjcm8gXyAgICAgICAgLT4gXCJtYWNyb1wiXG4gIHwgVGh1bmsgXyAgICAgICAgLT4gXCJ0aHVua1wiXG4gIHwgQ29udGludWF0aW9uIChfLCBfKSAtPiBcImNvbnRpbnVhdGlvblwiXG4gIHwgTmF0aXZlRm4gXyAgICAgLT4gXCJmdW5jdGlvblwiXG4gIHwgU2lnbmFsIF8gICAgICAgLT4gXCJzaWduYWxcIlxuICB8IFJhd0hUTUwgXyAgICAgIC0+IFwicmF3LWh0bWxcIlxuICB8IFNwcmVhZCBfICAgICAgIC0+IFwic3ByZWFkXCJcbiAgfCBTeEV4cHIgXyAgICAgICAtPiBcInN4LWV4cHJcIlxuICB8IEVudiBfICAgICAgICAgIC0+IFwiZW52XCJcbiAgfCBDZWtTdGF0ZSBfICAgICAtPiBcImRpY3RcIiAgKCogQ0VLIHN0YXRlIGJlaGF2ZXMgYXMgYSBkaWN0IGZvciB0eXBlIGNoZWNrcyAqKVxuICB8IENla0ZyYW1lIF8gICAgIC0+IFwiZGljdFwiXG4gIHwgVm1DbG9zdXJlIF8gICAgLT4gXCJmdW5jdGlvblwiXG5cbmxldCBpc19uaWwgPSBmdW5jdGlvbiBOaWwgLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19sYW1iZGEgPSBmdW5jdGlvbiBMYW1iZGEgXyAtPiB0cnVlIHwgXyAtPiBmYWxzZVxubGV0IGlzX2NvbXBvbmVudCA9IGZ1bmN0aW9uIENvbXBvbmVudCBfIC0+IHRydWUgfCBfIC0+IGZhbHNlXG5sZXQgaXNfaXNsYW5kID0gZnVuY3Rpb24gSXNsYW5kIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19tYWNybyA9IGZ1bmN0aW9uIE1hY3JvIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc190aHVuayA9IGZ1bmN0aW9uIFRodW5rIF8gLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcbmxldCBpc19zaWduYWwgPSBmdW5jdGlvblxuICB8IFNpZ25hbCBfIC0+IHRydWVcbiAgfCBEaWN0IGQgLT4gSGFzaHRibC5tZW0gZCBcIl9fc2lnbmFsXCJcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCBpc19jYWxsYWJsZSA9IGZ1bmN0aW9uXG4gIHwgTGFtYmRhIF8gfCBOYXRpdmVGbiBfIHwgQ29udGludWF0aW9uIChfLCBfKSB8IFZtQ2xvc3VyZSBfIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxuKCoqIHsxIFRydXRoaW5lc3N9ICopXG5cbigqKiBTWCB0cnV0aGluZXNzOiBldmVyeXRoaW5nIGlzIHRydXRoeSBleGNlcHQgW05pbF0gYW5kIFtCb29sIGZhbHNlXS4gKilcbmxldCBzeF90cnV0aHkgPSBmdW5jdGlvblxuICB8IE5pbCB8IEJvb2wgZmFsc2UgLT4gZmFsc2VcbiAgfCBfIC0+IHRydWVcblxuXG4oKiogezEgQWNjZXNzb3JzfSAqKVxuXG5sZXQgc3ltYm9sX25hbWUgPSBmdW5jdGlvblxuICB8IFN5bWJvbCBzIC0+IFN0cmluZyBzXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBzeW1ib2wsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBrZXl3b3JkX25hbWUgPSBmdW5jdGlvblxuICB8IEtleXdvcmQgayAtPiBTdHJpbmcga1xuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQga2V5d29yZCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGxhbWJkYV9wYXJhbXMgPSBmdW5jdGlvblxuICB8IExhbWJkYSBsIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgbC5sX3BhcmFtcylcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxhbWJkYSwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGxhbWJkYV9ib2R5ID0gZnVuY3Rpb25cbiAgfCBMYW1iZGEgbCAtPiBsLmxfYm9keVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGFtYmRhLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgbGFtYmRhX2Nsb3N1cmUgPSBmdW5jdGlvblxuICB8IExhbWJkYSBsIC0+IEVudiBsLmxfY2xvc3VyZVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGFtYmRhLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgbGFtYmRhX25hbWUgPSBmdW5jdGlvblxuICB8IExhbWJkYSBsIC0+IChtYXRjaCBsLmxfbmFtZSB3aXRoIFNvbWUgbiAtPiBTdHJpbmcgbiB8IE5vbmUgLT4gTmlsKVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGFtYmRhLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgc2V0X2xhbWJkYV9uYW1lIGwgbiA9IG1hdGNoIGwgd2l0aFxuICB8IExhbWJkYSBsIC0+IGwubF9uYW1lIDwtIFNvbWUgbjsgTmlsXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNldC1sYW1iZGEtbmFtZSE6IG5vdCBhIGxhbWJkYVwiKVxuXG5sZXQgY29tcG9uZW50X25hbWUgPSBmdW5jdGlvblxuICB8IENvbXBvbmVudCBjIC0+IFN0cmluZyBjLmNfbmFtZVxuICB8IElzbGFuZCBpIC0+IFN0cmluZyBpLmlfbmFtZVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgY29tcG9uZW50LCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgY29tcG9uZW50X3BhcmFtcyA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBjLmNfcGFyYW1zKVxuICB8IElzbGFuZCBpIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgaS5pX3BhcmFtcylcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGNvbXBvbmVudCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGNvbXBvbmVudF9ib2R5ID0gZnVuY3Rpb25cbiAgfCBDb21wb25lbnQgYyAtPiBjLmNfYm9keVxuICB8IElzbGFuZCBpIC0+IGkuaV9ib2R5XG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBjb21wb25lbnQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBjb21wb25lbnRfY2xvc3VyZSA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gRW52IGMuY19jbG9zdXJlXG4gIHwgSXNsYW5kIGkgLT4gRW52IGkuaV9jbG9zdXJlXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBjb21wb25lbnQsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBjb21wb25lbnRfaGFzX2NoaWxkcmVuID0gZnVuY3Rpb25cbiAgfCBDb21wb25lbnQgYyAtPiBCb29sIGMuY19oYXNfY2hpbGRyZW5cbiAgfCBJc2xhbmQgaSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW5cbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGNvbXBvbmVudCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IGNvbXBvbmVudF9hZmZpbml0eSA9IGZ1bmN0aW9uXG4gIHwgQ29tcG9uZW50IGMgLT4gU3RyaW5nIGMuY19hZmZpbml0eVxuICB8IElzbGFuZCBfIC0+IFN0cmluZyBcImNsaWVudFwiXG4gIHwgXyAtPiBTdHJpbmcgXCJhdXRvXCJcblxubGV0IG1hY3JvX3BhcmFtcyA9IGZ1bmN0aW9uXG4gIHwgTWFjcm8gbSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIG0ubV9wYXJhbXMpXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBtYWNybywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IG1hY3JvX3Jlc3RfcGFyYW0gPSBmdW5jdGlvblxuICB8IE1hY3JvIG0gLT4gKG1hdGNoIG0ubV9yZXN0X3BhcmFtIHdpdGggU29tZSBzIC0+IFN0cmluZyBzIHwgTm9uZSAtPiBOaWwpXG4gIHwgdiAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJFeHBlY3RlZCBtYWNybywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IG1hY3JvX2JvZHkgPSBmdW5jdGlvblxuICB8IE1hY3JvIG0gLT4gbS5tX2JvZHlcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIG1hY3JvLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgbWFjcm9fY2xvc3VyZSA9IGZ1bmN0aW9uXG4gIHwgTWFjcm8gbSAtPiBFbnYgbS5tX2Nsb3N1cmVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIG1hY3JvLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgdGh1bmtfZXhwciA9IGZ1bmN0aW9uXG4gIHwgVGh1bmsgKGUsIF8pIC0+IGVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIHRodW5rLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5sZXQgdGh1bmtfZW52ID0gZnVuY3Rpb25cbiAgfCBUaHVuayAoXywgZSkgLT4gRW52IGVcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIHRodW5rLCBnb3QgXCIgXiB0eXBlX29mIHYpKVxuXG5cbigqKiB7MSBEaWN0IG9wZXJhdGlvbnN9ICopXG5cbmxldCBtYWtlX2RpY3QgKCkgOiBkaWN0ID0gSGFzaHRibC5jcmVhdGUgOFxuXG5sZXQgZGljdF9nZXQgKGQgOiBkaWN0KSBrZXkgPVxuICBtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQga2V5IHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IE5pbFxuXG5sZXQgZGljdF9oYXMgKGQgOiBkaWN0KSBrZXkgPSBIYXNodGJsLm1lbSBkIGtleVxuXG5sZXQgZGljdF9zZXQgKGQgOiBkaWN0KSBrZXkgdiA9IEhhc2h0YmwucmVwbGFjZSBkIGtleSB2XG5cbmxldCBkaWN0X2RlbGV0ZSAoZCA6IGRpY3QpIGtleSA9IEhhc2h0YmwucmVtb3ZlIGQga2V5XG5cbmxldCBkaWN0X2tleXMgKGQgOiBkaWN0KSA9XG4gIEhhc2h0YmwuZm9sZCAoZnVuIGsgXyBhY2MgLT4gU3RyaW5nIGsgOjogYWNjKSBkIFtdXG5cbmxldCBkaWN0X3ZhbHMgKGQgOiBkaWN0KSA9XG4gIEhhc2h0YmwuZm9sZCAoZnVuIF8gdiBhY2MgLT4gdiA6OiBhY2MpIGQgW11cblxuXG4oKiogezEgVmFsdWUgZGlzcGxheX0gKilcblxubGV0IHJlYyBpbnNwZWN0ID0gZnVuY3Rpb25cbiAgfCBOaWwgLT4gXCJuaWxcIlxuICB8IEJvb2wgdHJ1ZSAtPiBcInRydWVcIlxuICB8IEJvb2wgZmFsc2UgLT4gXCJmYWxzZVwiXG4gIHwgTnVtYmVyIG4gLT5cbiAgICBpZiBGbG9hdC5pc19pbnRlZ2VyIG4gdGhlbiBQcmludGYuc3ByaW50ZiBcIiVkXCIgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBTdHJpbmcgcyAtPlxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAyKSBpblxuICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgJ1wiJztcbiAgICBTdHJpbmcuaXRlciAoZnVuY3Rpb25cbiAgICAgIHwgJ1wiJyAgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXFxcXCJcIlxuICAgICAgfCAnXFxcXCcgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXFxcXFxcIlxuICAgICAgfCAnXFxuJyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCJcXFxcblwiXG4gICAgICB8ICdcXHInIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIlxcXFxyXCJcbiAgICAgIHwgJ1xcdCcgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiXFxcXHRcIlxuICAgICAgfCBjICAgIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgYykgcztcbiAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICdcIic7XG4gICAgQnVmZmVyLmNvbnRlbnRzIGJ1ZlxuICB8IFN5bWJvbCBzIC0+IHNcbiAgfCBLZXl3b3JkIGsgLT4gXCI6XCIgXiBrXG4gIHwgTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0gLT5cbiAgICBcIihcIiBeIFN0cmluZy5jb25jYXQgXCIgXCIgKExpc3QubWFwIGluc3BlY3QgaXRlbXMpIF4gXCIpXCJcbiAgfCBEaWN0IGQgLT5cbiAgICBsZXQgcGFpcnMgPSBIYXNodGJsLmZvbGQgKGZ1biBrIHYgYWNjIC0+XG4gICAgICAoUHJpbnRmLnNwcmludGYgXCI6JXMgJXNcIiBrIChpbnNwZWN0IHYpKSA6OiBhY2MpIGQgW10gaW5cbiAgICBcIntcIiBeIFN0cmluZy5jb25jYXQgXCIgXCIgcGFpcnMgXiBcIn1cIlxuICB8IExhbWJkYSBsIC0+XG4gICAgbGV0IHRhZyA9IG1hdGNoIGwubF9uYW1lIHdpdGggU29tZSBuIC0+IG4gfCBOb25lIC0+IFwibGFtYmRhXCIgaW5cbiAgICBQcmludGYuc3ByaW50ZiBcIjwlcyglcyk+XCIgdGFnIChTdHJpbmcuY29uY2F0IFwiLCBcIiBsLmxfcGFyYW1zKVxuICB8IENvbXBvbmVudCBjIC0+XG4gICAgUHJpbnRmLnNwcmludGYgXCI8Q29tcG9uZW50IH4lcyglcyk+XCIgYy5jX25hbWUgKFN0cmluZy5jb25jYXQgXCIsIFwiIGMuY19wYXJhbXMpXG4gIHwgSXNsYW5kIGkgLT5cbiAgICBQcmludGYuc3ByaW50ZiBcIjxJc2xhbmQgfiVzKCVzKT5cIiBpLmlfbmFtZSAoU3RyaW5nLmNvbmNhdCBcIiwgXCIgaS5pX3BhcmFtcylcbiAgfCBNYWNybyBtIC0+XG4gICAgbGV0IHRhZyA9IG1hdGNoIG0ubV9uYW1lIHdpdGggU29tZSBuIC0+IG4gfCBOb25lIC0+IFwibWFjcm9cIiBpblxuICAgIFByaW50Zi5zcHJpbnRmIFwiPCVzKCVzKT5cIiB0YWcgKFN0cmluZy5jb25jYXQgXCIsIFwiIG0ubV9wYXJhbXMpXG4gIHwgVGh1bmsgXyAtPiBcIjx0aHVuaz5cIlxuICB8IENvbnRpbnVhdGlvbiAoXywgXykgLT4gXCI8Y29udGludWF0aW9uPlwiXG4gIHwgTmF0aXZlRm4gKG5hbWUsIF8pIC0+IFByaW50Zi5zcHJpbnRmIFwiPG5hdGl2ZTolcz5cIiBuYW1lXG4gIHwgU2lnbmFsIF8gLT4gXCI8c2lnbmFsPlwiXG4gIHwgUmF3SFRNTCBzIC0+IFByaW50Zi5zcHJpbnRmIFwiPHJhdy1odG1sOiVkIGNoYXJzPlwiIChTdHJpbmcubGVuZ3RoIHMpXG4gIHwgU3ByZWFkIF8gLT4gXCI8c3ByZWFkPlwiXG4gIHwgU3hFeHByIHMgLT4gUHJpbnRmLnNwcmludGYgXCI8c3gtZXhwcjolZCBjaGFycz5cIiAoU3RyaW5nLmxlbmd0aCBzKVxuICB8IEVudiBfIC0+IFwiPGVudj5cIlxuICB8IENla1N0YXRlIF8gLT4gXCI8Y2VrLXN0YXRlPlwiXG4gIHwgQ2VrRnJhbWUgZiAtPiBQcmludGYuc3ByaW50ZiBcIjxmcmFtZTolcz5cIiBmLmNmX3R5cGVcbiAgfCBWbUNsb3N1cmUgY2wgLT4gUHJpbnRmLnNwcmludGYgXCI8dm06JXM+XCIgKG1hdGNoIGNsLnZtX25hbWUgd2l0aCBTb21lIG4gLT4gbiB8IE5vbmUgLT4gXCJhbm9uXCIpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZnJlc2hfb29faWQiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfSGFzaHRibCIsIlN0ZGxpYiIsIlN0ZGxpYl9QcmludGYiLCJTdGRsaWJfQnVmZmVyIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9MaXN0Iiwic3ltX3RvX2lkIiwiaWRfdG9fc3ltIiwic3ltX25leHQiLCJpbnRlcm4iLCJzIiwibWF0Y2giLCJpZCIsInVuaW50ZXJuIiwidm1fY2FsbF9jbG9zdXJlX3JlZiIsInBhcmFtIiwiRXZhbF9lcnJvciIsIlBhcnNlX2Vycm9yIiwibWFrZV9lbnYiLCJlbnZfZXh0ZW5kIiwicGFyZW50IiwiZW52X2JpbmQiLCJlbnYiLCJuYW1lIiwidiIsImVudl9oYXNfaWQiLCJlbnZfaGFzIiwiZW52X2dldF9pZCIsImVudl9nZXQiLCJlbnZfc2V0X2lkIiwiZW52X3NldCIsImVudl9tZXJnZSIsImJhc2UiLCJvdmVybGF5IiwiZSIsImRlcHRoIiwicCIsImNzdF9nIiwiY3N0X2ZhbHNlIiwiY3N0X3RydWUiLCJ2YWx1ZV90b19zdHJpbmciLCJuIiwidmFsdWVfdG9fc3RyaW5nX2xpc3QiLCJpdGVtcyIsInZhbHVlX3RvX2Jvb2wiLCJiIiwidmFsdWVfdG9fc3RyaW5nX29wdCIsInVud3JhcF9lbnZfdmFsIiwibWFrZV9sYW1iZGEiLCJwYXJhbXMiLCJib2R5IiwiY2xvc3VyZSIsInBzIiwiY3N0X2F1dG8iLCJtYWtlX2NvbXBvbmVudCIsImhhc19jaGlsZHJlbiIsImFmZmluaXR5IiwiaGMiLCJhZmYiLCJtYWtlX2lzbGFuZCIsIm1ha2VfbWFjcm8iLCJyZXN0X3BhcmFtIiwicnAiLCJtYWtlX3RodW5rIiwiZXhwciIsIm1ha2Vfc3ltYm9sIiwibWFrZV9rZXl3b3JkIiwiY3N0X2xhbWJkYSIsImNzdF9tYWNybyIsImNzdF9uaWwiLCJ0eXBlX29mIiwiY3N0X2RpY3QiLCJjc3RfZnVuY3Rpb24iLCJpc19uaWwiLCJpc19sYW1iZGEiLCJpc19jb21wb25lbnQiLCJpc19pc2xhbmQiLCJpc19tYWNybyIsImlzX3RodW5rIiwiaXNfc2lnbmFsIiwiZCIsImlzX2NhbGxhYmxlIiwic3hfdHJ1dGh5Iiwic3ltYm9sX25hbWUiLCJrZXl3b3JkX25hbWUiLCJrIiwiY3N0X0V4cGVjdGVkX2xhbWJkYV9nb3QiLCJsYW1iZGFfcGFyYW1zIiwibCIsImxhbWJkYV9ib2R5IiwibGFtYmRhX2Nsb3N1cmUiLCJsYW1iZGFfbmFtZSIsInNldF9sYW1iZGFfbmFtZSIsImNzdF9FeHBlY3RlZF9jb21wb25lbnRfZ290IiwiY29tcG9uZW50X25hbWUiLCJjIiwiY29tcG9uZW50X3BhcmFtcyIsImkiLCJjb21wb25lbnRfYm9keSIsImNvbXBvbmVudF9jbG9zdXJlIiwiY29tcG9uZW50X2hhc19jaGlsZHJlbiIsImNvbXBvbmVudF9hZmZpbml0eSIsImNzdF9FeHBlY3RlZF9tYWNyb19nb3QiLCJtYWNyb19wYXJhbXMiLCJtIiwibWFjcm9fcmVzdF9wYXJhbSIsIm1hY3JvX2JvZHkiLCJtYWNyb19jbG9zdXJlIiwiY3N0X0V4cGVjdGVkX3RodW5rX2dvdCIsInRodW5rX2V4cHIiLCJ0aHVua19lbnYiLCJtYWtlX2RpY3QiLCJkaWN0X2dldCIsImtleSIsImRpY3RfaGFzIiwiZGljdF9zZXQiLCJkaWN0X2RlbGV0ZSIsImRpY3Rfa2V5cyIsImFjYyIsImRpY3RfdmFscyIsImNzdF9jaGFycyIsImNzdCIsImNzdF9zX3MiLCJpbnNwZWN0IiwiYnVmIiwicGFpcnMiLCJ0YWciLCJjbCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxtQkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFB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LDJFQUlpRjtBQUFBO0FBQUEsT0FIcEY7QUFBQTtBQUFBLFdBQUFpQyxRQTVDSztBQUFBO0FBQUEsT0E2Q0E7QUFBQTtBQUFBLFdBQUFqRCxNQTdDQSxjQThDQTtBQUFBLDJEQUMrRTtBQUFBO0FBQUEsV0FBQXFJLEtBL0MvRSxVQUFBcEgsVUErQ0U7QUFBQSx1QkFBQThCLE1BQUEsWUFBQUEsTUFBMEQsY0FBQUEsTUFBMUQ7QUFBQSw2REFBNkU7QUFBQTtBQUFBO0FBQUEsU0F6QnJFO0FBQUEsU0FBbEI7QUFBQTtBQUFBLElBQWdELG9DQXlCdUM7QUFBQTtBQUFBLEdBbGZyQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRGI1RCIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjI1NTEyLCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6Ii5zeC5vYmpzL2pzb28vZGVmYXVsdC9zeC5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3dvcmtzcGFjZV9yb290L2xpYi9zeF9wcmltaXRpdmVzLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIEJ1aWx0LWluIHByaW1pdGl2ZSBmdW5jdGlvbnMgKH44MCBwdXJlIGZ1bmN0aW9ucykuXG5cbiAgICBSZWdpc3RlcmVkIGluIGEgZ2xvYmFsIHRhYmxlOyB0aGUgZXZhbHVhdG9yIGNoZWNrcyB0aGlzIHRhYmxlXG4gICAgd2hlbiBhIHN5bWJvbCBpc24ndCBmb3VuZCBpbiB0aGUgbGV4aWNhbCBlbnZpcm9ubWVudC4gKilcblxub3BlbiBTeF90eXBlc1xuXG5sZXQgcHJpbWl0aXZlcyA6IChzdHJpbmcsIHZhbHVlIGxpc3QgLT4gdmFsdWUpIEhhc2h0YmwudCA9IEhhc2h0YmwuY3JlYXRlIDEyOFxuXG4oKiogRm9yd2FyZCByZWZzIGZvciBjYWxsaW5nIFNYIGZ1bmN0aW9ucyBmcm9tIHByaW1pdGl2ZXMgKGJyZWFrcyBjeWNsZSkuICopXG5sZXQgX3N4X2NhbGxfZm4gOiAodmFsdWUgLT4gdmFsdWUgbGlzdCAtPiB2YWx1ZSkgcmVmID1cbiAgcmVmIChmdW4gXyBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3hfY2FsbCBub3QgaW5pdGlhbGl6ZWRcIikpXG5sZXQgX3N4X3RyYW1wb2xpbmVfZm4gOiAodmFsdWUgLT4gdmFsdWUpIHJlZiA9XG4gIHJlZiAoZnVuIHYgLT4gdilcblxubGV0IHJlZ2lzdGVyIG5hbWUgZm4gPSBIYXNodGJsLnJlcGxhY2UgcHJpbWl0aXZlcyBuYW1lIGZuXG5cbmxldCBpc19wcmltaXRpdmUgbmFtZSA9IEhhc2h0YmwubWVtIHByaW1pdGl2ZXMgbmFtZVxuXG5sZXQgZ2V0X3ByaW1pdGl2ZSBuYW1lID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBwcmltaXRpdmVzIG5hbWUgd2l0aFxuICB8IFNvbWUgZm4gLT4gTmF0aXZlRm4gKG5hbWUsIGZuKVxuICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5rbm93biBwcmltaXRpdmU6IFwiIF4gbmFtZSkpXG5cbigqIC0tLSBIZWxwZXJzIC0tLSAqKVxuXG4oKiBUcmFtcG9saW5lIGhvb2sg4oCUIHNldCBieSBzeF9yZWYgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJlYWsgY2lyY3VsYXIgZGVwICopXG5sZXQgdHJhbXBvbGluZV9ob29rIDogKHZhbHVlIC0+IHZhbHVlKSByZWYgPSByZWYgKGZ1biB2IC0+IHYpXG5cbmxldCByZWMgYXNfbnVtYmVyID0gZnVuY3Rpb25cbiAgfCBOdW1iZXIgbiAtPiBuXG4gIHwgQm9vbCB0cnVlIC0+IDEuMFxuICB8IEJvb2wgZmFsc2UgLT4gMC4wXG4gIHwgTmlsIC0+IDAuMFxuICB8IFN0cmluZyBzIC0+IChtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IHMgd2l0aCBTb21lIG4gLT4gbiB8IE5vbmUgLT4gRmxvYXQubmFuKVxuICB8IFRodW5rIF8gYXMgdCAtPlxuICAgICgqIFRyYW1wb2xpbmUgdGh1bmtzIOKAlCB0aGV5IHNob3VsZG4ndCBsZWFrIGJ1dCBzb21ldGltZXMgZG8gKilcbiAgICBhc19udW1iZXIgKCF0cmFtcG9saW5lX2hvb2sgdClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIG51bWJlciwgZ290IFwiIF4gdHlwZV9vZiB2IF4gXCI6IFwiIF4gKG1hdGNoIHYgd2l0aCBEaWN0IGQgLT4gKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcIl9fc2lnbmFsXCIgd2l0aCBTb21lIF8gLT4gXCJzaWduYWx7dmFsdWU9XCIgXiAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwidmFsdWVcIiB3aXRoIFNvbWUgdicgLT4gdmFsdWVfdG9fc3RyaW5nIHYnIHwgTm9uZSAtPiBcIj9cIikgXiBcIn1cIiB8IE5vbmUgLT4gXCJkaWN0XCIpIHwgXyAtPiBcIlwiKSkpXG5cbmxldCBhc19zdHJpbmcgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIHN0cmluZywgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxubGV0IHJlYyBhc19saXN0ID0gZnVuY3Rpb25cbiAgfCBMaXN0IGwgLT4gbFxuICB8IExpc3RSZWYgciAtPiAhclxuICB8IE5pbCAtPiBbXVxuICB8IFRodW5rIF8gYXMgdCAtPiBhc19saXN0ICghX3N4X3RyYW1wb2xpbmVfZm4gdClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGxpc3QsIGdvdCBcIiBeIHR5cGVfb2YgdikpXG5cbmxldCBhc19ib29sID0gZnVuY3Rpb25cbiAgfCBCb29sIGIgLT4gYlxuICB8IHYgLT4gc3hfdHJ1dGh5IHZcblxubGV0IHJlYyB0b19zdHJpbmcgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE5pbCAtPiBcIlwiXG4gIHwgU3ltYm9sIHMgLT4gc1xuICB8IEtleXdvcmQgayAtPiBrXG4gIHwgVGh1bmsgXyBhcyB0IC0+IHRvX3N0cmluZyAoIXRyYW1wb2xpbmVfaG9vayB0KVxuICB8IHYgLT4gaW5zcGVjdCB2XG5cbmxldCAoKSA9XG4gICgqID09PSBBcml0aG1ldGljID09PSAqKVxuICByZWdpc3RlciBcIitcIiAoZnVuIGFyZ3MgLT5cbiAgICBOdW1iZXIgKExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIGEgLT4gYWNjICsuIGFzX251bWJlciBhKSAwLjAgYXJncykpO1xuICByZWdpc3RlciBcIi1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtdIC0+IE51bWJlciAwLjBcbiAgICB8IFthXSAtPiBOdW1iZXIgKC0uIChhc19udW1iZXIgYSkpXG4gICAgfCBhIDo6IHJlc3QgLT4gTnVtYmVyIChMaXN0LmZvbGRfbGVmdCAoZnVuIGFjYyB4IC0+IGFjYyAtLiBhc19udW1iZXIgeCkgKGFzX251bWJlciBhKSByZXN0KSk7XG4gIHJlZ2lzdGVyIFwiKlwiIChmdW4gYXJncyAtPlxuICAgIE51bWJlciAoTGlzdC5mb2xkX2xlZnQgKGZ1biBhY2MgYSAtPiBhY2MgKi4gYXNfbnVtYmVyIGEpIDEuMCBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwiL1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+IE51bWJlciAoYXNfbnVtYmVyIGEgLy4gYXNfbnVtYmVyIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiLzogZXhwZWN0ZWQgMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJtb2RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFthOyBiXSAtPiBOdW1iZXIgKEZsb2F0LnJlbSAoYXNfbnVtYmVyIGEpIChhc19udW1iZXIgYikpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibW9kOiBleHBlY3RlZCAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImluY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChhc19udW1iZXIgYSArLiAxLjApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImluYzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImRlY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChhc19udW1iZXIgYSAtLiAxLjApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRlYzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImFic1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gTnVtYmVyIChGbG9hdC5hYnMgKGFzX251bWJlciBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYWJzOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZmxvb3JcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoZmxvb3IgKGFzX251bWJlciBhKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmbG9vcjogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImNlaWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoY2VpbCAoYXNfbnVtYmVyIGEpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlaWw6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJyb3VuZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2FdIC0+IE51bWJlciAoRmxvYXQucm91bmQgKGFzX251bWJlciBhKSlcbiAgICB8IFthOyBiXSAtPlxuICAgICAgbGV0IG4gPSBhc19udW1iZXIgYSBhbmQgcGxhY2VzID0gaW50X29mX2Zsb2F0IChhc19udW1iZXIgYikgaW5cbiAgICAgIGxldCBmYWN0b3IgPSAxMC4wICoqIGZsb2F0X29mX2ludCBwbGFjZXMgaW5cbiAgICAgIE51bWJlciAoRmxvYXQucm91bmQgKG4gKi4gZmFjdG9yKSAvLiBmYWN0b3IpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicm91bmQ6IDEtMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJtaW5cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtdIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWluOiBhdCBsZWFzdCAxIGFyZ1wiKVxuICAgIHwgXyAtPiBOdW1iZXIgKExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIGEgLT4gRmxvYXQubWluIGFjYyAoYXNfbnVtYmVyIGEpKSBGbG9hdC5pbmZpbml0eSBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwibWF4XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbXSAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1heDogYXQgbGVhc3QgMSBhcmdcIilcbiAgICB8IF8gLT4gTnVtYmVyIChMaXN0LmZvbGRfbGVmdCAoZnVuIGFjYyBhIC0+IEZsb2F0Lm1heCBhY2MgKGFzX251bWJlciBhKSkgRmxvYXQubmVnX2luZmluaXR5IGFyZ3MpKTtcbiAgcmVnaXN0ZXIgXCJzcXJ0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBOdW1iZXIgKEZsb2F0LnNxcnQgKGFzX251bWJlciBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3FydDogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInBvd1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYTsgYl0gLT4gTnVtYmVyIChhc19udW1iZXIgYSAqKiBhc19udW1iZXIgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJwb3c6IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiY2xhbXBcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFt4OyBsbzsgaGldIC0+XG4gICAgICBsZXQgeCA9IGFzX251bWJlciB4IGFuZCBsbyA9IGFzX251bWJlciBsbyBhbmQgaGkgPSBhc19udW1iZXIgaGkgaW5cbiAgICAgIE51bWJlciAoRmxvYXQubWF4IGxvIChGbG9hdC5taW4gaGkgeCkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2xhbXA6IDMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwicGFyc2UtaW50XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IChtYXRjaCBpbnRfb2Zfc3RyaW5nX29wdCBzIHdpdGggU29tZSBuIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IG4pIHwgTm9uZSAtPiBOaWwpXG4gICAgfCBbU3RyaW5nIHM7IGRlZmF1bHRfdmFsXSAtPlxuICAgICAgKG1hdGNoIGludF9vZl9zdHJpbmdfb3B0IHMgd2l0aCBTb21lIG4gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgbikgfCBOb25lIC0+IGRlZmF1bHRfdmFsKVxuICAgIHwgW051bWJlciBuXSB8IFtOdW1iZXIgbjsgX10gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKGludF9vZl9mbG9hdCBuKSlcbiAgICB8IFtfOyBkZWZhdWx0X3ZhbF0gLT4gZGVmYXVsdF92YWxcbiAgICB8IF8gLT4gTmlsKTtcbiAgcmVnaXN0ZXIgXCJwYXJzZS1mbG9hdFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzXSAtPiAobWF0Y2ggZmxvYXRfb2Zfc3RyaW5nX29wdCBzIHdpdGggU29tZSBuIC0+IE51bWJlciBuIHwgTm9uZSAtPiBOaWwpXG4gICAgfCBbTnVtYmVyIG5dIC0+IE51bWJlciBuXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgKCogPT09IENvbXBhcmlzb24gPT09ICopXG4gICgqIFNhZmUgZXF1YWxpdHk6IHBoeXNpY2FsIGVxdWFsaXR5IGZvciBwb3RlbnRpYWxseS1jaXJjdWxhciB0eXBlc1xuICAgICAoRGljdCwgTGFtYmRhLCBDb21wb25lbnQsIElzbGFuZCwgU2lnbmFsLCBOYXRpdmVGbiksXG4gICAgIHN0cnVjdHVyYWwgZXF1YWxpdHkgZm9yIGFjeWNsaWMgdHlwZXMgKE51bWJlciwgU3RyaW5nLCBCb29sLCBldGMuKS5cbiAgICAgTGlzdHMgYXJlIGNvbXBhcmVkIGVsZW1lbnQtd2lzZSByZWN1cnNpdmVseSB3aXRoIHRoZSBzYW1lIHNhZmV0eS4gKilcbiAgbGV0IHJlYyBzYWZlX2VxIGEgYiA9XG4gICAgaWYgYSA9PSBiIHRoZW4gdHJ1ZSAgKCogcGh5c2ljYWwgZXF1YWxpdHkgZmFzdCBwYXRoICopXG4gICAgZWxzZSBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IE51bWJlciB4LCBOdW1iZXIgeSAtPiB4ID0geVxuICAgIHwgU3RyaW5nIHgsIFN0cmluZyB5IC0+IHggPSB5XG4gICAgfCBCb29sIHgsIEJvb2wgeSAtPiB4ID0geVxuICAgIHwgTmlsLCBOaWwgLT4gdHJ1ZVxuICAgIHwgU3ltYm9sIHgsIFN5bWJvbCB5IC0+IHggPSB5XG4gICAgfCBLZXl3b3JkIHgsIEtleXdvcmQgeSAtPiB4ID0geVxuICAgIHwgKExpc3QgbGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYSB9KSxcbiAgICAgIChMaXN0IGxiIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbGIgfSkgLT5cbiAgICAgIExpc3QubGVuZ3RoIGxhID0gTGlzdC5sZW5ndGggbGIgJiZcbiAgICAgIExpc3QuZm9yX2FsbDIgc2FmZV9lcSBsYSBsYlxuICAgICgqIERpY3Q6IGNoZWNrIF9faG9zdF9oYW5kbGUgZm9yIERPTSBub2RlIGlkZW50aXR5ICopXG4gICAgfCBEaWN0IGEsIERpY3QgYiAtPlxuICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgYSBcIl9faG9zdF9oYW5kbGVcIiwgSGFzaHRibC5maW5kX29wdCBiIFwiX19ob3N0X2hhbmRsZVwiIHdpdGhcbiAgICAgICB8IFNvbWUgKE51bWJlciBoYSksIFNvbWUgKE51bWJlciBoYikgLT4gaGEgPSBoYlxuICAgICAgIHwgXyAtPiBmYWxzZSlcbiAgICAoKiBMYW1iZGEvQ29tcG9uZW50L0lzbGFuZC9TaWduYWwvTmF0aXZlRm46IHBoeXNpY2FsIG9ubHkgKilcbiAgICB8IF8gLT4gZmFsc2VcbiAgaW5cbiAgcmVnaXN0ZXIgXCI9XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbYTsgYl0gLT4gQm9vbCAoc2FmZV9lcSBhIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiPTogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCIhPVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKG5vdCAoc2FmZV9lcSBhIGIpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIiE9OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIjxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgYTsgU3RyaW5nIGJdIC0+IEJvb2wgKGEgPCBiKVxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKGFzX251bWJlciBhIDwgYXNfbnVtYmVyIGIpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiPDogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCI+XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIGE7IFN0cmluZyBiXSAtPiBCb29sIChhID4gYilcbiAgICB8IFthOyBiXSAtPiBCb29sIChhc19udW1iZXIgYSA+IGFzX251bWJlciBiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIj46IDIgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiPD1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgYTsgU3RyaW5nIGJdIC0+IEJvb2wgKGEgPD0gYilcbiAgICB8IFthOyBiXSAtPiBCb29sIChhc19udW1iZXIgYSA8PSBhc19udW1iZXIgYilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCI8PTogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCI+PVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBhOyBTdHJpbmcgYl0gLT4gQm9vbCAoYSA+PSBiKVxuICAgIHwgW2E7IGJdIC0+IEJvb2wgKGFzX251bWJlciBhID49IGFzX251bWJlciBiKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIj49OiAyIGFyZ3NcIikpO1xuXG4gICgqID09PSBMb2dpYyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJub3RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IEJvb2wgKG5vdCAoc3hfdHJ1dGh5IGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJub3Q6IDEgYXJnXCIpKTtcblxuICAoKiA9PT0gUHJlZGljYXRlcyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJuaWw/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBCb29sIChpc19uaWwgYSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibmlsPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcIm51bWJlcj9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW051bWJlciBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJudW1iZXI/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic3RyaW5nP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIF9dIC0+IEJvb2wgdHJ1ZSB8IFtfXSAtPiBCb29sIGZhbHNlIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN0cmluZz86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJib29sZWFuP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQm9vbCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJib29sZWFuPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcImxpc3Q/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtMaXN0IF9dIHwgW0xpc3RSZWYgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2UgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibGlzdD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJkaWN0P1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbRGljdCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0PzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInN5bWJvbD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N5bWJvbCBfXSAtPiBCb29sIHRydWUgfCBbX10gLT4gQm9vbCBmYWxzZSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzeW1ib2w/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwia2V5d29yZD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0tleXdvcmQgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2UgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwia2V5d29yZD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJlbXB0eT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IFtdXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBbXSB9XSAtPiBCb29sIHRydWVcbiAgICB8IFtMaXN0IF9dIHwgW0xpc3RSZWYgX10gLT4gQm9vbCBmYWxzZVxuICAgIHwgW1N0cmluZyBcIlwiXSAtPiBCb29sIHRydWUgfCBbU3RyaW5nIF9dIC0+IEJvb2wgZmFsc2VcbiAgICB8IFtEaWN0IGRdIC0+IEJvb2wgKEhhc2h0YmwubGVuZ3RoIGQgPSAwKVxuICAgIHwgW05pbF0gLT4gQm9vbCB0cnVlXG4gICAgfCBbX10gLT4gQm9vbCBmYWxzZVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVtcHR5PzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcIm9kZD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IEJvb2wgKGludF9vZl9mbG9hdCAoYXNfbnVtYmVyIGEpIG1vZCAyIDw+IDApIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm9kZD86IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJldmVuP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gQm9vbCAoaW50X29mX2Zsb2F0IChhc19udW1iZXIgYSkgbW9kIDIgPSAwKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJldmVuPzogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInplcm8/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBCb29sIChhc19udW1iZXIgYSA9IDAuMCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiemVybz86IDEgYXJnXCIpKTtcblxuICAoKiA9PT0gU3RyaW5ncyA9PT0gKilcbiAgcmVnaXN0ZXIgXCJzdHJcIiAoZnVuIGFyZ3MgLT4gU3RyaW5nIChTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIHRvX3N0cmluZyBhcmdzKSkpO1xuICByZWdpc3RlciBcInVwcGVyXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBTdHJpbmcgKFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGFzX3N0cmluZyBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidXBwZXI6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJ1cGNhc2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLnVwcGVyY2FzZV9hc2NpaSAoYXNfc3RyaW5nIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ1cGNhc2U6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJsb3dlclwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nIChTdHJpbmcubG93ZXJjYXNlX2FzY2lpIChhc19zdHJpbmcgYSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImxvd2VyOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZG93bmNhc2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSAoYXNfc3RyaW5nIGEpKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkb3duY2FzZTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInRyaW1cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IFN0cmluZyAoU3RyaW5nLnRyaW0gKGFzX3N0cmluZyBhKSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidHJpbTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInN0cmluZy1sZW5ndGhcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2FdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChTdHJpbmcubGVuZ3RoIChhc19zdHJpbmcgYSkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN0cmluZy1sZW5ndGg6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdHJpbmctY29udGFpbnM/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIGhheXN0YWNrOyBTdHJpbmcgbmVlZGxlXSAtPlxuICAgICAgbGV0IHJlYyBmaW5kIGkgPVxuICAgICAgICBpZiBpICsgU3RyaW5nLmxlbmd0aCBuZWVkbGUgPiBTdHJpbmcubGVuZ3RoIGhheXN0YWNrIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBpZiBTdHJpbmcuc3ViIGhheXN0YWNrIGkgKFN0cmluZy5sZW5ndGggbmVlZGxlKSA9IG5lZWRsZSB0aGVuIHRydWVcbiAgICAgICAgZWxzZSBmaW5kIChpICsgMSlcbiAgICAgIGluIEJvb2wgKGZpbmQgMClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzdHJpbmctY29udGFpbnM/OiAyIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdGFydHMtd2l0aD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHByZWZpeF0gLT5cbiAgICAgIEJvb2wgKFN0cmluZy5sZW5ndGggcyA+PSBTdHJpbmcubGVuZ3RoIHByZWZpeCAmJlxuICAgICAgICAgICAgU3RyaW5nLnN1YiBzIDAgKFN0cmluZy5sZW5ndGggcHJlZml4KSA9IHByZWZpeClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzdGFydHMtd2l0aD86IDIgc3RyaW5nIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImVuZHMtd2l0aD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHN1ZmZpeF0gLT5cbiAgICAgIGxldCBzbCA9IFN0cmluZy5sZW5ndGggcyBhbmQgeGwgPSBTdHJpbmcubGVuZ3RoIHN1ZmZpeCBpblxuICAgICAgQm9vbCAoc2wgPj0geGwgJiYgU3RyaW5nLnN1YiBzIChzbCAtIHhsKSB4bCA9IHN1ZmZpeClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJlbmRzLXdpdGg/OiAyIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJpbmRleC1vZlwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBoYXlzdGFjazsgU3RyaW5nIG5lZWRsZV0gLT5cbiAgICAgIGxldCBubCA9IFN0cmluZy5sZW5ndGggbmVlZGxlIGFuZCBobCA9IFN0cmluZy5sZW5ndGggaGF5c3RhY2sgaW5cbiAgICAgIGxldCByZWMgZmluZCBpID1cbiAgICAgICAgaWYgaSArIG5sID4gaGwgdGhlbiBOdW1iZXIgKC0xLjApXG4gICAgICAgIGVsc2UgaWYgU3RyaW5nLnN1YiBoYXlzdGFjayBpIG5sID0gbmVlZGxlIHRoZW4gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSlcbiAgICAgICAgZWxzZSBmaW5kIChpICsgMSlcbiAgICAgIGluIGZpbmQgMFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImluZGV4LW9mOiAyIHN0cmluZyBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJzdWJzdHJpbmdcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0OyBOdW1iZXIgZW5kX10gLT5cbiAgICAgIGxldCBpID0gaW50X29mX2Zsb2F0IHN0YXJ0IGFuZCBqID0gaW50X29mX2Zsb2F0IGVuZF8gaW5cbiAgICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgICAgIGxldCBpID0gbWF4IDAgKG1pbiBpIGxlbikgYW5kIGogPSBtYXggMCAobWluIGogbGVuKSBpblxuICAgICAgU3RyaW5nIChTdHJpbmcuc3ViIHMgaSAobWF4IDAgKGogLSBpKSkpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3Vic3RyaW5nOiAzIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInN1YnN0clwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzOyBOdW1iZXIgc3RhcnQ7IE51bWJlciBsZW5dIC0+XG4gICAgICBsZXQgaSA9IGludF9vZl9mbG9hdCBzdGFydCBhbmQgbiA9IGludF9vZl9mbG9hdCBsZW4gaW5cbiAgICAgIGxldCBzbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgICAgbGV0IGkgPSBtYXggMCAobWluIGkgc2wpIGluXG4gICAgICBsZXQgbiA9IG1heCAwIChtaW4gbiAoc2wgLSBpKSkgaW5cbiAgICAgIFN0cmluZyAoU3RyaW5nLnN1YiBzIGkgbilcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0XSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgc3RhcnQgaW5cbiAgICAgIGxldCBzbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgICAgbGV0IGkgPSBtYXggMCAobWluIGkgc2wpIGluXG4gICAgICBTdHJpbmcgKFN0cmluZy5zdWIgcyBpIChzbCAtIGkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN1YnN0cjogMi0zIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInNwbGl0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHM7IFN0cmluZyBzZXBdIC0+XG4gICAgICBMaXN0IChMaXN0Lm1hcCAoZnVuIHAgLT4gU3RyaW5nIHApIChTdHJpbmcuc3BsaXRfb25fY2hhciBzZXAuWzBdIHMpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNwbGl0OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcImpvaW5cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgc2VwOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgU3RyaW5nIChTdHJpbmcuY29uY2F0IHNlcCAoTGlzdC5tYXAgdG9fc3RyaW5nIGl0ZW1zKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJqb2luOiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInJlcGxhY2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBsZXQgdG9fc3RyID0gZnVuY3Rpb25cbiAgICAgIHwgU3RyaW5nIHMgLT4gcyB8IFN4RXhwciBzIC0+IHMgfCBSYXdIVE1MIHMgLT4gc1xuICAgICAgfCBLZXl3b3JkIGsgLT4gayB8IFN5bWJvbCBzIC0+IHNcbiAgICAgIHwgTmlsIC0+IFwiXCIgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCIgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICAgICAgfCBOdW1iZXIgbiAtPiBpZiBGbG9hdC5pc19pbnRlZ2VyIG4gdGhlbiBzdHJpbmdfb2ZfaW50IChpbnRfb2ZfZmxvYXQgbikgZWxzZSBQcmludGYuc3ByaW50ZiBcIiVnXCIgblxuICAgICAgfCBUaHVuayBfIGFzIHQgLT4gKG1hdGNoICFfc3hfdHJhbXBvbGluZV9mbiB0IHdpdGggU3RyaW5nIHMgLT4gcyB8IHYgLT4gdG9fc3RyaW5nIHYpXG4gICAgICB8IHYgLT4gdG9fc3RyaW5nIHZcbiAgICBpblxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3M7IG9sZF9zOyBuZXdfc10gLT5cbiAgICAgIGxldCBzID0gdG9fc3RyIHMgYW5kIG9sZF9zID0gdG9fc3RyIG9sZF9zIGFuZCBuZXdfcyA9IHRvX3N0ciBuZXdfcyBpblxuICAgICAgbGV0IG9sID0gU3RyaW5nLmxlbmd0aCBvbGRfcyBpblxuICAgICAgaWYgb2wgPSAwIHRoZW4gU3RyaW5nIHNcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgKFN0cmluZy5sZW5ndGggcykgaW5cbiAgICAgICAgbGV0IHJlYyBnbyBpID1cbiAgICAgICAgICBpZiBpID49IFN0cmluZy5sZW5ndGggcyB0aGVuICgpXG4gICAgICAgICAgZWxzZSBpZiBpICsgb2wgPD0gU3RyaW5nLmxlbmd0aCBzICYmIFN0cmluZy5zdWIgcyBpIG9sID0gb2xkX3MgdGhlbiBiZWdpblxuICAgICAgICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIG5ld19zO1xuICAgICAgICAgICAgZ28gKGkgKyBvbClcbiAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBzLltpXTtcbiAgICAgICAgICAgIGdvIChpICsgMSlcbiAgICAgICAgICBlbmRcbiAgICAgICAgaW4gZ28gMDtcbiAgICAgICAgU3RyaW5nIChCdWZmZXIuY29udGVudHMgYnVmKVxuICAgICAgZW5kXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmVwbGFjZTogMyBzdHJpbmcgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwiY2hhci1mcm9tLWNvZGVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtOdW1iZXIgbl0gLT5cbiAgICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDQgaW5cbiAgICAgIEJ1ZmZlci5hZGRfdXRmXzhfdWNoYXIgYnVmIChVY2hhci5vZl9pbnQgKGludF9vZl9mbG9hdCBuKSk7XG4gICAgICBTdHJpbmcgKEJ1ZmZlci5jb250ZW50cyBidWYpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2hhci1mcm9tLWNvZGU6IDEgYXJnXCIpKTtcblxuICAoKiA9PT0gQ29sbGVjdGlvbnMgPT09ICopXG4gIHJlZ2lzdGVyIFwibGlzdFwiIChmdW4gYXJncyAtPiBMaXN0UmVmIChyZWYgYXJncykpO1xuICByZWdpc3RlciBcImxlblwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggbCkpXG4gICAgfCBbU3RyaW5nIHNdIC0+IE51bWJlciAoZmxvYXRfb2ZfaW50IChTdHJpbmcubGVuZ3RoIHMpKVxuICAgIHwgW0RpY3QgZF0gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKEhhc2h0YmwubGVuZ3RoIGQpKVxuICAgIHwgW05pbF0gfCBbQm9vbCBmYWxzZV0gLT4gTnVtYmVyIDAuMFxuICAgIHwgW0Jvb2wgdHJ1ZV0gLT4gTnVtYmVyIDEuMFxuICAgIHwgW051bWJlciBfXSAtPiBOdW1iZXIgMS4wXG4gICAgfCBbUmF3SFRNTCBzXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoU3RyaW5nLmxlbmd0aCBzKSlcbiAgICB8IFtTeEV4cHIgc10gLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKFN0cmluZy5sZW5ndGggcykpXG4gICAgfCBbU3ByZWFkIHBhaXJzXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggcGFpcnMpKVxuICAgIHwgW0NvbXBvbmVudCBfXSB8IFtJc2xhbmQgX10gfCBbTGFtYmRhIF9dIHwgW05hdGl2ZUZuIF9dXG4gICAgfCBbTWFjcm8gX10gfCBbVGh1bmsgX10gfCBbS2V5d29yZCBfXSB8IFtTeW1ib2wgX10gLT4gTnVtYmVyIDAuMFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoUHJpbnRmLnNwcmludGYgXCJsZW46ICVkIGFyZ3NcIlxuICAgICAgICAoTGlzdC5sZW5ndGggYXJncykpKSk7XG4gIHJlZ2lzdGVyIFwiZmlyc3RcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0ICh4IDo6IF8pXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSB4IDo6IF8gfV0gLT4geFxuICAgIHwgW0xpc3QgW11dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IFtdIH1dIC0+IE5pbCB8IFtOaWxdIC0+IE5pbFxuICAgIHwgW3hdIC0+IHJhaXNlIChFdmFsX2Vycm9yIChcImZpcnN0OiBleHBlY3RlZCBsaXN0LCBnb3QgXCIgXiBpbnNwZWN0IHgpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImZpcnN0OiAxIGxpc3QgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJyZXN0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCAoXyA6OiB4cyldIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IF8gOjogeHMgfV0gLT4gTGlzdCB4c1xuICAgIHwgW0xpc3QgW11dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IFtdIH1dIC0+IExpc3QgW10gfCBbTmlsXSAtPiBMaXN0IFtdXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicmVzdDogMSBsaXN0IGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibGFzdFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPlxuICAgICAgKG1hdGNoIExpc3QucmV2IGwgd2l0aCB4IDo6IF8gLT4geCB8IFtdIC0+IE5pbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJsYXN0OiAxIGxpc3QgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJpbml0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH1dIC0+XG4gICAgICAobWF0Y2ggTGlzdC5yZXYgbCB3aXRoIF8gOjogcmVzdCAtPiBMaXN0IChMaXN0LnJldiByZXN0KSB8IFtdIC0+IExpc3QgW10pXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaW5pdDogMSBsaXN0IGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwibnRoXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsOyBOdW1iZXIgbl0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9OyBOdW1iZXIgbl0gLT5cbiAgICAgICh0cnkgTGlzdC5udGggbCAoaW50X29mX2Zsb2F0IG4pIHdpdGggXyAtPiBOaWwpXG4gICAgfCBbU3RyaW5nIHM7IE51bWJlciBuXSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgaWYgaSA+PSAwICYmIGkgPCBTdHJpbmcubGVuZ3RoIHMgdGhlbiBTdHJpbmcgKFN0cmluZy5tYWtlIDEgcy5baV0pXG4gICAgICBlbHNlIE5pbFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm50aDogbGlzdC9zdHJpbmcgYW5kIG51bWJlclwiKSk7XG4gIHJlZ2lzdGVyIFwiY29uc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3g7IExpc3QgbF0gfCBbeDsgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBMaXN0ICh4IDo6IGwpXG4gICAgfCBbeDsgTmlsXSAtPiBMaXN0IFt4XVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNvbnM6IHZhbHVlIGFuZCBsaXN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJhcHBlbmRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxhIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbGEgfTsgTGlzdCBsYiB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxiIH1dIC0+XG4gICAgICBMaXN0IChsYSBAIGxiKVxuICAgIHwgW0xpc3QgbGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYSB9OyBOaWxdIC0+IExpc3QgbGFcbiAgICB8IFtOaWw7IExpc3QgbGIgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYiB9XSAtPiBMaXN0IGxiXG4gICAgfCBbTGlzdCBsYSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGxhIH07IHZdIC0+IExpc3QgKGxhIEAgW3ZdKVxuICAgIHwgW3Y7IExpc3QgbGIgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsYiB9XSAtPiBMaXN0IChbdl0gQCBsYilcbiAgICB8IF8gLT5cbiAgICAgIGxldCBhbGwgPSBMaXN0LmNvbmNhdF9tYXAgYXNfbGlzdCBhcmdzIGluXG4gICAgICBMaXN0IGFsbCk7XG4gIHJlZ2lzdGVyIFwicmV2ZXJzZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3QgbF0gfCBbTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9XSAtPiBMaXN0IChMaXN0LnJldiBsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInJldmVyc2U6IDEgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwiZmxhdHRlblwiIChmdW4gYXJncyAtPlxuICAgIGxldCByZWMgZmxhdCA9IGZ1bmN0aW9uXG4gICAgICB8IExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9IC0+IExpc3QuY29uY2F0X21hcCBmbGF0IGl0ZW1zXG4gICAgICB8IHggLT4gW3hdXG4gICAgaW5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxdIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfV0gLT4gTGlzdCAoTGlzdC5jb25jYXRfbWFwIGZsYXQgbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmbGF0dGVuOiAxIGxpc3RcIikpO1xuICByZWdpc3RlciBcImNvbmNhdFwiIChmdW4gYXJncyAtPiBMaXN0IChMaXN0LmNvbmNhdF9tYXAgYXNfbGlzdCBhcmdzKSk7XG4gIHJlZ2lzdGVyIFwiY29udGFpbnM/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdCBsOyBpdGVtXSB8IFtMaXN0UmVmIHsgY29udGVudHMgPSBsIH07IGl0ZW1dIC0+XG4gICAgICAoKiBQaHlzaWNhbCBlcXVhbGl0eSBmaXJzdCAoaGFuZGxlcyBzaWduYWxzL2RpY3RzL2Nsb3N1cmVzIHNhZmVseSksXG4gICAgICAgICBzdHJ1Y3R1cmFsIGZhbGxiYWNrIG9ubHkgZm9yIGFjeWNsaWMgdHlwZXMgKHN0cmluZy9udW1iZXIvYm9vbC9uaWwvc3ltYm9sL2tleXdvcmQpICopXG4gICAgICBsZXQgc2FmZV9lcSBhIGIgPVxuICAgICAgICBhID09IGIgfHxcbiAgICAgICAgKG1hdGNoIGEsIGIgd2l0aFxuICAgICAgICAgfCBOdW1iZXIgeCwgTnVtYmVyIHkgLT4geCA9IHlcbiAgICAgICAgIHwgU3RyaW5nIHgsIFN0cmluZyB5IC0+IHggPSB5XG4gICAgICAgICB8IEJvb2wgeCwgQm9vbCB5IC0+IHggPSB5XG4gICAgICAgICB8IE5pbCwgTmlsIC0+IHRydWVcbiAgICAgICAgIHwgU3ltYm9sIHgsIFN5bWJvbCB5IC0+IHggPSB5XG4gICAgICAgICB8IEtleXdvcmQgeCwgS2V5d29yZCB5IC0+IHggPSB5XG4gICAgICAgICB8IERpY3QgYSwgRGljdCBiIC0+XG4gICAgICAgICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGEgXCJfX2hvc3RfaGFuZGxlXCIsIEhhc2h0YmwuZmluZF9vcHQgYiBcIl9faG9zdF9oYW5kbGVcIiB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgKE51bWJlciBoYSksIFNvbWUgKE51bWJlciBoYikgLT4gaGEgPSBoYlxuICAgICAgICAgICAgfCBfIC0+IGZhbHNlKVxuICAgICAgICAgfCBfIC0+IGZhbHNlKVxuICAgICAgaW5cbiAgICAgIEJvb2wgKExpc3QuZXhpc3RzIChmdW4geCAtPiBzYWZlX2VxIHggaXRlbSkgbClcbiAgICB8IFtTdHJpbmcgczsgU3RyaW5nIHN1Yl0gLT5cbiAgICAgIGxldCByZWMgZmluZCBpID1cbiAgICAgICAgaWYgaSArIFN0cmluZy5sZW5ndGggc3ViID4gU3RyaW5nLmxlbmd0aCBzIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBpZiBTdHJpbmcuc3ViIHMgaSAoU3RyaW5nLmxlbmd0aCBzdWIpID0gc3ViIHRoZW4gdHJ1ZVxuICAgICAgICBlbHNlIGZpbmQgKGkgKyAxKVxuICAgICAgaW4gQm9vbCAoZmluZCAwKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNvbnRhaW5zPzogMiBhcmdzXCIpKTtcbiAgcmVnaXN0ZXIgXCJyYW5nZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW051bWJlciBzdG9wXSAtPlxuICAgICAgbGV0IG4gPSBpbnRfb2ZfZmxvYXQgc3RvcCBpblxuICAgICAgTGlzdCAoTGlzdC5pbml0IChtYXggMCBuKSAoZnVuIGkgLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSkpKVxuICAgIHwgW051bWJlciBzdGFydDsgTnVtYmVyIHN0b3BdIC0+XG4gICAgICBsZXQgcyA9IGludF9vZl9mbG9hdCBzdGFydCBhbmQgZSA9IGludF9vZl9mbG9hdCBzdG9wIGluXG4gICAgICBsZXQgbGVuID0gbWF4IDAgKGUgLSBzKSBpblxuICAgICAgTGlzdCAoTGlzdC5pbml0IGxlbiAoZnVuIGkgLT4gTnVtYmVyIChmbG9hdF9vZl9pbnQgKHMgKyBpKSkpKVxuICAgIHwgW051bWJlciBzdGFydDsgTnVtYmVyIHN0b3A7IE51bWJlciBzdGVwXSAtPlxuICAgICAgbGV0IHMgPSBzdGFydCBhbmQgZSA9IHN0b3AgYW5kIHN0ID0gc3RlcCBpblxuICAgICAgaWYgc3QgPSAwLjAgdGhlbiBMaXN0IFtdXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBpdGVtcyA9IHJlZiBbXSBpblxuICAgICAgICBsZXQgaSA9IHJlZiBzIGluXG4gICAgICAgIGlmIHN0ID4gMC4wIHRoZW5cbiAgICAgICAgICAod2hpbGUgIWkgPCBlIGRvIGl0ZW1zIDo9IE51bWJlciAhaSA6OiAhaXRlbXM7IGkgOj0gIWkgKy4gc3QgZG9uZSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICh3aGlsZSAhaSA+IGUgZG8gaXRlbXMgOj0gTnVtYmVyICFpIDo6ICFpdGVtczsgaSA6PSAhaSArLiBzdCBkb25lKTtcbiAgICAgICAgTGlzdCAoTGlzdC5yZXYgIWl0ZW1zKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInJhbmdlOiAxLTMgYXJnc1wiKSk7XG4gIHJlZ2lzdGVyIFwic2xpY2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFsoTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9KTsgTnVtYmVyIHN0YXJ0XSAtPlxuICAgICAgbGV0IGkgPSBtYXggMCAoaW50X29mX2Zsb2F0IHN0YXJ0KSBpblxuICAgICAgbGV0IHJlYyBkcm9wIG4gPSBmdW5jdGlvbiBfIDo6IHhzIHdoZW4gbiA+IDAgLT4gZHJvcCAobi0xKSB4cyB8IGwgLT4gbCBpblxuICAgICAgTGlzdCAoZHJvcCBpIGwpXG4gICAgfCBbKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSk7IE51bWJlciBzdGFydDsgTnVtYmVyIGVuZF9dIC0+XG4gICAgICBsZXQgaSA9IG1heCAwIChpbnRfb2ZfZmxvYXQgc3RhcnQpIGFuZCBqID0gaW50X29mX2Zsb2F0IGVuZF8gaW5cbiAgICAgIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCBsIGluXG4gICAgICBsZXQgaiA9IG1pbiBqIGxlbiBpblxuICAgICAgbGV0IHJlYyB0YWtlX3JhbmdlIGlkeCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgW10gLT4gW11cbiAgICAgICAgfCB4IDo6IHhzIC0+XG4gICAgICAgICAgaWYgaWR4ID49IGogdGhlbiBbXVxuICAgICAgICAgIGVsc2UgaWYgaWR4ID49IGkgdGhlbiB4IDo6IHRha2VfcmFuZ2UgKGlkeCsxKSB4c1xuICAgICAgICAgIGVsc2UgdGFrZV9yYW5nZSAoaWR4KzEpIHhzXG4gICAgICBpbiBMaXN0ICh0YWtlX3JhbmdlIDAgbClcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0XSAtPlxuICAgICAgbGV0IGkgPSBtYXggMCAoaW50X29mX2Zsb2F0IHN0YXJ0KSBpblxuICAgICAgU3RyaW5nIChTdHJpbmcuc3ViIHMgaSAobWF4IDAgKFN0cmluZy5sZW5ndGggcyAtIGkpKSlcbiAgICB8IFtTdHJpbmcgczsgTnVtYmVyIHN0YXJ0OyBOdW1iZXIgZW5kX10gLT5cbiAgICAgIGxldCBpID0gbWF4IDAgKGludF9vZl9mbG9hdCBzdGFydCkgYW5kIGogPSBpbnRfb2ZfZmxvYXQgZW5kXyBpblxuICAgICAgbGV0IHNsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gICAgICBsZXQgaiA9IG1pbiBqIHNsIGluXG4gICAgICBTdHJpbmcgKFN0cmluZy5zdWIgcyBpIChtYXggMCAoaiAtIGkpKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzbGljZTogMi0zIGFyZ3NcIikpO1xuICByZWdpc3RlciBcInNvcnRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGxdIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfV0gLT4gTGlzdCAoTGlzdC5zb3J0IGNvbXBhcmUgbClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzb3J0OiAxIGxpc3RcIikpO1xuICByZWdpc3RlciBcInppcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgbGEgPSBhc19saXN0IGEgYW5kIGxiID0gYXNfbGlzdCBiIGluXG4gICAgICBsZXQgcmVjIGdvIGwxIGwyIGFjYyA9IG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgICAgIHwgeCA6OiB4cywgeSA6OiB5cyAtPiBnbyB4cyB5cyAoTGlzdCBbeDsgeV0gOjogYWNjKVxuICAgICAgICB8IF8gLT4gTGlzdC5yZXYgYWNjXG4gICAgICBpbiBMaXN0IChnbyBsYSBsYiBbXSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ6aXA6IDIgbGlzdHNcIikpO1xuICByZWdpc3RlciBcInppcC1wYWlyc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3ZdIC0+XG4gICAgICBsZXQgbCA9IGFzX2xpc3QgdiBpblxuICAgICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgYSA6OiBiIDo6IHJlc3QgLT4gTGlzdCBbYTsgYl0gOjogZ28gcmVzdFxuICAgICAgICB8IF8gLT4gW11cbiAgICAgIGluIExpc3QgKGdvIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiemlwLXBhaXJzOiAxIGxpc3RcIikpO1xuICByZWdpc3RlciBcInRha2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFsoTGlzdCBsIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gbCB9KTsgTnVtYmVyIG5dIC0+XG4gICAgICBsZXQgcmVjIHRha2VfbiBpID0gZnVuY3Rpb25cbiAgICAgICAgfCB4IDo6IHhzIHdoZW4gaSA+IDAgLT4geCA6OiB0YWtlX24gKGktMSkgeHNcbiAgICAgICAgfCBfIC0+IFtdXG4gICAgICBpbiBMaXN0ICh0YWtlX24gKGludF9vZl9mbG9hdCBuKSBsKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInRha2U6IGxpc3QgYW5kIG51bWJlclwiKSk7XG4gIHJlZ2lzdGVyIFwiZHJvcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgWyhMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pOyBOdW1iZXIgbl0gLT5cbiAgICAgIGxldCByZWMgZHJvcF9uIGkgPSBmdW5jdGlvblxuICAgICAgICB8IF8gOjogeHMgd2hlbiBpID4gMCAtPiBkcm9wX24gKGktMSkgeHNcbiAgICAgICAgfCBsIC0+IGxcbiAgICAgIGluIExpc3QgKGRyb3BfbiAoaW50X29mX2Zsb2F0IG4pIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZHJvcDogbGlzdCBhbmQgbnVtYmVyXCIpKTtcbiAgcmVnaXN0ZXIgXCJjaHVuay1ldmVyeVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgWyhMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pOyBOdW1iZXIgbl0gLT5cbiAgICAgIGxldCBzaXplID0gaW50X29mX2Zsb2F0IG4gaW5cbiAgICAgIGxldCByZWMgZ28gPSBmdW5jdGlvblxuICAgICAgICB8IFtdIC0+IFtdXG4gICAgICAgIHwgbCAtPlxuICAgICAgICAgIGxldCByZWMgdGFrZV9uIGkgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCB4IDo6IHhzIHdoZW4gaSA+IDAgLT4geCA6OiB0YWtlX24gKGktMSkgeHNcbiAgICAgICAgICAgIHwgXyAtPiBbXVxuICAgICAgICAgIGluXG4gICAgICAgICAgbGV0IHJlYyBkcm9wX24gaSA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IF8gOjogeHMgd2hlbiBpID4gMCAtPiBkcm9wX24gKGktMSkgeHNcbiAgICAgICAgICAgIHwgbCAtPiBsXG4gICAgICAgICAgaW5cbiAgICAgICAgICBMaXN0ICh0YWtlX24gc2l6ZSBsKSA6OiBnbyAoZHJvcF9uIHNpemUgbClcbiAgICAgIGluIExpc3QgKGdvIGwpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2h1bmstZXZlcnk6IGxpc3QgYW5kIG51bWJlclwiKSk7XG4gIHJlZ2lzdGVyIFwidW5pcXVlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbKExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSldIC0+XG4gICAgICBsZXQgc2VlbiA9IEhhc2h0YmwuY3JlYXRlIDE2IGluXG4gICAgICBsZXQgcmVzdWx0ID0gTGlzdC5maWx0ZXIgKGZ1biB4IC0+XG4gICAgICAgIGxldCBrZXkgPSBpbnNwZWN0IHggaW5cbiAgICAgICAgaWYgSGFzaHRibC5tZW0gc2VlbiBrZXkgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIChIYXNodGJsLnJlcGxhY2Ugc2VlbiBrZXkgdHJ1ZTsgdHJ1ZSlcbiAgICAgICkgbCBpblxuICAgICAgTGlzdCByZXN1bHRcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ1bmlxdWU6IDEgbGlzdFwiKSk7XG5cbiAgKCogPT09IERpY3QgPT09ICopXG4gIHJlZ2lzdGVyIFwiZGljdFwiIChmdW4gYXJncyAtPlxuICAgIGxldCBkID0gbWFrZV9kaWN0ICgpIGluXG4gICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IERpY3QgZFxuICAgICAgfCBLZXl3b3JkIGsgOjogdiA6OiByZXN0IC0+IGRpY3Rfc2V0IGQgayB2OyBnbyByZXN0XG4gICAgICB8IFN0cmluZyBrIDo6IHYgOjogcmVzdCAtPiBkaWN0X3NldCBkIGsgdjsgZ28gcmVzdFxuICAgICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGljdDogcGFpcnMgb2Yga2V5IHZhbHVlXCIpXG4gICAgaW4gZ28gYXJncyk7XG4gIHJlZ2lzdGVyIFwiZ2V0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gZGljdF9nZXQgZCBrXG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGtdIC0+IGRpY3RfZ2V0IGQga1xuICAgIHwgW0xpc3QgbDsgTnVtYmVyIG5dIHwgW0xpc3RSZWYgeyBjb250ZW50cyA9IGwgfTsgTnVtYmVyIG5dIC0+XG4gICAgICAodHJ5IExpc3QubnRoIGwgKGludF9vZl9mbG9hdCBuKSB3aXRoIF8gLT4gTmlsKVxuICAgIHwgW05pbDsgX10gLT4gTmlsICAoKiBuaWwuYW55dGhpbmcg4oaSIG5pbCAqKVxuICAgIHwgW187IF9dIC0+IE5pbCAgICAoKiB0eXBlIG1pc21hdGNoIOKGkiBuaWwgKG1hdGNoZXMgSlMvUHl0aG9uIGJlaGF2aW9yKSAqKVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImhhcy1rZXk/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gQm9vbCAoZGljdF9oYXMgZCBrKVxuICAgIHwgW0RpY3QgZDsgS2V5d29yZCBrXSAtPiBCb29sIChkaWN0X2hhcyBkIGspXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaGFzLWtleT86IGRpY3QgYW5kIGtleVwiKSk7XG4gIHJlZ2lzdGVyIFwiYXNzb2NcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IERpY3QgZCA6OiByZXN0IC0+XG4gICAgICBsZXQgZDIgPSBIYXNodGJsLmNvcHkgZCBpblxuICAgICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgW10gLT4gRGljdCBkMlxuICAgICAgICB8IFN0cmluZyBrIDo6IHYgOjogcmVzdCAtPiBIYXNodGJsLnJlcGxhY2UgZDIgayB2OyBnbyByZXN0XG4gICAgICAgIHwgS2V5d29yZCBrIDo6IHYgOjogcmVzdCAtPiBIYXNodGJsLnJlcGxhY2UgZDIgayB2OyBnbyByZXN0XG4gICAgICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFzc29jOiBwYWlyc1wiKVxuICAgICAgaW4gZ28gcmVzdFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFzc29jOiBkaWN0ICsgcGFpcnNcIikpO1xuICByZWdpc3RlciBcImRpc3NvY1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgRGljdCBkIDo6IGtleXMgLT5cbiAgICAgIGxldCBkMiA9IEhhc2h0YmwuY29weSBkIGluXG4gICAgICBMaXN0Lml0ZXIgKGZ1biBrIC0+IEhhc2h0YmwucmVtb3ZlIGQyICh0b19zdHJpbmcgaykpIGtleXM7XG4gICAgICBEaWN0IGQyXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGlzc29jOiBkaWN0ICsga2V5c1wiKSk7XG4gIHJlZ2lzdGVyIFwibWVyZ2VcIiAoZnVuIGFyZ3MgLT5cbiAgICBsZXQgZCA9IG1ha2VfZGljdCAoKSBpblxuICAgIExpc3QuaXRlciAoZnVuY3Rpb25cbiAgICAgIHwgRGljdCBzcmMgLT4gSGFzaHRibC5pdGVyIChmdW4gayB2IC0+IEhhc2h0YmwucmVwbGFjZSBkIGsgdikgc3JjXG4gICAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtZXJnZTogYWxsIGFyZ3MgbXVzdCBiZSBkaWN0c1wiKVxuICAgICkgYXJncztcbiAgICBEaWN0IGQpO1xuICByZWdpc3RlciBcImtleXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0RpY3QgZF0gLT4gTGlzdCAoZGljdF9rZXlzIGQpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImtleXM6IDEgZGljdFwiKSk7XG4gIHJlZ2lzdGVyIFwidmFsc1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbRGljdCBkXSAtPiBMaXN0IChkaWN0X3ZhbHMgZCkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidmFsczogMSBkaWN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJtdXRhYmxlLWxpc3RcIiAoZnVuIF9hcmdzIC0+IExpc3RSZWYgKHJlZiBbXSkpO1xuICByZWdpc3RlciBcInNldC1udGghXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByOyBOdW1iZXIgbjsgdl0gLT5cbiAgICAgIGxldCBpID0gaW50X29mX2Zsb2F0IG4gaW5cbiAgICAgIGxldCBsID0gIXIgaW5cbiAgICAgIHIgOj0gTGlzdC5tYXBpIChmdW4gaiB4IC0+IGlmIGogPSBpIHRoZW4gdiBlbHNlIHgpIGw7XG4gICAgICBOaWxcbiAgICB8IFtMaXN0IF87IF87IF9dIC0+XG4gICAgICByYWlzZSAoRXZhbF9lcnJvciBcInNldC1udGghOiBsaXN0IGlzIGltbXV0YWJsZSwgdXNlIExpc3RSZWZcIilcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzZXQtbnRoITogZXhwZWN0ZWQgKGxpc3QgaWR4IHZhbClcIikpO1xuICByZWdpc3RlciBcImRpY3Qtc2V0IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0RpY3QgZDsgU3RyaW5nIGs7IHZdIC0+IGRpY3Rfc2V0IGQgayB2OyB2XG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGs7IHZdIC0+IGRpY3Rfc2V0IGQgayB2OyB2XG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZGljdC1zZXQhOiBkaWN0IGtleSB2YWxcIikpO1xuICByZWdpc3RlciBcImRpY3QtZ2V0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gZGljdF9nZXQgZCBrXG4gICAgfCBbRGljdCBkOyBLZXl3b3JkIGtdIC0+IGRpY3RfZ2V0IGQga1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImRpY3QtZ2V0OiBkaWN0IGFuZCBrZXlcIikpO1xuICByZWdpc3RlciBcImRpY3QtaGFzP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0RpY3QgZDsgU3RyaW5nIGtdIC0+IEJvb2wgKGRpY3RfaGFzIGQgaylcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LWhhcz86IGRpY3QgYW5kIGtleVwiKSk7XG4gIHJlZ2lzdGVyIFwiZGljdC1kZWxldGUhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkOyBTdHJpbmcga10gLT4gZGljdF9kZWxldGUgZCBrOyBOaWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LWRlbGV0ZSE6IGRpY3QgYW5kIGtleVwiKSk7XG5cbiAgKCogPT09IE1pc2MgPT09ICopXG4gIHJlZ2lzdGVyIFwidHlwZS1vZlwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYV0gLT4gU3RyaW5nICh0eXBlX29mIGEpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInR5cGUtb2Y6IDEgYXJnXCIpKTtcbiAgcmVnaXN0ZXIgXCJpbnNwZWN0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFthXSAtPiBTdHJpbmcgKGluc3BlY3QgYSkgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiaW5zcGVjdDogMSBhcmdcIikpO1xuICByZWdpc3RlciBcInNlcmlhbGl6ZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2FdIC0+IFN0cmluZyAoaW5zcGVjdCBhKSAgKCogdXNlZCBmb3IgZGVkdXAga2V5cyBpbiBjb21waWxlciAqKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInNlcmlhbGl6ZTogMSBhcmdcIikpO1xuICByZWdpc3RlciBcIm1ha2Utc3ltYm9sXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IFN5bWJvbCBzXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFrZS1zeW1ib2w6IGV4cGVjdGVkIHN0cmluZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiZXJyb3JcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBtc2ddIC0+IHJhaXNlIChFdmFsX2Vycm9yIG1zZylcbiAgICB8IFthXSAtPiByYWlzZSAoRXZhbF9lcnJvciAodG9fc3RyaW5nIGEpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVycm9yOiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwiYXBwbHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtOYXRpdmVGbiAoXywgZik7IChMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0pXSAtPiBmIGFcbiAgICB8IFtOYXRpdmVGbiAoXywgZik7IE5pbF0gLT4gZiBbXVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImFwcGx5OiBmdW5jdGlvbiBhbmQgbGlzdFwiKSk7XG4gIHJlZ2lzdGVyIFwiaWRlbnRpY2FsP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbYTsgYl0gLT4gQm9vbCAoYSA9PSBiKSB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJpZGVudGljYWw/OiAyIGFyZ3NcIikpO1xuICByZWdpc3RlciBcIm1ha2Utc3ByZWFkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbRGljdCBkXSAtPlxuICAgICAgbGV0IHBhaXJzID0gSGFzaHRibC5mb2xkIChmdW4gayB2IGFjYyAtPiAoaywgdikgOjogYWNjKSBkIFtdIGluXG4gICAgICBTcHJlYWQgcGFpcnNcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLXNwcmVhZDogMSBkaWN0XCIpKTtcbiAgcmVnaXN0ZXIgXCJzcHJlYWQ/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtTcHJlYWQgX10gLT4gQm9vbCB0cnVlIHwgW19dIC0+IEJvb2wgZmFsc2VcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzcHJlYWQ/OiAxIGFyZ1wiKSk7XG4gIHJlZ2lzdGVyIFwic3ByZWFkLWF0dHJzXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3ByZWFkIHBhaXJzXSAtPlxuICAgICAgbGV0IGQgPSBtYWtlX2RpY3QgKCkgaW5cbiAgICAgIExpc3QuaXRlciAoZnVuIChrLCB2KSAtPiBkaWN0X3NldCBkIGsgdikgcGFpcnM7XG4gICAgICBEaWN0IGRcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJzcHJlYWQtYXR0cnM6IDEgc3ByZWFkXCIpKTtcblxuICAoKiBIaWdoZXItb3JkZXIgZm9ybXMgYXMgY2FsbGFibGUgcHJpbWl0aXZlcyDigJQgdXNlZCBieSB0aGUgVk0uXG4gICAgIFRoZSBDRUsgbWFjaGluZSBoYW5kbGVzIHRoZXNlIGFzIHNwZWNpYWwgZm9ybXMgd2l0aCBkZWRpY2F0ZWQgZnJhbWVzO1xuICAgICB0aGUgVk0gbmVlZHMgdGhlbSBhcyBwbGFpbiBjYWxsYWJsZSB2YWx1ZXMuICopXG4gICgqIENhbGwgYW55IFNYIGNhbGxhYmxlIOKAlCBoYW5kbGVzIE5hdGl2ZUZuLCBMYW1iZGEgKHZpYSB0cmFtcG9saW5lKSwgVk0gY2xvc3VyZXMgKilcbiAgbGV0IGNhbGxfYW55IGYgYXJncyA9XG4gICAgbWF0Y2ggZiB3aXRoXG4gICAgfCBOYXRpdmVGbiAoXywgZm4pIC0+IGZuIGFyZ3NcbiAgICB8IF8gLT4gIV9zeF90cmFtcG9saW5lX2ZuICghX3N4X2NhbGxfZm4gZiBhcmdzKVxuICBpblxuICByZWdpc3RlciBcIm1hcFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBMaXN0IChMaXN0Lm1hcCAoZnVuIHggLT4gY2FsbF9hbnkgZiBbeF0pIGl0ZW1zKVxuICAgIHwgW187IE5pbF0gLT4gTGlzdCBbXVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1hcDogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJtYXAtaW5kZXhlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2Y7IChMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSldIC0+XG4gICAgICBMaXN0IChMaXN0Lm1hcGkgKGZ1biBpIHggLT4gY2FsbF9hbnkgZiBbTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IHhdKSBpdGVtcylcbiAgICB8IFtfOyBOaWxdIC0+IExpc3QgW11cbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYXAtaW5kZXhlZDogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJmaWx0ZXJcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdCAoTGlzdC5maWx0ZXIgKGZ1biB4IC0+IHN4X3RydXRoeSAoY2FsbF9hbnkgZiBbeF0pKSBpdGVtcylcbiAgICB8IFtfOyBOaWxdIC0+IExpc3QgW11cbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmaWx0ZXI6IGV4cGVjdGVkIChmbiBsaXN0KVwiKSk7XG4gIHJlZ2lzdGVyIFwiZm9yLWVhY2hcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdC5pdGVyIChmdW4geCAtPiBpZ25vcmUgKGNhbGxfYW55IGYgW3hdKSkgaXRlbXM7IE5pbFxuICAgIHwgW187IE5pbF0gLT4gTmlsICAoKiBuaWwgY29sbGVjdGlvbiA9IG5vLW9wICopXG4gICAgfCBfIC0+XG4gICAgICBsZXQgdHlwZXMgPSBTdHJpbmcuY29uY2F0IFwiLCBcIiAoTGlzdC5tYXAgKGZ1biB2IC0+IHR5cGVfb2YgdikgYXJncykgaW5cbiAgICAgIHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZiBcImZvci1lYWNoOiBleHBlY3RlZCAoZm4gbGlzdCksIGdvdCAoJXMpICVkIGFyZ3NcIiB0eXBlcyAoTGlzdC5sZW5ndGggYXJncykpKSk7XG4gIHJlZ2lzdGVyIFwicmVkdWNlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZjsgaW5pdDsgKExpc3QgaXRlbXMgfCBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9KV0gLT5cbiAgICAgIExpc3QuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4gY2FsbF9hbnkgZiBbYWNjOyB4XSkgaW5pdCBpdGVtc1xuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInJlZHVjZTogZXhwZWN0ZWQgKGZuIGluaXQgbGlzdClcIikpO1xuICByZWdpc3RlciBcInNvbWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgKHRyeSBMaXN0LmZpbmQgKGZ1biB4IC0+IHN4X3RydXRoeSAoY2FsbF9hbnkgZiBbeF0pKSBpdGVtc1xuICAgICAgIHdpdGggTm90X2ZvdW5kIC0+IEJvb2wgZmFsc2UpXG4gICAgfCBbXzsgTmlsXSAtPiBCb29sIGZhbHNlXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic29tZTogZXhwZWN0ZWQgKGZuIGxpc3QpXCIpKTtcbiAgcmVnaXN0ZXIgXCJldmVyeT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgQm9vbCAoTGlzdC5mb3JfYWxsIChmdW4geCAtPiBzeF90cnV0aHkgKGNhbGxfYW55IGYgW3hdKSkgaXRlbXMpXG4gICAgfCBbXzsgTmlsXSAtPiBCb29sIHRydWVcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJldmVyeT86IGV4cGVjdGVkIChmbiBsaXN0KVwiKSk7XG5cbiAgKCogLS0tLSBWTSBzdGFjayBwcmltaXRpdmVzICh2bS5zeCBwbGF0Zm9ybSBpbnRlcmZhY2UpIC0tLS0gKilcbiAgcmVnaXN0ZXIgXCJtYWtlLXZtLXN0YWNrXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTnVtYmVyIG5dIC0+IExpc3RSZWYgKHJlZiAoTGlzdC5pbml0IChpbnRfb2ZfZmxvYXQgbikgKGZ1biBfIC0+IE5pbCkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2Utdm0tc3RhY2s6IGV4cGVjdGVkIChzaXplKVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stZ2V0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByOyBOdW1iZXIgbl0gLT4gTGlzdC5udGggIXIgKGludF9vZl9mbG9hdCBuKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInZtLXN0YWNrLWdldDogZXhwZWN0ZWQgKHN0YWNrIGlkeClcIikpO1xuICByZWdpc3RlciBcInZtLXN0YWNrLXNldCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHI7IE51bWJlciBuOyB2XSAtPlxuICAgICAgbGV0IGkgPSBpbnRfb2ZfZmxvYXQgbiBpblxuICAgICAgciA6PSBMaXN0Lm1hcGkgKGZ1biBqIHggLT4gaWYgaiA9IGkgdGhlbiB2IGVsc2UgeCkgIXI7IE5pbFxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInZtLXN0YWNrLXNldCE6IGV4cGVjdGVkIChzdGFjayBpZHggdmFsKVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stbGVuZ3RoXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbTGlzdFJlZiByXSAtPiBOdW1iZXIgKGZsb2F0X29mX2ludCAoTGlzdC5sZW5ndGggIXIpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInZtLXN0YWNrLWxlbmd0aDogZXhwZWN0ZWQgKHN0YWNrKVwiKSk7XG4gIHJlZ2lzdGVyIFwidm0tc3RhY2stY29weSFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0UmVmIHNyYzsgTGlzdFJlZiBkc3Q7IE51bWJlciBuXSAtPlxuICAgICAgbGV0IGNvdW50ID0gaW50X29mX2Zsb2F0IG4gaW5cbiAgICAgIGxldCBzcmNfaXRlbXMgPSAhc3JjIGluXG4gICAgICBkc3QgOj0gTGlzdC5tYXBpIChmdW4gaSB4IC0+IGlmIGkgPCBjb3VudCB0aGVuIExpc3QubnRoIHNyY19pdGVtcyBpIGVsc2UgeCkgIWRzdDsgTmlsXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwidm0tc3RhY2stY29weSE6IGV4cGVjdGVkIChzcmMgZHN0IGNvdW50KVwiKSk7XG4gIHJlZ2lzdGVyIFwicHJpbWl0aXZlP1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPiBCb29sIChIYXNodGJsLm1lbSBwcmltaXRpdmVzIG5hbWUpXG4gICAgfCBfIC0+IEJvb2wgZmFsc2UpO1xuXG4gICgqIFNjb3BlIHN0YWNrIHByaW1pdGl2ZXMgYXJlIHJlZ2lzdGVyZWQgYnkgc3hfc2VydmVyLm1sIC8gcnVuX3Rlc3RzLm1sXG4gICAgIGJlY2F1c2UgdGhleSB1c2UgYSBzaGFyZWQgc2NvcGUgc3RhY2tzIHRhYmxlIHdpdGggY29sbGVjdCEvY29sbGVjdGVkLiAqKVxuXG4gICgqIC0tLS0gUHJlZGljYXRlcyBuZWVkZWQgYnkgYWRhcHRlci1odG1sLnN4IC0tLS0gKilcbiAgcmVnaXN0ZXIgXCJsYW1iZGE/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtMYW1iZGEgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgcmVnaXN0ZXIgXCJpc2xhbmQ/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtJc2xhbmQgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgcmVnaXN0ZXIgXCJpcy1lbHNlLWNsYXVzZT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtLZXl3b3JkIFwiZWxzZVwiXSAtPiBCb29sIHRydWVcbiAgICB8IFtCb29sIHRydWVdIC0+IEJvb2wgdHJ1ZVxuICAgIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgcmVnaXN0ZXIgXCJjb25kLXNjaGVtZT9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMaXN0IGNsYXVzZXNdIC0+XG4gICAgICBCb29sIChMaXN0LmZvcl9hbGwgKGZ1biBjIC0+XG4gICAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgICB8IExpc3QgbCAtPiBMaXN0Lmxlbmd0aCBsID0gMlxuICAgICAgICB8IF8gLT4gZmFsc2UpIGNsYXVzZXMpXG4gICAgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImNvbXBvbmVudD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBfXSAtPiBCb29sIHRydWUgfCBbSXNsYW5kIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIHJlZ2lzdGVyIFwibGFtYmRhLWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBsXSAtPiBFbnYgbC5sX2Nsb3N1cmUgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwiY29tcG9uZW50LWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gRW52IGMuY19jbG9zdXJlXG4gICAgfCBbSXNsYW5kIGldIC0+IEVudiBpLmlfY2xvc3VyZVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IEJvb2wgYy5jX2hhc19jaGlsZHJlblxuICAgIHwgW0lzbGFuZCBpXSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW5cbiAgICB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIHJlZ2lzdGVyIFwiY29tcG9uZW50LW5hbWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gU3RyaW5nIGMuY19uYW1lXG4gICAgfCBbSXNsYW5kIGldIC0+IFN0cmluZyBpLmlfbmFtZVxuICAgIHwgXyAtPiBOaWwpO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtDb21wb25lbnQgY10gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBjLmNfcGFyYW1zKVxuICAgIHwgW0lzbGFuZCBpXSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGkuaV9wYXJhbXMpXG4gICAgfCBfIC0+IExpc3QgW10pO1xuICByZWdpc3RlciBcImNvbXBvbmVudC1ib2R5XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IGMuY19ib2R5XG4gICAgfCBbSXNsYW5kIGldIC0+IGkuaV9ib2R5XG4gICAgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwibWFjcm8/XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtNYWNybyBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICByZWdpc3RlciBcImZvci1lYWNoLWluZGV4ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyAoTGlzdCBpdGVtcyB8IExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pXSAtPlxuICAgICAgTGlzdC5pdGVyaSAoZnVuIGkgeCAtPiBpZ25vcmUgKGNhbGxfYW55IGYgW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyB4XSkpIGl0ZW1zOyBOaWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJmb3ItZWFjaC1pbmRleGVkOiBleHBlY3RlZCAoZm4gbGlzdClcIikpO1xuICByZWdpc3RlciBcImxhbWJkYS1wYXJhbXNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtMYW1iZGEgbF0gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBsLmxfcGFyYW1zKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcbiAgcmVnaXN0ZXIgXCJsYW1iZGEtYm9keVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIGxdIC0+IGwubF9ib2R5IHwgXyAtPiBOaWwpO1xuICAoKiBleHBhbmQtbWFjcm8gaXMgcmVnaXN0ZXJlZCBsYXRlciBieSBydW5fdGVzdHMubWwgLyBzeF9zZXJ2ZXIubWxcbiAgICAgYmVjYXVzZSBpdCBuZWVkcyBldmFsX2V4cHIgd2hpY2ggY3JlYXRlcyBhIGRlcGVuZGVuY3kgY3ljbGUgKik7XG4gIHJlZ2lzdGVyIFwiZW1wdHktZGljdD9cIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtEaWN0IGRdIC0+IEJvb2wgKEhhc2h0YmwubGVuZ3RoIGQgPSAwKVxuICAgIHwgXyAtPiBCb29sIHRydWUpO1xuICByZWdpc3RlciBcIm1ha2UtcmF3LWh0bWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBSYXdIVE1MIHMgfCBfIC0+IE5pbCk7XG4gIHJlZ2lzdGVyIFwicmF3LWh0bWwtY29udGVudFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbUmF3SFRNTCBzXSAtPiBTdHJpbmcgcyB8IF8gLT4gU3RyaW5nIFwiXCIpO1xuICByZWdpc3RlciBcImdldC1wcmltaXRpdmVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IHByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gICAgICAgfCBTb21lIGZuIC0+IE5hdGl2ZUZuIChuYW1lLCBmbilcbiAgICAgICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVk0gdW5kZWZpbmVkOiBcIiBeIG5hbWUpKSlcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJnZXQtcHJpbWl0aXZlOiBleHBlY3RlZCAobmFtZSlcIikpO1xuICByZWdpc3RlciBcImNhbGwtcHJpbWl0aXZlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWU7IChMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0pXSAtPlxuICAgICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgcHJpbWl0aXZlcyBuYW1lIHdpdGhcbiAgICAgICB8IFNvbWUgZm4gLT4gZm4gYVxuICAgICAgIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpKVxuICAgIHwgW1N0cmluZyBuYW1lOyBOaWxdIC0+XG4gICAgICAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBwcmltaXRpdmVzIG5hbWUgd2l0aFxuICAgICAgIHwgU29tZSBmbiAtPiBmbiBbXVxuICAgICAgIHwgTm9uZSAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJWTSB1bmRlZmluZWQ6IFwiIF4gbmFtZSkpKVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNhbGwtcHJpbWl0aXZlOiBleHBlY3RlZCAobmFtZSBhcmdzLWxpc3QpXCIpKTtcbiAgKClcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIiwiY2FtbF9yb3VuZF9mbG9hdCIsImNhbWxfc3RyaW5nX2dldCIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfSGFzaHRibCIsIlN4X3R5cGVzIiwiU3RkbGliIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliX1ByaW50ZiIsIlN0ZGxpYl9MaXN0IiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9CdWZmZXIiLCJTdGRsaWJfVWNoYXIiLCJwcmltaXRpdmVzIiwic3hfY2FsbF9mbiIsInBhcmFtIiwic3hfdHJhbXBvbGluZV9mbiIsInYiLCJyZWdpc3RlciIsIm5hbWUiLCJmbiIsImlzX3ByaW1pdGl2ZSIsImdldF9wcmltaXRpdmUiLCJtYXRjaCIsInRyYW1wb2xpbmVfaG9vayIsImNzdCIsImNzdF9kaWN0IiwiYXNfbnVtYmVyIiwidCIsIm4iLCJzIiwiZCIsImFzX3N0cmluZyIsImFzX2xpc3QiLCJsIiwiciIsImFzX2Jvb2wiLCJiIiwiY3N0X2ciLCJjc3RfZmFsc2UiLCJjc3RfdHJ1ZSIsInRvX3N0cmluZyIsImFyZ3MiLCJhY2MiLCJhIiwicmVzdCIsIngiLCJwbGFjZXMiLCJmYWN0b3IiLCJoaSIsImxvIiwiZGVmYXVsdF92YWwiLCJjc3RfaG9zdF9oYW5kbGUiLCJzYWZlX2VxIiwieSIsImxhIiwiaGIiLCJoYSIsImxiIiwibmVlZGxlIiwiaGF5c3RhY2siLCJpIiwicHJlZml4Iiwic3VmZml4Iiwic2wiLCJ4bCIsIm5sIiwiaGwiLCJlbmQiLCJzdGFydCIsImoiLCJsZW4iLCJzZXAiLCJwIiwiaXRlbXMiLCJ0b19zdHIiLCJuZXdfcyIsIm9sZF9zIiwib2wiLCJidWYiLCJjc3RfYXJncyIsInBhaXJzIiwieHMiLCJleG4iLCJhbGwiLCJmbGF0Iiwic3ViIiwiaXRlbSIsInN0b3AiLCJlIiwic3RlcCIsInRha2VfcmFuZ2UiLCJpZHgiLCJsMSIsImwyIiwieXMiLCJnbyIsInRha2VfbiIsInNpemUiLCJzZWVuIiwicmVzdWx0Iiwia2V5IiwiayIsImQyIiwia2V5cyIsInNyYyIsIm1zZyIsImNhbGxfYW55IiwidHlwZXMiLCJpbml0IiwiZHN0IiwiY291bnQiLCJzcmNfaXRlbXMiLCJjbGF1c2VzIiwiYyIsImNzdF9WTV91bmRlZmluZWQiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGFDTzJEO0FBQUEsSUFBQUM7QUFBQUEsTUFBa0I7QUFBQSxtQkFBQUM7QUFBQUEsUUFJM0Q7QUFBQTtBQUFBLE9BQTRDO0FBQUEsSUFBQUMsbUJBSmUsYUFBQUMsR0FNN0QsU0FBQztBQUFBLFlBQUFDLFNBQUFDLE1BQUFDO0FBQUFBLElBRU0sMERBQWtDO0FBQUE7QUFBQSxZQUFBQyxhQUFBRjtBQUFBQSxJQUVqQyxxREFBMkI7QUFBQTtBQUFBLFlBQUFHLGNBQUFIO0FBQUFBLFFBQUFJLFFBRzNDO0FBQUEsSUFBZ0MsY0FBQUgsS0FBQSxVQUN6QjtBQUFBLFlBQ2U7QUFBQSxJQUE4QjtBQUFBLEdBQUM7QUFBQTtBQUFBLElBQUFJLGtCQWZnQixhQUFB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QUFBcUYsbUJEOTBCNUQ7QUFBQSxHQyswQkU7QUFBQTtBQUFBLGNBQUF6RTtBQUFBQSxNQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBQXZCLE9BQUE7QUFBQSxTQUFBSSxRQUVTO0FBQUEsUUFBZ0MsY0FBQUgsS0FBQSxVQUN6QjtBQUFBLGdCQUNlO0FBQUEsUUFBeUI7QUFBQTtBQUFBO0FBQUEsTUFDakQ7QUFBQTtBQUFBLEtBQW1EO0FBQUEsR0FDNUQ7QUFBQTtBQUFBLGNBQUFzQjtBQUFBQTtBQUFBQSxNQUFBO0FBQUEsZUFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFBdkIsT0FBQTtBQUFBO0FBQUE7QUFBQSxlQUFBSSxRQU1TO0FBQUEsV0FBZ0MsY0FBQUgsS0FBQSxVQUN6Qix3QkFFcUQ7QUFBQSxtQkFEdEM7QUFBQSxXQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUnhEO0FBQUE7QUFBQSxpQkFBQXdCLElBQUE7QUFBQTtBQUFBLGlCQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBQXJCLFVBRVM7QUFBQSxXQUFnQyxnQkFBQUgsT0FBQSxZQUN6QiwwQkFNcUQ7QUFBQSxtQkFMdEM7QUFBQSxXQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtqRDtBQUFBO0FBQUE7QUFBQSxLQUE4RDtBQUFBLEdBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVEaDJCMUUiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyODc5OSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcnVudGltZS5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKiBSdW50aW1lIGhlbHBlcnMgZm9yIHRyYW5zcGlsZWQgY29kZS5cblxuICAgIFRoZXNlIGJyaWRnZSB0aGUgZ2FwIGJldHdlZW4gdGhlIHRyYW5zcGlsZXIncyBvdXRwdXQgYW5kIHRoZVxuICAgIGZvdW5kYXRpb24gdHlwZXMvcHJpbWl0aXZlcy4gVGhlIHRyYW5zcGlsZWQgZXZhbHVhdG9yIGNhbGxzIHRoZXNlXG4gICAgZnVuY3Rpb25zIGRpcmVjdGx5LiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqKiBDYWxsIGEgcmVnaXN0ZXJlZCBwcmltaXRpdmUgYnkgbmFtZS4gKilcbmxldCBwcmltX2NhbGwgbmFtZSBhcmdzID1cbiAgbWF0Y2ggSGFzaHRibC5maW5kX29wdCBTeF9wcmltaXRpdmVzLnByaW1pdGl2ZXMgbmFtZSB3aXRoXG4gIHwgU29tZSBmIC0+IGYgYXJnc1xuICB8IE5vbmUgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiVW5rbm93biBwcmltaXRpdmU6IFwiIF4gbmFtZSkpXG5cbigqKiBDb252ZXJ0IGFueSBTWCB2YWx1ZSB0byBhbiBPQ2FtbCBzdHJpbmcgKGludGVybmFsKS4gKilcbmxldCB2YWx1ZV90b19zdHIgPSBmdW5jdGlvblxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBCb29sIHRydWUgLT4gXCJ0cnVlXCJcbiAgfCBCb29sIGZhbHNlIC0+IFwiZmFsc2VcIlxuICB8IE5pbCAtPiBcIlwiXG4gIHwgU3ltYm9sIHMgLT4gc1xuICB8IEtleXdvcmQgayAtPiBrXG4gIHwgdiAtPiBpbnNwZWN0IHZcblxuKCoqIHN4X3RvX3N0cmluZyByZXR1cm5zIGEgdmFsdWUgKFN0cmluZykgZm9yIHRyYW5zcGlsZWQgY29kZS4gKilcbmxldCBzeF90b19zdHJpbmcgdiA9IFN0cmluZyAodmFsdWVfdG9fc3RyIHYpXG5cbigqKiBTdHJpbmcgY29uY2F0ZW5hdGlvbiBoZWxwZXIg4oCUIFtzeF9zdHJdIHRha2VzIGEgbGlzdCBvZiB2YWx1ZXMuICopXG5sZXQgc3hfc3RyIGFyZ3MgPVxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIHZhbHVlX3RvX3N0ciBhcmdzKVxuXG4oKiogQ29udmVydCBhIHZhbHVlIHRvIGEgbGlzdC4gKilcbmxldCBzeF90b19saXN0ID0gZnVuY3Rpb25cbiAgfCBMaXN0IGwgLT4gbFxuICB8IExpc3RSZWYgciAtPiAhclxuICB8IE5pbCAtPiBbXVxuICB8IHYgLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiRXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiB2KSlcblxuKCoqIENhbGwgYW4gU1ggY2FsbGFibGUgKGxhbWJkYSwgbmF0aXZlIGZuLCBjb250aW51YXRpb24pLiAqKVxubGV0IHN4X2NhbGwgZiBhcmdzID1cbiAgbWF0Y2ggZiB3aXRoXG4gIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzXG4gIHwgVm1DbG9zdXJlIGNsIC0+ICFTeF90eXBlcy5fdm1fY2FsbF9jbG9zdXJlX3JlZiBjbCBhcmdzXG4gIHwgTGFtYmRhIGwgLT5cbiAgICBsZXQgbG9jYWwgPSBTeF90eXBlcy5lbnZfZXh0ZW5kIGwubF9jbG9zdXJlIGluXG4gICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKFN4X3R5cGVzLmVudl9iaW5kIGxvY2FsIHAgYSkpIGwubF9wYXJhbXMgYXJncztcbiAgICBUaHVuayAobC5sX2JvZHksIGxvY2FsKVxuICB8IENvbnRpbnVhdGlvbiAoaywgXykgLT5cbiAgICBrIChtYXRjaCBhcmdzIHdpdGggeCA6OiBfIC0+IHggfCBbXSAtPiBOaWwpXG4gIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciAoXCJOb3QgY2FsbGFibGU6IFwiIF4gaW5zcGVjdCBmKSlcblxuKCogSW5pdGlhbGl6ZSBmb3J3YXJkIHJlZiBzbyBwcmltaXRpdmVzIGNhbiBjYWxsIFNYIGZ1bmN0aW9ucyAqKVxubGV0ICgpID0gU3hfcHJpbWl0aXZlcy5fc3hfY2FsbF9mbiA6PSBzeF9jYWxsXG4oKiBUcmFtcG9saW5lIHJlZiBpcyBzZXQgYnkgc3hfcmVmLm1sIGFmdGVyIGl0J3MgbG9hZGVkICopXG5cbigqKiBBcHBseSBhIGZ1bmN0aW9uIHRvIGEgbGlzdCBvZiBhcmdzLiAqKVxubGV0IHN4X2FwcGx5IGYgYXJnc19saXN0ID1cbiAgc3hfY2FsbCBmIChzeF90b19saXN0IGFyZ3NfbGlzdClcblxuKCoqIE11dGFibGUgYXBwZW5kIOKAlCBhZGQgaXRlbSB0byBhIGxpc3QgcmVmIG9yIGFjY3VtdWxhdG9yLlxuICAgIEluIHRyYW5zcGlsZWQgY29kZSwgbGlzdHMgdGhhdCBnZXQgYXBwZW5kZWQgdG8gYXJlIG11dGFibGUgcmVmcy4gKilcbmxldCBzeF9hcHBlbmRfYiBsc3QgaXRlbSA9XG4gIG1hdGNoIGxzdCB3aXRoXG4gIHwgTGlzdCBpdGVtcyAtPiBMaXN0IChpdGVtcyBAIFtpdGVtXSlcbiAgfCBMaXN0UmVmIHIgLT4gciA6PSAhciBAIFtpdGVtXTsgbHN0ICAoKiBtdXRhdGUgaW4gcGxhY2UsIHJldHVybiBzYW1lIHJlZiAqKVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiYXBwZW5kITogZXhwZWN0ZWQgbGlzdCwgZ290IFwiIF4gdHlwZV9vZiBsc3QpKVxuXG4oKiogTXV0YWJsZSBkaWN0LXNldCDigJQgc2V0IGtleSBpbiBkaWN0LCByZXR1cm4gdmFsdWUuICopXG5sZXQgc3hfZGljdF9zZXRfYiBkIGsgdiA9XG4gIG1hdGNoIGQsIGsgd2l0aFxuICB8IERpY3QgdGJsLCBTdHJpbmcga2V5IC0+IEhhc2h0YmwucmVwbGFjZSB0Ymwga2V5IHY7IHZcbiAgfCBEaWN0IHRibCwgS2V5d29yZCBrZXkgLT4gSGFzaHRibC5yZXBsYWNlIHRibCBrZXkgdjsgdlxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJkaWN0LXNldCE6IGV4cGVjdGVkIGRpY3QgYW5kIHN0cmluZyBrZXlcIilcblxuKCoqIEdldCBmcm9tIGRpY3Qgb3IgbGlzdC4gKilcbmxldCBnZXRfdmFsIGNvbnRhaW5lciBrZXkgPVxuICBtYXRjaCBjb250YWluZXIsIGtleSB3aXRoXG4gIHwgQ2VrU3RhdGUgcywgU3RyaW5nIGsgLT5cbiAgICAobWF0Y2ggayB3aXRoXG4gICAgIHwgXCJjb250cm9sXCIgLT4gcy5jc19jb250cm9sIHwgXCJlbnZcIiAtPiBzLmNzX2VudlxuICAgICB8IFwia29udFwiIC0+IHMuY3Nfa29udCB8IFwicGhhc2VcIiAtPiBTdHJpbmcgcy5jc19waGFzZVxuICAgICB8IFwidmFsdWVcIiAtPiBzLmNzX3ZhbHVlIHwgXyAtPiBOaWwpXG4gIHwgQ2VrRnJhbWUgZiwgU3RyaW5nIGsgLT5cbiAgICAobWF0Y2ggayB3aXRoXG4gICAgIHwgXCJ0eXBlXCIgLT4gU3RyaW5nIGYuY2ZfdHlwZSB8IFwiZW52XCIgLT4gZi5jZl9lbnZcbiAgICAgfCBcIm5hbWVcIiAtPiBmLmNmX25hbWUgfCBcImJvZHlcIiAtPiBmLmNmX2JvZHlcbiAgICAgfCBcInJlbWFpbmluZ1wiIC0+IGYuY2ZfcmVtYWluaW5nIHwgXCJmXCIgLT4gZi5jZl9mXG4gICAgIHwgXCJhcmdzXCIgLT4gZi5jZl9hcmdzIHwgXCJldmFsZWRcIiAtPiBmLmNmX2FyZ3NcbiAgICAgfCBcInJlc3VsdHNcIiAtPiBmLmNmX3Jlc3VsdHMgfCBcInJhdy1hcmdzXCIgLT4gZi5jZl9yZXN1bHRzXG4gICAgIHwgXCJ0aGVuXCIgLT4gZi5jZl9ib2R5IHwgXCJlbHNlXCIgLT4gZi5jZl9uYW1lXG4gICAgIHwgXCJoby10eXBlXCIgLT4gZi5jZl9leHRyYSB8IFwic2NoZW1lXCIgLT4gZi5jZl9leHRyYVxuICAgICB8IFwiaW5kZXhlZFwiIC0+IGYuY2ZfZXh0cmEgfCBcInZhbHVlXCIgLT4gZi5jZl9leHRyYVxuICAgICB8IFwicGhhc2VcIiAtPiBmLmNmX2V4dHJhIHwgXCJoYXMtZWZmZWN0c1wiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcIm1hdGNoLXZhbFwiIC0+IGYuY2ZfZXh0cmEgfCBcImN1cnJlbnQtaXRlbVwiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcInVwZGF0ZS1mblwiIC0+IGYuY2ZfZXh0cmEgfCBcImhlYWQtbmFtZVwiIC0+IGYuY2ZfZXh0cmFcbiAgICAgfCBcImVtaXR0ZWRcIiAtPiBmLmNmX2V4dHJhMiB8IFwiZWZmZWN0LWxpc3RcIiAtPiBmLmNmX2V4dHJhMlxuICAgICB8IFwiZmlyc3QtcmVuZGVyXCIgLT4gZi5jZl9leHRyYTJcbiAgICAgfCBfIC0+IE5pbClcbiAgfCBEaWN0IGQsIFN0cmluZyBrIC0+IGRpY3RfZ2V0IGQga1xuICB8IERpY3QgZCwgS2V5d29yZCBrIC0+IGRpY3RfZ2V0IGQga1xuICB8IChMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0pLCBOdW1iZXIgbiAtPlxuICAgICh0cnkgTGlzdC5udGggbCAoaW50X29mX2Zsb2F0IG4pIHdpdGggXyAtPiBOaWwpXG4gIHwgTmlsLCBfIC0+IE5pbCAgKCogbmlsLmFueXRoaW5nIOKGkiBuaWwgKilcbiAgfCBfLCBfIC0+IE5pbCAgICAoKiB0eXBlIG1pc21hdGNoIOKGkiBuaWwgKG1hdGNoZXMgSlMvUHl0aG9uIGJlaGF2aW9yKSAqKVxuXG4oKiogUmVnaXN0ZXIgZ2V0IGFzIGEgcHJpbWl0aXZlIG92ZXJyaWRlIOKAlCB0cmFuc3BpbGVkIGNvZGUgY2FsbHMgKGdldCBkIGspLiAqKVxubGV0ICgpID1cbiAgU3hfcHJpbWl0aXZlcy5yZWdpc3RlciBcImdldFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2M7IGtdIC0+IGdldF92YWwgYyBrXG4gICAgfCBbYzsgazsgZGVmYXVsdF0gLT5cbiAgICAgICh0cnlcbiAgICAgICAgbGV0IHYgPSBnZXRfdmFsIGMgayBpblxuICAgICAgICBpZiB2ID0gTmlsIHRoZW4gZGVmYXVsdCBlbHNlIHZcbiAgICAgIHdpdGggXyAtPiBkZWZhdWx0KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImdldDogMi0zIGFyZ3NcIikpXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogUHJpbWl0aXZlIGFsaWFzZXMg4oCUIHRvcC1sZXZlbCBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRyYW5zcGlsZWQgY29kZSAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG4oKiogVGhlIHRyYW5zcGlsZWQgZXZhbHVhdG9yIGNhbGxzIHByaW1pdGl2ZXMgZGlyZWN0bHkgYnkgdGhlaXIgbWFuZ2xlZFxuICAgIE9DYW1sIG5hbWUuIFRoZXNlIGFsaWFzZXMgZGVsZWdhdGUgdG8gdGhlIHByaW1pdGl2ZXMgdGFibGUgc28gdGhlXG4gICAgdHJhbnNwaWxlZCBjb2RlIGNvbXBpbGVzIHdpdGhvdXQgbmVlZGluZyBbcHJpbV9jYWxsXSBldmVyeXdoZXJlLiAqKVxuXG5sZXQgX3ByaW0gbmFtZSA9IG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgU3hfcHJpbWl0aXZlcy5wcmltaXRpdmVzIG5hbWUgd2l0aFxuICB8IFNvbWUgZiAtPiBmIHwgTm9uZSAtPiAoZnVuIF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgKFwiTWlzc2luZyBwcmltOiBcIiBeIG5hbWUpKSlcblxuKCogQ29sbGVjdGlvbiBvcHMgKilcbmxldCBmaXJzdCBhcmdzID0gX3ByaW0gXCJmaXJzdFwiIFthcmdzXVxubGV0IHJlc3QgYXJncyA9IF9wcmltIFwicmVzdFwiIFthcmdzXVxubGV0IGxhc3QgYXJncyA9IF9wcmltIFwibGFzdFwiIFthcmdzXVxubGV0IG50aCBjb2xsIGkgPSBfcHJpbSBcIm50aFwiIFtjb2xsOyBpXVxubGV0IGNvbnMgeCBsID0gX3ByaW0gXCJjb25zXCIgW3g7IGxdXG5sZXQgYXBwZW5kIGEgYiA9IF9wcmltIFwiYXBwZW5kXCIgW2E7IGJdXG5sZXQgcmV2ZXJzZSBsID0gX3ByaW0gXCJyZXZlcnNlXCIgW2xdXG5sZXQgZmxhdHRlbiBsID0gX3ByaW0gXCJmbGF0dGVuXCIgW2xdXG5sZXQgY29uY2F0IGEgYiA9IF9wcmltIFwiY29uY2F0XCIgW2E7IGJdXG5sZXQgc2xpY2UgYSBiID0gX3ByaW0gXCJzbGljZVwiIFthOyBiXVxubGV0IGxlbiBhID0gX3ByaW0gXCJsZW5cIiBbYV1cbmxldCBnZXQgYSBiID0gZ2V0X3ZhbCBhIGJcbmxldCBzb3J0JyBhID0gX3ByaW0gXCJzb3J0XCIgW2FdXG5sZXQgcmFuZ2UnIGEgPSBfcHJpbSBcInJhbmdlXCIgW2FdXG5sZXQgdW5pcXVlIGEgPSBfcHJpbSBcInVuaXF1ZVwiIFthXVxubGV0IHppcCBhIGIgPSBfcHJpbSBcInppcFwiIFthOyBiXVxubGV0IHppcF9wYWlycyBhID0gX3ByaW0gXCJ6aXAtcGFpcnNcIiBbYV1cbmxldCB0YWtlIGEgYiA9IF9wcmltIFwidGFrZVwiIFthOyBiXVxubGV0IGRyb3AgYSBiID0gX3ByaW0gXCJkcm9wXCIgW2E7IGJdXG5sZXQgY2h1bmtfZXZlcnkgYSBiID0gX3ByaW0gXCJjaHVuay1ldmVyeVwiIFthOyBiXVxuXG4oKiBQcmVkaWNhdGVzICopXG5sZXQgZW1wdHlfcCBhID0gX3ByaW0gXCJlbXB0eT9cIiBbYV1cbmxldCBuaWxfcCBhID0gX3ByaW0gXCJuaWw/XCIgW2FdXG5sZXQgbnVtYmVyX3AgYSA9IF9wcmltIFwibnVtYmVyP1wiIFthXVxubGV0IHN0cmluZ19wIGEgPSBfcHJpbSBcInN0cmluZz9cIiBbYV1cbmxldCBib29sZWFuX3AgYSA9IF9wcmltIFwiYm9vbGVhbj9cIiBbYV1cbmxldCBsaXN0X3AgYSA9IF9wcmltIFwibGlzdD9cIiBbYV1cbmxldCBkaWN0X3AgYSA9IF9wcmltIFwiZGljdD9cIiBbYV1cbmxldCBzeW1ib2xfcCBhID0gX3ByaW0gXCJzeW1ib2w/XCIgW2FdXG5sZXQga2V5d29yZF9wIGEgPSBfcHJpbSBcImtleXdvcmQ/XCIgW2FdXG5sZXQgY29udGFpbnNfcCBhIGIgPSBfcHJpbSBcImNvbnRhaW5zP1wiIFthOyBiXVxubGV0IGhhc19rZXlfcCBhIGIgPSBfcHJpbSBcImhhcy1rZXk/XCIgW2E7IGJdXG5sZXQgc3RhcnRzX3dpdGhfcCBhIGIgPSBfcHJpbSBcInN0YXJ0cy13aXRoP1wiIFthOyBiXVxubGV0IGVuZHNfd2l0aF9wIGEgYiA9IF9wcmltIFwiZW5kcy13aXRoP1wiIFthOyBiXVxubGV0IHN0cmluZ19jb250YWluc19wIGEgYiA9IF9wcmltIFwic3RyaW5nLWNvbnRhaW5zP1wiIFthOyBiXVxubGV0IG9kZF9wIGEgPSBfcHJpbSBcIm9kZD9cIiBbYV1cbmxldCBldmVuX3AgYSA9IF9wcmltIFwiZXZlbj9cIiBbYV1cbmxldCB6ZXJvX3AgYSA9IF9wcmltIFwiemVybz9cIiBbYV1cblxuKCogU3RyaW5nIG9wcyAqKVxubGV0IHN0cicgYXJncyA9IFN0cmluZyAoc3hfc3RyIGFyZ3MpXG5sZXQgdXBwZXIgYSA9IF9wcmltIFwidXBwZXJcIiBbYV1cbmxldCB1cGNhc2UgYSA9IF9wcmltIFwidXBjYXNlXCIgW2FdXG5sZXQgbG93ZXIgYSA9IF9wcmltIFwibG93ZXJcIiBbYV1cbmxldCBkb3duY2FzZSBhID0gX3ByaW0gXCJkb3duY2FzZVwiIFthXVxubGV0IHRyaW0gYSA9IF9wcmltIFwidHJpbVwiIFthXVxubGV0IHNwbGl0IGEgYiA9IF9wcmltIFwic3BsaXRcIiBbYTsgYl1cbmxldCBqb2luIGEgYiA9IF9wcmltIFwiam9pblwiIFthOyBiXVxubGV0IHJlcGxhY2UgYSBiIGMgPSBfcHJpbSBcInJlcGxhY2VcIiBbYTsgYjsgY11cbmxldCBpbmRleF9vZiBhIGIgPSBfcHJpbSBcImluZGV4LW9mXCIgW2E7IGJdXG5sZXQgc3Vic3RyaW5nIGEgYiBjID0gX3ByaW0gXCJzdWJzdHJpbmdcIiBbYTsgYjsgY11cbmxldCBzdHJpbmdfbGVuZ3RoIGEgPSBfcHJpbSBcInN0cmluZy1sZW5ndGhcIiBbYV1cbmxldCBjaGFyX2Zyb21fY29kZSBhID0gX3ByaW0gXCJjaGFyLWZyb20tY29kZVwiIFthXVxuXG4oKiBEaWN0IG9wcyAqKVxubGV0IGFzc29jIGQgayB2ID0gX3ByaW0gXCJhc3NvY1wiIFtkOyBrOyB2XVxubGV0IGRpc3NvYyBkIGsgPSBfcHJpbSBcImRpc3NvY1wiIFtkOyBrXVxubGV0IG1lcmdlJyBhIGIgPSBfcHJpbSBcIm1lcmdlXCIgW2E7IGJdXG5sZXQga2V5cyBhID0gX3ByaW0gXCJrZXlzXCIgW2FdXG5sZXQgdmFscyBhID0gX3ByaW0gXCJ2YWxzXCIgW2FdXG5sZXQgZGljdF9zZXQgYSBiIGMgPSBfcHJpbSBcImRpY3Qtc2V0IVwiIFthOyBiOyBjXVxubGV0IGRpY3RfZ2V0IGEgYiA9IF9wcmltIFwiZGljdC1nZXRcIiBbYTsgYl1cbmxldCBkaWN0X2hhc19wIGEgYiA9IF9wcmltIFwiZGljdC1oYXM/XCIgW2E7IGJdXG5sZXQgZGljdF9kZWxldGUgYSBiID0gX3ByaW0gXCJkaWN0LWRlbGV0ZSFcIiBbYTsgYl1cblxuKCogTWF0aCAqKVxubGV0IGFicycgYSA9IF9wcmltIFwiYWJzXCIgW2FdXG5sZXQgc3FydCcgYSA9IF9wcmltIFwic3FydFwiIFthXVxubGV0IHBvdycgYSBiID0gX3ByaW0gXCJwb3dcIiBbYTsgYl1cbmxldCBmbG9vcicgYSA9IF9wcmltIFwiZmxvb3JcIiBbYV1cbmxldCBjZWlsJyBhID0gX3ByaW0gXCJjZWlsXCIgW2FdXG5sZXQgcm91bmQnIGEgPSBfcHJpbSBcInJvdW5kXCIgW2FdXG5sZXQgbWluJyBhIGIgPSBfcHJpbSBcIm1pblwiIFthOyBiXVxubGV0IG1heCcgYSBiID0gX3ByaW0gXCJtYXhcIiBbYTsgYl1cbmxldCBjbGFtcCBhIGIgYyA9IF9wcmltIFwiY2xhbXBcIiBbYTsgYjsgY11cbmxldCBwYXJzZV9pbnQgYSA9IF9wcmltIFwicGFyc2UtaW50XCIgW2FdXG5sZXQgcGFyc2VfZmxvYXQgYSA9IF9wcmltIFwicGFyc2UtZmxvYXRcIiBbYV1cblxuKCogTWlzYyAqKVxubGV0IGVycm9yIG1zZyA9IHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgbXNnKSlcblxuKCogaW5zcGVjdCB3cmFwcGVyIOKAlCByZXR1cm5zIFN0cmluZyB2YWx1ZSBpbnN0ZWFkIG9mIE9DYW1sIHN0cmluZyAqKVxubGV0IGluc3BlY3QgdiA9IFN0cmluZyAoU3hfdHlwZXMuaW5zcGVjdCB2KVxubGV0IGFwcGx5JyBmIGFyZ3MgPSBzeF9hcHBseSBmIGFyZ3NcbmxldCBpZGVudGljYWxfcCBhIGIgPSBfcHJpbSBcImlkZW50aWNhbD9cIiBbYTsgYl1cbmxldCBfaXNfc3ByZWFkX3ByaW0gYSA9IF9wcmltIFwic3ByZWFkP1wiIFthXVxubGV0IHNwcmVhZF9hdHRycyBhID0gX3ByaW0gXCJzcHJlYWQtYXR0cnNcIiBbYV1cbmxldCBtYWtlX3NwcmVhZCBhID0gX3ByaW0gXCJtYWtlLXNwcmVhZFwiIFthXVxuXG4oKiBTY29wZSBwcmltaXRpdmVzIOKAlCBkZWxlZ2F0ZSB0byBzeF9yZWYucHkncyBzaGFyZWQgc2NvcGUgc3RhY2tzICopXG5sZXQgc3hfY29sbGVjdCBhIGIgPSBwcmltX2NhbGwgXCJjb2xsZWN0IVwiIFthOyBiXVxubGV0IHN4X2NvbGxlY3RlZCBhID0gcHJpbV9jYWxsIFwiY29sbGVjdGVkXCIgW2FdXG5sZXQgc3hfY2xlYXJfY29sbGVjdGVkIGEgPSBwcmltX2NhbGwgXCJjbGVhci1jb2xsZWN0ZWQhXCIgW2FdXG5sZXQgc3hfZW1pdCBhIGIgPSBwcmltX2NhbGwgXCJlbWl0IVwiIFthOyBiXVxubGV0IHN4X2VtaXR0ZWQgYSA9IHByaW1fY2FsbCBcImVtaXR0ZWRcIiBbYV1cbmxldCBzeF9jb250ZXh0IGEgYiA9IHByaW1fY2FsbCBcImNvbnRleHRcIiBbYTsgYl1cblxuKCogVHJhbXBvbGluZSDigJQgZm9yd2FyZC1kZWNsYXJlZCBpbiBzeF9yZWYubWwsIGRlbGVnYXRlcyB0byBDRUsgZXZhbF9leHByICopXG4oKiBUaGlzIGlzIGEgc3R1YjsgdGhlIHJlYWwgdHJhbXBvbGluZSBpcyB3aXJlZCB1cCBpbiBzeF9yZWYubWwgYWZ0ZXIgZXZhbF9leHByIGlzIGRlZmluZWQgKilcbmxldCB0cmFtcG9saW5lIHYgPSB2XG5cbigqIFZhbHVlLXJldHVybmluZyB0eXBlIHByZWRpY2F0ZXMg4oCUIHRoZSB0cmFuc3BpbGVkIGNvZGUgcGFzc2VzIHRoZXNlIHRocm91Z2hcbiAgIHN4X3RydXRoeSwgc28gdGhleSBuZWVkIHRvIHJldHVybiBCb29sLCBub3QgT0NhbWwgYm9vbC4gKilcbigqIHR5cGVfb2YgcmV0dXJucyB2YWx1ZSwgbm90IHN0cmluZyAqKVxubGV0IHR5cGVfb2YgdiA9IFN0cmluZyAoU3hfdHlwZXMudHlwZV9vZiB2KVxuXG4oKiBFbnYgb3BlcmF0aW9ucyDigJQgYWNjZXB0IEVudi13cmFwcGVkIHZhbHVlcyBhbmQgdmFsdWUga2V5cy5cbiAgIFRoZSB0cmFuc3BpbGVkIENFSyBtYWNoaW5lIHN0b3JlcyBlbnZzIGluIGRpY3RzIGFzIEVudiB2YWx1ZXMuICopXG5sZXQgdW53cmFwX2VudiA9IGZ1bmN0aW9uXG4gIHwgRW52IGUgLT4gZVxuICB8IERpY3QgZCAtPlxuICAgICgqIERpY3QgdXNlZCBhcyBlbnYg4oCUIHdyYXAgaXQuIE5lZWRlZCBieSBhZGFwdGVyLWh0bWwuc3ggd2hpY2hcbiAgICAgICBwYXNzZXMgZGljdHMgYXMgZW52IGFyZ3MgKGUuZy4gZW1wdHkge30gYXMgY2FsbGVyIGVudikuICopXG4gICAgbGV0IGUgPSBTeF90eXBlcy5tYWtlX2VudiAoKSBpblxuICAgIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBpZ25vcmUgKFN4X3R5cGVzLmVudl9iaW5kIGUgayB2KSkgZDtcbiAgICBlXG4gIHwgTmlsIC0+XG4gICAgU3hfdHlwZXMubWFrZV9lbnYgKClcbiAgfCB2IC0+IHJhaXNlIChFdmFsX2Vycm9yIChcIkV4cGVjdGVkIGVudiwgZ290IFwiIF4gU3hfdHlwZXMudHlwZV9vZiB2KSlcblxubGV0IGVudl9oYXMgZSBuYW1lID0gQm9vbCAoU3hfdHlwZXMuZW52X2hhcyAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpKVxubGV0IGVudl9nZXQgZSBuYW1lID0gU3hfdHlwZXMuZW52X2dldCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpXG5sZXQgZW52X2JpbmQgZSBuYW1lIHYgPSBTeF90eXBlcy5lbnZfYmluZCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpIHZcbmxldCBlbnZfc2V0IGUgbmFtZSB2ID0gU3hfdHlwZXMuZW52X3NldCAodW53cmFwX2VudiBlKSAodmFsdWVfdG9fc3RyIG5hbWUpIHZcblxubGV0IG1ha2VfZW52ICgpID0gRW52IChTeF90eXBlcy5tYWtlX2VudiAoKSlcbmxldCBlbnZfZXh0ZW5kIGUgPSBFbnYgKFN4X3R5cGVzLmVudl9leHRlbmQgKHVud3JhcF9lbnYgZSkpXG5sZXQgZW52X21lcmdlIGEgYiA9IEVudiAoU3hfdHlwZXMuZW52X21lcmdlICh1bndyYXBfZW52IGEpICh1bndyYXBfZW52IGIpKVxuXG4oKiBzZXRfbGFtYmRhX25hbWUgd3JhcHBlciDigJQgYWNjZXB0cyB2YWx1ZSwgZXh0cmFjdHMgc3RyaW5nICopXG5sZXQgc2V0X2xhbWJkYV9uYW1lIGwgbiA9IFN4X3R5cGVzLnNldF9sYW1iZGFfbmFtZSBsICh2YWx1ZV90b19zdHIgbilcblxubGV0IGlzX25pbCB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfbmlsIHYpXG5sZXQgaXNfdGh1bmsgdiA9IEJvb2wgKFN4X3R5cGVzLmlzX3RodW5rIHYpXG5sZXQgaXNfbGFtYmRhIHYgPSBCb29sIChTeF90eXBlcy5pc19sYW1iZGEgdilcbmxldCBpc19jb21wb25lbnQgdiA9IEJvb2wgKFN4X3R5cGVzLmlzX2NvbXBvbmVudCB2KVxubGV0IGlzX2lzbGFuZCB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfaXNsYW5kIHYpXG5sZXQgaXNfbWFjcm8gdiA9IEJvb2wgKFN4X3R5cGVzLmlzX21hY3JvIHYpXG5sZXQgaXNfc2lnbmFsIHYgPSBCb29sIChTeF90eXBlcy5pc19zaWduYWwgdilcbmxldCBpc19jYWxsYWJsZSB2ID0gQm9vbCAoU3hfdHlwZXMuaXNfY2FsbGFibGUgdilcbmxldCBpc19pZGVudGljYWwgYSBiID0gQm9vbCAoYSA9PSBiKVxubGV0IGlzX3ByaW1pdGl2ZSBuYW1lID0gQm9vbCAoU3hfcHJpbWl0aXZlcy5pc19wcmltaXRpdmUgKHZhbHVlX3RvX3N0ciBuYW1lKSlcbmxldCBnZXRfcHJpbWl0aXZlIG5hbWUgPSBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgKHZhbHVlX3RvX3N0ciBuYW1lKVxubGV0IGlzX3NwcmVhZCB2ID0gbWF0Y2ggdiB3aXRoIFNwcmVhZCBfIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZVxuXG4oKiBTdHVicyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gc3hfcmVmLm1sIOKAlCByZXNvbHZlZCBhdCBsaW5rIHRpbWUgKilcbigqIFRoZXNlIGFyZSBmb3J3YXJkLWRlY2xhcmVkIGhlcmU7IHN4X3JlZi5tbCBkZWZpbmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zICopXG5cbigqIHN0cmlwLXByZWZpeCAqKVxuKCogU3R1YnMgZm9yIGV2YWx1YXRvciBmdW5jdGlvbnMg4oCUIGRlZmluZWQgaW4gc3hfcmVmLm1sIGJ1dFxuICAgc29tZXRpbWVzIHJlZmVyZW5jZWQgYmVmb3JlIHRoZWlyIGRlZmluaXRpb24gdmlhIGZvcndhcmQgY2FsbHMuXG4gICBUaGVzZSBnZXQgb3ZlcnJpZGRlbiBieSB0aGUgYWN0dWFsIHRyYW5zcGlsZWQgZGVmaW5pdGlvbnMuICopXG5cbmxldCBtYXBfaW5kZXhlZCBmbiBjb2xsID1cbiAgTGlzdCAoTGlzdC5tYXBpIChmdW4gaSB4IC0+IHN4X2NhbGwgZm4gW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyB4XSkgKHN4X3RvX2xpc3QgY29sbCkpXG5cbmxldCBtYXBfZGljdCBmbiBkID1cbiAgbWF0Y2ggZCB3aXRoXG4gIHwgRGljdCB0YmwgLT5cbiAgICBsZXQgcmVzdWx0ID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIHRibCkgaW5cbiAgICBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5yZXBsYWNlIHJlc3VsdCBrIChzeF9jYWxsIGZuIFtTdHJpbmcgazsgdl0pKSB0Ymw7XG4gICAgRGljdCByZXN1bHRcbiAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFwLWRpY3Q6IGV4cGVjdGVkIGRpY3RcIilcblxubGV0IGZvcl9lYWNoIGZuIGNvbGwgPVxuICBMaXN0Lml0ZXIgKGZ1biB4IC0+IGlnbm9yZSAoc3hfY2FsbCBmbiBbeF0pKSAoc3hfdG9fbGlzdCBjb2xsKTtcbiAgTmlsXG5cbmxldCBmb3JfZWFjaF9pbmRleGVkIGZuIGNvbGwgPVxuICBMaXN0Lml0ZXJpIChmdW4gaSB4IC0+IGlnbm9yZSAoc3hfY2FsbCBmbiBbTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IHhdKSkgKHN4X3RvX2xpc3QgY29sbCk7XG4gIE5pbFxuXG4oKiBDb250aW51YXRpb24gc3VwcG9ydCAqKVxubGV0IGNvbnRpbnVhdGlvbl9wIHYgPSBtYXRjaCB2IHdpdGggQ29udGludWF0aW9uIChfLCBfKSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2VcblxubGV0IG1ha2VfY2VrX2NvbnRpbnVhdGlvbiBjYXB0dXJlZCByZXN0X2tvbnQgPVxuICBsZXQgZGF0YSA9IEhhc2h0YmwuY3JlYXRlIDIgaW5cbiAgSGFzaHRibC5yZXBsYWNlIGRhdGEgXCJjYXB0dXJlZFwiIGNhcHR1cmVkO1xuICBIYXNodGJsLnJlcGxhY2UgZGF0YSBcInJlc3Qta29udFwiIHJlc3Rfa29udDtcbiAgQ29udGludWF0aW9uICgoZnVuIHYgLT4gdiksIFNvbWUgZGF0YSlcblxubGV0IGNvbnRpbnVhdGlvbl9kYXRhIHYgPSBtYXRjaCB2IHdpdGhcbiAgfCBDb250aW51YXRpb24gKF8sIFNvbWUgZCkgLT4gRGljdCBkXG4gIHwgQ29udGludWF0aW9uIChfLCBOb25lKSAtPiBEaWN0IChIYXNodGJsLmNyZWF0ZSAwKVxuICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJub3QgYSBjb250aW51YXRpb25cIilcblxuKCogRHluYW1pYyB3aW5kIOKAlCBzaW1wbGlmaWVkIGZvciBPQ2FtbCAobm8gYXN5bmMpICopXG5sZXQgZHluYW1pY193aW5kX2NhbGwgYmVmb3JlIGJvZHkgYWZ0ZXIgX2VudiA9XG4gIGlnbm9yZSAoc3hfY2FsbCBiZWZvcmUgW10pO1xuICBsZXQgcmVzdWx0ID0gc3hfY2FsbCBib2R5IFtdIGluXG4gIGlnbm9yZSAoc3hfY2FsbCBhZnRlciBbXSk7XG4gIHJlc3VsdFxuXG4oKiBTY29wZSBzdGFjayDigJQgYWxsIGRlbGVnYXRlZCB0byBwcmltaXRpdmVzIHJlZ2lzdGVyZWQgaW4gc3hfc2VydmVyLm1sICopXG5sZXQgc2NvcGVfcHVzaCBuYW1lIHZhbHVlID0gcHJpbV9jYWxsIFwic2NvcGUtcHVzaCFcIiBbbmFtZTsgdmFsdWVdXG5sZXQgc2NvcGVfcG9wIG5hbWUgPSBwcmltX2NhbGwgXCJzY29wZS1wb3AhXCIgW25hbWVdXG5sZXQgc2NvcGVfcGVlayBuYW1lID0gcHJpbV9jYWxsIFwic2NvcGUtcGVla1wiIFtuYW1lXVxubGV0IHNjb3BlX2VtaXQgbmFtZSB2YWx1ZSA9IHByaW1fY2FsbCBcInNjb3BlLWVtaXQhXCIgW25hbWU7IHZhbHVlXVxubGV0IHByb3ZpZGVfcHVzaCBuYW1lIHZhbHVlID0gcHJpbV9jYWxsIFwic2NvcGUtcHVzaCFcIiBbbmFtZTsgdmFsdWVdXG5sZXQgcHJvdmlkZV9wb3AgbmFtZSA9IHByaW1fY2FsbCBcInNjb3BlLXBvcCFcIiBbbmFtZV1cblxuKCogQ3VzdG9tIHNwZWNpYWwgZm9ybXMgcmVnaXN0cnkg4oCUIG11dGFibGUgZGljdCAqKVxubGV0IGN1c3RvbV9zcGVjaWFsX2Zvcm1zID0gRGljdCAoSGFzaHRibC5jcmVhdGUgNClcblxuKCogcmVnaXN0ZXItc3BlY2lhbC1mb3JtISDigJQgYWRkIGEgaGFuZGxlciB0byB0aGUgY3VzdG9tIHJlZ2lzdHJ5ICopXG5sZXQgcmVnaXN0ZXJfc3BlY2lhbF9mb3JtIG5hbWUgaGFuZGxlciA9XG4gIChtYXRjaCBjdXN0b21fc3BlY2lhbF9mb3JtcyB3aXRoXG4gICB8IERpY3QgdGJsIC0+IEhhc2h0YmwucmVwbGFjZSB0YmwgKHZhbHVlX3RvX3N0ciBuYW1lKSBoYW5kbGVyOyBoYW5kbGVyXG4gICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjdXN0b21fc3BlY2lhbF9mb3JtcyBub3QgYSBkaWN0XCIpKVxuXG4oKiBSZW5kZXIgY2hlY2svZm4gaG9va3Mg4oCUIG5pbCBieSBkZWZhdWx0LCBzZXQgYnkgcGxhdGZvcm0gaWYgbmVlZGVkICopXG5sZXQgcmVuZGVyX2NoZWNrID0gTmlsXG5sZXQgcmVuZGVyX2ZuID0gTmlsXG5cbigqIGlzLWVsc2UtY2xhdXNlPyDigJQgY2hlY2sgaWYgYSBjb25kL2Nhc2UgdGVzdCBpcyBhbiBlbHNlIG1hcmtlciAqKVxubGV0IGlzX2Vsc2VfY2xhdXNlIHYgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBLZXl3b3JkIGsgLT4gQm9vbCAoayA9IFwiZWxzZVwiIHx8IGsgPSBcImRlZmF1bHRcIilcbiAgfCBTeW1ib2wgcyAtPiBCb29sIChzID0gXCJlbHNlXCIgfHwgcyA9IFwiZGVmYXVsdFwiKVxuICB8IEJvb2wgdHJ1ZSAtPiBCb29sIHRydWVcbiAgfCBfIC0+IEJvb2wgZmFsc2VcblxuKCogU2lnbmFsIGFjY2Vzc29ycyAqKVxubGV0IHNpZ25hbF92YWx1ZSBzID0gbWF0Y2ggcyB3aXRoXG4gIHwgU2lnbmFsIHNpZycgLT4gc2lnJy5zX3ZhbHVlXG4gIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJ2YWx1ZVwiIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IE5pbClcbiAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibm90IGEgc2lnbmFsXCIpXG5sZXQgc2lnbmFsX3NldF92YWx1ZSBzIHYgPSBtYXRjaCBzIHdpdGggU2lnbmFsIHNpZycgLT4gc2lnJy5zX3ZhbHVlIDwtIHY7IHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibm90IGEgc2lnbmFsXCIpXG5sZXQgc2lnbmFsX3N1YnNjcmliZXJzIHMgPSBtYXRjaCBzIHdpdGggU2lnbmFsIHNpZycgLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBfIC0+IE5pbCkgc2lnJy5zX3N1YnNjcmliZXJzKSB8IF8gLT4gTGlzdCBbXVxubGV0IHNpZ25hbF9hZGRfc3ViX2IgcyBmID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCBkIC0+XG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcInN1YnNjcmliZXJzXCIgd2l0aFxuICAgICB8IFNvbWUgKExpc3RSZWYgcikgLT4gciA6PSAhciBAIFtmXTsgTmlsXG4gICAgIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gSGFzaHRibC5yZXBsYWNlIGQgXCJzdWJzY3JpYmVyc1wiIChMaXN0UmVmIChyZWYgKGl0ZW1zIEAgW2ZdKSkpOyBOaWxcbiAgICAgfCBfIC0+IEhhc2h0YmwucmVwbGFjZSBkIFwic3Vic2NyaWJlcnNcIiAoTGlzdFJlZiAocmVmIFtmXSkpOyBOaWwpXG4gIHwgXyAtPiBOaWxcblxubGV0IHNpZ25hbF9yZW1vdmVfc3ViX2IgcyBmID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCBkIC0+XG4gICAgKG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgZCBcInN1YnNjcmliZXJzXCIgd2l0aFxuICAgICB8IFNvbWUgKExpc3RSZWYgcikgLT4gciA6PSBMaXN0LmZpbHRlciAoZnVuIHggLT4geCAhPSBmKSAhcjsgTmlsXG4gICAgIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gSGFzaHRibC5yZXBsYWNlIGQgXCJzdWJzY3JpYmVyc1wiIChMaXN0IChMaXN0LmZpbHRlciAoZnVuIHggLT4geCAhPSBmKSBpdGVtcykpOyBOaWxcbiAgICAgfCBfIC0+IE5pbClcbiAgfCBfIC0+IE5pbFxuXG5sZXQgc2lnbmFsX2RlcHMgcyA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IERpY3QgZCAtPiAobWF0Y2ggSGFzaHRibC5maW5kX29wdCBkIFwiZGVwc1wiIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IExpc3QgW10pXG4gIHwgXyAtPiBMaXN0IFtdXG5cbmxldCBzaWduYWxfc2V0X2RlcHMgcyBkID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgRGljdCB0YmwgLT4gSGFzaHRibC5yZXBsYWNlIHRibCBcImRlcHNcIiBkOyBOaWxcbiAgfCBfIC0+IE5pbFxuXG5sZXQgbm90aWZ5X3N1YnNjcmliZXJzIHMgPVxuICBsZXQgc3VicyA9IG1hdGNoIHMgd2l0aFxuICAgIHwgRGljdCBkIC0+IChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJzdWJzY3JpYmVyc1wiIHdpdGhcbiAgICAgICB8IFNvbWUgKExpc3RSZWYgeyBjb250ZW50cyA9IGl0ZW1zIH0pIHwgU29tZSAoTGlzdCBpdGVtcykgLT4gaXRlbXNcbiAgICAgICB8IF8gLT4gW10pXG4gICAgfCBfIC0+IFtdXG4gIGluXG4gIExpc3QuaXRlciAoZnVuIGYgLT4gaWdub3JlIChzeF9jYWxsIGYgW10pKSBzdWJzO1xuICBOaWxcblxubGV0IGZsdXNoX3N1YnNjcmliZXJzIF9zID0gTmlsXG5sZXQgZGlzcG9zZV9jb21wdXRlZCBfcyA9IE5pbFxuXG4oKiBJc2xhbmQgc2NvcGUgc3R1YnMg4oCUIGFjY2VwdCBib3RoIGJhcmUgT0NhbWwgZm5zIGFuZCBOYXRpdmVGbiB2YWx1ZXNcbiAgIGZyb20gdHJhbnNwaWxlZCBjb2RlIChOYXRpdmVGbiB3cmFwcGluZyBmb3IgdmFsdWUtc3RvcmFibGUgbGFtYmRhcykuICopXG5sZXQgd2l0aF9pc2xhbmRfc2NvcGUgX3JlZ2lzdGVyX2ZuIGJvZHlfZm4gPVxuICBtYXRjaCBib2R5X2ZuIHdpdGhcbiAgfCBOYXRpdmVGbiAoXywgZikgLT4gZiBbXVxuICB8IF8gLT4gTmlsXG5sZXQgcmVnaXN0ZXJfaW5fc2NvcGUgX2Rpc3Bvc2VfZm4gPSBOaWxcblxuKCogQ29tcG9uZW50IHR5cGUgYW5ub3RhdGlvbiBzdHViICopXG5sZXQgY29tcG9uZW50X3NldF9wYXJhbV90eXBlc19iIF9jb21wIF90eXBlcyA9IE5pbFxuXG4oKiBQYXJzZSBrZXl3b3JkIGFyZ3MgZnJvbSBhIGNhbGwg4oCUIHRoaXMgaXMgZGVmaW5lZCBpbiBldmFsdWF0b3Iuc3gsXG4gICB0aGUgdHJhbnNwaWxlZCB2ZXJzaW9uIHdpbGwgb3ZlcnJpZGUgdGhpcyBzdHViLiAqKVxuKCogRm9yd2FyZC1yZWZlcmVuY2Ugc3R1YnMgZm9yIGV2YWx1YXRvciBmdW5jdGlvbnMgdXNlZCBiZWZvcmUgZGVmaW5pdGlvbiAqKVxubGV0IHBhcnNlX2NvbXBfcGFyYW1zIF9wYXJhbXMgPSBMaXN0IFtMaXN0IFtdOyBOaWw7IEJvb2wgZmFsc2VdXG5sZXQgcGFyc2VfbWFjcm9fcGFyYW1zIF9wYXJhbXMgPSBMaXN0IFtMaXN0IFtdOyBOaWxdXG5cbmxldCBwYXJzZV9rZXl3b3JkX2FyZ3MgX3Jhd19hcmdzIF9lbnYgPVxuICAoKiBTdHViIOKAlCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBpcyB0cmFuc3BpbGVkIGZyb20gZXZhbHVhdG9yLnN4ICopXG4gIExpc3QgW0RpY3QgKEhhc2h0YmwuY3JlYXRlIDApOyBMaXN0IFtdXVxuXG4oKiBNYWtlIGhhbmRsZXIvcXVlcnkvYWN0aW9uL3BhZ2UgZGVmIHN0dWJzICopXG5sZXQgbWFrZV9oYW5kbGVyX2RlZiBuYW1lIHBhcmFtcyBib2R5IF9lbnYgPSBEaWN0IChsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDQgaW4gSGFzaHRibC5yZXBsYWNlIGQgXCJ0eXBlXCIgKFN0cmluZyBcImhhbmRsZXJcIik7IEhhc2h0YmwucmVwbGFjZSBkIFwibmFtZVwiIG5hbWU7IEhhc2h0YmwucmVwbGFjZSBkIFwicGFyYW1zXCIgcGFyYW1zOyBIYXNodGJsLnJlcGxhY2UgZCBcImJvZHlcIiBib2R5OyBkKVxubGV0IG1ha2VfcXVlcnlfZGVmIG5hbWUgcGFyYW1zIGJvZHkgX2VudiA9IG1ha2VfaGFuZGxlcl9kZWYgbmFtZSBwYXJhbXMgYm9keSBfZW52XG5sZXQgbWFrZV9hY3Rpb25fZGVmIG5hbWUgcGFyYW1zIGJvZHkgX2VudiA9IG1ha2VfaGFuZGxlcl9kZWYgbmFtZSBwYXJhbXMgYm9keSBfZW52XG5sZXQgbWFrZV9wYWdlX2RlZiBuYW1lIF9vcHRzID0gRGljdCAobGV0IGQgPSBIYXNodGJsLmNyZWF0ZSA0IGluIEhhc2h0YmwucmVwbGFjZSBkIFwidHlwZVwiIChTdHJpbmcgXCJwYWdlXCIpOyBIYXNodGJsLnJlcGxhY2UgZCBcIm5hbWVcIiBuYW1lOyBkKVxuXG4oKiBzZi1kZWYqIHN0dWJzIOKAlCBwbGF0Zm9ybS1zcGVjaWZpYyBkZWYtZm9ybXMsIG5vdCBpbiB0aGUgU1ggc3BlYyAqKVxubGV0IHNmX2RlZmhhbmRsZXIgYXJncyBlbnYgPVxuICBsZXQgbmFtZSA9IGZpcnN0IGFyZ3MgaW4gbGV0IHJlc3RfYXJncyA9IHJlc3QgYXJncyBpblxuICBtYWtlX2hhbmRsZXJfZGVmIG5hbWUgKGZpcnN0IHJlc3RfYXJncykgKG50aCByZXN0X2FyZ3MgKE51bWJlciAxLjApKSBlbnZcbmxldCBzZl9kZWZxdWVyeSBhcmdzIGVudiA9IHNmX2RlZmhhbmRsZXIgYXJncyBlbnZcbmxldCBzZl9kZWZhY3Rpb24gYXJncyBlbnYgPSBzZl9kZWZoYW5kbGVyIGFyZ3MgZW52XG5sZXQgc2ZfZGVmcGFnZSBhcmdzIF9lbnYgPVxuICBsZXQgbmFtZSA9IGZpcnN0IGFyZ3MgaW4gbWFrZV9wYWdlX2RlZiBuYW1lIChyZXN0IGFyZ3MpXG5cbmxldCBzdHJpcF9wcmVmaXggcyBwcmVmaXggPVxuICBtYXRjaCBzLCBwcmVmaXggd2l0aFxuICB8IFN0cmluZyBzLCBTdHJpbmcgcCAtPlxuICAgIGxldCBwbCA9IFN0cmluZy5sZW5ndGggcCBpblxuICAgIGlmIFN0cmluZy5sZW5ndGggcyA+PSBwbCAmJiBTdHJpbmcuc3ViIHMgMCBwbCA9IHBcbiAgICB0aGVuIFN0cmluZyAoU3RyaW5nLnN1YiBzIHBsIChTdHJpbmcubGVuZ3RoIHMgLSBwbCkpXG4gICAgZWxzZSBTdHJpbmcgc1xuICB8IF8gLT4gc1xuXG4oKiBkZWJ1Z19sb2cg4oCUIG5vLW9wIGluIHByb2R1Y3Rpb24sIHVzZWQgYnkgQ0VLIGV2YWx1YXRvciBmb3IgY29tcG9uZW50IHdhcm5pbmdzICopXG5sZXQgZGVidWdfbG9nIF8gXyA9IE5pbFxuXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX2NvbXBhcmUiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX0hhc2h0YmwiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYiIsIlN4X3R5cGVzIiwiU3hfcHJpbWl0aXZlcyIsIlN0ZGxpYl9GbG9hdCIsIlN0ZGxpYl9QcmludGYiLCJwcmltX2NhbGwiLCJuYW1lIiwiYXJncyIsIm1hdGNoIiwiY3N0IiwidmFsdWVfdG9fc3RyIiwidiIsIm4iLCJzIiwic3hfdG9fc3RyaW5nIiwic3hfc3RyIiwic3hfdG9fbGlzdCIsImwiLCJyIiwic3hfY2FsbCIsImxvY2FsIiwicCIsImEiLCJrIiwieCIsImZuIiwiY2wiLCJzeF9hcHBseSIsImFyZ3NfbGlzdCIsInN4X2FwcGVuZF9iIiwibHN0IiwiaXRlbSIsIml0ZW1zIiwic3hfZGljdF9zZXRfYiIsImQiLCJ0YmwiLCJrZXkiLCJjc3RfYm9keSIsImNzdF9lbHNlIiwiY3N0X2VtaXR0ZWQiLCJjc3RfbmFtZSIsImNzdF90eXBlIiwiY3N0X3ZhbHVlIiwiZ2V0X3ZhbCIsImNvbnRhaW5lciIsImNzdF9lbnYiLCJjc3RfcGhhc2UiLCJzd2l0Y2gkIiwiZXhuIiwiYyIsImRlZmF1bHQkIiwicHJpbSIsInBhcmFtIiwiZmlyc3QiLCJyZXN0IiwibGFzdCIsIm50aCIsImNvbGwiLCJpIiwiY29ucyIsImFwcGVuZCIsImIiLCJyZXZlcnNlIiwiZmxhdHRlbiIsImNvbmNhdCIsInNsaWNlIiwibGVuIiwiZ2V0Iiwic29ydCIsInJhbmdlIiwidW5pcXVlIiwiemlwIiwiemlwX3BhaXJzIiwidGFrZSIsImRyb3AiLCJjaHVua19ldmVyeSIsImVtcHR5X3AiLCJuaWxfcCIsIm51bWJlcl9wIiwic3RyaW5nX3AiLCJib29sZWFuX3AiLCJsaXN0X3AiLCJkaWN0X3AiLCJzeW1ib2xfcCIsImtleXdvcmRfcCIsImNvbnRhaW5zX3AiLCJoYXNfa2V5X3AiLCJzdGFydHNfd2l0aF9wIiwiZW5kc193aXRoX3AiLCJzdHJpbmdfY29udGFpbnNfcCIsIm9kZF9wIiwiZXZlbl9wIiwiemVyb19wIiwic3RyIiwidXBwZXIiLCJ1cGNhc2UiLCJsb3dlciIsImRvd25jYXNlIiwidHJpbSIsInNwbGl0Iiwiam9pbiIsInJlcGxhY2UiLCJpbmRleF9vZiIsInN1YnN0cmluZyIsInN0cmluZ19sZW5ndGgiLCJjaGFyX2Zyb21fY29kZSIsImFzc29jIiwiZGlzc29jIiwibWVyZ2UiLCJrZXlzIiwidmFscyIsImRpY3Rfc2V0IiwiZGljdF9nZXQiLCJkaWN0X2hhc19wIiwiZGljdF9kZWxldGUiLCJhYnMiLCJzcXJ0IiwicG93IiwiZmxvb3IiLCJjZWlsIiwicm91bmQiLCJtaW4iLCJtYXgiLCJjbGFtcCIsInBhcnNlX2ludCIsInBhcnNlX2Zsb2F0IiwiZXJyb3IiLCJtc2ciLCJpbnNwZWN0IiwiYXBwbHkiLCJpZGVudGljYWxfcCIsImlzX3NwcmVhZF9wcmltIiwic3ByZWFkX2F0dHJzIiwibWFrZV9zcHJlYWQiLCJzeF9jb2xsZWN0Iiwic3hfY29sbGVjdGVkIiwic3hfY2xlYXJfY29sbGVjdGVkIiwic3hfZW1pdCIsInN4X2VtaXR0ZWQiLCJzeF9jb250ZXh0IiwidHJhbXBvbGluZSIsInR5cGVfb2YiLCJ1bndyYXBfZW52IiwiZSIsImVudl9oYXMiLCJlbnZfZ2V0IiwiZW52X2JpbmQiLCJlbnZfc2V0IiwibWFrZV9lbnYiLCJlbnZfZXh0ZW5kIiwiZW52X21lcmdlIiwic2V0X2xhbWJkYV9uYW1lIiwiaXNfbmlsIiwiaXNfdGh1bmsiLCJpc19sYW1iZGEiLCJpc19jb21wb25lbnQiLCJpc19pc2xhbmQiLCJpc19tYWNybyIsImlzX3NpZ25hbCIsImlzX2NhbGxhYmxlIiwiaXNfaWRlbnRpY2FsIiwiaXNfcHJpbWl0aXZlIiwiZ2V0X3ByaW1pdGl2ZSIsImlzX3NwcmVhZCIsIm1hcF9pbmRleGVkIiwibWFwX2RpY3QiLCJyZXN1bHQiLCJmb3JfZWFjaCIsImZvcl9lYWNoX2luZGV4ZWQiLCJjb250aW51YXRpb25fcCIsIm1ha2VfY2VrX2NvbnRpbnVhdGlvbiIsImNhcHR1cmVkIiwicmVzdF9rb250IiwiZGF0YSIsImNvbnRpbnVhdGlvbl9kYXRhIiwiZHluYW1pY193aW5kX2NhbGwiLCJiZWZvcmUiLCJib2R5IiwiYWZ0ZXIiLCJlbnYiLCJjc3Rfc2NvcGVfcHVzaCIsInNjb3BlX3B1c2giLCJ2YWx1ZSIsImNzdF9zY29wZV9wb3AiLCJzY29wZV9wb3AiLCJzY29wZV9wZWVrIiwic2NvcGVfZW1pdCIsInByb3ZpZGVfcHVzaCIsInByb3ZpZGVfcG9wIiwiY3VzdG9tX3NwZWNpYWxfZm9ybXMiLCJyZWdpc3Rlcl9zcGVjaWFsX2Zvcm0iLCJoYW5kbGVyIiwiaXNfZWxzZV9jbGF1c2UiLCJjc3RfZGVmYXVsdCIsImNzdF9ub3RfYV9zaWduYWwiLCJzaWduYWxfdmFsdWUiLCJzaWciLCJzaWduYWxfc2V0X3ZhbHVlIiwic2lnbmFsX3N1YnNjcmliZXJzIiwiY3N0X3N1YnNjcmliZXJzIiwic2lnbmFsX2FkZF9zdWJfYiIsInNpZ25hbF9yZW1vdmVfc3ViX2IiLCJjc3RfZGVwcyIsInNpZ25hbF9kZXBzIiwic2lnbmFsX3NldF9kZXBzIiwibm90aWZ5X3N1YnNjcmliZXJzIiwic3VicyIsImZsdXNoX3N1YnNjcmliZXJzIiwiZGlzcG9zZV9jb21wdXRlZCIsIndpdGhfaXNsYW5kX3Njb3BlIiwicmVnaXN0ZXJfZm4iLCJib2R5X2ZuIiwicmVnaXN0ZXJfaW5fc2NvcGUiLCJkaXNwb3NlX2ZuIiwiY29tcG9uZW50X3NldF9wYXJhbV90eXBlc19iIiwiY29tcCIsInR5cGVzIiwicGFyc2VfY29tcF9wYXJhbXMiLCJwYXJhbXMiLCJwYXJzZV9tYWNyb19wYXJhbXMiLCJwYXJzZV9rZXl3b3JkX2FyZ3MiLCJyYXdfYXJncyIsIm1ha2VfaGFuZGxlcl9kZWYiLCJtYWtlX3F1ZXJ5X2RlZiIsIm1ha2VfYWN0aW9uX2RlZiIsIm1ha2VfcGFnZV9kZWYiLCJvcHRzIiwic2ZfZGVmaGFuZGxlciIsInJlc3RfYXJncyIsInNmX2RlZnF1ZXJ5Iiwic2ZfZGVmYWN0aW9uIiwic2ZfZGVmcGFnZSIsInN0cmlwX3ByZWZpeCIsInByZWZpeCIsInBsIiwiZGVidWdfbG9nIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsd0JBQUE7QUFBQSxJQUFBQyxzQkFBQTtBQUFBLFlBQUFDLFdBQUFDLEdBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBRixHQUFBQyxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsWUFBQUMsVUFBQUMsTUFBQUM7QUFBQUEsUUFBQUMsUUNVUTtBQUFBLElBQThDLGNBQUFoQixJQUFBLFVBQ3hDLDBCQUMrQztBQUFBLFlBQS9CO0FBQUEsSUFBOEI7QUFBQSxHQUFDO0FBQUEsT0FBQWlCLE1EWjdEO0FBQUEsWUFBQUMsYUFB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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFRGhWbEQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjoyOTcyOCwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcmVmLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCogc3hfcmVmLm1sIOKAlCBBdXRvLWdlbmVyYXRlZCBmcm9tIFNYIHNwZWMgYnkgaG9zdHMvb2NhbWwvYm9vdHN0cmFwLnB5ICopXG4oKiBEbyBub3QgZWRpdCDigJQgcmVnZW5lcmF0ZSB3aXRoOiBweXRob24zIGhvc3RzL29jYW1sL2Jvb3RzdHJhcC5weSAqKVxuXG5bQEBAd2FybmluZyBcIi0yNi0yN1wiXVxuXG5vcGVuIFN4X3R5cGVzXG5vcGVuIFN4X3J1bnRpbWVcblxuKCogVHJhbXBvbGluZSDigJQgZm9yd2FyZCByZWYsIHJlc29sdmVkIGFmdGVyIGV2YWxfZXhwciBpcyBkZWZpbmVkLiAqKVxubGV0IHRyYW1wb2xpbmVfZm4gOiAodmFsdWUgLT4gdmFsdWUpIHJlZiA9IHJlZiAoZnVuIHYgLT4gdilcbmxldCB0cmFtcG9saW5lIHYgPSAhdHJhbXBvbGluZV9mbiB2XG5cblxuXG4oKiA9PT0gTXV0YWJsZSBzdGF0ZSBmb3Igc3RyaWN0IG1vZGUgPT09ICopXG4oKiBUaGVzZSBhcmUgZGVmaW5lZCBhcyB0b3AtbGV2ZWwgcmVmcyBiZWNhdXNlIHRoZSB0cmFuc3BpbGVyIGNhbm5vdCBoYW5kbGVcbiAgIGdsb2JhbCBzZXQhIG11dGF0aW9uIChpdCBjcmVhdGVzIGxvY2FsIHJlZnMgdGhhdCBzaGFkb3cgdGhlIGdsb2JhbCkuICopXG5sZXQgX3N0cmljdF9yZWYgPSByZWYgKEJvb2wgZmFsc2UpXG5sZXQgX3ByaW1fcGFyYW1fdHlwZXNfcmVmID0gcmVmIE5pbFxuXG4oKiBKSVQgY2FsbCBob29rIOKAlCBjZWtfY2FsbCBjaGVja3MgdGhpcyBiZWZvcmUgQ0VLIGRpc3BhdGNoIGZvciBuYW1lZFxuICAgbGFtYmRhcy4gIFJlZ2lzdGVyZWQgYnkgc3hfc2VydmVyLm1sIGFmdGVyIGNvbXBpbGVyIGxvYWRzLiAgVGVzdHNcbiAgIHJ1biB3aXRoIGhvb2sgPSBOb25lIChwdXJlIENFSywgbm8gY29tcGlsYXRpb24gZGVwZW5kZW5jeSkuICopXG5sZXQgaml0X2NhbGxfaG9vayA6ICh2YWx1ZSAtPiB2YWx1ZSBsaXN0IC0+IHZhbHVlIG9wdGlvbikgb3B0aW9uIHJlZiA9IHJlZiBOb25lXG5cblxuXG4oKiA9PT0gVHJhbnNwaWxlZCBmcm9tIGV2YWx1YXRvciAoZnJhbWVzICsgZXZhbCArIENFSykgPT09ICopXG5cbigqIG1ha2UtY2VrLXN0YXRlICopXG5sZXQgcmVjIG1ha2VfY2VrX3N0YXRlIGNvbnRyb2wgZW52IGtvbnQgPVxuICAoQ2VrU3RhdGUgeyBjc19jb250cm9sID0gY29udHJvbDsgY3NfZW52ID0gZW52OyBjc19rb250ID0ga29udDsgY3NfcGhhc2UgPSBcImV2YWxcIjsgY3NfdmFsdWUgPSBOaWwgfSlcblxuKCogbWFrZS1jZWstdmFsdWUgKilcbmFuZCBtYWtlX2Nla192YWx1ZSB2YWx1ZSBlbnYga29udCA9XG4gIChDZWtTdGF0ZSB7IGNzX2NvbnRyb2wgPSBOaWw7IGNzX2VudiA9IGVudjsgY3Nfa29udCA9IGtvbnQ7IGNzX3BoYXNlID0gXCJjb250aW51ZVwiOyBjc192YWx1ZSA9IHZhbHVlIH0pXG5cbigqIGNlay10ZXJtaW5hbD8gKilcbmFuZCBjZWtfdGVybWluYWxfcCBzdGF0ZSA9XG4gIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhnZXQgKHN0YXRlKSAoKFN0cmluZyBcInBoYXNlXCIpKSk7IChTdHJpbmcgXCJjb250aW51ZVwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChlbXB0eV9wICgoZ2V0IChzdGF0ZSkgKChTdHJpbmcgXCJrb250XCIpKSkpKSlcblxuKCogY2VrLWNvbnRyb2wgKilcbmFuZCBjZWtfY29udHJvbCBzID1cbiAgKGdldCAocykgKChTdHJpbmcgXCJjb250cm9sXCIpKSlcblxuKCogY2VrLWVudiAqKVxuYW5kIGNla19lbnYgcyA9XG4gIChnZXQgKHMpICgoU3RyaW5nIFwiZW52XCIpKSlcblxuKCogY2VrLWtvbnQgKilcbmFuZCBjZWtfa29udCBzID1cbiAgKGdldCAocykgKChTdHJpbmcgXCJrb250XCIpKSlcblxuKCogY2VrLXBoYXNlICopXG5hbmQgY2VrX3BoYXNlIHMgPVxuICAoZ2V0IChzKSAoKFN0cmluZyBcInBoYXNlXCIpKSlcblxuKCogY2VrLXZhbHVlICopXG5hbmQgY2VrX3ZhbHVlIHMgPVxuICAoZ2V0IChzKSAoKFN0cmluZyBcInZhbHVlXCIpKSlcblxuKCogbWFrZS1pZi1mcmFtZSAqKVxuYW5kIG1ha2VfaWZfZnJhbWUgdGhlbl9leHByIGVsc2VfZXhwciBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJpZlwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBlbHNlX2V4cHI7IGNmX2JvZHkgPSB0aGVuX2V4cHI7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLXdoZW4tZnJhbWUgKilcbmFuZCBtYWtlX3doZW5fZnJhbWUgYm9keV9leHBycyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJ3aGVuXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IGJvZHlfZXhwcnM7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWJlZ2luLWZyYW1lICopXG5hbmQgbWFrZV9iZWdpbl9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiYmVnaW5cIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1sZXQtZnJhbWUgKilcbmFuZCBtYWtlX2xldF9mcmFtZSBuYW1lIHJlbWFpbmluZyBib2R5IGxvY2FsID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwibGV0XCI7IGNmX2VudiA9IGxvY2FsOyBjZl9uYW1lID0gbmFtZTsgY2ZfYm9keSA9IGJvZHk7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWRlZmluZS1mcmFtZSAqKVxuYW5kIG1ha2VfZGVmaW5lX2ZyYW1lIG5hbWUgZW52IGhhc19lZmZlY3RzIGVmZmVjdF9saXN0ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiZGVmaW5lXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBoYXNfZWZmZWN0czsgY2ZfZXh0cmEyID0gZWZmZWN0X2xpc3QgfSlcblxuKCogbWFrZS1zZXQtZnJhbWUgKilcbmFuZCBtYWtlX3NldF9mcmFtZSBuYW1lIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcInNldFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBuYW1lOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSBOaWw7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1hcmctZnJhbWUgKilcbmFuZCBtYWtlX2FyZ19mcmFtZSBmIGV2YWxlZCByZW1haW5pbmcgZW52IHJhd19hcmdzIGhlYWRfbmFtZSA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImFyZ1wiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBldmFsZWQ7IGNmX3Jlc3VsdHMgPSByYXdfYXJnczsgY2ZfZXh0cmEgPSAobGV0IF9vciA9IGhlYWRfbmFtZSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgTmlsKTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY2FsbC1mcmFtZSAqKVxuYW5kIG1ha2VfY2FsbF9mcmFtZSBmIGFyZ3MgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiY2FsbFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBhcmdzOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY29uZC1mcmFtZSAqKVxuYW5kIG1ha2VfY29uZF9mcmFtZSByZW1haW5pbmcgZW52IHNjaGVtZV9wID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiY29uZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBzY2hlbWVfcDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtY2FzZS1mcmFtZSAqKVxuYW5kIG1ha2VfY2FzZV9mcmFtZSBtYXRjaF92YWwgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImNhc2VcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gbWF0Y2hfdmFsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS10aHJlYWQtZnJhbWUgKilcbmFuZCBtYWtlX3RocmVhZF9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwidGhyZWFkXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtbWFwLWZyYW1lICopXG5hbmQgbWFrZV9tYXBfZnJhbWUgZiByZW1haW5pbmcgcmVzdWx0cyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJtYXBcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gcmVzdWx0czsgY2ZfZXh0cmEgPSAoQm9vbCBmYWxzZSk7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLW1hcC1pbmRleGVkLWZyYW1lICopXG5hbmQgbWFrZV9tYXBfaW5kZXhlZF9mcmFtZSBmIHJlbWFpbmluZyByZXN1bHRzIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcIm1hcFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSByZXN1bHRzOyBjZl9leHRyYSA9IChCb29sIHRydWUpOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1maWx0ZXItZnJhbWUgKilcbmFuZCBtYWtlX2ZpbHRlcl9mcmFtZSBmIHJlbWFpbmluZyByZXN1bHRzIGN1cnJlbnRfaXRlbSBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJmaWx0ZXJcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gcmVzdWx0czsgY2ZfZXh0cmEgPSBjdXJyZW50X2l0ZW07IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLXJlZHVjZS1mcmFtZSAqKVxuYW5kIG1ha2VfcmVkdWNlX2ZyYW1lIGYgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcInJlZHVjZVwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1mb3ItZWFjaC1mcmFtZSAqKVxuYW5kIG1ha2VfZm9yX2VhY2hfZnJhbWUgZiByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiZm9yLWVhY2hcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBmOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2Utc29tZS1mcmFtZSAqKVxuYW5kIG1ha2Vfc29tZV9mcmFtZSBmIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJzb21lXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gZjsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLWV2ZXJ5LWZyYW1lICopXG5hbmQgbWFrZV9ldmVyeV9mcmFtZSBmIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJldmVyeVwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IGY7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1zY29wZS1mcmFtZSAqKVxuYW5kIG1ha2Vfc2NvcGVfZnJhbWUgbmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwic2NvcGVcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gbmFtZTsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gcmVtYWluaW5nOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtcHJvdmlkZS1mcmFtZSAqKVxuYW5kIG1ha2VfcHJvdmlkZV9mcmFtZSBuYW1lIHZhbHVlIHJlbWFpbmluZyBlbnYgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJwcm92aWRlXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSB2YWx1ZTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2Utc2NvcGUtYWNjLWZyYW1lICopXG5hbmQgbWFrZV9zY29wZV9hY2NfZnJhbWUgbmFtZSB2YWx1ZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwic2NvcGUtYWNjXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IG5hbWU7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSAobGV0IF9vciA9IHZhbHVlIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSBOaWwpOyBjZl9leHRyYTIgPSAoTGlzdCBbXSkgfSlcblxuKCogbWFrZS1yZXNldC1mcmFtZSAqKVxuYW5kIG1ha2VfcmVzZXRfZnJhbWUgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwicmVzZXRcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSBOaWw7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1kaWN0LWZyYW1lICopXG5hbmQgbWFrZV9kaWN0X2ZyYW1lIHJlbWFpbmluZyByZXN1bHRzIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImRpY3RcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSByZXN1bHRzOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtYW5kLWZyYW1lICopXG5hbmQgbWFrZV9hbmRfZnJhbWUgcmVtYWluaW5nIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImFuZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IHJlbWFpbmluZzsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBOaWw7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBtYWtlLW9yLWZyYW1lICopXG5hbmQgbWFrZV9vcl9mcmFtZSByZW1haW5pbmcgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwib3JcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmc7IGNmX2YgPSBOaWw7IGNmX2FyZ3MgPSBOaWw7IGNmX3Jlc3VsdHMgPSBOaWw7IGNmX2V4dHJhID0gTmlsOyBjZl9leHRyYTIgPSBOaWwgfSlcblxuKCogbWFrZS1keW5hbWljLXdpbmQtZnJhbWUgKilcbmFuZCBtYWtlX2R5bmFtaWNfd2luZF9mcmFtZSBwaGFzZSBib2R5X3RodW5rIGFmdGVyX3RodW5rIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImR5bmFtaWMtd2luZFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSBwaGFzZTsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtcmVhY3RpdmUtcmVzZXQtZnJhbWUgKilcbmFuZCBtYWtlX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lIGVudiB1cGRhdGVfZm4gZmlyc3RfcmVuZGVyX3AgPVxuICAoQ2VrRnJhbWUgeyBjZl90eXBlID0gXCJyZWFjdGl2ZS1yZXNldFwiOyBjZl9lbnYgPSBlbnY7IGNmX25hbWUgPSBOaWw7IGNmX2JvZHkgPSBOaWw7IGNmX3JlbWFpbmluZyA9IE5pbDsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IE5pbDsgY2ZfcmVzdWx0cyA9IE5pbDsgY2ZfZXh0cmEgPSB1cGRhdGVfZm47IGNmX2V4dHJhMiA9IGZpcnN0X3JlbmRlcl9wIH0pXG5cbigqIG1ha2UtZGVyZWYtZnJhbWUgKilcbmFuZCBtYWtlX2RlcmVmX2ZyYW1lIGVudiA9XG4gIChDZWtGcmFtZSB7IGNmX3R5cGUgPSBcImRlcmVmXCI7IGNmX2VudiA9IGVudjsgY2ZfbmFtZSA9IE5pbDsgY2ZfYm9keSA9IE5pbDsgY2ZfcmVtYWluaW5nID0gTmlsOyBjZl9mID0gTmlsOyBjZl9hcmdzID0gTmlsOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IE5pbDsgY2ZfZXh0cmEyID0gTmlsIH0pXG5cbigqIG1ha2UtaG8tc2V0dXAtZnJhbWUgKilcbmFuZCBtYWtlX2hvX3NldHVwX2ZyYW1lIGhvX3R5cGUgcmVtYWluaW5nX2FyZ3MgZXZhbGVkX2FyZ3MgZW52ID1cbiAgKENla0ZyYW1lIHsgY2ZfdHlwZSA9IFwiaG8tc2V0dXBcIjsgY2ZfZW52ID0gZW52OyBjZl9uYW1lID0gTmlsOyBjZl9ib2R5ID0gTmlsOyBjZl9yZW1haW5pbmcgPSByZW1haW5pbmdfYXJnczsgY2ZfZiA9IE5pbDsgY2ZfYXJncyA9IGV2YWxlZF9hcmdzOyBjZl9yZXN1bHRzID0gTmlsOyBjZl9leHRyYSA9IGhvX3R5cGU7IGNmX2V4dHJhMiA9IE5pbCB9KVxuXG4oKiBmcmFtZS10eXBlICopXG5hbmQgZnJhbWVfdHlwZSBmID1cbiAgKGdldCAoZikgKChTdHJpbmcgXCJ0eXBlXCIpKSlcblxuKCoga29udC1wdXNoICopXG5hbmQga29udF9wdXNoIGZyYW1lIGtvbnQgPVxuICAoY29ucyAoZnJhbWUpIChrb250KSlcblxuKCoga29udC10b3AgKilcbmFuZCBrb250X3RvcCBrb250ID1cbiAgKGZpcnN0IChrb250KSlcblxuKCoga29udC1wb3AgKilcbmFuZCBrb250X3BvcCBrb250ID1cbiAgKHJlc3QgKGtvbnQpKVxuXG4oKiBrb250LWVtcHR5PyAqKVxuYW5kIGtvbnRfZW1wdHlfcCBrb250ID1cbiAgKGVtcHR5X3AgKGtvbnQpKVxuXG4oKiBrb250LWNhcHR1cmUtdG8tcmVzZXQgKilcbmFuZCBrb250X2NhcHR1cmVfdG9fcmVzZXQga29udCA9XG4gIChsZXQgcmVjIHNjYW4gPSAoZnVuIGsgY2FwdHVyZWQgLT4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGspKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwic2hpZnQgd2l0aG91dCBlbmNsb3NpbmcgcmVzZXRcIikpKSkgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFsoZnJhbWVfdHlwZSAoZnJhbWUpKTsgKFN0cmluZyBcInJlc2V0XCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhmcmFtZV90eXBlIChmcmFtZSkpOyAoU3RyaW5nIFwicmVhY3RpdmUtcmVzZXRcIildKSkpIHRoZW4gKExpc3QgW2NhcHR1cmVkOyAocmVzdCAoaykpXSkgZWxzZSAoc2NhbiAoKHJlc3QgKGspKSkgKChwcmltX2NhbGwgXCJhcHBlbmRcIiBbY2FwdHVyZWQ7IChMaXN0IFtmcmFtZV0pXSkpKSkpKSkgaW4gKHNjYW4gKGtvbnQpICgoTGlzdCBbXSkpKSlcblxuKCoga29udC1maW5kLXByb3ZpZGUgKilcbmFuZCBrb250X2ZpbmRfcHJvdmlkZSBrb250IG5hbWUgPVxuICAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoa29udCkpKSB0aGVuIE5pbCBlbHNlIChsZXQgZnJhbWUgPSAoZmlyc3QgKGtvbnQpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsoZnJhbWVfdHlwZSAoZnJhbWUpKTsgKFN0cmluZyBcInByb3ZpZGVcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSk7IG5hbWVdKSkpIHRoZW4gZnJhbWUgZWxzZSAoa29udF9maW5kX3Byb3ZpZGUgKChyZXN0IChrb250KSkpIChuYW1lKSkpKSlcblxuKCoga29udC1maW5kLXNjb3BlLWFjYyAqKVxuYW5kIGtvbnRfZmluZF9zY29wZV9hY2Mga29udCBuYW1lID1cbiAgKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGtvbnQpKSkgdGhlbiBOaWwgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrb250KSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKGZyYW1lKSk7IChTdHJpbmcgXCJzY29wZS1hY2NcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSk7IG5hbWVdKSkpIHRoZW4gZnJhbWUgZWxzZSAoa29udF9maW5kX3Njb3BlX2FjYyAoKHJlc3QgKGtvbnQpKSkgKG5hbWUpKSkpKVxuXG4oKiBoYXMtcmVhY3RpdmUtcmVzZXQtZnJhbWU/ICopXG5hbmQgaGFzX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lX3Aga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChrb250KSkpIHRoZW4gKEJvb2wgZmFsc2UpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKChmaXJzdCAoa29udCkpKSk7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChCb29sIHRydWUpIGVsc2UgKGhhc19yZWFjdGl2ZV9yZXNldF9mcmFtZV9wICgocmVzdCAoa29udCkpKSkpKVxuXG4oKiBrb250LWNhcHR1cmUtdG8tcmVhY3RpdmUtcmVzZXQgKilcbmFuZCBrb250X2NhcHR1cmVfdG9fcmVhY3RpdmVfcmVzZXQga29udCA9XG4gIChsZXQgcmVjIHNjYW4gPSAoZnVuIGsgY2FwdHVyZWQgLT4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGspKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwicmVhY3RpdmUgZGVyZWYgd2l0aG91dCBlbmNsb3NpbmcgcmVhY3RpdmUtcmVzZXRcIikpKSkgZWxzZSAobGV0IGZyYW1lID0gKGZpcnN0IChrKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGZyYW1lX3R5cGUgKGZyYW1lKSk7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChMaXN0IFtjYXB0dXJlZDsgZnJhbWU7IChyZXN0IChrKSldKSBlbHNlIChzY2FuICgocmVzdCAoaykpKSAoKHByaW1fY2FsbCBcImFwcGVuZFwiIFtjYXB0dXJlZDsgKExpc3QgW2ZyYW1lXSldKSkpKSkpKSBpbiAoc2NhbiAoa29udCkgKChMaXN0IFtdKSkpKVxuXG4oKiAqY3VzdG9tLXNwZWNpYWwtZm9ybXMqICopXG5hbmQgY3VzdG9tX3NwZWNpYWxfZm9ybXMgPVxuICAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpXG5cbigqIHJlZ2lzdGVyLXNwZWNpYWwtZm9ybSEgKilcbmFuZCByZWdpc3Rlcl9zcGVjaWFsX2Zvcm0gbmFtZSBoYW5kbGVyID1cbiAgKHN4X2RpY3Rfc2V0X2IgY3VzdG9tX3NwZWNpYWxfZm9ybXMgbmFtZSBoYW5kbGVyKVxuXG4oKiAqcmVuZGVyLWNoZWNrKiAqKVxuYW5kIHJlbmRlcl9jaGVjayA9XG4gIE5pbFxuXG4oKiAqcmVuZGVyLWZuKiAqKVxuYW5kIHJlbmRlcl9mbiA9XG4gIE5pbFxuXG4oKiAqc3RyaWN0KiAqKVxuYW5kIF9zdHJpY3RfID0gIV9zdHJpY3RfcmVmXG5cbigqIHNldC1zdHJpY3QhICopXG5hbmQgc2V0X3N0cmljdF9iIHZhbCcgPVxuICBfc3RyaWN0X3JlZiA6PSB2YWwnOyBOaWxcblxuKCogKnByaW0tcGFyYW0tdHlwZXMqICopXG5hbmQgX3ByaW1fcGFyYW1fdHlwZXNfID0gIV9wcmltX3BhcmFtX3R5cGVzX3JlZlxuXG4oKiBzZXQtcHJpbS1wYXJhbS10eXBlcyEgKilcbmFuZCBzZXRfcHJpbV9wYXJhbV90eXBlc19iIHR5cGVzID1cbiAgX3ByaW1fcGFyYW1fdHlwZXNfcmVmIDo9IHR5cGVzOyBOaWxcblxuKCogdmFsdWUtbWF0Y2hlcy10eXBlPyAqKVxuYW5kIHZhbHVlX21hdGNoZXNfdHlwZV9wIHZhbCcgZXhwZWN0ZWRfdHlwZSA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJhbnlcIildKSkgdGhlbiAoQm9vbCB0cnVlKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJudW1iZXJcIildKSkgdGhlbiAobnVtYmVyX3AgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJzdHJpbmdcIildKSkgdGhlbiAoc3RyaW5nX3AgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJib29sZWFuXCIpXSkpIHRoZW4gKGJvb2xlYW5fcCAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcIm5pbFwiKV0pKSB0aGVuIChpc19uaWwgKHZhbCcpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKGxpc3RfcCAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcImRpY3RcIildKSkgdGhlbiAoZGljdF9wICh2YWwnKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtleHBlY3RlZF90eXBlOyAoU3RyaW5nIFwibGFtYmRhXCIpXSkpIHRoZW4gKGlzX2xhbWJkYSAodmFsJykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZXhwZWN0ZWRfdHlwZTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh2YWwnKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkpIHRoZW4gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHZhbCcpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBlbHNlIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChzdHJpbmdfcCAoZXhwZWN0ZWRfdHlwZSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCJlbmRzLXdpdGg/XCIgW2V4cGVjdGVkX3R5cGU7IChTdHJpbmcgXCI/XCIpXSkpKSB0aGVuIChsZXQgX29yID0gKGlzX25pbCAodmFsJykpIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAodmFsdWVfbWF0Y2hlc190eXBlX3AgKHZhbCcpICgocHJpbV9jYWxsIFwic2xpY2VcIiBbZXhwZWN0ZWRfdHlwZTsgKE51bWJlciAwLjApOyAocHJpbV9jYWxsIFwiLVwiIFsocHJpbV9jYWxsIFwic3RyaW5nLWxlbmd0aFwiIFtleHBlY3RlZF90eXBlXSk7IChOdW1iZXIgMS4wKV0pXSkpKSkgZWxzZSAoQm9vbCB0cnVlKSkpKSkpKSkpKSkpXG5cbigqIHN0cmljdC1jaGVjay1hcmdzICopXG5hbmQgc3RyaWN0X2NoZWNrX2FyZ3MgbmFtZSBhcmdzID1cbiAgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gIV9zdHJpY3RfcmVmIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlICFfcHJpbV9wYXJhbV90eXBlc19yZWYpKSB0aGVuIChsZXQgc3BlYyA9IChnZXQgKCFfcHJpbV9wYXJhbV90eXBlc19yZWYpIChuYW1lKSkgaW4gKGlmIHN4X3RydXRoeSAoc3BlYykgdGhlbiAobGV0IHBvc2l0aW9uYWwgPSAoZ2V0IChzcGVjKSAoKFN0cmluZyBcInBvc2l0aW9uYWxcIikpKSBpbiBsZXQgcmVzdF90eXBlID0gKGdldCAoc3BlYykgKChTdHJpbmcgXCJyZXN0LXR5cGVcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChwb3NpdGlvbmFsKSB0aGVuIChMaXN0Lml0ZXIgKGZ1biBwYWlyIC0+IGlnbm9yZSAoKGxldCBpZHggPSAoZmlyc3QgKHBhaXIpKSBpbiBsZXQgcGFyYW0gPSAobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IHBfbmFtZSA9IChmaXJzdCAocGFyYW0pKSBpbiBsZXQgcF90eXBlID0gKG50aCAocGFyYW0pICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPFwiIFtpZHg7IChsZW4gKGFyZ3MpKV0pKSB0aGVuIChsZXQgdmFsJyA9IChudGggKGFyZ3MpIChpZHgpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKCh2YWx1ZV9tYXRjaGVzX3R5cGVfcCAodmFsJykgKHBfdHlwZSkpKSkpKSkgdGhlbiAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIChzeF9zdHIgWyhTdHJpbmcgXCJUeXBlIGVycm9yOiBcIik7IG5hbWU7IChTdHJpbmcgXCIgZXhwZWN0ZWQgXCIpOyBwX3R5cGU7IChTdHJpbmcgXCIgZm9yIHBhcmFtIFwiKTsgcF9uYW1lOyAoU3RyaW5nIFwiLCBnb3QgXCIpOyAodHlwZV9vZiAodmFsJykpOyAoU3RyaW5nIFwiIChcIik7IChTdHJpbmcgKHN4X3N0ciBbdmFsJ10pKTsgKFN0cmluZyBcIilcIildKSkpKSkgZWxzZSBOaWwpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKExpc3QgKExpc3QubWFwaSAoZnVuIGkgcCAtPiBsZXQgaSA9IE51bWJlciAoZmxvYXRfb2ZfaW50IGkpIGluIChMaXN0IFtpOyBwXSkpIChzeF90b19saXN0IHBvc2l0aW9uYWwpKSkpOyBOaWwpIGVsc2UgTmlsKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gcmVzdF90eXBlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI+XCIgWyhsZW4gKGFyZ3MpKTsgKGxlbiAoKGxldCBfb3IgPSBwb3NpdGlvbmFsIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAoTGlzdCBbXSkpKSldKSkpIHRoZW4gKExpc3QuaXRlciAoZnVuIHBhaXIgLT4gaWdub3JlICgobGV0IGlkeCA9IChmaXJzdCAocGFpcikpIGluIGxldCB2YWwnID0gKG50aCAocGFpcikgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoKHZhbHVlX21hdGNoZXNfdHlwZV9wICh2YWwnKSAocmVzdF90eXBlKSkpKSkpKSB0aGVuIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlR5cGUgZXJyb3I6IFwiKTsgbmFtZTsgKFN0cmluZyBcIiBleHBlY3RlZCBcIik7IHJlc3RfdHlwZTsgKFN0cmluZyBcIiBmb3IgcmVzdCBhcmcgXCIpOyBpZHg7IChTdHJpbmcgXCIsIGdvdCBcIik7ICh0eXBlX29mICh2YWwnKSk7IChTdHJpbmcgXCIgKFwiKTsgKFN0cmluZyAoc3hfc3RyIFt2YWwnXSkpOyAoU3RyaW5nIFwiKVwiKV0pKSkpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKExpc3QgKExpc3QubWFwaSAoZnVuIGkgdiAtPiBsZXQgaSA9IE51bWJlciAoZmxvYXRfb2ZfaW50IGkpIGluIChMaXN0IFtpOyB2XSkpIChzeF90b19saXN0IChwcmltX2NhbGwgXCJzbGljZVwiIFthcmdzOyAobGVuICgobGV0IF9vciA9IHBvc2l0aW9uYWwgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChMaXN0IFtdKSkpKV0pKSkpKTsgTmlsKSBlbHNlIE5pbCkpKSBlbHNlIE5pbCkpIGVsc2UgTmlsKVxuXG4oKiBiaW5kX2xhbWJkYV9wYXJhbXMg4oCUIHNoYXJlZCBoZWxwZXIgZm9yIGNhbGwtbGFtYmRhIGFuZCBDRUsgZGlzcGF0Y2guXG4gICBIYW5kbGVzICZyZXN0IHBhcmFtczogYmluZHMgcmVxdWlyZWQgcGFyYW1zLCBjb2xsZWN0cyByZXN0IGludG8gbGlzdC4gKilcbmFuZCBiaW5kX2xhbWJkYV9wYXJhbXMgZiBhcmdzIGxvY2FsID1cbiAgbGV0IHBhcmFtcyA9IGxhbWJkYV9wYXJhbXMgZiBpblxuICBsZXQgcGFyYW1fbGlzdCA9IG1hdGNoIHBhcmFtcyB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBsZXQgYXJnc19saXN0ID0gbWF0Y2ggYXJncyB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBsZXQgcmVzdF9pZHggPSByZWYgKC0xKSBpblxuICBMaXN0Lml0ZXJpIChmdW4gaSBwIC0+IG1hdGNoIHAgd2l0aCBTeW1ib2wgXCImcmVzdFwiIHwgU3RyaW5nIFwiJnJlc3RcIiAtPiByZXN0X2lkeCA6PSBpIHwgXyAtPiAoKSkgcGFyYW1fbGlzdDtcbiAgaWYgIXJlc3RfaWR4ID49IDAgdGhlbiBiZWdpblxuICAgIGxldCByZXF1aXJlZCA9IExpc3QuZmlsdGVyaSAoZnVuIGkgXyAtPiBpIDwgIXJlc3RfaWR4KSBwYXJhbV9saXN0IGluXG4gICAgbGV0IHJlc3RfbmFtZSA9IChtYXRjaCBMaXN0Lm50aF9vcHQgcGFyYW1fbGlzdCAoIXJlc3RfaWR4ICsgMSkgd2l0aFxuICAgICAgfCBTb21lIChTeW1ib2wgcyB8IFN0cmluZyBzKSAtPiBzIHwgXyAtPiBcInJlc3RcIikgaW5cbiAgICBMaXN0Lml0ZXJpIChmdW4gaSBwIC0+XG4gICAgICBsZXQgbmFtZSA9IHN4X3RvX3N0cmluZyBwIGluXG4gICAgICBsZXQgdiA9IG1hdGNoIExpc3QubnRoX29wdCBhcmdzX2xpc3QgaSB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBOaWwgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgbmFtZSB2KSkgcmVxdWlyZWQ7XG4gICAgbGV0IHJlc3RfdmFscyA9IGlmICFyZXN0X2lkeCA8PSBMaXN0Lmxlbmd0aCBhcmdzX2xpc3RcbiAgICAgIHRoZW4gTGlzdCAoTGlzdC5maWx0ZXJpIChmdW4gaSBfIC0+IGkgPj0gIXJlc3RfaWR4KSBhcmdzX2xpc3QpIGVsc2UgTGlzdCBbXSBpblxuICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKFN0cmluZyByZXN0X25hbWUpIHJlc3RfdmFscylcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICBpZiBzeF90cnV0aHkgKHByaW1fY2FsbCBcIj5cIiBbbGVuIGFyZ3M7IGxlbiBwYXJhbXNdKSB0aGVuXG4gICAgICByYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbXG4gICAgICAgIChsZXQgX29yID0gbGFtYmRhX25hbWUgZiBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgU3RyaW5nIFwibGFtYmRhXCIpO1xuICAgICAgICBTdHJpbmcgXCIgZXhwZWN0cyBcIjsgbGVuIHBhcmFtczsgU3RyaW5nIFwiIGFyZ3MsIGdvdCBcIjsgbGVuIGFyZ3NdKSkpKTtcbiAgICBpZ25vcmUgKExpc3QuaXRlciAoZnVuIHBhaXIgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoZmlyc3QgcGFpcikpIChudGggcGFpciAoTnVtYmVyIDEuMCkpKSlcbiAgICAgIChzeF90b19saXN0IChwcmltX2NhbGwgXCJ6aXBcIiBbcGFyYW1zOyBhcmdzXSkpKTtcbiAgICBpZ25vcmUgKExpc3QuaXRlciAoZnVuIHAgLT5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyBwKSBOaWwpKVxuICAgICAgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInNsaWNlXCIgW3BhcmFtczsgbGVuIGFyZ3NdKSkpXG4gIGVuZFxuXG4oKiBjYWxsLWxhbWJkYSDigJQgdXNlcyBzaGFyZWQgYmluZF9sYW1iZGFfcGFyYW1zIGZvciAmcmVzdCBzdXBwb3J0ICopXG5hbmQgY2FsbF9sYW1iZGEgZiBhcmdzIGNhbGxlcl9lbnYgPVxuICBsZXQgbG9jYWwgPSBlbnZfbWVyZ2UgKGxhbWJkYV9jbG9zdXJlIGYpIGNhbGxlcl9lbnYgaW5cbiAgYmluZF9sYW1iZGFfcGFyYW1zIGYgYXJncyBsb2NhbDtcbiAgbWFrZV90aHVuayAobGFtYmRhX2JvZHkgZikgbG9jYWxcblxuKCogY2FsbC1jb21wb25lbnQgKilcbmFuZCBjYWxsX2NvbXBvbmVudCBjb21wIHJhd19hcmdzIGVudiA9XG4gIChsZXQgcGFyc2VkID0gKHBhcnNlX2tleXdvcmRfYXJncyAocmF3X2FyZ3MpIChlbnYpKSBpbiBsZXQga3dhcmdzID0gKGZpcnN0IChwYXJzZWQpKSBpbiBsZXQgY2hpbGRyZW4gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgbG9jYWwgPSAoZW52X21lcmdlICgoY29tcG9uZW50X2Nsb3N1cmUgKGNvbXApKSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBwIC0+IGlnbm9yZSAoKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgcCkgKGxldCBfb3IgPSAoZGljdF9nZXQgKGt3YXJncykgKHApKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgTmlsKSkpKSAoc3hfdG9fbGlzdCAoY29tcG9uZW50X3BhcmFtcyAoY29tcCkpKTsgTmlsKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGNvbXBvbmVudF9oYXNfY2hpbGRyZW4gKGNvbXApKSkgdGhlbiAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoU3RyaW5nIFwiY2hpbGRyZW5cIikpIGNoaWxkcmVuKSBlbHNlIE5pbCkpIGluIChtYWtlX3RodW5rICgoY29tcG9uZW50X2JvZHkgKGNvbXApKSkgKGxvY2FsKSkpKSlcblxuKCogcGFyc2Uta2V5d29yZC1hcmdzICopXG5hbmQgcGFyc2Vfa2V5d29yZF9hcmdzIHJhd19hcmdzIGVudiA9XG4gIChsZXQga3dhcmdzID0gKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSBpbiBsZXQgY2hpbGRyZW4gPSByZWYgKChMaXN0IFtdKSkgaW4gbGV0IGkgPSAoTnVtYmVyIDAuMCkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKExpc3QuZm9sZF9sZWZ0IChmdW4gc3RhdGUgYXJnIC0+IChsZXQgaWR4ID0gKGdldCAoc3RhdGUpICgoU3RyaW5nIFwiaVwiKSkpIGluIGxldCBza2lwID0gKGdldCAoc3RhdGUpICgoU3RyaW5nIFwic2tpcFwiKSkpIGluIChpZiBzeF90cnV0aHkgKHNraXApIHRoZW4gKHByaW1fY2FsbCBcImFzc29jXCIgW3N0YXRlOyAoU3RyaW5nIFwic2tpcFwiKTsgKEJvb2wgZmFsc2UpOyAoU3RyaW5nIFwiaVwiKTsgKHByaW1fY2FsbCBcImluY1wiIFtpZHhdKV0pIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGFyZykpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI8XCIgWyhwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSk7IChsZW4gKHJhd19hcmdzKSldKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2Iga3dhcmdzIChrZXl3b3JkX25hbWUgKGFyZykpICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChyYXdfYXJncykgKChwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSkpKSkgKGVudikpKSkpKSBpbiAocHJpbV9jYWxsIFwiYXNzb2NcIiBbc3RhdGU7IChTdHJpbmcgXCJza2lwXCIpOyAoQm9vbCB0cnVlKTsgKFN0cmluZyBcImlcIik7IChwcmltX2NhbGwgXCJpbmNcIiBbaWR4XSldKSkgZWxzZSAobGV0ICgpID0gaWdub3JlICgoY2hpbGRyZW4gOj0gc3hfYXBwZW5kX2IgIWNoaWxkcmVuICh0cmFtcG9saW5lICgoZXZhbF9leHByIChhcmcpIChlbnYpKSkpOyBOaWwpKSBpbiAocHJpbV9jYWxsIFwiYXNzb2NcIiBbc3RhdGU7IChTdHJpbmcgXCJpXCIpOyAocHJpbV9jYWxsIFwiaW5jXCIgW2lkeF0pXSkpKSkpKSAobGV0IF9kID0gSGFzaHRibC5jcmVhdGUgMiBpbiBIYXNodGJsLnJlcGxhY2UgX2QgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwiaVwiKSkgKE51bWJlciAwLjApOyBIYXNodGJsLnJlcGxhY2UgX2QgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIFwic2tpcFwiKSkgKEJvb2wgZmFsc2UpOyAgRGljdCBfZCkgKHN4X3RvX2xpc3QgcmF3X2FyZ3MpKSkgaW4gKExpc3QgW2t3YXJnczsgIWNoaWxkcmVuXSkpKVxuXG4oKiBjb25kLXNjaGVtZT8gKilcbmFuZCBjb25kX3NjaGVtZV9wIGNsYXVzZXMgPVxuICAoQm9vbCAoTGlzdC5mb3JfYWxsIChmdW4gYyAtPiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChjKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYykpOyAoTnVtYmVyIDIuMCldKSkpKSAoc3hfdG9fbGlzdCBjbGF1c2VzKSkpXG5cbigqIGlzLWVsc2UtY2xhdXNlPyAqKVxuYW5kIGlzX2Vsc2VfY2xhdXNlIHRlc3QgPVxuICAobGV0IF9vciA9IChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh0ZXN0KSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAodGVzdCkpOyAoU3RyaW5nIFwiZWxzZVwiKV0pKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHRlc3QpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbKHN5bWJvbF9uYW1lICh0ZXN0KSk7IChTdHJpbmcgXCJlbHNlXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhzeW1ib2xfbmFtZSAodGVzdCkpOyAoU3RyaW5nIFwiOmVsc2VcIildKSkpKVxuXG4oKiBzZi1uYW1lZC1sZXQgKilcbmFuZCBzZl9uYW1lZF9sZXQgYXJncyBlbnYgPVxuICAobGV0IGxvb3BfbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChhcmdzKSkpKSBpbiBsZXQgYmluZGluZ3MgPSAobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IGJvZHkgPSAocHJpbV9jYWxsIFwic2xpY2VcIiBbYXJnczsgKE51bWJlciAyLjApXSkgaW4gbGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgaW5pdHMgPSByZWYgKChMaXN0IFtdKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoTnVtYmVyIDIuMCldKSkpIHRoZW4gKExpc3QuaXRlciAoZnVuIGJpbmRpbmcgLT4gaWdub3JlICgobGV0ICgpID0gaWdub3JlICgocGFyYW1zIDo9IHN4X2FwcGVuZF9iICFwYXJhbXMgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAoYmluZGluZykpKSkgZWxzZSAoZmlyc3QgKGJpbmRpbmcpKSk7IE5pbCkpIGluIChpbml0cyA6PSBzeF9hcHBlbmRfYiAhaW5pdHMgKG50aCAoYmluZGluZykgKChOdW1iZXIgMS4wKSkpOyBOaWwpKSkpIChzeF90b19saXN0IGJpbmRpbmdzKTsgTmlsKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgcGFpcl9pZHggLT4gKGxldCAoKSA9IGlnbm9yZSAoKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW3BhaXJfaWR4OyAoTnVtYmVyIDIuMCldKSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpKSBlbHNlIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpOyBOaWwpKSBpbiAoaW5pdHMgOj0gc3hfYXBwZW5kX2IgIWluaXRzIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtwYWlyX2lkeDsgKE51bWJlciAyLjApXSldKSkpOyBOaWwpKSkgTmlsIChzeF90b19saXN0IChwcmltX2NhbGwgXCJyYW5nZVwiIFsoTnVtYmVyIDAuMCk7IChwcmltX2NhbGwgXCIvXCIgWyhsZW4gKGJpbmRpbmdzKSk7IChOdW1iZXIgMi4wKV0pXSkpKSkpIGluIChsZXQgbG9vcF9ib2R5ID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYm9keSkpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAoZmlyc3QgKGJvZHkpKSBlbHNlIChjb25zICgobWFrZV9zeW1ib2wgKChTdHJpbmcgXCJiZWdpblwiKSkpKSAoYm9keSkpKSBpbiBsZXQgbG9vcF9mbiA9IChtYWtlX2xhbWJkYSAoIXBhcmFtcykgKGxvb3BfYm9keSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzZXRfbGFtYmRhX25hbWUgbG9vcF9mbiAoc3hfdG9fc3RyaW5nIGxvb3BfbmFtZSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X2JpbmQgKGxhbWJkYV9jbG9zdXJlIChsb29wX2ZuKSkgKHN4X3RvX3N0cmluZyBsb29wX25hbWUpIGxvb3BfZm4pKSBpbiAobGV0IGluaXRfdmFscyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChlbnYpKSkpKSAoc3hfdG9fbGlzdCAhaW5pdHMpKSkgaW4gKGNhbGxfbGFtYmRhIChsb29wX2ZuKSAoaW5pdF92YWxzKSAoZW52KSkpKSkpKSlcblxuKCogc2YtbGFtYmRhICopXG5hbmQgc2ZfbGFtYmRhIGFyZ3MgZW52ID1cbiAgKGxldCBwYXJhbXNfZXhwciA9IChmaXJzdCAoYXJncykpIGluIGxldCBib2R5X2V4cHJzID0gKHJlc3QgKGFyZ3MpKSBpbiBsZXQgYm9keSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKGJvZHlfZXhwcnMpKTsgKE51bWJlciAxLjApXSkpIHRoZW4gKGZpcnN0IChib2R5X2V4cHJzKSkgZWxzZSAoY29ucyAoKG1ha2Vfc3ltYm9sICgoU3RyaW5nIFwiYmVnaW5cIikpKSkgKGJvZHlfZXhwcnMpKSkgaW4gbGV0IHBhcmFtX25hbWVzID0gKExpc3QgKExpc3QubWFwIChmdW4gcCAtPiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKHApKTsgKE51bWJlciAzLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChudGggKHApICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhrZXl3b3JkX25hbWUgKChudGggKHApICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwiYXNcIildKSkpKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAocCkpKSkgZWxzZSBwKSkpIChzeF90b19saXN0IHBhcmFtc19leHByKSkpIGluIChtYWtlX2xhbWJkYSAocGFyYW1fbmFtZXMpIChib2R5KSAoZW52KSkpXG5cbigqIHNmLWRlZmNvbXAgKilcbmFuZCBzZl9kZWZjb21wIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBwYXJhbXNfcmF3ID0gKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpIGluIGxldCBib2R5ID0gKGxhc3QgKGFyZ3MpKSBpbiBsZXQgY29tcF9uYW1lID0gKHN0cmlwX3ByZWZpeCAoKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSAoKFN0cmluZyBcIn5cIikpKSBpbiBsZXQgcGFyc2VkID0gKHBhcnNlX2NvbXBfcGFyYW1zIChwYXJhbXNfcmF3KSkgaW4gbGV0IHBhcmFtcyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IGhhc19jaGlsZHJlbiA9IChudGggKHBhcnNlZCkgKChOdW1iZXIgMS4wKSkpIGluIGxldCBwYXJhbV90eXBlcyA9IChudGggKHBhcnNlZCkgKChOdW1iZXIgMi4wKSkpIGluIGxldCBhZmZpbml0eSA9IChkZWZjb21wX2t3YXJnIChhcmdzKSAoKFN0cmluZyBcImFmZmluaXR5XCIpKSAoKFN0cmluZyBcImF1dG9cIikpKSBpbiAobGV0IGNvbXAgPSAobWFrZV9jb21wb25lbnQgKGNvbXBfbmFtZSkgKHBhcmFtcykgKGhhc19jaGlsZHJlbikgKGJvZHkpIChlbnYpIChhZmZpbml0eSkpIGluIGxldCBlZmZlY3RzID0gKGRlZmNvbXBfa3dhcmcgKGFyZ3MpICgoU3RyaW5nIFwiZWZmZWN0c1wiKSkgKE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAocGFyYW1fdHlwZXMpKSkpKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoZW1wdHlfcCAoKHByaW1fY2FsbCBcImtleXNcIiBbcGFyYW1fdHlwZXNdKSkpKSkpKSkpIHRoZW4gKGNvbXBvbmVudF9zZXRfcGFyYW1fdHlwZXNfYiAoY29tcCkgKHBhcmFtX3R5cGVzKSkgZWxzZSBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKChpc19uaWwgKGVmZmVjdHMpKSkpKSkpIHRoZW4gKGxldCBlZmZlY3RfbGlzdCA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChlZmZlY3RzKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKExpc3QgKExpc3QubWFwIChmdW4gZSAtPiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoZSkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChlKSkgZWxzZSAoU3RyaW5nIChzeF9zdHIgW2VdKSkpKSAoc3hfdG9fbGlzdCBlZmZlY3RzKSkpIGVsc2UgKExpc3QgWyhTdHJpbmcgKHN4X3N0ciBbZWZmZWN0c10pKV0pKSBpbiBsZXQgZWZmZWN0X2FubnMgPSAoaWYgc3hfdHJ1dGh5ICgoZW52X2hhcyAoZW52KSAoKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSkpIHRoZW4gKGVudl9nZXQgKGVudikgKChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkpIGVsc2UgKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2IgZWZmZWN0X2FubnMgKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpIGVmZmVjdF9saXN0KSkgaW4gKGVudl9iaW5kIGVudiAoc3hfdG9fc3RyaW5nIChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkgZWZmZWN0X2FubnMpKSkgZWxzZSBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X2JpbmQgZW52IChzeF90b19zdHJpbmcgKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSBjb21wKSkgaW4gY29tcCkpKSkpXG5cbigqIGRlZmNvbXAta3dhcmcgKilcbmFuZCBkZWZjb21wX2t3YXJnIGFyZ3Mga2V5IGRlZmF1bHQgPVxuICAobGV0IGVuZCcgPSAocHJpbV9jYWxsIFwiLVwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgMS4wKV0pIGluIGxldCByZXN1bHQnID0gcmVmIChkZWZhdWx0KSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gaSAtPiBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChhcmdzKSAoaSkpKSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAoKG50aCAoYXJncykgKGkpKSkpOyBrZXldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPFwiIFsocHJpbV9jYWxsIFwiK1wiIFtpOyAoTnVtYmVyIDEuMCldKTsgZW5kJ10pKSkpIHRoZW4gKGxldCB2YWwnID0gKG50aCAoYXJncykgKChwcmltX2NhbGwgXCIrXCIgW2k7IChOdW1iZXIgMS4wKV0pKSkgaW4gKHJlc3VsdCcgOj0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHZhbCcpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSkgdGhlbiAoa2V5d29yZF9uYW1lICh2YWwnKSkgZWxzZSB2YWwnKTsgTmlsKSkgZWxzZSBOaWwpKSkgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInJhbmdlXCIgWyhOdW1iZXIgMi4wKTsgZW5kJzsgKE51bWJlciAxLjApXSkpOyBOaWwpKSBpbiAhcmVzdWx0JykpXG5cbigqIHBhcnNlLWNvbXAtcGFyYW1zICopXG5hbmQgcGFyc2VfY29tcF9wYXJhbXMgcGFyYW1zX2V4cHIgPVxuICAobGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgcGFyYW1fdHlwZXMgPSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpIGluIGxldCBoYXNfY2hpbGRyZW4gPSByZWYgKChCb29sIGZhbHNlKSkgaW4gbGV0IGluX2tleSA9IHJlZiAoKEJvb2wgZmFsc2UpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAocCkpOyAoTnVtYmVyIDMuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChwKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChwKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgobnRoIChwKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImFzXCIpXSkpKSkpKSB0aGVuIChsZXQgbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChwKSkpKSBpbiBsZXQgcHR5cGUgPSAobnRoIChwKSAoKE51bWJlciAyLjApKSkgaW4gKGxldCB0eXBlX3ZhbCA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwdHlwZSkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwdHlwZSkpIGVsc2UgcHR5cGUpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoIWhhc19jaGlsZHJlbikpKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIG5hbWU7IE5pbCkpIGluIChzeF9kaWN0X3NldF9iIHBhcmFtX3R5cGVzIG5hbWUgdHlwZV92YWwpKSBlbHNlIE5pbCkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoc3ltYm9sX25hbWUgKHApKSBpbiAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiJmtleVwiKV0pKSB0aGVuIChpbl9rZXkgOj0gKEJvb2wgdHJ1ZSk7IE5pbCkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiJnJlc3RcIildKSkgdGhlbiAoaGFzX2NoaWxkcmVuIDo9IChCb29sIHRydWUpOyBOaWwpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIiZjaGlsZHJlblwiKV0pKSB0aGVuIChoYXNfY2hpbGRyZW4gOj0gKEJvb2wgdHJ1ZSk7IE5pbCkgZWxzZSAoaWYgc3hfdHJ1dGh5ICghaGFzX2NoaWxkcmVuKSB0aGVuIE5pbCBlbHNlIChpZiBzeF90cnV0aHkgKCFpbl9rZXkpIHRoZW4gKHBhcmFtcyA6PSBzeF9hcHBlbmRfYiAhcGFyYW1zIG5hbWU7IE5pbCkgZWxzZSAocGFyYW1zIDo9IHN4X2FwcGVuZF9iICFwYXJhbXMgbmFtZTsgTmlsKSkpKSkpKSBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgcGFyYW1zX2V4cHIpOyBOaWwpKSBpbiAoTGlzdCBbIXBhcmFtczsgIWhhc19jaGlsZHJlbjsgcGFyYW1fdHlwZXNdKSkpXG5cbigqIHNmLWRlZmlzbGFuZCDigJQgbXVsdGktZXhwcmVzc2lvbiBib2RpZXMgd3JhcHBlZCBpbiAoYmVnaW4gLi4uKSAqKVxuYW5kIHNmX2RlZmlzbGFuZCBhcmdzIGVudiA9XG4gIChsZXQgbmFtZV9zeW0gPSAoZmlyc3QgKGFyZ3MpKSBpbiBsZXQgcGFyYW1zX3JhdyA9IChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgYm9keV9leHBycyA9IChzbGljZSAoYXJncykgKChOdW1iZXIgMi4wKSkpIGluIGxldCBib2R5ID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYm9keV9leHBycykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAoZmlyc3QgKGJvZHlfZXhwcnMpKSBlbHNlIChwcmltX2NhbGwgXCJjb25zXCIgWyhtYWtlX3N5bWJvbCAoKFN0cmluZyBcImJlZ2luXCIpKSk7IGJvZHlfZXhwcnNdKSkgaW4gbGV0IGNvbXBfbmFtZSA9IChzdHJpcF9wcmVmaXggKChzeW1ib2xfbmFtZSAobmFtZV9zeW0pKSkgKChTdHJpbmcgXCJ+XCIpKSkgaW4gbGV0IHBhcnNlZCA9IChwYXJzZV9jb21wX3BhcmFtcyAocGFyYW1zX3JhdykpIGluIGxldCBwYXJhbXMgPSAoZmlyc3QgKHBhcnNlZCkpIGluIGxldCBoYXNfY2hpbGRyZW4gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAobGV0IGlzbGFuZCA9IChtYWtlX2lzbGFuZCAoY29tcF9uYW1lKSAocGFyYW1zKSAoaGFzX2NoaWxkcmVuKSAoYm9keSkgKGVudikpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBlbnYgKHN4X3RvX3N0cmluZyAoc3ltYm9sX25hbWUgKG5hbWVfc3ltKSkpIGlzbGFuZCkpIGluIGlzbGFuZCkpKVxuXG4oKiBzZi1kZWZtYWNybyAqKVxuYW5kIHNmX2RlZm1hY3JvIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBwYXJhbXNfcmF3ID0gKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpIGluIGxldCBib2R5ID0gKG50aCAoYXJncykgKChOdW1iZXIgMi4wKSkpIGluIGxldCBwYXJzZWQgPSAocGFyc2VfbWFjcm9fcGFyYW1zIChwYXJhbXNfcmF3KSkgaW4gbGV0IHBhcmFtcyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IHJlc3RfcGFyYW0gPSAobnRoIChwYXJzZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAobGV0IG1hYyA9IChtYWtlX21hY3JvIChwYXJhbXMpIChyZXN0X3BhcmFtKSAoYm9keSkgKGVudikgKChzeW1ib2xfbmFtZSAobmFtZV9zeW0pKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBlbnYgKHN4X3RvX3N0cmluZyAoc3ltYm9sX25hbWUgKG5hbWVfc3ltKSkpIG1hYykpIGluIG1hYykpKVxuXG4oKiBwYXJzZS1tYWNyby1wYXJhbXMgKilcbmFuZCBwYXJzZV9tYWNyb19wYXJhbXMgcGFyYW1zX2V4cHIgPVxuICAobGV0IHBhcmFtcyA9IHJlZiAoKExpc3QgW10pKSBpbiBsZXQgcmVzdF9wYXJhbSA9IHJlZiAoTmlsKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5mb2xkX2xlZnQgKGZ1biBzdGF0ZSBwIC0+IChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChwKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoc3ltYm9sX25hbWUgKHApKTsgKFN0cmluZyBcIiZyZXN0XCIpXSkpKSB0aGVuIChwcmltX2NhbGwgXCJhc3NvY1wiIFtzdGF0ZTsgKFN0cmluZyBcImluLXJlc3RcIik7IChCb29sIHRydWUpXSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgoZ2V0IChzdGF0ZSkgKChTdHJpbmcgXCJpbi1yZXN0XCIpKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHJlc3RfcGFyYW0gOj0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKHApKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAocCkpIGVsc2UgcCk7IE5pbCkpIGluIHN0YXRlKSBlbHNlIChsZXQgKCkgPSBpZ25vcmUgKChwYXJhbXMgOj0gc3hfYXBwZW5kX2IgIXBhcmFtcyAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAocCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKHN5bWJvbF9uYW1lIChwKSkgZWxzZSBwKTsgTmlsKSkgaW4gc3RhdGUpKSkpIChsZXQgX2QgPSBIYXNodGJsLmNyZWF0ZSAxIGluIEhhc2h0YmwucmVwbGFjZSBfZCAodmFsdWVfdG9fc3RyIChTdHJpbmcgXCJpbi1yZXN0XCIpKSAoQm9vbCBmYWxzZSk7ICBEaWN0IF9kKSAoc3hfdG9fbGlzdCBwYXJhbXNfZXhwcikpKSBpbiAoTGlzdCBbIXBhcmFtczsgIXJlc3RfcGFyYW1dKSkpXG5cbigqIHFxLWV4cGFuZCAqKVxuYW5kIHFxX2V4cGFuZCB0ZW1wbGF0ZSBlbnYgPVxuICAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICh0ZW1wbGF0ZSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSkpKSkgdGhlbiB0ZW1wbGF0ZSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wICh0ZW1wbGF0ZSkpKSB0aGVuIChMaXN0IFtdKSBlbHNlIChsZXQgaGVhZCA9IChmaXJzdCAodGVtcGxhdGUpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKHN5bWJvbF9uYW1lIChoZWFkKSk7IChTdHJpbmcgXCJ1bnF1b3RlXCIpXSkpKSB0aGVuICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoICh0ZW1wbGF0ZSkgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIHJlc3VsdCcgaXRlbSAtPiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaXRlbSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKGl0ZW0pKTsgKE51bWJlciAyLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoaXRlbSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoc3ltYm9sX25hbWUgKChmaXJzdCAoaXRlbSkpKSk7IChTdHJpbmcgXCJzcGxpY2UtdW5xdW90ZVwiKV0pKSkpKSB0aGVuIChsZXQgc3BsaWNlZCA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChpdGVtKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChzcGxpY2VkKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkpIHRoZW4gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtyZXN1bHQnOyBzcGxpY2VkXSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgoaXNfbmlsIChzcGxpY2VkKSkpIHRoZW4gcmVzdWx0JyBlbHNlIChwcmltX2NhbGwgXCJjb25jYXRcIiBbcmVzdWx0JzsgKExpc3QgW3NwbGljZWRdKV0pKSkpIGVsc2UgKHByaW1fY2FsbCBcImNvbmNhdFwiIFtyZXN1bHQnOyAoTGlzdCBbKHFxX2V4cGFuZCAoaXRlbSkgKGVudikpXSldKSkpIChMaXN0IFtdKSAoc3hfdG9fbGlzdCB0ZW1wbGF0ZSkpKSkpKVxuXG4oKiBzZi1sZXRyZWMgKilcbmFuZCBzZl9sZXRyZWMgYXJncyBlbnYgPVxuICAobGV0IGJpbmRpbmdzID0gKGZpcnN0IChhcmdzKSkgaW4gbGV0IGJvZHkgPSAocmVzdCAoYXJncykpIGluIGxldCBsb2NhbCA9IChlbnZfZXh0ZW5kIChlbnYpKSBpbiBsZXQgbmFtZXMgPSByZWYgKChMaXN0IFtdKSkgaW4gbGV0IHZhbF9leHBycyA9IHJlZiAoKExpc3QgW10pKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChOdW1iZXIgMi4wKV0pKSkgdGhlbiAoTGlzdC5pdGVyIChmdW4gYmluZGluZyAtPiBpZ25vcmUgKChsZXQgdm5hbWUgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5nKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoKGZpcnN0IChiaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAoYmluZGluZykpKSBpbiAobGV0ICgpID0gaWdub3JlICgobmFtZXMgOj0gc3hfYXBwZW5kX2IgIW5hbWVzIHZuYW1lOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgodmFsX2V4cHJzIDo9IHN4X2FwcGVuZF9iICF2YWxfZXhwcnMgKG50aCAoYmluZGluZykgKChOdW1iZXIgMS4wKSkpOyBOaWwpKSBpbiAoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyB2bmFtZSkgTmlsKSkpKSkpIChzeF90b19saXN0IGJpbmRpbmdzKTsgTmlsKSBlbHNlIChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgcGFpcl9pZHggLT4gKGxldCB2bmFtZSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW3BhaXJfaWR4OyAoTnVtYmVyIDIuMCldKSkpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpKSBlbHNlIChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcIipcIiBbcGFpcl9pZHg7IChOdW1iZXIgMi4wKV0pKSkpIGluIGxldCB2YWxfZXhwciA9IChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtwYWlyX2lkeDsgKE51bWJlciAyLjApXSldKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChuYW1lcyA6PSBzeF9hcHBlbmRfYiAhbmFtZXMgdm5hbWU7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKCh2YWxfZXhwcnMgOj0gc3hfYXBwZW5kX2IgIXZhbF9leHBycyB2YWxfZXhwcjsgTmlsKSkgaW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgdm5hbWUpIE5pbCkpKSkpIE5pbCAoc3hfdG9fbGlzdCAocHJpbV9jYWxsIFwicmFuZ2VcIiBbKE51bWJlciAwLjApOyAocHJpbV9jYWxsIFwiL1wiIFsobGVuIChiaW5kaW5ncykpOyAoTnVtYmVyIDIuMCldKV0pKSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgobGV0IHZhbHVlcyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChsb2NhbCkpKSkpIChzeF90b19saXN0ICF2YWxfZXhwcnMpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKExpc3QuaXRlciAoZnVuIHBhaXIgLT4gaWdub3JlICgoZW52X2JpbmQgbG9jYWwgKHN4X3RvX3N0cmluZyAoZmlyc3QgKHBhaXIpKSkgKG50aCAocGFpcikgKChOdW1iZXIgMS4wKSkpKSkpIChzeF90b19saXN0IChwcmltX2NhbGwgXCJ6aXBcIiBbIW5hbWVzOyB2YWx1ZXNdKSk7IE5pbCkpIGluIChMaXN0Lml0ZXIgKGZ1biB2YWwnIC0+IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGlzX2xhbWJkYSAodmFsJykpKSB0aGVuIChMaXN0Lml0ZXIgKGZ1biBuIC0+IGlnbm9yZSAoKGVudl9iaW5kIChsYW1iZGFfY2xvc3VyZSAodmFsJykpIChzeF90b19zdHJpbmcgbikgKGVudl9nZXQgKGxvY2FsKSAobikpKSkpIChzeF90b19saXN0ICFuYW1lcyk7IE5pbCkgZWxzZSBOaWwpKSkgKHN4X3RvX2xpc3QgdmFsdWVzKTsgTmlsKSkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gZSAtPiBpZ25vcmUgKCh0cmFtcG9saW5lICgoZXZhbF9leHByIChlKSAobG9jYWwpKSkpKSkgKHN4X3RvX2xpc3QgKHByaW1fY2FsbCBcInNsaWNlXCIgW2JvZHk7IChOdW1iZXIgMC4wKTsgKHByaW1fY2FsbCBcImRlY1wiIFsobGVuIChib2R5KSldKV0pKTsgTmlsKSkgaW4gKG1ha2VfdGh1bmsgKChsYXN0IChib2R5KSkpIChsb2NhbCkpKSkpKVxuXG4oKiBzdGVwLXNmLWxldHJlYyAqKVxuYW5kIHN0ZXBfc2ZfbGV0cmVjIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IHRoayA9IChzZl9sZXRyZWMgKGFyZ3MpIChlbnYpKSBpbiAobWFrZV9jZWtfc3RhdGUgKCh0aHVua19leHByICh0aGspKSkgKCh0aHVua19lbnYgKHRoaykpKSAoa29udCkpKVxuXG4oKiBzZi1keW5hbWljLXdpbmQgKilcbmFuZCBzZl9keW5hbWljX3dpbmQgYXJncyBlbnYgPVxuICAobGV0IGJlZm9yZSA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGFyZ3MpKSkgKGVudikpKSkgaW4gbGV0IGJvZHkgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBpbiBsZXQgYWZ0ZXIgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMi4wKSkpKSAoZW52KSkpKSBpbiAoZHluYW1pY193aW5kX2NhbGwgKGJlZm9yZSkgKGJvZHkpIChhZnRlcikgKGVudikpKVxuXG4oKiBzZi1zY29wZSAqKVxuYW5kIHNmX3Njb3BlIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgcmVzdCA9IChwcmltX2NhbGwgXCJzbGljZVwiIFthcmdzOyAoTnVtYmVyIDEuMCldKSBpbiBsZXQgdmFsJyA9IHJlZiAoTmlsKSBpbiBsZXQgYm9keV9leHBycyA9IHJlZiAoTmlsKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAocmVzdCkpOyAoTnVtYmVyIDIuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChyZXN0KSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgoZmlyc3QgKHJlc3QpKSkpOyAoU3RyaW5nIFwidmFsdWVcIildKSkpKSB0aGVuIChsZXQgKCkgPSBpZ25vcmUgKCh2YWwnIDo9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChyZXN0KSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpOyBOaWwpKSBpbiAoYm9keV9leHBycyA6PSAocHJpbV9jYWxsIFwic2xpY2VcIiBbcmVzdDsgKE51bWJlciAyLjApXSk7IE5pbCkpIGVsc2UgKGJvZHlfZXhwcnMgOj0gcmVzdDsgTmlsKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzY29wZV9wdXNoIChuYW1lKSAoIXZhbCcpKSkgaW4gKGxldCByZXN1bHQnID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBlIC0+IGlnbm9yZSAoKHJlc3VsdCcgOj0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGUpIChlbnYpKSkpOyBOaWwpKSkgKHN4X3RvX2xpc3QgIWJvZHlfZXhwcnMpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluICFyZXN1bHQnKSkpKSkpXG5cbigqIHNmLXByb3ZpZGUgKilcbmFuZCBzZl9wcm92aWRlIGFyZ3MgZW52ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgdmFsJyA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIGxldCBib2R5X2V4cHJzID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMi4wKV0pIGluIGxldCByZXN1bHQnID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzY29wZV9wdXNoIChuYW1lKSAodmFsJykpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gZSAtPiBpZ25vcmUgKChyZXN1bHQnIDo9ICh0cmFtcG9saW5lICgoZXZhbF9leHByIChlKSAoZW52KSkpKTsgTmlsKSkpIChzeF90b19saXN0IGJvZHlfZXhwcnMpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluICFyZXN1bHQnKSkpKVxuXG4oKiBleHBhbmQtbWFjcm8gKilcbmFuZCBleHBhbmRfbWFjcm8gbWFjIHJhd19hcmdzIGVudiA9XG4gIChsZXQgbG9jYWwgPSAoZW52X21lcmdlICgobWFjcm9fY2xvc3VyZSAobWFjKSkpIChlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcGFpciAtPiBpZ25vcmUgKChlbnZfYmluZCBsb2NhbCAoc3hfdG9fc3RyaW5nIChmaXJzdCAocGFpcikpKSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPFwiIFsobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSk7IChsZW4gKHJhd19hcmdzKSldKSkgdGhlbiAobnRoIChyYXdfYXJncykgKChudGggKHBhaXIpICgoTnVtYmVyIDEuMCkpKSkpIGVsc2UgTmlsKSkpKSAoc3hfdG9fbGlzdCAoTGlzdCAoTGlzdC5tYXBpIChmdW4gaSBwIC0+IGxldCBpID0gTnVtYmVyIChmbG9hdF9vZl9pbnQgaSkgaW4gKExpc3QgW3A7IGldKSkgKHN4X3RvX2xpc3QgKG1hY3JvX3BhcmFtcyAobWFjKSkpKSkpOyBOaWwpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobWFjcm9fcmVzdF9wYXJhbSAobWFjKSkpIHRoZW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgKG1hY3JvX3Jlc3RfcGFyYW0gKG1hYykpKSAocHJpbV9jYWxsIFwic2xpY2VcIiBbcmF3X2FyZ3M7IChsZW4gKChtYWNyb19wYXJhbXMgKG1hYykpKSldKSkgZWxzZSBOaWwpKSBpbiAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG1hY3JvX2JvZHkgKG1hYykpKSAobG9jYWwpKSkpKSkpXG5cbigqIGNlay1ydW4g4oCUIGl0ZXJhdGl2ZSB0byBhdm9pZCBPQ2FtbCBzdGFjayBvdmVyZmxvdyBpbiBqc19vZl9vY2FtbC9XQVNNICopXG5hbmQgY2VrX3J1biBzdGF0ZSA9XG4gIGxldCBzID0gcmVmIHN0YXRlIGluXG4gIHdoaWxlIG5vdCAobWF0Y2ggY2VrX3Rlcm1pbmFsX3AgIXMgd2l0aCBCb29sIHRydWUgLT4gdHJ1ZSB8IF8gLT4gZmFsc2UpIGRvXG4gICAgcyA6PSBjZWtfc3RlcCAhc1xuICBkb25lO1xuICBjZWtfdmFsdWUgIXNcblxuKCogY2VrLXN0ZXAgKilcbmFuZCBjZWtfc3RlcCBzdGF0ZSA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhjZWtfcGhhc2UgKHN0YXRlKSk7IChTdHJpbmcgXCJldmFsXCIpXSkpIHRoZW4gKHN0ZXBfZXZhbCAoc3RhdGUpKSBlbHNlIChzdGVwX2NvbnRpbnVlIChzdGF0ZSkpKVxuXG4oKiBzdGVwLWV2YWwgKilcbmFuZCBzdGVwX2V2YWwgc3RhdGUgPVxuICAobGV0IGV4cHIgPSAoY2VrX2NvbnRyb2wgKHN0YXRlKSkgaW4gbGV0IGVudiA9IChjZWtfZW52IChzdGF0ZSkpIGluIGxldCBrb250ID0gKGNla19rb250IChzdGF0ZSkpIGluIChsZXQgX21hdGNoX3ZhbCA9ICh0eXBlX29mIChleHByKSkgaW4gKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwibnVtYmVyXCIpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChleHByKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwic3RyaW5nXCIpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChleHByKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwiYm9vbGVhblwiKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoZXhwcikgKGVudikgKGtvbnQpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcIm5pbFwiKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIF9tYXRjaF92YWwgPSAoU3RyaW5nIFwic3ltYm9sXCIpIHRoZW4gKGxldCBuYW1lID0gKHN5bWJvbF9uYW1lIChleHByKSkgaW4gKGxldCB2YWwnID0gKGlmIHN4X3RydXRoeSAoKGVudl9oYXMgKGVudikgKG5hbWUpKSkgdGhlbiAoZW52X2dldCAoZW52KSAobmFtZSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGlzX3ByaW1pdGl2ZSAobmFtZSkpKSB0aGVuIChnZXRfcHJpbWl0aXZlIChuYW1lKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwidHJ1ZVwiKV0pKSB0aGVuIChCb29sIHRydWUpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZhbHNlXCIpXSkpIHRoZW4gKEJvb2wgZmFsc2UpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm5pbFwiKV0pKSB0aGVuIE5pbCBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlVuZGVmaW5lZCBzeW1ib2w6IFwiKTsgbmFtZV0pKSkpKSkpKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChpc19uaWwgKHZhbCcpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwic3RhcnRzLXdpdGg/XCIgW25hbWU7IChTdHJpbmcgXCJ+XCIpXSkpKSB0aGVuIChkZWJ1Z19sb2cgKChTdHJpbmcgXCJDb21wb25lbnQgbm90IGZvdW5kOlwiKSkgKG5hbWUpKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsJykgKGVudikgKGtvbnQpKSkpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImtleXdvcmRcIikgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChrZXl3b3JkX25hbWUgKGV4cHIpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImRpY3RcIikgdGhlbiAobGV0IGtzID0gKHByaW1fY2FsbCBcImtleXNcIiBbZXhwcl0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChrcykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKSkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgZmlyc3Rfa2V5ID0gKGZpcnN0IChrcykpIGluIGxldCByZW1haW5pbmdfZW50cmllcyA9IHJlZiAoKExpc3QgW10pKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gayAtPiBpZ25vcmUgKChyZW1haW5pbmdfZW50cmllcyA6PSBzeF9hcHBlbmRfYiAhcmVtYWluaW5nX2VudHJpZXMgKExpc3QgW2s7IChnZXQgKGV4cHIpIChrKSldKTsgTmlsKSkpIChzeF90b19saXN0IChyZXN0IChrcykpKTsgTmlsKSkgaW4gKG1ha2VfY2VrX3N0YXRlICgoZ2V0IChleHByKSAoZmlyc3Rfa2V5KSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9kaWN0X2ZyYW1lICghcmVtYWluaW5nX2VudHJpZXMpICgoTGlzdCBbKExpc3QgW2ZpcnN0X2tleV0pXSkpIChlbnYpKSkgKGtvbnQpKSkpKSkpKSBlbHNlIChpZiBfbWF0Y2hfdmFsID0gKFN0cmluZyBcImxpc3RcIikgdGhlbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoZXhwcikpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKHN0ZXBfZXZhbF9saXN0IChleHByKSAoZW52KSAoa29udCkpKSBlbHNlIChtYWtlX2Nla192YWx1ZSAoZXhwcikgKGVudikgKGtvbnQpKSkpKSkpKSkpKSlcblxuKCogc3RlcC1ldmFsLWxpc3QgKilcbmFuZCBzdGVwX2V2YWxfbGlzdCBleHByIGVudiBrb250ID1cbiAgKGxldCBoZWFkID0gKGZpcnN0IChleHByKSkgaW4gbGV0IGFyZ3MgPSAocmVzdCAoZXhwcikpIGluIChpZiBzeF90cnV0aHkgKChCb29sIChub3QgKHN4X3RydXRoeSAoKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGhlYWQpKTsgKFN0cmluZyBcImxhbWJkYVwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSkpKSkpKSB0aGVuIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChleHByKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoTGlzdCBbXSkpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoZXhwcikpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfbWFwX2ZyYW1lIChOaWwpICgocmVzdCAoZXhwcikpKSAoKExpc3QgW10pKSAoZW52KSkpIChrb250KSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoaGVhZCkpOyAoU3RyaW5nIFwic3ltYm9sXCIpXSkpIHRoZW4gKGxldCBuYW1lID0gKHN5bWJvbF9uYW1lIChoZWFkKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImlmXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfaWYgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwid2hlblwiKV0pKSB0aGVuIChzdGVwX3NmX3doZW4gKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiY29uZFwiKV0pKSB0aGVuIChzdGVwX3NmX2NvbmQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiY2FzZVwiKV0pKSB0aGVuIChzdGVwX3NmX2Nhc2UgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiYW5kXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfYW5kIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm9yXCIpXSkpIHRoZW4gKHN0ZXBfc2Zfb3IgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibGV0XCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGV0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImxldCpcIildKSkgdGhlbiAoc3RlcF9zZl9sZXQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibGFtYmRhXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGFtYmRhIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZuXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfbGFtYmRhIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZmluZVwiKV0pKSB0aGVuIChzdGVwX3NmX2RlZmluZSAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJkZWZjb21wXCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc2ZfZGVmY29tcCAoYXJncykgKGVudikpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZmlzbGFuZFwiKV0pKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKHNmX2RlZmlzbGFuZCAoYXJncykgKGVudikpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRlZm1hY3JvXCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc2ZfZGVmbWFjcm8gKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJiZWdpblwiKV0pKSB0aGVuIChzdGVwX3NmX2JlZ2luIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImRvXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfYmVnaW4gKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicXVvdGVcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChhcmdzKSkpIHRoZW4gTmlsIGVsc2UgKGZpcnN0IChhcmdzKSkpKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInF1YXNpcXVvdGVcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChxcV9leHBhbmQgKChmaXJzdCAoYXJncykpKSAoZW52KSkpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiLT5cIildKSkgdGhlbiAoc3RlcF9zZl90aHJlYWRfZmlyc3QgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwic2V0IVwiKV0pKSB0aGVuIChzdGVwX3NmX3NldF9iIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImxldHJlY1wiKV0pKSB0aGVuIChzdGVwX3NmX2xldHJlYyAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJyZXNldFwiKV0pKSB0aGVuIChzdGVwX3NmX3Jlc2V0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNoaWZ0XCIpXSkpIHRoZW4gKHN0ZXBfc2Zfc2hpZnQgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiZGVyZWZcIildKSkgdGhlbiAoc3RlcF9zZl9kZXJlZiAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJzY29wZVwiKV0pKSB0aGVuIChzdGVwX3NmX3Njb3BlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInByb3ZpZGVcIildKSkgdGhlbiAoc3RlcF9zZl9wcm92aWRlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImNvbnRleHRcIildKSkgdGhlbiAoc3RlcF9zZl9jb250ZXh0IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImVtaXQhXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfZW1pdCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJlbWl0dGVkXCIpXSkpIHRoZW4gKHN0ZXBfc2ZfZW1pdHRlZCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJkeW5hbWljLXdpbmRcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChzZl9keW5hbWljX3dpbmQgKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJtYXBcIildKSkgdGhlbiAoc3RlcF9ob19tYXAgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwibWFwLWluZGV4ZWRcIildKSkgdGhlbiAoc3RlcF9ob19tYXBfaW5kZXhlZCAoYXJncykgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmaWx0ZXJcIildKSkgdGhlbiAoc3RlcF9ob19maWx0ZXIgKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKHN0ZXBfaG9fcmVkdWNlIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNvbWVcIildKSkgdGhlbiAoc3RlcF9ob19zb21lIChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImV2ZXJ5P1wiKV0pKSB0aGVuIChzdGVwX2hvX2V2ZXJ5IChhcmdzKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcImZvci1lYWNoXCIpXSkpIHRoZW4gKHN0ZXBfaG9fZm9yX2VhY2ggKGFyZ3MpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiaGFzLWtleT9cIiBbY3VzdG9tX3NwZWNpYWxfZm9ybXM7IG5hbWVdKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChjZWtfY2FsbCAoKGdldCAoY3VzdG9tX3NwZWNpYWxfZm9ybXMpIChuYW1lKSkpIChMaXN0IFthcmdzOyBlbnZdKSkpIChlbnYpIChrb250KSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAoZW52X2hhcyAoZW52KSAobmFtZSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChpc19tYWNybyAoKGVudl9nZXQgKGVudikgKG5hbWUpKSkpKSkgdGhlbiAobGV0IG1hYyA9IChlbnZfZ2V0IChlbnYpIChuYW1lKSkgaW4gKG1ha2VfY2VrX3N0YXRlICgoZXhwYW5kX21hY3JvIChtYWMpIChhcmdzKSAoZW52KSkpIChlbnYpIChrb250KSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gcmVuZGVyX2NoZWNrIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChjZWtfY2FsbCAocmVuZGVyX2NoZWNrKSAoTGlzdCBbZXhwcjsgZW52XSkpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChjZWtfY2FsbCAocmVuZGVyX2ZuKSAoTGlzdCBbZXhwcjsgZW52XSkpKSAoZW52KSAoa29udCkpIGVsc2UgKHN0ZXBfZXZhbF9jYWxsIChoZWFkKSAoYXJncykgKGVudikgKGtvbnQpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpIGVsc2UgKHN0ZXBfZXZhbF9jYWxsIChoZWFkKSAoYXJncykgKGVudikgKGtvbnQpKSkpKVxuXG4oKiBzdGVwLXNmLWlmICopXG5hbmQgc3RlcF9zZl9pZiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2lmX2ZyYW1lICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpICgoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPlwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgMi4wKV0pKSB0aGVuIChudGggKGFyZ3MpICgoTnVtYmVyIDIuMCkpKSBlbHNlIE5pbCkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2Ytd2hlbiAqKVxuYW5kIHN0ZXBfc2Zfd2hlbiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3doZW5fZnJhbWUgKChyZXN0IChhcmdzKSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2YtYmVnaW4gKilcbmFuZCBzdGVwX3NmX2JlZ2luIGFyZ3MgZW52IGtvbnQgPVxuICAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoYXJncykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoa29udCkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2JlZ2luX2ZyYW1lICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKSkpXG5cbigqIHN0ZXAtc2YtbGV0ICopXG5hbmQgc3RlcF9zZl9sZXQgYXJncyBlbnYga29udCA9XG4gIGxldCBwYWlycyA9IHJlZiBOaWwgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYXJncykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKCh0cmFtcG9saW5lICgoc2ZfbmFtZWRfbGV0IChhcmdzKSAoZW52KSkpKSkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgYmluZGluZ3MgPSAoZmlyc3QgKGFyZ3MpKSBpbiBsZXQgYm9keSA9IChyZXN0IChhcmdzKSkgaW4gbGV0IGxvY2FsID0gKGVudl9leHRlbmQgKGVudikpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChiaW5kaW5ncykpKSB0aGVuIChzdGVwX3NmX2JlZ2luIChib2R5KSAobG9jYWwpIChrb250KSkgZWxzZSAobGV0IGZpcnN0X2JpbmRpbmcgPSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAoKGZpcnN0IChiaW5kaW5ncykpKSk7IChOdW1iZXIgMi4wKV0pKSkgdGhlbiAoZmlyc3QgKGJpbmRpbmdzKSkgZWxzZSAoTGlzdCBbKGZpcnN0IChiaW5kaW5ncykpOyAobnRoIChiaW5kaW5ncykgKChOdW1iZXIgMS4wKSkpXSkpIGluIGxldCByZXN0X2JpbmRpbmdzID0gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKChmaXJzdCAoYmluZGluZ3MpKSkpOyAoTnVtYmVyIDIuMCldKSkpIHRoZW4gKHJlc3QgKGJpbmRpbmdzKSkgZWxzZSAobGV0IHBhaXJzID0gcmVmICgoTGlzdCBbXSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0LmZvbGRfbGVmdCAoZnVuIF9hY2MgaSAtPiAocGFpcnMgOj0gc3hfYXBwZW5kX2IgIXBhaXJzIChMaXN0IFsobnRoIChiaW5kaW5ncykgKChwcmltX2NhbGwgXCIqXCIgW2k7IChOdW1iZXIgMi4wKV0pKSk7IChudGggKGJpbmRpbmdzKSAoKHByaW1fY2FsbCBcImluY1wiIFsocHJpbV9jYWxsIFwiKlwiIFtpOyAoTnVtYmVyIDIuMCldKV0pKSldKTsgTmlsKSkgTmlsIChzeF90b19saXN0IChwcmltX2NhbGwgXCJyYW5nZVwiIFsoTnVtYmVyIDEuMCk7IChwcmltX2NhbGwgXCIvXCIgWyhsZW4gKGJpbmRpbmdzKSk7IChOdW1iZXIgMi4wKV0pXSkpKSkgaW4gIXBhaXJzKSkpIGluIChsZXQgdm5hbWUgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChmaXJzdF9iaW5kaW5nKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoKGZpcnN0IChmaXJzdF9iaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAoZmlyc3RfYmluZGluZykpKSBpbiAobWFrZV9jZWtfc3RhdGUgKChudGggKGZpcnN0X2JpbmRpbmcpICgoTnVtYmVyIDEuMCkpKSkgKGxvY2FsKSAoKGtvbnRfcHVzaCAoKG1ha2VfbGV0X2ZyYW1lICh2bmFtZSkgKHJlc3RfYmluZGluZ3MpIChib2R5KSAobG9jYWwpKSkgKGtvbnQpKSkpKSkpKSlcblxuKCogc3RlcC1zZi1kZWZpbmUgKilcbmFuZCBzdGVwX3NmX2RlZmluZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lX3N5bSA9IChmaXJzdCAoYXJncykpIGluIGxldCBoYXNfZWZmZWN0cyA9IChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI+PVwiIFsobGVuIChhcmdzKSk7IChOdW1iZXIgNC4wKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpKTsgKFN0cmluZyBcImVmZmVjdHNcIildKSkpIGluIGxldCB2YWxfaWR4ID0gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj49XCIgWyhsZW4gKGFyZ3MpKTsgKE51bWJlciA0LjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwia2V5d29yZFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChwcmltX2NhbGwgXCI9XCIgWyhrZXl3b3JkX25hbWUgKChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSkpOyAoU3RyaW5nIFwiZWZmZWN0c1wiKV0pKSkpIHRoZW4gKE51bWJlciAzLjApIGVsc2UgKE51bWJlciAxLjApKSBpbiBsZXQgZWZmZWN0X2xpc3QgPSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDQuMCldKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSk7IChTdHJpbmcgXCJrZXl3b3JkXCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKHByaW1fY2FsbCBcIj1cIiBbKGtleXdvcmRfbmFtZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSk7IChTdHJpbmcgXCJlZmZlY3RzXCIpXSkpKSkgdGhlbiAobnRoIChhcmdzKSAoKE51bWJlciAyLjApKSkgZWxzZSBOaWwpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKHZhbF9pZHgpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2RlZmluZV9mcmFtZSAoKHN5bWJvbF9uYW1lIChuYW1lX3N5bSkpKSAoZW52KSAoaGFzX2VmZmVjdHMpIChlZmZlY3RfbGlzdCkpKSAoa29udCkpKSkpXG5cbigqIHN0ZXAtc2Ytc2V0ISAqKVxuYW5kIHN0ZXBfc2Zfc2V0X2IgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2Vfc2V0X2ZyYW1lICgoc3ltYm9sX25hbWUgKChmaXJzdCAoYXJncykpKSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2YtYW5kICopXG5hbmQgc3RlcF9zZl9hbmQgYXJncyBlbnYga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChhcmdzKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCB0cnVlKSkgKGVudikgKGtvbnQpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9hbmRfZnJhbWUgKChyZXN0IChhcmdzKSkpIChlbnYpKSkgKGtvbnQpKSkpKVxuXG4oKiBzdGVwLXNmLW9yICopXG5hbmQgc3RlcF9zZl9vciBhcmdzIGVudiBrb250ID1cbiAgKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGVudikgKGtvbnQpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9vcl9mcmFtZSAoKHJlc3QgKGFyZ3MpKSkgKGVudikpKSAoa29udCkpKSkpXG5cbigqIHN0ZXAtc2YtY29uZCAqKVxuYW5kIHN0ZXBfc2ZfY29uZCBhcmdzIGVudiBrb250ID1cbiAgKGxldCBzY2hlbWVfcCA9IChjb25kX3NjaGVtZV9wIChhcmdzKSkgaW4gKGlmIHN4X3RydXRoeSAoc2NoZW1lX3ApIHRoZW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgY2xhdXNlID0gKGZpcnN0IChhcmdzKSkgaW4gbGV0IHRlc3QgPSAoZmlyc3QgKGNsYXVzZSkpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAodGVzdCkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoY2xhdXNlKSAoKE51bWJlciAxLjApKSkpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKHRlc3QpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9jb25kX2ZyYW1lIChhcmdzKSAoZW52KSAoKEJvb2wgdHJ1ZSkpKSkgKGtvbnQpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIjxcIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChsZXQgdGVzdCA9IChmaXJzdCAoYXJncykpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAodGVzdCkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSAoa29udCkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICh0ZXN0KSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfY29uZF9mcmFtZSAoYXJncykgKGVudikgKChCb29sIGZhbHNlKSkpKSAoa29udCkpKSkpKSkpKVxuXG4oKiBzdGVwLXNmLWNhc2UgKilcbmFuZCBzdGVwX3NmX2Nhc2UgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9jYXNlX2ZyYW1lIChOaWwpICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKVxuXG4oKiBzdGVwLXNmLXRocmVhZC1maXJzdCAqKVxuYW5kIHN0ZXBfc2ZfdGhyZWFkX2ZpcnN0IGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfdGhyZWFkX2ZyYW1lICgocmVzdCAoYXJncykpKSAoZW52KSkpIChrb250KSkpKVxuXG4oKiBzdGVwLXNmLWxhbWJkYSAqKVxuYW5kIHN0ZXBfc2ZfbGFtYmRhIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfdmFsdWUgKChzZl9sYW1iZGEgKGFyZ3MpIChlbnYpKSkgKGVudikgKGtvbnQpKVxuXG4oKiBzdGVwLXNmLXNjb3BlICopXG5hbmQgc3RlcF9zZl9zY29wZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgcmVzdF9hcmdzID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMS4wKV0pIGluIGxldCB2YWwnID0gcmVmIChOaWwpIGluIGxldCBib2R5ID0gcmVmIChOaWwpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI+PVwiIFsobGVuIChyZXN0X2FyZ3MpKTsgKE51bWJlciAyLjApXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKChmaXJzdCAocmVzdF9hcmdzKSkpKTsgKFN0cmluZyBcImtleXdvcmRcIildKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAocHJpbV9jYWxsIFwiPVwiIFsoa2V5d29yZF9uYW1lICgoZmlyc3QgKHJlc3RfYXJncykpKSk7IChTdHJpbmcgXCJ2YWx1ZVwiKV0pKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKHZhbCcgOj0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChudGggKHJlc3RfYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKTsgTmlsKSkgaW4gKGJvZHkgOj0gKHByaW1fY2FsbCBcInNsaWNlXCIgW3Jlc3RfYXJnczsgKE51bWJlciAyLjApXSk7IE5pbCkpIGVsc2UgKGJvZHkgOj0gcmVzdF9hcmdzOyBOaWwpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKCFib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoIWJvZHkpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3Njb3BlX2FjY19mcmFtZSAobmFtZSkgKCF2YWwnKSAoKHJlc3QgKCFib2R5KSkpIChlbnYpKSkgKGtvbnQpKSkpKSkpXG5cbigqIHN0ZXAtc2YtcHJvdmlkZSAqKVxuYW5kIHN0ZXBfc2ZfcHJvdmlkZSBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgdmFsJyA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgobnRoIChhcmdzKSAoKE51bWJlciAxLjApKSkpIChlbnYpKSkpIGluIGxldCBib2R5ID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW2FyZ3M7IChOdW1iZXIgMi4wKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYm9keSkpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfcHJvdmlkZV9mcmFtZSAobmFtZSkgKHZhbCcpICgocmVzdCAoYm9keSkpKSAoZW52KSkpIChrb250KSkpKSkpXG5cbigqIHN0ZXAtc2YtY29udGV4dCAqKVxuYW5kIHN0ZXBfc2ZfY29udGV4dCBhcmdzIGVudiBrb250ID1cbiAgKGxldCBuYW1lID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKChmaXJzdCAoYXJncykpKSAoZW52KSkpKSBpbiBsZXQgZGVmYXVsdF92YWwgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPj1cIiBbKGxlbiAoYXJncykpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBlbHNlIE5pbCkgaW4gbGV0IGZyYW1lID0gKGtvbnRfZmluZF9wcm92aWRlIChrb250KSAobmFtZSkpIGluIChtYWtlX2Nla192YWx1ZSAoKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoZnJhbWUpKSkgdGhlbiBkZWZhdWx0X3ZhbCBlbHNlIChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInZhbHVlXCIpKSkpKSAoZW52KSAoa29udCkpKVxuXG4oKiBzdGVwLXNmLWVtaXQgKilcbmFuZCBzdGVwX3NmX2VtaXQgYXJncyBlbnYga29udCA9XG4gIChsZXQgbmFtZSA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGFyZ3MpKSkgKGVudikpKSkgaW4gbGV0IHZhbCcgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKG50aCAoYXJncykgKChOdW1iZXIgMS4wKSkpKSAoZW52KSkpKSBpbiBsZXQgZnJhbWUgPSAoa29udF9maW5kX3Njb3BlX2FjYyAoa29udCkgKG5hbWUpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChmcmFtZSkgdGhlbiAoc3hfZGljdF9zZXRfYiBmcmFtZSAoU3RyaW5nIFwiZW1pdHRlZFwiKSAocHJpbV9jYWxsIFwiYXBwZW5kXCIgWyhnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVtaXR0ZWRcIikpKTsgKExpc3QgW3ZhbCddKV0pKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAoa29udCkpKSlcblxuKCogc3RlcC1zZi1lbWl0dGVkICopXG5hbmQgc3RlcF9zZl9lbWl0dGVkIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IG5hbWUgPSAodHJhbXBvbGluZSAoKGV2YWxfZXhwciAoKGZpcnN0IChhcmdzKSkpIChlbnYpKSkpIGluIGxldCBmcmFtZSA9IChrb250X2ZpbmRfc2NvcGVfYWNjIChrb250KSAobmFtZSkpIGluIChtYWtlX2Nla192YWx1ZSAoKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoZnJhbWUpKSkgdGhlbiAoTGlzdCBbXSkgZWxzZSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbWl0dGVkXCIpKSkpKSAoZW52KSAoa29udCkpKVxuXG4oKiBzdGVwLXNmLXJlc2V0ICopXG5hbmQgc3RlcF9zZl9yZXNldCBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX3Jlc2V0X2ZyYW1lIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtc2Ytc2hpZnQgKilcbmFuZCBzdGVwX3NmX3NoaWZ0IGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IGtfbmFtZSA9IChzeW1ib2xfbmFtZSAoKGZpcnN0IChhcmdzKSkpKSBpbiBsZXQgYm9keSA9IChudGggKGFyZ3MpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgY2FwdHVyZWRfcmVzdWx0ID0gKGtvbnRfY2FwdHVyZV90b19yZXNldCAoa29udCkpIGluIGxldCBjYXB0dXJlZCA9IChmaXJzdCAoY2FwdHVyZWRfcmVzdWx0KSkgaW4gbGV0IHJlc3Rfa29udCA9IChudGggKGNhcHR1cmVkX3Jlc3VsdCkgKChOdW1iZXIgMS4wKSkpIGluIChsZXQgayA9IChtYWtlX2Nla19jb250aW51YXRpb24gKGNhcHR1cmVkKSAocmVzdF9rb250KSkgaW4gKGxldCBzaGlmdF9lbnYgPSAoZW52X2V4dGVuZCAoZW52KSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGVudl9iaW5kIHNoaWZ0X2VudiAoc3hfdG9fc3RyaW5nIGtfbmFtZSkgaykpIGluIChtYWtlX2Nla19zdGF0ZSAoYm9keSkgKHNoaWZ0X2VudikgKHJlc3Rfa29udCkpKSkpKVxuXG4oKiBzdGVwLXNmLWRlcmVmICopXG5hbmQgc3RlcF9zZl9kZXJlZiBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2RlcmVmX2ZyYW1lIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIGNlay1jYWxsICopXG5hbmQgY2VrX2NhbGwgZiBhcmdzID1cbiAgKGxldCBhID0gKGlmIHN4X3RydXRoeSAoKGlzX25pbCAoYXJncykpKSB0aGVuIChMaXN0IFtdKSBlbHNlIGFyZ3MpIGluIChpZiBzeF90cnV0aHkgKChpc19uaWwgKGYpKSkgdGhlbiBOaWwgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9vciA9IChpc19sYW1iZGEgKGYpKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGlzX2NhbGxhYmxlIChmKSkpKSB0aGVuIChjZWtfcnVuICgoY29udGludWVfd2l0aF9jYWxsIChmKSAoYSkgKChtYWtlX2VudiAoKSkpIChhKSAoKExpc3QgW10pKSkpKSBlbHNlIE5pbCkpKVxuXG4oKiByZWFjdGl2ZS1zaGlmdC1kZXJlZiAqKVxuYW5kIHJlYWN0aXZlX3NoaWZ0X2RlcmVmIHNpZycgZW52IGtvbnQgPVxuICAobGV0IHNjYW5fcmVzdWx0ID0gKGtvbnRfY2FwdHVyZV90b19yZWFjdGl2ZV9yZXNldCAoa29udCkpIGluIGxldCBjYXB0dXJlZF9mcmFtZXMgPSAoZmlyc3QgKHNjYW5fcmVzdWx0KSkgaW4gbGV0IHJlc2V0X2ZyYW1lID0gKG50aCAoc2Nhbl9yZXN1bHQpICgoTnVtYmVyIDEuMCkpKSBpbiBsZXQgcmVtYWluaW5nX2tvbnQgPSAobnRoIChzY2FuX3Jlc3VsdCkgKChOdW1iZXIgMi4wKSkpIGluIGxldCB1cGRhdGVfZm4gPSAoZ2V0IChyZXNldF9mcmFtZSkgKChTdHJpbmcgXCJ1cGRhdGUtZm5cIikpKSBpbiAobGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgKChMaXN0IFtdKSkgaW4gKGxldCBzdWJzY3JpYmVyID0gKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gbGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgTmlsIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBkIC0+IGlnbm9yZSAoKGNla19jYWxsIChkKSAoTmlsKSkpKSAoc3hfdG9fbGlzdCAhc3ViX2Rpc3Bvc2Vycyk7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChzdWJfZGlzcG9zZXJzIDo9IChMaXN0IFtdKTsgTmlsKSkgaW4gKGxldCBuZXdfcmVzZXQgPSAobWFrZV9yZWFjdGl2ZV9yZXNldF9mcmFtZSAoZW52KSAodXBkYXRlX2ZuKSAoKEJvb2wgZmFsc2UpKSkgaW4gbGV0IG5ld19rb250ID0gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtjYXB0dXJlZF9mcmFtZXM7IChMaXN0IFtuZXdfcmVzZXRdKTsgcmVtYWluaW5nX2tvbnRdKSBpbiAod2l0aF9pc2xhbmRfc2NvcGUgKChOYXRpdmVGbiAoXCJcXDIwNlxcMTg3XCIsIGZ1biBfYXJncyAtPiBtYXRjaCBfYXJncyB3aXRoIFtkXSAtPiAoZnVuIGQgLT4gbGV0IHN1Yl9kaXNwb3NlcnMgPSByZWYgTmlsIGluIChzdWJfZGlzcG9zZXJzIDo9IHN4X2FwcGVuZF9iICFzdWJfZGlzcG9zZXJzIGQ7IE5pbCkpIGQgfCBfIC0+IE5pbCkpKSAoKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gKGNla19ydW4gKChtYWtlX2Nla192YWx1ZSAoKHNpZ25hbF92YWx1ZSAoc2lnJykpKSAoZW52KSAobmV3X2tvbnQpKSkpKSAoKSkpKSkpKSkpICgpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKHNpZ25hbF9hZGRfc3ViX2IgKHNpZycpIChzdWJzY3JpYmVyKSkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChyZWdpc3Rlcl9pbl9zY29wZSAoKE5hdGl2ZUZuIChcIlxcMjA2XFwxODdcIiwgZnVuIF9hcmdzIC0+IChmdW4gKCkgLT4gKGxldCAoKSA9IGlnbm9yZSAoKHNpZ25hbF9yZW1vdmVfc3ViX2IgKHNpZycpIChzdWJzY3JpYmVyKSkpIGluIChMaXN0Lml0ZXIgKGZ1biBkIC0+IGlnbm9yZSAoKGNla19jYWxsIChkKSAoTmlsKSkpKSAoc3hfdG9fbGlzdCAhc3ViX2Rpc3Bvc2Vycyk7IE5pbCkpKSAoKSkpKSkpIGluIChsZXQgaW5pdGlhbF9rb250ID0gKHByaW1fY2FsbCBcImNvbmNhdFwiIFtjYXB0dXJlZF9mcmFtZXM7IChMaXN0IFtyZXNldF9mcmFtZV0pOyByZW1haW5pbmdfa29udF0pIGluIChtYWtlX2Nla192YWx1ZSAoKHNpZ25hbF92YWx1ZSAoc2lnJykpKSAoZW52KSAoaW5pdGlhbF9rb250KSkpKSkpKSlcblxuKCogc3RlcC1ldmFsLWNhbGwgKilcbmFuZCBzdGVwX2V2YWxfY2FsbCBoZWFkIGFyZ3MgZW52IGtvbnQgPVxuICAobGV0IGhuYW1lID0gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGhlYWQpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoaGVhZCkpIGVsc2UgTmlsKSBpbiAobWFrZV9jZWtfc3RhdGUgKGhlYWQpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKE5pbCkgKChMaXN0IFtdKSkgKGFyZ3MpIChlbnYpIChhcmdzKSAoaG5hbWUpKSkgKGtvbnQpKSkpKVxuXG4oKiBoby1mb3JtLW5hbWU/ICopXG5hbmQgaG9fZm9ybV9uYW1lX3AgbmFtZSA9XG4gIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcIm1hcFwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAobGV0IF9vciA9IChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKV0pIGluIGlmIHN4X3RydXRoeSBfb3IgdGhlbiBfb3IgZWxzZSAobGV0IF9vciA9IChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmaWx0ZXJcIildKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChsZXQgX29yID0gKHByaW1fY2FsbCBcIj1cIiBbbmFtZTsgKFN0cmluZyBcInNvbWVcIildKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGxldCBfb3IgPSAocHJpbV9jYWxsIFwiPVwiIFtuYW1lOyAoU3RyaW5nIFwiZXZlcnk/XCIpXSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChwcmltX2NhbGwgXCI9XCIgW25hbWU7IChTdHJpbmcgXCJmb3ItZWFjaFwiKV0pKSkpKSkpXG5cbigqIGhvLWZuPyAqKVxuYW5kIGhvX2ZuX3AgdiA9XG4gIChsZXQgX29yID0gKGlzX2NhbGxhYmxlICh2KSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIChpc19sYW1iZGEgKHYpKSlcblxuKCogaG8tc3dhcC1hcmdzICopXG5hbmQgaG9fc3dhcF9hcmdzIGhvX3R5cGUgZXZhbGVkID1cbiAgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbaG9fdHlwZTsgKFN0cmluZyBcInJlZHVjZVwiKV0pKSB0aGVuIChsZXQgYSA9IChmaXJzdCAoZXZhbGVkKSkgaW4gbGV0IGIgPSAobnRoIChldmFsZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAoQm9vbCAobm90IChzeF90cnV0aHkgKChob19mbl9wIChhKSkpKSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChob19mbl9wIChiKSkpKSB0aGVuIChMaXN0IFtiOyAobnRoIChldmFsZWQpICgoTnVtYmVyIDIuMCkpKTsgYV0pIGVsc2UgZXZhbGVkKSkgZWxzZSAobGV0IGEgPSAoZmlyc3QgKGV2YWxlZCkpIGluIGxldCBiID0gKG50aCAoZXZhbGVkKSAoKE51bWJlciAxLjApKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaG9fZm5fcCAoYSkpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoaG9fZm5fcCAoYikpKSkgdGhlbiAoTGlzdCBbYjsgYV0pIGVsc2UgZXZhbGVkKSkpXG5cbigqIGhvLXNldHVwLWRpc3BhdGNoICopXG5hbmQgaG9fc2V0dXBfZGlzcGF0Y2ggaG9fdHlwZSBldmFsZWQgZW52IGtvbnQgPVxuICAobGV0IG9yZGVyZWQgPSAoaG9fc3dhcF9hcmdzIChob190eXBlKSAoZXZhbGVkKSkgaW4gKGxldCBmID0gKGZpcnN0IChvcmRlcmVkKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbaG9fdHlwZTsgKFN0cmluZyBcIm1hcFwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKGNvbGwpKV0pKSAoZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfbWFwX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKChMaXN0IFtdKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKExpc3QgW10pKSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoTnVtYmVyIDAuMCk7IChmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9tYXBfaW5kZXhlZF9mcmFtZSAoZikgKChyZXN0IChjb2xsKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwiZmlsdGVyXCIpXSkpIHRoZW4gKGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoTGlzdCBbXSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9maWx0ZXJfZnJhbWUgKGYpICgocmVzdCAoY29sbCkpKSAoKExpc3QgW10pKSAoKGZpcnN0IChjb2xsKSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKGxldCBpbml0ID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMi4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChpbml0KSAoZW52KSAoa29udCkpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFtpbml0OyAoZmlyc3QgKGNvbGwpKV0pKSAoZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfcmVkdWNlX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJzb21lXCIpXSkpIHRoZW4gKGxldCBjb2xsID0gKG50aCAob3JkZXJlZCkgKChOdW1iZXIgMS4wKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChjb2xsKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCBmYWxzZSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9zb21lX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2hvX3R5cGU7IChTdHJpbmcgXCJldmVyeVwiKV0pKSB0aGVuIChsZXQgY29sbCA9IChudGggKG9yZGVyZWQpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAoY29sbCkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoKEJvb2wgdHJ1ZSkpIChlbnYpIChrb250KSkgZWxzZSAoY29udGludWVfd2l0aF9jYWxsIChmKSAoKExpc3QgWyhmaXJzdCAoY29sbCkpXSkpIChlbnYpICgoTGlzdCBbXSkpICgoa29udF9wdXNoICgobWFrZV9ldmVyeV9mcmFtZSAoZikgKChyZXN0IChjb2xsKSkpIChlbnYpKSkgKGtvbnQpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtob190eXBlOyAoU3RyaW5nIFwiZm9yLWVhY2hcIildKSkgdGhlbiAobGV0IGNvbGwgPSAobnRoIChvcmRlcmVkKSAoKE51bWJlciAxLjApKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGNvbGwpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGVudikgKGtvbnQpKSBlbHNlIChjb250aW51ZV93aXRoX2NhbGwgKGYpICgoTGlzdCBbKGZpcnN0IChjb2xsKSldKSkgKGVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX2Zvcl9lYWNoX2ZyYW1lIChmKSAoKHJlc3QgKGNvbGwpKSkgKGVudikpKSAoa29udCkpKSkpKSBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIlVua25vd24gSE8gdHlwZTogXCIpOyBob190eXBlXSkpKSkpKSkpKSkpKSkpXG5cbigqIHN0ZXAtaG8tbWFwICopXG5hbmQgc3RlcF9ob19tYXAgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcIm1hcFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tbWFwLWluZGV4ZWQgKilcbmFuZCBzdGVwX2hvX21hcF9pbmRleGVkIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJtYXAtaW5kZXhlZFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZmlsdGVyICopXG5hbmQgc3RlcF9ob19maWx0ZXIgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcImZpbHRlclwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tcmVkdWNlICopXG5hbmQgc3RlcF9ob19yZWR1Y2UgYXJncyBlbnYga29udCA9XG4gIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChhcmdzKSkpIChlbnYpICgoa29udF9wdXNoICgobWFrZV9ob19zZXR1cF9mcmFtZSAoKFN0cmluZyBcInJlZHVjZVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tc29tZSAqKVxuYW5kIHN0ZXBfaG9fc29tZSBhcmdzIGVudiBrb250ID1cbiAgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKGFyZ3MpKSkgKGVudikgKChrb250X3B1c2ggKChtYWtlX2hvX3NldHVwX2ZyYW1lICgoU3RyaW5nIFwic29tZVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZXZlcnkgKilcbmFuZCBzdGVwX2hvX2V2ZXJ5IGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJldmVyeVwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtaG8tZm9yLWVhY2ggKilcbmFuZCBzdGVwX2hvX2Zvcl9lYWNoIGFyZ3MgZW52IGtvbnQgPVxuICAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYXJncykpKSAoZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKChTdHJpbmcgXCJmb3ItZWFjaFwiKSkgKChyZXN0IChhcmdzKSkpICgoTGlzdCBbXSkpIChlbnYpKSkgKGtvbnQpKSkpXG5cbigqIHN0ZXAtY29udGludWUgKilcbmFuZCBzdGVwX2NvbnRpbnVlIHN0YXRlID1cbiAgKGxldCB2YWx1ZSA9IChjZWtfdmFsdWUgKHN0YXRlKSkgaW4gbGV0IGVudiA9IChjZWtfZW52IChzdGF0ZSkpIGluIGxldCBrb250ID0gKGNla19rb250IChzdGF0ZSkpIGluIChpZiBzeF90cnV0aHkgKChrb250X2VtcHR5X3AgKGtvbnQpKSkgdGhlbiBzdGF0ZSBlbHNlIChsZXQgZnJhbWUgPSAoa29udF90b3AgKGtvbnQpKSBpbiBsZXQgcmVzdF9rID0gKGtvbnRfcG9wIChrb250KSkgaW4gbGV0IGZ0ID0gKGZyYW1lX3R5cGUgKGZyYW1lKSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJpZlwiKV0pKSB0aGVuIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IHZhbHVlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAodmFsdWUpKSkpKSkpKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidGhlblwiKSkpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19uaWwgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVsc2VcIikpKSkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVsc2VcIikpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpKSAocmVzdF9rKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwid2hlblwiKV0pKSB0aGVuIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IHZhbHVlIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX25pbCAodmFsdWUpKSkpKSkpKSB0aGVuIChsZXQgYm9keSA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImJvZHlcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChib2R5KSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChmZW52KSAocmVzdF9rKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsobGVuIChib2R5KSk7IChOdW1iZXIgMS4wKV0pKSB0aGVuIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChib2R5KSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAoYm9keSkpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2JlZ2luX2ZyYW1lICgocmVzdCAoYm9keSkpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSBlbHNlIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZW52KSAocmVzdF9rKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJiZWdpblwiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyhsZW4gKHJlbWFpbmluZykpOyAoTnVtYmVyIDEuMCldKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfYmVnaW5fZnJhbWUgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImxldFwiKV0pKSB0aGVuIChsZXQgbmFtZSA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcIm5hbWVcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGJvZHkgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJib2R5XCIpKSkgaW4gbGV0IGxvY2FsID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKHN0ZXBfc2ZfYmVnaW4gKGJvZHkpIChsb2NhbCkgKHJlc3RfaykpIGVsc2UgKGxldCBuZXh0X2JpbmRpbmcgPSAoZmlyc3QgKHJlbWFpbmluZykpIGluIGxldCB2bmFtZSA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mICgoZmlyc3QgKG5leHRfYmluZGluZykpKSk7IChTdHJpbmcgXCJzeW1ib2xcIildKSkgdGhlbiAoc3ltYm9sX25hbWUgKChmaXJzdCAobmV4dF9iaW5kaW5nKSkpKSBlbHNlIChmaXJzdCAobmV4dF9iaW5kaW5nKSkpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAobmV4dF9iaW5kaW5nKSAoKE51bWJlciAxLjApKSkpIChsb2NhbCkgKChrb250X3B1c2ggKChtYWtlX2xldF9mcmFtZSAodm5hbWUpICgocmVzdCAocmVtYWluaW5nKSkpIChib2R5KSAobG9jYWwpKSkgKHJlc3RfaykpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkZWZpbmVcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiBsZXQgaGFzX2VmZmVjdHMgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJoYXMtZWZmZWN0c1wiKSkpIGluIGxldCBlZmZlY3RfbGlzdCA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVmZmVjdC1saXN0XCIpKSkgaW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2xhbWJkYSAodmFsdWUpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoaXNfbmlsICgobGFtYmRhX25hbWUgKHZhbHVlKSkpKSkpIHRoZW4gKHNldF9sYW1iZGFfbmFtZSB2YWx1ZSAoc3hfdG9fc3RyaW5nIG5hbWUpKSBlbHNlIE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChlbnZfYmluZCBmZW52IChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5IChoYXNfZWZmZWN0cykgdGhlbiAobGV0IGVmZmVjdF9uYW1lcyA9IChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChlZmZlY3RfbGlzdCkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSB0aGVuIChMaXN0IChMaXN0Lm1hcCAoZnVuIGUgLT4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKHR5cGVfb2YgKGUpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pKSB0aGVuIChzeW1ib2xfbmFtZSAoZSkpIGVsc2UgKFN0cmluZyAoc3hfc3RyIFtlXSkpKSkgKHN4X3RvX2xpc3QgZWZmZWN0X2xpc3QpKSkgZWxzZSAoTGlzdCBbKFN0cmluZyAoc3hfc3RyIFtlZmZlY3RfbGlzdF0pKV0pKSBpbiBsZXQgZWZmZWN0X2FubnMgPSAoaWYgc3hfdHJ1dGh5ICgoZW52X2hhcyAoZmVudikgKChTdHJpbmcgXCIqZWZmZWN0LWFubm90YXRpb25zKlwiKSkpKSB0aGVuIChlbnZfZ2V0IChmZW52KSAoKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSkgZWxzZSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc3hfZGljdF9zZXRfYiBlZmZlY3RfYW5ucyBuYW1lIGVmZmVjdF9uYW1lcykpIGluIChlbnZfYmluZCBmZW52IChzeF90b19zdHJpbmcgKFN0cmluZyBcIiplZmZlY3QtYW5ub3RhdGlvbnMqXCIpKSBlZmZlY3RfYW5ucykpKSBlbHNlIE5pbCkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsdWUpIChmZW52KSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJzZXRcIildKSkgdGhlbiAobGV0IG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJuYW1lXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoZW52X3NldCBmZW52IChzeF90b19zdHJpbmcgbmFtZSkgdmFsdWUpKSBpbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZW52KSAocmVzdF9rKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiYW5kXCIpXSkpIHRoZW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICh2YWx1ZSkpKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkpICgoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsobGVuIChyZW1haW5pbmcpKTsgKE51bWJlciAxLjApXSkpIHRoZW4gcmVzdF9rIGVsc2UgKGtvbnRfcHVzaCAoKG1ha2VfYW5kX2ZyYW1lICgocmVzdCAocmVtYWluaW5nKSkpICgoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSkpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcIm9yXCIpXSkpIHRoZW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoQm9vbCBmYWxzZSkpIChlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpKSAoKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbKGxlbiAocmVtYWluaW5nKSk7IChOdW1iZXIgMS4wKV0pKSB0aGVuIHJlc3RfayBlbHNlIChrb250X3B1c2ggKChtYWtlX29yX2ZyYW1lICgocmVzdCAocmVtYWluaW5nKSkpICgoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSkpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImNvbmRcIildKSkgdGhlbiAobGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gbGV0IHNjaGVtZV9wID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwic2NoZW1lXCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoc2NoZW1lX3ApIHRoZW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgobnRoICgoZmlyc3QgKHJlbWFpbmluZykpKSAoKE51bWJlciAxLjApKSkpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobGV0IG5leHRfY2xhdXNlcyA9IChyZXN0IChyZW1haW5pbmcpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAobmV4dF9jbGF1c2VzKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobGV0IG5leHRfY2xhdXNlID0gKGZpcnN0IChuZXh0X2NsYXVzZXMpKSBpbiBsZXQgbmV4dF90ZXN0ID0gKGZpcnN0IChuZXh0X2NsYXVzZSkpIGluIChpZiBzeF90cnV0aHkgKChpc19lbHNlX2NsYXVzZSAobmV4dF90ZXN0KSkpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgobnRoIChuZXh0X2NsYXVzZSkgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlIChuZXh0X3Rlc3QpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfY29uZF9mcmFtZSAobmV4dF9jbGF1c2VzKSAoZmVudikgKChCb29sIHRydWUpKSkpIChyZXN0X2spKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICh2YWx1ZSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChudGggKHJlbWFpbmluZykgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCBuZXh0ID0gKHByaW1fY2FsbCBcInNsaWNlXCIgW3JlbWFpbmluZzsgKE51bWJlciAyLjApXSkgaW4gKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIjxcIiBbKGxlbiAobmV4dCkpOyAoTnVtYmVyIDIuMCldKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKE5pbCkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChsZXQgbmV4dF90ZXN0ID0gKGZpcnN0IChuZXh0KSkgaW4gKGlmIHN4X3RydXRoeSAoKGlzX2Vsc2VfY2xhdXNlIChuZXh0X3Rlc3QpKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKChudGggKG5leHQpICgoTnVtYmVyIDEuMCkpKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAobmV4dF90ZXN0KSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2NvbmRfZnJhbWUgKG5leHQpIChmZW52KSAoKEJvb2wgZmFsc2UpKSkpIChyZXN0X2spKSkpKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiY2FzZVwiKV0pKSB0aGVuIChsZXQgbWF0Y2hfdmFsID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibWF0Y2gtdmFsXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGlzX25pbCAobWF0Y2hfdmFsKSkpIHRoZW4gKHNmX2Nhc2Vfc3RlcF9sb29wICh2YWx1ZSkgKHJlbWFpbmluZykgKGZlbnYpIChyZXN0X2spKSBlbHNlIChzZl9jYXNlX3N0ZXBfbG9vcCAobWF0Y2hfdmFsKSAocmVtYWluaW5nKSAoZmVudikgKHJlc3RfaykpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInRocmVhZFwiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChsZXQgZm9ybSA9IChmaXJzdCAocmVtYWluaW5nKSkgaW4gbGV0IHJlc3RfZm9ybXMgPSAocmVzdCAocmVtYWluaW5nKSkgaW4gbGV0IG5ld19rb250ID0gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKChyZXN0IChyZW1haW5pbmcpKSkpKSB0aGVuIHJlc3RfayBlbHNlIChrb250X3B1c2ggKChtYWtlX3RocmVhZF9mcmFtZSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpIGluIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChwcmltX2NhbGwgXCI9XCIgWyh0eXBlX29mIChmb3JtKSk7IChTdHJpbmcgXCJsaXN0XCIpXSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoZW1wdHlfcCAoZm9ybSkpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAobGV0IF9hbmQgPSAocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoKGZpcnN0IChmb3JtKSkpKTsgKFN0cmluZyBcInN5bWJvbFwiKV0pIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChob19mb3JtX25hbWVfcCAoKHN5bWJvbF9uYW1lICgoZmlyc3QgKGZvcm0pKSkpKSkpKSkpIHRoZW4gKG1ha2VfY2VrX3N0YXRlICgoY29ucyAoKGZpcnN0IChmb3JtKSkpICgoY29ucyAoKExpc3QgWyhTeW1ib2wgXCJxdW90ZVwiKTsgdmFsdWVdKSkgKChyZXN0IChmb3JtKSkpKSkpKSAoZmVudikgKG5ld19rb250KSkgZWxzZSAobGV0IHJlc3VsdCcgPSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFsodHlwZV9vZiAoZm9ybSkpOyAoU3RyaW5nIFwibGlzdFwiKV0pKSB0aGVuIChsZXQgZiA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByICgoZmlyc3QgKGZvcm0pKSkgKGZlbnYpKSkpIGluIGxldCByYXJncyA9IChMaXN0IChMaXN0Lm1hcCAoZnVuIGEgLT4gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKGEpIChmZW52KSkpKSkgKHN4X3RvX2xpc3QgKHJlc3QgKGZvcm0pKSkpKSBpbiBsZXQgYWxsX2FyZ3MgPSAoY29ucyAodmFsdWUpIChyYXJncykpIGluIChpZiBzeF90cnV0aHkgKChsZXQgX2FuZCA9IChpc19jYWxsYWJsZSAoZikpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX2xhbWJkYSAoZikpKSkpKSkpIHRoZW4gKHN4X2FwcGx5IGYgYWxsX2FyZ3MpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGlzX2xhbWJkYSAoZikpKSB0aGVuICh0cmFtcG9saW5lICgoY2FsbF9sYW1iZGEgKGYpIChhbGxfYXJncykgKGZlbnYpKSkpIGVsc2UgKHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgKFN0cmluZyAoc3hfc3RyIFsoU3RyaW5nIFwiLT4gZm9ybSBub3QgY2FsbGFibGU6IFwiKTsgKGluc3BlY3QgKGYpKV0pKSkpKSkpKSBlbHNlIChsZXQgZiA9ICh0cmFtcG9saW5lICgoZXZhbF9leHByIChmb3JtKSAoZmVudikpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2NhbGxhYmxlIChmKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfbGFtYmRhIChmKSkpKSkpKSkgdGhlbiAoY2VrX2NhbGwgKGYpIChMaXN0IFt2YWx1ZV0pKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19sYW1iZGEgKGYpKSkgdGhlbiAodHJhbXBvbGluZSAoKGNhbGxfbGFtYmRhIChmKSAoKExpc3QgW3ZhbHVlXSkpIChmZW52KSkpKSBlbHNlIChyYWlzZSAoRXZhbF9lcnJvciAodmFsdWVfdG9fc3RyIChTdHJpbmcgKHN4X3N0ciBbKFN0cmluZyBcIi0+IGZvcm0gbm90IGNhbGxhYmxlOiBcIik7IChpbnNwZWN0IChmKSldKSkpKSkpKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZXN0X2Zvcm1zKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3RocmVhZF9mcmFtZSAocmVzdF9mb3JtcykgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImFyZ1wiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgZXZhbGVkID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZXZhbGVkXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gbGV0IHJhd19hcmdzID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmF3LWFyZ3NcIikpKSBpbiBsZXQgaG5hbWUgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJoZWFkLW5hbWVcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoaXNfbmlsIChmKSkpIHRoZW4gKGxldCAoKSA9IGlnbm9yZSAoKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gIV9zdHJpY3RfcmVmIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIGhuYW1lKSkgdGhlbiAoc3RyaWN0X2NoZWNrX2FyZ3MgKGhuYW1lKSAoKExpc3QgW10pKSkgZWxzZSBOaWwpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKGNvbnRpbnVlX3dpdGhfY2FsbCAodmFsdWUpICgoTGlzdCBbXSkpIChmZW52KSAocmF3X2FyZ3MpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKHZhbHVlKSAoKExpc3QgW10pKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikgKHJhd19hcmdzKSAoaG5hbWUpKSkgKHJlc3RfaykpKSkpKSBlbHNlIChsZXQgbmV3X2V2YWxlZCA9IChwcmltX2NhbGwgXCJhcHBlbmRcIiBbZXZhbGVkOyAoTGlzdCBbdmFsdWVdKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSAhX3N0cmljdF9yZWYgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgaG5hbWUpKSB0aGVuIChzdHJpY3RfY2hlY2tfYXJncyAoaG5hbWUpIChuZXdfZXZhbGVkKSkgZWxzZSBOaWwpKSBpbiAoY29udGludWVfd2l0aF9jYWxsIChmKSAobmV3X2V2YWxlZCkgKGZlbnYpIChyYXdfYXJncykgKHJlc3RfaykpKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobWFrZV9hcmdfZnJhbWUgKGYpIChuZXdfZXZhbGVkKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikgKHJhd19hcmdzKSAoaG5hbWUpKSkgKHJlc3RfaykpKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkaWN0XCIpXSkpIHRoZW4gKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgcmVzdWx0cyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlc3VsdHNcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChsZXQgbGFzdF9yZXN1bHQgPSAobGFzdCAocmVzdWx0cykpIGluIGxldCBjb21wbGV0ZWQgPSAocHJpbV9jYWxsIFwiYXBwZW5kXCIgWyhwcmltX2NhbGwgXCJzbGljZVwiIFtyZXN1bHRzOyAoTnVtYmVyIDAuMCk7IChwcmltX2NhbGwgXCJkZWNcIiBbKGxlbiAocmVzdWx0cykpXSldKTsgKExpc3QgWyhMaXN0IFsoZmlyc3QgKGxhc3RfcmVzdWx0KSk7IHZhbHVlXSldKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0IGQgPSAoRGljdCAoSGFzaHRibC5jcmVhdGUgMCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChMaXN0Lml0ZXIgKGZ1biBwYWlyIC0+IGlnbm9yZSAoKHN4X2RpY3Rfc2V0X2IgZCAoZmlyc3QgKHBhaXIpKSAobnRoIChwYWlyKSAoKE51bWJlciAxLjApKSkpKSkgKHN4X3RvX2xpc3QgY29tcGxldGVkKTsgTmlsKSkgaW4gKG1ha2VfY2VrX3ZhbHVlIChkKSAoZmVudikgKHJlc3RfaykpKSkgZWxzZSAobGV0IG5leHRfZW50cnkgPSAoZmlyc3QgKHJlbWFpbmluZykpIGluIChtYWtlX2Nla19zdGF0ZSAoKG50aCAobmV4dF9lbnRyeSkgKChOdW1iZXIgMS4wKSkpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX2RpY3RfZnJhbWUgKChyZXN0IChyZW1haW5pbmcpKSkgKChwcmltX2NhbGwgXCJhcHBlbmRcIiBbY29tcGxldGVkOyAoTGlzdCBbKExpc3QgWyhmaXJzdCAobmV4dF9lbnRyeSkpXSldKV0pKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcImhvLXNldHVwXCIpXSkpIHRoZW4gKGxldCBob190eXBlID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiaG8tdHlwZVwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZXZhbGVkID0gKHByaW1fY2FsbCBcImFwcGVuZFwiIFsoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJldmFsZWRcIikpKTsgKExpc3QgW3ZhbHVlXSldKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAoaG9fc2V0dXBfZGlzcGF0Y2ggKGhvX3R5cGUpIChldmFsZWQpIChmZW52KSAocmVzdF9rKSkgZWxzZSAobWFrZV9jZWtfc3RhdGUgKChmaXJzdCAocmVtYWluaW5nKSkpIChmZW52KSAoKGtvbnRfcHVzaCAoKG1ha2VfaG9fc2V0dXBfZnJhbWUgKGhvX3R5cGUpICgocmVzdCAocmVtYWluaW5nKSkpIChldmFsZWQpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInJlc2V0XCIpXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJkZXJlZlwiKV0pKSB0aGVuIChsZXQgdmFsJyA9IHZhbHVlIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfc2lnbmFsICh2YWwnKSkpKSkpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAodmFsJykgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChoYXNfcmVhY3RpdmVfcmVzZXRfZnJhbWVfcCAocmVzdF9rKSkpIHRoZW4gKHJlYWN0aXZlX3NoaWZ0X2RlcmVmICh2YWwnKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCAoKSA9IGlnbm9yZSAoKGxldCBjdHggPSAoc3hfY29udGV4dCAoKFN0cmluZyBcInN4LXJlYWN0aXZlXCIpKSAoTmlsKSkgaW4gKGlmIHN4X3RydXRoeSAoY3R4KSB0aGVuIChsZXQgZGVwX2xpc3QgPSByZWYgKChnZXQgKGN0eCkgKChTdHJpbmcgXCJkZXBzXCIpKSkpIGluIGxldCBub3RpZnlfZm4gPSAoZ2V0IChjdHgpICgoU3RyaW5nIFwibm90aWZ5XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiY29udGFpbnM/XCIgWyFkZXBfbGlzdDsgdmFsJ10pKSkpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoZGVwX2xpc3QgOj0gc3hfYXBwZW5kX2IgIWRlcF9saXN0IHZhbCc7IE5pbCkpIGluIChzaWduYWxfYWRkX3N1Yl9iICh2YWwnKSAobm90aWZ5X2ZuKSkpIGVsc2UgTmlsKSkgZWxzZSBOaWwpKSkgaW4gKG1ha2VfY2VrX3ZhbHVlICgoc2lnbmFsX3ZhbHVlICh2YWwnKSkpIChmZW52KSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJyZWFjdGl2ZS1yZXNldFwiKV0pKSB0aGVuIChsZXQgdXBkYXRlX2ZuID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidXBkYXRlLWZuXCIpKSkgaW4gbGV0IGZpcnN0X3AgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmaXJzdC1yZW5kZXJcIikpKSBpbiAobGV0ICgpID0gaWdub3JlICgoaWYgc3hfdHJ1dGh5ICgobGV0IF9hbmQgPSB1cGRhdGVfZm4gaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKEJvb2wgKG5vdCAoc3hfdHJ1dGh5IChmaXJzdF9wKSkpKSkpIHRoZW4gKGNla19jYWxsICh1cGRhdGVfZm4pICgoTGlzdCBbdmFsdWVdKSkpIGVsc2UgTmlsKSkgaW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGVudikgKHJlc3RfaykpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNjb3BlXCIpXSkpIHRoZW4gKGxldCBuYW1lID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibmFtZVwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobGV0ICgpID0gaWdub3JlICgoc2NvcGVfcG9wIChuYW1lKSkpIGluIChtYWtlX2Nla192YWx1ZSAodmFsdWUpIChmZW52KSAocmVzdF9rKSkpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3Njb3BlX2ZyYW1lIChuYW1lKSAoKHJlc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJwcm92aWRlXCIpXSkpIHRoZW4gKGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKG1ha2VfY2VrX3N0YXRlICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikgKChrb250X3B1c2ggKChtYWtlX3Byb3ZpZGVfZnJhbWUgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcIm5hbWVcIikpKSkgKChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInZhbHVlXCIpKSkpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNjb3BlLWFjY1wiKV0pKSB0aGVuIChsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoZW1wdHlfcCAocmVtYWluaW5nKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChtYWtlX2Nla19zdGF0ZSAoKGZpcnN0IChyZW1haW5pbmcpKSkgKGZlbnYpICgoa29udF9wdXNoICgobGV0IG5ld19mcmFtZSA9IChtYWtlX3Njb3BlX2FjY19mcmFtZSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwibmFtZVwiKSkpKSAoKGdldCAoZnJhbWUpICgoU3RyaW5nIFwidmFsdWVcIikpKSkgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoc3hfZGljdF9zZXRfYiBuZXdfZnJhbWUgKFN0cmluZyBcImVtaXR0ZWRcIikgKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW1pdHRlZFwiKSkpKSkgaW4gbmV3X2ZyYW1lKSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcIm1hcFwiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IHJlc3VsdHMgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZXN1bHRzXCIpKSkgaW4gbGV0IGluZGV4ZWQgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJpbmRleGVkXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0IG5ld19yZXN1bHRzID0gKHByaW1fY2FsbCBcImFwcGVuZFwiIFtyZXN1bHRzOyAoTGlzdCBbdmFsdWVdKV0pIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKG5ld19yZXN1bHRzKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGxldCBjYWxsX2FyZ3MgPSAoaWYgc3hfdHJ1dGh5IChpbmRleGVkKSB0aGVuIChMaXN0IFsobGVuIChuZXdfcmVzdWx0cykpOyAoZmlyc3QgKHJlbWFpbmluZykpXSkgZWxzZSAoTGlzdCBbKGZpcnN0IChyZW1haW5pbmcpKV0pKSBpbiBsZXQgbmV4dF9mcmFtZSA9IChpZiBzeF90cnV0aHkgKGluZGV4ZWQpIHRoZW4gKG1ha2VfbWFwX2luZGV4ZWRfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChuZXdfcmVzdWx0cykgKGZlbnYpKSBlbHNlIChtYWtlX21hcF9mcmFtZSAoZikgKChyZXN0IChyZW1haW5pbmcpKSkgKG5ld19yZXN1bHRzKSAoZmVudikpKSBpbiAoY29udGludWVfd2l0aF9jYWxsIChmKSAoY2FsbF9hcmdzKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKG5leHRfZnJhbWUpIChyZXN0X2spKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiZmlsdGVyXCIpXSkpIHRoZW4gKGxldCBmID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZlwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgcmVzdWx0cyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlc3VsdHNcIikpKSBpbiBsZXQgY3VycmVudF9pdGVtID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiY3VycmVudC1pdGVtXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAobGV0IG5ld19yZXN1bHRzID0gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKHByaW1fY2FsbCBcImFwcGVuZFwiIFtyZXN1bHRzOyAoTGlzdCBbY3VycmVudF9pdGVtXSldKSBlbHNlIHJlc3VsdHMpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKG5ld19yZXN1bHRzKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZmlsdGVyX2ZyYW1lIChmKSAoKHJlc3QgKHJlbWFpbmluZykpKSAobmV3X3Jlc3VsdHMpICgoZmlyc3QgKHJlbWFpbmluZykpKSAoZmVudikpKSAocmVzdF9rKSkpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwicmVkdWNlXCIpXSkpIHRoZW4gKGxldCBmID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZlwiKSkpIGluIGxldCByZW1haW5pbmcgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJyZW1haW5pbmdcIikpKSBpbiBsZXQgZmVudiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImVudlwiKSkpIGluIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKHZhbHVlKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFt2YWx1ZTsgKGZpcnN0IChyZW1haW5pbmcpKV0pKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX3JlZHVjZV9mcmFtZSAoZikgKChyZXN0IChyZW1haW5pbmcpKSkgKGZlbnYpKSkgKHJlc3RfaykpKSkpKSBlbHNlIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW2Z0OyAoU3RyaW5nIFwiZm9yLWVhY2hcIildKSkgdGhlbiAobGV0IGYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKHJlbWFpbmluZykpKSB0aGVuIChtYWtlX2Nla192YWx1ZSAoTmlsKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZm9yX2VhY2hfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgocHJpbV9jYWxsIFwiPVwiIFtmdDsgKFN0cmluZyBcInNvbWVcIildKSkgdGhlbiAobGV0IGYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJmXCIpKSkgaW4gbGV0IHJlbWFpbmluZyA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcInJlbWFpbmluZ1wiKSkpIGluIGxldCBmZW52ID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwiZW52XCIpKSkgaW4gKGlmIHN4X3RydXRoeSAodmFsdWUpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICh2YWx1ZSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChjb250aW51ZV93aXRoX2NhbGwgKGYpICgoTGlzdCBbKGZpcnN0IChyZW1haW5pbmcpKV0pKSAoZmVudikgKChMaXN0IFtdKSkgKChrb250X3B1c2ggKChtYWtlX3NvbWVfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKHByaW1fY2FsbCBcIj1cIiBbZnQ7IChTdHJpbmcgXCJldmVyeVwiKV0pKSB0aGVuIChsZXQgZiA9IChnZXQgKGZyYW1lKSAoKFN0cmluZyBcImZcIikpKSBpbiBsZXQgcmVtYWluaW5nID0gKGdldCAoZnJhbWUpICgoU3RyaW5nIFwicmVtYWluaW5nXCIpKSkgaW4gbGV0IGZlbnYgPSAoZ2V0IChmcmFtZSkgKChTdHJpbmcgXCJlbnZcIikpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoQm9vbCAobm90IChzeF90cnV0aHkgKHZhbHVlKSkpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIGZhbHNlKSkgKGZlbnYpIChyZXN0X2spKSBlbHNlIChpZiBzeF90cnV0aHkgKChlbXB0eV9wIChyZW1haW5pbmcpKSkgdGhlbiAobWFrZV9jZWtfdmFsdWUgKChCb29sIHRydWUpKSAoZmVudikgKHJlc3RfaykpIGVsc2UgKGNvbnRpbnVlX3dpdGhfY2FsbCAoZikgKChMaXN0IFsoZmlyc3QgKHJlbWFpbmluZykpXSkpIChmZW52KSAoKExpc3QgW10pKSAoKGtvbnRfcHVzaCAoKG1ha2VfZXZlcnlfZnJhbWUgKGYpICgocmVzdCAocmVtYWluaW5nKSkpIChmZW52KSkpIChyZXN0X2spKSkpKSkpIGVsc2UgKHJhaXNlIChFdmFsX2Vycm9yICh2YWx1ZV90b19zdHIgKFN0cmluZyAoc3hfc3RyIFsoU3RyaW5nIFwiVW5rbm93biBmcmFtZSB0eXBlOiBcIik7IGZ0XSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSlcblxuKCogY29udGludWUtd2l0aC1jYWxsICopXG5hbmQgY29udGludWVfd2l0aF9jYWxsIGYgYXJncyBlbnYgcmF3X2FyZ3Mga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChjb250aW51YXRpb25fcCAoZikpKSB0aGVuIChsZXQgYXJnID0gKGlmIHN4X3RydXRoeSAoKGVtcHR5X3AgKGFyZ3MpKSkgdGhlbiBOaWwgZWxzZSAoZmlyc3QgKGFyZ3MpKSkgaW4gbGV0IGNvbnRfZGF0YSA9IChjb250aW51YXRpb25fZGF0YSAoZikpIGluIChsZXQgY2FwdHVyZWQgPSAoZ2V0IChjb250X2RhdGEpICgoU3RyaW5nIFwiY2FwdHVyZWRcIikpKSBpbiAobGV0IHJlc3VsdCcgPSAoY2VrX3J1biAoKG1ha2VfY2VrX3ZhbHVlIChhcmcpIChlbnYpIChjYXB0dXJlZCkpKSkgaW4gKG1ha2VfY2VrX3ZhbHVlIChyZXN1bHQnKSAoZW52KSAoa29udCkpKSkpIGVsc2UgKGlmIHN4X3RydXRoeSAoKGxldCBfYW5kID0gKGlzX2NhbGxhYmxlIChmKSkgaW4gaWYgbm90IChzeF90cnV0aHkgX2FuZCkgdGhlbiBfYW5kIGVsc2UgKGxldCBfYW5kID0gKEJvb2wgKG5vdCAoc3hfdHJ1dGh5ICgoaXNfbGFtYmRhIChmKSkpKSkpIGluIGlmIG5vdCAoc3hfdHJ1dGh5IF9hbmQpIHRoZW4gX2FuZCBlbHNlIChsZXQgX2FuZCA9IChCb29sIChub3QgKHN4X3RydXRoeSAoKGlzX2NvbXBvbmVudCAoZikpKSkpKSBpbiBpZiBub3QgKHN4X3RydXRoeSBfYW5kKSB0aGVuIF9hbmQgZWxzZSAoQm9vbCAobm90IChzeF90cnV0aHkgKChpc19pc2xhbmQgKGYpKSkpKSkpKSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlICgoc3hfYXBwbHkgZiBhcmdzKSkgKGVudikgKGtvbnQpKSBlbHNlIChpZiBzeF90cnV0aHkgKChpc19sYW1iZGEgKGYpKSkgdGhlbiAobGV0IGxvY2FsID0gKGVudl9tZXJnZSAoKGxhbWJkYV9jbG9zdXJlIChmKSkpIChlbnYpKSBpbiBsZXQgKCkgPSBiaW5kX2xhbWJkYV9wYXJhbXMgZiBhcmdzIGxvY2FsIGluIChtYXRjaCAhaml0X2NhbGxfaG9vaywgZiB3aXRoIHwgU29tZSBob29rLCBMYW1iZGEgbCB3aGVuIGwubF9uYW1lIDw+IE5vbmUgLT4gbGV0IGFyZ3NfbGlzdCA9IG1hdGNoIGFyZ3Mgd2l0aCBMaXN0IGEgfCBMaXN0UmVmIHsgY29udGVudHMgPSBhIH0gLT4gYSB8IF8gLT4gW10gaW4gKG1hdGNoIGhvb2sgZiBhcmdzX2xpc3Qgd2l0aCBTb21lIHJlc3VsdCAtPiBtYWtlX2Nla192YWx1ZSByZXN1bHQgbG9jYWwga29udCB8IE5vbmUgLT4gbWFrZV9jZWtfc3RhdGUgKGxhbWJkYV9ib2R5IGYpIGxvY2FsIGtvbnQpIHwgXyAtPiBtYWtlX2Nla19zdGF0ZSAoKGxhbWJkYV9ib2R5IChmKSkpIChsb2NhbCkgKGtvbnQpKSkgZWxzZSAoaWYgc3hfdHJ1dGh5ICgobGV0IF9vciA9IChpc19jb21wb25lbnQgKGYpKSBpbiBpZiBzeF90cnV0aHkgX29yIHRoZW4gX29yIGVsc2UgKGlzX2lzbGFuZCAoZikpKSkgdGhlbiAobGV0IHBhcnNlZCA9IChwYXJzZV9rZXl3b3JkX2FyZ3MgKHJhd19hcmdzKSAoZW52KSkgaW4gbGV0IGt3YXJncyA9IChmaXJzdCAocGFyc2VkKSkgaW4gbGV0IGNoaWxkcmVuID0gKG50aCAocGFyc2VkKSAoKE51bWJlciAxLjApKSkgaW4gbGV0IGxvY2FsID0gKGVudl9tZXJnZSAoKGNvbXBvbmVudF9jbG9zdXJlIChmKSkpIChlbnYpKSBpbiAobGV0ICgpID0gaWdub3JlICgoTGlzdC5pdGVyIChmdW4gcCAtPiBpZ25vcmUgKChlbnZfYmluZCBsb2NhbCAoc3hfdG9fc3RyaW5nIHApIChsZXQgX29yID0gKGRpY3RfZ2V0IChrd2FyZ3MpIChwKSkgaW4gaWYgc3hfdHJ1dGh5IF9vciB0aGVuIF9vciBlbHNlIE5pbCkpKSkgKHN4X3RvX2xpc3QgKGNvbXBvbmVudF9wYXJhbXMgKGYpKSk7IE5pbCkpIGluIChsZXQgKCkgPSBpZ25vcmUgKChpZiBzeF90cnV0aHkgKChjb21wb25lbnRfaGFzX2NoaWxkcmVuIChmKSkpIHRoZW4gKGVudl9iaW5kIGxvY2FsIChzeF90b19zdHJpbmcgKFN0cmluZyBcImNoaWxkcmVuXCIpKSBjaGlsZHJlbikgZWxzZSBOaWwpKSBpbiAobWFrZV9jZWtfc3RhdGUgKChjb21wb25lbnRfYm9keSAoZikpKSAobG9jYWwpIChrb250KSkpKSkgZWxzZSAocmFpc2UgKEV2YWxfZXJyb3IgKHZhbHVlX3RvX3N0ciAoU3RyaW5nIChzeF9zdHIgWyhTdHJpbmcgXCJOb3QgY2FsbGFibGU6IFwiKTsgKGluc3BlY3QgKGYpKV0pKSkpKSkpKSlcblxuKCogc2YtY2FzZS1zdGVwLWxvb3AgKilcbmFuZCBzZl9jYXNlX3N0ZXBfbG9vcCBtYXRjaF92YWwgY2xhdXNlcyBlbnYga29udCA9XG4gIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI8XCIgWyhsZW4gKGNsYXVzZXMpKTsgKE51bWJlciAyLjApXSkpIHRoZW4gKG1ha2VfY2VrX3ZhbHVlIChOaWwpIChlbnYpIChrb250KSkgZWxzZSAobGV0IHRlc3QgPSAoZmlyc3QgKGNsYXVzZXMpKSBpbiBsZXQgYm9keSA9IChudGggKGNsYXVzZXMpICgoTnVtYmVyIDEuMCkpKSBpbiAoaWYgc3hfdHJ1dGh5ICgoaXNfZWxzZV9jbGF1c2UgKHRlc3QpKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKGJvZHkpIChlbnYpIChrb250KSkgZWxzZSAobGV0IHRlc3RfdmFsID0gKHRyYW1wb2xpbmUgKChldmFsX2V4cHIgKHRlc3QpIChlbnYpKSkpIGluIChpZiBzeF90cnV0aHkgKChwcmltX2NhbGwgXCI9XCIgW21hdGNoX3ZhbDsgdGVzdF92YWxdKSkgdGhlbiAobWFrZV9jZWtfc3RhdGUgKGJvZHkpIChlbnYpIChrb250KSkgZWxzZSAoc2ZfY2FzZV9zdGVwX2xvb3AgKG1hdGNoX3ZhbCkgKChwcmltX2NhbGwgXCJzbGljZVwiIFtjbGF1c2VzOyAoTnVtYmVyIDIuMCldKSkgKGVudikgKGtvbnQpKSkpKSkpXG5cbigqIGV2YWwtZXhwci1jZWsgKilcbmFuZCBldmFsX2V4cHJfY2VrIGV4cHIgZW52ID1cbiAgKGNla19ydW4gKChtYWtlX2Nla19zdGF0ZSAoZXhwcikgKGVudikgKChMaXN0IFtdKSkpKSlcblxuKCogdHJhbXBvbGluZS1jZWsgKilcbmFuZCB0cmFtcG9saW5lX2NlayB2YWwnID1cbiAgKGlmIHN4X3RydXRoeSAoKGlzX3RodW5rICh2YWwnKSkpIHRoZW4gKGV2YWxfZXhwcl9jZWsgKCh0aHVua19leHByICh2YWwnKSkpICgodGh1bmtfZW52ICh2YWwnKSkpKSBlbHNlIHZhbCcpXG5cbigqIGV2YWwtZXhwciAqKVxuYW5kIGV2YWxfZXhwciBleHByIGVudiA9XG4gIChjZWtfcnVuICgobWFrZV9jZWtfc3RhdGUgKGV4cHIpIChlbnYpICgoTGlzdCBbXSkpKSkpXG5cblxuKCogV2lyZSB1cCB0cmFtcG9saW5lIHRvIHJlc29sdmUgdGh1bmtzIHZpYSB0aGUgQ0VLIG1hY2hpbmUgKilcbmxldCAoKSA9IHRyYW1wb2xpbmVfZm4gOj0gKGZ1biB2IC0+XG4gIG1hdGNoIHYgd2l0aFxuICB8IFRodW5rIChleHByLCBlbnYpIC0+IGV2YWxfZXhwciBleHByIChFbnYgZW52KVxuICB8IF8gLT4gdilcblxuKCogV2lyZSB1cCB0aGUgcHJpbWl0aXZlcyB0cmFtcG9saW5lIHNvIGNhbGxfYW55IGluIEhPIGZvcm1zIHJlc29sdmVzIFRodW5rcyAqKVxubGV0ICgpID0gU3hfcHJpbWl0aXZlcy5fc3hfdHJhbXBvbGluZV9mbiA6PSAhdHJhbXBvbGluZV9mblxuXG4oKiBXaXJlIHVwIGFzX251bWJlciB0cmFtcG9saW5lIHNvIGFyaXRobWV0aWMgb24gbGVha2VkIHRodW5rcyBhdXRvLXJlc29sdmVzICopXG5sZXQgKCkgPSBTeF9wcmltaXRpdmVzLnRyYW1wb2xpbmVfaG9vayA6PSAhdHJhbXBvbGluZV9mblxuXG4oKiBPdmVycmlkZSByZWN1cnNpdmUgY2VrX3J1biB3aXRoIGl0ZXJhdGl2ZSBsb29wICopXG5sZXQgY2VrX3J1bl9pdGVyYXRpdmUgc3RhdGUgPVxuICBsZXQgcyA9IHJlZiBzdGF0ZSBpblxuICB3aGlsZSBub3QgKG1hdGNoIGNla190ZXJtaW5hbF9wICFzIHdpdGggQm9vbCB0cnVlIC0+IHRydWUgfCBfIC0+IGZhbHNlKSBkb1xuICAgIHMgOj0gY2VrX3N0ZXAgIXNcbiAgZG9uZTtcbiAgY2VrX3ZhbHVlICFzXG5cblxuXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfZXF1YWwiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX2NhbGwxIiwiZiIsImEwIiwiY2FtbF9jYWxsMiIsImExIiwiZ2xvYmFsX2RhdGEiLCJTeF9ydW50aW1lIiwiU3hfdHlwZXMiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYl9IYXNodGJsIiwiU3hfcHJpbWl0aXZlcyIsInRyYW1wb2xpbmVfZm4iLCJ2IiwidHJhbXBvbGluZSIsInN0cmljdF9yZWYiLCJzdHJpY3QiLCJwcmltX3BhcmFtX3R5cGVzX3JlZiIsInByaW1fcGFyYW1fdHlwZXMiLCJjc3RfZXZhbCIsIm1ha2VfY2VrX3N0YXRlIiwiY29udHJvbCIsImVudiIsImtvbnQiLCJjc3RfY29udGludWUiLCJtYWtlX2Nla192YWx1ZSIsInZhbHVlIiwiY3N0IiwiY3N0X2tvbnQiLCJjc3RfcGhhc2UiLCJjZWtfdGVybWluYWxfcCIsInN0YXRlIiwiYW5kIiwiY2VrX2NvbnRyb2wiLCJzIiwiY3N0X2VudiIsImNla19lbnYiLCJjZWtfa29udCIsImNla19waGFzZSIsImNzdF92YWx1ZSIsImNla192YWx1ZSIsImNzdF9pZiIsIm1ha2VfaWZfZnJhbWUiLCJ0aGVuX2V4cHIiLCJlbHNlX2V4cHIiLCJjc3Rfd2hlbiIsIm1ha2Vfd2hlbl9mcmFtZSIsImJvZHlfZXhwcnMiLCJjc3RfYmVnaW4iLCJtYWtlX2JlZ2luX2ZyYW1lIiwicmVtYWluaW5nIiwiY3N0X2xldCIsIm1ha2VfbGV0X2ZyYW1lIiwibmFtZSIsImJvZHkiLCJsb2NhbCIsImNzdF9kZWZpbmUiLCJtYWtlX2RlZmluZV9mcmFtZSIsImhhc19lZmZlY3RzIiwiZWZmZWN0X2xpc3QiLCJjc3Rfc2V0IiwibWFrZV9zZXRfZnJhbWUiLCJjc3RfYXJnIiwibWFrZV9hcmdfZnJhbWUiLCJldmFsZWQiLCJyYXdfYXJncyIsImhlYWRfbmFtZSIsIm1ha2VfY2FsbF9mcmFtZSIsImFyZ3MiLCJjc3RfY29uZCIsIm1ha2VfY29uZF9mcmFtZSIsInNjaGVtZV9wIiwiY3N0X2Nhc2UiLCJtYWtlX2Nhc2VfZnJhbWUiLCJtYXRjaF92YWwiLCJjc3RfdGhyZWFkIiwibWFrZV90aHJlYWRfZnJhbWUiLCJjc3RfbWFwIiwibWFrZV9tYXBfZnJhbWUiLCJyZXN1bHRzIiwibWFrZV9tYXBfaW5kZXhlZF9mcmFtZSIsImNzdF9maWx0ZXIiLCJtYWtlX2ZpbHRlcl9mcmFtZSIsImN1cnJlbnRfaXRlbSIsImNzdF9yZWR1Y2UiLCJtYWtlX3JlZHVjZV9mcmFtZSIsImNzdF9mb3JfZWFjaCIsIm1ha2VfZm9yX2VhY2hfZnJhbWUiLCJjc3Rfc29tZSIsIm1ha2Vfc29tZV9mcmFtZSIsImNzdF9ldmVyeSIsIm1ha2VfZXZlcnlfZnJhbWUiLCJjc3Rfc2NvcGUiLCJtYWtlX3Njb3BlX2ZyYW1lIiwiY3N0X3Byb3ZpZGUiLCJtYWtlX3Byb3ZpZGVfZnJhbWUiLCJjc3Rfc2NvcGVfYWNjIiwibWFrZV9zY29wZV9hY2NfZnJhbWUiLCJjc3RfcmVzZXQiLCJtYWtlX3Jlc2V0X2ZyYW1lIiwiY3N0X2RpY3QiLCJtYWtlX2RpY3RfZnJhbWUiLCJjc3RfYW5kIiwibWFrZV9hbmRfZnJhbWUiLCJjc3Rfb3IiLCJtYWtlX29yX2ZyYW1lIiwiY3N0X2R5bmFtaWNfd2luZCIsIm1ha2VfZHluYW1pY193aW5kX2ZyYW1lIiwicGhhc2UiLCJib2R5X3RodW5rIiwiYWZ0ZXJfdGh1bmsiLCJjc3RfcmVhY3RpdmVfcmVzZXQiLCJtYWtlX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lIiwidXBkYXRlX2ZuIiwiZmlyc3RfcmVuZGVyX3AiLCJjc3RfZGVyZWYiLCJtYWtlX2RlcmVmX2ZyYW1lIiwiY3N0X2hvX3NldHVwIiwibWFrZV9ob19zZXR1cF9mcmFtZSIsImhvX3R5cGUiLCJyZW1haW5pbmdfYXJncyIsImV2YWxlZF9hcmdzIiwiZnJhbWVfdHlwZSIsImtvbnRfcHVzaCIsImZyYW1lIiwia29udF90b3AiLCJrb250X3BvcCIsImtvbnRfZW1wdHlfcCIsImNzdF9hcHBlbmQiLCJjYXB0dXJlZCIsImtvbnRfY2FwdHVyZV90b19yZXNldCIsImsiLCJvciIsImNzdF9uYW1lIiwia29udF9maW5kX3Byb3ZpZGUiLCJrb250X2ZpbmRfc2NvcGVfYWNjIiwiaGFzX3JlYWN0aXZlX3Jlc2V0X2ZyYW1lX3AiLCJrb250X2NhcHR1cmVfdG9fcmVhY3RpdmVfcmVzZXQiLCJjdXN0b21fc3BlY2lhbF9mb3JtcyIsInJlZ2lzdGVyX3NwZWNpYWxfZm9ybSIsImhhbmRsZXIiLCJzZXRfc3RyaWN0X2IiLCJ2YWwiLCJzZXRfcHJpbV9wYXJhbV90eXBlc19iIiwidHlwZXMiLCJjc3RfYm9vbGVhbiIsImNzdF9rZXl3b3JkIiwiY3N0X2xhbWJkYSIsImNzdF9saXN0IiwiY3N0X25pbCIsImNzdF9udW1iZXIiLCJjc3Rfc2xpY2UiLCJjc3Rfc3RyaW5nIiwiY3N0X3N5bWJvbCIsInZhbHVlX21hdGNoZXNfdHlwZV9wIiwiZXhwZWN0ZWRfdHlwZSIsImNzdF9leHBlY3RlZCIsImNzdF9nb3QiLCJjc3RfVHlwZV9lcnJvciIsInN0cmljdF9jaGVja19hcmdzIiwic3BlYyIsInBvc2l0aW9uYWwiLCJyZXN0X3R5cGUiLCJpIiwicCIsInBhaXIiLCJpZHgiLCJwYXJhbSIsInBfbmFtZSIsInBfdHlwZSIsImNzdF9yZXN0IiwiY3N0X3ppcCIsImJpbmRfbGFtYmRhX3BhcmFtcyIsInBhcmFtcyIsInBhcmFtX2xpc3QiLCJhcmdzX2xpc3QiLCJyZXN0X2lkeCIsInJlcXVpcmVkIiwibWF0Y2giLCJyZXN0X25hbWUiLCJyZXN0X3ZhbHMiLCJjYWxsX2xhbWJkYSIsImNhbGxlcl9lbnYiLCJjc3RfY2hpbGRyZW4iLCJjYWxsX2NvbXBvbmVudCIsImNvbXAiLCJwYXJzZWQiLCJrd2FyZ3MiLCJjaGlsZHJlbiIsImNzdF9hc3NvYyIsImNzdF9pIiwiY3N0X2luYyIsImNzdF9za2lwIiwicGFyc2Vfa2V5d29yZF9hcmdzIiwiZCIsImFyZyIsInNraXAiLCJjb25kX3NjaGVtZV9wIiwiY2xhdXNlcyIsImMiLCJjc3RfZWxzZSIsImlzX2Vsc2VfY2xhdXNlIiwidGVzdCIsImNzdF9yYW5nZSIsInNmX25hbWVkX2xldCIsImxvb3BfbmFtZSIsImJpbmRpbmdzIiwiaW5pdHMiLCJiaW5kaW5nIiwiYWNjIiwicGFpcl9pZHgiLCJsb29wX2JvZHkiLCJsb29wX2ZuIiwiaW5pdF92YWxzIiwiZSIsImNzdF9hcyIsInNmX2xhbWJkYSIsInBhcmFtc19leHByIiwicGFyYW1fbmFtZXMiLCJjc3RfZWZmZWN0X2Fubm90YXRpb25zIiwiY3N0X2VmZmVjdHMiLCJjc3Rfa2V5cyIsInNmX2RlZmNvbXAiLCJuYW1lX3N5bSIsInBhcmFtc19yYXciLCJjb21wX25hbWUiLCJoYXNfY2hpbGRyZW4iLCJwYXJhbV90eXBlcyIsImFmZmluaXR5IiwiZWZmZWN0cyIsImVmZmVjdF9hbm5zIiwiZGVmY29tcF9rd2FyZyIsImtleSIsImRlZmF1bHQkIiwiZW5kIiwicmVzdWx0IiwicGFyc2VfY29tcF9wYXJhbXMiLCJpbl9rZXkiLCJwdHlwZSIsInR5cGVfdmFsIiwic2ZfZGVmaXNsYW5kIiwiaXNsYW5kIiwic2ZfZGVmbWFjcm8iLCJyZXN0X3BhcmFtIiwibWFjIiwiY3N0X2luX3Jlc3QiLCJwYXJzZV9tYWNyb19wYXJhbXMiLCJjc3RfY29uY2F0IiwicXFfZXhwYW5kIiwidGVtcGxhdGUiLCJoZWFkIiwiaXRlbSIsInNwbGljZWQiLCJjc3RfZGVjIiwic2ZfbGV0cmVjIiwibmFtZXMiLCJ2YWxfZXhwcnMiLCJ2bmFtZSIsInZhbF9leHByIiwidmFsdWVzIiwibiIsInN0ZXBfc2ZfbGV0cmVjIiwidGhrIiwic2ZfZHluYW1pY193aW5kIiwiYmVmb3JlIiwiYWZ0ZXIiLCJzZl9zY29wZSIsInJlc3QiLCJzZl9wcm92aWRlIiwiZXhwYW5kX21hY3JvIiwiY2VrX3J1biIsImNla19zdGVwIiwic3RlcF9ldmFsIiwiZXhwciIsImtzIiwiZmlyc3Rfa2V5IiwicmVtYWluaW5nX2VudHJpZXMiLCJjc3RfZW1pdHRlZCIsImNzdF9tYXBfaW5kZXhlZCIsImNzdF9xdW90ZSIsInJlbmRlcl9jaGVjayIsInJlbmRlcl9mbiIsInN0ZXBfZXZhbF9saXN0Iiwic3RlcF9zZl9pZiIsInN0ZXBfc2Zfd2hlbiIsInN0ZXBfc2ZfYmVnaW4iLCJzdGVwX3NmX2xldCIsImZpcnN0X2JpbmRpbmciLCJyZXN0X2JpbmRpbmdzIiwicGFpcnMiLCJzdGVwX3NmX2RlZmluZSIsInZhbF9pZHgiLCJzdGVwX3NmX3NldF9iIiwic3RlcF9zZl9hbmQiLCJzdGVwX3NmX29yIiwic3RlcF9zZl9jb25kIiwiY2xhdXNlIiwic3RlcF9zZl9jYXNlIiwic3RlcF9zZl90aHJlYWRfZmlyc3QiLCJzdGVwX3NmX2xhbWJkYSIsInN0ZXBfc2Zfc2NvcGUiLCJyZXN0X2FyZ3MiLCJzdGVwX3NmX3Byb3ZpZGUiLCJzdGVwX3NmX2NvbnRleHQiLCJkZWZhdWx0X3ZhbCIsInN0ZXBfc2ZfZW1pdCIsInN0ZXBfc2ZfZW1pdHRlZCIsInN0ZXBfc2ZfcmVzZXQiLCJzdGVwX3NmX3NoaWZ0Iiwia19uYW1lIiwiY2FwdHVyZWRfcmVzdWx0IiwicmVzdF9rb250Iiwic2hpZnRfZW52Iiwic3RlcF9zZl9kZXJlZiIsImNla19jYWxsIiwiYSIsImNzdF91cGRhdGVfZm4iLCJyZWFjdGl2ZV9zaGlmdF9kZXJlZiIsInNpZyIsInNjYW5fcmVzdWx0IiwiY2FwdHVyZWRfZnJhbWVzIiwicmVzZXRfZnJhbWUiLCJyZW1haW5pbmdfa29udCIsInN1YnNjcmliZXIiLCJuZXdfcmVzZXQiLCJuZXdfa29udCIsImluaXRpYWxfa29udCIsInN0ZXBfZXZhbF9jYWxsIiwiaG5hbWUiLCJob19mb3JtX25hbWVfcCIsImhvX2ZuX3AiLCJob19zd2FwX2FyZ3MiLCJiIiwiaG9fc2V0dXBfZGlzcGF0Y2giLCJvcmRlcmVkIiwiY29sbCIsImluaXQiLCJzdGVwX2hvX21hcCIsInN0ZXBfaG9fbWFwX2luZGV4ZWQiLCJzdGVwX2hvX2ZpbHRlciIsInN0ZXBfaG9fcmVkdWNlIiwic3RlcF9ob19zb21lIiwic3RlcF9ob19ldmVyeSIsInN0ZXBfaG9fZm9yX2VhY2giLCJjc3RfZm9ybV9ub3RfY2FsbGFibGUiLCJjc3RfYm9keSIsImNzdF9ldmFsZWQiLCJjc3RfZiIsImNzdF9yZW1haW5pbmciLCJjc3RfcmVzdWx0cyIsInN0ZXBfY29udGludWUiLCJyZXN0X2siLCJmdCIsImZlbnYiLCJuZXh0X2JpbmRpbmciLCJlZmZlY3RfbmFtZXMiLCJuZXh0IiwibmV4dF90ZXN0IiwibmV4dF9jbGF1c2VzIiwibmV4dF9jbGF1c2UiLCJmb3JtIiwicmVzdF9mb3JtcyIsInJhcmdzIiwiYWxsX2FyZ3MiLCJuZXdfZXZhbGVkIiwibGFzdF9yZXN1bHQiLCJjb21wbGV0ZWQiLCJuZXh0X2VudHJ5IiwiY3R4IiwiZGVwX2xpc3QiLCJub3RpZnlfZm4iLCJmaXJzdF9wIiwibmV3X2ZyYW1lIiwiaW5kZXhlZCIsIm5ld19yZXN1bHRzIiwiY2FsbF9hcmdzIiwibmV4dF9mcmFtZSIsImppdF9jYWxsX2hvb2siLCJjb250aW51ZV93aXRoX2NhbGwiLCJjb250X2RhdGEiLCJsIiwiaG9vayIsInNmX2Nhc2Vfc3RlcF9sb29wIiwidGVzdF92YWwiLCJldmFsX2V4cHJfY2VrIiwidHJhbXBvbGluZV9jZWsiLCJldmFsX2V4cHIiLCJjZWtfcnVuX2l0ZXJhdGl2ZSJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyxhQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFBQUMsV0FBQUYsR0FBQUMsSUFBQUU7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEs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O0FBQUEsR0FFSztBQUFBLEdBN1ZZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUQzTjFCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzM4MzMsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4Lm9ianMvanNvby9kZWZhdWx0L3N4LmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvd29ya3NwYWNlX3Jvb3QvbGliL3N4X3Njb3BlLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIFNjb3BlIHN0YWNrcyDigJQgZHluYW1pYyBzY29wZSBmb3IgcmVuZGVyLXRpbWUgZWZmZWN0cy5cblxuICAgIFByb3ZpZGVzIHNjb3BlLXB1c2ghL3BvcCEvcGVlaywgY29sbGVjdCEvY29sbGVjdGVkL2NsZWFyLWNvbGxlY3RlZCEsXG4gICAgc2NvcGUtZW1pdCEvZW1pdHRlZC9zY29wZS1lbWl0dGVkLCBjb250ZXh0LCBhbmQgY29va2llIGFjY2Vzcy5cblxuICAgIEFsbCBmdW5jdGlvbnMgYXJlIHJlZ2lzdGVyZWQgYXMgcHJpbWl0aXZlcyBzbyBib3RoIHRoZSBDRUsgZXZhbHVhdG9yXG4gICAgYW5kIHRoZSBKSVQgVk0gY2FuIGZpbmQgdGhlbSBpbiB0aGUgc2FtZSBwbGFjZS4gKilcblxub3BlbiBTeF90eXBlc1xuXG4oKiogVGhlIHNoYXJlZCBzY29wZSBzdGFja3MgaGFzaHRhYmxlLiBFYWNoIGtleSBtYXBzIHRvIGEgc3RhY2sgb2YgdmFsdWVzLlxuICAgIFVzZWQgYnkgYXNlciBmb3Igc3ByZWFkL3Byb3ZpZGUvZW1pdCBwYXR0ZXJucywgQ1NTWCBjb2xsZWN0L2ZsdXNoLCBldGMuICopXG5sZXQgc2NvcGVfc3RhY2tzIDogKHN0cmluZywgdmFsdWUgbGlzdCkgSGFzaHRibC50ID0gSGFzaHRibC5jcmVhdGUgOFxuXG4oKiogUmVxdWVzdCBjb29raWVzIOKAlCBzZXQgYnkgdGhlIFB5dGhvbiBicmlkZ2UgYmVmb3JlIGVhY2ggcmVuZGVyLlxuICAgIGdldC1jb29raWUgcmVhZHMgZnJvbSBoZXJlOyBzZXQtY29va2llIGlzIGEgbm8tb3Agb24gdGhlIHNlcnZlci4gKilcbmxldCByZXF1ZXN0X2Nvb2tpZXMgOiAoc3RyaW5nLCBzdHJpbmcpIEhhc2h0YmwudCA9IEhhc2h0YmwuY3JlYXRlIDhcblxuKCoqIENsZWFyIGFsbCBzY29wZSBzdGFja3MuIENhbGxlZCBiZXR3ZWVuIHJlcXVlc3RzIGlmIG5lZWRlZC4gKilcbmxldCBjbGVhcl9hbGwgKCkgPSBIYXNodGJsLmNsZWFyIHNjb3BlX3N0YWNrc1xuXG5sZXQgKCkgPVxuICBsZXQgcmVnaXN0ZXIgPSBTeF9wcmltaXRpdmVzLnJlZ2lzdGVyIGluXG5cbiAgKCogLS0tIENvb2tpZXMgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJnZXQtY29va2llXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIC0+XG4gICAgICAobWF0Y2ggSGFzaHRibC5maW5kX29wdCByZXF1ZXN0X2Nvb2tpZXMgbmFtZSB3aXRoXG4gICAgICAgfCBTb21lIHYgLT4gU3RyaW5nIHZcbiAgICAgICB8IE5vbmUgLT4gTmlsKVxuICAgIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwic2V0LWNvb2tpZVwiIChmdW4gX2FyZ3MgLT4gTmlsKTtcblxuICAoKiAtLS0gQ29yZSBzY29wZSBzdGFjayBvcGVyYXRpb25zIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwic2NvcGUtcHVzaCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZTsgdmFsdWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKHZhbHVlIDo6IHN0YWNrKTsgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1wb3AhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIG5hbWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICAobWF0Y2ggc3RhY2sgd2l0aCBfIDo6IHJlc3QgLT4gSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIHJlc3QgfCBbXSAtPiAoKSk7IE5pbFxuICAgIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwic2NvcGUtcGVla1wiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSAtPlxuICAgICAgbGV0IHN0YWNrID0gdHJ5IEhhc2h0YmwuZmluZCBzY29wZV9zdGFja3MgbmFtZSB3aXRoIE5vdF9mb3VuZCAtPiBbXSBpblxuICAgICAgKG1hdGNoIHN0YWNrIHdpdGggdiA6OiBfIC0+IHYgfCBbXSAtPiBOaWwpXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIENvbnRleHQgKHNjb3BlIGxvb2t1cCB3aXRoIG9wdGlvbmFsIGRlZmF1bHQpIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwiY29udGV4dFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lXSB8IFtTdHJpbmcgbmFtZTsgX10gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjaywgYXJncyB3aXRoXG4gICAgICAgfCB2IDo6IF8sIF8gLT4gdlxuICAgICAgIHwgW10sIFtfOyBkZWZhdWx0X3ZhbF0gLT4gZGVmYXVsdF92YWxcbiAgICAgICB8IFtdLCBfIC0+IE5pbClcbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gQ29sbGVjdCAvIGNvbGxlY3RlZCAvIGNsZWFyLWNvbGxlY3RlZCEgLS0tICopXG5cbiAgcmVnaXN0ZXIgXCJjb2xsZWN0IVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBuYW1lOyB2YWx1ZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoXG4gICAgICAgfCBMaXN0IGl0ZW1zIDo6IHJlc3QgLT5cbiAgICAgICAgIGlmIG5vdCAoTGlzdC5tZW0gdmFsdWUgaXRlbXMpIHRoZW5cbiAgICAgICAgICAgSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIChMaXN0IChpdGVtcyBAIFt2YWx1ZV0pIDo6IHJlc3QpXG4gICAgICAgfCBbXSAtPlxuICAgICAgICAgSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIFtMaXN0IFt2YWx1ZV1dXG4gICAgICAgfCBfIDo6IF8gLT4gKCkpO1xuICAgICAgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgcmVnaXN0ZXIgXCJjb2xsZWN0ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoIExpc3QgaXRlbXMgOjogXyAtPiBMaXN0IGl0ZW1zIHwgXyAtPiBMaXN0IFtdKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcImNsZWFyLWNvbGxlY3RlZCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoXG4gICAgICAgfCBfIDo6IHJlc3QgLT4gSGFzaHRibC5yZXBsYWNlIHNjb3BlX3N0YWNrcyBuYW1lIChMaXN0IFtdIDo6IHJlc3QpXG4gICAgICAgfCBbXSAtPiBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgW0xpc3QgW11dKTtcbiAgICAgIE5pbFxuICAgIHwgXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBFbWl0IC8gZW1pdHRlZCAoZm9yIHNwcmVhZCBhdHRycyBpbiBhZGFwdGVyLWh0bWwuc3gpIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwic2NvcGUtZW1pdCFcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZTsgdmFsdWVdIC0+XG4gICAgICBsZXQgc3RhY2sgPSB0cnkgSGFzaHRibC5maW5kIHNjb3BlX3N0YWNrcyBuYW1lIHdpdGggTm90X2ZvdW5kIC0+IFtdIGluXG4gICAgICAobWF0Y2ggc3RhY2sgd2l0aFxuICAgICAgIHwgTGlzdCBpdGVtcyA6OiByZXN0IC0+XG4gICAgICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKExpc3QgKGl0ZW1zIEAgW3ZhbHVlXSkgOjogcmVzdClcbiAgICAgICB8IE5pbCA6OiByZXN0IC0+XG4gICAgICAgICBIYXNodGJsLnJlcGxhY2Ugc2NvcGVfc3RhY2tzIG5hbWUgKExpc3QgW3ZhbHVlXSA6OiByZXN0KVxuICAgICAgIHwgW10gLT5cbiAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBzY29wZV9zdGFja3MgbmFtZSBbTGlzdCBbdmFsdWVdXVxuICAgICAgIHwgXyA6OiBfIC0+ICgpKTtcbiAgICAgIE5pbFxuICAgIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwiZW1pdCFcIiAoZnVuIGFyZ3MgLT5cbiAgICAoKiBBbGlhcyBmb3Igc2NvcGUtZW1pdCEgKilcbiAgICBtYXRjaCBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgXCJzY29wZS1lbWl0IVwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTmlsKTtcblxuICByZWdpc3RlciBcImVtaXR0ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtTdHJpbmcgbmFtZV0gLT5cbiAgICAgIGxldCBzdGFjayA9IHRyeSBIYXNodGJsLmZpbmQgc2NvcGVfc3RhY2tzIG5hbWUgd2l0aCBOb3RfZm91bmQgLT4gW10gaW5cbiAgICAgIChtYXRjaCBzdGFjayB3aXRoIExpc3QgaXRlbXMgOjogXyAtPiBMaXN0IGl0ZW1zIHwgXyAtPiBMaXN0IFtdKVxuICAgIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcInNjb3BlLWVtaXR0ZWRcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBTeF9wcmltaXRpdmVzLmdldF9wcmltaXRpdmUgXCJlbWl0dGVkXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBMaXN0IFtdKTtcblxuICByZWdpc3RlciBcInNjb3BlLWNvbGxlY3RlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBcImNvbGxlY3RlZFwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTGlzdCBbXSk7XG5cbiAgcmVnaXN0ZXIgXCJzY29wZS1jbGVhci1jb2xsZWN0ZWQhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIFwiY2xlYXItY29sbGVjdGVkIVwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gUHJvdmlkZSBhbGlhc2VzIC0tLSAqKVxuXG4gIHJlZ2lzdGVyIFwicHJvdmlkZS1wdXNoIVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIFN4X3ByaW1pdGl2ZXMuZ2V0X3ByaW1pdGl2ZSBcInNjb3BlLXB1c2ghXCIgd2l0aFxuICAgIHwgTmF0aXZlRm4gKF8sIGZuKSAtPiBmbiBhcmdzIHwgXyAtPiBOaWwpO1xuXG4gIHJlZ2lzdGVyIFwicHJvdmlkZS1wb3AhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggU3hfcHJpbWl0aXZlcy5nZXRfcHJpbWl0aXZlIFwic2NvcGUtcG9wIVwiIHdpdGhcbiAgICB8IE5hdGl2ZUZuIChfLCBmbikgLT4gZm4gYXJncyB8IF8gLT4gTmlsKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImdsb2JhbF9kYXRhIiwiU3hfcHJpbWl0aXZlcyIsIlN0ZGxpYl9IYXNodGJsIiwiU3RkbGliIiwiU3RkbGliX0xpc3QiLCJzY29wZV9zdGFja3MiLCJyZXF1ZXN0X2Nvb2tpZXMiLCJjbGVhcl9hbGwiLCJwYXJhbSIsInJlZ2lzdGVyIiwiYXJncyIsIm5hbWUiLCJtYXRjaCIsInYiLCJjc3Rfc2NvcGVfcHVzaCIsInZhbHVlIiwic3RhY2siLCJleG4iLCJjc3Rfc2NvcGVfcG9wIiwicmVzdCIsImRlZmF1bHRfdmFsIiwiaXRlbXMiLCJjc3RfY29sbGVjdGVkIiwiY3N0X2NsZWFyX2NvbGxlY3RlZCIsImNzdF9zY29wZV9lbWl0IiwiZm4iLCJjc3RfZW1pdHRlZCJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGVDWW9EO0FBQUEsSUFBQUMsa0JBSUQ7QUFBQSxZQUFBQyxVQUFBQztBQUFBQSxJQUdoQyxpREFBMEI7QUFBQTtBQUFBLE9BQUFDLFdBSHNCO0FBQUEsR0FVakU7QUFBQTtBQUFBLGNBQUFDO0FBQUFBLE1BQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQUFBQyxPQUFBO0FBQUEsU0FBQUMsUUFFUztBQUFBLFFBQXFDLFlBRWpDO0FBQUEsWUFBQUMsSUFG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O0FBQUEsY0FBQUM7QUFBQUEsYUFBQUEsTURqSXRCO0FBQUE7QUFBQSxhQUFBRCxRQ2lJdUU7QUFBQTtBQUFBLFFBQ2pFO0FBQUEsYUFBQUosUUFBQTtBQUFBLDZEQUFBUyxRQUFBLFVBQXFDO0FBQUE7QUFBQSxRQUFrQjtBQUFBO0FBQUE7QUFBQSxNQUNsRDtBQUFBLEtBQU87QUFBQSxXQUFDO0FBQUEsR0FFakI7QUFBQTtBQUFBLGNBQUFYO0FBQUFBLFVBQUFFLFFBQ1E7QUFBQSxNQUFxQyxxREFBQWEsS0FBQSxVQUNyQiwyQkFBc0I7QUFBQTtBQUFBLE1BQVA7QUFBQSxLQUFPO0FBQUEsV0FBQztBQUFBLEdBRS9DO0FBQUE7QUFBQSxjQUFBZjtBQUFBQSxVQUFBRSxRQUNRO0FBQUEsTUFBdUMscURBQUFhLEtBQUEsVUFDdkIsMkJBQXNCO0FBQUE7QUFBQSxNQUFQO0FBQUEsS0FBTztBQUFBLEdBRTlDO0FBQUE7QUFBQSxjQUFBZjtBQUFBQSxVQUFBRSxRQUNRO0FBQUEsTUFBOEMscURBQUFhLEtBQUEsVUFDOUIsMkJBQWtCO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLEdBSTFDO0FBQUE7QUFBQSxjQUFBZjtBQUFBQSxVQUFBRSxRQUNRO0FBQUEsTUFBeUMscURBQUFhLEtBQUEsVUFDekIsMkJBQWtCO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLEdBRTFDO0FBQUE7QUFBQSxjQUFBZjtBQUFBQSxVQUFBRSxRQUNRO0FBQUEsTUFBd0MscURBQUFhLEtBQUEsVUFDeEIsMkJBQWtCO0FBQUE7QUFBQSxNQUFIO0FBQUEsS0FBRztBQUFBLEdBQUM7QUFBQTtBQUFBO0FBQUEsRUR6SjdDIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzQxOTAsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4Lm9ianMvanNvby9kZWZhdWx0L3N4LmNtYS5qcyIsInNvdXJjZXMiOlsiL2J1aWx0aW4vYmxhY2tib3gubWwiLCIvd29ya3NwYWNlX3Jvb3QvbGliL3N4X3BhcnNlci5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqKiBTLWV4cHJlc3Npb24gcGFyc2VyLlxuXG4gICAgUmVjdXJzaXZlIGRlc2NlbnQgb3ZlciBhIHN0cmluZywgcHJvZHVjaW5nIFtTeF90eXBlcy52YWx1ZSBsaXN0XS5cbiAgICBTdXBwb3J0czogbGlzdHMsIGRpY3RzLCBzeW1ib2xzLCBrZXl3b3Jkcywgc3RyaW5ncyAod2l0aCBlc2NhcGVzKSxcbiAgICBudW1iZXJzLCBib29sZWFucywgbmlsLCBjb21tZW50cywgcXVvdGUvcXVhc2lxdW90ZS91bnF1b3RlIHN1Z2FyLiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbnR5cGUgc3RhdGUgPSB7XG4gIHNyYyA6IHN0cmluZztcbiAgbGVuIDogaW50O1xuICBtdXRhYmxlIHBvcyA6IGludDtcbn1cblxubGV0IG1ha2Vfc3RhdGUgc3JjID0geyBzcmM7IGxlbiA9IFN0cmluZy5sZW5ndGggc3JjOyBwb3MgPSAwIH1cblxubGV0IHBlZWsgcyA9IGlmIHMucG9zIDwgcy5sZW4gdGhlbiBTb21lIHMuc3JjLltzLnBvc10gZWxzZSBOb25lXG5sZXQgYWR2YW5jZSBzID0gcy5wb3MgPC0gcy5wb3MgKyAxXG5sZXQgYXRfZW5kIHMgPSBzLnBvcyA+PSBzLmxlblxuXG5sZXQgc2tpcF93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyBzID1cbiAgbGV0IHJlYyBnbyAoKSA9XG4gICAgaWYgYXRfZW5kIHMgdGhlbiAoKVxuICAgIGVsc2UgbWF0Y2ggcy5zcmMuW3MucG9zXSB3aXRoXG4gICAgfCAnICcgfCAnXFx0JyB8ICdcXG4nIHwgJ1xccicgLT4gYWR2YW5jZSBzOyBnbyAoKVxuICAgIHwgJzsnIC0+XG4gICAgICB3aGlsZSBzLnBvcyA8IHMubGVuICYmIHMuc3JjLltzLnBvc10gPD4gJ1xcbicgZG8gYWR2YW5jZSBzIGRvbmU7XG4gICAgICBpZiBzLnBvcyA8IHMubGVuIHRoZW4gYWR2YW5jZSBzO1xuICAgICAgZ28gKClcbiAgICB8IF8gLT4gKClcbiAgaW4gZ28gKClcblxuKCogQ2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIOKAlCBtYXRjaGVzIHNwZWMvcGFyc2VyLnN4IGlkZW50LXN0YXJ0L2lkZW50LWNoYXIuXG4gICBpZGVudC1zdGFydDogYS16IEEtWiBfIH4gKiArIC0gPiA8ID0gLyAhID8gJlxuICAgaWRlbnQtY2hhcjogIGlkZW50LXN0YXJ0IHBsdXMgMC05IC4gOiAvICMgLCAqKVxubGV0IGlzX2lkZW50X3N0YXJ0ID0gZnVuY3Rpb25cbiAgfCAnYScuLid6JyB8ICdBJy4uJ1onIHwgJ18nIHwgJ34nIHwgJyonIHwgJysnIHwgJy0nXG4gIHwgJz4nIHwgJzwnIHwgJz0nIHwgJy8nIHwgJyEnIHwgJz8nIHwgJyYnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCBpc19pZGVudF9jaGFyID0gZnVuY3Rpb25cbiAgfCBjIHdoZW4gaXNfaWRlbnRfc3RhcnQgYyAtPiB0cnVlXG4gIHwgJzAnLi4nOScgfCAnLicgfCAnOicgfCAnIycgfCAnLCcgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxuKCogU3ltYm9sIHJlYWRpbmcgdXNlcyBpZGVudF9jaGFyOyBmaXJzdCBjaGFyIG11c3QgYmUgaWRlbnRfc3RhcnQgb3IgZGlnaXQvY29sb24gKilcbmxldCBpc19zeW1ib2xfY2hhciA9IGlzX2lkZW50X2NoYXJcblxubGV0IHJlYWRfc3RyaW5nIHMgPVxuICAoKiBzLnBvcyBpcyBvbiB0aGUgb3BlbmluZyBxdW90ZSAqKVxuICBhZHZhbmNlIHM7XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gIGxldCByZWMgZ28gKCkgPVxuICAgIGlmIGF0X2VuZCBzIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiVW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbiAgICBsZXQgYyA9IHMuc3JjLltzLnBvc10gaW5cbiAgICBhZHZhbmNlIHM7XG4gICAgaWYgYyA9ICdcIicgdGhlbiBCdWZmZXIuY29udGVudHMgYnVmXG4gICAgZWxzZSBpZiBjID0gJ1xcXFwnIHRoZW4gYmVnaW5cbiAgICAgIGlmIGF0X2VuZCBzIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBlc2NhcGVcIik7XG4gICAgICBsZXQgZXNjID0gcy5zcmMuW3MucG9zXSBpblxuICAgICAgYWR2YW5jZSBzO1xuICAgICAgKG1hdGNoIGVzYyB3aXRoXG4gICAgICAgfCAnbicgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXFxuJ1xuICAgICAgIHwgJ3QnIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1xcdCdcbiAgICAgICB8ICdyJyAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmICdcXHInXG4gICAgICAgfCAnXCInIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1wiJ1xuICAgICAgIHwgJ1xcXFwnIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJ1xcXFwnXG4gICAgICAgfCAndScgLT5cbiAgICAgICAgICgqIFxcdVhYWFgg4oCUIHJlYWQgNCBoZXggZGlnaXRzLCBlbmNvZGUgYXMgVVRGLTggKilcbiAgICAgICAgIGlmIHMucG9zICsgNCA+IHMubGVuIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiSW5jb21wbGV0ZSBcXFxcdSBlc2NhcGVcIik7XG4gICAgICAgICBsZXQgaGV4ID0gU3RyaW5nLnN1YiBzLnNyYyBzLnBvcyA0IGluXG4gICAgICAgICBzLnBvcyA8LSBzLnBvcyArIDQ7XG4gICAgICAgICBsZXQgY29kZSA9IGludF9vZl9zdHJpbmcgKFwiMHhcIiBeIGhleCkgaW5cbiAgICAgICAgIGxldCB1YnVmID0gQnVmZmVyLmNyZWF0ZSA0IGluXG4gICAgICAgICBCdWZmZXIuYWRkX3V0Zl84X3VjaGFyIHVidWYgKFVjaGFyLm9mX2ludCBjb2RlKTtcbiAgICAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiAoQnVmZmVyLmNvbnRlbnRzIHVidWYpXG4gICAgICAgfCAnYCcgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnYCdcbiAgICAgICB8IF8gLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnXFxcXCc7IEJ1ZmZlci5hZGRfY2hhciBidWYgZXNjKTtcbiAgICAgIGdvICgpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgYztcbiAgICAgIGdvICgpXG4gICAgZW5kXG4gIGluIGdvICgpXG5cbmxldCByZWFkX3N5bWJvbCBzID1cbiAgbGV0IHN0YXJ0ID0gcy5wb3MgaW5cbiAgd2hpbGUgcy5wb3MgPCBzLmxlbiAmJiBpc19zeW1ib2xfY2hhciBzLnNyYy5bcy5wb3NdIGRvIGFkdmFuY2UgcyBkb25lO1xuICBTdHJpbmcuc3ViIHMuc3JjIHN0YXJ0IChzLnBvcyAtIHN0YXJ0KVxuXG5sZXQgdHJ5X251bWJlciBzdHIgPVxuICBtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IHN0ciB3aXRoXG4gIHwgU29tZSBuIC0+IFNvbWUgKE51bWJlciBuKVxuICB8IE5vbmUgLT4gTm9uZVxuXG5sZXQgcmVjIHJlYWRfdmFsdWUgcyA6IHZhbHVlID1cbiAgc2tpcF93aGl0ZXNwYWNlX2FuZF9jb21tZW50cyBzO1xuICBpZiBhdF9lbmQgcyB0aGVuIGJlZ2luXG4gICAgbGV0IGxpbmUgPSByZWYgMSBpblxuICAgIFN0cmluZy5pdGVyIChmdW4gYyAtPiBpZiBjID0gJ1xcbicgdGhlbiBpbmNyIGxpbmUpIHMuc3JjO1xuICAgIHJhaXNlIChQYXJzZV9lcnJvciAoUHJpbnRmLnNwcmludGYgXCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhdCBsaW5lICVkIChwb3MgJWQpXCIgIWxpbmUgcy5wb3MpKVxuICBlbmQ7XG4gIG1hdGNoIHMuc3JjLltzLnBvc10gd2l0aFxuICB8ICcoJyAtPiByZWFkX2xpc3QgcyAnKSdcbiAgfCAnWycgLT4gcmVhZF9saXN0IHMgJ10nXG4gIHwgJ3snIC0+IHJlYWRfZGljdCBzXG4gIHwgJ1wiJyAtPiBTdHJpbmcgKHJlYWRfc3RyaW5nIHMpXG4gIHwgJ1xcJycgLT4gYWR2YW5jZSBzOyBMaXN0IFtTeW1ib2wgXCJxdW90ZVwiOyByZWFkX3ZhbHVlIHNdXG4gIHwgJ2AnIC0+IGFkdmFuY2UgczsgTGlzdCBbU3ltYm9sIFwicXVhc2lxdW90ZVwiOyByZWFkX3ZhbHVlIHNdXG4gIHwgJyMnIHdoZW4gcy5wb3MgKyAxIDwgcy5sZW4gJiYgcy5zcmMuW3MucG9zICsgMV0gPSAnOycgLT5cbiAgICAoKiBEYXR1bSBjb21tZW50OiAjOyBkaXNjYXJkcyBuZXh0IGV4cHJlc3Npb24gKilcbiAgICBhZHZhbmNlIHM7IGFkdmFuY2UgcztcbiAgICBpZ25vcmUgKHJlYWRfdmFsdWUgcyk7XG4gICAgcmVhZF92YWx1ZSBzXG4gIHwgJyMnIHdoZW4gcy5wb3MgKyAxIDwgcy5sZW4gJiYgcy5zcmMuW3MucG9zICsgMV0gPSAnXFwnJyAtPlxuICAgICgqIFF1b3RlIHNob3J0aGFuZDogIydleHByIC0+IChxdW90ZSBleHByKSAqKVxuICAgIGFkdmFuY2UgczsgYWR2YW5jZSBzO1xuICAgIExpc3QgW1N5bWJvbCBcInF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgfCAnIycgd2hlbiBzLnBvcyArIDEgPCBzLmxlbiAmJiBzLnNyYy5bcy5wb3MgKyAxXSA9ICd8JyAtPlxuICAgICgqIFJhdyBzdHJpbmc6ICN8Li4ufCAg4oCUIGVuZHMgYXQgbmV4dCB8ICopXG4gICAgYWR2YW5jZSBzOyBhZHZhbmNlIHM7XG4gICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgNjQgaW5cbiAgICBsZXQgcmVjIGdvICgpID1cbiAgICAgIGlmIGF0X2VuZCBzIHRoZW4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiVW50ZXJtaW5hdGVkIHJhdyBzdHJpbmdcIik7XG4gICAgICBsZXQgYyA9IHMuc3JjLltzLnBvc10gaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIGlmIGMgPSAnfCcgdGhlblxuICAgICAgICBTdHJpbmcgKEJ1ZmZlci5jb250ZW50cyBidWYpXG4gICAgICBlbHNlIGJlZ2luXG4gICAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgYztcbiAgICAgICAgZ28gKClcbiAgICAgIGVuZFxuICAgIGluIGdvICgpXG4gIHwgJywnIC0+XG4gICAgKCogVW5xdW90ZSAvIHNwbGljZS11bnF1b3RlIOKAlCBtYXRjaGVzIHNwZWM6ICwgYWx3YXlzIHRyaWdnZXJzIHVucXVvdGUgKilcbiAgICBhZHZhbmNlIHM7XG4gICAgaWYgcy5wb3MgPCBzLmxlbiAmJiBzLnNyYy5bcy5wb3NdID0gJ0AnIHRoZW4gYmVnaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIExpc3QgW1N5bWJvbCBcInNwbGljZS11bnF1b3RlXCI7IHJlYWRfdmFsdWUgc11cbiAgICBlbmQgZWxzZVxuICAgICAgTGlzdCBbU3ltYm9sIFwidW5xdW90ZVwiOyByZWFkX3ZhbHVlIHNdXG4gIHwgXyAtPlxuICAgIGJlZ2luXG4gICAgICAoKiBTeW1ib2wsIGtleXdvcmQsIG51bWJlciwgb3IgYm9vbGVhbiAqKVxuICAgICAgbGV0IHRva2VuID0gcmVhZF9zeW1ib2wgcyBpblxuICAgICAgaWYgdG9rZW4gPSBcIlwiIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IGxpbmUgPSByZWYgMSBhbmQgY29sID0gcmVmIDEgaW5cbiAgICAgICAgZm9yIGkgPSAwIHRvIHMucG9zIC0gMSBkb1xuICAgICAgICAgIGlmIHMuc3JjLltpXSA9ICdcXG4nIHRoZW4gKGluY3IgbGluZTsgY29sIDo9IDEpIGVsc2UgaW5jciBjb2xcbiAgICAgICAgZG9uZTtcbiAgICAgICAgcmFpc2UgKFBhcnNlX2Vycm9yIChQcmludGYuc3ByaW50ZiBcIlVuZXhwZWN0ZWQgY2hhcjogJWMgYXQgbGluZSAlZCBjb2wgJWQgKHBvcyAlZClcIlxuICAgICAgICAgIHMuc3JjLltzLnBvc10gIWxpbmUgIWNvbCBzLnBvcykpXG4gICAgICBlbmQ7XG4gICAgICBtYXRjaCB0b2tlbiB3aXRoXG4gICAgICB8IFwidHJ1ZVwiIC0+IEJvb2wgdHJ1ZVxuICAgICAgfCBcImZhbHNlXCIgLT4gQm9vbCBmYWxzZVxuICAgICAgfCBcIm5pbFwiIC0+IE5pbFxuICAgICAgfCBfIHdoZW4gdG9rZW4uWzBdID0gJzonIC0+XG4gICAgICAgIEtleXdvcmQgKFN0cmluZy5zdWIgdG9rZW4gMSAoU3RyaW5nLmxlbmd0aCB0b2tlbiAtIDEpKVxuICAgICAgfCBfIC0+XG4gICAgICAgIG1hdGNoIHRyeV9udW1iZXIgdG9rZW4gd2l0aFxuICAgICAgICB8IFNvbWUgbiAtPiBuXG4gICAgICAgIHwgTm9uZSAtPiBTeW1ib2wgdG9rZW5cbiAgICBlbmRcblxuYW5kIHJlYWRfbGlzdCBzIGNsb3NlX2NoYXIgPVxuICBhZHZhbmNlIHM7ICgqIHNraXAgb3BlbmluZyBwYXJlbi9icmFja2V0ICopXG4gIGxldCBpdGVtcyA9IHJlZiBbXSBpblxuICBsZXQgcmVjIGdvICgpID1cbiAgICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgbGlzdFwiKTtcbiAgICBpZiBzLnNyYy5bcy5wb3NdID0gY2xvc2VfY2hhciB0aGVuIGJlZ2luXG4gICAgICBhZHZhbmNlIHM7XG4gICAgICBMaXN0IChMaXN0LnJldiAhaXRlbXMpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIGl0ZW1zIDo9IHJlYWRfdmFsdWUgcyA6OiAhaXRlbXM7XG4gICAgICBnbyAoKVxuICAgIGVuZFxuICBpbiBnbyAoKVxuXG5hbmQgcmVhZF9kaWN0IHMgPVxuICBhZHZhbmNlIHM7ICgqIHNraXAgeyAqKVxuICBsZXQgZCA9IG1ha2VfZGljdCAoKSBpblxuICBsZXQgcmVjIGdvICgpID1cbiAgICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gICAgaWYgYXRfZW5kIHMgdGhlbiByYWlzZSAoUGFyc2VfZXJyb3IgXCJVbnRlcm1pbmF0ZWQgZGljdFwiKTtcbiAgICBpZiBzLnNyYy5bcy5wb3NdID0gJ30nIHRoZW4gYmVnaW5cbiAgICAgIGFkdmFuY2UgcztcbiAgICAgIERpY3QgZFxuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBsZXQga2V5ID0gcmVhZF92YWx1ZSBzIGluXG4gICAgICBsZXQga2V5X3N0ciA9IG1hdGNoIGtleSB3aXRoXG4gICAgICAgIHwgS2V5d29yZCBrIC0+IGtcbiAgICAgICAgfCBTdHJpbmcgayAtPiBrXG4gICAgICAgIHwgU3ltYm9sIGsgLT4ga1xuICAgICAgICB8IF8gLT4gcmFpc2UgKFBhcnNlX2Vycm9yIFwiRGljdCBrZXkgbXVzdCBiZSBrZXl3b3JkLCBzdHJpbmcsIG9yIHN5bWJvbFwiKVxuICAgICAgaW5cbiAgICAgIGxldCB2ID0gcmVhZF92YWx1ZSBzIGluXG4gICAgICBkaWN0X3NldCBkIGtleV9zdHIgdjtcbiAgICAgIGdvICgpXG4gICAgZW5kXG4gIGluIGdvICgpXG5cblxuKCoqIFBhcnNlIGEgc3RyaW5nIGludG8gYSBsaXN0IG9mIFNYIHZhbHVlcy4gKilcbmxldCBwYXJzZV9hbGwgc3JjID1cbiAgbGV0IHMgPSBtYWtlX3N0YXRlIHNyYyBpblxuICBsZXQgcmVzdWx0cyA9IHJlZiBbXSBpblxuICBsZXQgcmVjIGdvICgpID1cbiAgICBza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIHM7XG4gICAgaWYgYXRfZW5kIHMgdGhlbiBMaXN0LnJldiAhcmVzdWx0c1xuICAgIGVsc2UgYmVnaW5cbiAgICAgIHJlc3VsdHMgOj0gcmVhZF92YWx1ZSBzIDo6ICFyZXN1bHRzO1xuICAgICAgZ28gKClcbiAgICBlbmRcbiAgaW4gZ28gKClcblxuKCoqIFBhcnNlIGEgZmlsZSBpbnRvIGEgbGlzdCBvZiBTWCB2YWx1ZXMuICopXG5sZXQgcGFyc2VfZmlsZSBwYXRoID1cbiAgbGV0IGljID0gb3Blbl9pbiBwYXRoIGluXG4gIGxldCBuID0gaW5fY2hhbm5lbF9sZW5ndGggaWMgaW5cbiAgbGV0IHNyYyA9IHJlYWxseV9pbnB1dF9zdHJpbmcgaWMgbiBpblxuICBjbG9zZV9pbiBpYztcbiAgcGFyc2VfYWxsIHNyY1xuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ19nZXQiLCJjYW1sX2NhbGwyIiwiZiIsImEwIiwiYTEiLCJjYW1sX2NhbGw0IiwiYTIiLCJhMyIsImdsb2JhbF9kYXRhIiwiU3hfdHlwZXMiLCJTdGRsaWJfQnVmZmVyIiwiU3RkbGliX1N0cmluZyIsIlN0ZGxpYl9QcmludGYiLCJTdGRsaWJfTGlzdCIsIlN0ZGxpYiIsIlN0ZGxpYl9VY2hhciIsIm1ha2Vfc3RhdGUiLCJzcmMiLCJwZWVrIiwicyIsImFkdmFuY2UiLCJhdF9lbmQiLCJza2lwX3doaXRlc3BhY2VfYW5kX2NvbW1lbnRzIiwibWF0Y2giLCJpc19pZGVudF9zdGFydCIsInBhcmFtIiwiaXNfaWRlbnRfY2hhciIsImMiLCJyZWFkX3N0cmluZyIsImJ1ZiIsImVzYyIsImhleCIsImNvZGUiLCJ1YnVmIiwicmVhZF9zeW1ib2wiLCJzdGFydCIsInRyeV9udW1iZXIiLCJzdHIiLCJuIiwiY3N0X3BvcyIsImNzdF9xdW90ZSIsInJlYWRfdmFsdWUiLCJ0b2tlbiIsImNvbCIsImxpbmUiLCJpIiwicmVhZF9saXN0IiwiY2xvc2VfY2hhciIsIml0ZW1zIiwicmVhZF9kaWN0IiwiZCIsImtleSIsImtleV9zdHIiLCJ2IiwicGFyc2VfYWxsIiwicmVzdWx0cyIsInBhcnNlX2ZpbGUiLCJwYXRoIiwiaWMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsOEJBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLGtCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUMsSUFBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFILEdBQUFDLElBQUFDLElBQUFFLElBQUFDO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMs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dCI6eyJsaW5lIjozNDU5MiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiIuc3gub2Jqcy9qc29vL2RlZmF1bHQvc3guY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9saWIvc3hfcmVuZGVyLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqIEhUTUwgcmVuZGVyZXIgZm9yIFNYIHZhbHVlcy5cblxuICAgIEV4dHJhY3RlZCBmcm9tIHJ1bl90ZXN0cy5tbCDigJQgcmVuZGVycyBhbiBTWCBleHByZXNzaW9uIHRyZWUgdG8gYW5cbiAgICBIVE1MIHN0cmluZywgZXhwYW5kaW5nIGNvbXBvbmVudHMgYW5kIG1hY3JvcyBhbG9uZyB0aGUgd2F5LlxuXG4gICAgRGVwZW5kcyBvbiBbU3hfcmVmLmV2YWxfZXhwcl0gZm9yIGV2YWx1YXRpbmcgc3ViLWV4cHJlc3Npb25zXG4gICAgZHVyaW5nIHJlbmRlcmluZyAoa2V5d29yZCBhcmcgdmFsdWVzLCBjb25kaXRpb25hbHMsIGV0Yy4pLiAqKVxuXG5vcGVuIFN4X3R5cGVzXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFRhZyAvIGF0dHJpYnV0ZSByZWdpc3RyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbmxldCBodG1sX3RhZ3MgPSBbXG4gIFwiaHRtbFwiOyBcImhlYWRcIjsgXCJib2R5XCI7IFwidGl0bGVcIjsgXCJtZXRhXCI7IFwibGlua1wiOyBcInNjcmlwdFwiOyBcInN0eWxlXCI7IFwibm9zY3JpcHRcIjtcbiAgXCJoZWFkZXJcIjsgXCJuYXZcIjsgXCJtYWluXCI7IFwic2VjdGlvblwiOyBcImFydGljbGVcIjsgXCJhc2lkZVwiOyBcImZvb3RlclwiO1xuICBcImgxXCI7IFwiaDJcIjsgXCJoM1wiOyBcImg0XCI7IFwiaDVcIjsgXCJoNlwiOyBcImhncm91cFwiO1xuICBcImRpdlwiOyBcInBcIjsgXCJibG9ja3F1b3RlXCI7IFwicHJlXCI7IFwiZmlndXJlXCI7IFwiZmlnY2FwdGlvblwiOyBcImFkZHJlc3NcIjsgXCJoclwiO1xuICBcInVsXCI7IFwib2xcIjsgXCJsaVwiOyBcImRsXCI7IFwiZHRcIjsgXCJkZFwiOyBcIm1lbnVcIjtcbiAgXCJhXCI7IFwic3BhblwiOyBcImVtXCI7IFwic3Ryb25nXCI7IFwic21hbGxcIjsgXCJiXCI7IFwiaVwiOyBcInVcIjsgXCJzXCI7IFwic3ViXCI7IFwic3VwXCI7XG4gIFwibWFya1wiOyBcImRlbFwiOyBcImluc1wiOyBcInFcIjsgXCJjaXRlXCI7IFwiZGZuXCI7IFwiYWJiclwiOyBcImNvZGVcIjsgXCJ2YXJcIjsgXCJzYW1wXCI7XG4gIFwia2JkXCI7IFwiZGF0YVwiOyBcInRpbWVcIjsgXCJydWJ5XCI7IFwicnRcIjsgXCJycFwiOyBcImJkaVwiOyBcImJkb1wiOyBcIndiclwiOyBcImJyXCI7XG4gIFwidGFibGVcIjsgXCJ0aGVhZFwiOyBcInRib2R5XCI7IFwidGZvb3RcIjsgXCJ0clwiOyBcInRoXCI7IFwidGRcIjsgXCJjYXB0aW9uXCI7IFwiY29sZ3JvdXBcIjsgXCJjb2xcIjtcbiAgXCJmb3JtXCI7IFwiaW5wdXRcIjsgXCJ0ZXh0YXJlYVwiOyBcInNlbGVjdFwiOyBcIm9wdGlvblwiOyBcIm9wdGdyb3VwXCI7IFwiYnV0dG9uXCI7IFwibGFiZWxcIjtcbiAgXCJmaWVsZHNldFwiOyBcImxlZ2VuZFwiOyBcImRhdGFsaXN0XCI7IFwib3V0cHV0XCI7IFwicHJvZ3Jlc3NcIjsgXCJtZXRlclwiO1xuICBcImRldGFpbHNcIjsgXCJzdW1tYXJ5XCI7IFwiZGlhbG9nXCI7XG4gIFwiaW1nXCI7IFwidmlkZW9cIjsgXCJhdWRpb1wiOyBcInNvdXJjZVwiOyBcInBpY3R1cmVcIjsgXCJjYW52YXNcIjsgXCJpZnJhbWVcIjsgXCJlbWJlZFwiOyBcIm9iamVjdFwiOyBcInBhcmFtXCI7XG4gIFwic3ZnXCI7IFwicGF0aFwiOyBcImNpcmNsZVwiOyBcInJlY3RcIjsgXCJsaW5lXCI7IFwicG9seWxpbmVcIjsgXCJwb2x5Z29uXCI7IFwiZWxsaXBzZVwiO1xuICBcImdcIjsgXCJkZWZzXCI7IFwidXNlXCI7IFwidGV4dFwiOyBcInRzcGFuXCI7IFwiY2xpcFBhdGhcIjsgXCJtYXNrXCI7IFwicGF0dGVyblwiO1xuICBcImxpbmVhckdyYWRpZW50XCI7IFwicmFkaWFsR3JhZGllbnRcIjsgXCJzdG9wXCI7IFwiZmlsdGVyXCI7IFwiZmVCbGVuZFwiOyBcImZlRmxvb2RcIjtcbiAgXCJmZUdhdXNzaWFuQmx1clwiOyBcImZlT2Zmc2V0XCI7IFwiZmVNZXJnZVwiOyBcImZlTWVyZ2VOb2RlXCI7IFwiZmVDb21wb3NpdGVcIjtcbiAgXCJ0ZW1wbGF0ZVwiOyBcInNsb3RcIjtcbl1cblxubGV0IHZvaWRfZWxlbWVudHMgPSBbXG4gIFwiYXJlYVwiOyBcImJhc2VcIjsgXCJiclwiOyBcImNvbFwiOyBcImVtYmVkXCI7IFwiaHJcIjsgXCJpbWdcIjsgXCJpbnB1dFwiO1xuICBcImxpbmtcIjsgXCJtZXRhXCI7IFwicGFyYW1cIjsgXCJzb3VyY2VcIjsgXCJ0cmFja1wiOyBcIndiclwiXG5dXG5cbmxldCBib29sZWFuX2F0dHJzID0gW1xuICBcImFzeW5jXCI7IFwiYXV0b2ZvY3VzXCI7IFwiYXV0b3BsYXlcIjsgXCJjaGVja2VkXCI7IFwiY29udHJvbHNcIjsgXCJkZWZhdWx0XCI7XG4gIFwiZGVmZXJcIjsgXCJkaXNhYmxlZFwiOyBcImZvcm1ub3ZhbGlkYXRlXCI7IFwiaGlkZGVuXCI7IFwiaW5lcnRcIjsgXCJpc21hcFwiO1xuICBcImxvb3BcIjsgXCJtdWx0aXBsZVwiOyBcIm11dGVkXCI7IFwibm9tb2R1bGVcIjsgXCJub3ZhbGlkYXRlXCI7IFwib3BlblwiO1xuICBcInBsYXlzaW5saW5lXCI7IFwicmVhZG9ubHlcIjsgXCJyZXF1aXJlZFwiOyBcInJldmVyc2VkXCI7IFwic2VsZWN0ZWRcIlxuXVxuXG5sZXQgaXNfaHRtbF90YWcgbmFtZSA9IExpc3QubWVtIG5hbWUgaHRtbF90YWdzXG5sZXQgaXNfdm9pZCBuYW1lID0gTGlzdC5tZW0gbmFtZSB2b2lkX2VsZW1lbnRzXG5sZXQgaXNfYm9vbGVhbl9hdHRyIG5hbWUgPSBMaXN0Lm1lbSBuYW1lIGJvb2xlYW5fYXR0cnNcblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBIVE1MIGVzY2FwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgZXNjYXBlX2h0bWwgcyA9XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMpIGluXG4gIFN0cmluZy5pdGVyIChmdW5jdGlvblxuICAgIHwgJyYnIC0+IEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIiZhbXA7XCJcbiAgICB8ICc8JyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCImbHQ7XCJcbiAgICB8ICc+JyAtPiBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCImZ3Q7XCJcbiAgICB8ICdcIicgLT4gQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiJnF1b3Q7XCJcbiAgICB8IGMgLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiBjKSBzO1xuICBCdWZmZXIuY29udGVudHMgYnVmXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogQXR0cmlidXRlIHJlbmRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IHJlbmRlcl9hdHRycyBhdHRycyA9XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPlxuICAgIGlmIGlzX2Jvb2xlYW5fYXR0ciBrIHRoZW4gYmVnaW5cbiAgICAgIGlmIHN4X3RydXRoeSB2IHRoZW4gYmVnaW5cbiAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnICc7XG4gICAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBrXG4gICAgICBlbmRcbiAgICBlbmQgZWxzZSBpZiBub3QgKGlzX25pbCB2KSB0aGVuIGJlZ2luXG4gICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICcgJztcbiAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBrO1xuICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiPVxcXCJcIjtcbiAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiAoZXNjYXBlX2h0bWwgKHZhbHVlX3RvX3N0cmluZyB2KSk7XG4gICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICdcIidcbiAgICBlbmQpIGF0dHJzO1xuICBCdWZmZXIuY29udGVudHMgYnVmXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogSFRNTCByZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxuKCogRm9yd2FyZCByZWYg4oCUIHJlc29sdmVkIGF0IHNldHVwIHRpbWUgKilcbmxldCByZW5kZXJfdG9faHRtbF9yZWYgOiAodmFsdWUgLT4gZW52IC0+IHN0cmluZykgcmVmID1cbiAgcmVmIChmdW4gX2V4cHIgX2VudiAtPiBcIlwiKVxuXG5sZXQgcmVuZGVyX3RvX2h0bWwgZXhwciBlbnYgPSAhcmVuZGVyX3RvX2h0bWxfcmVmIGV4cHIgZW52XG5cbmxldCByZW5kZXJfY2hpbGRyZW4gY2hpbGRyZW4gZW52ID1cbiAgU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCAoZnVuIGMgLT4gcmVuZGVyX3RvX2h0bWwgYyBlbnYpIGNoaWxkcmVuKVxuXG4oKiogUGFyc2Uga2V5d29yZCBhdHRycyBhbmQgcG9zaXRpb25hbCBjaGlsZHJlbiBmcm9tIGFuIGVsZW1lbnQgY2FsbCdzIGFyZ3MuXG4gICAgQXR0cnMgYXJlIGV2YWx1YXRlZDsgY2hpbGRyZW4gYXJlIHJldHVybmVkIFVORVZBTFVBVEVEIGZvciByZW5kZXIgZGlzcGF0Y2guICopXG5sZXQgcGFyc2VfZWxlbWVudF9hcmdzIGFyZ3MgZW52ID1cbiAgbGV0IGF0dHJzID0gSGFzaHRibC5jcmVhdGUgOCBpblxuICBsZXQgY2hpbGRyZW4gPSByZWYgW10gaW5cbiAgbGV0IHNraXAgPSByZWYgZmFsc2UgaW5cbiAgbGV0IGxlbiA9IExpc3QubGVuZ3RoIGFyZ3MgaW5cbiAgTGlzdC5pdGVyaSAoZnVuIGlkeCBhcmcgLT5cbiAgICBpZiAhc2tpcCB0aGVuIHNraXAgOj0gZmFsc2VcbiAgICBlbHNlIG1hdGNoIGFyZyB3aXRoXG4gICAgfCBLZXl3b3JkIGsgd2hlbiBpZHggKyAxIDwgbGVuIC0+XG4gICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QubnRoIGFyZ3MgKGlkeCArIDEpKSAoRW52IGVudikgaW5cbiAgICAgIEhhc2h0YmwucmVwbGFjZSBhdHRycyBrIHY7XG4gICAgICBza2lwIDo9IHRydWVcbiAgICB8IFNwcmVhZCBwYWlycyAtPlxuICAgICAgTGlzdC5pdGVyIChmdW4gKGssIHYpIC0+IEhhc2h0YmwucmVwbGFjZSBhdHRycyBrIHYpIHBhaXJzXG4gICAgfCBfIC0+XG4gICAgICBjaGlsZHJlbiA6PSBhcmcgOjogIWNoaWxkcmVuXG4gICkgYXJncztcbiAgKGF0dHJzLCBMaXN0LnJldiAhY2hpbGRyZW4pXG5cbmxldCByZW5kZXJfaHRtbF9lbGVtZW50IHRhZyBhcmdzIGVudiA9XG4gIGxldCAoYXR0cnMsIGNoaWxkcmVuKSA9IHBhcnNlX2VsZW1lbnRfYXJncyBhcmdzIGVudiBpblxuICBsZXQgYXR0cl9zdHIgPSByZW5kZXJfYXR0cnMgYXR0cnMgaW5cbiAgaWYgaXNfdm9pZCB0YWcgdGhlblxuICAgIFwiPFwiIF4gdGFnIF4gYXR0cl9zdHIgXiBcIiAvPlwiXG4gIGVsc2VcbiAgICBsZXQgY29udGVudCA9IFN0cmluZy5jb25jYXQgXCJcIlxuICAgICAgKExpc3QubWFwIChmdW4gYyAtPiByZW5kZXJfdG9faHRtbCBjIGVudikgY2hpbGRyZW4pIGluXG4gICAgXCI8XCIgXiB0YWcgXiBhdHRyX3N0ciBeIFwiPlwiIF4gY29udGVudCBeIFwiPC9cIiBeIHRhZyBeIFwiPlwiXG5cbmxldCByZW5kZXJfY29tcG9uZW50IGNvbXAgYXJncyBlbnYgPVxuICBtYXRjaCBjb21wIHdpdGhcbiAgfCBDb21wb25lbnQgYyAtPlxuICAgIGxldCBrd2FyZ3MgPSBIYXNodGJsLmNyZWF0ZSA4IGluXG4gICAgbGV0IGNoaWxkcmVuX2V4cHJzID0gcmVmIFtdIGluXG4gICAgbGV0IHNraXAgPSByZWYgZmFsc2UgaW5cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggYXJncyBpblxuICAgIExpc3QuaXRlcmkgKGZ1biBpZHggYXJnIC0+XG4gICAgICBpZiAhc2tpcCB0aGVuIHNraXAgOj0gZmFsc2VcbiAgICAgIGVsc2UgbWF0Y2ggYXJnIHdpdGhcbiAgICAgIHwgS2V5d29yZCBrIHdoZW4gaWR4ICsgMSA8IGxlbiAtPlxuICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QubnRoIGFyZ3MgKGlkeCArIDEpKSAoRW52IGVudikgaW5cbiAgICAgICAgSGFzaHRibC5yZXBsYWNlIGt3YXJncyBrIHY7XG4gICAgICAgIHNraXAgOj0gdHJ1ZVxuICAgICAgfCBfIC0+XG4gICAgICAgIGNoaWxkcmVuX2V4cHJzIDo9IGFyZyA6OiAhY2hpbGRyZW5fZXhwcnNcbiAgICApIGFyZ3M7XG4gICAgbGV0IGNoaWxkcmVuID0gTGlzdC5yZXYgIWNoaWxkcmVuX2V4cHJzIGluXG4gICAgbGV0IGxvY2FsID0gZW52X21lcmdlIGMuY19jbG9zdXJlIGVudiBpblxuICAgIExpc3QuaXRlciAoZnVuIHAgLT5cbiAgICAgIGxldCB2ID0gbWF0Y2ggSGFzaHRibC5maW5kX29wdCBrd2FyZ3MgcCB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBOaWwgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgcCB2KVxuICAgICkgYy5jX3BhcmFtcztcbiAgICBpZiBjLmNfaGFzX2NoaWxkcmVuIHRoZW4gYmVnaW5cbiAgICAgIGxldCByZW5kZXJlZF9jaGlsZHJlbiA9IFN0cmluZy5jb25jYXQgXCJcIlxuICAgICAgICAoTGlzdC5tYXAgKGZ1biBjIC0+IHJlbmRlcl90b19odG1sIGMgZW52KSBjaGlsZHJlbikgaW5cbiAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgXCJjaGlsZHJlblwiIChSYXdIVE1MIHJlbmRlcmVkX2NoaWxkcmVuKSlcbiAgICBlbmQ7XG4gICAgcmVuZGVyX3RvX2h0bWwgYy5jX2JvZHkgbG9jYWxcbiAgfCBfIC0+IFwiXCJcblxubGV0IGV4cGFuZF9tYWNybyAobSA6IG1hY3JvKSBhcmdzIF9lbnYgPVxuICBsZXQgbG9jYWwgPSBlbnZfZXh0ZW5kIG0ubV9jbG9zdXJlIGluXG4gIGxldCBwYXJhbXMgPSBtLm1fcGFyYW1zIGluXG4gIGxldCByZWMgYmluZF9wYXJhbXMgcHMgYXMnID1cbiAgICBtYXRjaCBwcywgYXMnIHdpdGhcbiAgICB8IFtdLCByZXN0IC0+XG4gICAgICAobWF0Y2ggbS5tX3Jlc3RfcGFyYW0gd2l0aFxuICAgICAgIHwgU29tZSBycCAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHJwIChMaXN0IHJlc3QpKVxuICAgICAgIHwgTm9uZSAtPiAoKSlcbiAgICB8IHAgOjogcHNfcmVzdCwgYSA6OiBhc19yZXN0IC0+XG4gICAgICBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgYSk7XG4gICAgICBiaW5kX3BhcmFtcyBwc19yZXN0IGFzX3Jlc3RcbiAgICB8IF8gOjogXywgW10gLT5cbiAgICAgIExpc3QuaXRlciAoZnVuIHAgLT4gaWdub3JlIChlbnZfYmluZCBsb2NhbCBwIE5pbCkpIChMaXN0LnJldiBwcylcbiAgaW5cbiAgYmluZF9wYXJhbXMgcGFyYW1zIGFyZ3M7XG4gIFN4X3JlZi5ldmFsX2V4cHIgbS5tX2JvZHkgKEVudiBsb2NhbClcblxubGV0IHJlYyBkb19yZW5kZXJfdG9faHRtbCAoZXhwciA6IHZhbHVlKSAoZW52IDogZW52KSA6IHN0cmluZyA9XG4gIG1hdGNoIGV4cHIgd2l0aFxuICB8IE5pbCAtPiBcIlwiXG4gIHwgQm9vbCB0cnVlIC0+IFwidHJ1ZVwiXG4gIHwgQm9vbCBmYWxzZSAtPiBcImZhbHNlXCJcbiAgfCBOdW1iZXIgbiAtPlxuICAgIGlmIEZsb2F0LmlzX2ludGVnZXIgbiB0aGVuIHN0cmluZ19vZl9pbnQgKGludF9vZl9mbG9hdCBuKVxuICAgIGVsc2UgUHJpbnRmLnNwcmludGYgXCIlZ1wiIG5cbiAgfCBTdHJpbmcgcyAtPiBlc2NhcGVfaHRtbCBzXG4gIHwgS2V5d29yZCBrIC0+IGVzY2FwZV9odG1sIGtcbiAgfCBSYXdIVE1MIHMgLT4gc1xuICB8IFN5bWJvbCBzIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIChTeW1ib2wgcykgKEVudiBlbnYpIGluXG4gICAgZG9fcmVuZGVyX3RvX2h0bWwgdiBlbnZcbiAgfCBMaXN0IFtdIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gW10gfSAtPiBcIlwiXG4gIHwgTGlzdCAoaGVhZCA6OiBhcmdzKSB8IExpc3RSZWYgeyBjb250ZW50cyA9IGhlYWQgOjogYXJncyB9IC0+XG4gICAgcmVuZGVyX2xpc3RfdG9faHRtbCBoZWFkIGFyZ3MgZW52XG4gIHwgXyAtPlxuICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZW52KSBpblxuICAgIGRvX3JlbmRlcl90b19odG1sIHYgZW52XG5cbmFuZCByZW5kZXJfbGlzdF90b19odG1sIGhlYWQgYXJncyBlbnYgPVxuICBtYXRjaCBoZWFkIHdpdGhcbiAgfCBTeW1ib2wgXCI8PlwiIC0+XG4gICAgcmVuZGVyX2NoaWxkcmVuIGFyZ3MgZW52XG4gIHwgU3ltYm9sIFwicmF3IVwiIC0+XG4gICAgKCogSW5qZWN0IHByZS1yZW5kZXJlZCBIVE1MIHdpdGhvdXQgZXNjYXBpbmcgKilcbiAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QuaGQgYXJncykgKEVudiBlbnYpIGluXG4gICAgKG1hdGNoIHYgd2l0aFxuICAgICB8IFN0cmluZyBzIHwgUmF3SFRNTCBzIC0+IHNcbiAgICAgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyB2KVxuICB8IFN5bWJvbCB0YWcgd2hlbiBpc19odG1sX3RhZyB0YWcgLT5cbiAgICByZW5kZXJfaHRtbF9lbGVtZW50IHRhZyBhcmdzIGVudlxuICB8IFN5bWJvbCBcImlmXCIgLT5cbiAgICBsZXQgY29uZF92YWwgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0LmhkIGFyZ3MpIChFbnYgZW52KSBpblxuICAgIGlmIHN4X3RydXRoeSBjb25kX3ZhbCB0aGVuXG4gICAgICAoaWYgTGlzdC5sZW5ndGggYXJncyA+IDEgdGhlbiBkb19yZW5kZXJfdG9faHRtbCAoTGlzdC5udGggYXJncyAxKSBlbnYgZWxzZSBcIlwiKVxuICAgIGVsc2VcbiAgICAgIChpZiBMaXN0Lmxlbmd0aCBhcmdzID4gMiB0aGVuIGRvX3JlbmRlcl90b19odG1sIChMaXN0Lm50aCBhcmdzIDIpIGVudiBlbHNlIFwiXCIpXG4gIHwgU3ltYm9sIFwid2hlblwiIC0+XG4gICAgbGV0IGNvbmRfdmFsID0gU3hfcmVmLmV2YWxfZXhwciAoTGlzdC5oZCBhcmdzKSAoRW52IGVudikgaW5cbiAgICBpZiBzeF90cnV0aHkgY29uZF92YWwgdGhlblxuICAgICAgU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCAoZnVuIGUgLT4gZG9fcmVuZGVyX3RvX2h0bWwgZSBlbnYpIChMaXN0LnRsIGFyZ3MpKVxuICAgIGVsc2UgXCJcIlxuICB8IFN5bWJvbCBcImNvbmRcIiAtPlxuICAgIHJlbmRlcl9jb25kIGFyZ3MgZW52XG4gIHwgU3ltYm9sIFwiY2FzZVwiIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0IChoZWFkIDo6IGFyZ3MpKSAoRW52IGVudikgaW5cbiAgICBkb19yZW5kZXJfdG9faHRtbCB2IGVudlxuICB8IFN5bWJvbCAoXCJsZXRcIiB8IFwibGV0KlwiKSAtPlxuICAgIHJlbmRlcl9sZXQgYXJncyBlbnZcbiAgfCBTeW1ib2wgKFwiYmVnaW5cIiB8IFwiZG9cIikgLT5cbiAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgfCBbbGFzdF0gLT4gZG9fcmVuZGVyX3RvX2h0bWwgbGFzdCBlbnZcbiAgICAgIHwgZSA6OiByZXN0IC0+XG4gICAgICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciBlIChFbnYgZW52KSk7XG4gICAgICAgIGdvIHJlc3RcbiAgICBpbiBnbyBhcmdzXG4gIHwgU3ltYm9sIChcImRlZmluZVwiIHwgXCJkZWZjb21wXCIgfCBcImRlZm1hY3JvXCIgfCBcImRlZmlzbGFuZFwiKSAtPlxuICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoaGVhZCA6OiBhcmdzKSkgKEVudiBlbnYpKTtcbiAgICBcIlwiXG4gIHwgU3ltYm9sIFwibWFwXCIgLT5cbiAgICByZW5kZXJfbWFwIGFyZ3MgZW52IGZhbHNlXG4gIHwgU3ltYm9sIFwibWFwLWluZGV4ZWRcIiAtPlxuICAgIHJlbmRlcl9tYXAgYXJncyBlbnYgdHJ1ZVxuICB8IFN5bWJvbCBcImZpbHRlclwiIC0+XG4gICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIChMaXN0IChoZWFkIDo6IGFyZ3MpKSAoRW52IGVudikgaW5cbiAgICBkb19yZW5kZXJfdG9faHRtbCB2IGVudlxuICB8IFN5bWJvbCBcImZvci1lYWNoXCIgLT5cbiAgICByZW5kZXJfZm9yX2VhY2ggYXJncyBlbnZcbiAgfCBTeW1ib2wgbmFtZSAtPlxuICAgICh0cnlcbiAgICAgIGxldCB2ID0gZW52X2dldCBlbnYgbmFtZSBpblxuICAgICAgKG1hdGNoIHYgd2l0aFxuICAgICAgIHwgQ29tcG9uZW50IGMgd2hlbiBjLmNfYWZmaW5pdHkgPSBcImNsaWVudFwiIC0+IFwiXCIgICgqIHNraXAgY2xpZW50LW9ubHkgKilcbiAgICAgICB8IENvbXBvbmVudCBfIC0+IHJlbmRlcl9jb21wb25lbnQgdiBhcmdzIGVudlxuICAgICAgIHwgSXNsYW5kIF9pIC0+XG4gICAgICAgICAoKiBJc2xhbmRzOiBTU1IgdmlhIHRoZSBTWCByZW5kZXItdG8taHRtbCBmcm9tIGFkYXB0ZXItaHRtbC5zeC5cbiAgICAgICAgICAgIEl0IGhhbmRsZXMgZGVyZWYvc2lnbmFsL2NvbXB1dGVkIHRocm91Z2ggdGhlIENFSyBjb3JyZWN0bHksXG4gICAgICAgICAgICBhbmQgcmVuZGVycyBpc2xhbmQgYm9kaWVzIHdpdGggaHlkcmF0aW9uIG1hcmtlcnMuICopXG4gICAgICAgICAodHJ5XG4gICAgICAgICAgIGxldCBjYWxsX2V4cHIgPSBMaXN0IChTeW1ib2wgbmFtZSA6OiBhcmdzKSBpblxuICAgICAgICAgICBsZXQgcXVvdGVkID0gTGlzdCBbU3ltYm9sIFwicXVvdGVcIjsgY2FsbF9leHByXSBpblxuICAgICAgICAgICBsZXQgcmVuZGVyX2NhbGwgPSBMaXN0IFtTeW1ib2wgXCJyZW5kZXItdG8taHRtbFwiOyBxdW90ZWQ7IEVudiBlbnZdIGluXG4gICAgICAgICAgIGxldCByZXN1bHQgPSBTeF9yZWYuZXZhbF9leHByIHJlbmRlcl9jYWxsIChFbnYgZW52KSBpblxuICAgICAgICAgICAobWF0Y2ggcmVzdWx0IHdpdGhcbiAgICAgICAgICAgIHwgU3RyaW5nIHMgfCBSYXdIVE1MIHMgLT4gc1xuICAgICAgICAgICAgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyByZXN1bHQpXG4gICAgICAgICB3aXRoIGUgLT5cbiAgICAgICAgICAgUHJpbnRmLmVwcmludGYgXCJbc3NyLWlzbGFuZF0gfiVzIEZBSUxFRDogJXNcXG4lc1xcbiUhXCIgX2kuaV9uYW1lIChQcmludGV4Yy50b19zdHJpbmcgZSkgKFByaW50ZXhjLmdldF9iYWNrdHJhY2UgKCkpO1xuICAgICAgICAgICBcIlwiKVxuICAgICAgIHwgTWFjcm8gbSAtPlxuICAgICAgICAgbGV0IGV4cGFuZGVkID0gZXhwYW5kX21hY3JvIG0gYXJncyBlbnYgaW5cbiAgICAgICAgIGRvX3JlbmRlcl90b19odG1sIGV4cGFuZGVkIGVudlxuICAgICAgIHwgXyAtPlxuICAgICAgICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudilcbiAgICB3aXRoIEV2YWxfZXJyb3IgXyAtPlxuICAgICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudilcbiAgfCBfIC0+XG4gICAgbGV0IHJlc3VsdCA9IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGhlYWQgOjogYXJncykpIChFbnYgZW52KSBpblxuICAgIGRvX3JlbmRlcl90b19odG1sIHJlc3VsdCBlbnZcblxuYW5kIHJlbmRlcl9jb25kIGFyZ3MgZW52ID1cbiAgbGV0IGFzX2xpc3QgPSBmdW5jdGlvbiBMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0gLT4gU29tZSBsIHwgXyAtPiBOb25lIGluXG4gIGxldCBpc19zY2hlbWUgPSBMaXN0LmZvcl9hbGwgKGZ1biBhIC0+IG1hdGNoIGFzX2xpc3QgYSB3aXRoXG4gICAgfCBTb21lIGl0ZW1zIHdoZW4gTGlzdC5sZW5ndGggaXRlbXMgPSAyIC0+IHRydWVcbiAgICB8IF8gLT4gZmFsc2UpIGFyZ3NcbiAgaW5cbiAgaWYgaXNfc2NoZW1lIHRoZW4gYmVnaW5cbiAgICBsZXQgcmVjIGdvID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgfCBjbGF1c2UgOjogcmVzdCAtPlxuICAgICAgICAobWF0Y2ggYXNfbGlzdCBjbGF1c2Ugd2l0aFxuICAgICAgICAgfCBTb21lIFt0ZXN0OyBib2R5XSAtPlxuICAgICAgICAgICBsZXQgaXNfZWxzZSA9IG1hdGNoIHRlc3Qgd2l0aFxuICAgICAgICAgICAgIHwgS2V5d29yZCBcImVsc2VcIiAtPiB0cnVlXG4gICAgICAgICAgICAgfCBTeW1ib2wgXCJlbHNlXCIgfCBTeW1ib2wgXCI6ZWxzZVwiIC0+IHRydWVcbiAgICAgICAgICAgICB8IF8gLT4gZmFsc2VcbiAgICAgICAgICAgaW5cbiAgICAgICAgICAgaWYgaXNfZWxzZSB0aGVuIGRvX3JlbmRlcl90b19odG1sIGJvZHkgZW52XG4gICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgdGVzdCAoRW52IGVudikgaW5cbiAgICAgICAgICAgICBpZiBzeF90cnV0aHkgdiB0aGVuIGRvX3JlbmRlcl90b19odG1sIGJvZHkgZW52XG4gICAgICAgICAgICAgZWxzZSBnbyByZXN0XG4gICAgICAgICB8IF8gLT4gXCJcIilcbiAgICBpbiBnbyBhcmdzXG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgbGV0IHJlYyBnbyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IFwiXCJcbiAgICAgIHwgW19dIC0+IFwiXCJcbiAgICAgIHwgdGVzdCA6OiBib2R5IDo6IHJlc3QgLT5cbiAgICAgICAgbGV0IGlzX2Vsc2UgPSBtYXRjaCB0ZXN0IHdpdGhcbiAgICAgICAgICB8IEtleXdvcmQgXCJlbHNlXCIgLT4gdHJ1ZVxuICAgICAgICAgIHwgU3ltYm9sIFwiZWxzZVwiIHwgU3ltYm9sIFwiOmVsc2VcIiAtPiB0cnVlXG4gICAgICAgICAgfCBfIC0+IGZhbHNlXG4gICAgICAgIGluXG4gICAgICAgIGlmIGlzX2Vsc2UgdGhlbiBkb19yZW5kZXJfdG9faHRtbCBib2R5IGVudlxuICAgICAgICBlbHNlXG4gICAgICAgICAgbGV0IHYgPSBTeF9yZWYuZXZhbF9leHByIHRlc3QgKEVudiBlbnYpIGluXG4gICAgICAgICAgaWYgc3hfdHJ1dGh5IHYgdGhlbiBkb19yZW5kZXJfdG9faHRtbCBib2R5IGVudlxuICAgICAgICAgIGVsc2UgZ28gcmVzdFxuICAgIGluIGdvIGFyZ3NcbiAgZW5kXG5cbmFuZCByZW5kZXJfbGV0IGFyZ3MgZW52ID1cbiAgbGV0IGFzX2xpc3QgPSBmdW5jdGlvbiBMaXN0IGwgfCBMaXN0UmVmIHsgY29udGVudHMgPSBsIH0gLT4gU29tZSBsIHwgXyAtPiBOb25lIGluXG4gIGxldCBiaW5kaW5nc19leHByID0gTGlzdC5oZCBhcmdzIGluXG4gIGxldCBib2R5ID0gTGlzdC50bCBhcmdzIGluXG4gIGxldCBsb2NhbCA9IGVudl9leHRlbmQgZW52IGluXG4gIGxldCBiaW5kaW5ncyA9IG1hdGNoIGFzX2xpc3QgYmluZGluZ3NfZXhwciB3aXRoIFNvbWUgbCAtPiBsIHwgTm9uZSAtPiBbXSBpblxuICBsZXQgaXNfc2NoZW1lID0gbWF0Y2ggYmluZGluZ3Mgd2l0aFxuICAgIHwgKExpc3QgXyA6OiBfKSB8IChMaXN0UmVmIF8gOjogXykgLT4gdHJ1ZVxuICAgIHwgXyAtPiBmYWxzZVxuICBpblxuICBpZiBpc19zY2hlbWUgdGhlblxuICAgIExpc3QuaXRlciAoZnVuIGIgLT5cbiAgICAgIG1hdGNoIGFzX2xpc3QgYiB3aXRoXG4gICAgICB8IFNvbWUgW1N5bWJvbCBuYW1lOyBleHByXSB8IFNvbWUgW1N0cmluZyBuYW1lOyBleHByXSAtPlxuICAgICAgICBsZXQgdiA9IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGxvY2FsKSBpblxuICAgICAgICBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIG5hbWUgdilcbiAgICAgIHwgXyAtPiAoKVxuICAgICkgYmluZGluZ3NcbiAgZWxzZSBiZWdpblxuICAgIGxldCByZWMgZ28gPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiAoKVxuICAgICAgfCAoU3ltYm9sIG5hbWUpIDo6IGV4cHIgOjogcmVzdCB8IChTdHJpbmcgbmFtZSkgOjogZXhwciA6OiByZXN0IC0+XG4gICAgICAgIGxldCB2ID0gU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgbG9jYWwpIGluXG4gICAgICAgIGlnbm9yZSAoZW52X2JpbmQgbG9jYWwgbmFtZSB2KTtcbiAgICAgICAgZ28gcmVzdFxuICAgICAgfCBfIC0+ICgpXG4gICAgaW4gZ28gYmluZGluZ3NcbiAgZW5kO1xuICBsZXQgcmVjIHJlbmRlcl9ib2R5ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IFwiXCJcbiAgICB8IFtsYXN0XSAtPiBkb19yZW5kZXJfdG9faHRtbCBsYXN0IGxvY2FsXG4gICAgfCBlIDo6IHJlc3QgLT5cbiAgICAgIGlnbm9yZSAoU3hfcmVmLmV2YWxfZXhwciBlIChFbnYgbG9jYWwpKTtcbiAgICAgIHJlbmRlcl9ib2R5IHJlc3RcbiAgaW4gcmVuZGVyX2JvZHkgYm9keVxuXG5hbmQgcmVuZGVyX21hcCBhcmdzIGVudiBpbmRleGVkID1cbiAgbGV0IChmbl92YWwsIGNvbGxfdmFsKSA9IG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgdmEgPSBTeF9yZWYuZXZhbF9leHByIGEgKEVudiBlbnYpIGluXG4gICAgICBsZXQgdmIgPSBTeF9yZWYuZXZhbF9leHByIGIgKEVudiBlbnYpIGluXG4gICAgICAobWF0Y2ggdmEsIHZiIHdpdGhcbiAgICAgICB8IChMYW1iZGEgXyB8IE5hdGl2ZUZuIF8pLCBfIC0+ICh2YSwgdmIpXG4gICAgICAgfCBfLCAoTGFtYmRhIF8gfCBOYXRpdmVGbiBfKSAtPiAodmIsIHZhKVxuICAgICAgIHwgXyAtPiAodmEsIHZiKSlcbiAgICB8IF8gLT4gKE5pbCwgTmlsKVxuICBpblxuICBsZXQgaXRlbXMgPSBtYXRjaCBjb2xsX3ZhbCB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwaSAoZnVuIGkgaXRlbSAtPlxuICAgIGxldCBjYWxsX2FyZ3MgPSBpZiBpbmRleGVkIHRoZW4gW051bWJlciAoZmxvYXRfb2ZfaW50IGkpOyBpdGVtXSBlbHNlIFtpdGVtXSBpblxuICAgIG1hdGNoIGZuX3ZhbCB3aXRoXG4gICAgfCBMYW1iZGEgbCAtPlxuICAgICAgbGV0IGxvY2FsID0gZW52X2V4dGVuZCBsLmxfY2xvc3VyZSBpblxuICAgICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgYSkpXG4gICAgICAgIGwubF9wYXJhbXMgY2FsbF9hcmdzO1xuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgbC5sX2JvZHkgbG9jYWxcbiAgICB8IF8gLT5cbiAgICAgIGxldCByZXN1bHQgPSBTeF9ydW50aW1lLnN4X2NhbGwgZm5fdmFsIGNhbGxfYXJncyBpblxuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudlxuICApIGl0ZW1zKVxuXG5hbmQgcmVuZGVyX2Zvcl9lYWNoIGFyZ3MgZW52ID1cbiAgbGV0IChmbl92YWwsIGNvbGxfdmFsKSA9IG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2E7IGJdIC0+XG4gICAgICBsZXQgdmEgPSBTeF9yZWYuZXZhbF9leHByIGEgKEVudiBlbnYpIGluXG4gICAgICBsZXQgdmIgPSBTeF9yZWYuZXZhbF9leHByIGIgKEVudiBlbnYpIGluXG4gICAgICAobWF0Y2ggdmEsIHZiIHdpdGhcbiAgICAgICB8IChMYW1iZGEgXyB8IE5hdGl2ZUZuIF8pLCBfIC0+ICh2YSwgdmIpXG4gICAgICAgfCBfLCAoTGFtYmRhIF8gfCBOYXRpdmVGbiBfKSAtPiAodmIsIHZhKVxuICAgICAgIHwgXyAtPiAodmEsIHZiKSlcbiAgICB8IF8gLT4gKE5pbCwgTmlsKVxuICBpblxuICBsZXQgaXRlbXMgPSBtYXRjaCBjb2xsX3ZhbCB3aXRoIExpc3QgbCB8IExpc3RSZWYgeyBjb250ZW50cyA9IGwgfSAtPiBsIHwgXyAtPiBbXSBpblxuICBTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gaXRlbSAtPlxuICAgIG1hdGNoIGZuX3ZhbCB3aXRoXG4gICAgfCBMYW1iZGEgbCAtPlxuICAgICAgbGV0IGxvY2FsID0gZW52X2V4dGVuZCBsLmxfY2xvc3VyZSBpblxuICAgICAgTGlzdC5pdGVyMiAoZnVuIHAgYSAtPiBpZ25vcmUgKGVudl9iaW5kIGxvY2FsIHAgYSkpXG4gICAgICAgIGwubF9wYXJhbXMgW2l0ZW1dO1xuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgbC5sX2JvZHkgbG9jYWxcbiAgICB8IF8gLT5cbiAgICAgIGxldCByZXN1bHQgPSBTeF9ydW50aW1lLnN4X2NhbGwgZm5fdmFsIFtpdGVtXSBpblxuICAgICAgZG9fcmVuZGVyX3RvX2h0bWwgcmVzdWx0IGVudlxuICApIGl0ZW1zKVxuXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFNldHVwIOKAlCBiaW5kIHJlbmRlciBwcmltaXRpdmVzIGluIGFuIGVudiBhbmQgd2lyZSB1cCB0aGUgcmVmICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IHNldHVwX3JlbmRlcl9lbnYgZW52ID1cbiAgcmVuZGVyX3RvX2h0bWxfcmVmIDo9IGRvX3JlbmRlcl90b19odG1sO1xuXG4gIGxldCBiaW5kIG5hbWUgZm4gPVxuICAgIGlnbm9yZSAoZW52X2JpbmQgZW52IG5hbWUgKE5hdGl2ZUZuIChuYW1lLCBmbikpKVxuICBpblxuXG4gIGJpbmQgXCJyZW5kZXItaHRtbFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzcmNdIC0+XG4gICAgICBsZXQgZXhwcnMgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHNyYyBpblxuICAgICAgbGV0IGV4cHIgPSBtYXRjaCBleHBycyB3aXRoXG4gICAgICAgIHwgW2VdIC0+IGVcbiAgICAgICAgfCBbXSAtPiBOaWxcbiAgICAgICAgfCBfIC0+IExpc3QgKFN5bWJvbCBcImRvXCIgOjogZXhwcnMpXG4gICAgICBpblxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGVudilcbiAgICB8IFtleHByXSAtPlxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGVudilcbiAgICB8IFtleHByOyBFbnYgZV0gLT5cbiAgICAgIFN0cmluZyAocmVuZGVyX3RvX2h0bWwgZXhwciBlKVxuICAgIHwgXyAtPiBTdHJpbmcgXCJcIik7XG5cbiAgYmluZCBcInJlbmRlci10by1odG1sXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNyY10gLT5cbiAgICAgIGxldCBleHBycyA9IFN4X3BhcnNlci5wYXJzZV9hbGwgc3JjIGluXG4gICAgICBsZXQgZXhwciA9IG1hdGNoIGV4cHJzIHdpdGhcbiAgICAgICAgfCBbZV0gLT4gZVxuICAgICAgICB8IFtdIC0+IE5pbFxuICAgICAgICB8IF8gLT4gTGlzdCAoU3ltYm9sIFwiZG9cIiA6OiBleHBycylcbiAgICAgIGluXG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZW52KVxuICAgIHwgW2V4cHJdIC0+XG4gICAgICBTdHJpbmcgKHJlbmRlcl90b19odG1sIGV4cHIgZW52KVxuICAgIHwgW2V4cHI7IEVudiBlXSAtPlxuICAgICAgU3RyaW5nIChyZW5kZXJfdG9faHRtbCBleHByIGUpXG4gICAgfCBfIC0+IFN0cmluZyBcIlwiKVxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJjYW1sX2xpc3Rfb2ZfanNfYXJyYXkiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3RyYW1wb2xpbmUiLCJjYW1sX3RyYW1wb2xpbmVfcmV0dXJuIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJjYW1sX2NhbGwzIiwiYTIiLCJnbG9iYWxfZGF0YSIsImNzdF9iciIsImNzdF9jb2wiLCJjc3RfZW1iZWQiLCJjc3RfZmlsdGVyIiwiY3N0X2hyIiwiY3N0X2ltZyIsImNzdF9pbnB1dCIsImNzdF9saW5rIiwiY3N0X21ldGEiLCJjc3RfcGFyYW0iLCJjc3Rfc291cmNlIiwiY3N0X3diciIsImh0bWxfdGFncyIsInZvaWRfZWxlbWVudHMiLCJib29sZWFuX2F0dHJzIiwiU3hfcmVmIiwiU3RkbGliX0Zsb2F0IiwiU3RkbGliIiwiU3RkbGliX1ByaW50ZiIsIlN0ZGxpYl9MaXN0IiwiU3hfdHlwZXMiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX1ByaW50ZXhjIiwiU3hfcnVudGltZSIsIlN4X3BhcnNlciIsIlN0ZGxpYl9IYXNodGJsIiwiU3RkbGliX0J1ZmZlciIsImlzX2h0bWxfdGFnIiwibmFtZSIsImlzX3ZvaWQiLCJpc19ib29sZWFuX2F0dHIiLCJlc2NhcGVfaHRtbCIsInMiLCJidWYiLCJjIiwicmVuZGVyX2F0dHJzIiwiYXR0cnMiLCJrIiwidiIsImNzdCIsInJlbmRlcl90b19odG1sX3JlZiIsImV4cHIiLCJlbnYiLCJyZW5kZXJfdG9faHRtbCIsInJlbmRlcl9jaGlsZHJlbiIsImNoaWxkcmVuIiwicGFyc2VfZWxlbWVudF9hcmdzIiwiYXJncyIsImxlbiIsInNraXAiLCJpZHgiLCJhcmciLCJwYWlycyIsInBhcmFtIiwicmVuZGVyX2h0bWxfZWxlbWVudCIsInRhZyIsIm1hdGNoIiwiYXR0cl9zdHIiLCJjb250ZW50IiwicmVuZGVyX2NvbXBvbmVudCIsImNvbXAiLCJrd2FyZ3MiLCJjaGlsZHJlbl9leHBycyIsImxvY2FsIiwicCIsInJlbmRlcmVkX2NoaWxkcmVuIiwiZXhwYW5kX21hY3JvIiwibSIsInBhcmFtcyIsInBzIiwiYXMiLCJycCIsInBzX3Jlc3QiLCJhc19yZXN0IiwiYSIsImRvX3JlbmRlcl90b19odG1sIiwiY291bnRlciIsIm4iLCJoZWFkIiwiY3N0X2RvIiwiY3N0X3JlbmRlcl90b19odG1sIiwicmVuZGVyX2xpc3RfdG9faHRtbCIsInN3aXRjaCQiLCJjb25kX3ZhbCIsImUiLCJsYXN0IiwicmVzdCIsImkiLCJjYWxsX2V4cHIiLCJyZW5kZXJfY2FsbCIsInJlc3VsdCIsImV4cGFuZGVkIiwiZXhuIiwicmVuZGVyX2NvbmQiLCJhc19saXN0IiwibCIsImlzX3NjaGVtZSIsIml0ZW1zIiwiY3N0X2Vsc2UiLCJjbGF1c2UiLCJib2R5IiwidGVzdCIsImlzX2Vsc2UiLCJyZW5kZXJfbGV0IiwiYmluZGluZ3NfZXhwciIsImJpbmRpbmdzIiwiYiIsInJlbmRlcl9tYXAiLCJpbmRleGVkIiwidmEiLCJ2YiIsImNvbGxfdmFsIiwiZm5fdmFsIiwiaXRlbSIsImNhbGxfYXJncyIsInJlbmRlcl9mb3JfZWFjaCIsInNldHVwX3JlbmRlcl9lbnYiLCJiaW5kIiwiZm4iLCJzcmMiLCJleHBycyJdLCJtYXBwaW5ncyI6IklBQUFBLFVBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyx5QkFBQTtBQUFBLElBQUFDLHNCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxXQUFBSixHQUFBQyxJQUFBRSxJQUFBRTtBQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLFVBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsYUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDO0FBQUFBLE1BQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUM7QUFBQUEsTUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxXQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsaUJBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLFlBQUFDLFlBQUFDO0FBQUFBLElDK0N1QixrREFBdUI7QUFBQTtBQUFBLFlBQUFDLFFBQUFEO0FBQUFBLElBQzNCLHNEQUEyQjtBQUFBO0FBQUEsWUFBQUUsZ0JBQUFGO0FBQUFBLElBQ25CLHNEQUEyQjtBQUFBO0FBQUEsWUFBQUcsWUFBQUM7QUFBQUEsUUFBQUMsTUFRMUMsNEJBQVY7QUFBQSxJQUNBO0FBQUE7QUFBQSxlQUFBQztBQUFBQSxPQUFZLGFBSUQsa0RBQ29CO0FBQUEsT0FMbkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUVELGdEQUdvQjtBQUFBO0FBQUEsWUFGcEIsZ0RBRW9CO0FBQUE7QUFBQTtBQUFBLHlCQUpwQixpREFJb0I7QUFBQSxPQUF0QiwyQ0FBc0I7QUFBQTtBQUFBO0FBQUEsSUFBRSx1Q0FDZDtBQUFBO0FBQUEsWUFBQUMsYUFBQUM7QUFBQUEsUUFBQUgsTUFRVDtBQUFBLElBQ1Y7QUFBQTtBQUFBLGVBQUFJLEdBQUFDO0FBQUFBLE9BQ0s7QUFBQSxnQkFDRTtBQUFBLFFBQVc7QUFBQSxtQkFDWjtBQUFBO0FBQUE7QUFBQSxrQkFBdUI7QUFBQSxtQkFTeEI7QUFBQTtBQUFBLGVBTmE7QUFBQSxPQUFVO0FBQUEsT0FDeEI7QUFBQSxPQUNBO0FBQUEsT0FDQTtBQUFBLGVBQ3NCLFlBQWE7QUFBQSxPQUFuQztBQUFBLE9BQXVELDRDQUV0RDtBQUFBO0FBQUE7QUFBQSxJQUFPLHVDQUNPO0FBQUE7QUFBQSxPQUFBQyxNRHRGckIsSUFBQUMscUJBQUEsYUFBQUMsTUFBQUMsS0MrRnlCLFdBQUU7QUFBQSxZQUFBQyxlQUFBRixNQUFBQztBQUFBQSxJQUVHLG1EQUE0QjtBQUFBO0FBQUEsWUFBQUUsZ0JBQUFDLFVBQUFIO0FBQUFBO0FBQUFBLEtBQUE7QUFBQSxPQUd2QztBQUFBLHdCQUFBUixHQUFvQiw2QkFBb0I7QUFBQSxJQUFXO0FBQUE7QUFBQSxZQUFBWSxtQkFBQUMsTUFBQUw7QUFBQUE7QUFBQUEsS0FBQU4sUUFLeEQ7QUFBQSxLQUFBWSxNQUdGO0FBQUEsS0FBQUgsV0FGVjtBQUFBLEtBQUFJLE9BQ0E7QUFBQSxJQUVBO0FBQUE7QUFBQSxlQUFBQyxLQUFBQztBQUFBQSxPQUNFLFlBQWM7QUFBQSxPQUNUO0FBQUE7QUFBQTtBQUFBLGVBQUFkLElBQUE7QUFBQSxXQUNZO0FBQUE7QUFBQSxpQkFDVTtBQUFBLGFBQUFDLElBQWpCO0FBQUEsWUFDUjtBQUFBLFlBQXlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQUFBYyxRQUh0QjtBQUFBLFdBTUg7QUFBQTtBQUFBLDZCQUFBQztBQUFBQSx5QkFBQWYsSUFBVSxVQUFBRCxJQUFBO0FBQUEscUJBQWUsaURBQTBCO0FBQUE7QUFBQSwwQkFFdkI7QUFBQTtBQUFBLE9BQTVCO0FBQUE7QUFBQSxNQUE0QjtBQUFBO0FBQUEsSUFFeEIsMERBQWtCO0FBQUEsR0FBQztBQUFBLFlBQUFpQixvQkFBQUMsS0FBQVIsTUFBQUw7QUFBQUE7QUFBQUEsS0FBQWMsUUFHSDtBQUFBLEtBQUFYLFdBQTJCO0FBQUEsS0FBQVQsUUFBQTtBQUFBLEtBQUFxQixXQUNwQztBQUFBLEtBQUFsQixRRDdIakI7QUFBQSxJQzhISztBQUFBO0FBQUEsVUFDVztBQUFBLFVBQU47QUFBQSxLQUFzQixzQ0FJMkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQURyRDtBQUFBLHdCQUFBTCxHQUFvQiw2QkFBb0I7QUFBQSxLQUFBd0IsVUFENUI7QUFBQSxLQUFBbkIsUURqSWxCO0FBQUEsU0NtSWtEO0FBQUEsU0FBUDtBQUFBLFNBQVY7QUFBQSxTQUFOO0FBQUEsU0FBWDtBQUFBLFNBQU47QUFBQSxJQUFpRDtBQUFBO0FBQUEsWUFBQW9CLGlCQUFBQyxNQUFBYixNQUFBTDtBQUFBQSxJQUd6RDtBQUFBO0FBQUEsTUFBQVIsSUFBQTtBQUFBLE1BQUEyQixTQUVlO0FBQUEsTUFBQWIsTUFHSDtBQUFBLE1BQUFjLGlCQUZWO0FBQUEsTUFBQWIsT0FDQTtBQUFBLEtBRUE7QUFBQTtBQUFBLGdCQUFBQyxLQUFBQztBQUFBQSxRQUNFLFlBQWM7QUFBQSxRQUNUO0FBQUEsYUFBQWQsSUFBQTtBQUFBLFNBQ1k7QUFBQTtBQUFBLGVBQ1U7QUFBQSxXQUFBQyxJQUFqQjtBQUFBLFVBQ1I7QUFBQSxVQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBRzFCO0FBQUE7QUFBQSxPQUF3QztBQUFBO0FBQUE7QUFBQSxNQUFBTyxXQUU3QjtBQUFBLE1BQUFrQixRQUNIO0FBQUEsS0FDWjtBQUFBO0FBQUEsZ0JBQUFDO0FBQUFBLFlBQUFSLFFBQ2dCO0FBQUEsUUFBeUIsY0FBQWxCLElBQUEsVUFBQUEsTUFBZ0IsWUFBQUEsTUFBWTtBQUFBLFFBQzVEO0FBQUEsUUFBb0I7QUFBQTtBQUFBO0FBQUEsS0FDakI7QUFBQTtBQUFBO0FBQUEsU0FHUjtBQUFBLDBCQUFBSixHQUFvQiw2QkFBb0I7QUFBQSxPQUFBK0Isb0JBRGxCO0FBQUEsTUFFakI7QUFBQTtBQUFBLEtBRVQsa0NBQ087QUFBQTtBQUFBLElBQUY7QUFBQSxHQUFFO0FBQUEsWUFBQUMsYUFBQUMsR0FBQXBCLE1BQUFMO0FBQUFBLFFBQUFxQixRQUdHLCtCQUFBSyxTQUNaO0FBQUE7QUFBQTtBQUFBLFNBQUFDLEtBYUEsUUFBQUMsS0FBQTtBQUFBO0FBQUEsTUFYRTtBQUFBLFdBQUFkLFFBRUU7QUFBQTtBQUFBLFdBQUFlLEtBQUE7QUFBQSxPQUNxQjtBQUFBO0FBQUE7QUFBQSxVQUFBQyxVQUh2QixPQUFBUixJQUFBO0FBQUE7QUFBQSxVQUFBUyxVQUFBLE9BQUFDLElBQUE7QUFBQSxNQU1TO0FBQUEsTUFDUDtBQUFBO0FBQUE7QUFBQSxhQUVtRDtBQUFBLEtBQWE7QUFBQSxzQkFBQVYsR0FBckMsc0NBQXNCO0FBQUE7QUFBQSxJQUU5QixnREFDYztBQUFBO0FBQUEsV0RwTHZDO0FBQUEsWUFBQVcsb0JBQUFDLFNBQUFuQyxRQUFBQztBQUFBQSxRQUFBRCxPQ3VMRTtBQUFBO0FBQUEsa0NBQ1M7QUFBQTtBQUFBO0FBQUEsTUFEVDtBQUFBO0FBQUEsMENBa0J5QjtBQUFBO0FBQUEsYUFBQW9DLElBbEJ6QjtBQUFBLFNBS0s7QUFBQSxtQkFBd0I7QUFBQSxtQkFDdEIsNkNBWWtCO0FBQUE7QUFBQTtBQUFBLFVBQUE3QyxNQWxCekI7QUFBQSxVQUFBUyxTQVdVO0FBQUEsU0FDUjtBQUFBO0FBQUE7QUFBQSxpQkFaRixtQkFBQU0sT0FBQSxNQUFBK0IsT0FBQTtBQUFBO0FBQUEsYUFBQTlDLE1BQUEsU0FTZTtBQUFBO0FBQUEsaUJBVGY7QUFBQSxtQkFBQWUsT0FBQSxNQUFBK0IsT0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQUE5QyxJQUFBLDhCQWtCeUI7QUFBQTtBQUFBLGFBQUFTLFNBRGY7QUFBQSxTQUNSO0FBQUE7QUFBQTtBQUFBLE1BTHVDO0FBQUE7QUFBQSxLQUV2QztBQUFBO0FBQUE7QUFBQSw0REFHdUI7QUFBQTtBQUFBO0FBQUEsWUFBQWtDLGtCQUFBbEMsTUFBQUM7QUFBQUEsSUFsQnpCLE9EdkxGLGdCQ3VMRSxrQ0FrQnlCO0FBQUE7QUFBQTtBQUFBLElBQUFxQyxTRHpNM0I7QUFBQSxJQUFBQyxxQkFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFBQyxzQkFBQUwsU0FBQUUsTUFBQS9CLE1BQUFMO0FBQUFBLElDNE1FO0FBQUEsU0FBQWEsTUFBQTtBQUFBLHNCQUVFLGlDQStFNEI7QUFBQSxLQWpGOUI7QUFBQTtBQUFBLFdBSzJCO0FBQUEsT0FBQWpCLE1BQWpCO0FBQUEsTUFDUjtBQUFBLDBDQUFBTixNQUFBLFFBQzJCO0FBQUEsTUFDbkIsbUNBeUVvQjtBQUFBO0FBQUEsS0F4RVoscUJBQ2hCLDBDQXVFNEI7QUFBQSxTQUFBa0QsVUF4RUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUE1QyxNQW9DdkI7QUFBQSxRQUNSO0FBQUE7QUFBQSw0RUFtQzRCO0FBQUE7QUFBQSxPQXhFRyx1QkF1Qy9CLGlDQWlDNEI7QUFBQSxPQXhFRztBQUFBO0FBQUEsMkJBZ0MvQiwrQkF3QzRCO0FBQUEsU0F4RUcsMEJBa0MvQiwrQkFzQzRCO0FBQUEsU0F4RUc7QUFBQTtBQUFBLGNBU0M7QUFBQSxVQUFBNkMsV0FBakI7QUFBQSxTQUNaLHdDQUVFO0FBQUE7QUFBQSxjQUQyRDtBQUFBO0FBQUEsWUFBN0M7QUFBQSw2QkFBQUMsR0FBb0IsZ0NBQXVCO0FBQUEsU0FBaUIsMENBNkRuRDtBQUFBO0FBQUEsUUFyRDVCO0FBQUE7QUFBQSxzRUFxRDRCO0FBQUE7QUFBQTtBQUFBLFlBckVJO0FBQUEsUUFBQUQsYUFBakI7QUFBQSxPQUNaO0FBQUEsUUFDRyx5Q0FBdUU7QUFBQSxnQkFBM0I7QUFBQSxRQUFpQjtBQUFBO0FBQUEsMEVBbUV2QztBQUFBO0FBQUEsT0FqRXRCLHlDQUF1RTtBQUFBLGVBQTNCO0FBQUEsT0FBaUI7QUFBQTtBQUFBLHlFQWlFdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQXhFRztBQUFBO0FBQUEsYUFBQTdDLE1BZ0J2QjtBQUFBLFNBQ1I7QUFBQTtBQUFBLDZFQXVENEI7QUFBQTtBQUFBLFFBeEVHO0FBQUEsU0FjL0I7QUFBQTtBQUFBLHdFQTBENEI7QUFBQSxRQXhFRztBQUFBO0FBQUEsNEdBQUFlLFFBQUE7QUFBQSxRQTZCeEI7QUFBQSxRQUNQO0FBQUE7QUFBQSxXQUFBQSxRQTlCK0I7QUFBQTtBQUFBO0FBQUEsT0FxQmxCLFlBQ0g7QUFBQSxXQUFBZ0MsT0FERztBQUFBO0FBQUEsUUFFQztBQUFBO0FBQUEsNkVBaURjO0FBQUEsV0FBQUMsT0FuRGY7QUFBQSxPQUlGO0FBQUEsT0FDUDtBQUFBO0FBQUE7QUFBQSxLQWVKO0FBQUEsVUFBQWhELElBQ1U7QUFBQTtBQUFBO0FBQUEsT0FDUjtBQUFBO0FBQUE7QUFBQSxlQUFBSixNQUFBO0FBQUEsV0FDMkM7QUFBQSxtQkFDekI7QUFBQTtBQUFBO0FBQUEsZUFBQXFELElBRmxCO0FBQUEsV0FPRztBQUFBO0FBQUEsYUFBQUMsWUFBQTtBQUFBLGFBQUFDO0FBQUFBLGVBR0U7QUFBQTtBQUFBLGFBQUFDLFdBQ2E7QUFBQTtBQUFBO0FBQUEsYUFDYjtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUFBMUQsSUFBQSxpQkFDMkI7QUFBQTtBQUFBLHFCQUNuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBQUFvRDtBQUFBQTtBQUFBQSxhQUFBQSxJRDlRbkI7QUFBQSxpQkNnUmlHO0FBQUEsaUJBQXZCO0FBQUEsaUJBQS9EO0FBQUE7QUFBQSxvQkFBaUg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFqQixJQWhCdEg7QUFBQSxZQUFBd0IsV0FtQmtCO0FBQUEsZ0JBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUFBRCxXQUVhO0FBQUEsWUFDYjtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBQUFFO0FBQUFBLFVBQUFBLE1EdlJUO0FBQUE7QUFBQSxVQUFBRixXQ3lSbUI7QUFBQSxNQUNiO0FBQUE7QUFBQTtBQUFBLHlEQUcwQjtBQUFBO0FBQUE7QUFBQSxRQUFBQSxTQURmO0FBQUEsSUFDYjtBQUFBO0FBQUEsMkVBQTRCO0FBQUE7QUFBQSxZQUFBVCxvQkFBQUgsTUFBQS9CLE1BQUFMO0FBQUFBLElBakY5QixPRDVNRixnQkM0TUUsMENBaUY4QjtBQUFBO0FBQUEsWUFBQW1ELGNBQUFqQixTQUFBN0IsTUFBQUw7QUFBQUEsYUFBQW9ELFFBQUF6QztBQUFBQTtBQUFBQSxLQUFBO0FBQUEsTUFHaEI7QUFBQTtBQUFBLGFBQUEwQyxJQUFBO0FBQUE7QUFBQSxhQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBLE1BQThDO0FBQUE7QUFBQSxLQUFjO0FBQUEsSUFBSTtBQUFBO0FBQUEsS0FBQUM7QUFBQUEsT0FDOUQ7QUFBQTtBQUFBLGtCQUFBdEI7QUFBQUEsY0FBQWxCLFFBQTZCO0FBQUEsVUFBUztBQUFBLGVBQUF5QyxRQUFBO0FBQUEsV0FDbEMsMkNBQXlCO0FBQUE7QUFBQSxVQUNwQztBQUFBLFNBQUs7QUFBQTtBQUFBLEtBQUFDLGFEblNoQjtBQUFBLEtBQUFBLFdBQUE7QUFBQSxJQ3FTRTtBQUFBLFNBQUE3QyxRQUFBO0FBQUE7QUFBQSxNQUNlLFlBQ0g7QUFBQSxVQUFBaUMsT0FERyxVQUFBYSxTQUFBLFVBQUEzQyxRQUdGO0FBQUEsTUFBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBQTRDLE9BQUEsTUFBQUMsT0FBQTtBQUFBO0FBQUE7QUFBQSxVQUVsQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBQUFDLFVBRXNDO0FBQUE7QUFBQTtBQUFBLGNBRnRDLDZCQUFBQSxVQUNzQjtBQUFBO0FBQUEsY0FBQUEsVUFFYjtBQUFBO0FBQUEsU0FFVDtBQUFBLFVBQWdCO0FBQUE7QUFBQTtBQUFBLHlEQXVCdEI7QUFBQSxhQUFBaEUsSUFyQmdCO0FBQUEsU0FDTDtBQUFBLFVBQWlCO0FBQUE7QUFBQTtBQUFBLHlEQW9CNUI7QUFBQSxTQXBCc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BRVg7QUFBQTtBQUFBO0FBQUEsUUFBQWUsVUFoQmQ7QUFBQTtBQUFBLEtBbUJlLGNBQ0g7QUFBQSxTQUFBRyxVQURHLFlBQUE2QyxTQUFBO0FBQUEsbUJBRUY7QUFBQSxTQUFBZixTQUZFLFlBQUFjLFNBQUE7QUFBQTtBQUFBO0FBQUEsTUFJVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FBQUUsWUFFc0M7QUFBQTtBQUFBO0FBQUEsVUFGdEMsK0JBQUFBLFlBQ3NCO0FBQUE7QUFBQSxVQUFBQSxZQUViO0FBQUE7QUFBQSxLQUVUO0FBQUEsTUFBZ0I7QUFBQTtBQUFBLDZFQU1uQjtBQUFBLFNBQUFoRSxNQUphO0FBQUEsS0FDTDtBQUFBLE1BQWlCO0FBQUE7QUFBQSw2RUFHekI7QUFBQSxLQUhtQjtBQUFBO0FBQUEsR0FHbkI7QUFBQSxZQUFBdUQsWUFBQTlDLE1BQUFMO0FBQUFBLElBdkNILE9EaFNGLGdCQ2dTRSw0QkF1Q0c7QUFBQTtBQUFBLFlBQUE2RCxhQUFBM0IsU0FBQTdCLE1BQUFMO0FBQUFBLGFBQUFvRCxRQUFBekM7QUFBQUE7QUFBQUEsS0FBQTtBQUFBLE1BR1c7QUFBQTtBQUFBLGFBQUEwQyxJQUFBO0FBQUE7QUFBQSxhQUFBQSxJQUFBO0FBQUE7QUFBQTtBQUFBLE1BQThDO0FBQUE7QUFBQSxLQUFjO0FBQUEsSUFBSTtBQUFBO0FBQUEsS0FBQVMsZ0JBQzFEO0FBQUEsS0FBQUosT0FDVDtBQUFBLEtBQUFyQyxRQUNDO0FBQUEsS0FBQVAsUUFDUztBQUFBLElBQXFCLGNBQUF1QyxJQUFBLFVBQUFVLFdBQWdCLFlBQUFBLFdBQVk7QUFBQTtBQUFBO0FBQUEsS0FDdEU7QUFBQTtBQUFBO0FBQUEsd0NBQUFULFlBQ3dDO0FBQUE7QUFBQSxTQUFBQSxZQUMvQjtBQUFBO0FBQUEsSUFFVDtBQUFBLEtBQ0U7QUFBQTtBQUFBLGdCQUFBVTtBQUFBQSxZQUFBbEQsUUFDUTtBQUFBLFFBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQUFmLE9BQUE7QUFBQSxhQUFBYixPQUFBO0FBQUEsYUFBQVUsSUFFTDtBQUFBLFlBQ0Q7QUFBQSxZQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFDekI7QUFBQSxPQUFFO0FBQUE7QUFBQSxTQUFBZSxRQUNEO0FBQUE7QUFBQTtBQUFBLFNBQUFBLFVBUFo7QUFBQTtBQUFBLE1BU2Usa0JBQUFBLFFBQUE7QUFBQTtBQUFBLG9DQUFBQSxRQUFBO0FBQUEsa0NBQUFBLFFBQUE7QUFBQSxVQUFBRyxVQUFBO0FBQUEsd0JBQUFILFFBQUE7QUFBQTtBQUFBLE9BQUFpQyxTQUFBO0FBQUEsT0FBQTdDLE9BQUE7QUFBQSxPQUFBYixPQUFBO0FBQUEsT0FBQVUsSUFHRDtBQUFBLE1BQ0Q7QUFBQSxNQUNQO0FBQUE7QUFBQTtBQUFBLElBZE47QUFBQSxLQWtCc0IsWUFDWjtBQUFBLFNBQUErQyxPQURZO0FBQUE7QUFBQSxNQUVSO0FBQUE7QUFBQSw2RUFJSztBQUFBLFNBQUFDLE9BTkc7QUFBQSxLQUlYO0FBQUEsS0FDUDtBQUFBO0FBQUEsR0FDZTtBQUFBLFlBQUFpQixXQUFBeEQsTUFBQUw7QUFBQUEsSUFqQ25CLE9EMVVGLGdCQzBVRSwyQkFpQ21CO0FBQUE7QUFBQSxZQUFBaUUsV0FBQTVELE1BQUFMLEtBQUFrRTtBQUFBQTtBQUFBQTtBQUFBQSxLQUduQjtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBQUFGLElBQUE7QUFBQSxRQUFBaEMsSUFBQTtBQUFBLFFBQUFtQyxLQUVhO0FBQUEsUUFBQUMsS0FDQTtBQUFBLE9BQ1Q7QUFBQSwwQ0FBQUMsV0FBQSxJQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBQUFELFdBQUEsSUFBQUMsU0FBQTtBQUFBLHVCQUFBRCxXQUFBLElBQUFDLFNBQUE7QUFBQTtBQUFBLFdBQUFELFdBQUEsSUFBQUMsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUFELFdBTUosR0FBQUMsU0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQUFmLFFBQUE7QUFBQTtBQUFBLGFBQUFBLFFBQUE7QUFBQTtBQUFBLFNBQUFBLFFBQThFO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FDN0Q7QUFBQTtBQUFBLGtCQUFBVixHQUFBMEI7QUFBQUEsY0FBQUMsWUFDZjtBQUFBLFVBQ0E7QUFBQSxlQUFBbkIsSUFBQSxXQUFBaEMsUUFFYztBQUFBLFdBQ1o7QUFBQTtBQUFBLHNCQUFBQyxHQUFBVSxHQUE4QixzQ0FBb0I7QUFBQTtBQUFBO0FBQUEsV0FDNUIscUNBSU07QUFBQTtBQUFBLGNBQUFnQixTQURmO0FBQUEsVUFDYixxQ0FBNEI7QUFBQTtBQUFBO0FBQUEsSUFDeEI7QUFBQTtBQUFBLFlBQUF5QixnQkFBQXBFLE1BQUFMO0FBQUFBO0FBQUFBO0FBQUFBLEtBR1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUFBZ0UsSUFBQTtBQUFBLFFBQUFoQyxJQUFBO0FBQUEsUUFBQW1DLEtBRWE7QUFBQSxRQUFBQyxLQUNBO0FBQUEsT0FDVDtBQUFBLDBDQUFBQyxXQUFBLElBQUFDLFNBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBQUQsV0FBQSxJQUFBQyxTQUFBO0FBQUEsdUJBQUFELFdBQUEsSUFBQUMsU0FBQTtBQUFBO0FBQUEsV0FBQUQsV0FBQSxJQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBQUQsV0FNSixHQUFBQyxTQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBQWYsUUFBQTtBQUFBO0FBQUEsYUFBQUEsUUFBQTtBQUFBO0FBQUEsU0FBQUEsUUFBOEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUM3RDtBQUFBO0FBQUEsa0JBQUFnQjtBQUFBQSxVQUNmO0FBQUEsZUFBQWxCLElBQUEsV0FBQWhDLFFBRWM7QUFBQSxXQUNaO0FBQUE7QUFBQSxzQkFBQUMsR0FBQVUsR0FBOEIsc0NBQW9CO0FBQUE7QUFBQTtBQUFBLFdBQy9CLHFDQUlTO0FBQUE7QUFBQSxjQUFBZ0IsU0FEZjtBQUFBLFVBQ2IscUNBQTRCO0FBQUE7QUFBQTtBQUFBLElBQ3hCO0FBQUE7QUFBQSxXRDVaVjtBQUFBLFlBQUEwQixpQkFBQTFFO0FBQUFBLElDb2FFO0FBQUEsYUFBQTJFLEtBQUF6RixNQUFBMEY7QUFBQUEsS0FHUztBQUFBLEtBQXlDO0FBQUE7QUFBQSxJQUdsRDtBQUFBO0FBQUEsZUFBQXZFO0FBQUFBLE9BQ0U7QUFBQSxZQUFBTixPQUFBO0FBQUE7QUFBQSxhQUFBOEUsTUFBQSxTQUFBQyxRQUVjO0FBQUEsU0FDWjtBQUFBO0FBQUEsZUFBQS9FLFNBR1M7QUFBQTtBQUFBLGVBQUEyQyxNQUhULFVBQUEzQyxTQUNXO0FBQUE7QUFBQSxjQUFBQSxTQUNEO0FBQUEsU0FHSCx1Q0FBeUI7QUFBQTtBQUFBLFlBQUFlLFFBUmxDO0FBQUEsb0JBVVMscUNBQXlCO0FBQUEsZ0JBVmxDO0FBQUE7QUFBQSxhQUFBNEIsTUFBQTtBQUFBLFNBWVMscUNBQXVCO0FBQUE7QUFBQTtBQUFBLE9BQ3pCO0FBQUEsTUFBUztBQUFBLElBQUM7QUFBQTtBQUFBLHNCQUFBckM7QUFBQUEsY0FHakI7QUFBQSxtQkFBQU4sT0FBQTtBQUFBO0FBQUEsb0JBQUE4RSxNQUFBLFNBQUFDLFFBRWM7QUFBQSxnQkFDWjtBQUFBO0FBQUEsc0JBQUEvRSxTQUdTO0FBQUE7QUFBQSxzQkFBQTJDLE1BSFQsVUFBQTNDLFNBQ1c7QUFBQTtBQUFBLHFCQUFBQSxTQUNEO0FBQUEsZ0JBR0gsdUNBQXlCO0FBQUE7QUFBQSxtQkFBQWUsUUFSbEM7QUFBQSwyQkFVUyxxQ0FBeUI7QUFBQSx1QkFWbEM7QUFBQSwwRUFBQTRCLElBQUEsTUFZUyxtQ0FBdUI7QUFBQTtBQUFBLGNBQ3pCO0FBQUEsYUFBUyxFQUFDO0FBQUE7QUFBQSxHRHhjckIiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNTY2MSwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJqc29vX3J1bnRpbWUuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSJdLCJuYW1lcyI6WyJydW50aW1lIl0sIm1hcHBpbmdzIjoiT0FBQUEsVUFBQSIsImlnbm9yZUxpc3QiOlswXX19LHsib2Zmc2V0Ijp7ImxpbmUiOjM1Njc0LCJjb2x1bW4iOjB9LCJtYXAiOnsidmVyc2lvbiI6MywiZmlsZSI6Impzb29fcnVudGltZS5jbWEuanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lLm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxubW9kdWxlIEpzID0gc3RydWN0XG4gIHR5cGUgdFxuXG4gIHR5cGUgJ2EganNfYXJyYXkgPSB0XG5cbiAgdHlwZSAoJ2EsICdiKSBtZXRoX2NhbGxiYWNrID0gdFxuXG4gIGV4dGVybmFsIHN0cmluZyA6IHN0cmluZyAtPiB0ID0gXCJjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgdG9fc3RyaW5nIDogdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXCJcblxuICBleHRlcm5hbCBieXRlc3RyaW5nIDogc3RyaW5nIC0+IHQgPSBcImNhbWxfanNieXRlc19vZl9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIHRvX2J5dGVzdHJpbmcgOiB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNieXRlc1wiXG5cbiAgZXh0ZXJuYWwgYm9vbCA6IGJvb2wgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2Jvb2xcIlxuXG4gIGV4dGVybmFsIHRvX2Jvb2wgOiB0IC0+IGJvb2wgPSBcImNhbWxfanNfdG9fYm9vbFwiXG5cbiAgZXh0ZXJuYWwgYXJyYXkgOiAnYSBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fYXJyYXlcIlxuXG4gIGV4dGVybmFsIHRvX2FycmF5IDogdCAtPiAnYSBhcnJheSA9IFwiY2FtbF9qc190b19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgbnVtYmVyX29mX2Zsb2F0IDogZmxvYXQgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2Zsb2F0XCJcblxuICBleHRlcm5hbCBmbG9hdF9vZl9udW1iZXIgOiB0IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuICBleHRlcm5hbCBudW1iZXJfb2ZfaW50MzIgOiBpbnQzMiAtPiB0ID0gXCJjYW1sX2pzX2Zyb21faW50MzJcIlxuXG4gIGV4dGVybmFsIGludDMyX29mX251bWJlciA6IHQgLT4gaW50MzIgPSBcImNhbWxfanNfdG9faW50MzJcIlxuXG4gIGV4dGVybmFsIG51bWJlcl9vZl9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgLT4gdCA9IFwiY2FtbF9qc19mcm9tX25hdGl2ZWludFwiXG5cbiAgZXh0ZXJuYWwgbmF0aXZlaW50X29mX251bWJlciA6IHQgLT4gbmF0aXZlaW50ID0gXCJjYW1sX2pzX3RvX25hdGl2ZWludFwiXG5cbiAgZXh0ZXJuYWwgdHlwZW9mIDogdCAtPiB0ID0gXCJjYW1sX2pzX3R5cGVvZlwiXG5cbiAgZXh0ZXJuYWwgaW5zdGFuY2VvZiA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX2luc3RhbmNlb2ZcIlxuXG4gIGV4dGVybmFsIGRlYnVnZ2VyIDogdW5pdCAtPiB1bml0ID0gXCJkZWJ1Z2dlclwiXG5cbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiB0IC0+IHQgPSBcImNhbWxfanNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXQgOiB0IC0+IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2pzX3NldFwiXG5cbiAgZXh0ZXJuYWwgZGVsZXRlIDogdCAtPiB0IC0+IHVuaXQgPSBcImNhbWxfanNfZGVsZXRlXCJcblxuICBleHRlcm5hbCBjYWxsIDogdCAtPiB0IC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19jYWxsXCJcblxuICBleHRlcm5hbCBmdW5fY2FsbCA6IHQgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2Z1bl9jYWxsXCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGwgOiB0IC0+IHN0cmluZyAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfbWV0aF9jYWxsXCJcblxuICBleHRlcm5hbCBuZXdfb2JqIDogdCAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfbmV3XCJcblxuICBleHRlcm5hbCBuZXdfb2JqX2FyciA6IHQgLT4gdCBqc19hcnJheSAtPiB0ID0gXCJjYW1sX29qc19uZXdfYXJyXCJcblxuICBleHRlcm5hbCBvYmogOiAoc3RyaW5nICogdCkgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19vYmplY3RcIlxuXG4gIGV4dGVybmFsIGVxdWFscyA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgZXh0ZXJuYWwgc3RyaWN0X2VxdWFscyA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuXG4gIGV4dGVybmFsIHB1cmVfZXhwciA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9qc19wdXJlX2V4cHJcIlxuXG4gIGV4dGVybmFsIGV2YWxfc3RyaW5nIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V2YWxfc3RyaW5nXCJcblxuICBleHRlcm5hbCBqc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V4cHJcIlxuXG4gIGV4dGVybmFsIHB1cmVfanNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9wdXJlX2pzX2V4cHJcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrIDogKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmVcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAodCBqc19hcnJheSAtPiAnYikgLT4gKCdjLCB0IGpzX2FycmF5IC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3RcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbGJhY2sgOiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlXCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgKCdiIC0+IHQganNfYXJyYXkgLT4gJ2EpIC0+ICgnYiwgdCBqc19hcnJheSAtPiAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gIGV4dGVybmFsIHdyYXBfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrXCJcblxuICBleHRlcm5hbCB3cmFwX21ldGhfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYSwgJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHJ1bnRpbWVfdmFsdWUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNvb19ydW50aW1lX3ZhbHVlXCJcbiAgKCoqIFtydW50aW1lX3ZhbHVlIFwiRk9PXCJdIHJldHVybnMgdGhlIEphdmFTY3JpcHQgdmFsdWUgRk9PIHByb3ZpZGVkIGJ5IHRoZSBKYXZhU2NyaXB0IHJ1bnRpbWUgKHdpdGggJy8vUHJvdmlkZXM6IEZPTycpLiBUaGUgc3RyaW5nIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbC4gKilcblxuICBleHRlcm5hbCBjdXN0b21faWRlbnRpZmllciA6IE9iai50IC0+IHN0cmluZyA9IFwiY2FtbF9jdXN0b21faWRlbnRpZmllclwiXG5lbmRcblxubW9kdWxlIFN5cyA9IHN0cnVjdFxuICB0eXBlICdhIGNhbGxiYWNrID0gJ2FcblxuICBleHRlcm5hbCBjcmVhdGVfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IGNvbnRlbnQ6c3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfY3JlYXRlX2ZpbGVcIlxuXG4gIGV4dGVybmFsIHJlYWRfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IHN0cmluZyA9IFwiY2FtbF9yZWFkX2ZpbGVfY29udGVudFwiXG5cbiAgZXh0ZXJuYWwgc2V0X2NoYW5uZWxfb3V0cHV0JyA6IG91dF9jaGFubmVsIC0+IChqc19zdHJpbmc6SnMudCAtPiB1bml0KSBjYWxsYmFjayAtPiB1bml0XG4gICAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XCJcblxuICBleHRlcm5hbCBzZXRfY2hhbm5lbF9pbnB1dCcgOiBpbl9jaGFubmVsIC0+ICh1bml0IC0+IHN0cmluZykgY2FsbGJhY2sgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbFwiXG5cbiAgZXh0ZXJuYWwgbW91bnRfcG9pbnQgOiB1bml0IC0+IHN0cmluZyBsaXN0ID0gXCJjYW1sX2xpc3RfbW91bnRfcG9pbnRcIlxuXG4gIGV4dGVybmFsIG1vdW50X2F1dG9sb2FkIDogc3RyaW5nIC0+IChzdHJpbmcgLT4gc3RyaW5nIC0+IHN0cmluZyBvcHRpb24pIGNhbGxiYWNrIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tb3VudF9hdXRvbG9hZFwiXG5cbiAgZXh0ZXJuYWwgdW5tb3VudCA6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3VubW91bnRcIlxuXG4gIHR5cGUgcmVkaXJlY3Rpb25cblxuICBleHRlcm5hbCByZWRpcmVjdF9jaGFubmVsIDogb3V0X2NoYW5uZWwgLT4gaW50bzpvdXRfY2hhbm5lbCAtPiByZWRpcmVjdGlvblxuICAgID0gXCJjYW1sX21sX2NoYW5uZWxfcmVkaXJlY3RcIlxuXG4gIGV4dGVybmFsIHJlc3RvcmVfY2hhbm5lbCA6IG91dF9jaGFubmVsIC0+IHJlZGlyZWN0aW9uIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3Jlc3RvcmVcIlxuXG4gIG1vZHVsZSBDb25maWcgPSBzdHJ1Y3RcbiAgICBleHRlcm5hbCB1c2VfanNfc3RyaW5nIDogdW5pdCAtPiBib29sID0gXCJjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZ1wiXG5cbiAgICB0eXBlIGVmZmVjdHNfYmFja2VuZCA9XG4gICAgICBbIGBEaXNhYmxlZFxuICAgICAgfCBgQ3BzXG4gICAgICB8IGBEb3VibGVfdHJhbnNsYXRpb25cbiAgICAgIF1cblxuICAgIGV4dGVybmFsIGVmZmVjdHNfIDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfanNvb19mbGFnc19lZmZlY3RzXCJcblxuICAgIGxldCBlZmZlY3RzICgpID1cbiAgICAgIG1hdGNoIGVmZmVjdHNfICgpIHdpdGhcbiAgICAgIHwgXCJkaXNhYmxlZFwiIC0+IGBEaXNhYmxlZFxuICAgICAgfCBcImNwc1wiIC0+IGBDcHNcbiAgICAgIHwgXCJkb3VibGUtdHJhbnNsYXRpb25cIiAtPiBgRG91YmxlX3RyYW5zbGF0aW9uXG4gICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG4gIGVuZFxuXG4gIGxldCB2ZXJzaW9uID0gUnVudGltZV92ZXJzaW9uLnNcblxuICBsZXQgZ2l0X3ZlcnNpb24gPSBSdW50aW1lX3ZlcnNpb24uZ2l0X3ZlcnNpb25cbmVuZFxuXG5tb2R1bGUgRXJyb3IgOiBzaWdcbiAgdHlwZSB0XG5cbiAgdmFsIHJhaXNlXyA6IHQgLT4gJ2FcblxuICB2YWwgYXR0YWNoX2pzX2JhY2t0cmFjZSA6IGV4biAtPiBmb3JjZTpib29sIC0+IGV4blxuICAoKiogQXR0YWNoIGEgSmF2YVNjcmlwdCBlcnJvciB0byBhbiBPQ2FtbCBleGNlcHRpb24uICBpZiBbZm9yY2UgPSBmYWxzZV0gYW5kIGFcbiAgICBKYXZhU2NyaXB0IGVycm9yIGlzIGFscmVhZHkgYXR0YWNoZWQsIGl0IHdpbGwgZG8gbm90aGluZy4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG9cbiAgICBzdG9yZSBhbmQgcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgSmF2YVNjcmlwdCBzdGFjayB0cmFjZXMuXG5cbiAgICBBdHRhY2hpbmcgSmF2YVNjcmlwdCBlcnJvcnMgd2lsbCBoYXBwZW4gYXV0b21hdGljYWxseSB3aGVuIGNvbXBpbGluZyB3aXRoXG4gICAgWy0tZW5hYmxlIHdpdGgtanMtZXJyb3JdLiAqKVxuXG4gIHZhbCBvZl9leG4gOiBleG4gLT4gdCBvcHRpb25cbiAgKCoqIEV4dHJhY3QgYSBKYXZhU2NyaXB0IGVycm9yIGF0dGFjaGVkIHRvIGFuIE9DYW1sIGV4Y2VwdGlvbiwgaWYgYW55LiAgVGhpcyBpcyB1c2VmdWwgdG9cbiAgICAgIGluc3BlY3QgYW4gZXZlbnR1YWwgc3RhY2sgdHJhY2UsIGVzcGVjaWFsbHkgd2hlbiBzb3VyY2VtYXAgaXMgZW5hYmxlZC4gKilcblxuICBleGNlcHRpb24gRXhuIG9mIHRcbiAgKCoqIFRoZSBbRXJyb3JdIGV4Y2VwdGlvbiB3cmFwIGphdmFzY3JpcHQgZXhjZXB0aW9ucyB3aGVuIGNhdWdodCBieSBPQ2FtbCBjb2RlLlxuICAgICAgSW4gY2FzZSB0aGUgamF2YXNjcmlwdCBleGNlcHRpb24gaXMgbm90IGFuIGluc3RhbmNlIG9mIGphdmFzY3JpcHQgW0Vycm9yXSxcbiAgICAgIGl0IHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgd3JhcHBlZCBpbnRvIGEgW0ZhaWx1cmVdIGV4Y2VwdGlvbi5cbiAgKilcbmVuZCA9IHN0cnVjdFxuICB0eXBlIHRcblxuICBleGNlcHRpb24gRXhuIG9mIHRcblxuICBsZXQgXyA9IENhbGxiYWNrLnJlZ2lzdGVyX2V4Y2VwdGlvbiBcImpzRXJyb3JcIiAoRXhuIChPYmoubWFnaWMgW3x8XSkpXG5cbiAgZXh0ZXJuYWwgcmFpc2VfIDogdCAtPiAnYSA9IFwiY2FtbF90aHJvd19qc19leGNlcHRpb25cIlxuXG4gIGV4dGVybmFsIG9mX2V4biA6IGV4biAtPiB0IG9wdGlvbiA9IFwiY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXCJcblxuICBleHRlcm5hbCBhdHRhY2hfanNfYmFja3RyYWNlIDogZXhuIC0+IGZvcmNlOmJvb2wgLT4gZXhuID0gXCJjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVwiXG5lbmRcblxuW0BAQG9jYW1sLndhcm5pbmcgXCItMzItNjBcIl1cblxubW9kdWxlIEZvcl9jb21wYXRpYmlsaXR5X29ubHkgPSBzdHJ1Y3RcbiAgKCogQWRkIHByaW1pdGl2ZXMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gRXhpc3RpbmcgdXNlcnMgbWlnaHRcbiAgICAgZGVwZW5kIG9uIGl0IChlLmcuIGdlbl9qc19hcGkpLCB3ZSBkb24ndCB3YW50IHRoZSBvY2FtbCBjb21waWxlclxuICAgICB0byBjb21wbGFpbiBhYm91dCB0aGVzZSBtaXNzaW5nIHByaW1pdGl2ZXMuICopXG5cbiAgZXh0ZXJuYWwgY2FtbF9qc19mcm9tX3N0cmluZyA6IHN0cmluZyAtPiBKcy50ID0gXCJjYW1sX2pzX2Zyb21fc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nIDogSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfanNfdG9fYnl0ZV9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfanNfdG9fc3RyaW5nIDogSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfanNfdG9fc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2xpc3Rfb2ZfanNfYXJyYXkgOiAnYSBKcy5qc19hcnJheSAtPiAnYSBsaXN0ID0gXCJjYW1sX2xpc3Rfb2ZfanNfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGNhbWxfbGlzdF90b19qc19hcnJheSA6ICdhIGxpc3QgLT4gJ2EgSnMuanNfYXJyYXkgPSBcImNhbWxfbGlzdF90b19qc19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdmFyaWFibGUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfdmFyXCJcblxuICBleHRlcm5hbCBjYW1sX3N0cmluZ19vZl9hcnJheSA6ICdhIGFycmF5IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfYXJyYXlcIlxuZW5kXG5cbm1vZHVsZSBUeXBlZF9hcnJheSA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHR5cGVkQXJyYXkgPSBKcy50XG5cbiAgdHlwZSBhcnJheUJ1ZmZlciA9IEpzLnRcblxuICB0eXBlIHVpbnQ4QXJyYXkgPSBKcy50XG5cbiAgZXh0ZXJuYWwga2luZCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgLT4gKCdhLCAnYikgQmlnYXJyYXkua2luZFxuICAgID0gXCJjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGZyb21fZ2VuYXJyYXkgOlxuICAgICgnYSwgJ2IsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5HZW5hcnJheS50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXlcbiAgICA9IFwiY2FtbF9iYV90b190eXBlZF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdG9fZ2VuYXJyYXkgOlxuICAgICgnYSwgJ2IpIHR5cGVkQXJyYXkgLT4gKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnRcbiAgICA9IFwiY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5XCJcblxuICBtb2R1bGUgQmlnc3RyaW5nID0gc3RydWN0XG4gICAgdHlwZSB0ID0gKGNoYXIsIEJpZ2FycmF5LmludDhfdW5zaWduZWRfZWx0LCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuQXJyYXkxLnRcblxuICAgIGV4dGVybmFsIHRvX2FycmF5QnVmZmVyIDogdCAtPiBhcnJheUJ1ZmZlciA9IFwiYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlclwiXG5cbiAgICBleHRlcm5hbCB0b191aW50OEFycmF5IDogdCAtPiB1aW50OEFycmF5ID0gXCJiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXlcIlxuXG4gICAgZXh0ZXJuYWwgb2ZfYXJyYXlCdWZmZXIgOiBhcnJheUJ1ZmZlciAtPiB0ID0gXCJiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyXCJcblxuICAgIGV4dGVybmFsIG9mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IC0+IHQgPSBcImJpZ3N0cmluZ19vZl90eXBlZF9hcnJheVwiXG4gIGVuZFxuXG4gIGV4dGVybmFsIHN0cmluZ19vZl91aW50OEFycmF5IDogdWludDhBcnJheSAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX3VpbnQ4X2FycmF5XCJcblxuICBleHRlcm5hbCBieXRlc19vZl91aW50OEFycmF5IDogdWludDhBcnJheSAtPiBieXRlcyA9IFwiY2FtbF9ieXRlc19vZl91aW50OF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdWludDhBcnJheV9vZl9ieXRlcyA6IGJ5dGVzIC0+IHVpbnQ4QXJyYXkgPSBcImNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcIlxuZW5kXG5cbm1vZHVsZSBJbnQ2NCA9IHN0cnVjdFxuICBleHRlcm5hbCBjcmVhdGVfaW50NjRfbG9fbWlfaGkgOiBpbnQgLT4gaW50IC0+IGludCAtPiBJbnQ2NC50XG4gICAgPSBcImNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpXCJcbmVuZFxuXG5tb2R1bGUgRWZmZWN0IDogc2lnXG4gIGV4dGVybmFsIGFzc3VtZV9ub19wZXJmb3JtIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2Fzc3VtZV9ub19wZXJmb3JtXCJcbiAgKCoqIFBhc3NpbmcgYSBmdW5jdGlvbiBbZl0gYXMgYXJndW1lbnQgb2YgYGFzc3VtZV9ub19wZXJmb3JtYCBndWFyYW50ZWVzIHRoYXQsXG4gICAgICB3aGVuIGNvbXBpbGluZyB3aXRoIGAtLWVmZmVjdHM9ZG91YmxlLXRyYW5zbGF0aW9uYCwgdGhlIGRpcmVjdC1zdHlsZVxuICAgICAgdmVyc2lvbiBvZiBbZl0gaXMgY2FsbGVkLCB3aGljaCBpcyBmYXN0ZXIgdGhhbiB0aGUgQ1BTIHZlcnNpb24uIEFzIGFcbiAgICAgIGNvbnNlcXVlbmNlLCBwZXJmb3JtaW5nIGFuIGVmZmVjdCBpbiBhIHRyYW5zaXRpdmUgY2FsbGVlIG9mIFtmXSB3aWxsXG4gICAgICByYWlzZSBgRWZmZWN0LlVuaGFuZGxlZGAsIHJlZ2FyZGxlc3Mgb2YgYW55IGVmZmVjdCBoYW5kbGVycyBpbnN0YWxsZWRcbiAgICAgIGJlZm9yZSB0aGUgY2FsbCB0byBgYXNzdW1lX25vX3BlcmZvcm1gLCB1bmxlc3MgYSBuZXcgZWZmZWN0IGhhbmRsZXIgd2FzXG4gICAgICBpbnN0YWxsZWQgaW4gdGhlIG1lYW50aW1lLlxuXG4gICAgICBUaGlzIGJlaGF2aW91ciBpcyB0aGUgc2FtZSB3aGVuIGRvdWJsZSB0cmFuc2xhdGlvbiBpcyBkaXNhYmxlZC4gKilcbmVuZCA9IHN0cnVjdFxuICBleHRlcm5hbCBhc3N1bWVfbm9fcGVyZm9ybSA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9hc3N1bWVfbm9fcGVyZm9ybVwiXG5lbmRcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiZ2xvYmFsX2RhdGEiLCJBc3NlcnRfZmFpbHVyZSIsIkpzb29fcnVudGltZV9SdW50aW1lX3ZlcnNpb24iLCJTdGRsaWJfQ2FsbGJhY2siLCJlZmZlY3RzIiwicGFyYW0iLCJtYXRjaCIsInZlcnNpb24iLCJnaXRfdmVyc2lvbiIsIkV4biIsIkVycm9yIl0sIm1hcHBpbmdzIjoiSUFBQUEsVUFBQTtBQUFBLElBQUFDLDhCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsK0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBO0FBQUEsWUFBQUMsUUFBQUM7QUFBQUEsUUFBQUMsUUNpS1k7QUFBQSxJQUFXLG9CQUVOO0FBQUEsSUFGTSx5QkFDRDtBQUFBLElBREM7QUFBQSxLQUlWO0FBQUEsSUFEbUI7QUFBQSxHQUNQO0FBQUE7QUFBQSxJQUFBQyxVRHJLekI7QUFBQSxJQUFBQyxjQUFBO0FBQUEsSUFBQUMsTUFBQTtBQUFBLEdDd01VO0FBQUE7QUFBQSxJQUFBQztBQUFBQSxNQUE0RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUR4TXRFIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzU3MjIsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNfb2Zfb2NhbWwuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9qc19vZl9vY2FtbC9pbXBvcnQubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiBKc19vZl9vY2FtbFxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCA8ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuXG4gIGV4dGVybmFsICggPD0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcblxuICBleHRlcm5hbCAoID49ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcblxuICBleHRlcm5hbCBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbiAgZXh0ZXJuYWwgZXF1YWwgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZW5kXG5cbm1vZHVsZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGV4dGVybmFsICggPCApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuXG4gIGV4dGVybmFsICggPD0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA8PiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuXG4gIGV4dGVybmFsICggPj0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbiAgZXh0ZXJuYWwgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgbGV0IG1heCAoeCA6IGludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbiAgbGV0IG1pbiAoeCA6IGludCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIFN0cmluZyA9IHN0cnVjdFxuICBpbmNsdWRlIFN0cmluZ1xuXG4gIGxldCBlcXVhbCAoeCA6IHN0cmluZykgKHkgOiBzdHJpbmcpID0gUG9seS5lcXVhbCB4IHlcbmVuZFxuXG5tb2R1bGUgQ2hhciA9IHN0cnVjdFxuICBpbmNsdWRlIENoYXJcblxuICBsZXQgZXF1YWwgKHggOiBjaGFyKSAoeSA6IGNoYXIpID0gUG9seS5lcXVhbCB4IHlcbmVuZFxuXG5pbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiZ2xvYmFsX2RhdGEiLCJTdGRsaWJfU3RyaW5nIiwiU3RkbGliX0NoYXIiLCJtYXgiLCJ4IiwieSIsIm1pbiIsIm1ha2UiLCJpbml0IiwiZW1wdHkiLCJvZl9ieXRlcyIsInRvX2J5dGVzIiwiYmxpdCIsImNvbmNhdCIsImNhdCIsImNvbXBhcmUiLCJzdGFydHNfd2l0aCIsImVuZHNfd2l0aCIsImNvbnRhaW5zX2Zyb20iLCJyY29udGFpbnNfZnJvbSIsImNvbnRhaW5zIiwic3ViIiwic3BsaXRfb25fY2hhciIsIm1hcCIsIm1hcGkiLCJmb2xkX2xlZnQiLCJmb2xkX3JpZ2h0IiwiZm9yX2FsbCIsImV4aXN0cyIsInRyaW0iLCJlc2NhcGVkIiwidXBwZXJjYXNlX2FzY2lpIiwibG93ZXJjYXNlX2FzY2lpIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsIml0ZXIiLCJpdGVyaSIsImluZGV4X2Zyb20iLCJpbmRleF9mcm9tX29wdCIsInJpbmRleF9mcm9tIiwicmluZGV4X2Zyb21fb3B0IiwiaW5kZXgiLCJpbmRleF9vcHQiLCJyaW5kZXgiLCJyaW5kZXhfb3B0IiwidG9fc2VxIiwidG9fc2VxaSIsIm9mX3NlcSIsImdldF91dGZfOF91Y2hhciIsImlzX3ZhbGlkX3V0Zl84IiwiZ2V0X3V0Zl8xNmJlX3VjaGFyIiwiaXNfdmFsaWRfdXRmXzE2YmUiLCJnZXRfdXRmXzE2bGVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZsZSIsImdldF91aW50OCIsImdldF9pbnQ4IiwiZ2V0X3VpbnQxNl9uZSIsImdldF91aW50MTZfYmUiLCJnZXRfdWludDE2X2xlIiwiZ2V0X2ludDE2X25lIiwiZ2V0X2ludDE2X2JlIiwiZ2V0X2ludDE2X2xlIiwiZ2V0X2ludDMyX25lIiwiaGFzaCIsInNlZWRlZF9oYXNoIiwiZ2V0X2ludDMyX2JlIiwiZ2V0X2ludDMyX2xlIiwiZ2V0X2ludDY0X25lIiwiZ2V0X2ludDY0X2JlIiwiZ2V0X2ludDY0X2xlIiwiZXF1YWwiLCJjaHIiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLFlBQUFDLElBQUFDLEdBQUFDLEdDcUR3QixxQkFBdUI7QUFBQSxZQUFBQyxJQUFBRixHQUFBQyxHQUV2QixxQkFBdUI7QUFBQTtBQUFBLElBQUFFLE9EdkQvQztBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxRQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLFdBQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLFlBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsWUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLE9BQUE7QUFBQSxJQUFBQyxVQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLG1CQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxpQkFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLFFBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsU0FBQTtBQUFBLElBQUFDLGFBQUE7QUFBQSxJQUFBQyxTQUFBO0FBQUEsSUFBQUMsVUFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxrQkFBQTtBQUFBLElBQUFDLGlCQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxvQkFBQTtBQUFBLElBQUFDLHFCQUFBO0FBQUEsSUFBQUMsb0JBQUE7QUFBQSxJQUFBQyxZQUFBO0FBQUEsSUFBQUMsV0FBQTtBQUFBLElBQUFDLGdCQUFBO0FBQUEsSUFBQUMsZ0JBQUE7QUFBQSxJQUFBQyxnQkFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxPQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsZUFBQTtBQUFBLElBQUFDLGVBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsUUFBQTtBQUFBLElBQUFDLE1BQUE7QUFBQSxJQUFBekMsWUFBQTtBQUFBLElBQUFFLG9CQUFBO0FBQUEsSUFBQUQsb0JBQUE7QUFBQSxJQUFBaEIsWUFBQTtBQUFBLElBQUFpRCxnQkFBQTtBQUFBLElBQUFELFNBQUE7QUFBQSxZQUFBTyxRQUFBbEUsR0FBQUMsR0NtRW9DLHVCQUFjO0FBQUEsR0RuRWxEIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzU4OTQsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNfb2Zfb2NhbWwuY21hLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi9yb290Ly5vcGFtLzUuMi4wL2xpYi9qc19vZl9vY2FtbC9qcy5tbCJdLCJzb3VyY2VzQ29udGVudCI6WyIoKiBnZW5lcmF0ZWQgY29kZSAqKSIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbigqIFRoaXMgbG9jYWwgbW9kdWxlIFtKc10gaXMgbmVlZGVkIHNvIHRoYXQgdGhlIHBweF9qcyBleHRlbnNpb24gd29yayB3aXRoaW4gdGhhdCBmaWxlLiAqKVxubW9kdWxlIEpzID0gc3RydWN0XG4gIHR5cGUgKydhIHRcblxuICB0eXBlICgtJ2EsICsnYikgbWV0aF9jYWxsYmFja1xuXG4gIG1vZHVsZSBVbnNhZmUgPSBzdHJ1Y3RcbiAgICB0eXBlIHRvcFxuXG4gICAgdHlwZSBhbnkgPSB0b3AgdFxuXG4gICAgdHlwZSBhbnlfanNfYXJyYXkgPSBhbnlcblxuICAgIGV4dGVybmFsIGluamVjdCA6ICdhIC0+IGFueSA9IFwiJWlkZW50aXR5XCJcblxuICAgIGV4dGVybmFsIGNvZXJjZSA6IF8gdCAtPiBfIHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgICBleHRlcm5hbCBnZXQgOiAnYSAtPiAnYiAtPiAnYyA9IFwiY2FtbF9qc19nZXRcIlxuXG4gICAgZXh0ZXJuYWwgc2V0IDogJ2EgLT4gJ2IgLT4gJ2MgLT4gdW5pdCA9IFwiY2FtbF9qc19zZXRcIlxuXG4gICAgZXh0ZXJuYWwgZGVsZXRlIDogJ2EgLT4gJ2IgLT4gdW5pdCA9IFwiY2FtbF9qc19kZWxldGVcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbCA6ICdhIC0+ICdiIC0+IGFueSBhcnJheSAtPiAnYyA9IFwiY2FtbF9qc19jYWxsXCJcblxuICAgIGV4dGVybmFsIGZ1bl9jYWxsIDogJ2EgLT4gYW55IGFycmF5IC0+ICdiID0gXCJjYW1sX2pzX2Z1bl9jYWxsXCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbCA6ICdhIC0+IHN0cmluZyAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfbWV0aF9jYWxsXCJcblxuICAgIGV4dGVybmFsIG5ld19vYmogOiAnYSAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfbmV3XCJcblxuICAgIGV4dGVybmFsIG5ld19vYmpfYXJyIDogJ2EgLT4gYW55X2pzX2FycmF5IC0+ICdiID0gXCJjYW1sX29qc19uZXdfYXJyXCJcblxuICAgIGV4dGVybmFsIG9iaiA6IChzdHJpbmcgKiBhbnkpIGFycmF5IC0+ICdhID0gXCJjYW1sX2pzX29iamVjdFwiXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiAnYSAtPiAnYiAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogJ2EgLT4gJ2IgLT4gYm9vbCA9IFwiY2FtbF9qc19zdHJpY3RfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHB1cmVfZXhwciA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9qc19wdXJlX2V4cHJcIlxuXG4gICAgZXh0ZXJuYWwgZXZhbF9zdHJpbmcgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXZhbF9zdHJpbmdcIlxuXG4gICAgZXh0ZXJuYWwganNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19leHByXCJcblxuICAgIGV4dGVybmFsIHB1cmVfanNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9wdXJlX2pzX2V4cHJcIlxuXG4gICAgbGV0IGdsb2JhbCA9IHB1cmVfanNfZXhwciBcImdsb2JhbFRoaXNcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlXCJcblxuICAgIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAgIChhbnlfanNfYXJyYXkgLT4gJ2IpIC0+ICgnYywgYW55X2pzX2FycmF5IC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgICBleHRlcm5hbCBjYWxsYmFja193aXRoX2FyaXR5IDogaW50IC0+ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3RcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFjayA6ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0XCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICAgKCdiIC0+IGFueV9qc19hcnJheSAtPiAnYSkgLT4gKCdiLCBhbnlfanNfYXJyYXkgLT4gJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gICAgZXh0ZXJuYWwgcnVudGltZV92YWx1ZSA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc29vX3J1bnRpbWVfdmFsdWVcIlxuXG4gICAgKCogREVQUkVDQVRFRCAqKVxuICAgIGV4dGVybmFsIHZhcmlhYmxlIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX3ZhclwiXG4gIGVuZFxuXG4gICgqKioqKVxuXG4gIHR5cGUgJ2Egb3B0ID0gJ2FcblxuICB0eXBlICdhIG9wdGRlZiA9ICdhXG5cbiAgZXh0ZXJuYWwgZGVidWdnZXIgOiB1bml0IC0+IHVuaXQgPSBcImRlYnVnZ2VyXCJcblxuICBsZXQgbnVsbCA6ICdhIG9wdCA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJudWxsXCJcblxuICBleHRlcm5hbCBzb21lIDogJ2EgLT4gJ2Egb3B0ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCB1bmRlZmluZWQgOiAnYSBvcHRkZWYgPSBVbnNhZmUucHVyZV9qc19leHByIFwidW5kZWZpbmVkXCJcblxuICBleHRlcm5hbCBkZWYgOiAnYSAtPiAnYSBvcHRkZWYgPSBcIiVpZGVudGl0eVwiXG5cbiAgbW9kdWxlIHR5cGUgT1BUID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgZW1wdHkgOiAnYSB0XG5cbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuXG4gICAgdmFsIG1hcCA6ICdhIHQgLT4gKCdhIC0+ICdiKSAtPiAnYiB0XG5cbiAgICB2YWwgYmluZCA6ICdhIHQgLT4gKCdhIC0+ICdiIHQpIC0+ICdiIHRcblxuICAgIHZhbCB0ZXN0IDogJ2EgdCAtPiBib29sXG5cbiAgICB2YWwgaXRlciA6ICdhIHQgLT4gKCdhIC0+IHVuaXQpIC0+IHVuaXRcblxuICAgIHZhbCBjYXNlIDogJ2EgdCAtPiAodW5pdCAtPiAnYikgLT4gKCdhIC0+ICdiKSAtPiAnYlxuXG4gICAgdmFsIGdldCA6ICdhIHQgLT4gKHVuaXQgLT4gJ2EpIC0+ICdhXG5cbiAgICB2YWwgb3B0aW9uIDogJ2Egb3B0aW9uIC0+ICdhIHRcblxuICAgIHZhbCB0b19vcHRpb24gOiAnYSB0IC0+ICdhIG9wdGlvblxuXG4gICAgZXh0ZXJuYWwgZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuICBlbmRcblxuICBtb2R1bGUgT3B0IDogT1BUIHdpdGggdHlwZSAnYSB0ID0gJ2Egb3B0ID0gc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gJ2Egb3B0XG5cbiAgICBsZXQgZW1wdHkgPSBudWxsXG5cbiAgICBsZXQgcmV0dXJuID0gc29tZVxuXG4gICAgZXh0ZXJuYWwgZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBzdHJpY3RfZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX3N0cmljdF9lcXVhbHNcIlxuXG4gICAgbGV0IG1hcCB4IGYgPSBpZiBlcXVhbHMgeCBudWxsIHRoZW4gbnVsbCBlbHNlIHJldHVybiAoZiB4KVxuXG4gICAgbGV0IGJpbmQgeCBmID0gaWYgZXF1YWxzIHggbnVsbCB0aGVuIG51bGwgZWxzZSBmIHhcblxuICAgIGxldCB0ZXN0IHggPSBub3QgKGVxdWFscyB4IG51bGwpXG5cbiAgICBsZXQgaXRlciB4IGYgPSBpZiBub3QgKGVxdWFscyB4IG51bGwpIHRoZW4gZiB4XG5cbiAgICBsZXQgY2FzZSB4IGYgZyA9IGlmIGVxdWFscyB4IG51bGwgdGhlbiBmICgpIGVsc2UgZyB4XG5cbiAgICBsZXQgZ2V0IHggZiA9IGlmIGVxdWFscyB4IG51bGwgdGhlbiBmICgpIGVsc2UgeFxuXG4gICAgbGV0IG9wdGlvbiB4ID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGVtcHR5XG4gICAgICB8IFNvbWUgeCAtPiByZXR1cm4geFxuXG4gICAgbGV0IHRvX29wdGlvbiB4ID0gY2FzZSB4IChmdW4gKCkgLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeClcbiAgZW5kXG5cbiAgbW9kdWxlIE9wdGRlZiA6IE9QVCB3aXRoIHR5cGUgJ2EgdCA9ICdhIG9wdGRlZiA9IHN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9ICdhIG9wdGRlZlxuXG4gICAgbGV0IGVtcHR5ID0gdW5kZWZpbmVkXG5cbiAgICBsZXQgcmV0dXJuID0gZGVmXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHN0cmljdF9lcXVhbHMgOiBfIHQgLT4gXyB0IC0+IGJvb2wgPSBcImNhbWxfanNfc3RyaWN0X2VxdWFsc1wiXG5cbiAgICBsZXQgbWFwIHggZiA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiB1bmRlZmluZWQgZWxzZSByZXR1cm4gKGYgeClcblxuICAgIGxldCBiaW5kIHggZiA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiB1bmRlZmluZWQgZWxzZSBmIHhcblxuICAgIGxldCB0ZXN0IHggPSBub3QgKHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQpXG5cbiAgICBsZXQgaXRlciB4IGYgPSBpZiBub3QgKHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQpIHRoZW4gZiB4XG5cbiAgICBsZXQgY2FzZSB4IGYgZyA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiBmICgpIGVsc2UgZyB4XG5cbiAgICBsZXQgZ2V0IHggZiA9IGlmIHN0cmljdF9lcXVhbHMgeCB1bmRlZmluZWQgdGhlbiBmICgpIGVsc2UgeFxuXG4gICAgbGV0IG9wdGlvbiB4ID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGVtcHR5XG4gICAgICB8IFNvbWUgeCAtPiByZXR1cm4geFxuXG4gICAgbGV0IHRvX29wdGlvbiB4ID0gY2FzZSB4IChmdW4gKCkgLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeClcbiAgZW5kXG5cbiAgKCoqKiopXG5cbiAgbGV0IGNvZXJjZSB4IGYgZyA9IE9wdC5nZXQgKGYgeCkgKGZ1biAoKSAtPiBnIHgpXG5cbiAgbGV0IGNvZXJjZV9vcHQgeCBmIGcgPSBPcHQuZ2V0IChPcHQuYmluZCB4IGYpIChmdW4gKCkgLT4gZyB4KVxuXG4gICgqKioqKVxuXG4gIHR5cGUgKydhIG1ldGhcblxuICB0eXBlICsnYSBnZW5fcHJvcFxuXG4gIHR5cGUgJ2EgcmVhZG9ubHlfcHJvcCA9IDwgZ2V0IDogJ2EgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2Egd3JpdGVvbmx5X3Byb3AgPSA8IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2EgcHJvcCA9IDwgZ2V0IDogJ2EgOyBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICdhIG9wdGRlZl9wcm9wID0gPCBnZXQgOiAnYSBvcHRkZWYgOyBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICsnYSBjb25zdHJcblxuICAoKioqKilcblxuICB0eXBlICdhIGNhbGxiYWNrID0gKHVuaXQsICdhKSBtZXRoX2NhbGxiYWNrXG5cbiAgZXh0ZXJuYWwgd3JhcF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHdyYXBfbWV0aF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdhLCAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja1wiXG5cbiAgKCoqKiopXG5cbiAgZXh0ZXJuYWwgZXF1YWxzIDogXyB0IC0+IF8gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgZXh0ZXJuYWwgc3RyaWN0X2VxdWFscyA6IF8gdCAtPiBfIHQgLT4gYm9vbCA9IFwiY2FtbF9qc19zdHJpY3RfZXF1YWxzXCJcblxuICAoKioqKilcblxuICBsZXQgX3RydWUgPSBVbnNhZmUucHVyZV9qc19leHByIFwidHJ1ZVwiXG5cbiAgbGV0IF9mYWxzZSA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJmYWxzZVwiXG5cbiAgdHlwZSBtYXRjaF9yZXN1bHRfaGFuZGxlXG5cbiAgdHlwZSBzdHJpbmdfYXJyYXlcblxuICBjbGFzcyB0eXBlIG51bWJlciA9IG9iamVjdFxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZ19yYWRpeCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9GaXhlZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9FeHBvbmVudGlhbCA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0V4cG9uZW50aWFsX2RpZ2l0cyA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9QcmVjaXNpb24gOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxuICBhbmQganNfc3RyaW5nID0gb2JqZWN0XG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHZhbHVlT2YgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY2hhckF0IDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjaGFyQ29kZUF0IDogaW50IC0+IG51bWJlciB0IG1ldGhcblxuICAgIG1ldGhvZCBjb2RlUG9pbnRBdCA6IGludCAtPiBudW1iZXIgdCBvcHRkZWYgbWV0aFxuXG4gICAgKCogVGhpcyBtYXkgcmV0dXJuIE5hTi4uLiAqKVxuICAgIG1ldGhvZCBjb25jYXQgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0XzIgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0XzMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0XzQgOlxuICAgICAganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGluZGV4T2YgOiBqc19zdHJpbmcgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGluZGV4T2ZfZnJvbSA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGxhc3RJbmRleE9mIDoganNfc3RyaW5nIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBsYXN0SW5kZXhPZl9mcm9tIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgbG9jYWxlQ29tcGFyZSA6IGpzX3N0cmluZyB0IC0+IG51bWJlciB0IG1ldGhcblxuICAgIG1ldGhvZCBfbWF0Y2ggOiByZWdFeHAgdCAtPiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBub3JtYWxpemUgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgbm9ybWFsaXplX2Zvcm0gOiBub3JtYWxpemF0aW9uIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2UgOiByZWdFeHAgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZV9zdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VhcmNoIDogcmVnRXhwIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlX2VuZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXQgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXRfbGltaXRlZCA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaXRfcmVnRXhwIDogcmVnRXhwIHQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGl0X3JlZ0V4cExpbWl0ZWQgOiByZWdFeHAgdCAtPiBpbnQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHN1YnN0cmluZyA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHN1YnN0cmluZ190b0VuZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb3dlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVMb3dlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9VcHBlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVVcHBlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdHJpbSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuICBhbmQgcmVnRXhwID0gb2JqZWN0XG4gICAgbWV0aG9kIGV4ZWMgOiBqc19zdHJpbmcgdCAtPiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXN0IDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBzb3VyY2UgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2xvYmFsIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpZ25vcmVDYXNlIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtdWx0aWxpbmUgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxhc3RJbmRleCA6IGludCBwcm9wXG4gIGVuZFxuXG4gIGFuZCBub3JtYWxpemF0aW9uID0ganNfc3RyaW5nXG5cbiAgdHlwZSBudW1iZXJfdCA9IG51bWJlciB0XG5cbiAgKCogc3RyaW5nIGlzIHVzZWQgYnkgcHB4X2pzLCBpdCBuZWVkcyB0byBjb21lIGJlZm9yZSBhbnkgdXNlIG9mIHRoZVxuICAgICBuZXcgc3ludGF4IGluIHRoaXMgZmlsZSAqKVxuICBleHRlcm5hbCBzdHJpbmcgOiBzdHJpbmcgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXCJcblxuICBleHRlcm5hbCB0b19zdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXCJcblxuICBsZXQgbmZjID0gc3RyaW5nIFwiTkZDXCJcblxuICBsZXQgbmZkID0gc3RyaW5nIFwiTkZEXCJcblxuICBsZXQgbmZrYyA9IHN0cmluZyBcIk5GS0NcIlxuXG4gIGxldCBuZmtkID0gc3RyaW5nIFwiTkZLRFwiXG5lbmRcblxuaW5jbHVkZSBKc1xuXG5jbGFzcyB0eXBlIHN0cmluZ19jb25zdHIgPSBvYmplY3RcbiAgbWV0aG9kIGZyb21DaGFyQ29kZSA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5lbmRcblxubGV0IHN0cmluZ19jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX1N0cmluZ1xuXG5sZXQgcmVnRXhwID0gVW5zYWZlLmdsb2JhbCMjLl9SZWdFeHBcblxubGV0IHJlZ0V4cF9jb3B5ID0gcmVnRXhwXG5cbmxldCByZWdFeHBfd2l0aEZsYWdzID0gcmVnRXhwXG5cbmNsYXNzIHR5cGUgWydhXSBqc19hcnJheSA9IG9iamVjdFxuICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvTG9jYWxlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCBjb25jYXQgOiAnYSBqc19hcnJheSB0IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBqb2luIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCBwb3AgOiAnYSBvcHRkZWYgbWV0aFxuXG4gIG1ldGhvZCBwdXNoIDogJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcHVzaF8yIDogJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcHVzaF8zIDogJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcHVzaF80IDogJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgcmV2ZXJzZSA6ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzaGlmdCA6ICdhIG9wdGRlZiBtZXRoXG5cbiAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc2xpY2VfZW5kIDogaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzb3J0IDogKCdhIC0+ICdhIC0+IG51bWJlcl90KSBjYWxsYmFjayAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc29ydF9hc1N0cmluZ3MgOiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlIDogaW50IC0+IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlXzEgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCBzcGxpY2VfMiA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHNwbGljZV8zIDogaW50IC0+IGludCAtPiAnYSAtPiAnYSAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2Qgc3BsaWNlXzQgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gIG1ldGhvZCB1bnNoaWZ0IDogJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgdW5zaGlmdF8yIDogJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgdW5zaGlmdF8zIDogJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2QgdW5zaGlmdF80IDogJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICBtZXRob2Qgc29tZSA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiBib29sIHQpIGNhbGxiYWNrIC0+IGJvb2wgdCBtZXRoXG5cbiAgbWV0aG9kIGV2ZXJ5IDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gYm9vbCB0IG1ldGhcblxuICBtZXRob2QgZm9yRWFjaCA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiB1bml0KSBjYWxsYmFjayAtPiB1bml0IG1ldGhcblxuICBtZXRob2QgbWFwIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiBqc19hcnJheSB0IG1ldGhcblxuICBtZXRob2QgZmlsdGVyIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgbWV0aG9kIHJlZHVjZV9pbml0IDogKCdiIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAtPiAnYiBtZXRoXG5cbiAgbWV0aG9kIHJlZHVjZSA6ICgnYSAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYSkgY2FsbGJhY2sgLT4gJ2EgbWV0aFxuXG4gIG1ldGhvZCByZWR1Y2VSaWdodF9pbml0IDpcbiAgICAoJ2IgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIC0+ICdiIG1ldGhcblxuICBtZXRob2QgcmVkdWNlUmlnaHQgOiAoJ2EgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2EpIGNhbGxiYWNrIC0+ICdhIG1ldGhcblxuICBtZXRob2QgbGVuZ3RoIDogaW50IHByb3BcbmVuZFxuXG5sZXQgb2JqZWN0X2NvbnN0cnVjdG9yID0gVW5zYWZlLmdsb2JhbCMjLl9PYmplY3RcblxubGV0IG9iamVjdF9rZXlzIG8gOiBqc19zdHJpbmcgdCBqc19hcnJheSB0ID0gb2JqZWN0X2NvbnN0cnVjdG9yIyNrZXlzIG9cblxubGV0IGFycmF5X2NvbnN0cnVjdG9yID0gVW5zYWZlLmdsb2JhbCMjLl9BcnJheVxuXG5sZXQgYXJyYXlfZW1wdHkgPSBhcnJheV9jb25zdHJ1Y3RvclxuXG5sZXQgYXJyYXlfbGVuZ3RoID0gYXJyYXlfY29uc3RydWN0b3JcblxubGV0IGFycmF5X2dldCA6ICdhICNqc19hcnJheSB0IC0+IGludCAtPiAnYSBvcHRkZWYgPSBVbnNhZmUuZ2V0XG5cbmxldCBhcnJheV9zZXQgOiAnYSAjanNfYXJyYXkgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFVuc2FmZS5zZXRcblxubGV0IGFycmF5X21hcF9wb2x5IDpcbiAgICAnYSAjanNfYXJyYXkgdCAtPiAoJ2EgLT4gaW50IC0+ICdhICNqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAjanNfYXJyYXkgdCA9XG4gZnVuIGEgY2IgLT4gKFVuc2FmZS5jb2VyY2UgYSkjI21hcCBjYlxuXG5sZXQgYXJyYXlfbWFwIGYgYSA9IGFycmF5X21hcF9wb2x5IGEgKHdyYXBfY2FsbGJhY2sgKGZ1biB4IF9pZHggXyAtPiBmIHgpKVxuXG5sZXQgYXJyYXlfbWFwaSBmIGEgPSBhcnJheV9tYXBfcG9seSBhICh3cmFwX2NhbGxiYWNrIChmdW4geCBpZHggXyAtPiBmIGlkeCB4KSlcblxuY2xhc3MgdHlwZSBtYXRjaF9yZXN1bHQgPSBvYmplY3RcbiAgaW5oZXJpdCBbanNfc3RyaW5nIHRdIGpzX2FycmF5XG5cbiAgbWV0aG9kIGluZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgaW5wdXQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5lbmRcblxubGV0IHN0cl9hcnJheSA6IHN0cmluZ19hcnJheSB0IC0+IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgPSBVbnNhZmUuY29lcmNlXG5cbmxldCBtYXRjaF9yZXN1bHQgOiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgLT4gbWF0Y2hfcmVzdWx0IHQgPSBVbnNhZmUuY29lcmNlXG5cbmNsYXNzIHR5cGUgZGF0ZSA9IG9iamVjdFxuICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvRGF0ZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9UaW1lU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0xvY2FsZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICBtZXRob2QgdG9Mb2NhbGVEYXRlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0xvY2FsZVRpbWVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHZhbHVlT2YgOiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGdldFRpbWUgOiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGdldEZ1bGxZZWFyIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDRnVsbFllYXIgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRNb250aCA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ01vbnRoIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0RGF0ZSA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ0RhdGUgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXREYXkgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRVVENEYXkgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRIb3VycyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ0hvdXJzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0TWludXRlcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ01pbnV0ZXMgOiBpbnQgbWV0aFxuXG4gIG1ldGhvZCBnZXRTZWNvbmRzIDogaW50IG1ldGhcblxuICBtZXRob2QgZ2V0VVRDU2Vjb25kcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldE1pbGxpc2Vjb25kcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFVUQ01pbGxpc2Vjb25kcyA6IGludCBtZXRoXG5cbiAgbWV0aG9kIGdldFRpbWV6b25lT2Zmc2V0IDogaW50IG1ldGhcblxuICBtZXRob2Qgc2V0VGltZSA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0RnVsbFllYXIgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENGdWxsWWVhciA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldE1vbnRoIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDTW9udGggOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXREYXRlIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDRGF0ZSA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldEhvdXJzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDSG91cnMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRNaW51dGVzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDTWludXRlcyA6IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNldFNlY29uZHMgOiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBzZXRVVENTZWNvbmRzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0TWlsbGlzZWNvbmRzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc2V0VVRDTWlsbGlzZWNvbmRzIDogaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgdG9VVENTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgbWV0aG9kIHRvSVNPU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gIG1ldGhvZCB0b0pTT04gOiAnYSAtPiBqc19zdHJpbmcgdCBtZXRoXG5lbmRcblxuY2xhc3MgdHlwZSBkYXRlX2NvbnN0ciA9IG9iamVjdFxuICBtZXRob2QgcGFyc2UgOiBqc19zdHJpbmcgdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIF9VVENfbW9udGggOiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19kYXkgOiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19ob3VyIDogaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19taW4gOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgX1VUQ19zZWMgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIF9VVENfbXMgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBub3cgOiBudW1iZXJfdCBtZXRoXG5lbmRcblxubGV0IGRhdGVfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9EYXRlXG5cbmxldCBkYXRlIDogZGF0ZV9jb25zdHIgdCA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX25vdyA6IGRhdGUgdCBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9mcm9tVGltZVZhbHVlIDogKG51bWJlcl90IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbW9udGggOiAoaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2RheSA6IChpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2hvdXIgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbWluIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9zZWMgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9tcyA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPVxuICBkYXRlX2NvbnN0clxuXG5jbGFzcyB0eXBlIG1hdGggPSBvYmplY3RcbiAgbWV0aG9kIF9FIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE4yIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE4xMCA6IG51bWJlcl90IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgX0xPRzJFIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfTE9HMTBFIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBfUEkgOiBudW1iZXJfdCByZWFkb25seV9wcm9wXG5cbiAgbWV0aG9kIF9TUVJUMV8yXyA6IG51bWJlcl90IHJlYWRvbmx5X3Byb3BcblxuICBtZXRob2QgX1NRUlQyIDogbnVtYmVyX3QgcmVhZG9ubHlfcHJvcFxuXG4gIG1ldGhvZCBhYnMgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGFjb3MgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGFzaW4gOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGF0YW4gOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGF0YW4yIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBjZWlsIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBjb3MgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGV4cCA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgZmxvb3IgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIGxvZyA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWF4IDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBtYXhfMyA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWF4XzQgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIG1pbiA6IG51bWJlcl90IC0+IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgbWluXzMgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIG1pbl80IDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuXG4gIG1ldGhvZCBwb3cgOiBudW1iZXJfdCAtPiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHJhbmRvbSA6IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgcm91bmQgOiBudW1iZXJfdCAtPiBudW1iZXJfdCBtZXRoXG5cbiAgbWV0aG9kIHNpbiA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2Qgc3FydCA6IG51bWJlcl90IC0+IG51bWJlcl90IG1ldGhcblxuICBtZXRob2QgdGFuIDogbnVtYmVyX3QgLT4gbnVtYmVyX3QgbWV0aFxuZW5kXG5cbmxldCBtYXRoID0gVW5zYWZlLmdsb2JhbCMjLl9NYXRoXG5cbmNsYXNzIHR5cGUgZXJyb3IgPSBvYmplY3RcbiAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgbWV0aG9kIG1lc3NhZ2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgbWV0aG9kIHN0YWNrIDoganNfc3RyaW5nIHQgb3B0ZGVmIHByb3BcblxuICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5lbmRcblxubGV0IGVycm9yX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fRXJyb3JcblxubW9kdWxlIEpzX2Vycm9yID0gc3RydWN0XG4gIHR5cGUgZXJyb3JfdCA9IGVycm9yIHRcblxuICBpbmNsdWRlIEpzb29fcnVudGltZS5FcnJvclxuXG4gIGV4dGVybmFsIG9mX2Vycm9yIDogZXJyb3JfdCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGV4dGVybmFsIHRvX2Vycm9yIDogdCAtPiBlcnJvcl90ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCBuYW1lIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyMubmFtZVxuXG4gIGxldCBtZXNzYWdlIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyMubWVzc2FnZVxuXG4gIGxldCBzdGFjayAoZSA6IHQpIDogc3RyaW5nIG9wdGlvbiA9XG4gICAgT3B0LnRvX29wdGlvbiAoT3B0Lm1hcCAodG9fZXJyb3IgZSkjIy5zdGFjayB0b19zdHJpbmcpXG5cbiAgbGV0IHRvX3N0cmluZyBlID0gdG9fc3RyaW5nICh0b19lcnJvciBlKSMjdG9TdHJpbmdcbmVuZFxuXG5tb2R1bGUgTWFnaWMgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgVCA9IHNpZ1xuICAgIGV4Y2VwdGlvbiBFcnJvciBvZiBlcnJvciB0XG4gIGVuZFxuXG4gIHR5cGUgKCdhLCAnYikgZXEgPSBFcSA6ICgnYSwgJ2EpIGVxXG5cbiAgbGV0IChlcSA6IChlcnJvciB0LCBKc19lcnJvci50KSBlcSkgPSBPYmoubWFnaWMgRXFcblxuICBsZXQgbSA9XG4gICAgbWF0Y2ggZXEgd2l0aFxuICAgIHwgRXEgLT5cbiAgICAgICAgKG1vZHVsZSBzdHJ1Y3RcbiAgICAgICAgICBleGNlcHRpb24gRXJyb3IgPSBKc19lcnJvci5FeG5cbiAgICAgICAgZW5kIDogVClcblxuICBtb2R1bGUgRXJyb3IgPSAodmFsIG0gOiBUKVxuZW5kXG5cbmluY2x1ZGUgTWFnaWMuRXJyb3JcblxubGV0IHJhaXNlX2pzX2Vycm9yIGUgPSBKc19lcnJvci5yYWlzZV8gKEpzX2Vycm9yLm9mX2Vycm9yIGUpXG5cbmxldCBzdHJpbmdfb2ZfZXJyb3IgZSA9IEpzX2Vycm9yLnRvX3N0cmluZyAoSnNfZXJyb3Iub2ZfZXJyb3IgZSlcblxubGV0IGV4bl93aXRoX2pzX2JhY2t0cmFjZSA9IEpzX2Vycm9yLmF0dGFjaF9qc19iYWNrdHJhY2VcblxuZXh0ZXJuYWwganNfZXJyb3Jfb2ZfZXhuIDogZXhuIC0+IGVycm9yIHQgb3B0ID0gXCJjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvblwiXG5cbmNsYXNzIHR5cGUganNvbiA9IG9iamVjdFxuICBtZXRob2QgcGFyc2UgOiBqc19zdHJpbmcgdCAtPiAnYSBtZXRoXG5cbiAgbWV0aG9kIHN0cmluZ2lmeSA6ICdhIC0+IGpzX3N0cmluZyB0IG1ldGhcbmVuZFxuXG5sZXQgX0pTT04gOiBqc29uIHQgPSBVbnNhZmUuZ2xvYmFsIyMuX0pTT05cblxubGV0IGRlY29kZVVSSSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5kZWNvZGVVUkkgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBkZWNvZGVVUklDb21wb25lbnQgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZGVjb2RlVVJJQ29tcG9uZW50IFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZW5jb2RlVVJJIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmVuY29kZVVSSSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGVuY29kZVVSSUNvbXBvbmVudCAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5lbmNvZGVVUklDb21wb25lbnQgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBlc2NhcGUgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZXNjYXBlIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgdW5lc2NhcGUgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMudW5lc2NhcGUgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmV4dGVybmFsIGJvb2wgOiBib29sIC0+IGJvb2wgdCA9IFwiY2FtbF9qc19mcm9tX2Jvb2xcIlxuXG5leHRlcm5hbCB0b19ib29sIDogYm9vbCB0IC0+IGJvb2wgPSBcImNhbWxfanNfdG9fYm9vbFwiXG5cbmV4dGVybmFsIGFycmF5IDogJ2EgYXJyYXkgLT4gJ2EganNfYXJyYXkgdCA9IFwiY2FtbF9qc19mcm9tX2FycmF5XCJcblxuZXh0ZXJuYWwgdG9fYXJyYXkgOiAnYSBqc19hcnJheSB0IC0+ICdhIGFycmF5ID0gXCJjYW1sX2pzX3RvX2FycmF5XCJcblxuZXh0ZXJuYWwgYnl0ZXN0cmluZyA6IHN0cmluZyAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc2J5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHRvX2J5dGVzdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcIlxuXG5leHRlcm5hbCBmbG9hdCA6IGZsb2F0IC0+IG51bWJlcl90ID0gXCJjYW1sX2pzX2Zyb21fZmxvYXRcIlxuXG5leHRlcm5hbCB0b19mbG9hdCA6IG51bWJlcl90IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuZXh0ZXJuYWwgbnVtYmVyX29mX2Zsb2F0IDogZmxvYXQgLT4gbnVtYmVyIHQgPSBcImNhbWxfanNfZnJvbV9mbG9hdFwiXG5cbmV4dGVybmFsIGZsb2F0X29mX251bWJlciA6IG51bWJlciB0IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuZXh0ZXJuYWwgaW50MzIgOiBpbnQzMiAtPiBudW1iZXJfdCA9IFwiY2FtbF9qc19mcm9tX2ludDMyXCJcblxuZXh0ZXJuYWwgdG9faW50MzIgOiBudW1iZXJfdCAtPiBpbnQzMiA9IFwiY2FtbF9qc190b19pbnQzMlwiXG5cbmV4dGVybmFsIG5hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBudW1iZXJfdCA9IFwiY2FtbF9qc19mcm9tX25hdGl2ZWludFwiXG5cbmV4dGVybmFsIHRvX25hdGl2ZWludCA6IG51bWJlcl90IC0+IG5hdGl2ZWludCA9IFwiY2FtbF9qc190b19uYXRpdmVpbnRcIlxuXG5leHRlcm5hbCB0eXBlb2YgOiBfIHQgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNfdHlwZW9mXCJcblxuZXh0ZXJuYWwgaW5zdGFuY2VvZiA6IF8gdCAtPiBfIGNvbnN0ciAtPiBib29sID0gXCJjYW1sX2pzX2luc3RhbmNlb2ZcIlxuXG5sZXQgaXNOYU4gKGkgOiAnYSkgOiBib29sID1cbiAgdG9fYm9vbCAoVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5pc05hTiBbfCBVbnNhZmUuaW5qZWN0IGkgfF0pXG5cbmxldCBwYXJzZUludCAocyA6IGpzX3N0cmluZyB0KSA6IGludCA9XG4gIGxldCBzID0gVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5wYXJzZUludCBbfCBVbnNhZmUuaW5qZWN0IHMgfF0gaW5cbiAgaWYgaXNOYU4gcyB0aGVuIGZhaWx3aXRoIFwicGFyc2VJbnRcIiBlbHNlIHNcblxubGV0IHBhcnNlRmxvYXQgKHMgOiBqc19zdHJpbmcgdCkgOiBudW1iZXJfdCA9XG4gIGxldCBzID0gVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5wYXJzZUZsb2F0IFt8IFVuc2FmZS5pbmplY3QgcyB8XSBpblxuICBpZiBpc05hTiBzIHRoZW4gZmFpbHdpdGggXCJwYXJzZUZsb2F0XCIgZWxzZSBzXG5cbmxldCBfID1cbiAgUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciAoZnVuIGUgLT5cbiAgICAgIGlmIGluc3RhbmNlb2YgKE9iai5tYWdpYyBlIDogPCAuLiA+IHQpIGVycm9yX2NvbnN0clxuICAgICAgdGhlblxuICAgICAgICBsZXQgZSA9IEpzX2Vycm9yLm9mX2Vycm9yIChPYmoubWFnaWMgZSA6IGVycm9yIHQpIGluXG4gICAgICAgIFNvbWUgKEpzX2Vycm9yLnRvX3N0cmluZyBlKVxuICAgICAgZWxzZVxuICAgICAgICBtYXRjaCBlIHdpdGhcbiAgICAgICAgfCBKc19lcnJvci5FeG4gZSAtPiBTb21lIChKc19lcnJvci50b19zdHJpbmcgZSlcbiAgICAgICAgfCBfIC0+IE5vbmUpXG5cbmxldCBleHBvcnRfanMgKGZpZWxkIDoganNfc3RyaW5nIHQpIHggPVxuICBVbnNhZmUuc2V0XG4gICAgKFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJqc29vX2V4cG9ydHNcIilcbiAgICBmaWVsZFxuICAgIChpZlxuICAgICAgIFN0cmluZy5lcXVhbCAoSnMudG9fc3RyaW5nICh0eXBlb2YgKE9iai5tYWdpYyB4KSkpIFwiZnVuY3Rpb25cIlxuICAgICAgICgqIGZ1bmN0aW9uIHdpdGggYXJpdHkvbGVuZ3RoIGVxdWFsIHRvIHplcm8gYXJlIGFscmVhZHkgd3JhcHBlZCAqKVxuICAgICAgICYmIFVuc2FmZS5nZXQgKE9iai5tYWdpYyB4KSAoSnMuc3RyaW5nIFwibGVuZ3RoXCIpID4gMFxuICAgICB0aGVuIE9iai5tYWdpYyAod3JhcF9jYWxsYmFjayAoT2JqLm1hZ2ljIHgpKVxuICAgICBlbHNlIHgpXG5cbmxldCBleHBvcnQgZmllbGQgeCA9IGV4cG9ydF9qcyAoc3RyaW5nIGZpZWxkKSB4XG5cbmxldCBleHBvcnRfYWxsIG9iaiA9XG4gIGxldCBrZXlzID0gb2JqZWN0X2tleXMgb2JqIGluXG4gIGtleXMjI2ZvckVhY2hcbiAgICAod3JhcF9jYWxsYmFjayAoZnVuIChrZXkgOiBqc19zdHJpbmcgdCkgXyBfIC0+IGV4cG9ydF9qcyBrZXkgKFVuc2FmZS5nZXQgb2JqIGtleSkpKVxuXG4oKioqKilcblxuKCogREVQUkVDQVRFRCAqKVxuXG50eXBlIGZsb2F0X3Byb3AgPSBudW1iZXJfdCBwcm9wXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfanNfZ2V0IiwiY2FtbF9qc19zZXQiLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2siLCJjYW1sX3N0cmluZ19vZl9qc3N0cmluZyIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJjYW1sX2NhbGwyIiwiYTEiLCJnbG9iYWxfZGF0YSIsIkpzX29mX29jYW1sX0ltcG9ydCIsIlN0ZGxpYiIsIkpzb29fcnVudGltZSIsIlN0ZGxpYl9QcmludGV4YyIsImdsb2JhbCIsIm51bGwkIiwidW5kZWZpbmVkJCIsInJldHVybiQiLCJtYXAiLCJ4IiwiYmluZCIsInRlc3QiLCJpdGVyIiwiY2FzZSQiLCJnIiwiZ2V0Iiwib3B0aW9uIiwidG9fb3B0aW9uIiwiY29lcmNlIiwiY29lcmNlX29wdCIsInN0cmluZ19jb25zdHIiLCJyZWdFeHAiLCJvYmplY3RfY29uc3RydWN0b3IiLCJvYmplY3Rfa2V5cyIsInQ0IiwiYXJyYXlfY29uc3RydWN0b3IiLCJhcnJheV9tYXAiLCJ0NiIsImNiIiwiaWR4IiwicGFyYW0iLCJhcnJheV9tYXBpIiwic3RyX2FycmF5IiwibWF0Y2hfcmVzdWx0IiwiZGF0ZV9jb25zdHIiLCJtYXRoIiwiZXJyb3JfY29uc3RyIiwiaW5jbHVkZSIsInJhaXNlIiwiZXhuX3dpdGhfanNfYmFja3RyYWNlIiwib2ZfZXhuIiwiRXJyb3IiLCJuYW1lIiwidDExIiwibWVzc2FnZSIsInQxMiIsInN0YWNrIiwidDEzIiwidG9fc3RyaW5nIiwidDE0IiwicmFpc2VfanNfZXJyb3IiLCJlIiwic3RyaW5nX29mX2Vycm9yIiwiSlNPTiIsImRlY29kZVVSSSIsInMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ1bmVzY2FwZSIsImlzTmFOIiwiaSIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsImV4cG9ydF9qcyIsImZpZWxkIiwiZXhwb3J0JCIsImV4cG9ydF9hbGwiLCJvYmoiLCJrZXlzIiwidDI2Iiwia2V5IiwiSnNfb2Zfb2NhbWxfSnMiXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMsY0FBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyx3QkFBQTtBQUFBLElBQUFDLDBCQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBQUFDLFdBQUFGLEdBQUFDLElBQUFFO0FBQUFBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGNBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLFNBQUE7QUFBQSxJQUFBQyxlQUFBO0FBQUEsSUFBQUMsa0JBQUE7QUFBQSxJQUFBQyxTQ29FaUI7QUFBQSxJQUFBQyxRQW9DSztBQUFBLElBQUFDLGFBSVE7QUFBQSxZQUFBQyxRQUFBLEdENUc5QjtBQUFBLFlBQUFDLElBQUFDLEdBQUFkLEdDdUprQyw0QkFBdUIsZ0JBQUs7QUFBQSxZQUFBZSxLQUFBRCxHQUFBZCxHQUUzQiw0QkFBZ0IsZ0JBQUc7QUFBQSxZQUFBZ0IsS0FBQUYsR0FFbEI7QUFBQSxZQUFBRyxLQUFBSCxHQUFBZDtBQUFBQSxRQUFBLElBRUs7QUFBQSxlQUFNLG9CQUFHO0FBQUE7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QTtBQUFBO0FBQUE7QUFBQSxHQ3V6Qm9CO0FBQUE7QUFBQSxFRHZ6QnBCIiwiaWdub3JlTGlzdCI6WzBdfX0seyJvZmZzZXQiOnsibGluZSI6MzYxNDcsImNvbHVtbiI6MH0sIm1hcCI6eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLnN4X2Jyb3dzZXIuZW9ianMvanNvby9kdW5lX19leGVfX1N4X2Jyb3dzZXIuY21vLmpzIiwic291cmNlcyI6WyIvYnVpbHRpbi9ibGFja2JveC5tbCIsIi93b3Jrc3BhY2Vfcm9vdC9icm93c2VyL3N4X2Jyb3dzZXIubWwiXSwic291cmNlc0NvbnRlbnQiOlsiKCogZ2VuZXJhdGVkIGNvZGUgKikiLCIoKiogc3hfYnJvd3Nlci5tbCDigJQgT0NhbWwgU1gga2VybmVsIGNvbXBpbGVkIHRvIFdBU00vSlMgZm9yIGJyb3dzZXIgdXNlLlxuXG4gICAgRXhwb3NlcyB0aGUgQ0VLIG1hY2hpbmUsIGJ5dGVjb2RlIFZNLCBwYXJzZXIsIGFuZCBwcmltaXRpdmVzIGFzIGFcbiAgICBnbG9iYWwgW1N4S2VybmVsXSBvYmplY3QgdGhhdCB0aGUgSlMgcGxhdGZvcm0gbGF5ZXIgYmluZHMgdG8uXG5cbiAgICBGcmVzaCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgb2NhbWwtdm0gYnJhbmNoIOKAlCBidWlsZHMgb24gdGhlIGJ5dGVjb2RlXG4gICAgVk0gKyBsYXp5IEpJVCBpbmZyYXN0cnVjdHVyZS4gKilcblxub3BlbiBKc19vZl9vY2FtbFxub3BlbiBTeF90eXBlc1xuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIE9wYXF1ZSB2YWx1ZSBoYW5kbGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqIE5vbi1wcmltaXRpdmUgU1ggdmFsdWVzIChsYW1iZGFzLCBjb21wb25lbnRzLCBzaWduYWxzLCBldGMuKSBhcmUgICAgKilcbigqIHN0b3JlZCBoZXJlIGFuZCByZXByZXNlbnRlZCBvbiB0aGUgSlMgc2lkZSBhcyBvYmplY3RzIHdpdGggYW4gICAgICAgKilcbigqIF9fc3hfaGFuZGxlIGludGVnZXIga2V5LiAgUHJlc2VydmVzIGlkZW50aXR5IGFjcm9zcyBKU+KGlE9DYW1sLiAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IF9uZXh0X2hhbmRsZSA9IHJlZiAwXG5sZXQgX2hhbmRsZV90YWJsZSA6IChpbnQsIHZhbHVlKSBIYXNodGJsLnQgPSBIYXNodGJsLmNyZWF0ZSAyNTZcblxubGV0IGFsbG9jX2hhbmRsZSAodiA6IHZhbHVlKSA6IGludCA9XG4gIGxldCBpZCA9ICFfbmV4dF9oYW5kbGUgaW5cbiAgaW5jciBfbmV4dF9oYW5kbGU7XG4gIEhhc2h0YmwucmVwbGFjZSBfaGFuZGxlX3RhYmxlIGlkIHY7XG4gIGlkXG5cbmxldCBnZXRfaGFuZGxlIChpZCA6IGludCkgOiB2YWx1ZSA9XG4gIG1hdGNoIEhhc2h0YmwuZmluZF9vcHQgX2hhbmRsZV90YWJsZSBpZCB3aXRoXG4gIHwgU29tZSB2IC0+IHZcbiAgfCBOb25lIC0+IHJhaXNlIChFdmFsX2Vycm9yIChQcmludGYuc3ByaW50ZiBcIkludmFsaWQgU1ggaGFuZGxlOiAlZFwiIGlkKSlcblxuKCogSlMtc2lkZSBvcGFxdWUgaG9zdCBvYmplY3QgdGFibGUuXG4gICBIb3N0IG9iamVjdHMgKERPTSBlbGVtZW50cywgY29uc29sZSwgZXRjLikgYXJlIHN0b3JlZCBoZXJlIHRvIHByZXNlcnZlXG4gICBpZGVudGl0eSBhY3Jvc3MgdGhlIE9DYW1s4oaUSlMgYm91bmRhcnkuIFJlcHJlc2VudGVkIGFzIERpY3Qgd2l0aFxuICAgX19ob3N0X2hhbmRsZSBrZXkgb24gdGhlIE9DYW1sIHNpZGUuICopXG5sZXQgX25leHRfaG9zdF9oYW5kbGUgPSByZWYgMFxubGV0IF9hbGxvY19ob3N0X2hhbmRsZSA9IEpzLlVuc2FmZS5wdXJlX2pzX2V4cHJcbiAgXCIoZnVuY3Rpb24oKSB7IHZhciB0ID0ge307IHZhciBuID0gMDsgcmV0dXJuIHsgcHV0OiBmdW5jdGlvbihvYmopIHsgdmFyIGlkID0gbisrOyB0W2lkXSA9IG9iajsgcmV0dXJuIGlkOyB9LCBnZXQ6IGZ1bmN0aW9uKGlkKSB7IHJldHVybiB0W2lkXTsgfSB9OyB9KSgpXCJcbmxldCBob3N0X3B1dCAob2JqIDogSnMuVW5zYWZlLmFueSkgOiBpbnQgPVxuICBsZXQgaWQgPSAhX25leHRfaG9zdF9oYW5kbGUgaW5cbiAgaW5jciBfbmV4dF9ob3N0X2hhbmRsZTtcbiAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsIF9hbGxvY19ob3N0X2hhbmRsZSBcInB1dFwiIFt8IG9iaiB8XSk7XG4gIGlkXG5sZXQgaG9zdF9nZXRfanMgKGlkIDogaW50KSA6IEpzLlVuc2FmZS5hbnkgPVxuICBKcy5VbnNhZmUubWV0aF9jYWxsIF9hbGxvY19ob3N0X2hhbmRsZSBcImdldFwiIFt8IEpzLlVuc2FmZS5pbmplY3QgaWQgfF1cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBHbG9iYWwgZW52aXJvbm1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxuKCogRm9yY2UgbW9kdWxlIGluaXRpYWxpemF0aW9uIOKAlCB0aGVzZSBtb2R1bGVzIHJlZ2lzdGVyIHByaW1pdGl2ZXNcbiAgIGluIHRoZWlyIGxldCAoKSA9IC4uLiBibG9ja3MgYnV0IGFyZW4ndCByZWZlcmVuY2VkIGRpcmVjdGx5LiAqKVxubGV0ICgpID0gU3hfc2NvcGUuY2xlYXJfYWxsICgpXG5cbmxldCBnbG9iYWxfZW52ID0gbWFrZV9lbnYgKClcbmxldCBfc3hfcmVuZGVyX21vZGUgPSByZWYgZmFsc2VcblxubGV0IGNhbGxfc3hfZm4gKGZuIDogdmFsdWUpIChhcmdzIDogdmFsdWUgbGlzdCkgOiB2YWx1ZSA9XG4gIFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgKGZuIDo6IGFyZ3MpKSAoRW52IGdsb2JhbF9lbnYpXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuKCogVmFsdWUgY29udmVyc2lvbjogT0NhbWwgPC0+IEpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG5cbigqKiBUYWcgYSBKUyBmdW5jdGlvbiB3aXRoIF9fc3hfaGFuZGxlIGFuZCBfdHlwZSBwcm9wZXJ0aWVzLiAqKVxubGV0IF90YWdfZm4gPSBKcy5VbnNhZmUucHVyZV9qc19leHByXG4gIFwiKGZ1bmN0aW9uKGZuLCBoYW5kbGUsIHR5cGUpIHsgZm4uX19zeF9oYW5kbGUgPSBoYW5kbGU7IGZuLl90eXBlID0gdHlwZTsgcmV0dXJuIGZuOyB9KVwiXG5cbmxldCByZWMgdmFsdWVfdG9fanMgKHYgOiB2YWx1ZSkgOiBKcy5VbnNhZmUuYW55ID1cbiAgbWF0Y2ggdiB3aXRoXG4gIHwgTmlsIC0+IEpzLlVuc2FmZS5pbmplY3QgSnMubnVsbFxuICB8IEJvb2wgYiAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIGIpXG4gIHwgTnVtYmVyIG4gLT4gSnMuVW5zYWZlLmluamVjdCAoSnMubnVtYmVyX29mX2Zsb2F0IG4pXG4gIHwgU3RyaW5nIHMgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIHMpXG4gIHwgUmF3SFRNTCBzIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyBzKVxuICB8IFN5bWJvbCBzIC0+XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuVW5zYWZlLm9iaiBbfFxuICAgICAgKFwiX3R5cGVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIFwic3ltYm9sXCIpKTtcbiAgICAgIChcIm5hbWVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIHMpKSB8XSlcbiAgfCBLZXl3b3JkIGsgLT5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5VbnNhZmUub2JqIFt8XG4gICAgICAoXCJfdHlwZVwiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgXCJrZXl3b3JkXCIpKTtcbiAgICAgIChcIm5hbWVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIGspKSB8XSlcbiAgfCBMaXN0IGl0ZW1zIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gaXRlbXMgfSAtPlxuICAgIGxldCBhcnIgPSBpdGVtcyB8PiBMaXN0Lm1hcCB2YWx1ZV90b19qcyB8PiBBcnJheS5vZl9saXN0IGluXG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuVW5zYWZlLm9iaiBbfFxuICAgICAgKFwiX3R5cGVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIFwibGlzdFwiKSk7XG4gICAgICAoXCJpdGVtc1wiLCBKcy5VbnNhZmUuaW5qZWN0IChKcy5hcnJheSBhcnIpKSB8XSlcbiAgfCBEaWN0IGQgLT5cbiAgICAoKiBDaGVjayBmb3IgX19ob3N0X2hhbmRsZSDigJQgcmV0dXJuIG9yaWdpbmFsIEpTIG9iamVjdCAqKVxuICAgIChtYXRjaCBIYXNodGJsLmZpbmRfb3B0IGQgXCJfX2hvc3RfaGFuZGxlXCIgd2l0aFxuICAgICB8IFNvbWUgKE51bWJlciBuKSAtPiBob3N0X2dldF9qcyAoaW50X29mX2Zsb2F0IG4pXG4gICAgIHwgXyAtPlxuICAgICAgIGxldCBvYmogPSBKcy5VbnNhZmUub2JqIFt8fF0gaW5cbiAgICAgICBKcy5VbnNhZmUuc2V0IG9iaiAoSnMuc3RyaW5nIFwiX3R5cGVcIikgKEpzLnN0cmluZyBcImRpY3RcIik7XG4gICAgICAgSGFzaHRibC5pdGVyIChmdW4gayB2IC0+XG4gICAgICAgICBKcy5VbnNhZmUuc2V0IG9iaiAoSnMuc3RyaW5nIGspICh2YWx1ZV90b19qcyB2KSkgZDtcbiAgICAgICBKcy5VbnNhZmUuaW5qZWN0IG9iailcbiAgKCogQ2FsbGFibGUgdmFsdWVzOiB3cmFwIGFzIEpTIGZ1bmN0aW9ucyB3aXRoIF9fc3hfaGFuZGxlICopXG4gIHwgTGFtYmRhIF8gfCBOYXRpdmVGbiBfIHwgQ29udGludWF0aW9uIF8gfCBWbUNsb3N1cmUgXyAtPlxuICAgIGxldCBoYW5kbGUgPSBhbGxvY19oYW5kbGUgdiBpblxuICAgIGxldCBpbm5lciA9IEpzLndyYXBfY2FsbGJhY2sgKGZ1biBhcmdzX2pzIC0+XG4gICAgICB0cnlcbiAgICAgICAgbGV0IGFyZyA9IGpzX3RvX3ZhbHVlIGFyZ3NfanMgaW5cbiAgICAgICAgbGV0IGFyZ3MgPSBtYXRjaCBhcmcgd2l0aCBOaWwgLT4gW10gfCBfIC0+IFthcmddIGluXG4gICAgICAgIGxldCByZXN1bHQgPSBjYWxsX3N4X2ZuIHYgYXJncyBpblxuICAgICAgICB2YWx1ZV90b19qcyByZXN1bHRcbiAgICAgIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICAgICAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsXG4gICAgICAgICAgKEpzLlVuc2FmZS5nZXQgSnMuVW5zYWZlLmdsb2JhbCAoSnMuc3RyaW5nIFwiY29uc29sZVwiKSlcbiAgICAgICAgICBcImVycm9yXCIgW3wgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIltzeF0gXCIgXiBtc2cpKSB8XSk7XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgSnMubnVsbCkgaW5cbiAgICBKcy5VbnNhZmUuZnVuX2NhbGwgX3RhZ19mbiBbfFxuICAgICAgSnMuVW5zYWZlLmluamVjdCBpbm5lcjtcbiAgICAgIEpzLlVuc2FmZS5pbmplY3QgaGFuZGxlO1xuICAgICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nICh0eXBlX29mIHYpKSB8XVxuICAoKiBOb24tY2FsbGFibGUgY29tcG91bmQ6IHRhZ2dlZCBvYmplY3Qgd2l0aCBoYW5kbGUgKilcbiAgfCBfIC0+XG4gICAgbGV0IGhhbmRsZSA9IGFsbG9jX2hhbmRsZSB2IGluXG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuVW5zYWZlLm9iaiBbfFxuICAgICAgKFwiX3R5cGVcIiwgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nICh0eXBlX29mIHYpKSk7XG4gICAgICAoXCJfX3N4X2hhbmRsZVwiLCBKcy5VbnNhZmUuaW5qZWN0IGhhbmRsZSkgfF0pXG5cbmFuZCBqc190b192YWx1ZSAoanMgOiBKcy5VbnNhZmUuYW55KSA6IHZhbHVlID1cbiAgaWYgSnMuVW5zYWZlLmVxdWFscyBqcyBKcy5udWxsIHx8IEpzLlVuc2FmZS5lcXVhbHMganMgSnMudW5kZWZpbmVkIHRoZW4gTmlsXG4gIGVsc2VcbiAgICBsZXQgdHkgPSBKcy50b19zdHJpbmcgKEpzLnR5cGVvZiBqcykgaW5cbiAgICBtYXRjaCB0eSB3aXRoXG4gICAgfCBcIm51bWJlclwiIC0+IE51bWJlciAoSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIGpzKSlcbiAgICB8IFwiYm9vbGVhblwiIC0+IEJvb2wgKEpzLnRvX2Jvb2wgKEpzLlVuc2FmZS5jb2VyY2UganMpKVxuICAgIHwgXCJzdHJpbmdcIiAtPiBTdHJpbmcgKEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmNvZXJjZSBqcykpXG4gICAgfCBcImZ1bmN0aW9uXCIgLT5cbiAgICAgIGxldCBoID0gSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwiX19zeF9oYW5kbGVcIikgaW5cbiAgICAgIGlmIG5vdCAoSnMuVW5zYWZlLmVxdWFscyBoIEpzLnVuZGVmaW5lZCkgdGhlblxuICAgICAgICBnZXRfaGFuZGxlIChKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UgaCkgfD4gaW50X29mX2Zsb2F0KVxuICAgICAgZWxzZVxuICAgICAgICAoKiBQbGFpbiBKUyBmdW5jdGlvbiDigJQgd3JhcCBhcyBOYXRpdmVGbiAqKVxuICAgICAgICBOYXRpdmVGbiAoXCJqcy1jYWxsYmFja1wiLCBmdW4gYXJncyAtPlxuICAgICAgICAgIGxldCBqc19hcmdzID0gYXJncyB8PiBMaXN0Lm1hcCB2YWx1ZV90b19qcyB8PiBBcnJheS5vZl9saXN0IGluXG4gICAgICAgICAganNfdG9fdmFsdWUgKEpzLlVuc2FmZS5mdW5fY2FsbCBqcyAoQXJyYXkubWFwIEZ1bi5pZCBqc19hcmdzKSkpXG4gICAgfCBcIm9iamVjdFwiIC0+XG4gICAgICBsZXQgaCA9IEpzLlVuc2FmZS5nZXQganMgKEpzLnN0cmluZyBcIl9fc3hfaGFuZGxlXCIpIGluXG4gICAgICBpZiBub3QgKEpzLlVuc2FmZS5lcXVhbHMgaCBKcy51bmRlZmluZWQpIHRoZW5cbiAgICAgICAgZ2V0X2hhbmRsZSAoSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIGgpIHw+IGludF9vZl9mbG9hdClcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IHR5cGVfZmllbGQgPSBKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJfdHlwZVwiKSBpblxuICAgICAgICBpZiBKcy5VbnNhZmUuZXF1YWxzIHR5cGVfZmllbGQgSnMudW5kZWZpbmVkIHRoZW4gYmVnaW5cbiAgICAgICAgICBpZiBKcy50b19ib29sIChKcy5VbnNhZmUuZ2xvYmFsIyMuX0FycmF5IyNpc0FycmF5IGpzKSB0aGVuIGJlZ2luXG4gICAgICAgICAgICBsZXQgbiA9IEpzLmZsb2F0X29mX251bWJlciAoSnMuVW5zYWZlLmNvZXJjZSAoSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwibGVuZ3RoXCIpKSkgfD4gaW50X29mX2Zsb2F0IGluXG4gICAgICAgICAgICBMaXN0IChMaXN0LmluaXQgbiAoZnVuIGkgLT5cbiAgICAgICAgICAgICAganNfdG9fdmFsdWUgKEpzLmFycmF5X2dldCAoSnMuVW5zYWZlLmNvZXJjZSBqcykgaSB8PiBKcy5PcHRkZWYudG9fb3B0aW9uIHw+IE9wdGlvbi5nZXQpKSlcbiAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgKCogT3BhcXVlIGhvc3Qgb2JqZWN0IOKAlCBzdG9yZSBpbiBKUy1zaWRlIHRhYmxlLCByZXR1cm4gRGljdCB3aXRoIF9faG9zdF9oYW5kbGUgKilcbiAgICAgICAgICAgIGxldCBpZCA9IGhvc3RfcHV0IGpzIGluXG4gICAgICAgICAgICBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDIgaW5cbiAgICAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBkIFwiX19ob3N0X2hhbmRsZVwiIChOdW1iZXIgKGZsb2F0X29mX2ludCBpZCkpO1xuICAgICAgICAgICAgRGljdCBkXG4gICAgICAgICAgZW5kXG4gICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgbGV0IHRhZyA9IEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmNvZXJjZSB0eXBlX2ZpZWxkKSBpblxuICAgICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgICAgfCBcInN5bWJvbFwiIC0+IFN5bWJvbCAoSnMudG9fc3RyaW5nIChKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgXCJuYW1lXCIpKSlcbiAgICAgICAgICB8IFwia2V5d29yZFwiIC0+IEtleXdvcmQgKEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwibmFtZVwiKSkpXG4gICAgICAgICAgfCBcImxpc3RcIiAtPlxuICAgICAgICAgICAgbGV0IGl0ZW1zX2pzID0gSnMuVW5zYWZlLmdldCBqcyAoSnMuc3RyaW5nIFwiaXRlbXNcIikgaW5cbiAgICAgICAgICAgIGxldCBuID0gSnMuZmxvYXRfb2ZfbnVtYmVyIChKcy5VbnNhZmUuY29lcmNlIChKcy5VbnNhZmUuZ2V0IGl0ZW1zX2pzIChKcy5zdHJpbmcgXCJsZW5ndGhcIikpKSB8PiBpbnRfb2ZfZmxvYXQgaW5cbiAgICAgICAgICAgIExpc3QgKExpc3QuaW5pdCBuIChmdW4gaSAtPlxuICAgICAgICAgICAgICBqc190b192YWx1ZSAoSnMuYXJyYXlfZ2V0IChKcy5VbnNhZmUuY29lcmNlIGl0ZW1zX2pzKSBpIHw+IEpzLk9wdGRlZi50b19vcHRpb24gfD4gT3B0aW9uLmdldCkpKVxuICAgICAgICAgIHwgXCJkaWN0XCIgLT5cbiAgICAgICAgICAgIGxldCBkID0gSGFzaHRibC5jcmVhdGUgOCBpblxuICAgICAgICAgICAgbGV0IGtleXMgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX09iamVjdCMja2V5cyBqcyBpblxuICAgICAgICAgICAgbGV0IGxlbiA9IGtleXMjIy5sZW5ndGggaW5cbiAgICAgICAgICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAgICAgICAgIGxldCBrID0gSnMudG9fc3RyaW5nIChKcy5hcnJheV9nZXQga2V5cyBpIHw+IEpzLk9wdGRlZi50b19vcHRpb24gfD4gT3B0aW9uLmdldCkgaW5cbiAgICAgICAgICAgICAgaWYgayA8PiBcIl90eXBlXCIgdGhlblxuICAgICAgICAgICAgICAgIEhhc2h0YmwucmVwbGFjZSBkIGsgKGpzX3RvX3ZhbHVlIChKcy5VbnNhZmUuZ2V0IGpzIChKcy5zdHJpbmcgaykpKVxuICAgICAgICAgICAgZG9uZTtcbiAgICAgICAgICAgIERpY3QgZFxuICAgICAgICAgIHwgXyAtPiBOaWxcbiAgICAgICAgZW5kXG4gICAgfCBfIC0+IE5pbFxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFNpZGUtY2hhbm5lbCByZXR1cm4gKGJ5cGFzc2VzIGpzX29mX29jYW1sIHN0cmlwcGluZyBwcm9wZXJ0aWVzKSAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgcmV0dXJuX3ZpYV9zaWRlX2NoYW5uZWwgKHYgOiBKcy5VbnNhZmUuYW55KSA6IEpzLlVuc2FmZS5hbnkgPVxuICBKcy5VbnNhZmUuc2V0IEpzLlVuc2FmZS5nbG9iYWwgKEpzLnN0cmluZyBcIl9fc3hSXCIpIHY7IHZcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBDb3JlIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0IGFwaV9wYXJzZSBzcmNfanMgPVxuICBsZXQgc3JjID0gSnMudG9fc3RyaW5nIHNyY19qcyBpblxuICB0cnlcbiAgICBsZXQgdmFsdWVzID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMgaW5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5hcnJheSAodmFsdWVzIHw+IExpc3QubWFwIHZhbHVlX3RvX2pzIHw+IEFycmF5Lm9mX2xpc3QpKVxuICB3aXRoIFBhcnNlX2Vycm9yIG1zZyAtPlxuICAgIEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJQYXJzZSBlcnJvcjogXCIgXiBtc2cpKVxuXG5sZXQgYXBpX2V2YWwgc3JjX2pzID1cbiAgbGV0IHNyYyA9IEpzLnRvX3N0cmluZyBzcmNfanMgaW5cbiAgdHJ5XG4gICAgbGV0IGV4cHJzID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMgaW5cbiAgICBsZXQgZW52ID0gRW52IGdsb2JhbF9lbnYgaW5cbiAgICBsZXQgcmVzdWx0ID0gTGlzdC5mb2xkX2xlZnQgKGZ1biBfYWNjIGV4cHIgLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGVudikgTmlsIGV4cHJzIGluXG4gICAgcmV0dXJuX3ZpYV9zaWRlX2NoYW5uZWwgKHZhbHVlX3RvX2pzIHJlc3VsdClcbiAgd2l0aFxuICB8IEV2YWxfZXJyb3IgbXNnIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJFcnJvcjogXCIgXiBtc2cpKVxuICB8IFBhcnNlX2Vycm9yIG1zZyAtPiBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiUGFyc2UgZXJyb3I6IFwiIF4gbXNnKSlcblxubGV0IGFwaV9ldmFsX2V4cHIgZXhwcl9qcyBfZW52X2pzID1cbiAgbGV0IGV4cHIgPSBqc190b192YWx1ZSBleHByX2pzIGluXG4gIHRyeVxuICAgIHJldHVybl92aWFfc2lkZV9jaGFubmVsICh2YWx1ZV90b19qcyAoU3hfcmVmLmV2YWxfZXhwciBleHByIChFbnYgZ2xvYmFsX2VudikpKVxuICB3aXRoIEV2YWxfZXJyb3IgbXNnIC0+XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIkVycm9yOiBcIiBeIG1zZykpXG5cbmxldCBhcGlfbG9hZCBzcmNfanMgPVxuICBsZXQgc3JjID0gSnMudG9fc3RyaW5nIHNyY19qcyBpblxuICB0cnlcbiAgICBsZXQgZXhwcnMgPSBTeF9wYXJzZXIucGFyc2VfYWxsIHNyYyBpblxuICAgIGxldCBlbnYgPSBFbnYgZ2xvYmFsX2VudiBpblxuICAgIGxldCBjb3VudCA9IHJlZiAwIGluXG4gICAgTGlzdC5pdGVyIChmdW4gZXhwciAtPiBpZ25vcmUgKFN4X3JlZi5ldmFsX2V4cHIgZXhwciBlbnYpOyBpbmNyIGNvdW50KSBleHBycztcbiAgICBKcy5VbnNhZmUuaW5qZWN0ICFjb3VudFxuICB3aXRoXG4gIHwgRXZhbF9lcnJvciBtc2cgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIChcIkVycm9yOiBcIiBeIG1zZykpXG4gIHwgUGFyc2VfZXJyb3IgbXNnIC0+IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJQYXJzZSBlcnJvcjogXCIgXiBtc2cpKVxuXG5sZXQgYXBpX3JlbmRlcl90b19odG1sIGV4cHJfanMgPVxuICBsZXQgZXhwciA9IGpzX3RvX3ZhbHVlIGV4cHJfanMgaW5cbiAgbGV0IHByZXYgPSAhX3N4X3JlbmRlcl9tb2RlIGluXG4gIF9zeF9yZW5kZXJfbW9kZSA6PSB0cnVlO1xuICAodHJ5XG4gICAgbGV0IGh0bWwgPSBTeF9yZW5kZXIucmVuZGVyX3RvX2h0bWwgZXhwciBnbG9iYWxfZW52IGluXG4gICAgX3N4X3JlbmRlcl9tb2RlIDo9IHByZXY7XG4gICAgSnMuVW5zYWZlLmluamVjdCAoSnMuc3RyaW5nIGh0bWwpXG4gIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICBfc3hfcmVuZGVyX21vZGUgOj0gcHJldjtcbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKFwiRXJyb3I6IFwiIF4gbXNnKSkpXG5cbmxldCBhcGlfc3RyaW5naWZ5IHZfanMgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKGluc3BlY3QgKGpzX3RvX3ZhbHVlIHZfanMpKSlcblxubGV0IGFwaV90eXBlX29mIHZfanMgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKHR5cGVfb2YgKGpzX3RvX3ZhbHVlIHZfanMpKSlcblxubGV0IGFwaV9pbnNwZWN0IHZfanMgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgKGluc3BlY3QgKGpzX3RvX3ZhbHVlIHZfanMpKSlcblxubGV0IGFwaV9lbmdpbmUgKCkgPVxuICBKcy5VbnNhZmUuaW5qZWN0IChKcy5zdHJpbmcgXCJvY2FtbC12bS13YXNtXCIpXG5cbmxldCBhcGlfcmVnaXN0ZXJfbmF0aXZlIG5hbWVfanMgY2FsbGJhY2tfanMgPVxuICBsZXQgbmFtZSA9IEpzLnRvX3N0cmluZyBuYW1lX2pzIGluXG4gIGxldCBuYXRpdmVfZm4gYXJncyA9XG4gICAgbGV0IGpzX2FyZ3MgPSBhcmdzIHw+IExpc3QubWFwIHZhbHVlX3RvX2pzIHw+IEFycmF5Lm9mX2xpc3QgaW5cbiAgICBqc190b192YWx1ZSAoSnMuVW5zYWZlLmZ1bl9jYWxsIGNhbGxiYWNrX2pzIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLmFycmF5IGpzX2FyZ3MpIHxdKVxuICBpblxuICBpZ25vcmUgKGVudl9iaW5kIGdsb2JhbF9lbnYgbmFtZSAoTmF0aXZlRm4gKG5hbWUsIG5hdGl2ZV9mbikpKTtcbiAgSnMuVW5zYWZlLmluamVjdCBKcy5udWxsXG5cbmxldCBhcGlfY2FsbF9mbiBmbl9qcyBhcmdzX2pzID1cbiAgdHJ5XG4gICAgbGV0IGZuID0ganNfdG9fdmFsdWUgZm5fanMgaW5cbiAgICBsZXQgYXJncyA9IEFycmF5LnRvX2xpc3QgKEFycmF5Lm1hcCBqc190b192YWx1ZSAoSnMudG9fYXJyYXkgKEpzLlVuc2FmZS5jb2VyY2UgYXJnc19qcykpKSBpblxuICAgIHJldHVybl92aWFfc2lkZV9jaGFubmVsICh2YWx1ZV90b19qcyAoY2FsbF9zeF9mbiBmbiBhcmdzKSlcbiAgd2l0aFxuICB8IEV2YWxfZXJyb3IgbXNnIC0+XG4gICAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsXG4gICAgICAoSnMuVW5zYWZlLmdldCBKcy5VbnNhZmUuZ2xvYmFsIChKcy5zdHJpbmcgXCJjb25zb2xlXCIpKVxuICAgICAgXCJlcnJvclwiIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJbc3hdIGNhbGxGbjogXCIgXiBtc2cpKSB8XSk7XG4gICAgSnMuVW5zYWZlLmluamVjdCBKcy5udWxsXG4gIHwgZXhuIC0+XG4gICAgaWdub3JlIChKcy5VbnNhZmUubWV0aF9jYWxsXG4gICAgICAoSnMuVW5zYWZlLmdldCBKcy5VbnNhZmUuZ2xvYmFsIChKcy5zdHJpbmcgXCJjb25zb2xlXCIpKVxuICAgICAgXCJlcnJvclwiIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLnN0cmluZyAoXCJbc3hdIGNhbGxGbjogXCIgXiBQcmludGV4Yy50b19zdHJpbmcgZXhuKSkgfF0pO1xuICAgIEpzLlVuc2FmZS5pbmplY3QgSnMubnVsbFxuXG5sZXQgYXBpX2lzX2NhbGxhYmxlIGZuX2pzID1cbiAgaWYgSnMuVW5zYWZlLmVxdWFscyBmbl9qcyBKcy5udWxsIHx8IEpzLlVuc2FmZS5lcXVhbHMgZm5fanMgSnMudW5kZWZpbmVkIHRoZW5cbiAgICBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIGZhbHNlKVxuICBlbHNlXG4gICAgbGV0IGggPSBKcy5VbnNhZmUuZ2V0IGZuX2pzIChKcy5zdHJpbmcgXCJfX3N4X2hhbmRsZVwiKSBpblxuICAgIGlmIEpzLlVuc2FmZS5lcXVhbHMgaCBKcy51bmRlZmluZWQgdGhlbiBKcy5VbnNhZmUuaW5qZWN0IChKcy5ib29sIGZhbHNlKVxuICAgIGVsc2UgSnMuVW5zYWZlLmluamVjdCAoSnMuYm9vbCAoaXNfY2FsbGFibGUgKGdldF9oYW5kbGUgKEpzLmZsb2F0X29mX251bWJlciAoSnMuVW5zYWZlLmNvZXJjZSBoKSB8PiBpbnRfb2ZfZmxvYXQpKSkpXG5cbmxldCBhcGlfZm5fYXJpdHkgZm5fanMgPVxuICBsZXQgaCA9IEpzLlVuc2FmZS5nZXQgZm5fanMgKEpzLnN0cmluZyBcIl9fc3hfaGFuZGxlXCIpIGluXG4gIGlmIEpzLlVuc2FmZS5lcXVhbHMgaCBKcy51bmRlZmluZWQgdGhlbiBKcy5VbnNhZmUuaW5qZWN0IChKcy5udW1iZXJfb2ZfZmxvYXQgKC0xLjApKVxuICBlbHNlXG4gICAgbGV0IHYgPSBnZXRfaGFuZGxlIChKcy5mbG9hdF9vZl9udW1iZXIgKEpzLlVuc2FmZS5jb2VyY2UgaCkgfD4gaW50X29mX2Zsb2F0KSBpblxuICAgIG1hdGNoIHYgd2l0aFxuICAgIHwgTGFtYmRhIGwgLT4gSnMuVW5zYWZlLmluamVjdCAoSnMubnVtYmVyX29mX2Zsb2F0IChmbG9hdF9vZl9pbnQgKExpc3QubGVuZ3RoIGwubF9wYXJhbXMpKSlcbiAgICB8IF8gLT4gSnMuVW5zYWZlLmluamVjdCAoSnMubnVtYmVyX29mX2Zsb2F0ICgtMS4wKSlcblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICopXG4oKiBQbGF0Zm9ybSBiaW5kaW5ncyAocmVnaXN0ZXJlZCBpbiBnbG9iYWwgZW52KSAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcblxubGV0ICgpID1cbiAgbGV0IGJpbmQgbmFtZSBmbiA9IGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBuYW1lIChOYXRpdmVGbiAobmFtZSwgZm4pKSkgaW5cblxuICAoKiAtLS0gRXZhbHVhdGlvbiAtLS0gKilcbiAgYmluZCBcImNlay1ldmFsXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNdIC0+IGxldCBlID0gU3hfcGFyc2VyLnBhcnNlX2FsbCBzIGluIChtYXRjaCBlIHdpdGggaCA6OiBfIC0+IFN4X3JlZi5ldmFsX2V4cHIgaCAoRW52IGdsb2JhbF9lbnYpIHwgW10gLT4gTmlsKVxuICAgIHwgW2V4cHJdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBbZXhwcjsgZW52X3ZhbF0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGVudl92YWxcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstZXZhbDogZXhwZWN0ZWQgMS0yIGFyZ3NcIikpO1xuXG4gIGJpbmQgXCJldmFsLWV4cHItY2VrXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZXhwcjsgZV0gLT4gU3hfcmVmLmV2YWxfZXhwciBleHByIGVcbiAgICB8IFtleHByXSAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImV2YWwtZXhwci1jZWs6IGV4cGVjdGVkIDEtMiBhcmdzXCIpKTtcblxuICBiaW5kIFwiY2VrLWNhbGxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFtmOyBOaWxdIC0+IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2ZdKSAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBbZjsgTGlzdCBhbF0gLT4gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoZiA6OiBhbCkpIChFbnYgZ2xvYmFsX2VudilcbiAgICB8IFtmOyBhXSAtPiBTeF9yZWYuZXZhbF9leHByIChMaXN0IFtmOyBhXSkgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgW2ZdIC0+IFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2ZdKSAoRW52IGdsb2JhbF9lbnYpXG4gICAgfCBmIDo6IHJlc3QgLT4gU3hfcmVmLmV2YWxfZXhwciAoTGlzdCAoZiA6OiByZXN0KSkgKEVudiBnbG9iYWxfZW52KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlay1jYWxsOiBleHBlY3RlZCBmdW5jdGlvbiBhbmQgYXJnc1wiKSk7XG5cbiAgYmluZCBcInN4LXBhcnNlXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbU3RyaW5nIHNyY10gLT4gTGlzdCAoU3hfcGFyc2VyLnBhcnNlX2FsbCBzcmMpXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3gtcGFyc2U6IGV4cGVjdGVkIHN0cmluZ1wiKSk7XG5cbiAgYmluZCBcInN4LXNlcmlhbGl6ZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW3ZdIC0+IFN0cmluZyAoaW5zcGVjdCB2KVxuICAgIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN4LXNlcmlhbGl6ZTogZXhwZWN0ZWQgMSBhcmdcIikpO1xuXG4gICgqIC0tLSBBc3NlcnRpb25zICYgZXF1YWxpdHkgLS0tICopXG4gIGxldCByZWMgZGVlcF9lcXVhbCBhIGIgPVxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgTmlsLCBOaWwgLT4gdHJ1ZSB8IEJvb2wgYSwgQm9vbCBiIC0+IGEgPSBiXG4gICAgfCBOdW1iZXIgYSwgTnVtYmVyIGIgLT4gYSA9IGIgfCBTdHJpbmcgYSwgU3RyaW5nIGIgLT4gYSA9IGJcbiAgICB8IFN5bWJvbCBhLCBTeW1ib2wgYiAtPiBhID0gYiB8IEtleXdvcmQgYSwgS2V5d29yZCBiIC0+IGEgPSBiXG4gICAgfCAoTGlzdCBhIHwgTGlzdFJlZiB7IGNvbnRlbnRzID0gYSB9KSwgKExpc3QgYiB8IExpc3RSZWYgeyBjb250ZW50cyA9IGIgfSkgLT5cbiAgICAgIExpc3QubGVuZ3RoIGEgPSBMaXN0Lmxlbmd0aCBiICYmIExpc3QuZm9yX2FsbDIgZGVlcF9lcXVhbCBhIGJcbiAgICB8IERpY3QgYSwgRGljdCBiIC0+XG4gICAgICBsZXQga2EgPSBIYXNodGJsLmZvbGQgKGZ1biBrIF8gYWNjIC0+IGsgOjogYWNjKSBhIFtdIGluXG4gICAgICBsZXQga2IgPSBIYXNodGJsLmZvbGQgKGZ1biBrIF8gYWNjIC0+IGsgOjogYWNjKSBiIFtdIGluXG4gICAgICBMaXN0Lmxlbmd0aCBrYSA9IExpc3QubGVuZ3RoIGtiICYmXG4gICAgICBMaXN0LmZvcl9hbGwgKGZ1biBrIC0+IEhhc2h0YmwubWVtIGIgayAmJlxuICAgICAgICBkZWVwX2VxdWFsIChIYXNodGJsLmZpbmQgYSBrKSAoSGFzaHRibC5maW5kIGIgaykpIGthXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGJpbmQgXCJlcXVhbD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFthOyBiXSAtPiBCb29sIChkZWVwX2VxdWFsIGEgYikgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZXF1YWw/OiAyIGFyZ3NcIikpO1xuICBiaW5kIFwiYXNzZXJ0XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbY29uZF0gLT4gaWYgbm90IChzeF90cnV0aHkgY29uZCkgdGhlbiByYWlzZSAoRXZhbF9lcnJvciBcIkFzc2VydGlvbiBmYWlsZWRcIik7IEJvb2wgdHJ1ZVxuICAgIHwgW2NvbmQ7IG1zZ10gLT4gaWYgbm90IChzeF90cnV0aHkgY29uZCkgdGhlbiByYWlzZSAoRXZhbF9lcnJvciAoXCJBc3NlcnRpb246IFwiIF4gdmFsdWVfdG9fc3RyaW5nIG1zZykpOyBCb29sIHRydWVcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJhc3NlcnQ6IDEtMiBhcmdzXCIpKTtcblxuICBiaW5kIFwidHJ5LWNhbGxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFt0aHVua10gLT5cbiAgICAgICh0cnkgaWdub3JlIChTeF9yZWYuZXZhbF9leHByIChMaXN0IFt0aHVua10pIChFbnYgZ2xvYmFsX2VudikpO1xuICAgICAgICBsZXQgZCA9IEhhc2h0YmwuY3JlYXRlIDIgaW4gSGFzaHRibC5yZXBsYWNlIGQgXCJva1wiIChCb29sIHRydWUpOyBEaWN0IGRcbiAgICAgIHdpdGggRXZhbF9lcnJvciBtc2cgLT5cbiAgICAgICAgbGV0IGQgPSBIYXNodGJsLmNyZWF0ZSAyIGluIEhhc2h0YmwucmVwbGFjZSBkIFwib2tcIiAoQm9vbCBmYWxzZSk7IEhhc2h0YmwucmVwbGFjZSBkIFwiZXJyb3JcIiAoU3RyaW5nIG1zZyk7IERpY3QgZClcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJ0cnktY2FsbDogMSBhcmdcIikpO1xuXG4gICgqIC0tLSBMaXN0IG11dGF0aW9uIC0tLSAqKVxuICBiaW5kIFwiYXBwZW5kIVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW0xpc3RSZWYgcjsgdl0gLT4gciA6PSAhciBAIFt2XTsgTGlzdFJlZiByXG4gICAgfCBbTGlzdCBpdGVtczsgdl0gLT4gTGlzdCAoaXRlbXMgQCBbdl0pXG4gICAgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiYXBwZW5kITogbGlzdCBhbmQgdmFsdWVcIikpO1xuXG4gICgqIC0tLSBFbnZpcm9ubWVudCBvcHMgLS0tICopXG4gICgqIFVzZSB1bndyYXBfZW52IGZvciBuaWwvZGljdCB0b2xlcmFuY2UsIG1hdGNoaW5nIHRoZSBzZXJ2ZXIga2VybmVsICopXG4gIGxldCB1dyA9IFN4X3J1bnRpbWUudW53cmFwX2VudiBpblxuICBiaW5kIFwibWFrZS1lbnZcIiAoZnVuIF8gLT4gRW52IChtYWtlX2VudiAoKSkpO1xuICBiaW5kIFwiZ2xvYmFsLWVudlwiIChmdW4gXyAtPiBFbnYgZ2xvYmFsX2Vudik7XG4gIGJpbmQgXCJlbnYtaGFzP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2U7IFN0cmluZyBrXSB8IFtlOyBLZXl3b3JkIGtdIC0+IEJvb2wgKGVudl9oYXMgKHV3IGUpIGspIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1oYXM/XCIpKTtcbiAgYmluZCBcImVudi1nZXRcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtlOyBTdHJpbmcga10gfCBbZTsgS2V5d29yZCBrXSAtPiBlbnZfZ2V0ICh1dyBlKSBrIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1nZXRcIikpO1xuICBiaW5kIFwiZW52LWJpbmQhXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbZTsgU3RyaW5nIGs7IHZdIHwgW2U7IEtleXdvcmQgazsgdl0gLT4gZW52X2JpbmQgKHV3IGUpIGsgdiB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJlbnYtYmluZCFcIikpO1xuICBiaW5kIFwiZW52LXNldCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtlOyBTdHJpbmcgazsgdl0gfCBbZTsgS2V5d29yZCBrOyB2XSAtPiBlbnZfc2V0ICh1dyBlKSBrIHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZW52LXNldCFcIikpO1xuICBiaW5kIFwiZW52LWV4dGVuZFwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2VdIC0+IEVudiAoZW52X2V4dGVuZCAodXcgZSkpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1leHRlbmRcIikpO1xuICBiaW5kIFwiZW52LW1lcmdlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbYTsgYl0gLT4gU3hfcnVudGltZS5lbnZfbWVyZ2UgYSBiIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImVudi1tZXJnZVwiKSk7XG5cbiAgKCogLS0tIFR5cGUgY29uc3RydWN0b3JzIC0tLSAqKVxuICBiaW5kIFwibWFrZS1zeW1ib2xcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTdHJpbmcgc10gLT4gU3ltYm9sIHMgfCBbdl0gLT4gU3ltYm9sICh2YWx1ZV90b19zdHJpbmcgdikgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwibWFrZS1zeW1ib2xcIikpO1xuICBiaW5kIFwibWFrZS1rZXl3b3JkXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+IEtleXdvcmQgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLWtleXdvcmRcIikpO1xuICBiaW5kIFwia2V5d29yZC1uYW1lXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbS2V5d29yZCBrXSAtPiBTdHJpbmcgayB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJrZXl3b3JkLW5hbWVcIikpO1xuICBiaW5kIFwic3ltYm9sLW5hbWVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTeW1ib2wgc10gLT4gU3RyaW5nIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwic3ltYm9sLW5hbWVcIikpO1xuXG4gICgqIC0tLSBDb21wb25lbnQvSXNsYW5kIGFjY2Vzc29ycyAobXVzdCBoYW5kbGUgYm90aCB0eXBlcykgLS0tICopXG4gIGJpbmQgXCJjb21wb25lbnQtbmFtZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQ29tcG9uZW50IGNdIC0+IFN0cmluZyBjLmNfbmFtZSB8IFtJc2xhbmQgaV0gLT4gU3RyaW5nIGkuaV9uYW1lIHwgXyAtPiBTdHJpbmcgXCJcIik7XG4gIGJpbmQgXCJjb21wb25lbnQtY2xvc3VyZVwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aCBbQ29tcG9uZW50IGNdIC0+IEVudiBjLmNfY2xvc3VyZSB8IFtJc2xhbmQgaV0gLT4gRW52IGkuaV9jbG9zdXJlIHwgXyAtPiBEaWN0IChIYXNodGJsLmNyZWF0ZSAwKSk7XG4gIGJpbmQgXCJjb21wb25lbnQtcGFyYW1zXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbQ29tcG9uZW50IGNdIC0+IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgYy5jX3BhcmFtcylcbiAgICB8IFtJc2xhbmQgaV0gLT4gTGlzdCAoTGlzdC5tYXAgKGZ1biBzIC0+IFN0cmluZyBzKSBpLmlfcGFyYW1zKVxuICAgIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwiY29tcG9uZW50LWJvZHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW0NvbXBvbmVudCBjXSAtPiBjLmNfYm9keSB8IFtJc2xhbmQgaV0gLT4gaS5pX2JvZHkgfCBfIC0+IE5pbCk7XG4gIGxldCBoYXNfY2hpbGRyZW5faW1wbCA9IE5hdGl2ZUZuIChcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIsIGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgY10gLT4gQm9vbCBjLmNfaGFzX2NoaWxkcmVuIHwgW0lzbGFuZCBpXSAtPiBCb29sIGkuaV9oYXNfY2hpbGRyZW4gfCBfIC0+IEJvb2wgZmFsc2UpIGluXG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW5cIiBoYXNfY2hpbGRyZW5faW1wbCk7XG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcImNvbXBvbmVudC1oYXMtY2hpbGRyZW4/XCIgaGFzX2NoaWxkcmVuX2ltcGwpO1xuICBiaW5kIFwiY29tcG9uZW50LWFmZmluaXR5XCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgY10gLT4gU3RyaW5nIGMuY19hZmZpbml0eSB8IFtJc2xhbmQgX10gLT4gU3RyaW5nIFwiY2xpZW50XCIgfCBfIC0+IFN0cmluZyBcImF1dG9cIik7XG4gIGJpbmQgXCJjb21wb25lbnQtcGFyYW0tdHlwZXNcIiAoZnVuIF8gLT4gTmlsKTtcbiAgYmluZCBcImNvbXBvbmVudC1zZXQtcGFyYW0tdHlwZXMhXCIgKGZ1biBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIENFSyBzdGVwcGluZyAtLS0gKilcbiAgYmluZCBcIm1ha2UtY2VrLXN0YXRlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbYzsgZTsga10gLT4gU3hfcmVmLm1ha2VfY2VrX3N0YXRlIGMgZSBrIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcIm1ha2UtY2VrLXN0YXRlXCIpKTtcbiAgYmluZCBcImNlay1zdGVwXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbc10gLT4gU3hfcmVmLmNla19zdGVwIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLXN0ZXBcIikpO1xuICBiaW5kIFwiY2VrLXBoYXNlXCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbc10gLT4gU3hfcmVmLmNla19waGFzZSBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImNlay1waGFzZVwiKSk7XG4gIGJpbmQgXCJjZWstdmFsdWVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX3ZhbHVlIHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLXZhbHVlXCIpKTtcbiAgYmluZCBcImNlay10ZXJtaW5hbD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtzXSAtPiBTeF9yZWYuY2VrX3Rlcm1pbmFsX3AgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjZWstdGVybWluYWw/XCIpKTtcbiAgYmluZCBcImNlay1rb250XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbc10gLT4gU3hfcmVmLmNla19rb250IHMgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLWtvbnRcIikpO1xuICBiaW5kIFwiZnJhbWUtdHlwZVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW2ZdIC0+IFN4X3JlZi5mcmFtZV90eXBlIGYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiZnJhbWUtdHlwZVwiKSk7XG5cbiAgKCogLS0tIFN0cmljdCBtb2RlIC0tLSAqKVxuICBpZ25vcmUgKGVudl9iaW5kIGdsb2JhbF9lbnYgXCIqc3RyaWN0KlwiIChCb29sIGZhbHNlKSk7XG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIipwcmltLXBhcmFtLXR5cGVzKlwiIE5pbCk7XG4gIGJpbmQgXCJzZXQtc3RyaWN0IVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+IFN4X3JlZi5fc3RyaWN0X3JlZiA6PSB2OyBpZ25vcmUgKGVudl9zZXQgZ2xvYmFsX2VudiBcIipzdHJpY3QqXCIgdik7IE5pbCB8IF8gLT4gTmlsKTtcbiAgYmluZCBcInNldC1wcmltLXBhcmFtLXR5cGVzIVwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+IFN4X3JlZi5fcHJpbV9wYXJhbV90eXBlc19yZWYgOj0gdjsgaWdub3JlIChlbnZfc2V0IGdsb2JhbF9lbnYgXCIqcHJpbS1wYXJhbS10eXBlcypcIiB2KTsgTmlsIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwidmFsdWUtbWF0Y2hlcy10eXBlP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3Y7IHRdIC0+IFN4X3JlZi52YWx1ZV9tYXRjaGVzX3R5cGVfcCB2IHQgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIEFwcGx5IC0tLSAqKVxuICBiaW5kIFwiYXBwbHlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IGYgOjogcmVzdCAtPlxuICAgICAgbGV0IGFsbF9hcmdzID0gbWF0Y2ggTGlzdC5yZXYgcmVzdCB3aXRoIExpc3QgbGFzdCA6OiBwcmVmaXggLT4gTGlzdC5yZXYgcHJlZml4IEAgbGFzdCB8IF8gLT4gcmVzdCBpblxuICAgICAgU3hfcnVudGltZS5zeF9jYWxsIGYgYWxsX2FyZ3NcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJhcHBseVwiKSk7XG5cbiAgKCogLS0tIFNjb3BlIHN0YWNrIC0tLSAqKVxuICAoKiBTY29wZSBwcmltaXRpdmVzIChzY29wZS1wdXNoISwgc2NvcGUtcG9wISwgY29udGV4dCwgY29sbGVjdCEsIGNvbGxlY3RlZCxcbiAgICAgZW1pdCEsIGVtaXR0ZWQsIHNjb3BlLWVtaXQhLCBzY29wZS1lbWl0dGVkLCBldGMuKSBhcmUgcmVnaXN0ZXJlZCBieVxuICAgICBTeF9zY29wZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gaW4gdGhlIHByaW1pdGl2ZXMgdGFibGUuXG4gICAgIFRoZSBDRUsgZXZhbHVhdG9yIGZhbGxzIHRocm91Z2ggdG8gdGhlIHByaW1pdGl2ZXMgdGFibGUgd2hlbiBhIHN5bWJvbFxuICAgICBpc24ndCBpbiB0aGUgZW52LCBzbyB0aGVzZSB3b3JrIGF1dG9tYXRpY2FsbHkuXG4gICAgIE9ubHkgcHJvdmlkZS1wdXNoIS9wcm92aWRlLXBvcCEgbmVlZCBleHBsaWNpdCBlbnYgYmluZGluZ3MgYXMgYWxpYXNlcy4gKilcbiAgYmluZCBcInByb3ZpZGUtcHVzaCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtuOyB2XSAtPiBTeF9ydW50aW1lLnByb3ZpZGVfcHVzaCBuIHYgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicHJvdmlkZS1wdXNoIVwiKSk7XG4gIGJpbmQgXCJwcm92aWRlLXBvcCFcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtuXSAtPiBTeF9ydW50aW1lLnByb3ZpZGVfcG9wIG4gfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwicHJvdmlkZS1wb3AhXCIpKTtcblxuICAoKiAtLS0gRnJhZ21lbnQgLyByYXcgSFRNTCAtLS0gKilcbiAgYmluZCBcIjw+XCIgKGZ1biBhcmdzIC0+XG4gICAgUmF3SFRNTCAoU3RyaW5nLmNvbmNhdCBcIlwiIChMaXN0Lm1hcCAoZnVuIGEgLT5cbiAgICAgIG1hdGNoIGEgd2l0aCBTdHJpbmcgcyB8IFJhd0hUTUwgcyAtPiBzIHwgTmlsIC0+IFwiXCJcbiAgICAgIHwgTGlzdCBfIC0+IFN4X3JlbmRlci5yZW5kZXJfdG9faHRtbCBhIGdsb2JhbF9lbnZcbiAgICAgIHwgXyAtPiB2YWx1ZV90b19zdHJpbmcgYSkgYXJncykpKTtcbiAgYmluZCBcInJhdyFcIiAoZnVuIGFyZ3MgLT5cbiAgICBSYXdIVE1MIChTdHJpbmcuY29uY2F0IFwiXCIgKExpc3QubWFwIChmdW4gYSAtPlxuICAgICAgbWF0Y2ggYSB3aXRoIFN0cmluZyBzIHwgUmF3SFRNTCBzIC0+IHMgfCBfIC0+IHZhbHVlX3RvX3N0cmluZyBhKSBhcmdzKSkpO1xuXG4gIGJpbmQgXCJkZWZpbmUtcGFnZS1oZWxwZXJcIiAoZnVuIF8gLT4gTmlsKTtcblxuICAoKiAtLS0gUmVuZGVyIC0tLSAqKVxuICBTeF9yZW5kZXIuc2V0dXBfcmVuZGVyX2VudiBnbG9iYWxfZW52O1xuICBiaW5kIFwic2V0LXJlbmRlci1hY3RpdmUhXCIgKGZ1biBfIC0+IE5pbCk7XG4gIGJpbmQgXCJyZW5kZXItYWN0aXZlP1wiIChmdW4gXyAtPiBCb29sIHRydWUpO1xuICBiaW5kIFwiaXMtaHRtbC10YWc/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbU3RyaW5nIHNdIC0+IEJvb2wgKFN4X3JlbmRlci5pc19odG1sX3RhZyBzKSB8IF8gLT4gQm9vbCBmYWxzZSk7XG5cbiAgKCogLS0tIFJlbmRlciBjb25zdGFudHMgbmVlZGVkIGJ5IHdlYiBhZGFwdGVycyAtLS0gKilcbiAgbGV0IGh0bWxfdGFncyA9IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgU3hfcmVuZGVyLmh0bWxfdGFncykgaW5cbiAgbGV0IHZvaWRfZWxlbWVudHMgPSBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIFN4X3JlbmRlci52b2lkX2VsZW1lbnRzKSBpblxuICBsZXQgYm9vbGVhbl9hdHRycyA9IExpc3QgKExpc3QubWFwIChmdW4gcyAtPiBTdHJpbmcgcykgU3hfcmVuZGVyLmJvb2xlYW5fYXR0cnMpIGluXG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIkhUTUxfVEFHU1wiIGh0bWxfdGFncyk7XG4gIGlnbm9yZSAoZW52X2JpbmQgZ2xvYmFsX2VudiBcIlZPSURfRUxFTUVOVFNcIiB2b2lkX2VsZW1lbnRzKTtcbiAgaWdub3JlIChlbnZfYmluZCBnbG9iYWxfZW52IFwiQk9PTEVBTl9BVFRSU1wiIGJvb2xlYW5fYXR0cnMpO1xuXG4gICgqIC0tLSBFcnJvciBoYW5kbGluZyAtLS0gKilcbiAgYmluZCBcImNlay10cnlcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IFt0aHVuazsgaGFuZGxlcl0gLT5cbiAgICAgICh0cnkgU3hfcmVmLmNla19jYWxsIHRodW5rIE5pbFxuICAgICAgIHdpdGggRXZhbF9lcnJvciBtc2cgLT4gU3hfcmVmLmNla19jYWxsIGhhbmRsZXIgKExpc3QgW1N0cmluZyBtc2ddKSlcbiAgICB8IFt0aHVua10gLT5cbiAgICAgICh0cnkgbGV0IHIgPSBTeF9yZWYuY2VrX2NhbGwgdGh1bmsgTmlsIGluXG4gICAgICAgIExpc3QgW1N5bWJvbCBcIm9rXCI7IHJdXG4gICAgICAgd2l0aCBFdmFsX2Vycm9yIG1zZyAtPiBMaXN0IFtTeW1ib2wgXCJlcnJvclwiOyBTdHJpbmcgbXNnXSlcbiAgICB8IF8gLT4gTmlsKTtcblxuICAoKiAtLS0gRXZhbHVhdG9yIGJyaWRnZSBmdW5jdGlvbnMgbmVlZGVkIGJ5IHNwZWMgLnN4IGZpbGVzIC0tLSAqKVxuICBiaW5kIFwiZXZhbC1leHByXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtleHByOyBlXSAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgZSB8IFtleHByXSAtPiBTeF9yZWYuZXZhbF9leHByIGV4cHIgKEVudiBnbG9iYWxfZW52KSB8IF8gLT4gTmlsKTtcbiAgYmluZCBcInRyYW1wb2xpbmVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFt2XSAtPiAhU3hfcHJpbWl0aXZlcy5fc3hfdHJhbXBvbGluZV9mbiB2IHwgXyAtPiBOaWwpO1xuICBiaW5kIFwiZXhwYW5kLW1hY3JvXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFttYWM7IHJhdzsgRW52IGVdIC0+IFN4X3JlZi5leHBhbmRfbWFjcm8gbWFjIHJhdyAoRW52IGUpIHwgW21hYzsgcmF3XSAtPiBTeF9yZWYuZXhwYW5kX21hY3JvIG1hYyByYXcgKEVudiBnbG9iYWxfZW52KSB8IF8gLT4gTmlsKTtcbiAgYmluZCBcImNhbGwtbGFtYmRhXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBbZm5fdmFsOyBjYWxsX2FyZ3M7IEVudiBfZV0gLT4gU3hfcmVmLmNla19jYWxsIGZuX3ZhbCBjYWxsX2FyZ3NcbiAgICB8IFtmbl92YWw7IGNhbGxfYXJnc10gLT4gU3hfcmVmLmNla19jYWxsIGZuX3ZhbCBjYWxsX2FyZ3NcbiAgICB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJjYWxsLWxhbWJkYTogZXhwZWN0ZWQgKGZuIGFyZ3MgZW52PylcIikpO1xuICBiaW5kIFwiY2VrLWNhbGxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2Y7IGFdIC0+IFN4X3JlZi5jZWtfY2FsbCBmIGEgfCBfIC0+IHJhaXNlIChFdmFsX2Vycm9yIFwiY2VrLWNhbGxcIikpO1xuICBiaW5kIFwiY2VrLWV2YWxcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW2V4cHJdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciAoRW52IGdsb2JhbF9lbnYpIHwgW2V4cHI7IGVdIC0+IFN4X3JlZi5ldmFsX2V4cHIgZXhwciBlIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwicXEtZXhwYW5kLXJ1bnRpbWVcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW3RlbXBsYXRlXSAtPiBTeF9yZWYucXFfZXhwYW5kIHRlbXBsYXRlIChFbnYgZ2xvYmFsX2VudikgfCBbdGVtcGxhdGU7IEVudiBlXSAtPiBTeF9yZWYucXFfZXhwYW5kIHRlbXBsYXRlIChFbnYgZSkgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIFR5cGUgcHJlZGljYXRlcyBuZWVkZWQgYnkgYWRhcHRlcnMgLS0tICopXG4gIGJpbmQgXCJ0aHVuaz9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtUaHVuayBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwidGh1bmstZXhwclwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+IHRodW5rX2V4cHIgdiB8IF8gLT4gTmlsKTtcbiAgYmluZCBcInRodW5rLWVudlwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW3ZdIC0+IHRodW5rX2VudiB2IHwgXyAtPiBOaWwpO1xuICBiaW5kIFwibGFtYmRhP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwibWFjcm8/XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbTWFjcm8gX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgYmluZCBcImlzbGFuZD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtJc2xhbmQgX10gLT4gQm9vbCB0cnVlIHwgXyAtPiBCb29sIGZhbHNlKTtcbiAgYmluZCBcImNvbXBvbmVudD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtDb21wb25lbnQgX10gfCBbSXNsYW5kIF9dIC0+IEJvb2wgdHJ1ZSB8IF8gLT4gQm9vbCBmYWxzZSk7XG4gIGJpbmQgXCJjYWxsYWJsZT9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtOYXRpdmVGbiBfXSB8IFtMYW1iZGEgX10gfCBbQ29tcG9uZW50IF9dIHwgW0lzbGFuZCBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwic3ByZWFkP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1NwcmVhZCBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwiY29udGludWF0aW9uP1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0NvbnRpbnVhdGlvbiBfXSAtPiBCb29sIHRydWUgfCBfIC0+IEJvb2wgZmFsc2UpO1xuICBiaW5kIFwibGFtYmRhLXBhcmFtc1wiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW0xhbWJkYSBsXSAtPiBMaXN0IChMaXN0Lm1hcCAoZnVuIHMgLT4gU3RyaW5nIHMpIGwubF9wYXJhbXMpIHwgXyAtPiBMaXN0IFtdKTtcbiAgYmluZCBcImxhbWJkYS1ib2R5XCIgKGZ1biBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aCBbTGFtYmRhIGxdIC0+IGwubF9ib2R5IHwgXyAtPiBOaWwpO1xuICBiaW5kIFwibGFtYmRhLWNsb3N1cmVcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtMYW1iZGEgbF0gLT4gRW52IGwubF9jbG9zdXJlIHwgXyAtPiBEaWN0IChIYXNodGJsLmNyZWF0ZSAwKSk7XG5cbiAgKCogLS0tIENvcmUgb3BlcmF0aW9ucyBuZWVkZWQgYnkgYWRhcHRlcnMgLS0tICopXG4gIGJpbmQgXCJzcHJlYWQtYXR0cnNcIiAoZnVuIGFyZ3MgLT5cbiAgICBtYXRjaCBhcmdzIHdpdGggW1NwcmVhZCBwYWlyc10gLT4gbGV0IGQgPSBIYXNodGJsLmNyZWF0ZSA0IGluIExpc3QuaXRlciAoZnVuIChrLCB2KSAtPiBIYXNodGJsLnJlcGxhY2UgZCBrIHYpIHBhaXJzOyBEaWN0IGQgfCBfIC0+IERpY3QgKEhhc2h0YmwuY3JlYXRlIDApKTtcbiAgYmluZCBcIm1ha2Utc3ByZWFkXCIgKGZ1biBhcmdzIC0+XG4gICAgbWF0Y2ggYXJncyB3aXRoIFtEaWN0IGRdIC0+IFNwcmVhZCAoSGFzaHRibC5mb2xkIChmdW4gayB2IGFjYyAtPiAoaywgdikgOjogYWNjKSBkIFtdKSB8IF8gLT4gTmlsKTtcbiAgYmluZCBcIm1ha2UtcmF3LWh0bWxcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTdHJpbmcgc10gLT4gUmF3SFRNTCBzIHwgW3ZdIC0+IFJhd0hUTUwgKHZhbHVlX3RvX3N0cmluZyB2KSB8IF8gLT4gTmlsKTtcbiAgYmluZCBcInJhdy1odG1sLWNvbnRlbnRcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtSYXdIVE1MIHNdIC0+IFN0cmluZyBzIHwgW1N0cmluZyBzXSAtPiBTdHJpbmcgcyB8IF8gLT4gU3RyaW5nIFwiXCIpO1xuICBiaW5kIFwiZW1wdHktZGljdD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtEaWN0IGRdIC0+IEJvb2wgKEhhc2h0YmwubGVuZ3RoIGQgPSAwKSB8IF8gLT4gQm9vbCB0cnVlKTtcbiAgYmluZCBcImlkZW50aWNhbD9cIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFthOyBiXSAtPiBCb29sIChhID09IGIpIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcImlkZW50aWNhbD9cIikpO1xuICBiaW5kIFwiZm9yLWVhY2gtaW5kZXhlZFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW2ZuX3ZhbDsgTGlzdCBpdGVtc10gfCBbZm5fdmFsOyBMaXN0UmVmIHsgY29udGVudHMgPSBpdGVtcyB9XSAtPlxuICAgICAgTGlzdC5pdGVyaSAoZnVuIGkgaXRlbSAtPlxuICAgICAgICBpZ25vcmUgKFN4X3JlZi5ldmFsX2V4cHIgKExpc3QgW2ZuX3ZhbDsgTnVtYmVyIChmbG9hdF9vZl9pbnQgaSk7IGl0ZW1dKSAoRW52IGdsb2JhbF9lbnYpKVxuICAgICAgKSBpdGVtczsgTmlsXG4gICAgfCBfIC0+IE5pbCk7XG5cbiAgKCogLS0tIFN0cmluZy9udW1iZXIgaGVscGVycyB1c2VkIGJ5IG9yY2hlc3RyYXRpb24vYnJvd3NlciAtLS0gKilcbiAgYmluZCBcIm1ha2Utc3gtZXhwclwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiBTeEV4cHIgcyB8IF8gLT4gcmFpc2UgKEV2YWxfZXJyb3IgXCJtYWtlLXN4LWV4cHJcIikpO1xuICBiaW5kIFwic3gtZXhwci1zb3VyY2VcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtTeEV4cHIgc10gLT4gU3RyaW5nIHMgfCBbU3RyaW5nIHNdIC0+IFN0cmluZyBzIHwgXyAtPiByYWlzZSAoRXZhbF9lcnJvciBcInN4LWV4cHItc291cmNlXCIpKTtcbiAgYmluZCBcInBhcnNlLWludFwiIChmdW4gYXJncyAtPlxuICAgIG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgW1N0cmluZyBzXSAtPiAodHJ5IE51bWJlciAoZmxvYXRfb2ZfaW50IChpbnRfb2Zfc3RyaW5nIHMpKSB3aXRoIF8gLT4gTmlsKVxuICAgIHwgW1N0cmluZyBzOyBkZWZhdWx0X3ZhbF0gLT4gKHRyeSBOdW1iZXIgKGZsb2F0X29mX2ludCAoaW50X29mX3N0cmluZyBzKSkgd2l0aCBfIC0+IGRlZmF1bHRfdmFsKVxuICAgIHwgW051bWJlciBuXSB8IFtOdW1iZXIgbjsgX10gLT4gTnVtYmVyIChGbG9hdC5yb3VuZCBuKVxuICAgIHwgW187IGRlZmF1bHRfdmFsXSAtPiBkZWZhdWx0X3ZhbCB8IF8gLT4gTmlsKTtcbiAgYmluZCBcInBhcnNlLW51bWJlclwiIChmdW4gYXJncyAtPiBtYXRjaCBhcmdzIHdpdGggW1N0cmluZyBzXSAtPiAodHJ5IE51bWJlciAoZmxvYXRfb2Zfc3RyaW5nIHMpIHdpdGggXyAtPiBOaWwpIHwgXyAtPiBOaWwpO1xuXG4gICgqIC0tLSBTZXJ2ZXItb25seSBzdHVicyAobm8tb3BzIGluIGJyb3dzZXIpIC0tLSAqKVxuICBiaW5kIFwicXVlcnlcIiAoZnVuIF8gLT4gTmlsKTtcbiAgYmluZCBcImFjdGlvblwiIChmdW4gXyAtPiBOaWwpO1xuICBiaW5kIFwicmVxdWVzdC1hcmdcIiAoZnVuIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoIFtfOyBkXSAtPiBkIHwgXyAtPiBOaWwpO1xuICBiaW5kIFwicmVxdWVzdC1tZXRob2RcIiAoZnVuIF8gLT4gU3RyaW5nIFwiR0VUXCIpO1xuICBiaW5kIFwiY3R4XCIgKGZ1biBfIC0+IE5pbCk7XG4gIGJpbmQgXCJoZWxwZXJcIiAoZnVuIF8gLT4gTmlsKVxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKilcbigqIFJlZ2lzdGVyIGdsb2JhbCBTeEtlcm5lbCBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqKVxuXG5sZXQgKCkgPVxuICBsZXQgc3ggPSBKcy5VbnNhZmUub2JqIFt8fF0gaW5cbiAgbGV0IHdyYXAgZm4gPSBKcy5VbnNhZmUuZnVuX2NhbGxcbiAgICAoSnMuVW5zYWZlLnB1cmVfanNfZXhwciBcIihmdW5jdGlvbihmbikgeyByZXR1cm4gZnVuY3Rpb24oKSB7IGdsb2JhbFRoaXMuX19zeFIgPSB1bmRlZmluZWQ7IHZhciByID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgcmV0dXJuIGdsb2JhbFRoaXMuX19zeFIgIT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMuX19zeFIgOiByOyB9OyB9KVwiKVxuICAgIFt8IEpzLlVuc2FmZS5pbmplY3QgKEpzLndyYXBfY2FsbGJhY2sgZm4pIHxdIGluXG5cbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwicGFyc2VcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX3BhcnNlKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwic3RyaW5naWZ5XCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9zdHJpbmdpZnkpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJldmFsXCIpICh3cmFwIGFwaV9ldmFsKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiZXZhbEV4cHJcIikgKHdyYXAgYXBpX2V2YWxfZXhwcik7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcInJlbmRlclRvSHRtbFwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfcmVuZGVyX3RvX2h0bWwpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJsb2FkXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9sb2FkKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwidHlwZU9mXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV90eXBlX29mKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwiaW5zcGVjdFwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfaW5zcGVjdCk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImVuZ2luZVwiKSAoSnMud3JhcF9jYWxsYmFjayBhcGlfZW5naW5lKTtcbiAgSnMuVW5zYWZlLnNldCBzeCAoSnMuc3RyaW5nIFwicmVnaXN0ZXJOYXRpdmVcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX3JlZ2lzdGVyX25hdGl2ZSk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImxvYWRTb3VyY2VcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX2xvYWQpO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJjYWxsRm5cIikgKHdyYXAgYXBpX2NhbGxfZm4pO1xuICBKcy5VbnNhZmUuc2V0IHN4IChKcy5zdHJpbmcgXCJpc0NhbGxhYmxlXCIpIChKcy53cmFwX2NhbGxiYWNrIGFwaV9pc19jYWxsYWJsZSk7XG4gIEpzLlVuc2FmZS5zZXQgc3ggKEpzLnN0cmluZyBcImZuQXJpdHlcIikgKEpzLndyYXBfY2FsbGJhY2sgYXBpX2ZuX2FyaXR5KTtcblxuICBKcy5VbnNhZmUuc2V0IEpzLlVuc2FmZS5nbG9iYWwgKEpzLnN0cmluZyBcIlN4S2VybmVsXCIpIHN4XG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfaW50X29mX3N0cmluZyIsImNhbWxfanNfZnJvbV9hcnJheSIsImNhbWxfanNfd3JhcF9jYWxsYmFjayIsImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmciLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiY2FtbF9jYWxsMSIsImYiLCJhMCIsImdsb2JhbF9kYXRhIiwiU3hfdHlwZXMiLCJTdGRsaWIiLCJKc19vZl9vY2FtbF9KcyIsIlN0ZGxpYl9IYXNodGJsIiwiU3RkbGliX0xpc3QiLCJTdGRsaWJfQXJyYXkiLCJTdGRsaWJfT3B0aW9uIiwiU3hfcmVmIiwiU3hfcHJpbWl0aXZlcyIsIlN4X3JlbmRlciIsIlN0ZGxpYl9TdHJpbmciLCJTeF9ydW50aW1lIiwiU3hfcGFyc2VyIiwiU3RkbGliX1ByaW50ZXhjIiwiU3RkbGliX1ByaW50ZiIsIlN4X3Njb3BlIiwiaGFuZGxlX3RhYmxlIiwibmV4dF9oYW5kbGUiLCJhbGxvY19oYW5kbGUiLCJ2IiwiaWQiLCJnZXRfaGFuZGxlIiwibWF0Y2giLCJhbGxvY19ob3N0X2hhbmRsZSIsImdsb2JhbF9lbnYiLCJjYWxsX3N4X2ZuIiwiZm4iLCJhcmdzIiwidGFnX2ZuIiwiZHVtbXkiLCJjc3RfaG9zdF9oYW5kbGUiLCJjc3RfZGljdCIsImNzdF9rZXl3b3JkIiwiY3N0X2xpc3QiLCJjc3Rfc3ltYm9sIiwidmFsdWVfdG9fanMiLCJiIiwibiIsInMiLCJrIiwiaXRlbXMiLCJkIiwib2JqIiwiaGFuZGxlIiwiaW5uZXIiLCJhcmdzX2pzIiwiYXJnIiwicmVzdWx0IiwiZXhuIiwibXNnIiwiYXJyIiwibmV4dF9ob3N0X2hhbmRsZSIsImpzX3RvX3ZhbHVlIiwidHkiLCJoIiwianNfYXJncyIsInR5cGVfZmllbGQiLCJ0MCIsInQxIiwiaSIsInRhZyIsIml0ZW1zX2pzIiwidDMiLCJ0NCIsImtleXMiLCJsZW4iLCJyZXR1cm5fdmlhX3NpZGVfY2hhbm5lbCIsImNzdF9QYXJzZV9lcnJvciIsImFwaV9wYXJzZSIsInNyY19qcyIsInNyYyIsInZhbHVlcyIsImNzdF9FcnJvciIsImFwaV9ldmFsIiwiZXhwcnMiLCJlbnYiLCJhY2MiLCJleHByIiwiYXBpX2V2YWxfZXhwciIsImV4cHJfanMiLCJlbnZfanMiLCJhcGlfbG9hZCIsImNvdW50Iiwic3hfcmVuZGVyX21vZGUiLCJhcGlfcmVuZGVyX3RvX2h0bWwiLCJwcmV2IiwiaHRtbCIsImFwaV9zdHJpbmdpZnkiLCJ2X2pzIiwiYXBpX3R5cGVfb2YiLCJhcGlfaW5zcGVjdCIsImFwaV9lbmdpbmUiLCJwYXJhbSIsImFwaV9yZWdpc3Rlcl9uYXRpdmUiLCJuYW1lX2pzIiwiY2FsbGJhY2tfanMiLCJuYW1lIiwibmF0aXZlX2ZuIiwiYXBpX2NhbGxfZm4iLCJmbl9qcyIsImNzdF9zeF9jYWxsRm4iLCJhcGlfaXNfY2FsbGFibGUiLCJhcGlfZm5fYXJpdHkiLCJsIiwiYmluZCIsImNzdF9jZWtfZXZhbCIsImUiLCJlbnZfdmFsIiwiY3N0X2Nla19jYWxsIiwiYSIsImFsIiwicmVzdCIsImRlZXBfZXF1YWwiLCJrYSIsImtiIiwiY29uZCIsImNzdF9lcnJvciIsImNzdF9vayIsInRodW5rIiwiciIsInV3IiwiY3N0X2Vudl9oYXMiLCJjc3RfZW52X2dldCIsImNzdF9lbnZfYmluZCIsImNzdF9lbnZfc2V0IiwiY3N0X2Vudl9leHRlbmQiLCJjc3RfZW52X21lcmdlIiwiY3N0X21ha2Vfc3ltYm9sIiwiY3N0X21ha2Vfa2V5d29yZCIsImNzdF9rZXl3b3JkX25hbWUiLCJjc3Rfc3ltYm9sX25hbWUiLCJjc3QiLCJjIiwiY3N0X2NvbXBvbmVudF9oYXNfY2hpbGRyZW4iLCJoYXNfY2hpbGRyZW5faW1wbCIsImNzdF9tYWtlX2Nla19zdGF0ZSIsImNzdF9jZWtfc3RlcCIsImNzdF9jZWtfcGhhc2UiLCJjc3RfY2VrX3ZhbHVlIiwiY3N0X2Nla190ZXJtaW5hbCIsImNzdF9jZWtfa29udCIsImNzdF9mcmFtZV90eXBlIiwiY3N0X3N0cmljdCIsImNzdF9wcmltX3BhcmFtX3R5cGVzIiwidCIsImNzdF9hcHBseSIsImFsbF9hcmdzIiwicHJlZml4IiwibGFzdCIsImNzdF9wcm92aWRlX3B1c2giLCJjc3RfcHJvdmlkZV9wb3AiLCJodG1sX3RhZ3MiLCJ2b2lkX2VsZW1lbnRzIiwiYm9vbGVhbl9hdHRycyIsImhhbmRsZXIiLCJyYXciLCJtYWMiLCJjYWxsX2FyZ3MiLCJmbl92YWwiLCJ0ZW1wbGF0ZSIsInBhaXJzIiwiY3N0X2lkZW50aWNhbCIsIml0ZW0iLCJjc3RfbWFrZV9zeF9leHByIiwiY3N0X3N4X2V4cHJfc291cmNlIiwiZGVmYXVsdF92YWwiLCJ3cmFwIiwic3giXSwibWFwcGluZ3MiOiJJQUFBQSxVQUFBO0FBQUEsSUFBQUMscUJBQUE7QUFBQSxJQUFBQyxxQkFBQTtBQUFBLElBQUFDLHdCQUFBO0FBQUEsSUFBQUMsMEJBQUE7QUFBQSxJQUFBQyw4QkFBQTtBQUFBLElBQUFDLDBCQUFBO0FBQUEsSUFBQUMsc0JBQUE7QUFBQSxZQUFBQyxXQUFBQyxHQUFBQztBQUFBQSxJ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MUQiLCJpZ25vcmVMaXN0IjpbMF19fSx7Im9mZnNldCI6eyJsaW5lIjozNzgyNiwiY29sdW1uIjowfSwibWFwIjp7InZlcnNpb24iOjMsImZpbGUiOiJzdGRfZXhpdC5jbW8uanMiLCJzb3VyY2VzIjpbIi9idWlsdGluL2JsYWNrYm94Lm1sIiwiL3Jvb3QvLm9wYW0vNS4yLjAvbGliL29jYW1sL3N0ZF9leGl0Lm1sIl0sInNvdXJjZXNDb250ZW50IjpbIigqIGdlbmVyYXRlZCBjb2RlICopIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFbnN1cmUgdGhhdCBbYXRfZXhpdF0gZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBwcm9ncmFtICopXG5cbmxldCBfID0gZG9fYXRfZXhpdCgpXG4iXSwibmFtZXMiOlsicnVudGltZSIsImNhbWxfY2FsbDEiLCJmIiwiYTAiLCJTdGRsaWIiXSwibWFwcGluZ3MiOiJPQUFBQSxVQUFBO0FBQUEsWUFBQUMsV0FBQUMsR0FBQUM7QUFBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUFDLFNBQUE7QUFBQSxHQ2lCUTtBQUFBLEdBQVk7QUFBQTtBQUFBLEVEakJwQiIsImlnbm9yZUxpc3QiOlswXX19XX0=
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-14499dc3.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-14499dc3.wasm
new file mode 100644
index 00000000..c3106329
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-14499dc3.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-14499dc3.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-14499dc3.wasm.map
new file mode 100644
index 00000000..fa09c2f8
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-14499dc3.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm
new file mode 100644
index 00000000..7f0cdd35
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map
new file mode 100644
index 00000000..263fe161
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-4feaf1fd.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (List [String msg]))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-6e15a789.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-6e15a789.wasm
new file mode 100644
index 00000000..44d4f8e7
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-6e15a789.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-6e15a789.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-6e15a789.wasm.map
new file mode 100644
index 00000000..03869228
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-6e15a789.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-78cbf059.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-78cbf059.wasm
new file mode 100644
index 00000000..49beb5cc
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-78cbf059.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-78cbf059.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-78cbf059.wasm.map
new file mode 100644
index 00000000..de78d180
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-78cbf059.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n (* Use unwrap_env for nil/dict tolerance, matching the server kernel *)\n let uw = Sx_runtime.unwrap_env in\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"global-env\" (fun _ -> Env global_env);\n bind \"env-has?\" (fun args -> match args with [e; String k] | [e; Keyword k] -> Bool (env_has (uw e) k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [e; String k] | [e; Keyword k] -> env_get (uw e) k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_bind (uw e) k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [e; String k; v] | [e; Keyword k; v] -> env_set (uw e) k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [e] -> Env (env_extend (uw e)) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [a; b] -> Sx_runtime.env_merge a b | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component/Island accessors (must handle both types) --- *)\n bind \"component-name\" (fun args ->\n match args with [Component c] -> String c.c_name | [Island i] -> String i.i_name | _ -> String \"\");\n bind \"component-closure\" (fun args ->\n match args with [Component c] -> Env c.c_closure | [Island i] -> Env i.i_closure | _ -> Dict (Hashtbl.create 0));\n bind \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> Nil);\n bind \"component-body\" (fun args ->\n match args with [Component c] -> c.c_body | [Island i] -> i.i_body | _ -> Nil);\n let has_children_impl = NativeFn (\"component-has-children?\", fun args ->\n match args with [Component c] -> Bool c.c_has_children | [Island i] -> Bool i.i_has_children | _ -> Bool false) in\n ignore (env_bind global_env \"component-has-children\" has_children_impl);\n ignore (env_bind global_env \"component-has-children?\" has_children_impl);\n bind \"component-affinity\" (fun args ->\n match args with [Component c] -> String c.c_affinity | [Island _] -> String \"client\" | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n (* Scope primitives (scope-push!, scope-pop!, context, collect!, collected,\n emit!, emitted, scope-emit!, scope-emitted, etc.) are registered by\n Sx_scope module initialization in the primitives table.\n The CEK evaluator falls through to the primitives table when a symbol\n isn't in the env, so these work automatically.\n Only provide-push!/provide-pop! need explicit env bindings as aliases. *)\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Error handling --- *)\n bind \"cek-try\" (fun args ->\n match args with\n | [thunk; handler] ->\n (try Sx_ref.cek_call thunk Nil\n with Eval_error msg -> Sx_ref.cek_call handler (String msg))\n | [thunk] ->\n (try let r = Sx_ref.cek_call thunk Nil in\n List [Symbol \"ok\"; r]\n with Eval_error msg -> List [Symbol \"error\"; String msg])\n | _ -> Nil);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil);\n bind \"call-lambda\" (fun args ->\n match args with\n | [fn_val; call_args; Env _e] -> Sx_ref.cek_call fn_val call_args\n | [fn_val; call_args] -> Sx_ref.cek_call fn_val call_args\n | _ -> raise (Eval_error \"call-lambda: expected (fn args env?)\"));\n bind \"cek-call\" (fun args ->\n match args with [f; a] -> Sx_ref.cek_call f a | _ -> raise (Eval_error \"cek-call\"));\n bind \"cek-eval\" (fun args ->\n match args with [expr] -> Sx_ref.eval_expr expr (Env global_env) | [expr; e] -> Sx_ref.eval_expr expr e | _ -> Nil);\n bind \"qq-expand-runtime\" (fun args ->\n match args with [template] -> Sx_ref.qq_expand template (Env global_env) | [template; Env e] -> Sx_ref.qq_expand template (Env e) | _ -> Nil);\n\n (* --- Type predicates needed by adapters --- *)\n bind \"thunk?\" (fun args -> match args with [Thunk _] -> Bool true | _ -> Bool false);\n bind \"thunk-expr\" (fun args -> match args with [v] -> thunk_expr v | _ -> Nil);\n bind \"thunk-env\" (fun args -> match args with [v] -> thunk_env v | _ -> Nil);\n bind \"lambda?\" (fun args -> match args with [Lambda _] -> Bool true | _ -> Bool false);\n bind \"macro?\" (fun args -> match args with [Macro _] -> Bool true | _ -> Bool false);\n bind \"island?\" (fun args -> match args with [Island _] -> Bool true | _ -> Bool false);\n bind \"component?\" (fun args -> match args with [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"callable?\" (fun args -> match args with [NativeFn _] | [Lambda _] | [Component _] | [Island _] -> Bool true | _ -> Bool false);\n bind \"spread?\" (fun args -> match args with [Spread _] -> Bool true | _ -> Bool false);\n bind \"continuation?\" (fun args -> match args with [Continuation _] -> Bool true | _ -> Bool false);\n bind \"lambda-params\" (fun args -> match args with [Lambda l] -> List (List.map (fun s -> String s) l.l_params) | _ -> List []);\n bind \"lambda-body\" (fun args -> match args with [Lambda l] -> l.l_body | _ -> Nil);\n bind \"lambda-closure\" (fun args -> match args with [Lambda l] -> Env l.l_closure | _ -> Dict (Hashtbl.create 0));\n\n (* --- Core operations needed by adapters --- *)\n bind \"spread-attrs\" (fun args ->\n match args with [Spread pairs] -> let d = Hashtbl.create 4 in List.iter (fun (k, v) -> Hashtbl.replace d k v) pairs; Dict d | _ -> Dict (Hashtbl.create 0));\n bind \"make-spread\" (fun args ->\n match args with [Dict d] -> Spread (Hashtbl.fold (fun k v acc -> (k, v) :: acc) d []) | _ -> Nil);\n bind \"make-raw-html\" (fun args -> match args with [String s] -> RawHTML s | [v] -> RawHTML (value_to_string v) | _ -> Nil);\n bind \"raw-html-content\" (fun args -> match args with [RawHTML s] -> String s | [String s] -> String s | _ -> String \"\");\n bind \"empty-dict?\" (fun args -> match args with [Dict d] -> Bool (Hashtbl.length d = 0) | _ -> Bool true);\n bind \"identical?\" (fun args -> match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?\"));\n bind \"for-each-indexed\" (fun args ->\n match args with\n | [fn_val; List items] | [fn_val; ListRef { contents = items }] ->\n List.iteri (fun i item ->\n ignore (Sx_ref.eval_expr (List [fn_val; Number (float_of_int i); item]) (Env global_env))\n ) items; Nil\n | _ -> Nil);\n\n (* --- String/number helpers used by orchestration/browser --- *)\n bind \"make-sx-expr\" (fun args -> match args with [String s] -> SxExpr s | _ -> raise (Eval_error \"make-sx-expr\"));\n bind \"sx-expr-source\" (fun args -> match args with [SxExpr s] -> String s | [String s] -> String s | _ -> raise (Eval_error \"sx-expr-source\"));\n bind \"parse-int\" (fun args ->\n match args with\n | [String s] -> (try Number (float_of_int (int_of_string s)) with _ -> Nil)\n | [String s; default_val] -> (try Number (float_of_int (int_of_string s)) with _ -> default_val)\n | [Number n] | [Number n; _] -> Number (Float.round n)\n | [_; default_val] -> default_val | _ -> Nil);\n bind \"parse-number\" (fun args -> match args with [String s] -> (try Number (float_of_string s) with _ -> Nil) | _ -> Nil);\n\n (* --- Server-only stubs (no-ops in browser) --- *)\n bind \"query\" (fun _ -> Nil);\n bind \"action\" (fun _ -> Nil);\n bind \"request-arg\" (fun args -> match args with [_; d] -> d | _ -> Nil);\n bind \"request-method\" (fun _ -> String \"GET\");\n bind \"ctx\" (fun _ -> Nil);\n bind \"helper\" (fun _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-91309257.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-91309257.wasm
new file mode 100644
index 00000000..389f3592
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-91309257.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-91309257.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-91309257.wasm.map
new file mode 100644
index 00000000..626b81df
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-91309257.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"env-has?\" (fun args -> match args with [Env e; String k] | [Env e; Keyword k] -> Bool (env_has e k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [Env e; String k] | [Env e; Keyword k] -> env_get e k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [Env e; String k; v] | [Env e; Keyword k; v] -> env_bind e k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [Env e; String k; v] | [Env e; Keyword k; v] -> env_set e k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [Env e] -> Env (env_extend e) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [Env a; Env b] -> Env (env_merge a b) | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component accessors --- *)\n bind \"component-params\" (fun args -> match args with [Component c] -> List (List.map (fun s -> String s) c.c_params) | _ -> Nil);\n bind \"component-body\" (fun args -> match args with [Component c] -> c.c_body | _ -> Nil);\n bind \"component-has-children\" (fun args -> match args with [Component c] -> Bool c.c_has_children | _ -> Bool false);\n bind \"component-affinity\" (fun args -> match args with [Component c] -> String c.c_affinity | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n bind \"scope-push!\" (fun args -> match args with [n; v] -> Sx_runtime.scope_push n v | _ -> raise (Eval_error \"scope-push!\"));\n bind \"scope-pop!\" (fun args -> match args with [n] -> Sx_runtime.scope_pop n | _ -> raise (Eval_error \"scope-pop!\"));\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n bind \"context\" (fun args -> match args with [a; b] -> Sx_runtime.sx_context a b | [a] -> Sx_runtime.sx_context a Nil | _ -> Nil);\n bind \"collect!\" (fun args -> match args with [a; b] -> Sx_runtime.sx_collect a b | _ -> Nil);\n bind \"collected\" (fun args -> match args with [a] -> Sx_runtime.sx_collected a | _ -> List []);\n bind \"emit!\" (fun args -> match args with [a; b] -> Sx_runtime.sx_emit a b | _ -> Nil);\n bind \"emitted\" (fun args -> match args with [a] -> Sx_runtime.sx_emitted a | _ -> List []);\n\n (* Scope primitives (collect!, collected, context, emit!, emitted, etc.)\n are already registered by Sx_scope module initialization.\n Do NOT re-register here — it would override Sx_scope's implementation\n with a version that calls prim_call back into itself → infinite recursion. *)\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-ef0a3f49.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-ef0a3f49.wasm
new file mode 100644
index 00000000..03f29885
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-ef0a3f49.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-ef0a3f49.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-ef0a3f49.wasm.map
new file mode 100644
index 00000000..ef35db34
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/dune__exe__Sx_browser-ef0a3f49.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/workspace_root/browser/sx_browser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** sx_browser.ml — OCaml SX kernel compiled to WASM/JS for browser use.\n\n Exposes the CEK machine, bytecode VM, parser, and primitives as a\n global [SxKernel] object that the JS platform layer binds to.\n\n Fresh implementation on the ocaml-vm branch — builds on the bytecode\n VM + lazy JIT infrastructure. *)\n\nopen Js_of_ocaml\nopen Sx_types\n\n(* ================================================================== *)\n(* Opaque value handle table *)\n(* *)\n(* Non-primitive SX values (lambdas, components, signals, etc.) are *)\n(* stored here and represented on the JS side as objects with an *)\n(* __sx_handle integer key. Preserves identity across JS↔OCaml. *)\n(* ================================================================== *)\n\nlet _next_handle = ref 0\nlet _handle_table : (int, value) Hashtbl.t = Hashtbl.create 256\n\nlet alloc_handle (v : value) : int =\n let id = !_next_handle in\n incr _next_handle;\n Hashtbl.replace _handle_table id v;\n id\n\nlet get_handle (id : int) : value =\n match Hashtbl.find_opt _handle_table id with\n | Some v -> v\n | None -> raise (Eval_error (Printf.sprintf \"Invalid SX handle: %d\" id))\n\n(* JS-side opaque host object table.\n Host objects (DOM elements, console, etc.) are stored here to preserve\n identity across the OCaml↔JS boundary. Represented as Dict with\n __host_handle key on the OCaml side. *)\nlet _next_host_handle = ref 0\nlet _alloc_host_handle = Js.Unsafe.pure_js_expr\n \"(function() { var t = {}; var n = 0; return { put: function(obj) { var id = n++; t[id] = obj; return id; }, get: function(id) { return t[id]; } }; })()\"\nlet host_put (obj : Js.Unsafe.any) : int =\n let id = !_next_host_handle in\n incr _next_host_handle;\n ignore (Js.Unsafe.meth_call _alloc_host_handle \"put\" [| obj |]);\n id\nlet host_get_js (id : int) : Js.Unsafe.any =\n Js.Unsafe.meth_call _alloc_host_handle \"get\" [| Js.Unsafe.inject id |]\n\n(* ================================================================== *)\n(* Global environment *)\n(* ================================================================== *)\n\n(* Force module initialization — these modules register primitives\n in their let () = ... blocks but aren't referenced directly. *)\nlet () = Sx_scope.clear_all ()\n\nlet global_env = make_env ()\nlet _sx_render_mode = ref false\n\nlet call_sx_fn (fn : value) (args : value list) : value =\n Sx_ref.eval_expr (List (fn :: args)) (Env global_env)\n\n(* ================================================================== *)\n(* Value conversion: OCaml <-> JS *)\n(* ================================================================== *)\n\n(** Tag a JS function with __sx_handle and _type properties. *)\nlet _tag_fn = Js.Unsafe.pure_js_expr\n \"(function(fn, handle, type) { fn.__sx_handle = handle; fn._type = type; return fn; })\"\n\nlet rec value_to_js (v : value) : Js.Unsafe.any =\n match v with\n | Nil -> Js.Unsafe.inject Js.null\n | Bool b -> Js.Unsafe.inject (Js.bool b)\n | Number n -> Js.Unsafe.inject (Js.number_of_float n)\n | String s -> Js.Unsafe.inject (Js.string s)\n | RawHTML s -> Js.Unsafe.inject (Js.string s)\n | Symbol s ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"symbol\"));\n (\"name\", Js.Unsafe.inject (Js.string s)) |])\n | Keyword k ->\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"keyword\"));\n (\"name\", Js.Unsafe.inject (Js.string k)) |])\n | List items | ListRef { contents = items } ->\n let arr = items |> List.map value_to_js |> Array.of_list in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string \"list\"));\n (\"items\", Js.Unsafe.inject (Js.array arr)) |])\n | Dict d ->\n (* Check for __host_handle — return original JS object *)\n (match Hashtbl.find_opt d \"__host_handle\" with\n | Some (Number n) -> host_get_js (int_of_float n)\n | _ ->\n let obj = Js.Unsafe.obj [||] in\n Js.Unsafe.set obj (Js.string \"_type\") (Js.string \"dict\");\n Hashtbl.iter (fun k v ->\n Js.Unsafe.set obj (Js.string k) (value_to_js v)) d;\n Js.Unsafe.inject obj)\n (* Callable values: wrap as JS functions with __sx_handle *)\n | Lambda _ | NativeFn _ | Continuation _ | VmClosure _ ->\n let handle = alloc_handle v in\n let inner = Js.wrap_callback (fun args_js ->\n try\n let arg = js_to_value args_js in\n let args = match arg with Nil -> [] | _ -> [arg] in\n let result = call_sx_fn v args in\n value_to_js result\n with Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] \" ^ msg)) |]);\n Js.Unsafe.inject Js.null) in\n Js.Unsafe.fun_call _tag_fn [|\n Js.Unsafe.inject inner;\n Js.Unsafe.inject handle;\n Js.Unsafe.inject (Js.string (type_of v)) |]\n (* Non-callable compound: tagged object with handle *)\n | _ ->\n let handle = alloc_handle v in\n Js.Unsafe.inject (Js.Unsafe.obj [|\n (\"_type\", Js.Unsafe.inject (Js.string (type_of v)));\n (\"__sx_handle\", Js.Unsafe.inject handle) |])\n\nand js_to_value (js : Js.Unsafe.any) : value =\n if Js.Unsafe.equals js Js.null || Js.Unsafe.equals js Js.undefined then Nil\n else\n let ty = Js.to_string (Js.typeof js) in\n match ty with\n | \"number\" -> Number (Js.float_of_number (Js.Unsafe.coerce js))\n | \"boolean\" -> Bool (Js.to_bool (Js.Unsafe.coerce js))\n | \"string\" -> String (Js.to_string (Js.Unsafe.coerce js))\n | \"function\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n (* Plain JS function — wrap as NativeFn *)\n NativeFn (\"js-callback\", fun args ->\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call js (Array.map Fun.id js_args)))\n | \"object\" ->\n let h = Js.Unsafe.get js (Js.string \"__sx_handle\") in\n if not (Js.Unsafe.equals h Js.undefined) then\n get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float)\n else\n let type_field = Js.Unsafe.get js (Js.string \"_type\") in\n if Js.Unsafe.equals type_field Js.undefined then begin\n if Js.to_bool (Js.Unsafe.global##._Array##isArray js) then begin\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce js) i |> Js.Optdef.to_option |> Option.get)))\n end else begin\n (* Opaque host object — store in JS-side table, return Dict with __host_handle *)\n let id = host_put js in\n let d = Hashtbl.create 2 in\n Hashtbl.replace d \"__host_handle\" (Number (float_of_int id));\n Dict d\n end\n end else begin\n let tag = Js.to_string (Js.Unsafe.coerce type_field) in\n match tag with\n | \"symbol\" -> Symbol (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"keyword\" -> Keyword (Js.to_string (Js.Unsafe.get js (Js.string \"name\")))\n | \"list\" ->\n let items_js = Js.Unsafe.get js (Js.string \"items\") in\n let n = Js.float_of_number (Js.Unsafe.coerce (Js.Unsafe.get items_js (Js.string \"length\"))) |> int_of_float in\n List (List.init n (fun i ->\n js_to_value (Js.array_get (Js.Unsafe.coerce items_js) i |> Js.Optdef.to_option |> Option.get)))\n | \"dict\" ->\n let d = Hashtbl.create 8 in\n let keys = Js.Unsafe.global##._Object##keys js in\n let len = keys##.length in\n for i = 0 to len - 1 do\n let k = Js.to_string (Js.array_get keys i |> Js.Optdef.to_option |> Option.get) in\n if k <> \"_type\" then\n Hashtbl.replace d k (js_to_value (Js.Unsafe.get js (Js.string k)))\n done;\n Dict d\n | _ -> Nil\n end\n | _ -> Nil\n\n(* ================================================================== *)\n(* Side-channel return (bypasses js_of_ocaml stripping properties) *)\n(* ================================================================== *)\n\nlet return_via_side_channel (v : Js.Unsafe.any) : Js.Unsafe.any =\n Js.Unsafe.set Js.Unsafe.global (Js.string \"__sxR\") v; v\n\n(* ================================================================== *)\n(* Core API *)\n(* ================================================================== *)\n\nlet api_parse src_js =\n let src = Js.to_string src_js in\n try\n let values = Sx_parser.parse_all src in\n Js.Unsafe.inject (Js.array (values |> List.map value_to_js |> Array.of_list))\n with Parse_error msg ->\n Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let result = List.fold_left (fun _acc expr -> Sx_ref.eval_expr expr env) Nil exprs in\n return_via_side_channel (value_to_js result)\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_eval_expr expr_js _env_js =\n let expr = js_to_value expr_js in\n try\n return_via_side_channel (value_to_js (Sx_ref.eval_expr expr (Env global_env)))\n with Eval_error msg ->\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n\nlet api_load src_js =\n let src = Js.to_string src_js in\n try\n let exprs = Sx_parser.parse_all src in\n let env = Env global_env in\n let count = ref 0 in\n List.iter (fun expr -> ignore (Sx_ref.eval_expr expr env); incr count) exprs;\n Js.Unsafe.inject !count\n with\n | Eval_error msg -> Js.Unsafe.inject (Js.string (\"Error: \" ^ msg))\n | Parse_error msg -> Js.Unsafe.inject (Js.string (\"Parse error: \" ^ msg))\n\nlet api_render_to_html expr_js =\n let expr = js_to_value expr_js in\n let prev = !_sx_render_mode in\n _sx_render_mode := true;\n (try\n let html = Sx_render.render_to_html expr global_env in\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string html)\n with Eval_error msg ->\n _sx_render_mode := prev;\n Js.Unsafe.inject (Js.string (\"Error: \" ^ msg)))\n\nlet api_stringify v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_type_of v_js =\n Js.Unsafe.inject (Js.string (type_of (js_to_value v_js)))\n\nlet api_inspect v_js =\n Js.Unsafe.inject (Js.string (inspect (js_to_value v_js)))\n\nlet api_engine () =\n Js.Unsafe.inject (Js.string \"ocaml-vm-wasm\")\n\nlet api_register_native name_js callback_js =\n let name = Js.to_string name_js in\n let native_fn args =\n let js_args = args |> List.map value_to_js |> Array.of_list in\n js_to_value (Js.Unsafe.fun_call callback_js [| Js.Unsafe.inject (Js.array js_args) |])\n in\n ignore (env_bind global_env name (NativeFn (name, native_fn)));\n Js.Unsafe.inject Js.null\n\nlet api_call_fn fn_js args_js =\n try\n let fn = js_to_value fn_js in\n let args = Array.to_list (Array.map js_to_value (Js.to_array (Js.Unsafe.coerce args_js))) in\n return_via_side_channel (value_to_js (call_sx_fn fn args))\n with\n | Eval_error msg ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ msg)) |]);\n Js.Unsafe.inject Js.null\n | exn ->\n ignore (Js.Unsafe.meth_call\n (Js.Unsafe.get Js.Unsafe.global (Js.string \"console\"))\n \"error\" [| Js.Unsafe.inject (Js.string (\"[sx] callFn: \" ^ Printexc.to_string exn)) |]);\n Js.Unsafe.inject Js.null\n\nlet api_is_callable fn_js =\n if Js.Unsafe.equals fn_js Js.null || Js.Unsafe.equals fn_js Js.undefined then\n Js.Unsafe.inject (Js.bool false)\n else\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.bool false)\n else Js.Unsafe.inject (Js.bool (is_callable (get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float))))\n\nlet api_fn_arity fn_js =\n let h = Js.Unsafe.get fn_js (Js.string \"__sx_handle\") in\n if Js.Unsafe.equals h Js.undefined then Js.Unsafe.inject (Js.number_of_float (-1.0))\n else\n let v = get_handle (Js.float_of_number (Js.Unsafe.coerce h) |> int_of_float) in\n match v with\n | Lambda l -> Js.Unsafe.inject (Js.number_of_float (float_of_int (List.length l.l_params)))\n | _ -> Js.Unsafe.inject (Js.number_of_float (-1.0))\n\n(* ================================================================== *)\n(* Platform bindings (registered in global env) *)\n(* ================================================================== *)\n\nlet () =\n let bind name fn = ignore (env_bind global_env name (NativeFn (name, fn))) in\n\n (* --- Evaluation --- *)\n bind \"cek-eval\" (fun args ->\n match args with\n | [String s] -> let e = Sx_parser.parse_all s in (match e with h :: _ -> Sx_ref.eval_expr h (Env global_env) | [] -> Nil)\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | [expr; env_val] -> Sx_ref.eval_expr expr env_val\n | _ -> raise (Eval_error \"cek-eval: expected 1-2 args\"));\n\n bind \"eval-expr-cek\" (fun args ->\n match args with\n | [expr; e] -> Sx_ref.eval_expr expr e\n | [expr] -> Sx_ref.eval_expr expr (Env global_env)\n | _ -> raise (Eval_error \"eval-expr-cek: expected 1-2 args\"));\n\n bind \"cek-call\" (fun args ->\n match args with\n | [f; Nil] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | [f; List al] -> Sx_ref.eval_expr (List (f :: al)) (Env global_env)\n | [f; a] -> Sx_ref.eval_expr (List [f; a]) (Env global_env)\n | [f] -> Sx_ref.eval_expr (List [f]) (Env global_env)\n | f :: rest -> Sx_ref.eval_expr (List (f :: rest)) (Env global_env)\n | _ -> raise (Eval_error \"cek-call: expected function and args\"));\n\n bind \"sx-parse\" (fun args ->\n match args with\n | [String src] -> List (Sx_parser.parse_all src)\n | _ -> raise (Eval_error \"sx-parse: expected string\"));\n\n bind \"sx-serialize\" (fun args ->\n match args with\n | [v] -> String (inspect v)\n | _ -> raise (Eval_error \"sx-serialize: expected 1 arg\"));\n\n (* --- Assertions & equality --- *)\n let rec deep_equal a b =\n match a, b with\n | Nil, Nil -> true | Bool a, Bool b -> a = b\n | Number a, Number b -> a = b | String a, String b -> a = b\n | Symbol a, Symbol b -> a = b | Keyword a, Keyword b -> a = b\n | (List a | ListRef { contents = a }), (List b | ListRef { contents = b }) ->\n List.length a = List.length b && List.for_all2 deep_equal a b\n | Dict a, Dict b ->\n let ka = Hashtbl.fold (fun k _ acc -> k :: acc) a [] in\n let kb = Hashtbl.fold (fun k _ acc -> k :: acc) b [] in\n List.length ka = List.length kb &&\n List.for_all (fun k -> Hashtbl.mem b k &&\n deep_equal (Hashtbl.find a k) (Hashtbl.find b k)) ka\n | _ -> false\n in\n bind \"equal?\" (fun args -> match args with [a; b] -> Bool (deep_equal a b) | _ -> raise (Eval_error \"equal?: 2 args\"));\n bind \"assert\" (fun args ->\n match args with\n | [cond] -> if not (sx_truthy cond) then raise (Eval_error \"Assertion failed\"); Bool true\n | [cond; msg] -> if not (sx_truthy cond) then raise (Eval_error (\"Assertion: \" ^ value_to_string msg)); Bool true\n | _ -> raise (Eval_error \"assert: 1-2 args\"));\n\n bind \"try-call\" (fun args ->\n match args with\n | [thunk] ->\n (try ignore (Sx_ref.eval_expr (List [thunk]) (Env global_env));\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool true); Dict d\n with Eval_error msg ->\n let d = Hashtbl.create 2 in Hashtbl.replace d \"ok\" (Bool false); Hashtbl.replace d \"error\" (String msg); Dict d)\n | _ -> raise (Eval_error \"try-call: 1 arg\"));\n\n (* --- List mutation --- *)\n bind \"append!\" (fun args ->\n match args with\n | [ListRef r; v] -> r := !r @ [v]; ListRef r\n | [List items; v] -> List (items @ [v])\n | _ -> raise (Eval_error \"append!: list and value\"));\n\n (* --- Environment ops --- *)\n bind \"make-env\" (fun _ -> Env (make_env ()));\n bind \"env-has?\" (fun args -> match args with [Env e; String k] | [Env e; Keyword k] -> Bool (env_has e k) | _ -> raise (Eval_error \"env-has?\"));\n bind \"env-get\" (fun args -> match args with [Env e; String k] | [Env e; Keyword k] -> env_get e k | _ -> raise (Eval_error \"env-get\"));\n bind \"env-bind!\" (fun args -> match args with [Env e; String k; v] | [Env e; Keyword k; v] -> env_bind e k v | _ -> raise (Eval_error \"env-bind!\"));\n bind \"env-set!\" (fun args -> match args with [Env e; String k; v] | [Env e; Keyword k; v] -> env_set e k v | _ -> raise (Eval_error \"env-set!\"));\n bind \"env-extend\" (fun args -> match args with [Env e] -> Env (env_extend e) | _ -> raise (Eval_error \"env-extend\"));\n bind \"env-merge\" (fun args -> match args with [Env a; Env b] -> Env (env_merge a b) | _ -> raise (Eval_error \"env-merge\"));\n\n (* --- Type constructors --- *)\n bind \"make-symbol\" (fun args -> match args with [String s] -> Symbol s | [v] -> Symbol (value_to_string v) | _ -> raise (Eval_error \"make-symbol\"));\n bind \"make-keyword\" (fun args -> match args with [String s] -> Keyword s | _ -> raise (Eval_error \"make-keyword\"));\n bind \"keyword-name\" (fun args -> match args with [Keyword k] -> String k | _ -> raise (Eval_error \"keyword-name\"));\n bind \"symbol-name\" (fun args -> match args with [Symbol s] -> String s | _ -> raise (Eval_error \"symbol-name\"));\n\n (* --- Component accessors --- *)\n bind \"component-params\" (fun args -> match args with [Component c] -> List (List.map (fun s -> String s) c.c_params) | _ -> Nil);\n bind \"component-body\" (fun args -> match args with [Component c] -> c.c_body | _ -> Nil);\n bind \"component-has-children\" (fun args -> match args with [Component c] -> Bool c.c_has_children | _ -> Bool false);\n bind \"component-affinity\" (fun args -> match args with [Component c] -> String c.c_affinity | _ -> String \"auto\");\n bind \"component-param-types\" (fun _ -> Nil);\n bind \"component-set-param-types!\" (fun _ -> Nil);\n\n (* --- CEK stepping --- *)\n bind \"make-cek-state\" (fun args -> match args with [c; e; k] -> Sx_ref.make_cek_state c e k | _ -> raise (Eval_error \"make-cek-state\"));\n bind \"cek-step\" (fun args -> match args with [s] -> Sx_ref.cek_step s | _ -> raise (Eval_error \"cek-step\"));\n bind \"cek-phase\" (fun args -> match args with [s] -> Sx_ref.cek_phase s | _ -> raise (Eval_error \"cek-phase\"));\n bind \"cek-value\" (fun args -> match args with [s] -> Sx_ref.cek_value s | _ -> raise (Eval_error \"cek-value\"));\n bind \"cek-terminal?\" (fun args -> match args with [s] -> Sx_ref.cek_terminal_p s | _ -> raise (Eval_error \"cek-terminal?\"));\n bind \"cek-kont\" (fun args -> match args with [s] -> Sx_ref.cek_kont s | _ -> raise (Eval_error \"cek-kont\"));\n bind \"frame-type\" (fun args -> match args with [f] -> Sx_ref.frame_type f | _ -> raise (Eval_error \"frame-type\"));\n\n (* --- Strict mode --- *)\n ignore (env_bind global_env \"*strict*\" (Bool false));\n ignore (env_bind global_env \"*prim-param-types*\" Nil);\n bind \"set-strict!\" (fun args -> match args with [v] -> Sx_ref._strict_ref := v; ignore (env_set global_env \"*strict*\" v); Nil | _ -> Nil);\n bind \"set-prim-param-types!\" (fun args -> match args with [v] -> Sx_ref._prim_param_types_ref := v; ignore (env_set global_env \"*prim-param-types*\" v); Nil | _ -> Nil);\n bind \"value-matches-type?\" (fun args -> match args with [v; t] -> Sx_ref.value_matches_type_p v t | _ -> Nil);\n\n (* --- Apply --- *)\n bind \"apply\" (fun args ->\n match args with\n | f :: rest ->\n let all_args = match List.rev rest with List last :: prefix -> List.rev prefix @ last | _ -> rest in\n Sx_runtime.sx_call f all_args\n | _ -> raise (Eval_error \"apply\"));\n\n (* --- Scope stack --- *)\n bind \"scope-push!\" (fun args -> match args with [n; v] -> Sx_runtime.scope_push n v | _ -> raise (Eval_error \"scope-push!\"));\n bind \"scope-pop!\" (fun args -> match args with [n] -> Sx_runtime.scope_pop n | _ -> raise (Eval_error \"scope-pop!\"));\n bind \"provide-push!\" (fun args -> match args with [n; v] -> Sx_runtime.provide_push n v | _ -> raise (Eval_error \"provide-push!\"));\n bind \"provide-pop!\" (fun args -> match args with [n] -> Sx_runtime.provide_pop n | _ -> raise (Eval_error \"provide-pop!\"));\n bind \"context\" (fun args -> match args with [a; b] -> Sx_runtime.sx_context a b | [a] -> Sx_runtime.sx_context a Nil | _ -> Nil);\n bind \"collect!\" (fun args -> match args with [a; b] -> Sx_runtime.sx_collect a b | _ -> Nil);\n bind \"collected\" (fun args -> match args with [a] -> Sx_runtime.sx_collected a | _ -> List []);\n bind \"emit!\" (fun args -> match args with [a; b] -> Sx_runtime.sx_emit a b | _ -> Nil);\n bind \"emitted\" (fun args -> match args with [a] -> Sx_runtime.sx_emitted a | _ -> List []);\n\n (* Scope primitives (collect!, collected, context, emit!, emitted, etc.)\n are already registered by Sx_scope module initialization.\n Do NOT re-register here — it would override Sx_scope's implementation\n with a version that calls prim_call back into itself → infinite recursion. *)\n\n (* --- Fragment / raw HTML --- *)\n bind \"<>\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | Nil -> \"\"\n | List _ -> Sx_render.render_to_html a global_env\n | _ -> value_to_string a) args)));\n bind \"raw!\" (fun args ->\n RawHTML (String.concat \"\" (List.map (fun a ->\n match a with String s | RawHTML s -> s | _ -> value_to_string a) args)));\n\n bind \"define-page-helper\" (fun _ -> Nil);\n\n (* --- Render --- *)\n Sx_render.setup_render_env global_env;\n bind \"set-render-active!\" (fun _ -> Nil);\n bind \"render-active?\" (fun _ -> Bool true);\n bind \"is-html-tag?\" (fun args -> match args with [String s] -> Bool (Sx_render.is_html_tag s) | _ -> Bool false);\n\n (* --- Render constants needed by web adapters --- *)\n let html_tags = List (List.map (fun s -> String s) Sx_render.html_tags) in\n let void_elements = List (List.map (fun s -> String s) Sx_render.void_elements) in\n let boolean_attrs = List (List.map (fun s -> String s) Sx_render.boolean_attrs) in\n ignore (env_bind global_env \"HTML_TAGS\" html_tags);\n ignore (env_bind global_env \"VOID_ELEMENTS\" void_elements);\n ignore (env_bind global_env \"BOOLEAN_ATTRS\" boolean_attrs);\n\n (* --- Evaluator bridge functions needed by spec .sx files --- *)\n bind \"eval-expr\" (fun args ->\n match args with [expr; e] -> Sx_ref.eval_expr expr e | [expr] -> Sx_ref.eval_expr expr (Env global_env) | _ -> Nil);\n bind \"trampoline\" (fun args -> match args with [v] -> !Sx_primitives._sx_trampoline_fn v | _ -> Nil);\n bind \"expand-macro\" (fun args ->\n match args with [mac; raw; Env e] -> Sx_ref.expand_macro mac raw (Env e) | [mac; raw] -> Sx_ref.expand_macro mac raw (Env global_env) | _ -> Nil)\n\n(* ================================================================== *)\n(* Register global SxKernel object *)\n(* ================================================================== *)\n\nlet () =\n let sx = Js.Unsafe.obj [||] in\n let wrap fn = Js.Unsafe.fun_call\n (Js.Unsafe.pure_js_expr \"(function(fn) { return function() { globalThis.__sxR = undefined; var r = fn.apply(null, arguments); return globalThis.__sxR !== undefined ? globalThis.__sxR : r; }; })\")\n [| Js.Unsafe.inject (Js.wrap_callback fn) |] in\n\n Js.Unsafe.set sx (Js.string \"parse\") (Js.wrap_callback api_parse);\n Js.Unsafe.set sx (Js.string \"stringify\") (Js.wrap_callback api_stringify);\n Js.Unsafe.set sx (Js.string \"eval\") (wrap api_eval);\n Js.Unsafe.set sx (Js.string \"evalExpr\") (wrap api_eval_expr);\n Js.Unsafe.set sx (Js.string \"renderToHtml\") (Js.wrap_callback api_render_to_html);\n Js.Unsafe.set sx (Js.string \"load\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"typeOf\") (Js.wrap_callback api_type_of);\n Js.Unsafe.set sx (Js.string \"inspect\") (Js.wrap_callback api_inspect);\n Js.Unsafe.set sx (Js.string \"engine\") (Js.wrap_callback api_engine);\n Js.Unsafe.set sx (Js.string \"registerNative\") (Js.wrap_callback api_register_native);\n Js.Unsafe.set sx (Js.string \"loadSource\") (Js.wrap_callback api_load);\n Js.Unsafe.set sx (Js.string \"callFn\") (wrap api_call_fn);\n Js.Unsafe.set sx (Js.string \"isCallable\") (Js.wrap_callback api_is_callable);\n Js.Unsafe.set sx (Js.string \"fnArity\") (Js.wrap_callback api_fn_arity);\n\n Js.Unsafe.set Js.Unsafe.global (Js.string \"SxKernel\") sx\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/js_of_ocaml-651f6707.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/js_of_ocaml-651f6707.wasm
new file mode 100644
index 00000000..aab1980b
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/js_of_ocaml-651f6707.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/js_of_ocaml-651f6707.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/js_of_ocaml-651f6707.wasm.map
new file mode 100644
index 00000000..6898b286
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/js_of_ocaml-651f6707.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":63542},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/import.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml\n * http://www.ocsigen.org/js_of_ocaml/\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nmodule Poly = struct\n external ( < ) : 'a -> 'a -> bool = \"%lessthan\"\n\n external ( <= ) : 'a -> 'a -> bool = \"%lessequal\"\n\n external ( <> ) : 'a -> 'a -> bool = \"%notequal\"\n\n external ( = ) : 'a -> 'a -> bool = \"%equal\"\n\n external ( > ) : 'a -> 'a -> bool = \"%greaterthan\"\n\n external ( >= ) : 'a -> 'a -> bool = \"%greaterequal\"\n\n external compare : 'a -> 'a -> int = \"%compare\"\n\n external equal : 'a -> 'a -> bool = \"%equal\"\nend\n\nmodule Int_replace_polymorphic_compare = struct\n external ( < ) : int -> int -> bool = \"%lessthan\"\n\n external ( <= ) : int -> int -> bool = \"%lessequal\"\n\n external ( <> ) : int -> int -> bool = \"%notequal\"\n\n external ( = ) : int -> int -> bool = \"%equal\"\n\n external ( > ) : int -> int -> bool = \"%greaterthan\"\n\n external ( >= ) : int -> int -> bool = \"%greaterequal\"\n\n external compare : int -> int -> int = \"%compare\"\n\n external equal : int -> int -> bool = \"%equal\"\n\n let max (x : int) y = if x >= y then x else y\n\n let min (x : int) y = if x <= y then x else y\nend\n\nmodule String = struct\n include String\n\n let equal (x : string) (y : string) = Poly.equal x y\nend\n\nmodule Char = struct\n include Char\n\n let equal (x : char) (y : char) = Poly.equal x y\nend\n\ninclude Int_replace_polymorphic_compare\n","(* generated code *)"],"names":[],"mappings":"EAmEoC,sCAAc,C,EANV,MAAc,C,KANf,OAAO,OAAtB,aAAuB,C,KAFR,OAAO,OAAtB,aAAuB,C,MCrD/C,0iB,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":64272},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/js_of_ocaml/js.ml"],"sourcesContent":["(* generated code *)","(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\n(* This local module [Js] is needed so that the ppx_js extension work within that file. *)\nmodule Js = struct\n type +'a t\n\n type (-'a, +'b) meth_callback\n\n module Unsafe = struct\n type top\n\n type any = top t\n\n type any_js_array = any\n\n external inject : 'a -> any = \"%identity\"\n\n external coerce : _ t -> _ t = \"%identity\"\n\n external get : 'a -> 'b -> 'c = \"caml_js_get\"\n\n external set : 'a -> 'b -> 'c -> unit = \"caml_js_set\"\n\n external delete : 'a -> 'b -> unit = \"caml_js_delete\"\n\n external call : 'a -> 'b -> any array -> 'c = \"caml_js_call\"\n\n external fun_call : 'a -> any array -> 'b = \"caml_js_fun_call\"\n\n external meth_call : 'a -> string -> any array -> 'b = \"caml_js_meth_call\"\n\n external new_obj : 'a -> any array -> 'b = \"caml_js_new\"\n\n external new_obj_arr : 'a -> any_js_array -> 'b = \"caml_ojs_new_arr\"\n\n external obj : (string * any) array -> 'a = \"caml_js_object\"\n\n external equals : 'a -> 'b -> bool = \"caml_js_equals\"\n\n external strict_equals : 'a -> 'b -> bool = \"caml_js_strict_equals\"\n\n external pure_expr : (unit -> 'a) -> 'a = \"caml_js_pure_expr\"\n\n external eval_string : string -> 'a = \"caml_js_eval_string\"\n\n external js_expr : string -> 'a = \"caml_js_expr\"\n\n external pure_js_expr : string -> 'a = \"caml_pure_js_expr\"\n\n let global = pure_js_expr \"globalThis\"\n\n external callback : ('a -> 'b) -> ('c, 'a -> 'b) meth_callback\n = \"caml_js_wrap_callback_unsafe\"\n\n external callback_with_arguments :\n (any_js_array -> 'b) -> ('c, any_js_array -> 'b) meth_callback\n = \"caml_js_wrap_callback_arguments\"\n\n external callback_with_arity : int -> ('a -> 'b) -> ('c, 'a -> 'b) meth_callback\n = \"caml_js_wrap_callback_strict\"\n\n external meth_callback : ('b -> 'a) -> ('b, 'a) meth_callback\n = \"caml_js_wrap_meth_callback_unsafe\"\n\n external meth_callback_with_arity : int -> ('b -> 'a) -> ('b, 'a) meth_callback\n = \"caml_js_wrap_meth_callback_strict\"\n\n external meth_callback_with_arguments :\n ('b -> any_js_array -> 'a) -> ('b, any_js_array -> 'a) meth_callback\n = \"caml_js_wrap_meth_callback_arguments\"\n\n external runtime_value : string -> 'a = \"caml_jsoo_runtime_value\"\n\n (* DEPRECATED *)\n external variable : string -> 'a = \"caml_js_var\"\n end\n\n (****)\n\n type 'a opt = 'a\n\n type 'a optdef = 'a\n\n external debugger : unit -> unit = \"debugger\"\n\n let null : 'a opt = Unsafe.pure_js_expr \"null\"\n\n external some : 'a -> 'a opt = \"%identity\"\n\n let undefined : 'a optdef = Unsafe.pure_js_expr \"undefined\"\n\n external def : 'a -> 'a optdef = \"%identity\"\n\n module type OPT = sig\n type 'a t\n\n val empty : 'a t\n\n val return : 'a -> 'a t\n\n val map : 'a t -> ('a -> 'b) -> 'b t\n\n val bind : 'a t -> ('a -> 'b t) -> 'b t\n\n val test : 'a t -> bool\n\n val iter : 'a t -> ('a -> unit) -> unit\n\n val case : 'a t -> (unit -> 'b) -> ('a -> 'b) -> 'b\n\n val get : 'a t -> (unit -> 'a) -> 'a\n\n val option : 'a option -> 'a t\n\n val to_option : 'a t -> 'a option\n\n external equals : _ t -> _ t -> bool = \"caml_js_equals\"\n\n external strict_equals : _ t -> _ t -> bool = \"caml_js_strict_equals\"\n end\n\n module Opt : OPT with type 'a t = 'a opt = struct\n type 'a t = 'a opt\n\n let empty = null\n\n let return = some\n\n external equals : _ t -> _ t -> bool = \"caml_js_equals\"\n\n external strict_equals : _ t -> _ t -> bool = \"caml_js_strict_equals\"\n\n let map x f = if equals x null then null else return (f x)\n\n let bind x f = if equals x null then null else f x\n\n let test x = not (equals x null)\n\n let iter x f = if not (equals x null) then f x\n\n let case x f g = if equals x null then f () else g x\n\n let get x f = if equals x null then f () else x\n\n let option x =\n match x with\n | None -> empty\n | Some x -> return x\n\n let to_option x = case x (fun () -> None) (fun x -> Some x)\n end\n\n module Optdef : OPT with type 'a t = 'a optdef = struct\n type 'a t = 'a optdef\n\n let empty = undefined\n\n let return = def\n\n external equals : _ t -> _ t -> bool = \"caml_js_equals\"\n\n external strict_equals : _ t -> _ t -> bool = \"caml_js_strict_equals\"\n\n let map x f = if strict_equals x undefined then undefined else return (f x)\n\n let bind x f = if strict_equals x undefined then undefined else f x\n\n let test x = not (strict_equals x undefined)\n\n let iter x f = if not (strict_equals x undefined) then f x\n\n let case x f g = if strict_equals x undefined then f () else g x\n\n let get x f = if strict_equals x undefined then f () else x\n\n let option x =\n match x with\n | None -> empty\n | Some x -> return x\n\n let to_option x = case x (fun () -> None) (fun x -> Some x)\n end\n\n (****)\n\n let coerce x f g = Opt.get (f x) (fun () -> g x)\n\n let coerce_opt x f g = Opt.get (Opt.bind x f) (fun () -> g x)\n\n (****)\n\n type +'a meth\n\n type +'a gen_prop\n\n type 'a readonly_prop = < get : 'a > gen_prop\n\n type 'a writeonly_prop = < set : 'a -> unit > gen_prop\n\n type 'a prop = < get : 'a ; set : 'a -> unit > gen_prop\n\n type 'a optdef_prop = < get : 'a optdef ; set : 'a -> unit > gen_prop\n\n type +'a constr\n\n (****)\n\n type 'a callback = (unit, 'a) meth_callback\n\n external wrap_callback : ('a -> 'b) -> ('c, 'a -> 'b) meth_callback\n = \"caml_js_wrap_callback\"\n\n external wrap_meth_callback : ('a -> 'b) -> ('a, 'b) meth_callback\n = \"caml_js_wrap_meth_callback\"\n\n (****)\n\n external equals : _ t -> _ t -> bool = \"caml_js_equals\"\n\n external strict_equals : _ t -> _ t -> bool = \"caml_js_strict_equals\"\n\n (****)\n\n let _true = Unsafe.pure_js_expr \"true\"\n\n let _false = Unsafe.pure_js_expr \"false\"\n\n type match_result_handle\n\n type string_array\n\n class type number = object\n method toString : js_string t meth\n\n method toString_radix : int -> js_string t meth\n\n method toLocaleString : js_string t meth\n\n method toFixed : int -> js_string t meth\n\n method toExponential : js_string t meth\n\n method toExponential_digits : int -> js_string t meth\n\n method toPrecision : int -> js_string t meth\n end\n\n and js_string = object\n method toString : js_string t meth\n\n method valueOf : js_string t meth\n\n method charAt : int -> js_string t meth\n\n method charCodeAt : int -> number t meth\n\n method codePointAt : int -> number t optdef meth\n\n (* This may return NaN... *)\n method concat : js_string t -> js_string t meth\n\n method concat_2 : js_string t -> js_string t -> js_string t meth\n\n method concat_3 : js_string t -> js_string t -> js_string t -> js_string t meth\n\n method concat_4 :\n js_string t -> js_string t -> js_string t -> js_string t -> js_string t meth\n\n method indexOf : js_string t -> int meth\n\n method indexOf_from : js_string t -> int -> int meth\n\n method lastIndexOf : js_string t -> int meth\n\n method lastIndexOf_from : js_string t -> int -> int meth\n\n method localeCompare : js_string t -> number t meth\n\n method _match : regExp t -> match_result_handle t opt meth\n\n method normalize : js_string t meth\n\n method normalize_form : normalization t -> js_string t meth\n\n method replace : regExp t -> js_string t -> js_string t meth\n\n method replace_string : js_string t -> js_string t -> js_string t meth\n\n method search : regExp t -> int meth\n\n method slice : int -> int -> js_string t meth\n\n method slice_end : int -> js_string t meth\n\n method split : js_string t -> string_array t meth\n\n method split_limited : js_string t -> int -> string_array t meth\n\n method split_regExp : regExp t -> string_array t meth\n\n method split_regExpLimited : regExp t -> int -> string_array t meth\n\n method substring : int -> int -> js_string t meth\n\n method substring_toEnd : int -> js_string t meth\n\n method toLowerCase : js_string t meth\n\n method toLocaleLowerCase : js_string t meth\n\n method toUpperCase : js_string t meth\n\n method toLocaleUpperCase : js_string t meth\n\n method trim : js_string t meth\n\n method length : int readonly_prop\n end\n\n and regExp = object\n method exec : js_string t -> match_result_handle t opt meth\n\n method test : js_string t -> bool t meth\n\n method toString : js_string t meth\n\n method source : js_string t readonly_prop\n\n method global : bool t readonly_prop\n\n method ignoreCase : bool t readonly_prop\n\n method multiline : bool t readonly_prop\n\n method lastIndex : int prop\n end\n\n and normalization = js_string\n\n type number_t = number t\n\n (* string is used by ppx_js, it needs to come before any use of the\n new syntax in this file *)\n external string : string -> js_string t = \"caml_jsstring_of_string\"\n\n external to_string : js_string t -> string = \"caml_string_of_jsstring\"\n\n let nfc = string \"NFC\"\n\n let nfd = string \"NFD\"\n\n let nfkc = string \"NFKC\"\n\n let nfkd = string \"NFKD\"\nend\n\ninclude Js\n\nclass type string_constr = object\n method fromCharCode : int -> js_string t meth\nend\n\nlet string_constr = Unsafe.global##._String\n\nlet regExp = Unsafe.global##._RegExp\n\nlet regExp_copy = regExp\n\nlet regExp_withFlags = regExp\n\nclass type ['a] js_array = object\n method toString : js_string t meth\n\n method toLocaleString : js_string t meth\n\n method concat : 'a js_array t -> 'a js_array t meth\n\n method join : js_string t -> js_string t meth\n\n method pop : 'a optdef meth\n\n method push : 'a -> int meth\n\n method push_2 : 'a -> 'a -> int meth\n\n method push_3 : 'a -> 'a -> 'a -> int meth\n\n method push_4 : 'a -> 'a -> 'a -> 'a -> int meth\n\n method reverse : 'a js_array t meth\n\n method shift : 'a optdef meth\n\n method slice : int -> int -> 'a js_array t meth\n\n method slice_end : int -> 'a js_array t meth\n\n method sort : ('a -> 'a -> number_t) callback -> 'a js_array t meth\n\n method sort_asStrings : 'a js_array t meth\n\n method splice : int -> int -> 'a js_array t meth\n\n method splice_1 : int -> int -> 'a -> 'a js_array t meth\n\n method splice_2 : int -> int -> 'a -> 'a -> 'a js_array t meth\n\n method splice_3 : int -> int -> 'a -> 'a -> 'a -> 'a js_array t meth\n\n method splice_4 : int -> int -> 'a -> 'a -> 'a -> 'a -> 'a js_array t meth\n\n method unshift : 'a -> int meth\n\n method unshift_2 : 'a -> 'a -> int meth\n\n method unshift_3 : 'a -> 'a -> 'a -> int meth\n\n method unshift_4 : 'a -> 'a -> 'a -> 'a -> int meth\n\n method some : ('a -> int -> 'a js_array t -> bool t) callback -> bool t meth\n\n method every : ('a -> int -> 'a js_array t -> bool t) callback -> bool t meth\n\n method forEach : ('a -> int -> 'a js_array t -> unit) callback -> unit meth\n\n method map : ('a -> int -> 'a js_array t -> 'b) callback -> 'b js_array t meth\n\n method filter : ('a -> int -> 'a js_array t -> bool t) callback -> 'a js_array t meth\n\n method reduce_init : ('b -> 'a -> int -> 'a js_array t -> 'b) callback -> 'b -> 'b meth\n\n method reduce : ('a -> 'a -> int -> 'a js_array t -> 'a) callback -> 'a meth\n\n method reduceRight_init :\n ('b -> 'a -> int -> 'a js_array t -> 'b) callback -> 'b -> 'b meth\n\n method reduceRight : ('a -> 'a -> int -> 'a js_array t -> 'a) callback -> 'a meth\n\n method length : int prop\nend\n\nlet object_constructor = Unsafe.global##._Object\n\nlet object_keys o : js_string t js_array t = object_constructor##keys o\n\nlet array_constructor = Unsafe.global##._Array\n\nlet array_empty = array_constructor\n\nlet array_length = array_constructor\n\nlet array_get : 'a #js_array t -> int -> 'a optdef = Unsafe.get\n\nlet array_set : 'a #js_array t -> int -> 'a -> unit = Unsafe.set\n\nlet array_map_poly :\n 'a #js_array t -> ('a -> int -> 'a #js_array t -> 'b) callback -> 'b #js_array t =\n fun a cb -> (Unsafe.coerce a)##map cb\n\nlet array_map f a = array_map_poly a (wrap_callback (fun x _idx _ -> f x))\n\nlet array_mapi f a = array_map_poly a (wrap_callback (fun x idx _ -> f idx x))\n\nclass type match_result = object\n inherit [js_string t] js_array\n\n method index : int readonly_prop\n\n method input : js_string t readonly_prop\nend\n\nlet str_array : string_array t -> js_string t js_array t = Unsafe.coerce\n\nlet match_result : match_result_handle t -> match_result t = Unsafe.coerce\n\nclass type date = object\n method toString : js_string t meth\n\n method toDateString : js_string t meth\n\n method toTimeString : js_string t meth\n\n method toLocaleString : js_string t meth\n\n method toLocaleDateString : js_string t meth\n\n method toLocaleTimeString : js_string t meth\n\n method valueOf : number_t meth\n\n method getTime : number_t meth\n\n method getFullYear : int meth\n\n method getUTCFullYear : int meth\n\n method getMonth : int meth\n\n method getUTCMonth : int meth\n\n method getDate : int meth\n\n method getUTCDate : int meth\n\n method getDay : int meth\n\n method getUTCDay : int meth\n\n method getHours : int meth\n\n method getUTCHours : int meth\n\n method getMinutes : int meth\n\n method getUTCMinutes : int meth\n\n method getSeconds : int meth\n\n method getUTCSeconds : int meth\n\n method getMilliseconds : int meth\n\n method getUTCMilliseconds : int meth\n\n method getTimezoneOffset : int meth\n\n method setTime : number_t -> number_t meth\n\n method setFullYear : int -> number_t meth\n\n method setUTCFullYear : int -> number_t meth\n\n method setMonth : int -> number_t meth\n\n method setUTCMonth : int -> number_t meth\n\n method setDate : int -> number_t meth\n\n method setUTCDate : int -> number_t meth\n\n method setHours : int -> number_t meth\n\n method setUTCHours : int -> number_t meth\n\n method setMinutes : int -> number_t meth\n\n method setUTCMinutes : int -> number_t meth\n\n method setSeconds : int -> number_t meth\n\n method setUTCSeconds : int -> number_t meth\n\n method setMilliseconds : int -> number_t meth\n\n method setUTCMilliseconds : int -> number_t meth\n\n method toUTCString : js_string t meth\n\n method toISOString : js_string t meth\n\n method toJSON : 'a -> js_string t meth\nend\n\nclass type date_constr = object\n method parse : js_string t -> number_t meth\n\n method _UTC_month : int -> int -> number_t meth\n\n method _UTC_day : int -> int -> number_t meth\n\n method _UTC_hour : int -> int -> int -> int -> number_t meth\n\n method _UTC_min : int -> int -> int -> int -> int -> number_t meth\n\n method _UTC_sec : int -> int -> int -> int -> int -> int -> number_t meth\n\n method _UTC_ms : int -> int -> int -> int -> int -> int -> int -> number_t meth\n\n method now : number_t meth\nend\n\nlet date_constr = Unsafe.global##._Date\n\nlet date : date_constr t = date_constr\n\nlet date_now : date t constr = date_constr\n\nlet date_fromTimeValue : (number_t -> date t) constr = date_constr\n\nlet date_month : (int -> int -> date t) constr = date_constr\n\nlet date_day : (int -> int -> int -> date t) constr = date_constr\n\nlet date_hour : (int -> int -> int -> int -> date t) constr = date_constr\n\nlet date_min : (int -> int -> int -> int -> int -> date t) constr = date_constr\n\nlet date_sec : (int -> int -> int -> int -> int -> int -> date t) constr = date_constr\n\nlet date_ms : (int -> int -> int -> int -> int -> int -> int -> date t) constr =\n date_constr\n\nclass type math = object\n method _E : number_t readonly_prop\n\n method _LN2 : number_t readonly_prop\n\n method _LN10 : number_t readonly_prop\n\n method _LOG2E : number_t readonly_prop\n\n method _LOG10E : number_t readonly_prop\n\n method _PI : number_t readonly_prop\n\n method _SQRT1_2_ : number_t readonly_prop\n\n method _SQRT2 : number_t readonly_prop\n\n method abs : number_t -> number_t meth\n\n method acos : number_t -> number_t meth\n\n method asin : number_t -> number_t meth\n\n method atan : number_t -> number_t meth\n\n method atan2 : number_t -> number_t -> number_t meth\n\n method ceil : number_t -> number_t meth\n\n method cos : number_t -> number_t meth\n\n method exp : number_t -> number_t meth\n\n method floor : number_t -> number_t meth\n\n method log : number_t -> number_t meth\n\n method max : number_t -> number_t -> number_t meth\n\n method max_3 : number_t -> number_t -> number_t -> number_t meth\n\n method max_4 : number_t -> number_t -> number_t -> number_t -> number_t meth\n\n method min : number_t -> number_t -> number_t meth\n\n method min_3 : number_t -> number_t -> number_t -> number_t meth\n\n method min_4 : number_t -> number_t -> number_t -> number_t -> number_t meth\n\n method pow : number_t -> number_t -> number_t meth\n\n method random : number_t meth\n\n method round : number_t -> number_t meth\n\n method sin : number_t -> number_t meth\n\n method sqrt : number_t -> number_t meth\n\n method tan : number_t -> number_t meth\nend\n\nlet math = Unsafe.global##._Math\n\nclass type error = object\n method name : js_string t prop\n\n method message : js_string t prop\n\n method stack : js_string t optdef prop\n\n method toString : js_string t meth\nend\n\nlet error_constr = Unsafe.global##._Error\n\nmodule Js_error = struct\n type error_t = error t\n\n include Jsoo_runtime.Error\n\n external of_error : error_t -> t = \"%identity\"\n\n external to_error : t -> error_t = \"%identity\"\n\n let name e = to_string (to_error e)##.name\n\n let message e = to_string (to_error e)##.message\n\n let stack (e : t) : string option =\n Opt.to_option (Opt.map (to_error e)##.stack to_string)\n\n let to_string e = to_string (to_error e)##toString\nend\n\nmodule Magic = struct\n module type T = sig\n exception Error of error t\n end\n\n type ('a, 'b) eq = Eq : ('a, 'a) eq\n\n let (eq : (error t, Js_error.t) eq) = Obj.magic Eq\n\n let m =\n match eq with\n | Eq ->\n (module struct\n exception Error = Js_error.Exn\n end : T)\n\n module Error = (val m : T)\nend\n\ninclude Magic.Error\n\nlet raise_js_error e = Js_error.raise_ (Js_error.of_error e)\n\nlet string_of_error e = Js_error.to_string (Js_error.of_error e)\n\nlet exn_with_js_backtrace = Js_error.attach_js_backtrace\n\nexternal js_error_of_exn : exn -> error t opt = \"caml_js_error_of_exception\"\n\nclass type json = object\n method parse : js_string t -> 'a meth\n\n method stringify : 'a -> js_string t meth\nend\n\nlet _JSON : json t = Unsafe.global##._JSON\n\nlet decodeURI (s : js_string t) : js_string t =\n Unsafe.fun_call Unsafe.global##.decodeURI [| Unsafe.inject s |]\n\nlet decodeURIComponent (s : js_string t) : js_string t =\n Unsafe.fun_call Unsafe.global##.decodeURIComponent [| Unsafe.inject s |]\n\nlet encodeURI (s : js_string t) : js_string t =\n Unsafe.fun_call Unsafe.global##.encodeURI [| Unsafe.inject s |]\n\nlet encodeURIComponent (s : js_string t) : js_string t =\n Unsafe.fun_call Unsafe.global##.encodeURIComponent [| Unsafe.inject s |]\n\nlet escape (s : js_string t) : js_string t =\n Unsafe.fun_call Unsafe.global##.escape [| Unsafe.inject s |]\n\nlet unescape (s : js_string t) : js_string t =\n Unsafe.fun_call Unsafe.global##.unescape [| Unsafe.inject s |]\n\nexternal bool : bool -> bool t = \"caml_js_from_bool\"\n\nexternal to_bool : bool t -> bool = \"caml_js_to_bool\"\n\nexternal array : 'a array -> 'a js_array t = \"caml_js_from_array\"\n\nexternal to_array : 'a js_array t -> 'a array = \"caml_js_to_array\"\n\nexternal bytestring : string -> js_string t = \"caml_jsbytes_of_string\"\n\nexternal to_bytestring : js_string t -> string = \"caml_string_of_jsbytes\"\n\nexternal float : float -> number_t = \"caml_js_from_float\"\n\nexternal to_float : number_t -> float = \"caml_js_to_float\"\n\nexternal number_of_float : float -> number t = \"caml_js_from_float\"\n\nexternal float_of_number : number t -> float = \"caml_js_to_float\"\n\nexternal int32 : int32 -> number_t = \"caml_js_from_int32\"\n\nexternal to_int32 : number_t -> int32 = \"caml_js_to_int32\"\n\nexternal nativeint : nativeint -> number_t = \"caml_js_from_nativeint\"\n\nexternal to_nativeint : number_t -> nativeint = \"caml_js_to_nativeint\"\n\nexternal typeof : _ t -> js_string t = \"caml_js_typeof\"\n\nexternal instanceof : _ t -> _ constr -> bool = \"caml_js_instanceof\"\n\nlet isNaN (i : 'a) : bool =\n to_bool (Unsafe.fun_call Unsafe.global##.isNaN [| Unsafe.inject i |])\n\nlet parseInt (s : js_string t) : int =\n let s = Unsafe.fun_call Unsafe.global##.parseInt [| Unsafe.inject s |] in\n if isNaN s then failwith \"parseInt\" else s\n\nlet parseFloat (s : js_string t) : number_t =\n let s = Unsafe.fun_call Unsafe.global##.parseFloat [| Unsafe.inject s |] in\n if isNaN s then failwith \"parseFloat\" else s\n\nlet _ =\n Printexc.register_printer (fun e ->\n if instanceof (Obj.magic e : < .. > t) error_constr\n then\n let e = Js_error.of_error (Obj.magic e : error t) in\n Some (Js_error.to_string e)\n else\n match e with\n | Js_error.Exn e -> Some (Js_error.to_string e)\n | _ -> None)\n\nlet export_js (field : js_string t) x =\n Unsafe.set\n (Unsafe.pure_js_expr \"jsoo_exports\")\n field\n (if\n String.equal (Js.to_string (typeof (Obj.magic x))) \"function\"\n (* function with arity/length equal to zero are already wrapped *)\n && Unsafe.get (Obj.magic x) (Js.string \"length\") > 0\n then Obj.magic (wrap_callback (Obj.magic x))\n else x)\n\nlet export field x = export_js (string field) x\n\nlet export_all obj =\n let keys = object_keys obj in\n keys##forEach\n (wrap_callback (fun (key : js_string t) _ _ -> export_js key (Unsafe.get obj key)))\n\n(****)\n\n(* DEPRECATED *)\n\ntype float_prop = number_t prop\n"],"names":[],"mappings":"cCy0BqF,EAApB,aAAoB,I,EA3XxC,qBA0X3C,WACE,IAAmF,a,EALxD,IAAc,KAAE,C,KANb,IAAd,EAAb,EAAkD,gBAAlD,aAA6D,K,CAAA,EAE1D,QAA6C,UACnC,IAA6B,IAN7C,IADF,MAQU,C,SAlBH,eAAgD,QAKjD,yDAC+C,IAD/C,UACyB,OAAsB,KACxC,MAJoB,IAAtB,SAAsB,KAIhB,C,KAZO,iBAAhB,YACL,SAAO,QAAiC,GAA3B,uBAA4B,C,KALpB,iBAAhB,YACL,SAAO,QAA+B,GAAzB,uBAA0B,C,EAJjB,eAAjB,UAAR,EAAqE,C,EAnCrD,eAAhB,UAA8D,C,EAH9C,eAAhB,UAA4D,C,EAH5C,eAAhB,UAAwE,C,EAHxD,eAAhB,UAA+D,C,EAH/C,eAAhB,UAAwE,C,EAHxD,eAAhB,UAA+D,C,EAfzC,SAAwC,C,EAFzC,wBAAqC,C,EAxB9B,QAAV,EAAgC,C,KAFzB,iBAhjBN,QAAa,QAAuB,KAAK,OAgjBJ,U,EAH9B,QAAV,EAAgC,C,EAFzB,QAAV,EAA6B,C,EAlOyB,gBAAO,C,EAAvD,WAAiB,IAJzB,YAIiE,C,EAFT,wBAAG,C,EAApD,WAAiB,IAFxB,YAE6D,C,sBAhB7B,mBAA0B,C,QAhQtC,oBA7CZ,QAAa,QAAgB,GA6CS,kBAAI,C,QAFlC,0BA3CR,QAAa,QAAgB,GA2CJ,kBAAI,C,EAd1B,aAAyB,QASO,WAAhB,KAAuB,C,EAJzD,eACU,gBACU,C,KALL,aAAyB,QAAgB,GAAV,oBAAW,C,KAFvC,aAAyB,OAAgB,kBAAV,oB,CAAa,C,OAF1C,aAA2B,WAAM,uBAAG,C,EAFzC,aAA2B,S,QAF1B,eAAyB,QAAqB,kBAAf,OAAkB,C,QAFlD,eAAyB,QAA4B,kBAAtB,OAA2B,C,EAvBvD,aAAa,QASmB,WAAhB,KAAuB,C,KAP1C,aAAa,QAAgB,GAAV,oBAAW,C,KAF3B,aAAa,OAAgB,kBAAV,oB,CAAa,C,OAF9B,aAAe,WAAM,uBAAG,C,EAF7B,aAAe,S,QAFd,eAAa,QAAgB,kBAAV,OAAa,C,QAFjC,eAAa,QAAuB,kBAAjB,OAAsB,C,wBAnFpB,IAAzB,MAAyB,MAoCpB,MAIQ,MAA+B,0NAsI/C,MAEC,MAyIK,UAEP,UA6EmC,GAAvB,UAAuB,KAIxB,UAwIN,UAmFP,UAYQ,UAAsB,0DAiCjC,UAuBa,UAAqB,6GAgExC,cAQkB,iK","ignoreList":[0]}},{"offset":{"line":0,"column":67032},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/dom.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\nclass type ['node] nodeList = object\n method item : int -> 'node t opt meth\n\n method length : int readonly_prop\nend\n\nlet list_of_nodeList (nodeList : 'a nodeList t) =\n let length = nodeList##.length in\n let rec add_item acc i =\n if i < length\n then\n match Opt.to_option (nodeList##item i) with\n | None -> add_item acc (i + 1)\n | Some e -> add_item (e :: acc) (i + 1)\n else List.rev acc\n in\n add_item [] 0\n\ntype nodeType =\n | OTHER\n (* Will not happen *)\n | ELEMENT\n | ATTRIBUTE\n | TEXT\n | CDATA_SECTION\n | ENTITY_REFERENCE\n | ENTITY\n | PROCESSING_INSTRUCTION\n | COMMENT\n | DOCUMENT\n | DOCUMENT_TYPE\n | DOCUMENT_FRAGMENT\n | NOTATION\n\nmodule DocumentPosition = struct\n type t = int\n\n type mask = int\n\n let disconnected = 0x01\n\n let preceding = 0x02\n\n let following = 0x04\n\n let contains = 0x08\n\n let contained_by = 0x10\n\n let implementation_specific = 0x20\n\n let has t mask = t land mask = mask\n\n let add x y = x lor y\n\n let ( + ) = add\nend\n\nclass type node = object\n method nodeName : js_string t readonly_prop\n\n method nodeValue : js_string t opt readonly_prop\n\n method nodeType : nodeType readonly_prop\n\n method parentNode : node t opt prop\n\n method childNodes : node nodeList t prop\n\n method firstChild : node t opt prop\n\n method lastChild : node t opt prop\n\n method previousSibling : node t opt prop\n\n method nextSibling : node t opt prop\n\n method namespaceURI : js_string t opt prop\n\n method insertBefore : node t -> node t opt -> node t meth\n\n method replaceChild : node t -> node t -> node t meth\n\n method removeChild : node t -> node t meth\n\n method appendChild : node t -> node t meth\n\n method hasChildNodes : bool t meth\n\n method cloneNode : bool t -> node t meth\n\n method compareDocumentPosition : node t -> DocumentPosition.t meth\n\n method lookupNamespaceURI : js_string t -> js_string t opt meth\n\n method lookupPrefix : js_string t -> js_string t opt meth\nend\n\nlet appendChild (p : #node t) (n : #node t) = ignore (p##appendChild (n :> node t))\n\nlet removeChild (p : #node t) (n : #node t) = ignore (p##removeChild (n :> node t))\n\nlet replaceChild (p : #node t) (n : #node t) (o : #node t) =\n ignore (p##replaceChild (n :> node t) (o :> node t))\n\nlet insertBefore (p : #node t) (n : #node t) (o : #node t opt) =\n ignore (p##insertBefore (n :> node t) (o :> node t opt))\n\n(** Specification of [Attr] objects. *)\nclass type attr = object\n inherit node\n\n method name : js_string t readonly_prop\n\n method specified : bool t readonly_prop\n\n method value : js_string t prop\n\n method ownerElement : element t prop\nend\n\n(** Specification of [NamedNodeMap] objects. *)\nand ['node] namedNodeMap = object\n method getNamedItem : js_string t -> 'node t opt meth\n\n method setNamedItem : 'node t -> 'node t opt meth\n\n method removeNamedItem : js_string t -> 'node t opt meth\n\n method item : int -> 'node t opt meth\n\n method length : int readonly_prop\nend\n\n(** Specification of [Element] objects. *)\nand element = object\n inherit node\n\n method tagName : js_string t readonly_prop\n\n method getAttribute : js_string t -> js_string t opt meth\n\n method setAttribute : js_string t -> js_string t -> unit meth\n\n method removeAttribute : js_string t -> unit meth\n\n method hasAttribute : js_string t -> bool t meth\n\n method getAttributeNS : js_string t -> js_string t -> js_string t opt meth\n\n method setAttributeNS : js_string t -> js_string t -> js_string t -> unit meth\n\n method removeAttributeNS : js_string t -> js_string t -> unit meth\n\n method hasAttributeNS : js_string t -> js_string t -> bool t meth\n\n method getAttributeNode : js_string t -> attr t opt meth\n\n method setAttributeNode : attr t -> attr t opt meth\n\n method removeAttributeNode : attr t -> attr t meth\n\n method getAttributeNodeNS : js_string t -> js_string t -> attr t opt meth\n\n method setAttributeNodeNS : attr t -> attr t opt meth\n\n method getElementsByTagName : js_string t -> element nodeList t meth\n\n method attributes : attr namedNodeMap t readonly_prop\nend\n\nclass type characterData = object\n inherit node\n\n method data : js_string t prop\n\n method length : int readonly_prop\n\n method substringData : int -> int -> js_string t meth\n\n method appendData : js_string t -> unit meth\n\n method insertData : int -> js_string t -> unit meth\n\n method deleteData : int -> int -> unit meth\n\n method replaceData : int -> int -> js_string t -> unit meth\nend\n\nclass type comment = characterData\n\nclass type text = characterData\n\nclass type documentFragment = node\n\nclass type ['element] document = object\n inherit node\n\n method documentElement : 'element t readonly_prop\n\n method createDocumentFragment : documentFragment t meth\n\n method createElement : js_string t -> 'element t meth\n\n method createElementNS : js_string t -> js_string t -> 'element t meth\n\n method createTextNode : js_string t -> text t meth\n\n method createAttribute : js_string t -> attr t meth\n\n method createComment : js_string t -> comment t meth\n\n method getElementById : js_string t -> 'element t opt meth\n\n method getElementsByTagName : js_string t -> 'element nodeList t meth\n\n method importNode : element t -> bool t -> 'element t meth\n\n method adoptNode : element t -> 'element t meth\nend\n\ntype node_type =\n | Element of element t\n | Attr of attr t\n | Text of text t\n | Other of node t\n\nlet nodeType e =\n match e##.nodeType with\n | ELEMENT -> Element (Js.Unsafe.coerce e)\n | ATTRIBUTE -> Attr (Js.Unsafe.coerce e)\n | CDATA_SECTION | TEXT -> Text (Js.Unsafe.coerce e)\n | _ -> Other (e :> node t)\n\nmodule CoerceTo = struct\n let cast (e : #node Js.t) t =\n if e##.nodeType == t then Js.some (Js.Unsafe.coerce e) else Js.null\n\n let element e : element Js.t Js.opt = cast e ELEMENT\n\n let text e : text Js.t Js.opt =\n if e##.nodeType == TEXT || e##.nodeType == CDATA_SECTION\n then Js.some (Js.Unsafe.coerce e)\n else Js.null\n\n let attr e : attr Js.t Js.opt = cast e ATTRIBUTE\nend\n\ntype ('a, 'b) event_listener = ('a, 'b -> bool t) meth_callback opt\n(** The type of event listener functions. The first type parameter\n ['a] is the type of the target object; the second parameter\n ['b] is the type of the event object. *)\n\nclass type ['a] event = object\n method _type : js_string t readonly_prop\n\n method target : 'a t opt readonly_prop\n\n method currentTarget : 'a t opt readonly_prop\n\n method preventDefault : unit meth\n\n (* Legacy methods *)\n method srcElement : 'a t opt readonly_prop\nend\n\nclass type ['a, 'b] customEvent = object\n inherit ['a] event\n\n method detail : 'b Js.opt Js.readonly_prop\nend\n\nlet no_handler : ('a, 'b) event_listener = Js.null\n\n(* The function preventDefault must be called explicitly when\n using addEventListener... *)\nlet handler f =\n Js.some\n (Js.Unsafe.callback (fun e ->\n let res = f e in\n if not (Js.to_bool res) then e##preventDefault;\n res))\n\nlet full_handler f =\n Js.some\n (Js.Unsafe.meth_callback (fun this e ->\n let res = f this e in\n if not (Js.to_bool res) then e##preventDefault;\n res))\n\nlet invoke_handler (f : ('a, 'b) event_listener) (this : 'a) (event : 'b) : bool t =\n Js.Unsafe.call f this [| Js.Unsafe.inject event |]\n\nlet eventTarget (e : (< .. > as 'a) #event t) : 'a t =\n Opt.get e##.target (fun () -> Opt.get e##.srcElement (fun () -> raise Not_found))\n\nmodule Event = struct\n type 'a typ = Js.js_string Js.t\n\n let make s = Js.string s\nend\n\ntype event_listener_id = unit -> unit\n\nclass type event_listener_options = object\n method capture : bool t writeonly_prop\n\n method once : bool t writeonly_prop\n\n method passive : bool t writeonly_prop\nend\n\nlet addEventListenerWithOptions (e : < .. > t) typ ?capture ?once ?passive h =\n if not (Js.Optdef.test (Js.Unsafe.coerce e)##.addEventListener)\n then\n let ev = (Js.string \"on\")##concat typ in\n let callback e = Js.Unsafe.call (h, e, [||]) in\n let () = (Js.Unsafe.coerce e)##attachEvent ev callback in\n fun () -> (Js.Unsafe.coerce e)##detachEvent ev callback\n else\n let opts : event_listener_options t = Js.Unsafe.obj [||] in\n let iter t f =\n match t with\n | None -> ()\n | Some b -> f b\n in\n iter capture (fun b -> opts##.capture := b);\n iter once (fun b -> opts##.once := b);\n iter passive (fun b -> opts##.passive := b);\n let () = (Js.Unsafe.coerce e)##addEventListener typ h opts in\n fun () -> (Js.Unsafe.coerce e)##removeEventListener typ h opts\n\nlet addEventListener (e : < .. > t) typ h capt =\n addEventListenerWithOptions e typ ~capture:capt h\n\nlet removeEventListener id = id ()\n\nlet preventDefault ev = ev##preventDefault\n\nlet createCustomEvent ?bubbles ?cancelable ?detail typ =\n let opt_iter f = function\n | None -> ()\n | Some x -> f x\n in\n let opts = Unsafe.obj [||] in\n opt_iter (fun x -> opts##.bubbles := bool x) bubbles;\n opt_iter (fun x -> opts##.cancelable := bool x) cancelable;\n opt_iter (fun x -> opts##.detail := some x) detail;\n let constr :\n ( ('a, 'b) #customEvent Js.t Event.typ\n -> < detail : 'b opt prop > t\n -> ('a, 'b) customEvent t)\n constr =\n Unsafe.global##._CustomEvent\n in\n new%js constr typ opts\n\nclass type stringList = object\n method item : int -> js_string t opt meth\n\n method length : int readonly_prop\n\n method contains : js_string t -> bool t meth\nend\n","(* generated code *)"],"names":[],"mappings":"GA+Wa,MAJE,O,CAAA,YAKwB,IAAM,cAL9B,O,CAAA,YAM2B,IAAM,cANjC,O,CAAA,YAOM,OAAiB,eAAM,cAAQ,eAMhD,MAEF,cAAsB,C,EAlBA,QAAkB,C,KAFb,mBAAK,C,EAFhC,+BAAiD,C,KAfrC,iCAA6C,C,ECrV3D,gB,EDmVqB,oCAA2B,C,KAclC,yCAAoD,C,MAjBzC,QAAuC,eAAvD,aAAwD,QAEpD,cACT,UACS,iBACT,aAEsC,MAEpC,O,CAAA,cAIqB,cAJrB,O,CAAA,cAKkB,cALlB,O,CAAA,cAMqB,cACd,qBACT,eAA8D,C,EA/BnD,IAAW,C,EALwC,SAAe,C,EAAjD,KAAQ,UAAc,8BAA4B,C,KAAhF,UAAQ,QAAU,8BAA+D,C,EAHjF,gBAAkD,C,EALjC,kBACH,EAAgB,QAAM,UAC7B,EAAG,C,EAJV,WACE,EAGU,qB,EATK,0BACH,EAAgB,QAAM,UAC7B,EAAG,C,EAJV,QACE,EAGU,qB,EApCoB,SAAgB,C,EAJ/B,IAAZ,QAAY,C,CAAA,EAAwB,IAAZ,QAAY,C,CAAA,EAElC,UADA,sBACO,C,EALwB,SAAc,C,KAF/C,QAAY,+BAAW,uBAAkC,QAAO,C,EAR/D,UAAY,K,CAAA,E,EAAA,8BAGQ,YADX,YADF,aAGN,UAAmB,C,EA9HnB,iBAAiD,K,EAHjD,iBAA6C,K,EAHD,aAA8B,K,EAF9B,aAA8B,K,EA7CnE,iBAAO,C,KAFJ,wBAAkB,C,QA5CtB,UASb,QAPE,kBAEsB,cAAkB,eAAhC,eAAgC,OAC5B,UACE,IADF,UACE,kB,EACT,uB,GAEM,C,ECvCf,kH,QAAA,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,c,cAAA,sD,EAAA,c,EAAA,c,EAAA,c,EAAA,c,EAAA,c,oBAAA","ignoreList":[1]}},{"offset":{"line":0,"column":69168},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/js_of_ocaml/typed_array.ml"],"sourcesContent":["(* generated code *)","(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2012 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\nopen Js\n\nclass type arrayBuffer = object\n method byteLength : int readonly_prop\n\n method slice : int -> int -> arrayBuffer t meth\n\n method slice_toEnd : int -> arrayBuffer t meth\nend\n\nlet arrayBuffer : (int -> arrayBuffer t) constr = Js.Unsafe.global##._ArrayBuffer\n\nclass type arrayBufferView = object\n method buffer : arrayBuffer t readonly_prop\n\n method byteOffset : int readonly_prop\n\n method byteLength : int readonly_prop\nend\n\nclass type ['a, 'b, 'c] typedArray = object\n inherit arrayBufferView\n\n method _BYTES_PER_ELEMENT : int readonly_prop\n\n method length : int readonly_prop\n\n method set_fromArray : 'a js_array t -> int -> unit meth\n\n method set_fromTypedArray : ('a, 'b, 'c) typedArray t -> int -> unit meth\n\n method subarray : int -> int -> ('a, 'b, 'c) typedArray t meth\n\n method subarray_toEnd : int -> ('a, 'b, 'c) typedArray t meth\n\n method slice : int -> int -> ('a, 'b, 'c) typedArray t meth\n\n method slice_toEnd : int -> ('a, 'b, 'c) typedArray t meth\n\n (* This fake method is needed for typing purposes.\n Without it, ['b] would not be constrained. *)\n method _content_type_ : ('b * 'c) optdef readonly_prop\nend\n\ntype int8Array = (int, int, Bigarray.int8_signed_elt) typedArray\n\ntype uint8Array = (int, int, Bigarray.int8_unsigned_elt) typedArray\n\ntype int16Array = (int, int, Bigarray.int16_signed_elt) typedArray\n\ntype uint16Array = (int, int, Bigarray.int16_unsigned_elt) typedArray\n\ntype int32Array = (number_t, Int32.t, Bigarray.int32_elt) typedArray\n\ntype uint32Array = (number_t, Int32.t, Bigarray.int32_elt) typedArray\n\ntype float32Array = (number_t, float, Bigarray.float32_elt) typedArray\n\ntype float64Array = (number_t, float, Bigarray.float64_elt) typedArray\n\ntype (_, _, _) kind =\n | Int8_signed : (int, int, Bigarray.int8_signed_elt) kind\n | Int8_unsigned : (int, int, Bigarray.int8_unsigned_elt) kind\n | Int16_signed : (int, int, Bigarray.int16_signed_elt) kind\n | Int16_unsigned : (int, int, Bigarray.int16_unsigned_elt) kind\n | Int32_signed : (number_t, Int32.t, Bigarray.int32_elt) kind\n | Int32_unsigned : (number_t, Int32.t, Bigarray.int32_elt) kind\n | Float32 : (number_t, float, Bigarray.float32_elt) kind\n | Float64 : (number_t, float, Bigarray.float64_elt) kind\n\nexternal kind :\n ('typed_array, 'bigarray, 'elt) typedArray t -> ('bigarray, 'elt) Bigarray.kind\n = \"caml_ba_kind_of_typed_array\"\n\nexternal from_genarray_impl :\n ('bigarray, 'elt, Bigarray.c_layout) Bigarray.Genarray.t\n -> ('typed_array, 'bigarray, 'elt) typedArray t = \"caml_ba_to_typed_array\"\n\nexternal to_genarray :\n ('typed_array, 'bigarray, 'elt) typedArray t\n -> ('bigarray, 'elt, Bigarray.c_layout) Bigarray.Genarray.t = \"caml_ba_from_typed_array\"\n\nlet from_genarray (_ : ('typed_array, 'bigarray, 'elt) kind) a = from_genarray_impl a\n\nlet int8Array = Js.Unsafe.global##._Int8Array\n\nlet int8Array_fromArray = int8Array\n\nlet int8Array_fromTypedArray = int8Array\n\nlet int8Array_fromBuffer = int8Array\n\nlet int8Array_inBuffer = int8Array\n\nlet uint8Array = Js.Unsafe.global##._Uint8Array\n\nlet uint8Array_fromArray = uint8Array\n\nlet uint8Array_fromTypedArray = uint8Array\n\nlet uint8Array_fromBuffer = uint8Array\n\nlet uint8Array_inBuffer = uint8Array\n\nlet int16Array = Js.Unsafe.global##._Int16Array\n\nlet int16Array_fromArray = int16Array\n\nlet int16Array_fromTypedArray = int16Array\n\nlet int16Array_fromBuffer = int16Array\n\nlet int16Array_inBuffer = int16Array\n\nlet uint16Array = Js.Unsafe.global##._Uint16Array\n\nlet uint16Array_fromArray = uint16Array\n\nlet uint16Array_fromTypedArray = uint16Array\n\nlet uint16Array_fromBuffer = uint16Array\n\nlet uint16Array_inBuffer = uint16Array\n\nlet int32Array = Js.Unsafe.global##._Int32Array\n\nlet int32Array_fromArray = int32Array\n\nlet int32Array_fromTypedArray = int32Array\n\nlet int32Array_fromBuffer = int32Array\n\nlet int32Array_inBuffer = int32Array\n\nlet uint32Array = Js.Unsafe.global##._Uint32Array\n\nlet uint32Array_fromArray = uint32Array\n\nlet uint32Array_fromTypedArray = uint32Array\n\nlet uint32Array_fromBuffer = uint32Array\n\nlet uint32Array_inBuffer = uint32Array\n\nlet float32Array = Js.Unsafe.global##._Float32Array\n\nlet float32Array_fromArray = float32Array\n\nlet float32Array_fromTypedArray = float32Array\n\nlet float32Array_fromBuffer = float32Array\n\nlet float32Array_inBuffer = float32Array\n\nlet float64Array = Js.Unsafe.global##._Float64Array\n\nlet float64Array_fromArray = float64Array\n\nlet float64Array_fromTypedArray = float64Array\n\nlet float64Array_fromBuffer = float64Array\n\nlet float64Array_inBuffer = float64Array\n\nlet set : ('a, _, _) typedArray t -> int -> 'a -> unit =\n fun a i v -> array_set (Unsafe.coerce a) i v\n\nlet get : ('a, _, _) typedArray t -> int -> 'a optdef = fun a i -> Js.Unsafe.get a i\n\nlet unsafe_get : ('a, _, _) typedArray t -> int -> 'a = fun a i -> Js.Unsafe.get a i\n\nclass type dataView = object\n inherit arrayBufferView\n\n method getInt8 : int -> int meth\n\n method getUint8 : int -> int meth\n\n method getInt16 : int -> int meth\n\n method getInt16_ : int -> bool t -> int meth\n\n method getUint16 : int -> int meth\n\n method getUint16_ : int -> bool t -> int meth\n\n method getInt32 : int -> number_t meth\n\n method getInt32_ : int -> bool t -> number_t meth\n\n method getUint32 : int -> number_t meth\n\n method getUint32_ : int -> bool t -> number_t meth\n\n method getFloat32 : int -> number_t meth\n\n method getFloat32_ : int -> bool t -> number_t meth\n\n method getFloat64 : int -> number_t meth\n\n method getFloat64_ : int -> bool t -> number_t meth\n\n method setInt8 : int -> int -> unit meth\n\n method setUint8 : int -> int -> unit meth\n\n method setInt16 : int -> int -> unit meth\n\n method setInt16_ : int -> int -> bool t -> unit meth\n\n method setUint16 : int -> int -> unit meth\n\n method setUint16_ : int -> int -> bool t -> unit meth\n\n method setInt32 : int -> number_t -> unit meth\n\n method setInt32_ : int -> number_t -> bool t -> unit meth\n\n method setUint32 : int -> number_t -> unit meth\n\n method setUint32_ : int -> number_t -> bool t -> unit meth\n\n method setFloat32 : int -> number_t -> unit meth\n\n method setFloat32_ : int -> number_t -> bool t -> unit meth\n\n method setFloat64 : int -> number_t -> unit meth\n\n method setFloat64_ : int -> number_t -> bool t -> unit meth\nend\n\nlet dataView = Js.Unsafe.global##._DataView\n\nlet dataView_inBuffer = dataView\n\nmodule Bigstring = struct\n type t = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t\n\n external to_arrayBuffer : t -> arrayBuffer Js.t = \"bigstring_to_array_buffer\"\n\n external to_uint8Array : t -> uint8Array Js.t = \"bigstring_to_typed_array\"\n\n external of_arrayBuffer : arrayBuffer Js.t -> t = \"bigstring_of_array_buffer\"\n\n external of_uint8Array : uint8Array Js.t -> t = \"bigstring_of_typed_array\"\nend\n\nmodule String = struct\n external of_uint8Array : uint8Array Js.t -> string = \"caml_string_of_uint8_array\"\n\n let of_arrayBuffer ab =\n let uint8 = new%js uint8Array_fromBuffer ab in\n of_uint8Array uint8\nend\n\nmodule Bytes = struct\n external of_uint8Array : uint8Array Js.t -> bytes = \"caml_bytes_of_uint8_array\"\n\n external to_uint8Array : bytes -> uint8Array Js.t = \"caml_uint8_array_of_bytes\"\n\n let of_arrayBuffer ab =\n let uint8 = new%js uint8Array_fromBuffer ab in\n of_uint8Array uint8\nend\n"],"names":[],"mappings":"iECyRgB,mBACZ,EAAmB,C,EAXP,mBACZ,EAAmB,C,EAnF4C,MAAiB,C,EAJtE,0BAA+B,C,EAnFoB,IAAoB,C,MAqJ1C,ID3P3C,eC8BkD,MA6NP,OA7NsC,eA0EjE,QAmJ2B,QAnJE,eAU5B,QAyI0B,QAzII,eAU9B,QA+H0B,QA/HI,eAU7B,QAqHyB,QArHM,eAUhC,QA2G0B,QA3GI,eAU7B,QAiGyB,QAjGM,eAU9B,QAuFwB,QAvFQ,eAUhC,QA6EwB,cA7EQ,eA6EpC,QAA4B,oE","ignoreList":[0]}},{"offset":{"line":0,"column":69846},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/js_of_ocaml/file.ml"],"sourcesContent":["(* generated code *)","(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2011 Pierre Chambart\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen Dom\nopen! Import\n\nclass type blob = object\n method size : int readonly_prop\n\n method _type : js_string t readonly_prop\n\n method slice : int -> int -> blob t meth\n\n method slice_withContentType : int -> int -> js_string t -> blob t meth\nend\n\nlet blob_constr = Unsafe.global##._Blob\n\ntype 'a make_blob =\n ?contentType:string -> ?endings:[ `Transparent | `Native ] -> 'a -> blob t\n\nlet rec filter_map f = function\n | [] -> []\n | v :: q -> (\n match f v with\n | None -> filter_map f q\n | Some v' -> v' :: filter_map f q)\n\nlet make_blob_options contentType endings =\n let options =\n filter_map\n (fun (name, v) ->\n match v with\n | None -> None\n | Some v -> Some (name, Unsafe.inject (string v)))\n [ \"type\", contentType\n ; ( \"endings\"\n , match endings with\n | None -> None\n | Some `Transparent -> Some \"transparent\"\n | Some `Native -> Some \"native\" )\n ]\n in\n match options with\n | [] -> undefined\n | l -> Unsafe.obj (Array.of_list l)\n\nlet blob_raw ?contentType ?endings a =\n let options = make_blob_options contentType endings in\n new%js blob_constr (array a) options\n\nlet blob_from_string ?contentType ?endings s =\n blob_raw ?contentType ?endings [| string s |]\n\nlet blob_from_any ?contentType ?endings l =\n let l =\n List.map\n (function\n | `arrayBuffer a -> Unsafe.inject a\n | `arrayBufferView a -> Unsafe.inject a\n | `string s -> Unsafe.inject (string s)\n | `js_string s -> Unsafe.inject s\n | `blob b -> Unsafe.inject b)\n l\n in\n blob_raw ?contentType ?endings (Array.of_list l)\n\nclass type file = object\n inherit blob\n\n method name : js_string t readonly_prop\n\n method lastModified : number_t readonly_prop\n\n method lastModifiedDate : Js.date t readonly_prop\n (** @deprecated Use [lastModified] instead. *)\nend\n\n(* in firefox 3.0-3.5 file.name is not available, we use the nonstandard fileName instead *)\nclass type file_name_only = object\n method name : js_string t optdef readonly_prop\n\n method fileName : js_string t optdef readonly_prop\nend\n\nlet filename file =\n let file : file_name_only t = Js.Unsafe.coerce file in\n match Optdef.to_option file##.name with\n | None -> (\n match Optdef.to_option file##.fileName with\n | None -> failwith \"can't retrieve file name: not implemented\"\n | Some name -> name)\n | Some name -> name\n\ntype file_any = < > t\n\nlet doc_constr = Unsafe.global##._Document\n\nmodule CoerceTo = struct\n external json : file_any -> 'a Opt.t = \"%identity\"\n\n let document (e : file_any) =\n if instanceof e doc_constr\n then Js.some (Unsafe.coerce e : element document t)\n else Js.null\n\n let blob (e : file_any) =\n if instanceof e blob_constr then Js.some (Unsafe.coerce e : #blob t) else Js.null\n\n let string (e : file_any) =\n if Js.equals (typeof e) (string \"string\")\n then Js.some (Unsafe.coerce e : js_string t)\n else Js.null\n\n let arrayBuffer (e : file_any) =\n if instanceof e Typed_array.arrayBuffer\n then Js.some (Unsafe.coerce e : Typed_array.arrayBuffer t)\n else Js.null\nend\n\nclass type fileList = object\n inherit [file] Dom.nodeList\nend\n\nclass type fileError = object\n method code : int readonly_prop\nend\n\nclass type ['a] progressEvent = object\n inherit ['a] event\n\n method lengthComputable : bool t readonly_prop\n\n method loaded : int readonly_prop\n\n method total : int readonly_prop\nend\n\nclass type progressEventTarget = object ('self)\n method onloadstart : ('self t, 'self progressEvent t) event_listener writeonly_prop\n\n method onprogress : ('self t, 'self progressEvent t) event_listener writeonly_prop\n\n method onload : ('self t, 'self progressEvent t) event_listener writeonly_prop\n\n method onabort : ('self t, 'self progressEvent t) event_listener writeonly_prop\n\n method onerror : ('self t, 'self progressEvent t) event_listener writeonly_prop\n\n method onloadend : ('self t, 'self progressEvent t) event_listener writeonly_prop\nend\n\ntype readyState =\n | EMPTY\n | LOADING\n | DONE\n\nclass type fileReader = object ('self)\n method readAsArrayBuffer : #blob t -> unit meth\n\n method readAsBinaryString : #blob t -> unit meth\n\n method readAsText : #blob t -> unit meth\n\n method readAsText_withEncoding : #blob t -> js_string t -> unit meth\n\n method readAsDataURL : #blob t -> unit meth\n\n method abort : unit meth\n\n method readyState : readyState readonly_prop\n\n method result : file_any readonly_prop\n\n method error : fileError t readonly_prop\n\n inherit progressEventTarget\nend\n\nmodule ReaderEvent = struct\n type typ = fileReader progressEvent t Dom.Event.typ\n\n let loadstart = Event.make \"loadstart\"\n\n let progress = Event.make \"progress\"\n\n let abort = Event.make \"abort\"\n\n let error = Event.make \"error\"\n\n let load = Event.make \"load\"\n\n let loadend = Event.make \"loadend\"\nend\n\nlet fileReader : fileReader t constr = Js.Unsafe.global##._FileReader\n\nlet addEventListener = Dom.addEventListener\n"],"names":[],"mappings":"OCqIO,EAAH,QAAG,EAAoC,QAElC,QADA,uBACO,C,EAPC,IAAV,KAAsC,QAEpC,QADA,uBACO,C,EALT,aAAwB,QAA+C,QAAzC,uBAAgD,C,GApB5D,QAAW,eAA5B,eAA4B,QAEP,QAAe,eAAhC,eAAgC,QAC5B,oCACK,WACA,C,QAnCf,kCAIoB,8BAFM,2BACK,GAAU,aAEV,C,KAPnC,OAUgD,IAT9C,KADF,OACE,aASF,OAA+B,aAAiB,U,KAbd,OAAQ,QAAR,IAAQ,eAAG,C,EArBzC,YACE,QACU,KACsC,QAHlD,UAEY,UAC4B,EAAU,SAAE,C,GAJtD,GAQgB,4BATlB,UASkB,qDARhB,KAaF,QACQ,QACU,EAAX,OAAW,aAAX,G,EAIY,MAAS,oBAAQ,C,QA5BnB,aACT,0BAEE,YAAG,OAEwB,IAFxB,UAEU,OAAc,MAAC,C,SAyK6B,IAnL9B,MDlCvC,eCkCkB,QAAqB,mBAmL8B,IAnG3B,GAhFH,eAgFtB,MAAyB,WAmG2B,aAHjC,IAVlB,GAtFwB,eAsFxB,aAED,GAFuB,eAEvB,aAEH,GAFwB,eAExB,aAEA,GAFkB,eAElB,aAED,GAFmB,eAEnB,aAEG,GAFc,eAEd,aAAoB,IAGiC,GAHjC,eAGG,MAA8B,mB","ignoreList":[0]}},{"offset":{"line":0,"column":71149},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/dom_html.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\nexternal html_escape : js_string t -> js_string t = \"caml_js_html_escape\"\n\nexternal html_entities : js_string t -> js_string t opt = \"caml_js_html_entities\"\n\nlet decode_html_entities s =\n Js.Opt.get (html_entities s) (fun () -> failwith (\"Invalid entity \" ^ Js.to_string s))\n\nclass type cssStyleDeclaration = object\n method setProperty :\n js_string t -> js_string t -> js_string t optdef -> js_string t meth\n\n method getPropertyValue : js_string t -> js_string t meth\n\n method getPropertyPriority : js_string t -> js_string t meth\n\n method removeProperty : js_string t -> js_string t meth\n\n method animation : js_string t prop\n\n method animationDelay : js_string t prop\n\n method animationDirection : js_string t prop\n\n method animationDuration : js_string t prop\n\n method animationFillMode : js_string t prop\n\n method animationIterationCount : js_string t prop\n\n method animationName : js_string t prop\n\n method animationPlayState : js_string t prop\n\n method animationTimingFunction : js_string t prop\n\n method background : js_string t prop\n\n method backgroundAttachment : js_string t prop\n\n method backgroundColor : js_string t prop\n\n method backgroundImage : js_string t prop\n\n method backgroundPosition : js_string t prop\n\n method backgroundRepeat : js_string t prop\n\n method border : js_string t prop\n\n method borderBottom : js_string t prop\n\n method borderBottomColor : js_string t prop\n\n method borderBottomStyle : js_string t prop\n\n method borderBottomWidth : js_string t prop\n\n method borderCollapse : js_string t prop\n\n method borderColor : js_string t prop\n\n method borderLeft : js_string t prop\n\n method borderLeftColor : js_string t prop\n\n method borderLeftStyle : js_string t prop\n\n method borderLeftWidth : js_string t prop\n\n method borderRadius : js_string t prop\n\n method borderRight : js_string t prop\n\n method borderRightColor : js_string t prop\n\n method borderRightStyle : js_string t prop\n\n method borderRightWidth : js_string t prop\n\n method borderSpacing : js_string t prop\n\n method borderStyle : js_string t prop\n\n method borderTop : js_string t prop\n\n method borderTopColor : js_string t prop\n\n method borderTopStyle : js_string t prop\n\n method borderTopWidth : js_string t prop\n\n method borderWidth : js_string t prop\n\n method bottom : js_string t prop\n\n method captionSide : js_string t prop\n\n method clear : js_string t prop\n\n method clip : js_string t prop\n\n method color : js_string t prop\n\n method content : js_string t prop\n\n method counterIncrement : js_string t prop\n\n method counterReset : js_string t prop\n\n method cssFloat : js_string t prop\n\n method cssText : js_string t prop\n\n method cursor : js_string t prop\n\n method direction : js_string t prop\n\n method display : js_string t prop\n\n method emptyCells : js_string t prop\n\n method fill : js_string t prop\n\n method font : js_string t prop\n\n method fontFamily : js_string t prop\n\n method fontSize : js_string t prop\n\n method fontStyle : js_string t prop\n\n method fontVariant : js_string t prop\n\n method fontWeight : js_string t prop\n\n method height : js_string t prop\n\n method left : js_string t prop\n\n method letterSpacing : js_string t prop\n\n method lineHeight : js_string t prop\n\n method listStyle : js_string t prop\n\n method listStyleImage : js_string t prop\n\n method listStylePosition : js_string t prop\n\n method listStyleType : js_string t prop\n\n method margin : js_string t prop\n\n method marginBottom : js_string t prop\n\n method marginLeft : js_string t prop\n\n method marginRight : js_string t prop\n\n method marginTop : js_string t prop\n\n method maxHeight : js_string t prop\n\n method maxWidth : js_string t prop\n\n method minHeight : js_string t prop\n\n method minWidth : js_string t prop\n\n method opacity : js_string t prop\n\n method outline : js_string t prop\n\n method outlineColor : js_string t prop\n\n method outlineOffset : js_string t prop\n\n method outlineStyle : js_string t prop\n\n method outlineWidth : js_string t prop\n\n method overflow : js_string t prop\n\n method overflowX : js_string t prop\n\n method overflowY : js_string t prop\n\n method padding : js_string t prop\n\n method paddingBottom : js_string t prop\n\n method paddingLeft : js_string t prop\n\n method paddingRight : js_string t prop\n\n method paddingTop : js_string t prop\n\n method pageBreakAfter : js_string t prop\n\n method pageBreakBefore : js_string t prop\n\n method pointerEvents : js_string t prop\n\n method position : js_string t prop\n\n method right : js_string t prop\n\n method stroke : js_string t prop\n\n method strokeWidth : js_string t prop\n\n method tableLayout : js_string t prop\n\n method textAlign : js_string t prop\n\n method textAnchor : js_string t prop\n\n method textDecoration : js_string t prop\n\n method textIndent : js_string t prop\n\n method textTransform : js_string t prop\n\n method top : js_string t prop\n\n method transform : js_string t prop\n\n method verticalAlign : js_string t prop\n\n method visibility : js_string t prop\n\n method whiteSpace : js_string t prop\n\n method width : js_string t prop\n\n method wordSpacing : js_string t prop\n\n method zIndex : js_string t prop\nend\n\ntype ('a, 'b) event_listener = ('a, 'b) Dom.event_listener\n\ntype mouse_button =\n | No_button\n | Left_button\n | Middle_button\n | Right_button\n\ntype delta_mode =\n | Delta_pixel\n | Delta_line\n | Delta_page\n\nclass type event = object\n inherit [element] Dom.event\nend\n\nand ['a] customEvent = object\n inherit [element, 'a] Dom.customEvent\nend\n\nand focusEvent = object\n inherit event\n\n method relatedTarget : element t opt readonly_prop\nend\n\nand mouseEvent = object\n inherit event\n\n method relatedTarget : element t opt readonly_prop\n\n method clientX : number_t readonly_prop\n\n method clientY : number_t readonly_prop\n\n method screenX : number_t readonly_prop\n\n method screenY : number_t readonly_prop\n\n method offsetX : number_t readonly_prop\n\n method offsetY : number_t readonly_prop\n\n method ctrlKey : bool t readonly_prop\n\n method shiftKey : bool t readonly_prop\n\n method altKey : bool t readonly_prop\n\n method metaKey : bool t readonly_prop\n\n method button : int readonly_prop\n\n method buttons : int readonly_prop\n\n method which : mouse_button optdef readonly_prop\n\n method fromElement : element t opt optdef readonly_prop\n (** @deprecated Use [relatedTarget] instead. *)\n\n method toElement : element t opt optdef readonly_prop\n (** @deprecated Use [relatedTarget] instead. *)\n\n method pageX : number_t optdef readonly_prop\n\n method pageY : number_t optdef readonly_prop\nend\n\nand keyboardEvent = object\n inherit event\n\n method altKey : bool t readonly_prop\n\n method shiftKey : bool t readonly_prop\n\n method ctrlKey : bool t readonly_prop\n\n method metaKey : bool t readonly_prop\n\n method location : int readonly_prop\n\n method key : js_string t optdef readonly_prop\n\n method code : js_string t optdef readonly_prop\n\n method isComposing : bool t readonly_prop\n\n method repeat : bool t readonly_prop\n\n method getModifierState : js_string t -> bool t meth\n\n method which : int optdef readonly_prop\n\n method charCode : int optdef readonly_prop\n\n method keyCode : int readonly_prop\n\n method keyIdentifier : js_string t optdef readonly_prop\nend\n\nand wheelEvent = object\n (* All modern browsers *)\n inherit mouseEvent\n\n method deltaX : number_t readonly_prop\n\n method deltaY : number_t readonly_prop\n\n method deltaZ : number_t readonly_prop\n\n method deltaMode : delta_mode readonly_prop\n\n method wheelDelta : int readonly_prop\n\n method wheelDeltaX : int optdef readonly_prop\n\n method wheelDeltaY : int optdef readonly_prop\nend\n\nand mousewheelEvent = wheelEvent\n\nand mouseScrollEvent = object\n (* Deprecated *)\n inherit mouseEvent\n\n method detail : int readonly_prop\n\n method axis : int optdef readonly_prop\n\n method _HORIZONTAL_AXIS : int optdef readonly_prop\n\n method _VERTICAL_AXIS : int optdef readonly_prop\nend\n\nand touchEvent = object\n inherit event\n\n method touches : touchList t readonly_prop\n\n method targetTouches : touchList t readonly_prop\n\n method changedTouches : touchList t readonly_prop\n\n method ctrlKey : bool t readonly_prop\n\n method shiftKey : bool t readonly_prop\n\n method altKey : bool t readonly_prop\n\n method metaKey : bool t readonly_prop\n\n method relatedTarget : element t opt readonly_prop\nend\n\nand touchList = object\n method length : int readonly_prop\n\n method item : int -> touch t optdef meth\nend\n\nand touch = object\n method identifier : int readonly_prop\n\n method target : element t optdef readonly_prop\n\n method screenX : number_t readonly_prop\n\n method screenY : number_t readonly_prop\n\n method clientX : number_t readonly_prop\n\n method clientY : number_t readonly_prop\n\n method pageX : number_t readonly_prop\n\n method pageY : number_t readonly_prop\nend\n\nand submitEvent = object\n inherit event\n\n method submitter : element t opt readonly_prop\nend\n\nand dragEvent = object\n inherit mouseEvent\n\n method dataTransfer : dataTransfer t readonly_prop\nend\n\nand clipboardEvent = object\n inherit event\n\n method clipboardData : dataTransfer t readonly_prop\nend\n\nand toggleEvent = object\n inherit event\n\n method newState : js_string t readonly_prop\n\n method oldState : js_string t readonly_prop\nend\n\nand mediaQueryListEvent = object\n inherit event\n\n method matches : bool t readonly_prop\n\n method media : js_string t readonly_prop\nend\n\nand dataTransfer = object\n method dropEffect : js_string t prop\n\n method effectAllowed : js_string t prop\n\n method files : File.fileList t readonly_prop\n\n method types : js_string t js_array t readonly_prop\n\n method addElement : element t -> unit meth\n\n method clearData : js_string t -> unit meth\n\n method clearData_all : unit meth\n\n method getData : js_string t -> js_string t meth\n\n method setData : js_string t -> js_string t -> unit meth\n\n method setDragImage : element t -> int -> int -> unit meth\nend\n\nand eventTarget = object ('self)\n method onclick : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method ondblclick : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method onmousedown : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method onmouseup : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method onmouseover : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method onmousemove : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method onmouseout : ('self t, mouseEvent t) event_listener writeonly_prop\n\n method onkeypress : ('self t, keyboardEvent t) event_listener writeonly_prop\n\n method onkeydown : ('self t, keyboardEvent t) event_listener writeonly_prop\n\n method onkeyup : ('self t, keyboardEvent t) event_listener writeonly_prop\n\n method onscroll : ('self t, event t) event_listener writeonly_prop\n\n method onwheel : ('self t, wheelEvent t) event_listener writeonly_prop\n\n method ondragstart : ('self t, dragEvent t) event_listener writeonly_prop\n\n method ondragend : ('self t, dragEvent t) event_listener writeonly_prop\n\n method ondragenter : ('self t, dragEvent t) event_listener writeonly_prop\n\n method ondragover : ('self t, dragEvent t) event_listener writeonly_prop\n\n method ondragleave : ('self t, dragEvent t) event_listener writeonly_prop\n\n method ondrag : ('self t, dragEvent t) event_listener writeonly_prop\n\n method ondrop : ('self t, dragEvent t) event_listener writeonly_prop\n\n method onanimationstart : ('self t, animationEvent t) event_listener writeonly_prop\n\n method onanimationend : ('self t, animationEvent t) event_listener writeonly_prop\n\n method onanimationiteration : ('self t, animationEvent t) event_listener writeonly_prop\n\n method onanimationcancel : ('self t, animationEvent t) event_listener writeonly_prop\n\n method ontransitionrun : ('self t, transitionEvent t) event_listener writeonly_prop\n\n method ontransitionstart : ('self t, transitionEvent t) event_listener writeonly_prop\n\n method ontransitionend : ('self t, transitionEvent t) event_listener writeonly_prop\n\n method ontransitioncancel : ('self t, transitionEvent t) event_listener writeonly_prop\n\n method ongotpointercapture : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onlostpointercapture : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointerenter : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointercancel : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointerdown : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointerleave : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointermove : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointerout : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointerover : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method onpointerup : ('self t, pointerEvent t) event_listener writeonly_prop\n\n method dispatchEvent : event t -> bool t meth\nend\n\nand popStateEvent = object\n inherit event\n\n method state : Js.Unsafe.any readonly_prop\nend\n\nand pointerEvent = object\n inherit mouseEvent\n\n method pointerId : int readonly_prop\n\n method width : number_t readonly_prop\n\n method height : number_t readonly_prop\n\n method pressure : number_t readonly_prop\n\n method tangentialPressure : number_t readonly_prop\n\n method tiltX : int readonly_prop\n\n method tiltY : int readonly_prop\n\n method twist : int readonly_prop\n\n method pointerType : js_string t readonly_prop\n\n method isPrimary : bool t readonly_prop\nend\n\nand storageEvent = object\n inherit event\n\n method key : js_string t opt readonly_prop\n\n method oldValue : js_string t opt readonly_prop\n\n method newValue : js_string t opt readonly_prop\n\n method url : js_string t readonly_prop\n\n method storageArea : storage t opt readonly_prop\nend\n\nand storage = object\n method length : int readonly_prop\n\n method key : int -> js_string t opt meth\n\n method getItem : js_string t -> js_string t opt meth\n\n method setItem : js_string t -> js_string t -> unit meth\n\n method removeItem : js_string t -> unit meth\n\n method clear : unit meth\nend\n\nand hashChangeEvent = object\n inherit event\n\n method oldURL : js_string t readonly_prop\n\n method newURL : js_string t readonly_prop\nend\n\nand animationEvent = object\n inherit event\n\n method animationName : js_string t readonly_prop\n\n method elapsedTime : number_t readonly_prop\n\n method pseudoElement : js_string t readonly_prop\nend\n\nand transitionEvent = object\n inherit event\n\n method propertyName : js_string t readonly_prop\n\n method elapsedTime : number_t readonly_prop\n\n method pseudoElement : js_string t readonly_prop\nend\n\nand mediaEvent = object\n inherit event\nend\n\nand messageEvent = object\n inherit event\n\n method data : Unsafe.any opt readonly_prop\n\n method source : Unsafe.any opt readonly_prop\nend\n\nand nodeSelector = object\n method querySelector : js_string t -> element t opt meth\n\n method querySelectorAll : js_string t -> element Dom.nodeList t meth\nend\n\nand tokenList = object\n method length : int readonly_prop\n\n method item : int -> js_string t optdef meth\n\n method contains : js_string t -> bool t meth\n\n method add : js_string t -> unit meth\n\n method remove : js_string t -> unit meth\n\n method toggle : js_string t -> bool t meth\n\n method stringifier : js_string t prop\nend\n\nand element = object\n inherit Dom.element\n\n inherit nodeSelector\n\n method id : js_string t prop\n\n method title : js_string t prop\n\n method lang : js_string t prop\n\n method dir : js_string t prop\n\n method className : js_string t prop\n\n method classList : tokenList t readonly_prop\n\n method closest : js_string t -> element t opt meth\n\n method style : cssStyleDeclaration t prop\n\n method innerHTML : js_string t prop\n\n method outerHTML : js_string t prop\n\n method textContent : js_string t opt prop\n\n method innerText : js_string t prop\n\n method clientLeft : int readonly_prop\n\n method clientTop : int readonly_prop\n\n method clientWidth : int readonly_prop\n\n method clientHeight : int readonly_prop\n\n method offsetLeft : int readonly_prop\n\n method offsetTop : int readonly_prop\n\n method offsetParent : element t opt readonly_prop\n\n method offsetWidth : int readonly_prop\n\n method offsetHeight : int readonly_prop\n\n method scrollLeft : number_t prop\n\n method scrollTop : number_t prop\n\n method scrollWidth : int readonly_prop\n\n method scrollHeight : int readonly_prop\n\n method getClientRects : clientRectList t meth\n\n method getBoundingClientRect : clientRect t meth\n\n method scrollIntoView : bool t -> unit meth\n\n method click : unit meth\n\n method focus : unit meth\n\n method blur : unit meth\n\n inherit eventTarget\nend\n\nand clientRect = object\n method top : number_t readonly_prop\n\n method right : number_t readonly_prop\n\n method bottom : number_t readonly_prop\n\n method left : number_t readonly_prop\n\n method width : number_t readonly_prop\n\n method height : number_t readonly_prop\nend\n\nand clientRectList = object\n method length : int readonly_prop\n\n method item : int -> clientRect t opt meth\nend\n\nlet no_handler : ('a, 'b) event_listener = Dom.no_handler\n\nlet handler = Dom.handler\n\nlet full_handler = Dom.full_handler\n\nlet invoke_handler = Dom.invoke_handler\n\nmodule Event = struct\n type 'a typ = 'a Dom.Event.typ\n\n let cancel = Dom.Event.make \"cancel\"\n\n let click = Dom.Event.make \"click\"\n\n let close = Dom.Event.make \"close\"\n\n let copy = Dom.Event.make \"copy\"\n\n let cut = Dom.Event.make \"cut\"\n\n let paste = Dom.Event.make \"paste\"\n\n let dblclick = Dom.Event.make \"dblclick\"\n\n let mousedown = Dom.Event.make \"mousedown\"\n\n let mouseup = Dom.Event.make \"mouseup\"\n\n let mouseover = Dom.Event.make \"mouseover\"\n\n let mousemove = Dom.Event.make \"mousemove\"\n\n let mouseout = Dom.Event.make \"mouseout\"\n\n let keypress = Dom.Event.make \"keypress\"\n\n let keydown = Dom.Event.make \"keydown\"\n\n let keyup = Dom.Event.make \"keyup\"\n\n let mousewheel = Dom.Event.make \"mousewheel\"\n\n let wheel = Dom.Event.make \"wheel\"\n\n let _DOMMouseScroll = Dom.Event.make \"DOMMouseScroll\"\n\n let touchstart = Dom.Event.make \"touchstart\"\n\n let touchmove = Dom.Event.make \"touchmove\"\n\n let touchend = Dom.Event.make \"touchend\"\n\n let touchcancel = Dom.Event.make \"touchcancel\"\n\n let dragstart = Dom.Event.make \"dragstart\"\n\n let dragend = Dom.Event.make \"dragend\"\n\n let dragenter = Dom.Event.make \"dragenter\"\n\n let dragover = Dom.Event.make \"dragover\"\n\n let dragleave = Dom.Event.make \"dragleave\"\n\n let drag = Dom.Event.make \"drag\"\n\n let drop = Dom.Event.make \"drop\"\n\n let hashchange = Dom.Event.make \"hashchange\"\n\n let change = Dom.Event.make \"change\"\n\n let input = Dom.Event.make \"input\"\n\n let timeupdate = Dom.Event.make \"timeupdate\"\n\n let submit = Dom.Event.make \"submit\"\n\n let scroll = Dom.Event.make \"scroll\"\n\n let focus = Dom.Event.make \"focus\"\n\n let blur = Dom.Event.make \"blur\"\n\n let load = Dom.Event.make \"load\"\n\n let unload = Dom.Event.make \"unload\"\n\n let beforeunload = Dom.Event.make \"beforeunload\"\n\n let resize = Dom.Event.make \"resize\"\n\n let orientationchange = Dom.Event.make \"orientationchange\"\n\n let popstate = Dom.Event.make \"popstate\"\n\n let error = Dom.Event.make \"error\"\n\n let abort = Dom.Event.make \"abort\"\n\n let select = Dom.Event.make \"select\"\n\n let online = Dom.Event.make \"online\"\n\n let offline = Dom.Event.make \"offline\"\n\n let checking = Dom.Event.make \"checking\"\n\n let noupdate = Dom.Event.make \"noupdate\"\n\n let downloading = Dom.Event.make \"downloading\"\n\n let progress = Dom.Event.make \"progress\"\n\n let updateready = Dom.Event.make \"updateready\"\n\n let cached = Dom.Event.make \"cached\"\n\n let obsolete = Dom.Event.make \"obsolete\"\n\n let domContentLoaded = Dom.Event.make \"DOMContentLoaded\"\n\n let animationstart = Dom.Event.make \"animationstart\"\n\n let animationend = Dom.Event.make \"animationend\"\n\n let animationiteration = Dom.Event.make \"animationiteration\"\n\n let animationcancel = Dom.Event.make \"animationcancel\"\n\n let transitionrun = Dom.Event.make \"transitionrun\"\n\n let transitionstart = Dom.Event.make \"transitionstart\"\n\n let transitionend = Dom.Event.make \"transitionend\"\n\n let transitioncancel = Dom.Event.make \"transitioncancel\"\n\n let canplay = Dom.Event.make \"canplay\"\n\n let canplaythrough = Dom.Event.make \"canplaythrough\"\n\n let durationchange = Dom.Event.make \"durationchange\"\n\n let emptied = Dom.Event.make \"emptied\"\n\n let ended = Dom.Event.make \"ended\"\n\n let gotpointercapture = Dom.Event.make \"gotpointercapture\"\n\n let loadeddata = Dom.Event.make \"loadeddata\"\n\n let loadedmetadata = Dom.Event.make \"loadedmetadata\"\n\n let loadstart = Dom.Event.make \"loadstart\"\n\n let lostpointercapture = Dom.Event.make \"lostpointercapture\"\n\n let message = Dom.Event.make \"message\"\n\n let pause = Dom.Event.make \"pause\"\n\n let play = Dom.Event.make \"play\"\n\n let playing = Dom.Event.make \"playing\"\n\n let pointerenter = Dom.Event.make \"pointerenter\"\n\n let pointercancel = Dom.Event.make \"pointercancel\"\n\n let pointerdown = Dom.Event.make \"pointerdown\"\n\n let pointerleave = Dom.Event.make \"pointerleave\"\n\n let pointermove = Dom.Event.make \"pointermove\"\n\n let pointerout = Dom.Event.make \"pointerout\"\n\n let pointerover = Dom.Event.make \"pointerover\"\n\n let pointerup = Dom.Event.make \"pointerup\"\n\n let ratechange = Dom.Event.make \"ratechange\"\n\n let seeked = Dom.Event.make \"seeked\"\n\n let seeking = Dom.Event.make \"seeking\"\n\n let stalled = Dom.Event.make \"stalled\"\n\n let suspend = Dom.Event.make \"suspend\"\n\n let volumechange = Dom.Event.make \"volumechange\"\n\n let waiting = Dom.Event.make \"waiting\"\n\n let toggle = Dom.Event.make \"toggle\"\n\n let make = Dom.Event.make\nend\n\ntype event_listener_id = Dom.event_listener_id\n\nlet addEventListener = Dom.addEventListener\n\nlet addEventListenerWithOptions = Dom.addEventListenerWithOptions\n\nlet removeEventListener = Dom.removeEventListener\n\nlet createCustomEvent = Dom.createCustomEvent\n\nclass type ['node] collection = object\n method length : int readonly_prop\n\n method item : int -> 'node t opt meth\n\n method namedItem : js_string t -> 'node t opt meth\nend\n\nclass type htmlElement = element\n\nclass type headElement = object\n inherit element\n\n method profile : js_string t prop\nend\n\nclass type linkElement = object\n inherit element\n\n method disabled : bool t prop\n\n method charset : js_string t prop\n\n method crossorigin : js_string t prop\n\n method href : js_string t prop\n\n method hreflang : js_string t prop\n\n method media : js_string t prop\n\n method rel : js_string t prop\n\n method rev : js_string t prop\n\n method target : js_string t prop\n\n method _type : js_string t prop\nend\n\nclass type titleElement = object\n inherit element\n\n method text : js_string t prop\nend\n\nclass type metaElement = object\n inherit element\n\n method content : js_string t prop\n\n method httpEquiv : js_string t prop\n\n method name : js_string t prop\n\n method scheme : js_string t prop\nend\n\nclass type baseElement = object\n inherit element\n\n method href : js_string t prop\n\n method target : js_string t prop\nend\n\nclass type styleElement = object\n inherit element\n\n method disabled : bool t prop\n\n method media : js_string t prop\n\n method _type : js_string t prop\nend\n\nclass type bodyElement = element\n\nclass type formElement = object\n inherit element\n\n method elements : element collection t readonly_prop\n\n method length : int readonly_prop\n\n method acceptCharset : js_string t prop\n\n method action : js_string t prop\n\n method enctype : js_string t prop\n\n method _method : js_string t prop\n\n method target : js_string t prop\n\n method submit : unit meth\n\n method reset : unit meth\n\n method onsubmit : ('self t, submitEvent t) event_listener writeonly_prop\nend\n\nclass type optGroupElement = object\n inherit element\n\n method disabled : bool t prop\n\n method label : js_string t prop\nend\n\nclass type optionElement = object\n inherit optGroupElement\n\n method form : formElement t opt readonly_prop\n\n method defaultSelected : bool t prop\n\n method text : js_string t readonly_prop\n\n method index : int readonly_prop\n\n method selected : bool t prop\n\n method value : js_string t prop\nend\n\nclass type selectElement = object ('self)\n inherit element\n\n method _type : js_string t readonly_prop\n\n method selectedIndex : int prop\n\n method value : js_string t prop\n\n method length : int prop\n\n method form : formElement t opt readonly_prop\n\n method options : optionElement collection t readonly_prop\n\n method disabled : bool t prop\n\n method multiple : bool t prop\n\n method name : js_string t readonly_prop\n\n method size : int prop\n\n method tabIndex : int prop\n\n method add : #optGroupElement t -> #optGroupElement t opt -> unit meth\n\n method remove : int -> unit meth\n\n method required : bool t writeonly_prop\n\n method onchange : ('self t, event t) event_listener prop\n\n method oninput : ('self t, event t) event_listener prop\nend\n\nclass type inputElement = object ('self)\n inherit element\n\n method defaultValue : js_string t prop\n\n method defaultChecked : js_string t prop\n\n method form : formElement t opt readonly_prop\n\n method accept : js_string t prop\n\n method accessKey : js_string t prop\n\n method align : js_string t prop\n (** @deprecated Use CSS instead. *)\n\n method alt : js_string t prop\n\n method checked : bool t prop\n\n method disabled : bool t prop\n\n method maxLength : int prop\n\n method name : js_string t readonly_prop\n\n method readOnly : bool t prop\n\n method required : bool t writeonly_prop\n\n method size : int prop\n\n method src : js_string t prop\n\n method tabIndex : int prop\n\n method _type : js_string t readonly_prop\n\n method useMap : js_string t prop\n\n method value : js_string t prop\n\n method select : unit meth\n\n method files : File.fileList t readonly_prop\n\n method placeholder : js_string t writeonly_prop\n\n method selectionDirection : js_string t prop\n\n method selectionStart : int prop\n\n method selectionEnd : int prop\n\n method onselect : ('self t, event t) event_listener prop\n\n method onchange : ('self t, event t) event_listener prop\n\n method oninput : ('self t, event t) event_listener prop\n\n method onblur : ('self t, focusEvent t) event_listener prop\n\n method onfocus : ('self t, focusEvent t) event_listener prop\nend\n\nclass type textAreaElement = object ('self)\n inherit element\n\n method defaultValue : js_string t prop\n\n method form : formElement t opt readonly_prop\n\n method accessKey : js_string t prop\n\n method cols : int prop\n\n method disabled : bool t prop\n\n method name : js_string t readonly_prop\n\n method readOnly : bool t prop\n\n method rows : int prop\n\n method selectionDirection : js_string t prop\n\n method selectionEnd : int prop\n\n method selectionStart : int prop\n\n method tabIndex : int prop\n\n method _type : js_string t readonly_prop\n\n method value : js_string t prop\n\n method select : unit meth\n\n method required : bool t writeonly_prop\n\n method placeholder : js_string t writeonly_prop\n\n method onselect : ('self t, event t) event_listener prop\n\n method onchange : ('self t, event t) event_listener prop\n\n method oninput : ('self t, event t) event_listener prop\n\n method onblur : ('self t, focusEvent t) event_listener prop\n\n method onfocus : ('self t, focusEvent t) event_listener prop\nend\n\nclass type buttonElement = object\n inherit element\n\n method form : formElement t opt readonly_prop\n\n method accessKey : js_string t prop\n\n method disabled : bool t prop\n\n method name : js_string t readonly_prop\n\n method tabIndex : int prop\n\n method _type : js_string t readonly_prop\n\n method value : js_string t prop\nend\n\nclass type labelElement = object\n inherit element\n\n method form : formElement t opt readonly_prop\n\n method accessKey : js_string t prop\n\n method htmlFor : js_string t prop\nend\n\nclass type fieldSetElement = object\n inherit element\n\n method form : formElement t opt readonly_prop\nend\n\nclass type legendElement = object\n inherit element\n\n method form : formElement t opt readonly_prop\n\n method accessKey : js_string t prop\nend\n\nclass type uListElement = element\n\nclass type oListElement = element\n\nclass type dListElement = element\n\nclass type liElement = element\n\nclass type dialogElement = object\n inherit element\n\n method close : unit meth\n\n method close_returnValue : js_string t -> unit meth\n\n method open_ : bool t prop\n\n method returnValue : js_string t prop\n\n method show : unit meth\n\n method showModal : unit meth\n\n method oncancel : ('self t, event t) event_listener prop\n\n method onclose : ('self t, event t) event_listener prop\nend\n\nclass type divElement = element\n\nclass type paragraphElement = element\n\nclass type headingElement = element\n\nclass type quoteElement = object\n inherit element\n\n method cite : js_string t prop\nend\n\nclass type preElement = element\n\nclass type brElement = element\n\nclass type hrElement = element\n\nclass type modElement = object\n inherit element\n\n method cite : js_string t prop\n\n method dateTime : js_string t prop\nend\n\nclass type anchorElement = object\n inherit element\n\n method accessKey : js_string t prop\n\n method charset : js_string t prop\n\n method coords : js_string t prop\n\n method download : js_string t prop\n\n method href : js_string t prop\n\n method hreflang : js_string t prop\n\n method name : js_string t prop\n\n method rel : js_string t prop\n\n method rev : js_string t prop\n\n method shape : js_string t prop\n\n method tabIndex : int prop\n\n method target : js_string t prop\n\n method _type : js_string t prop\nend\n\nclass type detailsElement = object ('self)\n inherit element\n\n method open_ : bool t prop\n\n method name : js_string t prop\n\n method ontoggle : ('self t, toggleEvent t) event_listener prop\nend\n\nclass type imageElement = object ('self)\n inherit element\n\n method alt : js_string t prop\n\n method src : js_string t prop\n\n method useMap : js_string t prop\n\n method isMap : bool t prop\n\n method width : int prop\n\n method height : int prop\n\n method naturalWidth : int readonly_prop\n\n method naturalHeight : int readonly_prop\n\n method complete : bool t prop\n\n method onload : ('self t, event t) event_listener prop\n\n method onerror : ('self t, event t) event_listener prop\n\n method onabort : ('self t, event t) event_listener prop\nend\n\nclass type objectElement = object\n inherit element\n\n method form : formElement t opt readonly_prop\n\n method code : js_string t prop\n\n method archive : js_string t prop\n\n method codeBase : js_string t prop\n\n method codeType : js_string t prop\n\n method data : js_string t prop\n\n method declare : bool t prop\n\n method height : js_string t prop\n\n method name : js_string t prop\n\n method standby : js_string t prop\n\n method tabIndex : int prop\n\n method _type : js_string t prop\n\n method useMap : js_string t prop\n\n method width : js_string t prop\n\n method document : Dom.element Dom.document t opt readonly_prop\nend\n\nclass type paramElement = object\n inherit element\n\n method name : js_string t prop\n\n method _type : js_string t prop\n\n method value : js_string t prop\n\n method valueType : js_string t prop\nend\n\nclass type areaElement = object\n inherit element\n\n method accessKey : js_string t prop\n\n method alt : js_string t prop\n\n method coords : js_string t prop\n\n method href : js_string t prop\n\n method noHref : bool t prop\n\n method shape : js_string t prop\n\n method tabIndex : int prop\n\n method target : js_string t prop\nend\n\nclass type mapElement = object\n inherit element\n\n method areas : areaElement collection t readonly_prop\n\n method name : js_string t prop\nend\n\nclass type scriptElement = object\n inherit element\n\n method text : js_string t prop\n\n method charset : js_string t prop\n\n method defer : bool t prop\n\n method src : js_string t prop\n\n method _type : js_string t prop\n\n method async : bool t prop\nend\n\nclass type embedElement = object\n inherit element\n\n method src : js_string t prop\n\n method height : js_string t prop\n\n method width : js_string t prop\n\n method _type : js_string t prop\nend\n\nclass type tableCellElement = object\n inherit element\n\n method cellIndex : int readonly_prop\n\n method abbr : js_string t prop\n\n method align : js_string t prop\n\n method axis : js_string t prop\n\n method ch : js_string t prop\n\n method chOff : js_string t prop\n\n method colSpan : int prop\n\n method headers : js_string t prop\n\n method rowSpan : int prop\n\n method scope : js_string t prop\n\n method vAlign : js_string t prop\nend\n\nclass type tableRowElement = object\n inherit element\n\n method rowIndex : int readonly_prop\n\n method sectionRowIndex : int readonly_prop\n\n method cells : tableCellElement collection t readonly_prop\n\n method align : js_string t prop\n\n method ch : js_string t prop\n\n method chOff : js_string t prop\n\n method vAlign : js_string t prop\n\n method insertCell : int -> tableCellElement t meth\n\n method deleteCell : int -> unit meth\nend\n\nclass type tableColElement = object\n inherit element\n\n method align : js_string t prop\n\n method ch : js_string t prop\n\n method chOff : js_string t prop\n\n method span : int prop\n\n method vAlign : js_string t prop\n\n method width : js_string t prop\nend\n\nclass type tableSectionElement = object\n inherit element\n\n method align : js_string t prop\n\n method ch : js_string t prop\n\n method chOff : js_string t prop\n\n method vAlign : js_string t prop\n\n method rows : tableRowElement collection t readonly_prop\n\n method insertRow : int -> tableRowElement t meth\n\n method deleteRow : int -> unit meth\nend\n\nclass type tableCaptionElement = element\n\nclass type tableElement = object\n inherit element\n\n method caption : tableCaptionElement t prop\n\n method tHead : tableSectionElement t prop\n\n method tFoot : tableSectionElement t prop\n\n method rows : tableRowElement collection t readonly_prop\n\n method tBodies : tableSectionElement collection t readonly_prop\n\n method align : js_string t prop\n\n method border : js_string t prop\n\n method cellPadding : js_string t prop\n\n method cellSpacing : js_string t prop\n\n method frame : js_string t prop\n\n method rules : js_string t prop\n\n method summary : js_string t prop\n\n method width : js_string t prop\n\n method createTHead : tableSectionElement t meth\n\n method deleteTHead : unit meth\n\n method createTFoot : tableSectionElement t meth\n\n method deleteTFoot : unit meth\n\n method createCaption : tableCaptionElement t meth\n\n method deleteCaption : unit meth\n\n method insertRow : int -> tableRowElement t meth\n\n method deleteRow : int -> unit meth\nend\n\nclass type timeRanges = object\n method length : int readonly_prop\n\n method start : int -> number_t meth\n\n method end_ : int -> number_t meth\nend\n\ntype networkState =\n | NETWORK_EMPTY\n | NETWORK_IDLE\n | NETWORK_LOADING\n | NETWORK_NO_SOURCE\n\ntype readyState =\n | HAVE_NOTHING\n | HAVE_METADATA\n | HAVE_CURRENT_DATA\n | HAVE_FUTURE_DATA\n | HAVE_ENOUGH_DATA\n\n(* http://www.w3schools.com/tags/ref_av_dom.asp *)\n(* only features supported by all browser. (IE9+) *)\nclass type mediaElement = object\n inherit element\n\n method canPlayType : js_string t -> js_string t meth\n\n method load : unit meth\n\n method play : unit meth\n\n method pause : unit meth\n\n method autoplay : bool t prop\n\n method buffered : timeRanges t readonly_prop\n\n method controls : bool t prop\n\n method currentSrc : js_string t readonly_prop\n\n method currentTime : number_t prop\n\n method duration : number_t readonly_prop\n\n method ended : bool t readonly_prop\n\n method loop : bool t prop\n\n method mediagroup : js_string t prop\n\n method muted : bool t prop\n\n method networkState_int : int readonly_prop\n\n method networkState : networkState readonly_prop\n\n method paused : bool t readonly_prop\n\n method playbackRate : number_t prop\n\n method played : timeRanges t readonly_prop\n\n method preload : js_string t prop\n\n method readyState_int : int readonly_prop\n\n method readyState : readyState readonly_prop\n\n method seekable : timeRanges t readonly_prop\n\n method seeking : bool t readonly_prop\n\n method src : js_string t prop\n\n method volume : number_t prop\n\n method oncanplay : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method oncanplaythrough : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method ondurationchange : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onemptied : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onended : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onloadeddata : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onloadedmetadata : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onloadstart : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onpause : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onplay : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onplaying : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onratechange : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onseeked : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onseeking : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onstalled : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onsuspend : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onvolumechange : ('self t, mediaEvent t) event_listener writeonly_prop\n\n method onwaiting : ('self t, mediaEvent t) event_listener writeonly_prop\nend\n\nclass type audioElement = object\n inherit mediaElement\nend\n\nclass type videoElement = object\n inherit mediaElement\nend\n\ntype context = js_string t\n\nlet _2d_ = Js.string \"2d\"\n\ntype canvasPattern\n\nclass type canvasElement = object\n inherit element\n\n method width : int prop\n\n method height : int prop\n\n method toDataURL : js_string t meth\n\n method toDataURL_type : js_string t -> js_string t meth\n\n method toDataURL_type_compression : js_string t -> number_t -> js_string t meth\n\n method getContext : js_string t -> canvasRenderingContext2D t meth\nend\n\nand canvasRenderingContext2D = object\n method canvas : canvasElement t readonly_prop\n\n method save : unit meth\n\n method restore : unit meth\n\n method scale : number_t -> number_t -> unit meth\n\n method rotate : number_t -> unit meth\n\n method translate : number_t -> number_t -> unit meth\n\n method transform :\n number_t -> number_t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method setTransform :\n number_t -> number_t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method globalAlpha : number_t prop\n\n method globalCompositeOperation : js_string t prop\n\n method strokeStyle : js_string t writeonly_prop\n\n method strokeStyle_gradient : canvasGradient t writeonly_prop\n\n method strokeStyle_pattern : canvasPattern t writeonly_prop\n\n method fillStyle : js_string t writeonly_prop\n\n method fillStyle_gradient : canvasGradient t writeonly_prop\n\n method fillStyle_pattern : canvasPattern t writeonly_prop\n\n method createLinearGradient :\n number_t -> number_t -> number_t -> number_t -> canvasGradient t meth\n\n method createRadialGradient :\n number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> canvasGradient t meth\n\n method createPattern : imageElement t -> js_string t -> canvasPattern t meth\n\n method createPattern_fromCanvas : canvasElement t -> js_string t -> canvasPattern t meth\n\n method createPattern_fromVideo : videoElement t -> js_string t -> canvasPattern t meth\n\n method lineWidth : number_t prop\n\n method lineCap : js_string t prop\n\n method lineJoin : js_string t prop\n\n method miterLimit : number_t prop\n\n method shadowOffsetX : number_t prop\n\n method shadowOffsetY : number_t prop\n\n method shadowBlur : number_t prop\n\n method shadowColor : js_string t prop\n\n method clearRect : number_t -> number_t -> number_t -> number_t -> unit meth\n\n method fillRect : number_t -> number_t -> number_t -> number_t -> unit meth\n\n method strokeRect : number_t -> number_t -> number_t -> number_t -> unit meth\n\n method beginPath : unit meth\n\n method closePath : unit meth\n\n method moveTo : number_t -> number_t -> unit meth\n\n method lineTo : number_t -> number_t -> unit meth\n\n method quadraticCurveTo : number_t -> number_t -> number_t -> number_t -> unit meth\n\n method bezierCurveTo :\n number_t -> number_t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method arcTo : number_t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method rect : number_t -> number_t -> number_t -> number_t -> unit meth\n\n method arc :\n number_t -> number_t -> number_t -> number_t -> number_t -> bool t -> unit meth\n\n method ellipse :\n number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> bool t\n -> unit meth\n\n method fill : unit meth\n\n method stroke : unit meth\n\n method clip : unit meth\n\n method isPointInPath : number_t -> number_t -> bool t meth\n\n method drawFocusRing : #element t -> number_t -> number_t -> bool t -> bool t meth\n\n method font : js_string t prop\n\n method textAlign : js_string t prop\n\n method textBaseline : js_string t prop\n\n method fillText : js_string t -> number_t -> number_t -> unit meth\n\n method fillText_withWidth : js_string t -> number_t -> number_t -> number_t -> unit meth\n\n method strokeText : js_string t -> number_t -> number_t -> unit meth\n\n method strokeText_withWidth :\n js_string t -> number_t -> number_t -> number_t -> unit meth\n\n method measureText : js_string t -> textMetrics t meth\n\n method drawImage : imageElement t -> number_t -> number_t -> unit meth\n\n method drawImage_withSize :\n imageElement t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method drawImage_full :\n imageElement t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> unit meth\n\n method drawImage_fromCanvas : canvasElement t -> number_t -> number_t -> unit meth\n\n method drawImage_fromCanvasWithSize :\n canvasElement t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method drawImage_fullFromCanvas :\n canvasElement t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> unit meth\n\n method drawImage_fromVideoWithVideo :\n videoElement t -> number_t -> number_t -> unit meth\n\n method drawImage_fromVideoWithSize :\n videoElement t -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method drawImage_fullFromVideo :\n videoElement t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> unit meth\n\n method createImageData : int -> int -> imageData t meth\n\n method getImageData : number_t -> number_t -> number_t -> number_t -> imageData t meth\n\n method putImageData : imageData t -> number_t -> number_t -> unit meth\nend\n\nand canvasGradient = object\n method addColorStop : number_t -> js_string t -> unit meth\nend\n\nand textMetrics = object\n method actualBoundingBoxAscent : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxAscent *)\n\n method actualBoundingBoxDescent : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxDescent *)\n\n method actualBoundingBoxLeft : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxLeft *)\n\n method actualBoundingBoxRight : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxRight *)\n\n method alphabeticBaseline : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/alphabeticBaseline *)\n\n method fontBoundingBoxAscent : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/fontBoundingBoxAscent *)\n\n method fontBoundingBoxDescent : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/fontBoundingBoxDescent *)\n\n method hangingBaseline : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/hangingBaseline *)\n\n method ideographicBaseline : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/ideographicBaseline *)\n\n method width : number_t readonly_prop\n (** https://developer.mozilla.org/docs/Web/API/TextMetrics/width *)\nend\n\nand imageData = object\n method width : int readonly_prop\n\n method height : int readonly_prop\n\n method data : canvasPixelArray t readonly_prop\nend\n\nand canvasPixelArray = object\n method length : int readonly_prop\nend\n\nexternal pixel_get : canvasPixelArray t -> int -> int = \"caml_js_get\"\n\nexternal pixel_set : canvasPixelArray t -> int -> int -> unit = \"caml_js_set\"\n\nclass type range = object\n method collapsed : bool t readonly_prop\n\n method startOffset : int readonly_prop\n\n method endOffset : int readonly_prop\n\n method startContainer : Dom.node t readonly_prop\n\n method endContainer : Dom.node t readonly_prop\n\n method setStart : Dom.node t -> int -> unit meth\n\n method setEnd : Dom.node t -> int -> unit meth\n\n method setStartBefore : Dom.node t -> unit meth\n\n method setEndBefore : Dom.node t -> unit meth\n\n method setStartAfter : Dom.node t -> unit meth\n\n method setEndAfter : Dom.node t -> unit meth\n\n method selectNode : Dom.node t -> unit meth\n\n method selectNodeContents : Dom.node t -> unit meth\n\n method collapse : bool t -> unit meth\n\n method cloneContents : Dom.documentFragment t meth\n\n method extractContents : Dom.documentFragment t meth\n\n method deleteContents : unit meth\n\n method insertNode : Dom.node t -> unit meth\n\n method surroundContents : Dom.node t -> unit meth\n\n method cloneRange : range t meth\n\n method toString : js_string t meth\nend\n\n(** Information on current selection *)\nclass type selection = object\n method anchorNode : Dom.node t readonly_prop\n\n method anchorOffset : int readonly_prop\n\n method focusNode : Dom.node t readonly_prop\n\n method focusOffset : int readonly_prop\n\n method isCollapsed : bool t readonly_prop\n\n method rangeCount : int readonly_prop\n\n method getRangeAt : int -> range t meth\n\n method collapse : bool t -> unit meth\n\n method extend : Dom.node t -> int -> unit meth\n\n method modify : js_string t -> js_string t -> js_string t -> unit meth\n\n method collapseToStart : unit meth\n\n method collapseToEnd : unit meth\n\n method selectAllChildren : Dom.node t -> unit meth\n\n method addRange : range t -> unit meth\n\n method removeRange : range t -> unit meth\n\n method removeAllRanges : unit meth\n\n method deleteFromDocument : unit meth\n\n method containsNode : Dom.node t -> bool t -> bool t meth\n\n method toString : js_string t meth\nend\n\nclass type document = object\n inherit [element] Dom.document\n\n inherit nodeSelector\n\n inherit eventTarget\n\n method title : js_string t prop\n\n method referrer : js_string t readonly_prop\n\n method domain : js_string t prop\n\n method _URL : js_string t readonly_prop\n\n method head : headElement t prop\n\n method body : bodyElement t prop\n\n method documentElement : htmlElement t readonly_prop\n\n method images : imageElement collection t readonly_prop\n\n method applets : element collection t readonly_prop\n\n method links : element collection t readonly_prop\n\n method forms : formElement collection t readonly_prop\n\n method anchors : element collection t readonly_prop\n\n method cookie : js_string t prop\n\n method designMode : js_string t prop\n\n method open_ : unit meth\n\n method close : unit meth\n\n method write : js_string t -> unit meth\n\n method execCommand : js_string t -> bool t -> js_string t opt -> unit meth\n\n method createRange : range t meth\n\n method readyState : js_string t readonly_prop\n\n method getElementsByClassName : js_string t -> element Dom.nodeList t meth\n\n method getElementsByName : js_string t -> element Dom.nodeList t meth\n\n method activeElement : element t opt readonly_prop\n\n method hidden : bool t readonly_prop\n\n method onfullscreenchange : (document t, event t) event_listener writeonly_prop\n\n method onwebkitfullscreenchange : (document t, event t) event_listener writeonly_prop\n\n inherit eventTarget\nend\n\ntype interval_id\n\ntype timeout_id\n\ntype animation_frame_request_id\n\nclass type location = object\n method href : js_string t prop\n\n method protocol : js_string t prop\n\n method host : js_string t prop\n\n method hostname : js_string t prop\n\n method origin : js_string t readonly_prop\n\n method port : js_string t prop\n\n method pathname : js_string t prop\n\n method search : js_string t prop\n\n method hash : js_string t prop\n\n method assign : js_string t -> unit meth\n\n method replace : js_string t -> unit meth\n\n method reload : unit meth\nend\n\nlet location_origin (loc : location t) = loc##.origin\n\nclass type history = object\n method length : int readonly_prop\n\n method state : Js.Unsafe.any readonly_prop\n\n method go : int opt -> unit meth\n\n method back : unit meth\n\n method forward : unit meth\n\n method pushState : 'a. 'a -> js_string t -> js_string t opt -> unit meth\n\n method replaceState : 'a. 'a -> js_string t -> js_string t opt -> unit meth\nend\n\nclass type undoManager = object end\n\nclass type navigator = object\n method appCodeName : js_string t readonly_prop\n\n method appName : js_string t readonly_prop\n\n method appVersion : js_string t readonly_prop\n\n method cookieEnabled : bool t readonly_prop\n\n method onLine : bool t readonly_prop\n\n method platform : js_string t readonly_prop\n\n method vendor : js_string t readonly_prop\n\n method userAgent : js_string t readonly_prop\n\n method language : js_string t opt readonly_prop\n\n method maxTouchPoints : int readonly_prop\n\n method userLanguage : js_string t optdef readonly_prop\nend\n\nclass type screen = object\n method width : int readonly_prop\n\n method height : int readonly_prop\n\n method availWidth : int readonly_prop\n\n method availHeight : int readonly_prop\nend\n\nclass type applicationCache = object\n method status : int readonly_prop\n\n method update : unit meth\n\n method abort : unit meth\n\n method swapCache : unit meth\n\n method onchecking : (applicationCache t, event t) event_listener prop\n\n method onerror : (applicationCache t, event t) event_listener prop\n\n method onnoupdate : (applicationCache t, event t) event_listener prop\n\n method ondownloading : (applicationCache t, event t) event_listener prop\n\n method onprogress : (applicationCache t, event t) event_listener prop\n\n method onupdateready : (applicationCache t, event t) event_listener prop\n\n method oncached : (applicationCache t, event t) event_listener prop\n\n method onobsolete : (applicationCache t, event t) event_listener prop\n\n inherit eventTarget\nend\n\nclass type _URL = object\n method createObjectURL : #File.blob t -> js_string t meth\n\n method revokeObjectURL : js_string t -> unit meth\nend\n\nclass type mediaQueryList = object\n method media : js_string t prop\n\n method matches : bool t readonly_prop\n\n method onchange : (mediaQueryList t, mediaQueryListEvent t) event_listener prop\n\n inherit eventTarget\nend\n\nclass type window = object\n inherit eventTarget\n\n method document : document t readonly_prop\n\n method applicationCache : applicationCache t readonly_prop\n\n method name : js_string t prop\n\n method location : location t readonly_prop\n\n method history : history t readonly_prop\n\n method undoManager : undoManager t readonly_prop\n\n method navigator : navigator t readonly_prop\n\n method getSelection : selection t meth\n\n method close : unit meth\n\n method closed : bool t readonly_prop\n\n method stop : unit meth\n\n method focus : unit meth\n\n method blur : unit meth\n\n method scrollX : number_t readonly_prop\n\n method scrollY : number_t readonly_prop\n\n method scroll : number_t -> number_t -> unit meth\n\n method scrollTo : number_t -> number_t -> unit meth\n\n method scrollBy : number_t -> number_t -> unit meth\n\n method sessionStorage : storage t optdef readonly_prop\n\n method localStorage : storage t optdef readonly_prop\n\n method top : window t readonly_prop\n\n method parent : window t readonly_prop\n\n method frameElement : element t opt readonly_prop\n\n method open_ : js_string t -> js_string t -> js_string t opt -> window t opt meth\n\n method alert : js_string t -> unit meth\n\n method confirm : js_string t -> bool t meth\n\n method prompt : js_string t -> js_string t -> js_string t opt meth\n\n method print : unit meth\n\n method setInterval : (unit -> unit) Js.callback -> number_t -> interval_id meth\n\n method clearInterval : interval_id -> unit meth\n\n method setTimeout : (unit -> unit) Js.callback -> number_t -> timeout_id meth\n\n method clearTimeout : timeout_id -> unit meth\n\n method requestAnimationFrame :\n (number_t -> unit) Js.callback -> animation_frame_request_id meth\n\n method cancelAnimationFrame : animation_frame_request_id -> unit meth\n\n method screen : screen t readonly_prop\n\n method innerWidth : int readonly_prop\n\n method innerHeight : int readonly_prop\n\n method outerWidth : int readonly_prop\n\n method outerHeight : int readonly_prop\n\n method getComputedStyle : #element t -> cssStyleDeclaration t meth\n\n method getComputedStyle_pseudoElt :\n #element t -> js_string t -> cssStyleDeclaration t meth\n\n method atob : js_string t -> js_string t meth\n\n method btoa : js_string t -> js_string t meth\n\n method onload : (window t, event t) event_listener prop\n\n method onunload : (window t, event t) event_listener prop\n\n method onbeforeunload : (window t, event t) event_listener prop\n\n method onblur : (window t, focusEvent t) event_listener prop\n\n method onfocus : (window t, focusEvent t) event_listener prop\n\n method onresize : (window t, event t) event_listener prop\n\n method onorientationchange : (window t, event t) event_listener prop\n\n method onpopstate : (window t, popStateEvent t) event_listener prop\n\n method onhashchange : (window t, hashChangeEvent t) event_listener prop\n\n method ononline : (window t, event t) event_listener writeonly_prop\n\n method onoffline : (window t, event t) event_listener writeonly_prop\n\n method _URL : _URL t readonly_prop\n\n method devicePixelRatio : number_t readonly_prop\n\n method matchMedia : js_string t -> mediaQueryList t meth\nend\n\nlet window : window t = Js.Unsafe.global\n\n(* The toplevel object *)\n\nlet document = window##.document\n\nlet getElementById id =\n Js.Opt.case\n (document##getElementById (Js.string id))\n (fun () -> raise Not_found)\n (fun pnode -> pnode)\n\nlet getElementById_exn id =\n Js.Opt.case\n (document##getElementById (Js.string id))\n (fun () -> failwith (Printf.sprintf \"getElementById_exn: %S not found\" id))\n (fun pnode -> pnode)\n\nlet getElementById_opt id = Js.Opt.to_option (document##getElementById (Js.string id))\n\nlet getElementById_coerce id coerce =\n Js.Opt.case\n (document##getElementById (Js.string id))\n (fun () -> None)\n (fun e -> Js.Opt.to_option (coerce e))\n\n(****)\n\nclass type frameSetElement = object\n inherit element\n\n method cols : js_string t prop\n\n method rows : js_string t prop\nend\n\nclass type frameElement = object\n inherit element\n\n method frameBorder : js_string t prop\n\n method longDesc : js_string t prop\n\n method marginHeight : js_string t prop\n\n method marginWidth : js_string t prop\n\n method name : js_string t prop\n\n method noResize : bool t prop\n\n method scrolling : js_string t prop\n\n method src : js_string t prop\n\n method contentDocument : document t opt readonly_prop\nend\n\nclass type iFrameElement = object\n inherit element\n\n method frameBorder : js_string t prop\n\n method height : js_string t prop\n\n method width : js_string t prop\n\n method longDesc : js_string t prop\n\n method marginHeight : js_string t prop\n\n method marginWidth : js_string t prop\n\n method name : js_string t prop\n\n method scrolling : js_string t prop\n\n method src : js_string t prop\n\n method contentDocument : document t opt readonly_prop\n\n method contentWindow : window t readonly_prop\nend\n\n(****)\n\n(*XXX Should provide creation functions a la lablgtk... *)\n\nlet opt_iter x f =\n match x with\n | None -> ()\n | Some v -> f v\n\nlet createElement (doc : document t) name = doc##createElement (Js.string name)\n\nlet unsafeCreateElement doc name = Js.Unsafe.coerce (createElement doc name)\n\nlet createElementSyntax = ref `Unknown\n\nlet rec unsafeCreateElementEx ?_type ?name doc elt =\n if Poly.(_type = None) && Poly.(name = None)\n then Js.Unsafe.coerce (createElement doc elt)\n else\n match !createElementSyntax with\n | `Standard ->\n let res = Js.Unsafe.coerce (createElement doc elt) in\n opt_iter _type (fun t -> res##._type := t);\n opt_iter name (fun n -> res##.name := n);\n res\n | `Extended ->\n let a = new%js Js.array_empty in\n ignore (a##push_2 (Js.string \"<\") (Js.string elt));\n opt_iter _type (fun t ->\n ignore (a##push_3 (Js.string \" type=\\\"\") (html_escape t) (Js.string \"\\\"\")));\n opt_iter name (fun n ->\n ignore (a##push_3 (Js.string \" name=\\\"\") (html_escape n) (Js.string \"\\\"\")));\n ignore (a##push (Js.string \">\"));\n Js.Unsafe.coerce (doc##createElement (a##join (Js.string \"\")))\n | `Unknown ->\n createElementSyntax :=\n if\n try\n let el : inputElement Js.t =\n Js.Unsafe.coerce\n (document##createElement (Js.string \"\"))\n in\n Js.equals el##.tagName##toLowerCase (Js.string \"input\")\n && Js.equals el##.name (Js.string \"x\")\n with _ -> false\n then `Extended\n else `Standard;\n unsafeCreateElementEx ?_type ?name doc elt\n\nlet createHtml doc : htmlElement t = unsafeCreateElement doc \"html\"\n\nlet createHead doc : headElement t = unsafeCreateElement doc \"head\"\n\nlet createLink doc : linkElement t = unsafeCreateElement doc \"link\"\n\nlet createTitle doc : titleElement t = unsafeCreateElement doc \"title\"\n\nlet createMeta doc : metaElement t = unsafeCreateElement doc \"meta\"\n\nlet createBase doc : baseElement t = unsafeCreateElement doc \"base\"\n\nlet createStyle doc : styleElement t = unsafeCreateElement doc \"style\"\n\nlet createBody doc : bodyElement t = unsafeCreateElement doc \"body\"\n\nlet createForm doc : formElement t = unsafeCreateElement doc \"form\"\n\nlet createOptgroup doc : optGroupElement t = unsafeCreateElement doc \"optgroup\"\n\nlet createOption doc : optionElement t = unsafeCreateElement doc \"option\"\n\nlet createSelect ?_type ?name doc : selectElement t =\n unsafeCreateElementEx ?_type ?name doc \"select\"\n\nlet createInput ?_type ?name doc : inputElement t =\n unsafeCreateElementEx ?_type ?name doc \"input\"\n\nlet createTextarea ?_type ?name doc : textAreaElement t =\n unsafeCreateElementEx ?_type ?name doc \"textarea\"\n\nlet createButton ?_type ?name doc : buttonElement t =\n unsafeCreateElementEx ?_type ?name doc \"button\"\n\nlet createLabel doc : labelElement t = unsafeCreateElement doc \"label\"\n\nlet createFieldset doc : fieldSetElement t = unsafeCreateElement doc \"fieldset\"\n\nlet createLegend doc : legendElement t = unsafeCreateElement doc \"legend\"\n\nlet createUl doc : uListElement t = unsafeCreateElement doc \"ul\"\n\nlet createOl doc : oListElement t = unsafeCreateElement doc \"ol\"\n\nlet createDl doc : dListElement t = unsafeCreateElement doc \"dl\"\n\nlet createLi doc : liElement t = unsafeCreateElement doc \"li\"\n\nlet createDialog doc : dialogElement t = unsafeCreateElement doc \"dialog\"\n\nlet createDiv doc : divElement t = unsafeCreateElement doc \"div\"\n\nlet createEmbed doc : embedElement t = unsafeCreateElement doc \"embed\"\n\nlet createP doc : paragraphElement t = unsafeCreateElement doc \"p\"\n\nlet createH1 doc : headingElement t = unsafeCreateElement doc \"h1\"\n\nlet createH2 doc : headingElement t = unsafeCreateElement doc \"h2\"\n\nlet createH3 doc : headingElement t = unsafeCreateElement doc \"h3\"\n\nlet createH4 doc : headingElement t = unsafeCreateElement doc \"h4\"\n\nlet createH5 doc : headingElement t = unsafeCreateElement doc \"h5\"\n\nlet createH6 doc : headingElement t = unsafeCreateElement doc \"h6\"\n\nlet createQ doc : quoteElement t = unsafeCreateElement doc \"q\"\n\nlet createBlockquote doc : quoteElement t = unsafeCreateElement doc \"blockquote\"\n\nlet createPre doc : preElement t = unsafeCreateElement doc \"pre\"\n\nlet createBr doc : brElement t = unsafeCreateElement doc \"br\"\n\nlet createHr doc : hrElement t = unsafeCreateElement doc \"hr\"\n\nlet createIns doc : modElement t = unsafeCreateElement doc \"ins\"\n\nlet createDel doc : modElement t = unsafeCreateElement doc \"del\"\n\nlet createA doc : anchorElement t = unsafeCreateElement doc \"a\"\n\nlet createImg doc : imageElement t = unsafeCreateElement doc \"img\"\n\nlet createObject doc : objectElement t = unsafeCreateElement doc \"object\"\n\nlet createParam doc : paramElement t = unsafeCreateElement doc \"param\"\n\nlet createMap doc : mapElement t = unsafeCreateElement doc \"map\"\n\nlet createArea doc : areaElement t = unsafeCreateElement doc \"area\"\n\nlet createScript doc : scriptElement t = unsafeCreateElement doc \"script\"\n\nlet createTable doc : tableElement t = unsafeCreateElement doc \"table\"\n\nlet createCaption doc : tableCaptionElement t = unsafeCreateElement doc \"caption\"\n\nlet createCol doc : tableColElement t = unsafeCreateElement doc \"col\"\n\nlet createColgroup doc : tableColElement t = unsafeCreateElement doc \"colgroup\"\n\nlet createThead doc : tableSectionElement t = unsafeCreateElement doc \"thead\"\n\nlet createTfoot doc : tableSectionElement t = unsafeCreateElement doc \"tfoot\"\n\nlet createTbody doc : tableSectionElement t = unsafeCreateElement doc \"tbody\"\n\nlet createTr doc : tableRowElement t = unsafeCreateElement doc \"tr\"\n\nlet createTh doc : tableCellElement t = unsafeCreateElement doc \"th\"\n\nlet createTd doc : tableCellElement t = unsafeCreateElement doc \"td\"\n\nlet createSub doc = createElement doc \"sub\"\n\nlet createSup doc = createElement doc \"sup\"\n\nlet createSpan doc = createElement doc \"span\"\n\nlet createTt doc = createElement doc \"tt\"\n\nlet createI doc = createElement doc \"i\"\n\nlet createB doc = createElement doc \"b\"\n\nlet createBig doc = createElement doc \"big\"\n\nlet createSmall doc = createElement doc \"small\"\n\nlet createEm doc = createElement doc \"em\"\n\nlet createStrong doc = createElement doc \"strong\"\n\nlet createCite doc = createElement doc \"cite\"\n\nlet createDfn doc = createElement doc \"dfn\"\n\nlet createCode doc = createElement doc \"code\"\n\nlet createSamp doc = createElement doc \"samp\"\n\nlet createKbd doc = createElement doc \"kbd\"\n\nlet createVar doc = createElement doc \"var\"\n\nlet createAbbr doc = createElement doc \"abbr\"\n\nlet createDd doc = createElement doc \"dd\"\n\nlet createDt doc = createElement doc \"dt\"\n\nlet createNoscript doc = createElement doc \"noscript\"\n\nlet createAddress doc = createElement doc \"address\"\n\nlet createFrameset doc : frameSetElement t = unsafeCreateElement doc \"frameset\"\n\nlet createFrame doc : frameElement t = unsafeCreateElement doc \"frame\"\n\nlet createIframe doc : iFrameElement t = unsafeCreateElement doc \"iframe\"\n\nlet createAudio doc : audioElement t = unsafeCreateElement doc \"audio\"\n\nlet createVideo doc : audioElement t = unsafeCreateElement doc \"video\"\n\nexception Canvas_not_available\n\nlet createCanvas doc : canvasElement t =\n let c = unsafeCreateElement doc \"canvas\" in\n if not (Opt.test c##.getContext) then raise Canvas_not_available;\n c\n\nlet html_element : htmlElement t constr = Js.Unsafe.global##._HTMLElement\n\nmodule CoerceTo = struct\n let element (e : #Dom.node Js.t) : element Js.t Js.opt =\n if Js.instanceof e html_element then Js.some (Js.Unsafe.coerce e) else Js.null\n\n let unsafeCoerce tag (e : #element t) =\n if Js.equals e##.tagName##toLowerCase (Js.string tag)\n then Js.some (Js.Unsafe.coerce e)\n else Js.null\n\n let a e = unsafeCoerce \"a\" e\n\n let area e = unsafeCoerce \"area\" e\n\n let base e = unsafeCoerce \"base\" e\n\n let blockquote e = unsafeCoerce \"blockquote\" e\n\n let body e = unsafeCoerce \"body\" e\n\n let br e = unsafeCoerce \"br\" e\n\n let button e = unsafeCoerce \"button\" e\n\n let canvas e = unsafeCoerce \"canvas\" e\n\n let caption e = unsafeCoerce \"caption\" e\n\n let col e = unsafeCoerce \"col\" e\n\n let colgroup e = unsafeCoerce \"colgroup\" e\n\n let del e = unsafeCoerce \"del\" e\n\n let details e = unsafeCoerce \"details\" e\n\n let div e = unsafeCoerce \"div\" e\n\n let dl e = unsafeCoerce \"dl\" e\n\n let fieldset e = unsafeCoerce \"fieldset\" e\n\n let embed e = unsafeCoerce \"embed\" e\n\n let form e = unsafeCoerce \"form\" e\n\n let frameset e = unsafeCoerce \"frameset\" e\n\n let frame e = unsafeCoerce \"frame\" e\n\n let h1 e = unsafeCoerce \"h1\" e\n\n let h2 e = unsafeCoerce \"h2\" e\n\n let h3 e = unsafeCoerce \"h3\" e\n\n let h4 e = unsafeCoerce \"h4\" e\n\n let h5 e = unsafeCoerce \"h5\" e\n\n let h6 e = unsafeCoerce \"h6\" e\n\n let head e = unsafeCoerce \"head\" e\n\n let hr e = unsafeCoerce \"hr\" e\n\n let html e = unsafeCoerce \"html\" e\n\n let iframe e = unsafeCoerce \"iframe\" e\n\n let img e = unsafeCoerce \"img\" e\n\n let input e = unsafeCoerce \"input\" e\n\n let ins e = unsafeCoerce \"ins\" e\n\n let label e = unsafeCoerce \"label\" e\n\n let legend e = unsafeCoerce \"legend\" e\n\n let li e = unsafeCoerce \"li\" e\n\n let link e = unsafeCoerce \"link\" e\n\n let map e = unsafeCoerce \"map\" e\n\n let meta e = unsafeCoerce \"meta\" e\n\n let _object e = unsafeCoerce \"object\" e\n\n let ol e = unsafeCoerce \"ol\" e\n\n let optgroup e = unsafeCoerce \"optgroup\" e\n\n let option e = unsafeCoerce \"option\" e\n\n let p e = unsafeCoerce \"p\" e\n\n let param e = unsafeCoerce \"param\" e\n\n let pre e = unsafeCoerce \"pre\" e\n\n let q e = unsafeCoerce \"q\" e\n\n let script e = unsafeCoerce \"script\" e\n\n let select e = unsafeCoerce \"select\" e\n\n let style e = unsafeCoerce \"style\" e\n\n let table e = unsafeCoerce \"table\" e\n\n let tbody e = unsafeCoerce \"tbody\" e\n\n let td e = unsafeCoerce \"td\" e\n\n let textarea e = unsafeCoerce \"textarea\" e\n\n let tfoot e = unsafeCoerce \"tfoot\" e\n\n let th e = unsafeCoerce \"th\" e\n\n let thead e = unsafeCoerce \"thead\" e\n\n let title e = unsafeCoerce \"title\" e\n\n let tr e = unsafeCoerce \"tr\" e\n\n let ul e = unsafeCoerce \"ul\" e\n\n let audio e = unsafeCoerce \"audio\" e\n\n let video e = unsafeCoerce \"video\" e\n\n let unsafeCoerceEvent constr (ev : #event t) =\n if Js.Optdef.test (def constr) && Js.instanceof ev constr\n then Js.some (Js.Unsafe.coerce ev)\n else Js.null\n\n let mouseEvent ev = unsafeCoerceEvent Js.Unsafe.global##._MouseEvent ev\n\n let keyboardEvent ev = unsafeCoerceEvent Js.Unsafe.global##._KeyboardEvent ev\n\n let wheelEvent ev = unsafeCoerceEvent Js.Unsafe.global##._WheelEvent ev\n\n let mouseScrollEvent ev = unsafeCoerceEvent Js.Unsafe.global##._MouseScrollEvent ev\n\n let popStateEvent ev = unsafeCoerceEvent Js.Unsafe.global##._PopStateEvent ev\n\n let messageEvent ev = unsafeCoerceEvent Js.Unsafe.global##._MessageEvent ev\nend\n\n(****)\n\nlet eventTarget = Dom.eventTarget\n\nlet eventRelatedTarget (e : #mouseEvent t) = e##.relatedTarget\n\nlet eventAbsolutePosition' (e : #mouseEvent t) =\n let body = document##.body in\n let html = document##.documentElement in\n ( Js.to_float e##.clientX\n +. Js.to_float body##.scrollLeft\n +. Js.to_float html##.scrollLeft\n , Js.to_float e##.clientY\n +. Js.to_float body##.scrollTop\n +. Js.to_float html##.scrollTop )\n\nlet eventAbsolutePosition (e : #mouseEvent t) =\n Optdef.case\n e##.pageX\n (fun () -> eventAbsolutePosition' e)\n (fun x ->\n Optdef.case\n e##.pageY\n (fun () -> eventAbsolutePosition' e)\n (fun y -> Js.to_float x, Js.to_float y))\n\nlet elementClientPosition (e : #element t) =\n let r = e##getBoundingClientRect in\n let body = document##.body in\n let html = document##.documentElement in\n ( truncate (Js.to_float r##.left) - body##.clientLeft - html##.clientLeft\n , truncate (Js.to_float r##.top) - body##.clientTop - html##.clientTop )\n\nlet getDocumentScroll () =\n let body = document##.body in\n let html = document##.documentElement in\n ( Js.to_float body##.scrollLeft +. Js.to_float html##.scrollLeft\n , Js.to_float body##.scrollTop +. Js.to_float html##.scrollTop )\n\nlet buttonPressed (ev : #mouseEvent Js.t) =\n Js.Optdef.case\n ev##.which\n (fun () ->\n match ev##.button with\n | 1 -> Left_button\n | 2 -> Right_button\n | 4 -> Middle_button\n | _ -> No_button)\n (fun x -> x)\n\nlet addMousewheelEventListenerWithOptions e ?capture ?once ?passive h =\n addEventListenerWithOptions\n ?capture\n ?once\n ?passive\n e\n Event.wheel\n (handler (fun (e : mousewheelEvent t) ->\n let dx = -Optdef.get e##.wheelDeltaX (fun () -> 0) / 40 in\n let dy = -Optdef.get e##.wheelDeltaY (fun () -> e##.wheelDelta) / 40 in\n h (e :> mouseEvent t) ~dx ~dy))\n\nlet addMousewheelEventListener e h capt =\n addMousewheelEventListenerWithOptions ~capture:capt e h\n\n(*****)\n\nmodule Keyboard_code = struct\n type t =\n | Unidentified\n (* Alphabetic Characters *)\n | KeyA\n | KeyB\n | KeyC\n | KeyD\n | KeyE\n | KeyF\n | KeyG\n | KeyH\n | KeyI\n | KeyJ\n | KeyK\n | KeyL\n | KeyM\n | KeyN\n | KeyO\n | KeyP\n | KeyQ\n | KeyR\n | KeyS\n | KeyT\n | KeyU\n | KeyV\n | KeyW\n | KeyX\n | KeyY\n | KeyZ\n (* Digits *)\n | Digit0\n | Digit1\n | Digit2\n | Digit3\n | Digit4\n | Digit5\n | Digit6\n | Digit7\n | Digit8\n | Digit9\n | Minus\n | Equal\n (* Whitespace *)\n | Tab\n | Enter\n | Space\n (* Editing *)\n | Escape\n | Backspace\n | Insert\n | Delete\n | CapsLock\n (* Misc Printable *)\n | BracketLeft\n | BracketRight\n | Semicolon\n | Quote\n | Backquote\n | Backslash\n | Comma\n | Period\n | Slash\n (* Function keys *)\n | F1\n | F2\n | F3\n | F4\n | F5\n | F6\n | F7\n | F8\n | F9\n | F10\n | F11\n | F12\n (* Numpad keys *)\n | Numpad0\n | Numpad1\n | Numpad2\n | Numpad3\n | Numpad4\n | Numpad5\n | Numpad6\n | Numpad7\n | Numpad8\n | Numpad9\n | NumpadMultiply\n | NumpadSubtract\n | NumpadAdd\n | NumpadDecimal\n | NumpadEqual\n | NumpadEnter\n | NumpadDivide\n | NumLock\n (* Modifier keys *)\n | ControlLeft\n | ControlRight\n | MetaLeft\n | MetaRight\n | ShiftLeft\n | ShiftRight\n | AltLeft\n | AltRight\n (* Arrow keys *)\n | ArrowLeft\n | ArrowRight\n | ArrowUp\n | ArrowDown\n (* Navigation *)\n | PageUp\n | PageDown\n | Home\n | End\n (* Sound *)\n | VolumeMute\n | VolumeDown\n | VolumeUp\n (* Media *)\n | MediaTrackPrevious\n | MediaTrackNext\n | MediaPlayPause\n | MediaStop\n (* Browser special *)\n | ContextMenu\n | BrowserSearch\n | BrowserHome\n | BrowserFavorites\n | BrowserRefresh\n | BrowserStop\n | BrowserForward\n | BrowserBack\n (* Misc *)\n | OSLeft\n | OSRight\n | ScrollLock\n | PrintScreen\n | IntlBackslash\n | IntlYen\n | Pause\n\n let try_code v =\n match Js.to_string v with\n (* Alphabetic Characters *)\n | \"KeyA\" -> KeyA\n | \"KeyB\" -> KeyB\n | \"KeyC\" -> KeyC\n | \"KeyD\" -> KeyD\n | \"KeyE\" -> KeyE\n | \"KeyF\" -> KeyF\n | \"KeyG\" -> KeyG\n | \"KeyH\" -> KeyH\n | \"KeyI\" -> KeyI\n | \"KeyJ\" -> KeyJ\n | \"KeyK\" -> KeyK\n | \"KeyL\" -> KeyL\n | \"KeyM\" -> KeyM\n | \"KeyN\" -> KeyN\n | \"KeyO\" -> KeyO\n | \"KeyP\" -> KeyP\n | \"KeyQ\" -> KeyQ\n | \"KeyR\" -> KeyR\n | \"KeyS\" -> KeyS\n | \"KeyT\" -> KeyT\n | \"KeyU\" -> KeyU\n | \"KeyV\" -> KeyV\n | \"KeyW\" -> KeyW\n | \"KeyX\" -> KeyX\n | \"KeyY\" -> KeyY\n | \"KeyZ\" -> KeyZ\n (* Digits *)\n | \"Digit0\" -> Digit0\n | \"Digit1\" -> Digit1\n | \"Digit2\" -> Digit2\n | \"Digit3\" -> Digit3\n | \"Digit4\" -> Digit4\n | \"Digit5\" -> Digit5\n | \"Digit6\" -> Digit6\n | \"Digit7\" -> Digit7\n | \"Digit8\" -> Digit8\n | \"Digit9\" -> Digit9\n | \"Minus\" -> Minus\n | \"Equal\" -> Equal\n (* Whitespace *)\n | \"Tab\" -> Tab\n | \"Enter\" -> Enter\n | \"Space\" -> Space\n (* Editing *)\n | \"Escape\" -> Escape\n | \"Backspace\" -> Backspace\n | \"Insert\" -> Insert\n | \"Delete\" -> Delete\n | \"CapsLock\" -> CapsLock\n (* Misc Printable *)\n | \"BracketLeft\" -> BracketLeft\n | \"BracketRight\" -> BracketRight\n | \"Semicolon\" -> Semicolon\n | \"Quote\" -> Quote\n | \"Backquote\" -> Backquote\n | \"Backslash\" -> Backslash\n | \"Comma\" -> Comma\n | \"Period\" -> Period\n | \"Slash\" -> Slash\n (* Function keys *)\n | \"F1\" -> F1\n | \"F2\" -> F2\n | \"F3\" -> F3\n | \"F4\" -> F4\n | \"F5\" -> F5\n | \"F6\" -> F6\n | \"F7\" -> F7\n | \"F8\" -> F8\n | \"F9\" -> F9\n | \"F10\" -> F10\n | \"F11\" -> F11\n | \"F12\" -> F12\n (* Numpad keys *)\n | \"Numpad0\" -> Numpad0\n | \"Numpad1\" -> Numpad1\n | \"Numpad2\" -> Numpad2\n | \"Numpad3\" -> Numpad3\n | \"Numpad4\" -> Numpad4\n | \"Numpad5\" -> Numpad5\n | \"Numpad6\" -> Numpad6\n | \"Numpad7\" -> Numpad7\n | \"Numpad8\" -> Numpad8\n | \"Numpad9\" -> Numpad9\n | \"NumpadMultiply\" -> NumpadMultiply\n | \"NumpadSubtract\" -> NumpadSubtract\n | \"NumpadAdd\" -> NumpadAdd\n | \"NumpadDecimal\" -> NumpadDecimal\n | \"NumpadEqual\" -> NumpadEqual\n | \"NumpadEnter\" -> NumpadEnter\n | \"NumpadDivide\" -> NumpadDivide\n | \"NumLock\" -> NumLock\n (* Modifier keys *)\n | \"ControlLeft\" -> ControlLeft\n | \"ControlRight\" -> ControlRight\n | \"MetaLeft\" -> MetaLeft\n | \"MetaRight\" -> MetaRight\n | \"ShiftLeft\" -> ShiftLeft\n | \"ShiftRight\" -> ShiftRight\n | \"AltLeft\" -> AltLeft\n | \"AltRight\" -> AltRight\n (* Arrow keys *)\n | \"ArrowLeft\" -> ArrowLeft\n | \"ArrowRight\" -> ArrowRight\n | \"ArrowUp\" -> ArrowUp\n | \"ArrowDown\" -> ArrowDown\n (* Navigation *)\n | \"PageUp\" -> PageUp\n | \"PageDown\" -> PageDown\n | \"Home\" -> Home\n | \"End\" -> End\n (* Sound *)\n | \"VolumeMute\" -> VolumeMute\n | \"VolumeDown\" -> VolumeDown\n | \"VolumeUp\" -> VolumeUp\n (* Media *)\n | \"MediaTrackPrevious\" -> MediaTrackPrevious\n | \"MediaTrackNext\" -> MediaTrackNext\n | \"MediaPlayPause\" -> MediaPlayPause\n | \"MediaStop\" -> MediaStop\n (* Browser special *)\n | \"ContextMenu\" -> ContextMenu\n | \"BrowserSearch\" -> BrowserSearch\n | \"BrowserHome\" -> BrowserHome\n | \"BrowserFavorites\" -> BrowserFavorites\n | \"BrowserRefresh\" -> BrowserRefresh\n | \"BrowserStop\" -> BrowserStop\n | \"BrowserForward\" -> BrowserForward\n | \"BrowserBack\" -> BrowserBack\n (* Misc *)\n | \"OSLeft\" -> OSLeft\n | \"OSRight\" -> OSRight\n | \"ScrollLock\" -> ScrollLock\n | \"PrintScreen\" -> PrintScreen\n | \"IntlBackslash\" -> IntlBackslash\n | \"IntlYen\" -> IntlYen\n | \"Pause\" -> Pause\n | _ -> Unidentified\n\n let try_key_code_left = function\n | 16 -> ShiftLeft\n | 17 -> ControlLeft\n | 18 -> AltLeft\n | 91 -> MetaLeft\n | _ -> Unidentified\n\n let try_key_code_right = function\n | 16 -> ShiftRight\n | 17 -> ControlRight\n | 18 -> AltRight\n | 91 -> MetaRight\n | _ -> Unidentified\n\n let try_key_code_numpad = function\n | 46 -> NumpadDecimal\n | 45 -> Numpad0\n | 35 -> Numpad1\n | 40 -> Numpad2\n | 34 -> Numpad3\n | 37 -> Numpad4\n | 12 -> Numpad5\n | 39 -> Numpad6\n | 36 -> Numpad7\n | 38 -> Numpad8\n | 33 -> Numpad9\n | 13 -> NumpadEnter\n | 111 -> NumpadDivide\n | 107 -> NumpadAdd\n | 109 -> NumpadSubtract\n | 106 -> NumpadMultiply\n | 110 -> NumpadDecimal\n | 96 -> Numpad0\n | 97 -> Numpad1\n | 98 -> Numpad2\n | 99 -> Numpad3\n | 100 -> Numpad4\n | 101 -> Numpad5\n | 102 -> Numpad6\n | 103 -> Numpad7\n | 104 -> Numpad8\n | 105 -> Numpad9\n | _ -> Unidentified\n\n let try_key_code_normal = function\n | 27 -> Escape\n | 112 -> F1\n | 113 -> F2\n | 114 -> F3\n | 115 -> F4\n | 116 -> F5\n | 117 -> F6\n | 118 -> F7\n | 119 -> F8\n | 120 -> F9\n | 121 -> F10\n | 122 -> F11\n | 123 -> F12\n | 42 -> PrintScreen\n | 145 -> ScrollLock\n | 19 -> Pause\n | 192 -> Backquote\n | 49 -> Digit1\n | 50 -> Digit2\n | 51 -> Digit3\n | 52 -> Digit4\n | 53 -> Digit5\n | 54 -> Digit6\n | 55 -> Digit7\n | 56 -> Digit8\n | 57 -> Digit9\n | 48 -> Digit0\n | 189 -> Minus\n | 187 -> Equal\n | 8 -> Backspace\n | 9 -> Tab\n | 81 -> KeyQ\n | 87 -> KeyW\n | 69 -> KeyE\n | 82 -> KeyR\n | 84 -> KeyT\n | 89 -> KeyY\n | 85 -> KeyU\n | 73 -> KeyI\n | 79 -> KeyO\n | 80 -> KeyP\n | 219 -> BracketLeft\n | 221 -> BracketRight\n | 220 -> Backslash\n | 20 -> CapsLock\n | 65 -> KeyA\n | 83 -> KeyS\n | 68 -> KeyD\n | 70 -> KeyF\n | 71 -> KeyG\n | 72 -> KeyH\n | 74 -> KeyJ\n | 75 -> KeyK\n | 76 -> KeyL\n | 186 -> Semicolon\n | 222 -> Quote\n | 13 -> Enter\n | 90 -> KeyZ\n | 88 -> KeyX\n | 67 -> KeyC\n | 86 -> KeyV\n | 66 -> KeyB\n | 78 -> KeyN\n | 77 -> KeyM\n | 188 -> Comma\n | 190 -> Period\n | 191 -> Slash\n | 32 -> Space\n | 93 -> ContextMenu\n | 45 -> Insert\n | 36 -> Home\n | 33 -> PageUp\n | 46 -> Delete\n | 35 -> End\n | 34 -> PageDown\n | 37 -> ArrowLeft\n | 40 -> ArrowDown\n | 39 -> ArrowRight\n | 38 -> ArrowUp\n | _ -> Unidentified\n\n let make_unidentified _ = Unidentified\n\n let try_next value f = function\n | Unidentified -> Optdef.case value make_unidentified f\n | v -> v\n\n let run_next value f = function\n | Unidentified -> f value\n | v -> v\n\n let get_key_code evt = evt##.keyCode\n\n let try_key_location evt =\n match evt##.location with\n | 1 -> run_next (get_key_code evt) try_key_code_left\n | 2 -> run_next (get_key_code evt) try_key_code_right\n | 3 -> run_next (get_key_code evt) try_key_code_numpad\n | _ -> fun v -> v\n\n let ( |> ) x f = f x\n\n let of_event evt =\n Unidentified\n |> try_next evt##.code try_code\n |> try_key_location evt\n |> run_next (get_key_code evt) try_key_code_normal\n\n let of_key_code = try_key_code_normal\nend\n\nmodule Keyboard_key = struct\n type t = Uchar.t option\n\n let char_of_int value =\n if 0 < value then try Some (Uchar.of_int value) with _ -> None else None\n\n let empty_string _ = Js.string \"\"\n\n let none _ = None\n\n let of_event evt =\n let key = Optdef.get evt##.key empty_string in\n match key##.length with\n | 0 -> Optdef.case evt##.charCode none char_of_int\n | 1 -> char_of_int (int_of_float (Js.to_float (key##charCodeAt 0)))\n | _ -> None\nend\n\n(*****)\n\nlet element : #Dom.element t -> element t = Js.Unsafe.coerce\n\ntype taggedElement =\n | A of anchorElement t\n | Area of areaElement t\n | Audio of audioElement t\n | Base of baseElement t\n | Blockquote of quoteElement t\n | Body of bodyElement t\n | Br of brElement t\n | Button of buttonElement t\n | Canvas of canvasElement t\n | Caption of tableCaptionElement t\n | Col of tableColElement t\n | Colgroup of tableColElement t\n | Del of modElement t\n | Dialog of dialogElement t\n | Div of divElement t\n | Dl of dListElement t\n | Embed of embedElement t\n | Fieldset of fieldSetElement t\n | Form of formElement t\n | Frameset of frameSetElement t\n | Frame of frameElement t\n | H1 of headingElement t\n | H2 of headingElement t\n | H3 of headingElement t\n | H4 of headingElement t\n | H5 of headingElement t\n | H6 of headingElement t\n | Head of headElement t\n | Hr of hrElement t\n | Html of htmlElement t\n | Iframe of iFrameElement t\n | Img of imageElement t\n | Input of inputElement t\n | Ins of modElement t\n | Label of labelElement t\n | Legend of legendElement t\n | Li of liElement t\n | Link of linkElement t\n | Map of mapElement t\n | Meta of metaElement t\n | Object of objectElement t\n | Ol of oListElement t\n | Optgroup of optGroupElement t\n | Option of optionElement t\n | P of paragraphElement t\n | Param of paramElement t\n | Pre of preElement t\n | Q of quoteElement t\n | Script of scriptElement t\n | Select of selectElement t\n | Style of styleElement t\n | Table of tableElement t\n | Tbody of tableSectionElement t\n | Td of tableCellElement t\n | Textarea of textAreaElement t\n | Tfoot of tableSectionElement t\n | Th of tableCellElement t\n | Thead of tableSectionElement t\n | Title of titleElement t\n | Tr of tableRowElement t\n | Ul of uListElement t\n | Video of videoElement t\n | Other of element t\n\nlet other e = Other (e : #element t :> element t)\n\nlet tagged (e : #element t) =\n let tag = Js.to_bytestring e##.tagName##toLowerCase in\n if String.length tag = 0\n then other e\n else\n match String.unsafe_get tag 0 with\n | 'a' -> (\n match tag with\n | \"a\" -> A (Js.Unsafe.coerce e)\n | \"area\" -> Area (Js.Unsafe.coerce e)\n | \"audio\" -> Audio (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'b' -> (\n match tag with\n | \"base\" -> Base (Js.Unsafe.coerce e)\n | \"blockquote\" -> Blockquote (Js.Unsafe.coerce e)\n | \"body\" -> Body (Js.Unsafe.coerce e)\n | \"br\" -> Br (Js.Unsafe.coerce e)\n | \"button\" -> Button (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'c' -> (\n match tag with\n | \"canvas\" -> Canvas (Js.Unsafe.coerce e)\n | \"caption\" -> Caption (Js.Unsafe.coerce e)\n | \"col\" -> Col (Js.Unsafe.coerce e)\n | \"colgroup\" -> Colgroup (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'd' -> (\n match tag with\n | \"del\" -> Del (Js.Unsafe.coerce e)\n | \"div\" -> Div (Js.Unsafe.coerce e)\n | \"dl\" -> Dl (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'e' -> (\n match tag with\n | \"embed\" -> Embed (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'f' -> (\n match tag with\n | \"fieldset\" -> Fieldset (Js.Unsafe.coerce e)\n | \"form\" -> Form (Js.Unsafe.coerce e)\n | \"frameset\" -> Frameset (Js.Unsafe.coerce e)\n | \"frame\" -> Frame (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'h' -> (\n match tag with\n | \"h1\" -> H1 (Js.Unsafe.coerce e)\n | \"h2\" -> H2 (Js.Unsafe.coerce e)\n | \"h3\" -> H3 (Js.Unsafe.coerce e)\n | \"h4\" -> H4 (Js.Unsafe.coerce e)\n | \"h5\" -> H5 (Js.Unsafe.coerce e)\n | \"h6\" -> H6 (Js.Unsafe.coerce e)\n | \"head\" -> Head (Js.Unsafe.coerce e)\n | \"hr\" -> Hr (Js.Unsafe.coerce e)\n | \"html\" -> Html (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'i' -> (\n match tag with\n | \"iframe\" -> Iframe (Js.Unsafe.coerce e)\n | \"img\" -> Img (Js.Unsafe.coerce e)\n | \"input\" -> Input (Js.Unsafe.coerce e)\n | \"ins\" -> Ins (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'l' -> (\n match tag with\n | \"label\" -> Label (Js.Unsafe.coerce e)\n | \"legend\" -> Legend (Js.Unsafe.coerce e)\n | \"li\" -> Li (Js.Unsafe.coerce e)\n | \"link\" -> Link (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'm' -> (\n match tag with\n | \"map\" -> Map (Js.Unsafe.coerce e)\n | \"meta\" -> Meta (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'o' -> (\n match tag with\n | \"object\" -> Object (Js.Unsafe.coerce e)\n | \"ol\" -> Ol (Js.Unsafe.coerce e)\n | \"optgroup\" -> Optgroup (Js.Unsafe.coerce e)\n | \"option\" -> Option (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'p' -> (\n match tag with\n | \"p\" -> P (Js.Unsafe.coerce e)\n | \"param\" -> Param (Js.Unsafe.coerce e)\n | \"pre\" -> Pre (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'q' -> (\n match tag with\n | \"q\" -> Q (Js.Unsafe.coerce e)\n | _ -> other e)\n | 's' -> (\n match tag with\n | \"script\" -> Script (Js.Unsafe.coerce e)\n | \"select\" -> Select (Js.Unsafe.coerce e)\n | \"style\" -> Style (Js.Unsafe.coerce e)\n | _ -> other e)\n | 't' -> (\n match tag with\n | \"table\" -> Table (Js.Unsafe.coerce e)\n | \"tbody\" -> Tbody (Js.Unsafe.coerce e)\n | \"td\" -> Td (Js.Unsafe.coerce e)\n | \"textarea\" -> Textarea (Js.Unsafe.coerce e)\n | \"tfoot\" -> Tfoot (Js.Unsafe.coerce e)\n | \"th\" -> Th (Js.Unsafe.coerce e)\n | \"thead\" -> Thead (Js.Unsafe.coerce e)\n | \"title\" -> Title (Js.Unsafe.coerce e)\n | \"tr\" -> Tr (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'u' -> (\n match tag with\n | \"ul\" -> Ul (Js.Unsafe.coerce e)\n | _ -> other e)\n | 'v' -> (\n match tag with\n | \"video\" -> Video (Js.Unsafe.coerce e)\n | _ -> other e)\n | _ -> other e\n\nlet opt_tagged e = Opt.case e (fun () -> None) (fun e -> Some (tagged e))\n\ntype taggedEvent =\n | MouseEvent of mouseEvent t\n | KeyboardEvent of keyboardEvent t\n | MessageEvent of messageEvent t\n | MousewheelEvent of mousewheelEvent t\n | MouseScrollEvent of mouseScrollEvent t\n | PopStateEvent of popStateEvent t\n | OtherEvent of event t\n\nlet taggedEvent (ev : #event Js.t) =\n Js.Opt.case\n (CoerceTo.mouseEvent ev)\n (fun () ->\n Js.Opt.case\n (CoerceTo.keyboardEvent ev)\n (fun () ->\n Js.Opt.case\n (CoerceTo.wheelEvent ev)\n (fun () ->\n Js.Opt.case\n (CoerceTo.mouseScrollEvent ev)\n (fun () ->\n Js.Opt.case\n (CoerceTo.popStateEvent ev)\n (fun () ->\n Js.Opt.case\n (CoerceTo.messageEvent ev)\n (fun () -> OtherEvent (ev :> event t))\n (fun ev -> MessageEvent ev))\n (fun ev -> PopStateEvent ev))\n (fun ev -> MouseScrollEvent ev))\n (fun ev -> MousewheelEvent ev))\n (fun ev -> KeyboardEvent ev))\n (fun ev -> MouseEvent ev)\n\nlet opt_taggedEvent ev = Opt.case ev (fun () -> None) (fun ev -> Some (taggedEvent ev))\n\nlet stopPropagation ev =\n let e = Js.Unsafe.coerce ev in\n Optdef.case\n e##.stopPropagation\n (fun () -> e##.cancelBubble := Js._true)\n (fun _ -> e##_stopPropagation)\n\nlet _requestAnimationFrame : (unit -> unit) Js.callback -> unit =\n Js.Unsafe.pure_expr (fun _ ->\n let w = Js.Unsafe.coerce window in\n let l =\n [ w##.requestAnimationFrame\n ; w##.mozRequestAnimationFrame\n ; w##.webkitRequestAnimationFrame\n ; w##.oRequestAnimationFrame\n ; w##.msRequestAnimationFrame\n ]\n in\n try\n let req = List.find (fun c -> Js.Optdef.test c) l in\n fun callback -> Js.Unsafe.fun_call req [| Js.Unsafe.inject callback |]\n with Not_found ->\n let now () = Js.to_float (new%js Js.date_now)##getTime in\n let last = ref (now ()) in\n fun callback ->\n let t = now () in\n let dt = !last +. (1000. /. 60.) -. t in\n let dt = if Poly.(dt < 0.) then 0. else dt in\n last := t;\n ignore (window##setTimeout callback (Js.float dt)))\n\n(****)\n\nlet hasPushState () = Js.Optdef.test (Js.Unsafe.coerce window##.history)##.pushState\n\nlet hasPlaceholder () =\n let i = createInput document in\n Js.Optdef.test (Js.Unsafe.coerce i)##.placeholder\n\nlet hasRequired () =\n let i = createInput document in\n Js.Optdef.test (Js.Unsafe.coerce i)##.required\n\nlet overflow_limit = 2147483_000.\n\n(* ms *)\n\ntype timeout_id_safe = timeout_id option ref\n\nlet setTimeout callback d : timeout_id_safe =\n let id = ref None in\n let rec loop d () =\n let step, remain =\n if Poly.(d > overflow_limit) then overflow_limit, d -. overflow_limit else d, 0.\n in\n let cb = if Poly.(remain = 0.) then callback else loop remain in\n id := Some (window##setTimeout (Js.wrap_callback cb) (Js.float step))\n in\n loop d ();\n id\n\nlet clearTimeout (id : timeout_id_safe) =\n match !id with\n | None -> ()\n | Some x ->\n id := None;\n window##clearTimeout x\n\nlet onload f =\n let complete = Js.string \"complete\" in\n if document##.readyState == complete\n then f ()\n else\n ignore\n (Dom.addEventListener\n window\n Event.load\n (handler (fun _ ->\n f ();\n Js._true))\n Js._false)\n\nlet js_array_of_collection (c : #element collection Js.t) : #element Js.t Js.js_array Js.t\n =\n Js.Unsafe.(meth_call (js_expr \"[].slice\") \"call\" [| inject c |])\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":89351},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/form.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2011 Pierre Chambart\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen Dom_html\nopen! Import\n\nclass type formData = object\n method append : js_string t -> js_string t -> unit meth\n\n method append_blob : js_string t -> File.blob t -> unit meth\nend\n\nlet formData : formData t constr = Js.Unsafe.global##._FormData\n\nlet formData_form : (formElement t -> formData t) constr = Js.Unsafe.global##._FormData\n\ntype form_elt =\n [ `String of js_string t\n | `File of File.file t\n ]\n\ntype form_contents =\n [ `Fields of (string * form_elt) list ref\n | `FormData of formData t\n ]\n\nlet rec filter_map f = function\n | [] -> []\n | v :: q -> (\n match f v with\n | None -> filter_map f q\n | Some v' -> v' :: filter_map f q)\n\nclass type submittableElement = object\n method disabled : bool t prop\n\n method name : js_string t readonly_prop\n\n method value : js_string t prop\nend\n\nlet have_content (elt : submittableElement t) =\n elt##.name##.length > 0 && not (Js.to_bool elt##.disabled)\n\nlet get_textarea_val (elt : textAreaElement t) =\n if have_content (elt :> submittableElement t)\n then\n let name = to_string elt##.name in\n [ name, `String elt##.value ]\n else []\n\nlet get_select_val (elt : selectElement t) =\n if have_content (elt :> submittableElement t)\n then\n let name = to_string elt##.name in\n if to_bool elt##.multiple\n then\n let options =\n Array.init elt##.options##.length (fun i -> Opt.to_option (elt##.options##item i))\n in\n filter_map\n (function\n | None -> None\n | Some e ->\n if Js.to_bool e##.selected then Some (name, `String e##.value) else None)\n (Array.to_list options)\n else [ name, `String elt##.value ]\n else []\n\nclass type file_input = object\n inherit inputElement\n\n method files : File.fileList t readonly_prop\n\n method multiple : bool optdef readonly_prop\nend\n\nlet get_input_val ?(get = false) (elt : inputElement t) =\n if have_content (elt :> submittableElement t)\n then\n let name = to_string elt##.name in\n let value = elt##.value in\n match to_bytestring elt##._type##toLowerCase with\n | \"checkbox\" | \"radio\" ->\n if to_bool elt##.checked then [ name, `String value ] else []\n | \"submit\" | \"reset\" -> []\n | \"text\" | \"password\" -> [ name, `String value ]\n | \"file\" -> (\n if get\n then [ name, `String value ]\n else\n let elt : file_input t = Unsafe.coerce elt in\n let list = elt##.files in\n if list##.length = 0\n then [ name, `String (Js.string \"\") ]\n else\n match Optdef.to_option elt##.multiple with\n | None | Some false -> (\n match Opt.to_option (list##item 0) with\n | None -> []\n | Some file -> [ name, `File file ])\n | Some true ->\n filter_map\n (fun f ->\n match Opt.to_option f with\n | None -> None\n | Some file -> Some (name, `File file))\n (Array.to_list (Array.init list##.length (fun i -> list##item i))))\n | _ -> [ name, `String value ]\n else []\n\nlet get_form_elements (form : formElement t) =\n let rec loop acc i =\n if i < 0\n then acc\n else\n match Opt.to_option (form##.elements##item i) with\n | None -> loop acc (i - 1)\n | Some x -> loop (x :: acc) (i - 1)\n in\n loop [] (form##.elements##.length - 1)\n\nlet get_element_content ?get v =\n match tagged v with\n | Select v -> get_select_val v\n | Input v -> get_input_val ?get v\n | Textarea v -> get_textarea_val v\n | _ -> []\n\nlet form_elements ?get (form : formElement t) =\n List.flatten (List.map (fun v -> get_element_content ?get v) (get_form_elements form))\n\nlet append (form_contents : form_contents) (form_elt : string * form_elt) =\n match form_contents with\n | `Fields list -> list := form_elt :: !list\n | `FormData f -> (\n match form_elt with\n | name, `String s -> f##append (string name) s\n | name, `File file -> f##append_blob (string name) (file :> File.blob t))\n\nlet empty_form_contents () =\n match Optdef.to_option (Js.def formData) with\n | None -> `Fields (ref [])\n | Some constr -> `FormData (new%js constr)\n\nlet post_form_contents form =\n let contents = empty_form_contents () in\n List.iter (append contents) (form_elements form);\n contents\n\nlet get_form_contents form =\n List.map\n (function\n | name, `String s -> name, to_string s\n | _ -> assert false)\n (form_elements ~get:true form)\n","(* generated code *)"],"names":[],"mappings":"KA0KI,iB,CAAA,yBACwC,IADxC,cAC6B,EAAW,OAC/B,eAAa,C,EACQ,GAA9B,YAA8B,qB,EARtB,mB,EAAA,GADK,IAAf,MAAe,SACL,GAAkB,aAAD,OAA3B,cAAgD,EACxC,C,GAPR,KAAuB,IAAvB,OAAuB,aAAiB,eAAlC,eAAkC,QAC9B,gB,EAAA,QACgC,YADhC,UACiB,OAAe,M,MAV1C,kCACkB,4CACD,wDAGwB,MAAa,8BADnB,MAAa,kB,EAC6B,C,EAR5C,cAA0B,C,QAVlD,gBAAwB,kBAP/B,UAGuB,SAAD,aAAyB,eAAvC,eAAuC,OACnC,UACE,IADF,UACE,kB,GAYqE,QAAxE,EAAwE,OAAxE,aAAyE,qB,KA1BpE,OAAM,EAAN,eAAM,eAAe,QACX,KACK,0BADL,UACK,aAAuB,C,EACW,oBAAY,C,KA9CzE,UACY,KADZ,OACY,YAEQ,OAAX,EAAuB,QAA0C,KAAP,0BAAT,SAAS,cAAY,C,EANpB,gBAAD,WAAuB,6B,WAiEzE,QAAR,EAAN,SAAM,eAAQ,a,GAAA,uCA9EX,GAA0C,KAGhB,QADN,SAAV,EACgB,YAAX,SAAW,kBACxB,M,EAAA,YAGF,GAA0C,KAEtB,SAAV,IACA,SAAR,EAAsB,OAWO,sBAAX,SAAW,kBAT9B,UAQyB,QAPZ,gBAAX,EAAiC,OAAjC,aAEF,OAKE,aAAuB,I,EAExB,M,EAUW,UAAQ,gB,EAVnB,YAWF,GAA0C,KAEtB,SAAV,IACC,WACQ,gBAAd,KAAsC,W,CAAA,iBAKhC,SAMU,IADL,WACR,OAAa,GACmB,2CAEV,SAAc,eAA/B,eAA+B,K,CAAA,iB,CAAA,EAMjC,UAKoE,QAAvC,SAAZ,EAAyB,OAAzB,aAAkD,OAAjE,aAAkE,KAThD,eAAc,eAA5B,eAA4B,OACxB,MACK,sBADL,UACK,kB,IAXlB,0C,IAAA,a,CAAA,iB,EAAA,a,CAAA,e,CAAA,iBAmBF,2CAvBiB,OACC,4CAFV,SAAR,EAAqB,OAAmC,MAA7B,0C,EAyB/B,M,EAkBE,IAAE,C,IArFT,gBAAmB,YAAwB,SAAZ,EAA2B,O,GAAA,C,QAhBzC,aACT,0BAEE,YAAG,OAEwB,IAFxB,UAEU,OAAc,MAAC,C,QAjB+C,IChCvF,eD8BmC,SAA4B,eAEJ,OAA4B,uC,EChCvF,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":91836},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/js_of_ocaml/xmlHttpRequest.ml"],"sourcesContent":["(* generated code *)","(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\ntype readyState =\n | UNSENT\n | OPENED\n | HEADERS_RECEIVED\n | LOADING\n | DONE\n\ntype _ response =\n | ArrayBuffer : Typed_array.arrayBuffer t Opt.t response\n | Blob : #File.blob t Opt.t response\n | Document : Dom.element Dom.document t Opt.t response\n | JSON : 'a Opt.t response\n | Text : js_string t response\n | Default : string response\n\nclass type xmlHttpRequest = object ('self)\n method onreadystatechange : (unit -> unit) Js.callback Js.writeonly_prop\n\n method readyState : readyState readonly_prop\n\n method _open : js_string t -> js_string t -> bool t -> unit meth\n\n method _open_full :\n js_string t\n -> js_string t\n -> bool t\n -> js_string t opt\n -> js_string t opt\n -> unit meth\n\n method setRequestHeader : js_string t -> js_string t -> unit meth\n\n method overrideMimeType : js_string t -> unit meth\n\n method send : js_string t opt -> unit meth\n\n method send_blob : #File.blob t -> unit meth\n\n method send_document : Dom.element Dom.document t -> unit meth\n\n method send_formData : Form.formData t -> unit meth\n\n method abort : unit meth\n\n method status : int readonly_prop\n\n method statusText : js_string t readonly_prop\n\n method getResponseHeader : js_string t -> js_string t opt meth\n\n method getAllResponseHeaders : js_string t meth\n\n method response : File.file_any readonly_prop\n\n method responseText : js_string t opt readonly_prop\n\n method responseXML : Dom.element Dom.document t opt readonly_prop\n\n method responseType : js_string t prop\n\n method withCredentials : bool t writeonly_prop\n\n inherit File.progressEventTarget\n\n method ontimeout :\n ('self t, 'self File.progressEvent t) Dom.event_listener writeonly_prop\n\n method upload : xmlHttpRequestUpload t readonly_prop\nend\n\nand xmlHttpRequestUpload = object ('self)\n inherit File.progressEventTarget\nend\n\nmodule Event = struct\n type typ = xmlHttpRequest File.progressEvent t Dom.Event.typ\n\n let readystatechange = Dom.Event.make \"readystatechange\"\n\n let loadstart = Dom.Event.make \"loadstart\"\n\n let progress = Dom.Event.make \"progress\"\n\n let abort = Dom.Event.make \"abort\"\n\n let error = Dom.Event.make \"error\"\n\n let load = Dom.Event.make \"load\"\n\n let timeout = Dom.Event.make \"timeout\"\n\n let loadend = Dom.Event.make \"loadend\"\nend\n\nexternal create : unit -> xmlHttpRequest Js.t = \"caml_xmlhttprequest_create\"\n"],"names":[],"mappings":"cCkHwC,WAdf,GDpGzB,eCoGyB,aAEP,GAFwC,eAExC,aAED,GAF2B,eAE3B,aAEH,GAF4B,eAE5B,aAEA,GAFsB,eAEtB,aAED,GAFuB,eAEvB,aAEG,GAFkB,eAElB,aAEA,GAFwB,eAExB,aAAwB","ignoreList":[0]}},{"offset":{"line":0,"column":92125},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/worker.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2015 OCamlPro: Grégoire Henry, Çağdaş Bozman.\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen Dom_html\nopen! Import\n\nclass type ['a, 'b] worker = object ('self)\n inherit eventTarget\n\n method onerror : ('self t, errorEvent t) event_listener writeonly_prop\n\n method onmessage : ('self t, 'b messageEvent t) event_listener writeonly_prop\n\n method postMessage : 'a -> unit meth\n\n method terminate : unit meth\nend\n\nand errorEvent = object\n inherit event\n\n method message : js_string t readonly_prop\n\n method filename : js_string t readonly_prop\n\n method lineno : int readonly_prop\n\n method colno : int readonly_prop\n\n method error : Unsafe.any readonly_prop\nend\n\nand ['a] messageEvent = object\n inherit event\n\n method data : 'a readonly_prop\nend\n\nlet worker = Unsafe.global##._Worker\n\nlet create script = new%js worker (string script)\n\nlet import_scripts scripts : unit =\n if not (Js.Optdef.test Unsafe.global##.importScripts)\n then invalid_arg \"Worker.import_scripts is undefined\";\n Unsafe.fun_call\n Unsafe.global##.importScripts\n (Array.map (fun s -> Unsafe.inject (string s)) (Array.of_list scripts))\n\nlet set_onmessage handler =\n if not (Js.Optdef.test Unsafe.global##.onmessage)\n then invalid_arg \"Worker.onmessage is undefined\";\n let js_handler (ev : 'a messageEvent Js.t) = handler ev##.data in\n Unsafe.global##.onmessage := wrap_callback js_handler\n\nlet post_message msg =\n if not (Js.Optdef.test Unsafe.global##.postMessage)\n then invalid_arg \"Worker.onmessage is undefined\";\n Unsafe.global##postMessage msg\n","(* generated code *)"],"names":[],"mappings":"EAyEE,eAAuB,OAA2B,eAA3C,aAA4C,QAC9C,yBACL,0BAA8B,C,KANuB,gBAAS,oB,EAF9D,eAAuB,OAAyB,eAAzC,aAA0C,QAC5C,yBACL,QAC6B,IAAwB,2B,EANhB,IAAU,C,GAJ/C,eAAuB,OAA6B,eAA7C,aAA8C,QAChD,yBAGH,GAA+C,EAFjD,OAEiD,aAAuB,OAAtE,eAAuE,eADvE,OADF,KAEyE,C,KAPzC,aAAe,kB,EAFb,OCvDpC,eDuDa,OAAuB","ignoreList":[1]}},{"offset":{"line":0,"column":92661},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/webSockets.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2012 Jacques-Pascal Deplaix\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen! Import\n\ntype readyState =\n | CONNECTING\n | OPEN\n | CLOSING\n | CLOSED\n\nclass type ['a] closeEvent = object\n inherit ['a] Dom.event\n\n method code : int Js.readonly_prop\n\n method reason : Js.js_string Js.t Js.readonly_prop\n\n method wasClean : bool Js.t Js.readonly_prop\nend\n\nclass type ['a] messageEvent = object\n inherit ['a] Dom.event\n\n method data : Js.js_string Js.t Js.readonly_prop\n\n method data_buffer : Typed_array.arrayBuffer Js.t Js.readonly_prop\n\n method data_blob : File.blob Js.t Js.readonly_prop\nend\n\nclass type webSocket = object ('self)\n inherit Dom_html.eventTarget\n\n method url : Js.js_string Js.t Js.readonly_prop\n\n method readyState : readyState Js.readonly_prop\n\n method bufferedAmount : int Js.readonly_prop\n\n method onopen : ('self Js.t, 'self Dom.event Js.t) Dom.event_listener Js.writeonly_prop\n\n method onclose :\n ('self Js.t, 'self closeEvent Js.t) Dom.event_listener Js.writeonly_prop\n\n method onerror : ('self Js.t, 'self Dom.event Js.t) Dom.event_listener Js.writeonly_prop\n\n method extensions : Js.js_string Js.t Js.readonly_prop\n\n method protocol : Js.js_string Js.t Js.readonly_prop\n\n method close : unit Js.meth\n\n method close_withCode : int -> unit Js.meth\n\n method close_withCodeAndReason : int -> Js.js_string Js.t -> unit Js.meth\n\n method onmessage :\n ('self Js.t, 'self messageEvent Js.t) Dom.event_listener Js.writeonly_prop\n\n method binaryType : Js.js_string Js.t Js.prop\n\n method send : Js.js_string Js.t -> unit Js.meth\n\n method send_buffer : Typed_array.arrayBuffer Js.t -> unit Js.meth\n\n method send_blob : File.blob Js.t -> unit Js.meth\nend\n\nlet webSocket = Js.Unsafe.global##._WebSocket\n\nlet webSocket_withProtocol = webSocket\n\nlet webSocket_withProtocols = webSocket\n\nlet is_supported () = Js.Optdef.test webSocket\n","(* generated code *)"],"names":[],"mappings":"EA4FsB,qCAAwB,C,KAND,ICtF7C,eDsFgB,SAA6B","ignoreList":[1]}},{"offset":{"line":0,"column":92758},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/webGL.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2012 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\n(** 5.1 Types *)\n\ntype sizei = int\n\ntype sizeiptr = int\n\ntype intptr = int\n\ntype uint = int\n\ntype clampf = number_t\n\ntype void\n\ntype clearBufferMask = int\n\ntype beginMode\n\ntype blendingFactor\n\ntype blendMode\n\ntype bufferTarget\n\ntype bufferUsage\n\ntype cullFaceMode\n\ntype depthFunction\n\ntype enableCap\n\ntype errorCode\n\ntype frontFaceDir\n\ntype hintTarget\n\ntype hintMode\n\ntype textureUnit = int\n\ntype 'a pixelStoreParam\n\ntype stencilOp\n\ntype fbTarget\n\ntype attachmentPoint\n\ntype rbTarget\n\ntype texTarget\n\ntype 'a parameter\n\ntype 'a bufferParameter\n\ntype 'a vertexAttribParam\n\ntype vertexAttribPointerParam\n\ntype 'a attachParam\n\ntype framebufferStatus\n\ntype 'a renderbufferParam\n\ntype format\n\ntype pixelFormat\n\ntype pixelType\n\ntype 'a texParam\n\ntype dataType\n\ntype shaderType\n\ntype 'a programParam\n\ntype 'a shaderParam\n\ntype textureFilter\n\ntype wrapMode\n\ntype texFilter\n\ntype uniformType\n\ntype colorspaceConversion\n\ntype shaderPrecisionType\n\ntype objectType\n\n(** 5.2 WebGLContextAttributes *)\nclass type contextAttributes = object\n method alpha : bool t prop\n\n method depth : bool t prop\n\n method stencil : bool t prop\n\n method antialias : bool t prop\n\n method premultipliedAlpha : bool t prop\n\n method preserveDrawingBuffer : bool t prop\n\n method preferLowPowerToHighPerformance : bool t prop\n\n method failIfMajorPerformanceCaveat : bool t prop\nend\n\nlet defaultContextAttributes =\n Js.Unsafe.(\n obj\n [| \"alpha\", inject _true\n ; \"depth\", inject _true\n ; \"stencil\", inject _false\n ; \"antialias\", inject _true\n ; \"premultipliedAlpha\", inject _false\n ; \"preserveDrawingBuffer\", inject _false\n ; \"preferLowPowerToHighPerformance\", inject _false\n ; \"failIfMajorPerformanceCaveat\", inject _false\n |])\n\ntype buffer\n\ntype framebuffer\n\ntype program\n\ntype renderbuffer\n\ntype shader\n\ntype texture\n\ntype 'a uniformLocation\n\nclass type activeInfo = object\n method size : int readonly_prop\n\n method _type : uniformType readonly_prop\n\n method name : js_string t readonly_prop\nend\n\nclass type shaderPrecisionFormat = object\n method rangeMin : int readonly_prop\n\n method rangeMax : int readonly_prop\n\n method precision : int readonly_prop\nend\n\nclass type renderingContext = object\n (** 5.13.1 Attributes *)\n\n method canvas : Dom_html.canvasElement t readonly_prop\n\n method drawingBufferWidth : sizei readonly_prop\n\n method drawingBufferHeight : sizei readonly_prop\n\n (** 5.13.2 Getting information about the context *)\n\n method getContextAttributes : contextAttributes t meth\n\n (** 5.13.3 Setting and getting state *)\n\n method activeTexture : textureUnit -> unit meth\n\n method blendColor : clampf -> clampf -> clampf -> clampf -> unit meth\n\n method blendEquation : blendMode -> unit meth\n\n method blendEquationSeparate : blendMode -> blendMode -> unit meth\n\n method blendFunc : blendingFactor -> blendingFactor -> unit meth\n\n method blendFuncSeparate :\n blendingFactor -> blendingFactor -> blendingFactor -> blendingFactor -> unit meth\n\n method clearColor : clampf -> clampf -> clampf -> clampf -> unit meth\n\n method clearDepth : clampf -> unit meth\n\n method clearStencil : int -> unit meth\n\n method colorMask : bool t -> bool t -> bool t -> bool t -> unit meth\n\n method cullFace : cullFaceMode -> unit meth\n\n method depthFunc : depthFunction -> unit meth\n\n method depthMask : bool t -> unit meth\n\n method depthRange : clampf -> clampf -> unit meth\n\n method disable : enableCap -> unit meth\n\n method enable : enableCap -> unit meth\n\n method frontFace : frontFaceDir -> unit meth\n\n method getParameter : 'a. 'a parameter -> 'a meth\n\n method getError : errorCode meth\n\n method hint : hintTarget -> hintMode -> unit meth\n\n method isEnabled : enableCap -> bool t meth\n\n method lineWidth : number_t -> unit meth\n\n method pixelStorei : 'a. 'a pixelStoreParam -> 'a -> unit meth\n\n method polygonOffset : number_t -> number_t -> unit meth\n\n method sampleCoverage : clampf -> bool t -> unit meth\n\n method stencilFunc : depthFunction -> int -> uint -> unit meth\n\n method stencilFuncSeparate : cullFaceMode -> depthFunction -> int -> uint -> unit meth\n\n method stencilMask : uint -> unit meth\n\n method stencilMaskSeparate : cullFaceMode -> uint -> unit meth\n\n method stencilOp : stencilOp -> stencilOp -> stencilOp -> unit meth\n\n method stencilOpSeparate :\n cullFaceMode -> stencilOp -> stencilOp -> stencilOp -> unit meth\n\n (** 5.13.4 Viewing and clipping *)\n\n method scissor : int -> int -> sizei -> sizei -> unit meth\n\n method viewport : int -> int -> sizei -> sizei -> unit meth\n\n (** 5.13.5 Buffer objects *)\n\n method bindBuffer : bufferTarget -> buffer t -> unit meth\n\n method bindBuffer_ : bufferTarget -> buffer t opt -> unit meth\n\n method bufferData_create : bufferTarget -> sizeiptr -> bufferUsage -> unit meth\n\n method bufferData :\n bufferTarget -> #Typed_array.arrayBufferView t -> bufferUsage -> unit meth\n\n method bufferData_raw :\n bufferTarget -> Typed_array.arrayBuffer t -> bufferUsage -> unit meth\n\n method bufferSubData :\n bufferTarget -> intptr -> #Typed_array.arrayBufferView t -> unit meth\n\n method bufferSubData_raw :\n bufferTarget -> intptr -> Typed_array.arrayBuffer t -> unit meth\n\n method createBuffer : buffer t meth\n\n method deleteBuffer : buffer t -> unit meth\n\n method getBufferParameter : 'a. bufferTarget -> 'a bufferParameter -> 'a meth\n\n method isBuffer : buffer t -> bool t meth\n\n (** 5.13.6 Framebuffer objects *)\n\n method bindFramebuffer : fbTarget -> framebuffer t -> unit meth\n\n method bindFramebuffer_ : fbTarget -> framebuffer t opt -> unit meth\n\n method checkFramebufferStatus : fbTarget -> framebufferStatus meth\n\n method createFramebuffer : framebuffer t meth\n\n method deleteFramebuffer : framebuffer t -> unit meth\n\n method framebufferRenderbuffer :\n fbTarget -> attachmentPoint -> rbTarget -> renderbuffer t -> unit meth\n\n method framebufferTexture2D :\n fbTarget -> attachmentPoint -> texTarget -> texture t -> int -> unit meth\n\n method getFramebufferAttachmentParameter :\n 'a. fbTarget -> attachmentPoint -> 'a attachParam -> 'a meth\n\n method isFramebuffer : framebuffer t -> bool t meth\n\n (** 5.13.7 Renderbuffer objects *)\n\n method bindRenderbuffer : rbTarget -> renderbuffer t -> unit meth\n\n method bindRenderbuffer_ : rbTarget -> renderbuffer t opt -> unit meth\n\n method createRenderbuffer : renderbuffer t meth\n\n method deleteRenderbuffer : renderbuffer t -> unit meth\n\n method getRenderbufferParameter : 'a. rbTarget -> 'a renderbufferParam -> 'a meth\n\n method isRenderbuffer : renderbuffer t -> bool t meth\n\n method renderbufferStorage : rbTarget -> format -> sizei -> sizei -> unit meth\n\n (** 5.13.8 Texture objects *)\n\n method bindTexture : texTarget -> texture t -> unit meth\n\n method bindTexture_ : texTarget -> texture t opt -> unit meth\n\n method compressedTexImage2D :\n texTarget\n -> int\n -> pixelFormat\n -> sizei\n -> sizei\n -> int\n -> #Typed_array.arrayBufferView t\n -> unit meth\n\n method compressedTexSubImage2D :\n texTarget\n -> int\n -> int\n -> int\n -> sizei\n -> sizei\n -> pixelFormat\n -> #Typed_array.arrayBufferView t\n -> unit meth\n\n method copyTexImage2D :\n texTarget -> int -> pixelFormat -> int -> int -> sizei -> sizei -> int -> unit meth\n\n method copyTexSubImage2D :\n texTarget -> int -> int -> int -> int -> int -> sizei -> sizei -> unit meth\n\n method createTexture : texture t meth\n\n method deleteTexture : texture t -> unit meth\n\n method generateMipmap : texTarget -> unit meth\n\n method getTexParameter : texTarget -> 'a texParam -> 'a meth\n\n method isTexture : texture t -> bool t meth\n\n method texImage2D_new :\n texTarget\n -> int\n -> pixelFormat\n -> sizei\n -> sizei\n -> int\n -> pixelFormat\n -> pixelType\n -> void opt\n -> unit meth\n\n method texImage2D_fromView :\n texTarget\n -> int\n -> pixelFormat\n -> sizei\n -> sizei\n -> int\n -> pixelFormat\n -> pixelType\n -> #Typed_array.arrayBufferView t\n -> unit meth\n\n method texImage2D_fromImageData :\n texTarget\n -> int\n -> pixelFormat\n -> pixelFormat\n -> pixelType\n -> Dom_html.imageData t\n -> unit meth\n\n method texImage2D_fromImage :\n texTarget\n -> int\n -> pixelFormat\n -> pixelFormat\n -> pixelType\n -> Dom_html.imageElement t\n -> unit meth\n\n method texImage2D_fromCanvas :\n texTarget\n -> int\n -> pixelFormat\n -> pixelFormat\n -> pixelType\n -> Dom_html.canvasElement t\n -> unit meth\n\n method texImage2D_fromVideo :\n texTarget\n -> int\n -> pixelFormat\n -> pixelFormat\n -> pixelType\n -> Dom_html.videoElement t\n -> unit meth\n\n (* {[\n method texParameterf : texTarget -> texParam -> number_t -> unit meth\n ]}\n *)\n method texParameteri : texTarget -> 'a texParam -> 'a -> unit meth\n\n method texSubImage2D_fromView :\n texTarget\n -> int\n -> int\n -> int\n -> sizei\n -> sizei\n -> pixelFormat\n -> pixelType\n -> #Typed_array.arrayBufferView t\n -> unit meth\n\n method texSubImage2D_fromImageData :\n texTarget\n -> int\n -> int\n -> int\n -> pixelFormat\n -> pixelType\n -> Dom_html.imageData t\n -> unit meth\n\n method texSubImage2D_fromImage :\n texTarget\n -> int\n -> int\n -> int\n -> pixelFormat\n -> pixelType\n -> Dom_html.imageElement t\n -> unit meth\n\n method texSubImage2D_fromCanvas :\n texTarget\n -> int\n -> int\n -> int\n -> pixelFormat\n -> pixelType\n -> Dom_html.canvasElement t\n -> unit meth\n\n method texSubImage2D_fromVideo :\n texTarget\n -> int\n -> int\n -> int\n -> pixelFormat\n -> pixelType\n -> Dom_html.videoElement t\n -> unit meth\n\n (** 5.13.9 Programs and Shaders *)\n\n method attachShader : program t -> shader t -> unit meth\n\n method bindAttribLocation : program t -> uint -> js_string t -> unit meth\n\n method compileShader : shader t -> unit meth\n\n method createProgram : program t meth\n\n method createShader : shaderType -> shader t meth\n\n method deleteProgram : program t -> unit meth\n\n method deleteShader : shader t -> unit meth\n\n method detachShader : program t -> shader t -> unit meth\n\n method getAttachedShaders : program t -> shader t js_array t meth\n\n method getProgramParameter : 'a. program t -> 'a programParam -> 'a meth\n\n method getProgramInfoLog : program t -> js_string t meth\n\n method getShaderParameter : 'a. shader t -> 'a shaderParam -> 'a meth\n\n method getShaderPrecisionFormat :\n shaderType -> shaderPrecisionType -> shaderPrecisionFormat t meth\n\n method getShaderInfoLog : shader t -> js_string t meth\n\n method getShaderSource : shader t -> js_string t meth\n\n method isProgram : program t -> bool t meth\n\n method isShader : shader t -> bool t meth\n\n method linkProgram : program t -> unit meth\n\n method shaderSource : shader t -> js_string t -> unit meth\n\n method useProgram : program t -> unit meth\n\n method validateProgram : program t -> unit meth\n\n (** 5.13.10 Uniforms and attributes *)\n\n method disableVertexAttribArray : uint -> unit meth\n\n method enableVertexAttribArray : uint -> unit meth\n\n method getActiveAttrib : program t -> uint -> activeInfo t meth\n\n method getActiveUniform : program t -> uint -> activeInfo t meth\n\n method getAttribLocation : program t -> js_string t -> int meth\n\n method getUniform : 'a 'b. program t -> 'a uniformLocation t -> 'b meth\n\n method getUniformLocation : 'a. program t -> js_string t -> 'a uniformLocation t meth\n\n method getVertexAttrib : 'a. uint -> 'a vertexAttribParam -> 'a meth\n\n method getVertexAttribOffset : uint -> vertexAttribPointerParam -> sizeiptr meth\n\n method uniform1f : number_t uniformLocation t -> number_t -> unit meth\n\n method uniform1fv_typed :\n number_t uniformLocation t -> Typed_array.float32Array t -> unit meth\n\n method uniform1fv : number_t uniformLocation t -> number_t js_array t -> unit meth\n\n method uniform1i : int uniformLocation t -> int -> unit meth\n\n method uniform1iv_typed : int uniformLocation t -> Typed_array.int32Array t -> unit meth\n\n method uniform1iv : int uniformLocation t -> int js_array t -> unit meth\n\n method uniform2f : [ `vec2 ] uniformLocation t -> number_t -> number_t -> unit meth\n\n method uniform2fv_typed :\n [ `vec2 ] uniformLocation t -> Typed_array.float32Array t -> unit meth\n\n method uniform2fv : [ `vec2 ] uniformLocation t -> number_t js_array t -> unit meth\n\n method uniform2i : [ `ivec2 ] uniformLocation t -> int -> int -> unit meth\n\n method uniform2iv : [ `ivec2 ] uniformLocation t -> int js_array t -> unit meth\n\n method uniform2iv_typed :\n [ `ivec2 ] uniformLocation t -> Typed_array.int32Array t -> unit meth\n\n method uniform3f :\n [ `vec3 ] uniformLocation t -> number_t -> number_t -> number_t -> unit meth\n\n method uniform3fv_typed :\n [ `vec3 ] uniformLocation t -> Typed_array.float32Array t -> unit meth\n\n method uniform3fv : [ `vec3 ] uniformLocation t -> number_t js_array t -> unit meth\n\n method uniform3i : [ `ivec3 ] uniformLocation t -> int -> int -> int -> unit meth\n\n method uniform3iv : [ `ivec3 ] uniformLocation t -> int js_array t -> unit meth\n\n method uniform3iv_typed :\n [ `ivec3 ] uniformLocation t -> Typed_array.int32Array t -> unit meth\n\n method uniform4f :\n [ `vec4 ] uniformLocation t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> unit meth\n\n method uniform4fv_typed :\n [ `vec4 ] uniformLocation t -> Typed_array.float32Array t -> unit meth\n\n method uniform4fv : [ `vec4 ] uniformLocation t -> number_t js_array t -> unit meth\n\n method uniform4i : [ `ivec4 ] uniformLocation t -> int -> int -> int -> int -> unit meth\n\n method uniform4iv : [ `ivec4 ] uniformLocation t -> int js_array t -> unit meth\n\n method uniform4iv_typed :\n [ `ivec4 ] uniformLocation t -> Typed_array.int32Array t -> unit meth\n\n method uniformMatrix2fv :\n [ `mat2 ] uniformLocation t -> bool t -> number_t js_array t -> unit meth\n\n method uniformMatrix2fv_typed :\n [ `mat2 ] uniformLocation t -> bool t -> Typed_array.float32Array t -> unit meth\n\n method uniformMatrix3fv :\n [ `mat3 ] uniformLocation t -> bool t -> number_t js_array t -> unit meth\n\n method uniformMatrix3fv_typed :\n [ `mat3 ] uniformLocation t -> bool t -> Typed_array.float32Array t -> unit meth\n\n method uniformMatrix4fv :\n [ `mat4 ] uniformLocation t -> bool t -> number_t js_array t -> unit meth\n\n method uniformMatrix4fv_typed :\n [ `mat4 ] uniformLocation t -> bool t -> Typed_array.float32Array t -> unit meth\n\n method vertexAttrib1f : uint -> number_t -> unit meth\n\n method vertexAttrib1fv : uint -> number_t js_array t -> unit meth\n\n method vertexAttrib1fv_typed : uint -> Typed_array.float32Array t -> unit meth\n\n method vertexAttrib2f : uint -> number_t -> number_t -> unit meth\n\n method vertexAttrib2fv : uint -> number_t js_array t -> unit meth\n\n method vertexAttrib2fv_typed : uint -> Typed_array.float32Array t -> unit meth\n\n method vertexAttrib3f : uint -> number_t -> number_t -> number_t -> unit meth\n\n method vertexAttrib3fv : uint -> number_t js_array t -> unit meth\n\n method vertexAttrib3fv_typed : uint -> Typed_array.float32Array t -> unit meth\n\n method vertexAttrib4f :\n uint -> number_t -> number_t -> number_t -> number_t -> unit meth\n\n method vertexAttrib4fv : uint -> number_t js_array t -> unit meth\n\n method vertexAttrib4fv_typed : uint -> Typed_array.float32Array t -> unit meth\n\n method vertexAttribPointer :\n uint -> int -> dataType -> bool t -> sizei -> intptr -> unit meth\n\n (** 5.13.11 Writing to the drawing buffer *)\n\n method clear : clearBufferMask -> unit meth\n\n method drawArrays : beginMode -> int -> sizei -> unit meth\n\n method drawElements : beginMode -> sizei -> dataType -> intptr -> unit meth\n\n method finish : unit meth\n\n method flush : unit meth\n\n (** 5.13.12 Reading back pixels *)\n\n method readPixels :\n int\n -> int\n -> sizei\n -> sizei\n -> pixelFormat\n -> pixelType\n -> #Typed_array.arrayBufferView t\n -> unit meth\n\n (** 5.13.13 Detecting context lost events *)\n\n method isContextLost : bool t meth\n\n (** 5.13.14 Detecting and enabling extensions *)\n\n method getSupportedExtensions : js_string t js_array t meth\n\n method getExtension : 'a. js_string t -> 'a t opt meth\n\n (* Untyped! *)\n (** Constants *)\n\n method _DEPTH_BUFFER_BIT_ : clearBufferMask readonly_prop\n\n method _STENCIL_BUFFER_BIT_ : clearBufferMask readonly_prop\n\n method _COLOR_BUFFER_BIT_ : clearBufferMask readonly_prop\n\n method _POINTS : beginMode readonly_prop\n\n method _LINES : beginMode readonly_prop\n\n method _LINE_LOOP_ : beginMode readonly_prop\n\n method _LINE_STRIP_ : beginMode readonly_prop\n\n method _TRIANGLES : beginMode readonly_prop\n\n method _TRIANGLE_STRIP_ : beginMode readonly_prop\n\n method _TRIANGLE_FAN_ : beginMode readonly_prop\n\n method _ZERO : blendingFactor readonly_prop\n\n method _ONE : blendingFactor readonly_prop\n\n method _SRC_COLOR_ : blendingFactor readonly_prop\n\n method _ONE_MINUS_SRC_COLOR_ : blendingFactor readonly_prop\n\n method _SRC_ALPHA_ : blendingFactor readonly_prop\n\n method _ONE_MINUS_SRC_ALPHA_ : blendingFactor readonly_prop\n\n method _DST_ALPHA_ : blendingFactor readonly_prop\n\n method _ONE_MINUS_DST_ALPHA_ : blendingFactor readonly_prop\n\n method _DST_COLOR_ : blendingFactor readonly_prop\n\n method _ONE_MINUS_DST_COLOR_ : blendingFactor readonly_prop\n\n method _SRC_ALPHA_SATURATE_ : blendingFactor readonly_prop\n\n method _FUNC_ADD_ : blendMode readonly_prop\n\n method _FUNC_SUBTRACT_ : blendMode readonly_prop\n\n method _FUNC_REVERSE_SUBTRACT_ : blendMode readonly_prop\n\n method _CONSTANT_COLOR_ : blendMode readonly_prop\n\n method _ONE_MINUS_CONSTANT_COLOR_ : blendMode readonly_prop\n\n method _CONSTANT_ALPHA_ : blendMode readonly_prop\n\n method _ONE_MINUS_CONSTANT_ALPHA_ : blendMode readonly_prop\n\n method _ARRAY_BUFFER_ : bufferTarget readonly_prop\n\n method _ELEMENT_ARRAY_BUFFER_ : bufferTarget readonly_prop\n\n method _STREAM_DRAW_ : bufferUsage readonly_prop\n\n method _STATIC_DRAW_ : bufferUsage readonly_prop\n\n method _DYNAMIC_DRAW_ : bufferUsage readonly_prop\n\n method _FRONT : cullFaceMode readonly_prop\n\n method _BACK : cullFaceMode readonly_prop\n\n method _FRONT_AND_BACK_ : cullFaceMode readonly_prop\n\n method _CULL_FACE_ : enableCap readonly_prop\n\n method _BLEND : enableCap readonly_prop\n\n method _DITHER : enableCap readonly_prop\n\n method _STENCIL_TEST_ : enableCap readonly_prop\n\n method _DEPTH_TEST_ : enableCap readonly_prop\n\n method _SCISSOR_TEST_ : enableCap readonly_prop\n\n method _POLYGON_OFFSET_FILL_ : enableCap readonly_prop\n\n method _SAMPLE_ALPHA_TO_COVERAGE_ : enableCap readonly_prop\n\n method _SAMPLE_COVERAGE_ : enableCap readonly_prop\n\n method _NO_ERROR_ : errorCode readonly_prop\n\n method _INVALID_ENUM_ : errorCode readonly_prop\n\n method _INVALID_VALUE_ : errorCode readonly_prop\n\n method _INVALID_OPERATION_ : errorCode readonly_prop\n\n method _OUT_OF_MEMORY_ : errorCode readonly_prop\n\n method _CONTEXT_LOST_WEBGL_ : errorCode readonly_prop\n\n method _INVALID_FRAMEBUFFER_OPERATION_ : errorCode readonly_prop\n\n method _CW : frontFaceDir readonly_prop\n\n method _CCW : frontFaceDir readonly_prop\n\n method _DONT_CARE_ : hintMode readonly_prop\n\n method _FASTEST : hintMode readonly_prop\n\n method _NICEST : hintMode readonly_prop\n\n method _GENERATE_MIPMAP_HINT_ : hintTarget readonly_prop\n\n method _BLEND_EQUATION_ : blendMode parameter readonly_prop\n\n method _BLEND_EQUATION_RGB_ : blendMode parameter readonly_prop\n\n method _BLEND_EQUATION_ALPHA_ : blendMode parameter readonly_prop\n\n method _BLEND_DST_RGB_ : blendingFactor parameter readonly_prop\n\n method _BLEND_SRC_RGB_ : blendingFactor parameter readonly_prop\n\n method _BLEND_DST_ALPHA_ : blendingFactor parameter readonly_prop\n\n method _BLEND_SRC_ALPHA_ : blendingFactor parameter readonly_prop\n\n method _BLEND_COLOR_ : Typed_array.float32Array t parameter readonly_prop\n\n method _ARRAY_BUFFER_BINDING_ : buffer t opt parameter readonly_prop\n\n method _ELEMENT_ARRAY_BUFFER_BINDING_ : buffer t opt parameter readonly_prop\n\n method _CULL_FACE_PARAM : bool t parameter readonly_prop\n\n method _BLEND_PARAM : bool t parameter readonly_prop\n\n method _DITHER_PARAM : bool t parameter readonly_prop\n\n method _STENCIL_TEST_PARAM : bool t parameter readonly_prop\n\n method _DEPTH_TEST_PARAM : bool t parameter readonly_prop\n\n method _SCISSOR_TEST_PARAM : bool t parameter readonly_prop\n\n method _POLYGON_OFFSET_FILL_PARAM : bool t parameter readonly_prop\n\n method _LINE_WIDTH_ : number_t parameter readonly_prop\n\n method _ALIASED_POINT_SIZE_RANGE_ : Typed_array.float32Array t parameter readonly_prop\n\n method _ALIASED_LINE_WIDTH_RANGE_ : Typed_array.float32Array t parameter readonly_prop\n\n method _CULL_FACE_MODE_ : cullFaceMode parameter readonly_prop\n\n method _FRONT_FACE_ : frontFaceDir parameter readonly_prop\n\n method _DEPTH_RANGE_ : Typed_array.float32Array t parameter readonly_prop\n\n method _DEPTH_WRITEMASK_ : bool t parameter readonly_prop\n\n method _DEPTH_CLEAR_VALUE_ : number_t parameter readonly_prop\n\n method _DEPTH_FUNC_ : depthFunction parameter readonly_prop\n\n method _STENCIL_CLEAR_VALUE_ : int parameter readonly_prop\n\n method _STENCIL_FUNC_ : int parameter readonly_prop\n\n method _STENCIL_FAIL_ : int parameter readonly_prop\n\n method _STENCIL_PASS_DEPTH_FAIL_ : int parameter readonly_prop\n\n method _STENCIL_PASS_DEPTH_PASS_ : int parameter readonly_prop\n\n method _STENCIL_REF_ : int parameter readonly_prop\n\n method _STENCIL_VALUE_MASK_ : int parameter readonly_prop\n\n method _STENCIL_WRITEMASK_ : int parameter readonly_prop\n\n method _STENCIL_BACK_FUNC_ : int parameter readonly_prop\n\n method _STENCIL_BACK_FAIL_ : int parameter readonly_prop\n\n method _STENCIL_BACK_PASS_DEPTH_FAIL_ : int parameter readonly_prop\n\n method _STENCIL_BACK_PASS_DEPTH_PASS_ : int parameter readonly_prop\n\n method _STENCIL_BACK_REF_ : int parameter readonly_prop\n\n method _STENCIL_BACK_VALUE_MASK_ : int parameter readonly_prop\n\n method _STENCIL_BACK_WRITEMASK_ : int parameter readonly_prop\n\n method _VIEWPORT : Typed_array.int32Array t parameter readonly_prop\n\n method _SCISSOR_BOX_ : Typed_array.int32Array t parameter readonly_prop\n\n method _COLOR_CLEAR_VALUE_ : Typed_array.float32Array t parameter readonly_prop\n\n method _COLOR_WRITEMASK_ : bool t js_array t parameter readonly_prop\n\n method _UNPACK_ALIGNMENT_PARAM : int parameter readonly_prop\n\n method _PACK_ALIGNMENT_ : int parameter readonly_prop\n\n method _MAX_TEXTURE_SIZE_ : int parameter readonly_prop\n\n method _MAX_VIEWPORT_DIMS_ : Typed_array.int32Array t parameter readonly_prop\n\n method _SUBPIXEL_BITS_ : int parameter readonly_prop\n\n method _RED_BITS_ : int parameter readonly_prop\n\n method _GREEN_BITS_ : int parameter readonly_prop\n\n method _BLUE_BITS_ : int parameter readonly_prop\n\n method _ALPHA_BITS_ : int parameter readonly_prop\n\n method _DEPTH_BITS_ : int parameter readonly_prop\n\n method _STENCIL_BITS_ : int parameter readonly_prop\n\n method _POLYGON_OFFSET_UNITS_ : number_t parameter readonly_prop\n\n method _POLYGON_OFFSET_FACTOR_ : number_t parameter readonly_prop\n\n method _TEXTURE_BINDING_2D_ : texture t opt parameter readonly_prop\n\n method _TEXTURE_BINDING_CUBE_MAP_ : texture t opt parameter readonly_prop\n\n method _SAMPLE_BUFFERS_ : int parameter readonly_prop\n\n method _SAMPLES_ : int parameter readonly_prop\n\n method _SAMPLE_COVERAGE_VALUE_ : number_t parameter readonly_prop\n\n method _SAMPLE_COVERAGE_INVERT_ : bool t parameter readonly_prop\n\n method _NUM_COMPRESSED_TEXTURE_FORMATS_ : int parameter readonly_prop\n\n method _COMPRESSED_TEXTURE_FORMATS_ : Typed_array.uint32Array t parameter readonly_prop\n\n method _GENERATE_MIPMAP_HINT_PARAM_ : hintMode parameter readonly_prop\n\n method _BUFFER_SIZE_ : int bufferParameter readonly_prop\n\n method _BUFFER_USAGE_ : bufferUsage bufferParameter readonly_prop\n\n method _BYTE : dataType readonly_prop\n\n method _UNSIGNED_BYTE_DT : dataType readonly_prop\n\n method _SHORT : dataType readonly_prop\n\n method _UNSIGNED_SHORT_ : dataType readonly_prop\n\n method _INT : dataType readonly_prop\n\n method _UNSIGNED_INT_ : dataType readonly_prop\n\n method _FLOAT : dataType readonly_prop\n\n method _UNSIGNED_BYTE_ : pixelType readonly_prop\n\n method _UNSIGNED_SHORT_4_4_4_4_ : pixelType readonly_prop\n\n method _UNSIGNED_SHORT_5_5_5_1_ : pixelType readonly_prop\n\n method _UNSIGNED_SHORT_5_6_5_ : pixelType readonly_prop\n\n method _ALPHA : pixelFormat readonly_prop\n\n method _RGB : pixelFormat readonly_prop\n\n method _RGBA : pixelFormat readonly_prop\n\n method _LUMINANCE : pixelFormat readonly_prop\n\n method _LUMINANCE_ALPHA_ : pixelFormat readonly_prop\n\n method _STENCIL_INDEX_ : pixelFormat readonly_prop\n\n method _DEPTH_STENCIL_ : pixelFormat readonly_prop\n\n method _DEPTH_COMPONENT_ : pixelFormat readonly_prop\n\n method _FRAGMENT_SHADER_ : shaderType readonly_prop\n\n method _VERTEX_SHADER_ : shaderType readonly_prop\n\n method _MAX_VERTEX_ATTRIBS_ : int parameter readonly_prop\n\n method _MAX_VERTEX_UNIFORM_VECTORS_ : int parameter readonly_prop\n\n method _MAX_VARYING_VECTORS_ : int parameter readonly_prop\n\n method _MAX_COMBINED_TEXTURE_IMAGE_UNITS_ : int parameter readonly_prop\n\n method _MAX_VERTEX_TEXTURE_IMAGE_UNITS_ : int parameter readonly_prop\n\n method _MAX_TEXTURE_IMAGE_UNITS_ : int parameter readonly_prop\n\n method _MAX_FRAGMENT_UNIFORM_VECTORS_ : int parameter readonly_prop\n\n method _SHADER_TYPE_ : shaderType shaderParam readonly_prop\n\n method _DELETE_STATUS_ : bool t shaderParam readonly_prop\n\n method _COMPILE_STATUS_ : bool t shaderParam readonly_prop\n\n method _DELETE_STATUS_PROG : bool t programParam readonly_prop\n\n method _LINK_STATUS_ : bool t programParam readonly_prop\n\n method _VALIDATE_STATUS_ : bool t programParam readonly_prop\n\n method _ATTACHED_SHADERS_ : int programParam readonly_prop\n\n method _ACTIVE_UNIFORMS_ : int programParam readonly_prop\n\n method _ACTIVE_ATTRIBUTES_ : int programParam readonly_prop\n\n method _SHADING_LANGUAGE_VERSION_ : js_string t parameter readonly_prop\n\n method _CURRENT_PROGRAM_ : program t opt parameter readonly_prop\n\n method _VENDOR : js_string t parameter readonly_prop\n\n method _RENDERER : js_string t parameter readonly_prop\n\n method _VERSION : js_string t parameter readonly_prop\n\n method _MAX_CUBE_MAP_TEXTURE_SIZE_ : int parameter readonly_prop\n\n method _ACTIVE_TEXTURE_ : textureUnit parameter readonly_prop\n\n method _FRAMEBUFFER_BINDING_ : framebuffer t opt parameter readonly_prop\n\n method _RENDERBUFFER_BINDING_ : renderbuffer t opt parameter readonly_prop\n\n method _MAX_RENDERBUFFER_SIZE : int parameter readonly_prop\n\n method _NEVER : depthFunction readonly_prop\n\n method _LESS : depthFunction readonly_prop\n\n method _EQUAL : depthFunction readonly_prop\n\n method _LEQUAL : depthFunction readonly_prop\n\n method _GREATER : depthFunction readonly_prop\n\n method _NOTEQUAL : depthFunction readonly_prop\n\n method _GEQUAL : depthFunction readonly_prop\n\n method _ALWAYS : depthFunction readonly_prop\n\n method _KEEP : stencilOp readonly_prop\n\n method _REPLACE : stencilOp readonly_prop\n\n method _INCR : stencilOp readonly_prop\n\n method _DECR : stencilOp readonly_prop\n\n method _INVERT : stencilOp readonly_prop\n\n method _INCR_WRAP_ : stencilOp readonly_prop\n\n method _DECR_WRAP_ : stencilOp readonly_prop\n\n method _ZERO_ : stencilOp readonly_prop\n\n method _NEAREST : texFilter readonly_prop\n\n method _LINEAR : texFilter readonly_prop\n\n method _NEAREST_MIPMAP_NEAREST_ : texFilter readonly_prop\n\n method _LINEAR_MIPMAP_NEAREST_ : texFilter readonly_prop\n\n method _NEAREST_MIPMAP_LINEAR_ : texFilter readonly_prop\n\n method _LINEAR_MIPMAP_LINEAR_ : texFilter readonly_prop\n\n method _TEXTURE_MAG_FILTER_ : texFilter texParam readonly_prop\n\n method _TEXTURE_MIN_FILTER_ : texFilter texParam readonly_prop\n\n method _TEXTURE_WRAP_S_ : wrapMode texParam readonly_prop\n\n method _TEXTURE_WRAP_T_ : wrapMode texParam readonly_prop\n\n method _NONE_OT : objectType readonly_prop\n\n method _TEXTURE_OT : objectType readonly_prop\n\n method _RENDERBUFFER_OT : objectType readonly_prop\n\n method _TEXTURE_2D_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_POSITIVE_X_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_NEGATIVE_X_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_POSITIVE_Y_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_NEGATIVE_Y_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_POSITIVE_Z_ : texTarget readonly_prop\n\n method _TEXTURE_CUBE_MAP_NEGATIVE_Z_ : texTarget readonly_prop\n\n method _TEXTURE0 : textureUnit readonly_prop\n\n method _TEXTURE1 : textureUnit readonly_prop\n\n method _TEXTURE2 : textureUnit readonly_prop\n\n method _TEXTURE3 : textureUnit readonly_prop\n\n method _TEXTURE4 : textureUnit readonly_prop\n\n method _TEXTURE5 : textureUnit readonly_prop\n\n method _TEXTURE6 : textureUnit readonly_prop\n\n method _TEXTURE7 : textureUnit readonly_prop\n\n method _TEXTURE8 : textureUnit readonly_prop\n\n method _TEXTURE9 : textureUnit readonly_prop\n\n method _TEXTURE10 : textureUnit readonly_prop\n\n method _TEXTURE11 : textureUnit readonly_prop\n\n method _TEXTURE12 : textureUnit readonly_prop\n\n method _TEXTURE13 : textureUnit readonly_prop\n\n method _TEXTURE14 : textureUnit readonly_prop\n\n method _TEXTURE15 : textureUnit readonly_prop\n\n method _TEXTURE16 : textureUnit readonly_prop\n\n method _TEXTURE17 : textureUnit readonly_prop\n\n method _TEXTURE18 : textureUnit readonly_prop\n\n method _TEXTURE19 : textureUnit readonly_prop\n\n method _TEXTURE20 : textureUnit readonly_prop\n\n method _TEXTURE21 : textureUnit readonly_prop\n\n method _TEXTURE22 : textureUnit readonly_prop\n\n method _TEXTURE23 : textureUnit readonly_prop\n\n method _TEXTURE24 : textureUnit readonly_prop\n\n method _TEXTURE25 : textureUnit readonly_prop\n\n method _TEXTURE26 : textureUnit readonly_prop\n\n method _TEXTURE27 : textureUnit readonly_prop\n\n method _TEXTURE28 : textureUnit readonly_prop\n\n method _TEXTURE29 : textureUnit readonly_prop\n\n method _TEXTURE30 : textureUnit readonly_prop\n\n method _TEXTURE31 : textureUnit readonly_prop\n\n method _REPEAT : wrapMode readonly_prop\n\n method _CLAMP_TO_EDGE_ : wrapMode readonly_prop\n\n method _MIRRORED_REPEAT_ : wrapMode readonly_prop\n\n method _FLOAT_ : uniformType readonly_prop\n\n method _FLOAT_VEC2_ : uniformType readonly_prop\n\n method _FLOAT_VEC3_ : uniformType readonly_prop\n\n method _FLOAT_VEC4_ : uniformType readonly_prop\n\n method _INT_ : uniformType readonly_prop\n\n method _INT_VEC2_ : uniformType readonly_prop\n\n method _INT_VEC3_ : uniformType readonly_prop\n\n method _INT_VEC4_ : uniformType readonly_prop\n\n method _BOOL_ : uniformType readonly_prop\n\n method _BOOL_VEC2_ : uniformType readonly_prop\n\n method _BOOL_VEC3_ : uniformType readonly_prop\n\n method _BOOL_VEC4_ : uniformType readonly_prop\n\n method _FLOAT_MAT2_ : uniformType readonly_prop\n\n method _FLOAT_MAT3_ : uniformType readonly_prop\n\n method _FLOAT_MAT4_ : uniformType readonly_prop\n\n method _SAMPLER_2D_ : uniformType readonly_prop\n\n method _SAMPLER_CUBE_ : uniformType readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_ENABLED_ : bool t vertexAttribParam readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_SIZE_ : int vertexAttribParam readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_STRIDE_ : int vertexAttribParam readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_TYPE_ : int vertexAttribParam readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_NORMALIZED_ : bool t vertexAttribParam readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_POINTER_ : vertexAttribPointerParam readonly_prop\n\n method _VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ :\n buffer t opt vertexAttribParam readonly_prop\n\n method _CURRENT_VERTEX_ATTRIB_ :\n Typed_array.float32Array t vertexAttribParam readonly_prop\n\n method _LOW_FLOAT_ : shaderPrecisionType readonly_prop\n\n method _MEDIUM_FLOAT_ : shaderPrecisionType readonly_prop\n\n method _HIGH_FLOAT_ : shaderPrecisionType readonly_prop\n\n method _LOW_INT_ : shaderPrecisionType readonly_prop\n\n method _MEDIUM_INT_ : shaderPrecisionType readonly_prop\n\n method _HIGH_INT_ : shaderPrecisionType readonly_prop\n\n method _FRAMEBUFFER : fbTarget readonly_prop\n\n method _RENDERBUFFER : rbTarget readonly_prop\n\n method _RGBA4 : format readonly_prop\n\n method _RGB5_A1_ : format readonly_prop\n\n method _RGB565 : format readonly_prop\n\n method _DEPTH_COMPONENT16_ : format readonly_prop\n\n method _STENCIL_INDEX8_ : format readonly_prop\n\n method _RENDERBUFFER_WIDTH_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_HEIGHT_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_INTERNAL_FORMAT_ : format renderbufferParam readonly_prop\n\n method _RENDERBUFFER_RED_SIZE_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_GREEN_SIZE_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_BLUE_SIZE_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_ALPHA_SIZE_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_DEPTH_SIZE_ : int renderbufferParam readonly_prop\n\n method _RENDERBUFFER_STENCIL_SIZE_ : int renderbufferParam readonly_prop\n\n method _FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_ : objectType attachParam readonly_prop\n\n method _FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_RENDERBUFFER :\n renderbuffer t attachParam readonly_prop\n\n method _FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_TEXTURE : texture t attachParam readonly_prop\n\n method _FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_ : int attachParam readonly_prop\n\n method _FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_ : int attachParam readonly_prop\n\n method _COLOR_ATTACHMENT0_ : attachmentPoint readonly_prop\n\n method _DEPTH_ATTACHMENT_ : attachmentPoint readonly_prop\n\n method _STENCIL_ATTACHMENT_ : attachmentPoint readonly_prop\n\n method _DEPTH_STENCIL_ATTACHMENT_ : attachmentPoint readonly_prop\n\n method _FRAMEBUFFER_COMPLETE_ : framebufferStatus readonly_prop\n\n method _FRAMEBUFFER_INCOMPLETE_ATTACHMENT_ : framebufferStatus readonly_prop\n\n method _FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_ : framebufferStatus readonly_prop\n\n method _FRAMEBUFFER_INCOMPLETE_DIMENSIONS_ : framebufferStatus readonly_prop\n\n method _FRAMEBUFFER_UNSUPPORTED_ : framebufferStatus readonly_prop\n\n method _UNPACK_FLIP_Y_WEBGL_PARAM : bool t parameter readonly_prop\n\n method _UNPACK_PREMULTIPLY_ALPHA_WEBGL_PARAM : bool t parameter readonly_prop\n\n method _UNPACK_COLORSPACE_CONVERSION_WEBGL_PARAM :\n colorspaceConversion parameter readonly_prop\n\n method _NONE : colorspaceConversion readonly_prop\n\n method _BROWSER_DEFAULT_WEBGL_ : colorspaceConversion readonly_prop\n\n method _UNPACK_ALIGNMENT_ : int pixelStoreParam readonly_prop\n\n method _UNPACK_FLIP_Y_WEBGL_ : bool t pixelStoreParam readonly_prop\n\n method _UNPACK_PREMULTIPLY_ALPHA_WEBGL_ : bool t pixelStoreParam readonly_prop\n\n method _UNPACK_COLORSPACE_CONVERSION_WEBGL_ : int pixelStoreParam readonly_prop\nend\n\n(** 5.14 WebGLContextEvent *)\n\nclass type contextEvent = object\n inherit Dom_html.event\n\n method statusMessage : js_string t readonly_prop\nend\n\nmodule Event = struct\n let webglcontextlost = Dom_html.Event.make \"webglcontextlost\"\n\n let webglcontextrestored = Dom_html.Event.make \"webglcontextrestored\"\n\n let webglcontextcreationerror = Dom_html.Event.make \"webglcontextcreationerror\"\nend\n\n(****)\n\nclass type canvasElement = object\n method getContext : js_string t -> renderingContext t opt meth\n\n method getContext_ : js_string t -> contextAttributes t -> renderingContext t opt meth\nend\n\nlet getContext (c : Dom_html.canvasElement t) =\n let c : canvasElement t = Js.Unsafe.coerce c in\n let ctx = c##getContext (Js.string \"webgl\") in\n if Opt.test ctx then ctx else c##(getContext (Js.string \"experimental-webgl\"))\n\nlet getContextWithAttributes (c : Dom_html.canvasElement t) attribs =\n let c : canvasElement t = Js.Unsafe.coerce c in\n let ctx = c##getContext_ (Js.string \"webgl\") attribs in\n if Opt.test ctx then ctx else c##getContext_ (Js.string \"experimental-webgl\") attribs\n","(* generated code *)"],"names":[],"mappings":"KA81CY,oBACV,eAAG,aAAY,QAA8D,mBAAxD,GAAgE,C,KAN3E,gBACV,eAAG,aAAY,QAA8D,eAAxD,GAAyD,C,MC11ChF,+DD40CiF,IC50CjF,OD8II,mCA8rC6E,IAJxD,GAjrCjB,iBAirCiB,aAEI,GAFkC,iBAElC,aAEK,GAFqC,iBAErC,aAA+C,sB,EC50CjF,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":93212},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/regexp.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Raphaël Proust, Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\ntype regexp = Js.regExp Js.t\n\ntype result = Js.match_result Js.t\n\nlet regexp s = new%js Js.regExp_withFlags (Js.bytestring s) (Js.string \"g\")\n\nlet regexp_case_fold s = new%js Js.regExp_withFlags (Js.bytestring s) (Js.string \"gi\")\n\nlet regexp_with_flag s f =\n new%js Js.regExp_withFlags (Js.bytestring s) (Js.string (\"g\" ^ f))\n\nlet blunt_str_array_get a i =\n Js.to_bytestring (Js.Optdef.get (Js.array_get a i) (fun () -> assert false))\n\nlet string_match r s i =\n r##.lastIndex := i;\n Js.Opt.to_option (Js.Opt.map (r##exec (Js.bytestring s)) Js.match_result)\n\nlet search r s i =\n r##.lastIndex := i;\n Js.Opt.to_option\n (Js.Opt.map\n (r##exec (Js.bytestring s))\n (fun res_pre ->\n let res = Js.match_result res_pre in\n res##.index, res))\n\nlet search_forward = search\n\nlet matched_string r = blunt_str_array_get r 0\n\nlet matched_group r i =\n Js.Optdef.to_option (Js.Optdef.map (Js.array_get r i) Js.to_bytestring)\n\nlet quote_repl_re = new%js Js.regExp_withFlags (Js.string \"[$]\") (Js.string \"g\")\n\nlet quote_repl s = (Js.bytestring s)##replace quote_repl_re (Js.string \"$$$$\")\n\nlet global_replace r s s_by =\n r##.lastIndex := 0;\n Js.to_bytestring (Js.bytestring s)##(replace r (quote_repl s_by))\n\nlet replace_first r s s_by =\n let flags =\n match Js.to_bool r##.ignoreCase, Js.to_bool r##.multiline with\n | false, false -> Js.string \"\"\n | false, true -> Js.string \"m\"\n | true, false -> Js.string \"i\"\n | true, true -> Js.string \"mi\"\n in\n let r' = new%js Js.regExp_withFlags r##.source flags in\n Js.to_bytestring (Js.bytestring s)##(replace r' (quote_repl s_by))\n\nlet list_of_js_array a =\n let rec aux accu idx =\n if idx < 0 then accu else aux (blunt_str_array_get a idx :: accu) (idx - 1)\n in\n aux [] (a##.length - 1)\n\nlet split r s =\n r##.lastIndex := 0;\n list_of_js_array (Js.str_array (Js.bytestring s)##(split_regExp r))\n\nlet bounded_split r s i =\n r##.lastIndex := 0;\n list_of_js_array (Js.str_array (Js.bytestring s)##(split_regExpLimited r i))\n\n(* More constructors *)\n\nlet quote_re = regexp \"[\\\\][()\\\\\\\\|+*.?{}^$]\"\n\nlet quote s = Js.to_bytestring (Js.bytestring s)##(replace quote_re (Js.string \"\\\\$&\"))\n\nlet regexp_string s = regexp (quote s)\n\nlet regexp_string_case_fold s = regexp_case_fold (quote s)\n","(* generated code *)"],"names":[],"mappings":"EAgGiD,eAAS,Q,EAF7B,eAAS,Q,KAF8B,OAArC,yBAAjB,GAAyE,C,EAPrF,gBAC+B,oBAA4C,OAA1D,aAA2D,I,EAL5E,gBAC+B,gBAAmC,OAAjD,aAAkD,I,OAJ3D,SAAU,mBAFhB,WAA0B,OAA8B,IAAzB,SAAyB,eAAxC,IAEK,C,SAbJ,gBAAX,IAAsC,SAAX,IAAwB,UAC3B,GACA,GAF2B,YAG3B,GACA,GAFA,YAEA,EAEI,WAAU,OAArC,iBACuC,aAA/B,oBAAjB,GAAkE,C,KAZlE,uBAC+C,aAA9B,oBAAjB,GAAiE,C,EAJhD,KAAiB,oBAA0C,C,ECzD9E,M,EDqDqC,IAAnC,OAAmC,aAAf,GAAiC,eAAjC,aAAmD,6B,EAHlD,SAAuB,C,EAJ1B,IADD,EAAV,OAAU,eACV,OAAW,MAAK,C,EANvB,cAGc,OAAT,aADH,GAC8B,eAD9B,aAIuB,6B,EAVzB,cAAkB,SACoB,OAAT,aAAZ,EAAuC,eAAvC,aAAwD,6B,EAJX,eAAY,C,EAA1C,IAAhC,OAAgC,aAAf,GAAiC,eAAjC,aAAjB,GAA4E,C,EAHpB,KAAxD,OAAwD,aAAX,IAAlB,OAAiB,sBAAsB,C,EAHhB,OAAiB,uBAAiB,C,EAF5C,OAAiB,uBAAgB,C,YA8BK,MAAhB,OAA5C,iBAA4D,uBAmCnC,gBAA9B,UAA8B,0D,EC1F7C,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":94608},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/url.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Raphaël Proust\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\n(* Url tampering. *)\n\nlet split c s = Js.str_array (s##split (Js.string (String.make 1 c)))\n\nlet split_2 c s =\n let index = s##indexOf (Js.string (String.make 1 c)) in\n if index < 0 then Js.undefined else Js.def (s##slice 0 index, s##slice_end (index + 1))\n\nexception Local_exn\n\nlet interrupt () = raise Local_exn\n\n(* url (AKA percent) encoding/decoding *)\n\nlet plus_re = Regexp.regexp_string \"+\"\n\nlet escape_plus s = Regexp.global_replace plus_re s \"%2B\"\n\nlet unescape_plus s = Regexp.global_replace plus_re s \" \"\n\nlet plus_re_js_string = new%js Js.regExp_withFlags (Js.string \"\\\\+\") (Js.string \"g\")\n\nlet unescape_plus_js_string s =\n plus_re_js_string##.lastIndex := 0;\n s##replace plus_re_js_string (Js.string \" \")\n\nlet urldecode_js_string_string s =\n Js.to_bytestring (Js.unescape (unescape_plus_js_string s))\n\nlet urldecode s = Js.to_bytestring (Js.unescape (Js.bytestring (unescape_plus s)))\n\n(*let urlencode_js_string_string s =\n Js.to_bytestring (Js.escape s)*)\n\nlet urlencode ?(with_plus = true) s =\n if with_plus\n then escape_plus (Js.to_bytestring (Js.escape (Js.bytestring s)))\n else Js.to_bytestring (Js.escape (Js.bytestring s))\n\ntype http_url =\n { hu_host : string (** The host part of the url. *)\n ; hu_port : int (** The port for the connection if any. *)\n ; hu_path : string list (** The path split on ['/'] characters. *)\n ; hu_path_string : string (** The original entire path. *)\n ; hu_arguments : (string * string) list\n (** Arguments as a field-value\n association list.*)\n ; hu_fragment : string (** The fragment part (after the ['#'] character). *)\n }\n(** The type for HTTP url. *)\n\ntype file_url =\n { fu_path : string list\n ; fu_path_string : string\n ; fu_arguments : (string * string) list\n ; fu_fragment : string\n }\n(** The type for local file urls. *)\n\ntype url =\n | Http of http_url\n | Https of http_url\n | File of file_url\n (** The type for urls. [File] is for local files and [Exotic s] is for\n unknown/unsupported protocols. *)\n\nexception Not_an_http_protocol\n\nlet is_secure prot_string =\n match Js.to_bytestring prot_string##toLowerCase with\n | \"https:\" | \"https\" -> true\n | \"http:\" | \"http\" -> false\n | \"file:\" | \"file\" | _ -> raise Not_an_http_protocol\n\n(* port number *)\nlet default_http_port = 80\n\nlet default_https_port = 443\n\n(* path *)\nlet path_of_path_string s =\n let l = String.length s in\n let rec aux i =\n let j = try String.index_from s i '/' with Not_found -> l in\n let word = String.sub s i (j - i) in\n if j >= l then [ word ] else word :: aux (j + 1)\n in\n match aux 0 with\n | [ \"\" ] -> []\n | [ \"\"; \"\" ] -> [ \"\" ]\n | a -> a\n\n(* Arguments *)\nlet encode_arguments l =\n String.concat \"&\" (List.map (fun (n, v) -> urlencode n ^ \"=\" ^ urlencode v) l)\n\nlet decode_arguments_js_string s =\n let arr = split '&' s in\n let len = arr##.length in\n let name_value_split s = split_2 '=' s in\n let rec aux acc idx =\n if idx < 0\n then acc\n else\n try\n aux\n (Js.Optdef.case (Js.array_get arr idx) interrupt (fun s ->\n Js.Optdef.case (name_value_split s) interrupt (fun (x, y) ->\n let get = urldecode_js_string_string in\n get x, get y))\n :: acc)\n (pred idx)\n with Local_exn -> aux acc (pred idx)\n in\n aux [] (len - 1)\n\nlet decode_arguments s = decode_arguments_js_string (Js.bytestring s)\n\nlet url_re =\n new%js Js.regExp\n (Js.bytestring\n \"^([Hh][Tt][Tt][Pp][Ss]?)://([0-9a-zA-Z.-]+|\\\\[[0-9a-zA-Z.-]+\\\\]|\\\\[[0-9A-Fa-f:.]+\\\\])?(:([0-9]+))?(/([^\\\\?#]*)(\\\\?([^#]*))?(#(.*))?)?$\")\n\nlet file_re =\n new%js Js.regExp\n (Js.bytestring \"^([Ff][Ii][Ll][Ee])://([^\\\\?#]*)(\\\\?([^#]*))?(#(.*))?$\")\n\nlet url_of_js_string s =\n Js.Opt.case\n (url_re##exec s)\n (fun () ->\n Js.Opt.case\n (file_re##exec s)\n (fun () -> None)\n (fun handle ->\n let res = Js.match_result handle in\n let path_str =\n urldecode_js_string_string (Js.Optdef.get (Js.array_get res 2) interrupt)\n in\n Some\n (File\n { fu_path = path_of_path_string path_str\n ; fu_path_string = path_str\n ; fu_arguments =\n decode_arguments_js_string\n (Js.Optdef.get (Js.array_get res 4) (fun () -> Js.bytestring \"\"))\n ; fu_fragment =\n Js.to_bytestring\n (Js.Optdef.get (Js.array_get res 6) (fun () -> Js.bytestring \"\"))\n })))\n (fun handle ->\n let res = Js.match_result handle in\n let ssl = is_secure (Js.Optdef.get (Js.array_get res 1) interrupt) in\n let port_of_string = function\n | \"\" -> if ssl then 443 else 80\n | s -> int_of_string s\n in\n let path_str =\n urldecode_js_string_string\n (Js.Optdef.get (Js.array_get res 6) (fun () -> Js.bytestring \"\"))\n in\n let url =\n { hu_host =\n urldecode_js_string_string (Js.Optdef.get (Js.array_get res 2) interrupt)\n ; hu_port =\n port_of_string\n (Js.to_bytestring\n (Js.Optdef.get (Js.array_get res 4) (fun () -> Js.bytestring \"\")))\n ; hu_path = path_of_path_string path_str\n ; hu_path_string = path_str\n ; hu_arguments =\n decode_arguments_js_string\n (Js.Optdef.get (Js.array_get res 8) (fun () -> Js.bytestring \"\"))\n ; hu_fragment =\n urldecode_js_string_string\n (Js.Optdef.get (Js.array_get res 10) (fun () -> Js.bytestring \"\"))\n }\n in\n Some (if ssl then Https url else Http url))\n\nlet url_of_string s = url_of_js_string (Js.bytestring s)\n\nlet string_of_url = function\n | File { fu_path = path; fu_arguments = args; fu_fragment = frag; _ } -> (\n \"file://\"\n ^ String.concat \"/\" (List.map (fun x -> urlencode x) path)\n ^ (match args with\n | [] -> \"\"\n | l -> \"?\" ^ encode_arguments l)\n ^\n match frag with\n | \"\" -> \"\"\n | s -> \"#\" ^ urlencode s)\n | Http\n { hu_host = host\n ; hu_port = port\n ; hu_path = path\n ; hu_arguments = args\n ; hu_fragment = frag\n ; _\n } -> (\n \"http://\"\n ^ urlencode host\n ^ (match port with\n | 80 -> \"\"\n | n -> \":\" ^ string_of_int n)\n ^ \"/\"\n ^ String.concat \"/\" (List.map (fun x -> urlencode x) path)\n ^ (match args with\n | [] -> \"\"\n | l -> \"?\" ^ encode_arguments l)\n ^\n match frag with\n | \"\" -> \"\"\n | s -> \"#\" ^ urlencode s)\n | Https\n { hu_host = host\n ; hu_port = port\n ; hu_path = path\n ; hu_arguments = args\n ; hu_fragment = frag\n ; _\n } -> (\n \"https://\"\n ^ urlencode host\n ^ (match port with\n | 443 -> \"\"\n | n -> \":\" ^ string_of_int n)\n ^ \"/\"\n ^ String.concat \"/\" (List.map (fun x -> urlencode x) path)\n ^ (match args with\n | [] -> \"\"\n | l -> \"?\" ^ encode_arguments l)\n ^\n match frag with\n | \"\" -> \"\"\n | s -> \"#\" ^ urlencode s)\n\nmodule Current = struct\n let l =\n if Js.Optdef.test (Js.Optdef.return Dom_html.window##.location)\n then Dom_html.window##.location\n else\n let empty = Js.string \"\" in\n object%js\n val mutable href = empty\n\n val mutable protocol = empty\n\n val mutable host = empty\n\n val mutable hostname = empty\n\n val mutable port = empty\n\n val mutable pathname = empty\n\n val mutable search = empty\n\n val mutable hash = empty\n\n val origin = empty\n\n method reload = ()\n\n method replace _ = ()\n\n method assign _ = ()\n end\n\n let host = urldecode_js_string_string l##.hostname\n\n let protocol = urldecode_js_string_string l##.protocol\n\n let port =\n (fun () ->\n try Some (int_of_string (Js.to_bytestring l##.port)) with Failure _ -> None)\n ()\n\n let path_string = urldecode_js_string_string l##.pathname\n\n let path = path_of_path_string path_string\n\n let arguments =\n decode_arguments_js_string\n (if Js.equals (l##.search##charAt 0) (Js.string \"?\")\n then l##.search##slice_end 1\n else l##.search)\n\n let get_fragment () =\n let s = Js.to_bytestring l##.hash in\n if String.length s > 0 && Char.equal s.[0] '#'\n then String.sub s 1 (String.length s - 1)\n else s\n\n let set_fragment s = l##.hash := Js.bytestring s\n\n let get () = url_of_js_string l##.href\n\n let set u = l##.href := Js.bytestring (string_of_url u)\n\n let as_string = urldecode_js_string_string l##.href\nend\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":99808},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/sys_js.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2014 Hugo Heuzard\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\nexternal create_file : name:string -> content:string -> unit = \"caml_create_file\"\n\nexternal read_file : name:string -> string = \"caml_read_file_content\"\n\nlet update_file ~name ~content =\n let oc = open_out name in\n output_string oc content;\n close_out oc\n\nexternal set_channel_output' :\n out_channel -> (Js.js_string Js.t -> unit) Js.callback -> unit\n = \"caml_ml_set_channel_output\"\n\nexternal set_channel_input' : in_channel -> (unit -> string) Js.callback -> unit\n = \"caml_ml_set_channel_refill\"\n\nlet set_channel_flusher (out_channel : out_channel) (f : string -> unit) =\n let f' : (Js.js_string Js.t -> unit) Js.callback =\n Js.wrap_callback (fun s -> f (Js.to_bytestring s))\n in\n set_channel_output' out_channel f'\n\nlet set_channel_filler (in_channel : in_channel) (f : unit -> string) =\n let f' : (unit -> string) Js.callback = Js.wrap_callback f in\n set_channel_input' in_channel f'\n\nexternal mount_point : unit -> string list = \"caml_list_mount_point\"\n\nexternal mount_autoload :\n string -> (string -> string -> string option) Js.callback -> unit\n = \"caml_mount_autoload\"\n\nexternal unmount : string -> unit = \"caml_unmount\"\n\nlet mount ~path f =\n mount_autoload path (Js.wrap_callback (fun prefix path -> f ~prefix ~path))\n\nlet unmount ~path = unmount path\n\nlet js_of_ocaml_version =\n if String.equal Lib_version.git_version \"\"\n then Lib_version.s\n else Lib_version.s ^ \"+\" ^ Lib_version.git_version\n","(* generated code *)"],"names":[],"mappings":"EAyDoB,KAAY,C,EAF4B,gBAAe,C,EAAzE,aAAoB,EAApB,GAA2E,C,EAX3E,EADwC,IACxC,GAAgC,C,KAND,YAAoB,oB,EAEnD,EAHA,QACE,EAEF,GAAkC,C,EAfzB,EAAT,OAAS,eACT,wBAAwB,uBACZ,C,EC3Bd,M,EAAA,M,EAAA,Q,MD6DO,4BC7DP,QD4DK,GC5DL,gBD4DK,aAAuC,QAErB,GAAhB,eAAgB,eAA6B,QAA7C,EAA6C,OAA7C,cADA,qB,QC7DP,4D,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":100312},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/resizeObserver.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2019 Alexander Yanin\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\nclass type resizeObserverSize = object\n method inlineSize : Js.number_t Js.readonly_prop\n\n method blockSize : Js.number_t Js.readonly_prop\nend\n\nclass type resizeObserverEntry = object\n method target : Dom.node Js.t Js.readonly_prop\n\n method contentRect : Dom_html.clientRect Js.t Js.readonly_prop\n\n method borderBoxSize : resizeObserverSize Js.t Js.js_array Js.t Js.readonly_prop\n\n method contentBoxSize : resizeObserverSize Js.t Js.js_array Js.t Js.readonly_prop\nend\n\nclass type resizeObserverOptions = object\n method box : Js.js_string Js.t Js.writeonly_prop\nend\n\nclass type resizeObserver = object\n method observe : #Dom.node Js.t -> unit Js.meth\n\n method observe_withOptions :\n #Dom.node Js.t -> resizeObserverOptions Js.t -> unit Js.meth\n\n method unobserve : #Dom.node Js.t -> unit Js.meth\n\n method disconnect : unit Js.meth\nend\n\nlet empty_resize_observer_options () : resizeObserverOptions Js.t = Js.Unsafe.obj [||]\n\nlet resizeObserver = Js.Unsafe.global##._ResizeObserver\n\nlet is_supported () = Js.Optdef.test resizeObserver\n\nlet resizeObserver :\n ( (resizeObserverEntry Js.t Js.js_array Js.t -> resizeObserver Js.t -> unit)\n Js.callback\n -> resizeObserver Js.t)\n Js.constr =\n resizeObserver\n\nlet observe\n ~(node : #Dom.node Js.t)\n ~(f : resizeObserverEntry Js.t Js.js_array Js.t -> resizeObserver Js.t -> unit)\n ?(box : Js.js_string Js.t option)\n () : resizeObserver Js.t =\n let obs = new%js resizeObserver (Js.wrap_callback f) in\n (match box with\n | None -> obs##observe node\n | Some box ->\n let opts = empty_resize_observer_options () in\n opts##.box := box;\n obs##observe_withOptions node opts);\n obs\n","(* generated code *)"],"names":[],"mappings":"MAqEkC,cAAtB,mBACV,SACU,eAKV,YAzBkE,OAuB9D,YACA,mBACJ,EAAG,C,EArBiB,qCAA6B,C,EAJiB,KAAkB,C,KAE/B,OCrDvD,eDqDqB,SAAkC,+B,ECrDvD,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":100659},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/js_of_ocaml/performanceObserver.ml"],"sourcesContent":["(* generated code *)","(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2021 Philip White\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen! Import\n\nclass type performanceObserverInit = object\n method entryTypes : Js.js_string Js.t Js.js_array Js.t Js.writeonly_prop\nend\n\nclass type performanceEntry = object\n method name : Js.js_string Js.t Js.readonly_prop\n\n method entryType : Js.js_string Js.t Js.readonly_prop\n\n method startTime : Js.number_t Js.readonly_prop\n\n method duration : Js.number_t Js.readonly_prop\nend\n\nclass type performanceObserverEntryList = object\n method getEntries : performanceEntry Js.t Js.js_array Js.t Js.meth\nend\n\nclass type performanceObserver = object\n method observe : performanceObserverInit Js.t -> unit Js.meth\n\n method disconnect : unit Js.meth\n\n method takeRecords : performanceEntry Js.t Js.js_array Js.t Js.meth\nend\n\nlet performanceObserver = Js.Unsafe.global##._PerformanceObserver\n\nlet is_supported () = Js.Optdef.test performanceObserver\n\nlet performanceObserver :\n ( (performanceObserverEntryList Js.t -> performanceObserver Js.t -> unit) Js.callback\n -> performanceObserver Js.t)\n Js.constr =\n performanceObserver\n\nlet observe ~entry_types ~f =\n let entry_types = entry_types |> List.map Js.string |> Array.of_list |> Js.array in\n let performance_observer_init : performanceObserverInit Js.t = Js.Unsafe.obj [||] in\n let () = performance_observer_init##.entryTypes := entry_types in\n let obs = new%js performanceObserver (Js.wrap_callback f) in\n let () = obs##observe performance_observer_init in\n obs\n"],"names":[],"mappings":"YC0DE,OAAiC,KAAjC,OAAiC,aAAkB,OAAjC,iBAC6C,OACtD,YAC4B,MAA3B,mBACD,YACT,EAAG,C,EAdiB,qCAAkC,C,KAFS,ID/CjE,eC+C0B,SAAuC,+B","ignoreList":[0]}},{"offset":{"line":0,"column":100944},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/mutationObserver.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2015 Stéphane Legrand\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\nclass type mutationObserverInit = object\n method childList : bool Js.writeonly_prop\n\n method attributes : bool Js.writeonly_prop\n\n method characterData : bool Js.writeonly_prop\n\n method subtree : bool Js.writeonly_prop\n\n method attributeOldValue : bool Js.writeonly_prop\n\n method characterDataOldValue : bool Js.writeonly_prop\n\n method attributeFilter : Js.js_string Js.t Js.js_array Js.t Js.writeonly_prop\nend\n\nclass type mutationRecord = object\n method _type : Js.js_string Js.t Js.readonly_prop\n\n method target : Dom.node Js.t Js.readonly_prop\n\n method addedNodes : Dom.node Dom.nodeList Js.t Js.readonly_prop\n\n method removedNodes : Dom.node Dom.nodeList Js.t Js.readonly_prop\n\n method previousSibling : Dom.node Js.t Js.opt Js.readonly_prop\n\n method nextSibling : Dom.node Js.t Js.opt Js.readonly_prop\n\n method attributeName : Js.js_string Js.t Js.opt Js.readonly_prop\n\n method attributeNamespace : Js.js_string Js.t Js.opt Js.readonly_prop\n\n method oldValue : Js.js_string Js.t Js.opt Js.readonly_prop\nend\n\nclass type mutationObserver = object\n method observe : #Dom.node Js.t -> mutationObserverInit Js.t -> unit Js.meth\n\n method disconnect : unit Js.meth\n\n method takeRecords : mutationRecord Js.t Js.js_array Js.t Js.meth\nend\n\nlet empty_mutation_observer_init () : mutationObserverInit Js.t = Js.Unsafe.obj [||]\n\nlet mutationObserver = Js.Unsafe.global##._MutationObserver\n\nlet is_supported () = Js.Optdef.test mutationObserver\n\nlet mutationObserver :\n ( (mutationRecord Js.t Js.js_array Js.t -> mutationObserver Js.t -> unit) Js.callback\n -> mutationObserver Js.t)\n Js.constr =\n mutationObserver\n\nlet observe\n ~(node : #Dom.node Js.t)\n ~(f : mutationRecord Js.t Js.js_array Js.t -> mutationObserver Js.t -> unit)\n ?(child_list : bool option)\n ?(attributes : bool option)\n ?(character_data : bool option)\n ?(subtree : bool option)\n ?(attribute_old_value : bool option)\n ?(character_data_old_value : bool option)\n ?(attribute_filter : Js.js_string Js.t list option)\n () : mutationObserver Js.t =\n let opt_iter x f =\n match x with\n | None -> ()\n | Some x -> f x\n in\n let obs = new%js mutationObserver (Js.wrap_callback f) in\n let cfg = empty_mutation_observer_init () in\n let () = opt_iter child_list (fun v -> cfg##.childList := v) in\n let () = opt_iter attributes (fun v -> cfg##.attributes := v) in\n let () = opt_iter character_data (fun v -> cfg##.characterData := v) in\n let () = opt_iter subtree (fun v -> cfg##.subtree := v) in\n let () = opt_iter attribute_old_value (fun v -> cfg##.attributeOldValue := v) in\n let () =\n opt_iter character_data_old_value (fun v -> cfg##.characterDataOldValue := v)\n in\n let () =\n opt_iter attribute_filter (fun l ->\n cfg##.attributeFilter := Js.array (Array.of_list l))\n in\n let () = obs##observe node cfg in\n obs\n","(* generated code *)"],"names":[],"mappings":"OA4FoC,cAAxB,mBA5BsD,OAwB9D,O,CAAA,cAMqC,eANrC,O,CAAA,cAOqC,eAPrC,O,CAAA,cAQyC,eARzC,O,CAAA,cASkC,eATlC,O,CAAA,cAU8C,eAV9C,O,CAAA,cAY4C,eAZ5C,O,CAAA,YAgBI,OAAkC,aAAT,IAA0B,eAEhD,kBACT,G,EAvCoB,qCAA+B,C,EAJa,KAAkB,C,KAEzB,OClE3D,eDkEuB,SAAoC,+B,EClE3D,e,EAAA,e,EAAA,e,EAAA,e,EAAA,e,EAAA,e,EAAA,e,EAAA,e,EAAA,e,2CAAA","ignoreList":[1]}},{"offset":{"line":0,"column":101731},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/jstable.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2012 Pierre Chambart\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\ntype 'a t = < > Js.t\n\nlet obj = Js.Unsafe.global##._Object\n\nlet create () : 'a t = new%js obj\n\nlet add (t : 'a t) (k : Js.js_string Js.t) (v : 'a) =\n (* '_' is added to avoid conflicts with objects methods *)\n Js.Unsafe.set t (k##concat (Js.string \"_\")) v\n\nlet remove (t : 'a t) (k : Js.js_string Js.t) =\n Js.Unsafe.delete t (k##concat (Js.string \"_\"))\n\nlet find (t : 'a t) (k : Js.js_string Js.t) : 'a Js.Optdef.t =\n Js.Unsafe.get t (k##concat (Js.string \"_\"))\n\nlet keys (t : 'a t) : Js.js_string Js.t list =\n let key_array : Js.js_string Js.t Js.js_array Js.t =\n Js.Unsafe.global##._Object##keys t\n in\n let res = ref [] in\n for i = 0 to pred key_array##.length do\n let key =\n Js.Optdef.get (Js.array_get key_array i) (fun () -> failwith \"Jstable.keys\")\n in\n res := key##substring 0 (pred key##.length) :: !res\n done;\n List.rev !res\n","(* generated code *)"],"names":[],"mappings":"EA2C0D,uBAAuB,C,WAN/E,eACE,oBAGgB,OAAkB,iCAElB,MADhB,OACgB,aAAd,GAAwC,eAAxC,eAE4B,OAAY,UAAC,IAApC,qBAAoC,yCAE7C,oBAAa,C,EAbb,EAAgB,cAAhB,EAA2C,C,EAH3C,EAAmB,cAAnB,GAA8C,C,EAH9C,EAAgB,cAAhB,IAA6C,C,EAJxB,gBAAU,C,EAFG,OCtBpC,eDsBU,OAA0B,2B,ECtBpC,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":102288},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/json.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Grégoire Henry\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\n(****)\n\nclass type json = object\n method parse : 'a. js_string t -> 'a meth\n\n method parse_ :\n 'a 'b 'c 'd. js_string t -> ('b t, js_string t -> 'c -> 'd) meth_callback -> 'a meth\n\n method stringify : 'a. 'a -> js_string t meth\n\n method stringify_ :\n 'a 'b 'c 'd. 'a -> ('b, js_string t -> 'c -> 'd) meth_callback -> js_string t meth\nend\n\nlet json : json Js.t = Unsafe.global##._JSON\n\n(****)\n\n(* The writing logic for basic types is copied from [lib/deriving_json]. *)\n\nlet write_string buffer s =\n Buffer.add_char buffer '\"';\n for i = 0 to String.length s - 1 do\n match s.[i] with\n | '\"' -> Buffer.add_string buffer {|\\\"|}\n | '\\\\' -> Buffer.add_string buffer {|\\\\|}\n | '\\b' -> Buffer.add_string buffer {|\\b|}\n | '\\x0C' -> Buffer.add_string buffer {|\\f|}\n | '\\n' -> Buffer.add_string buffer {|\\n|}\n | '\\r' -> Buffer.add_string buffer {|\\r|}\n | '\\t' -> Buffer.add_string buffer {|\\t|}\n | c when Poly.(c <= '\\x1F') ->\n (* Other control characters are escaped. *)\n Printf.bprintf buffer {|\\u%04X|} (int_of_char c)\n | c when Poly.(c < '\\x80') -> Buffer.add_char buffer s.[i]\n | _c (* >= '\\x80' *) ->\n (* Bytes greater than 127 are embedded in a UTF-8 sequence. *)\n Buffer.add_char buffer (Char.chr (0xC2 lor (Char.code s.[i] lsr 6)));\n Buffer.add_char buffer (Char.chr (0x80 lor (Char.code s.[i] land 0x3F)))\n done;\n Buffer.add_char buffer '\"'\n\nlet write_float buffer f =\n (* \"%.15g\" can be (much) shorter; \"%.17g\" is round-trippable *)\n let s = Printf.sprintf \"%.15g\" f in\n if Poly.(float_of_string s = f)\n then Buffer.add_string buffer s\n else Printf.bprintf buffer \"%.17g\" f\n\nlet write_int64 buffer i =\n let mask16 = Int64.of_int 0xffff in\n let mask24 = Int64.of_int 0xffffff in\n Printf.bprintf\n buffer\n \"[255,%Ld,%Ld,%Ld]\"\n (Int64.logand i mask24)\n (Int64.logand (Int64.shift_right i 24) mask24)\n (Int64.logand (Int64.shift_right i 48) mask16)\n\nexternal custom_identifier : Obj.t -> string = \"caml_custom_identifier\"\n\nlet rec write b v =\n if Obj.is_int v\n then Printf.bprintf b \"%d\" (Obj.obj v : int)\n else\n let t = Obj.tag v in\n if t <= Obj.last_non_constant_constructor_tag\n then (\n Printf.bprintf b \"[%d\" t;\n for i = 0 to Obj.size v - 1 do\n Buffer.add_char b ',';\n write b (Obj.field v i)\n done;\n Buffer.add_char b ']')\n else if t = Obj.string_tag\n then write_string b (Obj.obj v : string)\n else if t = Obj.double_tag\n then write_float b (Obj.obj v : float)\n else if t = Obj.double_array_tag\n then (\n Printf.bprintf b \"[%d\" t;\n for i = 0 to Obj.size v - 1 do\n Buffer.add_char b ',';\n write_float b (Obj.double_field v i)\n done;\n Buffer.add_char b ']')\n else if t = Obj.custom_tag\n then\n match custom_identifier v with\n | \"_i\" -> Printf.bprintf b \"%ld\" (Obj.obj v : int32)\n | \"_n\" -> Printf.bprintf b \"%nd\" (Obj.obj v : nativeint)\n | \"_j\" ->\n let i : int64 = Obj.obj v in\n write_int64 b i\n | id -> failwith (Printf.sprintf \"Json.output: unsupported custom value %s \" id)\n else if t = Obj.abstract_tag\n then\n (* Presumably a JavaScript value *)\n Buffer.add_string b (Js.to_string (json##stringify v))\n else failwith (Printf.sprintf \"Json.output: unsupported tag %d \" t)\n\nlet to_json v =\n let buf = Buffer.create 50 in\n write buf v;\n Buffer.contents buf\n\n(****)\n\nlet input_reviver =\n let reviver _this _key (value : Unsafe.any) : Obj.t =\n if Js.equals (typeof value) (string \"string\")\n then Obj.repr (to_bytestring (Unsafe.coerce value))\n else if\n instanceof value Js.array_empty\n && (Unsafe.coerce value)##.length == 4\n && Unsafe.get value 0 == 255\n then\n Obj.repr\n (Jsoo_runtime.Int64.create_int64_lo_mi_hi\n (Unsafe.get value 1)\n (Unsafe.get value 2)\n (Unsafe.get value 3))\n else Obj.repr value\n in\n wrap_meth_callback reviver\n\nlet unsafe_input s =\n match Sys.backend_type with\n | Other \"wasm_of_ocaml\" ->\n (* https://github.com/ocsigen/js_of_ocaml/pull/1660#discussion_r1731099372\n The encoding of OCaml values is ambiguous since both integers and floats\n are mapped to numbers *)\n failwith \"Json.unsafe_input: not implemented in the Wasm backend\"\n | _ -> json##parse_ s input_reviver\n\nclass type obj = object\n method constructor : 'a. 'a constr Js.readonly_prop\nend\n\nlet mlInt64_constr =\n Js.Unsafe.pure_expr\n @@ fun () ->\n let dummy_int64 = 1L in\n let dummy_obj : obj t = Obj.magic dummy_int64 in\n dummy_obj##.constructor\n\nlet output_reviver _key (value : Unsafe.any) : Obj.t =\n if Obj.tag (Obj.repr value) = Obj.string_tag\n then Obj.repr (bytestring (Obj.magic value : string))\n else if instanceof value mlInt64_constr\n then\n let value = Unsafe.coerce value in\n Obj.repr (array [| 255; value##.lo; value##.mi; value##.hi |])\n else Obj.repr value\n\nlet use_native_stringify_ =\n ref\n (match Sys.backend_type with\n | Other \"js_of_ocaml\" -> true\n | Native | Bytecode | Other _ -> false)\n\nlet use_native_stringify () = !use_native_stringify_\n\nlet set_use_native_stringify b = use_native_stringify_ := b\n\nlet output_ x = to_json (Obj.repr x)\n\nlet output obj =\n match Sys.backend_type with\n | Other \"js_of_ocaml\" when use_native_stringify () ->\n json##stringify_ obj (Js.wrap_callback output_reviver)\n | _ -> Js.string (output_ obj)\n","(* generated code *)"],"names":[],"mappings":"MAyKE,gBAAG,KAAwB,uCACb,MACN,UAA+B,QAIlC,GAD6C,WAAZ,WAAF,SAAV,SAAU,QAAzB,IACQ,C,EATnB,UAAuB,C,QAjBvB,Y,CAAA,yBAKI,yBALJ,OAMO,uBAA4B,C,EAvBpB,IAAV,KAA0C,QAG3C,EADG,OACH,EAA+B,K,CAAA,EACE,IAA9B,SAA8B,GACZ,KAAlB,QAAkB,GAMhB,UADA,UADA,QADH,OAGwB,IACvB,GAXS,MAWK,C,sBA5DrB,OACK,yCAEK,KACR,OADiB,OACjB,QAEE,OADG,OACH,2BAAwB,8CAEtB,2BACA,EAAQ,mDAAR,MAAuB,yBAEzB,4BACG,Y,EArDP,2BAA0B,sBAElB,mCAAK,KACF,2BAA+B,QAC9B,2B,EAA+B,O,EAAA,6BAI/B,0BAA+B,GAF7B,0BAA+B,GACjC,0BAA+B,GAE/B,0BAA+B,GAJ/B,0BAA+B,IAKhC,OAGA,QAGiD,eAAtD,EAAsD,aAAK,cAApC,EAAoC,eAApC,aAA6C,OAApE,cACsD,eAAtD,EAAsD,aAAK,OAApC,EAAoC,eAApC,aAAiD,OAAxE,eAJiD,eAAvB,EAAuB,aAAvB,EAA4B,OAA5B,gBAD1B,+CAAgD,yBAOtD,4BAoCO,YACA,QACA,YAEH,OADG,OACH,2BAAwB,8CAEtB,2BACA,EAAc,MADO,OACP,aAAd,IAAoC,yBAEtC,4BACG,YAEG,OAAmB,aACf,wDAlCZ,uBACA,EAAc,SAAd,SACA,EAAc,SAAd,QAFuB,4CAmCX,yCAIO,KAAT,OAAS,0BAA+D,qB,MAC7E,YAGmD,EAApB,iBAAd,EAAkC,qBAC1C,KAAT,OAAS,0BAAqD,qB,UAAA,K,MAvD7D,KAAR,OAAQ,4BACC,GAAiB,mBACrB,yBACA,yC,CAA+B,C,OAyHpC,oB,CAAA,yBAP4B,WAQsB,K,CAAA,EACzB,UAAiC,wBApEhD,IAAV,OAAU,eACV,YAAW,sBAoEJ,EAAuB,C,EARC,qBAA0B,C,EAF7B,eAAsB,C,eCvLpD,eDoCuB,SAAqB,KA8GhB,KAA1B,MAA0B,KAmCS,WAfZ,MAJvB,MAIuB,GAeY,IAfZ,c,CAAA,EAcI,EAdJ,qBAcI,EAdJ,EAeY,4C,UCrLrC,G,EAAA,E,CAAA,8B,CAAA,e,EAAA,W,EAAA,Y,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":105110},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/cSS.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Raphaël Proust\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen! Import\n\nmodule Color = struct\n (* The type of CSS colors. First by name and then by constructor. *)\n type name =\n | Aliceblue\n | Antiquewhite\n | Aqua\n | Aquamarine\n | Azure\n | Beige\n | Bisque\n | Black\n | Blanchedalmond\n | Blue\n | Blueviolet\n | Brown\n | Burlywood\n | Cadetblue\n | Chartreuse\n | Chocolate\n | Coral\n | Cornflowerblue\n | Cornsilk\n | Crimson\n | Cyan\n | Darkblue\n | Darkcyan\n | Darkgoldenrod\n | Darkgray\n | Darkgreen\n | Darkgrey\n | Darkkhaki\n | Darkmagenta\n | Darkolivegreen\n | Darkorange\n | Darkorchid\n | Darkred\n | Darksalmon\n | Darkseagreen\n | Darkslateblue\n | Darkslategray\n | Darkslategrey\n | Darkturquoise\n | Darkviolet\n | Deeppink\n | Deepskyblue\n | Dimgray\n | Dimgrey\n | Dodgerblue\n | Firebrick\n | Floralwhite\n | Forestgreen\n | Fuchsia\n | Gainsboro\n | Ghostwhite\n | Gold\n | Goldenrod\n | Gray\n | Grey\n | Green\n | Greenyellow\n | Honeydew\n | Hotpink\n | Indianred\n | Indigo\n | Ivory\n | Khaki\n | Lavender\n | Lavenderblush\n | Lawngreen\n | Lemonchiffon\n | Lightblue\n | Lightcoral\n | Lightcyan\n | Lightgoldenrodyellow\n | Lightgray\n | Lightgreen\n | Lightgrey\n | Lightpink\n | Lightsalmon\n | Lightseagreen\n | Lightskyblue\n | Lightslategray\n | Lightslategrey\n | Lightsteelblue\n | Lightyellow\n | Lime\n | Limegreen\n | Linen\n | Magenta\n | Maroon\n | Mediumaquamarine\n | Mediumblue\n | Mediumorchid\n | Mediumpurple\n | Mediumseagreen\n | Mediumslateblue\n | Mediumspringgreen\n | Mediumturquoise\n | Mediumvioletred\n | Midnightblue\n | Mintcream\n | Mistyrose\n | Moccasin\n | Navajowhite\n | Navy\n | Oldlace\n | Olive\n | Olivedrab\n | Orange\n | Orangered\n | Orchid\n | Palegoldenrod\n | Palegreen\n | Paleturquoise\n | Palevioletred\n | Papayawhip\n | Peachpuff\n | Peru\n | Pink\n | Plum\n | Powderblue\n | Purple\n | Red\n | Rosybrown\n | Royalblue\n | Saddlebrown\n | Salmon\n | Sandybrown\n | Seagreen\n | Seashell\n | Sienna\n | Silver\n | Skyblue\n | Slateblue\n | Slategray\n | Slategrey\n | Snow\n | Springgreen\n | Steelblue\n | Tan\n | Teal\n | Thistle\n | Tomato\n | Turquoise\n | Violet\n | Wheat\n | White\n | Whitesmoke\n | Yellow\n | Yellowgreen\n\n let string_of_name = function\n | Aliceblue -> \"aliceblue\"\n | Antiquewhite -> \"antiquewhite\"\n | Aqua -> \"aqua\"\n | Aquamarine -> \"aquamarine\"\n | Azure -> \"azure\"\n | Beige -> \"beige\"\n | Bisque -> \"bisque\"\n | Black -> \"black\"\n | Blanchedalmond -> \"blanchedalmond\"\n | Blue -> \"blue\"\n | Blueviolet -> \"blueviolet\"\n | Brown -> \"brown\"\n | Burlywood -> \"burlywood\"\n | Cadetblue -> \"cadetblue\"\n | Chartreuse -> \"chartreuse\"\n | Chocolate -> \"chocolate\"\n | Coral -> \"coral\"\n | Cornflowerblue -> \"cornflowerblue\"\n | Cornsilk -> \"cornsilk\"\n | Crimson -> \"crimson\"\n | Cyan -> \"cyan\"\n | Darkblue -> \"darkblue\"\n | Darkcyan -> \"darkcyan\"\n | Darkgoldenrod -> \"darkgoldenrod\"\n | Darkgray -> \"darkgray\"\n | Darkgreen -> \"darkgreen\"\n | Darkgrey -> \"darkgrey\"\n | Darkkhaki -> \"darkkhaki\"\n | Darkmagenta -> \"darkmagenta\"\n | Darkolivegreen -> \"darkolivegreen\"\n | Darkorange -> \"darkorange\"\n | Darkorchid -> \"darkorchid\"\n | Darkred -> \"darkred\"\n | Darksalmon -> \"darksalmon\"\n | Darkseagreen -> \"darkseagreen\"\n | Darkslateblue -> \"darkslateblue\"\n | Darkslategray -> \"darkslategray\"\n | Darkslategrey -> \"darkslategrey\"\n | Darkturquoise -> \"darkturquoise\"\n | Darkviolet -> \"darkviolet\"\n | Deeppink -> \"deeppink\"\n | Deepskyblue -> \"deepskyblue\"\n | Dimgray -> \"dimgray\"\n | Dimgrey -> \"dimgrey\"\n | Dodgerblue -> \"dodgerblue\"\n | Firebrick -> \"firebrick\"\n | Floralwhite -> \"floralwhite\"\n | Forestgreen -> \"forestgreen\"\n | Fuchsia -> \"fuchsia\"\n | Gainsboro -> \"gainsboro\"\n | Ghostwhite -> \"ghostwhite\"\n | Gold -> \"gold\"\n | Goldenrod -> \"goldenrod\"\n | Gray -> \"gray\"\n | Green -> \"green\"\n | Greenyellow -> \"greenyellow\"\n | Grey -> \"grey\"\n | Honeydew -> \"honeydew\"\n | Hotpink -> \"hotpink\"\n | Indianred -> \"indianred\"\n | Indigo -> \"indigo\"\n | Ivory -> \"ivory\"\n | Khaki -> \"khaki\"\n | Lavender -> \"lavender\"\n | Lavenderblush -> \"lavenderblush\"\n | Lawngreen -> \"lawngreen\"\n | Lemonchiffon -> \"lemonchiffon\"\n | Lightblue -> \"lightblue\"\n | Lightcoral -> \"lightcoral\"\n | Lightcyan -> \"lightcyan\"\n | Lightgoldenrodyellow -> \"lightgoldenrodyellow\"\n | Lightgray -> \"lightgray\"\n | Lightgreen -> \"lightgreen\"\n | Lightgrey -> \"lightgrey\"\n | Lightpink -> \"lightpink\"\n | Lightsalmon -> \"lightsalmon\"\n | Lightseagreen -> \"lightseagreen\"\n | Lightskyblue -> \"lightskyblue\"\n | Lightslategray -> \"lightslategray\"\n | Lightslategrey -> \"lightslategrey\"\n | Lightsteelblue -> \"lightsteelblue\"\n | Lightyellow -> \"lightyellow\"\n | Lime -> \"lime\"\n | Limegreen -> \"limegreen\"\n | Linen -> \"linen\"\n | Magenta -> \"magenta\"\n | Maroon -> \"maroon\"\n | Mediumaquamarine -> \"mediumaquamarine\"\n | Mediumblue -> \"mediumblue\"\n | Mediumorchid -> \"mediumorchid\"\n | Mediumpurple -> \"mediumpurple\"\n | Mediumseagreen -> \"mediumseagreen\"\n | Mediumslateblue -> \"mediumslateblue\"\n | Mediumspringgreen -> \"mediumspringgreen\"\n | Mediumturquoise -> \"mediumturquoise\"\n | Mediumvioletred -> \"mediumvioletred\"\n | Midnightblue -> \"midnightblue\"\n | Mintcream -> \"mintcream\"\n | Mistyrose -> \"mistyrose\"\n | Moccasin -> \"moccasin\"\n | Navajowhite -> \"navajowhite\"\n | Navy -> \"navy\"\n | Oldlace -> \"oldlace\"\n | Olive -> \"olive\"\n | Olivedrab -> \"olivedrab\"\n | Orange -> \"orange\"\n | Orangered -> \"orangered\"\n | Orchid -> \"orchid\"\n | Palegoldenrod -> \"palegoldenrod\"\n | Palegreen -> \"palegreen\"\n | Paleturquoise -> \"paleturquoise\"\n | Palevioletred -> \"palevioletred\"\n | Papayawhip -> \"papayawhip\"\n | Peachpuff -> \"peachpuff\"\n | Peru -> \"peru\"\n | Pink -> \"pink\"\n | Plum -> \"plum\"\n | Powderblue -> \"powderblue\"\n | Purple -> \"purple\"\n | Red -> \"red\"\n | Rosybrown -> \"rosybrown\"\n | Royalblue -> \"royalblue\"\n | Saddlebrown -> \"saddlebrown\"\n | Salmon -> \"salmon\"\n | Sandybrown -> \"sandybrown\"\n | Seagreen -> \"seagreen\"\n | Seashell -> \"seashell\"\n | Sienna -> \"sienna\"\n | Silver -> \"silver\"\n | Skyblue -> \"skyblue\"\n | Slateblue -> \"slateblue\"\n | Slategray -> \"slategray\"\n | Slategrey -> \"slategrey\"\n | Snow -> \"snow\"\n | Springgreen -> \"springgreen\"\n | Steelblue -> \"steelblue\"\n | Tan -> \"tan\"\n | Teal -> \"teal\"\n | Thistle -> \"thistle\"\n | Tomato -> \"tomato\"\n | Turquoise -> \"turquoise\"\n | Violet -> \"violet\"\n | Wheat -> \"wheat\"\n | White -> \"white\"\n | Whitesmoke -> \"whitesmoke\"\n | Yellow -> \"yellow\"\n | Yellowgreen -> \"yellowgreen\"\n\n let name_of_string = function\n | \"aliceblue\" -> Aliceblue\n | \"antiquewhite\" -> Antiquewhite\n | \"aqua\" -> Aqua\n | \"aquamarine\" -> Aquamarine\n | \"azure\" -> Azure\n | \"beige\" -> Beige\n | \"bisque\" -> Bisque\n | \"black\" -> Black\n | \"blanchedalmond\" -> Blanchedalmond\n | \"blue\" -> Blue\n | \"blueviolet\" -> Blueviolet\n | \"brown\" -> Brown\n | \"burlywood\" -> Burlywood\n | \"cadetblue\" -> Cadetblue\n | \"chartreuse\" -> Chartreuse\n | \"chocolate\" -> Chocolate\n | \"coral\" -> Coral\n | \"cornflowerblue\" -> Cornflowerblue\n | \"cornsilk\" -> Cornsilk\n | \"crimson\" -> Crimson\n | \"cyan\" -> Cyan\n | \"darkblue\" -> Darkblue\n | \"darkcyan\" -> Darkcyan\n | \"darkgoldenrod\" -> Darkgoldenrod\n | \"darkgray\" -> Darkgray\n | \"darkgreen\" -> Darkgreen\n | \"darkgrey\" -> Darkgrey\n | \"darkkhaki\" -> Darkkhaki\n | \"darkmagenta\" -> Darkmagenta\n | \"darkolivegreen\" -> Darkolivegreen\n | \"darkorange\" -> Darkorange\n | \"darkorchid\" -> Darkorchid\n | \"darkred\" -> Darkred\n | \"darksalmon\" -> Darksalmon\n | \"darkseagreen\" -> Darkseagreen\n | \"darkslateblue\" -> Darkslateblue\n | \"darkslategray\" -> Darkslategray\n | \"darkslategrey\" -> Darkslategrey\n | \"darkturquoise\" -> Darkturquoise\n | \"darkviolet\" -> Darkviolet\n | \"deeppink\" -> Deeppink\n | \"deepskyblue\" -> Deepskyblue\n | \"dimgray\" -> Dimgray\n | \"dimgrey\" -> Dimgrey\n | \"dodgerblue\" -> Dodgerblue\n | \"firebrick\" -> Firebrick\n | \"floralwhite\" -> Floralwhite\n | \"forestgreen\" -> Forestgreen\n | \"fuchsia\" -> Fuchsia\n | \"gainsboro\" -> Gainsboro\n | \"ghostwhite\" -> Ghostwhite\n | \"gold\" -> Gold\n | \"goldenrod\" -> Goldenrod\n | \"gray\" -> Gray\n | \"green\" -> Green\n | \"greenyellow\" -> Greenyellow\n | \"grey\" -> Grey\n | \"honeydew\" -> Honeydew\n | \"hotpink\" -> Hotpink\n | \"indianred\" -> Indianred\n | \"indigo\" -> Indigo\n | \"ivory\" -> Ivory\n | \"khaki\" -> Khaki\n | \"lavender\" -> Lavender\n | \"lavenderblush\" -> Lavenderblush\n | \"lawngreen\" -> Lawngreen\n | \"lemonchiffon\" -> Lemonchiffon\n | \"lightblue\" -> Lightblue\n | \"lightcoral\" -> Lightcoral\n | \"lightcyan\" -> Lightcyan\n | \"lightgoldenrodyellow\" -> Lightgoldenrodyellow\n | \"lightgray\" -> Lightgray\n | \"lightgreen\" -> Lightgreen\n | \"lightgrey\" -> Lightgrey\n | \"lightpink\" -> Lightpink\n | \"lightsalmon\" -> Lightsalmon\n | \"lightseagreen\" -> Lightseagreen\n | \"lightskyblue\" -> Lightskyblue\n | \"lightslategray\" -> Lightslategray\n | \"lightslategrey\" -> Lightslategrey\n | \"lightsteelblue\" -> Lightsteelblue\n | \"lightyellow\" -> Lightyellow\n | \"lime\" -> Lime\n | \"limegreen\" -> Limegreen\n | \"linen\" -> Linen\n | \"magenta\" -> Magenta\n | \"maroon\" -> Maroon\n | \"mediumaquamarine\" -> Mediumaquamarine\n | \"mediumblue\" -> Mediumblue\n | \"mediumorchid\" -> Mediumorchid\n | \"mediumpurple\" -> Mediumpurple\n | \"mediumseagreen\" -> Mediumseagreen\n | \"mediumslateblue\" -> Mediumslateblue\n | \"mediumspringgreen\" -> Mediumspringgreen\n | \"mediumturquoise\" -> Mediumturquoise\n | \"mediumvioletred\" -> Mediumvioletred\n | \"midnightblue\" -> Midnightblue\n | \"mintcream\" -> Mintcream\n | \"mistyrose\" -> Mistyrose\n | \"moccasin\" -> Moccasin\n | \"navajowhite\" -> Navajowhite\n | \"navy\" -> Navy\n | \"oldlace\" -> Oldlace\n | \"olive\" -> Olive\n | \"olivedrab\" -> Olivedrab\n | \"orange\" -> Orange\n | \"orangered\" -> Orangered\n | \"orchid\" -> Orchid\n | \"palegoldenrod\" -> Palegoldenrod\n | \"palegreen\" -> Palegreen\n | \"paleturquoise\" -> Paleturquoise\n | \"palevioletred\" -> Palevioletred\n | \"papayawhip\" -> Papayawhip\n | \"peachpuff\" -> Peachpuff\n | \"peru\" -> Peru\n | \"pink\" -> Pink\n | \"plum\" -> Plum\n | \"powderblue\" -> Powderblue\n | \"purple\" -> Purple\n | \"red\" -> Red\n | \"rosybrown\" -> Rosybrown\n | \"royalblue\" -> Royalblue\n | \"saddlebrown\" -> Saddlebrown\n | \"salmon\" -> Salmon\n | \"sandybrown\" -> Sandybrown\n | \"seagreen\" -> Seagreen\n | \"seashell\" -> Seashell\n | \"sienna\" -> Sienna\n | \"silver\" -> Silver\n | \"skyblue\" -> Skyblue\n | \"slateblue\" -> Slateblue\n | \"slategray\" -> Slategray\n | \"slategrey\" -> Slategrey\n | \"snow\" -> Snow\n | \"springgreen\" -> Springgreen\n | \"steelblue\" -> Steelblue\n | \"tan\" -> Tan\n | \"teal\" -> Teal\n | \"thistle\" -> Thistle\n | \"tomato\" -> Tomato\n | \"turquoise\" -> Turquoise\n | \"violet\" -> Violet\n | \"wheat\" -> Wheat\n | \"white\" -> White\n | \"whitesmoke\" -> Whitesmoke\n | \"yellow\" -> Yellow\n | \"yellowgreen\" -> Yellowgreen\n | s -> raise (Invalid_argument (s ^ \" is not a valid color name\"))\n\n let rgb_of_name = function\n | Aliceblue -> 240, 248, 255\n | Antiquewhite -> 250, 235, 215\n | Aqua -> 0, 255, 255\n | Aquamarine -> 127, 255, 212\n | Azure -> 240, 255, 255\n | Beige -> 245, 245, 220\n | Bisque -> 255, 228, 196\n | Black -> 0, 0, 0\n | Blanchedalmond -> 255, 235, 205\n | Blue -> 0, 0, 255\n | Blueviolet -> 138, 43, 226\n | Brown -> 165, 42, 42\n | Burlywood -> 222, 184, 135\n | Cadetblue -> 95, 158, 160\n | Chartreuse -> 127, 255, 0\n | Chocolate -> 210, 105, 30\n | Coral -> 255, 127, 80\n | Cornflowerblue -> 100, 149, 237\n | Cornsilk -> 255, 248, 220\n | Crimson -> 220, 20, 60\n | Cyan -> 0, 255, 255\n | Darkblue -> 0, 0, 139\n | Darkcyan -> 0, 139, 139\n | Darkgoldenrod -> 184, 134, 11\n | Darkgray -> 169, 169, 169\n | Darkgreen -> 0, 100, 0\n | Darkgrey -> 169, 169, 169\n | Darkkhaki -> 189, 183, 107\n | Darkmagenta -> 139, 0, 139\n | Darkolivegreen -> 85, 107, 47\n | Darkorange -> 255, 140, 0\n | Darkorchid -> 153, 50, 204\n | Darkred -> 139, 0, 0\n | Darksalmon -> 233, 150, 122\n | Darkseagreen -> 143, 188, 143\n | Darkslateblue -> 72, 61, 139\n | Darkslategray -> 47, 79, 79\n | Darkslategrey -> 47, 79, 79\n | Darkturquoise -> 0, 206, 209\n | Darkviolet -> 148, 0, 211\n | Deeppink -> 255, 20, 147\n | Deepskyblue -> 0, 191, 255\n | Dimgray -> 105, 105, 105\n | Dimgrey -> 105, 105, 105\n | Dodgerblue -> 30, 144, 255\n | Firebrick -> 178, 34, 34\n | Floralwhite -> 255, 250, 240\n | Forestgreen -> 34, 139, 34\n | Fuchsia -> 255, 0, 255\n | Gainsboro -> 220, 220, 220\n | Ghostwhite -> 248, 248, 255\n | Gold -> 255, 215, 0\n | Goldenrod -> 218, 165, 32\n | Gray -> 128, 128, 128\n | Green -> 0, 128, 0\n | Greenyellow -> 173, 255, 47\n | Grey -> 128, 128, 128\n | Honeydew -> 240, 255, 240\n | Hotpink -> 255, 105, 180\n | Indianred -> 205, 92, 92\n | Indigo -> 75, 0, 130\n | Ivory -> 255, 255, 240\n | Khaki -> 240, 230, 140\n | Lavender -> 230, 230, 250\n | Lavenderblush -> 255, 240, 245\n | Lawngreen -> 124, 252, 0\n | Lemonchiffon -> 255, 250, 205\n | Lightblue -> 173, 216, 230\n | Lightcoral -> 240, 128, 128\n | Lightcyan -> 224, 255, 255\n | Lightgoldenrodyellow -> 250, 250, 210\n | Lightgray -> 211, 211, 211\n | Lightgreen -> 144, 238, 144\n | Lightgrey -> 211, 211, 211\n | Lightpink -> 255, 182, 193\n | Lightsalmon -> 255, 160, 122\n | Lightseagreen -> 32, 178, 170\n | Lightskyblue -> 135, 206, 250\n | Lightslategray -> 119, 136, 153\n | Lightslategrey -> 119, 136, 153\n | Lightsteelblue -> 176, 196, 222\n | Lightyellow -> 255, 255, 224\n | Lime -> 0, 255, 0\n | Limegreen -> 50, 205, 50\n | Linen -> 250, 240, 230\n | Magenta -> 255, 0, 255\n | Maroon -> 128, 0, 0\n | Mediumaquamarine -> 102, 205, 170\n | Mediumblue -> 0, 0, 205\n | Mediumorchid -> 186, 85, 211\n | Mediumpurple -> 147, 112, 219\n | Mediumseagreen -> 60, 179, 113\n | Mediumslateblue -> 123, 104, 238\n | Mediumspringgreen -> 0, 250, 154\n | Mediumturquoise -> 72, 209, 204\n | Mediumvioletred -> 199, 21, 133\n | Midnightblue -> 25, 25, 112\n | Mintcream -> 245, 255, 250\n | Mistyrose -> 255, 228, 225\n | Moccasin -> 255, 228, 181\n | Navajowhite -> 255, 222, 173\n | Navy -> 0, 0, 128\n | Oldlace -> 253, 245, 230\n | Olive -> 128, 128, 0\n | Olivedrab -> 107, 142, 35\n | Orange -> 255, 165, 0\n | Orangered -> 255, 69, 0\n | Orchid -> 218, 112, 214\n | Palegoldenrod -> 238, 232, 170\n | Palegreen -> 152, 251, 152\n | Paleturquoise -> 175, 238, 238\n | Palevioletred -> 219, 112, 147\n | Papayawhip -> 255, 239, 213\n | Peachpuff -> 255, 218, 185\n | Peru -> 205, 133, 63\n | Pink -> 255, 192, 203\n | Plum -> 221, 160, 221\n | Powderblue -> 176, 224, 230\n | Purple -> 128, 0, 128\n | Red -> 255, 0, 0\n | Rosybrown -> 188, 143, 143\n | Royalblue -> 65, 105, 225\n | Saddlebrown -> 139, 69, 19\n | Salmon -> 250, 128, 114\n | Sandybrown -> 244, 164, 96\n | Seagreen -> 46, 139, 87\n | Seashell -> 255, 245, 238\n | Sienna -> 160, 82, 45\n | Silver -> 192, 192, 192\n | Skyblue -> 135, 206, 235\n | Slateblue -> 106, 90, 205\n | Slategray -> 112, 128, 144\n | Slategrey -> 112, 128, 144\n | Snow -> 255, 250, 250\n | Springgreen -> 0, 255, 127\n | Steelblue -> 70, 130, 180\n | Tan -> 210, 180, 140\n | Teal -> 0, 128, 128\n | Thistle -> 216, 191, 216\n | Tomato -> 255, 99, 71\n | Turquoise -> 64, 224, 208\n | Violet -> 238, 130, 238\n | Wheat -> 245, 222, 179\n | White -> 255, 255, 255\n | Whitesmoke -> 245, 245, 245\n | Yellow -> 255, 255, 0\n | Yellowgreen -> 154, 205, 50\n\n type t =\n | Name of name\n | RGB of (int * int * int)\n (** Red, Green and Blue values. Clipped to [[0..255]] by most (All?)\n browsers. *)\n | RGB_percent of (int * int * int)\n (** RGB channels are specified as a percentage of their maximal value. *)\n | RGBA of (int * int * int * float)\n (** Same as RGB with additional transparency argument. Opacity should be in\n [0.] (completely transparent) and [1.] (completely opaque). *)\n | RGBA_percent of (int * int * int * float)\n (** RGB channels specified as percentage of their maximal value. Alpha\n channel (opacity) is still a [0.] to [1.] float. *)\n | HSL of (int * int * int)\n (** Hue, Saturation and Lightness values. Hue is an angle in degree (in\n interval [[0..360[]). Saturation is a percentage ([[0..100]]) with [0]\n being colorless. Lightness is also a percentage ([[0..100]]) with [0]\n being black. *)\n | HSLA of (int * int * int * float)\n (** Same as HSL with an opacity argument between [0.] and [1.]. *)\n\n let rgb ?a r g b =\n match a with\n | None -> RGB (r, g, b)\n | Some a -> RGBA (r, g, b, a)\n\n let hsl ?a h s l =\n match a with\n | None -> HSL (h, s, l)\n | Some a -> HSLA (h, s, l, a)\n\n let string_of_t = function\n | Name n -> string_of_name n\n | RGB (r, g, b) -> Printf.sprintf \"rgb(%d,%d,%d)\" r g b\n | RGB_percent (r, g, b) -> Printf.sprintf \"rgb(%d%%,%d%%,%d%%)\" r g b\n | RGBA (r, g, b, a) -> Printf.sprintf \"rgba(%d,%d,%d,%f)\" r g b a\n | RGBA_percent (r, g, b, a) -> Printf.sprintf \"rgba(%d%%,%d%%,%d%%,%f)\" r g b a\n | HSL (h, s, l) -> Printf.sprintf \"hsl(%d,%d%%,%d%%)\" h s l\n | HSLA (h, s, l, a) -> Printf.sprintf \"hsla(%d,%d%%,%d%%,%f)\" h s l a\n\n let hex_of_rgb (red, green, blue) =\n let in_range i =\n if i < 0 || i > 255\n then raise (Invalid_argument (string_of_int i ^ \" is out of valid range\"))\n in\n in_range red;\n in_range green;\n in_range blue;\n Printf.sprintf \"#%02X%02X%02X\" red green blue\n\n (* Ocaml <-> JS representation *)\n type js_t = Js.js_string Js.t\n\n (* TODO? be more restrictive, clip values into standard range *)\n let js_t_of_js_string s =\n let rgb_re =\n new%js Js.regExp (Js.bytestring \"^rgb\\\\(\\\\s*\\\\d*,\\\\s*\\\\d*,\\\\s*\\\\d*\\\\)$\")\n in\n let rgb_pct_re =\n new%js Js.regExp (Js.bytestring \"^rgb\\\\(\\\\s*\\\\d*%,\\\\s*\\\\d*%,\\\\s*\\\\d*%\\\\)$\")\n in\n let rgba_re =\n new%js Js.regExp\n (Js.bytestring \"^rgba\\\\(\\\\s*\\\\d*,\\\\s*\\\\d*,\\\\s*\\\\d*,\\\\d*\\\\.?\\\\d*\\\\)$\")\n in\n let rgba_pct_re =\n new%js Js.regExp\n (Js.bytestring \"^rgba\\\\(\\\\s*\\\\d*%,\\\\s*\\\\d*%,\\\\s*\\\\d*%,\\\\d*\\\\.?\\\\d*\\\\)$\")\n in\n let hsl_re =\n new%js Js.regExp (Js.bytestring \"^hsl\\\\(\\\\s*\\\\d*,\\\\s*\\\\d*%,\\\\s*\\\\d*%\\\\)$\")\n in\n let hsla_re =\n new%js Js.regExp\n (Js.bytestring \"^hsla\\\\(\\\\s*\\\\d*,\\\\s*\\\\d*%,\\\\s*\\\\d*%,\\\\d*\\\\.?\\\\d*\\\\)$\")\n in\n if\n Js.to_bool (rgb_re##test s)\n || Js.to_bool (rgba_re##test s)\n || Js.to_bool (rgb_pct_re##test s)\n || Js.to_bool (rgba_pct_re##test s)\n || Js.to_bool (hsl_re##test s)\n || Js.to_bool (hsla_re##test s)\n then s\n else\n match name_of_string (Js.to_string s) with\n | _ -> s\n | exception _ -> raise (Invalid_argument (Js.to_string s ^ \" is not a valid color\"))\n\n let js c = Js.string (string_of_t c)\n\n let ml c =\n let s = Js.to_string c in\n try Name (name_of_string s)\n with Invalid_argument _ -> (\n let fail () = raise (Invalid_argument (s ^ \" is not a valid color\")) in\n let re_rgb =\n Regexp.regexp \"(rgba?)\\\\((?:(\\\\d*),(\\\\d*),(\\\\d*)(?:,(\\\\d*(?:\\\\.\\\\d*)?))?)\\\\)\"\n in\n let re_rgb_pct =\n Regexp.regexp \"(rgba?)\\\\((?:(\\\\d*)%,(\\\\d*)%,(\\\\d*)%(?:,(\\\\d*(?:\\\\.\\\\d*)?))?)\\\\)\"\n in\n let re_hsl =\n Regexp.regexp \"(hsla?)\\\\((?:(\\\\d*),(\\\\d*)%,(\\\\d*)%(?:,(\\\\d*(?:\\\\.\\\\d*)?))?)\\\\)\"\n in\n let i_of_s_o = function\n | None -> fail ()\n | Some i -> (\n try int_of_string i\n with Invalid_argument s | Failure s ->\n raise (Invalid_argument (\"color conversion error (\" ^ i ^ \"): \" ^ s)))\n in\n let f_of_s f =\n try float_of_string f\n with Invalid_argument s | Failure s ->\n raise (Invalid_argument (\"color conversion error (\" ^ f ^ \"): \" ^ s))\n in\n match Regexp.string_match re_rgb s 0 with\n | Some r -> (\n let red = Regexp.matched_group r 2 in\n let green = Regexp.matched_group r 3 in\n let blue = Regexp.matched_group r 4 in\n let alpha = Regexp.matched_group r 5 in\n match Regexp.matched_group r 1 with\n | Some \"rgb\" -> (\n match alpha with\n | Some _ -> fail ()\n | None -> RGB (i_of_s_o red, i_of_s_o green, i_of_s_o blue))\n | Some \"rgba\" -> (\n match alpha with\n | None -> fail ()\n | Some a -> RGBA (i_of_s_o red, i_of_s_o green, i_of_s_o blue, f_of_s a))\n | Some _ | None -> fail ())\n | None -> (\n match Regexp.string_match re_rgb_pct s 0 with\n | Some r -> (\n let red = Regexp.matched_group r 2 in\n let green = Regexp.matched_group r 3 in\n let blue = Regexp.matched_group r 4 in\n let alpha = Regexp.matched_group r 5 in\n match Regexp.matched_group r 1 with\n | Some \"rgb\" -> (\n match alpha with\n | Some _ -> fail ()\n | None -> RGB_percent (i_of_s_o red, i_of_s_o green, i_of_s_o blue))\n | Some \"rgba\" -> (\n match alpha with\n | None -> fail ()\n | Some a ->\n RGBA_percent (i_of_s_o red, i_of_s_o green, i_of_s_o blue, f_of_s a)\n )\n | Some _ | None -> fail ())\n | None -> (\n match Regexp.string_match re_hsl s 0 with\n | Some r -> (\n let red = Regexp.matched_group r 2 in\n let green = Regexp.matched_group r 3 in\n let blue = Regexp.matched_group r 4 in\n let alpha = Regexp.matched_group r 5 in\n match Regexp.matched_group r 1 with\n | Some \"hsl\" -> (\n match alpha with\n | Some _ -> fail ()\n | None -> HSL (i_of_s_o red, i_of_s_o green, i_of_s_o blue))\n | Some \"hsla\" -> (\n match alpha with\n | None -> fail ()\n | Some a ->\n HSLA (i_of_s_o red, i_of_s_o green, i_of_s_o blue, f_of_s a))\n | Some _ | None -> fail ())\n | None -> fail ())))\nend\n\nmodule Length = struct\n (* http://www.w3.org/TR/css3-values/#lengths *)\n\n (* TODO:\n {[\n type js_t = private Js.string Js.t\n val js_t_of_t\n val t_of_js_t\n val t_of_string\n ]}\n *)\n\n type t =\n | Zero\n (* relative *)\n | Em of float\n | Ex of float\n | Px of float\n | Gd of float\n | Rem of float\n | Vw of float\n | Vh of float\n | Vm of float\n | Ch of float\n (* absolute *)\n | Mm of float\n | Cm of float\n | In of float\n | Pt of float\n | Pc of float\n\n let string_of_t = function\n | Zero -> \"0\"\n | Em f -> Printf.sprintf \"%f%s\" f \"em\"\n | Ex f -> Printf.sprintf \"%f%s\" f \"ex\"\n | Px f -> Printf.sprintf \"%f%s\" f \"px\"\n | Gd f -> Printf.sprintf \"%f%s\" f \"gd\"\n | Rem f -> Printf.sprintf \"%f%s\" f \"rem\"\n | Vw f -> Printf.sprintf \"%f%s\" f \"vw\"\n | Vh f -> Printf.sprintf \"%f%s\" f \"vh\"\n | Vm f -> Printf.sprintf \"%f%s\" f \"vm\"\n | Ch f -> Printf.sprintf \"%f%s\" f \"ch\"\n | Mm f -> Printf.sprintf \"%f%s\" f \"mm\"\n | Cm f -> Printf.sprintf \"%f%s\" f \"cm\"\n | In f -> Printf.sprintf \"%f%s\" f \"in\"\n | Pt f -> Printf.sprintf \"%f%s\" f \"pt\"\n | Pc f -> Printf.sprintf \"%f%s\" f \"pc\"\n\n type js_t = Js.js_string Js.t\n\n let js t = Js.string (string_of_t t)\n\n let ml t =\n let s = Js.to_string t in\n if String.equal s \"0\"\n then Zero\n else\n let fail () = raise (Invalid_argument (s ^ \" is not a valid length\")) in\n let re = Regexp.regexp \"^(\\\\d*(?:\\\\.\\\\d*)?)\\\\s*(\\\\S*)$\" in\n match Regexp.string_match re s 0 with\n | None -> fail ()\n | Some r -> (\n let f =\n match Regexp.matched_group r 1 with\n | None -> fail ()\n | Some f -> (\n try float_of_string f\n with Invalid_argument s ->\n raise (Invalid_argument (\"length conversion error: \" ^ s)))\n in\n match Regexp.matched_group r 2 with\n | None -> fail ()\n | Some \"em\" -> Em f\n | Some \"ex\" -> Ex f\n | Some \"px\" -> Px f\n | Some \"gd\" -> Gd f\n | Some \"rem\" -> Rem f\n | Some \"vw\" -> Vw f\n | Some \"vh\" -> Vh f\n | Some \"vm\" -> Vm f\n | Some \"ch\" -> Ch f\n | Some \"mm\" -> Mm f\n | Some \"cm\" -> Cm f\n | Some \"in\" -> In f\n | Some \"pt\" -> Pt f\n | Some \"pc\" -> Pc f\n | Some _ -> fail ())\nend\n\nmodule Angle = struct\n type t =\n | Deg of float\n | Grad of float\n | Rad of float\n | Turns of float\n\n let string_of_t = function\n | Deg f -> Printf.sprintf \"%f%s\" f \"deg\"\n | Grad f -> Printf.sprintf \"%f%s\" f \"grad\"\n | Rad f -> Printf.sprintf \"%f%s\" f \"rad\"\n | Turns f -> Printf.sprintf \"%f%s\" f \"turns\"\n\n type js_t = Js.js_string Js.t\n\n let js t = Js.string (string_of_t t)\n\n let ml j =\n let s = Js.to_string j in\n let re = Regexp.regexp \"^(\\\\d*(?:\\\\.\\\\d*))(deg|grad|rad|turns)$\" in\n let fail () = raise (Invalid_argument (s ^ \" is not a valid length\")) in\n match Regexp.string_match re s 0 with\n | None -> fail ()\n | Some r -> (\n let f =\n match Regexp.matched_group r 1 with\n | None -> fail ()\n | Some f -> (\n try float_of_string f\n with Invalid_argument s ->\n raise (Invalid_argument (\"length conversion error: \" ^ s)))\n in\n match Regexp.matched_group r 2 with\n | Some \"deg\" -> Deg f\n | Some \"grad\" -> Grad f\n | Some \"rad\" -> Rad f\n | Some \"turns\" -> Turns f\n | Some _ | None -> fail ())\nend\n","(* generated code *)"],"names":[],"mappings":"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cADF,UACE,SAAiB,C,GA7Kb,udAmJC,KADL,KADI,KADL,KADA,KADC,KADG,KADH,KADC,KADH,KADD,KADM,KADE,KADP,KADK,KADA,KADA,KADF,KADD,KADA,KADE,KADA,KADE,KADJ,KADK,KADF,KADA,KADN,KADG,KADI,KADN,KADA,KADA,KADK,KADC,KADG,KADA,KADJ,KADI,KADP,KADG,KADH,KADG,KADJ,KADE,KADH,KADO,KADH,KADC,KADA,KADG,KADG,KADA,KADE,KADF,KADD,KADF,KADA,KADF,KADM,KADV,KADC,KADF,KADI,KADL,KADO,KADG,KADA,KADA,KADF,KADC,KADF,KADF,KADA,KADC,KADD,KADW,KADX,KADC,KADD,KADG,KADH,KADI,KADL,KADH,KADA,KADC,KADG,KADF,KADC,KAFG,KADN,KAED,KAHA,KADK,KADL,KADM,KADD,KADF,KADI,KADA,KADF,KADC,KADH,KADA,KADI,KADH,KADE,KADG,KADA,KADA,KADA,KADD,KADF,KADH,KADG,KADA,KADI,KADH,KADF,KADD,KADC,KADD,KADK,KADL,KADA,KADJ,KADG,KADC,KADM,KADT,KADI,KADC,KADD,KADA,KADJ,KADK,KADN,KADU,KADT,KADC,KADD,KADA,KADK,KADN,KADQ,KADH,GAkJc,C,MAzSV,mIA4IL,oBACG,oBACH,oBACD,oBACA,oBACK,oBACJ,oBACK,aARJ,qBARE,oBACA,oBACA,oBACL,oBACO,oBACF,oBACN,oBACC,cARG,kDARE,oBACE,oBACL,oBACI,oBACF,oBACA,oBACF,oBACA,aARG,qBATI,oBACH,oBACD,oBACL,oBACA,oBACA,oBACM,oBACJ,oBACH,gBATU,+EARN,oBACF,oBACI,oBACH,oBACG,oBACH,oBACO,oBACJ,aARL,qBARa,oBACF,oBACA,oBACH,oBACH,oBACA,oBACD,oBACG,cARI,kDARV,oBACE,oBACD,oBACU,oBACN,oBACE,oBACA,oBACE,aARL,qBATA,oBACE,oBACE,oBACD,oBACE,oBACA,oBACA,oBACH,oBACP,iBATK,4GARA,oBACG,oBACH,oBACC,oBACD,oBACW,oBACX,oBACC,aARG,qBART,mBACI,mBACD,mBACE,mBACH,mBACD,mBACA,mBACG,aARG,iDARA,mBACJ,mBACE,mBACC,mBACN,mBACK,mBACL,mBACC,YARM,oBATE,mBACA,mBACH,mBACF,mBACG,mBACJ,mBACA,mBACG,mBACD,eATI,8EARF,mBACG,mBACJ,mBACA,mBACH,mBACG,mBACE,mBACC,YARJ,oBARF,mBACH,mBACI,mBACA,mBACK,mBACL,mBACC,mBACD,aARA,iDARE,mBACL,mBACI,mBACA,mBACC,mBACD,mBACJ,mBACS,YARV,oBATK,mBACG,mBACR,mBACM,mBACL,mBACA,mBACC,mBACD,mBACS,gBA2IS,KAAxB,OAAwB,eAAkC,mBAAC,C,GAzS/C,udAmJF,KADL,KADI,KADL,KADA,KADC,KADG,KADH,KADC,KADH,KADD,KADM,KADE,KADP,KADK,KADA,KADA,KADF,KADD,KADA,KADE,KADA,KADE,KADJ,KADK,KADF,KADA,KADN,KADG,KADI,KADN,KADA,KADA,KADK,KADC,KADG,KADA,KADJ,KADI,KADP,KADG,KADH,KADG,KADJ,KADE,KADH,KADO,KADH,KADC,KADA,KADG,KADG,KADA,KADE,KADF,KADD,KADF,KADA,KADF,KADM,KADV,KADC,KADF,KADI,KADL,KADO,KADG,KADA,KADA,KADF,KADC,KADF,KADF,KADA,KADC,KADD,KADW,KADX,KADC,KADD,KADG,KADH,KADI,KADL,KADH,KADA,KADC,KADG,KADF,KADC,KAFG,KADN,KAED,KAHA,KADK,KADL,KADM,KADD,KADF,KADI,KADA,KADF,KADC,KADH,KADA,KADI,KADH,KADE,KADG,KADA,KADA,KADA,KADD,KADF,KADH,KADG,KADA,KADI,KADH,KADF,KADD,KADC,KADD,KADK,KADL,KADA,KADJ,KADG,KADC,KADM,KADT,KADI,KADC,KADD,KADA,KADJ,KADK,KADN,KADU,KADT,KADC,KADD,KADA,KADK,KADN,KADQ,KADH,GAkJe,C,EChUlC,qF,QAAA,4D,QAAA,6E,QAAA,8F,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":116769},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/console.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\nclass type console = object\n method log : _ -> unit meth\n\n method log_2 : _ -> _ -> unit meth\n\n method log_3 : _ -> _ -> _ -> unit meth\n\n method log_4 : _ -> _ -> _ -> _ -> unit meth\n\n method log_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method log_6 : _ -> _ -> _ -> _ -> _ -> _ -> unit meth\n\n method log_7 : _ -> _ -> _ -> _ -> _ -> _ -> _ -> unit meth\n\n method log_8 : _ -> _ -> _ -> _ -> _ -> _ -> _ -> _ -> unit meth\n\n method debug : _ -> unit meth\n\n method debug_2 : _ -> _ -> unit meth\n\n method debug_3 : _ -> _ -> _ -> unit meth\n\n method debug_4 : _ -> _ -> _ -> _ -> unit meth\n\n method debug_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method info : _ -> unit meth\n\n method info_2 : _ -> _ -> unit meth\n\n method info_3 : _ -> _ -> _ -> unit meth\n\n method info_4 : _ -> _ -> _ -> _ -> unit meth\n\n method info_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method warn : _ -> unit meth\n\n method warn_2 : _ -> _ -> unit meth\n\n method warn_3 : _ -> _ -> _ -> unit meth\n\n method warn_4 : _ -> _ -> _ -> _ -> unit meth\n\n method warn_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method error : _ -> unit meth\n\n method error_2 : _ -> _ -> unit meth\n\n method error_3 : _ -> _ -> _ -> unit meth\n\n method error_4 : _ -> _ -> _ -> _ -> unit meth\n\n method error_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method assert_ : bool t -> unit meth\n\n method assert_1 : bool t -> _ -> unit meth\n\n method assert_2 : bool t -> _ -> _ -> unit meth\n\n method assert_3 : bool t -> _ -> _ -> _ -> unit meth\n\n method assert_4 : bool t -> _ -> _ -> _ -> _ -> unit meth\n\n method assert_5 : bool t -> _ -> _ -> _ -> _ -> _ -> unit meth\n\n method dir : _ -> unit meth\n\n method dirxml : Dom.node t -> unit meth\n\n method trace : unit meth\n\n method group : _ -> unit meth\n\n method group_2 : _ -> _ -> unit meth\n\n method group_3 : _ -> _ -> _ -> unit meth\n\n method group_4 : _ -> _ -> _ -> _ -> unit meth\n\n method group_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method groupCollapsed : _ -> unit meth\n\n method groupCollapsed_2 : _ -> _ -> unit meth\n\n method groupCollapsed_3 : _ -> _ -> _ -> unit meth\n\n method groupCollapsed_4 : _ -> _ -> _ -> _ -> unit meth\n\n method groupCollapsed_5 : _ -> _ -> _ -> _ -> _ -> unit meth\n\n method groupEnd : unit meth\n\n method time : js_string t -> unit meth\n\n method timeEnd : js_string t -> unit meth\nend\n\nexternal get_console : unit -> console t = \"caml_js_get_console\"\n\nlet console = get_console ()\n"],"names":[],"mappings":"EA+H4B,IAAd,OAAc"}},{"offset":{"line":0,"column":116794},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/dom_events.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2010 Jérôme Vouillon\n * Laboratoire PPS - CNRS Université Paris Diderot\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\n(** Javascript events. *)\n\nopen! Import\nmodule Typ = Dom_html.Event\n\ntype listener = Dom_html.event_listener_id\n\nlet listen ?(capture = false) target typ cb =\n Dom_html.addEventListener\n target\n typ\n (Dom_html.full_handler (fun n e -> Js.bool (cb n e)))\n (Js.bool capture)\n\nlet stop_listen = Dom_html.removeEventListener\n","(* generated code *)"],"names":[],"mappings":"EA+B+C,gBAAR,EAAgB,C,EAJ5C,UAAY,gBAKnB,IADqD,IACpC,mBADjB,aAAqD,uBACpC,C,EChCrB,mC,QAAA,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":117182},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/dom_svg.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2014 Hugo Heuzard\n * Copyright (C) 2014 Jérôme Vouillon\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nopen Js\nopen! Import\n\nlet xmlns = Js.string \"http://www.w3.org/2000/svg\"\n\n(* translate spec from http://www.w3.org/TR/SVG/idl.html *)\n(* http://www.w3.org/TR/SVG/struct.html *)\n\ntype error_code =\n | WRONG_TYPE_ERR\n | INVALID_VALUE_ERR\n | MATRIX_NOT_INVERTABLE\n\nclass type svg_error = object\n inherit Js.error\n\n method code : error_code t readonly_prop\nend\n\nexception SVGError of svg_error\n\ntype lengthUnitType =\n | LENGTHTYPE_UNKNOWN\n | LENGTHTYPE_NUMBER\n | LENGTHTYPE_PERCENTAGE\n | LENGTHTYPE_EMS\n | LENGTHTYPE_EXS\n | LENGTHTYPE_PX\n | LENGTHTYPE_CM\n | LENGTHTYPE_MM\n | LENGTHTYPE_IN\n | LENGTHTYPE_PT\n | LENGTHTYPE_PC\n\ntype angleUnitType =\n | ANGLETYPE_UNKNOWN\n | ANGLETYPE_UNSPECIFIED\n | ANGLETYPE_DEG\n | ANGLETYPE_RAD\n | ANGLETYPE_GRAD\n\ntype colorType =\n | COLORTYPE_UNKNOWN\n | COLORTYPE_RGBCOLOR\n | COLORTYPE_RGBCOLOR_ICCCOLOR\n | COLORTYPE_CURRENTCOLOR\n\ntype alignmentType =\n | PRESERVEASPECTRATIO_UNKNOWN\n | PRESERVEASPECTRATIO_NONE\n | PRESERVEASPECTRATIO_XMINYMIN\n | PRESERVEASPECTRATIO_XMIDYMIN\n | PRESERVEASPECTRATIO_XMAXYMIN\n | PRESERVEASPECTRATIO_XMINYMID\n | PRESERVEASPECTRATIO_XMIDYMID\n | PRESERVEASPECTRATIO_XMAXYMID\n | PRESERVEASPECTRATIO_XMINYMAX\n | PRESERVEASPECTRATIO_XMIDYMAX\n | PRESERVEASPECTRATIO_XMAXYMAX\n\ntype meetOrSliceType =\n | MEETORSLICE_UNKNOWN\n | MEETORSLICE_MEET\n | MEETORSLICE_SLICE\n\ntype transformType =\n | TRANSFORM_UNKNOWN\n | TRANSFORM_MATRIX\n | TRANSFORM_TRANSLATE\n | TRANSFORM_SCALE\n | TRANSFORM_ROTATE\n | TRANSFORM_SKEWX\n | TRANSFORM_SKEWY\n\ntype zoomAndPanType =\n | ZOOMANDPAN_UNKNOWN\n | ZOOMANDPAN_DISABLE\n | ZOOMANDPAN_MAGNIFY\n\ntype lengthAdjust =\n | LENGTHADJUST_UNKNOWN\n | LENGTHADJUST_SPACING\n | LENGTHADJUST_SPACINGANDGLYPHS\n\ntype unitType =\n | UNIT_TYPE_UNKNOWN\n | UNIT_TYPE_USERSPACEONUSE\n | UNIT_TYPE_OBJECTBOUNDINGBOX\n\n(* interface SVGRenderingIntent *)\ntype intentType =\n | RENDERING_INTENT_UNKNOWN\n | RENDERING_INTENT_AUTO\n | RENDERING_INTENT_PERCEPTUAL\n | RENDERING_INTENT_RELATIVE_COLORIMETRIC\n | RENDERING_INTENT_SATURATION\n | RENDERING_INTENT_ABSOLUTE_COLORIMETRIC\n\n(* Path Segment Types *)\ntype pathSegmentType =\n | PATHSEG_UNKNOWN\n | PATHSEG_CLOSEPATH\n | PATHSEG_MOVETO_ABS\n | PATHSEG_MOVETO_REL\n | PATHSEG_LINETO_ABS\n | PATHSEG_LINETO_REL\n | PATHSEG_CURVETO_CUBIC_ABS\n | PATHSEG_CURVETO_CUBIC_REL\n | PATHSEG_CURVETO_QUADRATIC_ABS\n | PATHSEG_CURVETO_QUADRATIC_REL\n | PATHSEG_ARC_ABS\n | PATHSEG_ARC_REL\n | PATHSEG_LINETO_HORIZONTAL_ABS\n | PATHSEG_LINETO_HORIZONTAL_REL\n | PATHSEG_LINETO_VERTICAL_ABS\n | PATHSEG_LINETO_VERTICAL_REL\n | PATHSEG_CURVETO_CUBIC_SMOOTH_ABS\n | PATHSEG_CURVETO_CUBIC_SMOOTH_REL\n | PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS\n | PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL\n\n(* textPath Method Types *)\ntype textPathMethodType =\n | TEXTPATH_METHODTYPE_UNKNOWN\n | TEXTPATH_METHODTYPE_ALIGN\n | TEXTPATH_METHODTYPE_STRETCH\n\n(* textPath Spacing Types *)\ntype textPathSpacingType =\n | TEXTPATH_SPACINGTYPE_UNKNOWN\n | TEXTPATH_SPACINGTYPE_AUTO\n | TEXTPATH_SPACINGTYPE_EXACT\n\n(* Spread Method Types *)\ntype spreadMethodType =\n | SPREADMETHOD_UNKNOWN\n | SPREADMETHOD_PAD\n | SPREADMETHOD_REFLECT\n | SPREADMETHOD_REPEAT\n\ntype suspendHandleID\n\n(****)\n\nclass type ['a] animated = object\n method baseVal : 'a prop\n\n method animVal : 'a prop\nend\n\nclass type ['a] list = object\n method numberOfItems : int readonly_prop\n\n method clear : unit meth\n\n method initialize : 'a -> 'a meth\n\n method getItem : int -> 'a meth\n\n method insertItemBefore : 'a -> int -> 'a meth\n\n method replaceItem : 'a -> int -> 'a meth\n\n method removeItem : int -> 'a meth\n\n method appendItem : 'a -> 'a meth\nend\n\n(****)\n\n(* interface SVGElement *)\nclass type element = object\n inherit Dom.element\n\n method id : js_string t prop\n\n method xmlbase : js_string t prop\n\n method ownerSVGElement : svgElement t readonly_prop\n\n method viewportElement : element t readonly_prop\nend\n\n(* interface SVGAnimatedString *)\nand animatedString = [js_string t] animated\n\n(* interface SVGAnimatedBoolean *)\nand animatedBoolean = [bool t] animated\n\n(* interface SVGStringList *)\nand stringList = [js_string t] list\n\n(* interface SVGAnimatedEnumeration *)\nand animatedEnumeration = [int (*short*)] animated\n\n(* interface SVGAnimatedInteger *)\nand animatedInteger = [int] animated\n\n(* interface SVGAnimatedNumber *)\nand animatedNumber = [number_t] animated\n\n(* interface SVGNumberList *)\nand numberList = [number_t] list\n\n(* interface SVGAnimatedNumberList *)\nand animatedNumberList = [numberList t] animated\n\n(* interface SVGLength *)\nand length = object\n method unitType : lengthUnitType readonly_prop\n\n method value : number_t prop\n\n method valueInSpecifiedUnits : number_t prop\n\n method valueAsString : js_string t prop\n\n method newValueSpecifiedUnits : lengthUnitType -> number_t -> unit meth\n\n method convertToSpecifiedUnits : lengthUnitType -> unit meth\nend\n\n(* interface SVGAnimatedLength *)\nand animatedLength = [length t] animated\n\n(* interface SVGLengthList *)\nand lengthList = [length t] list\n\n(* interface SVGAnimatedLengthList *)\nand animatedLengthList = [lengthList t] animated\n\n(* interface SVGAngle *)\nand angle = object\n method unitType : angleUnitType readonly_prop\n\n method value : number_t prop\n\n method valueInSpecifiedUnits : number_t prop\n\n method valueAsString : js_string t prop\n\n method newValueSpecifiedUnits : angleUnitType -> number_t -> unit meth\n\n method convertToSpecifiedUnits : angleUnitType -> unit meth\nend\n\n(* interface SVGAnimatedAngle *)\nand animatedAngle = [angle t] animated\n\n(* XXXXX Move it *)\nand rgbColor = object end\n\n(* interface SVGColor *)\nand color = object\n (* XXX inherit cssValue *)\n method colorType : colorType readonly_prop\n\n method rgbColor : rgbColor t readonly_prop\n\n method iccColor : iccColor t readonly_prop\n\n method setRGBColor : js_string t -> unit meth\n\n method setRGBColorICCColor : js_string t -> js_string t -> unit meth\n\n method setColor : colorType -> js_string t -> js_string t -> unit meth\nend\n\n(* interface SVGICCColor *)\nand iccColor = object\n method colorProfile : js_string t prop\n\n method colors : numberList t readonly_prop\nend\n\n(* interface SVGRect *)\nand rect = object\n method x : number_t prop\n\n method y : number_t prop\n\n method width : number_t prop\n\n method height : number_t prop\nend\n\n(* interface SVGAnimatedRect *)\nand animatedRect = [rect t] animated\n\n(* interface SVGStylable *)\nand stylable = object\n method className : animatedString t readonly_prop\n\n method style : Dom_html.cssStyleDeclaration t readonly_prop\n (* CSSValue getPresentationAttribute(in DOMString name); *)\nend\n\n(* interface SVGLocatable *)\nand locatable = object\n method nearestViewportElement : element t readonly_prop\n\n method farthestViewportElement : element t readonly_prop\n\n method getBBox : rect t meth\n\n method getCTM : matrix t meth\n\n method getScreenCTM : matrix t meth\n\n method getTransformToElement : element t -> matrix t meth\nend\n\n(* interface SVGTransformable *)\nand transformable = object\n inherit locatable\n\n method transform : animatedTransformList t readonly_prop\nend\n\n(* interface SVGTests *)\nand tests = object\n method requiredFeatures : stringList t readonly_prop\n\n method requiredExtensions : stringList t readonly_prop\n\n method systemLanguage : stringList t readonly_prop\n\n method hasExtension : js_string t -> bool t meth\nend\n\n(* interface SVGLangSpace *)\nand langSpace = object\n method xmllang : js_string t prop\n\n method xmlspace : js_string t prop\nend\n\n(* interface SVGExternalResourcesRequired *)\nand externalResourcesRequired = object\n method externalResourcesRequired : animatedBoolean t readonly_prop\nend\n\n(* interface SVGFitToViewBox *)\nand fitToViewBox = object\n method viewBox : animatedRect t readonly_prop\n\n method preserveAspectRatio : animatedPreserveAspectRatio t readonly_prop\nend\n\n(* interface SVGZoomAndPan *)\nand zoomAndPan = object\n method zoomAndPan : zoomAndPanType prop\nend\n\n(* interface SVGViewSpec *)\nand viewSpec = object\n inherit zoomAndPan\n\n inherit fitToViewBox\n\n method transform : transformList t readonly_prop\n\n method viewTarget : element t readonly_prop\n\n method viewBoxString : js_string t readonly_prop\n\n method preserveAspectRatioString : js_string t readonly_prop\n\n method transformString : js_string t readonly_prop\n\n method viewTargetString : js_string t readonly_prop\nend\n\n(* interface SVGURIReference *)\nand uriReference = object\n method href : animatedString t readonly_prop\nend\n\n(* interface SVGCSSRule : CSSRule *)\n(* const unsigned short COLOR_PROFILE_RULE = 7; *)\n(* }; *)\n\n(* interface SVGDocument *)\nand document = object\n inherit [element] Dom.document\n\n (*XXX inherit documentEvent *)\n method title : js_string t prop\n\n method referrer : js_string t readonly_prop\n\n method domain : js_string t prop\n\n method _URL : js_string t readonly_prop\n\n method rootElement : svgElement t opt readonly_prop\n (* rootElement will be null or undefined in an html context *)\nend\n\n(* interface SVGSVGElement *)\nand svgElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit locatable\n\n inherit fitToViewBox\n\n inherit zoomAndPan\n\n (*XXX inherit documentevent, viewcss, documentcss *)\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\n\n method contentScriptType : js_string t prop\n\n method contentStyleType : js_string t prop\n\n method viewport : rect t readonly_prop\n\n method pixelUnitToMillimeterX : number_t readonly_prop\n\n method pixelUnitToMillimeterY : number_t readonly_prop\n\n method screenPixelUnitToMillimeterX : number_t readonly_prop\n\n method screenPixelUnitToMillimeterY : number_t readonly_prop\n\n method useCurrentView : bool t readonly_prop\n\n method currentView : viewSpec t readonly_prop\n\n method currentScale : number_t prop\n\n method currentTranslate : point t readonly_prop\n\n method suspendRedraw : int -> suspendHandleID meth\n\n method unsuspendRedraw : suspendHandleID -> unit meth\n\n method unsuspendRedrawAll : unit meth\n\n method forceRedraw : unit meth\n\n method pauseAnimations : unit meth\n\n method unpauseAnimations : unit meth\n\n method animationsPaused : bool t meth\n\n method getCurrentTime : number_t meth\n\n method setCurrentTime : int -> unit meth\n\n method getIntersectionList : rect t -> element t -> element Dom.nodeList t meth\n\n method getEnclosureList : rect t -> element t -> element Dom.nodeList t meth\n\n method checkIntersection : element t -> rect t -> bool t\n\n method checkEnclosure : element t -> rect t -> bool t\n\n method deselectAll : unit meth\n\n method createSVGNumber : number t meth\n\n method createSVGLength : length t meth\n\n method createSVGAngle : angle t meth\n\n method createSVGPoint : point t meth\n\n method createSVGMatrix : matrix t meth\n\n method createSVGRect : rect t meth\n\n method createSVGTransform : transform t meth\n\n method createSVGTransformFromMatrix : matrix t -> transform t meth\n\n method getElementById : js_string t -> Dom.element t meth\nend\n\n(* interface SVGGElement *)\nand gElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n inherit Dom_html.eventTarget\nend\n\n(* interface SVGDefsElement *)\nand defsElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n (* XXXXXXX ? inherit Dom_html.eventTarget *)\nend\n\n(* interface SVGDescElement *)\nand descElement = object\n inherit element\n\n inherit langSpace\n\n inherit stylable\n (* XXXXXXX ? inherit Dom_html.eventTarget *)\nend\n\n(* interface SVGTitleElement *)\nand titleElement = object\n inherit element\n\n inherit langSpace\n\n inherit stylable\nend\n\n(* interface SVGSymbolElement *)\nand symbolElement = object\n inherit element\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit fitToViewBox\n\n inherit Dom_html.eventTarget\nend\n\n(* interface SVGUseElement *)\nand useElement = object\n inherit element\n\n inherit uriReference\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\n\n method instanceRoot : elementInstance t readonly_prop\n\n method animatedInstanceRoot : elementInstance t readonly_prop\nend\n\nand elementInstance = object\n inherit Dom_html.eventTarget\n\n method correspondingElement : element t readonly_prop\n\n method correspondingUseElement : useElement t readonly_prop\n\n method parentNode : elementInstance t readonly_prop\n\n method childNodes : elementInstanceList t readonly_prop\n\n method firstChild : elementInstance t readonly_prop\n\n method lastChild : elementInstance t readonly_prop\n\n method previousSibling : elementInstance t readonly_prop\n\n method nextSibling : elementInstance t readonly_prop\nend\n\n(* interface SVGElementInstanceList *)\nand elementInstanceList = object\n method length : int readonly_prop\n\n method item : int -> elementInstance t\nend\n\n(* interface SVGImageElement *)\nand imageElement = object\n inherit element\n\n inherit uriReference\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\n (* readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio *)\nend\n\nand switchElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\nend\n\n(* XXX deprecated => interface GetSVGDocument => SVGDocument getSVGDocument() *)\n\n(* interface SVGStyleElement *)\nand styleElement = object\n inherit element\n\n inherit langSpace\n\n method type_ : js_string t prop\n\n method media : js_string t prop\n\n method title : js_string t prop\nend\n\n(* interface SVGPoint *)\nand point = object\n method x : number_t readonly_prop\n\n method y : number_t readonly_prop\n\n method matrixTransform : matrix t -> point t meth\nend\n\n(* interface SVGPointList *)\nand pointList = [point t] list\n\n(* interface SVGMatrix *)\nand matrix = object\n method a : number_t readonly_prop\n\n method b : number_t readonly_prop\n\n method c : number_t readonly_prop\n\n method d : number_t readonly_prop\n\n method e : number_t readonly_prop\n\n method f : number_t readonly_prop\n\n method multiply : matrix t -> matrix t meth\n\n method inverse : matrix t meth\n\n method translate : number_t -> number_t -> matrix t meth\n\n method scale : number_t -> matrix t meth\n\n method scaleNonUniform : number_t -> number_t -> matrix t meth\n\n method rotate : number_t -> matrix t meth\n\n method rotateFromVector : number_t -> number_t -> matrix t meth\n\n method flipX : matrix t meth\n\n method flipY : matrix t meth\n\n method skewX : number_t -> matrix t meth\n\n method skewY : number_t -> matrix t meth\nend\n\n(* interface SVGTransform *)\nand transform = object\n method _type : transformType readonly_prop\n\n method matrix : matrix t readonly_prop\n\n method angle : number_t readonly_prop\n\n method setMatrix : matrix t -> unit meth\n\n method setTranslate : number_t -> number_t -> unit meth\n\n method setScale : number_t -> number_t -> unit meth\n\n method setRotate : number_t -> number_t -> number_t -> unit meth\n\n method setSkewX : number_t -> unit meth\n\n method setSkewY : number_t -> unit meth\nend\n\n(* interface SVGTransformList *)\nand transformList = object\n inherit [transform t] list\n\n method createSVGTransformFromMatrix : matrix -> transform t meth\n\n method consolidate : transform t meth\nend\n\n(* interface SVGAnimatedTransformList *)\nand animatedTransformList = [transformList t] animated\n\n(* interface SVGPreserveAspectRatio *)\nand preserveAspectRatio = object\n method align : alignmentType readonly_prop\n\n method meetOrSlice : meetOrSliceType readonly_prop\nend\n\n(* interface SVGAnimatedPreserveAspectRatio *)\nand animatedPreserveAspectRatio = [preserveAspectRatio t] animated\n\n(* interface SVGPathSeg *)\nand pathSeg = object\n method pathSegType : pathSegmentType readonly_prop\n\n method pathSegTypeAsLetter : js_string t readonly_prop\nend\n\n(* interface SVGPathSegClosePath *)\nand pathSegClosePath = pathSeg\n\n(* interface SVGPathSegMovetoAbs *)\n(* interface SVGPathSegMovetoRel *)\nand pathSegMoveto = object\n inherit pathSeg\n\n method x : number_t prop\n\n method y : number_t prop\nend\n\n(* interface SVGPathSegLinetoAbs *)\n(* interface SVGPathSegLinetoRel *)\nand pathSegLineto = object\n inherit pathSeg\n\n method x : number_t prop\n\n method y : number_t prop\nend\n\n(* interface SVGPathSegCurvetoCubicAbs *)\n(* interface SVGPathSegCurvetoCubicRel *)\nand pathSegCurvetoCubic = object\n inherit pathSeg\n\n method x : number_t prop\n\n method y : number_t prop\n\n method x1 : number_t prop\n\n method y1 : number_t prop\n\n method x2 : number_t prop\n\n method y2 : number_t prop\nend\n\n(* interface SVGPathSegCurvetoQuadraticAbs *)\n(* interface SVGPathSegCurvetoQuadraticRel *)\nand pathSegCurvetoQuadratic = object\n inherit pathSeg\n\n method x : number_t prop\n\n method y : number_t prop\n\n method x1 : number_t prop\n\n method y1 : number_t prop\nend\n\n(* interface SVGPathSegArcAbs *)\n(* interface SVGPathSegArcRel*)\nand pathSegArc = object\n inherit pathSeg\n\n method y : number_t prop\n\n method r1 : number_t prop\n\n method r2 : number_t prop\n\n method angle : number_t prop\n\n method largeArcFlag : bool t prop\n\n method sweepFlag : bool t prop\nend\n\n(* interface SVGPathSegLinetoHorizontalAbs *)\n(* interface SVGPathSegLinetoHorizontalRel *)\nand pathSegLinetoHorizontal = object\n inherit pathSeg\n\n method x : number_t\nend\n\n(* interface SVGPathSegLinetoVerticalAbs *)\n(* interface SVGPathSegLinetoVerticalRel *)\nand pathSegLinetoVertical = object\n inherit pathSeg\n\n method y : number_t\nend\n\nand pathSegCurvetoCubicSmooth = object\n inherit pathSeg\n\n method x : number_t\n\n method y : number_t\n\n method x2 : number_t\n\n method y2 : number_t\nend\n\n(* interface SVGPathSegCurvetoQuadraticSmoothAbs *)\n(* interface SVGPathSegCurvetoQuadraticSmoothRel *)\nand pathSegCurvetoQuadraticSmooth = object\n inherit pathSeg\n\n method x : number_t\n\n method y : number_t\nend\n\nand pathSegList = [pathSeg t] list\n\n(* interface SVGAnimatedPathData *)\nand animatedPathData = object\n method pathSegList : pathSegList t prop\n\n method normalizedPathSegList : pathSegList t prop\n\n method animatedPathSegList : pathSegList t prop\n\n method animatedNormalizedPathSegList : pathSegList t prop\nend\n\n(* interface SVGPathElement *)\nand pathElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n inherit animatedPathData\n\n method pathLength : animatedNumber t readonly_prop\n\n method getTotalLength : number_t meth\n\n method getPointAtLength : number_t -> point t meth\n\n method getPathSegAtLength : number_t -> int\n\n method createSVGPathSegClosePath : pathSegClosePath meth\n\n method createSVGPathSegMovetoAbs : number_t -> number_t -> pathSegMoveto meth\n\n method createSVGPathSegMovetoRel : number_t -> number_t -> pathSegMoveto meth\n\n method createSVGPathSegLinetoAbs : number_t -> number_t -> pathSegLineto meth\n\n method createSVGPathSegLinetoRel : number_t -> number_t -> pathSegLineto meth\n\n method createSVGPathSegCurvetoCubicAbs :\n number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> pathSegCurvetoCubic meth\n\n method createSVGPathSegCurvetoCubicRel :\n number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> pathSegCurvetoCubic meth\n\n method createSVGPathSegCurvetoQuadraticAbs :\n number_t -> number_t -> number_t -> number_t -> pathSegCurvetoQuadratic meth\n\n method createSVGPathSegCurvetoQuadraticRel :\n number_t -> number_t -> number_t -> number_t -> pathSegCurvetoQuadratic meth\n\n method createSVGPathSegArcAbs :\n number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> bool t\n -> bool t\n -> pathSegArc meth\n\n method createSVGPathSegArcRel :\n number_t\n -> number_t\n -> number_t\n -> number_t\n -> number_t\n -> bool t\n -> bool t\n -> pathSegArc meth\n\n method createSVGPathSegLinetoHorizontalAbs : number_t -> pathSegLinetoHorizontal meth\n\n method createSVGPathSegLinetoHorizontalRel : number_t -> pathSegLinetoHorizontal meth\n\n method createSVGPathSegLinetoVerticalAbs : number_t -> pathSegLinetoVertical meth\n\n method createSVGPathSegLinetoVerticalRel : number_t -> pathSegLinetoVertical meth\n\n method createSVGPathSegCurvetoCubicSmoothAbs :\n number_t -> number_t -> number_t -> number_t -> pathSegCurvetoCubicSmooth meth\n\n method createSVGPathSegCurvetoCubicSmoothRel :\n number_t -> number_t -> number_t -> number_t -> pathSegCurvetoCubicSmooth meth\n\n method createSVGPathSegCurvetoQuadraticSmoothAbs :\n number_t -> number_t -> pathSegCurvetoQuadraticSmooth meth\n\n method createSVGPathSegCurvetoQuadraticSmoothRel :\n number_t -> number_t -> pathSegCurvetoQuadraticSmooth meth\nend\n\n(* interface SVGRectElement *)\nand rectElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\n\n method rx : animatedLength t readonly_prop\n\n method ry : animatedLength t readonly_prop\nend\n\n(* interface SVGCircleElement *)\nand circleElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method cx : animatedLength t readonly_prop\n\n method cy : animatedLength t readonly_prop\n\n method r : animatedLength t readonly_prop\nend\n\n(* interface SVGEllipseElement *)\nand ellipseElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method cx : animatedLength t readonly_prop\n\n method cy : animatedLength t readonly_prop\n\n method rx : animatedLength t readonly_prop\n\n method ry : animatedLength t readonly_prop\nend\n\n(* interface SVGLineElement *)\nclass type lineElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n inherit Dom_html.eventTarget\n\n method x1 : animatedLength t readonly_prop\n\n method y1 : animatedLength t readonly_prop\n\n method x2 : animatedLength t readonly_prop\n\n method y2 : animatedLength t readonly_prop\nend\n\n(* interface SVGAnimatedPoints *)\nand animatedPoints = object\n method points : pointList t readonly_prop\n\n method animatedpoints : pointList t readonly_prop\nend\n\n(* interface SVGPolylineElement *)\nand polyLineElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n inherit animatedPoints\nend\n\n(* interface SVGPolygonElement *)\nand polygonElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n inherit animatedPoints\nend\n\n(* interface SVGTextContentElement *)\nand textContentElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit Dom_html.eventTarget\n\n method textLength : animatedLength t readonly_prop\n\n method lengthAdjust : lengthAdjust animated t readonly_prop\n\n method getNumberOfChars : int meth\n\n method getComputedTextLength : number_t meth\n\n method getSubStringLength : int -> int -> number_t meth\n\n method getStartPositionOfChar : int -> point t meth\n\n method getEndPositionOfChar : int -> point t meth\n\n method getExtentOfChar : int -> rect t meth\n\n method getRotationOfChar : int -> number_t meth\n\n method getCharNumAtPosition : point -> int meth\n\n method selectSubString : int -> int -> unit meth\nend\n\n(* interface SVGTextPositioningElement *)\nand textPositioningElement = object\n inherit textContentElement\n\n method x : animatedLengthList t readonly_prop\n\n method y : animatedLengthList t readonly_prop\n\n method dx : animatedLengthList t readonly_prop\n\n method dy : animatedLengthList t readonly_prop\n\n method rotate : animatedNumberList t readonly_prop\nend\n\n(* interface SVGTextElement *)\nand textElement = object\n inherit textPositioningElement\n\n inherit transformable\nend\n\nand tspanElement = textPositioningElement\n\nand trefElement = object\n inherit textPositioningElement\n\n inherit uriReference\nend\n\n(* interface SVGTextPathElement *)\nand textPathElementMethod = [textPathMethodType] animated\n\nand textPathElementSpacing = [textPathSpacingType] animated\n\nand textPathElement = object\n inherit textContentElement\n\n inherit uriReference\n\n method startOffset : animatedLength t readonly_prop\n\n method method_ : textPathElementMethod readonly_prop\n\n method spacing : textPathElementSpacing readonly_prop\nend\n\n(* interface SVGAltGlyphElement *)\nand altGlyphElement = object\n inherit textPositioningElement\n\n inherit uriReference\n\n method glyphRef : js_string t prop\n\n method format : js_string t prop\nend\n\n(* interface SVGAltGlyphDefElement *)\nand altGlyphDefElement = element\n\n(* interface SVGAltGlyphItemElement *)\nand altGlyphItemElement = element\n\n(* interface SVGGlyphRefElement *)\nand glyphRefElement = object\n inherit element\n\n inherit uriReference\n\n inherit stylable\n\n method glyphRef : js_string t prop\n\n method format : js_string t prop\n\n method x : number_t prop\n\n method y : number_t prop\n\n method dx : number_t prop\n\n method dy : number_t prop\nend\n\n(* interface SVGPaint : SVGColor { *)\n\n(* // Paint Types *)\n(* const unsigned short SVG_PAINTTYPE_UNKNOWN = 0; *)\n(* const unsigned short SVG_PAINTTYPE_RGBCOLOR = 1; *)\n(* const unsigned short SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2; *)\n(* const unsigned short SVG_PAINTTYPE_NONE = 101; *)\n(* const unsigned short SVG_PAINTTYPE_CURRENTCOLOR = 102; *)\n(* const unsigned short SVG_PAINTTYPE_URI_NONE = 103; *)\n(* const unsigned short SVG_PAINTTYPE_URI_CURRENTCOLOR = 104; *)\n(* const unsigned short SVG_PAINTTYPE_URI_RGBCOLOR = 105; *)\n(* const unsigned short SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106; *)\n(* const unsigned short SVG_PAINTTYPE_URI = 107; *)\n\n(* readonly attribute unsigned short paintType; *)\n(* readonly attribute DOMString uri; *)\n\n(* void setUri(in DOMString uri); *)\n(* void setPaint(in unsigned short paintType, in DOMString uri, in DOMString rgbColor, in DOMString iccColor) raises(SVGException); *)\n(* }; *)\n\n(* interface SVGMarkerElement : SVGElement, *)\n(* SVGLangSpace, *)\n(* SVGExternalResourcesRequired, *)\n(* SVGStylable, *)\n(* SVGFitToViewBox { *)\n\n(* // Marker Unit Types *)\n(* const unsigned short SVG_MARKERUNITS_UNKNOWN = 0; *)\n(* const unsigned short SVG_MARKERUNITS_USERSPACEONUSE = 1; *)\n(* const unsigned short SVG_MARKERUNITS_STROKEWIDTH = 2; *)\n\n(* // Marker Orientation Types *)\n(* const unsigned short SVG_MARKER_ORIENT_UNKNOWN = 0; *)\n(* const unsigned short SVG_MARKER_ORIENT_AUTO = 1; *)\n(* const unsigned short SVG_MARKER_ORIENT_ANGLE = 2; *)\n\n(* readonly attribute SVGAnimatedLength refX; *)\n(* readonly attribute SVGAnimatedLength refY; *)\n(* readonly attribute SVGAnimatedEnumeration markerUnits; *)\n(* readonly attribute SVGAnimatedLength markerWidth; *)\n(* readonly attribute SVGAnimatedLength markerHeight; *)\n(* readonly attribute SVGAnimatedEnumeration orientType; *)\n(* readonly attribute SVGAnimatedAngle orientAngle; *)\n\n(* void setOrientToAuto() raises(DOMException); *)\n(* void setOrientToAngle(in SVGAngle angle) raises(DOMException); *)\n(* }; *)\n\n(* interface SVGColorProfileElement : SVGElement, *)\n(* SVGURIReference, *)\n(* SVGRenderingIntent { *)\n(* attribute DOMString local; *)\n(* attribute DOMString name; *)\n(* attribute unsigned short renderingIntent; *)\n(* }; *)\n\n(* interface SVGColorProfileRule : SVGCSSRule, *)\n(* SVGRenderingIntent { *)\n(* attribute DOMString src setraises(DOMException); *)\n(* attribute DOMString name setraises(DOMException); *)\n(* attribute unsigned short renderingIntent setraises(DOMException); *)\n(* }; *)\n\n(* interface SVGGradientElement *)\nand animatedSpreadMethod = [spreadMethodType] animated\n\nand gradientElement = object\n inherit element\n\n inherit uriReference\n\n inherit stylable\n\n (* readonly attribute SVGAnimatedEnumeration gradientUnits; *)\n method gradientTransform : animatedTransformList t readonly_prop\n\n method spreadMethod : animatedSpreadMethod t readonly_prop\nend\n\n(* interface SVGLinearGradientElement *)\nand linearGradientElement = object\n inherit gradientElement\n\n method x1 : animatedLength t readonly_prop\n\n method y1 : animatedLength t readonly_prop\n\n method x2 : animatedLength t readonly_prop\n\n method y2 : animatedLength t readonly_prop\nend\n\n(* interface SVGRadialGradientElement *)\nand radialGradientElement = object\n inherit gradientElement\n\n method cx : animatedLength t readonly_prop\n\n method cy : animatedLength t readonly_prop\n\n method r : animatedLength t readonly_prop\n\n method fx : animatedLength t readonly_prop\n\n method fy : animatedLength t readonly_prop\nend\n\n(* interface SVGStopElement *)\nand stopElement = object\n inherit element\n\n inherit stylable\n\n method offset : animatedNumber t readonly_prop\nend\n\n(* interface SVGPatternElement *)\nand patternElement = object\n inherit element\n\n inherit uriReference\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit fitToViewBox\n\n (* readonly attribute SVGAnimatedEnumeration patternUnits; *)\n (* readonly attribute SVGAnimatedEnumeration patternContentUnits; *)\n method patternTransform : animatedTransformList t readonly_prop\n\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\nend\n\n(* interface SVGClipPathElement *)\nand clipPathElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n (* readonly attribute SVGAnimatedEnumeration clipPathUnits; *)\nend\n\n(* interface SVGMaskElement *)\nand maskElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n (* readonly attribute SVGAnimatedEnumeration maskUnits; *)\n (* readonly attribute SVGAnimatedEnumeration maskContentUnits; *)\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\nend\n\n(* interface SVGFilterElement *)\nand filterElement = object\n inherit element\n\n inherit uriReference\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n (* readonly attribute SVGAnimatedEnumeration filterUnits; *)\n (* readonly attribute SVGAnimatedEnumeration primitiveUnits; *)\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\n\n method filterResX : animatedInteger t readonly_prop\n\n method filterResY : animatedInteger t readonly_prop\n\n method setFilterRes : int -> int -> unit meth\nend\n\n(* interface SVGFilterPrimitiveStandardAttributes : SVGStylable { *)\n(* readonly attribute SVGAnimatedLength x; *)\n(* readonly attribute SVGAnimatedLength y; *)\n(* readonly attribute SVGAnimatedLength width; *)\n(* readonly attribute SVGAnimatedLength height; *)\n(* readonly attribute SVGAnimatedString result; *)\n(* }; *)\n\n(* interface SVGFEBlendElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Blend Mode Types *)\n(* const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0; *)\n(* const unsigned short SVG_FEBLEND_MODE_NORMAL = 1; *)\n(* const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2; *)\n(* const unsigned short SVG_FEBLEND_MODE_SCREEN = 3; *)\n(* const unsigned short SVG_FEBLEND_MODE_DARKEN = 4; *)\n(* const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5; *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedString in2; *)\n(* readonly attribute SVGAnimatedEnumeration mode; *)\n(* }; *)\n\n(* interface SVGFEColorMatrixElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Color Matrix Types *)\n(* const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0; *)\n(* const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1; *)\n(* const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2; *)\n(* const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3; *)\n(* const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4; *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedEnumeration type; *)\n(* readonly attribute SVGAnimatedNumberList values; *)\n(* }; *)\n\n(* interface SVGFEComponentTransferElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* readonly attribute SVGAnimatedString in1; *)\n(* }; *)\n\n(* interface SVGComponentTransferFunctionElement : SVGElement { *)\n\n(* // Component Transfer Types *)\n(* const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0; *)\n(* const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1; *)\n(* const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2; *)\n(* const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3; *)\n(* const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4; *)\n(* const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5; *)\n\n(* readonly attribute SVGAnimatedEnumeration type; *)\n(* readonly attribute SVGAnimatedNumberList tableValues; *)\n(* readonly attribute SVGAnimatedNumber slope; *)\n(* readonly attribute SVGAnimatedNumber intercept; *)\n(* readonly attribute SVGAnimatedNumber amplitude; *)\n(* readonly attribute SVGAnimatedNumber exponent; *)\n(* readonly attribute SVGAnimatedNumber offset; *)\n(* }; *)\n\n(* interface SVGFEFuncRElement : SVGComponentTransferFunctionElement { *)\n(* }; *)\n\n(* interface SVGFEFuncGElement : SVGComponentTransferFunctionElement { *)\n(* }; *)\n\n(* interface SVGFEFuncBElement : SVGComponentTransferFunctionElement { *)\n(* }; *)\n\n(* interface SVGFEFuncAElement : SVGComponentTransferFunctionElement { *)\n(* }; *)\n\n(* interface SVGFECompositeElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Composite Operators *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0; *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1; *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2; *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3; *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4; *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5; *)\n(* const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6; *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedString in2; *)\n(* readonly attribute SVGAnimatedEnumeration operator; *)\n(* readonly attribute SVGAnimatedNumber k1; *)\n(* readonly attribute SVGAnimatedNumber k2; *)\n(* readonly attribute SVGAnimatedNumber k3; *)\n(* readonly attribute SVGAnimatedNumber k4; *)\n(* }; *)\n\n(* interface SVGFEConvolveMatrixElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Edge Mode Values *)\n(* const unsigned short SVG_EDGEMODE_UNKNOWN = 0; *)\n(* const unsigned short SVG_EDGEMODE_DUPLICATE = 1; *)\n(* const unsigned short SVG_EDGEMODE_WRAP = 2; *)\n(* const unsigned short SVG_EDGEMODE_NONE = 3; *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedInteger orderX; *)\n(* readonly attribute SVGAnimatedInteger orderY; *)\n(* readonly attribute SVGAnimatedNumberList kernelMatrix; *)\n(* readonly attribute SVGAnimatedNumber divisor; *)\n(* readonly attribute SVGAnimatedNumber bias; *)\n(* readonly attribute SVGAnimatedInteger targetX; *)\n(* readonly attribute SVGAnimatedInteger targetY; *)\n(* readonly attribute SVGAnimatedEnumeration edgeMode; *)\n(* readonly attribute SVGAnimatedNumber kernelUnitLengthX; *)\n(* readonly attribute SVGAnimatedNumber kernelUnitLengthY; *)\n(* readonly attribute SVGAnimatedBoolean preserveAlpha; *)\n(* }; *)\n\n(* interface SVGFEDiffuseLightingElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedNumber surfaceScale; *)\n(* readonly attribute SVGAnimatedNumber diffuseConstant; *)\n(* readonly attribute SVGAnimatedNumber kernelUnitLengthX; *)\n(* readonly attribute SVGAnimatedNumber kernelUnitLengthY; *)\n(* }; *)\n\n(* interface SVGFEDistantLightElement : SVGElement { *)\n(* readonly attribute SVGAnimatedNumber azimuth; *)\n(* readonly attribute SVGAnimatedNumber elevation; *)\n(* }; *)\n\n(* interface SVGFEPointLightElement : SVGElement { *)\n(* readonly attribute SVGAnimatedNumber x; *)\n(* readonly attribute SVGAnimatedNumber y; *)\n(* readonly attribute SVGAnimatedNumber z; *)\n(* }; *)\n\n(* interface SVGFESpotLightElement : SVGElement { *)\n(* readonly attribute SVGAnimatedNumber x; *)\n(* readonly attribute SVGAnimatedNumber y; *)\n(* readonly attribute SVGAnimatedNumber z; *)\n(* readonly attribute SVGAnimatedNumber pointsAtX; *)\n(* readonly attribute SVGAnimatedNumber pointsAtY; *)\n(* readonly attribute SVGAnimatedNumber pointsAtZ; *)\n(* readonly attribute SVGAnimatedNumber specularExponent; *)\n(* readonly attribute SVGAnimatedNumber limitingConeAngle; *)\n(* }; *)\n\n(* interface SVGFEDisplacementMapElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Channel Selectors *)\n(* const unsigned short SVG_CHANNEL_UNKNOWN = 0; *)\n(* const unsigned short SVG_CHANNEL_R = 1; *)\n(* const unsigned short SVG_CHANNEL_G = 2; *)\n(* const unsigned short SVG_CHANNEL_B = 3; *)\n(* const unsigned short SVG_CHANNEL_A = 4; *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedString in2; *)\n(* readonly attribute SVGAnimatedNumber scale; *)\n(* readonly attribute SVGAnimatedEnumeration xChannelSelector; *)\n(* readonly attribute SVGAnimatedEnumeration yChannelSelector; *)\n(* }; *)\n\n(* interface SVGFEFloodElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* }; *)\n\n(* interface SVGFEGaussianBlurElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedNumber stdDeviationX; *)\n(* readonly attribute SVGAnimatedNumber stdDeviationY; *)\n\n(* void setStdDeviation(in float stdDeviationX, in float stdDeviationY) raises(DOMException); *)\n(* }; *)\n\n(* interface SVGFEImageElement : SVGElement, *)\n(* SVGURIReference, *)\n(* SVGLangSpace, *)\n(* SVGExternalResourcesRequired, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio; *)\n(* }; *)\n\n(* interface SVGFEMergeElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* }; *)\n\n(* interface SVGFEMergeNodeElement : SVGElement { *)\n(* readonly attribute SVGAnimatedString in1; *)\n(* }; *)\n\n(* interface SVGFEMorphologyElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Morphology Operators *)\n(* const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0; *)\n(* const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1; *)\n(* const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2; *)\n\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedEnumeration operator; *)\n(* readonly attribute SVGAnimatedNumber radiusX; *)\n(* readonly attribute SVGAnimatedNumber radiusY; *)\n(* }; *)\n\n(* interface SVGFEOffsetElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedNumber dx; *)\n(* readonly attribute SVGAnimatedNumber dy; *)\n(* }; *)\n\n(* interface SVGFESpecularLightingElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* readonly attribute SVGAnimatedString in1; *)\n(* readonly attribute SVGAnimatedNumber surfaceScale; *)\n(* readonly attribute SVGAnimatedNumber specularConstant; *)\n(* readonly attribute SVGAnimatedNumber specularExponent; *)\n(* readonly attribute SVGAnimatedNumber kernelUnitLengthX; *)\n(* readonly attribute SVGAnimatedNumber kernelUnitLengthY; *)\n(* }; *)\n\n(* interface SVGFETileElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n(* readonly attribute SVGAnimatedString in1; *)\n(* }; *)\n\n(* interface SVGFETurbulenceElement : SVGElement, *)\n(* SVGFilterPrimitiveStandardAttributes { *)\n\n(* // Turbulence Types *)\n(* const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0; *)\n(* const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1; *)\n(* const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2; *)\n\n(* // Stitch Options *)\n(* const unsigned short SVG_STITCHTYPE_UNKNOWN = 0; *)\n(* const unsigned short SVG_STITCHTYPE_STITCH = 1; *)\n(* const unsigned short SVG_STITCHTYPE_NOSTITCH = 2; *)\n\n(* readonly attribute SVGAnimatedNumber baseFrequencyX; *)\n(* readonly attribute SVGAnimatedNumber baseFrequencyY; *)\n(* readonly attribute SVGAnimatedInteger numOctaves; *)\n(* readonly attribute SVGAnimatedNumber seed; *)\n(* readonly attribute SVGAnimatedEnumeration stitchTiles; *)\n(* readonly attribute SVGAnimatedEnumeration type; *)\n(* }; *)\n\n(* interface SVGCursorElement *)\nand cursorElement = object\n inherit element\n\n inherit uriReference\n\n inherit tests\n\n inherit externalResourcesRequired\n\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\nend\n\n(* interface SVGAElement *)\nand aElement = object\n inherit element\n\n inherit uriReference\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method target : animatedString t readonly_prop\nend\n\n(* interface SVGViewElement *)\nand viewElement = object\n inherit element\n\n inherit externalResourcesRequired\n\n inherit fitToViewBox\n\n inherit zoomAndPan\n\n method viewTarget : stringList t readonly_prop\nend\n\n(* interface SVGScriptElement *)\nand scriptElement = object\n inherit element\n\n inherit uriReference\n\n inherit externalResourcesRequired\n\n method type_ : js_string t prop\nend\n\n(* interface SVGZoomEvent : UIEvent *)\n(* readonly attribute SVGRect zoomRectScreen; *)\n(* readonly attribute float previousScale; *)\n(* readonly attribute SVGPoint previousTranslate; *)\n(* readonly attribute float newScale; *)\n(* readonly attribute SVGPoint newTranslate; *)\n(* }; *)\n\n(* interface SVGAnimationElement *)\nand animationElement = object\n inherit element\n\n inherit tests\n\n inherit externalResourcesRequired\n\n (* inherit elementTimeControl *)\n method targetElement : element t readonly_prop\n\n method getStartTime : number_t meth\n\n method getCurrentTime : number_t meth\n\n method getSimpleDuration : number_t meth\nend\n\n(* interface SVGAnimateElement *)\nand animateElement = object\n inherit animationElement\n\n inherit stylable\nend\n\n(* interface SVGSetElement *)\nand setElement = animationElement\n\n(* interface SVGAnimateMotionElement *)\nand animateMotionElement = animationElement\n\n(* interface SVGMPathElement *)\nand mPathElement = object\n inherit element\n\n inherit uriReference\n\n inherit externalResourcesRequired\nend\n\n(* interface SVGAnimateColorElement *)\nand animateColorElement = object\n inherit animationElement\n\n inherit stylable\nend\n\n(* interface SVGAnimateTransformElement *)\nand animateTransformElement = animationElement\n\n(* interface SVGFontElement *)\nand fontElement = object\n inherit element\n\n inherit stylable\nend\n\n(* interface SVGGlyphElement *)\n(* interface SVGMissingGlyphElement*)\nand glyphElement = object\n inherit element\n\n inherit stylable\nend\n\n(* interface SVGHKernElement : SVGElement *)\n(* interface SVGVKernElement : SVGElement *)\n\n(* interface SVGFontFaceElement *)\nclass type fontFaceElement = element\n\n(* interface SVGFontFaceSrcElement *)\nclass type fontFaceSrcElement = element\n\n(* interface SVGFontFaceUriElement *)\nclass type fontFaceUriElement = element\n\n(* interface SVGFontFaceFormatElement *)\nclass type fontFaceFormatElement = element\n\n(* interface SVGFontFaceNameElement *)\nclass type fontFaceNameElement = element\n\n(* interface SVGMetadataElement *)\nclass type metadataElement = element\n\n(* interface SVGForeignObjectElement *)\nclass type foreignObjectElement = object\n inherit element\n\n inherit tests\n\n inherit langSpace\n\n inherit externalResourcesRequired\n\n inherit stylable\n\n inherit transformable\n\n method x : animatedLength t readonly_prop\n\n method y : animatedLength t readonly_prop\n\n method width : animatedLength t readonly_prop\n\n method height : animatedLength t readonly_prop\nend\n\nlet createElement (doc : document t) name = doc##createElementNS xmlns (Js.string name)\n\nlet unsafeCreateElement doc name = Js.Unsafe.coerce (createElement doc name)\n\nlet createA doc : aElement t = unsafeCreateElement doc \"a\"\n\nlet createAltGlyph doc : altGlyphElement t = unsafeCreateElement doc \"altglyph\"\n\nlet createAltGlyphDef doc : altGlyphDefElement t = unsafeCreateElement doc \"altglyphdef\"\n\nlet createAltGlyphItem doc : altGlyphItemElement t =\n unsafeCreateElement doc \"altglyphitem\"\n\nlet createAnimate doc : animateElement t = unsafeCreateElement doc \"animate\"\n\nlet createAnimateColor doc : animateColorElement t =\n unsafeCreateElement doc \"animatecolor\"\n\nlet createAnimateMotion doc : animateMotionElement t =\n unsafeCreateElement doc \"animatemotion\"\n\nlet createAnimateTransform doc : animateTransformElement t =\n unsafeCreateElement doc \"animatetransform\"\n\nlet createCircle doc : circleElement t = unsafeCreateElement doc \"circle\"\n\nlet createClipPath doc : clipPathElement t = unsafeCreateElement doc \"clippath\"\n\n(* let createColorProfile doc : colorProfile t = unsafeCreateElement doc \"color-profile\" *)\nlet createCursor doc : cursorElement t = unsafeCreateElement doc \"cursor\"\n\nlet createDefs doc : defsElement t = unsafeCreateElement doc \"defs\"\n\nlet createDesc doc : descElement t = unsafeCreateElement doc \"desc\"\n\nlet createEllipse doc : ellipseElement t = unsafeCreateElement doc \"ellipse\"\n\n(* let createFe* *)\nlet createFilter doc : filterElement t = unsafeCreateElement doc \"filter\"\n\nlet createFont doc : fontElement t = unsafeCreateElement doc \"font\"\n\nlet createFontFace doc : fontElement t = unsafeCreateElement doc \"font-face\"\n\nlet createFontFaceFormat doc : fontElement t = unsafeCreateElement doc \"font-face-format\"\n\nlet createFontFaceName doc : fontElement t = unsafeCreateElement doc \"font-face-name\"\n\nlet createFontFaceSrc doc : fontElement t = unsafeCreateElement doc \"font-face-src\"\n\nlet createFontFaceUri doc : fontElement t = unsafeCreateElement doc \"font-face-uri\"\n\nlet createForeignObject doc : foreignObjectElement t =\n unsafeCreateElement doc \"foreignObject\"\n\nlet createG doc : gElement t = unsafeCreateElement doc \"g\"\n\nlet createGlyph doc : glyphElement t = unsafeCreateElement doc \"glyph\"\n\nlet createGlyphRef doc : glyphElement t = unsafeCreateElement doc \"glyphref\"\n\nlet createhkern doc : element t = unsafeCreateElement doc \"hkern\"\n\nlet createImage doc : imageElement t = unsafeCreateElement doc \"image\"\n\nlet createLineElement doc : lineElement t = unsafeCreateElement doc \"line\"\n\nlet createLinearElement doc : linearGradientElement t =\n unsafeCreateElement doc \"lineargradient\"\n\n(* let createMarker doc : markerElement *)\nlet createMask doc : maskElement t = unsafeCreateElement doc \"mask\"\n\nlet createMetaData doc : metadataElement t = unsafeCreateElement doc \"metadata\"\n\nlet createMissingGlyph doc : glyphElement t = unsafeCreateElement doc \"missing-glyph\"\n\nlet createMPath doc : mPathElement t = unsafeCreateElement doc \"mpath\"\n\nlet createPath doc : pathElement t = unsafeCreateElement doc \"path\"\n\nlet createPattern doc : patternElement t = unsafeCreateElement doc \"pattern\"\n\nlet createPolygon doc : polygonElement t = unsafeCreateElement doc \"polygon\"\n\nlet createPolyline doc : polyLineElement t = unsafeCreateElement doc \"polyline\"\n\nlet createRadialgradient doc : radialGradientElement t =\n unsafeCreateElement doc \"radialgradient\"\n\nlet createRect doc : rectElement t = unsafeCreateElement doc \"rect\"\n\nlet createScript doc : scriptElement t = unsafeCreateElement doc \"script\"\n\nlet createSet doc : setElement t = unsafeCreateElement doc \"set\"\n\nlet createStop doc : stopElement t = unsafeCreateElement doc \"stop\"\n\nlet createStyle doc : styleElement t = unsafeCreateElement doc \"style\"\n\nlet createSvg doc : svgElement t = unsafeCreateElement doc \"svg\"\n\nlet createSwitch doc : switchElement t = unsafeCreateElement doc \"switch\"\n\nlet createSymbol doc : symbolElement t = unsafeCreateElement doc \"symbol\"\n\nlet createTextElement doc : textElement t = unsafeCreateElement doc \"text\"\n\nlet createTextpath doc : textPathElement t = unsafeCreateElement doc \"textpath\"\n\nlet createTitle doc : titleElement t = unsafeCreateElement doc \"title\"\n\nlet createTref doc : trefElement t = unsafeCreateElement doc \"tref\"\n\nlet createTspan doc : tspanElement t = unsafeCreateElement doc \"tspan\"\n\nlet createUse doc : useElement t = unsafeCreateElement doc \"use\"\n\nlet createView doc : viewElement t = unsafeCreateElement doc \"view\"\n\nlet createvkern doc : element t = unsafeCreateElement doc \"vkern\"\n\n(****)\n\nlet svg_element : element t constr = Js.Unsafe.global##._SVGElement\n\nlet document = Js.Unsafe.global##.document\n\nlet getElementById id : element t =\n Js.Opt.case\n (Js.Unsafe.global##.document##getElementById (Js.string id))\n (fun () -> raise Not_found)\n (fun e -> if Js.instanceof e svg_element then e else raise Not_found)\n\nmodule CoerceTo = struct\n let element (e : #Dom.node Js.t) : element Js.t Js.opt =\n if Js.instanceof e svg_element then Js.some (Js.Unsafe.coerce e) else Js.null\n\n let unsafeCoerce (e : #element t) tag =\n if Js.equals e##.tagName##toLowerCase (Js.string tag)\n then Js.some (Js.Unsafe.coerce e)\n else Js.null\n\n let a e : aElement t opt = unsafeCoerce e \"a\"\n\n let altGlyph e : altGlyphElement t opt = unsafeCoerce e \"altglyph\"\n\n let altGlyphDef e : altGlyphDefElement t opt = unsafeCoerce e \"altglyphdef\"\n\n let altGlyphItem e : altGlyphItemElement t opt = unsafeCoerce e \"altglyphitem\"\n\n let animate e : animateElement t opt = unsafeCoerce e \"animate\"\n\n let animateColor e : animateColorElement t opt = unsafeCoerce e \"animatecolor\"\n\n let animateMotion e : animateMotionElement t opt = unsafeCoerce e \"animatemotion\"\n\n let animateTransform e : animateTransformElement t opt =\n unsafeCoerce e \"animatetransform\"\n\n let circle e : circleElement t opt = unsafeCoerce e \"circle\"\n\n let clipPath e : clipPathElement t opt = unsafeCoerce e \"clippath\"\n\n (* let ColorProfile e : colorProfile t opt = unsafeCoerce e \"color-profile\" *)\n let cursor e : cursorElement t opt = unsafeCoerce e \"cursor\"\n\n let defs e : defsElement t opt = unsafeCoerce e \"defs\"\n\n let desc e : descElement t opt = unsafeCoerce e \"desc\"\n\n let ellipse e : ellipseElement t opt = unsafeCoerce e \"ellipse\"\n\n (* let Fe* *)\n let filter e : filterElement t opt = unsafeCoerce e \"filter\"\n\n let font e : fontElement t opt = unsafeCoerce e \"font\"\n\n let fontFace e : fontElement t opt = unsafeCoerce e \"font-face\"\n\n let fontFaceFormat e : fontElement t opt = unsafeCoerce e \"font-face-format\"\n\n let fontFaceName e : fontElement t opt = unsafeCoerce e \"font-face-name\"\n\n let fontFaceSrc e : fontElement t opt = unsafeCoerce e \"font-face-src\"\n\n let fontFaceUri e : fontElement t opt = unsafeCoerce e \"font-face-uri\"\n\n let foreignObject e : foreignObjectElement t opt = unsafeCoerce e \"foreignobject\"\n\n let g e : gElement t opt = unsafeCoerce e \"g\"\n\n let glyph e : glyphElement t opt = unsafeCoerce e \"glyph\"\n\n let glyphRef e : glyphElement t opt = unsafeCoerce e \"glyphref\"\n\n let hkern e : element t opt = unsafeCoerce e \"hkern\"\n\n let image e : imageElement t opt = unsafeCoerce e \"image\"\n\n let lineElement e : lineElement t opt = unsafeCoerce e \"line\"\n\n let linearElement e : linearGradientElement t opt = unsafeCoerce e \"lineargradient\"\n\n (* let Marker e : markerElement *)\n let mask e : maskElement t opt = unsafeCoerce e \"mask\"\n\n let metaData e : metadataElement t opt = unsafeCoerce e \"metadata\"\n\n let missingGlyph e : glyphElement t opt = unsafeCoerce e \"missing-glyph\"\n\n let mPath e : mPathElement t opt = unsafeCoerce e \"mpath\"\n\n let path e : pathElement t opt = unsafeCoerce e \"path\"\n\n let pattern e : patternElement t opt = unsafeCoerce e \"pattern\"\n\n let polygon e : polygonElement t opt = unsafeCoerce e \"polygon\"\n\n let polyline e : polyLineElement t opt = unsafeCoerce e \"polyline\"\n\n let radialgradient e : radialGradientElement t opt = unsafeCoerce e \"radialgradient\"\n\n let rect e : rectElement t opt = unsafeCoerce e \"rect\"\n\n let script e : scriptElement t opt = unsafeCoerce e \"script\"\n\n let set e : setElement t opt = unsafeCoerce e \"set\"\n\n let stop e : stopElement t opt = unsafeCoerce e \"stop\"\n\n let style e : styleElement t opt = unsafeCoerce e \"style\"\n\n let svg e : svgElement t opt = unsafeCoerce e \"svg\"\n\n let switch e : switchElement t opt = unsafeCoerce e \"switch\"\n\n let symbol e : symbolElement t opt = unsafeCoerce e \"symbol\"\n\n let textElement e : textElement t opt = unsafeCoerce e \"text\"\n\n let textpath e : textPathElement t opt = unsafeCoerce e \"textpath\"\n\n let title e : titleElement t opt = unsafeCoerce e \"title\"\n\n let tref e : trefElement t opt = unsafeCoerce e \"tref\"\n\n let tspan e : tspanElement t opt = unsafeCoerce e \"tspan\"\n\n let use e : useElement t opt = unsafeCoerce e \"use\"\n\n let view e : viewElement t opt = unsafeCoerce e \"view\"\n\n let vkern e : element t opt = unsafeCoerce e \"vkern\"\nend\n","(* generated code *)"],"names":[],"mappings":"EA0nEgC,QAAsB,C,EAFnB,QAAqB,C,EAFvB,QAAoB,C,EAFhB,QAAsB,C,EAFxB,QAAqB,C,EAFnB,QAAsB,C,EAFhB,QAAyB,C,EAF1B,QAAqB,C,EAFxB,QAAuB,C,EAFvB,QAAuB,C,EAF7B,QAAoB,C,EAFhB,QAAsB,C,EAFxB,QAAqB,C,EAFvB,QAAoB,C,EAFd,QAAuB,C,EAF3B,QAAqB,C,EAFD,QAA+B,C,EAF3C,QAAyB,C,EAF3B,QAAwB,C,EAFxB,QAAwB,C,EAF9B,QAAqB,C,EAFnB,QAAsB,C,EAFf,QAA8B,C,EAF/B,QAAyB,C,EAFjC,QAAqB,C,EAHF,QAA+B,C,EAF3C,QAAqB,C,EAF1B,QAAsB,C,EAF3B,QAAsB,C,EAFd,QAAyB,C,EAF5B,QAAsB,C,EAF9B,QAAkB,C,EAFM,QAA8B,C,EAFzC,QAA8B,C,EAF9B,QAA8B,C,EAF7B,QAA+B,C,EAF7B,QAAiC,C,EAFvC,QAA0B,C,EAF9B,QAAqB,C,EAFjB,QAAuB,C,EAHrB,QAAwB,C,EAF9B,QAAqB,C,EAFrB,QAAqB,C,EAFjB,QAAuB,C,EAHnB,QAAyB,C,EAF7B,QAAuB,C,EAF1D,QAAiC,C,EAHgB,QAA8B,C,EAFhC,QAA6B,C,EAFvC,QAAwB,C,EAFd,QAA6B,C,EAF/B,QAA4B,C,EAFlC,QAAyB,C,EAFvC,QAAkB,C,OAJL,IAAzB,gBAAV,IAAkD,QAEhD,QADA,uBACO,C,EALT,aAA2B,QAAwC,QAAlC,uBAAyC,C,EALlE,SAAe,C,EACb,aAA2B,QAAa,UAAP,GAAsB,C,KAHtE,iBAC+C,MAAc,eAA1D,OAAD,WAA4D,iCAES,C,EAlItC,YAsH8B,C,EAtH9B,YAoHgC,C,EApHhC,YAkH6B,C,EAlH7B,YAgHmC,C,EAhHnC,YA8GgC,C,EA9GhC,YA4GmC,C,EA5GnC,YA0G4C,C,EA1G5C,YAwGuC,C,EAxGvC,YAsGsC,C,EAtGtC,YAoGsC,C,EApGtC,YAkG6B,C,EAlG7B,YAgGmC,C,EAhGnC,YA8FgC,C,EA9FhC,YA4F6B,C,EA5F7B,YA0FsC,C,EA1FtC,YAwFgC,C,EAxFhC,YAsFO,C,EAtFP,YAmF4C,C,EAnF5C,YAiFyC,C,EAjFzC,YA+EyC,C,EA/EzC,YA6EgC,C,EA7EhC,YA2EmC,C,EA3EnC,YAyEkD,C,EAzElD,YAuE4C,C,EAvE5C,YAqEgC,C,EArEhC,YAkEO,C,EAlEP,YA+DuC,C,EA/DvC,YA6DmC,C,EA7DnC,YA2D8B,C,EA3D9B,YAyDyC,C,EAzDzC,YAuDmC,C,EAvDnC,YAqDuB,C,EArDvB,YAmDM,C,EAnDN,YAgDgD,C,EAhDhD,YA8CgD,C,EA9ChD,YA4CkD,C,EA5ClD,YA0CsD,C,EA1CtD,YAwCyC,C,EAxCzC,YAsCgC,C,EAtChC,YAoCsC,C,EApCtC,YAiCyC,C,EAjCzC,YA+BgC,C,EA/BhC,YA6BgC,C,EA7BhC,YA2BsC,C,EA3BtC,YAwB4C,C,EAxB5C,YAsBsC,C,EAtBtC,YAoBS,C,EApBT,YAiBM,C,EAjBN,YAcK,C,EAdL,YAWyC,C,EAXzC,YASK,C,EATL,YAMqD,C,EANrD,YAI4C,C,EAJ5C,YAEuB,C,EAJa,MAAgB,mB,MA8H7C,OAp+DQ,mBAo+DR,qKAp+DQ,eAk+Db,SAA8B,eAEpD,OAA2B,sM,EC3/D1C,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":119396},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/eventSource.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2014 Hugo Heuzard\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\n(* https://developer.mozilla.org/en-US/docs/Web/API/EventSource *)\nopen Js\nopen Dom\nopen! Import\n\ntype state =\n | CONNECTING\n | OPEN\n | CLOSED\n\nclass type ['a] messageEvent = object\n inherit ['a] Dom.event\n\n method data : js_string t readonly_prop\n\n method origin : js_string t readonly_prop\n\n method lastEventId : js_string t readonly_prop\n (* method source : unit *)\nend\n\nclass type eventSource = object ('self)\n method url : js_string t readonly_prop\n\n method withCredentials : bool t readonly_prop\n\n method readyState : state readonly_prop\n\n method close : unit meth\n\n method onopen : ('self t, 'self messageEvent t) event_listener writeonly_prop\n\n method onmessage : ('self t, 'self messageEvent t) event_listener writeonly_prop\n\n method onerror : ('self t, 'self messageEvent t) event_listener writeonly_prop\nend\n\nclass type options = object\n method withCredentials : bool t writeonly_prop\nend\n\nlet withCredentials b : options t =\n let init = Js.Unsafe.obj [||] in\n init##.withCredentials := Js.bool b;\n init\n\nlet eventSource = Js.Unsafe.global##._EventSource\n\nlet eventSource_options = Js.Unsafe.global##._EventSource\n\nlet addEventListener = Dom.addEventListener\n","(* generated code *)"],"names":[],"mappings":"EA6Da,OACe,MAA1B,cAAmC,EAC/B,C,EAImD,OCnEzD,eDiEkB,OAA+B,eAEvB,OAA+B","ignoreList":[1]}},{"offset":{"line":0,"column":119500},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/geolocation.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2015 Stéphane Legrand\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\ntype positionErrorCode\n\ntype watchId\n\nclass type coordinates = object\n method latitude : Js.number_t Js.readonly_prop\n\n method longitude : Js.number_t Js.readonly_prop\n\n method altitude : Js.number_t Js.opt Js.readonly_prop\n\n method accuracy : Js.number_t Js.readonly_prop\n\n method altitudeAccuracy : Js.number_t Js.opt Js.readonly_prop\n\n method heading : Js.number_t Js.opt Js.readonly_prop\n\n method speed : Js.number_t Js.opt Js.readonly_prop\nend\n\nclass type position = object\n method coords : coordinates Js.t Js.readonly_prop\n\n method timestamp : Js.date Js.t Js.readonly_prop\nend\n\nclass type positionOptions = object\n method enableHighAccuracy : bool Js.writeonly_prop\n\n method timeout : int Js.writeonly_prop\n\n method maximumAge : int Js.writeonly_prop\nend\n\nclass type positionError = object\n method _PERMISSION_DENIED_ : positionErrorCode Js.readonly_prop\n\n method _POSITION_UNAVAILABLE_ : positionErrorCode Js.readonly_prop\n\n method _TIMEOUT : positionErrorCode Js.readonly_prop\n\n method code : positionErrorCode Js.readonly_prop\n\n method message : Js.js_string Js.t Js.readonly_prop\nend\n\nclass type geolocation = object\n method getCurrentPosition :\n (position Js.t -> unit) Js.callback\n -> (positionError Js.t -> unit) Js.callback\n -> positionOptions Js.t\n -> unit Js.meth\n\n method watchPosition :\n (position Js.t -> unit) Js.callback\n -> (positionError Js.t -> unit) Js.callback\n -> positionOptions Js.t\n -> watchId Js.meth\n\n method clearWatch : watchId -> unit Js.meth\nend\n\nlet empty_position_options () = Js.Unsafe.obj [||]\n\nlet geolocation =\n let x = Js.Unsafe.global##.navigator in\n if Js.Optdef.test x then x##.geolocation else x\n\n(* undefined *)\n\nlet is_supported () = Js.Optdef.test geolocation\n","(* generated code *)"],"names":[],"mappings":"EAkFgC,KAAkB,C,EAQ5B,qCAA0B,C,KC1FhD,eDqFU,SACR,eAAG,aAAgB,K,CAAA,EAAM,SAAe","ignoreList":[1]}},{"offset":{"line":0,"column":119654},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/intersectionObserver.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nclass type intersectionObserverEntry = object\n method target : Dom.node Js.t Js.readonly_prop\n\n method boundingClientRect : Dom_html.clientRect Js.t Js.readonly_prop\n\n method rootBounds : Dom_html.clientRect Js.t Js.opt Js.readonly_prop\n\n method intersectionRect : Dom_html.clientRect Js.t Js.readonly_prop\n\n method intersectionRatio : Js.number_t Js.readonly_prop\n\n method isIntersecting : bool Js.t Js.readonly_prop\n\n method time : Js.number_t Js.readonly_prop\nend\n\nclass type intersectionObserverOptions = object\n method root : Dom.node Js.t Js.writeonly_prop\n\n method rootMargin : Js.js_string Js.t Js.writeonly_prop\n\n method threshold : Js.number_t Js.js_array Js.t Js.writeonly_prop\nend\n\nclass type intersectionObserver = object\n method root : Dom.node Js.t Js.opt Js.readonly_prop\n\n method rootMargin : Js.js_string Js.t Js.readonly_prop\n\n method thresholds : Js.number_t Js.js_array Js.t Js.readonly_prop\n\n method observe : #Dom.node Js.t -> unit Js.meth\n\n method unobserve : #Dom.node Js.t -> unit Js.meth\n\n method disconnect : unit Js.meth\n\n method takeRecords : intersectionObserverEntry Js.t Js.js_array Js.meth\nend\n\nlet empty_intersection_observer_options () : intersectionObserverOptions Js.t =\n Js.Unsafe.obj [||]\n\nlet intersectionObserver_unsafe = Js.Unsafe.global##._IntersectionObserver\n\nlet is_supported () = Js.Optdef.test intersectionObserver_unsafe\n\nlet intersectionObserver :\n ( ( intersectionObserverEntry Js.t Js.js_array Js.t\n -> intersectionObserver Js.t\n -> unit)\n Js.callback\n -> intersectionObserverOptions Js.t\n -> intersectionObserver Js.t)\n Js.constr =\n intersectionObserver_unsafe\n","(* generated code *)"],"names":[],"mappings":"EA+DsB,qCAA0C,C,EAJ9D,KAAkB,C,KAEsD,UC7D1E,eD6DkC,SAAwC","ignoreList":[1]}},{"offset":{"line":0,"column":119758},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/js_of_ocaml/intl.ml","/builtin/blackbox.ml"],"sourcesContent":["(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n * Copyright (C) 2018 Stéphane Legrand\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\nopen! Import\n\nmodule type Shared = sig\n class type object_options = object\n method localeMatcher : Js.js_string Js.t Js.prop\n end\n\n val object_options : unit -> object_options Js.t\n\n class type _object = object\n method supportedLocalesOf :\n Js.js_string Js.t Js.js_array Js.t\n -> object_options Js.t Js.optdef\n -> Js.js_string Js.t Js.js_array Js.t Js.meth\n end\nend\n\nmodule Shared : Shared = struct\n class type object_options = object\n method localeMatcher : Js.js_string Js.t Js.prop\n end\n\n let object_options () =\n object%js\n val mutable localeMatcher = Js.string \"best fit\"\n end\n\n class type _object = object\n method supportedLocalesOf :\n Js.js_string Js.t Js.js_array Js.t\n -> object_options Js.t Js.optdef\n -> Js.js_string Js.t Js.js_array Js.t Js.meth\n end\nend\n\nmodule Collator = struct\n include Shared\n\n class type resolved_options = object\n method locale : Js.js_string Js.t Js.readonly_prop\n\n method usage : Js.js_string Js.t Js.readonly_prop\n\n method sensitivity : Js.js_string Js.t Js.readonly_prop\n\n method ignorePunctuation : bool Js.t Js.readonly_prop\n\n method collation : Js.js_string Js.t Js.readonly_prop\n\n method numeric : bool Js.t Js.readonly_prop\n\n method caseFirst : Js.js_string Js.t Js.readonly_prop\n end\n\n class type options = object\n method localeMatcher : Js.js_string Js.t Js.prop\n\n method usage : Js.js_string Js.t Js.prop\n\n method sensitivity : Js.js_string Js.t Js.prop\n\n method ignorePunctuation : bool Js.t Js.prop\n\n method numeric : bool Js.t Js.prop\n\n method caseFirst : Js.js_string Js.t Js.prop\n end\n\n let options () =\n object%js\n val mutable localeMatcher = Js.string \"best fit\"\n\n val mutable usage = Js.string \"sort\"\n\n val mutable sensitivity = Js.string \"variant\"\n\n val mutable ignorePunctuation = Js._false\n\n val mutable numeric = Js._false\n\n val mutable caseFirst = Js.string \"false\"\n end\n\n class type t = object\n method compare : (Js.js_string Js.t -> Js.js_string Js.t -> int) Js.readonly_prop\n\n method resolvedOptions : unit -> resolved_options Js.t Js.meth\n end\nend\n\nmodule DateTimeFormat = struct\n include Shared\n\n class type resolved_options = object\n method locale : Js.js_string Js.t Js.readonly_prop\n\n method calendar : Js.js_string Js.t Js.readonly_prop\n\n method numberingSystem : Js.js_string Js.t Js.readonly_prop\n\n method timeZone : Js.js_string Js.t Js.readonly_prop\n\n method hour12 : bool Js.t Js.readonly_prop\n\n method weekday : Js.js_string Js.t Js.optdef_prop\n\n method era : Js.js_string Js.t Js.optdef_prop\n\n method year : Js.js_string Js.t Js.optdef_prop\n\n method month : Js.js_string Js.t Js.optdef_prop\n\n method day : Js.js_string Js.t Js.optdef_prop\n\n method hour : Js.js_string Js.t Js.optdef_prop\n\n method minute : Js.js_string Js.t Js.optdef_prop\n\n method second : Js.js_string Js.t Js.optdef_prop\n\n method timeZoneName : Js.js_string Js.t Js.optdef_prop\n end\n\n class type options = object\n method dateStyle : Js.js_string Js.t Js.optdef Js.prop\n\n method timeStyle : Js.js_string Js.t Js.optdef Js.prop\n\n method calendar : Js.js_string Js.t Js.optdef Js.prop\n\n method dayPeriod : Js.js_string Js.t Js.optdef Js.prop\n\n method numberingSystem : Js.js_string Js.t Js.optdef Js.prop\n\n method localeMatcher : Js.js_string Js.t Js.prop\n\n method timeZone : Js.js_string Js.t Js.optdef Js.prop\n\n method hour12 : bool Js.t Js.optdef Js.prop\n\n method hourCycle : Js.js_string Js.t Js.optdef Js.prop\n\n method formatMatcher : Js.js_string Js.t Js.prop\n\n method weekday : Js.js_string Js.t Js.optdef Js.prop\n\n method era : Js.js_string Js.t Js.optdef Js.prop\n\n method year : Js.js_string Js.t Js.optdef Js.prop\n\n method month : Js.js_string Js.t Js.optdef Js.prop\n\n method day : Js.js_string Js.t Js.optdef Js.prop\n\n method hour : Js.js_string Js.t Js.optdef Js.prop\n\n method minute : Js.js_string Js.t Js.optdef Js.prop\n\n method second : Js.js_string Js.t Js.optdef Js.prop\n\n method fractionalSecondDigits : int Js.optdef Js.prop\n\n method timeZoneName : Js.js_string Js.t Js.optdef Js.prop\n end\n\n let options () : options Js.t =\n object%js\n val mutable dateStyle = Js.undefined\n\n val mutable timeStyle = Js.undefined\n\n val mutable calendar = Js.undefined\n\n val mutable dayPeriod = Js.undefined\n\n val mutable numberingSystem = Js.undefined\n\n val mutable localeMatcher = Js.string \"best fit\"\n\n val mutable timeZone = Js.undefined\n\n val mutable hour12 = Js.undefined\n\n val mutable hourCycle = Js.undefined\n\n val mutable formatMatcher = Js.string \"best fit\"\n\n val mutable weekday = Js.undefined\n\n val mutable era = Js.undefined\n\n val mutable year = Js.undefined\n\n val mutable month = Js.undefined\n\n val mutable day = Js.undefined\n\n val mutable hour = Js.undefined\n\n val mutable minute = Js.undefined\n\n val mutable second = Js.undefined\n\n val mutable fractionalSecondDigits = Js.undefined\n\n val mutable timeZoneName = Js.undefined\n end\n\n class type format_part = object\n method _type : Js.js_string Js.t Js.readonly_prop\n\n method _value : Js.js_string Js.t Js.readonly_prop\n end\n\n class type t = object\n method format : (Js.date Js.t -> Js.js_string Js.t) Js.readonly_prop\n\n method formatToParts :\n Js.date Js.t Js.optdef -> format_part Js.t Js.js_array Js.t Js.meth\n\n method resolvedOptions : unit -> resolved_options Js.t Js.meth\n end\nend\n\nmodule NumberFormat = struct\n include Shared\n\n class type resolved_options = object\n method locale : Js.js_string Js.t Js.readonly_prop\n\n method numberingSystem : Js.js_string Js.t Js.readonly_prop\n\n method style : Js.js_string Js.t Js.readonly_prop\n\n method currency : Js.js_string Js.t Js.optdef_prop\n\n method currencyDisplay : Js.js_string Js.t Js.optdef_prop\n\n method useGrouping : bool Js.t Js.readonly_prop\n\n method minimumIntegerDigits : int Js.optdef_prop\n\n method minimumFractionDigits : int Js.optdef_prop\n\n method maximumFractionDigits : int Js.optdef_prop\n\n method minimumSignificantDigits : int Js.optdef_prop\n\n method maximumSignificantDigits : int Js.optdef_prop\n end\n\n class type options = object\n method compactDisplay : Js.js_string Js.t Js.optdef Js.prop\n\n method currency : Js.js_string Js.t Js.optdef Js.prop\n\n method currencyDisplay : Js.js_string Js.t Js.optdef Js.prop\n\n method currencySign : Js.js_string Js.t Js.optdef Js.prop\n\n method localeMatcher : Js.js_string Js.t Js.prop\n\n method notation : Js.js_string Js.t Js.optdef Js.prop\n\n method numberingSystem : Js.js_string Js.t Js.optdef Js.prop\n\n method signDisplay : Js.js_string Js.t Js.optdef Js.prop\n\n method style : Js.js_string Js.t Js.prop\n\n method unit : Js.js_string Js.t Js.optdef Js.prop\n\n method unitDisplay : Js.js_string Js.t Js.optdef Js.prop\n\n method useGrouping : bool Js.t Js.prop\n\n method roundingMode : Js.js_string Js.t Js.optdef Js.prop\n\n method roundingPriority : Js.js_string Js.t Js.optdef Js.prop\n\n method roundingIncrement : Js.js_string Js.t Js.optdef Js.prop\n\n method trailingZeroDisplay : Js.js_string Js.t Js.optdef Js.prop\n\n method minimumIntegerDigits : int Js.optdef Js.prop\n\n method minimumFractionDigits : int Js.optdef Js.prop\n\n method maximumFractionDigits : int Js.optdef Js.prop\n\n method minimumSignificantDigits : int Js.optdef Js.prop\n\n method maximumSignificantDigits : int Js.optdef Js.prop\n end\n\n let options () : options Js.t =\n object%js\n val mutable compactDisplay = Js.undefined\n\n val mutable currency = Js.undefined\n\n val mutable currencyDisplay = Js.undefined\n\n val mutable currencySign = Js.undefined\n\n val mutable localeMatcher = Js.string \"best fit\"\n\n val mutable notation = Js.undefined\n\n val mutable numberingSystem = Js.undefined\n\n val mutable signDisplay = Js.undefined\n\n val mutable style = Js.string \"decimal\"\n\n val mutable unit = Js.undefined\n\n val mutable unitDisplay = Js.undefined\n\n val mutable useGrouping = Js._true\n\n val mutable roundingMode = Js.undefined\n\n val mutable roundingPriority = Js.undefined\n\n val mutable roundingIncrement = Js.undefined\n\n val mutable trailingZeroDisplay = Js.undefined\n\n val mutable minimumIntegerDigits = Js.undefined\n\n val mutable minimumFractionDigits = Js.undefined\n\n val mutable maximumFractionDigits = Js.undefined\n\n val mutable minimumSignificantDigits = Js.undefined\n\n val mutable maximumSignificantDigits = Js.undefined\n end\n\n class type format_part = object\n method _type : Js.js_string Js.t Js.readonly_prop\n\n method _value : Js.js_string Js.t Js.readonly_prop\n end\n\n class type t = object\n method format : (Js.number Js.t -> Js.js_string Js.t) Js.readonly_prop\n\n method formatToParts :\n Js.number Js.t Js.optdef -> format_part Js.t Js.js_array Js.t Js.meth\n\n method resolvedOptions : unit -> resolved_options Js.t Js.meth\n end\nend\n\nmodule PluralRules = struct\n include Shared\n\n class type resolved_options = object\n method locale : Js.js_string Js.t Js.readonly_prop\n\n method pluralCategories : Js.js_string Js.t Js.js_array Js.t Js.readonly_prop\n\n method _type : Js.js_string Js.t Js.readonly_prop\n\n method minimumIntegerDigits : int Js.optdef_prop\n\n method minimumFractionDigits : int Js.optdef_prop\n\n method maximumFractionDigits : int Js.optdef_prop\n\n method minimumSignificantDigits : int Js.optdef_prop\n\n method maximumSignificantDigits : int Js.optdef_prop\n end\n\n class type options = object\n method localeMatcher : Js.js_string Js.t Js.prop\n\n method _type : Js.js_string Js.t Js.prop\n end\n\n let options () : options Js.t =\n object%js\n val mutable localeMatcher = Js.string \"best fit\"\n\n val mutable _type = Js.string \"cardinal\"\n end\n\n class type t = object\n method select : Js.number Js.t -> Js.js_string Js.t Js.meth\n\n method resolvedOptions : unit -> resolved_options Js.t Js.meth\n end\nend\n\nclass type intl = object\n method _Collator : Collator._object Js.t Js.readonly_prop\n\n method _DateTimeFormat : DateTimeFormat._object Js.t Js.readonly_prop\n\n method _NumberFormat : NumberFormat._object Js.t Js.readonly_prop\n\n method _PluralRules : PluralRules._object Js.t Js.readonly_prop\n\n method getCanonicalLocales :\n Js.js_string Js.t Js.js_array Js.t -> Js.js_string Js.t Js.js_array Js.t Js.meth\nend\n\nlet intl = Js.Unsafe.global##._Intl\n\nlet collator_constr = Js.Unsafe.global##._Intl##._Collator\n\nlet dateTimeFormat_constr = Js.Unsafe.global##._Intl##._DateTimeFormat\n\nlet numberFormat_constr = Js.Unsafe.global##._Intl##._NumberFormat\n\nlet pluralRules_constr = Js.Unsafe.global##._Intl##._PluralRules\n\nlet is_supported () = Js.Optdef.test intl\n","(* generated code *)"],"names":[],"mappings":"EAsbsB,qCAAmB,C,EAnCa,eAG/C,C,MA5FH,4GAiByC,2BARS,2HAiC/C,C,MA5KH,0FAmBkD,2BARA,gIA6B/C,C,EA9HwC,kBAVO,iCAW/C,C,EAzD+C,UAC/C,C,MAyYyD,ICpbhE,uED4aW,SAAwB,eAEb,cAAoC,eAE9B,cAA0C,eAE5C,cAAwC,eAEzC,cAAuC","ignoreList":[1]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/jsoo_runtime-f96b44a8.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/jsoo_runtime-f96b44a8.wasm
new file mode 100644
index 00000000..089f262d
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/jsoo_runtime-f96b44a8.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/jsoo_runtime-f96b44a8.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/jsoo_runtime-f96b44a8.wasm.map
new file mode 100644
index 00000000..0af3aa58
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/jsoo_runtime-f96b44a8.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":979},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/js_of_ocaml-compiler/runtime/jsoo_runtime.ml"],"sourcesContent":["(* generated code *)","(* Js_of_ocaml library\n * http://www.ocsigen.org/js_of_ocaml/\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, with linking exception;\n * either version 2.1 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *)\n\nmodule Js = struct\n type t\n\n type 'a js_array = t\n\n type ('a, 'b) meth_callback = t\n\n external string : string -> t = \"caml_jsstring_of_string\"\n\n external to_string : t -> string = \"caml_string_of_jsstring\"\n\n external bytestring : string -> t = \"caml_jsbytes_of_string\"\n\n external to_bytestring : t -> string = \"caml_string_of_jsbytes\"\n\n external bool : bool -> t = \"caml_js_from_bool\"\n\n external to_bool : t -> bool = \"caml_js_to_bool\"\n\n external array : 'a array -> t = \"caml_js_from_array\"\n\n external to_array : t -> 'a array = \"caml_js_to_array\"\n\n external number_of_float : float -> t = \"caml_js_from_float\"\n\n external float_of_number : t -> float = \"caml_js_to_float\"\n\n external number_of_int32 : int32 -> t = \"caml_js_from_int32\"\n\n external int32_of_number : t -> int32 = \"caml_js_to_int32\"\n\n external number_of_nativeint : nativeint -> t = \"caml_js_from_nativeint\"\n\n external nativeint_of_number : t -> nativeint = \"caml_js_to_nativeint\"\n\n external typeof : t -> t = \"caml_js_typeof\"\n\n external instanceof : t -> t -> bool = \"caml_js_instanceof\"\n\n external debugger : unit -> unit = \"debugger\"\n\n external get : t -> t -> t = \"caml_js_get\"\n\n external set : t -> t -> t -> unit = \"caml_js_set\"\n\n external delete : t -> t -> unit = \"caml_js_delete\"\n\n external call : t -> t -> t array -> t = \"caml_js_call\"\n\n external fun_call : t -> t array -> t = \"caml_js_fun_call\"\n\n external meth_call : t -> string -> t array -> t = \"caml_js_meth_call\"\n\n external new_obj : t -> t array -> t = \"caml_js_new\"\n\n external new_obj_arr : t -> t js_array -> t = \"caml_ojs_new_arr\"\n\n external obj : (string * t) array -> t = \"caml_js_object\"\n\n external equals : t -> t -> bool = \"caml_js_equals\"\n\n external strict_equals : t -> t -> bool = \"caml_js_strict_equals\"\n\n external pure_expr : (unit -> 'a) -> 'a = \"caml_js_pure_expr\"\n\n external eval_string : string -> 'a = \"caml_js_eval_string\"\n\n external js_expr : string -> 'a = \"caml_js_expr\"\n\n external pure_js_expr : string -> 'a = \"caml_pure_js_expr\"\n\n external callback : ('b -> 'a) -> ('b, 'a) meth_callback\n = \"caml_js_wrap_callback_unsafe\"\n\n external callback_with_arguments :\n (t js_array -> 'b) -> ('c, t js_array -> 'b) meth_callback\n = \"caml_js_wrap_callback_arguments\"\n\n external callback_with_arity : int -> ('a -> 'b) -> ('c, 'a -> 'b) meth_callback\n = \"caml_js_wrap_callback_strict\"\n\n external meth_callback : ('b -> 'a) -> ('b, 'a) meth_callback\n = \"caml_js_wrap_meth_callback_unsafe\"\n\n external meth_callback_with_arity : int -> ('b -> 'a) -> ('b, 'a) meth_callback\n = \"caml_js_wrap_meth_callback_strict\"\n\n external meth_callback_with_arguments :\n ('b -> t js_array -> 'a) -> ('b, t js_array -> 'a) meth_callback\n = \"caml_js_wrap_meth_callback_arguments\"\n\n external wrap_callback : ('a -> 'b) -> ('c, 'a -> 'b) meth_callback\n = \"caml_js_wrap_callback\"\n\n external wrap_meth_callback : ('a -> 'b) -> ('a, 'b) meth_callback\n = \"caml_js_wrap_meth_callback\"\n\n external runtime_value : string -> 'a = \"caml_jsoo_runtime_value\"\n (** [runtime_value \"FOO\"] returns the JavaScript value FOO provided by the JavaScript runtime (with '//Provides: FOO'). The string argument must be a string literal. *)\n\n external custom_identifier : Obj.t -> string = \"caml_custom_identifier\"\nend\n\nmodule Sys = struct\n type 'a callback = 'a\n\n external create_file : name:string -> content:string -> unit = \"caml_create_file\"\n\n external read_file : name:string -> string = \"caml_read_file_content\"\n\n external set_channel_output' : out_channel -> (js_string:Js.t -> unit) callback -> unit\n = \"caml_ml_set_channel_output\"\n\n external set_channel_input' : in_channel -> (unit -> string) callback -> unit\n = \"caml_ml_set_channel_refill\"\n\n external mount_point : unit -> string list = \"caml_list_mount_point\"\n\n external mount_autoload : string -> (string -> string -> string option) callback -> unit\n = \"caml_mount_autoload\"\n\n external unmount : string -> unit = \"caml_unmount\"\n\n type redirection\n\n external redirect_channel : out_channel -> into:out_channel -> redirection\n = \"caml_ml_channel_redirect\"\n\n external restore_channel : out_channel -> redirection -> unit\n = \"caml_ml_channel_restore\"\n\n module Config = struct\n external use_js_string : unit -> bool = \"caml_jsoo_flags_use_js_string\"\n\n type effects_backend =\n [ `Disabled\n | `Cps\n | `Double_translation\n ]\n\n external effects_ : unit -> string = \"caml_jsoo_flags_effects\"\n\n let effects () =\n match effects_ () with\n | \"disabled\" -> `Disabled\n | \"cps\" -> `Cps\n | \"double-translation\" -> `Double_translation\n | _ -> assert false\n end\n\n let version = Runtime_version.s\n\n let git_version = Runtime_version.git_version\nend\n\nmodule Error : sig\n type t\n\n val raise_ : t -> 'a\n\n val attach_js_backtrace : exn -> force:bool -> exn\n (** Attach a JavaScript error to an OCaml exception. if [force = false] and a\n JavaScript error is already attached, it will do nothing. This function is useful to\n store and retrieve information about JavaScript stack traces.\n\n Attaching JavaScript errors will happen automatically when compiling with\n [--enable with-js-error]. *)\n\n val of_exn : exn -> t option\n (** Extract a JavaScript error attached to an OCaml exception, if any. This is useful to\n inspect an eventual stack trace, especially when sourcemap is enabled. *)\n\n exception Exn of t\n (** The [Error] exception wrap javascript exceptions when caught by OCaml code.\n In case the javascript exception is not an instance of javascript [Error],\n it will be serialized and wrapped into a [Failure] exception.\n *)\nend = struct\n type t\n\n exception Exn of t\n\n let _ = Callback.register_exception \"jsError\" (Exn (Obj.magic [||]))\n\n external raise_ : t -> 'a = \"caml_throw_js_exception\"\n\n external of_exn : exn -> t option = \"caml_js_error_option_of_exception\"\n\n external attach_js_backtrace : exn -> force:bool -> exn = \"caml_exn_with_js_backtrace\"\nend\n\n[@@@ocaml.warning \"-32-60\"]\n\nmodule For_compatibility_only = struct\n (* Add primitives for compatibility reasons. Existing users might\n depend on it (e.g. gen_js_api), we don't want the ocaml compiler\n to complain about these missing primitives. *)\n\n external caml_js_from_string : string -> Js.t = \"caml_js_from_string\"\n\n external caml_js_to_byte_string : Js.t -> string = \"caml_js_to_byte_string\"\n\n external caml_js_to_string : Js.t -> string = \"caml_js_to_string\"\n\n external caml_list_of_js_array : 'a Js.js_array -> 'a list = \"caml_list_of_js_array\"\n\n external caml_list_to_js_array : 'a list -> 'a Js.js_array = \"caml_list_to_js_array\"\n\n external variable : string -> 'a = \"caml_js_var\"\n\n external caml_string_of_array : 'a array -> string = \"caml_string_of_array\"\nend\n\nmodule Typed_array = struct\n type ('a, 'b) typedArray = Js.t\n\n type arrayBuffer = Js.t\n\n type uint8Array = Js.t\n\n external kind : ('a, 'b) typedArray -> ('a, 'b) Bigarray.kind\n = \"caml_ba_kind_of_typed_array\"\n\n external from_genarray :\n ('a, 'b, Bigarray.c_layout) Bigarray.Genarray.t -> ('a, 'b) typedArray\n = \"caml_ba_to_typed_array\"\n\n external to_genarray :\n ('a, 'b) typedArray -> ('a, 'b, Bigarray.c_layout) Bigarray.Genarray.t\n = \"caml_ba_from_typed_array\"\n\n module Bigstring = struct\n type t = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t\n\n external to_arrayBuffer : t -> arrayBuffer = \"bigstring_to_array_buffer\"\n\n external to_uint8Array : t -> uint8Array = \"bigstring_to_typed_array\"\n\n external of_arrayBuffer : arrayBuffer -> t = \"bigstring_of_array_buffer\"\n\n external of_uint8Array : uint8Array -> t = \"bigstring_of_typed_array\"\n end\n\n external string_of_uint8Array : uint8Array -> string = \"caml_string_of_uint8_array\"\n\n external bytes_of_uint8Array : uint8Array -> bytes = \"caml_bytes_of_uint8_array\"\n\n external uint8Array_of_bytes : bytes -> uint8Array = \"caml_uint8_array_of_bytes\"\nend\n\nmodule Int64 = struct\n external create_int64_lo_mi_hi : int -> int -> int -> Int64.t\n = \"caml_int64_create_lo_mi_hi\"\nend\n\nmodule Effect : sig\n external assume_no_perform : (unit -> 'a) -> 'a = \"caml_assume_no_perform\"\n (** Passing a function [f] as argument of `assume_no_perform` guarantees that,\n when compiling with `--effects=double-translation`, the direct-style\n version of [f] is called, which is faster than the CPS version. As a\n consequence, performing an effect in a transitive callee of [f] will\n raise `Effect.Unhandled`, regardless of any effect handlers installed\n before the call to `assume_no_perform`, unless a new effect handler was\n installed in the meantime.\n\n This behaviour is the same when double translation is disabled. *)\nend = struct\n external assume_no_perform : (unit -> 'a) -> 'a = \"caml_assume_no_perform\"\nend\n"],"names":[],"mappings":"yBCiKY,QAAW,YAEN,sBADK,uBAEU,SACnB,iBAAY,C,qDAmCf,EDxMV,0CCwMU,cAA4D,2E","ignoreList":[0]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/prelude-d7e4b000.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/prelude-d7e4b000.wasm
new file mode 100644
index 00000000..04b38d80
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/prelude-d7e4b000.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/runtime-0db9b496.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/runtime-0db9b496.wasm
new file mode 100644
index 00000000..491e554f
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/runtime-0db9b496.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/start-9e868ccd.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/start-9e868ccd.wasm
new file mode 100644
index 00000000..c8a11653
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/start-9e868ccd.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/std_exit-10fb8830.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/std_exit-10fb8830.wasm
new file mode 100644
index 00000000..b2dc0b40
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/std_exit-10fb8830.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/std_exit-10fb8830.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/std_exit-10fb8830.wasm.map
new file mode 100644
index 00000000..fa8fa5ac
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/std_exit-10fb8830.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/std_exit.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Ensure that [at_exit] functions are called at the end of every program *)\n\nlet _ = do_at_exit()\n"],"names":[],"mappings":"6GCiBQ,IDjBR,QCiBQ,cAAY","ignoreList":[0]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/stdlib-23ce0836.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/stdlib-23ce0836.wasm
new file mode 100644
index 00000000..d214489b
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/stdlib-23ce0836.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/stdlib-23ce0836.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/stdlib-23ce0836.wasm.map
new file mode 100644
index 00000000..34062bcb
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/stdlib-23ce0836.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":79773},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/camlinternalFormatBasics.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Benoit Vaugon, ENSTA *)\n(* *)\n(* Copyright 2014 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Padding position. *)\ntype padty =\n | Left (* Text is left justified ('-' option). *)\n | Right (* Text is right justified (no '-' option). *)\n | Zeros (* Text is right justified by zeros (see '0' option). *)\n\n(***)\n\n(* Integer conversion. *)\ntype int_conv =\n | Int_d | Int_pd | Int_sd (* %d | %+d | % d *)\n | Int_i | Int_pi | Int_si (* %i | %+i | % i *)\n | Int_x | Int_Cx (* %x | %#x *)\n | Int_X | Int_CX (* %X | %#X *)\n | Int_o | Int_Co (* %o | %#o *)\n | Int_u (* %u *)\n | Int_Cd | Int_Ci | Int_Cu (* %#d | %#i | %#u *)\n\n(* Float conversion. *)\ntype float_flag_conv =\n | Float_flag_ (* %[feEgGFhH] *)\n | Float_flag_p (* %+[feEgGFhH] *)\n | Float_flag_s (* % [feEgGFhH] *)\ntype float_kind_conv =\n | Float_f (* %f | %+f | % f *)\n | Float_e (* %e | %+e | % e *)\n | Float_E (* %E | %+E | % E *)\n | Float_g (* %g | %+g | % g *)\n | Float_G (* %G | %+G | % G *)\n | Float_F (* %F | %+F | % F *)\n | Float_h (* %h | %+h | % h *)\n | Float_H (* %H | %+H | % H *)\n | Float_CF (* %#F| %+#F| % #F *)\ntype float_conv = float_flag_conv * float_kind_conv\n\n(***)\n\n(* Char sets (see %[...]) are bitmaps implemented as 32-char strings. *)\ntype char_set = string\n\n(***)\n\n(* Counter used in Scanf. *)\ntype counter =\n | Line_counter (* %l *)\n | Char_counter (* %n *)\n | Token_counter (* %N, %L *)\n\n(***)\n\n(* Padding of strings and numbers. *)\ntype ('a, 'b) padding =\n (* No padding (ex: \"%d\") *)\n | No_padding : ('a, 'a) padding\n (* Literal padding (ex: \"%8d\") *)\n | Lit_padding : padty * int -> ('a, 'a) padding\n (* Padding as extra argument (ex: \"%*d\") *)\n | Arg_padding : padty -> (int -> 'a, 'a) padding\n\n(* Some formats, such as %_d,\n only accept an optional number as padding option (no extra argument) *)\ntype pad_option = int option\n\n(* Precision of floats and '0'-padding of integers. *)\ntype ('a, 'b) precision =\n (* No precision (ex: \"%f\") *)\n | No_precision : ('a, 'a) precision\n (* Literal precision (ex: \"%.3f\") *)\n | Lit_precision : int -> ('a, 'a) precision\n (* Precision as extra argument (ex: \"%.*f\") *)\n | Arg_precision : (int -> 'a, 'a) precision\n\n(* Some formats, such as %_f,\n only accept an optional number as precision option (no extra argument) *)\ntype prec_option = int option\n\n(* see the Custom format combinator *)\ntype ('a, 'b, 'c) custom_arity =\n | Custom_zero : ('a, string, 'a) custom_arity\n | Custom_succ : ('a, 'b, 'c) custom_arity ->\n ('a, 'x -> 'b, 'x -> 'c) custom_arity\n\n(***)\n\n(* Relational format types\n\nIn the first format+gadts implementation, the type for %(..%) in the\nfmt GADT was as follows:\n\n| Format_subst : (* %(...%) *)\n pad_option * ('d1, 'q1, 'd2, 'q2) reader_nb_unifier *\n ('x, 'b, 'c, 'd1, 'q1, 'u) fmtty *\n ('u, 'b, 'c, 'q1, 'e1, 'f) fmt ->\n (('x, 'b, 'c, 'd2, 'q2, 'u) format6 -> 'x, 'b, 'c, 'd1, 'e1, 'f) fmt\n\nNotice that the 'u parameter in 'f position in the format argument\n(('x, .., 'u) format6 -> ..) is equal to the 'u parameter in 'a\nposition in the format tail (('u, .., 'f) fmt). This means that the\ntype of the expected format parameter depends of where the %(...%)\nare in the format string:\n\n # Printf.printf \"%(%)\"\n - : (unit, out_channel, unit, '_a, '_a, unit)\n CamlinternalFormatBasics.format6 -> unit\n = \n # Printf.printf \"%(%)%d\"\n - : (int -> unit, out_channel, unit, '_a, '_a, int -> unit)\n CamlinternalFormatBasics.format6 -> int -> unit\n = \n\nOn the contrary, the legacy typer gives a clever type that does not\ndepend on the position of %(..%) in the format string. For example,\n%(%) will have the polymorphic type ('a, 'b, 'c, 'd, 'd, 'a): it can\nbe concatenated to any format type, and only enforces the constraint\nthat its 'a and 'f parameters are equal (no format arguments) and 'd\nand 'e are equal (no reader argument).\n\nThe weakening of this parameter type in the GADT version broke user\ncode (in fact it essentially made %(...%) unusable except at the last\nposition of a format). In particular, the following would not work\nanymore:\n\n fun sep ->\n Format.printf \"foo%(%)bar%(%)baz\" sep sep\n\nAs the type-checker would require two *incompatible* types for the %(%)\nin different positions.\n\nThe solution to regain a general type for %(..%) is to generalize this\ntechnique, not only on the 'd, 'e parameters, but on all six\nparameters of a format: we introduce a \"relational\" type\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\nwhose values are proofs that ('a1, .., 'f1) and ('a2, .., 'f2) morally\ncorrespond to the same format type: 'a1 is obtained from 'f1,'b1,'c1\nin the exact same way that 'a2 is obtained from 'f2,'b2,'c2, etc.\n\nFor example, the relation between two format types beginning with a Char\nparameter is as follows:\n\n| Char_ty : (* %c *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (char -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n char -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n\nIn the general case, the term structure of fmtty_rel is (almost[1])\nisomorphic to the fmtty of the previous implementation: every\nconstructor is re-read with a binary, relational type, instead of the\nprevious unary typing. fmtty can then be re-defined as the diagonal of\nfmtty_rel:\n\n type ('a, 'b, 'c, 'd, 'e, 'f) fmtty =\n ('a, 'b, 'c, 'd, 'e, 'f,\n 'a, 'b, 'c, 'd, 'e, 'f) fmtty_rel\n\nOnce we have this fmtty_rel type in place, we can give the more\ngeneral type to %(...%):\n\n| Format_subst : (* %(...%) *)\n pad_option *\n ('g, 'h, 'i, 'j, 'k, 'l,\n 'g2, 'b, 'c, 'j2, 'd, 'a) fmtty_rel *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'g2, 'b, 'c, 'j2, 'e, 'f) fmt\n\nWe accept any format (('g, 'h, 'i, 'j, 'k, 'l) format6) (this is\ncompletely unrelated to the type of the current format), but also\nrequire a proof that this format is in relation to another format that\nis concatenable to the format tail. When executing a %(...%) format\n(in camlinternalFormat.ml:make_printf or scanf.ml:make_scanf), we\ntranstype the format along this relation using the 'recast' function\nto transpose between related format types.\n\n val recast :\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1) fmt\n -> ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n -> ('a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmt\n\nNOTE [1]: the typing of Format_subst_ty requires not one format type, but\ntwo, one to establish the link between the format argument and the\nfirst six parameters, and the other for the link between the format\nargument and the last six parameters.\n\n| Format_subst_ty : (* %(...%) *)\n ('g, 'h, 'i, 'j, 'k, 'l,\n 'g1, 'b1, 'c1, 'j1, 'd1, 'a1) fmtty_rel *\n ('g, 'h, 'i, 'j, 'k, 'l,\n 'g2, 'b2, 'c2, 'j2, 'd2, 'a2) fmtty_rel *\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'g1, 'b1, 'c1, 'j1, 'e1, 'f1,\n ('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'g2, 'b2, 'c2, 'j2, 'e2, 'f2) fmtty_rel\n\nWhen we generate a format AST, we generate exactly the same witness\nfor both relations, and the witness-conversion functions in\ncamlinternalFormat do rely on this invariant. For example, the\nfunction that proves that the relation is transitive\n\n val trans :\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n -> ('a2, 'b2, 'c2, 'd2, 'e2, 'f2,\n 'a3, 'b3, 'c3, 'd3, 'e3, 'f3) fmtty_rel\n -> ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a3, 'b3, 'c3, 'd3, 'e3, 'f3) fmtty_rel\n\ndoes assume that the two inputs have exactly the same term structure\n(and is only every used for argument witnesses of the\nFormat_subst_ty constructor).\n*)\n\n(* Type of a block used by the Format pretty-printer. *)\ntype block_type =\n | Pp_hbox (* Horizontal block no line breaking *)\n | Pp_vbox (* Vertical block each break leads to a new line *)\n | Pp_hvbox (* Horizontal-vertical block: same as vbox, except if this block\n is small enough to fit on a single line *)\n | Pp_hovbox (* Horizontal or Vertical block: breaks lead to new line\n only when necessary to print the content of the block *)\n | Pp_box (* Horizontal or Indent block: breaks lead to new line\n only when necessary to print the content of the block, or\n when it leads to a new indentation of the current line *)\n | Pp_fits (* Internal usage: when a block fits on a single line *)\n\n(* Formatting element used by the Format pretty-printer. *)\ntype formatting_lit =\n | Close_box (* @] *)\n | Close_tag (* @} *)\n | Break of string * int * int (* @, | @ | @; | @;<> *)\n | FFlush (* @? *)\n | Force_newline (* @\\n *)\n | Flush_newline (* @. *)\n | Magic_size of string * int (* @ *)\n | Escaped_at (* @@ *)\n | Escaped_percent (* @%% *)\n | Scan_indic of char (* @X *)\n\n(* Formatting element used by the Format pretty-printer. *)\ntype ('a, 'b, 'c, 'd, 'e, 'f) formatting_gen =\n | Open_tag : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> (* @{ *)\n ('a, 'b, 'c, 'd, 'e, 'f) formatting_gen\n | Open_box : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> (* @[ *)\n ('a, 'b, 'c, 'd, 'e, 'f) formatting_gen\n\n(***)\n\n(* List of format type elements. *)\n(* In particular used to represent %(...%) and %{...%} contents. *)\nand ('a, 'b, 'c, 'd, 'e, 'f) fmtty =\n ('a, 'b, 'c, 'd, 'e, 'f,\n 'a, 'b, 'c, 'd, 'e, 'f) fmtty_rel\nand ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel =\n | Char_ty : (* %c *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (char -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n char -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | String_ty : (* %s *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (string -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n string -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Int_ty : (* %d *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (int -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n int -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Int32_ty : (* %ld *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (int32 -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n int32 -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Nativeint_ty : (* %nd *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (nativeint -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n nativeint -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Int64_ty : (* %Ld *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (int64 -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n int64 -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Float_ty : (* %f *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (float -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n float -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Bool_ty : (* %B *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (bool -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n bool -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n\n | Format_arg_ty : (* %{...%} *)\n ('g, 'h, 'i, 'j, 'k, 'l) fmtty *\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n ('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2)\n fmtty_rel\n | Format_subst_ty : (* %(...%) *)\n ('g, 'h, 'i, 'j, 'k, 'l,\n 'g1, 'b1, 'c1, 'j1, 'd1, 'a1) fmtty_rel *\n ('g, 'h, 'i, 'j, 'k, 'l,\n 'g2, 'b2, 'c2, 'j2, 'd2, 'a2) fmtty_rel *\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'g1, 'b1, 'c1, 'j1, 'e1, 'f1,\n ('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'g2, 'b2, 'c2, 'j2, 'e2, 'f2)\n fmtty_rel\n\n (* Printf and Format specific constructors. *)\n | Alpha_ty : (* %a *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (('b1 -> 'x -> 'c1) -> 'x -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n ('b2 -> 'x -> 'c2) -> 'x -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Theta_ty : (* %t *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n (('b1 -> 'c1) -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n ('b2 -> 'c2) -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n | Any_ty : (* Used for custom formats *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n ('x -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'x -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel\n\n (* Scanf specific constructor. *)\n | Reader_ty : (* %r *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n ('x -> 'a1, 'b1, 'c1, ('b1 -> 'x) -> 'd1, 'e1, 'f1,\n 'x -> 'a2, 'b2, 'c2, ('b2 -> 'x) -> 'd2, 'e2, 'f2) fmtty_rel\n | Ignored_reader_ty : (* %_r *)\n ('a1, 'b1, 'c1, 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel ->\n ('a1, 'b1, 'c1, ('b1 -> 'x) -> 'd1, 'e1, 'f1,\n 'a2, 'b2, 'c2, ('b2 -> 'x) -> 'd2, 'e2, 'f2) fmtty_rel\n\n | End_of_fmtty :\n ('f1, 'b1, 'c1, 'd1, 'd1, 'f1,\n 'f2, 'b2, 'c2, 'd2, 'd2, 'f2) fmtty_rel\n\n(***)\n\n(* List of format elements. *)\nand ('a, 'b, 'c, 'd, 'e, 'f) fmt =\n | Char : (* %c *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (char -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | Caml_char : (* %C *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (char -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | String : (* %s *)\n ('x, string -> 'a) padding * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Caml_string : (* %S *)\n ('x, string -> 'a) padding * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Int : (* %[dixXuo] *)\n int_conv * ('x, 'y) padding * ('y, int -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Int32 : (* %l[dixXuo] *)\n int_conv * ('x, 'y) padding * ('y, int32 -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Nativeint : (* %n[dixXuo] *)\n int_conv * ('x, 'y) padding * ('y, nativeint -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Int64 : (* %L[dixXuo] *)\n int_conv * ('x, 'y) padding * ('y, int64 -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Float : (* %[feEgGFhH] *)\n float_conv * ('x, 'y) padding * ('y, float -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Bool : (* %[bB] *)\n ('x, bool -> 'a) padding * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'd, 'e, 'f) fmt\n | Flush : (* %! *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmt\n\n | String_literal : (* abc *)\n string * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmt\n | Char_literal : (* x *)\n char * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmt\n\n | Format_arg : (* %{...%} *)\n pad_option * ('g, 'h, 'i, 'j, 'k, 'l) fmtty *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | Format_subst : (* %(...%) *)\n pad_option *\n ('g, 'h, 'i, 'j, 'k, 'l,\n 'g2, 'b, 'c, 'j2, 'd, 'a) fmtty_rel *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (('g, 'h, 'i, 'j, 'k, 'l) format6 -> 'g2, 'b, 'c, 'j2, 'e, 'f) fmt\n\n (* Printf and Format specific constructor. *)\n | Alpha : (* %a *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (('b -> 'x -> 'c) -> 'x -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | Theta : (* %t *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (('b -> 'c) -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n\n (* Format specific constructor: *)\n | Formatting_lit : (* @_ *)\n formatting_lit * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmt\n | Formatting_gen : (* @_ *)\n ('a1, 'b, 'c, 'd1, 'e1, 'f1) formatting_gen *\n ('f1, 'b, 'c, 'e1, 'e2, 'f2) fmt -> ('a1, 'b, 'c, 'd1, 'e2, 'f2) fmt\n\n (* Scanf specific constructors: *)\n | Reader : (* %r *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x -> 'a, 'b, 'c, ('b -> 'x) -> 'd, 'e, 'f) fmt\n | Scan_char_set : (* %[...] *)\n pad_option * char_set * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (string -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | Scan_get_counter : (* %[nlNL] *)\n counter * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (int -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | Scan_next_char : (* %0c *)\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n (char -> 'a, 'b, 'c, 'd, 'e, 'f) fmt\n | Ignored_param : (* %_ *)\n ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmt\n\n (* Custom printing format (PR#6452, GPR#140)\n\n We include a type Custom of \"custom converters\", where an\n arbitrary function can be used to convert one or more\n arguments. There is no syntax for custom converters, it is only\n intended for custom processors that wish to rely on the\n stdlib-defined format GADTs.\n\n For instance a pre-processor could choose to interpret strings\n prefixed with [\"!\"] as format strings where [%{{ ... }}] is\n a special form to pass a to_string function, so that one could\n write:\n\n {[\n type t = { x : int; y : int }\n\n let string_of_t t = Printf.sprintf \"{ x = %d; y = %d }\" t.x t.y\n\n Printf.printf !\"t = %{{string_of_t}}\" { x = 42; y = 42 }\n ]}\n *)\n | Custom :\n ('a, 'x, 'y) custom_arity * (unit -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('y, 'b, 'c, 'd, 'e, 'f) fmt\n\n (* end of a format specification *)\n | End_of_format :\n ('f, 'b, 'c, 'e, 'e, 'f) fmt\n\n(***)\n\n(* Type for ignored parameters (see \"%_\"). *)\nand ('a, 'b, 'c, 'd, 'e, 'f) ignored =\n | Ignored_char : (* %_c *)\n ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_caml_char : (* %_C *)\n ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_string : (* %_s *)\n pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_caml_string : (* %_S *)\n pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_int : (* %_d *)\n int_conv * pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_int32 : (* %_ld *)\n int_conv * pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_nativeint : (* %_nd *)\n int_conv * pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_int64 : (* %_Ld *)\n int_conv * pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_float : (* %_f *)\n pad_option * prec_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_bool : (* %_B *)\n pad_option -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_format_arg : (* %_{...%} *)\n pad_option * ('g, 'h, 'i, 'j, 'k, 'l) fmtty ->\n ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_format_subst : (* %_(...%) *)\n pad_option * ('a, 'b, 'c, 'd, 'e, 'f) fmtty ->\n ('a, 'b, 'c, 'd, 'e, 'f) ignored\n | Ignored_reader : (* %_r *)\n ('a, 'b, 'c, ('b -> 'x) -> 'd, 'd, 'a) ignored\n | Ignored_scan_char_set : (* %_[...] *)\n pad_option * char_set -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_scan_get_counter : (* %_[nlNL] *)\n counter -> ('a, 'b, 'c, 'd, 'd, 'a) ignored\n | Ignored_scan_next_char : (* %_0c *)\n ('a, 'b, 'c, 'd, 'd, 'a) ignored\n\nand ('a, 'b, 'c, 'd, 'e, 'f) format6 =\n Format of ('a, 'b, 'c, 'd, 'e, 'f) fmt * string\n\nlet rec erase_rel : type a b c d e f g h i j k l .\n (a, b, c, d, e, f,\n g, h, i, j, k, l) fmtty_rel -> (a, b, c, d, e, f) fmtty\n= function\n | Char_ty rest ->\n Char_ty (erase_rel rest)\n | String_ty rest ->\n String_ty (erase_rel rest)\n | Int_ty rest ->\n Int_ty (erase_rel rest)\n | Int32_ty rest ->\n Int32_ty (erase_rel rest)\n | Int64_ty rest ->\n Int64_ty (erase_rel rest)\n | Nativeint_ty rest ->\n Nativeint_ty (erase_rel rest)\n | Float_ty rest ->\n Float_ty (erase_rel rest)\n | Bool_ty rest ->\n Bool_ty (erase_rel rest)\n | Format_arg_ty (ty, rest) ->\n Format_arg_ty (ty, erase_rel rest)\n | Format_subst_ty (ty1, _ty2, rest) ->\n Format_subst_ty (ty1, ty1, erase_rel rest)\n | Alpha_ty rest ->\n Alpha_ty (erase_rel rest)\n | Theta_ty rest ->\n Theta_ty (erase_rel rest)\n | Any_ty rest ->\n Any_ty (erase_rel rest)\n | Reader_ty rest ->\n Reader_ty (erase_rel rest)\n | Ignored_reader_ty rest ->\n Ignored_reader_ty (erase_rel rest)\n | End_of_fmtty -> End_of_fmtty\n\n(******************************************************************************)\n (* Format type concatenation *)\n\n(* Concatenate two format types. *)\n(* Used by:\n * reader_nb_unifier_of_fmtty to count readers in an fmtty,\n * Scanf.take_fmtty_format_readers to extract readers inside %(...%),\n * CamlinternalFormat.fmtty_of_ignored_format to extract format type. *)\n\n(*\nlet rec concat_fmtty : type a b c d e f g h .\n (a, b, c, d, e, f) fmtty ->\n (f, b, c, e, g, h) fmtty ->\n (a, b, c, d, g, h) fmtty =\n*)\nlet rec concat_fmtty :\n type a1 b1 c1 d1 e1 f1\n a2 b2 c2 d2 e2 f2\n g1 j1 g2 j2\n .\n (g1, b1, c1, j1, d1, a1,\n g2, b2, c2, j2, d2, a2) fmtty_rel ->\n (a1, b1, c1, d1, e1, f1,\n a2, b2, c2, d2, e2, f2) fmtty_rel ->\n (g1, b1, c1, j1, e1, f1,\n g2, b2, c2, j2, e2, f2) fmtty_rel =\nfun fmtty1 fmtty2 -> match fmtty1 with\n | Char_ty rest ->\n Char_ty (concat_fmtty rest fmtty2)\n | String_ty rest ->\n String_ty (concat_fmtty rest fmtty2)\n | Int_ty rest ->\n Int_ty (concat_fmtty rest fmtty2)\n | Int32_ty rest ->\n Int32_ty (concat_fmtty rest fmtty2)\n | Nativeint_ty rest ->\n Nativeint_ty (concat_fmtty rest fmtty2)\n | Int64_ty rest ->\n Int64_ty (concat_fmtty rest fmtty2)\n | Float_ty rest ->\n Float_ty (concat_fmtty rest fmtty2)\n | Bool_ty rest ->\n Bool_ty (concat_fmtty rest fmtty2)\n | Alpha_ty rest ->\n Alpha_ty (concat_fmtty rest fmtty2)\n | Theta_ty rest ->\n Theta_ty (concat_fmtty rest fmtty2)\n | Any_ty rest ->\n Any_ty (concat_fmtty rest fmtty2)\n | Reader_ty rest ->\n Reader_ty (concat_fmtty rest fmtty2)\n | Ignored_reader_ty rest ->\n Ignored_reader_ty (concat_fmtty rest fmtty2)\n | Format_arg_ty (ty, rest) ->\n Format_arg_ty (ty, concat_fmtty rest fmtty2)\n | Format_subst_ty (ty1, ty2, rest) ->\n Format_subst_ty (ty1, ty2, concat_fmtty rest fmtty2)\n | End_of_fmtty -> fmtty2\n\n(******************************************************************************)\n (* Format concatenation *)\n\n(* Concatenate two formats. *)\nlet rec concat_fmt : type a b c d e f g h .\n (a, b, c, d, e, f) fmt ->\n (f, b, c, e, g, h) fmt ->\n (a, b, c, d, g, h) fmt =\nfun fmt1 fmt2 -> match fmt1 with\n | String (pad, rest) ->\n String (pad, concat_fmt rest fmt2)\n | Caml_string (pad, rest) ->\n Caml_string (pad, concat_fmt rest fmt2)\n\n | Int (iconv, pad, prec, rest) ->\n Int (iconv, pad, prec, concat_fmt rest fmt2)\n | Int32 (iconv, pad, prec, rest) ->\n Int32 (iconv, pad, prec, concat_fmt rest fmt2)\n | Nativeint (iconv, pad, prec, rest) ->\n Nativeint (iconv, pad, prec, concat_fmt rest fmt2)\n | Int64 (iconv, pad, prec, rest) ->\n Int64 (iconv, pad, prec, concat_fmt rest fmt2)\n | Float (fconv, pad, prec, rest) ->\n Float (fconv, pad, prec, concat_fmt rest fmt2)\n\n | Char (rest) ->\n Char (concat_fmt rest fmt2)\n | Caml_char rest ->\n Caml_char (concat_fmt rest fmt2)\n | Bool (pad, rest) ->\n Bool (pad, concat_fmt rest fmt2)\n | Alpha rest ->\n Alpha (concat_fmt rest fmt2)\n | Theta rest ->\n Theta (concat_fmt rest fmt2)\n | Custom (arity, f, rest) ->\n Custom (arity, f, concat_fmt rest fmt2)\n | Reader rest ->\n Reader (concat_fmt rest fmt2)\n | Flush rest ->\n Flush (concat_fmt rest fmt2)\n\n | String_literal (str, rest) ->\n String_literal (str, concat_fmt rest fmt2)\n | Char_literal (chr, rest) ->\n Char_literal (chr, concat_fmt rest fmt2)\n\n | Format_arg (pad, fmtty, rest) ->\n Format_arg (pad, fmtty, concat_fmt rest fmt2)\n | Format_subst (pad, fmtty, rest) ->\n Format_subst (pad, fmtty, concat_fmt rest fmt2)\n\n | Scan_char_set (width_opt, char_set, rest) ->\n Scan_char_set (width_opt, char_set, concat_fmt rest fmt2)\n | Scan_get_counter (counter, rest) ->\n Scan_get_counter (counter, concat_fmt rest fmt2)\n | Scan_next_char (rest) ->\n Scan_next_char (concat_fmt rest fmt2)\n | Ignored_param (ign, rest) ->\n Ignored_param (ign, concat_fmt rest fmt2)\n\n | Formatting_lit (fmting_lit, rest) ->\n Formatting_lit (fmting_lit, concat_fmt rest fmt2)\n | Formatting_gen (fmting_gen, rest) ->\n Formatting_gen (fmting_gen, concat_fmt rest fmt2)\n\n | End_of_format ->\n fmt2\n","(* generated code *)"],"names":[],"mappings":"MAsnBiB,QA2Db,gGA/BsC,IA+BtC,0BA/BkB,SAAoB,MAuBE,IAvBF,mBAuBlB,SAAoB,MAFH,IAEG,UAFzB,SAAsB,MAFU,IAEV,mBAFV,SAAoB,MAFS,IAET,0BAFX,SAAoB,MAf3B,IAe2B,UAfjD,SAAsB,MA0BmB,IA1BnB,mBA0BD,SAAoB,MAFA,IAEA,mBAFpB,SAAoB,MA5BpB,IA4BoB,UA5B1C,SAAsB,MAFA,IAEA,UAFtB,SAAsB,MAkBkB,IAlBlB,0BAkBF,SAAoB,MAFA,IAEA,0BAFpB,SAAoB,MAHL,IAGK,mBAHzB,SAAoB,MAFA,IAEA,mBAFpB,SAAoB,MAHb,IAGa,UAHnC,SAAsB,MAVG,IAUH,mBAVjB,SAAoB,MAPc,IAOd,iCAPN,SAAoB,MAFA,IAEA,iCAFpB,SAAoB,MAFI,IAEJ,iCAFhB,SAAoB,MAFJ,IAEI,iCAFxB,SAAoB,MAFF,IAEE,iCAFtB,SAAoB,MAHL,IAGK,mBAHzB,SAAoB,MAFL,IAEK,mBAFzB,SAAoB,MAkBD,IAlBC,UAkBvB,SAAsB,MAFL,IAEK,UAF3B,SAAsB,KAyCvB,C,MApGa,QA+BD,kEAL4B,IAK5B,UALE,SAA0B,MAFR,IAEQ,UAFlC,SAA0B,MAFH,IAEG,UAF7B,SAA0B,MAFE,IAEF,UAFxB,SAA0B,MAFA,IAEA,UAF1B,SAA0B,MAYgB,IAZhB,0BAYR,SAAwB,MAFR,IAEQ,mBAFhC,SAAwB,MAZT,IAYS,UAZnC,SAA0B,MAFC,IAED,UAFzB,SAA0B,MAFA,IAEA,UAF1B,SAA0B,MAFI,IAEJ,UAFtB,SAA0B,MAFJ,IAEI,UAF9B,SAA0B,MAFF,IAEE,UAF5B,SAA0B,MAFG,IAEH,UAFvB,SAA0B,MAFF,IAEE,UAF5B,SAA0B,KA6BZ,C,MA7FlB,QAkCY,oEADkB,IAClB,UADE,OAAgB,MAFR,IAEQ,UAFxB,OAAgB,MAFH,IAEG,UAFnB,OAAgB,MAFE,IAEF,UAFd,OAAgB,MAFA,IAEA,UAFhB,OAAgB,MAFgB,IAEhB,cAFgB,EAEhB,OAFE,OAAc,MAFR,IAEQ,mBAFtB,OAAc,MAFT,IAES,UAFzB,OAAgB,MAFC,IAED,UAFf,OAAgB,MAJA,IAIA,UAJhB,OAAgB,MAEI,IAFJ,UAEZ,OAAgB,MAJJ,IAII,UAJpB,OAAgB,MAFF,IAEE,UAFlB,OAAgB,MAFG,IAEH,UAFb,OAAgB,MAFF,IAEE,UAFlB,OAAgB,KA6BI,C,ECjjBhC,qB,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":81994},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/stdlib.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Exceptions *)\n\nexternal register_named_value : string -> 'a -> unit\n = \"caml_register_named_value\"\n\nlet () =\n (* for runtime/fail_nat.c *)\n register_named_value \"Pervasives.array_bound_error\"\n (Invalid_argument \"index out of bounds\")\n\nexternal raise : exn -> 'a = \"%raise\"\nexternal raise_notrace : exn -> 'a = \"%raise_notrace\"\n\nlet failwith s = raise(Failure s)\nlet invalid_arg s = raise(Invalid_argument s)\n\nexception Exit\nexception Match_failure = Match_failure\nexception Assert_failure = Assert_failure\nexception Invalid_argument = Invalid_argument\nexception Failure = Failure\nexception Not_found = Not_found\nexception Out_of_memory = Out_of_memory\nexception Stack_overflow = Stack_overflow\nexception Sys_error = Sys_error\nexception End_of_file = End_of_file\nexception Division_by_zero = Division_by_zero\nexception Sys_blocked_io = Sys_blocked_io\nexception Undefined_recursive_module = Undefined_recursive_module\n\n(* Composition operators *)\n\nexternal ( |> ) : 'a -> ('a -> 'b) -> 'b = \"%revapply\"\nexternal ( @@ ) : ('a -> 'b) -> 'a -> 'b = \"%apply\"\n\n(* Debugging *)\n\nexternal __LOC__ : string = \"%loc_LOC\"\nexternal __FILE__ : string = \"%loc_FILE\"\nexternal __LINE__ : int = \"%loc_LINE\"\nexternal __MODULE__ : string = \"%loc_MODULE\"\nexternal __POS__ : string * int * int * int = \"%loc_POS\"\nexternal __FUNCTION__ : string = \"%loc_FUNCTION\"\n\nexternal __LOC_OF__ : 'a -> string * 'a = \"%loc_LOC\"\nexternal __LINE_OF__ : 'a -> int * 'a = \"%loc_LINE\"\nexternal __POS_OF__ : 'a -> (string * int * int * int) * 'a = \"%loc_POS\"\n\n(* Comparisons *)\n\nexternal ( = ) : 'a -> 'a -> bool = \"%equal\"\nexternal ( <> ) : 'a -> 'a -> bool = \"%notequal\"\nexternal ( < ) : 'a -> 'a -> bool = \"%lessthan\"\nexternal ( > ) : 'a -> 'a -> bool = \"%greaterthan\"\nexternal ( <= ) : 'a -> 'a -> bool = \"%lessequal\"\nexternal ( >= ) : 'a -> 'a -> bool = \"%greaterequal\"\nexternal compare : 'a -> 'a -> int = \"%compare\"\n\nlet min x y = if x <= y then x else y\nlet max x y = if x >= y then x else y\n\nexternal ( == ) : 'a -> 'a -> bool = \"%eq\"\nexternal ( != ) : 'a -> 'a -> bool = \"%noteq\"\n\n(* Boolean operations *)\n\nexternal not : bool -> bool = \"%boolnot\"\nexternal ( && ) : bool -> bool -> bool = \"%sequand\"\nexternal ( || ) : bool -> bool -> bool = \"%sequor\"\n\n(* Integer operations *)\n\nexternal ( ~- ) : int -> int = \"%negint\"\nexternal ( ~+ ) : int -> int = \"%identity\"\nexternal succ : int -> int = \"%succint\"\nexternal pred : int -> int = \"%predint\"\nexternal ( + ) : int -> int -> int = \"%addint\"\nexternal ( - ) : int -> int -> int = \"%subint\"\nexternal ( * ) : int -> int -> int = \"%mulint\"\nexternal ( / ) : int -> int -> int = \"%divint\"\nexternal ( mod ) : int -> int -> int = \"%modint\"\n\nlet abs x = if x >= 0 then x else -x\n\nexternal ( land ) : int -> int -> int = \"%andint\"\nexternal ( lor ) : int -> int -> int = \"%orint\"\nexternal ( lxor ) : int -> int -> int = \"%xorint\"\n\nlet lnot x = x lxor (-1)\n\nexternal ( lsl ) : int -> int -> int = \"%lslint\"\nexternal ( lsr ) : int -> int -> int = \"%lsrint\"\nexternal ( asr ) : int -> int -> int = \"%asrint\"\n\nlet max_int = (-1) lsr 1\nlet min_int = max_int + 1\n\n(* Floating-point operations *)\n\nexternal ( ~-. ) : float -> float = \"%negfloat\"\nexternal ( ~+. ) : float -> float = \"%identity\"\nexternal ( +. ) : float -> float -> float = \"%addfloat\"\nexternal ( -. ) : float -> float -> float = \"%subfloat\"\nexternal ( *. ) : float -> float -> float = \"%mulfloat\"\nexternal ( /. ) : float -> float -> float = \"%divfloat\"\nexternal ( ** ) : float -> float -> float = \"caml_power_float\" \"pow\"\n [@@unboxed] [@@noalloc]\nexternal exp : float -> float = \"caml_exp_float\" \"exp\" [@@unboxed] [@@noalloc]\nexternal expm1 : float -> float = \"caml_expm1_float\" \"caml_expm1\"\n [@@unboxed] [@@noalloc]\nexternal acos : float -> float = \"caml_acos_float\" \"acos\"\n [@@unboxed] [@@noalloc]\nexternal asin : float -> float = \"caml_asin_float\" \"asin\"\n [@@unboxed] [@@noalloc]\nexternal atan : float -> float = \"caml_atan_float\" \"atan\"\n [@@unboxed] [@@noalloc]\nexternal atan2 : float -> float -> float = \"caml_atan2_float\" \"atan2\"\n [@@unboxed] [@@noalloc]\nexternal hypot : float -> float -> float\n = \"caml_hypot_float\" \"caml_hypot\" [@@unboxed] [@@noalloc]\nexternal cos : float -> float = \"caml_cos_float\" \"cos\" [@@unboxed] [@@noalloc]\nexternal cosh : float -> float = \"caml_cosh_float\" \"cosh\"\n [@@unboxed] [@@noalloc]\nexternal acosh : float -> float = \"caml_acosh_float\" \"caml_acosh\"\n [@@unboxed] [@@noalloc]\nexternal log : float -> float = \"caml_log_float\" \"log\" [@@unboxed] [@@noalloc]\nexternal log10 : float -> float = \"caml_log10_float\" \"log10\"\n [@@unboxed] [@@noalloc]\nexternal log1p : float -> float = \"caml_log1p_float\" \"caml_log1p\"\n [@@unboxed] [@@noalloc]\nexternal sin : float -> float = \"caml_sin_float\" \"sin\" [@@unboxed] [@@noalloc]\nexternal sinh : float -> float = \"caml_sinh_float\" \"sinh\"\n [@@unboxed] [@@noalloc]\nexternal asinh : float -> float = \"caml_asinh_float\" \"caml_asinh\"\n [@@unboxed] [@@noalloc]\nexternal sqrt : float -> float = \"caml_sqrt_float\" \"sqrt\"\n [@@unboxed] [@@noalloc]\nexternal tan : float -> float = \"caml_tan_float\" \"tan\" [@@unboxed] [@@noalloc]\nexternal tanh : float -> float = \"caml_tanh_float\" \"tanh\"\n [@@unboxed] [@@noalloc]\nexternal atanh : float -> float = \"caml_atanh_float\" \"caml_atanh\"\n [@@unboxed] [@@noalloc]\nexternal ceil : float -> float = \"caml_ceil_float\" \"ceil\"\n [@@unboxed] [@@noalloc]\nexternal floor : float -> float = \"caml_floor_float\" \"floor\"\n [@@unboxed] [@@noalloc]\nexternal abs_float : float -> float = \"%absfloat\"\nexternal copysign : float -> float -> float\n = \"caml_copysign_float\" \"caml_copysign\"\n [@@unboxed] [@@noalloc]\nexternal mod_float : float -> float -> float = \"caml_fmod_float\" \"fmod\"\n [@@unboxed] [@@noalloc]\nexternal frexp : float -> float * int = \"caml_frexp_float\"\nexternal ldexp : (float [@unboxed]) -> (int [@untagged]) -> (float [@unboxed]) =\n \"caml_ldexp_float\" \"caml_ldexp_float_unboxed\" [@@noalloc]\nexternal modf : float -> float * float = \"caml_modf_float\"\nexternal float : int -> float = \"%floatofint\"\nexternal float_of_int : int -> float = \"%floatofint\"\nexternal truncate : float -> int = \"%intoffloat\"\nexternal int_of_float : float -> int = \"%intoffloat\"\nexternal float_of_bits : int64 -> float\n = \"caml_int64_float_of_bits\" \"caml_int64_float_of_bits_unboxed\"\n [@@unboxed] [@@noalloc]\nlet infinity =\n float_of_bits 0x7F_F0_00_00_00_00_00_00L\nlet neg_infinity =\n float_of_bits 0xFF_F0_00_00_00_00_00_00L\nlet nan =\n float_of_bits 0x7F_F8_00_00_00_00_00_01L\nlet max_float =\n float_of_bits 0x7F_EF_FF_FF_FF_FF_FF_FFL\nlet min_float =\n float_of_bits 0x00_10_00_00_00_00_00_00L\nlet epsilon_float =\n float_of_bits 0x3C_B0_00_00_00_00_00_00L\n\ntype fpclass =\n FP_normal\n | FP_subnormal\n | FP_zero\n | FP_infinite\n | FP_nan\nexternal classify_float : (float [@unboxed]) -> fpclass =\n \"caml_classify_float\" \"caml_classify_float_unboxed\" [@@noalloc]\n\n(* String and byte sequence operations -- more in modules String and Bytes *)\n\nexternal string_length : string -> int = \"%string_length\"\nexternal bytes_length : bytes -> int = \"%bytes_length\"\nexternal bytes_create : int -> bytes = \"caml_create_bytes\"\nexternal string_blit : string -> int -> bytes -> int -> int -> unit\n = \"caml_blit_string\" [@@noalloc]\nexternal bytes_blit : bytes -> int -> bytes -> int -> int -> unit\n = \"caml_blit_bytes\" [@@noalloc]\nexternal bytes_unsafe_to_string : bytes -> string = \"%bytes_to_string\"\n\nlet ( ^ ) s1 s2 =\n let l1 = string_length s1 and l2 = string_length s2 in\n let s = bytes_create (l1 + l2) in\n string_blit s1 0 s 0 l1;\n string_blit s2 0 s l1 l2;\n bytes_unsafe_to_string s\n\n(* Character operations -- more in module Char *)\n\nexternal int_of_char : char -> int = \"%identity\"\nexternal unsafe_char_of_int : int -> char = \"%identity\"\nlet char_of_int n =\n if n < 0 || n > 255 then invalid_arg \"char_of_int\" else unsafe_char_of_int n\n\n(* Unit operations *)\n\nexternal ignore : 'a -> unit = \"%ignore\"\n\n(* Pair operations *)\n\nexternal fst : 'a * 'b -> 'a = \"%field0\"\nexternal snd : 'a * 'b -> 'b = \"%field1\"\n\n(* References *)\n\ntype 'a ref = { mutable contents : 'a }\nexternal ref : 'a -> 'a ref = \"%makemutable\"\nexternal ( ! ) : 'a ref -> 'a = \"%field0\"\nexternal ( := ) : 'a ref -> 'a -> unit = \"%setfield0\"\nexternal incr : int ref -> unit = \"%incr\"\nexternal decr : int ref -> unit = \"%decr\"\n\n(* Result type *)\n\ntype ('a,'b) result = Ok of 'a | Error of 'b\n\n(* String conversion functions *)\n\nexternal format_int : string -> int -> string = \"caml_format_int\"\nexternal format_float : string -> float -> string = \"caml_format_float\"\n\nlet string_of_bool b =\n if b then \"true\" else \"false\"\nlet bool_of_string = function\n | \"true\" -> true\n | \"false\" -> false\n | _ -> invalid_arg \"bool_of_string\"\n\nlet bool_of_string_opt = function\n | \"true\" -> Some true\n | \"false\" -> Some false\n | _ -> None\n\nlet string_of_int n =\n format_int \"%d\" n\n\nexternal int_of_string : string -> int = \"caml_int_of_string\"\n\nlet int_of_string_opt s =\n (* TODO: provide this directly as a non-raising primitive. *)\n try Some (int_of_string s)\n with Failure _ -> None\n\nexternal string_get : string -> int -> char = \"%string_safe_get\"\n\nlet valid_float_lexem s =\n let l = string_length s in\n let rec loop i =\n if i >= l then s ^ \".\" else\n match string_get s i with\n | '0' .. '9' | '-' -> loop (i + 1)\n | _ -> s\n in\n loop 0\n\nlet string_of_float f = valid_float_lexem (format_float \"%.12g\" f)\n\nexternal float_of_string : string -> float = \"caml_float_of_string\"\n\nlet float_of_string_opt s =\n (* TODO: provide this directly as a non-raising primitive. *)\n try Some (float_of_string s)\n with Failure _ -> None\n\n(* List operations -- more in module List *)\n\nlet[@tail_mod_cons] rec ( @ ) l1 l2 =\n match l1 with\n | [] -> l2\n | h1 :: [] -> h1 :: l2\n | h1 :: h2 :: [] -> h1 :: h2 :: l2\n | h1 :: h2 :: h3 :: tl -> h1 :: h2 :: h3 :: (tl @ l2)\n\n(* I/O operations *)\n\ntype in_channel\ntype out_channel\n\nexternal open_descriptor_out : int -> out_channel\n = \"caml_ml_open_descriptor_out\"\nexternal open_descriptor_in : int -> in_channel = \"caml_ml_open_descriptor_in\"\n\nlet stdin = open_descriptor_in 0\nlet stdout = open_descriptor_out 1\nlet stderr = open_descriptor_out 2\n\n(* General output functions *)\n\ntype open_flag =\n Open_rdonly | Open_wronly | Open_append\n | Open_creat | Open_trunc | Open_excl\n | Open_binary | Open_text | Open_nonblock\n\nexternal open_desc : string -> open_flag list -> int -> int = \"caml_sys_open\"\n\nexternal set_out_channel_name: out_channel -> string -> unit =\n \"caml_ml_set_channel_name\"\n\nlet open_out_gen mode perm name =\n let c = open_descriptor_out(open_desc name mode perm) in\n set_out_channel_name c name;\n c\n\nlet open_out name =\n open_out_gen [Open_wronly; Open_creat; Open_trunc; Open_text] 0o666 name\n\nlet open_out_bin name =\n open_out_gen [Open_wronly; Open_creat; Open_trunc; Open_binary] 0o666 name\n\nexternal flush : out_channel -> unit = \"caml_ml_flush\"\n\nexternal out_channels_list : unit -> out_channel list\n = \"caml_ml_out_channels_list\"\n\nlet flush_all () =\n let rec iter = function\n [] -> ()\n | a::l ->\n begin try\n flush a\n with Sys_error _ ->\n () (* ignore channels closed during a preceding flush. *)\n end;\n iter l\n in iter (out_channels_list ())\n\nexternal unsafe_output : out_channel -> bytes -> int -> int -> unit\n = \"caml_ml_output_bytes\"\nexternal unsafe_output_string : out_channel -> string -> int -> int -> unit\n = \"caml_ml_output\"\n\nexternal output_char : out_channel -> char -> unit = \"caml_ml_output_char\"\n\nlet output_bytes oc s =\n unsafe_output oc s 0 (bytes_length s)\n\nlet output_string oc s =\n unsafe_output_string oc s 0 (string_length s)\n\nlet output oc s ofs len =\n if ofs < 0 || len < 0 || ofs > bytes_length s - len\n then invalid_arg \"output\"\n else unsafe_output oc s ofs len\n\nlet output_substring oc s ofs len =\n if ofs < 0 || len < 0 || ofs > string_length s - len\n then invalid_arg \"output_substring\"\n else unsafe_output_string oc s ofs len\n\nexternal output_byte : out_channel -> int -> unit = \"caml_ml_output_char\"\nexternal output_binary_int : out_channel -> int -> unit = \"caml_ml_output_int\"\n\nexternal marshal_to_channel : out_channel -> 'a -> unit list -> unit\n = \"caml_output_value\"\nlet output_value chan v = marshal_to_channel chan v []\n\nexternal seek_out : out_channel -> int -> unit = \"caml_ml_seek_out\"\nexternal pos_out : out_channel -> int = \"caml_ml_pos_out\"\nexternal out_channel_length : out_channel -> int = \"caml_ml_channel_size\"\nexternal close_out_channel : out_channel -> unit = \"caml_ml_close_channel\"\nlet close_out oc = flush oc; close_out_channel oc\nlet close_out_noerr oc =\n (try flush oc with _ -> ());\n (try close_out_channel oc with _ -> ())\nexternal set_binary_mode_out : out_channel -> bool -> unit\n = \"caml_ml_set_binary_mode\"\n\n(* General input functions *)\n\nexternal set_in_channel_name: in_channel -> string -> unit =\n \"caml_ml_set_channel_name\"\n\nlet open_in_gen mode perm name =\n let c = open_descriptor_in(open_desc name mode perm) in\n set_in_channel_name c name;\n c\n\nlet open_in name =\n open_in_gen [Open_rdonly; Open_text] 0 name\n\nlet open_in_bin name =\n open_in_gen [Open_rdonly; Open_binary] 0 name\n\nexternal input_char : in_channel -> char = \"caml_ml_input_char\"\n\nexternal unsafe_input : in_channel -> bytes -> int -> int -> int\n = \"caml_ml_input\"\n\nlet input ic s ofs len =\n if ofs < 0 || len < 0 || ofs > bytes_length s - len\n then invalid_arg \"input\"\n else unsafe_input ic s ofs len\n\nlet rec unsafe_really_input ic s ofs len =\n if len <= 0 then () else begin\n let r = unsafe_input ic s ofs len in\n if r = 0\n then raise End_of_file\n else unsafe_really_input ic s (ofs + r) (len - r)\n end\n\nlet really_input ic s ofs len =\n if ofs < 0 || len < 0 || ofs > bytes_length s - len\n then invalid_arg \"really_input\"\n else unsafe_really_input ic s ofs len\n\nlet really_input_string ic len =\n let s = bytes_create len in\n really_input ic s 0 len;\n bytes_unsafe_to_string s\n\nexternal input_scan_line : in_channel -> int = \"caml_ml_input_scan_line\"\n\nlet input_line chan =\n let rec build_result buf pos = function\n [] -> buf\n | hd :: tl ->\n let len = bytes_length hd in\n bytes_blit hd 0 buf (pos - len) len;\n build_result buf (pos - len) tl in\n let rec scan accu len =\n let n = input_scan_line chan in\n if n = 0 then begin (* n = 0: we are at EOF *)\n match accu with\n [] -> raise End_of_file\n | _ -> build_result (bytes_create len) len accu\n end else if n > 0 then begin (* n > 0: newline found in buffer *)\n let res = bytes_create (n - 1) in\n ignore (unsafe_input chan res 0 (n - 1));\n ignore (input_char chan); (* skip the newline *)\n match accu with\n [] -> res\n | _ -> let len = len + n - 1 in\n build_result (bytes_create len) len (res :: accu)\n end else begin (* n < 0: newline not found *)\n let beg = bytes_create (-n) in\n ignore(unsafe_input chan beg 0 (-n));\n scan (beg :: accu) (len - n)\n end\n in bytes_unsafe_to_string (scan [] 0)\n\nexternal input_byte : in_channel -> int = \"caml_ml_input_char\"\nexternal input_binary_int : in_channel -> int = \"caml_ml_input_int\"\nexternal input_value : in_channel -> 'a = \"caml_input_value\"\nexternal seek_in : in_channel -> int -> unit = \"caml_ml_seek_in\"\nexternal pos_in : in_channel -> int = \"caml_ml_pos_in\"\nexternal in_channel_length : in_channel -> int = \"caml_ml_channel_size\"\nexternal close_in : in_channel -> unit = \"caml_ml_close_channel\"\nlet close_in_noerr ic = (try close_in ic with _ -> ())\nexternal set_binary_mode_in : in_channel -> bool -> unit\n = \"caml_ml_set_binary_mode\"\n\n(* Output functions on standard output *)\n\nlet print_char c = output_char stdout c\nlet print_string s = output_string stdout s\nlet print_bytes s = output_bytes stdout s\nlet print_int i = output_string stdout (string_of_int i)\nlet print_float f = output_string stdout (string_of_float f)\nlet print_endline s =\n output_string stdout s; output_char stdout '\\n'; flush stdout\nlet print_newline () = output_char stdout '\\n'; flush stdout\n\n(* Output functions on standard error *)\n\nlet prerr_char c = output_char stderr c\nlet prerr_string s = output_string stderr s\nlet prerr_bytes s = output_bytes stderr s\nlet prerr_int i = output_string stderr (string_of_int i)\nlet prerr_float f = output_string stderr (string_of_float f)\nlet prerr_endline s =\n output_string stderr s; output_char stderr '\\n'; flush stderr\nlet prerr_newline () = output_char stderr '\\n'; flush stderr\n\n(* Input functions on standard input *)\n\nlet read_line () = flush stdout; input_line stdin\nlet read_int () = int_of_string(read_line())\nlet read_int_opt () = int_of_string_opt(read_line())\nlet read_float () = float_of_string(read_line())\nlet read_float_opt () = float_of_string_opt(read_line())\n\n(* Operations on large files *)\n\nmodule LargeFile =\n struct\n external seek_out : out_channel -> int64 -> unit = \"caml_ml_seek_out_64\"\n external pos_out : out_channel -> int64 = \"caml_ml_pos_out_64\"\n external out_channel_length : out_channel -> int64\n = \"caml_ml_channel_size_64\"\n external seek_in : in_channel -> int64 -> unit = \"caml_ml_seek_in_64\"\n external pos_in : in_channel -> int64 = \"caml_ml_pos_in_64\"\n external in_channel_length : in_channel -> int64 = \"caml_ml_channel_size_64\"\n end\n\n(* Formats *)\n\ntype ('a, 'b, 'c, 'd, 'e, 'f) format6\n = ('a, 'b, 'c, 'd, 'e, 'f) CamlinternalFormatBasics.format6\n = Format of ('a, 'b, 'c, 'd, 'e, 'f) CamlinternalFormatBasics.fmt\n * string\n\ntype ('a, 'b, 'c, 'd) format4 = ('a, 'b, 'c, 'c, 'c, 'd) format6\n\ntype ('a, 'b, 'c) format = ('a, 'b, 'c, 'c) format4\n\nlet string_of_format (Format (_fmt, str)) = str\n\nexternal format_of_string :\n ('a, 'b, 'c, 'd, 'e, 'f) format6 ->\n ('a, 'b, 'c, 'd, 'e, 'f) format6 = \"%identity\"\n\nlet ( ^^ ) (Format (fmt1, str1)) (Format (fmt2, str2)) =\n Format (CamlinternalFormatBasics.concat_fmt fmt1 fmt2,\n str1 ^ \"%,\" ^ str2)\n\n(* Miscellaneous *)\n\nexternal sys_exit : int -> 'a = \"caml_sys_exit\"\n\n(* for at_exit *)\ntype 'a atomic_t\nexternal atomic_make : 'a -> 'a atomic_t = \"%makemutable\"\nexternal atomic_get : 'a atomic_t -> 'a = \"%atomic_load\"\nexternal atomic_compare_and_set : 'a atomic_t -> 'a -> 'a -> bool\n = \"%atomic_cas\"\n\nlet exit_function = atomic_make flush_all\n\nlet rec at_exit f =\n (* MPR#7253, MPR#7796: make sure \"f\" is executed only once *)\n let f_yet_to_run = atomic_make true in\n let old_exit = atomic_get exit_function in\n let new_exit () =\n if atomic_compare_and_set f_yet_to_run true false then f () ;\n old_exit ()\n in\n let success = atomic_compare_and_set exit_function old_exit new_exit in\n if not success then at_exit f\n\nlet do_domain_local_at_exit = ref (fun () -> ())\n\nlet do_at_exit () =\n (!do_domain_local_at_exit) ();\n (atomic_get exit_function) ()\n\nlet exit retcode =\n do_at_exit ();\n sys_exit retcode\n\nlet _ = register_named_value \"Pervasives.do_at_exit\" do_at_exit\n\n(*MODULE_ALIASES*)\nmodule Arg = Arg\nmodule Array = Array\nmodule ArrayLabels = ArrayLabels\nmodule Atomic = Atomic\nmodule Bigarray = Bigarray\nmodule Bool = Bool\nmodule Buffer = Buffer\nmodule Bytes = Bytes\nmodule BytesLabels = BytesLabels\nmodule Callback = Callback\nmodule Char = Char\nmodule Complex = Complex\nmodule Condition = Condition\nmodule Digest = Digest\nmodule Domain = Domain\nmodule Dynarray = Dynarray\nmodule Effect = Effect\nmodule Either = Either\nmodule Ephemeron = Ephemeron\nmodule Filename = Filename\nmodule Float = Float\nmodule Format = Format\nmodule Fun = Fun\nmodule Gc = Gc\nmodule Hashtbl = Hashtbl\nmodule In_channel = In_channel\nmodule Int = Int\nmodule Int32 = Int32\nmodule Int64 = Int64\nmodule Lazy = Lazy\nmodule Lexing = Lexing\nmodule List = List\nmodule ListLabels = ListLabels\nmodule Map = Map\nmodule Marshal = Marshal\nmodule MoreLabels = MoreLabels\nmodule Mutex = Mutex\nmodule Nativeint = Nativeint\nmodule Obj = Obj\nmodule Oo = Oo\nmodule Option = Option\nmodule Out_channel = Out_channel\nmodule Parsing = Parsing\nmodule Printexc = Printexc\nmodule Printf = Printf\nmodule Queue = Queue\nmodule Random = Random\nmodule Result = Result\nmodule Scanf = Scanf\nmodule Semaphore = Semaphore\nmodule Seq = Seq\nmodule Set = Set\nmodule Stack = Stack\nmodule StdLabels = StdLabels\nmodule String = String\nmodule StringLabels = StringLabels\nmodule Sys = Sys\nmodule Type = Type\nmodule Uchar = Uchar\nmodule Unit = Unit\nmodule Weak = Weak\n"],"names":[],"mappings":"8ICkkBE,iBACA,IAAgB,C,KALhB,kCAA6B,yBACA,C,EAJc,IAAE,C,KAN3C,0B,CAAA,EAAuD,yBACvD,uBAAW,C,UAJb,wBAMA,MALA,UACA,YAIA,EACA,eAA6B,C,KA1BpB,mCAEM,EAFN,OAEM,EAAP,IAD6C,IAA7C,IACkB,OADlB,aAA6C,MAC1B,C,EARR,UAA0B,C,KA1BJ,IAAnB,OAAmB,OAAa,U,EADrB,IAAf,KAAe,OAAf,EAA4B,C,KADT,IAAjB,OAAiB,OAAa,U,EADrB,IAAb,KAAa,OAAb,EAA0B,C,KADzB,cAAY,eAAkB,C,KAJ1B,kBAAyB,QAAY,C,KAD1D,qBAAwB,aAAyB,QAAY,C,EAFtB,KAAmB,IAAnB,SAAmB,Q,EA3O1D,KA0OsD,IA1OtD,MA0OsD,Q,EADpC,kBAAqB,C,EADpB,kBAAsB,C,EADxB,aAAoB,C,EAjBf,OAAK,IAAW,G,AAAA,I,AAAA,G,EAAA,IAAW,IAAG,C,UAlC/B,aACb,wBAEJ,SACA,wBAAmC,eACJ,C,iBALnC,OAyB0B,QAjBxB,IADQ,MACR,GAAc,UAEJ,SACa,MAAkB,U,GAChC,cAEA,EAFc,OACX,MACH,IAAP,OAAO,KACA,KACP,O,CAAA,EAGQ,cADA,eACa,IAAkB,aAGjC,EAFC,UACG,MACJ,IAAN,OAAM,KACN,4BAEiC,K,KAhC7B,OACR,EADQ,MACR,gBAAuB,IACC,C,WAPxB,8DAEK,oBADA,SACgC,C,QAVrC,yBAEE,IADQ,YACR,GACK,SACA,wC,EAJU,MAKd,C,QAVH,uDAEK,UAAyB,IADzB,SACyB,C,EAV9B,eAA6C,C,EAH7C,eAA2C,C,EALjB,QAAlB,IACR,KAA0B,EACzB,C,EAbD,SAAK,KAAQ,I,AAAA,I,AAAA,G,EAAA,KDzYf,OC0YO,IAAoB,G,AAAA,I,AAAA,G,EAAA,IAAW,IAAG,C,EAHtB,KAAU,IAAoB,C,EANvB,UAA4B,C,QATpD,uDAEK,UAAiC,IADjC,SACiC,C,QAPtC,uDAEK,UAA0B,IAD1B,SAC0B,C,KAL/B,qBAA6C,C,KAH7C,qBAAqC,C,YAV7B,aAAsB,KATf,UACL,mBAEJ,OAFI,OAGA,GAAO,I,AAAA,I,AAAA,G,EAAA,KD9VnB,8DCmWgC,C,EAjB9B,gBAA0E,C,EAH1E,gBAAwE,C,EAL7C,QAAnB,IACR,KAA2B,EAC1B,C,WAlCD,UACQ,kCACM,4CACM,uBACM,IADN,YACM,YAAkB,MADxB,OACwB,KAJ5C,SACQ,2CACM,qDACM,+CACM,uBADN,OACM,4BAA2B,2B,QAVrD,cAA4B,IAAnB,IAAmB,O,AAAA,I,AAAA,G,EAAA,KDpS9B,yDCqSoB,UAAI,C,EAPkB,MAAwB,Q,OAThE,SAOA,EALE,aAAe,OACT,kB,EAAc,EAAd,eAAc,mBACE,UACf,SAEH,C,QAbN,cAA0B,IAAjB,IAAiB,O,AAAA,I,AAAA,G,EAAA,KD/Q5B,yDCgRoB,UAAI,C,EAPtB,MAAiB,C,EANM,cAEV,GADD,EAEL,IADM,gBACF,C,EARQ,cAEN,mBADD,KAEL,WAA4B,C,EAJb,EAAZ,EAAV,WAA6B,C,KA9B7B,wBAAwD,KAA/B,SAAmD,C,QAPpD,C,EAjHb,YAAW,C,KANZ,eAAe,GAAO,aAAE,C,EAvBP,EAAO,EAAnB,MAAM,IAAc,C,EADR,EAAO,EAAnB,MAAM,IAAc,C,EA5CjB,cAAyB,C,EAD5B,cAAgB,C,uCALW,+DAsKF,GAtKE,IAsKF,eA4H9B,QACC,QACA,QAAqB,ySA0Q1B,OAAuD,6P","ignoreList":[0]}},{"offset":{"line":0,"column":86178},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/either.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Gabriel Scherer, projet Parsifal, INRIA Saclay *)\n(* *)\n(* Copyright 2019 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype ('a, 'b) t = Left of 'a | Right of 'b\n\nlet left v = Left v\nlet right v = Right v\n\nlet is_left = function\n| Left _ -> true\n| Right _ -> false\n\nlet is_right = function\n| Left _ -> false\n| Right _ -> true\n\nlet find_left = function\n| Left v -> Some v\n| Right _ -> None\n\nlet find_right = function\n| Left _ -> None\n| Right v -> Some v\n\nlet map_left f = function\n| Left v -> Left (f v)\n| Right _ as e -> e\n\nlet map_right f = function\n| Left _ as e -> e\n| Right v -> Right (f v)\n\nlet map ~left ~right = function\n| Left v -> Left (left v)\n| Right v -> Right (right v)\n\nlet fold ~left ~right = function\n| Left v -> left v\n| Right v -> right v\n\nlet iter = fold\n\nlet for_all = fold\n\nlet equal ~left ~right e1 e2 = match e1, e2 with\n| Left v1, Left v2 -> left v1 v2\n| Right v1, Right v2 -> right v1 v2\n| Left _, Right _ | Right _, Left _ -> false\n\nlet compare ~left ~right e1 e2 = match e1, e2 with\n| Left v1, Left v2 -> left v1 v2\n| Right v1, Right v2 -> right v1 v2\n| Left _, Right _ -> (-1)\n| Right _, Left _ -> 1\n","(* generated code *)"],"names":[],"mappings":"KA6DiC,sDACX,MAED,wBACA,KADA,UACA,UAFG,OAEF,C,KATS,oDACT,wB,CAAA,mBACE,OACe,IAAK,C,QAXnC,0BACG,0BACC,gB,CAAO,C,QANZ,oBACiB,IADjB,OACS,eAAQ,KACG,IADH,UACN,eAAS,M,QANd,oBACG,GACO,IADP,UACE,eAAK,M,QANX,oBACS,IADT,OACI,eAAK,KACJ,GAAC,C,EANF,kBACL,KACC,IADD,UACC,KAAM,C,KANH,oBACJ,IADI,OACJ,KACC,KAAI,C,EANF,gBAEF,EAAI,C,EANH,eAED,EAAK,C,EAJJ,UAAO,C,EADR,UAAM,C,ECjBnB,2C,QAAA,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":87241},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/sys.ml.in"],"sourcesContent":["(* generated code *)","(* @configure_input@ *)\n#3 \"sys.ml.in\"\n(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype backend_type =\n | Native\n | Bytecode\n | Other of string\n(* System interface *)\n\nexternal get_config: unit -> string * int * bool = \"caml_sys_get_config\"\nexternal get_executable_name : unit -> string = \"caml_sys_executable_name\"\nexternal argv : string array = \"%sys_argv\"\nexternal big_endian : unit -> bool = \"%big_endian\"\nexternal word_size : unit -> int = \"%word_size\"\nexternal int_size : unit -> int = \"%int_size\"\nexternal max_wosize : unit -> int = \"%max_wosize\"\nexternal unix : unit -> bool = \"%ostype_unix\"\nexternal win32 : unit -> bool = \"%ostype_win32\"\nexternal cygwin : unit -> bool = \"%ostype_cygwin\"\nexternal get_backend_type : unit -> backend_type = \"%backend_type\"\n\nlet executable_name = get_executable_name()\nlet (os_type, _, _) = get_config()\nlet backend_type = get_backend_type ()\nlet big_endian = big_endian ()\nlet word_size = word_size ()\nlet int_size = int_size ()\nlet unix = unix ()\nlet win32 = win32 ()\nlet cygwin = cygwin ()\nlet max_array_length = max_wosize ()\nlet max_floatarray_length = max_array_length / (64 / word_size)\nlet max_string_length = word_size / 8 * max_array_length - 1\nexternal runtime_variant : unit -> string = \"caml_runtime_variant\"\nexternal runtime_parameters : unit -> string = \"caml_runtime_parameters\"\n\nexternal file_exists: string -> bool = \"caml_sys_file_exists\"\nexternal is_directory : string -> bool = \"caml_sys_is_directory\"\nexternal is_regular_file : string -> bool = \"caml_sys_is_regular_file\"\nexternal remove: string -> unit = \"caml_sys_remove\"\nexternal rename : string -> string -> unit = \"caml_sys_rename\"\nexternal getenv: string -> string = \"caml_sys_getenv\"\n\nlet getenv_opt s =\n (* TODO: expose a non-raising primitive directly. *)\n try Some (getenv s)\n with Not_found -> None\n\nexternal command: string -> int = \"caml_sys_system_command\"\nexternal time: unit -> (float [@unboxed]) =\n \"caml_sys_time\" \"caml_sys_time_unboxed\" [@@noalloc]\nexternal chdir: string -> unit = \"caml_sys_chdir\"\nexternal mkdir: string -> int -> unit = \"caml_sys_mkdir\"\nexternal rmdir: string -> unit = \"caml_sys_rmdir\"\nexternal getcwd: unit -> string = \"caml_sys_getcwd\"\nexternal readdir : string -> string array = \"caml_sys_read_directory\"\n\nlet interactive = ref false\n\ntype signal_behavior =\n Signal_default\n | Signal_ignore\n | Signal_handle of (int -> unit)\n\nexternal signal : int -> signal_behavior -> signal_behavior\n = \"caml_install_signal_handler\"\n\nlet set_signal sig_num sig_beh = ignore(signal sig_num sig_beh)\n\nlet sigabrt = -1\nlet sigalrm = -2\nlet sigfpe = -3\nlet sighup = -4\nlet sigill = -5\nlet sigint = -6\nlet sigkill = -7\nlet sigpipe = -8\nlet sigquit = -9\nlet sigsegv = -10\nlet sigterm = -11\nlet sigusr1 = -12\nlet sigusr2 = -13\nlet sigchld = -14\nlet sigcont = -15\nlet sigstop = -16\nlet sigtstp = -17\nlet sigttin = -18\nlet sigttou = -19\nlet sigvtalrm = -20\nlet sigprof = -21\nlet sigbus = -22\nlet sigpoll = -23\nlet sigsys = -24\nlet sigtrap = -25\nlet sigurg = -26\nlet sigxcpu = -27\nlet sigxfsz = -28\n\nexception Break\n\nlet catch_break on =\n if on then\n set_signal sigint (Signal_handle(fun _ -> raise Break))\n else\n set_signal sigint Signal_default\n\n\nexternal enable_runtime_warnings: bool -> unit =\n \"caml_ml_enable_runtime_warnings\"\nexternal runtime_warnings_enabled: unit -> bool =\n \"caml_ml_runtime_warnings_enabled\"\n\n(* The version string is found in file ../VERSION *)\n\nlet ocaml_version = \"@VERSION@\"\n\nlet development_version = @OCAML_DEVELOPMENT_VERSION@\n\ntype extra_prefix = Plus | Tilde\n\ntype extra_info = extra_prefix * string\n\ntype ocaml_release_info = {\n major : int;\n minor : int;\n patchlevel : int;\n extra : extra_info option\n}\n\nlet ocaml_release = {\n major = @OCAML_VERSION_MAJOR@;\n minor = @OCAML_VERSION_MINOR@;\n patchlevel = @OCAML_VERSION_PATCHLEVEL@;\n extra = @OCAML_RELEASE_EXTRA@\n}\n\n(* Optimization *)\n\nexternal opaque_identity : 'a -> 'a = \"%opaque\"\n\nmodule Immediate64 = struct\n module type Non_immediate = sig\n type t\n end\n module type Immediate = sig\n type t [@@immediate]\n end\n\n module Make(Immediate : Immediate)(Non_immediate : Non_immediate) = struct\n type t [@@immediate64]\n type 'a repr =\n | Immediate : Immediate.t repr\n | Non_immediate : Non_immediate.t repr\n external magic : _ repr -> t repr = \"%identity\"\n let repr =\n if word_size = 64 then\n magic Immediate\n else\n magic Non_immediate\n end\nend\n"],"names":[],"mappings":"gBC4KQ,a,EA3FuD,IAqC3B,C,EArC2B,K,EAtB7D,OAAmB,IAAV,IAAU,O,AAAA,I,AAAA,G,EAAA,GD3DrB,kDC4DoB,UAAI,C,cAzBF,QACA,MAAY,4E,EAAA,mN","ignoreList":[0]}},{"offset":{"line":0,"column":87752},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/obj.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Operations on internal representations of values *)\n\ntype t\n\ntype raw_data = nativeint\n\nexternal repr : 'a -> t = \"%identity\"\nexternal obj : t -> 'a = \"%identity\"\nexternal magic : 'a -> 'b = \"%identity\"\nexternal is_int : t -> bool = \"%obj_is_int\"\nlet [@inline always] is_block a = not (is_int a)\nexternal tag : t -> int = \"caml_obj_tag\" [@@noalloc]\nexternal size : t -> int = \"%obj_size\"\nexternal reachable_words : t -> int = \"caml_obj_reachable_words\"\nexternal field : t -> int -> t = \"%obj_field\"\nexternal set_field : t -> int -> t -> unit = \"%obj_set_field\"\nexternal floatarray_get : floatarray -> int -> float = \"caml_floatarray_get\"\nexternal floatarray_set :\n floatarray -> int -> float -> unit = \"caml_floatarray_set\"\nlet [@inline always] double_field x i = floatarray_get (obj x : floatarray) i\nlet [@inline always] set_double_field x i v =\n floatarray_set (obj x : floatarray) i v\nexternal raw_field : t -> int -> raw_data = \"caml_obj_raw_field\"\nexternal set_raw_field : t -> int -> raw_data -> unit\n = \"caml_obj_set_raw_field\"\n\nexternal new_block : int -> int -> t = \"caml_obj_block\"\nexternal dup : t -> t = \"caml_obj_dup\"\nexternal add_offset : t -> Int32.t -> t = \"caml_obj_add_offset\"\nexternal with_tag : int -> t -> t = \"caml_obj_with_tag\"\n\nlet first_non_constant_constructor_tag = 0\nlet last_non_constant_constructor_tag = 243\n\nlet forcing_tag = 244\nlet cont_tag = 245\nlet lazy_tag = 246\nlet closure_tag = 247\nlet object_tag = 248\nlet infix_tag = 249\nlet forward_tag = 250\n\nlet no_scan_tag = 251\n\nlet abstract_tag = 251\nlet string_tag = 252\nlet double_tag = 253\nlet double_array_tag = 254\nlet custom_tag = 255\n\n\nlet int_tag = 1000\nlet out_of_heap_tag = 1001\nlet unaligned_tag = 1002\n\nmodule Extension_constructor =\nstruct\n type t = extension_constructor\n let of_val x =\n let x = repr x in\n let slot =\n if (is_block x) && (tag x) <> object_tag && (size x) >= 1 then field x 0\n else x\n in\n let name =\n if (is_block slot) && (tag slot) = object_tag then field slot 0\n else invalid_arg \"Obj.extension_constructor\"\n in\n if (tag name) = string_tag then (obj slot : t)\n else invalid_arg \"Obj.extension_constructor\"\n\n let [@inline always] name (slot : t) =\n (obj (field (repr slot) 0) : string)\n\n let [@inline always] id (slot : t) =\n (obj (field (repr slot) 1) : int)\nend\n\nmodule Ephemeron = struct\n type obj_t = t\n\n type t (** ephemeron *)\n\n (** To change in sync with weak.h *)\n let additional_values = 2\n let max_ephe_length = Sys.max_array_length - additional_values\n\n external create : int -> t = \"caml_ephe_create\"\n let create l =\n if not (0 <= l && l <= max_ephe_length) then\n invalid_arg \"Obj.Ephemeron.create\";\n create l\n\n let length x = size(repr x) - additional_values\n\n let raise_if_invalid_offset e o msg =\n if not (0 <= o && o < length e) then\n invalid_arg msg\n\n external get_key: t -> int -> obj_t option = \"caml_ephe_get_key\"\n let get_key e o =\n raise_if_invalid_offset e o \"Obj.Ephemeron.get_key\";\n get_key e o\n\n external get_key_copy: t -> int -> obj_t option = \"caml_ephe_get_key_copy\"\n let get_key_copy e o =\n raise_if_invalid_offset e o \"Obj.Ephemeron.get_key_copy\";\n get_key_copy e o\n\n external set_key: t -> int -> obj_t -> unit = \"caml_ephe_set_key\"\n let set_key e o x =\n raise_if_invalid_offset e o \"Obj.Ephemeron.set_key\";\n set_key e o x\n\n external unset_key: t -> int -> unit = \"caml_ephe_unset_key\"\n let unset_key e o =\n raise_if_invalid_offset e o \"Obj.Ephemeron.unset_key\";\n unset_key e o\n\n external check_key: t -> int -> bool = \"caml_ephe_check_key\"\n let check_key e o =\n raise_if_invalid_offset e o \"Obj.Ephemeron.check_key\";\n check_key e o\n\n external blit_key : t -> int -> t -> int -> int -> unit\n = \"caml_ephe_blit_key\"\n\n let blit_key e1 o1 e2 o2 l =\n if l < 0 || o1 < 0 || o1 > length e1 - l\n || o2 < 0 || o2 > length e2 - l\n then invalid_arg \"Obj.Ephemeron.blit_key\"\n else if l <> 0 then blit_key e1 o1 e2 o2 l\n\n external get_data: t -> obj_t option = \"caml_ephe_get_data\"\n external get_data_copy: t -> obj_t option = \"caml_ephe_get_data_copy\"\n external set_data: t -> obj_t -> unit = \"caml_ephe_set_data\"\n external unset_data: t -> unit = \"caml_ephe_unset_data\"\n external check_data: t -> bool = \"caml_ephe_check_data\"\n external blit_data : t -> t -> unit = \"caml_ephe_blit_data\"\n\nend\n"],"names":[],"mappings":"sDC+II,4BAA2B,SAAS,qCACf,SAAS,uBAEzB,aAAe,aAAsB,WADrC,uBACqC,C,EAV1C,WACA,MAAa,C,EANb,WACA,MAAa,C,EANb,WACA,QAAa,C,EANb,WACA,MAAgB,C,EANhB,WACA,MAAW,C,OANX,gBAA8B,IAAR,SAAQ,O,GAAA,MAC5B,4BAAe,C,IAJJ,S,CAAA,4BAAgC,C,OAJ7C,4CACE,yBACF,IAAQ,C,IAhBH,U,CAAA,6BAAqB,C,IAHrB,U,CAAA,6BAAqB,C,KAXrB,SAAY,K,CAAA,EAAI,IAAO,kB,CAAA,4BAAqC,Q,CAAA,6BAAS,KAItD,GAAf,SAAe,K,CAAA,EAAI,IAAU,QAAmB,U,CAAA,6BAAY,IAC1D,wBAEF,EAAU,SAAoB,GAC5B,wBAAuC,C,QAhDhD,iDAAuC,U,QAFD,2CAAqC,M,EAT3C,QAAc,C","ignoreList":[0]}},{"offset":{"line":0,"column":89257},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/type.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2022 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Type equality witness *)\n\ntype (_, _) eq = Equal: ('a, 'a) eq\n\n(* Type identifiers *)\n\nmodule Id = struct\n type _ id = ..\n module type ID = sig\n type t\n type _ id += Id : t id\n end\n\n type !'a t = (module ID with type t = 'a)\n\n let make (type a) () : a t =\n (module struct type t = a type _ id += Id : t id end)\n\n let[@inline] uid (type a) ((module A) : a t) =\n Obj.Extension_constructor.id (Obj.Extension_constructor.of_val A.Id)\n\n let provably_equal\n (type a b) ((module A) : a t) ((module B) : b t) : (a, b) eq option\n =\n match A.Id with B.Id -> Some Equal | _ -> None\nend\n","(* generated code *)"],"names":[],"mappings":"EAuCI,YAAwB,GAAkB,IAA1C,kDAA8C,C,EAL9C,0BAA6B,aAAuC,8B,EAHpE,0BAAqD,C,EC/BzD,iC,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":89518},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/atomic.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Stephen Dolan, University of Cambridge *)\n(* *)\n(* Copyright 2017-2018 University of Cambridge. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype !'a t\n\nexternal make : 'a -> 'a t = \"%makemutable\"\nexternal make_contended : 'a -> 'a t = \"caml_atomic_make_contended\"\nexternal get : 'a t -> 'a = \"%atomic_load\"\nexternal exchange : 'a t -> 'a -> 'a = \"%atomic_exchange\"\nexternal compare_and_set : 'a t -> 'a -> 'a -> bool = \"%atomic_cas\"\nexternal fetch_and_add : int t -> int -> int = \"%atomic_fetch_add\"\nexternal ignore : 'a -> unit = \"%ignore\"\n\nlet set r x = ignore (exchange r x)\nlet incr r = ignore (fetch_and_add r 1)\nlet decr r = ignore (fetch_and_add r (-1))\n"],"names":[],"mappings":"0DC0Ba,aAA6B,C,EAD7B,aAA0B,C,EADzB,WAAqB,C","ignoreList":[0]}},{"offset":{"line":0,"column":89804},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/camlinternalLazy.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1997 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Internals of forcing lazy values. *)\n\ntype 'a t = 'a lazy_t\n\nexception Undefined\n\n(* [update_to_forcing blk] tries to update a [blk] with [lazy_tag] to\n [forcing_tag] using compare-and-swap (CAS), taking care to handle concurrent\n marking of the header word by a concurrent GC thread. Returns [0] if the\n CAS is successful. If the CAS fails, then the tag was observed to be\n something other than [lazy_tag] due to a concurrent mutator. In this case,\n the function returns [1]. *)\nexternal update_to_forcing : Obj.t -> int =\n \"caml_lazy_update_to_forcing\" [@@noalloc]\n\n(* [reset_to_lazy blk] expects [blk] to be a lazy object with [Obj.forcing_tag]\n and updates the tag to [Obj.lazy_tag], taking care to handle concurrent\n marking of this object's header by a concurrent GC thread. *)\nexternal reset_to_lazy : Obj.t -> unit = \"caml_lazy_reset_to_lazy\" [@@noalloc]\n\n(* [update_to_forward blk] expects [blk] to be a lazy object with\n [Obj.forcing_tag] and updates the tag to [Obj.forward_tag], taking care to\n handle concurrent marking of this object's header by a concurrent GC thread.\n *)\nexternal update_to_forward : Obj.t -> unit =\n \"caml_lazy_update_to_forward\" [@@noalloc]\n\n(* Assumes [blk] is a block with tag forcing *)\nlet do_force_block blk =\n let b = Obj.repr blk in\n let closure = (Obj.obj (Obj.field b 0) : unit -> 'arg) in\n Obj.set_field b 0 (Obj.repr ()); (* Release the closure *)\n try\n let result = closure () in\n Obj.set_field b 0 (Obj.repr result);\n update_to_forward b;\n result\n with e ->\n Obj.set_field b 0 (Obj.repr (fun () -> raise e));\n reset_to_lazy b;\n raise e\n\n(* Assumes [blk] is a block with tag forcing *)\nlet do_force_val_block blk =\n let b = Obj.repr blk in\n let closure = (Obj.obj (Obj.field b 0) : unit -> 'arg) in\n Obj.set_field b 0 (Obj.repr ()); (* Release the closure *)\n let result = closure () in\n Obj.set_field b 0 (Obj.repr result);\n update_to_forward b;\n result\n\n(* Called by [force_gen] *)\nlet force_gen_lazy_block ~only_val (blk : 'arg lazy_t) =\n (* We expect the tag to be [lazy_tag], but may be other tags due to\n concurrent forcing of lazy values. *)\n match update_to_forcing (Obj.repr blk) with\n | 0 when only_val -> do_force_val_block blk\n | 0 -> do_force_block blk\n | _ -> raise Undefined\n\n(* used in the %lazy_force primitive *)\nlet force_lazy_block blk = force_gen_lazy_block ~only_val:false blk\n\n(* [force_gen ~only_val:false] is not used, since [Lazy.force] is\n declared as a primitive whose code inlines the tag tests of its\n argument, except when afl instrumentation is turned on. *)\nlet force_gen ~only_val (lzv : 'arg lazy_t) =\n (* Using [Sys.opaque_identity] prevents two potential problems:\n - If the value is known to have Forward_tag, then it could have been\n shortcut during GC, so that information must be forgotten (see GPR#713\n and issue #7301). This is not an issue here at the moment since\n [Obj.tag] is not simplified by the compiler, and GPR#713 also\n ensures that no value will be known to have Forward_tag.\n - If the value is known to be immutable, then if the compiler\n cannot prove that the last branch is not taken it will issue a\n warning 59 (modification of an immutable value) *)\n let lzv = Sys.opaque_identity lzv in\n let x = Obj.repr lzv in\n (* START no safe points. If a GC occurs here, then the object [x] may be\n short-circuited, and getting the first field of [x] would get us the wrong\n value. Luckily, the compiler does not insert GC safe points at this place,\n so it is ok. *)\n let t = Obj.tag x in\n if t = Obj.forward_tag then\n (Obj.obj (Obj.field x 0) : 'arg)\n (* END no safe points *)\n else if t = Obj.forcing_tag then raise Undefined\n else if t <> Obj.lazy_tag then (Obj.obj x : 'arg)\n else force_gen_lazy_block ~only_val lzv\n","(* generated code *)"],"names":[],"mappings":"WAkGU,WACR,EADiB,QACjB,yCACW,U,CAAA,8BAEN,iDAA4B,SAC5B,iDACA,cAD2B,KACO,C,EA3Bd,kBAAwC,C,EAxBxB,WAAO,C,SAkBV,IAAhC,IAAgC,IAC7B,UA3Bc,uCACvB,2BAOE,GAP6B,OAEhB,mBACb,8CACA,KAAmB,K,AAAA,I,AAAA,G,EAAA,KAGnB,8BACA,KAAe,KAMM,uCACvB,2BACa,mBACb,8CACA,KAAmB,IAOb,EAGC,OAAe,C,QC1ExB,gE,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":90592},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/lazy.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1997 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Module [Lazy]: deferred computations *)\n\n\n(*\n WARNING: some purple magic is going on here. Do not take this file\n as an example of how to program in OCaml.\n*)\n\n\n(* We make use of two special tags provided by the runtime:\n [lazy_tag] and [forward_tag].\n\n A value of type ['a Lazy.t] can be one of three things:\n 1. A block of size 1 with tag [lazy_tag]. Its field is a closure of\n type [unit -> 'a] that computes the value.\n 2. A block of size 1 with tag [forward_tag]. Its field is the value\n of type ['a] that was computed.\n 3. Anything else except a float. This has type ['a] and is the value\n that was computed.\n Exceptions are stored in format (1).\n The GC will magically change things from (2) to (3) according to its\n fancy.\n\n If OCaml was configured with the -flat-float-array option (which is\n currently the default), the following is also true:\n We cannot use representation (3) for a [float Lazy.t] because\n [caml_make_array] assumes that only a [float] value can have tag\n [Double_tag].\n\n We have to use the built-in type constructor [lazy_t] to\n let the compiler implement the special typing and compilation\n rules for the [lazy] keyword.\n*)\n\ntype 'a t = 'a CamlinternalLazy.t\n\nexception Undefined = CamlinternalLazy.Undefined\nexternal make_forward : 'a -> 'a lazy_t = \"caml_lazy_make_forward\"\nexternal force : 'a t -> 'a = \"%lazy_force\"\n\nlet force_val l = CamlinternalLazy.force_gen ~only_val:true l\n\nlet from_fun (f : unit -> 'arg) =\n let x = Obj.new_block Obj.lazy_tag 1 in\n Obj.set_field x 0 (Obj.repr f);\n (Obj.obj x : 'arg t)\n\nlet from_val (v : 'arg) =\n let t = Obj.tag (Obj.repr v) in\n if t = Obj.forward_tag || t = Obj.lazy_tag ||\n t = Obj.forcing_tag || t = Obj.double_tag then begin\n make_forward v\n end else begin\n (Obj.magic v : 'arg t)\n end\n\nlet is_val (l : 'arg t) = Obj.tag (Obj.repr l) <> Obj.lazy_tag\n\nlet map f x =\n lazy (f (force x))\n\nlet map_val f x =\n if is_val x\n then from_val (f (force x))\n else lazy (f (force x))\n"],"names":[],"mappings":"oIC6EK,SAAQ,QAEN,oBADA,2B,EAAA,Q,CAAA,U,CAAA,8BAAS,iBAAa,QACJ,C,EALvB,mBAAkB,C,EAHM,cAAoB,uCAAgB,C,MARpD,IACR,EAD4B,QAC5B,sC,CAAA,gD,CAAA,gD,CAAA,gD,CAAA,EAIG,OAH+C,IAI/C,C,EAVH,KADA,QAAQ,MACR,uCAA8B,EACV,C,EALJ,2BAA2C,C","ignoreList":[0]}},{"offset":{"line":0,"column":91355},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/seq.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Simon Cruanes *)\n(* *)\n(* Copyright 2017 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Module [Seq]: functional iterators *)\n\ntype +'a node =\n | Nil\n | Cons of 'a * 'a t\n\nand 'a t = unit -> 'a node\n\nlet empty () = Nil\n\nlet return x () = Cons (x, empty)\n\nlet cons x next () = Cons (x, next)\n\nlet rec append seq1 seq2 () =\n match seq1() with\n | Nil -> seq2()\n | Cons (x, next) -> Cons (x, append next seq2)\n\nlet rec map f seq () = match seq() with\n | Nil -> Nil\n | Cons (x, next) -> Cons (f x, map f next)\n\nlet rec filter_map f seq () = match seq() with\n | Nil -> Nil\n | Cons (x, next) ->\n match f x with\n | None -> filter_map f next ()\n | Some y -> Cons (y, filter_map f next)\n\nlet rec filter f seq () = match seq() with\n | Nil -> Nil\n | Cons (x, next) ->\n if f x\n then Cons (x, filter f next)\n else filter f next ()\n\nlet rec concat seq () = match seq () with\n | Nil -> Nil\n | Cons (x, next) ->\n append x (concat next) ()\n\nlet rec flat_map f seq () = match seq () with\n | Nil -> Nil\n | Cons (x, next) ->\n append (f x) (flat_map f next) ()\n\nlet concat_map = flat_map\n\nlet rec fold_left f acc seq =\n match seq () with\n | Nil -> acc\n | Cons (x, next) ->\n let acc = f acc x in\n fold_left f acc next\n\nlet rec iter f seq =\n match seq () with\n | Nil -> ()\n | Cons (x, next) ->\n f x;\n iter f next\n\nlet rec unfold f u () =\n match f u with\n | None -> Nil\n | Some (x, u') -> Cons (x, unfold f u')\n\nlet is_empty xs =\n match xs() with\n | Nil ->\n true\n | Cons (_, _) ->\n false\n\nlet uncons xs =\n match xs() with\n | Cons (x, xs) ->\n Some (x, xs)\n | Nil ->\n None\n\n\n\nlet rec length_aux accu xs =\n match xs() with\n | Nil ->\n accu\n | Cons (_, xs) ->\n length_aux (accu + 1) xs\n\nlet[@inline] length xs =\n length_aux 0 xs\n\nlet rec iteri_aux f i xs =\n match xs() with\n | Nil ->\n ()\n | Cons (x, xs) ->\n f i x;\n iteri_aux f (i+1) xs\n\nlet[@inline] iteri f xs =\n iteri_aux f 0 xs\n\nlet rec fold_lefti_aux f accu i xs =\n match xs() with\n | Nil ->\n accu\n | Cons (x, xs) ->\n let accu = f accu i x in\n fold_lefti_aux f accu (i+1) xs\n\nlet[@inline] fold_lefti f accu xs =\n fold_lefti_aux f accu 0 xs\n\nlet rec for_all p xs =\n match xs() with\n | Nil ->\n true\n | Cons (x, xs) ->\n p x && for_all p xs\n\nlet rec exists p xs =\n match xs() with\n | Nil ->\n false\n | Cons (x, xs) ->\n p x || exists p xs\n\nlet rec find p xs =\n match xs() with\n | Nil ->\n None\n | Cons (x, xs) ->\n if p x then Some x else find p xs\n\nlet find_index p xs =\n let rec aux i xs = match xs() with\n | Nil ->\n None\n | Cons (x, xs) ->\n if p x then Some i else aux (i+1) xs in\n aux 0 xs\n\nlet rec find_map f xs =\n match xs() with\n | Nil ->\n None\n | Cons (x, xs) ->\n match f x with\n | None ->\n find_map f xs\n | Some _ as result ->\n result\n\nlet find_mapi f xs =\n let rec aux i xs = match xs() with\n | Nil ->\n None\n | Cons (x, xs) ->\n match f i x with\n | None ->\n aux (i+1) xs\n | Some _ as result ->\n result in\n aux 0 xs\n\n(* [iter2], [fold_left2], [for_all2], [exists2], [map2], [zip] work also in\n the case where the two sequences have different lengths. They stop as soon\n as one sequence is exhausted. Their behavior is slightly asymmetric: when\n [xs] is empty, they do not force [ys]; however, when [ys] is empty, [xs] is\n forced, even though the result of the function application [xs()] turns out\n to be useless. *)\n\nlet rec iter2 f xs ys =\n match xs() with\n | Nil ->\n ()\n | Cons (x, xs) ->\n match ys() with\n | Nil ->\n ()\n | Cons (y, ys) ->\n f x y;\n iter2 f xs ys\n\nlet rec fold_left2 f accu xs ys =\n match xs() with\n | Nil ->\n accu\n | Cons (x, xs) ->\n match ys() with\n | Nil ->\n accu\n | Cons (y, ys) ->\n let accu = f accu x y in\n fold_left2 f accu xs ys\n\nlet rec for_all2 f xs ys =\n match xs() with\n | Nil ->\n true\n | Cons (x, xs) ->\n match ys() with\n | Nil ->\n true\n | Cons (y, ys) ->\n f x y && for_all2 f xs ys\n\nlet rec exists2 f xs ys =\n match xs() with\n | Nil ->\n false\n | Cons (x, xs) ->\n match ys() with\n | Nil ->\n false\n | Cons (y, ys) ->\n f x y || exists2 f xs ys\n\nlet rec equal eq xs ys =\n match xs(), ys() with\n | Nil, Nil ->\n true\n | Cons (x, xs), Cons (y, ys) ->\n eq x y && equal eq xs ys\n | Nil, Cons (_, _)\n | Cons (_, _), Nil ->\n false\n\nlet rec compare cmp xs ys =\n match xs(), ys() with\n | Nil, Nil ->\n 0\n | Cons (x, xs), Cons (y, ys) ->\n let c = cmp x y in\n if c <> 0 then c else compare cmp xs ys\n | Nil, Cons (_, _) ->\n -1\n | Cons (_, _), Nil ->\n +1\n\n\n\n(* [init_aux f i j] is the sequence [f i, ..., f (j-1)]. *)\n\nlet rec init_aux f i j () =\n if i < j then begin\n Cons (f i, init_aux f (i + 1) j)\n end\n else\n Nil\n\nlet init n f =\n if n < 0 then\n invalid_arg \"Seq.init\"\n else\n init_aux f 0 n\n\nlet rec repeat x () =\n Cons (x, repeat x)\n\nlet rec forever f () =\n Cons (f(), forever f)\n\n(* This preliminary definition of [cycle] requires the sequence [xs]\n to be nonempty. Applying it to an empty sequence would produce a\n sequence that diverges when it is forced. *)\n\nlet rec cycle_nonempty xs () =\n append xs (cycle_nonempty xs) ()\n\n(* [cycle xs] checks whether [xs] is empty and, if so, returns an empty\n sequence. Otherwise, [cycle xs] produces one copy of [xs] followed\n with the infinite sequence [cycle_nonempty xs]. Thus, the nonemptiness\n check is performed just once. *)\n\nlet cycle xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs') ->\n Cons (x, append xs' (cycle_nonempty xs))\n\n(* [iterate1 f x] is the sequence [f x, f (f x), ...].\n It is equivalent to [tail (iterate f x)].\n [iterate1] is used as a building block in the definition of [iterate]. *)\n\nlet rec iterate1 f x () =\n let y = f x in\n Cons (y, iterate1 f y)\n\n(* [iterate f x] is the sequence [x, f x, ...]. *)\n\n(* The reason why we give this slightly indirect definition of [iterate],\n as opposed to the more naive definition that may come to mind, is that\n we are careful to avoid evaluating [f x] until this function call is\n actually necessary. The naive definition (not shown here) computes the\n second argument of the sequence, [f x], when the first argument is\n requested by the user. *)\n\nlet iterate f x =\n cons x (iterate1 f x)\n\n\n\nlet rec mapi_aux f i xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n Cons (f i x, mapi_aux f (i+1) xs)\n\nlet[@inline] mapi f xs =\n mapi_aux f 0 xs\n\n(* [tail_scan f s xs] is equivalent to [tail (scan f s xs)].\n [tail_scan] is used as a building block in the definition of [scan]. *)\n\n(* This slightly indirect definition of [scan] is meant to avoid computing\n elements too early; see the above comment about [iterate1] and [iterate]. *)\n\nlet rec tail_scan f s xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n let s = f s x in\n Cons (s, tail_scan f s xs)\n\nlet scan f s xs =\n cons s (tail_scan f s xs)\n\n(* [take] is defined in such a way that [take 0 xs] returns [empty]\n immediately, without allocating any memory. *)\n\nlet rec take_aux n xs =\n if n = 0 then\n empty\n else\n fun () ->\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n Cons (x, take_aux (n-1) xs)\n\nlet take n xs =\n if n < 0 then invalid_arg \"Seq.take\";\n take_aux n xs\n\n(* [force_drop n xs] is equivalent to [drop n xs ()].\n [force_drop n xs] requires [n > 0].\n [force_drop] is used as a building block in the definition of [drop]. *)\n\nlet rec force_drop n xs =\n match xs() with\n | Nil ->\n Nil\n | Cons (_, xs) ->\n let n = n - 1 in\n if n = 0 then\n xs()\n else\n force_drop n xs\n\n(* [drop] is defined in such a way that [drop 0 xs] returns [xs] immediately,\n without allocating any memory. *)\n\nlet drop n xs =\n if n < 0 then invalid_arg \"Seq.drop\"\n else if n = 0 then\n xs\n else\n fun () ->\n force_drop n xs\n\nlet rec take_while p xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n if p x then Cons (x, take_while p xs) else Nil\n\nlet rec drop_while p xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) as node ->\n if p x then drop_while p xs () else node\n\nlet rec group eq xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n Cons (cons x (take_while (eq x) xs), group eq (drop_while (eq x) xs))\n\nexception Forced_twice\n\nmodule Suspension = struct\n\n type 'a suspension =\n unit -> 'a\n\n (* Conversions. *)\n\n let to_lazy : 'a suspension -> 'a Lazy.t =\n Lazy.from_fun\n (* fun s -> lazy (s()) *)\n\n let from_lazy (s : 'a Lazy.t) : 'a suspension =\n fun () -> Lazy.force s\n\n (* [memoize] turns an arbitrary suspension into a persistent suspension. *)\n\n let memoize (s : 'a suspension) : 'a suspension =\n from_lazy (to_lazy s)\n\n (* [failure] is a suspension that fails when forced. *)\n\n let failure : _ suspension =\n fun () ->\n (* A suspension created by [once] has been forced twice. *)\n raise Forced_twice\n\n (* If [f] is a suspension, then [once f] is a suspension that can be forced\n at most once. If it is forced more than once, then [Forced_twice] is\n raised. *)\n\n let once (f : 'a suspension) : 'a suspension =\n let action = Atomic.make f in\n fun () ->\n (* Get the function currently stored in [action], and write the\n function [failure] in its place, so the next access will result\n in a call to [failure()]. *)\n let f = Atomic.exchange action failure in\n f()\n\nend (* Suspension *)\n\nlet rec memoize xs =\n Suspension.memoize (fun () ->\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n Cons (x, memoize xs)\n )\n\nlet rec once xs =\n Suspension.once (fun () ->\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n Cons (x, once xs)\n )\n\n\nlet rec zip xs ys () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n match ys() with\n | Nil ->\n Nil\n | Cons (y, ys) ->\n Cons ((x, y), zip xs ys)\n\nlet rec map2 f xs ys () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n match ys() with\n | Nil ->\n Nil\n | Cons (y, ys) ->\n Cons (f x y, map2 f xs ys)\n\nlet rec interleave xs ys () =\n match xs() with\n | Nil ->\n ys()\n | Cons (x, xs) ->\n Cons (x, interleave ys xs)\n\n(* [sorted_merge1l cmp x xs ys] is equivalent to\n [sorted_merge cmp (cons x xs) ys].\n\n [sorted_merge1r cmp xs y ys] is equivalent to\n [sorted_merge cmp xs (cons y ys)].\n\n [sorted_merge1 cmp x xs y ys] is equivalent to\n [sorted_merge cmp (cons x xs) (cons y ys)].\n\n These three functions are used as building blocks in the definition\n of [sorted_merge]. *)\n\nlet rec sorted_merge1l cmp x xs ys () =\n match ys() with\n | Nil ->\n Cons (x, xs)\n | Cons (y, ys) ->\n sorted_merge1 cmp x xs y ys\n\nand sorted_merge1r cmp xs y ys () =\n match xs() with\n | Nil ->\n Cons (y, ys)\n | Cons (x, xs) ->\n sorted_merge1 cmp x xs y ys\n\nand sorted_merge1 cmp x xs y ys =\n if cmp x y <= 0 then\n Cons (x, sorted_merge1r cmp xs y ys)\n else\n Cons (y, sorted_merge1l cmp x xs ys)\n\nlet sorted_merge cmp xs ys () =\n match xs(), ys() with\n | Nil, Nil ->\n Nil\n | Nil, c\n | c, Nil ->\n c\n | Cons (x, xs), Cons (y, ys) ->\n sorted_merge1 cmp x xs y ys\n\n\nlet rec map_fst xys () =\n match xys() with\n | Nil ->\n Nil\n | Cons ((x, _), xys) ->\n Cons (x, map_fst xys)\n\nlet rec map_snd xys () =\n match xys() with\n | Nil ->\n Nil\n | Cons ((_, y), xys) ->\n Cons (y, map_snd xys)\n\nlet unzip xys =\n map_fst xys, map_snd xys\n\nlet split =\n unzip\n\n(* [filter_map_find_left_map f xs] is equivalent to\n [filter_map Either.find_left (map f xs)]. *)\n\nlet rec filter_map_find_left_map f xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n match f x with\n | Either.Left y ->\n Cons (y, filter_map_find_left_map f xs)\n | Either.Right _ ->\n filter_map_find_left_map f xs ()\n\nlet rec filter_map_find_right_map f xs () =\n match xs() with\n | Nil ->\n Nil\n | Cons (x, xs) ->\n match f x with\n | Either.Left _ ->\n filter_map_find_right_map f xs ()\n | Either.Right z ->\n Cons (z, filter_map_find_right_map f xs)\n\nlet partition_map f xs =\n filter_map_find_left_map f xs,\n filter_map_find_right_map f xs\n\nlet partition p xs =\n filter p xs, filter (fun x -> not (p x)) xs\n\n(* If [xss] is a matrix (a sequence of rows), then [peel xss] is a pair of\n the first column (a sequence of elements) and of the remainder of the\n matrix (a sequence of shorter rows). These two sequences have the same\n length. The rows of the matrix [xss] are not required to have the same\n length. An empty row is ignored. *)\n\n(* Because [peel] uses [unzip], its argument must be persistent. The same\n remark applies to [transpose], [diagonals], [product], etc. *)\n\nlet peel xss =\n unzip (filter_map uncons xss)\n\nlet rec transpose xss () =\n let heads, tails = peel xss in\n if is_empty heads then begin\n assert (is_empty tails);\n Nil\n end\n else\n Cons (heads, transpose tails)\n\n(* The internal function [diagonals] takes an extra argument, [remainders],\n which contains the remainders of the rows that have already been\n discovered. *)\n\nlet rec diagonals remainders xss () =\n match xss() with\n | Cons (xs, xss) ->\n begin match xs() with\n | Cons (x, xs) ->\n (* We discover a new nonempty row [x :: xs]. Thus, the next diagonal\n is [x :: heads]: this diagonal begins with [x] and continues with\n the first element of every row in [remainders]. In the recursive\n call, the argument [remainders] is instantiated with [xs ::\n tails], which means that we have one more remaining row, [xs],\n and that we keep the tails of the pre-existing remaining rows. *)\n let heads, tails = peel remainders in\n Cons (cons x heads, diagonals (cons xs tails) xss)\n | Nil ->\n (* We discover a new empty row. In this case, the new diagonal is\n just [heads], and [remainders] is instantiated with just [tails],\n as we do not have one more remaining row. *)\n let heads, tails = peel remainders in\n Cons (heads, diagonals tails xss)\n end\n | Nil ->\n (* There are no more rows to be discovered. There remains to exhaust\n the remaining rows. *)\n transpose remainders ()\n\n(* If [xss] is a matrix (a sequence of rows), then [diagonals xss] is\n the sequence of its diagonals.\n\n The first diagonal contains just the first element of the\n first row. The second diagonal contains the first element of the\n second row and the second element of the first row; and so on.\n This kind of diagonal is in fact sometimes known as an antidiagonal.\n\n - Every diagonal is a finite sequence.\n - The rows of the matrix [xss] are not required to have the same length.\n - The matrix [xss] is not required to be finite (in either direction).\n - The matrix [xss] must be persistent. *)\n\nlet diagonals xss =\n diagonals empty xss\n\nlet map_product f xs ys =\n concat (diagonals (\n map (fun x ->\n map (fun y ->\n f x y\n ) ys\n ) xs\n ))\n\nlet product xs ys =\n map_product (fun x y -> (x, y)) xs ys\n\nlet of_dispenser it =\n let rec c () =\n match it() with\n | None ->\n Nil\n | Some x ->\n Cons (x, c)\n in\n c\n\nlet to_dispenser xs =\n let s = ref xs in\n fun () ->\n match (!s)() with\n | Nil ->\n None\n | Cons (x, xs) ->\n s := xs;\n Some x\n\n\n\nlet rec ints i () =\n Cons (i, ints (i + 1))\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":99754},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/option.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype 'a t = 'a option = None | Some of 'a\n\nlet none = None\nlet some v = Some v\nlet value o ~default = match o with Some v -> v | None -> default\nlet get = function Some v -> v | None -> invalid_arg \"option is None\"\nlet bind o f = match o with None -> None | Some v -> f v\nlet join = function Some o -> o | None -> None\nlet map f o = match o with None -> None | Some v -> Some (f v)\nlet fold ~none ~some = function Some v -> some v | None -> none\nlet iter f = function Some v -> f v | None -> ()\nlet is_none = function None -> true | Some _ -> false\nlet is_some = function None -> false | Some _ -> true\n\nlet equal eq o0 o1 = match o0, o1 with\n| Some v0, Some v1 -> eq v0 v1\n| None, None -> true\n| _ -> false\n\nlet compare cmp o0 o1 = match o0, o1 with\n| Some v0, Some v1 -> cmp v0 v1\n| None, None -> 0\n| None, Some _ -> -1\n| Some _, None -> 1\n\nlet to_result ~none = function None -> Error none | Some v -> Ok v\nlet to_list = function None -> [] | Some v -> [v]\nlet to_seq = function None -> Seq.empty | Some v -> Seq.return v\n"],"names":[],"mappings":"wCC0Ca,UAAiB,SAAsB,GAAtB,UAAsB,YAAY,C,EADlD,UAAiB,KAAe,IAAf,UAAe,SAAG,C,EADnC,UAAyB,WAAuB,IAAvB,UAAuB,KAAI,C,EAN1C,UAER,EACE,EAHM,QAGN,aACA,KADA,UACA,UAHI,OAGH,C,EATE,kBAEL,c,CAAA,sBADM,OAEf,IAAK,C,EALE,QAAmC,EAAI,C,EADvC,OAAkC,EAAK,C,KAD5C,UAAqC,eAAd,gBAAgB,C,KADvC,UAAkD,aAAjB,gBAAqB,C,KADjD,UAAqB,KAA2B,IAA3B,UAAsB,eAAK,M,EADnD,UAA+B,gBAAI,C,KAD/B,UAAqB,eAAiB,gBAAG,C,EAD9C,UAA+B,mCAA4B,C,EAD9C,UAAmC,cAAO,C,EADpD,UAAM,C","ignoreList":[0]}},{"offset":{"line":0,"column":100672},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/result.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype ('a, 'e) t = ('a, 'e) result = Ok of 'a | Error of 'e\n\nlet ok v = Ok v\nlet error e = Error e\nlet value r ~default = match r with Ok v -> v | Error _ -> default\nlet get_ok = function Ok v -> v | Error _ -> invalid_arg \"result is Error _\"\nlet get_error = function Error e -> e | Ok _ -> invalid_arg \"result is Ok _\"\nlet bind r f = match r with Ok v -> f v | Error _ as e -> e\nlet join = function Ok r -> r | Error _ as e -> e\nlet map f = function Ok v -> Ok (f v) | Error _ as e -> e\nlet map_error f = function Error e -> Error (f e) | Ok _ as v -> v\nlet fold ~ok ~error = function Ok v -> ok v | Error e -> error e\nlet iter f = function Ok v -> f v | Error _ -> ()\nlet iter_error f = function Error e -> f e | Ok _ -> ()\nlet is_ok = function Ok _ -> true | Error _ -> false\nlet is_error = function Error _ -> true | Ok _ -> false\n\nlet equal ~ok ~error r0 r1 = match r0, r1 with\n| Ok v0, Ok v1 -> ok v0 v1\n| Error e0, Error e1 -> error e0 e1\n| _, _ -> false\n\nlet compare ~ok ~error r0 r1 = match r0, r1 with\n| Ok v0, Ok v1 -> ok v0 v1\n| Error e0, Error e1 -> error e0 e1\n| Ok _, Error _ -> -1\n| Error _, Ok _ -> 1\n\nlet to_option = function Ok v -> Some v | Error _ -> None\nlet to_list = function Ok v -> [v] | Error _ -> []\nlet to_seq = function Ok v -> Seq.return v | Error _ -> Seq.empty\n"],"names":[],"mappings":"2CC6Ca,oBAAiB,GAAjB,OAAiB,YAA0B,SAAS,C,KADnD,oBAAiB,IAAjB,OAAiB,SAAiB,KAAE,C,KADlC,oBAAiB,IAAjB,OAAiB,KAAoB,KAAI,C,KAN1B,sDACb,MAEC,wBACA,KADA,UACA,UAFK,OAEJ,C,KATS,oDACX,wB,CAAA,mBACM,OACd,IAAK,C,EALA,gBAAoB,EAAoB,C,EAD3C,eAAmC,EAAK,C,KADrC,kBAAsC,eAAd,gBAAgB,C,QAD9C,2BAAqB,gBAAiB,KAAE,C,QADxC,0BAA8B,0BAAkB,gB,CAAO,C,QADlD,oBAAmD,GAAhB,IAAgB,UAArB,eAAK,KAAiB,C,QAD1D,oBAA6B,IAA7B,OAAwB,eAAK,KAAmB,GAAC,C,KAD9C,4BAAqC,GAAC,C,QADlC,2BAAqB,gBAAsB,GAAC,C,EAD3C,kBAAgC,mCAA4B,C,KAD/D,4BAAgC,wBAA+B,C,KADrD,4BAAoC,GAAO,C,EADpD,UAAO,C,EADV,UAAI,C","ignoreList":[0]}},{"offset":{"line":0,"column":102127},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/bool.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype t = bool = false | true\n\nexternal not : bool -> bool = \"%boolnot\"\nexternal ( && ) : bool -> bool -> bool = \"%sequand\"\nexternal ( || ) : bool -> bool -> bool = \"%sequor\"\nlet equal : bool -> bool -> bool = ( = )\nlet compare : bool -> bool -> int = Stdlib.compare\nexternal to_int : bool -> int = \"%identity\"\nlet to_float = function false -> 0. | true -> 1.\n\n(*\nlet of_string = function\n| \"false\" -> Some false\n| \"true\" -> Some true\n| _ -> None\n*)\n\nlet to_string = function false -> \"false\" | true -> \"true\"\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n"],"names":[],"mappings":"oBCqCa,iBAA4B,C,EADhB,eAA+B,C,EAJtB,GAAkB,GAApC,WAA0C,C,EATzB,GAAa,GAA/B,WAAiC,C","ignoreList":[0]}},{"offset":{"line":0,"column":102397},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/char.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Character operations *)\n\nexternal code: char -> int = \"%identity\"\nexternal unsafe_chr: int -> char = \"%identity\"\n\nlet chr n =\n if n < 0 || n > 255 then invalid_arg \"Char.chr\" else unsafe_chr n\n\nexternal bytes_create: int -> bytes = \"caml_create_bytes\"\nexternal bytes_unsafe_set : bytes -> int -> char -> unit\n = \"%bytes_unsafe_set\"\nexternal unsafe_to_string : bytes -> string = \"%bytes_to_string\"\n\nlet escaped = function\n | '\\'' -> \"\\\\'\"\n | '\\\\' -> \"\\\\\\\\\"\n | '\\n' -> \"\\\\n\"\n | '\\t' -> \"\\\\t\"\n | '\\r' -> \"\\\\r\"\n | '\\b' -> \"\\\\b\"\n | ' ' .. '~' as c ->\n let s = bytes_create 1 in\n bytes_unsafe_set s 0 c;\n unsafe_to_string s\n | c ->\n let n = code c in\n let s = bytes_create 4 in\n bytes_unsafe_set s 0 '\\\\';\n bytes_unsafe_set s 1 (unsafe_chr (48 + n / 100));\n bytes_unsafe_set s 2 (unsafe_chr (48 + (n / 10) mod 10));\n bytes_unsafe_set s 3 (unsafe_chr (48 + n mod 10));\n unsafe_to_string s\n\nlet lowercase_ascii = function\n | 'A' .. 'Z' as c -> unsafe_chr(code c + 32)\n | c -> c\n\nlet uppercase_ascii = function\n | 'a' .. 'z' as c -> unsafe_chr(code c - 32)\n | c -> c\n\ntype t = char\n\nlet compare c1 c2 = code c1 - code c2\nlet equal (c1: t) (c2: t) = compare c1 c2 = 0\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n","(* generated code *)"],"names":[],"mappings":"EAgEa,iBAA4B,C,EADhB,eAA+B,C,EALpC,eACqB,MAAI,C,EADzB,iBAAiB,C,KANf,sBAEb,GADc,aACb,C,KANY,sBAEb,GADc,aACb,C,QAtBI,S,CAAA,c,CAAA,GAEF,O,CAAA,e,CAAA,Y,CAAA,OADA,Q,CAAA,oB,CAAA,mBAIA,KAFA,KACA,KAEA,MAEE,MACR,S,CAAA,QACA,KAGQ,MACR,aACA,M,CAAA,eACA,M,CAAA,cACA,M,CAAA,WACA,IAAkB,C,KAzBtB,wBAAqD,KAA5B,uBAAwC,C,ECrBnE,wC,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":102985},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/uchar.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Daniel C. Buenzli *)\n(* *)\n(* Copyright 2014 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nexternal format_int : string -> int -> string = \"caml_format_int\"\n\nlet err_no_pred = \"U+0000 has no predecessor\"\nlet err_no_succ = \"U+10FFFF has no successor\"\nlet err_not_sv i = format_int \"%X\" i ^ \" is not an Unicode scalar value\"\nlet err_not_latin1 u = \"U+\" ^ format_int \"%04X\" u ^ \" is not a latin1 character\"\n\ntype t = int\n\nlet min = 0x0000\nlet max = 0x10FFFF\nlet lo_bound = 0xD7FF\nlet hi_bound = 0xE000\n\nlet bom = 0xFEFF\nlet rep = 0xFFFD\n\nlet succ u =\n if u = lo_bound then hi_bound else\n if u = max then invalid_arg err_no_succ else\n u + 1\n\nlet pred u =\n if u = hi_bound then lo_bound else\n if u = min then invalid_arg err_no_pred else\n u - 1\n\nlet is_valid i = (min <= i && i <= lo_bound) || (hi_bound <= i && i <= max)\nlet of_int i = if is_valid i then i else invalid_arg (err_not_sv i)\nexternal unsafe_of_int : int -> t = \"%identity\"\nexternal to_int : t -> int = \"%identity\"\n\nlet is_char u = u < 256\nlet of_char c = Char.code c\nlet to_char u =\n if u > 255 then invalid_arg (err_not_latin1 u) else\n Char.unsafe_chr u\n\nlet unsafe_to_char = Char.unsafe_chr\n\nlet equal : int -> int -> bool = ( = )\nlet compare : int -> int -> int = Stdlib.compare\nlet hash = to_int\n\n(* UTF codecs tools *)\n\ntype utf_decode = int\n(* This is an int [0xDUUUUUU] decomposed as follows:\n - [D] is four bits for decode information, the highest bit is set if the\n decode is valid. The three lower bits indicate the number of elements\n from the source that were consumed by the decode.\n - [UUUUUU] is the decoded Unicode character or the Unicode replacement\n character U+FFFD if for invalid decodes. *)\n\nlet valid_bit = 27\nlet decode_bits = 24\n\nlet[@inline] utf_decode_is_valid d = (d lsr valid_bit) = 1\nlet[@inline] utf_decode_length d = (d lsr decode_bits) land 0b111\nlet[@inline] utf_decode_uchar d = unsafe_of_int (d land 0xFFFFFF)\nlet[@inline] utf_decode n u = ((8 lor n) lsl decode_bits) lor (to_int u)\nlet[@inline] utf_decode_invalid n = (n lsl decode_bits) lor rep\n\nlet utf_8_byte_length u = match to_int u with\n| u when u < 0 -> assert false\n| u when u <= 0x007F -> 1\n| u when u <= 0x07FF -> 2\n| u when u <= 0xFFFF -> 3\n| u when u <= 0x10FFFF -> 4\n| _ -> assert false\n\nlet utf_16_byte_length u = match to_int u with\n| u when u < 0 -> assert false\n| u when u <= 0xFFFF -> 2\n| u when u <= 0x10FFFF -> 4\n| _ -> assert false\n"],"names":[],"mappings":"UCuFS,eACA,YACA,aACF,gBADmB,MADF,MADN,gBAGC,C,KAXV,eACA,WACA,WACA,YACA,aACF,gBADmB,MADF,MADA,MADA,MADN,gBAKC,C,EARiB,iBAA2B,C,EADjC,uBAA0C,C,EADtC,eAA+B,C,EAD9B,sBAA8B,C,EAD5B,sBAAqB,C,mFAtBxD,gBA9B8E,GAAlD,UAAmB,OAAnB,aAAkD,oBA8BhC,qBAC9C,GAAiB,C,EAJH,aAAO,C,EAJL,SAAU,QAxBT,OAAiB,uBAwB+B,qBAAjC,GAAiC,C,OADlD,iC,CAAA,oCAA0D,C,EAJzE,YAAqB,OACrB,UAAgB,wBAChB,cAAK,C,EAPL,YAAqB,OACrB,aAAgB,wBAChB,cAAK,C","ignoreList":[0]}},{"offset":{"line":0,"column":103961},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/list.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* An alias for the type of lists. *)\ntype 'a t = 'a list = [] | (::) of 'a * 'a list\n\n(* List operations *)\n\nlet rec length_aux len = function\n [] -> len\n | _::l -> length_aux (len + 1) l\n\nlet length l = length_aux 0 l\n\nlet cons a l = a::l\n\nlet hd = function\n [] -> failwith \"hd\"\n | a::_ -> a\n\nlet tl = function\n [] -> failwith \"tl\"\n | _::l -> l\n\nlet nth l n =\n if n < 0 then invalid_arg \"List.nth\" else\n let rec nth_aux l n =\n match l with\n | [] -> failwith \"nth\"\n | a::l -> if n = 0 then a else nth_aux l (n-1)\n in nth_aux l n\n\nlet nth_opt l n =\n if n < 0 then invalid_arg \"List.nth\" else\n let rec nth_aux l n =\n match l with\n | [] -> None\n | a::l -> if n = 0 then Some a else nth_aux l (n-1)\n in nth_aux l n\n\nlet append = (@)\n\nlet rec rev_append l1 l2 =\n match l1 with\n [] -> l2\n | a :: l -> rev_append l (a :: l2)\n\nlet rev l = rev_append l []\n\nlet[@tail_mod_cons] rec init i last f =\n if i > last then []\n else if i = last then [f i]\n else\n let r1 = f i in\n let r2 = f (i+1) in\n r1 :: r2 :: init (i+2) last f\n\nlet init len f =\n if len < 0 then invalid_arg \"List.init\" else\n init 0 (len - 1) f\n\nlet rec flatten = function\n [] -> []\n | l::r -> l @ flatten r\n\nlet concat = flatten\n\nlet[@tail_mod_cons] rec map f = function\n [] -> []\n | [a1] ->\n let r1 = f a1 in\n [r1]\n | a1::a2::l ->\n let r1 = f a1 in\n let r2 = f a2 in\n r1::r2::map f l\n\nlet[@tail_mod_cons] rec mapi i f = function\n [] -> []\n | [a1] ->\n let r1 = f i a1 in\n [r1]\n | a1::a2::l ->\n let r1 = f i a1 in\n let r2 = f (i+1) a2 in\n r1::r2::mapi (i+2) f l\n\nlet mapi f l = mapi 0 f l\n\nlet rev_map f l =\n let rec rmap_f accu = function\n | [] -> accu\n | a::l -> rmap_f (f a :: accu) l\n in\n rmap_f [] l\n\n\nlet rec iter f = function\n [] -> ()\n | a::l -> f a; iter f l\n\nlet rec iteri i f = function\n [] -> ()\n | a::l -> f i a; iteri (i + 1) f l\n\nlet iteri f l = iteri 0 f l\n\nlet rec fold_left f accu l =\n match l with\n [] -> accu\n | a::l -> fold_left f (f accu a) l\n\nlet rec fold_right f l accu =\n match l with\n [] -> accu\n | a::l -> f a (fold_right f l accu)\n\nlet[@tail_mod_cons] rec map2 f l1 l2 =\n match (l1, l2) with\n ([], []) -> []\n | ([a1], [b1]) ->\n let r1 = f a1 b1 in\n [r1]\n | (a1::a2::l1, b1::b2::l2) ->\n let r1 = f a1 b1 in\n let r2 = f a2 b2 in\n r1::r2::map2 f l1 l2\n | (_, _) -> invalid_arg \"List.map2\"\n\nlet rev_map2 f l1 l2 =\n let rec rmap2_f accu l1 l2 =\n match (l1, l2) with\n | ([], []) -> accu\n | (a1::l1, a2::l2) -> rmap2_f (f a1 a2 :: accu) l1 l2\n | (_, _) -> invalid_arg \"List.rev_map2\"\n in\n rmap2_f [] l1 l2\n\n\nlet rec iter2 f l1 l2 =\n match (l1, l2) with\n ([], []) -> ()\n | (a1::l1, a2::l2) -> f a1 a2; iter2 f l1 l2\n | (_, _) -> invalid_arg \"List.iter2\"\n\nlet rec fold_left2 f accu l1 l2 =\n match (l1, l2) with\n ([], []) -> accu\n | (a1::l1, a2::l2) -> fold_left2 f (f accu a1 a2) l1 l2\n | (_, _) -> invalid_arg \"List.fold_left2\"\n\nlet rec fold_right2 f l1 l2 accu =\n match (l1, l2) with\n ([], []) -> accu\n | (a1::l1, a2::l2) -> f a1 a2 (fold_right2 f l1 l2 accu)\n | (_, _) -> invalid_arg \"List.fold_right2\"\n\nlet rec for_all p = function\n [] -> true\n | a::l -> p a && for_all p l\n\nlet rec exists p = function\n [] -> false\n | a::l -> p a || exists p l\n\nlet rec for_all2 p l1 l2 =\n match (l1, l2) with\n ([], []) -> true\n | (a1::l1, a2::l2) -> p a1 a2 && for_all2 p l1 l2\n | (_, _) -> invalid_arg \"List.for_all2\"\n\nlet rec exists2 p l1 l2 =\n match (l1, l2) with\n ([], []) -> false\n | (a1::l1, a2::l2) -> p a1 a2 || exists2 p l1 l2\n | (_, _) -> invalid_arg \"List.exists2\"\n\nlet rec mem x = function\n [] -> false\n | a::l -> compare a x = 0 || mem x l\n\nlet rec memq x = function\n [] -> false\n | a::l -> a == x || memq x l\n\nlet rec assoc x = function\n [] -> raise Not_found\n | (a,b)::l -> if compare a x = 0 then b else assoc x l\n\nlet rec assoc_opt x = function\n [] -> None\n | (a,b)::l -> if compare a x = 0 then Some b else assoc_opt x l\n\nlet rec assq x = function\n [] -> raise Not_found\n | (a,b)::l -> if a == x then b else assq x l\n\nlet rec assq_opt x = function\n [] -> None\n | (a,b)::l -> if a == x then Some b else assq_opt x l\n\nlet rec mem_assoc x = function\n | [] -> false\n | (a, _) :: l -> compare a x = 0 || mem_assoc x l\n\nlet rec mem_assq x = function\n | [] -> false\n | (a, _) :: l -> a == x || mem_assq x l\n\nlet rec remove_assoc x = function\n | [] -> []\n | (a, _ as pair) :: l ->\n if compare a x = 0 then l else pair :: remove_assoc x l\n\nlet rec remove_assq x = function\n | [] -> []\n | (a, _ as pair) :: l -> if a == x then l else pair :: remove_assq x l\n\nlet rec find p = function\n | [] -> raise Not_found\n | x :: l -> if p x then x else find p l\n\nlet rec find_opt p = function\n | [] -> None\n | x :: l -> if p x then Some x else find_opt p l\n\nlet find_index p =\n let rec aux i = function\n [] -> None\n | a::l -> if p a then Some i else aux (i+1) l in\n aux 0\n\nlet rec find_map f = function\n | [] -> None\n | x :: l ->\n begin match f x with\n | Some _ as result -> result\n | None -> find_map f l\n end\n\nlet find_mapi f =\n let rec aux i = function\n | [] -> None\n | x :: l ->\n begin match f i x with\n | Some _ as result -> result\n | None -> aux (i+1) l\n end in\n aux 0\n\nlet[@tail_mod_cons] rec find_all p = function\n | [] -> []\n | x :: l -> if p x then x :: find_all p l else find_all p l\n\nlet filter = find_all\n\nlet[@tail_mod_cons] rec filteri p i = function\n | [] -> []\n | x::l ->\n let i' = i + 1 in\n if p i x then x :: filteri p i' l else filteri p i' l\n\nlet filteri p l = filteri p 0 l\n\nlet[@tail_mod_cons] rec filter_map f = function\n | [] -> []\n | x :: l ->\n match f x with\n | None -> filter_map f l\n | Some v -> v :: filter_map f l\n\nlet[@tail_mod_cons] rec concat_map f = function\n | [] -> []\n | x::xs -> prepend_concat_map (f x) f xs\nand[@tail_mod_cons] prepend_concat_map ys f xs =\n match ys with\n | [] -> concat_map f xs\n | y :: ys -> y :: prepend_concat_map ys f xs\n\nlet fold_left_map f accu l =\n let rec aux accu l_accu = function\n | [] -> accu, rev l_accu\n | x :: l ->\n let accu, x = f accu x in\n aux accu (x :: l_accu) l in\n aux accu [] l\n\nlet partition p l =\n let rec part yes no = function\n | [] -> (rev yes, rev no)\n | x :: l -> if p x then part (x :: yes) no l else part yes (x :: no) l in\n part [] [] l\n\nlet partition_map p l =\n let rec part left right = function\n | [] -> (rev left, rev right)\n | x :: l ->\n begin match p x with\n | Either.Left v -> part (v :: left) right l\n | Either.Right v -> part left (v :: right) l\n end\n in\n part [] [] l\n\nlet rec split = function\n [] -> ([], [])\n | (x,y)::l ->\n let (rx, ry) = split l in (x::rx, y::ry)\n\nlet rec combine l1 l2 =\n match (l1, l2) with\n ([], []) -> []\n | (a1::l1, a2::l2) -> (a1, a2) :: combine l1 l2\n | (_, _) -> invalid_arg \"List.combine\"\n\n(** sorting *)\n\nlet rec merge cmp l1 l2 =\n match l1, l2 with\n | [], l2 -> l2\n | l1, [] -> l1\n | h1 :: t1, h2 :: t2 ->\n if cmp h1 h2 <= 0\n then h1 :: merge cmp t1 l2\n else h2 :: merge cmp l1 t2\n\n\nlet stable_sort cmp l =\n let rec rev_merge l1 l2 accu =\n match l1, l2 with\n | [], l2 -> rev_append l2 accu\n | l1, [] -> rev_append l1 accu\n | h1::t1, h2::t2 ->\n if cmp h1 h2 <= 0\n then rev_merge t1 l2 (h1::accu)\n else rev_merge l1 t2 (h2::accu)\n in\n let rec rev_merge_rev l1 l2 accu =\n match l1, l2 with\n | [], l2 -> rev_append l2 accu\n | l1, [] -> rev_append l1 accu\n | h1::t1, h2::t2 ->\n if cmp h1 h2 > 0\n then rev_merge_rev t1 l2 (h1::accu)\n else rev_merge_rev l1 t2 (h2::accu)\n in\n let rec sort n l =\n match n, l with\n | 2, x1 :: x2 :: tl ->\n let s = if cmp x1 x2 <= 0 then [x1; x2] else [x2; x1] in\n (s, tl)\n | 3, x1 :: x2 :: x3 :: tl ->\n let s =\n if cmp x1 x2 <= 0 then\n if cmp x2 x3 <= 0 then [x1; x2; x3]\n else if cmp x1 x3 <= 0 then [x1; x3; x2]\n else [x3; x1; x2]\n else if cmp x1 x3 <= 0 then [x2; x1; x3]\n else if cmp x2 x3 <= 0 then [x2; x3; x1]\n else [x3; x2; x1]\n in\n (s, tl)\n | n, l ->\n let n1 = n asr 1 in\n let n2 = n - n1 in\n let s1, l2 = rev_sort n1 l in\n let s2, tl = rev_sort n2 l2 in\n (rev_merge_rev s1 s2 [], tl)\n and rev_sort n l =\n match n, l with\n | 2, x1 :: x2 :: tl ->\n let s = if cmp x1 x2 > 0 then [x1; x2] else [x2; x1] in\n (s, tl)\n | 3, x1 :: x2 :: x3 :: tl ->\n let s =\n if cmp x1 x2 > 0 then\n if cmp x2 x3 > 0 then [x1; x2; x3]\n else if cmp x1 x3 > 0 then [x1; x3; x2]\n else [x3; x1; x2]\n else if cmp x1 x3 > 0 then [x2; x1; x3]\n else if cmp x2 x3 > 0 then [x2; x3; x1]\n else [x3; x2; x1]\n in\n (s, tl)\n | n, l ->\n let n1 = n asr 1 in\n let n2 = n - n1 in\n let s1, l2 = sort n1 l in\n let s2, tl = sort n2 l2 in\n (rev_merge s1 s2 [], tl)\n in\n let len = length l in\n if len < 2 then l else fst (sort len l)\n\n\nlet sort = stable_sort\nlet fast_sort = stable_sort\n\n(* Note: on a very long list (length over about 100000), it used to be\n faster to convert the list to an array, sort the array, and convert\n back, truncating the array object after prepending each thousand\n entries to the resulting list. Impossible now that Obj.truncate has\n been removed. *)\n\n(** sorting + removing duplicates *)\n\nlet sort_uniq cmp l =\n let rec rev_merge l1 l2 accu =\n match l1, l2 with\n | [], l2 -> rev_append l2 accu\n | l1, [] -> rev_append l1 accu\n | h1::t1, h2::t2 ->\n let c = cmp h1 h2 in\n if c = 0 then rev_merge t1 t2 (h1::accu)\n else if c < 0\n then rev_merge t1 l2 (h1::accu)\n else rev_merge l1 t2 (h2::accu)\n in\n let rec rev_merge_rev l1 l2 accu =\n match l1, l2 with\n | [], l2 -> rev_append l2 accu\n | l1, [] -> rev_append l1 accu\n | h1::t1, h2::t2 ->\n let c = cmp h1 h2 in\n if c = 0 then rev_merge_rev t1 t2 (h1::accu)\n else if c > 0\n then rev_merge_rev t1 l2 (h1::accu)\n else rev_merge_rev l1 t2 (h2::accu)\n in\n let rec sort n l =\n match n, l with\n | 2, x1 :: x2 :: tl ->\n let s =\n let c = cmp x1 x2 in\n if c = 0 then [x1] else if c < 0 then [x1; x2] else [x2; x1]\n in\n (s, tl)\n | 3, x1 :: x2 :: x3 :: tl ->\n let s =\n let c = cmp x1 x2 in\n if c = 0 then\n let c = cmp x2 x3 in\n if c = 0 then [x2] else if c < 0 then [x2; x3] else [x3; x2]\n else if c < 0 then\n let c = cmp x2 x3 in\n if c = 0 then [x1; x2]\n else if c < 0 then [x1; x2; x3]\n else\n let c = cmp x1 x3 in\n if c = 0 then [x1; x2]\n else if c < 0 then [x1; x3; x2]\n else [x3; x1; x2]\n else\n let c = cmp x1 x3 in\n if c = 0 then [x2; x1]\n else if c < 0 then [x2; x1; x3]\n else\n let c = cmp x2 x3 in\n if c = 0 then [x2; x1]\n else if c < 0 then [x2; x3; x1]\n else [x3; x2; x1]\n in\n (s, tl)\n | n, l ->\n let n1 = n asr 1 in\n let n2 = n - n1 in\n let s1, l2 = rev_sort n1 l in\n let s2, tl = rev_sort n2 l2 in\n (rev_merge_rev s1 s2 [], tl)\n and rev_sort n l =\n match n, l with\n | 2, x1 :: x2 :: tl ->\n let s =\n let c = cmp x1 x2 in\n if c = 0 then [x1] else if c > 0 then [x1; x2] else [x2; x1]\n in\n (s, tl)\n | 3, x1 :: x2 :: x3 :: tl ->\n let s =\n let c = cmp x1 x2 in\n if c = 0 then\n let c = cmp x2 x3 in\n if c = 0 then [x2] else if c > 0 then [x2; x3] else [x3; x2]\n else if c > 0 then\n let c = cmp x2 x3 in\n if c = 0 then [x1; x2]\n else if c > 0 then [x1; x2; x3]\n else\n let c = cmp x1 x3 in\n if c = 0 then [x1; x2]\n else if c > 0 then [x1; x3; x2]\n else [x3; x1; x2]\n else\n let c = cmp x1 x3 in\n if c = 0 then [x2; x1]\n else if c > 0 then [x2; x1; x3]\n else\n let c = cmp x2 x3 in\n if c = 0 then [x2; x1]\n else if c > 0 then [x2; x3; x1]\n else [x3; x2; x1]\n in\n (s, tl)\n | n, l ->\n let n1 = n asr 1 in\n let n2 = n - n1 in\n let s1, l2 = sort n1 l in\n let s2, tl = sort n2 l2 in\n (rev_merge s1 s2 [], tl)\n in\n let len = length l in\n if len < 2 then l else fst (sort len l)\n\n\nlet rec compare_lengths l1 l2 =\n match l1, l2 with\n | [], [] -> 0\n | [], _ -> -1\n | _, [] -> 1\n | _ :: l1, _ :: l2 -> compare_lengths l1 l2\n\nlet rec compare_length_with l n =\n match l with\n | [] ->\n if n = 0 then 0 else\n if n > 0 then -1 else 1\n | _ :: l ->\n if n <= 0 then 1 else\n compare_length_with l (n-1)\n\nlet is_empty = function\n | [] -> true\n | _ :: _ -> false\n\n(** {1 Comparison} *)\n\n(* Note: we are *not* shortcutting the list by using\n [List.compare_lengths] first; this may be slower on long lists\n immediately start with distinct elements. It is also incorrect for\n [compare] below, and it is better (principle of least surprise) to\n use the same approach for both functions. *)\nlet rec equal eq l1 l2 =\n match l1, l2 with\n | [], [] -> true\n | [], _::_ | _::_, [] -> false\n | a1::l1, a2::l2 -> eq a1 a2 && equal eq l1 l2\n\nlet rec compare cmp l1 l2 =\n match l1, l2 with\n | [], [] -> 0\n | [], _::_ -> -1\n | _::_, [] -> 1\n | a1::l1, a2::l2 ->\n let c = cmp a1 a2 in\n if c <> 0 then c\n else compare cmp l1 l2\n\n(** {1 Iterators} *)\n\nlet to_seq l =\n let rec aux l () = match l with\n | [] -> Seq.Nil\n | x :: tail -> Seq.Cons (x, aux tail)\n in\n aux l\n\nlet[@tail_mod_cons] rec of_seq seq =\n match seq () with\n | Seq.Nil -> []\n | Seq.Cons (x1, seq) ->\n begin match seq () with\n | Seq.Nil -> [x1]\n | Seq.Cons (x2, seq) -> x1 :: x2 :: of_seq seq\n end\n","(* generated code *)"],"names":[],"mappings":"cAmkBQ,qBAAM,QACC,mBAEG,IAFH,OAEG,eAAM,QACL,eACW,IADX,YACW,YAAY,MADvB,OACuB,KALlC,qBAAM,OACC,6BAEG,IAFH,OAEG,eAAM,OACL,uCACW,iBADX,OACW,uBAAsB,eAC3C,C,EATP,a,KAJmB,UACT,KAC4B,IAD5B,YACoB,GADpB,OACoB,GAAQ,KAAC,C,EAEvC,QAAK,C,KAhBL,aACY,EACE,EAFd,QAEc,aACA,KADA,cACA,cAGZ,IAJY,OACA,OAEJ,OACR,GAAe,KACO,C,KAbxB,qBACY,c,CAAA,4CAEQ,OAAQ,K,CAAA,OADH,KACqB,C,EAfjC,OAED,EAAK,C,KAVjB,aAEE,SAAc,GACE,EAAQ,EAAtB,YAAsB,GAExB,eAFwB,UAGtB,gBADa,OACc,C,EAb/B,aACY,EACD,EAFX,QAEW,aACA,eACW,EADX,UACW,OAAqB,C,eAzFzC,gB,EAAA,Y,CAAA,qB,CAAA,gBAMI,IAFE,IAJN,kBAGc,WACR,IAAc,eAAU,aAA4B,yBAAd,0BAExC,0B,CAAA,qB,CAAA,qB,CAAA,yBA0BA,IAtBE,IAJF,kBAGU,WACR,IAEE,IADQ,eACR,IAAc,eAAU,aAA4B,yBAAd,2BACnC,aAWH,IADQ,eACR,IAAc,yBACT,aAGH,IADQ,eACR,IAAc,yBACT,aACA,mCADc,qCAJF,qCAVnB,IADQ,eACR,IAAc,yBACT,aAGH,IADQ,eACR,IAAc,yBACT,aACA,mCADc,qCAJF,sCAgBvB,YAGA,OADA,SACA,GACa,eAAa,SACb,IADa,OACb,SAAc,gBAC1B,WAAsB,IAjD3B,UACY,sBACA,wCAGR,IAHQ,kBAEA,WACR,GAAc,yBACT,YACA,qBACA,qB,KAyCkB,OAAK,C,eAEhC,gB,EAAA,Y,CAAA,qB,CAAA,gBAMI,IAFE,IAJN,kBAGc,WACR,IAAc,eAAU,aAAc,yBAAc,0BAEtD,0B,CAAA,qB,CAAA,qB,CAAA,yBA0BA,IAtBE,IAJF,kBAGU,WACR,IAEE,IADQ,eACR,IAAc,eAAU,aAAc,yBAAc,2BACjD,aAEH,IADQ,eACR,IAAc,yBACT,aAAc,mCAGjB,IADQ,eACR,IAAc,yBACT,aAAc,mCACd,uCAGP,IADQ,eACR,IAAc,yBACT,aAAc,mCAGjB,IADQ,eACR,IAAc,yBACT,aAAc,mCACd,wCAEX,YAGA,OADA,SACA,GACa,eAAS,SACT,IADS,OACT,SAAU,gBACtB,WAAkB,IApGvB,UACY,sBACA,wCAGR,IAHQ,kBAEA,WACR,GAAc,yBACT,YAEA,qBADA,qB,KA6Fc,OAAK,C,aA/E9B,yCAiFU,SACV,aAA2B,SAAY,SAAvB,GAAuB,C,eApKrC,gB,EAAA,Y,CAAA,qB,CAAA,gBAGI,IAHJ,kBAEe,SAAS,WAAyB,yBAAd,yBAC/B,0B,CAAA,qB,CAAA,qB,CAAA,yBAWA,IAXA,kBAGK,SAAS,WAIJ,aAAS,WACT,aAAS,WACZ,mCADuB,oCADA,oCAHvB,aAAS,WACJ,aAAS,WACZ,mCADuB,oCADL,oCAO3B,YAGA,OADA,SACA,GACa,eAAa,SACb,IADa,OACb,SAAc,gBAC1B,WAAsB,IA7B3B,UACY,sBACA,0DAEL,SAAS,UACP,qBACA,qB,GAuBkB,OAAK,C,eAEhC,gB,EAAA,Y,CAAA,qB,CAAA,gBAGI,IAHJ,kBAEe,SAAS,WAAU,yBAAc,yBAC5C,0B,CAAA,qB,CAAA,qB,CAAA,yBAWA,IAXA,kBAGK,SAAS,WACP,aAAS,WAAU,mCACd,aAAS,WAAU,mCACtB,qCACC,aAAS,WAAU,mCACnB,aAAS,WAAU,mCACtB,qCAEP,YAGA,OADA,SACA,GACa,eAAS,SACT,IADS,OACT,SAAU,gBACtB,WAAkB,IA5DvB,UACY,sBACA,0DAEL,SAAS,UAEP,qBADA,qB,GAuDc,OAAK,C,aA3C9B,yCA6CU,SACV,aAA2B,SAAY,SAAvB,GAAuB,C,SA1EvC,UACY,aACA,iDAEL,KAAS,WAEc,MAAf,aAAe,KADA,MAAf,aAAe,OACA,C,KAd9B,kBACc,c,CAAA,EACiC,QADjC,wBACiC,IADjC,cACoB,OAAa,OACnC,uBAA0B,C,KATxB,UACN,4BAEsB,QAFtB,cAEW,OAAO,UAAI,UAAJ,OAAI,SAAc,C,YAL5C,eARa,UACM,WAAF,IAAR,SAAQ,qBAEC,IAFD,OAEF,iBAAG,aACM,IADN,OACM,WACC,IADD,UACC,W,GAGb,C,YAXZ,eAHa,UACK,WAAF,IAAP,SAAO,8BACD,eAAG,OAAgC,iBAA1B,iB,GACZ,C,KANZ,SALY,UACc,MAAV,SAAU,mBAEN,EAFM,OAEN,KAAQ,UACtB,MADsB,OACtB,YACO,C,aAdoB,WACzB,2BACsB,O,CAAA,E,CAAA,QAE9B,SAEkB,IAFlB,YAEkB,MAAL,IAFb,OAEa,YAAK,KAFlB,aAJiC,UACzB,iBAKoC,wBAJd,E,CAAA,K,CAAA,QAAK,kBAItB,cAJsB,OAItB,wBAJ2B,C,WATP,WACzB,2BAEE,O,CAAA,E,CAAA,QAAG,SAEG,IAFH,UAEG,YAAK,SALY,UACzB,cAI2B,wBAFzB,E,CAAA,K,CAAA,QAAG,OAEG,WAFH,UAEG,mBAAmB,C,QAPnB,EANc,SACtB,oBAEJ,OACG,IAHC,SAGD,KAAK,gBAAM,kBAAK,SAJO,UACtB,cAG6B,iBADjC,OACG,IAA8B,SAA9B,KAAK,cAAM,mC,GAEW,C,WAZE,WACvB,6BACO,O,CAAA,E,CAAA,MAAG,SAAM,kBAAK,SAFE,UACvB,cACiC,0BAA1B,E,CAAA,K,CAAA,MAAG,OAAM,gCAAmC,C,UCxQ7D,UD6Pc,UACJ,mBAEO,IAFP,OAEO,WAAK,QAEL,UADY,M,EAG3B,QAAK,C,QAhBU,aACP,0BAEO,iBAAG,OACS,IAErB,C,UC1PR,UD+Oc,UACJ,0BACO,mBAAG,QAAkB,UAAZ,gB,EACxB,QAAK,C,QARU,aACP,4BACO,eAAG,OAAM,YAAwB,C,QANrC,aACH,iCACO,eAAG,OAAM,IAAe,C,QANrB,UACV,oCACiB,uCAAe,GAA8B,MAAf,WAAe,O,KAPnD,UACX,oCAED,IAAW,GAAyC,MAAhB,WAAgB,KAA/B,IAA+B,C,OAP5C,aACP,kCACS,sC,CAAA,QAAsB,C,OANvB,aACR,kCACS,IAAW,G,CAAA,QAAqB,C,QANlC,aACP,6CACM,oC,CAAe,cAAwB,C,QAN1C,aACH,kDACM,oC,CAAe,MAAe,C,KAN5B,aACR,6CACS,IAAqB,cAAyB,C,KANnD,aACJ,kDACS,IAAqB,MAAgB,C,OAN3C,aACH,0BACE,sC,CAAA,QAAkB,C,OANlB,aACF,0BACE,IAAW,G,CAAA,QAAe,C,MAPpC,oBACc,c,CAAA,4CACQ,OAAO,YACjB,wB,CAA0B,C,MATtC,oBACc,c,CAAA,4CACQ,OAAO,K,CAAA,OACjB,wB,CAA2B,C,QAZzB,aACN,0BACE,iBAAG,K,CAAA,MAAe,C,KAP5B,kBACc,Y,CAAA,0BACgB,EADhB,cACgB,SAA0B,OAC5C,uBAA8B,C,KAT1C,oBACc,Y,CAAA,8BACqB,EADrB,cACqB,KAAc,MACrC,wB,CAA6B,C,KATzC,oBACc,c,CAAA,4CACQ,MAAO,IACjB,wB,CAAwB,C,MAPpC,QALE,kBACc,Y,CAAA,8BACwB,IADxB,cACiB,KAAO,aAC1B,uBAEE,C,WAlBhB,kBACc,4C,CAAA,qBAGV,IADS,EAFC,OAED,KACT,mB,CAAA,qB,CAAA,gDAES,EAFT,OAES,OAET,IADS,SACT,YAAQ,QARZ,oBACc,uD,CAAA,qBAGV,IADS,EAFC,OAED,KACT,kC,CAAA,qB,CAAA,gDAES,EAFT,OAES,OAET,IADS,SACT,4CACQ,uCADY,iBACZ,uBAAuB,C,KAdnC,UACQ,eACM,EADN,OACM,SAAqB,O,KAPnC,aACQ,iBACc,EADd,OACc,KAAU,MAAE,C,OALpB,GAJF,UACJ,mBACE,IADF,OACE,MAAK,WAEU,C,QARd,aACH,0BACE,gBAAG,IAAU,C,QALvB,SAJe,UACL,iBACa,IADb,OACU,eAAG,YAEZ,C,WAjBgB,UACnB,oCAGJ,IADS,WACT,gCAES,aAET,IADS,WACT,YAAQ,aARe,SACnB,6CAGJ,IADS,WACT,8CAES,aAET,IADA,KAAS,SACT,iDAAsB,eAEH,C,cApBG,UAClB,oCAGJ,IADS,iBACT,gCAES,mBAET,IADS,YACT,YAAQ,SARc,SAClB,6CAGJ,IADS,eACT,8CAES,iBAET,IADS,YACT,0CAAe,gB,KAdH,UACR,wBACM,OAAS,sB,cALvB,eACA,SATA,SAAiB,KACZ,QAEM,qBAET,IADS,cACT,YAAY,aALd,aAAiB,eACZ,aAAqB,IAAH,iBAAG,uBAEf,mBAET,IADA,KAAS,YACT,iDAA6B,cAJL,IAAH,mBAAG,WAOV,wBACE,C,EAZR,aAAe,C,KAJzB,aACQ,GACI,IADJ,YACI,QADJ,OACI,UAAsB,C,KAZlC,kBAEE,UACQ,KACE,UAAc,IADhB,UACgB,KADhB,UAC4B,mBAJxB,wBAKA,C,MAbd,kBAEE,UACQ,wBACE,UADF,qBACuB,mBAJnB,wBAKA,C,EAVP,UACC,mCACG,C,EANJ,UACC,mCACG,C,EAJE,YAAI,C,IAFJ,GAJI,UACT,KACE,OADF,UACE,MAEiB,C,GCxB7B,uN,QAAA,4D,QAAA,6E,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":116466},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/int.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype t = int\n\nlet zero = 0\nlet one = 1\nlet minus_one = -1\nexternal neg : int -> int = \"%negint\"\nexternal add : int -> int -> int = \"%addint\"\nexternal sub : int -> int -> int = \"%subint\"\nexternal mul : int -> int -> int = \"%mulint\"\nexternal div : int -> int -> int = \"%divint\"\nexternal rem : int -> int -> int = \"%modint\"\nexternal succ : int -> int = \"%succint\"\nexternal pred : int -> int = \"%predint\"\nlet abs x = if x >= 0 then x else -x\nlet max_int = (-1) lsr 1\nlet min_int = max_int + 1\nexternal logand : int -> int -> int = \"%andint\"\nexternal logor : int -> int -> int = \"%orint\"\nexternal logxor : int -> int -> int = \"%xorint\"\nlet lognot x = logxor x (-1)\nexternal shift_left : int -> int -> int = \"%lslint\"\nexternal shift_right : int -> int -> int = \"%asrint\"\nexternal shift_right_logical : int -> int -> int = \"%lsrint\"\nlet equal : int -> int -> bool = ( = )\nlet compare : int -> int -> int = Stdlib.compare\nlet min x y : t = if x <= y then x else y\nlet max x y : t = if x >= y then x else y\nexternal to_float : int -> float = \"%floatofint\"\nexternal of_float : float -> int = \"%intoffloat\"\n\n(*\nexternal int_of_string : string -> int = \"caml_int_of_string\"\nlet of_string s = try Some (int_of_string s) with Failure _ -> None\n*)\n\nexternal format_int : string -> int -> string = \"caml_format_int\"\nlet to_string x = format_int \"%d\" x\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n","(* generated code *)"],"names":[],"mappings":"EAwDa,iBAA4B,C,EADhB,eAA+B,C,EAJtC,OAAiB,C,KAVF,OAAO,OAAtB,aAAuB,C,KADR,OAAO,OAAtB,aAAuB,C,KCxCzC,gC,EAAA,uC,EDkCe,YAAa,C,KANhB,eAAe,GAAO,aAAE,C,EC5BpC,uE,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":116837},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/bytes.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Byte sequence operations *)\n\n(* WARNING: Some functions in this file are duplicated in string.ml for\n efficiency reasons. When you modify the one in this file you need to\n modify its duplicate in string.ml.\n These functions have a \"duplicated\" comment above their definition.\n*)\n\nexternal length : bytes -> int = \"%bytes_length\"\nexternal string_length : string -> int = \"%string_length\"\nexternal get : bytes -> int -> char = \"%bytes_safe_get\"\nexternal set : bytes -> int -> char -> unit = \"%bytes_safe_set\"\nexternal create : int -> bytes = \"caml_create_bytes\"\nexternal unsafe_get : bytes -> int -> char = \"%bytes_unsafe_get\"\nexternal unsafe_set : bytes -> int -> char -> unit = \"%bytes_unsafe_set\"\nexternal unsafe_fill : bytes -> int -> int -> char -> unit\n = \"caml_fill_bytes\" [@@noalloc]\nexternal unsafe_to_string : bytes -> string = \"%bytes_to_string\"\nexternal unsafe_of_string : string -> bytes = \"%bytes_of_string\"\n\nexternal unsafe_blit : bytes -> int -> bytes -> int -> int -> unit\n = \"caml_blit_bytes\" [@@noalloc]\nexternal unsafe_blit_string : string -> int -> bytes -> int -> int -> unit\n = \"caml_blit_string\" [@@noalloc]\n\nlet make n c =\n let s = create n in\n unsafe_fill s 0 n c;\n s\n\nlet init n f =\n let s = create n in\n for i = 0 to n - 1 do\n unsafe_set s i (f i)\n done;\n s\n\nlet empty = create 0\n\nlet copy s =\n let len = length s in\n let r = create len in\n unsafe_blit s 0 r 0 len;\n r\n\nlet to_string b = unsafe_to_string (copy b)\nlet of_string s = copy (unsafe_of_string s)\n\nlet sub s ofs len =\n if ofs < 0 || len < 0 || ofs > length s - len\n then invalid_arg \"String.sub / Bytes.sub\"\n else begin\n let r = create len in\n unsafe_blit s ofs r 0 len;\n r\n end\n\nlet sub_string b ofs len = unsafe_to_string (sub b ofs len)\n\n(* addition with an overflow check *)\nlet (++) a b =\n let c = a + b in\n match a < 0, b < 0, c < 0 with\n | true , true , false\n | false, false, true -> invalid_arg \"Bytes.extend\" (* overflow *)\n | _ -> c\n\nlet extend s left right =\n let len = length s ++ left ++ right in\n let r = create len in\n let (srcoff, dstoff) = if left < 0 then -left, 0 else 0, left in\n let cpylen = Int.min (length s - srcoff) (len - dstoff) in\n if cpylen > 0 then unsafe_blit s srcoff r dstoff cpylen;\n r\n\nlet fill s ofs len c =\n if ofs < 0 || len < 0 || ofs > length s - len\n then invalid_arg \"String.fill / Bytes.fill\"\n else unsafe_fill s ofs len c\n\nlet blit s1 ofs1 s2 ofs2 len =\n if len < 0 || ofs1 < 0 || ofs1 > length s1 - len\n || ofs2 < 0 || ofs2 > length s2 - len\n then invalid_arg \"Bytes.blit\"\n else unsafe_blit s1 ofs1 s2 ofs2 len\n\nlet blit_string s1 ofs1 s2 ofs2 len =\n if len < 0 || ofs1 < 0 || ofs1 > string_length s1 - len\n || ofs2 < 0 || ofs2 > length s2 - len\n then invalid_arg \"String.blit / Bytes.blit_string\"\n else unsafe_blit_string s1 ofs1 s2 ofs2 len\n\n(* duplicated in string.ml *)\nlet iter f a =\n for i = 0 to length a - 1 do f(unsafe_get a i) done\n\n(* duplicated in string.ml *)\nlet iteri f a =\n for i = 0 to length a - 1 do f i (unsafe_get a i) done\n\nlet ensure_ge (x:int) y = if x >= y then x else invalid_arg \"Bytes.concat\"\n\nlet rec sum_lengths acc seplen = function\n | [] -> acc\n | hd :: [] -> length hd + acc\n | hd :: tl -> sum_lengths (ensure_ge (length hd + seplen + acc) acc) seplen tl\n\nlet rec unsafe_blits dst pos sep seplen = function\n [] -> dst\n | hd :: [] ->\n unsafe_blit hd 0 dst pos (length hd); dst\n | hd :: tl ->\n unsafe_blit hd 0 dst pos (length hd);\n unsafe_blit sep 0 dst (pos + length hd) seplen;\n unsafe_blits dst (pos + length hd + seplen) sep seplen tl\n\nlet concat sep = function\n [] -> empty\n | l -> let seplen = length sep in\n unsafe_blits\n (create (sum_lengths 0 seplen l))\n 0 sep seplen l\n\nlet cat s1 s2 =\n let l1 = length s1 in\n let l2 = length s2 in\n let r = create (l1 + l2) in\n unsafe_blit s1 0 r 0 l1;\n unsafe_blit s2 0 r l1 l2;\n r\n\n\nexternal char_code: char -> int = \"%identity\"\nexternal char_chr: int -> char = \"%identity\"\n\nlet is_space = function\n | ' ' | '\\012' | '\\n' | '\\r' | '\\t' -> true\n | _ -> false\n\nlet trim s =\n let len = length s in\n let i = ref 0 in\n while !i < len && is_space (unsafe_get s !i) do\n incr i\n done;\n let j = ref (len - 1) in\n while !j >= !i && is_space (unsafe_get s !j) do\n decr j\n done;\n if !j >= !i then\n sub s !i (!j - !i + 1)\n else\n empty\n\nlet unsafe_escape s =\n (* We perform two passes on the input sequence, one to compute the\n result size and one to write the result.\n\n #11508, #11509: This logic would be incorrect in presence of\n concurrent modification to the input, making the use of\n [unsafe_set] below memory-unsafe.\n\n Precondition: This function may be safely called on:\n - an immutable byte sequence\n - a uniquely-owned byte sequence (the function takes ownership)\n\n In either case we return a uniquely-owned byte sequence.\n *)\n let n = ref 0 in\n for i = 0 to length s - 1 do\n n := !n +\n (match unsafe_get s i with\n | '\\\"' | '\\\\' | '\\n' | '\\t' | '\\r' | '\\b' -> 2\n | ' ' .. '~' -> 1\n | _ -> 4)\n done;\n if !n = length s then s\n else begin\n let s' = create !n in\n n := 0;\n for i = 0 to length s - 1 do\n begin match unsafe_get s i with\n | ('\\\"' | '\\\\') as c ->\n unsafe_set s' !n '\\\\'; incr n; unsafe_set s' !n c\n | '\\n' ->\n unsafe_set s' !n '\\\\'; incr n; unsafe_set s' !n 'n'\n | '\\t' ->\n unsafe_set s' !n '\\\\'; incr n; unsafe_set s' !n 't'\n | '\\r' ->\n unsafe_set s' !n '\\\\'; incr n; unsafe_set s' !n 'r'\n | '\\b' ->\n unsafe_set s' !n '\\\\'; incr n; unsafe_set s' !n 'b'\n | (' ' .. '~') as c -> unsafe_set s' !n c\n | c ->\n let a = char_code c in\n unsafe_set s' !n '\\\\';\n incr n;\n unsafe_set s' !n (char_chr (48 + a / 100));\n incr n;\n unsafe_set s' !n (char_chr (48 + (a / 10) mod 10));\n incr n;\n unsafe_set s' !n (char_chr (48 + a mod 10));\n end;\n incr n\n done;\n s'\n end\n\nlet escaped b =\n let b = copy b in\n (* We copy our input to obtain a uniquely-owned byte sequence [b]\n to satisfy [unsafe_escape]'s precondition *)\n unsafe_escape b\n\nlet map f s =\n let l = length s in\n if l = 0 then s else begin\n let r = create l in\n for i = 0 to l - 1 do unsafe_set r i (f (unsafe_get s i)) done;\n r\n end\n\nlet mapi f s =\n let l = length s in\n if l = 0 then s else begin\n let r = create l in\n for i = 0 to l - 1 do unsafe_set r i (f i (unsafe_get s i)) done;\n r\n end\n\nlet fold_left f x a =\n let r = ref x in\n for i = 0 to length a - 1 do\n r := f !r (unsafe_get a i)\n done;\n !r\n\nlet fold_right f a x =\n let r = ref x in\n for i = length a - 1 downto 0 do\n r := f (unsafe_get a i) !r\n done;\n !r\n\nlet exists p s =\n let n = length s in\n let rec loop i =\n if i = n then false\n else if p (unsafe_get s i) then true\n else loop (succ i) in\n loop 0\n\nlet for_all p s =\n let n = length s in\n let rec loop i =\n if i = n then true\n else if p (unsafe_get s i) then loop (succ i)\n else false in\n loop 0\n\nlet uppercase_ascii s = map Char.uppercase_ascii s\nlet lowercase_ascii s = map Char.lowercase_ascii s\n\nlet apply1 f s =\n if length s = 0 then s else begin\n let r = copy s in\n unsafe_set r 0 (f(unsafe_get s 0));\n r\n end\n\nlet capitalize_ascii s = apply1 Char.uppercase_ascii s\nlet uncapitalize_ascii s = apply1 Char.lowercase_ascii s\n\n(* duplicated in string.ml *)\nlet starts_with ~prefix s =\n let len_s = length s\n and len_pre = length prefix in\n let rec aux i =\n if i = len_pre then true\n else if unsafe_get s i <> unsafe_get prefix i then false\n else aux (i + 1)\n in len_s >= len_pre && aux 0\n\n(* duplicated in string.ml *)\nlet ends_with ~suffix s =\n let len_s = length s\n and len_suf = length suffix in\n let diff = len_s - len_suf in\n let rec aux i =\n if i = len_suf then true\n else if unsafe_get s (diff + i) <> unsafe_get suffix i then false\n else aux (i + 1)\n in diff >= 0 && aux 0\n\n(* duplicated in string.ml *)\nlet rec index_rec s lim i c =\n if i >= lim then raise Not_found else\n if unsafe_get s i = c then i else index_rec s lim (i + 1) c\n\n(* duplicated in string.ml *)\nlet index s c = index_rec s (length s) 0 c\n\n(* duplicated in string.ml *)\nlet rec index_rec_opt s lim i c =\n if i >= lim then None else\n if unsafe_get s i = c then Some i else index_rec_opt s lim (i + 1) c\n\n(* duplicated in string.ml *)\nlet index_opt s c = index_rec_opt s (length s) 0 c\n\n(* duplicated in string.ml *)\nlet index_from s i c =\n let l = length s in\n if i < 0 || i > l then invalid_arg \"String.index_from / Bytes.index_from\" else\n index_rec s l i c\n\n(* duplicated in string.ml *)\nlet index_from_opt s i c =\n let l = length s in\n if i < 0 || i > l then\n invalid_arg \"String.index_from_opt / Bytes.index_from_opt\"\n else\n index_rec_opt s l i c\n\n(* duplicated in string.ml *)\nlet rec rindex_rec s i c =\n if i < 0 then raise Not_found else\n if unsafe_get s i = c then i else rindex_rec s (i - 1) c\n\n(* duplicated in string.ml *)\nlet rindex s c = rindex_rec s (length s - 1) c\n\n(* duplicated in string.ml *)\nlet rindex_from s i c =\n if i < -1 || i >= length s then\n invalid_arg \"String.rindex_from / Bytes.rindex_from\"\n else\n rindex_rec s i c\n\n(* duplicated in string.ml *)\nlet rec rindex_rec_opt s i c =\n if i < 0 then None else\n if unsafe_get s i = c then Some i else rindex_rec_opt s (i - 1) c\n\n(* duplicated in string.ml *)\nlet rindex_opt s c = rindex_rec_opt s (length s - 1) c\n\n(* duplicated in string.ml *)\nlet rindex_from_opt s i c =\n if i < -1 || i >= length s then\n invalid_arg \"String.rindex_from_opt / Bytes.rindex_from_opt\"\n else\n rindex_rec_opt s i c\n\n\n(* duplicated in string.ml *)\nlet contains_from s i c =\n let l = length s in\n if i < 0 || i > l then\n invalid_arg \"String.contains_from / Bytes.contains_from\"\n else\n try ignore (index_rec s l i c); true with Not_found -> false\n\n\n(* duplicated in string.ml *)\nlet contains s c = contains_from s 0 c\n\n(* duplicated in string.ml *)\nlet rcontains_from s i c =\n if i < 0 || i >= length s then\n invalid_arg \"String.rcontains_from / Bytes.rcontains_from\"\n else\n try ignore (rindex_rec s i c); true with Not_found -> false\n\n\ntype t = bytes\n\nlet compare (x: t) (y: t) = Stdlib.compare x y\nexternal equal : t -> t -> bool = \"caml_bytes_equal\" [@@noalloc]\n\n(* duplicated in string.ml *)\nlet split_on_char sep s =\n let r = ref [] in\n let j = ref (length s) in\n for i = length s - 1 downto 0 do\n if unsafe_get s i = sep then begin\n r := sub s (i + 1) (!j - i - 1) :: !r;\n j := i\n end\n done;\n sub s 0 !j :: !r\n\n(** {1 Iterators} *)\n\nlet to_seq s =\n let rec aux i () =\n if i = length s then Seq.Nil\n else\n let x = get s i in\n Seq.Cons (x, aux (i+1))\n in\n aux 0\n\nlet to_seqi s =\n let rec aux i () =\n if i = length s then Seq.Nil\n else\n let x = get s i in\n Seq.Cons ((i,x), aux (i+1))\n in\n aux 0\n\nlet of_seq i =\n let n = ref 0 in\n let buf = ref (make 256 '\\000') in\n let resize () =\n (* resize *)\n let new_len = Int.min (2 * length !buf) Sys.max_string_length in\n if length !buf = new_len then failwith \"Bytes.of_seq: cannot grow bytes\";\n let new_buf = make new_len '\\000' in\n blit !buf 0 new_buf 0 !n;\n buf := new_buf\n in\n Seq.iter\n (fun c ->\n if !n = length !buf then resize();\n set !buf !n c;\n incr n)\n i;\n sub !buf 0 !n\n\n(** {6 Binary encoding/decoding of integers} *)\n\n(* The get_ functions are all duplicated in string.ml *)\n\nexternal unsafe_get_uint8 : bytes -> int -> int = \"%bytes_unsafe_get\"\nexternal unsafe_get_uint16_ne : bytes -> int -> int = \"%caml_bytes_get16u\"\nexternal get_uint8 : bytes -> int -> int = \"%bytes_safe_get\"\nexternal get_uint16_ne : bytes -> int -> int = \"%caml_bytes_get16\"\nexternal get_int32_ne : bytes -> int -> int32 = \"%caml_bytes_get32\"\nexternal get_int64_ne : bytes -> int -> int64 = \"%caml_bytes_get64\"\n\nexternal unsafe_set_uint8 : bytes -> int -> int -> unit = \"%bytes_unsafe_set\"\nexternal unsafe_set_uint16_ne : bytes -> int -> int -> unit\n = \"%caml_bytes_set16u\"\nexternal set_int8 : bytes -> int -> int -> unit = \"%bytes_safe_set\"\nexternal set_int16_ne : bytes -> int -> int -> unit = \"%caml_bytes_set16\"\nexternal set_int32_ne : bytes -> int -> int32 -> unit = \"%caml_bytes_set32\"\nexternal set_int64_ne : bytes -> int -> int64 -> unit = \"%caml_bytes_set64\"\nexternal swap16 : int -> int = \"%bswap16\"\nexternal swap32 : int32 -> int32 = \"%bswap_int32\"\nexternal swap64 : int64 -> int64 = \"%bswap_int64\"\n\nlet unsafe_get_uint16_le b i =\n if Sys.big_endian\n then swap16 (unsafe_get_uint16_ne b i)\n else unsafe_get_uint16_ne b i\n\nlet unsafe_get_uint16_be b i =\n if Sys.big_endian\n then unsafe_get_uint16_ne b i\n else swap16 (unsafe_get_uint16_ne b i)\n\nlet get_int8 b i =\n ((get_uint8 b i) lsl (Sys.int_size - 8)) asr (Sys.int_size - 8)\n\nlet get_uint16_le b i =\n if Sys.big_endian then swap16 (get_uint16_ne b i)\n else get_uint16_ne b i\n\nlet get_uint16_be b i =\n if not Sys.big_endian then swap16 (get_uint16_ne b i)\n else get_uint16_ne b i\n\nlet get_int16_ne b i =\n ((get_uint16_ne b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)\n\nlet get_int16_le b i =\n ((get_uint16_le b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)\n\nlet get_int16_be b i =\n ((get_uint16_be b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)\n\nlet get_int32_le b i =\n if Sys.big_endian then swap32 (get_int32_ne b i)\n else get_int32_ne b i\n\nlet get_int32_be b i =\n if not Sys.big_endian then swap32 (get_int32_ne b i)\n else get_int32_ne b i\n\nlet get_int64_le b i =\n if Sys.big_endian then swap64 (get_int64_ne b i)\n else get_int64_ne b i\n\nlet get_int64_be b i =\n if not Sys.big_endian then swap64 (get_int64_ne b i)\n else get_int64_ne b i\n\nlet unsafe_set_uint16_le b i x =\n if Sys.big_endian\n then unsafe_set_uint16_ne b i (swap16 x)\n else unsafe_set_uint16_ne b i x\n\nlet unsafe_set_uint16_be b i x =\n if Sys.big_endian\n then unsafe_set_uint16_ne b i x else\n unsafe_set_uint16_ne b i (swap16 x)\n\nlet set_int16_le b i x =\n if Sys.big_endian then set_int16_ne b i (swap16 x)\n else set_int16_ne b i x\n\nlet set_int16_be b i x =\n if not Sys.big_endian then set_int16_ne b i (swap16 x)\n else set_int16_ne b i x\n\nlet set_int32_le b i x =\n if Sys.big_endian then set_int32_ne b i (swap32 x)\n else set_int32_ne b i x\n\nlet set_int32_be b i x =\n if not Sys.big_endian then set_int32_ne b i (swap32 x)\n else set_int32_ne b i x\n\nlet set_int64_le b i x =\n if Sys.big_endian then set_int64_ne b i (swap64 x)\n else set_int64_ne b i x\n\nlet set_int64_be b i x =\n if not Sys.big_endian then set_int64_ne b i (swap64 x)\n else set_int64_ne b i x\n\nlet set_uint8 = set_int8\nlet set_uint16_ne = set_int16_ne\nlet set_uint16_be = set_int16_be\nlet set_uint16_le = set_int16_le\n\n(* UTF codecs and validations *)\n\nlet dec_invalid = Uchar.utf_decode_invalid\nlet[@inline] dec_ret n u = Uchar.utf_decode n (Uchar.unsafe_of_int u)\n\n(* In case of decoding error, if we error on the first byte, we\n consume the byte, otherwise we consume the [n] bytes preceding\n the erroring byte.\n\n This means that if a client uses decodes without caring about\n validity it naturally replace bogus data with Uchar.rep according\n to the WHATWG Encoding standard. Other schemes are possible by\n consulting the number of used bytes on invalid decodes. For more\n details see https://hsivonen.fi/broken-utf-8/\n\n For this reason in [get_utf_8_uchar] we gradually check the next\n byte is available rather than doing it immediately after the\n first byte. Contrast with [is_valid_utf_8]. *)\n\n(* UTF-8 *)\n\nlet[@inline] not_in_x80_to_xBF b = b lsr 6 <> 0b10\nlet[@inline] not_in_xA0_to_xBF b = b lsr 5 <> 0b101\nlet[@inline] not_in_x80_to_x9F b = b lsr 5 <> 0b100\nlet[@inline] not_in_x90_to_xBF b = b < 0x90 || 0xBF < b\nlet[@inline] not_in_x80_to_x8F b = b lsr 4 <> 0x8\n\nlet[@inline] utf_8_uchar_2 b0 b1 =\n ((b0 land 0x1F) lsl 6) lor\n ((b1 land 0x3F))\n\nlet[@inline] utf_8_uchar_3 b0 b1 b2 =\n ((b0 land 0x0F) lsl 12) lor\n ((b1 land 0x3F) lsl 6) lor\n ((b2 land 0x3F))\n\nlet[@inline] utf_8_uchar_4 b0 b1 b2 b3 =\n ((b0 land 0x07) lsl 18) lor\n ((b1 land 0x3F) lsl 12) lor\n ((b2 land 0x3F) lsl 6) lor\n ((b3 land 0x3F))\n\nlet get_utf_8_uchar b i =\n let b0 = get_uint8 b i in (* raises if [i] is not a valid index. *)\n let get = unsafe_get_uint8 in\n let max = length b - 1 in\n match Char.unsafe_chr b0 with (* See The Unicode Standard, Table 3.7 *)\n | '\\x00' .. '\\x7F' -> dec_ret 1 b0\n | '\\xC2' .. '\\xDF' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_x80_to_xBF b1 then dec_invalid 1 else\n dec_ret 2 (utf_8_uchar_2 b0 b1)\n | '\\xE0' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_xA0_to_xBF b1 then dec_invalid 1 else\n let i = i + 1 in if i > max then dec_invalid 2 else\n let b2 = get b i in if not_in_x80_to_xBF b2 then dec_invalid 2 else\n dec_ret 3 (utf_8_uchar_3 b0 b1 b2)\n | '\\xE1' .. '\\xEC' | '\\xEE' .. '\\xEF' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_x80_to_xBF b1 then dec_invalid 1 else\n let i = i + 1 in if i > max then dec_invalid 2 else\n let b2 = get b i in if not_in_x80_to_xBF b2 then dec_invalid 2 else\n dec_ret 3 (utf_8_uchar_3 b0 b1 b2)\n | '\\xED' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_x80_to_x9F b1 then dec_invalid 1 else\n let i = i + 1 in if i > max then dec_invalid 2 else\n let b2 = get b i in if not_in_x80_to_xBF b2 then dec_invalid 2 else\n dec_ret 3 (utf_8_uchar_3 b0 b1 b2)\n | '\\xF0' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_x90_to_xBF b1 then dec_invalid 1 else\n let i = i + 1 in if i > max then dec_invalid 2 else\n let b2 = get b i in if not_in_x80_to_xBF b2 then dec_invalid 2 else\n let i = i + 1 in if i > max then dec_invalid 3 else\n let b3 = get b i in if not_in_x80_to_xBF b3 then dec_invalid 3 else\n dec_ret 4 (utf_8_uchar_4 b0 b1 b2 b3)\n | '\\xF1' .. '\\xF3' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_x80_to_xBF b1 then dec_invalid 1 else\n let i = i + 1 in if i > max then dec_invalid 2 else\n let b2 = get b i in if not_in_x80_to_xBF b2 then dec_invalid 2 else\n let i = i + 1 in if i > max then dec_invalid 3 else\n let b3 = get b i in if not_in_x80_to_xBF b3 then dec_invalid 3 else\n dec_ret 4 (utf_8_uchar_4 b0 b1 b2 b3)\n | '\\xF4' ->\n let i = i + 1 in if i > max then dec_invalid 1 else\n let b1 = get b i in if not_in_x80_to_x8F b1 then dec_invalid 1 else\n let i = i + 1 in if i > max then dec_invalid 2 else\n let b2 = get b i in if not_in_x80_to_xBF b2 then dec_invalid 2 else\n let i = i + 1 in if i > max then dec_invalid 3 else\n let b3 = get b i in if not_in_x80_to_xBF b3 then dec_invalid 3 else\n dec_ret 4 (utf_8_uchar_4 b0 b1 b2 b3)\n | _ -> dec_invalid 1\n\nlet set_utf_8_uchar b i u =\n let set = unsafe_set_uint8 in\n let max = length b - 1 in\n match Uchar.to_int u with\n | u when u < 0 -> assert false\n | u when u <= 0x007F ->\n set_uint8 b i u;\n 1\n | u when u <= 0x07FF ->\n let last = i + 1 in\n if last > max then 0 else\n (set_uint8 b i (0xC0 lor (u lsr 6));\n set b last (0x80 lor (u land 0x3F));\n 2)\n | u when u <= 0xFFFF ->\n let last = i + 2 in\n if last > max then 0 else\n (set_uint8 b i (0xE0 lor (u lsr 12));\n set b (i + 1) (0x80 lor ((u lsr 6) land 0x3F));\n set b last (0x80 lor (u land 0x3F));\n 3)\n | u when u <= 0x10FFFF ->\n let last = i + 3 in\n if last > max then 0 else\n (set_uint8 b i (0xF0 lor (u lsr 18));\n set b (i + 1) (0x80 lor ((u lsr 12) land 0x3F));\n set b (i + 2) (0x80 lor ((u lsr 6) land 0x3F));\n set b last (0x80 lor (u land 0x3F));\n 4)\n | _ -> assert false\n\nlet is_valid_utf_8 b =\n let rec loop max b i =\n if i > max then true else\n let get = unsafe_get_uint8 in\n match Char.unsafe_chr (get b i) with\n | '\\x00' .. '\\x7F' -> loop max b (i + 1)\n | '\\xC2' .. '\\xDF' ->\n let last = i + 1 in\n if last > max\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | '\\xE0' ->\n let last = i + 2 in\n if last > max\n || not_in_xA0_to_xBF (get b (i + 1))\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | '\\xE1' .. '\\xEC' | '\\xEE' .. '\\xEF' ->\n let last = i + 2 in\n if last > max\n || not_in_x80_to_xBF (get b (i + 1))\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | '\\xED' ->\n let last = i + 2 in\n if last > max\n || not_in_x80_to_x9F (get b (i + 1))\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | '\\xF0' ->\n let last = i + 3 in\n if last > max\n || not_in_x90_to_xBF (get b (i + 1))\n || not_in_x80_to_xBF (get b (i + 2))\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | '\\xF1' .. '\\xF3' ->\n let last = i + 3 in\n if last > max\n || not_in_x80_to_xBF (get b (i + 1))\n || not_in_x80_to_xBF (get b (i + 2))\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | '\\xF4' ->\n let last = i + 3 in\n if last > max\n || not_in_x80_to_x8F (get b (i + 1))\n || not_in_x80_to_xBF (get b (i + 2))\n || not_in_x80_to_xBF (get b last)\n then false\n else loop max b (last + 1)\n | _ -> false\n in\n loop (length b - 1) b 0\n\n(* UTF-16BE *)\n\nlet get_utf_16be_uchar b i =\n let get = unsafe_get_uint16_be in\n let max = length b - 1 in\n if i < 0 || i > max then invalid_arg \"index out of bounds\" else\n if i = max then dec_invalid 1 else\n match get b i with\n | u when u < 0xD800 || u > 0xDFFF -> dec_ret 2 u\n | u when u > 0xDBFF -> dec_invalid 2\n | hi -> (* combine [hi] with a low surrogate *)\n let last = i + 3 in\n if last > max then dec_invalid (max - i + 1) else\n match get b (i + 2) with\n | u when u < 0xDC00 || u > 0xDFFF -> dec_invalid 2 (* retry here *)\n | lo ->\n let u = (((hi land 0x3FF) lsl 10) lor (lo land 0x3FF)) + 0x10000 in\n dec_ret 4 u\n\nlet set_utf_16be_uchar b i u =\n let set = unsafe_set_uint16_be in\n let max = length b - 1 in\n if i < 0 || i > max then invalid_arg \"index out of bounds\" else\n match Uchar.to_int u with\n | u when u < 0 -> assert false\n | u when u <= 0xFFFF ->\n let last = i + 1 in\n if last > max then 0 else (set b i u; 2)\n | u when u <= 0x10FFFF ->\n let last = i + 3 in\n if last > max then 0 else\n let u' = u - 0x10000 in\n let hi = (0xD800 lor (u' lsr 10)) in\n let lo = (0xDC00 lor (u' land 0x3FF)) in\n set b i hi; set b (i + 2) lo; 4\n | _ -> assert false\n\nlet is_valid_utf_16be b =\n let rec loop max b i =\n let get = unsafe_get_uint16_be in\n if i > max then true else\n if i = max then false else\n match get b i with\n | u when u < 0xD800 || u > 0xDFFF -> loop max b (i + 2)\n | u when u > 0xDBFF -> false\n | _hi ->\n let last = i + 3 in\n if last > max then false else\n match get b (i + 2) with\n | u when u < 0xDC00 || u > 0xDFFF -> false\n | _lo -> loop max b (i + 4)\n in\n loop (length b - 1) b 0\n\n(* UTF-16LE *)\n\nlet get_utf_16le_uchar b i =\n let get = unsafe_get_uint16_le in\n let max = length b - 1 in\n if i < 0 || i > max then invalid_arg \"index out of bounds\" else\n if i = max then dec_invalid 1 else\n match get b i with\n | u when u < 0xD800 || u > 0xDFFF -> dec_ret 2 u\n | u when u > 0xDBFF -> dec_invalid 2\n | hi -> (* combine [hi] with a low surrogate *)\n let last = i + 3 in\n if last > max then dec_invalid (max - i + 1) else\n match get b (i + 2) with\n | u when u < 0xDC00 || u > 0xDFFF -> dec_invalid 2 (* retry here *)\n | lo ->\n let u = (((hi land 0x3FF) lsl 10) lor (lo land 0x3FF)) + 0x10000 in\n dec_ret 4 u\n\nlet set_utf_16le_uchar b i u =\n let set = unsafe_set_uint16_le in\n let max = length b - 1 in\n if i < 0 || i > max then invalid_arg \"index out of bounds\" else\n match Uchar.to_int u with\n | u when u < 0 -> assert false\n | u when u <= 0xFFFF ->\n let last = i + 1 in\n if last > max then 0 else (set b i u; 2)\n | u when u <= 0x10FFFF ->\n let last = i + 3 in\n if last > max then 0 else\n let u' = u - 0x10000 in\n let hi = (0xD800 lor (u' lsr 10)) in\n let lo = (0xDC00 lor (u' land 0x3FF)) in\n set b i hi; set b (i + 2) lo; 4\n | _ -> assert false\n\nlet is_valid_utf_16le b =\n let rec loop max b i =\n let get = unsafe_get_uint16_le in\n if i > max then true else\n if i = max then false else\n match get b i with\n | u when u < 0xD800 || u > 0xDFFF -> loop max b (i + 2)\n | u when u > 0xDBFF -> false\n | _hi ->\n let last = i + 3 in\n if last > max then false else\n match get b (i + 2) with\n | u when u < 0xDC00 || u > 0xDFFF -> false\n | _lo -> loop max b (i + 4)\n in\n loop (length b - 1) b 0\n"],"names":[],"mappings":"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","ignoreList":[0]}},{"offset":{"line":0,"column":130073},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/string.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Gallium, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2014 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* String operations, based on byte sequence operations *)\n\n(* WARNING: Some functions in this file are duplicated in bytes.ml for\n efficiency reasons. When you modify the one in this file you need to\n modify its duplicate in bytes.ml.\n These functions have a \"duplicated\" comment above their definition.\n*)\n\nexternal length : string -> int = \"%string_length\"\nexternal get : string -> int -> char = \"%string_safe_get\"\nexternal unsafe_get : string -> int -> char = \"%string_unsafe_get\"\nexternal unsafe_blit : string -> int -> bytes -> int -> int -> unit\n = \"caml_blit_string\" [@@noalloc]\n\nmodule B = Bytes\n\nlet bts = B.unsafe_to_string\nlet bos = B.unsafe_of_string\n\nlet make n c =\n B.make n c |> bts\nlet init n f =\n B.init n f |> bts\nlet empty = \"\"\nlet of_bytes = B.to_string\nlet to_bytes = B.of_string\nlet sub s ofs len =\n B.sub (bos s) ofs len |> bts\nlet blit =\n B.blit_string\n\nlet ensure_ge (x:int) y = if x >= y then x else invalid_arg \"String.concat\"\n\nlet rec sum_lengths acc seplen = function\n | [] -> acc\n | hd :: [] -> length hd + acc\n | hd :: tl -> sum_lengths (ensure_ge (length hd + seplen + acc) acc) seplen tl\n\nlet rec unsafe_blits dst pos sep seplen = function\n [] -> dst\n | hd :: [] ->\n unsafe_blit hd 0 dst pos (length hd); dst\n | hd :: tl ->\n unsafe_blit hd 0 dst pos (length hd);\n unsafe_blit sep 0 dst (pos + length hd) seplen;\n unsafe_blits dst (pos + length hd + seplen) sep seplen tl\n\nlet concat sep = function\n [] -> \"\"\n | l -> let seplen = length sep in bts @@\n unsafe_blits\n (B.create (sum_lengths 0 seplen l))\n 0 sep seplen l\n\nlet cat = ( ^ )\n\n(* duplicated in bytes.ml *)\nlet iter f s =\n for i = 0 to length s - 1 do f (unsafe_get s i) done\n\n(* duplicated in bytes.ml *)\nlet iteri f s =\n for i = 0 to length s - 1 do f i (unsafe_get s i) done\n\nlet map f s =\n B.map f (bos s) |> bts\nlet mapi f s =\n B.mapi f (bos s) |> bts\nlet fold_right f x a =\n B.fold_right f (bos x) a\nlet fold_left f a x =\n B.fold_left f a (bos x)\nlet exists f s =\n B.exists f (bos s)\nlet for_all f s =\n B.for_all f (bos s)\n\n(* Beware: we cannot use B.trim or B.escape because they always make a\n copy, but String.mli spells out some cases where we are not allowed\n to make a copy. *)\n\nlet is_space = function\n | ' ' | '\\012' | '\\n' | '\\r' | '\\t' -> true\n | _ -> false\n\nlet trim s =\n if s = \"\" then s\n else if is_space (unsafe_get s 0) || is_space (unsafe_get s (length s - 1))\n then bts (B.trim (bos s))\n else s\n\nlet escaped s =\n let b = bos s in\n (* We satisfy [unsafe_escape]'s precondition by passing an\n immutable byte sequence [b]. *)\n bts (B.unsafe_escape b)\n\n(* duplicated in bytes.ml *)\nlet rec index_rec s lim i c =\n if i >= lim then raise Not_found else\n if unsafe_get s i = c then i else index_rec s lim (i + 1) c\n\n(* duplicated in bytes.ml *)\nlet index s c = index_rec s (length s) 0 c\n\n(* duplicated in bytes.ml *)\nlet rec index_rec_opt s lim i c =\n if i >= lim then None else\n if unsafe_get s i = c then Some i else index_rec_opt s lim (i + 1) c\n\n(* duplicated in bytes.ml *)\nlet index_opt s c = index_rec_opt s (length s) 0 c\n\n(* duplicated in bytes.ml *)\nlet index_from s i c =\n let l = length s in\n if i < 0 || i > l then invalid_arg \"String.index_from / Bytes.index_from\" else\n index_rec s l i c\n\n(* duplicated in bytes.ml *)\nlet index_from_opt s i c =\n let l = length s in\n if i < 0 || i > l then\n invalid_arg \"String.index_from_opt / Bytes.index_from_opt\"\n else\n index_rec_opt s l i c\n\n(* duplicated in bytes.ml *)\nlet rec rindex_rec s i c =\n if i < 0 then raise Not_found else\n if unsafe_get s i = c then i else rindex_rec s (i - 1) c\n\n(* duplicated in bytes.ml *)\nlet rindex s c = rindex_rec s (length s - 1) c\n\n(* duplicated in bytes.ml *)\nlet rindex_from s i c =\n if i < -1 || i >= length s then\n invalid_arg \"String.rindex_from / Bytes.rindex_from\"\n else\n rindex_rec s i c\n\n(* duplicated in bytes.ml *)\nlet rec rindex_rec_opt s i c =\n if i < 0 then None else\n if unsafe_get s i = c then Some i else rindex_rec_opt s (i - 1) c\n\n(* duplicated in bytes.ml *)\nlet rindex_opt s c = rindex_rec_opt s (length s - 1) c\n\n(* duplicated in bytes.ml *)\nlet rindex_from_opt s i c =\n if i < -1 || i >= length s then\n invalid_arg \"String.rindex_from_opt / Bytes.rindex_from_opt\"\n else\n rindex_rec_opt s i c\n\n(* duplicated in bytes.ml *)\nlet contains_from s i c =\n let l = length s in\n if i < 0 || i > l then\n invalid_arg \"String.contains_from / Bytes.contains_from\"\n else\n try ignore (index_rec s l i c); true with Not_found -> false\n\n(* duplicated in bytes.ml *)\nlet contains s c = contains_from s 0 c\n\n(* duplicated in bytes.ml *)\nlet rcontains_from s i c =\n if i < 0 || i >= length s then\n invalid_arg \"String.rcontains_from / Bytes.rcontains_from\"\n else\n try ignore (rindex_rec s i c); true with Not_found -> false\n\nlet uppercase_ascii s =\n B.uppercase_ascii (bos s) |> bts\nlet lowercase_ascii s =\n B.lowercase_ascii (bos s) |> bts\nlet capitalize_ascii s =\n B.capitalize_ascii (bos s) |> bts\nlet uncapitalize_ascii s =\n B.uncapitalize_ascii (bos s) |> bts\n\n(* duplicated in bytes.ml *)\nlet starts_with ~prefix s =\n let len_s = length s\n and len_pre = length prefix in\n let rec aux i =\n if i = len_pre then true\n else if unsafe_get s i <> unsafe_get prefix i then false\n else aux (i + 1)\n in len_s >= len_pre && aux 0\n\n(* duplicated in bytes.ml *)\nlet ends_with ~suffix s =\n let len_s = length s\n and len_suf = length suffix in\n let diff = len_s - len_suf in\n let rec aux i =\n if i = len_suf then true\n else if unsafe_get s (diff + i) <> unsafe_get suffix i then false\n else aux (i + 1)\n in diff >= 0 && aux 0\n\nexternal seeded_hash : int -> string -> int = \"caml_string_hash\" [@@noalloc]\nlet hash x = seeded_hash 0 x\n\n(* duplicated in bytes.ml *)\nlet split_on_char sep s =\n let r = ref [] in\n let j = ref (length s) in\n for i = length s - 1 downto 0 do\n if unsafe_get s i = sep then begin\n r := sub s (i + 1) (!j - i - 1) :: !r;\n j := i\n end\n done;\n sub s 0 !j :: !r\n\ntype t = string\n\nlet compare (x: t) (y: t) = Stdlib.compare x y\nexternal equal : string -> string -> bool = \"caml_string_equal\" [@@noalloc]\n\n(** {1 Iterators} *)\n\nlet to_seq s = bos s |> B.to_seq\n\nlet to_seqi s = bos s |> B.to_seqi\n\nlet of_seq g = B.of_seq g |> bts\n\n(* UTF decoders and validators *)\n\nlet get_utf_8_uchar s i = B.get_utf_8_uchar (bos s) i\nlet is_valid_utf_8 s = B.is_valid_utf_8 (bos s)\n\nlet get_utf_16be_uchar s i = B.get_utf_16be_uchar (bos s) i\nlet is_valid_utf_16be s = B.is_valid_utf_16be (bos s)\n\nlet get_utf_16le_uchar s i = B.get_utf_16le_uchar (bos s) i\nlet is_valid_utf_16le s = B.is_valid_utf_16le (bos s)\n\n(** {6 Binary encoding/decoding of integers} *)\n\nexternal get_uint8 : string -> int -> int = \"%string_safe_get\"\nexternal get_uint16_ne : string -> int -> int = \"%caml_string_get16\"\nexternal get_int32_ne : string -> int -> int32 = \"%caml_string_get32\"\nexternal get_int64_ne : string -> int -> int64 = \"%caml_string_get64\"\n\nlet get_int8 s i = B.get_int8 (bos s) i\nlet get_uint16_le s i = B.get_uint16_le (bos s) i\nlet get_uint16_be s i = B.get_uint16_be (bos s) i\nlet get_int16_ne s i = B.get_int16_ne (bos s) i\nlet get_int16_le s i = B.get_int16_le (bos s) i\nlet get_int16_be s i = B.get_int16_be (bos s) i\nlet get_int32_le s i = B.get_int32_le (bos s) i\nlet get_int32_be s i = B.get_int32_be (bos s) i\nlet get_int64_le s i = B.get_int64_le (bos s) i\nlet get_int64_be s i = B.get_int64_be (bos s) i\n"],"names":[],"mappings":"wHCmRsC,yBAAO,wBAAE,C,EADT,yBAAO,wBAAE,C,EADT,yBAAO,wBAAE,C,EADT,yBAAO,wBAAE,C,EADT,yBAAO,wBAAE,C,EADT,yBAAO,wBAAE,C,EADT,yBAAO,wBAAE,C,EADP,yBAAO,uBAAE,C,EADT,yBAAO,uBAAE,C,EADnB,yBAAO,uBAAE,C,EATO,wBAAO,sB,EADH,yBAAO,uBAAE,C,EAFb,wBAAO,sB,EADH,yBAAO,uBAAE,C,EAFnB,wBAAO,sB,EADH,yBAAO,uBAAE,C,KAJtC,8BAAU,mBAAO,C,EAFhB,wBAAK,qBAAa,C,EAFnB,wBAAK,qBAAY,C,EALJ,MAAkB,C,eAZ5C,QACA,WACA,gCACE,uBACiC,IAA1B,EADsB,KACtB,EADsB,QACtB,WAA0B,QAC/B,4BAGM,IAAV,mBAAU,MAAM,C,EAZL,QAAe,C,IAV1B,gBAEA,GAKG,kBAHD,cAAoB,KACf,uCAAuD,KACvD,kBACc,C,IAjBrB,gBAMG,aAHD,cAAoB,KACf,oCAA8C,KAC9C,kBACqB,C,KAVP,0BAAO,QAA5B,aAA4B,mBAAO,C,KAFhB,0BAAO,QAA1B,aAA0B,mBAAO,C,KAFf,0BAAO,QAAzB,aAAyB,mBAAO,C,KAFd,0BAAO,QAAzB,aAAyB,mBAAO,C,SANhC,qCAGa,UAAoB,O,AAAA,I,AAAA,G,EAAA,GD5LnC,iDC4L0D,W,GAFtD,uBAE2D,C,EAP5C,eAAmB,C,WANpC,cADA,WACA,cAGa,cAAqB,O,AAAA,I,AAAA,G,EAAA,GDlLpC,iDCkL2D,W,GAFvD,uBAE4D,C,QAX9D,8BAGE,WAFA,uBAEoB,C,KAPH,qBAAiC,C,EAJpD,aACA,iBAA2B,WAAY,eADzB,MACmD,C,QARjE,8BAGE,WAFA,uBAEgB,C,KAPH,qBAA6B,C,EAJ5C,aACA,iBAA2B,GAAO,eADpB,WAC0C,C,UARxD,cADA,WACA,OAGE,eAFA,uBAEqB,C,UATvB,cADA,WACA,OACE,eADqB,uBACJ,C,KAND,sBAA8B,C,EAJhD,eAAiB,KACjB,iBAA2B,WAAY,gBAA6B,C,KALtD,sBAA0B,C,EAJxC,eAAiB,UACjB,iBAA2B,GAAO,gBAAyB,C,KARnD,0BAGR,SAAI,aAAmB,oB,SATpB,cAAM,QACJ,YAAG,K,CAAyB,oBAAI,K,CAAsC,EAEtE,KADc,qBAAO,QAAf,aAAgB,oBAFZ,GAGT,C,IARO,mC,CAAA,E,EAAA,EAEN,EAAK,C,EARO,EAAP,yBAAO,sB,EAFD,EAAP,yBAAO,sB,EAFK,IAAP,yBAAO,sB,EAFD,EAAP,yBAAO,uBAAE,C,MAFxB,EAAS,2BAAO,QAAhB,aAAgB,mBAAO,C,MAFvB,EAAQ,2BAAO,QAAf,aAAe,mBAAO,C,IAHtB,sBAA6B,4BAAoB,6BAAK,C,OAJtD,sBAA6B,kCAAkB,6BAAK,C,oBAX3C,UACD,IADC,QAEF,SAEa,cAlBF,sC,CAAA,WAGJ,sBALU,sBAAsB,Y,CAAA,gB,IAIhC,oBAgBJ,E,CAAA,IADF,MAZW,O,CAAA,8BAGjB,a,CAAA,cAAoC,YAEpC,a,CAAA,aACA,Q,CADoC,OACpC,SAA8C,iBAQxB,E,CAAA,qB,MAzBlB,2BAAN,IAAa,QAAb,aAAqB,mBAAO,C,MAL5B,iCAAU,mBAAO,C,MAFjB,iCAAU,mBAAO,C","ignoreList":[0]}},{"offset":{"line":0,"column":135051},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/unit.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype t = unit = ()\n\nlet equal () () = true\nlet compare () () = 0\nlet to_string () = \"()\"\n","(* generated code *)"],"names":[],"mappings":"EAmBmB,GAAI,C,EADH,IAAC,C,EADH,IAAI,C,ECjBtB,yB,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":135152},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/marshal.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1997 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype extern_flags =\n No_sharing\n | Closures\n | Compat_32\n\n(* note: this type definition is used in 'runtime/debugger.c' *)\n\nexternal to_channel: out_channel -> 'a -> extern_flags list -> unit\n = \"caml_output_value\"\nexternal to_bytes: 'a -> extern_flags list -> bytes\n = \"caml_output_value_to_bytes\"\nexternal to_string: 'a -> extern_flags list -> string\n = \"caml_output_value_to_string\"\nexternal to_buffer_unsafe:\n bytes -> int -> int -> 'a -> extern_flags list -> int\n = \"caml_output_value_to_buffer\"\n\nlet to_buffer buff ofs len v flags =\n if ofs < 0 || len < 0 || ofs > Bytes.length buff - len\n then invalid_arg \"Marshal.to_buffer: substring out of bounds\"\n else to_buffer_unsafe buff ofs len v flags\n\n(* The functions below use byte sequences as input, never using any\n mutation. It makes sense to use non-mutated [bytes] rather than\n [string], because we really work with sequences of bytes, not\n a text representation.\n*)\n\nexternal from_channel: in_channel -> 'a = \"caml_input_value\"\nexternal from_bytes_unsafe: bytes -> int -> 'a = \"caml_input_value_from_bytes\"\nexternal data_size_unsafe: bytes -> int -> int = \"caml_marshal_data_size\"\n\nlet header_size = 16\nlet data_size buff ofs =\n if ofs < 0 || ofs > Bytes.length buff - header_size\n then invalid_arg \"Marshal.data_size\"\n else data_size_unsafe buff ofs\nlet total_size buff ofs = header_size + data_size buff ofs\n\nlet from_bytes buff ofs =\n if ofs < 0 || ofs > Bytes.length buff - header_size\n then invalid_arg \"Marshal.from_bytes\"\n else begin\n let len = data_size_unsafe buff ofs in\n if ofs > Bytes.length buff - (header_size + len)\n then invalid_arg \"Marshal.from_bytes\"\n else from_bytes_unsafe buff ofs\n end\n\nlet from_string buff ofs =\n (* Bytes.unsafe_of_string is safe here, as the produced byte\n sequence is never mutated *)\n from_bytes (Bytes.unsafe_of_string buff) ofs\n"],"names":[],"mappings":"oBCmEa,EAAX,QAAW,aAA6B,SAAI,C,WAZ5C,uCAGY,MACV,8BACK,wBACA,MAA0B,E,GAL5B,uBAMF,C,EAVmC,WAAkB,W,QAHxD,uCAEK,MAAyB,GADzB,uBACyB,C,QAlB9B,uDAEK,YAAqC,IADrC,uBACqC,C","ignoreList":[0]}},{"offset":{"line":0,"column":135886},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/array.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* An alias for the type of arrays. *)\ntype 'a t = 'a array\n\n(* Array operations *)\n\nexternal length : 'a array -> int = \"%array_length\"\nexternal get: 'a array -> int -> 'a = \"%array_safe_get\"\nexternal set: 'a array -> int -> 'a -> unit = \"%array_safe_set\"\nexternal unsafe_get: 'a array -> int -> 'a = \"%array_unsafe_get\"\nexternal unsafe_set: 'a array -> int -> 'a -> unit = \"%array_unsafe_set\"\nexternal make: int -> 'a -> 'a array = \"caml_make_vect\"\nexternal create: int -> 'a -> 'a array = \"caml_make_vect\"\nexternal unsafe_sub : 'a array -> int -> int -> 'a array = \"caml_array_sub\"\nexternal append_prim : 'a array -> 'a array -> 'a array = \"caml_array_append\"\nexternal concat : 'a array list -> 'a array = \"caml_array_concat\"\nexternal unsafe_blit :\n 'a array -> int -> 'a array -> int -> int -> unit = \"caml_array_blit\"\nexternal unsafe_fill :\n 'a array -> int -> int -> 'a -> unit = \"caml_array_fill\"\nexternal create_float: int -> float array = \"caml_make_float_vect\"\n\nmodule Floatarray = struct\n external create : int -> floatarray = \"caml_floatarray_create\"\n external length : floatarray -> int = \"%floatarray_length\"\n external get : floatarray -> int -> float = \"%floatarray_safe_get\"\n external set : floatarray -> int -> float -> unit = \"%floatarray_safe_set\"\n external unsafe_get : floatarray -> int -> float = \"%floatarray_unsafe_get\"\n external unsafe_set : floatarray -> int -> float -> unit\n = \"%floatarray_unsafe_set\"\nend\n\nlet init l f =\n if l = 0 then [||] else\n if l < 0 then invalid_arg \"Array.init\"\n (* See #6575. We must not evaluate [f 0] when [l <= 0].\n We could also check for maximum array size, but this depends\n on whether we create a float array or a regular one... *)\n else\n let res = create l (f 0) in\n for i = 1 to pred l do\n unsafe_set res i (f i)\n done;\n res\n\nlet make_matrix sx sy init =\n (* We raise even if [sx = 0 && sy < 0]: *)\n if sy < 0 then invalid_arg \"Array.make_matrix\";\n let res = create sx [||] in\n if sy > 0 then begin\n for x = 0 to pred sx do\n unsafe_set res x (create sy init)\n done;\n end;\n res\n\nlet init_matrix sx sy f =\n (* We raise even if [sx = 0 && sy < 0]: *)\n if sy < 0 then invalid_arg \"Array.init_matrix\";\n let res = create sx [||] in\n (* We must not evaluate [f x 0] when [sy <= 0]: *)\n if sy > 0 then begin\n for x = 0 to pred sx do\n let row = create sy (f x 0) in\n for y = 1 to pred sy do\n unsafe_set row y (f x y)\n done;\n unsafe_set res x row\n done;\n end;\n res\n\nlet copy a =\n let l = length a in if l = 0 then [||] else unsafe_sub a 0 l\n\nlet append a1 a2 =\n let l1 = length a1 in\n if l1 = 0 then copy a2\n else if length a2 = 0 then unsafe_sub a1 0 l1\n else append_prim a1 a2\n\nlet sub a ofs len =\n if ofs < 0 || len < 0 || ofs > length a - len\n then invalid_arg \"Array.sub\"\n else unsafe_sub a ofs len\n\nlet fill a ofs len v =\n if ofs < 0 || len < 0 || ofs > length a - len\n then invalid_arg \"Array.fill\"\n else unsafe_fill a ofs len v\n\nlet blit a1 ofs1 a2 ofs2 len =\n if len < 0 || ofs1 < 0 || ofs1 > length a1 - len\n || ofs2 < 0 || ofs2 > length a2 - len\n then invalid_arg \"Array.blit\"\n else unsafe_blit a1 ofs1 a2 ofs2 len\n\nlet iter f a =\n for i = 0 to length a - 1 do f(unsafe_get a i) done\n\nlet iter2 f a b =\n if length a <> length b then\n invalid_arg \"Array.iter2: arrays must have the same length\"\n else\n for i = 0 to length a - 1 do f (unsafe_get a i) (unsafe_get b i) done\n\nlet map f a =\n let l = length a in\n if l = 0 then [||] else begin\n let r = create l (f(unsafe_get a 0)) in\n for i = 1 to l - 1 do\n unsafe_set r i (f(unsafe_get a i))\n done;\n r\n end\n\nlet map_inplace f a =\n for i = 0 to length a - 1 do\n unsafe_set a i (f (unsafe_get a i))\n done\n\nlet mapi_inplace f a =\n for i = 0 to length a - 1 do\n unsafe_set a i (f i (unsafe_get a i))\n done\n\nlet map2 f a b =\n let la = length a in\n let lb = length b in\n if la <> lb then\n invalid_arg \"Array.map2: arrays must have the same length\"\n else begin\n if la = 0 then [||] else begin\n let r = create la (f (unsafe_get a 0) (unsafe_get b 0)) in\n for i = 1 to la - 1 do\n unsafe_set r i (f (unsafe_get a i) (unsafe_get b i))\n done;\n r\n end\n end\n\nlet iteri f a =\n for i = 0 to length a - 1 do f i (unsafe_get a i) done\n\nlet mapi f a =\n let l = length a in\n if l = 0 then [||] else begin\n let r = create l (f 0 (unsafe_get a 0)) in\n for i = 1 to l - 1 do\n unsafe_set r i (f i (unsafe_get a i))\n done;\n r\n end\n\nlet to_list a =\n let rec tolist i res =\n if i < 0 then res else tolist (i - 1) (unsafe_get a i :: res) in\n tolist (length a - 1) []\n\n(* Cannot use List.length here because the List module depends on Array. *)\nlet rec list_length accu = function\n | [] -> accu\n | _::t -> list_length (succ accu) t\n\nlet of_list = function\n [] -> [||]\n | hd::tl as l ->\n let a = create (list_length 0 l) hd in\n let rec fill i = function\n [] -> a\n | hd::tl -> unsafe_set a i hd; fill (i+1) tl in\n fill 1 tl\n\nlet fold_left f x a =\n let r = ref x in\n for i = 0 to length a - 1 do\n r := f !r (unsafe_get a i)\n done;\n !r\n\nlet fold_left_map f acc input_array =\n let len = length input_array in\n if len = 0 then (acc, [||]) else begin\n let acc, elt = f acc (unsafe_get input_array 0) in\n let output_array = create len elt in\n let acc = ref acc in\n for i = 1 to len - 1 do\n let acc', elt = f !acc (unsafe_get input_array i) in\n acc := acc';\n unsafe_set output_array i elt;\n done;\n !acc, output_array\n end\n\nlet fold_right f a x =\n let r = ref x in\n for i = length a - 1 downto 0 do\n r := f (unsafe_get a i) !r\n done;\n !r\n\nlet exists p a =\n let n = length a in\n let rec loop i =\n if i = n then false\n else if p (unsafe_get a i) then true\n else loop (succ i) in\n loop 0\n\nlet for_all p a =\n let n = length a in\n let rec loop i =\n if i = n then true\n else if p (unsafe_get a i) then loop (succ i)\n else false in\n loop 0\n\nlet for_all2 p l1 l2 =\n let n1 = length l1\n and n2 = length l2 in\n if n1 <> n2 then invalid_arg \"Array.for_all2\"\n else let rec loop i =\n if i = n1 then true\n else if p (unsafe_get l1 i) (unsafe_get l2 i) then loop (succ i)\n else false in\n loop 0\n\nlet exists2 p l1 l2 =\n let n1 = length l1\n and n2 = length l2 in\n if n1 <> n2 then invalid_arg \"Array.exists2\"\n else let rec loop i =\n if i = n1 then false\n else if p (unsafe_get l1 i) (unsafe_get l2 i) then true\n else loop (succ i) in\n loop 0\n\nlet mem x a =\n let n = length a in\n let rec loop i =\n if i = n then false\n else if compare (unsafe_get a i) x = 0 then true\n else loop (succ i) in\n loop 0\n\nlet memq x a =\n let n = length a in\n let rec loop i =\n if i = n then false\n else if x == (unsafe_get a i) then true\n else loop (succ i) in\n loop 0\n\nlet find_opt p a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else\n let x = unsafe_get a i in\n if p x then Some x\n else loop (succ i)\n in\n loop 0\n\nlet find_index p a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else if p (unsafe_get a i) then Some i\n else loop (succ i) in\n loop 0\n\nlet find_map f a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else\n match f (unsafe_get a i) with\n | None -> loop (succ i)\n | Some _ as r -> r\n in\n loop 0\n\nlet find_mapi f a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else\n match f i (unsafe_get a i) with\n | None -> loop (succ i)\n | Some _ as r -> r\n in\n loop 0\n\nlet split x =\n if x = [||] then [||], [||]\n else begin\n let a0, b0 = unsafe_get x 0 in\n let n = length x in\n let a = create n a0 in\n let b = create n b0 in\n for i = 1 to n - 1 do\n let ai, bi = unsafe_get x i in\n unsafe_set a i ai;\n unsafe_set b i bi\n done;\n a, b\n end\n\nlet combine a b =\n let na = length a in\n let nb = length b in\n if na <> nb then invalid_arg \"Array.combine\";\n if na = 0 then [||]\n else begin\n let x = create na (unsafe_get a 0, unsafe_get b 0) in\n for i = 1 to na - 1 do\n unsafe_set x i (unsafe_get a i, unsafe_get b i)\n done;\n x\n end\n\nexception Bottom of int\nlet sort cmp a =\n let maxson l i =\n let i31 = i+i+i+1 in\n let x = ref i31 in\n if i31+2 < l then begin\n if cmp (get a i31) (get a (i31+1)) < 0 then x := i31+1;\n if cmp (get a !x) (get a (i31+2)) < 0 then x := i31+2;\n !x\n end else\n if i31+1 < l && cmp (get a i31) (get a (i31+1)) < 0\n then i31+1\n else if i31 < l then i31 else raise (Bottom i)\n in\n let rec trickledown l i e =\n let j = maxson l i in\n if cmp (get a j) e > 0 then begin\n set a i (get a j);\n trickledown l j e;\n end else begin\n set a i e;\n end;\n in\n let trickle l i e = try trickledown l i e with Bottom i -> set a i e in\n let rec bubbledown l i =\n let j = maxson l i in\n set a i (get a j);\n bubbledown l j\n in\n let bubble l i = try bubbledown l i with Bottom i -> i in\n let rec trickleup i e =\n let father = (i - 1) / 3 in\n assert (i <> father);\n if cmp (get a father) e < 0 then begin\n set a i (get a father);\n if father > 0 then trickleup father e else set a 0 e;\n end else begin\n set a i e;\n end;\n in\n let l = length a in\n for i = (l + 1) / 3 - 1 downto 0 do trickle l i (get a i); done;\n for i = l - 1 downto 2 do\n let e = (get a i) in\n set a i (get a 0);\n trickleup (bubble i 0) e;\n done;\n if l > 1 then (let e = (get a 1) in set a 1 (get a 0); set a 0 e)\n\n\nlet cutoff = 5\nlet stable_sort cmp a =\n let merge src1ofs src1len src2 src2ofs src2len dst dstofs =\n let src1r = src1ofs + src1len and src2r = src2ofs + src2len in\n let rec loop i1 s1 i2 s2 d =\n if cmp s1 s2 <= 0 then begin\n set dst d s1;\n let i1 = i1 + 1 in\n if i1 < src1r then\n loop i1 (get a i1) i2 s2 (d + 1)\n else\n blit src2 i2 dst (d + 1) (src2r - i2)\n end else begin\n set dst d s2;\n let i2 = i2 + 1 in\n if i2 < src2r then\n loop i1 s1 i2 (get src2 i2) (d + 1)\n else\n blit a i1 dst (d + 1) (src1r - i1)\n end\n in loop src1ofs (get a src1ofs) src2ofs (get src2 src2ofs) dstofs;\n in\n let isortto srcofs dst dstofs len =\n for i = 0 to len - 1 do\n let e = (get a (srcofs + i)) in\n let j = ref (dstofs + i - 1) in\n while (!j >= dstofs && cmp (get dst !j) e > 0) do\n set dst (!j + 1) (get dst !j);\n decr j;\n done;\n set dst (!j + 1) e;\n done;\n in\n let rec sortto srcofs dst dstofs len =\n if len <= cutoff then isortto srcofs dst dstofs len else begin\n let l1 = len / 2 in\n let l2 = len - l1 in\n sortto (srcofs + l1) dst (dstofs + l1) l2;\n sortto srcofs a (srcofs + l2) l1;\n merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs;\n end;\n in\n let l = length a in\n if l <= cutoff then isortto 0 a 0 l else begin\n let l1 = l / 2 in\n let l2 = l - l1 in\n let t = make l2 (get a 0) in\n sortto l1 t 0 l2;\n sortto 0 a l2 l1;\n merge l2 l1 t 0 l2 a 0;\n end\n\n\nlet fast_sort = stable_sort\n\nlet shuffle ~rand a = (* Fisher-Yates *)\n for i = length a - 1 downto 1 do\n let j = rand (i + 1) in\n let v = unsafe_get a i in\n unsafe_set a i (get a j);\n unsafe_set a j v\n done\n\n(** {1 Iterators} *)\n\nlet to_seq a =\n let rec aux i () =\n if i < length a\n then\n let x = unsafe_get a i in\n Seq.Cons (x, aux (i+1))\n else Seq.Nil\n in\n aux 0\n\nlet to_seqi a =\n let rec aux i () =\n if i < length a\n then\n let x = unsafe_get a i in\n Seq.Cons ((i,x), aux (i+1))\n else Seq.Nil\n in\n aux 0\n\nlet of_rev_list = function\n [] -> [||]\n | hd::tl as l ->\n let len = list_length 0 l in\n let a = create len hd in\n let rec fill i = function\n [] -> a\n | hd::tl -> unsafe_set a i hd; fill (i-1) tl\n in\n fill (len-2) tl\n\nlet of_seq i =\n let l = Seq.fold_left (fun acc x -> x::acc) [] i in\n of_rev_list l\n"],"names":[],"mappings":"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","ignoreList":[0]}},{"offset":{"line":0,"column":149689},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/float.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* Nicolas Ojeda Bar, LexiFi *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nexternal neg : float -> float = \"%negfloat\"\nexternal add : float -> float -> float = \"%addfloat\"\nexternal sub : float -> float -> float = \"%subfloat\"\nexternal mul : float -> float -> float = \"%mulfloat\"\nexternal div : float -> float -> float = \"%divfloat\"\nexternal rem : float -> float -> float = \"caml_fmod_float\" \"fmod\"\n [@@unboxed] [@@noalloc]\nexternal fma : float -> float -> float -> float = \"caml_fma_float\" \"caml_fma\"\n [@@unboxed] [@@noalloc]\nexternal abs : float -> float = \"%absfloat\"\n\nlet zero = 0.\nlet one = 1.\nlet minus_one = -1.\nlet infinity = Stdlib.infinity\nlet neg_infinity = Stdlib.neg_infinity\nlet nan = Stdlib.nan\nlet quiet_nan = nan\nexternal float_of_bits : int64 -> float\n = \"caml_int64_float_of_bits\" \"caml_int64_float_of_bits_unboxed\"\n [@@unboxed] [@@noalloc]\nlet signaling_nan = float_of_bits 0x7F_F0_00_00_00_00_00_01L\nlet is_finite (x: float) = x -. x = 0.\nlet is_infinite (x: float) = 1. /. x = 0.\nlet is_nan (x: float) = x <> x\n\nlet pi = 0x1.921fb54442d18p+1\nlet max_float = Stdlib.max_float\nlet min_float = Stdlib.min_float\nlet epsilon = Stdlib.epsilon_float\nexternal of_int : int -> float = \"%floatofint\"\nexternal to_int : float -> int = \"%intoffloat\"\nexternal of_string : string -> float = \"caml_float_of_string\"\nlet of_string_opt = Stdlib.float_of_string_opt\nlet to_string = Stdlib.string_of_float\ntype fpclass = Stdlib.fpclass =\n FP_normal\n | FP_subnormal\n | FP_zero\n | FP_infinite\n | FP_nan\nexternal classify_float : (float [@unboxed]) -> fpclass =\n \"caml_classify_float\" \"caml_classify_float_unboxed\" [@@noalloc]\nexternal pow : float -> float -> float = \"caml_power_float\" \"pow\"\n [@@unboxed] [@@noalloc]\nexternal sqrt : float -> float = \"caml_sqrt_float\" \"sqrt\"\n [@@unboxed] [@@noalloc]\nexternal cbrt : float -> float = \"caml_cbrt_float\" \"caml_cbrt\"\n [@@unboxed] [@@noalloc]\nexternal exp : float -> float = \"caml_exp_float\" \"exp\" [@@unboxed] [@@noalloc]\nexternal exp2 : float -> float = \"caml_exp2_float\" \"caml_exp2\"\n [@@unboxed] [@@noalloc]\nexternal log : float -> float = \"caml_log_float\" \"log\" [@@unboxed] [@@noalloc]\nexternal log10 : float -> float = \"caml_log10_float\" \"log10\"\n [@@unboxed] [@@noalloc]\nexternal log2 : float -> float = \"caml_log2_float\" \"caml_log2\"\n [@@unboxed] [@@noalloc]\nexternal expm1 : float -> float = \"caml_expm1_float\" \"caml_expm1\"\n [@@unboxed] [@@noalloc]\nexternal log1p : float -> float = \"caml_log1p_float\" \"caml_log1p\"\n [@@unboxed] [@@noalloc]\nexternal cos : float -> float = \"caml_cos_float\" \"cos\" [@@unboxed] [@@noalloc]\nexternal sin : float -> float = \"caml_sin_float\" \"sin\" [@@unboxed] [@@noalloc]\nexternal tan : float -> float = \"caml_tan_float\" \"tan\" [@@unboxed] [@@noalloc]\nexternal acos : float -> float = \"caml_acos_float\" \"acos\"\n [@@unboxed] [@@noalloc]\nexternal asin : float -> float = \"caml_asin_float\" \"asin\"\n [@@unboxed] [@@noalloc]\nexternal atan : float -> float = \"caml_atan_float\" \"atan\"\n [@@unboxed] [@@noalloc]\nexternal atan2 : float -> float -> float = \"caml_atan2_float\" \"atan2\"\n [@@unboxed] [@@noalloc]\nexternal hypot : float -> float -> float\n = \"caml_hypot_float\" \"caml_hypot\" [@@unboxed] [@@noalloc]\nexternal cosh : float -> float = \"caml_cosh_float\" \"cosh\"\n [@@unboxed] [@@noalloc]\nexternal sinh : float -> float = \"caml_sinh_float\" \"sinh\"\n [@@unboxed] [@@noalloc]\nexternal tanh : float -> float = \"caml_tanh_float\" \"tanh\"\n [@@unboxed] [@@noalloc]\nexternal acosh : float -> float = \"caml_acosh_float\" \"caml_acosh\"\n [@@unboxed] [@@noalloc]\nexternal asinh : float -> float = \"caml_asinh_float\" \"caml_asinh\"\n [@@unboxed] [@@noalloc]\nexternal atanh : float -> float = \"caml_atanh_float\" \"caml_atanh\"\n [@@unboxed] [@@noalloc]\nexternal erf : float -> float = \"caml_erf_float\" \"caml_erf\"\n [@@unboxed] [@@noalloc]\nexternal erfc : float -> float = \"caml_erfc_float\" \"caml_erfc\"\n [@@unboxed] [@@noalloc]\nexternal trunc : float -> float = \"caml_trunc_float\" \"caml_trunc\"\n [@@unboxed] [@@noalloc]\nexternal round : float -> float = \"caml_round_float\" \"caml_round\"\n [@@unboxed] [@@noalloc]\nexternal ceil : float -> float = \"caml_ceil_float\" \"ceil\"\n [@@unboxed] [@@noalloc]\nexternal floor : float -> float = \"caml_floor_float\" \"floor\"\n[@@unboxed] [@@noalloc]\n\nlet is_integer x = x = trunc x && is_finite x\n\nexternal next_after : float -> float -> float\n = \"caml_nextafter_float\" \"caml_nextafter\" [@@unboxed] [@@noalloc]\n\nlet succ x = next_after x infinity\nlet pred x = next_after x neg_infinity\n\nexternal copy_sign : float -> float -> float\n = \"caml_copysign_float\" \"caml_copysign\"\n [@@unboxed] [@@noalloc]\nexternal sign_bit : (float [@unboxed]) -> bool\n = \"caml_signbit_float\" \"caml_signbit\" [@@noalloc]\n\nexternal frexp : float -> float * int = \"caml_frexp_float\"\nexternal ldexp : (float [@unboxed]) -> (int [@untagged]) -> (float [@unboxed]) =\n \"caml_ldexp_float\" \"caml_ldexp_float_unboxed\" [@@noalloc]\nexternal modf : float -> float * float = \"caml_modf_float\"\ntype t = float\nexternal compare : float -> float -> int = \"%compare\"\nlet equal x y = compare x y = 0\n\nlet[@inline] min (x: float) (y: float) =\n if y > x || (not(sign_bit y) && sign_bit x) then\n if is_nan y then y else x\n else if is_nan x then x else y\n\nlet[@inline] max (x: float) (y: float) =\n if y > x || (not(sign_bit y) && sign_bit x) then\n if is_nan x then x else y\n else if is_nan y then y else x\n\nlet[@inline] min_max (x: float) (y: float) =\n if is_nan x || is_nan y then (nan, nan)\n else if y > x || (not(sign_bit y) && sign_bit x) then (x, y) else (y, x)\n\nlet[@inline] min_num (x: float) (y: float) =\n if y > x || (not(sign_bit y) && sign_bit x) then\n if is_nan x then y else x\n else if is_nan y then x else y\n\nlet[@inline] max_num (x: float) (y: float) =\n if y > x || (not(sign_bit y) && sign_bit x) then\n if is_nan y then x else y\n else if is_nan x then y else x\n\nlet[@inline] min_max_num (x: float) (y: float) =\n if is_nan x then (y,y)\n else if is_nan y then (x,x)\n else if y > x || (not(sign_bit y) && sign_bit x) then (x,y) else (y,x)\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n\nmodule Array = struct\n\n type t = floatarray\n\n external length : t -> int = \"%floatarray_length\"\n external get : t -> int -> float = \"%floatarray_safe_get\"\n external set : t -> int -> float -> unit = \"%floatarray_safe_set\"\n external create : int -> t = \"caml_floatarray_create\"\n external unsafe_get : t -> int -> float = \"%floatarray_unsafe_get\"\n external unsafe_set : t -> int -> float -> unit = \"%floatarray_unsafe_set\"\n\n let unsafe_fill a ofs len v =\n for i = ofs to ofs + len - 1 do unsafe_set a i v done\n\n external unsafe_blit: t -> int -> t -> int -> int -> unit =\n \"caml_floatarray_blit\" [@@noalloc]\n\n let check a ofs len msg =\n if ofs < 0 || len < 0 || ofs + len < 0 || ofs + len > length a then\n invalid_arg msg\n\n let make n v =\n let result = create n in\n unsafe_fill result 0 n v;\n result\n\n let init l f =\n if l < 0 then invalid_arg \"Float.Array.init\"\n else\n let res = create l in\n for i = 0 to l - 1 do\n unsafe_set res i (f i)\n done;\n res\n\n let make_matrix sx sy v =\n (* We raise even if [sx = 0 && sy < 0]: *)\n if sy < 0 then invalid_arg \"Float.Array.make_matrix\";\n let res = Array.make sx (create 0) in\n if sy > 0 then begin\n for x = 0 to sx - 1 do\n Array.unsafe_set res x (make sy v)\n done;\n end;\n res\n\n let init_matrix sx sy f =\n (* We raise even if [sx = 0 && sy < 0]: *)\n if sy < 0 then invalid_arg \"Float.Array.init_matrix\";\n let res = Array.make sx (create 0) in\n if sy > 0 then begin\n for x = 0 to sx - 1 do\n let row = create sy in\n for y = 0 to sy - 1 do\n unsafe_set row y (f x y)\n done;\n Array.unsafe_set res x row\n done;\n end;\n res\n\n let append a1 a2 =\n let l1 = length a1 in\n let l2 = length a2 in\n let result = create (l1 + l2) in\n unsafe_blit a1 0 result 0 l1;\n unsafe_blit a2 0 result l1 l2;\n result\n\n (* next 3 functions: modified copy of code from string.ml *)\n let ensure_ge (x:int) y =\n if x >= y then x else invalid_arg \"Float.Array.concat\"\n\n let rec sum_lengths acc = function\n | [] -> acc\n | hd :: tl -> sum_lengths (ensure_ge (length hd + acc) acc) tl\n\n let concat l =\n let len = sum_lengths 0 l in\n let result = create len in\n let rec loop l i =\n match l with\n | [] -> assert (i = len)\n | hd :: tl ->\n let hlen = length hd in\n unsafe_blit hd 0 result i hlen;\n loop tl (i + hlen)\n in\n loop l 0;\n result\n\n let sub a ofs len =\n check a ofs len \"Float.Array.sub\";\n let result = create len in\n unsafe_blit a ofs result 0 len;\n result\n\n let copy a =\n let l = length a in\n let result = create l in\n unsafe_blit a 0 result 0 l;\n result\n\n let fill a ofs len v =\n check a ofs len \"Float.Array.fill\";\n unsafe_fill a ofs len v\n\n let blit src sofs dst dofs len =\n check src sofs len \"Float.array.blit\";\n check dst dofs len \"Float.array.blit\";\n unsafe_blit src sofs dst dofs len\n\n let to_list a =\n List.init (length a) (unsafe_get a)\n\n let of_list l =\n let result = create (List.length l) in\n let rec fill i l =\n match l with\n | [] -> result\n | h :: t -> unsafe_set result i h; fill (i + 1) t\n in\n fill 0 l\n\n (* duplicated from array.ml *)\n let iter f a =\n for i = 0 to length a - 1 do f (unsafe_get a i) done\n\n (* duplicated from array.ml *)\n let iter2 f a b =\n if length a <> length b then\n invalid_arg \"Float.Array.iter2: arrays must have the same length\"\n else\n for i = 0 to length a - 1 do f (unsafe_get a i) (unsafe_get b i) done\n\n let map f a =\n let l = length a in\n let r = create l in\n for i = 0 to l - 1 do\n unsafe_set r i (f (unsafe_get a i))\n done;\n r\n\n (* duplicated from array.ml *)\n let map_inplace f a =\n for i = 0 to length a - 1 do\n unsafe_set a i (f (unsafe_get a i))\n done\n\n let map2 f a b =\n let la = length a in\n let lb = length b in\n if la <> lb then\n invalid_arg \"Float.Array.map2: arrays must have the same length\"\n else begin\n let r = create la in\n for i = 0 to la - 1 do\n unsafe_set r i (f (unsafe_get a i) (unsafe_get b i))\n done;\n r\n end\n\n (* duplicated from array.ml *)\n let iteri f a =\n for i = 0 to length a - 1 do f i (unsafe_get a i) done\n\n let mapi f a =\n let l = length a in\n let r = create l in\n for i = 0 to l - 1 do\n unsafe_set r i (f i (unsafe_get a i))\n done;\n r\n\n (* duplicated from array.ml *)\n let mapi_inplace f a =\n for i = 0 to length a - 1 do\n unsafe_set a i (f i (unsafe_get a i))\n done\n\n (* duplicated from array.ml *)\n let fold_left f x a =\n let r = ref x in\n for i = 0 to length a - 1 do\n r := f !r (unsafe_get a i)\n done;\n !r\n\n (* duplicated from array.ml *)\n let fold_right f a x =\n let r = ref x in\n for i = length a - 1 downto 0 do\n r := f (unsafe_get a i) !r\n done;\n !r\n\n (* duplicated from array.ml *)\n let exists p a =\n let n = length a in\n let rec loop i =\n if i = n then false\n else if p (unsafe_get a i) then true\n else loop (i + 1) in\n loop 0\n\n (* duplicated from array.ml *)\n let for_all p a =\n let n = length a in\n let rec loop i =\n if i = n then true\n else if p (unsafe_get a i) then loop (i + 1)\n else false in\n loop 0\n\n (* duplicated from array.ml *)\n let mem x a =\n let n = length a in\n let rec loop i =\n if i = n then false\n else if compare (unsafe_get a i) x = 0 then true\n else loop (i + 1)\n in\n loop 0\n\n (* mostly duplicated from array.ml, but slightly different *)\n let mem_ieee x a =\n let n = length a in\n let rec loop i =\n if i = n then false\n else if x = (unsafe_get a i) then true\n else loop (i + 1)\n in\n loop 0\n\n (* duplicated from array.ml *)\n let find_opt p a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else\n let x = unsafe_get a i in\n if p x then Some x\n else loop (i + 1)\n in\n loop 0\n\n (* duplicated from array.ml *)\n let find_index p a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else if p (unsafe_get a i) then Some i\n else loop (i + 1) in\n loop 0\n\n (* duplicated from array.ml *)\n let find_map f a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else\n match f (unsafe_get a i) with\n | None -> loop (i + 1)\n | Some _ as r -> r\n in\n loop 0\n\n (* duplicated from array.ml *)\n let find_mapi f a =\n let n = length a in\n let rec loop i =\n if i = n then None\n else\n match f i (unsafe_get a i) with\n | None -> loop (i + 1)\n | Some _ as r -> r\n in\n loop 0\n\n (* duplicated from array.ml *)\n exception Bottom of int\n let sort cmp a =\n let maxson l i =\n let i31 = i+i+i+1 in\n let x = ref i31 in\n if i31+2 < l then begin\n if cmp (get a i31) (get a (i31+1)) < 0 then x := i31+1;\n if cmp (get a !x) (get a (i31+2)) < 0 then x := i31+2;\n !x\n end else\n if i31+1 < l && cmp (get a i31) (get a (i31+1)) < 0\n then i31+1\n else if i31 < l then i31 else raise (Bottom i)\n in\n let rec trickledown l i e =\n let j = maxson l i in\n if cmp (get a j) e > 0 then begin\n set a i (get a j);\n trickledown l j e;\n end else begin\n set a i e;\n end;\n in\n let trickle l i e = try trickledown l i e with Bottom i -> set a i e in\n let rec bubbledown l i =\n let j = maxson l i in\n set a i (get a j);\n bubbledown l j\n in\n let bubble l i = try bubbledown l i with Bottom i -> i in\n let rec trickleup i e =\n let father = (i - 1) / 3 in\n assert (i <> father);\n if cmp (get a father) e < 0 then begin\n set a i (get a father);\n if father > 0 then trickleup father e else set a 0 e;\n end else begin\n set a i e;\n end;\n in\n let l = length a in\n for i = (l + 1) / 3 - 1 downto 0 do trickle l i (get a i); done;\n for i = l - 1 downto 2 do\n let e = (get a i) in\n set a i (get a 0);\n trickleup (bubble i 0) e;\n done;\n if l > 1 then (let e = (get a 1) in set a 1 (get a 0); set a 0 e)\n\n (* duplicated from array.ml, except for the call to [create] *)\n let cutoff = 5\n let stable_sort cmp a =\n let merge src1ofs src1len src2 src2ofs src2len dst dstofs =\n let src1r = src1ofs + src1len and src2r = src2ofs + src2len in\n let rec loop i1 s1 i2 s2 d =\n if cmp s1 s2 <= 0 then begin\n set dst d s1;\n let i1 = i1 + 1 in\n if i1 < src1r then\n loop i1 (get a i1) i2 s2 (d + 1)\n else\n blit src2 i2 dst (d + 1) (src2r - i2)\n end else begin\n set dst d s2;\n let i2 = i2 + 1 in\n if i2 < src2r then\n loop i1 s1 i2 (get src2 i2) (d + 1)\n else\n blit a i1 dst (d + 1) (src1r - i1)\n end\n in loop src1ofs (get a src1ofs) src2ofs (get src2 src2ofs) dstofs;\n in\n let isortto srcofs dst dstofs len =\n for i = 0 to len - 1 do\n let e = (get a (srcofs + i)) in\n let j = ref (dstofs + i - 1) in\n while (!j >= dstofs && cmp (get dst !j) e > 0) do\n set dst (!j + 1) (get dst !j);\n decr j;\n done;\n set dst (!j + 1) e;\n done;\n in\n let rec sortto srcofs dst dstofs len =\n if len <= cutoff then isortto srcofs dst dstofs len else begin\n let l1 = len / 2 in\n let l2 = len - l1 in\n sortto (srcofs + l1) dst (dstofs + l1) l2;\n sortto srcofs a (srcofs + l2) l1;\n merge (srcofs + l2) l1 dst (dstofs + l1) l2 dst dstofs;\n end;\n in\n let l = length a in\n if l <= cutoff then isortto 0 a 0 l else begin\n let l1 = l / 2 in\n let l2 = l - l1 in\n let t = create l2 in\n sortto l1 t 0 l2;\n sortto 0 a l2 l1;\n merge l2 l1 t 0 l2 a 0;\n end\n\n let fast_sort = stable_sort\n\n (* duplicated from array.ml *)\n let shuffle ~rand a = (* Fisher-Yates *)\n for i = length a - 1 downto 1 do\n let j = rand (i + 1) in\n let v = unsafe_get a i in\n unsafe_set a i (get a j);\n unsafe_set a j v\n done\n\n (* duplicated from array.ml *)\n let to_seq a =\n let rec aux i () =\n if i < length a\n then\n let x = unsafe_get a i in\n Seq.Cons (x, aux (i+1))\n else Seq.Nil\n in\n aux 0\n\n (* duplicated from array.ml *)\n let to_seqi a =\n let rec aux i () =\n if i < length a\n then\n let x = unsafe_get a i in\n Seq.Cons ((i,x), aux (i+1))\n else Seq.Nil\n in\n aux 0\n\n (* mostly duplicated from array.ml *)\n let of_rev_list l =\n let len = List.length l in\n let a = create len in\n let rec fill i = function\n [] -> a\n | hd::tl -> unsafe_set a i hd; fill (i-1) tl\n in\n fill (len-1) l\n\n (* duplicated from array.ml *)\n let of_seq i =\n let l = Seq.fold_left (fun acc x -> x::acc) [] i in\n of_rev_list l\n\n\n let map_to_array f a =\n let l = length a in\n if l = 0 then [| |] else begin\n let r = Array.make l (f (unsafe_get a 0)) in\n for i = 1 to l - 1 do\n Array.unsafe_set r i (f (unsafe_get a i))\n done;\n r\n end\n\n let map_from_array f a =\n let l = Array.length a in\n let r = create l in\n for i = 0 to l - 1 do\n unsafe_set r i (f (Array.unsafe_get a i))\n done;\n r\n\nend\n\nmodule ArrayLabels = Array\n"],"names":[],"mappings":"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","ignoreList":[0]}},{"offset":{"line":0,"column":160320},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/int32.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Module [Int32]: 32-bit integers *)\n\nexternal neg : int32 -> int32 = \"%int32_neg\"\nexternal add : int32 -> int32 -> int32 = \"%int32_add\"\nexternal sub : int32 -> int32 -> int32 = \"%int32_sub\"\nexternal mul : int32 -> int32 -> int32 = \"%int32_mul\"\nexternal div : int32 -> int32 -> int32 = \"%int32_div\"\nexternal rem : int32 -> int32 -> int32 = \"%int32_mod\"\nexternal logand : int32 -> int32 -> int32 = \"%int32_and\"\nexternal logor : int32 -> int32 -> int32 = \"%int32_or\"\nexternal logxor : int32 -> int32 -> int32 = \"%int32_xor\"\nexternal shift_left : int32 -> int -> int32 = \"%int32_lsl\"\nexternal shift_right : int32 -> int -> int32 = \"%int32_asr\"\nexternal shift_right_logical : int32 -> int -> int32 = \"%int32_lsr\"\nexternal of_int : int -> int32 = \"%int32_of_int\"\nexternal to_int : int32 -> int = \"%int32_to_int\"\nexternal of_float : float -> int32\n = \"caml_int32_of_float\" \"caml_int32_of_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal to_float : int32 -> float\n = \"caml_int32_to_float\" \"caml_int32_to_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal bits_of_float : float -> int32\n = \"caml_int32_bits_of_float\" \"caml_int32_bits_of_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal float_of_bits : int32 -> float\n = \"caml_int32_float_of_bits\" \"caml_int32_float_of_bits_unboxed\"\n [@@unboxed] [@@noalloc]\n\nlet zero = 0l\nlet one = 1l\nlet minus_one = -1l\nlet succ n = add n 1l\nlet pred n = sub n 1l\nlet abs n = if n >= 0l then n else neg n\nlet min_int = 0x80000000l\nlet max_int = 0x7FFFFFFFl\nlet lognot n = logxor n (-1l)\n\nlet unsigned_to_int =\n match Sys.word_size with\n | 32 ->\n let max_int = of_int Stdlib.max_int in\n fun n ->\n if n >= 0l && n <= max_int then\n Some (to_int n)\n else\n None\n | 64 ->\n (* So that it compiles in 32-bit *)\n let mask = 0xFFFF lsl 16 lor 0xFFFF in\n fun n -> Some (to_int n land mask)\n | _ ->\n assert false\n\nexternal format : string -> int32 -> string = \"caml_int32_format\"\nlet to_string n = format \"%d\" n\n\nexternal of_string : string -> int32 = \"caml_int32_of_string\"\n\nlet of_string_opt s =\n try Some (of_string s)\n with Failure _ -> None\n\ntype t = int32\n\nlet compare (x: t) (y: t) = Stdlib.compare x y\nlet equal (x: t) (y: t) = x = y\n\nlet unsigned_compare n m =\n compare (sub n min_int) (sub m min_int)\n\nlet unsigned_lt n m =\n sub n min_int < sub m min_int\n\nlet min x y : t = if x <= y then x else y\nlet max x y : t = if x >= y then x else y\n\n(* Unsigned division from signed division of the same bitness.\n See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3.\n*)\nlet unsigned_div n d =\n if d < zero then\n if unsigned_lt n d then zero else one\n else\n let q = shift_left (div (shift_right_logical n 1) d) 1 in\n let r = sub n (mul q d) in\n if unsigned_lt r d then q else succ q\n\nlet unsigned_rem n d =\n sub n (mul (unsigned_div n d) d)\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n","(* generated code *)"],"names":[],"mappings":"EAoDe,kBAAc,C,EAHd,OAAO,GAAM,GAAO,mBAAK,C,EAD3B,kBAAQ,C,EADR,kBAAQ,C,EAmBN,oBAAyB,C,MAP7B,eAAO,EAAI,WAAY,EACxB,uBAEA,IAAI,C,EAgDD,iBAA4B,C,EADhB,eAA+B,C,IAJ3C,WAAL,qBAAN,kBAAgC,C,SAR7B,OAAQ,EACe,GAAU,GAVpB,iBAAhB,kBAUoB,KAAgB,EAEf,c,EAZL,aAaN,YADA,EAAgB,SAAL,E,EAAA,qBAAX,QACM,eAAN,CAbV,QAcoB,IAAM,GAvDf,eAAQ,MAuDoB,C,EAXR,EAAO,EAAnB,MAAM,IAAc,C,EADR,EAAO,EAAnB,MAAM,IAAc,C,EAL/B,iBAAgB,iBAJE,EAAkB,EAIL,C,EAHf,MAAK,G,EADH,sBAAkB,G,KAL5C,OAAsB,IAAb,IAAa,O,AAAA,I,AAAA,G,EAAA,KC5ExB,0DD6EoB,UAAI,C,EANN,OAAa,C,MAHzB,qCCpEN,kBD0DM,GADc,EAAd,OAAc,QACd,gBAQA,IAEA,wD,ECpEN,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":161246},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/int64.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Module [Int64]: 64-bit integers *)\n\nexternal neg : int64 -> int64 = \"%int64_neg\"\nexternal add : int64 -> int64 -> int64 = \"%int64_add\"\nexternal sub : int64 -> int64 -> int64 = \"%int64_sub\"\nexternal mul : int64 -> int64 -> int64 = \"%int64_mul\"\nexternal div : int64 -> int64 -> int64 = \"%int64_div\"\nexternal rem : int64 -> int64 -> int64 = \"%int64_mod\"\nexternal logand : int64 -> int64 -> int64 = \"%int64_and\"\nexternal logor : int64 -> int64 -> int64 = \"%int64_or\"\nexternal logxor : int64 -> int64 -> int64 = \"%int64_xor\"\nexternal shift_left : int64 -> int -> int64 = \"%int64_lsl\"\nexternal shift_right : int64 -> int -> int64 = \"%int64_asr\"\nexternal shift_right_logical : int64 -> int -> int64 = \"%int64_lsr\"\nexternal of_int : int -> int64 = \"%int64_of_int\"\nexternal to_int : int64 -> int = \"%int64_to_int\"\nexternal of_float : float -> int64\n = \"caml_int64_of_float\" \"caml_int64_of_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal to_float : int64 -> float\n = \"caml_int64_to_float\" \"caml_int64_to_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal of_int32 : int32 -> int64 = \"%int64_of_int32\"\nexternal to_int32 : int64 -> int32 = \"%int64_to_int32\"\nexternal of_nativeint : nativeint -> int64 = \"%int64_of_nativeint\"\nexternal to_nativeint : int64 -> nativeint = \"%int64_to_nativeint\"\n\nlet zero = 0L\nlet one = 1L\nlet minus_one = -1L\nlet succ n = add n 1L\nlet pred n = sub n 1L\nlet abs n = if n >= 0L then n else neg n\nlet min_int = 0x8000000000000000L\nlet max_int = 0x7FFFFFFFFFFFFFFFL\nlet lognot n = logxor n (-1L)\n\nlet unsigned_to_int =\n let max_int = of_int Stdlib.max_int in\n fun n ->\n if n >= 0L && n <= max_int then\n Some (to_int n)\n else\n None\n\nexternal format : string -> int64 -> string = \"caml_int64_format\"\nlet to_string n = format \"%d\" n\n\nexternal of_string : string -> int64 = \"caml_int64_of_string\"\n\nlet of_string_opt s =\n try Some (of_string s)\n with Failure _ -> None\n\nexternal bits_of_float : float -> int64\n = \"caml_int64_bits_of_float\" \"caml_int64_bits_of_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal float_of_bits : int64 -> float\n = \"caml_int64_float_of_bits\" \"caml_int64_float_of_bits_unboxed\"\n [@@unboxed] [@@noalloc]\n\ntype t = int64\n\nlet compare (x: t) (y: t) = Stdlib.compare x y\nlet equal (x: t) (y: t) = x = y\n\nlet unsigned_compare n m =\n compare (sub n min_int) (sub m min_int)\n\nlet unsigned_lt n m =\n sub n min_int < sub m min_int\n\nlet min x y : t = if x <= y then x else y\nlet max x y : t = if x >= y then x else y\n\n(* Unsigned division from signed division of the same bitness.\n See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3.\n*)\nlet unsigned_div n d =\n if d < zero then\n if unsigned_lt n d then zero else one\n else\n let q = shift_left (div (shift_right_logical n 1) d) 1 in\n let r = sub n (mul q d) in\n if unsigned_lt r d then q else succ q\n\nlet unsigned_rem n d =\n sub n (mul (unsigned_div n d) d)\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n","(* generated code *)"],"names":[],"mappings":"EA2Ga,iBAA4B,C,EADhB,eAA+B,C,IAJ3C,WAAL,qBAAN,kBAAgC,C,SAR7B,OAAQ,EACe,GAAU,GAVpB,sBAAhB,uBAUoB,KAAgB,EAEf,c,KAZL,kBAaN,YADA,EAAgB,SAAL,E,EAAA,0BAAX,QACM,eAAN,CAbV,aAcoB,IAAM,GAtDf,eAAQ,MAsDoB,C,EAXR,EAAO,EAAnB,MAAM,IAAc,C,EADR,EAAO,EAAnB,MAAM,IAAc,C,EAL/B,sBAAgB,sBAJE,EAAkB,EAIL,C,EAHf,MAAK,G,EADH,sBAAkB,G,KAZ5C,OAAsB,IAAb,IAAa,O,AAAA,I,AAAA,G,EAAA,KClExB,0DDmEoB,UAAI,C,EANN,OAAa,C,MANxB,eAAO,EAAI,WAAY,EACxB,wBAEA,IAAI,C,EARK,kBAAc,C,EAHd,OAAO,GAAM,GAAO,mBAAK,C,EAD3B,kBAAQ,C,EADR,kBAAQ,C,EASnB,wCADc,ECrDhB,ODqDgB,SACd,2C,ECtDF,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":162134},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/nativeint.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Module [Nativeint]: processor-native integers *)\n\nexternal neg: nativeint -> nativeint = \"%nativeint_neg\"\nexternal add: nativeint -> nativeint -> nativeint = \"%nativeint_add\"\nexternal sub: nativeint -> nativeint -> nativeint = \"%nativeint_sub\"\nexternal mul: nativeint -> nativeint -> nativeint = \"%nativeint_mul\"\nexternal div: nativeint -> nativeint -> nativeint = \"%nativeint_div\"\nexternal rem: nativeint -> nativeint -> nativeint = \"%nativeint_mod\"\nexternal logand: nativeint -> nativeint -> nativeint = \"%nativeint_and\"\nexternal logor: nativeint -> nativeint -> nativeint = \"%nativeint_or\"\nexternal logxor: nativeint -> nativeint -> nativeint = \"%nativeint_xor\"\nexternal shift_left: nativeint -> int -> nativeint = \"%nativeint_lsl\"\nexternal shift_right: nativeint -> int -> nativeint = \"%nativeint_asr\"\nexternal shift_right_logical: nativeint -> int -> nativeint = \"%nativeint_lsr\"\nexternal of_int: int -> nativeint = \"%nativeint_of_int\"\nexternal to_int: nativeint -> int = \"%nativeint_to_int\"\nexternal of_float : float -> nativeint\n = \"caml_nativeint_of_float\" \"caml_nativeint_of_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal to_float : nativeint -> float\n = \"caml_nativeint_to_float\" \"caml_nativeint_to_float_unboxed\"\n [@@unboxed] [@@noalloc]\nexternal of_int32: int32 -> nativeint = \"%nativeint_of_int32\"\nexternal to_int32: nativeint -> int32 = \"%nativeint_to_int32\"\n\nlet zero = 0n\nlet one = 1n\nlet minus_one = -1n\nlet succ n = add n 1n\nlet pred n = sub n 1n\nlet abs n = if n >= 0n then n else neg n\nlet size = Sys.word_size\nlet min_int = shift_left 1n (size - 1)\nlet max_int = sub min_int 1n\nlet lognot n = logxor n (-1n)\n\nlet unsigned_to_int =\n let max_int = of_int Stdlib.max_int in\n fun n ->\n if n >= 0n && n <= max_int then\n Some (to_int n)\n else\n None\n\nexternal format : string -> nativeint -> string = \"caml_nativeint_format\"\nlet to_string n = format \"%d\" n\n\nexternal of_string: string -> nativeint = \"caml_nativeint_of_string\"\n\nlet of_string_opt s =\n try Some (of_string s)\n with Failure _ -> None\n\ntype t = nativeint\n\nlet compare (x: t) (y: t) = Stdlib.compare x y\nlet equal (x: t) (y: t) = compare x y = 0\n\nlet unsigned_compare n m =\n compare (sub n min_int) (sub m min_int)\n\nlet unsigned_lt n m =\n sub n min_int < sub m min_int\n\nlet min x y : t = if x <= y then x else y\nlet max x y : t = if x >= y then x else y\n\n(* Unsigned division from signed division of the same bitness.\n See Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.), Sec 9-3.\n*)\nlet unsigned_div n d =\n if d < zero then\n if unsigned_lt n d then zero else one\n else\n let q = shift_left (div (shift_right_logical n 1) d) 1 in\n let r = sub n (mul q d) in\n if unsigned_lt r d then q else succ q\n\nlet unsigned_rem n d =\n sub n (mul (unsigned_div n d) d)\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\nlet hash x = seeded_hash_param 10 100 0 x\n","(* generated code *)"],"names":[],"mappings":"EAmGa,iBAA4B,C,EADhB,eAA+B,C,IAJ3C,kBAAL,qBAAN,kBAAgC,C,aAR7B,eAAQ,EACe,GAAU,GAVpB,sBAAhB,uBAUoB,KAAgB,EAEf,c,EAZL,kBAaN,YADA,EAAgB,SAAL,E,EAAA,qBAAX,QACM,eAAN,CAbV,aAcoB,IAAM,GAhDf,eAAQ,MAgDoB,C,EAXR,EAAO,EAAnB,MAAM,IAAc,C,EADR,EAAO,EAAnB,MAAM,IAAc,C,MAL/B,UAAgB,QAAhB,UAAgB,sBAJE,EAAkB,EAIL,C,EAJb,sBACS,GAAI,C,EADb,sBAAkB,G,KAL5C,OAAsB,IAAb,IAAa,O,AAAA,I,AAAA,G,EAAA,KCjExB,0DDkEoB,UAAI,C,EANN,OAAa,C,MANxB,eAAO,EAAI,WAAY,EACxB,uBAEA,IAAI,C,EARK,kBAAc,C,EAJd,OAAO,GAAM,GAAO,mBAAK,C,EAD3B,kBAAQ,C,EADR,kBAAQ,C,cAUnB,mBANY,IC/Cd,kBD+Cc,MAMZ,6BALY,cAKZ,QADc,EAJY,OAIZ,QACd,oD,ECrDF,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":163137},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/lexing.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* The run-time library for lexers generated by camllex *)\n\ntype position = {\n pos_fname : string;\n pos_lnum : int;\n pos_bol : int;\n pos_cnum : int;\n}\n\nlet dummy_pos = {\n pos_fname = \"\";\n pos_lnum = 0;\n pos_bol = 0;\n pos_cnum = -1;\n}\n\ntype lexbuf =\n { refill_buff : lexbuf -> unit;\n mutable lex_buffer : bytes;\n mutable lex_buffer_len : int;\n mutable lex_abs_pos : int;\n mutable lex_start_pos : int;\n mutable lex_curr_pos : int;\n mutable lex_last_pos : int;\n mutable lex_last_action : int;\n mutable lex_eof_reached : bool;\n mutable lex_mem : int array;\n mutable lex_start_p : position;\n mutable lex_curr_p : position;\n }\n\ntype lex_tables =\n { lex_base: string;\n lex_backtrk: string;\n lex_default: string;\n lex_trans: string;\n lex_check: string;\n lex_base_code : string;\n lex_backtrk_code : string;\n lex_default_code : string;\n lex_trans_code : string;\n lex_check_code : string;\n lex_code: string;}\n\nexternal c_engine : lex_tables -> int -> lexbuf -> int = \"caml_lex_engine\"\nexternal c_new_engine : lex_tables -> int -> lexbuf -> int\n = \"caml_new_lex_engine\"\n\nlet engine tbl state buf =\n let result = c_engine tbl state buf in\n if result >= 0 && buf.lex_curr_p != dummy_pos then begin\n buf.lex_start_p <- buf.lex_curr_p;\n buf.lex_curr_p <- {buf.lex_curr_p\n with pos_cnum = buf.lex_abs_pos + buf.lex_curr_pos};\n end;\n result\n\n\nlet new_engine tbl state buf =\n let result = c_new_engine tbl state buf in\n if result >= 0 && buf.lex_curr_p != dummy_pos then begin\n buf.lex_start_p <- buf.lex_curr_p;\n buf.lex_curr_p <- {buf.lex_curr_p\n with pos_cnum = buf.lex_abs_pos + buf.lex_curr_pos};\n end;\n result\n\nlet lex_refill read_fun aux_buffer lexbuf =\n let read =\n read_fun aux_buffer (Bytes.length aux_buffer) in\n let n =\n if read > 0\n then read\n else (lexbuf.lex_eof_reached <- true; 0) in\n (* Current state of the buffer:\n <-------|---------------------|----------->\n | junk | valid data | junk |\n ^ ^ ^ ^\n 0 start_pos buffer_end Bytes.length buffer\n *)\n if lexbuf.lex_buffer_len + n > Bytes.length lexbuf.lex_buffer then begin\n (* There is not enough space at the end of the buffer *)\n if lexbuf.lex_buffer_len - lexbuf.lex_start_pos + n\n <= Bytes.length lexbuf.lex_buffer\n then begin\n (* But there is enough space if we reclaim the junk at the beginning\n of the buffer *)\n Bytes.blit lexbuf.lex_buffer lexbuf.lex_start_pos\n lexbuf.lex_buffer 0\n (lexbuf.lex_buffer_len - lexbuf.lex_start_pos)\n end else begin\n (* We must grow the buffer. Doubling its size will provide enough\n space since n <= String.length aux_buffer <= String.length buffer.\n Watch out for string length overflow, though. *)\n let newlen =\n Int.min (2 * Bytes.length lexbuf.lex_buffer) Sys.max_string_length in\n if lexbuf.lex_buffer_len - lexbuf.lex_start_pos + n > newlen\n then failwith \"Lexing.lex_refill: cannot grow buffer\";\n let newbuf = Bytes.create newlen in\n (* Copy the valid data to the beginning of the new buffer *)\n Bytes.blit lexbuf.lex_buffer lexbuf.lex_start_pos\n newbuf 0\n (lexbuf.lex_buffer_len - lexbuf.lex_start_pos);\n lexbuf.lex_buffer <- newbuf\n end;\n (* Reallocation or not, we have shifted the data left by\n start_pos characters; update the positions *)\n let s = lexbuf.lex_start_pos in\n lexbuf.lex_abs_pos <- lexbuf.lex_abs_pos + s;\n lexbuf.lex_curr_pos <- lexbuf.lex_curr_pos - s;\n lexbuf.lex_start_pos <- 0;\n lexbuf.lex_last_pos <- lexbuf.lex_last_pos - s;\n lexbuf.lex_buffer_len <- lexbuf.lex_buffer_len - s ;\n let t = lexbuf.lex_mem in\n for i = 0 to Array.length t-1 do\n let v = t.(i) in\n if v >= 0 then\n t.(i) <- v-s\n done\n end;\n (* There is now enough space at the end of the buffer *)\n Bytes.blit aux_buffer 0 lexbuf.lex_buffer lexbuf.lex_buffer_len n;\n lexbuf.lex_buffer_len <- lexbuf.lex_buffer_len + n\n\nlet zero_pos = {\n pos_fname = \"\";\n pos_lnum = 1;\n pos_bol = 0;\n pos_cnum = 0;\n}\n\nlet from_function ?(with_positions = true) f =\n { refill_buff = lex_refill f (Bytes.create 512);\n lex_buffer = Bytes.create 1024;\n lex_buffer_len = 0;\n lex_abs_pos = 0;\n lex_start_pos = 0;\n lex_curr_pos = 0;\n lex_last_pos = 0;\n lex_last_action = 0;\n lex_mem = [||];\n lex_eof_reached = false;\n lex_start_p = if with_positions then zero_pos else dummy_pos;\n lex_curr_p = if with_positions then zero_pos else dummy_pos;\n }\n\nlet from_channel ?with_positions ic =\n from_function ?with_positions (fun buf n -> input ic buf 0 n)\n\nlet from_string ?(with_positions = true) s =\n { refill_buff = (fun lexbuf -> lexbuf.lex_eof_reached <- true);\n lex_buffer = Bytes.of_string s; (* have to make a copy for compatibility\n with unsafe-string mode *)\n lex_buffer_len = String.length s;\n lex_abs_pos = 0;\n lex_start_pos = 0;\n lex_curr_pos = 0;\n lex_last_pos = 0;\n lex_last_action = 0;\n lex_mem = [||];\n lex_eof_reached = true;\n lex_start_p = if with_positions then zero_pos else dummy_pos;\n lex_curr_p = if with_positions then zero_pos else dummy_pos;\n }\n\nlet set_position lexbuf position =\n lexbuf.lex_curr_p <- {position with pos_fname = lexbuf.lex_curr_p.pos_fname};\n lexbuf.lex_abs_pos <- position.pos_cnum\n\nlet set_filename lexbuf fname =\n lexbuf.lex_curr_p <- {lexbuf.lex_curr_p with pos_fname = fname}\n\nlet with_positions lexbuf = lexbuf.lex_curr_p != dummy_pos\n\nlet lexeme lexbuf =\n let len = lexbuf.lex_curr_pos - lexbuf.lex_start_pos in\n Bytes.sub_string lexbuf.lex_buffer lexbuf.lex_start_pos len\n\nlet sub_lexeme lexbuf i1 i2 =\n let len = i2-i1 in\n Bytes.sub_string lexbuf.lex_buffer i1 len\n\nlet sub_lexeme_opt lexbuf i1 i2 =\n if i1 >= 0 then begin\n let len = i2-i1 in\n Some (Bytes.sub_string lexbuf.lex_buffer i1 len)\n end else begin\n None\n end\n\nlet sub_lexeme_char lexbuf i = Bytes.get lexbuf.lex_buffer i\n\nlet sub_lexeme_char_opt lexbuf i =\n if i >= 0 then\n Some (Bytes.get lexbuf.lex_buffer i)\n else\n None\n\n\nlet lexeme_char lexbuf i =\n Bytes.get lexbuf.lex_buffer (lexbuf.lex_start_pos + i)\n\nlet lexeme_start lexbuf = lexbuf.lex_start_p.pos_cnum\nlet lexeme_end lexbuf = lexbuf.lex_curr_p.pos_cnum\n\nlet lexeme_start_p lexbuf = lexbuf.lex_start_p\nlet lexeme_end_p lexbuf = lexbuf.lex_curr_p\n\nlet new_line lexbuf =\n let lcp = lexbuf.lex_curr_p in\n if lcp != dummy_pos then\n lexbuf.lex_curr_p <-\n { lcp with\n pos_lnum = lcp.pos_lnum + 1;\n pos_bol = lcp.pos_cnum;\n }\n\n\n\n(* Discard data left in lexer buffer. *)\n\nlet flush_input lb =\n lb.lex_curr_pos <- 0;\n lb.lex_abs_pos <- 0;\n let lcp = lb.lex_curr_p in\n if lcp != dummy_pos then\n lb.lex_curr_p <- {zero_pos with pos_fname = lcp.pos_fname};\n lb.lex_buffer_len <- 0;\n","(* generated code *)"],"names":[],"mappings":"KA6OE,gBACA,WACA,SACA,OACE,kDACF,kBAAuB,C,OAlBvB,cACA,SACE,mEAIG,C,EATmB,UAAiB,C,EADf,UAAkB,C,EAFtB,kBAA0B,C,EADxB,kBAA2B,C,UAFnD,+DAAsD,Q,QAPtD,cACO,IAAL,UAAK,Q,EAA+B,IAA/B,SAA+B,SAEpC,SAAI,C,QANuB,sCAA6B,Q,KAP1D,eAEkD,IAAhD,UAAK,EAFS,YAET,EAAL,QAAK,aAA2C,KACzC,KAEN,C,KARH,iBADA,YACA,uBAAyC,C,KAJzC,mBADA,yBACA,uBAA2D,C,EAJjC,iBAA8B,C,KAFxD,yDAA+D,C,KAJ/D,6DACA,kBAAuC,C,EAjBR,kBAA8B,C,WAA7D,MADc,UAAmB,gBACjC,qDACgC,OAAjB,EADf,QACe,aAAiB,sCAY/B,C,EAhB2C,uCAAgB,C,EAA5D,oBAA6D,C,mBA/E7D,OACE,IADF,WACE,WACF,YAGO,cAAiC,OALxC,EAYA,6CAAmE,mDAI5D,2EAMI,kBAKL,EALK,gBAKL,eACF,8CACK,yBACQ,MAEb,wEAE0D,UAM5D,mBADA,SACA,aACA,0BACA,WACA,0BACA,0BAEA,KADA,SACA,E,CAAA,sCACU,uCACR,YACE,iDAAY,0BAIlB,qDAAiE,oC,SAWjE,MADgB,UAAmB,gBACnC,0CACe,SADgC,IAA/B,KAAa,OAAb,GAA+B,wCAY9C,C,QArFY,UACb,qCAAmD,mBAEjD,0EAGF,EAAM,C,QAhBO,UACb,qCAAmD,mBAEjD,0EAGF,EAAM,C,ECtER,+E,QAAA,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":165875},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/parsing.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* The parsing engine *)\n\nopen Lexing\n\n(* Internal interface to the parsing engine *)\n\ntype parser_env =\n { mutable s_stack : int array; (* States *)\n mutable v_stack : Obj.t array; (* Semantic attributes *)\n mutable symb_start_stack : position array; (* Start positions *)\n mutable symb_end_stack : position array; (* End positions *)\n mutable stacksize : int; (* Size of the stacks *)\n mutable stackbase : int; (* Base sp for current parse *)\n mutable curr_char : int; (* Last token read *)\n mutable lval : Obj.t; (* Its semantic attribute *)\n mutable symb_start : position; (* Start pos. of the current symbol*)\n mutable symb_end : position; (* End pos. of the current symbol *)\n mutable asp : int; (* The stack pointer for attributes *)\n mutable rule_len : int; (* Number of rhs items in the rule *)\n mutable rule_number : int; (* Rule number to reduce by *)\n mutable sp : int; (* Saved sp for parse_engine *)\n mutable state : int; (* Saved state for parse_engine *)\n mutable errflag : int } (* Saved error flag for parse_engine *)\n[@@warning \"-unused-field\"]\n\ntype parse_tables =\n { actions : (parser_env -> Obj.t) array;\n transl_const : int array;\n transl_block : int array;\n lhs : string;\n len : string;\n defred : string;\n dgoto : string;\n sindex : string;\n rindex : string;\n gindex : string;\n tablesize : int;\n table : string;\n check : string;\n error_function : string -> unit;\n names_const : string;\n names_block : string }\n\nexception YYexit of Obj.t\nexception Parse_error\n\ntype parser_input =\n Start\n | Token_read\n | Stacks_grown_1\n | Stacks_grown_2\n | Semantic_action_computed\n | Error_detected\n\ntype parser_output =\n Read_token\n | Raise_parse_error\n | Grow_stacks_1\n | Grow_stacks_2\n | Compute_semantic_action\n | Call_error_function\n\n(* to avoid warnings *)\nlet _ = [Read_token; Raise_parse_error; Grow_stacks_1; Grow_stacks_2;\n Compute_semantic_action; Call_error_function]\n\nexternal parse_engine :\n parse_tables -> parser_env -> parser_input -> Obj.t -> parser_output\n = \"caml_parse_engine\"\n\nexternal set_trace: bool -> bool\n = \"caml_set_parser_trace\"\n\nlet env =\n { s_stack = Array.make 100 0;\n v_stack = Array.make 100 (Obj.repr ());\n symb_start_stack = Array.make 100 dummy_pos;\n symb_end_stack = Array.make 100 dummy_pos;\n stacksize = 100;\n stackbase = 0;\n curr_char = 0;\n lval = Obj.repr ();\n symb_start = dummy_pos;\n symb_end = dummy_pos;\n asp = 0;\n rule_len = 0;\n rule_number = 0;\n sp = 0;\n state = 0;\n errflag = 0 }\n\nlet grow_stacks() =\n let oldsize = env.stacksize in\n let newsize = oldsize * 2 in\n let new_s = Array.make newsize 0\n and new_v = Array.make newsize (Obj.repr ())\n and new_start = Array.make newsize dummy_pos\n and new_end = Array.make newsize dummy_pos in\n Array.blit env.s_stack 0 new_s 0 oldsize;\n env.s_stack <- new_s;\n Array.blit env.v_stack 0 new_v 0 oldsize;\n env.v_stack <- new_v;\n Array.blit env.symb_start_stack 0 new_start 0 oldsize;\n env.symb_start_stack <- new_start;\n Array.blit env.symb_end_stack 0 new_end 0 oldsize;\n env.symb_end_stack <- new_end;\n env.stacksize <- newsize\n\nlet clear_parser() =\n Array.fill env.v_stack 0 env.stacksize (Obj.repr ());\n env.lval <- Obj.repr ()\n\nlet current_lookahead_fun = ref (fun (_ : Obj.t) -> false)\n\nlet yyparse tables start lexer lexbuf =\n let rec loop cmd arg =\n match parse_engine tables env cmd arg with\n Read_token ->\n let t = Obj.repr(lexer lexbuf) in\n env.symb_start <- lexbuf.lex_start_p;\n env.symb_end <- lexbuf.lex_curr_p;\n loop Token_read t\n | Raise_parse_error ->\n raise Parse_error\n | Compute_semantic_action ->\n let (action, value) =\n try\n (Semantic_action_computed, tables.actions.(env.rule_number) env)\n with Parse_error ->\n (Error_detected, Obj.repr ()) in\n loop action value\n | Grow_stacks_1 ->\n grow_stacks(); loop Stacks_grown_1 (Obj.repr ())\n | Grow_stacks_2 ->\n grow_stacks(); loop Stacks_grown_2 (Obj.repr ())\n | Call_error_function ->\n tables.error_function \"syntax error\";\n loop Error_detected (Obj.repr ()) in\n let init_asp = env.asp\n and init_sp = env.sp\n and init_stackbase = env.stackbase\n and init_state = env.state\n and init_curr_char = env.curr_char\n and init_lval = env.lval\n and init_errflag = env.errflag in\n env.stackbase <- env.sp + 1;\n env.curr_char <- start;\n env.symb_end <- lexbuf.lex_curr_p;\n try\n loop Start (Obj.repr ())\n with exn ->\n let curr_char = env.curr_char in\n env.asp <- init_asp;\n env.sp <- init_sp;\n env.stackbase <- init_stackbase;\n env.state <- init_state;\n env.curr_char <- init_curr_char;\n env.lval <- init_lval;\n env.errflag <- init_errflag;\n match exn with\n YYexit v ->\n Obj.magic v\n | _ ->\n current_lookahead_fun :=\n (fun tok ->\n if Obj.is_block tok\n then tables.transl_block.(Obj.tag tok) = curr_char\n else tables.transl_const.(Obj.magic tok) = curr_char);\n raise exn\n\nlet peek_val env n =\n Obj.magic env.v_stack.(env.asp - n)\n\nlet symbol_start_pos () =\n let rec loop i =\n if i <= 0 then env.symb_end_stack.(env.asp)\n else begin\n let st = env.symb_start_stack.(env.asp - i + 1) in\n let en = env.symb_end_stack.(env.asp - i + 1) in\n if st <> en then st else loop (i - 1)\n end\n in\n loop env.rule_len\n\nlet symbol_end_pos () = env.symb_end_stack.(env.asp)\nlet rhs_start_pos n = env.symb_start_stack.(env.asp - (env.rule_len - n))\nlet rhs_end_pos n = env.symb_end_stack.(env.asp - (env.rule_len - n))\n\nlet symbol_start () = (symbol_start_pos ()).pos_cnum\nlet symbol_end () = (symbol_end_pos ()).pos_cnum\nlet rhs_start n = (rhs_start_pos n).pos_cnum\nlet rhs_end n = (rhs_end_pos n).pos_cnum\n\nlet is_current_lookahead tok =\n (!current_lookahead_fun)(Obj.repr tok)\n\nlet parse_error (_ : string) = ()\n"],"names":[],"mappings":"UCmN+B,IAAE,C,EAF/B,6BAAsC,C,EAHxB,cAAe,QAAS,C,EADtB,cAAiB,QAAS,C,EADxB,gBAAmB,QAAS,C,EAD1B,gBAAqB,QAAS,C,UAFhC,gGAAiD,M,UAD/C,gGAAmD,M,WADjD,+DAA4B,M,cAFlD,oB,EAPE,cACK,WACM,UADN,0BACM,SACT,WAAS,UAAT,0BAAS,SADA,kBACA,gBACN,EAAQ,EAAM,IAAQ,iB,EAJZ,sDAA4B,E,GAAA,GAO5B,C,UAXjB,2BAAU,KAAV,SAAU,E,CAAA,gCAAV,EAAU,kB,CAAA,gCAAyB,M,YANzB,SAAG,EAAH,QAAG,aAAgB,OAEd,oCAAmC,QAAnC,YAAmC,wCADd,MAAW,cAAhC,sBAAiC,QAAjC,YAAiC,wC,EAAA,GACc,C,qBA7B9D,wGAOA,kCACA,cACA,sBACA,OACE,QAjCqC,YAA/B,kBAA+B,cAoBjC,2BAAoC,8BATL,UASK,YATL,QASK,EATL,kCAAoC,Y,AAAA,I,AAAA,G,EAAA,KD9I3E,U,CCgJY,E,CAAA,aAKJ,UAAa,aAFb,UAAa,aATb,UALgB,mBAChB,wBACA,mBACA,O,GAAA,I,AAAA,G,EAAA,KA8BJ,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,+BAII,sBAKA,KAAS,C,KA3Df,yDAAoD,mBAC7B,C,WAlBvB,WACA,YACY,UACA,YACI,IAD4B,QAC5B,IACF,IAD8B,QAC9B,IACZ,6CAAwC,aAExC,6CAAwC,aAExC,6CAAqD,aAErD,6CAAiD,aAEjD,eAAwB,C,wEA7BP,KD5FrB,QC4FqB,IADE,KACsB,QADtB,IADT,aADgB,cAAhB,WAAgB,oM","ignoreList":[0]}},{"offset":{"line":0,"column":168687},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/set.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Sets over ordered types *)\n\nmodule type OrderedType =\n sig\n type t\n val compare: t -> t -> int\n end\n\nmodule type S =\n sig\n type elt\n type t\n val empty: t\n val add: elt -> t -> t\n val singleton: elt -> t\n val remove: elt -> t -> t\n val union: t -> t -> t\n val inter: t -> t -> t\n val disjoint: t -> t -> bool\n val diff: t -> t -> t\n val cardinal: t -> int\n val elements: t -> elt list\n val min_elt: t -> elt\n val min_elt_opt: t -> elt option\n val max_elt: t -> elt\n val max_elt_opt: t -> elt option\n val choose: t -> elt\n val choose_opt: t -> elt option\n val find: elt -> t -> elt\n val find_opt: elt -> t -> elt option\n val find_first: (elt -> bool) -> t -> elt\n val find_first_opt: (elt -> bool) -> t -> elt option\n val find_last: (elt -> bool) -> t -> elt\n val find_last_opt: (elt -> bool) -> t -> elt option\n val iter: (elt -> unit) -> t -> unit\n val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a\n val map: (elt -> elt) -> t -> t\n val filter: (elt -> bool) -> t -> t\n val filter_map: (elt -> elt option) -> t -> t\n val partition: (elt -> bool) -> t -> t * t\n val split: elt -> t -> t * bool * t\n val is_empty: t -> bool\n val mem: elt -> t -> bool\n val equal: t -> t -> bool\n val compare: t -> t -> int\n val subset: t -> t -> bool\n val for_all: (elt -> bool) -> t -> bool\n val exists: (elt -> bool) -> t -> bool\n val to_list : t -> elt list\n val of_list: elt list -> t\n val to_seq_from : elt -> t -> elt Seq.t\n val to_seq : t -> elt Seq.t\n val to_rev_seq : t -> elt Seq.t\n val add_seq : elt Seq.t -> t -> t\n val of_seq : elt Seq.t -> t\n end\n\nmodule Make(Ord: OrderedType) =\n struct\n type elt = Ord.t\n type t = Empty | Node of {l:t; v:elt; r:t; h:int}\n\n (* Sets are represented by balanced binary trees (the heights of the\n children differ by at most 2 *)\n\n let height = function\n Empty -> 0\n | Node {h} -> h\n\n (* Creates a new node with left son l, value v and right son r.\n We must have all elements of l < v < all elements of r.\n l and r must be balanced and | height l - height r | <= 2.\n Inline expansion of height for better speed. *)\n\n let create l v r =\n let hl = match l with Empty -> 0 | Node {h} -> h in\n let hr = match r with Empty -> 0 | Node {h} -> h in\n Node{l; v; r; h=(if hl >= hr then hl + 1 else hr + 1)}\n\n (* Same as create, but performs one step of rebalancing if necessary.\n Assumes l and r balanced and | height l - height r | <= 3.\n Inline expansion of create for better speed in the most frequent case\n where no rebalancing is required. *)\n\n let bal l v r =\n let hl = match l with Empty -> 0 | Node {h} -> h in\n let hr = match r with Empty -> 0 | Node {h} -> h in\n if hl > hr + 2 then begin\n match l with\n Empty -> invalid_arg \"Set.bal\"\n | Node{l=ll; v=lv; r=lr} ->\n if height ll >= height lr then\n create ll lv (create lr v r)\n else begin\n match lr with\n Empty -> invalid_arg \"Set.bal\"\n | Node{l=lrl; v=lrv; r=lrr}->\n create (create ll lv lrl) lrv (create lrr v r)\n end\n end else if hr > hl + 2 then begin\n match r with\n Empty -> invalid_arg \"Set.bal\"\n | Node{l=rl; v=rv; r=rr} ->\n if height rr >= height rl then\n create (create l v rl) rv rr\n else begin\n match rl with\n Empty -> invalid_arg \"Set.bal\"\n | Node{l=rll; v=rlv; r=rlr} ->\n create (create l v rll) rlv (create rlr rv rr)\n end\n end else\n Node{l; v; r; h=(if hl >= hr then hl + 1 else hr + 1)}\n\n (* Insertion of one element *)\n\n let rec add x = function\n Empty -> Node{l=Empty; v=x; r=Empty; h=1}\n | Node{l; v; r} as t ->\n let c = Ord.compare x v in\n if c = 0 then t else\n if c < 0 then\n let ll = add x l in\n if l == ll then t else bal ll v r\n else\n let rr = add x r in\n if r == rr then t else bal l v rr\n\n let singleton x = Node{l=Empty; v=x; r=Empty; h=1}\n\n (* Beware: those two functions assume that the added v is *strictly*\n smaller (or bigger) than all the present elements in the tree; it\n does not test for equality with the current min (or max) element.\n Indeed, they are only used during the \"join\" operation which\n respects this precondition.\n *)\n\n let rec add_min_element x = function\n | Empty -> singleton x\n | Node {l; v; r} ->\n bal (add_min_element x l) v r\n\n let rec add_max_element x = function\n | Empty -> singleton x\n | Node {l; v; r} ->\n bal l v (add_max_element x r)\n\n (* Same as create and bal, but no assumptions are made on the\n relative heights of l and r. *)\n\n let rec join l v r =\n match (l, r) with\n (Empty, _) -> add_min_element v r\n | (_, Empty) -> add_max_element v l\n | (Node{l=ll; v=lv; r=lr; h=lh}, Node{l=rl; v=rv; r=rr; h=rh}) ->\n if lh > rh + 2 then bal ll lv (join lr v r) else\n if rh > lh + 2 then bal (join l v rl) rv rr else\n create l v r\n\n (* Smallest and greatest element of a set *)\n\n let rec min_elt = function\n Empty -> raise Not_found\n | Node{l=Empty; v} -> v\n | Node{l} -> min_elt l\n\n let rec min_elt_opt = function\n Empty -> None\n | Node{l=Empty; v} -> Some v\n | Node{l} -> min_elt_opt l\n\n let rec max_elt = function\n Empty -> raise Not_found\n | Node{v; r=Empty} -> v\n | Node{r} -> max_elt r\n\n let rec max_elt_opt = function\n Empty -> None\n | Node{v; r=Empty} -> Some v\n | Node{r} -> max_elt_opt r\n\n (* Remove the smallest element of the given set *)\n\n let rec remove_min_elt = function\n Empty -> invalid_arg \"Set.remove_min_elt\"\n | Node{l=Empty; r} -> r\n | Node{l; v; r} -> bal (remove_min_elt l) v r\n\n (* Merge two trees l and r into one.\n All elements of l must precede the elements of r.\n Assume | height l - height r | <= 2. *)\n\n let merge t1 t2 =\n match (t1, t2) with\n (Empty, t) -> t\n | (t, Empty) -> t\n | (_, _) -> bal t1 (min_elt t2) (remove_min_elt t2)\n\n (* Merge two trees l and r into one.\n All elements of l must precede the elements of r.\n No assumption on the heights of l and r. *)\n\n let concat t1 t2 =\n match (t1, t2) with\n (Empty, t) -> t\n | (t, Empty) -> t\n | (_, _) -> join t1 (min_elt t2) (remove_min_elt t2)\n\n (* Splitting. split x s returns a triple (l, present, r) where\n - l is the set of elements of s that are < x\n - r is the set of elements of s that are > x\n - present is false if s contains no element equal to x,\n or true if s contains an element equal to x. *)\n\n let rec split x = function\n Empty ->\n (Empty, false, Empty)\n | Node{l; v; r} ->\n let c = Ord.compare x v in\n if c = 0 then (l, true, r)\n else if c < 0 then\n let (ll, pres, rl) = split x l in (ll, pres, join rl v r)\n else\n let (lr, pres, rr) = split x r in (join l v lr, pres, rr)\n\n (* Implementation of the set operations *)\n\n let empty = Empty\n\n let is_empty = function Empty -> true | _ -> false\n\n let rec mem x = function\n Empty -> false\n | Node{l; v; r} ->\n let c = Ord.compare x v in\n c = 0 || mem x (if c < 0 then l else r)\n\n let rec remove x = function\n Empty -> Empty\n | (Node{l; v; r} as t) ->\n let c = Ord.compare x v in\n if c = 0 then merge l r\n else\n if c < 0 then\n let ll = remove x l in\n if l == ll then t\n else bal ll v r\n else\n let rr = remove x r in\n if r == rr then t\n else bal l v rr\n\n let rec union s1 s2 =\n match (s1, s2) with\n (Empty, t2) -> t2\n | (t1, Empty) -> t1\n | (Node{l=l1; v=v1; r=r1; h=h1}, Node{l=l2; v=v2; r=r2; h=h2}) ->\n if h1 >= h2 then\n if h2 = 1 then add v2 s1 else begin\n let (l2, _, r2) = split v1 s2 in\n join (union l1 l2) v1 (union r1 r2)\n end\n else\n if h1 = 1 then add v1 s2 else begin\n let (l1, _, r1) = split v2 s1 in\n join (union l1 l2) v2 (union r1 r2)\n end\n\n let rec inter s1 s2 =\n match (s1, s2) with\n (Empty, _) -> Empty\n | (_, Empty) -> Empty\n | (Node{l=l1; v=v1; r=r1}, t2) ->\n match split v1 t2 with\n (l2, false, r2) ->\n concat (inter l1 l2) (inter r1 r2)\n | (l2, true, r2) ->\n join (inter l1 l2) v1 (inter r1 r2)\n\n (* Same as split, but compute the left and right subtrees\n only if the pivot element is not in the set. The right subtree\n is computed on demand. *)\n\n type split_bis =\n | Found\n | NotFound of t * (unit -> t)\n\n let rec split_bis x = function\n Empty ->\n NotFound (Empty, (fun () -> Empty))\n | Node{l; v; r; _} ->\n let c = Ord.compare x v in\n if c = 0 then Found\n else if c < 0 then\n match split_bis x l with\n | Found -> Found\n | NotFound (ll, rl) -> NotFound (ll, (fun () -> join (rl ()) v r))\n else\n match split_bis x r with\n | Found -> Found\n | NotFound (lr, rr) -> NotFound (join l v lr, rr)\n\n let rec disjoint s1 s2 =\n match (s1, s2) with\n (Empty, _) | (_, Empty) -> true\n | (Node{l=l1; v=v1; r=r1}, t2) ->\n if s1 == s2 then false\n else match split_bis v1 t2 with\n NotFound(l2, r2) -> disjoint l1 l2 && disjoint r1 (r2 ())\n | Found -> false\n\n let rec diff s1 s2 =\n match (s1, s2) with\n (Empty, _) -> Empty\n | (t1, Empty) -> t1\n | (Node{l=l1; v=v1; r=r1}, t2) ->\n match split v1 t2 with\n (l2, false, r2) ->\n join (diff l1 l2) v1 (diff r1 r2)\n | (l2, true, r2) ->\n concat (diff l1 l2) (diff r1 r2)\n\n type enumeration = End | More of elt * t * enumeration\n\n let rec cons_enum s e =\n match s with\n Empty -> e\n | Node{l; v; r} -> cons_enum l (More(v, r, e))\n\n let rec compare_aux e1 e2 =\n match (e1, e2) with\n (End, End) -> 0\n | (End, _) -> -1\n | (_, End) -> 1\n | (More(v1, r1, e1), More(v2, r2, e2)) ->\n let c = Ord.compare v1 v2 in\n if c <> 0\n then c\n else compare_aux (cons_enum r1 e1) (cons_enum r2 e2)\n\n let compare s1 s2 =\n compare_aux (cons_enum s1 End) (cons_enum s2 End)\n\n let equal s1 s2 =\n compare s1 s2 = 0\n\n let rec subset s1 s2 =\n match (s1, s2) with\n Empty, _ ->\n true\n | _, Empty ->\n false\n | Node {l=l1; v=v1; r=r1}, (Node {l=l2; v=v2; r=r2} as t2) ->\n let c = Ord.compare v1 v2 in\n if c = 0 then\n subset l1 l2 && subset r1 r2\n else if c < 0 then\n subset (Node {l=l1; v=v1; r=Empty; h=0}) l2 && subset r1 t2\n else\n subset (Node {l=Empty; v=v1; r=r1; h=0}) r2 && subset l1 t2\n\n let rec iter f = function\n Empty -> ()\n | Node{l; v; r} -> iter f l; f v; iter f r\n\n let rec fold f s accu =\n match s with\n Empty -> accu\n | Node{l; v; r} -> fold f r (f v (fold f l accu))\n\n let rec for_all p = function\n Empty -> true\n | Node{l; v; r} -> p v && for_all p l && for_all p r\n\n let rec exists p = function\n Empty -> false\n | Node{l; v; r} -> p v || exists p l || exists p r\n\n let rec filter p = function\n Empty -> Empty\n | (Node{l; v; r}) as t ->\n (* call [p] in the expected left-to-right order *)\n let l' = filter p l in\n let pv = p v in\n let r' = filter p r in\n if pv then\n if l==l' && r==r' then t else join l' v r'\n else concat l' r'\n\n let rec partition p = function\n Empty -> (Empty, Empty)\n | Node{l; v; r} ->\n (* call [p] in the expected left-to-right order *)\n let (lt, lf) = partition p l in\n let pv = p v in\n let (rt, rf) = partition p r in\n if pv\n then (join lt v rt, concat lf rf)\n else (concat lt rt, join lf v rf)\n\n let rec cardinal = function\n Empty -> 0\n | Node{l; r} -> cardinal l + 1 + cardinal r\n\n let rec elements_aux accu = function\n Empty -> accu\n | Node{l; v; r} -> elements_aux (v :: elements_aux accu r) l\n\n let elements s =\n elements_aux [] s\n\n let choose = min_elt\n\n let choose_opt = min_elt_opt\n\n let rec find x = function\n Empty -> raise Not_found\n | Node{l; v; r} ->\n let c = Ord.compare x v in\n if c = 0 then v\n else find x (if c < 0 then l else r)\n\n let rec find_first_aux v0 f = function\n Empty ->\n v0\n | Node{l; v; r} ->\n if f v then\n find_first_aux v f l\n else\n find_first_aux v0 f r\n\n let rec find_first f = function\n Empty ->\n raise Not_found\n | Node{l; v; r} ->\n if f v then\n find_first_aux v f l\n else\n find_first f r\n\n let rec find_first_opt_aux v0 f = function\n Empty ->\n Some v0\n | Node{l; v; r} ->\n if f v then\n find_first_opt_aux v f l\n else\n find_first_opt_aux v0 f r\n\n let rec find_first_opt f = function\n Empty ->\n None\n | Node{l; v; r} ->\n if f v then\n find_first_opt_aux v f l\n else\n find_first_opt f r\n\n let rec find_last_aux v0 f = function\n Empty ->\n v0\n | Node{l; v; r} ->\n if f v then\n find_last_aux v f r\n else\n find_last_aux v0 f l\n\n let rec find_last f = function\n Empty ->\n raise Not_found\n | Node{l; v; r} ->\n if f v then\n find_last_aux v f r\n else\n find_last f l\n\n let rec find_last_opt_aux v0 f = function\n Empty ->\n Some v0\n | Node{l; v; r} ->\n if f v then\n find_last_opt_aux v f r\n else\n find_last_opt_aux v0 f l\n\n let rec find_last_opt f = function\n Empty ->\n None\n | Node{l; v; r} ->\n if f v then\n find_last_opt_aux v f r\n else\n find_last_opt f l\n\n let rec find_opt x = function\n Empty -> None\n | Node{l; v; r} ->\n let c = Ord.compare x v in\n if c = 0 then Some v\n else find_opt x (if c < 0 then l else r)\n\n let try_join l v r =\n (* [join l v r] can only be called when (elements of l < v <\n elements of r); use [try_join l v r] when this property may\n not hold, but you hope it does hold in the common case *)\n if (l = Empty || Ord.compare (max_elt l) v < 0)\n && (r = Empty || Ord.compare v (min_elt r) < 0)\n then join l v r\n else union l (add v r)\n\n let rec map f = function\n | Empty -> Empty\n | Node{l; v; r} as t ->\n (* enforce left-to-right evaluation order *)\n let l' = map f l in\n let v' = f v in\n let r' = map f r in\n if l == l' && v == v' && r == r' then t\n else try_join l' v' r'\n\n let try_concat t1 t2 =\n match (t1, t2) with\n (Empty, t) -> t\n | (t, Empty) -> t\n | (_, _) -> try_join t1 (min_elt t2) (remove_min_elt t2)\n\n let rec filter_map f = function\n | Empty -> Empty\n | Node{l; v; r} as t ->\n (* enforce left-to-right evaluation order *)\n let l' = filter_map f l in\n let v' = f v in\n let r' = filter_map f r in\n begin match v' with\n | Some v' ->\n if l == l' && v == v' && r == r' then t\n else try_join l' v' r'\n | None ->\n try_concat l' r'\n end\n\n let of_sorted_list l =\n let rec sub n l =\n match n, l with\n | 0, l -> Empty, l\n | 1, x0 :: l -> Node {l=Empty; v=x0; r=Empty; h=1}, l\n | 2, x0 :: x1 :: l ->\n Node{l=Node{l=Empty; v=x0; r=Empty; h=1}; v=x1; r=Empty; h=2}, l\n | 3, x0 :: x1 :: x2 :: l ->\n Node{l=Node{l=Empty; v=x0; r=Empty; h=1}; v=x1;\n r=Node{l=Empty; v=x2; r=Empty; h=1}; h=2}, l\n | n, l ->\n let nl = n / 2 in\n let left, l = sub nl l in\n match l with\n | [] -> assert false\n | mid :: l ->\n let right, l = sub (n - nl - 1) l in\n create left mid right, l\n in\n fst (sub (List.length l) l)\n\n let to_list = elements\n\n let of_list l =\n match l with\n | [] -> empty\n | [x0] -> singleton x0\n | [x0; x1] -> add x1 (singleton x0)\n | [x0; x1; x2] -> add x2 (add x1 (singleton x0))\n | [x0; x1; x2; x3] -> add x3 (add x2 (add x1 (singleton x0)))\n | [x0; x1; x2; x3; x4] -> add x4 (add x3 (add x2 (add x1 (singleton x0))))\n | _ -> of_sorted_list (List.sort_uniq Ord.compare l)\n\n let add_seq i m =\n Seq.fold_left (fun s x -> add x s) m i\n\n let of_seq i = add_seq i empty\n\n let rec seq_of_enum_ c () = match c with\n | End -> Seq.Nil\n | More (x, t, rest) -> Seq.Cons (x, seq_of_enum_ (cons_enum t rest))\n\n let to_seq c = seq_of_enum_ (cons_enum c End)\n\n let rec snoc_enum s e =\n match s with\n Empty -> e\n | Node{l; v; r} -> snoc_enum r (More(v, l, e))\n\n let rec rev_seq_of_enum_ c () = match c with\n | End -> Seq.Nil\n | More (x, t, rest) -> Seq.Cons (x, rev_seq_of_enum_ (snoc_enum t rest))\n\n let to_rev_seq c = rev_seq_of_enum_ (snoc_enum c End)\n\n let to_seq_from low s =\n let rec aux low s c = match s with\n | Empty -> c\n | Node {l; r; v; _} ->\n begin match Ord.compare v low with\n | 0 -> More (v, r, c)\n | n when n<0 -> aux low r c\n | _ -> aux low l (More (v, r, c))\n end\n in\n seq_of_enum_ (aux low s End)\n end\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":177812},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/map.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nmodule type OrderedType =\n sig\n type t\n val compare: t -> t -> int\n end\n\nmodule type S =\n sig\n type key\n type !+'a t\n val empty: 'a t\n val add: key -> 'a -> 'a t -> 'a t\n val add_to_list: key -> 'a -> 'a list t -> 'a list t\n val update: key -> ('a option -> 'a option) -> 'a t -> 'a t\n val singleton: key -> 'a -> 'a t\n val remove: key -> 'a t -> 'a t\n val merge:\n (key -> 'a option -> 'b option -> 'c option) ->\n 'a t -> 'b t -> 'c t\n val union: (key -> 'a -> 'a -> 'a option) -> 'a t -> 'a t -> 'a t\n val cardinal: 'a t -> int\n val bindings: 'a t -> (key * 'a) list\n val min_binding: 'a t -> (key * 'a)\n val min_binding_opt: 'a t -> (key * 'a) option\n val max_binding: 'a t -> (key * 'a)\n val max_binding_opt: 'a t -> (key * 'a) option\n val choose: 'a t -> (key * 'a)\n val choose_opt: 'a t -> (key * 'a) option\n val find: key -> 'a t -> 'a\n val find_opt: key -> 'a t -> 'a option\n val find_first: (key -> bool) -> 'a t -> key * 'a\n val find_first_opt: (key -> bool) -> 'a t -> (key * 'a) option\n val find_last: (key -> bool) -> 'a t -> key * 'a\n val find_last_opt: (key -> bool) -> 'a t -> (key * 'a) option\n val iter: (key -> 'a -> unit) -> 'a t -> unit\n val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b\n val map: ('a -> 'b) -> 'a t -> 'b t\n val mapi: (key -> 'a -> 'b) -> 'a t -> 'b t\n val filter: (key -> 'a -> bool) -> 'a t -> 'a t\n val filter_map: (key -> 'a -> 'b option) -> 'a t -> 'b t\n val partition: (key -> 'a -> bool) -> 'a t -> 'a t * 'a t\n val split: key -> 'a t -> 'a t * 'a option * 'a t\n val is_empty: 'a t -> bool\n val mem: key -> 'a t -> bool\n val equal: ('a -> 'a -> bool) -> 'a t -> 'a t -> bool\n val compare: ('a -> 'a -> int) -> 'a t -> 'a t -> int\n val for_all: (key -> 'a -> bool) -> 'a t -> bool\n val exists: (key -> 'a -> bool) -> 'a t -> bool\n val to_list : 'a t -> (key * 'a) list\n val of_list : (key * 'a) list -> 'a t\n val to_seq : 'a t -> (key * 'a) Seq.t\n val to_rev_seq : 'a t -> (key * 'a) Seq.t\n val to_seq_from : key -> 'a t -> (key * 'a) Seq.t\n val add_seq : (key * 'a) Seq.t -> 'a t -> 'a t\n val of_seq : (key * 'a) Seq.t -> 'a t\n end\n\nmodule Make(Ord: OrderedType) = struct\n\n type key = Ord.t\n\n type 'a t =\n Empty\n | Node of {l:'a t; v:key; d:'a; r:'a t; h:int}\n\n let height = function\n Empty -> 0\n | Node {h} -> h\n\n let create l x d r =\n let hl = height l and hr = height r in\n Node{l; v=x; d; r; h=(if hl >= hr then hl + 1 else hr + 1)}\n\n let singleton x d = Node{l=Empty; v=x; d; r=Empty; h=1}\n\n let bal l x d r =\n let hl = match l with Empty -> 0 | Node {h} -> h in\n let hr = match r with Empty -> 0 | Node {h} -> h in\n if hl > hr + 2 then begin\n match l with\n Empty -> invalid_arg \"Map.bal\"\n | Node{l=ll; v=lv; d=ld; r=lr} ->\n if height ll >= height lr then\n create ll lv ld (create lr x d r)\n else begin\n match lr with\n Empty -> invalid_arg \"Map.bal\"\n | Node{l=lrl; v=lrv; d=lrd; r=lrr}->\n create (create ll lv ld lrl) lrv lrd (create lrr x d r)\n end\n end else if hr > hl + 2 then begin\n match r with\n Empty -> invalid_arg \"Map.bal\"\n | Node{l=rl; v=rv; d=rd; r=rr} ->\n if height rr >= height rl then\n create (create l x d rl) rv rd rr\n else begin\n match rl with\n Empty -> invalid_arg \"Map.bal\"\n | Node{l=rll; v=rlv; d=rld; r=rlr} ->\n create (create l x d rll) rlv rld (create rlr rv rd rr)\n end\n end else\n Node{l; v=x; d; r; h=(if hl >= hr then hl + 1 else hr + 1)}\n\n let empty = Empty\n\n let is_empty = function Empty -> true | _ -> false\n\n let rec add x data = function\n Empty ->\n Node{l=Empty; v=x; d=data; r=Empty; h=1}\n | Node {l; v; d; r; h} as m ->\n let c = Ord.compare x v in\n if c = 0 then\n if d == data then m else Node{l; v=x; d=data; r; h}\n else if c < 0 then\n let ll = add x data l in\n if l == ll then m else bal ll v d r\n else\n let rr = add x data r in\n if r == rr then m else bal l v d rr\n\n let rec find x = function\n Empty ->\n raise Not_found\n | Node {l; v; d; r} ->\n let c = Ord.compare x v in\n if c = 0 then d\n else find x (if c < 0 then l else r)\n\n let rec find_first_aux v0 d0 f = function\n Empty ->\n (v0, d0)\n | Node {l; v; d; r} ->\n if f v then\n find_first_aux v d f l\n else\n find_first_aux v0 d0 f r\n\n let rec find_first f = function\n Empty ->\n raise Not_found\n | Node {l; v; d; r} ->\n if f v then\n find_first_aux v d f l\n else\n find_first f r\n\n let rec find_first_opt_aux v0 d0 f = function\n Empty ->\n Some (v0, d0)\n | Node {l; v; d; r} ->\n if f v then\n find_first_opt_aux v d f l\n else\n find_first_opt_aux v0 d0 f r\n\n let rec find_first_opt f = function\n Empty ->\n None\n | Node {l; v; d; r} ->\n if f v then\n find_first_opt_aux v d f l\n else\n find_first_opt f r\n\n let rec find_last_aux v0 d0 f = function\n Empty ->\n (v0, d0)\n | Node {l; v; d; r} ->\n if f v then\n find_last_aux v d f r\n else\n find_last_aux v0 d0 f l\n\n let rec find_last f = function\n Empty ->\n raise Not_found\n | Node {l; v; d; r} ->\n if f v then\n find_last_aux v d f r\n else\n find_last f l\n\n let rec find_last_opt_aux v0 d0 f = function\n Empty ->\n Some (v0, d0)\n | Node {l; v; d; r} ->\n if f v then\n find_last_opt_aux v d f r\n else\n find_last_opt_aux v0 d0 f l\n\n let rec find_last_opt f = function\n Empty ->\n None\n | Node {l; v; d; r} ->\n if f v then\n find_last_opt_aux v d f r\n else\n find_last_opt f l\n\n let rec find_opt x = function\n Empty ->\n None\n | Node {l; v; d; r} ->\n let c = Ord.compare x v in\n if c = 0 then Some d\n else find_opt x (if c < 0 then l else r)\n\n let rec mem x = function\n Empty ->\n false\n | Node {l; v; r} ->\n let c = Ord.compare x v in\n c = 0 || mem x (if c < 0 then l else r)\n\n let rec min_binding = function\n Empty -> raise Not_found\n | Node {l=Empty; v; d} -> (v, d)\n | Node {l} -> min_binding l\n\n let rec min_binding_opt = function\n Empty -> None\n | Node {l=Empty; v; d} -> Some (v, d)\n | Node {l}-> min_binding_opt l\n\n let rec max_binding = function\n Empty -> raise Not_found\n | Node {v; d; r=Empty} -> (v, d)\n | Node {r} -> max_binding r\n\n let rec max_binding_opt = function\n Empty -> None\n | Node {v; d; r=Empty} -> Some (v, d)\n | Node {r} -> max_binding_opt r\n\n let rec remove_min_binding = function\n Empty -> invalid_arg \"Map.remove_min_elt\"\n | Node {l=Empty; r} -> r\n | Node {l; v; d; r} -> bal (remove_min_binding l) v d r\n\n let merge t1 t2 =\n match (t1, t2) with\n (Empty, t) -> t\n | (t, Empty) -> t\n | (_, _) ->\n let (x, d) = min_binding t2 in\n bal t1 x d (remove_min_binding t2)\n\n let rec remove x = function\n Empty ->\n Empty\n | (Node {l; v; d; r} as m) ->\n let c = Ord.compare x v in\n if c = 0 then merge l r\n else if c < 0 then\n let ll = remove x l in if l == ll then m else bal ll v d r\n else\n let rr = remove x r in if r == rr then m else bal l v d rr\n\n let rec update x f = function\n Empty ->\n begin match f None with\n | None -> Empty\n | Some data -> Node{l=Empty; v=x; d=data; r=Empty; h=1}\n end\n | Node {l; v; d; r; h} as m ->\n let c = Ord.compare x v in\n if c = 0 then begin\n match f (Some d) with\n | None -> merge l r\n | Some data ->\n if d == data then m else Node{l; v=x; d=data; r; h}\n end else if c < 0 then\n let ll = update x f l in\n if l == ll then m else bal ll v d r\n else\n let rr = update x f r in\n if r == rr then m else bal l v d rr\n\n let add_to_list x data m =\n let add = function None -> Some [data] | Some l -> Some (data :: l) in\n update x add m\n\n let rec iter f = function\n Empty -> ()\n | Node {l; v; d; r} ->\n iter f l; f v d; iter f r\n\n let rec map f = function\n Empty ->\n Empty\n | Node {l; v; d; r; h} ->\n let l' = map f l in\n let d' = f d in\n let r' = map f r in\n Node{l=l'; v; d=d'; r=r'; h}\n\n let rec mapi f = function\n Empty ->\n Empty\n | Node {l; v; d; r; h} ->\n let l' = mapi f l in\n let d' = f v d in\n let r' = mapi f r in\n Node{l=l'; v; d=d'; r=r'; h}\n\n let rec fold f m accu =\n match m with\n Empty -> accu\n | Node {l; v; d; r} ->\n fold f r (f v d (fold f l accu))\n\n let rec for_all p = function\n Empty -> true\n | Node {l; v; d; r} -> p v d && for_all p l && for_all p r\n\n let rec exists p = function\n Empty -> false\n | Node {l; v; d; r} -> p v d || exists p l || exists p r\n\n (* Beware: those two functions assume that the added k is *strictly*\n smaller (or bigger) than all the present keys in the tree; it\n does not test for equality with the current min (or max) key.\n\n Indeed, they are only used during the \"join\" operation which\n respects this precondition.\n *)\n\n let rec add_min_binding k x = function\n | Empty -> singleton k x\n | Node {l; v; d; r} ->\n bal (add_min_binding k x l) v d r\n\n let rec add_max_binding k x = function\n | Empty -> singleton k x\n | Node {l; v; d; r} ->\n bal l v d (add_max_binding k x r)\n\n (* Same as create and bal, but no assumptions are made on the\n relative heights of l and r. *)\n\n let rec join l v d r =\n match (l, r) with\n (Empty, _) -> add_min_binding v d r\n | (_, Empty) -> add_max_binding v d l\n | (Node{l=ll; v=lv; d=ld; r=lr; h=lh},\n Node{l=rl; v=rv; d=rd; r=rr; h=rh}) ->\n if lh > rh + 2 then bal ll lv ld (join lr v d r) else\n if rh > lh + 2 then bal (join l v d rl) rv rd rr else\n create l v d r\n\n (* Merge two trees l and r into one.\n All elements of l must precede the elements of r.\n No assumption on the heights of l and r. *)\n\n let concat t1 t2 =\n match (t1, t2) with\n (Empty, t) -> t\n | (t, Empty) -> t\n | (_, _) ->\n let (x, d) = min_binding t2 in\n join t1 x d (remove_min_binding t2)\n\n let concat_or_join t1 v d t2 =\n match d with\n | Some d -> join t1 v d t2\n | None -> concat t1 t2\n\n let rec split x = function\n Empty ->\n (Empty, None, Empty)\n | Node {l; v; d; r} ->\n let c = Ord.compare x v in\n if c = 0 then (l, Some d, r)\n else if c < 0 then\n let (ll, pres, rl) = split x l in (ll, pres, join rl v d r)\n else\n let (lr, pres, rr) = split x r in (join l v d lr, pres, rr)\n\n let rec merge f s1 s2 =\n match (s1, s2) with\n (Empty, Empty) -> Empty\n | (Node {l=l1; v=v1; d=d1; r=r1; h=h1}, _) when h1 >= height s2 ->\n let (l2, d2, r2) = split v1 s2 in\n concat_or_join (merge f l1 l2) v1 (f v1 (Some d1) d2) (merge f r1 r2)\n | (_, Node {l=l2; v=v2; d=d2; r=r2}) ->\n let (l1, d1, r1) = split v2 s1 in\n concat_or_join (merge f l1 l2) v2 (f v2 d1 (Some d2)) (merge f r1 r2)\n | _ ->\n assert false\n\n let rec union f s1 s2 =\n match (s1, s2) with\n | (Empty, s) | (s, Empty) -> s\n | (Node {l=l1; v=v1; d=d1; r=r1; h=h1},\n Node {l=l2; v=v2; d=d2; r=r2; h=h2}) ->\n if h1 >= h2 then\n let (l2, d2, r2) = split v1 s2 in\n let l = union f l1 l2 and r = union f r1 r2 in\n match d2 with\n | None -> join l v1 d1 r\n | Some d2 -> concat_or_join l v1 (f v1 d1 d2) r\n else\n let (l1, d1, r1) = split v2 s1 in\n let l = union f l1 l2 and r = union f r1 r2 in\n match d1 with\n | None -> join l v2 d2 r\n | Some d1 -> concat_or_join l v2 (f v2 d1 d2) r\n\n let rec filter p = function\n Empty -> Empty\n | Node {l; v; d; r} as m ->\n (* call [p] in the expected left-to-right order *)\n let l' = filter p l in\n let pvd = p v d in\n let r' = filter p r in\n if pvd then if l==l' && r==r' then m else join l' v d r'\n else concat l' r'\n\n let rec filter_map f = function\n Empty -> Empty\n | Node {l; v; d; r} ->\n (* call [f] in the expected left-to-right order *)\n let l' = filter_map f l in\n let fvd = f v d in\n let r' = filter_map f r in\n begin match fvd with\n | Some d' -> join l' v d' r'\n | None -> concat l' r'\n end\n\n let rec partition p = function\n Empty -> (Empty, Empty)\n | Node {l; v; d; r} ->\n (* call [p] in the expected left-to-right order *)\n let (lt, lf) = partition p l in\n let pvd = p v d in\n let (rt, rf) = partition p r in\n if pvd\n then (join lt v d rt, concat lf rf)\n else (concat lt rt, join lf v d rf)\n\n type 'a enumeration = End | More of key * 'a * 'a t * 'a enumeration\n\n let rec cons_enum m e =\n match m with\n Empty -> e\n | Node {l; v; d; r} -> cons_enum l (More(v, d, r, e))\n\n let compare cmp m1 m2 =\n let rec compare_aux e1 e2 =\n match (e1, e2) with\n (End, End) -> 0\n | (End, _) -> -1\n | (_, End) -> 1\n | (More(v1, d1, r1, e1), More(v2, d2, r2, e2)) ->\n let c = Ord.compare v1 v2 in\n if c <> 0 then c else\n let c = cmp d1 d2 in\n if c <> 0 then c else\n compare_aux (cons_enum r1 e1) (cons_enum r2 e2)\n in compare_aux (cons_enum m1 End) (cons_enum m2 End)\n\n let equal cmp m1 m2 =\n let rec equal_aux e1 e2 =\n match (e1, e2) with\n (End, End) -> true\n | (End, _) -> false\n | (_, End) -> false\n | (More(v1, d1, r1, e1), More(v2, d2, r2, e2)) ->\n Ord.compare v1 v2 = 0 && cmp d1 d2 &&\n equal_aux (cons_enum r1 e1) (cons_enum r2 e2)\n in equal_aux (cons_enum m1 End) (cons_enum m2 End)\n\n let rec cardinal = function\n Empty -> 0\n | Node {l; r} -> cardinal l + 1 + cardinal r\n\n let rec bindings_aux accu = function\n Empty -> accu\n | Node {l; v; d; r} -> bindings_aux ((v, d) :: bindings_aux accu r) l\n\n let bindings s =\n bindings_aux [] s\n\n let choose = min_binding\n\n let choose_opt = min_binding_opt\n\n let to_list = bindings\n let of_list bs = List.fold_left (fun m (k, v) -> add k v m) empty bs\n\n let add_seq i m =\n Seq.fold_left (fun m (k,v) -> add k v m) m i\n\n let of_seq i = add_seq i empty\n\n let rec seq_of_enum_ c () = match c with\n | End -> Seq.Nil\n | More (k,v,t,rest) -> Seq.Cons ((k,v), seq_of_enum_ (cons_enum t rest))\n\n let to_seq m =\n seq_of_enum_ (cons_enum m End)\n\n let rec snoc_enum s e =\n match s with\n Empty -> e\n | Node{l; v; d; r} -> snoc_enum r (More(v, d, l, e))\n\n let rec rev_seq_of_enum_ c () = match c with\n | End -> Seq.Nil\n | More (k,v,t,rest) ->\n Seq.Cons ((k,v), rev_seq_of_enum_ (snoc_enum t rest))\n\n let to_rev_seq c =\n rev_seq_of_enum_ (snoc_enum c End)\n\n let to_seq_from low m =\n let rec aux low m c = match m with\n | Empty -> c\n | Node {l; v; d; r; _} ->\n begin match Ord.compare v low with\n | 0 -> More (v, d, r, c)\n | n when n<0 -> aux low r c\n | _ -> aux low l (More (v, d, r, c))\n end\n in\n seq_of_enum_ (aux low m End)\nend\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":186372},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/stack.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype 'a t = { mutable c : 'a list; mutable len : int; }\n\nexception Empty\n\nlet create () = { c = []; len = 0; }\n\nlet clear s = s.c <- []; s.len <- 0\n\nlet copy s = { c = s.c; len = s.len; }\n\nlet push x s = s.c <- x :: s.c; s.len <- s.len + 1\n\nlet pop s =\n match s.c with\n | hd::tl -> s.c <- tl; s.len <- s.len - 1; hd\n | [] -> raise Empty\n\nlet pop_opt s =\n match s.c with\n | hd::tl -> s.c <- tl; s.len <- s.len - 1; Some hd\n | [] -> None\n\nlet drop s =\n match s.c with\n | _hd::tl -> s.c <- tl; s.len <- s.len - 1\n | [] -> raise Empty\n\nlet top s =\n match s.c with\n | hd::_ -> hd\n | [] -> raise Empty\n\nlet top_opt s =\n match s.c with\n | hd::_ -> Some hd\n | [] -> None\n\nlet is_empty s = (s.c = [])\n\nlet length s = s.len\n\nlet iter f s = List.iter f s.c\n\nlet fold f acc s = List.fold_left f acc s.c\n\n(** {1 Iterators} *)\n\nlet to_seq s = List.to_seq s.c\n\nlet add_seq q i = Seq.iter (fun x -> push x q) i\n\nlet of_seq g =\n let s = create() in\n add_seq s g;\n s\n","(* generated code *)"],"names":[],"mappings":"KAmBgB,I,EAAA,KAiDd,UAAW,EACV,C,EALkC,kBAAQ,C,EAA3B,+BAA8B,C,EAFjC,gCAAe,C,EAJX,mCAAwB,C,EAF5B,iCAAe,C,EAFf,UAAK,C,EAFH,iBAAU,C,EAJzB,oBAEW,KADA,IACA,UADA,KACI,C,EAPf,yBAEW,kBAAW,C,QAPtB,yBAEQ,OADK,SACL,UADK,GAAW,6BACL,C,KAPnB,oBAEY,mBADA,SACA,OADA,GAAW,wBAAoB,WAC3B,C,QAPhB,yBAEY,qBADA,SACA,OADA,GAAW,wBAAoB,GACpB,C,KALV,6BAAiB,4BAAkB,C,KAFrC,2BAAyB,C,KAFxB,gBAAW,eAAU,C,EAFnB,I,EAAA,GAAoB,C,KCnBpC,mG,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":187371},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/queue.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Francois Pottier, projet Cristal, INRIA Rocquencourt *)\n(* Jeremie Dimino, Jane Street Europe *)\n(* *)\n(* Copyright 2002 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nexception Empty\n\ntype 'a cell =\n | Nil\n | Cons of { content: 'a; mutable next: 'a cell }\n\ntype 'a t = {\n mutable length: int;\n mutable first: 'a cell;\n mutable last: 'a cell\n}\n\nlet create () = {\n length = 0;\n first = Nil;\n last = Nil\n}\n\nlet clear q =\n q.length <- 0;\n q.first <- Nil;\n q.last <- Nil\n\nlet add x q =\n let cell = Cons {\n content = x;\n next = Nil\n } in\n match q.last with\n | Nil ->\n q.length <- 1;\n q.first <- cell;\n q.last <- cell\n | Cons last ->\n q.length <- q.length + 1;\n last.next <- cell;\n q.last <- cell\n\nlet push =\n add\n\nlet peek q =\n match q.first with\n | Nil -> raise Empty\n | Cons { content } -> content\n\nlet peek_opt q =\n match q.first with\n | Nil -> None\n | Cons { content } -> Some content\n\nlet top =\n peek\n\nlet take q =\n match q.first with\n | Nil -> raise Empty\n | Cons { content; next = Nil } ->\n clear q;\n content\n | Cons { content; next } ->\n q.length <- q.length - 1;\n q.first <- next;\n content\n\nlet take_opt q =\n match q.first with\n | Nil -> None\n | Cons { content; next = Nil } ->\n clear q;\n Some content\n | Cons { content; next } ->\n q.length <- q.length - 1;\n q.first <- next;\n Some content\n\nlet pop =\n take\n\nlet copy =\n let rec copy q_res prev cell =\n match cell with\n | Nil -> q_res.last <- prev; q_res\n | Cons { content; next } ->\n let res = Cons { content; next = Nil } in\n begin match prev with\n | Nil -> q_res.first <- res\n | Cons p -> p.next <- res\n end;\n copy q_res res next\n in\n fun q -> copy { length = q.length; first = Nil; last = Nil } Nil q.first\n\nlet is_empty q =\n q.length = 0\n\nlet length q =\n q.length\n\nlet iter =\n let rec iter f cell =\n match cell with\n | Nil -> ()\n | Cons { content; next } ->\n f content;\n iter f next\n in\n fun f q -> iter f q.first\n\nlet fold =\n let rec fold f accu cell =\n match cell with\n | Nil -> accu\n | Cons { content; next } ->\n let accu = f accu content in\n fold f accu next\n in\n fun f accu q -> fold f accu q.first\n\nlet transfer q1 q2 =\n if q1.length > 0 then\n match q2.last with\n | Nil ->\n q2.length <- q1.length;\n q2.first <- q1.first;\n q2.last <- q1.last;\n clear q1\n | Cons last ->\n q2.length <- q2.length + q1.length;\n last.next <- q1.first;\n q2.last <- q1.last;\n clear q1\n\n(** {1 Iterators} *)\n\nlet to_seq q =\n let rec aux c () = match c with\n | Nil -> Seq.Nil\n | Cons { content=x; next; } -> Seq.Cons (x, aux next)\n in\n aux q.first\n\nlet add_seq q i = Seq.iter (fun x -> push x q) i\n\nlet of_seq g =\n let q = create() in\n add_seq q g;\n q\n","(* generated code *)"],"names":[],"mappings":"KA4BgB,I,EAAA,KAsId,UAAW,EACV,C,EALkC,kBAAQ,C,EAA3B,+BAA8B,C,EC9JhD,a,KDwJqB,UACR,KAC2C,IAD3C,YACmC,GADnC,OACmC,GAAQ,KAAC,C,EAEvD,gBAAW,C,QApBX,yBACE,qBAEE,cACA,cACA,cACA,UAEA,4CACA,iBACA,cACA,U,EAAA,KAAQ,C,KAdI,mBANd,UACS,iBAEI,EAFJ,OAEI,KACX,MAE+B,C,QAVxB,eANT,UACS,0BAEP,gBAAS,IAGY,C,EAVzB,UAAQ,C,EAHR,iBAAY,C,MAHH,gDAVP,UACS,SAAoB,iBAE3B,IAF2B,OAE3B,UACA,SACS,SAGT,OAFY,mB,GAIwD,C,SAzBxE,oBACS,kCAEP,UAAO,uBAGP,6BACA,SACA,YAAY,C,SAnBd,yBACS,oCAEP,UAAO,eAGP,6BACA,SACA,IAAO,C,EAhBT,oBACS,KACa,IADb,UACa,KAAY,C,EAPlC,yBACS,kBACoB,C,MApB7B,gBAIA,sBAEE,WACA,SACA,cAEA,2BACA,YACA,cAAc,C,KAjBhB,gBACA,WACA,eAAa,C,EATC,I,EAAA,GAIf,C,QChCD,4BDqIE,eCrIF,UDqIE,sD,QCrIF,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":188979},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/buffer.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Pierre Weis and Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1999 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Extensible buffers *)\n\n(* The [inner_buffer] type ensures that the [length] and [buffer] fields are\n always synchronized, [length = Bytes.length buffer], even in presence\n of data races.\n*)\ntype inner_buffer = {\n buffer: bytes;\n length: int;\n}\n\ntype t =\n {mutable inner : inner_buffer;\n mutable position : int;\n initial_buffer : bytes}\n(* Invariants: all parts of the code preserve the invariants that:\n - [inner.length = Bytes.length inner.buffer]\n In absence of data races, we also have\n - [0 <= b.position <= b.inner.length]\n\n Note in particular that [b.position = b.inner.length] is legal,\n it means that the buffer is full and will have to be extended\n before any further addition. *)\n\nlet create n =\n let n = if n < 1 then 1 else n in\n let n = if n > Sys.max_string_length then Sys.max_string_length else n in\n let s = Bytes.create n in\n { inner = { buffer = s; length = n}; position = 0; initial_buffer = s}\n\nlet contents b = Bytes.sub_string b.inner.buffer 0 b.position\nlet to_bytes b = Bytes.sub b.inner.buffer 0 b.position\n\nlet sub b ofs len =\n if ofs < 0 || len < 0 || ofs > b.position - len\n then invalid_arg \"Buffer.sub\"\n else Bytes.sub_string b.inner.buffer ofs len\n\n\nlet blit src srcoff dst dstoff len =\n if len < 0 || srcoff < 0 || srcoff > src.position - len\n || dstoff < 0 || dstoff > (Bytes.length dst) - len\n then invalid_arg \"Buffer.blit\"\n else\n Bytes.blit src.inner.buffer srcoff dst dstoff len\n\n\nlet nth b ofs =\n let position = b.position in\n let {buffer;length} = b.inner in\n if ofs < 0 || ofs >= position || position > length then\n invalid_arg \"Buffer.nth\"\n else Bytes.unsafe_get buffer ofs\n\n\nlet length b = b.position\n\nlet clear b = b.position <- 0\n\nlet reset b =\n b.position <- 0;\n let inner =\n { buffer = b.initial_buffer; length = Bytes.length b.initial_buffer }\n in\n b.inner <- inner\n\n(* [resize b more] ensures that [b.position + more <= b.inner.length] holds\n by dynamically extending [b.inner] if necessary -- and thus\n increasing [b.inner.length].\n*)\nlet resize b more =\n let old_pos = b.position in\n let old_len = b.inner.length in\n let new_len = ref old_len in\n while old_pos + more > !new_len do new_len := 2 * !new_len done;\n if !new_len > Sys.max_string_length then begin\n if old_pos + more <= Sys.max_string_length\n then new_len := Sys.max_string_length\n else failwith \"Buffer.add: cannot grow buffer\"\n end;\n let new_buffer = Bytes.create !new_len in\n (* PR#6148: let's keep using [blit] rather than [unsafe_blit] in\n this tricky function that is slow anyway. *)\n Bytes.blit b.inner.buffer 0 new_buffer 0 b.position;\n b.inner <- { buffer = new_buffer; length = !new_len }\n\n(* Note:\n Some of the functions below have a fast path when the inner\n buffer doesn't need to be extended.\n In this case, it is possible to use unsafe accesses on the\n contents of the [inner] field since its fields are immutable.\n In presence of data races, we may access the wrong inner buffer, but we\n will use this buffer safely.\n As soon as we need to resize the buffer, we fall back to safe accesses.\n*)\n\nlet add_char b c =\n let pos = b.position in\n let {buffer;length} = b.inner in\n if pos >= length then (\n resize b 1;\n Bytes.set b.inner.buffer b.position c\n ) else\n Bytes.unsafe_set buffer pos c;\n b.position <- pos + 1\n\nlet uchar_utf_8_byte_length_max = 4\nlet uchar_utf_16_byte_length_max = 4\n\nlet rec add_utf_8_uchar b u =\n let pos = b.position in\n if pos >= b.inner.length then resize b uchar_utf_8_byte_length_max;\n let n = Bytes.set_utf_8_uchar b.inner.buffer pos u in\n if n = 0\n then (resize b uchar_utf_8_byte_length_max; add_utf_8_uchar b u)\n else (b.position <- pos + n)\n\nlet rec add_utf_16be_uchar b u =\n let pos = b.position in\n if pos >= b.inner.length then resize b uchar_utf_16_byte_length_max;\n let n = Bytes.set_utf_16be_uchar b.inner.buffer pos u in\n if n = 0\n then (resize b uchar_utf_16_byte_length_max; add_utf_16be_uchar b u)\n else (b.position <- pos + n)\n\nlet rec add_utf_16le_uchar b u =\n let pos = b.position in\n if pos >= b.inner.length then resize b uchar_utf_16_byte_length_max;\n let n = Bytes.set_utf_16le_uchar b.inner.buffer pos u in\n if n = 0\n then (resize b uchar_utf_16_byte_length_max; add_utf_16le_uchar b u)\n else (b.position <- pos + n)\n\nlet add_substring b s offset len =\n if offset < 0 || len < 0 || offset > String.length s - len\n then invalid_arg \"Buffer.add_substring/add_subbytes\";\n let position = b.position in\n let {buffer;length} = b.inner in\n let new_position = position + len in\n if new_position > length then (\n resize b len;\n Bytes.blit_string s offset b.inner.buffer b.position len\n ) else\n Bytes.unsafe_blit_string s offset buffer position len;\n b.position <- new_position\n\nlet add_subbytes b s offset len =\n add_substring b (Bytes.unsafe_to_string s) offset len\n\nlet add_string b s =\n let len = String.length s in\n let position = b.position in\n let {buffer; length} = b.inner in\n let new_position = position + len in\n if new_position > length then (\n resize b len;\n Bytes.blit_string s 0 b.inner.buffer b.position len;\n ) else\n Bytes.unsafe_blit_string s 0 buffer position len;\n b.position <- new_position\n\nlet add_bytes b s = add_string b (Bytes.unsafe_to_string s)\n\nlet add_buffer b bs =\n add_subbytes b bs.inner.buffer 0 bs.position\n\n(* this (private) function could move into the standard library *)\nlet really_input_up_to ic buf ofs len =\n let rec loop ic buf ~already_read ~ofs ~to_read =\n if to_read = 0 then already_read\n else begin\n let r = input ic buf ofs to_read in\n if r = 0 then already_read\n else begin\n let already_read = already_read + r in\n let ofs = ofs + r in\n let to_read = to_read - r in\n loop ic buf ~already_read ~ofs ~to_read\n end\n end\n in loop ic buf ~already_read:0 ~ofs ~to_read:len\n\n\nlet unsafe_add_channel_up_to b ic len =\n if b.position + len > b.inner.length then resize b len;\n let n = really_input_up_to ic b.inner.buffer b.position len in\n b.position <- b.position + n;\n n\n\nlet add_channel b ic len =\n if len < 0 || len > Sys.max_string_length then (* PR#5004 *)\n invalid_arg \"Buffer.add_channel\";\n let n = unsafe_add_channel_up_to b ic len in\n (* It is intentional that a consumer catching End_of_file\n will see the data written (see #6719, #7136). *)\n if n < len then raise End_of_file;\n ()\n\nlet output_buffer oc b =\n output oc b.inner.buffer 0 b.position\n\nlet closing = function\n | '(' -> ')'\n | '{' -> '}'\n | _ -> assert false\n\n(* opening and closing: open and close characters, typically ( and )\n k: balance of opening and closing chars\n s: the string where we are searching\n start: the index where we start the search. *)\nlet advance_to_closing opening closing k s start =\n let rec advance k i lim =\n if i >= lim then raise Not_found else\n if s.[i] = opening then advance (k + 1) (i + 1) lim else\n if s.[i] = closing then\n if k = 0 then i else advance (k - 1) (i + 1) lim\n else advance k (i + 1) lim in\n advance k start (String.length s)\n\nlet advance_to_non_alpha s start =\n let rec advance i lim =\n if i >= lim then lim else\n match s.[i] with\n | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' -> advance (i + 1) lim\n | _ -> i in\n advance start (String.length s)\n\n(* We are just at the beginning of an ident in s, starting at start. *)\nlet find_ident s start lim =\n if start >= lim then raise Not_found else\n match s.[start] with\n (* Parenthesized ident ? *)\n | '(' | '{' as c ->\n let new_start = start + 1 in\n let stop = advance_to_closing c (closing c) 0 s new_start in\n String.sub s new_start (stop - start - 1), stop + 1\n (* Regular ident *)\n | _ ->\n let stop = advance_to_non_alpha s start in\n if stop = start then raise Not_found else\n String.sub s start (stop - start), stop\n\n(* Substitute $ident, $(ident), or ${ident} in s,\n according to the function mapping f. *)\nlet add_substitute b f s =\n let lim = String.length s in\n let rec subst previous i =\n if i < lim then begin\n match s.[i] with\n | '$' as current when previous = '\\\\' ->\n add_char b current;\n subst ' ' (i + 1)\n | '$' ->\n let j = i + 1 in\n begin match find_ident s j lim with\n | ident, next_i ->\n add_string b (f ident);\n subst ' ' next_i\n | exception Not_found ->\n add_char b '$';\n subst ' ' j\n end\n | current ->\n if previous = '\\\\' then add_char b previous;\n if current <> '\\\\' then add_char b current;\n subst current (i + 1)\n end else\n if previous = '\\\\' then add_char b previous in\n subst ' ' 0\n\nlet truncate b len =\n if len < 0 || len > length b then\n invalid_arg \"Buffer.truncate\"\n else\n b.position <- len\n\n(** {1 Iterators} *)\n\nlet to_seq b =\n let rec aux i () =\n (* Note that b.position is not a constant and cannot be lifted out of aux *)\n if i >= b.position then Seq.Nil\n else\n let x = Bytes.get b.inner.buffer i in\n Seq.Cons (x, aux (i+1))\n in\n aux 0\n\nlet to_seqi b =\n let rec aux i () =\n (* Note that b.position is not a constant and cannot be lifted out of aux *)\n if i >= b.position then Seq.Nil\n else\n let x = Bytes.get b.inner.buffer i in\n Seq.Cons ((i,x), aux (i+1))\n in\n aux 0\n\nlet add_seq b seq = Seq.iter (add_char b) seq\n\nlet of_seq i =\n let b = create 32 in\n add_seq b i;\n b\n\n(** {6 Binary encoding of integers} *)\n\nexternal unsafe_set_int8 : bytes -> int -> int -> unit = \"%bytes_unsafe_set\"\nexternal unsafe_set_int16 : bytes -> int -> int -> unit = \"%caml_bytes_set16u\"\nexternal unsafe_set_int32 : bytes -> int -> int32 -> unit = \"%caml_bytes_set32u\"\nexternal unsafe_set_int64 : bytes -> int -> int64 -> unit = \"%caml_bytes_set64u\"\nexternal set_int8 : bytes -> int -> int -> unit = \"%bytes_safe_set\"\nexternal set_int16 : bytes -> int -> int -> unit = \"%caml_bytes_set16\"\nexternal set_int32 : bytes -> int -> int32 -> unit = \"%caml_bytes_set32\"\nexternal set_int64 : bytes -> int -> int64 -> unit = \"%caml_bytes_set64\"\n\nexternal swap16 : int -> int = \"%bswap16\"\nexternal swap32 : int32 -> int32 = \"%bswap_int32\"\nexternal swap64 : int64 -> int64 = \"%bswap_int64\"\n\n\nlet add_int8 b x =\n let position = b.position in\n let {length; buffer} = b.inner in\n let new_position = position + 1 in\n if new_position > length then (\n resize b 1;\n set_int8 b.inner.buffer b.position x\n ) else\n unsafe_set_int8 buffer position x;\n b.position <- new_position\n\nlet add_int16_ne b x =\n let position = b.position in\n let {length; buffer} = b.inner in\n let new_position = position + 2 in\n if new_position > length then (\n resize b 2;\n set_int16 b.inner.buffer b.position x\n ) else\n unsafe_set_int16 buffer position x;\n b.position <- new_position\n\nlet add_int32_ne b x =\n let position = b.position in\n let {length; buffer} = b.inner in\n let new_position = position + 4 in\n if new_position > length then (\n resize b 4;\n set_int32 b.inner.buffer b.position x\n ) else\n unsafe_set_int32 buffer position x;\n b.position <- new_position\n\nlet add_int64_ne b x =\n let position = b.position in\n let {length; buffer} = b.inner in\n let new_position = position + 8 in\n if new_position > length then (\n resize b 8;\n set_int64 b.inner.buffer b.position x\n ) else\n unsafe_set_int64 buffer position x;\n b.position <- new_position\n\nlet add_int16_le b x =\n add_int16_ne b (if Sys.big_endian then swap16 x else x)\n\nlet add_int16_be b x =\n add_int16_ne b (if Sys.big_endian then x else swap16 x)\n\nlet add_int32_le b x =\n add_int32_ne b (if Sys.big_endian then swap32 x else x)\n\nlet add_int32_be b x =\n add_int32_ne b (if Sys.big_endian then x else swap32 x)\n\nlet add_int64_le b x =\n add_int64_ne b (if Sys.big_endian then swap64 x else x)\n\nlet add_int64_be b x =\n add_int64_ne b (if Sys.big_endian then x else swap64 x)\n\nlet add_uint8 = add_int8\nlet add_uint16_ne = add_int16_ne\nlet add_uint16_le = add_int16_le\nlet add_uint16_be = add_int16_be\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":194663},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/mutex.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy and Pascal Cuoq, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1995 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype t\nexternal create: unit -> t = \"caml_ml_mutex_new\"\nexternal lock: t -> unit = \"caml_ml_mutex_lock\"\nexternal try_lock: t -> bool = \"caml_ml_mutex_try_lock\"\nexternal unlock: t -> unit = \"caml_ml_mutex_unlock\"\n\n(* private re-export *)\nexternal reraise : exn -> 'a = \"%reraise\"\n\n(* cannot inline, otherwise flambda might move code around. *)\nlet[@inline never] protect m f =\n lock m;\n match f() with\n | x ->\n unlock m; x\n | exception e ->\n (* NOTE: [unlock] does not poll for asynchronous exceptions *)\n unlock m;\n reraise e\n"],"names":[],"mappings":"qCC0BE,MAAM,SACA,qBAAG,I,AAAA,I,AAAA,G,EAAA,KAKP,MAAQ,KAHR,MAAQ,EAIC,C","ignoreList":[0]}},{"offset":{"line":0,"column":194979},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/semaphore.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, Collège de France and INRIA Paris *)\n(* *)\n(* Copyright 2020 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(** Semaphores *)\n\ntype sem = {\n mut: Mutex.t; (* protects [v] *)\n mutable v: int; (* the current value *)\n nonzero: Condition.t (* signaled when [v > 0] *)\n}\n\nmodule Counting = struct\n\ntype t = sem\n\nlet make v =\n if v < 0 then invalid_arg \"Semaphore.Counting.init: wrong initial value\";\n { mut = Mutex.create(); v; nonzero = Condition.create() }\n\nlet release s =\n Mutex.lock s.mut;\n if s.v < max_int then begin\n s.v <- s.v + 1;\n Condition.signal s.nonzero;\n Mutex.unlock s.mut\n end else begin\n Mutex.unlock s.mut;\n raise (Sys_error \"Semaphore.Counting.release: overflow\")\n end\n\nlet acquire s =\n Mutex.lock s.mut;\n while s.v = 0 do Condition.wait s.nonzero s.mut done;\n s.v <- s.v - 1;\n Mutex.unlock s.mut\n\nlet try_acquire s =\n Mutex.lock s.mut;\n let ret = if s.v = 0 then false else (s.v <- s.v - 1; true) in\n Mutex.unlock s.mut;\n ret\n\nlet get_value s = s.v\n\nend\n\nmodule Binary = struct\n\ntype t = sem\n\nlet make b =\n { mut = Mutex.create();\n v = if b then 1 else 0;\n nonzero = Condition.create() }\n\nlet release s =\n Mutex.lock s.mut;\n s.v <- 1;\n Condition.signal s.nonzero;\n Mutex.unlock s.mut\n\nlet acquire s =\n Mutex.lock s.mut;\n while s.v = 0 do Condition.wait s.nonzero s.mut done;\n s.v <- 0;\n Mutex.unlock s.mut\n\nlet try_acquire s =\n Mutex.lock s.mut;\n let ret = if s.v = 0 then false else (s.v <- 0; true) in\n Mutex.unlock s.mut;\n ret\n\nend\n","(* generated code *)"],"names":[],"mappings":"OAgFE,kCAAgB,cACU,GAAW,cAAW,G,EAChD,gCAAkB,IACf,C,MATH,gCAAgB,qBACC,oCAA8B,GAC/C,cACA,6B,GAAkB,C,KATlB,kCAAgB,WAEhB,6BAA0B,4BACR,C,IANN,IAFZ,QAEY,eAAkB,QADd,EADM,IAAd,IACQ,QADR,aAAc,UAEU,C,EAXhB,UAAG,C,OALnB,kCAAgB,cACU,GAAW,2BAAiB,G,EACtD,gCAAkB,IACf,C,MATH,gCAAgB,qBACC,oCAA8B,GAC/C,2BACA,6B,GAAkB,C,MAdlB,kCAAgB,2BACM,wBAEpB,6BAA0B,6BAEnB,kBACP,cAAkB,qB,CAEjB,C,KAZH,YAAc,yBACuB,IAArC,QAAqC,eAAf,IAAd,IAA+C,QAA/C,aAAc,QAAmC,C,EC7B3D","ignoreList":[1]}},{"offset":{"line":0,"column":196097},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/domain.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* KC Sivaramakrishnan, Indian Institute of Technology, Madras *)\n(* Stephen Dolan, University of Cambridge *)\n(* Tom Kelly, OCaml Labs Consultancy *)\n(* *)\n(* Copyright 2019 Indian Institute of Technology, Madras *)\n(* Copyright 2014 University of Cambridge *)\n(* Copyright 2021 OCaml Labs Consultancy Ltd *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nmodule Raw = struct\n (* Low-level primitives provided by the runtime *)\n type t = private int\n\n (* The layouts of [state] and [term_sync] are hard-coded in\n [runtime/domain.c] *)\n\n type 'a state =\n | Running\n | Finished of ('a, exn) result [@warning \"-unused-constructor\"]\n\n type 'a term_sync = {\n (* protected by [mut] *)\n mutable state : 'a state [@warning \"-unused-field\"] ;\n mut : Mutex.t ;\n cond : Condition.t ;\n }\n\n external spawn : (unit -> 'a) -> 'a term_sync -> t\n = \"caml_domain_spawn\"\n external self : unit -> t\n = \"caml_ml_domain_id\" [@@noalloc]\n external cpu_relax : unit -> unit\n = \"caml_ml_domain_cpu_relax\"\n external get_recommended_domain_count: unit -> int\n = \"caml_recommended_domain_count\" [@@noalloc]\nend\n\nlet cpu_relax () = Raw.cpu_relax ()\n\ntype id = Raw.t\n\ntype 'a t = {\n domain : Raw.t;\n term_sync : 'a Raw.term_sync;\n}\n\nmodule DLS = struct\n\n module Obj_opt : sig\n type t\n val none : t\n val some : 'a -> t\n val is_some : t -> bool\n\n (** [unsafe_get obj] may only be called safely\n if [is_some] is true.\n\n [unsafe_get (some v)] is equivalent to\n [Obj.obj (Obj.repr v)]. *)\n val unsafe_get : t -> 'a\n end = struct\n type t = Obj.t\n let none = Obj.repr (ref 0)\n let some v = Obj.repr v\n let is_some obj = (obj != none)\n let unsafe_get obj = Obj.obj obj\n end\n\n type dls_state = Obj_opt.t array\n\n external get_dls_state : unit -> dls_state = \"%dls_get\"\n\n external set_dls_state : dls_state -> unit =\n \"caml_domain_dls_set\" [@@noalloc]\n\n external compare_and_set_dls_state : dls_state -> dls_state -> bool =\n \"caml_domain_dls_compare_and_set\" [@@noalloc]\n\n let create_dls () =\n let st = Array.make 8 Obj_opt.none in\n set_dls_state st\n\n let _ = create_dls ()\n\n type 'a key = int * (unit -> 'a)\n\n let key_counter = Atomic.make 0\n\n type key_initializer =\n KI: 'a key * ('a -> 'a) -> key_initializer\n\n let parent_keys = Atomic.make ([] : key_initializer list)\n\n let rec add_parent_key ki =\n let l = Atomic.get parent_keys in\n if not (Atomic.compare_and_set parent_keys l (ki :: l))\n then add_parent_key ki\n\n let new_key ?split_from_parent init_orphan =\n let idx = Atomic.fetch_and_add key_counter 1 in\n let k = (idx, init_orphan) in\n begin match split_from_parent with\n | None -> ()\n | Some split -> add_parent_key (KI(k, split))\n end;\n k\n\n (* If necessary, grow the current domain's local state array such that [idx]\n * is a valid index in the array. *)\n let rec maybe_grow idx =\n let st = get_dls_state () in\n let sz = Array.length st in\n if idx < sz then st\n else begin\n let rec compute_new_size s =\n if idx < s then s else compute_new_size (2 * s)\n in\n let new_sz = compute_new_size sz in\n let new_st = Array.make new_sz Obj_opt.none in\n Array.blit st 0 new_st 0 sz;\n (* We want a implementation that is safe with respect to\n single-domain multi-threading: retry if the DLS state has\n changed under our feet.\n Note that the number of retries will be very small in\n contended scenarios, as the array only grows, with\n exponential resizing. *)\n if compare_and_set_dls_state st new_st\n then new_st\n else maybe_grow idx\n end\n\n let set (type a) (idx, _init) (x : a) =\n let st = maybe_grow idx in\n (* [Sys.opaque_identity] ensures that flambda does not look at the type of\n * [x], which may be a [float] and conclude that the [st] is a float array.\n * We do not want OCaml's float array optimisation kicking in here. *)\n st.(idx) <- Obj_opt.some (Sys.opaque_identity x)\n\n\n let[@inline never] array_compare_and_set a i oldval newval =\n (* Note: we cannot use [@poll error] due to the\n allocations on a.(i) in the Double_array case. *)\n let curval = a.(i) in\n if curval == oldval then (\n Array.unsafe_set a i newval;\n true\n ) else false\n\n let get (type a) ((idx, init) : a key) : a =\n let st = maybe_grow idx in\n let obj = st.(idx) in\n if Obj_opt.is_some obj\n then (Obj_opt.unsafe_get obj : a)\n else begin\n let v : a = init () in\n let new_obj = Obj_opt.some (Sys.opaque_identity v) in\n (* At this point, [st] or [st.(idx)] may have been changed\n by another thread on the same domain.\n\n If [st] changed, it was resized into a larger value,\n we can just reuse the new value.\n\n If [st.(idx)] changed, we drop the current value to avoid\n letting other threads observe a 'revert' that forgets\n previous modifications. *)\n let st = get_dls_state () in\n if array_compare_and_set st idx obj new_obj\n then v\n else begin\n (* if st.(idx) changed, someone must have initialized\n the key in the meantime. *)\n let updated_obj = st.(idx) in\n if Obj_opt.is_some updated_obj\n then (Obj_opt.unsafe_get updated_obj : a)\n else assert false\n end\n end\n\n type key_value = KV : 'a key * 'a -> key_value\n\n let get_initial_keys () : key_value list =\n List.map\n (fun (KI (k, split)) -> KV (k, (split (get k))))\n (Atomic.get parent_keys)\n\n let set_initial_keys (l: key_value list) =\n List.iter (fun (KV (k, v)) -> set k v) l\nend\n\n(******** Identity **********)\n\nlet get_id { domain; _ } = domain\n\nlet self () = Raw.self ()\n\nlet is_main_domain () = (self () :> int) = 0\n\n(******** Callbacks **********)\n\n(* first spawn, domain startup and at exit functionality *)\nlet first_domain_spawned = Atomic.make false\n\nlet first_spawn_function = ref (fun () -> ())\n\nlet before_first_spawn f =\n if Atomic.get first_domain_spawned then\n raise (Invalid_argument \"first domain already spawned\")\n else begin\n let old_f = !first_spawn_function in\n let new_f () = old_f (); f () in\n first_spawn_function := new_f\n end\n\nlet do_before_first_spawn () =\n if not (Atomic.get first_domain_spawned) then begin\n Atomic.set first_domain_spawned true;\n !first_spawn_function();\n (* Release the old function *)\n first_spawn_function := (fun () -> ())\n end\n\nlet at_exit_key = DLS.new_key (fun () -> (fun () -> ()))\n\nlet at_exit f =\n let old_exit : unit -> unit = DLS.get at_exit_key in\n let new_exit () =\n f (); old_exit ()\n in\n DLS.set at_exit_key new_exit\n\nlet do_at_exit () =\n let f : unit -> unit = DLS.get at_exit_key in\n f ()\n\nlet _ = Stdlib.do_domain_local_at_exit := do_at_exit\n\n(******* Creation and Termination ********)\n\nlet spawn f =\n do_before_first_spawn ();\n let pk = DLS.get_initial_keys () in\n\n (* [term_sync] is used to synchronize with the joining domains *)\n let term_sync =\n Raw.{ state = Running ;\n mut = Mutex.create () ;\n cond = Condition.create () }\n in\n\n let body () =\n match\n DLS.create_dls ();\n DLS.set_initial_keys pk;\n let res = f () in\n res\n with\n (* Run the [at_exit] callbacks when the domain computation either\n terminates normally or exceptionally. *)\n | res ->\n (* If the domain computation terminated normally, but the\n [at_exit] callbacks raised an exception, then return the\n exception. *)\n do_at_exit ();\n res\n | exception exn ->\n (* If both the domain computation and the [at_exit] callbacks\n raise exceptions, then ignore the exception from the\n [at_exit] callbacks and return the original exception. *)\n (try do_at_exit () with _ -> ());\n raise exn\n in\n let domain = Raw.spawn body term_sync in\n { domain ; term_sync }\n\nlet join { term_sync ; _ } =\n let open Raw in\n let rec loop () =\n match term_sync.state with\n | Running ->\n Condition.wait term_sync.cond term_sync.mut;\n loop ()\n | Finished res ->\n res\n in\n match Mutex.protect term_sync.mut loop with\n | Ok x -> x\n | Error ex -> raise ex\n\nlet recommended_domain_count = Raw.get_recommended_domain_count\n"],"names":[],"mappings":"aC8RI,kCAEI,kDAA2C,eAGxC,C,KAE6B,IAV/B,UAUP,UATA,QASA,QAAM,eAAgC,sBAC5B,aACY,C,EApEe,IAAE,C,KAhC3B,yBAAoB,QAAQ,C,OAgEtC,iB,IACE,QAjEF,K,CAAA,W,CAAA,2BAmEY,M,CAAA,oBACV,I,AAAA,I,AAAA,G,EAAA,KDvQN,SCqRa,M,CAAA,SAAa,I,AAAA,I,AAAA,G,EAAA,KAClB,KAPA,M,CAAA,SAAa,EAOJ,C,WAvFX,cAA8C,IAA9C,SAAsC,EAAtC,MAAsC,QAAP,eAAe,IAAE,C,aAgCpD,QAAO,KAAP,QAAO,aAAiC,QACtC,WAD4C,QAC5C,cACA,IADoC,YACpC,cAAuB,gBAjCG,cAAxB,OAFF,QAEE,aAAwB,uBA+Db,IAHf,QAGe,eA0Bf,IAvBA,gCAJ6B,QAAf,IACoB,QADpB,aAAe,QA0BhB,GACb,MAAsB,C,MAxCtB,IADuB,uBACvB,aAAI,C,KANF,6BAAI,uBAAa,C,MAFW,QAI9B,KAHA,KAD8B,iBAC9B,GAGA,UAA4B,C,EAPW,GAAc,C,KAZpC,6BAAQ,uBAAM,C,MAJ/B,QAAG,KAAH,QAAG,aAA+B,QAKhC,SADA,KAFG,YAEH,GACA,QAJA,qBAKC,C,EAhB2B,IAFlB,OAEkB,GAAY,C,EAF9B,OAAW,C,EAFd,UAAsB,C,uBA3CvB,cAEI,KAFJ,S,CAAA,QACG,UACC,E,CAAA,iCAFJ,EAEI,c,CAAA,kCAtFQ,QAuFI,E,EAGR,qBAZD,KAuBX,SAvBW,E,CAAA,+C,CAAA,gCACb,sCACE,gB,CAAA,wCAA2B,GAEtB,GAoBsC,EACtC,IAIe,O,CAAA,+B,EAAA,gB,CAAA,kCA3GJ,QA4GgB,EAEzB,gBA7GY,I,KAAA,KA6GZ,GAEN,C,UAxCH,KALM,Y,CAAA,MACG,UAIT,E,CAAA,iCALM,EAKN,e,CAAA,wCAAgD,U,EArB5C,sBAAgB,GAAO,eAAwB,C,UALnD,GACA,KADA,S,CACA,yBACA,WAAiB,E,EAOf,E,GAAA,IAFa,IAJV,KAIU,GACA,UACb,8BAOG,OAAmC,OACjC,IAEJ,C,UA7BH,IADA,QAAU,QAAV,QAAU,aACV,QACA,O,CAAA,EAEgB,MAFhB,UAEgB,MAThB,EACO,MADC,MAAR,QAAQ,eACR,oBAAO,aAAgD,UAUvD,EAAC,C,EA1BQ,YACT,IAAgB,C,EA3CD,OAAgB,C,gDA6CzB,GASiD,MALvC,IAJG,QAIH,aAKA,IALa,QAKb,eAAuC,qCA6Gf,GAAjB,IA7GgC,QA6GhC,eAAiB,mBAqBY,KAAtC,cAAsC,4G","ignoreList":[0]}},{"offset":{"line":0,"column":198751},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/camlinternalFormat.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Benoit Vaugon, ENSTA *)\n(* *)\n(* Copyright 2014 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nopen CamlinternalFormatBasics\n\n(******************************************************************************)\n (* Tools to manipulate scanning set of chars (see %[...]) *)\n\ntype mutable_char_set = bytes\n\n(* Create a fresh, empty, mutable char set. *)\nlet create_char_set () = Bytes.make 32 '\\000'\n\n(* Add a char in a mutable char set. *)\nlet add_in_char_set char_set c =\n let ind = int_of_char c in\n let str_ind = ind lsr 3 and mask = 1 lsl (ind land 0b111) in\n Bytes.set char_set str_ind\n (char_of_int (int_of_char (Bytes.get char_set str_ind) lor mask))\n\nlet freeze_char_set char_set =\n Bytes.to_string char_set\n\n(* Compute the complement of a char set. *)\nlet rev_char_set char_set =\n let char_set' = create_char_set () in\n for i = 0 to 31 do\n Bytes.set char_set' i\n (char_of_int (int_of_char (String.get char_set i) lxor 0xFF));\n done;\n Bytes.unsafe_to_string char_set'\n\n(* Return true if a `c' is in `char_set'. *)\nlet is_in_char_set char_set c =\n let ind = int_of_char c in\n let str_ind = ind lsr 3 and mask = 1 lsl (ind land 0b111) in\n (int_of_char (String.get char_set str_ind) land mask) <> 0\n\n\n(******************************************************************************)\n (* Ignored param conversion *)\n\n(* GADT used to abstract an existential type parameter. *)\n(* See param_format_of_ignored_format. *)\ntype ('a, 'b, 'c, 'd, 'e, 'f) param_format_ebb = Param_format_EBB :\n ('x -> 'a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('a, 'b, 'c, 'd, 'e, 'f) param_format_ebb\n\n(* Compute a padding associated to a pad_option (see \"%_42d\"). *)\nlet pad_of_pad_opt pad_opt = match pad_opt with\n | None -> No_padding\n | Some width -> Lit_padding (Right, width)\n\n(* Compute a precision associated to a prec_option (see \"%_.42f\"). *)\nlet prec_of_prec_opt prec_opt = match prec_opt with\n | None -> No_precision\n | Some ndec -> Lit_precision ndec\n\n(* Turn an ignored param into its equivalent not-ignored format node. *)\n(* Used for format pretty-printing and Scanf. *)\nlet param_format_of_ignored_format : type a b c d e f x y .\n (a, b, c, d, y, x) ignored -> (x, b, c, y, e, f) fmt ->\n (a, b, c, d, e, f) param_format_ebb =\nfun ign fmt -> match ign with\n | Ignored_char ->\n Param_format_EBB (Char fmt)\n | Ignored_caml_char ->\n Param_format_EBB (Caml_char fmt)\n | Ignored_string pad_opt ->\n Param_format_EBB (String (pad_of_pad_opt pad_opt, fmt))\n | Ignored_caml_string pad_opt ->\n Param_format_EBB (Caml_string (pad_of_pad_opt pad_opt, fmt))\n | Ignored_int (iconv, pad_opt) ->\n Param_format_EBB (Int (iconv, pad_of_pad_opt pad_opt, No_precision, fmt))\n | Ignored_int32 (iconv, pad_opt) ->\n Param_format_EBB\n (Int32 (iconv, pad_of_pad_opt pad_opt, No_precision, fmt))\n | Ignored_nativeint (iconv, pad_opt) ->\n Param_format_EBB\n (Nativeint (iconv, pad_of_pad_opt pad_opt, No_precision, fmt))\n | Ignored_int64 (iconv, pad_opt) ->\n Param_format_EBB\n (Int64 (iconv, pad_of_pad_opt pad_opt, No_precision, fmt))\n | Ignored_float (pad_opt, prec_opt) ->\n Param_format_EBB\n (Float ((Float_flag_, Float_f),\n pad_of_pad_opt pad_opt, prec_of_prec_opt prec_opt, fmt))\n | Ignored_bool pad_opt ->\n Param_format_EBB (Bool (pad_of_pad_opt pad_opt, fmt))\n | Ignored_format_arg (pad_opt, fmtty) ->\n Param_format_EBB (Format_arg (pad_opt, fmtty, fmt))\n | Ignored_format_subst (pad_opt, fmtty) ->\n Param_format_EBB\n (Format_subst (pad_opt, fmtty, fmt))\n | Ignored_reader ->\n Param_format_EBB (Reader fmt)\n | Ignored_scan_char_set (width_opt, char_set) ->\n Param_format_EBB (Scan_char_set (width_opt, char_set, fmt))\n | Ignored_scan_get_counter counter ->\n Param_format_EBB (Scan_get_counter (counter, fmt))\n | Ignored_scan_next_char ->\n Param_format_EBB (Scan_next_char fmt)\n\n\n(******************************************************************************)\n (* Types *)\n\ntype ('b, 'c) acc_formatting_gen =\n | Acc_open_tag of ('b, 'c) acc\n | Acc_open_box of ('b, 'c) acc\n\n(* Reversed list of printing atoms. *)\n(* Used to accumulate printf arguments. *)\nand ('b, 'c) acc =\n | Acc_formatting_lit of ('b, 'c) acc * formatting_lit\n (* Special fmtting (box) *)\n | Acc_formatting_gen of ('b, 'c) acc * ('b, 'c) acc_formatting_gen\n (* Special fmtting (box) *)\n | Acc_string_literal of ('b, 'c) acc * string (* Literal string *)\n | Acc_char_literal of ('b, 'c) acc * char (* Literal char *)\n | Acc_data_string of ('b, 'c) acc * string (* Generated string *)\n | Acc_data_char of ('b, 'c) acc * char (* Generated char *)\n | Acc_delay of ('b, 'c) acc * ('b -> 'c)\n (* Delayed printing (%a, %t) *)\n | Acc_flush of ('b, 'c) acc (* Flush *)\n | Acc_invalid_arg of ('b, 'c) acc * string\n (* Raise Invalid_argument msg *)\n | End_of_acc\n\n(* List of heterogeneous values. *)\n(* Used to accumulate scanf callback arguments. *)\ntype ('a, 'b) heter_list =\n | Cons : 'c * ('a, 'b) heter_list -> ('c -> 'a, 'b) heter_list\n | Nil : ('b, 'b) heter_list\n\n(* Existential Black Boxes. *)\n(* Used to abstract some existential type parameters. *)\n\n(* GADT type associating a padding and an fmtty. *)\n(* See the type_padding function. *)\ntype ('a, 'b, 'c, 'd, 'e, 'f) padding_fmtty_ebb = Padding_fmtty_EBB :\n ('x, 'y) padding * ('y, 'b, 'c, 'd, 'e, 'f) fmtty ->\n ('x, 'b, 'c, 'd, 'e, 'f) padding_fmtty_ebb\n\n(* GADT type associating a padding, a precision and an fmtty. *)\n(* See the type_padprec function. *)\ntype ('a, 'b, 'c, 'd, 'e, 'f) padprec_fmtty_ebb = Padprec_fmtty_EBB :\n ('x, 'y) padding * ('y, 'z) precision * ('z, 'b, 'c, 'd, 'e, 'f) fmtty ->\n ('x, 'b, 'c, 'd, 'e, 'f) padprec_fmtty_ebb\n\n(* GADT type associating a padding and an fmt. *)\n(* See make_padding_fmt_ebb and parse_format functions. *)\ntype ('a, 'b, 'c, 'e, 'f) padding_fmt_ebb = Padding_fmt_EBB :\n (_, 'x -> 'a) padding *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'e, 'f) padding_fmt_ebb\n\n(* GADT type associating a precision and an fmt. *)\n(* See make_precision_fmt_ebb and parse_format functions. *)\ntype ('a, 'b, 'c, 'e, 'f) precision_fmt_ebb = Precision_fmt_EBB :\n (_, 'x -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('x, 'b, 'c, 'e, 'f) precision_fmt_ebb\n\n(* GADT type associating a padding, a precision and an fmt. *)\n(* See make_padprec_fmt_ebb and parse_format functions. *)\ntype ('p, 'b, 'c, 'e, 'f) padprec_fmt_ebb = Padprec_fmt_EBB :\n ('x, 'y) padding * ('y, 'p -> 'a) precision *\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('p, 'b, 'c, 'e, 'f) padprec_fmt_ebb\n\n(* Abstract the 'a and 'd parameters of an fmt. *)\n(* Output type of the format parsing function. *)\ntype ('b, 'c, 'e, 'f) fmt_ebb = Fmt_EBB :\n ('a, 'b, 'c, 'd, 'e, 'f) fmt ->\n ('b, 'c, 'e, 'f) fmt_ebb\n\n(* GADT type associating an fmtty and an fmt. *)\n(* See the type_format_gen function. *)\ntype ('a, 'b, 'c, 'd, 'e, 'f) fmt_fmtty_ebb = Fmt_fmtty_EBB :\n ('a, 'b, 'c, 'd, 'y, 'x) fmt *\n ('x, 'b, 'c, 'y, 'e, 'f) fmtty ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmt_fmtty_ebb\n\n(* GADT type associating an fmtty and an fmt. *)\n(* See the type_ignored_format_substitution function. *)\ntype ('a, 'b, 'c, 'd, 'e, 'f) fmtty_fmt_ebb = Fmtty_fmt_EBB :\n ('a, 'b, 'c, 'd, 'y, 'x) fmtty *\n ('x, 'b, 'c, 'y, 'e, 'f) fmt_fmtty_ebb ->\n ('a, 'b, 'c, 'd, 'e, 'f) fmtty_fmt_ebb\n\n(* Abstract all fmtty type parameters. *)\n(* Used to compare format types. *)\ntype fmtty_ebb = Fmtty_EBB : ('a, 'b, 'c, 'd, 'e, 'f) fmtty -> fmtty_ebb\n\n(* Abstract all padding type parameters. *)\n(* Used to compare paddings. *)\ntype padding_ebb = Padding_EBB : ('a, 'b) padding -> padding_ebb\n\n(* Abstract all precision type parameters. *)\n(* Used to compare precisions. *)\ntype precision_ebb = Precision_EBB : ('a, 'b) precision -> precision_ebb\n\n(******************************************************************************)\n (* Constants *)\n\n(* Default precision for float printing. *)\nlet default_float_precision fconv =\n match snd fconv with\n | Float_f | Float_e | Float_E | Float_g | Float_G | Float_h | Float_H\n | Float_CF -> -6\n (* For %h %H and %#F formats, a negative precision means \"as many digits as\n necessary\". For the other FP formats, we take the absolute value\n of the precision, hence 6 digits by default. *)\n | Float_F -> 12\n (* Default precision for OCaml float printing (%F). *)\n\n(******************************************************************************)\n (* Externals *)\n\nexternal format_float: string -> float -> string\n = \"caml_format_float\"\nexternal format_int: string -> int -> string\n = \"caml_format_int\"\nexternal format_int32: string -> int32 -> string\n = \"caml_int32_format\"\nexternal format_nativeint: string -> nativeint -> string\n = \"caml_nativeint_format\"\nexternal format_int64: string -> int64 -> string\n = \"caml_int64_format\"\nexternal hexstring_of_float: float -> int -> char -> string\n = \"caml_hexstring_of_float\"\n\n(******************************************************************************)\n (* Tools to pretty-print formats *)\n\n(* Type of extensible character buffers. *)\ntype buffer = {\n mutable ind : int;\n mutable bytes : bytes;\n}\n\n(* Create a fresh buffer. *)\nlet buffer_create init_size = { ind = 0; bytes = Bytes.create init_size }\n\n(* Check size of the buffer and grow it if needed. *)\nlet buffer_check_size buf overhead =\n let len = Bytes.length buf.bytes in\n let min_len = buf.ind + overhead in\n if min_len > len then (\n let new_len = Int.max (len * 2) min_len in\n let new_str = Bytes.create new_len in\n Bytes.blit buf.bytes 0 new_str 0 len;\n buf.bytes <- new_str;\n )\n\n(* Add the character `c' to the buffer `buf'. *)\nlet buffer_add_char buf c =\n buffer_check_size buf 1;\n Bytes.set buf.bytes buf.ind c;\n buf.ind <- buf.ind + 1\n\n(* Add the string `s' to the buffer `buf'. *)\nlet buffer_add_string buf s =\n let str_len = String.length s in\n buffer_check_size buf str_len;\n String.blit s 0 buf.bytes buf.ind str_len;\n buf.ind <- buf.ind + str_len\n\n(* Get the content of the buffer. *)\nlet buffer_contents buf =\n Bytes.sub_string buf.bytes 0 buf.ind\n\n(***)\n\n(* Convert an integer conversion to char. *)\nlet char_of_iconv iconv = match iconv with\n | Int_d | Int_pd | Int_sd | Int_Cd -> 'd' | Int_i | Int_pi | Int_si\n | Int_Ci -> 'i' | Int_x | Int_Cx -> 'x' | Int_X | Int_CX -> 'X' | Int_o\n | Int_Co -> 'o' | Int_u | Int_Cu -> 'u'\n\n(* Convert a float conversion to char. *)\n(* `cF' will be 'F' for displaying format and 'g' to call libc printf *)\nlet char_of_fconv ?(cF='F') fconv = match snd fconv with\n | Float_f -> 'f' | Float_e -> 'e'\n | Float_E -> 'E' | Float_g -> 'g'\n | Float_G -> 'G' | Float_F -> cF\n | Float_h -> 'h' | Float_H -> 'H'\n | Float_CF -> 'F'\n\n\n(* Convert a scanning counter to char. *)\nlet char_of_counter counter = match counter with\n | Line_counter -> 'l'\n | Char_counter -> 'n'\n | Token_counter -> 'N'\n\n(***)\n\n(* Print a char_set in a buffer with the OCaml format lexical convention. *)\nlet bprint_char_set buf char_set =\n let rec print_start set =\n let is_alone c =\n let before, after = Char.(chr (code c - 1), chr (code c + 1)) in\n is_in_char_set set c\n && not (is_in_char_set set before && is_in_char_set set after) in\n if is_alone ']' then buffer_add_char buf ']';\n print_out set 1;\n if is_alone '-' then buffer_add_char buf '-';\n and print_out set i =\n if i < 256 then\n if is_in_char_set set (char_of_int i) then print_first set i\n else print_out set (i + 1)\n and print_first set i =\n match char_of_int i with\n | '\\255' -> print_char buf 255;\n | ']' | '-' -> print_out set (i + 1);\n | _ -> print_second set (i + 1);\n and print_second set i =\n if is_in_char_set set (char_of_int i) then\n match char_of_int i with\n | '\\255' ->\n print_char buf 254;\n print_char buf 255;\n | ']' | '-' when not (is_in_char_set set (char_of_int (i + 1))) ->\n print_char buf (i - 1);\n print_out set (i + 1);\n | _ when not (is_in_char_set set (char_of_int (i + 1))) ->\n print_char buf (i - 1);\n print_char buf i;\n print_out set (i + 2);\n | _ ->\n print_in set (i - 1) (i + 2);\n else (\n print_char buf (i - 1);\n print_out set (i + 1);\n )\n and print_in set i j =\n if j = 256 || not (is_in_char_set set (char_of_int j)) then (\n print_char buf i;\n print_char buf (int_of_char '-');\n print_char buf (j - 1);\n if j < 256 then print_out set (j + 1);\n ) else\n print_in set i (j + 1);\n and print_char buf i = match char_of_int i with\n | '%' -> buffer_add_char buf '%'; buffer_add_char buf '%';\n | '@' -> buffer_add_char buf '%'; buffer_add_char buf '@';\n | c -> buffer_add_char buf c;\n in\n buffer_add_char buf '[';\n print_start (\n if is_in_char_set char_set '\\000'\n then ( buffer_add_char buf '^'; rev_char_set char_set )\n else char_set\n );\n buffer_add_char buf ']'\n\n(***)\n\n(* Print a padty in a buffer with the format-like syntax. *)\nlet bprint_padty buf padty = match padty with\n | Left -> buffer_add_char buf '-'\n | Right -> ()\n | Zeros -> buffer_add_char buf '0'\n\n(* Print the '_' of an ignored flag if needed. *)\nlet bprint_ignored_flag buf ign_flag =\n if ign_flag then buffer_add_char buf '_'\n\n(***)\n\nlet bprint_pad_opt buf pad_opt = match pad_opt with\n | None -> ()\n | Some width -> buffer_add_string buf (Int.to_string width)\n\n(***)\n\n(* Print padding in a buffer with the format-like syntax. *)\nlet bprint_padding : type a b . buffer -> (a, b) padding -> unit =\nfun buf pad -> match pad with\n | No_padding -> ()\n | Lit_padding (padty, n) ->\n bprint_padty buf padty;\n buffer_add_string buf (Int.to_string n);\n | Arg_padding padty ->\n bprint_padty buf padty;\n buffer_add_char buf '*'\n\n(* Print precision in a buffer with the format-like syntax. *)\nlet bprint_precision : type a b . buffer -> (a, b) precision -> unit =\n fun buf prec -> match prec with\n | No_precision -> ()\n | Lit_precision n ->\n buffer_add_char buf '.';\n buffer_add_string buf (Int.to_string n);\n | Arg_precision ->\n buffer_add_string buf \".*\"\n\n(***)\n\n(* Print the optional '+', ' ' or '#' associated to an int conversion. *)\nlet bprint_iconv_flag buf iconv = match iconv with\n | Int_pd | Int_pi -> buffer_add_char buf '+'\n | Int_sd | Int_si -> buffer_add_char buf ' '\n | Int_Cx | Int_CX | Int_Co | Int_Cd | Int_Ci | Int_Cu ->\n buffer_add_char buf '#'\n | Int_d | Int_i | Int_x | Int_X | Int_o | Int_u -> ()\n\n(* Print an complete int format in a buffer (ex: \"%3.*d\"). *)\nlet bprint_int_fmt buf ign_flag iconv pad prec =\n buffer_add_char buf '%';\n bprint_ignored_flag buf ign_flag;\n bprint_iconv_flag buf iconv;\n bprint_padding buf pad;\n bprint_precision buf prec;\n buffer_add_char buf (char_of_iconv iconv)\n\n(* Print a complete int32, nativeint or int64 format in a buffer. *)\nlet bprint_altint_fmt buf ign_flag iconv pad prec c =\n buffer_add_char buf '%';\n bprint_ignored_flag buf ign_flag;\n bprint_iconv_flag buf iconv;\n bprint_padding buf pad;\n bprint_precision buf prec;\n buffer_add_char buf c;\n buffer_add_char buf (char_of_iconv iconv)\n\n(***)\n\n(* Print the optional '+', ' ' and/or '#' associated to a float conversion. *)\nlet bprint_fconv_flag buf fconv =\n begin match fst fconv with\n | Float_flag_p -> buffer_add_char buf '+'\n | Float_flag_s -> buffer_add_char buf ' '\n | Float_flag_ -> () end;\n match snd fconv with\n | Float_CF -> buffer_add_char buf '#'\n | Float_f | Float_e | Float_E | Float_g | Float_G\n | Float_F | Float_h | Float_H -> ()\n\n(* Print a complete float format in a buffer (ex: \"%+*.3f\"). *)\nlet bprint_float_fmt buf ign_flag fconv pad prec =\n buffer_add_char buf '%';\n bprint_ignored_flag buf ign_flag;\n bprint_fconv_flag buf fconv;\n bprint_padding buf pad;\n bprint_precision buf prec;\n buffer_add_char buf (char_of_fconv fconv)\n\n(* Compute the literal string representation of a Formatting_lit. *)\n(* Used by Printf and Scanf where formatting is not interpreted. *)\nlet string_of_formatting_lit formatting_lit = match formatting_lit with\n | Close_box -> \"@]\"\n | Close_tag -> \"@}\"\n | Break (str, _, _) -> str\n | FFlush -> \"@?\"\n | Force_newline -> \"@\\n\"\n | Flush_newline -> \"@.\"\n | Magic_size (str, _) -> str\n | Escaped_at -> \"@@\"\n | Escaped_percent -> \"@%\"\n | Scan_indic c -> \"@\" ^ (String.make 1 c)\n\n(***)\n\n(* Print a literal char in a buffer, escape '%' by \"%%\". *)\nlet bprint_char_literal buf chr = match chr with\n | '%' -> buffer_add_string buf \"%%\"\n | _ -> buffer_add_char buf chr\n\n(* Print a literal string in a buffer, escape all '%' by \"%%\". *)\nlet bprint_string_literal buf str =\n for i = 0 to String.length str - 1 do\n bprint_char_literal buf str.[i]\n done\n\n(******************************************************************************)\n (* Format pretty-printing *)\n\n(* Print a complete format type (an fmtty) in a buffer. *)\nlet rec bprint_fmtty : type a b c d e f g h i j k l .\n buffer -> (a, b, c, d, e, f, g, h, i, j, k, l) fmtty_rel -> unit =\nfun buf fmtty -> match fmtty with\n | Char_ty rest -> buffer_add_string buf \"%c\"; bprint_fmtty buf rest;\n | String_ty rest -> buffer_add_string buf \"%s\"; bprint_fmtty buf rest;\n | Int_ty rest -> buffer_add_string buf \"%i\"; bprint_fmtty buf rest;\n | Int32_ty rest -> buffer_add_string buf \"%li\"; bprint_fmtty buf rest;\n | Nativeint_ty rest -> buffer_add_string buf \"%ni\"; bprint_fmtty buf rest;\n | Int64_ty rest -> buffer_add_string buf \"%Li\"; bprint_fmtty buf rest;\n | Float_ty rest -> buffer_add_string buf \"%f\"; bprint_fmtty buf rest;\n | Bool_ty rest -> buffer_add_string buf \"%B\"; bprint_fmtty buf rest;\n | Alpha_ty rest -> buffer_add_string buf \"%a\"; bprint_fmtty buf rest;\n | Theta_ty rest -> buffer_add_string buf \"%t\"; bprint_fmtty buf rest;\n | Any_ty rest -> buffer_add_string buf \"%?\"; bprint_fmtty buf rest;\n | Reader_ty rest -> buffer_add_string buf \"%r\"; bprint_fmtty buf rest;\n\n | Ignored_reader_ty rest ->\n buffer_add_string buf \"%_r\";\n bprint_fmtty buf rest;\n\n | Format_arg_ty (sub_fmtty, rest) ->\n buffer_add_string buf \"%{\"; bprint_fmtty buf sub_fmtty;\n buffer_add_string buf \"%}\"; bprint_fmtty buf rest;\n | Format_subst_ty (sub_fmtty, _, rest) ->\n buffer_add_string buf \"%(\"; bprint_fmtty buf sub_fmtty;\n buffer_add_string buf \"%)\"; bprint_fmtty buf rest;\n\n | End_of_fmtty -> ()\n\n(***)\n\nlet rec int_of_custom_arity : type a b c .\n (a, b, c) custom_arity -> int =\n function\n | Custom_zero -> 0\n | Custom_succ x -> 1 + int_of_custom_arity x\n\n(* Print a complete format in a buffer. *)\nlet bprint_fmt buf fmt =\n let rec fmtiter : type a b c d e f .\n (a, b, c, d, e, f) fmt -> bool -> unit =\n fun fmt ign_flag -> match fmt with\n | String (pad, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_padding buf pad; buffer_add_char buf 's';\n fmtiter rest false;\n | Caml_string (pad, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_padding buf pad; buffer_add_char buf 'S';\n fmtiter rest false;\n\n | Int (iconv, pad, prec, rest) ->\n bprint_int_fmt buf ign_flag iconv pad prec;\n fmtiter rest false;\n | Int32 (iconv, pad, prec, rest) ->\n bprint_altint_fmt buf ign_flag iconv pad prec 'l';\n fmtiter rest false;\n | Nativeint (iconv, pad, prec, rest) ->\n bprint_altint_fmt buf ign_flag iconv pad prec 'n';\n fmtiter rest false;\n | Int64 (iconv, pad, prec, rest) ->\n bprint_altint_fmt buf ign_flag iconv pad prec 'L';\n fmtiter rest false;\n | Float (fconv, pad, prec, rest) ->\n bprint_float_fmt buf ign_flag fconv pad prec;\n fmtiter rest false;\n\n | Char rest ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf 'c'; fmtiter rest false;\n | Caml_char rest ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf 'C'; fmtiter rest false;\n | Bool (pad, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_padding buf pad; buffer_add_char buf 'B';\n fmtiter rest false;\n | Alpha rest ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf 'a'; fmtiter rest false;\n | Theta rest ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf 't'; fmtiter rest false;\n | Custom (arity, _, rest) ->\n for _i = 1 to int_of_custom_arity arity do\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf '?';\n done;\n fmtiter rest false;\n | Reader rest ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf 'r'; fmtiter rest false;\n | Flush rest ->\n buffer_add_string buf \"%!\";\n fmtiter rest ign_flag;\n\n | String_literal (str, rest) ->\n bprint_string_literal buf str;\n fmtiter rest ign_flag;\n | Char_literal (chr, rest) ->\n bprint_char_literal buf chr;\n fmtiter rest ign_flag;\n\n | Format_arg (pad_opt, fmtty, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_pad_opt buf pad_opt; buffer_add_char buf '{';\n bprint_fmtty buf fmtty; buffer_add_char buf '%'; buffer_add_char buf '}';\n fmtiter rest false;\n | Format_subst (pad_opt, fmtty, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_pad_opt buf pad_opt; buffer_add_char buf '(';\n bprint_fmtty buf fmtty; buffer_add_char buf '%'; buffer_add_char buf ')';\n fmtiter rest false;\n\n | Scan_char_set (width_opt, char_set, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_pad_opt buf width_opt; bprint_char_set buf char_set;\n fmtiter rest false;\n | Scan_get_counter (counter, rest) ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n buffer_add_char buf (char_of_counter counter);\n fmtiter rest false;\n | Scan_next_char rest ->\n buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag;\n bprint_string_literal buf \"0c\"; fmtiter rest false;\n\n | Ignored_param (ign, rest) ->\n let Param_format_EBB fmt' = param_format_of_ignored_format ign rest in\n fmtiter fmt' true;\n\n | Formatting_lit (fmting_lit, rest) ->\n bprint_string_literal buf (string_of_formatting_lit fmting_lit);\n fmtiter rest ign_flag;\n | Formatting_gen (fmting_gen, rest) ->\n begin match fmting_gen with\n | Open_tag (Format (_, str)) ->\n buffer_add_string buf \"@{\"; buffer_add_string buf str\n | Open_box (Format (_, str)) ->\n buffer_add_string buf \"@[\"; buffer_add_string buf str\n end;\n fmtiter rest ign_flag;\n\n | End_of_format -> ()\n\n in fmtiter fmt false\n\n(***)\n\n(* Convert a format to string. *)\nlet string_of_fmt fmt =\n let buf = buffer_create 16 in\n bprint_fmt buf fmt;\n buffer_contents buf\n\n(******************************************************************************)\n (* Type extraction *)\n\ntype (_, _) eq = Refl : ('a, 'a) eq\n\n(* Invariant: this function is the identity on values.\n\n In particular, if (ty1, ty2) have equal values, then\n (trans (symm ty1) ty2) respects the 'trans' precondition. *)\nlet rec symm : type a1 b1 c1 d1 e1 f1 a2 b2 c2 d2 e2 f2 .\n (a1, b1, c1, d1, e1, f1,\n a2, b2, c2, d2, e2, f2) fmtty_rel\n-> (a2, b2, c2, d2, e2, f2,\n a1, b1, c1, d1, e1, f1) fmtty_rel\n= function\n | Char_ty rest -> Char_ty (symm rest)\n | Int_ty rest -> Int_ty (symm rest)\n | Int32_ty rest -> Int32_ty (symm rest)\n | Int64_ty rest -> Int64_ty (symm rest)\n | Nativeint_ty rest -> Nativeint_ty (symm rest)\n | Float_ty rest -> Float_ty (symm rest)\n | Bool_ty rest -> Bool_ty (symm rest)\n | String_ty rest -> String_ty (symm rest)\n | Theta_ty rest -> Theta_ty (symm rest)\n | Alpha_ty rest -> Alpha_ty (symm rest)\n | Any_ty rest -> Any_ty (symm rest)\n | Reader_ty rest -> Reader_ty (symm rest)\n | Ignored_reader_ty rest -> Ignored_reader_ty (symm rest)\n | Format_arg_ty (ty, rest) ->\n Format_arg_ty (ty, symm rest)\n | Format_subst_ty (ty1, ty2, rest) ->\n Format_subst_ty (ty2, ty1, symm rest)\n | End_of_fmtty -> End_of_fmtty\n\nlet rec fmtty_rel_det : type a1 b c d1 e1 f1 a2 d2 e2 f2 .\n (a1, b, c, d1, e1, f1,\n a2, b, c, d2, e2, f2) fmtty_rel ->\n ((f1, f2) eq -> (a1, a2) eq)\n * ((a1, a2) eq -> (f1, f2) eq)\n * ((e1, e2) eq -> (d1, d2) eq)\n * ((d1, d2) eq -> (e1, e2) eq)\n= function\n | End_of_fmtty ->\n (fun Refl -> Refl),\n (fun Refl -> Refl),\n (fun Refl -> Refl),\n (fun Refl -> Refl)\n | Char_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | String_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Int_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Int32_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Int64_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Nativeint_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Float_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Bool_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n\n | Theta_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Alpha_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Any_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Reader_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n (fun Refl -> let Refl = ed Refl in Refl),\n (fun Refl -> let Refl = de Refl in Refl)\n | Ignored_reader_ty rest ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n (fun Refl -> let Refl = ed Refl in Refl),\n (fun Refl -> let Refl = de Refl in Refl)\n | Format_arg_ty (_ty, rest) ->\n let fa, af, ed, de = fmtty_rel_det rest in\n (fun Refl -> let Refl = fa Refl in Refl),\n (fun Refl -> let Refl = af Refl in Refl),\n ed, de\n | Format_subst_ty (ty1, ty2, rest) ->\n let fa, af, ed, de = fmtty_rel_det rest in\n let ty = trans (symm ty1) ty2 in\n let ag, ga, dj, jd = fmtty_rel_det ty in\n (fun Refl -> let Refl = fa Refl in let Refl = ag Refl in Refl),\n (fun Refl -> let Refl = ga Refl in let Refl = af Refl in Refl),\n (fun Refl -> let Refl = ed Refl in let Refl = dj Refl in Refl),\n (fun Refl -> let Refl = jd Refl in let Refl = de Refl in Refl)\n\n(* Precondition: we assume that the two fmtty_rel arguments have equal\n values (at possibly distinct types); this invariant comes from the way\n fmtty_rel witnesses are produced by the type-checker\n\n The code below uses (assert false) when this assumption is broken. The\n code pattern is the following:\n\n | Foo x, Foo y ->\n (* case where indeed both values\n start with constructor Foo *)\n | Foo _, _\n | _, Foo _ ->\n (* different head constructors: broken precondition *)\n assert false\n*)\nand trans : type\n a1 b1 c1 d1 e1 f1\n a2 b2 c2 d2 e2 f2\n a3 b3 c3 d3 e3 f3\n.\n (a1, b1, c1, d1, e1, f1,\n a2, b2, c2, d2, e2, f2) fmtty_rel\n-> (a2, b2, c2, d2, e2, f2,\n a3, b3, c3, d3, e3, f3) fmtty_rel\n-> (a1, b1, c1, d1, e1, f1,\n a3, b3, c3, d3, e3, f3) fmtty_rel\n= fun ty1 ty2 -> match ty1, ty2 with\n | Char_ty rest1, Char_ty rest2 -> Char_ty (trans rest1 rest2)\n | String_ty rest1, String_ty rest2 -> String_ty (trans rest1 rest2)\n | Bool_ty rest1, Bool_ty rest2 -> Bool_ty (trans rest1 rest2)\n | Int_ty rest1, Int_ty rest2 -> Int_ty (trans rest1 rest2)\n | Int32_ty rest1, Int32_ty rest2 -> Int32_ty (trans rest1 rest2)\n | Int64_ty rest1, Int64_ty rest2 -> Int64_ty (trans rest1 rest2)\n | Nativeint_ty rest1, Nativeint_ty rest2 -> Nativeint_ty (trans rest1 rest2)\n | Float_ty rest1, Float_ty rest2 -> Float_ty (trans rest1 rest2)\n\n | Alpha_ty rest1, Alpha_ty rest2 -> Alpha_ty (trans rest1 rest2)\n | Alpha_ty _, _ -> assert false\n | _, Alpha_ty _ -> assert false\n\n | Theta_ty rest1, Theta_ty rest2 -> Theta_ty (trans rest1 rest2)\n | Theta_ty _, _ -> assert false\n | _, Theta_ty _ -> assert false\n\n | Any_ty rest1, Any_ty rest2 -> Any_ty (trans rest1 rest2)\n | Any_ty _, _ -> assert false\n | _, Any_ty _ -> assert false\n\n | Reader_ty rest1, Reader_ty rest2 -> Reader_ty (trans rest1 rest2)\n | Reader_ty _, _ -> assert false\n | _, Reader_ty _ -> assert false\n\n | Ignored_reader_ty rest1, Ignored_reader_ty rest2 ->\n Ignored_reader_ty (trans rest1 rest2)\n | Ignored_reader_ty _, _ -> assert false\n | _, Ignored_reader_ty _ -> assert false\n\n | Format_arg_ty (ty1, rest1), Format_arg_ty (ty2, rest2) ->\n Format_arg_ty (trans ty1 ty2, trans rest1 rest2)\n | Format_arg_ty _, _ -> assert false\n | _, Format_arg_ty _ -> assert false\n\n | Format_subst_ty (ty11, ty12, rest1),\n Format_subst_ty (ty21, ty22, rest2) ->\n let ty = trans (symm ty12) ty21 in\n let _, f2, _, f4 = fmtty_rel_det ty in\n let Refl = f2 Refl in\n let Refl = f4 Refl in\n Format_subst_ty (ty11, ty22, trans rest1 rest2)\n | Format_subst_ty _, _ -> assert false\n | _, Format_subst_ty _ -> assert false\n\n | End_of_fmtty, End_of_fmtty -> End_of_fmtty\n | End_of_fmtty, _ -> assert false\n | _, End_of_fmtty -> assert false\n\nlet rec fmtty_of_formatting_gen : type a b c d e f .\n (a, b, c, d, e, f) formatting_gen ->\n (a, b, c, d, e, f) fmtty =\nfun formatting_gen -> match formatting_gen with\n | Open_tag (Format (fmt, _)) -> fmtty_of_fmt fmt\n | Open_box (Format (fmt, _)) -> fmtty_of_fmt fmt\n\n(* Extract the type representation (an fmtty) of a format. *)\nand fmtty_of_fmt : type a b c d e f .\n (a, b, c, d, e, f) fmt -> (a, b, c, d, e, f) fmtty =\nfun fmtty -> match fmtty with\n | String (pad, rest) ->\n fmtty_of_padding_fmtty pad (String_ty (fmtty_of_fmt rest))\n | Caml_string (pad, rest) ->\n fmtty_of_padding_fmtty pad (String_ty (fmtty_of_fmt rest))\n\n | Int (_, pad, prec, rest) ->\n let ty_rest = fmtty_of_fmt rest in\n let prec_ty = fmtty_of_precision_fmtty prec (Int_ty ty_rest) in\n fmtty_of_padding_fmtty pad prec_ty\n | Int32 (_, pad, prec, rest) ->\n let ty_rest = fmtty_of_fmt rest in\n let prec_ty = fmtty_of_precision_fmtty prec (Int32_ty ty_rest) in\n fmtty_of_padding_fmtty pad prec_ty\n | Nativeint (_, pad, prec, rest) ->\n let ty_rest = fmtty_of_fmt rest in\n let prec_ty = fmtty_of_precision_fmtty prec (Nativeint_ty ty_rest) in\n fmtty_of_padding_fmtty pad prec_ty\n | Int64 (_, pad, prec, rest) ->\n let ty_rest = fmtty_of_fmt rest in\n let prec_ty = fmtty_of_precision_fmtty prec (Int64_ty ty_rest) in\n fmtty_of_padding_fmtty pad prec_ty\n | Float (_, pad, prec, rest) ->\n let ty_rest = fmtty_of_fmt rest in\n let prec_ty = fmtty_of_precision_fmtty prec (Float_ty ty_rest) in\n fmtty_of_padding_fmtty pad prec_ty\n\n | Char rest -> Char_ty (fmtty_of_fmt rest)\n | Caml_char rest -> Char_ty (fmtty_of_fmt rest)\n | Bool (pad, rest) ->\n fmtty_of_padding_fmtty pad (Bool_ty (fmtty_of_fmt rest))\n | Alpha rest -> Alpha_ty (fmtty_of_fmt rest)\n | Theta rest -> Theta_ty (fmtty_of_fmt rest)\n | Custom (arity, _, rest) -> fmtty_of_custom arity (fmtty_of_fmt rest)\n | Reader rest -> Reader_ty (fmtty_of_fmt rest)\n\n | Format_arg (_, ty, rest) ->\n Format_arg_ty (ty, fmtty_of_fmt rest)\n | Format_subst (_, ty, rest) ->\n Format_subst_ty (ty, ty, fmtty_of_fmt rest)\n\n | Flush rest -> fmtty_of_fmt rest\n | String_literal (_, rest) -> fmtty_of_fmt rest\n | Char_literal (_, rest) -> fmtty_of_fmt rest\n\n | Scan_char_set (_, _, rest) -> String_ty (fmtty_of_fmt rest)\n | Scan_get_counter (_, rest) -> Int_ty (fmtty_of_fmt rest)\n | Scan_next_char rest -> Char_ty (fmtty_of_fmt rest)\n | Ignored_param (ign, rest) -> fmtty_of_ignored_format ign rest\n | Formatting_lit (_, rest) -> fmtty_of_fmt rest\n | Formatting_gen (fmting_gen, rest) ->\n concat_fmtty (fmtty_of_formatting_gen fmting_gen) (fmtty_of_fmt rest)\n\n | End_of_format -> End_of_fmtty\n\nand fmtty_of_custom : type x y a b c d e f .\n (a, x, y) custom_arity -> (a, b, c, d, e, f) fmtty ->\n (y, b, c, d, e, f) fmtty =\nfun arity fmtty -> match arity with\n | Custom_zero -> fmtty\n | Custom_succ arity -> Any_ty (fmtty_of_custom arity fmtty)\n\n(* Extract the fmtty of an ignored parameter followed by the rest of\n the format. *)\nand fmtty_of_ignored_format : type x y a b c d e f .\n (a, b, c, d, y, x) ignored ->\n (x, b, c, y, e, f) fmt ->\n (a, b, c, d, e, f) fmtty =\nfun ign fmt -> match ign with\n | Ignored_char -> fmtty_of_fmt fmt\n | Ignored_caml_char -> fmtty_of_fmt fmt\n | Ignored_string _ -> fmtty_of_fmt fmt\n | Ignored_caml_string _ -> fmtty_of_fmt fmt\n | Ignored_int (_, _) -> fmtty_of_fmt fmt\n | Ignored_int32 (_, _) -> fmtty_of_fmt fmt\n | Ignored_nativeint (_, _) -> fmtty_of_fmt fmt\n | Ignored_int64 (_, _) -> fmtty_of_fmt fmt\n | Ignored_float (_, _) -> fmtty_of_fmt fmt\n | Ignored_bool _ -> fmtty_of_fmt fmt\n | Ignored_format_arg _ -> fmtty_of_fmt fmt\n | Ignored_format_subst (_, fmtty) -> concat_fmtty fmtty (fmtty_of_fmt fmt)\n | Ignored_reader -> Ignored_reader_ty (fmtty_of_fmt fmt)\n | Ignored_scan_char_set _ -> fmtty_of_fmt fmt\n | Ignored_scan_get_counter _ -> fmtty_of_fmt fmt\n | Ignored_scan_next_char -> fmtty_of_fmt fmt\n\n(* Add an Int_ty node if padding is taken as an extra argument (ex: \"%*s\"). *)\nand fmtty_of_padding_fmtty : type x a b c d e f .\n (x, a) padding -> (a, b, c, d, e, f) fmtty -> (x, b, c, d, e, f) fmtty =\n fun pad fmtty -> match pad with\n | No_padding -> fmtty\n | Lit_padding _ -> fmtty\n | Arg_padding _ -> Int_ty fmtty\n\n(* Add an Int_ty node if precision is taken as an extra argument (ex: \"%.*f\").*)\nand fmtty_of_precision_fmtty : type x a b c d e f .\n (x, a) precision -> (a, b, c, d, e, f) fmtty -> (x, b, c, d, e, f) fmtty =\n fun prec fmtty -> match prec with\n | No_precision -> fmtty\n | Lit_precision _ -> fmtty\n | Arg_precision -> Int_ty fmtty\n\n(******************************************************************************)\n (* Format typing *)\n\n(* Exception raised when a format does not match a given format type. *)\nexception Type_mismatch\n\n(* Type a padding. *)\n(* Take an Int_ty from the fmtty if the integer should be kept as argument. *)\n(* Raise Type_mismatch in case of type mismatch. *)\nlet type_padding : type a b c d e f x y .\n (x, y) padding -> (a, b, c, d, e, f) fmtty ->\n (a, b, c, d, e, f) padding_fmtty_ebb =\nfun pad fmtty -> match pad, fmtty with\n | No_padding, _ -> Padding_fmtty_EBB (No_padding, fmtty)\n | Lit_padding (padty, w), _ -> Padding_fmtty_EBB (Lit_padding (padty,w),fmtty)\n | Arg_padding padty, Int_ty rest -> Padding_fmtty_EBB (Arg_padding padty,rest)\n | _ -> raise Type_mismatch\n\n(* Convert a (upadding, uprecision) to a (padding, precision). *)\n(* Take one or two Int_ty from the fmtty if needed. *)\n(* Raise Type_mismatch in case of type mismatch. *)\nlet type_padprec : type a b c d e f x y z .\n (x, y) padding -> (y, z) precision -> (a, b, c, d, e, f) fmtty ->\n (a, b, c, d, e, f) padprec_fmtty_ebb =\nfun pad prec fmtty -> match prec, type_padding pad fmtty with\n | No_precision, Padding_fmtty_EBB (pad, rest) ->\n Padprec_fmtty_EBB (pad, No_precision, rest)\n | Lit_precision p, Padding_fmtty_EBB (pad, rest) ->\n Padprec_fmtty_EBB (pad, Lit_precision p, rest)\n | Arg_precision, Padding_fmtty_EBB (pad, Int_ty rest) ->\n Padprec_fmtty_EBB (pad, Arg_precision, rest)\n | _, Padding_fmtty_EBB (_, _) -> raise Type_mismatch\n\n(* Type a format according to an fmtty. *)\n(* If typing succeed, generate a copy of the format with the same\n type parameters as the fmtty. *)\n(* Raise [Failure] with an error message in case of type mismatch. *)\nlet rec type_format :\n type a1 b1 c1 d1 e1 f1\n a2 b2 c2 d2 e2 f2 .\n (a1, b1, c1, d1, e1, f1) fmt\n -> (a2, b2, c2, d2, e2, f2) fmtty\n -> (a2, b2, c2, d2, e2, f2) fmt\n= fun fmt fmtty -> match type_format_gen fmt fmtty with\n | Fmt_fmtty_EBB (fmt', End_of_fmtty) -> fmt'\n | _ -> raise Type_mismatch\n\nand type_format_gen :\n type a1 b1 c1 d1 e1 f1\n a2 b2 c2 d2 e2 f2 .\n (a1, b1, c1, d1, e1, f1) fmt\n -> (a2, b2, c2, d2, e2, f2) fmtty\n -> (a2, b2, c2, d2, e2, f2) fmt_fmtty_ebb\n= fun fmt fmtty -> match fmt, fmtty with\n | Char fmt_rest, Char_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Char fmt', fmtty')\n | Caml_char fmt_rest, Char_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Caml_char fmt', fmtty')\n | String (pad, fmt_rest), _ -> (\n match type_padding pad fmtty with\n | Padding_fmtty_EBB (pad, String_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (String (pad, fmt'), fmtty')\n | Padding_fmtty_EBB (_, _) -> raise Type_mismatch\n )\n | Caml_string (pad, fmt_rest), _ -> (\n match type_padding pad fmtty with\n | Padding_fmtty_EBB (pad, String_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Caml_string (pad, fmt'), fmtty')\n | Padding_fmtty_EBB (_, _) -> raise Type_mismatch\n )\n | Int (iconv, pad, prec, fmt_rest), _ -> (\n match type_padprec pad prec fmtty with\n | Padprec_fmtty_EBB (pad, prec, Int_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Int (iconv, pad, prec, fmt'), fmtty')\n | Padprec_fmtty_EBB (_, _, _) -> raise Type_mismatch\n )\n | Int32 (iconv, pad, prec, fmt_rest), _ -> (\n match type_padprec pad prec fmtty with\n | Padprec_fmtty_EBB (pad, prec, Int32_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Int32 (iconv, pad, prec, fmt'), fmtty')\n | Padprec_fmtty_EBB (_, _, _) -> raise Type_mismatch\n )\n | Nativeint (iconv, pad, prec, fmt_rest), _ -> (\n match type_padprec pad prec fmtty with\n | Padprec_fmtty_EBB (pad, prec, Nativeint_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Nativeint (iconv, pad, prec, fmt'), fmtty')\n | Padprec_fmtty_EBB (_, _, _) -> raise Type_mismatch\n )\n | Int64 (iconv, pad, prec, fmt_rest), _ -> (\n match type_padprec pad prec fmtty with\n | Padprec_fmtty_EBB (pad, prec, Int64_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Int64 (iconv, pad, prec, fmt'), fmtty')\n | Padprec_fmtty_EBB (_, _, _) -> raise Type_mismatch\n )\n | Float (fconv, pad, prec, fmt_rest), _ -> (\n match type_padprec pad prec fmtty with\n | Padprec_fmtty_EBB (pad, prec, Float_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Float (fconv, pad, prec, fmt'), fmtty')\n | Padprec_fmtty_EBB (_, _, _) -> raise Type_mismatch\n )\n | Bool (pad, fmt_rest), _ -> (\n match type_padding pad fmtty with\n | Padding_fmtty_EBB (pad, Bool_ty fmtty_rest) ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Bool (pad, fmt'), fmtty')\n | Padding_fmtty_EBB (_, _) -> raise Type_mismatch\n )\n | Flush fmt_rest, fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Flush fmt', fmtty')\n\n | String_literal (str, fmt_rest), fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (String_literal (str, fmt'), fmtty')\n | Char_literal (chr, fmt_rest), fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Char_literal (chr, fmt'), fmtty')\n\n | Format_arg (pad_opt, sub_fmtty, fmt_rest),\n Format_arg_ty (sub_fmtty', fmtty_rest) ->\n if Fmtty_EBB sub_fmtty <> Fmtty_EBB sub_fmtty' then raise Type_mismatch;\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Format_arg (pad_opt, sub_fmtty', fmt'), fmtty')\n | Format_subst (pad_opt, sub_fmtty, fmt_rest),\n Format_subst_ty (sub_fmtty1, _sub_fmtty2, fmtty_rest) ->\n if Fmtty_EBB (erase_rel sub_fmtty) <> Fmtty_EBB (erase_rel sub_fmtty1) then\n raise Type_mismatch;\n let Fmt_fmtty_EBB (fmt', fmtty') =\n type_format_gen fmt_rest (erase_rel fmtty_rest)\n in\n Fmt_fmtty_EBB (Format_subst (pad_opt, sub_fmtty1, fmt'), fmtty')\n (* Printf and Format specific constructors: *)\n | Alpha fmt_rest, Alpha_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Alpha fmt', fmtty')\n | Theta fmt_rest, Theta_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Theta fmt', fmtty')\n\n (* Format specific constructors: *)\n | Formatting_lit (formatting_lit, fmt_rest), fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Formatting_lit (formatting_lit, fmt'), fmtty')\n | Formatting_gen (formatting_gen, fmt_rest), fmtty_rest ->\n type_formatting_gen formatting_gen fmt_rest fmtty_rest\n\n (* Scanf specific constructors: *)\n | Reader fmt_rest, Reader_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Reader fmt', fmtty')\n | Scan_char_set (width_opt, char_set, fmt_rest), String_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Scan_char_set (width_opt, char_set, fmt'), fmtty')\n | Scan_get_counter (counter, fmt_rest), Int_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt_rest fmtty_rest in\n Fmt_fmtty_EBB (Scan_get_counter (counter, fmt'), fmtty')\n | Ignored_param (ign, rest), fmtty_rest ->\n type_ignored_param ign rest fmtty_rest\n\n | End_of_format, fmtty_rest -> Fmt_fmtty_EBB (End_of_format, fmtty_rest)\n\n | _ -> raise Type_mismatch\n\nand type_formatting_gen : type a1 a3 b1 b3 c1 c3 d1 d3 e1 e2 e3 f1 f2 f3 .\n (a1, b1, c1, d1, e1, f1) formatting_gen ->\n (f1, b1, c1, e1, e2, f2) fmt ->\n (a3, b3, c3, d3, e3, f3) fmtty ->\n (a3, b3, c3, d3, e3, f3) fmt_fmtty_ebb =\nfun formatting_gen fmt0 fmtty0 -> match formatting_gen with\n | Open_tag (Format (fmt1, str)) ->\n let Fmt_fmtty_EBB (fmt2, fmtty2) = type_format_gen fmt1 fmtty0 in\n let Fmt_fmtty_EBB (fmt3, fmtty3) = type_format_gen fmt0 fmtty2 in\n Fmt_fmtty_EBB (Formatting_gen (Open_tag (Format (fmt2, str)), fmt3), fmtty3)\n | Open_box (Format (fmt1, str)) ->\n let Fmt_fmtty_EBB (fmt2, fmtty2) = type_format_gen fmt1 fmtty0 in\n let Fmt_fmtty_EBB (fmt3, fmtty3) = type_format_gen fmt0 fmtty2 in\n Fmt_fmtty_EBB (Formatting_gen (Open_box (Format (fmt2, str)), fmt3), fmtty3)\n\n(* Type an Ignored_param node according to an fmtty. *)\nand type_ignored_param : type p q x y z t u v a b c d e f .\n (x, y, z, t, q, p) ignored ->\n (p, y, z, q, u, v) fmt ->\n (a, b, c, d, e, f) fmtty ->\n (a, b, c, d, e, f) fmt_fmtty_ebb =\nfun ign fmt fmtty -> match ign with\n | Ignored_char as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_caml_char as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_string _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_caml_string _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_int _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_int32 _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_nativeint _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_int64 _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_float _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_bool _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_scan_char_set _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_scan_get_counter _ as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_scan_next_char as ign' -> type_ignored_param_one ign' fmt fmtty\n | Ignored_format_arg (pad_opt, sub_fmtty) ->\n type_ignored_param_one (Ignored_format_arg (pad_opt, sub_fmtty)) fmt fmtty\n | Ignored_format_subst (pad_opt, sub_fmtty) ->\n let Fmtty_fmt_EBB (sub_fmtty', Fmt_fmtty_EBB (fmt', fmtty')) =\n type_ignored_format_substitution sub_fmtty fmt fmtty in\n Fmt_fmtty_EBB (Ignored_param (Ignored_format_subst (pad_opt, sub_fmtty'),\n fmt'),\n fmtty')\n | Ignored_reader -> (\n match fmtty with\n | Ignored_reader_ty fmtty_rest ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt fmtty_rest in\n Fmt_fmtty_EBB (Ignored_param (Ignored_reader, fmt'), fmtty')\n | _ -> raise Type_mismatch\n )\n\nand type_ignored_param_one : type a1 a2 b1 b2 c1 c2 d1 d2 e1 e2 f1 f2 .\n (a2, b2, c2, d2, d2, a2) ignored ->\n (a1, b1, c1, d1, e1, f1) fmt ->\n (a2, b2, c2, d2, e2, f2) fmtty ->\n (a2, b2, c2, d2, e2, f2) fmt_fmtty_ebb\n= fun ign fmt fmtty ->\n let Fmt_fmtty_EBB (fmt', fmtty') = type_format_gen fmt fmtty in\n Fmt_fmtty_EBB (Ignored_param (ign, fmt'), fmtty')\n\n(* Typing of the complex case: \"%_(...%)\". *)\nand type_ignored_format_substitution : type w x y z p s t u a b c d e f .\n (w, x, y, z, s, p) fmtty ->\n (p, x, y, s, t, u) fmt ->\n (a, b, c, d, e, f) fmtty -> (a, b, c, d, e, f) fmtty_fmt_ebb =\nfun sub_fmtty fmt fmtty -> match sub_fmtty, fmtty with\n | Char_ty sub_fmtty_rest, Char_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Char_ty sub_fmtty_rest', fmt')\n | String_ty sub_fmtty_rest, String_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (String_ty sub_fmtty_rest', fmt')\n | Int_ty sub_fmtty_rest, Int_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Int_ty sub_fmtty_rest', fmt')\n | Int32_ty sub_fmtty_rest, Int32_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Int32_ty sub_fmtty_rest', fmt')\n | Nativeint_ty sub_fmtty_rest, Nativeint_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Nativeint_ty sub_fmtty_rest', fmt')\n | Int64_ty sub_fmtty_rest, Int64_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Int64_ty sub_fmtty_rest', fmt')\n | Float_ty sub_fmtty_rest, Float_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Float_ty sub_fmtty_rest', fmt')\n | Bool_ty sub_fmtty_rest, Bool_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Bool_ty sub_fmtty_rest', fmt')\n | Alpha_ty sub_fmtty_rest, Alpha_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Alpha_ty sub_fmtty_rest', fmt')\n | Theta_ty sub_fmtty_rest, Theta_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Theta_ty sub_fmtty_rest', fmt')\n | Reader_ty sub_fmtty_rest, Reader_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Reader_ty sub_fmtty_rest', fmt')\n | Ignored_reader_ty sub_fmtty_rest, Ignored_reader_ty fmtty_rest ->\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Ignored_reader_ty sub_fmtty_rest', fmt')\n\n | Format_arg_ty (sub2_fmtty, sub_fmtty_rest),\n Format_arg_ty (sub2_fmtty', fmtty_rest) ->\n if Fmtty_EBB sub2_fmtty <> Fmtty_EBB sub2_fmtty' then raise Type_mismatch;\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution sub_fmtty_rest fmt fmtty_rest in\n Fmtty_fmt_EBB (Format_arg_ty (sub2_fmtty', sub_fmtty_rest'), fmt')\n | Format_subst_ty (sub1_fmtty, sub2_fmtty, sub_fmtty_rest),\n Format_subst_ty (sub1_fmtty', sub2_fmtty', fmtty_rest) ->\n (* TODO define Fmtty_rel_EBB to remove those erase_rel *)\n if Fmtty_EBB (erase_rel sub1_fmtty) <> Fmtty_EBB (erase_rel sub1_fmtty')\n then raise Type_mismatch;\n if Fmtty_EBB (erase_rel sub2_fmtty) <> Fmtty_EBB (erase_rel sub2_fmtty')\n then raise Type_mismatch;\n let sub_fmtty' = trans (symm sub1_fmtty') sub2_fmtty' in\n let _, f2, _, f4 = fmtty_rel_det sub_fmtty' in\n let Refl = f2 Refl in\n let Refl = f4 Refl in\n let Fmtty_fmt_EBB (sub_fmtty_rest', fmt') =\n type_ignored_format_substitution (erase_rel sub_fmtty_rest) fmt fmtty_rest\n in\n Fmtty_fmt_EBB (Format_subst_ty (sub1_fmtty', sub2_fmtty',\n symm sub_fmtty_rest'),\n fmt')\n | End_of_fmtty, fmtty ->\n Fmtty_fmt_EBB (End_of_fmtty, type_format_gen fmt fmtty)\n | _ -> raise Type_mismatch\n\n(* This implementation of `recast` is a bit disappointing. The\n invariant provided by the type are very strong: the input format's\n type is in relation to the output type's as witnessed by the\n fmtty_rel argument. One would at first expect this function to be\n total, and implementable by exhaustive pattern matching. Instead,\n we reuse the highly partial and much less well-defined function\n `type_format` that has lost all knowledge of the correspondence\n between the argument's types.\n\n Besides the fact that this function reuses a lot of the\n `type_format` logic (eg.: seeing Int_ty in the fmtty parameter does\n not let you match on Int only, as you may in fact have Float\n (Arg_padding, ...) (\"%.*d\") beginning with an Int_ty), it is also\n a partial function, because the typing information in a format is\n not quite enough to reconstruct it unambiguously. For example, the\n format types of \"%d%_r\" and \"%_r%d\" have the same format6\n parameters, but they are not at all exchangeable, and putting one\n in place of the other must result in a dynamic failure.\n\n Given that:\n - we'd have to duplicate a lot of non-trivial typing logic from type_format\n - this wouldn't even eliminate (all) the dynamic failures\n we decided to just reuse type_format directly for now.\n*)\nlet recast :\n type a1 b1 c1 d1 e1 f1\n a2 b2 c2 d2 e2 f2\n .\n (a1, b1, c1, d1, e1, f1) fmt\n -> (a1, b1, c1, d1, e1, f1,\n a2, b2, c2, d2, e2, f2) fmtty_rel\n -> (a2, b2, c2, d2, e2, f2) fmt\n= fun fmt fmtty ->\n type_format fmt (erase_rel (symm fmtty))\n\n(******************************************************************************)\n (* Printing tools *)\n\n(* Add padding spaces around a string. *)\nlet fix_padding padty width str =\n let len = String.length str in\n let width, padty =\n abs width,\n (* while literal padding widths are always non-negative,\n dynamically-set widths (Arg_padding, eg. %*d) may be negative;\n we interpret those as specifying a padding-to-the-left; this\n means that '0' may get dropped even if it was explicitly set,\n but:\n - this is what the legacy implementation does, and\n we preserve compatibility if possible\n - we could only signal this issue by failing at runtime,\n which is not very nice... *)\n if width < 0 then Left else padty in\n if width <= len then str else\n let res = Bytes.make width (if padty = Zeros then '0' else ' ') in\n begin match padty with\n | Left -> String.blit str 0 res 0 len\n | Right -> String.blit str 0 res (width - len) len\n | Zeros when len > 0 && (str.[0] = '+' || str.[0] = '-' || str.[0] = ' ') ->\n Bytes.set res 0 str.[0];\n String.blit str 1 res (width - len + 1) (len - 1)\n | Zeros when len > 1 && str.[0] = '0' && (str.[1] = 'x' || str.[1] = 'X') ->\n Bytes.set res 1 str.[1];\n String.blit str 2 res (width - len + 2) (len - 2)\n | Zeros ->\n String.blit str 0 res (width - len) len\n end;\n Bytes.unsafe_to_string res\n\n(* Add '0' padding to int, int32, nativeint or int64 string representation. *)\nlet fix_int_precision prec str =\n let prec = abs prec in\n let len = String.length str in\n match str.[0] with\n | ('+' | '-' | ' ') as c when prec + 1 > len ->\n let res = Bytes.make (prec + 1) '0' in\n Bytes.set res 0 c;\n String.blit str 1 res (prec - len + 2) (len - 1);\n Bytes.unsafe_to_string res\n | '0' when prec + 2 > len && len > 1 && (str.[1] = 'x' || str.[1] = 'X') ->\n let res = Bytes.make (prec + 2) '0' in\n Bytes.set res 1 str.[1];\n String.blit str 2 res (prec - len + 4) (len - 2);\n Bytes.unsafe_to_string res\n | '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' when prec > len ->\n let res = Bytes.make prec '0' in\n String.blit str 0 res (prec - len) len;\n Bytes.unsafe_to_string res\n | _ ->\n str\n\n(* Escape a string according to the OCaml lexing convention. *)\nlet string_to_caml_string str =\n let str = String.escaped str in\n let l = String.length str in\n let res = Bytes.make (l + 2) '\\\"' in\n String.unsafe_blit str 0 res 1 l;\n Bytes.unsafe_to_string res\n\n(* Generate the format_int/int32/nativeint/int64 first argument\n from an int_conv. *)\nlet format_of_iconv = function\n | Int_d | Int_Cd -> \"%d\" | Int_pd -> \"%+d\" | Int_sd -> \"% d\"\n | Int_i | Int_Ci -> \"%i\" | Int_pi -> \"%+i\" | Int_si -> \"% i\"\n | Int_x -> \"%x\" | Int_Cx -> \"%#x\"\n | Int_X -> \"%X\" | Int_CX -> \"%#X\"\n | Int_o -> \"%o\" | Int_Co -> \"%#o\"\n | Int_u | Int_Cu -> \"%u\"\n\nlet format_of_iconvL = function\n | Int_d | Int_Cd -> \"%Ld\" | Int_pd -> \"%+Ld\" | Int_sd -> \"% Ld\"\n | Int_i | Int_Ci -> \"%Li\" | Int_pi -> \"%+Li\" | Int_si -> \"% Li\"\n | Int_x -> \"%Lx\" | Int_Cx -> \"%#Lx\"\n | Int_X -> \"%LX\" | Int_CX -> \"%#LX\"\n | Int_o -> \"%Lo\" | Int_Co -> \"%#Lo\"\n | Int_u | Int_Cu -> \"%Lu\"\n\nlet format_of_iconvl = function\n | Int_d | Int_Cd -> \"%ld\" | Int_pd -> \"%+ld\" | Int_sd -> \"% ld\"\n | Int_i | Int_Ci -> \"%li\" | Int_pi -> \"%+li\" | Int_si -> \"% li\"\n | Int_x -> \"%lx\" | Int_Cx -> \"%#lx\"\n | Int_X -> \"%lX\" | Int_CX -> \"%#lX\"\n | Int_o -> \"%lo\" | Int_Co -> \"%#lo\"\n | Int_u | Int_Cu -> \"%lu\"\n\nlet format_of_iconvn = function\n | Int_d | Int_Cd -> \"%nd\" | Int_pd -> \"%+nd\" | Int_sd -> \"% nd\"\n | Int_i | Int_Ci -> \"%ni\" | Int_pi -> \"%+ni\" | Int_si -> \"% ni\"\n | Int_x -> \"%nx\" | Int_Cx -> \"%#nx\"\n | Int_X -> \"%nX\" | Int_CX -> \"%#nX\"\n | Int_o -> \"%no\" | Int_Co -> \"%#no\"\n | Int_u | Int_Cu -> \"%nu\"\n\n(* Generate the format_float first argument from a float_conv. *)\nlet format_of_fconv fconv prec =\n let prec = abs prec in\n let symb = char_of_fconv ~cF:'g' fconv in\n let buf = buffer_create 16 in\n buffer_add_char buf '%';\n bprint_fconv_flag buf fconv;\n buffer_add_char buf '.';\n buffer_add_string buf (Int.to_string prec);\n buffer_add_char buf symb;\n buffer_contents buf\n\nlet transform_int_alt iconv s =\n match iconv with\n | Int_Cd | Int_Ci | Int_Cu ->\n let digits =\n let n = ref 0 in\n for i = 0 to String.length s - 1 do\n match String.unsafe_get s i with\n | '0'..'9' -> incr n\n | _ -> ()\n done;\n !n\n in\n let buf = Bytes.create (String.length s + (digits - 1) / 3) in\n let pos = ref 0 in\n let put c = Bytes.set buf !pos c; incr pos in\n let left = ref ((digits - 1) mod 3 + 1) in\n for i = 0 to String.length s - 1 do\n match String.unsafe_get s i with\n | '0'..'9' as c ->\n if !left = 0 then (put '_'; left := 3); decr left; put c\n | c -> put c\n done;\n Bytes.unsafe_to_string buf\n | _ -> s\n\n(* Convert an integer to a string according to a conversion. *)\nlet convert_int iconv n =\n transform_int_alt iconv (format_int (format_of_iconv iconv) n)\nlet convert_int32 iconv n =\n transform_int_alt iconv (format_int32 (format_of_iconvl iconv) n)\nlet convert_nativeint iconv n =\n transform_int_alt iconv (format_nativeint (format_of_iconvn iconv) n)\nlet convert_int64 iconv n =\n transform_int_alt iconv (format_int64 (format_of_iconvL iconv) n)\n\n(* Convert a float to string. *)\n(* Fix special case of \"OCaml float format\". *)\nlet convert_float fconv prec x =\n let hex () =\n let sign =\n match fst fconv with\n | Float_flag_p -> '+'\n | Float_flag_s -> ' '\n | _ -> '-' in\n hexstring_of_float x prec sign in\n let add_dot_if_needed str =\n let len = String.length str in\n let rec is_valid i =\n if i = len then false else\n match str.[i] with\n | '.' | 'e' | 'E' -> true\n | _ -> is_valid (i + 1) in\n if is_valid 0 then str else str ^ \".\" in\n let caml_special_val str = match classify_float x with\n | FP_normal | FP_subnormal | FP_zero -> str\n | FP_infinite -> if x < 0.0 then \"neg_infinity\" else \"infinity\"\n | FP_nan -> \"nan\" in\n match snd fconv with\n | Float_h -> hex ()\n | Float_H -> String.uppercase_ascii (hex ())\n | Float_CF -> caml_special_val (hex ())\n | Float_F ->\n let str = format_float (format_of_fconv fconv prec) x in\n caml_special_val (add_dot_if_needed str)\n | Float_f | Float_e | Float_E | Float_g | Float_G ->\n format_float (format_of_fconv fconv prec) x\n\n(* Convert a char to a string according to the OCaml lexical convention. *)\nlet format_caml_char c =\n let str = Char.escaped c in\n let l = String.length str in\n let res = Bytes.make (l + 2) '\\'' in\n String.unsafe_blit str 0 res 1 l;\n Bytes.unsafe_to_string res\n\n(* Convert a format type to string *)\nlet string_of_fmtty fmtty =\n let buf = buffer_create 16 in\n bprint_fmtty buf fmtty;\n buffer_contents buf\n\n(******************************************************************************)\n (* Generic printing function *)\n\n(* Make a generic printing function. *)\n(* Used to generate Printf and Format printing functions. *)\n(* Parameters:\n k: a continuation finally applied to the output stream and the accumulator.\n o: the output stream (see k, %a and %t).\n acc: rev list of printing entities (string, char, flush, formatting, ...).\n fmt: the format. *)\nlet rec make_printf : type a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, e, f) fmt -> a =\nfun k acc fmt -> match fmt with\n | Char rest ->\n fun c ->\n let new_acc = Acc_data_char (acc, c) in\n make_printf k new_acc rest\n | Caml_char rest ->\n fun c ->\n let new_acc = Acc_data_string (acc, format_caml_char c) in\n make_printf k new_acc rest\n | String (pad, rest) ->\n make_padding k acc rest pad (fun str -> str)\n | Caml_string (pad, rest) ->\n make_padding k acc rest pad string_to_caml_string\n | Int (iconv, pad, prec, rest) ->\n make_int_padding_precision k acc rest pad prec convert_int iconv\n | Int32 (iconv, pad, prec, rest) ->\n make_int_padding_precision k acc rest pad prec convert_int32 iconv\n | Nativeint (iconv, pad, prec, rest) ->\n make_int_padding_precision k acc rest pad prec convert_nativeint iconv\n | Int64 (iconv, pad, prec, rest) ->\n make_int_padding_precision k acc rest pad prec convert_int64 iconv\n | Float (fconv, pad, prec, rest) ->\n make_float_padding_precision k acc rest pad prec fconv\n | Bool (pad, rest) ->\n make_padding k acc rest pad string_of_bool\n | Alpha rest ->\n fun f x -> make_printf k (Acc_delay (acc, fun o -> f o x)) rest\n | Theta rest ->\n fun f -> make_printf k (Acc_delay (acc, f)) rest\n | Custom (arity, f, rest) ->\n make_custom k acc rest arity (f ())\n | Reader _ ->\n (* This case is impossible, by typing of formats. *)\n (* Indeed, since printf and co. take a format4 as argument, the 'd and 'e\n type parameters of fmt are obviously equals. The Reader is the\n only constructor which touch 'd and 'e type parameters of the format\n type, it adds an (->) to the 'd parameters. Consequently, a format4\n cannot contain a Reader node, except in the sub-format associated to\n an %{...%}. It's not a problem because make_printf do not call\n itself recursively on the sub-format associated to %{...%}. *)\n assert false\n | Flush rest ->\n make_printf k (Acc_flush acc) rest\n\n | String_literal (str, rest) ->\n make_printf k (Acc_string_literal (acc, str)) rest\n | Char_literal (chr, rest) ->\n make_printf k (Acc_char_literal (acc, chr)) rest\n\n | Format_arg (_, sub_fmtty, rest) ->\n let ty = string_of_fmtty sub_fmtty in\n (fun str ->\n ignore str;\n make_printf k (Acc_data_string (acc, ty)) rest)\n | Format_subst (_, fmtty, rest) ->\n fun (Format (fmt, _)) -> make_printf k acc\n (concat_fmt (recast fmt fmtty) rest)\n\n | Scan_char_set (_, _, rest) ->\n let new_acc = Acc_invalid_arg (acc, \"Printf: bad conversion %[\") in\n fun _ -> make_printf k new_acc rest\n | Scan_get_counter (_, rest) ->\n (* This case should be refused for Printf. *)\n (* Accepted for backward compatibility. *)\n (* Interpret %l, %n and %L as %u. *)\n fun n ->\n let new_acc = Acc_data_string (acc, format_int \"%u\" n) in\n make_printf k new_acc rest\n | Scan_next_char rest ->\n fun c ->\n let new_acc = Acc_data_char (acc, c) in\n make_printf k new_acc rest\n | Ignored_param (ign, rest) ->\n make_ignored_param k acc ign rest\n\n | Formatting_lit (fmting_lit, rest) ->\n make_printf k (Acc_formatting_lit (acc, fmting_lit)) rest\n | Formatting_gen (Open_tag (Format (fmt', _)), rest) ->\n let k' kacc =\n make_printf k (Acc_formatting_gen (acc, Acc_open_tag kacc)) rest in\n make_printf k' End_of_acc fmt'\n | Formatting_gen (Open_box (Format (fmt', _)), rest) ->\n let k' kacc =\n make_printf k (Acc_formatting_gen (acc, Acc_open_box kacc)) rest in\n make_printf k' End_of_acc fmt'\n\n | End_of_format ->\n k acc\n\n(* Delay the error (Invalid_argument \"Printf: bad conversion %_\"). *)\n(* Generate functions to take remaining arguments (after the \"%_\"). *)\nand make_ignored_param : type x y a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, y, x) ignored ->\n (x, b, c, y, e, f) fmt -> a =\nfun k acc ign fmt -> match ign with\n | Ignored_char -> make_invalid_arg k acc fmt\n | Ignored_caml_char -> make_invalid_arg k acc fmt\n | Ignored_string _ -> make_invalid_arg k acc fmt\n | Ignored_caml_string _ -> make_invalid_arg k acc fmt\n | Ignored_int (_, _) -> make_invalid_arg k acc fmt\n | Ignored_int32 (_, _) -> make_invalid_arg k acc fmt\n | Ignored_nativeint (_, _) -> make_invalid_arg k acc fmt\n | Ignored_int64 (_, _) -> make_invalid_arg k acc fmt\n | Ignored_float (_, _) -> make_invalid_arg k acc fmt\n | Ignored_bool _ -> make_invalid_arg k acc fmt\n | Ignored_format_arg _ -> make_invalid_arg k acc fmt\n | Ignored_format_subst (_, fmtty) -> make_from_fmtty k acc fmtty fmt\n | Ignored_reader -> assert false\n | Ignored_scan_char_set _ -> make_invalid_arg k acc fmt\n | Ignored_scan_get_counter _ -> make_invalid_arg k acc fmt\n | Ignored_scan_next_char -> make_invalid_arg k acc fmt\n\n\n(* Special case of printf \"%_(\". *)\nand make_from_fmtty : type x y a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, y, x) fmtty ->\n (x, b, c, y, e, f) fmt -> a =\nfun k acc fmtty fmt -> match fmtty with\n | Char_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | String_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Int_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Int32_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Nativeint_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Int64_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Float_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Bool_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Alpha_ty rest -> fun _ _ -> make_from_fmtty k acc rest fmt\n | Theta_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Any_ty rest -> fun _ -> make_from_fmtty k acc rest fmt\n | Reader_ty _ -> assert false\n | Ignored_reader_ty _ -> assert false\n | Format_arg_ty (_, rest) -> fun _ -> make_from_fmtty k acc rest fmt\n | End_of_fmtty -> make_invalid_arg k acc fmt\n | Format_subst_ty (ty1, ty2, rest) ->\n let ty = trans (symm ty1) ty2 in\n fun _ -> make_from_fmtty k acc (concat_fmtty ty rest) fmt\n\n(* Insert an Acc_invalid_arg in the accumulator and continue to generate\n closures to get the remaining arguments. *)\nand make_invalid_arg : type a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, e, f) fmt -> a =\nfun k acc fmt ->\n make_printf k (Acc_invalid_arg (acc, \"Printf: bad conversion %_\")) fmt\n\n(* Fix padding, take it as an extra integer argument if needed. *)\nand make_padding : type x z a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, e, f) fmt ->\n (x, z -> a) padding -> (z -> string) -> x =\n fun k acc fmt pad trans -> match pad with\n | No_padding ->\n fun x ->\n let new_acc = Acc_data_string (acc, trans x) in\n make_printf k new_acc fmt\n | Lit_padding (padty, width) ->\n fun x ->\n let new_acc = Acc_data_string (acc, fix_padding padty width (trans x)) in\n make_printf k new_acc fmt\n | Arg_padding padty ->\n fun w x ->\n let new_acc = Acc_data_string (acc, fix_padding padty w (trans x)) in\n make_printf k new_acc fmt\n\n(* Fix padding and precision for int, int32, nativeint or int64. *)\n(* Take one or two extra integer arguments if needed. *)\nand make_int_padding_precision : type x y z a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, e, f) fmt ->\n (x, y) padding -> (y, z -> a) precision -> (int_conv -> z -> string) ->\n int_conv -> x =\n fun k acc fmt pad prec trans iconv -> match pad, prec with\n | No_padding, No_precision ->\n fun x ->\n let str = trans iconv x in\n make_printf k (Acc_data_string (acc, str)) fmt\n | No_padding, Lit_precision p ->\n fun x ->\n let str = fix_int_precision p (trans iconv x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | No_padding, Arg_precision ->\n fun p x ->\n let str = fix_int_precision p (trans iconv x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Lit_padding (padty, w), No_precision ->\n fun x ->\n let str = fix_padding padty w (trans iconv x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Lit_padding (padty, w), Lit_precision p ->\n fun x ->\n let str = fix_padding padty w (fix_int_precision p (trans iconv x)) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Lit_padding (padty, w), Arg_precision ->\n fun p x ->\n let str = fix_padding padty w (fix_int_precision p (trans iconv x)) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Arg_padding padty, No_precision ->\n fun w x ->\n let str = fix_padding padty w (trans iconv x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Arg_padding padty, Lit_precision p ->\n fun w x ->\n let str = fix_padding padty w (fix_int_precision p (trans iconv x)) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Arg_padding padty, Arg_precision ->\n fun w p x ->\n let str = fix_padding padty w (fix_int_precision p (trans iconv x)) in\n make_printf k (Acc_data_string (acc, str)) fmt\n\n(* Convert a float, fix padding and precision if needed. *)\n(* Take the float argument and one or two extra integer arguments if needed. *)\nand make_float_padding_precision : type x y a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, e, f) fmt ->\n (x, y) padding -> (y, float -> a) precision -> float_conv -> x =\n fun k acc fmt pad prec fconv -> match pad, prec with\n | No_padding, No_precision ->\n fun x ->\n let str = convert_float fconv (default_float_precision fconv) x in\n make_printf k (Acc_data_string (acc, str)) fmt\n | No_padding, Lit_precision p ->\n fun x ->\n let str = convert_float fconv p x in\n make_printf k (Acc_data_string (acc, str)) fmt\n | No_padding, Arg_precision ->\n fun p x ->\n let str = convert_float fconv p x in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Lit_padding (padty, w), No_precision ->\n fun x ->\n let str = convert_float fconv (default_float_precision fconv) x in\n let str' = fix_padding padty w str in\n make_printf k (Acc_data_string (acc, str')) fmt\n | Lit_padding (padty, w), Lit_precision p ->\n fun x ->\n let str = fix_padding padty w (convert_float fconv p x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Lit_padding (padty, w), Arg_precision ->\n fun p x ->\n let str = fix_padding padty w (convert_float fconv p x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Arg_padding padty, No_precision ->\n fun w x ->\n let str = convert_float fconv (default_float_precision fconv) x in\n let str' = fix_padding padty w str in\n make_printf k (Acc_data_string (acc, str')) fmt\n | Arg_padding padty, Lit_precision p ->\n fun w x ->\n let str = fix_padding padty w (convert_float fconv p x) in\n make_printf k (Acc_data_string (acc, str)) fmt\n | Arg_padding padty, Arg_precision ->\n fun w p x ->\n let str = fix_padding padty w (convert_float fconv p x) in\n make_printf k (Acc_data_string (acc, str)) fmt\nand make_custom : type x y a b c d e f .\n ((b, c) acc -> f) -> (b, c) acc ->\n (a, b, c, d, e, f) fmt ->\n (a, x, y) custom_arity -> x -> y =\n fun k acc rest arity f -> match arity with\n | Custom_zero -> make_printf k (Acc_data_string (acc, f)) rest\n | Custom_succ arity ->\n fun x ->\n make_custom k acc rest arity (f x)\n\nlet const x _ = x\n\nlet rec make_iprintf : type a b c d e f state.\n (state -> f) -> state -> (a, b, c, d, e, f) fmt -> a =\n fun k o fmt -> match fmt with\n | Char rest ->\n const (make_iprintf k o rest)\n | Caml_char rest ->\n const (make_iprintf k o rest)\n | String (No_padding, rest) ->\n const (make_iprintf k o rest)\n | String (Lit_padding _, rest) ->\n const (make_iprintf k o rest)\n | String (Arg_padding _, rest) ->\n const (const (make_iprintf k o rest))\n | Caml_string (No_padding, rest) ->\n const (make_iprintf k o rest)\n | Caml_string (Lit_padding _, rest) ->\n const (make_iprintf k o rest)\n | Caml_string (Arg_padding _, rest) ->\n const (const (make_iprintf k o rest))\n | Int (_, pad, prec, rest) ->\n fn_of_padding_precision k o rest pad prec\n | Int32 (_, pad, prec, rest) ->\n fn_of_padding_precision k o rest pad prec\n | Nativeint (_, pad, prec, rest) ->\n fn_of_padding_precision k o rest pad prec\n | Int64 (_, pad, prec, rest) ->\n fn_of_padding_precision k o rest pad prec\n | Float (_, pad, prec, rest) ->\n fn_of_padding_precision k o rest pad prec\n | Bool (No_padding, rest) ->\n const (make_iprintf k o rest)\n | Bool (Lit_padding _, rest) ->\n const (make_iprintf k o rest)\n | Bool (Arg_padding _, rest) ->\n const (const (make_iprintf k o rest))\n | Alpha rest ->\n const (const (make_iprintf k o rest))\n | Theta rest ->\n const (make_iprintf k o rest)\n | Custom (arity, _, rest) ->\n fn_of_custom_arity k o rest arity\n | Reader _ ->\n (* This case is impossible, by typing of formats. See the\n note in the corresponding case for make_printf. *)\n assert false\n | Flush rest ->\n make_iprintf k o rest\n | String_literal (_, rest) ->\n make_iprintf k o rest\n | Char_literal (_, rest) ->\n make_iprintf k o rest\n | Format_arg (_, _, rest) ->\n const (make_iprintf k o rest)\n | Format_subst (_, fmtty, rest) ->\n fun (Format (fmt, _)) ->\n make_iprintf k o\n (concat_fmt (recast fmt fmtty) rest)\n | Scan_char_set (_, _, rest) ->\n const (make_iprintf k o rest)\n | Scan_get_counter (_, rest) ->\n const (make_iprintf k o rest)\n | Scan_next_char rest ->\n const (make_iprintf k o rest)\n | Ignored_param (ign, rest) ->\n make_ignored_param (fun _ -> k o) (End_of_acc) ign rest\n | Formatting_lit (_, rest) ->\n make_iprintf k o rest\n | Formatting_gen (Open_tag (Format (fmt', _)), rest) ->\n make_iprintf (fun koc -> make_iprintf k koc rest) o fmt'\n | Formatting_gen (Open_box (Format (fmt', _)), rest) ->\n make_iprintf (fun koc -> make_iprintf k koc rest) o fmt'\n | End_of_format ->\n k o\nand fn_of_padding_precision :\n type x y z a b c d e f state.\n (state -> f) -> state -> (a, b, c, d, e, f) fmt ->\n (x, y) padding -> (y, z -> a) precision -> x =\n fun k o fmt pad prec -> match pad, prec with\n | No_padding , No_precision ->\n const (make_iprintf k o fmt)\n | No_padding , Lit_precision _ ->\n const (make_iprintf k o fmt)\n | No_padding , Arg_precision ->\n const (const (make_iprintf k o fmt))\n | Lit_padding _, No_precision ->\n const (make_iprintf k o fmt)\n | Lit_padding _, Lit_precision _ ->\n const (make_iprintf k o fmt)\n | Lit_padding _, Arg_precision ->\n const (const (make_iprintf k o fmt))\n | Arg_padding _, No_precision ->\n const (const (make_iprintf k o fmt))\n | Arg_padding _, Lit_precision _ ->\n const (const (make_iprintf k o fmt))\n | Arg_padding _, Arg_precision ->\n const (const (const (make_iprintf k o fmt)))\nand fn_of_custom_arity : type x y a b c d e f state.\n (state -> f) ->\n state -> (a, b, c, d, e, f) fmt -> (a, x, y) custom_arity -> y =\n fun k o fmt -> function\n | Custom_zero ->\n make_iprintf k o fmt\n | Custom_succ arity ->\n const (fn_of_custom_arity k o fmt arity)\n\n(******************************************************************************)\n (* Continuations for make_printf *)\n\n(* Recursively output an \"accumulator\" containing a reversed list of\n printing entities (string, char, flus, ...) in an output_stream. *)\n(* Used as a continuation of make_printf. *)\nlet rec output_acc o acc = match acc with\n | Acc_formatting_lit (p, fmting_lit) ->\n let s = string_of_formatting_lit fmting_lit in\n output_acc o p; output_string o s;\n | Acc_formatting_gen (p, Acc_open_tag acc') ->\n output_acc o p; output_string o \"@{\"; output_acc o acc';\n | Acc_formatting_gen (p, Acc_open_box acc') ->\n output_acc o p; output_string o \"@[\"; output_acc o acc';\n | Acc_string_literal (p, s)\n | Acc_data_string (p, s) -> output_acc o p; output_string o s\n | Acc_char_literal (p, c)\n | Acc_data_char (p, c) -> output_acc o p; output_char o c\n | Acc_delay (p, f) -> output_acc o p; f o\n | Acc_flush p -> output_acc o p; flush o\n | Acc_invalid_arg (p, msg) -> output_acc o p; invalid_arg msg;\n | End_of_acc -> ()\n\n(* Recursively output an \"accumulator\" containing a reversed list of\n printing entities (string, char, flus, ...) in a buffer. *)\n(* Used as a continuation of make_printf. *)\nlet rec bufput_acc b acc = match acc with\n | Acc_formatting_lit (p, fmting_lit) ->\n let s = string_of_formatting_lit fmting_lit in\n bufput_acc b p; Buffer.add_string b s;\n | Acc_formatting_gen (p, Acc_open_tag acc') ->\n bufput_acc b p; Buffer.add_string b \"@{\"; bufput_acc b acc';\n | Acc_formatting_gen (p, Acc_open_box acc') ->\n bufput_acc b p; Buffer.add_string b \"@[\"; bufput_acc b acc';\n | Acc_string_literal (p, s)\n | Acc_data_string (p, s) -> bufput_acc b p; Buffer.add_string b s\n | Acc_char_literal (p, c)\n | Acc_data_char (p, c) -> bufput_acc b p; Buffer.add_char b c\n | Acc_delay (p, f) -> bufput_acc b p; f b\n | Acc_flush p -> bufput_acc b p;\n | Acc_invalid_arg (p, msg) -> bufput_acc b p; invalid_arg msg;\n | End_of_acc -> ()\n\n(* Recursively output an \"accumulator\" containing a reversed list of\n printing entities (string, char, flus, ...) in a buffer. *)\n(* Differ from bufput_acc by the interpretation of %a and %t. *)\n(* Used as a continuation of make_printf. *)\nlet rec strput_acc b acc = match acc with\n | Acc_formatting_lit (p, fmting_lit) ->\n let s = string_of_formatting_lit fmting_lit in\n strput_acc b p; Buffer.add_string b s;\n | Acc_formatting_gen (p, Acc_open_tag acc') ->\n strput_acc b p; Buffer.add_string b \"@{\"; strput_acc b acc';\n | Acc_formatting_gen (p, Acc_open_box acc') ->\n strput_acc b p; Buffer.add_string b \"@[\"; strput_acc b acc';\n | Acc_string_literal (p, s)\n | Acc_data_string (p, s) -> strput_acc b p; Buffer.add_string b s\n | Acc_char_literal (p, c)\n | Acc_data_char (p, c) -> strput_acc b p; Buffer.add_char b c\n | Acc_delay (p, f) -> strput_acc b p; Buffer.add_string b (f ())\n | Acc_flush p -> strput_acc b p;\n | Acc_invalid_arg (p, msg) -> strput_acc b p; invalid_arg msg;\n | End_of_acc -> ()\n\n(******************************************************************************)\n (* Error management *)\n\n(* Raise [Failure] with a pretty-printed error message. *)\nlet failwith_message (Format (fmt, _)) =\n let buf = Buffer.create 256 in\n let k acc = strput_acc buf acc; failwith (Buffer.contents buf) in\n make_printf k End_of_acc fmt\n\n(******************************************************************************)\n (* Formatting tools *)\n\n(* Convert a string to an open block description (indent, block_type) *)\nlet open_box_of_string str =\n if str = \"\" then (0, Pp_box) else\n let len = String.length str in\n let invalid_box () = failwith_message \"invalid box description %S\" str in\n let rec parse_spaces i =\n if i = len then i else\n match str.[i] with\n | ' ' | '\\t' -> parse_spaces (i + 1)\n | _ -> i\n and parse_lword i j =\n if j = len then j else\n match str.[j] with\n | 'a' .. 'z' -> parse_lword i (j + 1)\n | _ -> j\n and parse_int i j =\n if j = len then j else\n match str.[j] with\n | '0' .. '9' | '-' -> parse_int i (j + 1)\n | _ -> j in\n let wstart = parse_spaces 0 in\n let wend = parse_lword wstart wstart in\n let box_name = String.sub str wstart (wend - wstart) in\n let nstart = parse_spaces wend in\n let nend = parse_int nstart nstart in\n let indent =\n if nstart = nend then 0 else\n try int_of_string (String.sub str nstart (nend - nstart))\n with Failure _ -> invalid_box () in\n let exp_end = parse_spaces nend in\n if exp_end <> len then invalid_box ();\n let box_type = match box_name with\n | \"\" | \"b\" -> Pp_box\n | \"h\" -> Pp_hbox\n | \"v\" -> Pp_vbox\n | \"hv\" -> Pp_hvbox\n | \"hov\" -> Pp_hovbox\n | _ -> invalid_box () in\n (indent, box_type)\n\n(******************************************************************************)\n (* Parsing tools *)\n\n(* Create a padding_fmt_ebb from a padding and a format. *)\n(* Copy the padding to disjoin the type parameters of argument and result. *)\nlet make_padding_fmt_ebb : type x y .\n (x, y) padding -> (_, _, _, _, _, _) fmt ->\n (_, _, _, _, _) padding_fmt_ebb =\nfun pad fmt -> match pad with\n | No_padding -> Padding_fmt_EBB (No_padding, fmt)\n | Lit_padding (s, w) -> Padding_fmt_EBB (Lit_padding (s, w), fmt)\n | Arg_padding s -> Padding_fmt_EBB (Arg_padding s, fmt)\n\n(* Create a precision_fmt_ebb from a precision and a format. *)\n(* Copy the precision to disjoin the type parameters of argument and result. *)\nlet make_precision_fmt_ebb : type x y .\n (x, y) precision -> (_, _, _, _, _, _) fmt ->\n (_, _, _, _, _) precision_fmt_ebb =\nfun prec fmt -> match prec with\n | No_precision -> Precision_fmt_EBB (No_precision, fmt)\n | Lit_precision p -> Precision_fmt_EBB (Lit_precision p, fmt)\n | Arg_precision -> Precision_fmt_EBB (Arg_precision, fmt)\n\n(* Create a padprec_fmt_ebb from a padding, a precision and a format. *)\n(* Copy the padding and the precision to disjoin type parameters of arguments\n and result. *)\nlet make_padprec_fmt_ebb : type x y z t .\n (x, y) padding -> (z, t) precision ->\n (_, _, _, _, _, _) fmt ->\n (_, _, _, _, _) padprec_fmt_ebb =\nfun pad prec fmt ->\n let Precision_fmt_EBB (prec, fmt') = make_precision_fmt_ebb prec fmt in\n match pad with\n | No_padding -> Padprec_fmt_EBB (No_padding, prec, fmt')\n | Lit_padding (s, w) -> Padprec_fmt_EBB (Lit_padding (s, w), prec, fmt')\n | Arg_padding s -> Padprec_fmt_EBB (Arg_padding s, prec, fmt')\n\n(******************************************************************************)\n (* Format parsing *)\n\n(* Parse a string representing a format and create a fmt_ebb. *)\n(* Raise [Failure] in case of invalid format. *)\nlet fmt_ebb_of_string ?legacy_behavior str =\n (* Parameters naming convention: *)\n (* - lit_start: start of the literal sequence. *)\n (* - str_ind: current index in the string. *)\n (* - end_ind: end of the current (sub-)format. *)\n (* - pct_ind: index of the '%' in the current micro-format. *)\n (* - zero: is the '0' flag defined in the current micro-format. *)\n (* - minus: is the '-' flag defined in the current micro-format. *)\n (* - plus: is the '+' flag defined in the current micro-format. *)\n (* - hash: is the '#' flag defined in the current micro-format. *)\n (* - space: is the ' ' flag defined in the current micro-format. *)\n (* - ign: is the '_' flag defined in the current micro-format. *)\n (* - pad: padding of the current micro-format. *)\n (* - prec: precision of the current micro-format. *)\n (* - symb: char representing the conversion ('c', 's', 'd', ...). *)\n (* - char_set: set of characters as bitmap (see scanf %[...]). *)\n\n let legacy_behavior = match legacy_behavior with\n | Some flag -> flag\n | None -> true\n (* When this flag is enabled, the format parser tries to behave as\n the <4.02 implementations, in particular it ignores most benign\n nonsensical formats. When the flag is disabled, it will reject any\n format that is not accepted by the specification.\n\n A typical example would be \"%+ d\": specifying both '+' (if the\n number is positive, pad with a '+' to get the same width as\n negative numbers) and ' ' (if the number is positive, pad with\n a space) does not make sense, but the legacy (< 4.02)\n implementation was happy to just ignore the space.\n *)\n in\n\n (* Raise [Failure] with a friendly error message. *)\n let invalid_format_message str_ind msg =\n failwith_message\n \"invalid format %S: at character number %d, %s\"\n str str_ind msg\n in\n\n (* Used when the end of the format (or the current sub-format) was encountered\n unexpectedly. *)\n let unexpected_end_of_format end_ind =\n invalid_format_message end_ind\n \"unexpected end of format\"\n in\n\n (* Used for %0c: no other widths are implemented *)\n let invalid_nonnull_char_width str_ind =\n invalid_format_message str_ind\n \"non-zero widths are unsupported for %c conversions\"\n in\n (* Raise [Failure] with a friendly error message about an option dependency\n problem. *)\n let invalid_format_without str_ind c s =\n failwith_message\n \"invalid format %S: at character number %d, '%c' without %s\"\n str str_ind c s\n in\n\n (* Raise [Failure] with a friendly error message about an unexpected\n character. *)\n let expected_character str_ind expected read =\n failwith_message\n \"invalid format %S: at character number %d, %s expected, read %C\"\n str str_ind expected read\n in\n\n (* Parse the string from beg_ind (included) to end_ind (excluded). *)\n let rec parse : type e f . int -> int -> (_, _, e, f) fmt_ebb =\n fun beg_ind end_ind -> parse_literal beg_ind beg_ind end_ind\n\n (* Read literal characters up to '%' or '@' special characters. *)\n and parse_literal : type e f . int -> int -> int -> (_, _, e, f) fmt_ebb =\n fun lit_start str_ind end_ind ->\n if str_ind = end_ind then add_literal lit_start str_ind End_of_format else\n match str.[str_ind] with\n | '%' ->\n let Fmt_EBB fmt_rest = parse_format str_ind end_ind in\n add_literal lit_start str_ind fmt_rest\n | '@' ->\n let Fmt_EBB fmt_rest = parse_after_at (str_ind + 1) end_ind in\n add_literal lit_start str_ind fmt_rest\n | _ ->\n parse_literal lit_start (str_ind + 1) end_ind\n\n (* Parse a format after '%' *)\n and parse_format : type e f . int -> int -> (_, _, e, f) fmt_ebb =\n fun pct_ind end_ind -> parse_ign pct_ind (pct_ind + 1) end_ind\n\n and parse_ign : type e f . int -> int -> int -> (_, _, e, f) fmt_ebb =\n fun pct_ind str_ind end_ind ->\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | '_' -> parse_flags pct_ind (str_ind+1) end_ind true\n | _ -> parse_flags pct_ind str_ind end_ind false\n\n and parse_flags : type e f . int -> int -> int -> bool -> (_, _, e, f) fmt_ebb\n =\n fun pct_ind str_ind end_ind ign ->\n let zero = ref false and minus = ref false\n and plus = ref false and space = ref false\n and hash = ref false in\n let set_flag str_ind flag =\n (* in legacy mode, duplicate flags are accepted *)\n if !flag && not legacy_behavior then\n failwith_message\n \"invalid format %S: at character number %d, duplicate flag %C\"\n str str_ind str.[str_ind];\n flag := true;\n in\n let rec read_flags str_ind =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n begin match str.[str_ind] with\n | '0' -> set_flag str_ind zero; read_flags (str_ind + 1)\n | '-' -> set_flag str_ind minus; read_flags (str_ind + 1)\n | '+' -> set_flag str_ind plus; read_flags (str_ind + 1)\n | '#' -> set_flag str_ind hash; read_flags (str_ind + 1)\n | ' ' -> set_flag str_ind space; read_flags (str_ind + 1)\n | _ ->\n parse_padding pct_ind str_ind end_ind\n !zero !minus !plus !hash !space ign\n end\n in\n read_flags str_ind\n\n (* Try to read a digital or a '*' padding. *)\n and parse_padding : type e f .\n int -> int -> int -> bool -> bool -> bool -> bool -> bool -> bool ->\n (_, _, e, f) fmt_ebb =\n fun pct_ind str_ind end_ind zero minus plus hash space ign ->\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n let padty = match zero, minus with\n | false, false -> Right\n | false, true -> Left\n | true, false -> Zeros\n | true, true ->\n if legacy_behavior then Left\n else incompatible_flag pct_ind str_ind '-' \"0\" in\n match str.[str_ind] with\n | '0' .. '9' ->\n let new_ind, width = parse_positive str_ind end_ind 0 in\n parse_after_padding pct_ind new_ind end_ind minus plus hash space ign\n (Lit_padding (padty, width))\n | '*' ->\n parse_after_padding pct_ind (str_ind + 1) end_ind minus plus hash space\n ign (Arg_padding padty)\n | _ ->\n begin match padty with\n | Left ->\n if not legacy_behavior then\n invalid_format_without (str_ind - 1) '-' \"padding\";\n parse_after_padding pct_ind str_ind end_ind minus plus hash space ign\n No_padding\n | Zeros ->\n (* a '0' padding indication not followed by anything should\n be interpreted as a Right padding of width 0. This is used\n by scanning conversions %0s and %0c *)\n parse_after_padding pct_ind str_ind end_ind minus plus hash space ign\n (Lit_padding (Right, 0))\n | Right ->\n parse_after_padding pct_ind str_ind end_ind minus plus hash space ign\n No_padding\n end\n\n (* Is precision defined? *)\n and parse_after_padding : type x e f .\n int -> int -> int -> bool -> bool -> bool -> bool -> bool ->\n (x, _) padding -> (_, _, e, f) fmt_ebb =\n fun pct_ind str_ind end_ind minus plus hash space ign pad ->\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | '.' ->\n parse_precision pct_ind (str_ind + 1) end_ind minus plus hash space ign\n pad\n | symb ->\n parse_conversion pct_ind (str_ind + 1) end_ind plus hash space ign pad\n No_precision pad symb\n\n (* Read the digital or '*' precision. *)\n and parse_precision : type x e f .\n int -> int -> int -> bool -> bool -> bool -> bool -> bool ->\n (x, _) padding -> (_, _, e, f) fmt_ebb =\n fun pct_ind str_ind end_ind minus plus hash space ign pad ->\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n let parse_literal minus str_ind =\n let new_ind, prec = parse_positive str_ind end_ind 0 in\n parse_after_precision pct_ind new_ind end_ind minus plus hash space ign\n pad (Lit_precision prec) in\n match str.[str_ind] with\n | '0' .. '9' -> parse_literal minus str_ind\n | ('+' | '-') as symb when legacy_behavior ->\n (* Legacy mode would accept and ignore '+' or '-' before the\n integer describing the desired precision; note that this\n cannot happen for padding width, as '+' and '-' already have\n a semantics there.\n\n That said, the idea (supported by this tweak) that width and\n precision literals are \"integer literals\" in the OCaml sense is\n still blatantly wrong, as 123_456 or 0xFF are rejected. *)\n parse_literal (minus || symb = '-') (str_ind + 1)\n | '*' ->\n parse_after_precision pct_ind (str_ind + 1) end_ind minus plus hash space\n ign pad Arg_precision\n | _ ->\n if legacy_behavior then\n (* note that legacy implementation did not ignore '.' without\n a number (as it does for padding indications), but\n interprets it as '.0' *)\n parse_after_precision pct_ind str_ind end_ind minus plus hash space ign\n pad (Lit_precision 0)\n else\n invalid_format_without (str_ind - 1) '.' \"precision\"\n\n (* Try to read the conversion. *)\n and parse_after_precision : type x y z t e f .\n int -> int -> int -> bool -> bool -> bool -> bool -> bool ->\n (x, y) padding -> (z, t) precision -> (_, _, e, f) fmt_ebb =\n fun pct_ind str_ind end_ind minus plus hash space ign pad prec ->\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n let parse_conv (type u) (type v) (padprec : (u, v) padding) =\n parse_conversion pct_ind (str_ind + 1) end_ind plus hash space ign pad\n prec padprec str.[str_ind] in\n (* in legacy mode, some formats (%s and %S) accept a weird mix of\n padding and precision, which is merged as a single padding\n information. For example, in %.10s the precision is implicitly\n understood as padding %10s, but the left-padding component may\n be specified either as a left padding or a negative precision:\n %-.3s and %.-3s are equivalent to %-3s *)\n match pad with\n | No_padding -> (\n match minus, prec with\n | _, No_precision -> parse_conv No_padding\n | false, Lit_precision n -> parse_conv (Lit_padding (Right, n))\n | true, Lit_precision n -> parse_conv (Lit_padding (Left, n))\n | false, Arg_precision -> parse_conv (Arg_padding Right)\n | true, Arg_precision -> parse_conv (Arg_padding Left)\n )\n | pad -> parse_conv pad\n\n (* Case analysis on conversion. *)\n and parse_conversion : type x y z t u v e f .\n int -> int -> int -> bool -> bool -> bool -> bool -> (x, y) padding ->\n (z, t) precision -> (u, v) padding -> char -> (_, _, e, f) fmt_ebb =\n fun pct_ind str_ind end_ind plus hash space ign pad prec padprec symb ->\n (* Flags used to check option usages/compatibilities. *)\n let plus_used = ref false and hash_used = ref false\n and space_used = ref false and ign_used = ref false\n and pad_used = ref false and prec_used = ref false in\n\n (* Access to options, update flags. *)\n let get_plus () = plus_used := true; plus\n and get_hash () = hash_used := true; hash\n and get_space () = space_used := true; space\n and get_ign () = ign_used := true; ign\n and get_pad () = pad_used := true; pad\n and get_prec () = prec_used := true; prec\n and get_padprec () = pad_used := true; padprec in\n\n let get_int_pad () : (x,y) padding =\n (* %5.3d is accepted and meaningful: pad to length 5 with\n spaces, but first pad with zeros upto length 3 (0-padding\n is the interpretation of \"precision\" for integer formats).\n\n %05.3d is redundant: pad to length 5 *with zeros*, but\n first pad with zeros... To add insult to the injury, the\n legacy implementation ignores the 0-padding indication and\n does the 5 padding with spaces instead. We reuse this\n interpretation for compatibility, but statically reject this\n format when the legacy mode is disabled, to protect strict\n users from this corner case. *)\n match get_pad (), get_prec () with\n | pad, No_precision -> pad\n | No_padding, _ -> No_padding\n | Lit_padding (Zeros, n), _ ->\n if legacy_behavior then Lit_padding (Right, n)\n else incompatible_flag pct_ind str_ind '0' \"precision\"\n | Arg_padding Zeros, _ ->\n if legacy_behavior then Arg_padding Right\n else incompatible_flag pct_ind str_ind '0' \"precision\"\n | Lit_padding _ as pad, _ -> pad\n | Arg_padding _ as pad, _ -> pad in\n\n (* Check that padty <> Zeros. *)\n let check_no_0 symb (type a b) (pad : (a, b) padding) : (a,b) padding =\n match pad with\n | No_padding -> pad\n | Lit_padding ((Left | Right), _) -> pad\n | Arg_padding (Left | Right) -> pad\n | Lit_padding (Zeros, width) ->\n if legacy_behavior then Lit_padding (Right, width)\n else incompatible_flag pct_ind str_ind symb \"0\"\n | Arg_padding Zeros ->\n if legacy_behavior then Arg_padding Right\n else incompatible_flag pct_ind str_ind symb \"0\"\n in\n\n (* Get padding as a pad_option (see \"%_\", \"%{\", \"%(\" and \"%[\").\n (no need for legacy mode tweaking, those were rejected by the\n legacy parser as well) *)\n let opt_of_pad c (type a) (type b) (pad : (a, b) padding) = match pad with\n | No_padding -> None\n | Lit_padding (Right, width) -> Some width\n | Lit_padding (Zeros, width) ->\n if legacy_behavior then Some width\n else incompatible_flag pct_ind str_ind c \"'0'\"\n | Lit_padding (Left, width) ->\n if legacy_behavior then Some width\n else incompatible_flag pct_ind str_ind c \"'-'\"\n | Arg_padding _ -> incompatible_flag pct_ind str_ind c \"'*'\"\n in\n let get_pad_opt c = opt_of_pad c (get_pad ()) in\n let get_padprec_opt c = opt_of_pad c (get_padprec ()) in\n\n (* Get precision as a prec_option (see \"%_f\").\n (no need for legacy mode tweaking, those were rejected by the\n legacy parser as well) *)\n let get_prec_opt () = match get_prec () with\n | No_precision -> None\n | Lit_precision ndec -> Some ndec\n | Arg_precision -> incompatible_flag pct_ind str_ind '_' \"'*'\"\n in\n\n let fmt_result = match symb with\n | ',' ->\n parse str_ind end_ind\n | 'c' ->\n let char_format fmt_rest = (* %c *)\n if get_ign ()\n then Fmt_EBB (Ignored_param (Ignored_char, fmt_rest))\n else Fmt_EBB (Char fmt_rest)\n in\n let scan_format fmt_rest = (* %0c *)\n if get_ign ()\n then Fmt_EBB (Ignored_param (Ignored_scan_next_char, fmt_rest))\n else Fmt_EBB (Scan_next_char fmt_rest)\n in\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n begin match get_pad_opt 'c' with\n | None -> char_format fmt_rest\n | Some 0 -> scan_format fmt_rest\n | Some _n ->\n if not legacy_behavior\n then invalid_nonnull_char_width str_ind\n else (* legacy ignores %c widths *) char_format fmt_rest\n end\n | 'C' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then Fmt_EBB (Ignored_param (Ignored_caml_char,fmt_rest))\n else Fmt_EBB (Caml_char fmt_rest)\n | 's' ->\n let pad = check_no_0 symb (get_padprec ()) in\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then\n let ignored = Ignored_string (get_padprec_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padding_fmt_EBB (pad', fmt_rest') =\n make_padding_fmt_ebb pad fmt_rest in\n Fmt_EBB (String (pad', fmt_rest'))\n | 'S' ->\n let pad = check_no_0 symb (get_padprec ()) in\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then\n let ignored = Ignored_caml_string (get_padprec_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padding_fmt_EBB (pad', fmt_rest') =\n make_padding_fmt_ebb pad fmt_rest in\n Fmt_EBB (Caml_string (pad', fmt_rest'))\n | 'd' | 'i' | 'x' | 'X' | 'o' | 'u' ->\n let iconv = compute_int_conv pct_ind str_ind (get_plus ()) (get_hash ())\n (get_space ()) symb in\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then\n let ignored = Ignored_int (iconv, get_pad_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padprec_fmt_EBB (pad', prec', fmt_rest') =\n make_padprec_fmt_ebb (get_int_pad ()) (get_prec ()) fmt_rest in\n Fmt_EBB (Int (iconv, pad', prec', fmt_rest'))\n | 'N' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n let counter = Token_counter in\n if get_ign () then\n let ignored = Ignored_scan_get_counter counter in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n Fmt_EBB (Scan_get_counter (counter, fmt_rest))\n | 'l' | 'n' | 'L' when str_ind=end_ind || not (is_int_base str.[str_ind]) ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n let counter = counter_of_char symb in\n if get_ign () then\n let ignored = Ignored_scan_get_counter counter in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n Fmt_EBB (Scan_get_counter (counter, fmt_rest))\n | 'l' ->\n let iconv =\n compute_int_conv pct_ind (str_ind + 1) (get_plus ()) (get_hash ())\n (get_space ()) str.[str_ind] in\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n if get_ign () then\n let ignored = Ignored_int32 (iconv, get_pad_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padprec_fmt_EBB (pad', prec', fmt_rest') =\n make_padprec_fmt_ebb (get_int_pad ()) (get_prec ()) fmt_rest in\n Fmt_EBB (Int32 (iconv, pad', prec', fmt_rest'))\n | 'n' ->\n let iconv =\n compute_int_conv pct_ind (str_ind + 1) (get_plus ())\n (get_hash ()) (get_space ()) str.[str_ind] in\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n if get_ign () then\n let ignored = Ignored_nativeint (iconv, get_pad_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padprec_fmt_EBB (pad', prec', fmt_rest') =\n make_padprec_fmt_ebb (get_int_pad ()) (get_prec ()) fmt_rest in\n Fmt_EBB (Nativeint (iconv, pad', prec', fmt_rest'))\n | 'L' ->\n let iconv =\n compute_int_conv pct_ind (str_ind + 1) (get_plus ()) (get_hash ())\n (get_space ()) str.[str_ind] in\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n if get_ign () then\n let ignored = Ignored_int64 (iconv, get_pad_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padprec_fmt_EBB (pad', prec', fmt_rest') =\n make_padprec_fmt_ebb (get_int_pad ()) (get_prec ()) fmt_rest in\n Fmt_EBB (Int64 (iconv, pad', prec', fmt_rest'))\n | 'f' | 'e' | 'E' | 'g' | 'G' | 'F' | 'h' | 'H' ->\n let fconv =\n compute_float_conv pct_ind str_ind\n (get_plus ()) (get_hash ()) (get_space ()) symb in\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then\n let ignored = Ignored_float (get_pad_opt '_', get_prec_opt ()) in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padprec_fmt_EBB (pad', prec', fmt_rest') =\n make_padprec_fmt_ebb (get_pad ()) (get_prec ()) fmt_rest in\n Fmt_EBB (Float (fconv, pad', prec', fmt_rest'))\n | 'b' | 'B' ->\n let pad = check_no_0 symb (get_padprec ()) in\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then\n let ignored = Ignored_bool (get_padprec_opt '_') in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n let Padding_fmt_EBB (pad', fmt_rest') =\n make_padding_fmt_ebb pad fmt_rest in\n Fmt_EBB (Bool (pad', fmt_rest'))\n | 'a' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n Fmt_EBB (Alpha fmt_rest)\n | 't' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n Fmt_EBB (Theta fmt_rest)\n | 'r' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n if get_ign () then Fmt_EBB (Ignored_param (Ignored_reader, fmt_rest))\n else Fmt_EBB (Reader fmt_rest)\n | '!' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n Fmt_EBB (Flush fmt_rest)\n | ('%' | '@') as c ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n Fmt_EBB (Char_literal (c, fmt_rest))\n | '{' ->\n let sub_end = search_subformat_end str_ind end_ind '}' in\n let Fmt_EBB sub_fmt = parse str_ind sub_end in\n let Fmt_EBB fmt_rest = parse (sub_end + 2) end_ind in\n let sub_fmtty = fmtty_of_fmt sub_fmt in\n if get_ign () then\n let ignored = Ignored_format_arg (get_pad_opt '_', sub_fmtty) in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n Fmt_EBB (Format_arg (get_pad_opt '{', sub_fmtty, fmt_rest))\n | '(' ->\n let sub_end = search_subformat_end str_ind end_ind ')' in\n let Fmt_EBB fmt_rest = parse (sub_end + 2) end_ind in\n let Fmt_EBB sub_fmt = parse str_ind sub_end in\n let sub_fmtty = fmtty_of_fmt sub_fmt in\n if get_ign () then\n let ignored = Ignored_format_subst (get_pad_opt '_', sub_fmtty) in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n Fmt_EBB (Format_subst (get_pad_opt '(', sub_fmtty, fmt_rest))\n | '[' ->\n let next_ind, char_set = parse_char_set str_ind end_ind in\n let Fmt_EBB fmt_rest = parse next_ind end_ind in\n if get_ign () then\n let ignored = Ignored_scan_char_set (get_pad_opt '_', char_set) in\n Fmt_EBB (Ignored_param (ignored, fmt_rest))\n else\n Fmt_EBB (Scan_char_set (get_pad_opt '[', char_set, fmt_rest))\n | '-' | '+' | '#' | ' ' | '_' ->\n failwith_message\n \"invalid format %S: at character number %d, \\\n flag %C is only allowed after the '%%', before padding and precision\"\n str pct_ind symb\n | _ ->\n failwith_message\n \"invalid format %S: at character number %d, \\\n invalid conversion \\\"%%%c\\\"\" str (str_ind - 1) symb\n in\n (* Check for unused options, and reject them as incompatible.\n\n Such checks need to be disabled in legacy mode, as the legacy\n parser silently ignored incompatible flags. *)\n if not legacy_behavior then begin\n if not !plus_used && plus then\n incompatible_flag pct_ind str_ind symb \"'+'\";\n if not !hash_used && hash then\n incompatible_flag pct_ind str_ind symb \"'#'\";\n if not !space_used && space then\n incompatible_flag pct_ind str_ind symb \"' '\";\n if not !pad_used && Padding_EBB pad <> Padding_EBB No_padding then\n incompatible_flag pct_ind str_ind symb \"`padding'\";\n if not !prec_used && Precision_EBB prec <> Precision_EBB No_precision then\n incompatible_flag pct_ind str_ind (if ign then '_' else symb)\n \"`precision'\";\n if ign && plus then incompatible_flag pct_ind str_ind '_' \"'+'\";\n end;\n (* this last test must not be disabled in legacy mode,\n as ignoring it would typically result in a different typing\n than what the legacy parser used *)\n if not !ign_used && ign then\n begin match symb with\n (* argument-less formats can safely be ignored in legacy mode *)\n | ('@' | '%' | '!' | ',') when legacy_behavior -> ()\n | _ ->\n incompatible_flag pct_ind str_ind symb \"'_'\"\n end;\n fmt_result\n\n (* Parse formatting information (after '@'). *)\n and parse_after_at : type e f . int -> int -> (_, _, e, f) fmt_ebb =\n fun str_ind end_ind ->\n if str_ind = end_ind then Fmt_EBB (Char_literal ('@', End_of_format))\n else\n match str.[str_ind] with\n | '[' ->\n parse_tag false (str_ind + 1) end_ind\n | ']' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Close_box, fmt_rest))\n | '{' ->\n parse_tag true (str_ind + 1) end_ind\n | '}' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Close_tag, fmt_rest))\n | ',' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Break (\"@,\", 0, 0), fmt_rest))\n | ' ' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Break (\"@ \", 1, 0), fmt_rest))\n | ';' ->\n parse_good_break (str_ind + 1) end_ind\n | '?' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (FFlush, fmt_rest))\n | '\\n' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Force_newline, fmt_rest))\n | '.' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Flush_newline, fmt_rest))\n | '<' ->\n parse_magic_size (str_ind + 1) end_ind\n | '@' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Escaped_at, fmt_rest))\n | '%' when str_ind + 1 < end_ind && str.[str_ind + 1] = '%' ->\n let Fmt_EBB fmt_rest = parse (str_ind + 2) end_ind in\n Fmt_EBB (Formatting_lit (Escaped_percent, fmt_rest))\n | '%' ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n Fmt_EBB (Char_literal ('@', fmt_rest))\n | c ->\n let Fmt_EBB fmt_rest = parse (str_ind + 1) end_ind in\n Fmt_EBB (Formatting_lit (Scan_indic c, fmt_rest))\n\n (* Try to read the optional after \"@{\" or \"@[\". *)\n and parse_tag : type e f . bool -> int -> int -> (_, _, e, f) fmt_ebb =\n fun is_open_tag str_ind end_ind ->\n try\n if str_ind = end_ind then raise Not_found;\n match str.[str_ind] with\n | '<' ->\n let ind = String.index_from str (str_ind + 1) '>' in\n if ind >= end_ind then raise Not_found;\n let sub_str = String.sub str str_ind (ind - str_ind + 1) in\n let Fmt_EBB fmt_rest = parse (ind + 1) end_ind in\n let Fmt_EBB sub_fmt = parse str_ind (ind + 1) in\n let sub_format = Format (sub_fmt, sub_str) in\n let formatting =\n if is_open_tag then Open_tag sub_format else Open_box sub_format in\n Fmt_EBB (Formatting_gen (formatting, fmt_rest))\n | _ ->\n raise Not_found\n with Not_found ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n let sub_format = Format (End_of_format, \"\") in\n let formatting =\n if is_open_tag then Open_tag sub_format else Open_box sub_format in\n Fmt_EBB (Formatting_gen (formatting, fmt_rest))\n\n (* Try to read the optional after \"@;\". *)\n and parse_good_break : type e f . int -> int -> (_, _, e, f) fmt_ebb =\n fun str_ind end_ind ->\n let next_ind, formatting_lit =\n try\n if str_ind = end_ind || str.[str_ind] <> '<' then raise Not_found;\n let str_ind_1 = parse_spaces (str_ind + 1) end_ind in\n match str.[str_ind_1] with\n | '0' .. '9' | '-' -> (\n let str_ind_2, width = parse_integer str_ind_1 end_ind in\n let str_ind_3 = parse_spaces str_ind_2 end_ind in\n match str.[str_ind_3] with\n | '>' ->\n let s = String.sub str (str_ind-2) (str_ind_3-str_ind+3) in\n str_ind_3 + 1, Break (s, width, 0)\n | '0' .. '9' | '-' ->\n let str_ind_4, offset = parse_integer str_ind_3 end_ind in\n let str_ind_5 = parse_spaces str_ind_4 end_ind in\n if str.[str_ind_5] <> '>' then raise Not_found;\n let s = String.sub str (str_ind-2) (str_ind_5-str_ind+3) in\n str_ind_5 + 1, Break (s, width, offset)\n | _ -> raise Not_found\n )\n | _ -> raise Not_found\n with Not_found | Failure _ ->\n str_ind, Break (\"@;\", 1, 0)\n in\n let Fmt_EBB fmt_rest = parse next_ind end_ind in\n Fmt_EBB (Formatting_lit (formatting_lit, fmt_rest))\n\n (* Parse the size in a . *)\n and parse_magic_size : type e f . int -> int -> (_, _, e, f) fmt_ebb =\n fun str_ind end_ind ->\n match\n try\n let str_ind_1 = parse_spaces str_ind end_ind in\n match str.[str_ind_1] with\n | '0' .. '9' | '-' ->\n let str_ind_2, size = parse_integer str_ind_1 end_ind in\n let str_ind_3 = parse_spaces str_ind_2 end_ind in\n if str.[str_ind_3] <> '>' then raise Not_found;\n let s = String.sub str (str_ind - 2) (str_ind_3 - str_ind + 3) in\n Some (str_ind_3 + 1, Magic_size (s, size))\n | _ -> None\n with Not_found | Failure _ ->\n None\n with\n | Some (next_ind, formatting_lit) ->\n let Fmt_EBB fmt_rest = parse next_ind end_ind in\n Fmt_EBB (Formatting_lit (formatting_lit, fmt_rest))\n | None ->\n let Fmt_EBB fmt_rest = parse str_ind end_ind in\n Fmt_EBB (Formatting_lit (Scan_indic '<', fmt_rest))\n\n (* Parse and construct a char set. *)\n and parse_char_set str_ind end_ind =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n\n let char_set = create_char_set () in\n let add_char c =\n add_in_char_set char_set c;\n in\n let add_range c c' =\n for i = int_of_char c to int_of_char c' do\n add_in_char_set char_set (char_of_int i);\n done;\n in\n\n let fail_single_percent str_ind =\n failwith_message\n \"invalid format %S: '%%' alone is not accepted in character sets, \\\n use %%%% instead at position %d.\" str str_ind\n in\n\n (* Parse the first character of a char set. *)\n let rec parse_char_set_start str_ind end_ind =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n let c = str.[str_ind] in\n parse_char_set_after_char (str_ind + 1) end_ind c\n\n (* Parse the content of a char set until the first ']'. *)\n and parse_char_set_content str_ind end_ind =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | ']' ->\n str_ind + 1\n | '-' ->\n add_char '-';\n parse_char_set_content (str_ind + 1) end_ind\n | c ->\n parse_char_set_after_char (str_ind + 1) end_ind c\n\n (* Test for range in char set. *)\n and parse_char_set_after_char str_ind end_ind c =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | ']' ->\n add_char c;\n str_ind + 1\n | '-' ->\n parse_char_set_after_minus (str_ind + 1) end_ind c\n | ('%' | '@') as c' when c = '%' ->\n add_char c';\n parse_char_set_content (str_ind + 1) end_ind\n | c' ->\n if c = '%' then fail_single_percent str_ind;\n (* note that '@' alone is accepted, as done by the legacy\n implementation; the documentation specifically requires %@\n so we could warn on that *)\n add_char c;\n parse_char_set_after_char (str_ind + 1) end_ind c'\n\n (* Manage range in char set (except if the '-' the last char before ']') *)\n and parse_char_set_after_minus str_ind end_ind c =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | ']' ->\n add_char c;\n add_char '-';\n str_ind + 1\n | '%' ->\n if str_ind + 1 = end_ind then unexpected_end_of_format end_ind;\n begin match str.[str_ind + 1] with\n | ('%' | '@') as c' ->\n add_range c c';\n parse_char_set_content (str_ind + 2) end_ind\n | _ -> fail_single_percent str_ind\n end\n | c' ->\n add_range c c';\n parse_char_set_content (str_ind + 1) end_ind\n in\n let str_ind, reverse =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | '^' -> str_ind + 1, true\n | _ -> str_ind, false in\n let next_ind = parse_char_set_start str_ind end_ind in\n let char_set = freeze_char_set char_set in\n next_ind, (if reverse then rev_char_set char_set else char_set)\n\n (* Consume all next spaces, raise an Failure if end_ind is reached. *)\n and parse_spaces str_ind end_ind =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n if str.[str_ind] = ' ' then parse_spaces (str_ind + 1) end_ind else str_ind\n\n (* Read a positive integer from the string, raise a Failure if end_ind is\n reached. *)\n and parse_positive str_ind end_ind acc =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | '0' .. '9' as c ->\n let new_acc = acc * 10 + (int_of_char c - int_of_char '0') in\n if new_acc > Sys.max_string_length then\n failwith_message\n \"invalid format %S: integer %d is greater than the limit %d\"\n str new_acc Sys.max_string_length\n else\n parse_positive (str_ind + 1) end_ind new_acc\n | _ -> str_ind, acc\n\n (* Read a positive or negative integer from the string, raise a Failure\n if end_ind is reached. *)\n and parse_integer str_ind end_ind =\n if str_ind = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind] with\n | '0' .. '9' -> parse_positive str_ind end_ind 0\n | '-' -> (\n if str_ind + 1 = end_ind then unexpected_end_of_format end_ind;\n match str.[str_ind + 1] with\n | '0' .. '9' ->\n let next_ind, n = parse_positive (str_ind + 1) end_ind 0 in\n next_ind, -n\n | c ->\n expected_character (str_ind + 1) \"digit\" c\n )\n | _ -> assert false\n\n (* Add a literal to a format from a literal character sub-sequence. *)\n and add_literal : type a d e f .\n int -> int -> (a, _, _, d, e, f) fmt ->\n (_, _, e, f) fmt_ebb =\n fun lit_start str_ind fmt -> match str_ind - lit_start with\n | 0 -> Fmt_EBB fmt\n | 1 -> Fmt_EBB (Char_literal (str.[lit_start], fmt))\n | size -> Fmt_EBB (String_literal (String.sub str lit_start size, fmt))\n\n (* Search the end of the current sub-format\n (i.e. the corresponding \"%}\" or \"%)\") *)\n and search_subformat_end str_ind end_ind c =\n if str_ind = end_ind then\n failwith_message\n \"invalid format %S: unclosed sub-format, \\\n expected \\\"%%%c\\\" at character number %d\" str c end_ind;\n match str.[str_ind] with\n | '%' ->\n if str_ind + 1 = end_ind then unexpected_end_of_format end_ind;\n if str.[str_ind + 1] = c then (* End of format found *) str_ind else\n begin match str.[str_ind + 1] with\n | '_' ->\n (* Search for \"%_(\" or \"%_{\". *)\n if str_ind + 2 = end_ind then unexpected_end_of_format end_ind;\n begin match str.[str_ind + 2] with\n | '{' ->\n let sub_end = search_subformat_end (str_ind + 3) end_ind '}' in\n search_subformat_end (sub_end + 2) end_ind c\n | '(' ->\n let sub_end = search_subformat_end (str_ind + 3) end_ind ')' in\n search_subformat_end (sub_end + 2) end_ind c\n | _ -> search_subformat_end (str_ind + 3) end_ind c\n end\n | '{' ->\n (* %{...%} sub-format found. *)\n let sub_end = search_subformat_end (str_ind + 2) end_ind '}' in\n search_subformat_end (sub_end + 2) end_ind c\n | '(' ->\n (* %(...%) sub-format found. *)\n let sub_end = search_subformat_end (str_ind + 2) end_ind ')' in\n search_subformat_end (sub_end + 2) end_ind c\n | '}' ->\n (* Error: %(...%}. *)\n expected_character (str_ind + 1) \"character ')'\" '}'\n | ')' ->\n (* Error: %{...%). *)\n expected_character (str_ind + 1) \"character '}'\" ')'\n | _ ->\n search_subformat_end (str_ind + 2) end_ind c\n end\n | _ -> search_subformat_end (str_ind + 1) end_ind c\n\n (* Check if symb is a valid int conversion after \"%l\", \"%n\" or \"%L\" *)\n and is_int_base symb = match symb with\n | 'd' | 'i' | 'x' | 'X' | 'o' | 'u' -> true\n | _ -> false\n\n (* Convert a char (l, n or L) to its associated counter. *)\n and counter_of_char symb = match symb with\n | 'l' -> Line_counter | 'n' -> Char_counter\n | 'L' -> Token_counter | _ -> assert false\n\n (* Convert (plus, symb) to its associated int_conv. *)\n and compute_int_conv pct_ind str_ind plus hash space symb =\n match plus, hash, space, symb with\n | false, false, false, 'd' -> Int_d | false, false, false, 'i' -> Int_i\n | false, false, true, 'd' -> Int_sd | false, false, true, 'i' -> Int_si\n | true, false, false, 'd' -> Int_pd | true, false, false, 'i' -> Int_pi\n | false, false, false, 'x' -> Int_x | false, false, false, 'X' -> Int_X\n | false, true, false, 'x' -> Int_Cx | false, true, false, 'X' -> Int_CX\n | false, false, false, 'o' -> Int_o\n | false, true, false, 'o' -> Int_Co\n | false, false, false, 'u' -> Int_u\n | false, true, false, 'd' -> Int_Cd\n | false, true, false, 'i' -> Int_Ci\n | false, true, false, 'u' -> Int_Cu\n | _, true, _, 'x' when legacy_behavior -> Int_Cx\n | _, true, _, 'X' when legacy_behavior -> Int_CX\n | _, true, _, 'o' when legacy_behavior -> Int_Co\n | _, true, _, ('d' | 'i' | 'u') ->\n if legacy_behavior then (* ignore *)\n compute_int_conv pct_ind str_ind plus false space symb\n else incompatible_flag pct_ind str_ind symb \"'#'\"\n | true, _, true, _ ->\n if legacy_behavior then\n (* plus and space: legacy implementation prefers plus *)\n compute_int_conv pct_ind str_ind plus hash false symb\n else incompatible_flag pct_ind str_ind ' ' \"'+'\"\n | false, _, true, _ ->\n if legacy_behavior then (* ignore *)\n compute_int_conv pct_ind str_ind plus hash false symb\n else incompatible_flag pct_ind str_ind symb \"' '\"\n | true, _, false, _ ->\n if legacy_behavior then (* ignore *)\n compute_int_conv pct_ind str_ind false hash space symb\n else incompatible_flag pct_ind str_ind symb \"'+'\"\n | false, _, false, _ -> assert false\n\n (* Convert (plus, space, symb) to its associated float_conv. *)\n and compute_float_conv pct_ind str_ind plus hash space symb =\n let flag = match plus, space with\n | false, false -> Float_flag_\n | false, true -> Float_flag_s\n | true, false -> Float_flag_p\n | true, true ->\n (* plus and space: legacy implementation prefers plus *)\n if legacy_behavior then Float_flag_p\n else incompatible_flag pct_ind str_ind ' ' \"'+'\" in\n let kind = match hash, symb with\n | _, 'f' -> Float_f\n | _, 'e' -> Float_e\n | _, 'E' -> Float_E\n | _, 'g' -> Float_g\n | _, 'G' -> Float_G\n | _, 'h' -> Float_h\n | _, 'H' -> Float_H\n | false, 'F' -> Float_F\n | true, 'F' -> Float_CF\n | _ -> assert false in\n flag, kind\n\n (* Raise [Failure] with a friendly error message about incompatible options.*)\n and incompatible_flag : type a . int -> int -> char -> string -> a =\n fun pct_ind str_ind symb option ->\n let subfmt = String.sub str pct_ind (str_ind - pct_ind) in\n failwith_message\n \"invalid format %S: at character number %d, \\\n %s is incompatible with '%c' in sub-format %S\"\n str pct_ind option symb subfmt\n\n in parse 0 (String.length str)\n\n(******************************************************************************)\n (* Guarded string to format conversions *)\n\n(* Convert a string to a format according to an fmtty. *)\n(* Raise [Failure] with an error message in case of type mismatch. *)\nlet format_of_string_fmtty str fmtty =\n let Fmt_EBB fmt = fmt_ebb_of_string str in\n try Format (type_format fmt fmtty, str)\n with Type_mismatch ->\n failwith_message\n \"bad input: format type mismatch between %S and %S\"\n str (string_of_fmtty fmtty)\n\n(* Convert a string to a format compatible with an other format. *)\n(* Raise [Failure] with an error message in case of type mismatch. *)\nlet format_of_string_format str (Format (fmt', str')) =\n let Fmt_EBB fmt = fmt_ebb_of_string str in\n try Format (type_format fmt (fmtty_of_fmt fmt'), str)\n with Type_mismatch ->\n failwith_message\n \"bad input: format type mismatch between %S and %S\" str str'\n","(* generated code *)"],"names":[],"mappings":"aAy6F4B,uBACR,MADQ,QACR,QAAqB,UACvC,OAA+C,IAAnC,EAAgB,KAAhB,UAAmC,S,AAAA,I,AAAA,G,EAAA,KC36FjD,UD66FI,0B,CAC8D,C,OAd9C,MAAlB,QAAkB,QAAqB,UACvC,OAAiC,IAArB,cAAqB,S,AAAA,I,AAAA,G,EAAA,KCj6FnC,UDq6FiC,EAAvB,SAAuB,sB,CAAA,C,WA/1BR,qBAKrB,sCAA0B,mBAClB,O,CAAA,6B,CAAA,OAAa,aAMjB,I,CADA,E,CAAA,KAAuB,cAAoC,QAC3D,WAEA,E,CAAA,e,IAIiB,E,CAAA,UAIrB,OAjDA,iBAkDM,uBAdF,I,CAcE,qBAAa,OACR,E,CAAA,wBACF,E,CAAA,qBAjB8C,QACnD,cATsD,C,MAmCxD,6CAGgB,mBAFd,SAEc,iBAFd,oBAGF,gBAAa,C,mBATf,I,EAAA,S,EAAA,S,EAAA,S,EAAA,S,EAAA,kBAGA,yBAHA,EAwBA,EAZE,OArEF,iBAsEc,oCAAa,a,EAAA,sCAChB,SAAqB,cACrB,SAAsB,cACtB,SAAqB,cACrB,SAAqB,cACrB,SAAsB,gBAE7B,6CAWJ,OAxFA,iBAyFA,iBAEoB,aACA,KAEhB,eACK,sBADmB,O,EAEtB,sCAAa,YAGjB,EADqB,kBAAgC,UACrD,kBADqD,OACrD,uBAGA,6CAGA,mBAUE,8BAGA,+BAXA,eACE,4BACF,kCA5Bc,C,KA+DhB,O,EADA,EAAoB,mBAAgC,UACpD,gDADoD,OACpD,cAC0B,C,gBAlB5B,mDA/HA,iBAgIM,sBADN,EACM,mBAAa,K,EAEjB,SAWF,OA7IA,iBAkJM,uBAJN,kCAIM,uBAAa,YACH,oB,EAAA,uBACW,cASzB,kCAEA,wCAGA,cAOE,yBAHA,kC,GAjCF,gDACuB,C,GA6CR,2BAAa,2EAAb,yBAAa,iB,WAH9B,mDAhLA,iBAiLA,sCASA,OACgB,gBAES,2BAGK,SAFE,QAEF,UAFE,U,EAAA,OAGH,SAFE,QAEF,UAFE,U,IAItB,Q,CAAc,C,EA0E8B,EAA7B,EAAa,QAAgB,W,MAZO,QAC1C,iDAGd,cACK,8BADmB,IAHV,OAGU,M,EAFM,IAEN,OAFM,MAK9B,eACK,8BADmB,IALM,OAKN,MAEP,+BAAyC,C,MAxB5D,QACgB,yCAId,eACK,8BADmB,QAJV,OAIU,MAHW,sBAMnC,eACK,8BADmB,KALM,KAMiB,C,SAvBhD,EAAM,UAAY,YAAW,cACJ,aACA,2CAErB,eACK,gCADmB,QAFH,OAEG,MAKG,sBAF3B,eACK,gCADmB,KAGG,KAAG,C,EAxBhB,gBAAoB,OAAO,C,SAqb9C,wBA3oBF,iBA4oBQ,sCAAa,KAvBnB,mBA2Bc,sBAFZ,WAKA,0B,KAAA,GAAiD,C,cAInD,a,EAAA,gDAvpBF,iBAwpBQ,O,GAAA,iBAAa,EAAb,mBAAa,mBAEP,EArCZ,iBAqCY,8BAIa,SAzCzB,mBA0Ca,wBAGX,SAAgB,cA7ClB,iBAiDY,wBATV,UAcF,OA3qBF,iBA4qBQ,8CAAa,K,EAMjB,YAlrBJ,iBAmrBI,OAAY,4CAAiB,S,CAAA,EAIpB,eAFL,gBAAc,6BAhEpB,oCA0Dc,SAWZ,gBAAc,oB,GAAA,GAnBoC,C,EAzCpD,yBAEgD,C,KARhD,aACE,MAAyB,EAAzB,OAAyB,aAAzB,QAAwC,wBACtC,C,4CA1aN,EALA,I,EAAA,KAKA,QALA,I,EAAA,KAKA,QALA,I,EAAA,KAKA,QALA,I,EAAA,KAKA,MALA,aAaA,gBARA,EALA,I,EAAA,KAKA,QALA,I,EAAA,KAKA,MAQA,MAyBA,wBA2BA,EAXA,wBAWA,MA5DA,UA6DA,QAlEA,EA6EA,O,CAAA,Q,EAAA,yKAiLE,W,CAAA,gBAGkB,GAjClB,U,CADuB,cAAqB,KAC5C,WAxBU,E,CAAgB,KAAhB,OACa,cAAqB,OACzC,KAAU,QAMX,QADE,OAAiC,cACnC,SAJA,QADgD,IAArB,UAAqB,IAChD,cAd8B,OAAd,OAAd,KAscN,QACkB,EACA,EAFlB,QAEkB,aACA,KAGhB,eACK,sBADmB,O,EAE1B,wDAMY,OAFA,OAHA,OACA,mB,EAAA,2BAKA,OAFA,OAFA,4BAKI,kBACD,QACR,gBACP,gBAxdyB,cAAqB,OACzC,KAAU,OAKyB,OACpC,UADuB,KAArB,OAAwD,qBAC1D,WA/HwB,OAAW,gBACb,KAEA,wBADA,IACA,UADA,K,EAyHtB,QAD4C,IAAf,UAAe,MAC5C,a,EAnDmB,K,CAAA,EAAoC,mBAsctC,EAtcsC,iBAsctC,e,EAAA,U,GAAA,mCACkB,MAChC,GAxckE,GAChD,cAAqB,OA0crB,I,CAAA,kB,EAAA,wBACO,OAAvB,mBACA,QAAqB,gBAtc1B,sBAJC,KAAU,KAIX,E,CAFA,QADA,YACA,aAtBA,OADyD,OAA/C,IAAiC,KAAjC,M,CAAA,YAEW,cAAqB,OACzC,KAAU,OAK6B,OACxC,UADuB,KAArB,OAA4D,qBAC9D,WAJA,QADiD,MAAf,UAAe,IACjD,a,EAiGoB,EADR,qBACQ,UAAqB,OAC3C,UAAuB,cAA2B,OAClC,OACb,KAAU,QAIyB,QAAf,UAAe,aAFpC,QADiD,IAAf,UAAe,MACjD,cAlBF,QADuB,cAAqB,KAC5C,WA7GU,E,CAAgB,KAAhB,OACa,cAAqB,OACzC,KAAU,QAMX,QADE,OAAiC,cACnC,SAJA,QADkD,IAArB,UAAqB,IAClD,cA6GG,QAFkB,cAAqB,OAEvC,QADF,KAAU,KACR,E,CADc,yBA9HI,cAAqB,OAChC,YAAe,OAVtB,KAAU,QAER,mBADA,2CAIF,KAAU,QAER,mBADA,0BAQF,cArSP,eAsS8C,GAfvC,KAAU,QAER,mBADA,0B,MAgIP,QADuB,cAAqB,KAC5C,WAmNF,OAjnBA,iBAooBA,sBAjBe,aAIf,KAMA,kBAOA,kCAyDA,OA7rBA,iBA+rBQ,I,CAAA,kCAAa,OAGrB,IAFa,OAEb,GADW,E,EA5DT,SAroBF,iBAsoBU,K,EAAA,iBACR,WADQ,iBACR,SA4Da,WACf,IAA2B,SAAqB,GAlQvB,cAAsB,OAC1C,KAAU,QAI4B,QAAf,UAAe,aAFvC,QADoD,IAAf,UAAe,MACpD,cAvIQ,E,CAAgB,KAAhB,OACa,cAAqB,OACzC,KAAU,QAMX,QADE,OAAiC,cACnC,SAJA,QADuD,IAArB,UAAqB,IACvD,cAuBA,YANqB,cAAqB,OAM1C,QAJC,KAAU,KAIX,E,CAFA,QADA,YACA,aArCG,QAFkB,cAAqB,OAEvC,QADF,KAAU,KACR,E,CADc,yBAvBnB,cAAqB,GA6JP,kBACd,G,EAAA,KAAuB,cAA2B,OAC5B,cAAqB,KAC3B,KACb,KAAU,QAI2B,QAAf,SAAe,aAFtC,QADmD,IAAf,UAAe,MACnD,cArBF,QADuB,cAAqB,KAC5C,c,CAAA,kB,EAAA,wBAvDiC,sCAAf,OAAd,OADqC,OAAvC,EAAoD,OAApD,wBAEF,OAAuB,cAA2B,OAC/C,KAAU,OAK6B,OACxC,UADuB,KAArB,OAA4D,qBAC9D,WAJA,QADuD,MAAf,UAAe,IACvD,a,EAhBiB,sCAAf,OADmD,OAAd,OAAvC,EAAoD,OAApD,wBAEF,OAAuB,cAA2B,OAC/C,KAAU,OAK6B,OACxC,UADuB,KAArB,OAA4D,qBAC9D,WAJA,QADmD,MAAf,UAAe,IACnD,a,IAAA,UAoBiB,sCAAf,OADmD,OAAd,OAAvC,EAAoD,OAApD,wBAEF,OAAuB,cAA2B,OAC/C,KAAU,OAK6B,OACxC,UADuB,KAArB,OAA4D,qBAC9D,WAJA,QADmD,MAAf,UAAe,IACnD,a,GA6EF,kB,CAAA,iBAtLF,EA8LA,eAA4B,+B,CAAA,EAE1B,qBACF,e,CAAA,gB,CAAA,EACE,qBACF,e,CAAA,gB,CAAA,EACE,qBACF,2BAAqB,M,GAAyC,KAC5D,qBACF,2BAAqB,M,GAAgD,KACnE,MAA+C,KAA/C,0BAEF,oB,CAAA,EAAoB,yBAKpB,e,CAAA,gB,CAAA,E,EACE,M,CAAA,c,CAAA,U,CAAA,W,CAAA,cAEiC,Y,CAAA,GAE7B,M,CAAA,gBAEN,Q,oBAKA,E,EAAA,iCAA0B,K,EAElB,OAFR,aAEQ,gCAAa,8B,EAAA,kBAUjB,YADA,OAAuB,cAA2B,KAClD,UAHA,oC,EAAA,sBAFA,YADA,OAAuB,cAA2B,KAClD,UAHA,oCAsBA,YADA,OAAuB,cAA2B,KAClD,iB,EAAA,+DAQA,YADA,OAAuB,cAA2B,KAClD,UAXA,YADA,OAAuB,cAA2B,KAClD,UAgFJ,YAxEI,SA0EgB,cACV,mBAAe,GAAf,mBAAe,iB,CAAA,EAEG,cAA+B,mBACrC,YACb,oCAAe,KAAa,UAE/B,qBADQ,OAAR,KAAQ,EAAR,UAAQ,EAAR,QAAQ,aACR,iB,EACK,a,AAAA,I,AAAA,G,EAAA,KC/oFf,+C,CAAA,yD,CAAA,QDipFQ,KAZJ,EAYI,QAOF,WADuB,gBAAqB,KAC5C,SAHA,QAGA,2BAJuB,YAAsB,KAC7C,WA9CF,WArDI,SAqDJ,S,GAE4B,4CAAa,MAAa,U,EAClD,KAAgB,cACV,sCAAe,iB,CAAA,EAEI,cAA+B,mBACpC,YACV,oCAAe,uBAGjB,IADQ,OAAR,KAAQ,EAAR,UAAQ,EAAR,QAAQ,aACR,sCAEwB,cAA+B,mBACvC,YACb,oCAAe,KAAa,UAE/B,IADQ,OAAR,KAAQ,EAAR,UAAQ,EAAR,QAAQ,aACR,sB,GACK,UAEN,iB,AAAA,I,AAAA,G,EAAA,KC3nFf,0H,GDgoFI,UADuB,gBAAsB,KAC7C,UArEI,YADA,OAAuB,cAA2B,KAClD,UAdA,WADA,OAAuB,cAA2B,KAClD,UAoBS,kCAAyB,0CAAiB,KAEnD,YADA,OAAuB,cAA2B,KAClD,WAGA,aADuB,cAAqB,KAC5C,UAtBA,WADA,OAAuB,cAA2B,KAClD,aAyBA,oBADA,OAAuB,cAA2B,KAClD,cAAiD,C,kBAKrD,oB,EAAA,E,EAAA,e,CAAA,kBAC4B,UACpB,oB,EAAA,iBAAa,KAEP,OAAV,OAAU,MAAV,QAAU,eACV,iBAAuB,UACT,SAAd,iBAAc,EAAd,QAAc,eACd,OAAuB,cAAuB,OAE9C,IADsB,EAAtB,OAAsB,YAAuB,KAC7C,QAGA,QAFA,UAC+C,WAAzB,WACtB,Y,EAEA,U,GAAA,K,AAAA,I,AAAA,G,EAAA,GC5lFR,kDD8lF6B,E,CAAA,cAIvB,QAFA,UAC+C,YAAzB,YAHsB,UAI5C,cAA+C,C,KAgMjD,WACE,6BAGI,oCAAa,K,EAEjB,cA7vBF,iBA8vBE,SAAG,0CAAiB,OAAoC,I,EACtD,SAAY,4CAAiB,sB,EAAA,sBAuB3B,4BARA,OAAc,cACd,yBAbA,cAlwBN,iBAmwBM,SAAY,4CAAiB,KAK3B,OAAc,aACd,uBAJA,OAAc,cACd,eAIK,c,MAAA,OAQP,OAAc,aACd,sBAMA,6BAEA,iBAEC,mBAA4C,C,KAcnD,0GAI8B,MAIA,MAFA,MALqC,MAArC,MAGqC,gBAFrC,c,CAAqC,Q,IAAA,4B,EAAA,wDAGrC,MAMA,MAJA,MAGA,MADA,MAJqC,sCAFrC,c,CAAqC,Q,EAAA,G,GAAA,mB,EAAA,oDAS5C,cAAmB,MAEnB,cAAmB,MAExC,cAEK,oBADH,S,EAJmB,Y,CAAA,EAAmB,2BAmBlB,gBAPtB,cAEK,oBADH,S,IAAA,SAGF,cAEK,oBADH,S,EAVF,cAGK,sBADH,S,OAUgC,C,KA4BlC,EAAa,YAAb,YAAa,EAAb,QAAa,eACb,+BAGgC,C,MAnKlC,0CAxsBA,iBAysBG,yCAAa,KAAY,cAAwC,I,GAAA,GAAO,C,QAoB3E,OA7tBA,iBA6tBA,EACM,sCAAa,YACH,2BACP,cAhuBT,iBAkuBE,SAAM,4CAAiB,WAKrB,2BAFA,IADA,OAAkB,kBAAsC,UACxD,EADwD,OACxD,c,GAIG,mBAAY,C,KA3BnB,WA9sBA,iBA+sBM,sCAAa,WASZ,cAPL,eACA,MADA,QACA,QACE,oCAIA,oB,KAAA,GACe,C,QAuBQ,wBACjB,UACuB,gB,EAAe,QAAf,gBAAe,eACgB,QAA7B,YAAzB,QAAyB,aAA6B,aAFtD,YAEsD,GAAO,C,EA9tBvE,6BAE2B,C,EAV3B,6BAEiB,C,EAtBjB,2BAEiB,C,0BApBnB,QAiBA,kBAmCA,qCApDA,UAEY,gBAkDZ,IAfA,aAeA,6BAPA,eAOA,wJAm1BG,UAn1BH,EAm1BG,I,MAh7BW,kBACO,I,EAAA,IAEA,cADA,QACA,UADA,SAW+C,OACpE,QACwB,qCACA,QADA,cACA,aACA,QADA,OACA,cAA2C,C,KA3BtD,QACW,mCACA,QADA,cACA,WACA,QADA,OACA,YAAoC,C,OA7CxD,gBAAgB,IACR,sB,EAAA,mBAAO,Q,CAAA,EAEN,IADS,mBACR,C,KALS,iCAAiD,C,0BAFrE,eAAQ,O,EAET,oBAgBa,IAfb,EAFA,MAEA,MAea,KACF,IAVT,O,CAAA,EACQ,4BAAO,YACG,gBASL,SAAf,cAAe,EAAf,QAAe,eACF,SACF,IART,O,CAAA,E,EACQ,8BAAO,mBACS,mBAO1B,uCACwB,eACF,SADE,YACF,EADE,QACF,aAAd,EAAqD,I,AAAA,I,AAAA,G,EAAA,KCz8DjE,0DD08D0B,MAAc,O,EACtB,OACd,QAAuB,OAQvB,MAPA,e,CAAA,c,CAAA,gBAEgB,qBAGA,qBADA,qBADA,OAGA,KAAc,G,SALd,KAMhB,OApCe,QAoCG,C,KA5CR,qBAA6B,MAAX,QAAW,aAAqB,qB,KAF3C,SAEnB,GADU,KAAV,QAAU,aACV,GACA,gBAA4B,C,SAxBH,WAeK,4DAJA,EAIA,OAJA,QAAc,wCAFd,EAEc,OAFd,QAAc,wCAKd,EALc,OAKd,QAAc,iCADd,mBADA,EACA,OADA,QAA0C,EAAN,mBAAM,uEAPtE,YAAgB,KAAF,QAAE,cAAwB,eAExC,YAAgB,KAAF,QAAE,cAAwB,G,EAAA,qBALhC,SACR,YAAc,2BAYgB,C,SApCP,WAeK,4DAJA,EAIA,OAJA,QAAc,wCAFd,EAEc,OAFd,QAAc,wCAKd,EALc,OAKd,QAAc,iCADd,mBADA,EACA,OADA,QAAc,mEAP1C,YAAgB,KAAF,QAAE,cAAwB,eAExC,YAAgB,KAAF,QAAE,cAAwB,G,EAAA,qBALhC,SACR,YAAc,2BAYgB,C,SAnCP,WAeK,4DAJA,EAIA,OAJA,QAAc,wCAFd,EAEc,OAFd,QAAc,wCAKd,EALc,OAKd,QAAc,uBADd,EACc,UADd,QAAc,qCADd,EACc,OADd,QAAc,mEAP1C,YAAgB,KAAF,QAAE,cAAoB,eAEpC,YAAgB,KAAF,QAAE,cAAoB,G,EAAA,qBAL5B,SACR,YAAc,2BAYgB,C,EAhIlB,U,EAAA,U,EAAA,W,MAwDR,kBAEgB,iBAAwB,cAApC,SAA8B,OAA9B,aAAoC,W,KAcf,4BAAuB,C,KANnB,8BAAG,C,eA9DvB,2C,CAAA,KAsET,kB,EAAA,qDAhCA,E,CAAA,EAgCA,mBAhCA,WAIA,+CAwBA,Y,CAxBA,OAwBA,KAxBA,eAwBA,KAEA,Y,CAFA,UAEA,KAFA,kBAEA,K,EAAA,yBAxBA,OAkBA,K,CAAA,SAlBA,mBAkBA,WAJ6B,GAAvB,E,CAAA,EAIN,UAJM,UAAuB,KAxBQ,GAA/B,GAAO,E,CAAA,EAwBgB,UAxBhB,UAAP,GAA+B,KAkBrC,mB,CAlBqC,mBAkBrC,a,CAAA,8CAxB6B,GAAvB,E,CAAA,EAwBN,OAxBM,UAAuB,sBAEA,GAAvB,E,CAAA,EAFuB,UAEvB,UAAuB,KAEQ,GAA/B,GAAO,E,CAAA,EAFgB,UAEhB,UAAP,GAA+B,K,IAAA,gCA2CnB,qBAEU,GAAtB,E,CAAA,cAAsB,KAIQ,GAA9B,GAAO,E,CAAA,cAAP,GAA8B,K,EAFR,GAAtB,E,CAAA,cAAsB,K,EAAA,iCAIA,GAAtB,E,CAAA,cAAsB,KAIQ,GAA9B,GAAO,E,CAAA,cAAP,GAA8B,K,EAFR,GAAtB,E,CAAA,cAAsB,K,EAAA,gBAIQ,GAA9B,GAAO,E,CAAA,cAAP,GAA8B,KAIQ,GAAtC,GAAO,GAAO,E,CAAA,cAAP,GAAP,GAAsC,K,EAFR,GAA9B,GAAO,E,CAAA,cAAP,GAA8B,K,MAAA,mBA/EP,GAAvB,E,CAAA,EA+E8B,OA/E9B,UAAuB,sBAEA,GAAvB,E,CAAA,EAFuB,UAEvB,UAAuB,KAEQ,GAA/B,GAAO,E,CAAA,EAFgB,UAEhB,UAAP,GAA+B,K,IAAA,mBAVR,GAAvB,E,CAAA,EAU+B,OAV/B,UAAuB,sBAEA,GAAvB,E,CAAA,EAFuB,UAEvB,UAAuB,KAEQ,GAA/B,GAAO,E,CAAA,EAFgB,UAEhB,UAAP,GAA+B,K,IAAA,K,CAAA,yBA4DlC,C,MAwBP,uBAKI,iBAEwC,GAAlC,MAFN,UAEM,UAAkC,K,KAhX1C,OACA,IADA,gBACA,eAA0B,C,WA7B9B,OAAU,EAAV,QAAU,aACV,SACA,GAAU,MAAV,QAAU,eACV,mBA8BI,MADsD,UA7B1B,uBA6B0B,IACtD,eAA0B,C,EAEY,EAAG,C,MAgPX,QAC9B,gBADU,SAAoB,mBAApB,GACV,qBAA8C,C,MANhB,QAE9B,gBADW,SADD,OAAoB,UAApB,OACC,GACX,qBAA+C,C,MAOjB,QAC9B,gBADU,SAAoB,cAApB,GACV,qBAA8C,C,MAlBhB,QAC9B,gBADU,cAAoB,mBAApB,GACV,qBAA8C,C,MANhB,QAE9B,gBADW,cADD,OAAoB,UAApB,OACC,GACX,qBAA+C,C,MAOjB,QAC9B,gBADU,cAAoB,cAApB,GACV,qBAA8C,C,MAlBpC,QACV,gBADU,mBACV,qBAA8C,C,MALhB,QAC9B,gBADU,OAAoB,UAApB,OACV,qBAA8C,C,MAOpC,QACV,gBADU,cACV,qBAA8C,C,MAhL9C,oDAA8C,C,MAEhD,kBACc,iBAAwB,cAApC,SAA8B,OAA9B,aAAoC,W,KA9Ba,sBAAK,C,MAA7C,uDAAoD,C,KAEtD,0CAAuC,C,KAuD9C,kDAAgE,C,KAJhE,kDAAgE,C,MAnBzD,qCAA0B,C,KAMG,OACpC,IADqD,UAAjB,OAAiB,IACrD,eAA0B,C,kBAnEf,iD,CAAA,KAuFb,E,CAAA,gB,EAAA,uEAzDmC,E,CAAA,E,CAyDnC,mBAzD6B,IAyD7B,OAzD6B,aAAM,WA2CnC,E,CAAA,E,CA3CmC,mBA2CnC,WAjCA,+CAsCA,Y,CAAA,E,CAtCA,OAsCA,GAEA,QAxCA,eAwCA,KAEA,Y,CAAA,E,CAFA,UAEA,GAEA,QAJA,kBAIA,K,EARA,M,CAQA,YARA,MAQA,OARA,KA7BA,M,CA6BA,YA7BA,MA6BA,OA7BA,KAFA,M,CAEA,YAFA,MAEA,OAFA,KAHA,M,CAAA,MAGA,UAHA,KAlBA,E,CAAA,E,CAkBA,0BAlBA,WAJA,E,CAAA,E,CAIA,0BAJA,GAIA,OAJA,WAFA,E,CAAA,E,CAEA,0BAFA,GAEA,OAFA,WAFA,E,CAAA,E,CAEA,0BAFA,GAEA,OAFA,WAFA,E,CAAA,E,CAEA,0BAFA,GAEA,OAFA,WAFA,E,CAAA,E,CAEA,mBAFA,gBAyDA,Y,CAAA,E,CAzDA,UAyDA,KAJA,Y,CAAA,E,CAIA,UAJA,KALA,Y,CAKA,UANA,M,CAAA,OACA,MAhCA,Y,CAAA,E,CAgCA,UAhCA,KAFA,e,CAAA,E,CAEA,UAFA,MA6BA,mB,CAAA,E,CA7BA,mBA6BA,2BALS,SACT,Y,CAAA,E,CAAA,mDAsK8B,qBAE9B,Y,CAAA,E,CAAA,UAQA,e,CAAA,E,CAAA,U,EAJA,Y,CAAA,E,CAAA,IAIA,UAJA,M,EAAA,qDAQA,Y,CAAA,E,CAAA,cASA,e,CAAA,E,CAAA,c,EAJA,Y,CAAA,E,CAAA,QAIA,UAJA,M,EAAA,4BAQA,e,CAAA,E,CAAA,YASA,e,CAAA,E,CAAA,Y,EAJA,e,CAAA,E,CAAA,MAIA,UAJA,M,MA/OA,E,CAAA,E,CA+OA,mBA/OA,cAJA,Y,CAAA,E,CAIA,UAJA,KAJA,Y,CAAA,E,CAIA,UAJA,GAqFK,C,UAQY,6BAakB,iC,EAAA,mBADA,IACA,OADA,8B,GAI0B,C,MASzB,4CAA8B,C,MAiBzD,QAA4C,YAAtB,cAAtB,OAAsB,aAAsB,iBAAI,C,MATnB,4CAA8B,C,UATjD,sBAeQ,gFAFA,gBADA,gBADA,gBACA,UADA,MADA,gBACA,UADA,MADA,mBACA,UADA,oCAQZ,OAAN,WACT,0BAJ2B,gBAI3B,UAJ2B,MANA,gBAMA,UANA,MADA,gBACA,UADA,MADA,gBACA,UADA,MADA,gBACA,UADA,MADA,gBACA,UADA,MADA,gBACA,UADA,MADA,gBACA,UADA,MADA,gBACA,UADA,KAiB8B,C,EAQ3D,oCAAsE,C,MAkBV,QACxD,KADiE,WAA7B,SAAoB,sBAApB,GAA6B,IACjE,iBAAyB,C,MALmC,QAC5D,KADqE,WAAjC,cAAwB,sBAAxB,GAAiC,IACrE,iBAAyB,C,MALW,QACpC,KAD2C,WAAP,sBAAO,IAC3C,iBAAyB,C,UAJF,qBAEzB,2CAIA,kBAJA,cAIA,KAIA,qBAJA,UAIA,MAE2B,C,MAwC0B,QACnD,gBADU,SAAoB,OAAqB,mBAArB,GAApB,GACV,qBAA8C,C,MALhB,QAC9B,gBADU,SAAoB,mBAApB,GACV,qBAA8C,C,MAOK,QACnD,gBADU,SAAoB,EAAqB,mBAArB,GAApB,GACV,qBAA8C,C,MAjBK,QACnD,gBADU,cAAoB,OAAqB,mBAArB,GAApB,GACV,qBAA8C,C,MALhB,QAC9B,gBADU,cAAoB,mBAApB,GACV,qBAA8C,C,MAOK,QACnD,gBADU,cAAoB,EAAqB,mBAArB,GAApB,GACV,qBAA8C,C,MAjBhB,QAC9B,gBADU,OAAoB,mBAApB,GACV,qBAA8C,C,MALpC,QACV,gBADU,mBACV,qBAA8C,C,MAOhB,QAC9B,gBADU,EAAoB,mBAApB,GACV,qBAA8C,C,UAZZ,uCAEpC,yBAQA,6BAJA,oBAIA,UAJA,8DAQA,6BAQA,iCAJA,wBAIA,UAJA,iCAQA,8BAQA,+BAJA,yBAIA,UAJA,OAMgD,C,MAuDjB,QAAK,0BAAL,sBAAK,W,MAJZ,wBACT,2BAEf,kBAFe,UAEf,KACoC,C,KAt/C+B,QAAtB,MAAsB,MA8tCrE,KAAsB,KACH,C,IA1Bc,kBAAgB,MAEd,GAAoB,GAApC,4BACL,GAF4B,EACa,UACpC,C,QAjBjB,oCAGoB,KADA,KAEX,GAJT,EAKA,E,CAAA,mBAA8B,C,mBANhC,iBAeA,OAIA,kCAQe,OAAb,IAA2C,EALd,KAAQ,MADH,KAAQ,sBAD/B,MAIY,OAAb,MAhBV,OARF,EAcK,EAJD,aAAgB,K,EACR,iCAAO,mC,CAAA,EACQ,OACd,YACE,E,CAAA,EAAe,4BAWY,WAEG,C,GAhCoB,EArE5C,mIAqEG,IAAyC,I,GAFI,EAnDhD,mIAmDG,IAA6C,I,GAFJ,EAzD5C,mIAyDG,IAAyC,I,GAFH,EAvE1C,mIAuEI,IAAsC,I,KAbhD,uDAAoB,uCAAU,C,YAb5C,aAII,sBAEgB,K,EADd,0BACc,2BAKlB,wBAAU,MAIV,iBADA,iBACA,MAFA,EADA,I,EAAA,GACA,MAEA,EACE,0BAGO,UADH,O,GAAmB,UAAqB,QAAW,UAAK,yBAG9D,wBACK,GAAC,C,SAjCK,EAAX,OAAW,eACA,UAvoCwD,QAAtB,MAAsB,MAyoCnE,QACA,QACA,UACA,EAAsB,EADC,QACD,aAAtB,IACA,QAAwB,KACL,C,OAlDX,EAAV,QAAU,aACV,SACA,GAAU,MAAV,QAAU,eACV,mBAAgC,uBACN,C,WA1Bf,EAAX,OAAW,eAAX,EAEM,YADN,MACa,EAAP,SAAO,oC,EAAA,YASqC,E,EATrC,uBAMF,mBAGuC,EAHvC,KAGuC,EAHT,gBAAO,MAAU,gBAAO,OAC/D,YAAU,MAAV,QAAU,eACM,SAAhB,kBAAgB,OAAhB,GACA,QADuB,UACvB,EADuB,KACvB,EADuB,QACvB,cAAgD,yBARpB,qBAGoB,EAFhD,OAAU,MAAV,QAAU,aACV,mBACA,QADiB,UACjB,EADiB,KACjB,EADiB,QACjB,cAAgD,yBAON,cAE1C,MADU,MAAV,QAAU,eACV,mCAAsC,yBAGtC,OAAG,C,QAhDL,YAWoB,OAZpB,WAEE,EAUkB,OAVlB,eAWF,QAAqB,I,EACT,EAAwC,EAAS,EAA3D,QAAU,EAAiD,QAAjD,eACV,qBAGa,O,EAAY,cAAO,KAAU,cAAO,KAAU,cAAO,OAChD,OAAhB,gBAAgB,OAAhB,GACA,QADuB,aACvB,EADuB,KACvB,EADuB,QACvB,cAAiD,IACtC,OAAW,cAAO,K,EAAW,gBAAO,MAAU,gBAAO,OAChD,SAAhB,kBAAgB,OAAhB,GACA,QADuB,aACvB,EADuB,KACvB,EADuB,QACvB,cAAiD,KAEjD,8CAAuC,GAR9B,8CAAuC,GADvC,uCAWX,4BAA0B,C,MAlCD,QAAa,EAAb,SAAY,OAAvB,aAAwB,W,SAhTjB,oBAAyB,wBAEzC,UAAmB,C,aAQT,QAmHc,eAnHd,aAmHc,kHAyBZ,cAsBC,K,CAAA,qBAIhB,YADmC,EAHnB,OAGmB,UAA8B,UACjE,IADiE,OACjE,OACK,2B,EAAA,qB,GAAA,2BATL,cAAoD,YACtD,cADsD,OACtD,IADsD,YACtD,IADsD,OACtD,MAJA,IAIA,mBAJA,oC,EAAA,wB,CA5CA,UA4CA,0BA7CmC,UAAmC,UACtE,IADsE,OACtE,8B,CAHA,UAGA,iCAJmC,UAAmC,UACtE,IADsE,OACtE,8B,CAHA,UAGA,iBAJmC,UAAmC,UACtE,IADsE,OACtE,oBAmB8B,IAnB9B,SAmB8B,gCAI9B,gBAJ8B,OAEK,YAA2B,UAE9D,UADmC,EAD2B,OAC3B,UAA2B,UAC9D,IAD8D,OAC9D,4BAIA,gBAJA,OAEmC,YAA2B,UAE9D,UADmC,EAD2B,OAC3B,UAA2B,UAC9D,IAD8D,OAC9D,M,EAlCA,QAkCA,mBAnCmC,YAAmC,UACtE,IADsE,OACtE,8B,CALA,UAKA,iBANmC,UAAmC,UACtE,IADsE,OACtE,8B,CAHA,UAGA,iBAJmC,UAAmC,UACtE,IADsE,OACtE,8B,CAJA,EAIA,yCATsE,IAStE,SATA,OAAgD,aAAsB,MAApC,IAArB,EAAyD,OAAzD,aAAqB,IAA/B,IAAmE,EACpE,UAIF,YAFE,EAAyB,EAD3B,OAC2B,aAAzB,UAA+C,UAEjD,IAFiD,OAEjD,M,EAAA,wB,CARA,EAQA,gCAVA,IAUA,OAVA,QAUA,SAVA,IAAG,EAA2C,EAAM,UAEpD,YADmC,cAAmC,UACtE,IADsE,OACtE,M,EANA,QAMA,mBAPmC,YAAmC,UACtE,IADsE,OACtE,MAHA,QAGA,mBAJmC,YAAmC,UACtE,IADsE,OACtE,MAJA,QAIA,UALmC,YAAmC,UACtE,IADsE,OACtE,2BARM,YAAsB,e,CAAA,8BAG1B,UADmC,EAFT,OAES,UAAmC,UACtE,IADsE,OACtE,OAC4B,+CAXxB,YAA2B,e,CAAA,8BAG/B,YAH+B,OAEI,EAFJ,OAEI,UAAmC,UACtE,IADsE,OACtE,OAC+B,+CAX3B,YAA2B,e,CAAA,8BAG/B,YAH+B,OAEI,EAFJ,OAEI,UAAmC,UACtE,IADsE,OACtE,OAC+B,+CAX3B,YAA2B,e,CAAA,8BAG/B,YAH+B,OAEI,EAFJ,OAEI,UAAmC,UACtE,IADsE,OACtE,OAC+B,+CAX3B,YAA2B,e,CAAA,8BAG/B,YAH+B,OAEI,EAFJ,OAEI,UAAmC,UACtE,IADsE,OACtE,OAC+B,+CAX3B,YAA2B,e,CAAA,8BAG/B,YAH+B,OAEI,EAFJ,OAEI,UAAmC,UACtE,IADsE,OACtE,OAC+B,+BAX3B,YAAsB,e,CAAA,8BAG1B,UADmC,EAFT,OAES,UAAmC,UACtE,IADsE,OACtE,OAC4B,+BAXxB,YAAsB,e,CAAA,8BAG1B,UADmC,EAFT,OAES,UAAmC,UACtE,IADsE,OACtE,OAC4B,kC,CAN9B,UAM8B,iBAPK,UAAmC,UACtE,IADsE,OACtE,W,CAAA,qBAHA,QAGA,iBAJmC,UAAmC,UACtE,IADsE,OACtE,QAkHK,UAAmB,C,KA4D1B,UADmC,uBAAyB,UAC5D,IAD4D,OAC5D,IAAiD,C,gBAOxB,qBA0E+B,QAAzB,cAAyB,4F,CA1BtD,UA0BsD,UA3BpD,EA2BoD,OA3BpD,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAmCoD,EAnCpD,kDAuBwE,IAvBxE,SAuBA,OAAiD,aAAuB,MAArC,IAAtB,EAA2D,OAA3D,aAAsB,IAAhC,IAAqE,EACnE,UACmE,IAAvB,EAAjD,OAAiD,aAAuB,MAArC,IAAtB,EAA2D,OAA3D,aAAsB,IAAhC,IAAqE,EACnE,UACkB,SAAN,SACE,GAAwB,YAChC,IADgC,OAChC,cACA,oBAEwB,EADnC,OACmC,aAAjC,cAA0E,YAGxB,YAHwB,OAG5C,OAAoB,Y,IAAA,wB,CAhBpD,EAgBoD,uBAnBpD,IAmBoD,OAnBpD,QAmBoD,SAnBpD,IAAG,EAA6C,EAAM,UAGtD,UADE,gBAA8D,UAChE,IADgE,OAChE,M,EAAA,wB,CAvBA,UAuBA,UAxBE,EAwBF,OAxBE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,8B,CAJA,UAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,W,CAAA,qBAJA,QAIA,UALE,EAKF,OALE,UAA8D,UAChE,IADgE,OAChE,QAuEK,UAAmB,C,MAhSM,gBAAsB,kBAEpD,IAFoD,YAEpD,IAFoD,OAEpD,sB,CAAA,qBAIA,IAJA,OAIA,IAJA,OAIA,OAC+B,WAH/B,IAG+B,YAH/B,IAG+B,UAH/B,IAG+B,OAH/B,KAGkD,C,MAnBrC,QACI,mCACY,QADZ,cACY,gB,CAAA,qBACK,QADL,UACK,IADL,OACK,OAC7B,UAAmB,C,SAtHf,WAqDqB,2GApBsB,GAAmB,2BAmC5D,cAa4D,IAAlB,KAAkB,S,EAAA,0BADjB,KAAkB,wB,IAlChB,IAkCgB,UAlCnC,GAAmB,MADG,IACH,UADhB,GAAmB,MAXA,IAWA,UAXnB,GAAmB,2BAiBT,KA1DhC,kBACY,GAyDmB,uBAnBS,IAmBT,UAnBV,GAAmB,MADA,IACA,UADnB,GAAmB,MAQhB,IARgB,cAQhB,EARgB,OAQjC,GAAiB,MAFN,IAEM,mBAFvB,GAAiB,+BAIN,iBAX2B,IAW3B,OAXQ,GAAmB,2BANzD,IAMyD,OAP3C,GACd,IAAc,GACd,uBALA,IAKA,OANc,GACd,IAAc,GACd,uBALA,IAKA,OANc,GACd,IAAc,GACd,uBALA,IAKA,OANc,GACd,IAAc,GACd,uBALA,IAKA,OANc,GACd,IAAc,GACd,6DA4C0C,C,EAK3B,UACA,GAC0C,IAD1C,UACa,KAA6B,M,EA6B1C,QACI,qBACA,GACA,YAAY,C,EAKf,kBACK,GAEA,YADA,GACY,C,EAzQT,IAAX,KAAW,kBAAW,IAAI,C,KA2Ef,IAAX,OAAW,kBAAsB,wBAAW,IAAI,C,EAjFhD,IAAI,C,SAVb,QASJ,sFAoEA,WApEA,UAmEqB,GAAkB,OACvC,UADuC,OACvC,SANA,WAMA,UAPqB,GAAkB,OACvC,UADuC,OACvC,SALA,WAKA,UANqB,GAAkB,OACvC,OADuC,OACvC,MAVA,WAUA,UAXqB,GAAkB,OACvC,OADuC,OACvC,MAKA,WALA,UAIqB,GAAkB,OACvC,OADuC,OACvC,oCA0BqB,GAAkB,SAGvC,WAHuC,OACxB,SAAN,SACY,GAAgB,OACrC,YADqC,OACrC,SAPA,WAOA,UARqB,GAAkB,OACvC,OADuC,OACvC,MAjCA,WAiCA,UAlCqB,GAAkB,OACvC,OADuC,OACvC,MALA,WAKA,UANqB,GAAkB,OACvC,OADuC,OACvC,MAVA,WAUA,UAXqB,GAAkB,OACvC,OADuC,OACvC,MAKA,WALA,UAIqB,GAAkB,OACvC,OADuC,OACvC,MAVA,WAUA,UAXqB,GAAkB,OACvC,OADuC,OACvC,MALA,WAKA,UANqB,GAAkB,OACvC,OADuC,OACvC,MALA,WAKA,UANqB,GAAkB,OACvC,OADuC,OACvC,MALA,WAKA,UANqB,GAAkB,OACvC,OADuC,OACvC,KA8E8D,C,YA4BjD,0BA8CiB,M,EAAA,mCACX,kB,EAAA,sE,CAAA,E,EAAA,+CApBkB,IAAnB,EAoBC,UApBD,OAAmB,OACX,qB,CAAA,E,EAAA,6B,GAAA,QANuC,IAAnB,EAMpB,UANoB,OAAmB,OAC/C,qB,CAAA,E,EAAA,6B,GAAA,OALsC,IAAnB,EAKnB,UALmB,OAAmB,OACzC,qB,CAAA,E,EAAA,6B,GAAA,MAL+C,IAAnB,EAK5B,UAL4B,OAAmB,OAC7C,qB,CAAA,iCAL6C,IAAnB,EAK1B,OAL0B,OAAmB,OAC7C,qB,CAAA,E,EAAA,mGA2BF,SAAN,SACU,GAAgB,YACxB,IADwB,OACxB,cACA,oBACmC,QAAjB,WAAiB,OACtB,qB,CAAA,E,EAAA,wEAXM,EAWN,OAXM,SAAF,IAAb,WAAa,SACN,sEA9BqC,IAAnB,EA8BlB,UA9BkB,OAAmB,4DAKG,IAAnB,EALgB,UAKhB,OAAmB,4DAFA,IAAnB,EAEmB,UAFnB,OAAmB,4DACY,IAAnB,EADO,UACP,OAAmB,4DAFZ,IAAnB,EAE+B,UAF/B,OAAmB,4DADN,IAAnB,EACyB,UADzB,OAAmB,4DAFS,IAAnB,EAEU,UAFV,OAAmB,W,CAAA,E,EAAA,+CADN,IAAnB,EACyB,UADzB,OAAmB,QA+CxC,iBAJK,gBAVF,gBALI,gBALR,gBAJH,gBAJE,gBAJA,eAoCc,C,MAlM3B,QAuBY,oEALuC,IAKvC,UAL4B,OAAW,MADhB,IACgB,UAD3B,OAAW,MADN,IACM,UADjB,OAAW,MAFI,IAEJ,UAFP,OAAW,MACA,IADA,UACX,OAAW,MAOD,IAPC,0BAOV,OAAS,MAFR,IAEQ,mBAFjB,OAAS,MARO,IAQP,UARJ,OAAW,MADE,IACF,UADT,OAAW,MAFA,IAEA,UAFX,OAAW,MACQ,IADR,UACH,OAAW,MAFR,IAEQ,UAFnB,OAAW,MADJ,IACI,UADf,OAAW,MAMM,IANN,UAML,OAAW,MAPJ,IAOI,UAPf,OAAW,KAiBP,C,YArW5B,mBACK,EAAmB,EAAtB,OAAsB,aAAnB,OAAkC,OAChC,cAED,EAAN,OAAM,aAAa,8BACP,8BACG,eAGZ,EAFI,SAEe,EAAtB,OAAsB,aAAnB,OAAkC,OAenC,MADG,KACH,MAAsB,YAdhB,IAAN,OAAM,aAAa,8BAEjB,eAAkB,8BAEC,EAAJ,KAAwB,EAAxB,OAAwB,aAApB,OAA0C,OAC7D,iBAAsB,cAEX,EAAJ,KAAwB,EAAxB,OAAwB,aAApB,OAA0C,OACrD,iBACA,cAAgB,YAGhB,gBAMJ,WAAkB,EAAoB,IAAtC,OAAsC,aAApB,OAAoC,K,CAAA,EAMpD,WALA,cACA,cACA,MADgC,KAChC,MAAsB,aACN,wBA9BU,C,KAiCY,I,EAAnB,OAAM,eAAa,GAC/B,UAAuB,oBACvB,UAAuB,WACvB,Q,GAAsB,C,MA7C7B,OAA4C,EAA5C,QAA4C,eAAgB,OAAlC,EAAkC,QAAlC,eAC1B,iBAAoB,eACZ,iBAAyB,WAAI,gBAAwB,OAAC,C,sBAyN9C,SAqGC,qHA1DH,KAAyB,cACrC,cAAyB,WACzB,cAAuB,yBAEzB,4BAuC4B,OAAuC,QACnE,uBALA,cAAyB,WACzB,YAA8B,gCAL9B,cAAyB,WACzB,MArTwB,qBAGT,MADA,MADA,IAoTf,MAA6C,yCAL7C,cAAyB,WACzB,YAxSJ,WAiDA,eA5CK,KA8CA,aAA8B,WAC1B,eAAyB,UAnDhC,OAIG,GAAY,KAAM,gBACrB,YACG,SAAY,KAAM,eA+CtB,eAkP6D,qBA1B1D,cAAyB,WACzB,eAAuB,uBA2CvB,IA3CuB,OA2CvB,8BAEE,aAA4B,YAAyB,oBAErD,aAA4B,YAAyB,G,EAAA,cAPvD,MAOuD,OAP7B,OAA1B,GAA+D,eAlD/D,cAAyB,WACzB,eAAuB,qBAJvB,cAAyB,WACzB,eAAuB,yCA8BvB,cAAyB,WACzB,YAA4B,cAC5B,WAAwB,cAAyB,cAAuB,yCAPxE,cAAyB,WACzB,YAA4B,eAC5B,WAAwB,cAAyB,eAAuB,uBANxE,MAMwE,OANxE,IAA2B,iBAH3B,MAG2B,OAH3B,GAA6B,eAJ7B,aAA0B,0BAnB1B,cAAyB,WACzB,YAAwB,eAAuB,kDAjHnD,cACA,WACA,YACA,YACA,YACyC,MAArB,SAAqB,IAiGO,uBAH5C,QAG4C,qBAH5C,SAAiD,uBAHjD,QAGiD,qBAHjD,SAAiD,uBAHjD,QAGiD,qBAHjD,SAAiD,kDA7HrD,cACA,WACA,YACA,YACA,YACyC,MAArB,SAAqB,IAqHK,gCAL1C,cAAyB,WACzB,YAAwB,eAAuB,gCAL/C,cAAyB,WACzB,YAAwB,eAAuB,qBA2B/C,cAAyB,WACzB,eAAuB,qBAJvB,cAAyB,WACzB,eAAuB,U,CAyEJ,C,KAEpB,MA9XkE,QAAtB,MAAsB,MAqRrE,GAyGG,GAOe,KACC,C,EAzHb,SAGW,aACM,GAAqB,K,SAjC7B,SAyBG,8EAVhB,SAA2B,eAHN,SAA0B,eAD1B,SAA0B,eAD1B,SAA0B,eAD1B,SAA0B,0BAa/C,SAA4B,OAC5B,SAA0B,0BAJ1B,SAA4B,OAC5B,SAA0B,eAZL,SAA0B,eAD1B,SAA0B,eAD1B,SAA2B,eAD3B,SAA2B,eAD3B,SAA2B,eAD3B,SAA0B,eAD1B,SAA0B,eAD1B,SAA0B,I,CAwB7B,C,OAnCpB,wBAC0B,oBAAxB,EAAwB,aAAxB,MAA+B,8BAC7B,C,EAR4B,SACvB,SACF,Q,CAAuB,C,MAjBc,uCASlB,KADA,KAFA,KADA,KADA,KAFA,KADA,wBASe,GAAjB,IATE,OASR,QAAM,aAAiB,kC,EA9BzC,2BAEkB,UAAuB,GADvB,WAGlB,oBACc,UAEmB,GAAE,C,EAnBnC,UACA,OACA,QACA,QACA,QACA,QACyC,EAArB,SAAqB,I,EAxBT,gCAKmB,IAD/C,UAFiB,UADA,SAIgC,C,SAhBrC,gBACE,GAKhB,sBAHA,UACuC,EAAjB,EADC,QACD,aAAiB,IAEb,C,SAjBf,OACG,+BAEd,EAFc,OAEd,IACuC,EAAjB,EADA,QACA,aAAiB,IAEvC,EAFuC,OAEvC,IAAsB,U,EACC,C,SAfM,SACrB,GACiD,EADjD,UACM,QAAsB,aAAqB,K,EAN3D,aAAiB,a,CAAuB,C,EAPb,mBAGhB,UADA,IADA,SAEuB,C,GAjFlB,UAAK,iB,EAAa,6CAKpB,OADgB,OAAjB,OADiB,IAAjB,OADiB,OAAjB,OADiB,OAAjB,KAII,C,EAZO,sCAGY,OAAxB,OADgD,OAAxB,OAAxB,OAD0B,KAEC,C,KARvC,uCAAoC,C,UANpC,EADA,WACA,KACA,MAD6B,mBAC7B,IAD6B,QAC7B,cAAyC,0BACb,C,WAT5B,SAAuB,YACvB,OADuB,OACvB,QADA,EACA,gBAA6B,+BACP,C,WAbtB,mBAEA,GADA,mBACA,MAAsB,KACN,MADM,QACN,aACA,IACd,2CAAoC,UAErC,C,EAxCY,EAJC,EAFd,gBAMe,C,MAvJF,8BAsCX,oBANA,oBA5BA,oBAFA,yEAkCA,QAlCA,UAkCA,YAFA,QAEA,mBAFA,YALA,QAKA,mBALA,YAFA,QAEA,mBAFA,YAF8C,QAE9C,UAFwB,GAAsB,wBAlClB,QACpB,KACK,IADL,UACK,K,EA8BmB,WAEc,UAFpC,GAAsB,cAJO,QAIP,mBAJf,GAAsB,gBAHI,QAGJ,mBAHlB,GAAsB,gBAHJ,QAGI,mBAH1B,GAAsB,gBAHa,QAGb,mBAHT,GAAsB,gBAFC,QAED,UAFrB,GAAsB,YAFL,QAEK,UAF3B,GAAsB,WAgCX,C,EApDZ,UACjB,KACM,QADN,UACM,KAA0B,C,UAhB1C,qBACa,UADb,YACa,OAA6B,WAAgB,C,WAX1C,aAChB,EADA,EAG8B,iCAAuB,IAAjD,EAAiD,OAAjD,eADF,wCAC+D,oBAEjE,wB,GAAA,GAAgC,C,EAThC,uBAAwB,C,UALxB,uBAE4B,YAF5B,UAE4B,OAA4B,CAAtD,EAAsD,OAAtD,eADF,uBACmE,U,EAP5C,6BAAoB,C,8ICvB7C,mc,QAAA,4D,QAAA,6E,QAAA,8F,QAAA,+G,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":244179},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/printf.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy and Pierre Weis, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nopen CamlinternalFormatBasics\nopen CamlinternalFormat\n\nlet kfprintf k o (Format (fmt, _)) =\n make_printf (fun acc -> output_acc o acc; k o) End_of_acc fmt\nlet kbprintf k b (Format (fmt, _)) =\n make_printf (fun acc -> bufput_acc b acc; k b) End_of_acc fmt\nlet ikfprintf k oc (Format (fmt, _)) =\n make_iprintf k oc fmt\nlet ikbprintf = ikfprintf\n\nlet fprintf oc fmt = kfprintf ignore oc fmt\nlet bprintf b fmt = kbprintf ignore b fmt\nlet ifprintf oc fmt = ikfprintf ignore oc fmt\nlet ibprintf b fmt = ikbprintf ignore b fmt\nlet printf fmt = fprintf stdout fmt\nlet eprintf fmt = fprintf stderr fmt\n\nlet ksprintf k (Format (fmt, _)) =\n let k' acc =\n let buf = Buffer.create 64 in\n strput_acc buf acc;\n k (Buffer.contents buf) in\n make_printf k' End_of_acc fmt\n\nlet sprintf fmt = ksprintf (fun s -> s) fmt\n\nlet kprintf = ksprintf\n","(* generated code *)"],"names":[],"mappings":"EAwCqC,EAAC,C,EAApB,YAAyB,C,KALvC,OAAU,KAAV,QAAU,eACV,wBACE,EADgB,QAChB,aAAqB,oB,EAHzB,QAIA,IALW,UAKX,qBAA6B,C,EAPb,gBAAkB,C,EADnB,gBAAkB,C,EC9BnC,K,ED6BqB,cAAsB,C,EADrB,cAAuB,C,EADzB,cAAqB,C,EADpB,cAAsB,C,EAHzC,IADY,UACZ,qBAAqB,C,KAFG,mCAAgB,yBAAK,C,EAA7C,cADW,UACX,qBAA6D,C,KAFrC,mCAAgB,yBAAK,C,EAA7C,cADW,UACX,qBAA6D,C,ECnB/D,uD,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":244927},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/dynarray.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Gabriel Scherer, projet Partout, INRIA Paris-Saclay *)\n(* *)\n(* Copyright 2022 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype 'a t = {\n mutable length : int;\n mutable arr : 'a slot array;\n}\n(* {2 The type ['a t]}\n\n A dynamic array is represented using a backing array [arr] and\n a [length]. It behaves as an array of size [length] -- the indices\n from [0] to [length - 1] included contain user-provided values and\n can be [get] and [set] -- but the length may also change in the\n future by adding or removing elements at the end.\n\n We use the following concepts;\n - capacity: the length of the backing array:\n [Array.length arr]\n - live space: the portion of the backing array with\n indices from [0] to [length - 1] included.\n - empty space: the portion of the backing array\n from [length] to the end of the backing array.\n\n {2 The type ['a slot]}\n\n We should not keep a user-provided value in the empty space, as\n this could extend its lifetime and may result in memory leaks of\n arbitrary size. Functions that remove elements from the dynamic\n array, such as [pop_last] or [truncate], must really erase the\n element from the backing array.\n\n This constraint makes it difficult to represent an dynamic array of\n elements of type ['a] with a backing array of type ['a array]: what\n valid value of type ['a] would we use in the empty space? Typical\n choices include:\n - accepting scenarios where we actually leak user-provided values\n (but this can blowup memory usage in some cases, and is hard to debug)\n - requiring a \"dummy\" value at creation of the dynamic array\n or in the parts of the API that grow the empty space\n (but users find this very inconvenient)\n - using arcane Obj.magic tricks\n (but experts don't agree on which tricks are safe to use and/or\n should be used here)\n - using a backing array of ['a option] values, using [None]\n in the empty space\n (but this gives a noticeably less efficient memory representation)\n\n In the present implementation, we use the ['a option] approach,\n with a twist. With ['a option], calling [set a i x] must reallocate\n a new [Some x] block:\n{[\n let set a i x =\n if i < 0 || i >= a.length then error \"out of bounds\";\n a.arr.(i) <- Some x\n]}\n Instead we use the type ['a slot] below,\n which behaves as an option whose [Some] constructor\n (called [Elem] here) has a _mutable_ argument.\n*)\nand 'a slot =\n| Empty\n| Elem of { mutable v: 'a }\n(*\n This gives an allocation-free implementation of [set] that calls\n [Array.get] (instead of [Array.set]) on the backing array and then\n mutates the [v] parameter. In pseudo-code:\n{[\n let set a i x =\n if i < 0 || i >= a.length then error \"out of bounds\";\n match a.arr.(i) with\n | Empty -> error \"invalid state: missing element\"\n | Elem s -> s.v <- x\n]}\n With this approach, accessing an element still pays the cost of an\n extra indirection (compared to approaches that do not box elements\n in the backing array), but only operations that add new elements at\n the end of the array pay extra allocations.\n\n There are some situations where ['a option] is better: it makes\n [pop_last_opt] more efficient as the underlying option can be\n returned directly, and it also lets us use [Array.blit] to\n implement [append]. We believe that optimizing [get] and [set] is\n more important for dynamic arrays.\n\n {2 Invariants and valid states}\n\n We enforce the invariant that [length >= 0] at all times.\n we rely on this invariant for optimization.\n\n The following conditions define what we call a \"valid\" dynarray:\n - valid length: [length <= Array.length arr]\n - no missing element in the live space:\n forall i, [0 <= i < length] implies [arr.(i) <> Empty]\n - no element in the empty space:\n forall i, [length <= i < Array.length arr] implies [arr.(i) = Empty]\n\n Unfortunately, we cannot easily enforce validity as an invariant in\n presence of concurrent updates. We can thus observe dynarrays in\n \"invalid states\". Our implementation may raise exceptions or return\n incorrect results on observing invalid states, but of course it\n must preserve memory safety.\n*)\n\nmodule Error = struct\n let[@inline never] index_out_of_bounds f ~i ~length =\n if length = 0 then\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: index %d out of bounds (empty dynarray)\"\n f i\n else\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: index %d out of bounds (0..%d)\"\n f i (length - 1)\n\n let[@inline never] negative_length_requested f n =\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: negative length %d requested\"\n f n\n\n let[@inline never] negative_capacity_requested f n =\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: negative capacity %d requested\"\n f n\n\n let[@inline never] requested_length_out_of_bounds f requested_length =\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: cannot grow to requested length %d (max_array_length is %d)\"\n f requested_length Sys.max_array_length\n\n (* When observing an invalid state ([missing_element],\n [invalid_length]), we do not give the name of the calling function\n in the error message, as the error is related to invalid operations\n performed earlier, and not to the callsite of the function\n itself. *)\n\n let invalid_state_description =\n \"Invalid dynarray (unsynchronized concurrent length change)\"\n\n let[@inline never] missing_element ~i ~length =\n Printf.ksprintf invalid_arg\n \"%s: missing element at position %d < length %d\"\n invalid_state_description\n i length\n\n let[@inline never] invalid_length ~length ~capacity =\n Printf.ksprintf invalid_arg\n \"%s: length %d > capacity %d\"\n invalid_state_description\n length capacity\n\n let[@inline never] length_change_during_iteration f ~expected ~observed =\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: a length change from %d to %d occurred during iteration\"\n f expected observed\n\n (* When an [Empty] element is observed unexpectedly at index [i],\n it may be either an out-of-bounds access or an invalid-state situation\n depending on whether [i <= length]. *)\n let[@inline never] unexpected_empty_element f ~i ~length =\n if i < length then\n missing_element ~i ~length\n else\n index_out_of_bounds f ~i ~length\n\n let[@inline never] empty_dynarray f =\n Printf.ksprintf invalid_arg\n \"Dynarray.%s: empty array\" f\nend\n\n(* Detecting iterator invalidation.\n\n See {!iter} below for a detailed usage example.\n*)\nlet check_same_length f a ~length =\n let length_a = a.length in\n if length <> length_a then\n Error.length_change_during_iteration f\n ~expected:length ~observed:length_a\n\n(** Careful unsafe access. *)\n\n(* Postcondition on non-exceptional return:\n [length <= Array.length arr] *)\nlet[@inline always] check_valid_length length arr =\n let capacity = Array.length arr in\n if length > capacity then\n Error.invalid_length ~length ~capacity\n\n(* Precondition: [0 <= i < length <= Array.length arr]\n\n This precondition is typically guaranteed by knowing\n [0 <= i < length] and calling [check_valid_length length arr].*)\nlet[@inline always] unsafe_get arr ~i ~length =\n match Array.unsafe_get arr i with\n | Empty -> Error.missing_element ~i ~length\n | Elem {v} -> v\n\n\n(** {1:dynarrays Dynamic arrays} *)\n\nlet create () = {\n length = 0;\n arr = [| |];\n}\n\nlet make n x =\n if n < 0 then Error.negative_length_requested \"make\" n;\n {\n length = n;\n arr = Array.init n (fun _ -> Elem {v = x});\n }\n\nlet init n f =\n if n < 0 then Error.negative_length_requested \"init\" n;\n {\n length = n;\n arr = Array.init n (fun i -> Elem {v = f i});\n }\n\nlet get a i =\n (* This implementation will propagate an [Invalid_argument] exception\n from array lookup if the index is out of the backing array,\n instead of using our own [Error.index_out_of_bounds]. This is\n allowed by our specification, and more efficient -- no need to\n check that [length a <= capacity a] in the fast path. *)\n match a.arr.(i) with\n | Elem s -> s.v\n | Empty ->\n Error.unexpected_empty_element \"get\" ~i ~length:a.length\n\nlet set a i x =\n (* See {!get} comment on the use of checked array\n access without our own bound checking. *)\n match a.arr.(i) with\n | Elem s -> s.v <- x\n | Empty ->\n Error.unexpected_empty_element \"set\" ~i ~length:a.length\n\nlet length a = a.length\n\nlet is_empty a = (a.length = 0)\n\nlet copy {length; arr} =\n check_valid_length length arr;\n (* use [length] as the new capacity to make\n this an O(length) operation. *)\n {\n length;\n arr = Array.init length (fun i ->\n let v = unsafe_get arr ~i ~length in\n Elem {v}\n );\n }\n\nlet get_last a =\n let {arr; length} = a in\n check_valid_length length arr;\n (* We know [length <= capacity a]. *)\n if length = 0 then Error.empty_dynarray \"get_last\";\n (* We know [length > 0]. *)\n unsafe_get arr ~i:(length - 1) ~length\n\nlet find_last a =\n let {arr; length} = a in\n check_valid_length length arr;\n (* We know [length <= capacity a]. *)\n if length = 0 then None\n else\n (* We know [length > 0]. *)\n Some (unsafe_get arr ~i:(length - 1) ~length)\n\n(** {1:removing Removing elements} *)\n\nlet pop_last a =\n let {arr; length} = a in\n check_valid_length length arr;\n (* We know [length <= capacity a]. *)\n if length = 0 then raise Not_found;\n let last = length - 1 in\n (* We know [length > 0] so [last >= 0]. *)\n match Array.unsafe_get arr last with\n | Empty ->\n Error.missing_element ~i:last ~length\n | Elem s ->\n Array.unsafe_set arr last Empty;\n a.length <- last;\n s.v\n\nlet pop_last_opt a =\n match pop_last a with\n | exception Not_found -> None\n | x -> Some x\n\nlet remove_last a =\n let last = length a - 1 in\n if last >= 0 then begin\n a.length <- last;\n a.arr.(last) <- Empty;\n end\n\nlet truncate a n =\n if n < 0 then Error.negative_length_requested \"truncate\" n;\n let {arr; length} = a in\n if length <= n then ()\n else begin\n a.length <- n;\n Array.fill arr n (length - n) Empty;\n end\n\nlet clear a = truncate a 0\n\n\n(** {1:capacity Backing array and capacity} *)\n\nlet capacity a = Array.length a.arr\n\nlet next_capacity n =\n let n' =\n (* For large values of n, we use 1.5 as our growth factor.\n\n For smaller values of n, we grow more aggressively to avoid\n reallocating too much when accumulating elements into an empty\n array.\n\n The constants \"512 words\" and \"8 words\" below are taken from\n https://github.com/facebook/folly/blob/\n c06c0f41d91daf1a6a5f3fc1cd465302ac260459/folly/FBVector.h#L1128-L1157\n *)\n if n <= 512 then n * 2\n else n + n / 2\n in\n (* jump directly from 0 to 8 *)\n min (max 8 n') Sys.max_array_length\n\nlet ensure_capacity a capacity_request =\n let arr = a.arr in\n let cur_capacity = Array.length arr in\n if capacity_request < 0 then\n Error.negative_capacity_requested \"ensure_capacity\" capacity_request\n else if cur_capacity >= capacity_request then\n (* This is the fast path, the code up to here must do as little as\n possible. (This is why we don't use [let {arr; length} = a] as\n usual, the length is not needed in the fast path.)*)\n ()\n else begin\n if capacity_request > Sys.max_array_length then\n Error.requested_length_out_of_bounds \"ensure_capacity\" capacity_request;\n let new_capacity =\n (* We use either the next exponential-growth strategy,\n or the requested strategy, whichever is bigger.\n\n Compared to only using the exponential-growth strategy, this\n lets us use less memory by avoiding any overshoot whenever\n the capacity request is noticeably larger than the current\n capacity.\n\n Compared to only using the requested capacity, this avoids\n losing the amortized guarantee: we allocated \"exponentially\n or more\", so the amortization holds. In particular, notice\n that repeated calls to [ensure_capacity a (length a + 1)]\n will have amortized-linear rather than quadratic complexity.\n *)\n max (next_capacity cur_capacity) capacity_request in\n let new_arr = Array.make new_capacity Empty in\n Array.blit arr 0 new_arr 0 a.length;\n a.arr <- new_arr;\n (* postcondition: *)\n assert (0 <= capacity_request);\n assert (capacity_request <= Array.length new_arr);\n end\n\nlet ensure_extra_capacity a extra_capacity_request =\n ensure_capacity a (length a + extra_capacity_request)\n\nlet fit_capacity a =\n if capacity a = a.length\n then ()\n else a.arr <- Array.sub a.arr 0 a.length\n\nlet set_capacity a n =\n if n < 0 then\n Error.negative_capacity_requested \"set_capacity\" n;\n let arr = a.arr in\n let cur_capacity = Array.length arr in\n if n < cur_capacity then begin\n a.length <- min a.length n;\n a.arr <- Array.sub arr 0 n;\n end\n else if n > cur_capacity then begin\n let new_arr = Array.make n Empty in\n Array.blit arr 0 new_arr 0 a.length;\n a.arr <- new_arr;\n end\n\nlet reset a =\n a.length <- 0;\n a.arr <- [||]\n\n(** {1:adding Adding elements} *)\n\n(* We chose an implementation of [add_last a x] that behaves correctly\n in presence of asynchronous / re-entrant code execution around\n allocations and poll points: if another thread or a callback gets\n executed on allocation, we add the element at the new end of the\n dynamic array.\n\n (We do not give the same guarantees in presence of concurrent\n parallel updates, which are much more expensive to protect\n against.)\n*)\n\n(* [add_last_if_room a elem] only writes the slot if there is room, and\n returns [false] otherwise. *)\nlet[@inline] add_last_if_room a elem =\n let {arr; length} = a in\n (* we know [0 <= length] *)\n if length >= Array.length arr then false\n else begin\n (* we know [0 <= length < Array.length arr] *)\n a.length <- length + 1;\n Array.unsafe_set arr length elem;\n true\n end\n\nlet add_last a x =\n let elem = Elem {v = x} in\n if add_last_if_room a elem then ()\n else begin\n (* slow path *)\n let rec grow_and_add a elem =\n ensure_extra_capacity a 1;\n if not (add_last_if_room a elem)\n then grow_and_add a elem\n in grow_and_add a elem\n end\n\nlet rec append_list a li =\n match li with\n | [] -> ()\n | x :: xs -> add_last a x; append_list a xs\n\nlet append_iter a iter b =\n iter (fun x -> add_last a x) b\n\nlet append_seq a seq =\n Seq.iter (fun x -> add_last a x) seq\n\n(* append_array: same [..._if_room] and loop logic as [add_last]. *)\n\nlet append_array_if_room a b =\n let {arr; length = length_a} = a in\n let length_b = Array.length b in\n if length_a + length_b > Array.length arr then false\n else begin\n a.length <- length_a + length_b;\n (* Note: we intentionally update the length *before* filling the\n elements. This \"reserve before fill\" approach provides better\n behavior than \"fill then notify\" in presence of reentrant\n modifications (which may occur below, on a poll point in the loop or\n the [Elem] allocation):\n\n - If some code asynchronously adds new elements after this\n length update, they will go after the space we just reserved,\n and in particular no addition will be lost. If instead we\n updated the length after the loop, any asynchronous addition\n during the loop could be erased or erase one of our additions,\n silently, without warning the user.\n\n - If some code asynchronously iterates on the dynarray, or\n removes elements, or otherwise tries to access the\n reserved-but-not-yet-filled space, it will get a clean \"missing\n element\" error. This is worse than with the fill-then-notify\n approach where the new elements would only become visible\n (to iterators, for removal, etc.) alltogether at the end of\n loop.\n\n To summarise, \"reserve before fill\" is better on add-add races,\n and \"fill then notify\" is better on add-remove or add-iterate\n races. But the key difference is the failure mode:\n reserve-before fails on add-remove or add-iterate races with\n a clean error, while notify-after fails on add-add races with\n silently disappearing data. *)\n for i = 0 to length_b - 1 do\n let x = Array.unsafe_get b i in\n Array.unsafe_set arr (length_a + i) (Elem {v = x})\n done;\n true\n end\n\nlet append_array a b =\n if append_array_if_room a b then ()\n else begin\n (* slow path *)\n let rec grow_and_append a b =\n ensure_extra_capacity a (Array.length b);\n if not (append_array_if_room a b)\n then grow_and_append a b\n in grow_and_append a b end\n\n(* append: same [..._if_room] and loop logic as [add_last],\n same reserve-before-fill logic as [append_array]. *)\n\n(* It is a programming error to mutate the length of [b] during a call\n to [append a b]. To detect this mistake we keep track of the length\n of [b] throughout the computation and check it that does not\n change.\n*)\nlet append_if_room a b ~length_b =\n let {arr = arr_a; length = length_a} = a in\n if length_a + length_b > Array.length arr_a then false\n else begin\n a.length <- length_a + length_b;\n let arr_b = b.arr in\n check_valid_length length_b arr_b;\n for i = 0 to length_b - 1 do\n let x = unsafe_get arr_b ~i ~length:length_b in\n Array.unsafe_set arr_a (length_a + i) (Elem {v = x})\n done;\n check_same_length \"append\" b ~length:length_b;\n true\n end\n\nlet append a b =\n let length_b = length b in\n if append_if_room a b ~length_b then ()\n else begin\n (* slow path *)\n let rec grow_and_append a b ~length_b =\n ensure_extra_capacity a length_b;\n (* Eliding the [check_same_length] call below would be wrong in\n the case where [a] and [b] are aliases of each other, we\n would get into an infinite loop instead of failing.\n\n We could push the call to [append_if_room] itself, but we\n prefer to keep it in the slow path. *)\n check_same_length \"append\" b ~length:length_b;\n if not (append_if_room a b ~length_b)\n then grow_and_append a b ~length_b\n in grow_and_append a b ~length_b\n end\n\n\n\n(** {1:iteration Iteration} *)\n\n(* The implementation choice that we made for iterators is the one\n that maximizes efficiency by avoiding repeated bound checking: we\n check the length of the dynamic array once at the beginning, and\n then only operate on that portion of the dynarray, ignoring\n elements added in the meantime.\n\n The specification states that it is a programming error to mutate\n the length of the array during iteration. We check for this and\n raise an error on size change.\n Note that we may still miss some transient state changes that cancel\n each other and leave the length unchanged at the next check.\n*)\n\nlet iter_ f k a =\n let {arr; length} = a in\n (* [check_valid_length length arr] is used for memory safety, it\n guarantees that the backing array has capacity at least [length],\n allowing unsafe array access.\n\n [check_same_length] is used for correctness, it lets the function\n fail more often if we discover the programming error of mutating\n the length during iteration.\n\n We could, naively, call [check_same_length] at each iteration of\n the loop (before or after, or both). However, notice that this is\n not necessary to detect the removal of elements from [a]: if\n elements have been removed by the time the [for] loop reaches\n them, then [unsafe_get] will itself fail with an [Invalid_argument]\n exception. We only need to detect the addition of new elements to\n [a] during iteration, and for this it is enough to call\n [check_same_length] once at the end.\n\n Calling [check_same_length] more often could catch more\n programming errors, but the only errors that we miss with this\n optimization are those that keep the array size constant --\n additions and deletions that cancel each other. We consider this\n an acceptable tradeoff.\n *)\n check_valid_length length arr;\n for i = 0 to length - 1 do\n k (unsafe_get arr ~i ~length);\n done;\n check_same_length f a ~length\n\nlet iter k a =\n iter_ \"iter\" k a\n\nlet iteri k a =\n let {arr; length} = a in\n check_valid_length length arr;\n for i = 0 to length - 1 do\n k i (unsafe_get arr ~i ~length);\n done;\n check_same_length \"iteri\" a ~length\n\nlet map f a =\n let {arr; length} = a in\n check_valid_length length arr;\n let res = {\n length;\n arr = Array.init length (fun i ->\n Elem {v = f (unsafe_get arr ~i ~length)});\n } in\n check_same_length \"map\" a ~length;\n res\n\n\nlet mapi f a =\n let {arr; length} = a in\n check_valid_length length arr;\n let res = {\n length;\n arr = Array.init length (fun i ->\n Elem {v = f i (unsafe_get arr ~i ~length)});\n } in\n check_same_length \"mapi\" a ~length;\n res\n\nlet fold_left f acc a =\n let {arr; length} = a in\n check_valid_length length arr;\n let r = ref acc in\n for i = 0 to length - 1 do\n let v = unsafe_get arr ~i ~length in\n r := f !r v;\n done;\n check_same_length \"fold_left\" a ~length;\n !r\n\nlet fold_right f a acc =\n let {arr; length} = a in\n check_valid_length length arr;\n let r = ref acc in\n for i = length - 1 downto 0 do\n let v = unsafe_get arr ~i ~length in\n r := f v !r;\n done;\n check_same_length \"fold_right\" a ~length;\n !r\n\nlet exists p a =\n let {arr; length} = a in\n check_valid_length length arr;\n let rec loop p arr i length =\n if i = length then false\n else\n p (unsafe_get arr ~i ~length)\n || loop p arr (i + 1) length\n in\n let res = loop p arr 0 length in\n check_same_length \"exists\" a ~length;\n res\n\nlet for_all p a =\n let {arr; length} = a in\n check_valid_length length arr;\n let rec loop p arr i length =\n if i = length then true\n else\n p (unsafe_get arr ~i ~length)\n && loop p arr (i + 1) length\n in\n let res = loop p arr 0 length in\n check_same_length \"for_all\" a ~length;\n res\n\nlet filter f a =\n let b = create () in\n iter_ \"filter\" (fun x -> if f x then add_last b x) a;\n b\n\nlet filter_map f a =\n let b = create () in\n iter_ \"filter_map\" (fun x ->\n match f x with\n | None -> ()\n | Some y -> add_last b y\n ) a;\n b\n\n\n(** {1:conversions Conversions to other data structures} *)\n\n(* The eager [to_*] conversion functions behave similarly to iterators\n in presence of updates during computation. The [*_reentrant]\n functions obey their more permissive specification, which tolerates\n any concurrent update. *)\n\nlet of_array a =\n let length = Array.length a in\n {\n length;\n arr = Array.init length (fun i -> Elem {v = Array.unsafe_get a i});\n }\n\nlet to_array a =\n let {arr; length} = a in\n check_valid_length length arr;\n let res = Array.init length (fun i ->\n unsafe_get arr ~i ~length)\n in\n check_same_length \"to_array\" a ~length;\n res\n\nlet of_list li =\n let a = create () in\n List.iter (fun x -> add_last a x) li;\n a\n\nlet to_list a =\n let {arr; length} = a in\n check_valid_length length arr;\n let l = ref [] in\n for i = length - 1 downto 0 do\n l := unsafe_get arr ~i ~length :: !l\n done;\n check_same_length \"to_list\" a ~length;\n !l\n\nlet of_seq seq =\n let init = create() in\n append_seq init seq;\n init\n\nlet to_seq a =\n let {arr; length} = a in\n check_valid_length length arr;\n let rec aux i = fun () ->\n check_same_length \"to_seq\" a ~length;\n if i >= length then Seq.Nil\n else begin\n let v = unsafe_get arr ~i ~length in\n Seq.Cons (v, aux (i + 1))\n end\n in\n aux 0\n\nlet to_seq_reentrant a =\n let rec aux i = fun () ->\n if i >= length a then Seq.Nil\n else begin\n let v = get a i in\n Seq.Cons (v, aux (i + 1))\n end\n in\n aux 0\n\nlet to_seq_rev a =\n let {arr; length} = a in\n check_valid_length length arr;\n let rec aux i = fun () ->\n check_same_length \"to_seq_rev\" a ~length;\n if i < 0 then Seq.Nil\n else begin\n let v = unsafe_get arr ~i ~length in\n Seq.Cons (v, aux (i - 1))\n end\n in\n aux (length - 1)\n\nlet to_seq_rev_reentrant a =\n let rec aux i = fun () ->\n if i < 0 then Seq.Nil\n else if i >= length a then\n (* If some elements have been removed in the meantime, we skip\n those elements and continue with the new end of the array. *)\n aux (length a - 1) ()\n else begin\n let v = get a i in\n Seq.Cons (v, aux (i - 1))\n end\n in\n aux (length a - 1)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":251912},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/arg.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype key = string\ntype doc = string\ntype usage_msg = string\ntype anon_fun = (string -> unit)\n\ntype spec =\n | Unit of (unit -> unit) (* Call the function with unit argument *)\n | Bool of (bool -> unit) (* Call the function with a bool argument *)\n | Set of bool ref (* Set the reference to true *)\n | Clear of bool ref (* Set the reference to false *)\n | String of (string -> unit) (* Call the function with a string argument *)\n | Set_string of string ref (* Set the reference to the string argument *)\n | Int of (int -> unit) (* Call the function with an int argument *)\n | Set_int of int ref (* Set the reference to the int argument *)\n | Float of (float -> unit) (* Call the function with a float argument *)\n | Set_float of float ref (* Set the reference to the float argument *)\n | Tuple of spec list (* Take several arguments according to the\n spec list *)\n | Symbol of string list * (string -> unit)\n (* Take one of the symbols as argument and\n call the function with the symbol. *)\n | Rest of (string -> unit) (* Stop interpreting keywords and call the\n function with each remaining argument *)\n | Rest_all of (string list -> unit)\n (* Stop interpreting keywords and call the\n function with all remaining arguments. *)\n | Expand of (string -> string array) (* If the remaining arguments to process\n are of the form\n [[\"-foo\"; \"arg\"] @ rest] where \"foo\"\n is registered as [Expand f], then the\n arguments [f \"arg\" @ rest] are\n processed. Only allowed in\n [parse_and_expand_argv_dynamic]. *)\n\nexception Bad of string\nexception Help of string\n\ntype error =\n | Unknown of string\n | Wrong of string * string * string (* option, actual, expected *)\n | Missing of string\n | Message of string\n\nexception Stop of error (* used internally *)\n\nopen Printf\n\nlet rec assoc3 x l =\n match l with\n | [] -> raise Not_found\n | (y1, y2, _) :: _ when y1 = x -> y2\n | _ :: t -> assoc3 x t\n\n\nlet split s =\n let i = String.index s '=' in\n let len = String.length s in\n String.sub s 0 i, String.sub s (i+1) (len-(i+1))\n\n\nlet make_symlist prefix sep suffix l =\n match l with\n | [] -> \"\"\n | h::t -> (List.fold_left (fun x y -> x ^ sep ^ y) (prefix ^ h) t) ^ suffix\n\n\nlet print_spec buf (key, spec, doc) =\n if String.length doc > 0 then\n match spec with\n | Symbol (l, _) ->\n bprintf buf \" %s %s%s\\n\" key (make_symlist \"{\" \"|\" \"}\" l) doc\n | _ ->\n bprintf buf \" %s %s\\n\" key doc\n\n\nlet help_action () = raise (Stop (Unknown \"-help\"))\n\nlet add_help speclist =\n let add1 =\n try ignore (assoc3 \"-help\" speclist); []\n with Not_found ->\n [\"-help\", Unit help_action, \" Display this list of options\"]\n and add2 =\n try ignore (assoc3 \"--help\" speclist); []\n with Not_found ->\n [\"--help\", Unit help_action, \" Display this list of options\"]\n in\n speclist @ (add1 @ add2)\n\n\nlet usage_b buf speclist errmsg =\n bprintf buf \"%s\\n\" errmsg;\n List.iter (print_spec buf) (add_help speclist)\n\n\nlet usage_string speclist errmsg =\n let b = Buffer.create 200 in\n usage_b b speclist errmsg;\n Buffer.contents b\n\n\nlet usage speclist errmsg =\n eprintf \"%s\" (usage_string speclist errmsg)\n\n\nlet current = ref 0\n\nlet bool_of_string_opt x =\n try Some (bool_of_string x)\n with Invalid_argument _ -> None\n\nlet int_of_string_opt x =\n try Some (int_of_string x)\n with Failure _ -> None\n\nlet float_of_string_opt x =\n try Some (float_of_string x)\n with Failure _ -> None\n\nlet parse_and_expand_argv_dynamic_aux allow_expand current argv speclist anonfun\n errmsg =\n let initpos = !current in\n let convert_error error =\n (* convert an internal error to a Bad/Help exception\n *or* add the program name as a prefix and the usage message as a suffix\n to an user-raised Bad exception.\n *)\n let b = Buffer.create 200 in\n let progname =\n if initpos < (Array.length !argv) then !argv.(initpos) else \"(?)\" in\n begin match error with\n | Unknown \"-help\" -> ()\n | Unknown \"--help\" -> ()\n | Unknown s ->\n bprintf b \"%s: unknown option '%s'.\\n\" progname s\n | Missing s ->\n bprintf b \"%s: option '%s' needs an argument.\\n\" progname s\n | Wrong (opt, arg, expected) ->\n bprintf b \"%s: wrong argument '%s'; option '%s' expects %s.\\n\"\n progname arg opt expected\n | Message s -> (* user error message *)\n bprintf b \"%s: %s.\\n\" progname s\n end;\n usage_b b !speclist errmsg;\n if error = Unknown \"-help\" || error = Unknown \"--help\"\n then Help (Buffer.contents b)\n else Bad (Buffer.contents b)\n in\n incr current;\n while !current < (Array.length !argv) do\n begin try\n let s = !argv.(!current) in\n if String.starts_with ~prefix:\"-\" s then begin\n let action, follow =\n try assoc3 s !speclist, None\n with Not_found ->\n try\n let keyword, arg = split s in\n assoc3 keyword !speclist, Some arg\n with Not_found -> raise (Stop (Unknown s))\n in\n let no_arg () =\n match follow with\n | None -> ()\n | Some arg -> raise (Stop (Wrong (s, arg, \"no argument\"))) in\n let get_arg () =\n match follow with\n | None ->\n if !current + 1 < (Array.length !argv) then !argv.(!current + 1)\n else raise (Stop (Missing s))\n | Some arg -> arg\n in\n let consume_arg () =\n match follow with\n | None -> incr current\n | Some _ -> ()\n in\n let rec treat_action = function\n | Unit f -> no_arg (); f ();\n | Bool f ->\n let arg = get_arg () in\n begin match bool_of_string_opt arg with\n | None -> raise (Stop (Wrong (s, arg, \"a boolean\")))\n | Some s -> f s\n end;\n consume_arg ();\n | Set r -> no_arg (); r := true;\n | Clear r -> no_arg (); r := false;\n | String f ->\n let arg = get_arg () in\n f arg;\n consume_arg ();\n | Symbol (symb, f) ->\n let arg = get_arg () in\n if List.mem arg symb then begin\n f arg;\n consume_arg ();\n end else begin\n raise (Stop (Wrong (s, arg, \"one of: \"\n ^ (make_symlist \"\" \" \" \"\" symb))))\n end\n | Set_string r ->\n r := get_arg ();\n consume_arg ();\n | Int f ->\n let arg = get_arg () in\n begin match int_of_string_opt arg with\n | None -> raise (Stop (Wrong (s, arg, \"an integer\")))\n | Some x -> f x\n end;\n consume_arg ();\n | Set_int r ->\n let arg = get_arg () in\n begin match int_of_string_opt arg with\n | None -> raise (Stop (Wrong (s, arg, \"an integer\")))\n | Some x -> r := x\n end;\n consume_arg ();\n | Float f ->\n let arg = get_arg () in\n begin match float_of_string_opt arg with\n | None -> raise (Stop (Wrong (s, arg, \"a float\")))\n | Some x -> f x\n end;\n consume_arg ();\n | Set_float r ->\n let arg = get_arg () in\n begin match float_of_string_opt arg with\n | None -> raise (Stop (Wrong (s, arg, \"a float\")))\n | Some x -> r := x\n end;\n consume_arg ();\n | Tuple specs ->\n no_arg ();\n List.iter treat_action specs;\n | Rest f ->\n no_arg ();\n while !current < (Array.length !argv) - 1 do\n f !argv.(!current + 1);\n consume_arg ();\n done;\n | Rest_all f ->\n no_arg ();\n let acc = ref [] in\n while !current < Array.length !argv - 1 do\n acc := !argv.(!current + 1) :: !acc;\n consume_arg ();\n done;\n f (List.rev !acc)\n | Expand f ->\n if not allow_expand then\n raise (Invalid_argument \"Arg.Expand is is only allowed with \\\n Arg.parse_and_expand_argv_dynamic\");\n let arg = get_arg () in\n let newarg = f arg in\n consume_arg ();\n let before = Array.sub !argv 0 (!current + 1)\n and after =\n Array.sub !argv (!current + 1)\n ((Array.length !argv) - !current - 1) in\n argv:= Array.concat [before;newarg;after];\n in\n treat_action action end\n else anonfun s\n with | Bad m -> raise (convert_error (Message m));\n | Stop e -> raise (convert_error e);\n end;\n incr current\n done\n\nlet parse_and_expand_argv_dynamic current argv speclist anonfun errmsg =\n parse_and_expand_argv_dynamic_aux true current argv speclist anonfun errmsg\n\nlet parse_argv_dynamic ?(current=current) argv speclist anonfun errmsg =\n parse_and_expand_argv_dynamic_aux false current (ref argv) speclist anonfun\n errmsg\n\n\nlet parse_argv ?(current=current) argv speclist anonfun errmsg =\n parse_argv_dynamic ~current:current argv (ref speclist) anonfun errmsg\n\n\nlet parse l f msg =\n try\n parse_argv Sys.argv l f msg\n with\n | Bad msg -> eprintf \"%s\" msg; exit 2\n | Help msg -> printf \"%s\" msg; exit 0\n\n\nlet parse_dynamic l f msg =\n try\n parse_argv_dynamic Sys.argv l f msg\n with\n | Bad msg -> eprintf \"%s\" msg; exit 2\n | Help msg -> printf \"%s\" msg; exit 0\n\nlet parse_expand l f msg =\n try\n let argv = ref Sys.argv in\n let spec = ref l in\n let current = ref (!current) in\n parse_and_expand_argv_dynamic current argv spec f msg\n with\n | Bad msg -> eprintf \"%s\" msg; exit 2\n | Help msg -> printf \"%s\" msg; exit 0\n\n\nlet second_word s =\n let len = String.length s in\n let rec loop n =\n if n >= len then len\n else if s.[n] = ' ' then loop (n+1)\n else n\n in\n match String.index s '\\t' with\n | n -> loop (n+1)\n | exception Not_found ->\n begin match String.index s ' ' with\n | n -> loop (n+1)\n | exception Not_found -> len\n end\n\n\nlet max_arg_len cur (kwd, spec, doc) =\n match spec with\n | Symbol _ -> Int.max cur (String.length kwd)\n | _ -> Int.max cur (String.length kwd + second_word doc)\n\n\nlet replace_leading_tab s =\n let seen = ref false in\n String.map (function '\\t' when not !seen -> seen := true; ' ' | c -> c) s\n\nlet add_padding len ksd =\n match ksd with\n | (_, _, \"\") ->\n (* Do not pad undocumented options, so that they still don't show up when\n * run through [usage] or [parse]. *)\n ksd\n | (kwd, (Symbol _ as spec), msg) ->\n let cutcol = second_word msg in\n let spaces = String.make ((Int.max 0 (len - cutcol)) + 3) ' ' in\n (kwd, spec, \"\\n\" ^ spaces ^ replace_leading_tab msg)\n | (kwd, spec, msg) ->\n let cutcol = second_word msg in\n let kwd_len = String.length kwd in\n let diff = len - kwd_len - cutcol in\n if diff <= 0 then\n (kwd, spec, replace_leading_tab msg)\n else\n let spaces = String.make diff ' ' in\n let prefix = String.sub (replace_leading_tab msg) 0 cutcol in\n let suffix = String.sub msg cutcol (String.length msg - cutcol) in\n (kwd, spec, prefix ^ spaces ^ suffix)\n\n\nlet align ?(limit=max_int) speclist =\n let completed = add_help speclist in\n let len = List.fold_left max_arg_len 0 completed in\n let len = Int.min len limit in\n List.map (add_padding len) completed\n\nlet trim_cr s =\n let len = String.length s in\n if len > 0 && String.get s (len - 1) = '\\r' then\n String.sub s 0 (len - 1)\n else\n s\n\nlet read_aux trim sep file =\n let ic = open_in_bin file in\n let buf = Buffer.create 200 in\n let words = ref [] in\n let stash () =\n let word = Buffer.contents buf in\n let word = if trim then trim_cr word else word in\n words := word :: !words;\n Buffer.clear buf\n in\n begin\n try while true do\n let c = input_char ic in\n if c = sep then stash () else Buffer.add_char buf c\n done\n with End_of_file -> ()\n end;\n if Buffer.length buf > 0 then stash ();\n close_in ic;\n Array.of_list (List.rev !words)\n\nlet read_arg = read_aux true '\\n'\n\nlet read_arg0 = read_aux false '\\x00'\n\nlet write_aux sep file args =\n let oc = open_out_bin file in\n Array.iter (fun s -> fprintf oc \"%s%c\" s sep) args;\n close_out oc\n\nlet write_arg = write_aux '\\n'\n\nlet write_arg0 = write_aux '\\x00'\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":260927},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/printexc.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nopen Printf\n\ntype t = exn = ..\n\nlet printers = Atomic.make []\n\nlet locfmt = format_of_string \"File \\\"%s\\\", line %d, characters %d-%d: %s\"\n\nlet field x i =\n let f = Obj.field x i in\n if not (Obj.is_block f) then\n sprintf \"%d\" (Obj.magic f : int) (* can also be a char *)\n else if Obj.tag f = Obj.string_tag then\n sprintf \"%S\" (Obj.magic f : string)\n else if Obj.tag f = Obj.double_tag then\n string_of_float (Obj.magic f : float)\n else\n \"_\"\n\nlet rec other_fields x i =\n if i >= Obj.size x then \"\"\n else sprintf \", %s%s\" (field x i) (other_fields x (i+1))\n\nlet fields x =\n match Obj.size x with\n | 0 -> \"\"\n | 1 -> \"\"\n | 2 -> sprintf \"(%s)\" (field x 1)\n | _ -> sprintf \"(%s%s)\" (field x 1) (other_fields x 2)\n\nlet use_printers x =\n let rec conv = function\n | hd :: tl ->\n (match hd x with\n | None | exception _ -> conv tl\n | Some s -> Some s)\n | [] -> None in\n conv (Atomic.get printers)\n\nlet destruct_ext_constructor x =\n if Obj.tag x <> 0 then\n ((Obj.magic (Obj.field x 0) : string), None)\n else\n let constructor =\n (Obj.magic (Obj.field (Obj.field x 0) 0) : string) in\n (constructor, Some (fields x))\n\nlet string_of_extension_constructor t =\n let constructor, fields_opt = destruct_ext_constructor t in\n match fields_opt with\n | None -> constructor\n | Some f -> constructor ^ f\n\nlet to_string_default = function\n | Out_of_memory -> \"Out of memory\"\n | Stack_overflow -> \"Stack overflow\"\n | Match_failure(file, line, char) ->\n sprintf locfmt file line char (char+5) \"Pattern matching failed\"\n | Assert_failure(file, line, char) ->\n sprintf locfmt file line char (char+6) \"Assertion failed\"\n | Undefined_recursive_module(file, line, char) ->\n sprintf locfmt file line char (char+6) \"Undefined recursive module\"\n | x ->\n string_of_extension_constructor (Obj.repr x)\n\nlet to_string e =\n match use_printers e with\n | Some s -> s\n | None -> to_string_default e\n\nlet print fct arg =\n try\n fct arg\n with x ->\n eprintf \"Uncaught exception: %s\\n\" (to_string x);\n flush stderr;\n raise x\n\nlet catch fct arg =\n try\n fct arg\n with x ->\n flush stdout;\n eprintf \"Uncaught exception: %s\\n\" (to_string x);\n exit 2\n\ntype raw_backtrace_slot\ntype raw_backtrace_entry = private int\ntype raw_backtrace = raw_backtrace_entry array\n\nlet raw_backtrace_entries bt = bt\n\nexternal get_raw_backtrace:\n unit -> raw_backtrace = \"caml_get_exception_raw_backtrace\"\n\nexternal raise_with_backtrace: exn -> raw_backtrace -> 'a\n = \"%raise_with_backtrace\"\n\n(* Disable warning 37: values are constructed in the runtime *)\ntype[@warning \"-37\"] backtrace_slot =\n | Known_location of {\n is_raise : bool;\n filename : string;\n start_lnum : int;\n start_char : int;\n end_offset : int; (* Relative to beginning of start_lnum *)\n end_lnum : int;\n end_char : int; (* Relative to beginning of end_lnum line *)\n is_inline : bool;\n defname : string;\n }\n | Unknown_location of {\n is_raise : bool\n }\n\nexternal convert_raw_backtrace_slot:\n raw_backtrace_slot -> backtrace_slot = \"caml_convert_raw_backtrace_slot\"\n\nexternal convert_raw_backtrace:\n raw_backtrace -> backtrace_slot array = \"caml_convert_raw_backtrace\"\n\nlet convert_raw_backtrace bt =\n try Some (convert_raw_backtrace bt)\n with Failure _ -> None\n\nlet format_backtrace_slot pos slot =\n let info is_raise =\n if is_raise then\n if pos = 0 then \"Raised at\" else \"Re-raised at\"\n else\n if pos = 0 then \"Raised by primitive operation at\" else \"Called from\"\n in\n match slot with\n | Unknown_location l ->\n if l.is_raise then\n (* compiler-inserted re-raise, skipped *) None\n else\n Some (sprintf \"%s unknown location\" (info false))\n | Known_location l ->\n let lines =\n if l.start_lnum = l.end_lnum then\n Printf.sprintf \" %d\" l.start_lnum\n else\n Printf.sprintf \"s %d-%d\" l.start_lnum l.end_lnum\n in\n Some (sprintf \"%s %s in file \\\"%s\\\"%s, line%s, characters %d-%d\"\n (info l.is_raise) l.defname l.filename\n (if l.is_inline then \" (inlined)\" else \"\")\n lines l.start_char l.end_char)\n\nlet print_exception_backtrace outchan backtrace =\n match backtrace with\n | None ->\n fprintf outchan\n \"(Program not linked with -g, cannot print stack backtrace)\\n\"\n | Some a ->\n for i = 0 to Array.length a - 1 do\n match format_backtrace_slot i a.(i) with\n | None -> ()\n | Some str -> fprintf outchan \"%s\\n\" str\n done\n\nlet print_raw_backtrace outchan raw_backtrace =\n print_exception_backtrace outchan (convert_raw_backtrace raw_backtrace)\n\n(* confusingly named: prints the global current backtrace *)\nlet print_backtrace outchan =\n print_raw_backtrace outchan (get_raw_backtrace ())\n\nlet backtrace_to_string backtrace =\n match backtrace with\n | None ->\n \"(Program not linked with -g, cannot print stack backtrace)\\n\"\n | Some a ->\n let b = Buffer.create 1024 in\n for i = 0 to Array.length a - 1 do\n match format_backtrace_slot i a.(i) with\n | None -> ()\n | Some str -> bprintf b \"%s\\n\" str\n done;\n Buffer.contents b\n\nlet raw_backtrace_to_string raw_backtrace =\n backtrace_to_string (convert_raw_backtrace raw_backtrace)\n\nlet backtrace_slot_is_raise = function\n | Known_location l -> l.is_raise\n | Unknown_location l -> l.is_raise\n\nlet backtrace_slot_is_inline = function\n | Known_location l -> l.is_inline\n | Unknown_location _ -> false\n\ntype location = {\n filename : string;\n line_number : int;\n start_char : int;\n end_char : int;\n end_line : int;\n end_col : int;\n}\n\nlet backtrace_slot_location = function\n | Unknown_location _ -> None\n | Known_location l ->\n Some {\n filename = l.filename;\n line_number = l.start_lnum;\n start_char = l.start_char;\n end_char = l.end_offset;\n end_line = l.end_lnum;\n end_col = l.end_char;\n }\n\nlet backtrace_slot_defname = function\n | Unknown_location _\n | Known_location { defname = \"\" } -> None\n | Known_location l -> Some l.defname\n\nlet backtrace_slots raw_backtrace =\n (* The documentation of this function guarantees that Some is\n returned only if a part of the trace is usable. This gives us\n a bit more work than just convert_raw_backtrace, but it makes the\n API more user-friendly -- otherwise most users would have to\n reimplement the \"Program not linked with -g, sorry\" logic\n themselves. *)\n match convert_raw_backtrace raw_backtrace with\n | None -> None\n | Some backtrace ->\n let usable_slot = function\n | Unknown_location _ -> false\n | Known_location _ -> true in\n let rec exists_usable = function\n | (-1) -> false\n | i -> usable_slot backtrace.(i) || exists_usable (i - 1) in\n if exists_usable (Array.length backtrace - 1)\n then Some backtrace\n else None\n\nlet backtrace_slots_of_raw_entry entry =\n backtrace_slots [| entry |]\n\nmodule Slot = struct\n type t = backtrace_slot\n let format = format_backtrace_slot\n let is_raise = backtrace_slot_is_raise\n let is_inline = backtrace_slot_is_inline\n let location = backtrace_slot_location\n let name = backtrace_slot_defname\nend\n\nlet raw_backtrace_length bt = Array.length bt\n\nexternal get_raw_backtrace_slot :\n raw_backtrace -> int -> raw_backtrace_slot = \"caml_raw_backtrace_slot\"\n\nexternal get_raw_backtrace_next_slot :\n raw_backtrace_slot -> raw_backtrace_slot option\n = \"caml_raw_backtrace_next_slot\"\n\n(* confusingly named:\n returns the *string* corresponding to the global current backtrace *)\nlet get_backtrace () = raw_backtrace_to_string (get_raw_backtrace ())\n\nexternal record_backtrace: bool -> unit = \"caml_record_backtrace\"\nexternal backtrace_status: unit -> bool = \"caml_backtrace_status\"\n\nlet rec register_printer fn =\n let old_printers = Atomic.get printers in\n let new_printers = fn :: old_printers in\n let success = Atomic.compare_and_set printers old_printers new_printers in\n if not success then register_printer fn\n\nexternal get_callstack: int -> raw_backtrace = \"caml_get_current_callstack\"\n\nlet exn_slot x =\n let x = Obj.repr x in\n if Obj.tag x = 0 then Obj.field x 0 else x\n\nlet exn_slot_id x =\n let slot = exn_slot x in\n (Obj.obj (Obj.field slot 1) : int)\n\nlet exn_slot_name x =\n let slot = exn_slot x in\n (Obj.obj (Obj.field slot 0) : string)\n\nexternal get_debug_info_status : unit -> int = \"caml_ml_debug_info_status\"\n\n(* Descriptions for errors in startup.h. See also backtrace.c *)\nlet errors = [| \"\";\n (* FILE_NOT_FOUND *)\n \"(Cannot print locations:\\n \\\n bytecode executable program file not found)\";\n (* BAD_BYTECODE *)\n \"(Cannot print locations:\\n \\\n bytecode executable program file appears to be corrupt)\";\n (* WRONG_MAGIC *)\n \"(Cannot print locations:\\n \\\n bytecode executable program file has wrong magic number)\";\n (* NO_FDS *)\n \"(Cannot print locations:\\n \\\n bytecode executable program file cannot be opened;\\n \\\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)\"\n|]\n\nlet default_uncaught_exception_handler exn raw_backtrace =\n eprintf \"Fatal error: exception %s\\n\" (to_string exn);\n print_raw_backtrace stderr raw_backtrace;\n let status = get_debug_info_status () in\n if status < 0 then\n prerr_endline errors.(abs status);\n flush stderr\n\nlet uncaught_exception_handler = ref default_uncaught_exception_handler\n\nlet set_uncaught_exception_handler fn = uncaught_exception_handler := fn\n\nlet empty_backtrace : raw_backtrace = [| |]\n\nlet try_get_raw_backtrace () =\n try\n get_raw_backtrace ()\n with _ (* Out_of_memory? *) ->\n empty_backtrace\n\nlet handle_uncaught_exception' exn debugger_in_use =\n try\n (* Get the backtrace now, in case one of the [at_exit] function\n destroys it. *)\n let raw_backtrace =\n if debugger_in_use (* Same test as in [runtime/printexc.c] *) then\n empty_backtrace\n else\n try_get_raw_backtrace ()\n in\n (try Stdlib.do_at_exit () with _ -> ());\n try\n !uncaught_exception_handler exn raw_backtrace\n with exn' ->\n let raw_backtrace' = try_get_raw_backtrace () in\n eprintf \"Fatal error: exception %s\\n\" (to_string exn);\n print_raw_backtrace stderr raw_backtrace;\n eprintf \"Fatal error in uncaught exception handler: exception %s\\n\"\n (to_string exn');\n print_raw_backtrace stderr raw_backtrace';\n flush stderr\n with\n | Out_of_memory ->\n prerr_endline\n \"Fatal error: out of memory in uncaught exception handler\"\n\n(* This function is called by [caml_fatal_uncaught_exception] in\n [runtime/printexc.c] which expects no exception is raised. *)\nlet handle_uncaught_exception exn debugger_in_use =\n try\n handle_uncaught_exception' exn debugger_in_use\n with _ ->\n (* There is not much we can do at this point *)\n ()\n\nexternal register_named_value : string -> 'a -> unit\n = \"caml_register_named_value\"\n\nlet () =\n register_named_value \"Printexc.handle_uncaught_exception\"\n handle_uncaught_exception\n"],"names":[],"mappings":"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","ignoreList":[0]}},{"offset":{"line":0,"column":266104},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/fun.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* The OCaml programmers *)\n(* *)\n(* Copyright 2018 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nexternal id : 'a -> 'a = \"%identity\"\nlet const c _ = c\nlet compose f g x = f (g x)\nlet flip f x y = f y x\nlet negate p v = not (p v)\n\nexception Finally_raised of exn\n\nlet () = Printexc.register_printer @@ function\n| Finally_raised exn -> Some (\"Fun.Finally_raised: \" ^ Printexc.to_string exn)\n| _ -> None\n\nlet protect ~(finally : unit -> unit) work =\n let finally_no_exn () =\n try finally () with e ->\n let bt = Printexc.get_raw_backtrace () in\n Printexc.raise_with_backtrace (Finally_raised e) bt\n in\n match work () with\n | result -> finally_no_exn () ; result\n | exception work_exn ->\n let work_bt = Printexc.get_raw_backtrace () in\n finally_no_exn () ;\n Printexc.raise_with_backtrace work_exn work_bt\n","(* generated code *)"],"names":[],"mappings":"QA6BI,OAAI,IAAJ,EAAI,mBAAU,G,AAAA,I,AAAA,G,EAAA,KACH,IAAT,QAAS,eACT,6BAAmD,C,SAHvD,kBAKA,SAAM,qBAAO,I,AAAA,I,AAAA,G,EAAA,KAGK,IAAd,QAAc,eACd,KAAiB,aAHT,KAAiB,EAIqB,C,KAfd,yBACwC,IAAjD,GADS,OACd,QAA+B,aAAsB,OAAhD,aAAiD,KACvE,KAAI,C,KANU,iBAAK,S,EADT,SAAK,C,KADA,iBAAK,gB,EADX,EAAC,C,QChBjB,kCDuBS,cAEE,yC,QCzBX,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":266832},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/gc.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* Jacques-Henri Jourdan, projet Gallium, INRIA Paris *)\n(* *)\n(* Copyright 1996-2016 Institut National de Recherche en Informatique *)\n(* et en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype stat = {\n minor_words : float;\n promoted_words : float;\n major_words : float;\n minor_collections : int;\n major_collections : int;\n heap_words : int;\n heap_chunks : int;\n live_words : int;\n live_blocks : int;\n free_words : int;\n free_blocks : int;\n largest_free : int;\n fragments : int;\n compactions : int;\n top_heap_words : int;\n stack_size : int;\n forced_major_collections: int;\n}\n\ntype control = {\n minor_heap_size : int;\n major_heap_increment : int;\n space_overhead : int;\n verbose : int;\n max_overhead : int;\n stack_limit : int;\n allocation_policy : int;\n window_size : int;\n custom_major_ratio : int;\n custom_minor_ratio : int;\n custom_minor_max_size : int;\n}\n\nexternal stat : unit -> stat = \"caml_gc_stat\"\nexternal quick_stat : unit -> stat = \"caml_gc_quick_stat\"\nexternal counters : unit -> (float * float * float) = \"caml_gc_counters\"\nexternal minor_words : unit -> (float [@unboxed])\n = \"caml_gc_minor_words\" \"caml_gc_minor_words_unboxed\"\nexternal get : unit -> control = \"caml_gc_get\"\nexternal set : control -> unit = \"caml_gc_set\"\nexternal minor : unit -> unit = \"caml_gc_minor\"\nexternal major_slice : int -> int = \"caml_gc_major_slice\"\nexternal major : unit -> unit = \"caml_gc_major\"\nexternal full_major : unit -> unit = \"caml_gc_full_major\"\nexternal compact : unit -> unit = \"caml_gc_compaction\"\nexternal get_minor_free : unit -> int = \"caml_get_minor_free\"\n\nlet eventlog_pause () = ()\nlet eventlog_resume () = ()\n\nopen Printf\n\nlet print_stat c =\n let st = stat () in\n fprintf c \"minor_collections: %d\\n\" st.minor_collections;\n fprintf c \"major_collections: %d\\n\" st.major_collections;\n fprintf c \"compactions: %d\\n\" st.compactions;\n fprintf c \"forced_major_collections: %d\\n\" st.forced_major_collections;\n fprintf c \"\\n\";\n let l1 = String.length (sprintf \"%.0f\" st.minor_words) in\n fprintf c \"minor_words: %*.0f\\n\" l1 st.minor_words;\n fprintf c \"promoted_words: %*.0f\\n\" l1 st.promoted_words;\n fprintf c \"major_words: %*.0f\\n\" l1 st.major_words;\n fprintf c \"\\n\";\n let l2 = String.length (sprintf \"%d\" st.top_heap_words) in\n fprintf c \"top_heap_words: %*d\\n\" l2 st.top_heap_words;\n fprintf c \"heap_words: %*d\\n\" l2 st.heap_words;\n fprintf c \"live_words: %*d\\n\" l2 st.live_words;\n fprintf c \"free_words: %*d\\n\" l2 st.free_words;\n fprintf c \"largest_free: %*d\\n\" l2 st.largest_free;\n fprintf c \"fragments: %*d\\n\" l2 st.fragments;\n fprintf c \"\\n\";\n fprintf c \"live_blocks: %d\\n\" st.live_blocks;\n fprintf c \"free_blocks: %d\\n\" st.free_blocks;\n fprintf c \"heap_chunks: %d\\n\" st.heap_chunks\n\n\nlet allocated_bytes () =\n let (mi, pro, ma) = counters () in\n (mi +. ma -. pro) *. float_of_int (Sys.word_size / 8)\n\n\nexternal finalise : ('a -> unit) -> 'a -> unit = \"caml_final_register\"\nexternal finalise_last : (unit -> unit) -> 'a -> unit =\n \"caml_final_register_called_without_value\"\nexternal finalise_release : unit -> unit = \"caml_final_release\"\n\n\ntype alarm = bool Atomic.t\ntype alarm_rec = {active : alarm; f : unit -> unit}\n\nlet rec call_alarm arec =\n if Atomic.get arec.active then begin\n let finally () = finalise call_alarm arec in\n Fun.protect ~finally arec.f\n end\n\nlet delete_alarm a = Atomic.set a false\n\nlet create_alarm f =\n let arec = { active = Atomic.make true; f = f } in\n Domain.at_exit (fun () -> delete_alarm arec.active);\n finalise call_alarm arec;\n arec.active\n\n\nmodule Memprof =\n struct\n type t\n type allocation_source = Normal | Marshal | Custom\n type allocation =\n { n_samples : int;\n size : int;\n source : allocation_source;\n callstack : Printexc.raw_backtrace }\n\n type ('minor, 'major) tracker = {\n alloc_minor: allocation -> 'minor option;\n alloc_major: allocation -> 'major option;\n promote: 'minor -> 'major option;\n dealloc_minor: 'minor -> unit;\n dealloc_major: 'major -> unit;\n }\n\n let null_tracker = {\n alloc_minor = (fun _ -> None);\n alloc_major = (fun _ -> None);\n promote = (fun _ -> None);\n dealloc_minor = (fun _ -> ());\n dealloc_major = (fun _ -> ());\n }\n\n external c_start :\n float -> int -> ('minor, 'major) tracker -> t\n = \"caml_memprof_start\"\n\n let start\n ~sampling_rate\n ?(callstack_size = max_int)\n tracker =\n c_start sampling_rate callstack_size tracker\n\n external stop : unit -> unit = \"caml_memprof_stop\"\n\n external discard : t -> unit = \"caml_memprof_discard\"\n end\n"],"names":[],"mappings":"8CC6JM,EAHA,UACmB,mBAEnB,KAA4C,C,EAfpB,IAAI,C,EAxBN,gBAAwB,C,EAAlD,GADsB,IAAtB,QAAsB,eACtB,yBACwB,EACb,C,EANQ,2BAAkB,C,KAnBjB,OAAW,UAC9B,OAD8B,OAC9B,QAD8B,OAC/B,wBAAqB,CAArB,IAAqD,C,QA1B5C,OACT,kDAA6D,OAC7D,KAD6D,QAC7D,2BAA6D,OAC7D,KAD6D,QAC7D,2BAAuD,OACvD,KADuD,QACvD,2BACA,KADsE,QACtE,cAAc,OACS,GADT,QACS,0BAA+B,OACtD,uCACA,IADqD,OACrD,KADqD,QACrD,iBACA,IADwD,OACxD,KADwD,QACxD,iBACA,KADqD,QACrD,cAAc,OACS,GADT,QACS,0BAAgC,OACvD,uCACA,IADsD,OACtD,KADsD,QACtD,iBACA,IADkD,OAClD,KADkD,QAClD,iBACA,IADkD,OAClD,KADkD,QAClD,iBACA,IADkD,OAClD,KADkD,QAClD,iBACA,IADoD,OACpD,KADoD,QACpD,iBACA,KADiD,QACjD,cAAc,OACd,KADc,QACd,2BAA4C,OAC5C,KAD4C,QAC5C,2BAA4C,8CACA,C","ignoreList":[0]}},{"offset":{"line":0,"column":268305},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/in_channel.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2021 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype t = in_channel\n\ntype open_flag = Stdlib.open_flag =\n | Open_rdonly\n | Open_wronly\n | Open_append\n | Open_creat\n | Open_trunc\n | Open_excl\n | Open_binary\n | Open_text\n | Open_nonblock\n\nlet stdin = Stdlib.stdin\nlet open_bin = Stdlib.open_in_bin\nlet open_text = Stdlib.open_in\nlet open_gen = Stdlib.open_in_gen\n\nlet with_open openfun s f =\n let ic = openfun s in\n Fun.protect ~finally:(fun () -> Stdlib.close_in_noerr ic)\n (fun () -> f ic)\n\nlet with_open_bin s f =\n with_open Stdlib.open_in_bin s f\n\nlet with_open_text s f =\n with_open Stdlib.open_in s f\n\nlet with_open_gen flags perm s f =\n with_open (Stdlib.open_in_gen flags perm) s f\n\nlet seek = Stdlib.LargeFile.seek_in\nlet pos = Stdlib.LargeFile.pos_in\nlet length = Stdlib.LargeFile.in_channel_length\nlet close = Stdlib.close_in\nlet close_noerr = Stdlib.close_in_noerr\n\nlet input_char ic =\n match Stdlib.input_char ic with\n | c -> Some c\n | exception End_of_file -> None\n\nlet input_byte ic =\n match Stdlib.input_byte ic with\n | n -> Some n\n | exception End_of_file -> None\n\nlet input_line ic =\n match Stdlib.input_line ic with\n | s -> Some s\n | exception End_of_file -> None\n\nlet input = Stdlib.input\n\nexternal unsafe_input_bigarray :\n t -> _ Bigarray.Array1.t -> int -> int -> int\n = \"caml_ml_input_bigarray\"\n\nlet input_bigarray ic buf ofs len =\n if ofs < 0 || len < 0 || ofs > Bigarray.Array1.dim buf - len\n then invalid_arg \"input_bigarray\"\n else unsafe_input_bigarray ic buf ofs len\n\nlet really_input ic buf pos len =\n match Stdlib.really_input ic buf pos len with\n | () -> Some ()\n | exception End_of_file -> None\n\nlet rec unsafe_really_input_bigarray ic buf ofs len =\n if len <= 0 then Some () else begin\n let r = unsafe_input_bigarray ic buf ofs len in\n if r = 0\n then None\n else unsafe_really_input_bigarray ic buf (ofs + r) (len - r)\n end\n\nlet really_input_bigarray ic buf ofs len =\n if ofs < 0 || len < 0 || ofs > Bigarray.Array1.dim buf - len\n then invalid_arg \"really_input_bigarray\"\n else unsafe_really_input_bigarray ic buf ofs len\n\nlet really_input_string ic len =\n match Stdlib.really_input_string ic len with\n | s -> Some s\n | exception End_of_file -> None\n\n(* Read up to [len] bytes into [buf], starting at [ofs]. Return total bytes\n read. *)\nlet read_upto ic buf ofs len =\n let rec loop ofs len =\n if len = 0 then ofs\n else begin\n let r = Stdlib.input ic buf ofs len in\n if r = 0 then\n ofs\n else\n loop (ofs + r) (len - r)\n end\n in\n loop ofs len - ofs\n\n(* Best effort attempt to return a buffer with >= (ofs + n) bytes of storage,\n and such that it coincides with [buf] at indices < [ofs].\n\n The returned buffer is equal to [buf] itself if it already has sufficient\n free space.\n\n The returned buffer may have *fewer* than [ofs + n] bytes of storage if this\n number is > [Sys.max_string_length]. However the returned buffer will\n *always* have > [ofs] bytes of storage. In the limiting case when [ofs = len\n = Sys.max_string_length] (so that it is not possible to resize the buffer at\n all), an exception is raised. *)\n\nlet ensure buf ofs n =\n let len = Bytes.length buf in\n if len >= ofs + n then buf\n else begin\n let new_len = ref len in\n while !new_len < ofs + n do\n new_len := 2 * !new_len + 1\n done;\n let new_len = !new_len in\n let new_len =\n if new_len <= Sys.max_string_length then\n new_len\n else if ofs < Sys.max_string_length then\n Sys.max_string_length\n else\n failwith \"In_channel.input_all: channel content \\\n is larger than maximum string length\"\n in\n let new_buf = Bytes.create new_len in\n Bytes.blit buf 0 new_buf 0 ofs;\n new_buf\n end\n\nlet input_all ic =\n let chunk_size = 65536 in (* IO_BUFFER_SIZE *)\n let initial_size =\n try\n Stdlib.in_channel_length ic - Stdlib.pos_in ic\n with Sys_error _ ->\n -1\n in\n let initial_size = if initial_size < 0 then chunk_size else initial_size in\n let initial_size =\n if initial_size <= Sys.max_string_length then\n initial_size\n else\n Sys.max_string_length\n in\n let buf = Bytes.create initial_size in\n let nread = read_upto ic buf 0 initial_size in\n if nread < initial_size then (* EOF reached, buffer partially filled *)\n Bytes.sub_string buf 0 nread\n else begin (* nread = initial_size, maybe EOF reached *)\n match Stdlib.input_char ic with\n | exception End_of_file ->\n (* EOF reached, buffer is completely filled *)\n Bytes.unsafe_to_string buf\n | c ->\n (* EOF not reached *)\n let rec loop buf ofs =\n let buf = ensure buf ofs chunk_size in\n let rem = Bytes.length buf - ofs in\n (* [rem] can be < [chunk_size] if buffer size close to\n [Sys.max_string_length] *)\n let r = read_upto ic buf ofs rem in\n if r < rem then (* EOF reached *)\n Bytes.sub_string buf 0 (ofs + r)\n else (* r = rem *)\n loop buf (ofs + rem)\n in\n let buf = ensure buf nread (chunk_size + 1) in\n Bytes.set buf nread c;\n loop buf (nread + 1)\n end\n\nlet [@tail_mod_cons] rec input_lines ic =\n match Stdlib.input_line ic with\n | line -> line :: input_lines ic\n | exception End_of_file -> []\n\nlet rec fold_lines f accu ic =\n match Stdlib.input_line ic with\n | line -> fold_lines f (f accu line) ic\n | exception End_of_file -> accu\n\nlet set_binary_mode = Stdlib.set_binary_mode_in\n\nexternal is_binary_mode : in_channel -> bool = \"caml_ml_is_binary_mode\"\n\nexternal isatty : t -> bool = \"caml_sys_isatty\"\n"],"names":[],"mappings":"mBCwME,WAAM,EAAN,QAAM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GDxM5B,iDC0M6B,S,EADJ,SAAa,K,CACL,C,QAP/B,SAAM,EAAN,QAAM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GDnM5B,iDCqM6B,W,EADjB,kBAAQ,QADlB,SAAM,EAAN,QAAM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GDnM5B,iDCqM6B,cADK,S,EAAtB,+B,CACmB,C,WA7BjB,EARZ,IANA,SAEkC,EAFlC,QAEkC,eAA9B,EAA8C,QAA9C,aAA2B,iB,AAAA,I,AAAA,G,EAAA,KD5JjC,yDC8JM,SAJJ,EAMA,WACA,MADA,QACA,cAII,SAEM,MACE,WACZ,gBACE,gC,EAAA,SAEM,EAFN,QAEM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GD5K9B,iDC+KQ,6B,EAeA,QADU,eACV,8BAAqB,aAXT,iBACV,YAGQ,iBACR,WACE,mCAEA,U,KAAA,GAKP,C,cA7DH,I,IAAA,E,EAAA,MADA,WACA,MAAuB,6BAInB,eAaF,MAVA,QADA,QACA,cAGO,qBACH,SAEA,yBAGU,IACd,4BAA8B,EAE7B,C,QAnCH,MATE,O,CAAA,EAGE,IADQ,QADL,QACK,eACR,C,CAAA,EAGE,sCAGM,UAAM,C,EAjBlB,SAAM,IAAN,QAAM,eAAiC,I,AAAA,I,AAAA,G,EAAA,GDlGzC,iDCoG6B,W,EADpB,UACwB,C,MAP/B,4BAA+B,KAAuB,yBARtD,SAEE,IADQ,aACR,GACK,MACA,kC,EAJU,K,MASZ,uBAC2C,C,EAfhD,OAAM,QAAN,QAAM,cACE,M,AAAA,I,AAAA,G,EAAA,GDjFV,kDCkF6B,UAAI,C,KAP/B,4BAA+B,KAAuB,uBAEjD,WAAoC,IADpC,uBACoC,C,EAbzC,SAAM,EAAN,QAAM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GDhE5B,iDCkE6B,W,EADpB,UACwB,C,EAP/B,SAAM,EAAN,QAAM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GD3D5B,iDC6D6B,W,EADpB,UACwB,C,EAP/B,SAAM,EAAN,QAAM,eAAoB,I,AAAA,I,AAAA,G,EAAA,GDtD5B,iDCwD6B,W,EADpB,UACwB,C,KAXrB,uC,EAAA,OAAV,QAAU,GAA+B,OAAI,C,EAH7C,eAA4B,C,EAH5B,eAAgC,C,EAJA,8BAAwB,C,KAC3C,8BAAI,C,KADjB,GADS,mBACT,kCACkB,C","ignoreList":[0]}},{"offset":{"line":0,"column":271320},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/out_channel.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2021 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype t = out_channel\n\ntype open_flag = Stdlib.open_flag =\n | Open_rdonly\n | Open_wronly\n | Open_append\n | Open_creat\n | Open_trunc\n | Open_excl\n | Open_binary\n | Open_text\n | Open_nonblock\n\nlet stdout = Stdlib.stdout\nlet stderr = Stdlib.stderr\nlet open_bin = Stdlib.open_out_bin\nlet open_text = Stdlib.open_out\nlet open_gen = Stdlib.open_out_gen\n\nlet with_open openfun s f =\n let oc = openfun s in\n Fun.protect ~finally:(fun () -> Stdlib.close_out_noerr oc)\n (fun () -> f oc)\n\nlet with_open_bin s f =\n with_open Stdlib.open_out_bin s f\n\nlet with_open_text s f =\n with_open Stdlib.open_out s f\n\nlet with_open_gen flags perm s f =\n with_open (Stdlib.open_out_gen flags perm) s f\n\nexternal unsafe_output_bigarray :\n t -> _ Bigarray.Array1.t -> int -> int -> unit\n = \"caml_ml_output_bigarray\"\n\nlet seek = Stdlib.LargeFile.seek_out\nlet pos = Stdlib.LargeFile.pos_out\nlet length = Stdlib.LargeFile.out_channel_length\nlet close = Stdlib.close_out\nlet close_noerr = Stdlib.close_out_noerr\nlet flush = Stdlib.flush\nlet flush_all = Stdlib.flush_all\nlet output_char = Stdlib.output_char\nlet output_byte = Stdlib.output_byte\nlet output_string = Stdlib.output_string\nlet output_bytes = Stdlib.output_bytes\nlet output = Stdlib.output\nlet output_substring = Stdlib.output_substring\nlet output_bigarray oc buf ofs len =\n if ofs < 0 || len < 0 || ofs > Bigarray.Array1.dim buf - len\n then invalid_arg \"output_bigarray\"\n else unsafe_output_bigarray oc buf ofs len\n\nlet set_binary_mode = Stdlib.set_binary_mode_out\n\nexternal is_binary_mode : out_channel -> bool = \"caml_ml_is_binary_mode\"\n\nexternal set_buffered : t -> bool -> unit = \"caml_ml_set_buffered\"\n\nexternal is_buffered : t -> bool = \"caml_ml_is_buffered\"\n\nexternal isatty : t -> bool = \"caml_sys_isatty\"\n"],"names":[],"mappings":"uCCkEE,4BAA+B,KAAuB,uBAEjD,WAAqC,IADrC,uBACqC,C,KAtBhC,uC,EAAA,OAAV,OAAU,GAAgC,OAAI,C,EAH9C,cAA6B,C,EAH7B,cAAiC,C,EAJD,8BAAyB,C,KAC5C,8BAAI,C,KADjB,GADS,mBACT,kCACkB,C","ignoreList":[0]}},{"offset":{"line":0,"column":272073},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/digest.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Utility functions *)\n\nlet hex_of_string d =\n let char_hex n =\n Char.chr (if n < 10 then Char.code '0' + n\n else Char.code 'a' + n - 10) in\n let len = String.length d in\n let result = Bytes.create (len * 2) in\n for i = 0 to len - 1 do\n let x = Char.code d.[i] in\n Bytes.unsafe_set result (i*2) (char_hex (x lsr 4));\n Bytes.unsafe_set result (i*2+1) (char_hex (x land 0x0f));\n done;\n Bytes.unsafe_to_string result\n\nlet string_of_hex s =\n let digit c =\n match c with\n | '0'..'9' -> Char.code c - Char.code '0'\n | 'A'..'F' -> Char.code c - Char.code 'A' + 10\n | 'a'..'f' -> Char.code c - Char.code 'a' + 10\n | _ -> invalid_arg \"Digest.of_hex\" in\n let byte i = digit s.[i] lsl 4 + digit s.[i+1] in\n String.init (String.length s / 2) (fun i -> Char.chr (byte (2 * i)))\n\n(* Generic interface *)\n\nmodule type S = sig\n type t = string\n val hash_length : int\n val compare : t -> t -> int\n val equal : t -> t -> bool\n val string : string -> t\n val bytes : bytes -> t\n val substring : string -> int -> int -> t\n val subbytes : bytes -> int -> int -> t\n val channel : in_channel -> int -> t\n val file : string -> t\n val output : out_channel -> t -> unit\n val input : in_channel -> t\n val to_hex : t -> string\n val of_hex : string -> t\nend\n\n(* BLAKE2 hashing, parameterized by hash size *)\n\nmodule BLAKE2 (X: sig val hash_length : int end) : S = struct\n\n type t = string\n\n let hash_length =\n if X.hash_length < 1 || X.hash_length > 64\n then invalid_arg \"Digest.BLAKE2: wrong hash size\";\n X.hash_length\n\n let compare = String.compare\n let equal = String.equal\n\n type state\n\n external create_gen: int -> string -> state = \"caml_blake2_create\"\n external update: state -> string -> int -> int -> unit = \"caml_blake2_update\"\n external final: state -> int -> t = \"caml_blake2_final\"\n external unsafe_string: int -> string -> string -> int -> int -> t\n = \"caml_blake2_string\"\n\n let create () = create_gen hash_length \"\"\n\n let string str =\n unsafe_string hash_length \"\" str 0 (String.length str)\n\n let bytes b =\n string (Bytes.unsafe_to_string b)\n\n let substring str ofs len =\n if ofs < 0 || len < 0 || ofs > String.length str - len\n then invalid_arg \"Digest.substring\";\n unsafe_string hash_length \"\" str ofs len\n\n let subbytes b ofs len =\n substring (Bytes.unsafe_to_string b) ofs len\n\n let channel ic toread =\n let buf_size = 4096 in\n let buf = Bytes.create buf_size in\n let ctx = create () in\n if toread < 0 then begin\n let rec do_read () =\n let n = In_channel.input ic buf 0 buf_size in\n if n = 0\n then final ctx hash_length\n else (update ctx (Bytes.unsafe_to_string buf) 0 n; do_read ())\n in do_read ()\n end else begin\n let rec do_read toread =\n if toread = 0 then final ctx hash_length else begin\n let n = In_channel.input ic buf 0 (Int.min buf_size toread) in\n if n = 0\n then raise End_of_file\n else begin\n update ctx (Bytes.unsafe_to_string buf) 0 n;\n do_read (toread - n)\n end\n end\n in do_read toread\n end\n\n let file filename =\n In_channel.with_open_bin filename (fun ic -> channel ic (-1))\n\n let output chan digest = output_string chan digest\n\n let input chan = really_input_string chan hash_length\n\n let to_hex d =\n if String.length d <> hash_length then invalid_arg \"Digest.to_hex\";\n hex_of_string d\n\n let of_hex s =\n if String.length s <> hash_length * 2 then invalid_arg \"Digest.of_hex\";\n string_of_hex s\n\nend\n\nmodule BLAKE128 = BLAKE2(struct let hash_length = 16 end)\nmodule BLAKE256 = BLAKE2(struct let hash_length = 32 end)\nmodule BLAKE512 = BLAKE2(struct let hash_length = 64 end)\n\n(* MD5 hashing *)\n\nmodule MD5 = struct\n\n type t = string\n\n let hash_length = 16\n\n let compare = String.compare\n let equal = String.equal\n\n external unsafe_string: string -> int -> int -> t = \"caml_md5_string\"\n external channel: in_channel -> int -> t = \"caml_md5_chan\"\n\n let string str =\n unsafe_string str 0 (String.length str)\n\n let bytes b = string (Bytes.unsafe_to_string b)\n\n let substring str ofs len =\n if ofs < 0 || len < 0 || ofs > String.length str - len\n then invalid_arg \"Digest.substring\"\n else unsafe_string str ofs len\n\n let subbytes b ofs len = substring (Bytes.unsafe_to_string b) ofs len\n\n let file filename =\n In_channel.with_open_bin filename (fun ic -> channel ic (-1))\n\n let output chan digest = output_string chan digest\n\n let input chan = really_input_string chan 16\n\n let to_hex d =\n if String.length d <> 16 then invalid_arg \"Digest.to_hex\";\n hex_of_string d\n\n let of_hex s =\n if String.length s <> 32 then invalid_arg \"Digest.from_hex\";\n string_of_hex s\n\nend\n\n(* Default exported implementation is MD5 *)\n\ninclude MD5\n\nlet from_hex = of_hex\n"],"names":[],"mappings":"YCqLI,YAA8B,yBAC9B,KAAe,C,EALf,YAA8B,yBAC9B,KAAe,C,EAJA,2BAA2B,C,EAFnB,yBAAyB,C,EAFH,SAAe,C,EAA5D,0BAA6D,C,EAH5B,EAAV,QAAU,aAA0B,WAAQ,C,QAJnE,uDAEK,SAAyB,IADzB,uBACyB,C,EALX,EAAP,QAAO,aAA0B,Q,KAF7C,oBAAuC,C,EAxBvC,8BAA2C,yBAC3C,KAAe,C,EALf,sBAAuC,yBACvC,KAAe,C,EAJA,gCAAoC,C,EAJN,oBAAe,C,EAA5D,yCAA6D,C,aAzB7D,QACU,SAlBI,cAoBd,kBASI,UAAmB,YAEjB,IADQ,QAA0B,OADU,QACV,aAAyB,QAAnD,eACR,GACK,UAEH,EAAW,EADR,QACQ,aAAX,UAA2C,mB,IAAA,GAX/C,IADQ,aAAR,QAAQ,eACR,IACK,YACC,EAAW,EAAZ,QAAY,aAAX,UAA2C,KAclD,C,MAzBH,QAAU,EAAV,QAAU,aAA0B,cAAQ,C,OAL5C,Y,CAAA,c,CAAA,uCACK,yBADL,MAEA,gBAAwC,C,KALxC,OAAO,EAAP,QAAO,aAA0B,U,KAHjC,gCAAsD,C,qEAjBjD,yBACL,mI,QA9B0C,cAD/B,KAA0B,MACK,OADL,gCAAN,OAAd,0CAAN,KAAW,oBAC2C,4B,KANjE,8BAGc,I,GAAA,gBADA,I,EAAA,sBADA,YAGP,uBAA2B,C,KAEpC,2CAAoE,C,KAlBzC,I,GAAA,CADA,OAAzB,QAAyB,uBACuB,C,WAClD,SACA,GAAa,MAJb,EAKA,qBACoB,mCAClB,UAA8B,OAAoB,yBACM,gBAAxD,KAAgC,KAAwB,iCAE1D,2BAA6B,C","ignoreList":[0]}},{"offset":{"line":0,"column":274419},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/bigarray.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Manuel Serrano et Xavier Leroy, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2000 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Module [Bigarray]: large, multi-dimensional, numerical arrays *)\n\n(* These types in must be kept in sync with the tables in\n ../typing/typeopt.ml *)\n\ntype float16_elt = Float16_elt\ntype float32_elt = Float32_elt\ntype float64_elt = Float64_elt\ntype int8_signed_elt = Int8_signed_elt\ntype int8_unsigned_elt = Int8_unsigned_elt\ntype int16_signed_elt = Int16_signed_elt\ntype int16_unsigned_elt = Int16_unsigned_elt\ntype int32_elt = Int32_elt\ntype int64_elt = Int64_elt\ntype int_elt = Int_elt\ntype nativeint_elt = Nativeint_elt\ntype complex32_elt = Complex32_elt\ntype complex64_elt = Complex64_elt\n\n(* Keep the order of these constructors in sync with the caml_ba_kind\n enumeration in bigarray.h *)\n\ntype ('a, 'b) kind =\n | Float32 : (float, float32_elt) kind\n | Float64 : (float, float64_elt) kind\n | Int8_signed : (int, int8_signed_elt) kind\n | Int8_unsigned : (int, int8_unsigned_elt) kind\n | Int16_signed : (int, int16_signed_elt) kind\n | Int16_unsigned : (int, int16_unsigned_elt) kind\n | Int32 : (int32, int32_elt) kind\n | Int64 : (int64, int64_elt) kind\n | Int : (int, int_elt) kind\n | Nativeint : (nativeint, nativeint_elt) kind\n | Complex32 : (Complex.t, complex32_elt) kind\n | Complex64 : (Complex.t, complex64_elt) kind\n | Char : (char, int8_unsigned_elt) kind\n | Float16 : (float, float16_elt) kind\n\ntype c_layout = C_layout_typ\ntype fortran_layout = Fortran_layout_typ (**)\n\ntype 'a layout =\n C_layout: c_layout layout\n | Fortran_layout: fortran_layout layout\n\nlet float16 = Float16\nlet float32 = Float32\nlet float64 = Float64\nlet int8_signed = Int8_signed\nlet int8_unsigned = Int8_unsigned\nlet int16_signed = Int16_signed\nlet int16_unsigned = Int16_unsigned\nlet int32 = Int32\nlet int64 = Int64\nlet int = Int\nlet nativeint = Nativeint\nlet complex32 = Complex32\nlet complex64 = Complex64\nlet char = Char\n\nlet kind_size_in_bytes : type a b. (a, b) kind -> int = function\n | Float16 -> 2\n | Float32 -> 4\n | Float64 -> 8\n | Int8_signed -> 1\n | Int8_unsigned -> 1\n | Int16_signed -> 2\n | Int16_unsigned -> 2\n | Int32 -> 4\n | Int64 -> 8\n | Int -> Sys.word_size / 8\n | Nativeint -> Sys.word_size / 8\n | Complex32 -> 8\n | Complex64 -> 16\n | Char -> 1\n\n(* Keep those constants in sync with the caml_ba_layout enumeration\n in bigarray.h *)\n\nlet c_layout = C_layout\nlet fortran_layout = Fortran_layout\n\nmodule Genarray = struct\n type (!'a, !'b, !'c) t\n external create: ('a, 'b) kind -> 'c layout -> int array -> ('a, 'b, 'c) t\n = \"caml_ba_create\"\n external get: ('a, 'b, 'c) t -> int array -> 'a\n = \"caml_ba_get_generic\"\n external set: ('a, 'b, 'c) t -> int array -> 'a -> unit\n = \"caml_ba_set_generic\"\n\n let rec cloop arr idx f col max =\n if col = Array.length idx then set arr idx (f idx)\n else for j = 0 to pred max.(col) do\n idx.(col) <- j;\n cloop arr idx f (succ col) max\n done\n let rec floop arr idx f col max =\n if col < 0 then set arr idx (f idx)\n else for j = 1 to max.(col) do\n idx.(col) <- j;\n floop arr idx f (pred col) max\n done\n let init (type t) kind (layout : t layout) dims f =\n let arr = create kind layout dims in\n let dlen = Array.length dims in\n match layout with\n | C_layout -> cloop arr (Array.make dlen 0) f 0 dims; arr\n | Fortran_layout -> floop arr (Array.make dlen 1) f (pred dlen) dims; arr\n\n external num_dims: ('a, 'b, 'c) t -> int = \"caml_ba_num_dims\"\n external nth_dim: ('a, 'b, 'c) t -> int -> int = \"caml_ba_dim\"\n let dims a =\n let n = num_dims a in\n let d = Array.make n 0 in\n for i = 0 to n-1 do d.(i) <- nth_dim a i done;\n d\n\n external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = \"caml_ba_kind\"\n external layout: ('a, 'b, 'c) t -> 'c layout = \"caml_ba_layout\"\n external change_layout: ('a, 'b, 'c) t -> 'd layout -> ('a, 'b, 'd) t\n = \"caml_ba_change_layout\"\n\n let size_in_bytes arr =\n (kind_size_in_bytes (kind arr)) * (Array.fold_left ( * ) 1 (dims arr))\n\n external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t\n = \"caml_ba_sub\"\n external sub_right: ('a, 'b, fortran_layout) t -> int -> int ->\n ('a, 'b, fortran_layout) t\n = \"caml_ba_sub\"\n external slice_left: ('a, 'b, c_layout) t -> int array ->\n ('a, 'b, c_layout) t\n = \"caml_ba_slice\"\n external slice_right: ('a, 'b, fortran_layout) t -> int array ->\n ('a, 'b, fortran_layout) t\n = \"caml_ba_slice\"\n external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit\n = \"caml_ba_blit\"\n external fill: ('a, 'b, 'c) t -> 'a -> unit = \"caml_ba_fill\"\nend\n\nmodule Array0 = struct\n type (!'a, !'b, !'c) t = ('a, 'b, 'c) Genarray.t\n let create kind layout =\n Genarray.create kind layout [||]\n let get arr = Genarray.get arr [||]\n let set arr = Genarray.set arr [||]\n external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = \"caml_ba_kind\"\n external layout: ('a, 'b, 'c) t -> 'c layout = \"caml_ba_layout\"\n\n external change_layout: ('a, 'b, 'c) t -> 'd layout -> ('a, 'b, 'd) t\n = \"caml_ba_change_layout\"\n\n let size_in_bytes arr = kind_size_in_bytes (kind arr)\n\n external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit = \"caml_ba_blit\"\n external fill: ('a, 'b, 'c) t -> 'a -> unit = \"caml_ba_fill\"\n\n let of_value kind layout v =\n let a = create kind layout in\n set a v;\n a\n let init = of_value\nend\n\nmodule Array1 = struct\n type (!'a, !'b, !'c) t = ('a, 'b, 'c) Genarray.t\n let create kind layout dim =\n Genarray.create kind layout [|dim|]\n external get: ('a, 'b, 'c) t -> int -> 'a = \"%caml_ba_ref_1\"\n external set: ('a, 'b, 'c) t -> int -> 'a -> unit = \"%caml_ba_set_1\"\n external unsafe_get: ('a, 'b, 'c) t -> int -> 'a = \"%caml_ba_unsafe_ref_1\"\n external unsafe_set: ('a, 'b, 'c) t -> int -> 'a -> unit\n = \"%caml_ba_unsafe_set_1\"\n external dim: ('a, 'b, 'c) t -> int = \"%caml_ba_dim_1\"\n external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = \"caml_ba_kind\"\n external layout: ('a, 'b, 'c) t -> 'c layout = \"caml_ba_layout\"\n\n external change_layout: ('a, 'b, 'c) t -> 'd layout -> ('a, 'b, 'd) t\n = \"caml_ba_change_layout\"\n\n let size_in_bytes arr =\n (kind_size_in_bytes (kind arr)) * (dim arr)\n\n external sub: ('a, 'b, 'c) t -> int -> int -> ('a, 'b, 'c) t = \"caml_ba_sub\"\n let slice (type t) (a : (_, _, t) Genarray.t) n =\n match layout a with\n | C_layout -> (Genarray.slice_left a [|n|] : (_, _, t) Genarray.t)\n | Fortran_layout -> (Genarray.slice_right a [|n|]: (_, _, t) Genarray.t)\n external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit = \"caml_ba_blit\"\n external fill: ('a, 'b, 'c) t -> 'a -> unit = \"caml_ba_fill\"\n let c_init arr dim f =\n for i = 0 to pred dim do unsafe_set arr i (f i) done\n let fortran_init arr dim f =\n for i = 1 to dim do unsafe_set arr i (f i) done\n let init (type t) kind (layout : t layout) dim f =\n let arr = create kind layout dim in\n match layout with\n | C_layout -> c_init arr dim f; arr\n | Fortran_layout -> fortran_init arr dim f; arr\n let of_array (type t) kind (layout: t layout) data =\n let ba = create kind layout (Array.length data) in\n let ofs =\n match layout with\n C_layout -> 0\n | Fortran_layout -> 1\n in\n for i = 0 to Array.length data - 1 do unsafe_set ba (i + ofs) data.(i) done;\n ba\nend\n\nmodule Array2 = struct\n type (!'a, !'b, !'c) t = ('a, 'b, 'c) Genarray.t\n let create kind layout dim1 dim2 =\n Genarray.create kind layout [|dim1; dim2|]\n external get: ('a, 'b, 'c) t -> int -> int -> 'a = \"%caml_ba_ref_2\"\n external set: ('a, 'b, 'c) t -> int -> int -> 'a -> unit = \"%caml_ba_set_2\"\n external unsafe_get: ('a, 'b, 'c) t -> int -> int -> 'a\n = \"%caml_ba_unsafe_ref_2\"\n external unsafe_set: ('a, 'b, 'c) t -> int -> int -> 'a -> unit\n = \"%caml_ba_unsafe_set_2\"\n external dim1: ('a, 'b, 'c) t -> int = \"%caml_ba_dim_1\"\n external dim2: ('a, 'b, 'c) t -> int = \"%caml_ba_dim_2\"\n external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = \"caml_ba_kind\"\n external layout: ('a, 'b, 'c) t -> 'c layout = \"caml_ba_layout\"\n\n external change_layout: ('a, 'b, 'c) t -> 'd layout -> ('a, 'b, 'd) t\n = \"caml_ba_change_layout\"\n\n let size_in_bytes arr =\n (kind_size_in_bytes (kind arr)) * (dim1 arr) * (dim2 arr)\n\n external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t\n = \"caml_ba_sub\"\n external sub_right:\n ('a, 'b, fortran_layout) t -> int -> int -> ('a, 'b, fortran_layout) t\n = \"caml_ba_sub\"\n let slice_left a n = Genarray.slice_left a [|n|]\n let slice_right a n = Genarray.slice_right a [|n|]\n external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit = \"caml_ba_blit\"\n external fill: ('a, 'b, 'c) t -> 'a -> unit = \"caml_ba_fill\"\n let c_init arr dim1 dim2 f =\n for i = 0 to pred dim1 do\n for j = 0 to pred dim2 do\n unsafe_set arr i j (f i j)\n done\n done\n let fortran_init arr dim1 dim2 f =\n for j = 1 to dim2 do\n for i = 1 to dim1 do\n unsafe_set arr i j (f i j)\n done\n done\n let init (type t) kind (layout : t layout) dim1 dim2 f =\n let arr = create kind layout dim1 dim2 in\n match layout with\n | C_layout -> c_init arr dim1 dim2 f; arr\n | Fortran_layout -> fortran_init arr dim1 dim2 f; arr\n let of_array (type t) kind (layout: t layout) data =\n let dim1 = Array.length data in\n let dim2 = if dim1 = 0 then 0 else Array.length data.(0) in\n let ba = create kind layout dim1 dim2 in\n let ofs =\n match layout with\n C_layout -> 0\n | Fortran_layout -> 1\n in\n for i = 0 to dim1 - 1 do\n let row = data.(i) in\n if Array.length row <> dim2 then\n invalid_arg(\"Bigarray.Array2.of_array: non-rectangular data\");\n for j = 0 to dim2 - 1 do\n unsafe_set ba (i + ofs) (j + ofs) row.(j)\n done\n done;\n ba\nend\n\nmodule Array3 = struct\n type (!'a, !'b, !'c) t = ('a, 'b, 'c) Genarray.t\n let create kind layout dim1 dim2 dim3 =\n Genarray.create kind layout [|dim1; dim2; dim3|]\n external get: ('a, 'b, 'c) t -> int -> int -> int -> 'a = \"%caml_ba_ref_3\"\n external set: ('a, 'b, 'c) t -> int -> int -> int -> 'a -> unit\n = \"%caml_ba_set_3\"\n external unsafe_get: ('a, 'b, 'c) t -> int -> int -> int -> 'a\n = \"%caml_ba_unsafe_ref_3\"\n external unsafe_set: ('a, 'b, 'c) t -> int -> int -> int -> 'a -> unit\n = \"%caml_ba_unsafe_set_3\"\n external dim1: ('a, 'b, 'c) t -> int = \"%caml_ba_dim_1\"\n external dim2: ('a, 'b, 'c) t -> int = \"%caml_ba_dim_2\"\n external dim3: ('a, 'b, 'c) t -> int = \"%caml_ba_dim_3\"\n external kind: ('a, 'b, 'c) t -> ('a, 'b) kind = \"caml_ba_kind\"\n external layout: ('a, 'b, 'c) t -> 'c layout = \"caml_ba_layout\"\n\n external change_layout: ('a, 'b, 'c) t -> 'd layout -> ('a, 'b, 'd) t\n = \"caml_ba_change_layout\"\n\n let size_in_bytes arr =\n (kind_size_in_bytes (kind arr)) * (dim1 arr) * (dim2 arr) * (dim3 arr)\n\n external sub_left: ('a, 'b, c_layout) t -> int -> int -> ('a, 'b, c_layout) t\n = \"caml_ba_sub\"\n external sub_right:\n ('a, 'b, fortran_layout) t -> int -> int -> ('a, 'b, fortran_layout) t\n = \"caml_ba_sub\"\n let slice_left_1 a n m = Genarray.slice_left a [|n; m|]\n let slice_right_1 a n m = Genarray.slice_right a [|n; m|]\n let slice_left_2 a n = Genarray.slice_left a [|n|]\n let slice_right_2 a n = Genarray.slice_right a [|n|]\n external blit: ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit = \"caml_ba_blit\"\n external fill: ('a, 'b, 'c) t -> 'a -> unit = \"caml_ba_fill\"\n let c_init arr dim1 dim2 dim3 f =\n for i = 0 to pred dim1 do\n for j = 0 to pred dim2 do\n for k = 0 to pred dim3 do\n unsafe_set arr i j k (f i j k)\n done\n done\n done\n let fortran_init arr dim1 dim2 dim3 f =\n for k = 1 to dim3 do\n for j = 1 to dim2 do\n for i = 1 to dim1 do\n unsafe_set arr i j k (f i j k)\n done\n done\n done\n let init (type t) kind (layout : t layout) dim1 dim2 dim3 f =\n let arr = create kind layout dim1 dim2 dim3 in\n match layout with\n | C_layout -> c_init arr dim1 dim2 dim3 f; arr\n | Fortran_layout -> fortran_init arr dim1 dim2 dim3 f; arr\n let of_array (type t) kind (layout: t layout) data =\n let dim1 = Array.length data in\n let dim2 = if dim1 = 0 then 0 else Array.length data.(0) in\n let dim3 = if dim2 = 0 then 0 else Array.length data.(0).(0) in\n let ba = create kind layout dim1 dim2 dim3 in\n let ofs =\n match layout with\n C_layout -> 0\n | Fortran_layout -> 1\n in\n for i = 0 to dim1 - 1 do\n let row = data.(i) in\n if Array.length row <> dim2 then\n invalid_arg(\"Bigarray.Array3.of_array: non-cubic data\");\n for j = 0 to dim2 - 1 do\n let col = row.(j) in\n if Array.length col <> dim3 then\n invalid_arg(\"Bigarray.Array3.of_array: non-cubic data\");\n for k = 0 to dim3 - 1 do\n unsafe_set ba (i + ofs) (j + ofs) (k + ofs) col.(k)\n done\n done\n done;\n ba\nend\n\nexternal genarray_of_array0: ('a, 'b, 'c) Array0.t -> ('a, 'b, 'c) Genarray.t\n = \"%identity\"\nexternal genarray_of_array1: ('a, 'b, 'c) Array1.t -> ('a, 'b, 'c) Genarray.t\n = \"%identity\"\nexternal genarray_of_array2: ('a, 'b, 'c) Array2.t -> ('a, 'b, 'c) Genarray.t\n = \"%identity\"\nexternal genarray_of_array3: ('a, 'b, 'c) Array3.t -> ('a, 'b, 'c) Genarray.t\n = \"%identity\"\nlet array0_of_genarray a =\n if Genarray.num_dims a = 0 then a\n else invalid_arg \"Bigarray.array0_of_genarray\"\nlet array1_of_genarray a =\n if Genarray.num_dims a = 1 then a\n else invalid_arg \"Bigarray.array1_of_genarray\"\nlet array2_of_genarray a =\n if Genarray.num_dims a = 2 then a\n else invalid_arg \"Bigarray.array2_of_genarray\"\nlet array3_of_genarray a =\n if Genarray.num_dims a = 3 then a\n else invalid_arg \"Bigarray.array3_of_genarray\"\n\nexternal reshape:\n ('a, 'b, 'c) Genarray.t -> int array -> ('a, 'b, 'c) Genarray.t\n = \"caml_ba_reshape\"\nlet reshape_0 a = reshape a [||]\nlet reshape_1 a dim1 = reshape a [|dim1|]\nlet reshape_2 a dim1 dim2 = reshape a [|dim1;dim2|]\nlet reshape_3 a dim1 dim2 dim3 = reshape a [|dim1;dim2;dim3|]\n\n(* Force caml_ba_get_{1,2,3,N} to be linked in, since we don't refer\n to those primitives directly in this file *)\n\nlet _ =\n let _ = Genarray.get in\n let _ = Array1.get in\n let _ = Array2.get in\n let _ = Array3.get in\n ()\n\n[@@@ocaml.warning \"-32\"]\nexternal get1: unit -> unit = \"caml_ba_get_1\"\nexternal get2: unit -> unit = \"caml_ba_get_2\"\nexternal get3: unit -> unit = \"caml_ba_get_3\"\nexternal set1: unit -> unit = \"caml_ba_set_1\"\nexternal set2: unit -> unit = \"caml_ba_set_2\"\nexternal set3: unit -> unit = \"caml_ba_set_3\"\n"],"names":[],"mappings":"sBCkZiC,mBAA4B,C,EADjC,iBAAuB,C,EAD5B,eAAkB,C,EADvB,aAAc,C,EANR,IAAnB,KAAmB,IAAU,GAC3B,wBAAyC,C,EAJxB,IAAnB,KAAmB,IAAU,GAC3B,wBAAyC,C,EAJxB,IAAnB,KAAmB,IAAU,GAC3B,wBAAyC,C,EAJxB,IAAnB,KAAmB,IAAU,GAC3B,wBAAyC,C,UAnC5C,W,CAAA,yBACA,EAAgD,cAAQ,KAAR,OAAQ,E,CAAA,wBAA5B,GAC5B,IAAgD,iCAAY,KAAZ,OAAY,E,CAAA,wBAAhC,G,EACnB,yBAMT,eALA,QAGsB,EAEtB,MACY,uBACV,KADU,kBACV,E,CAAA,4BACE,yBACF,qBACY,uBACV,KADU,kBACV,E,CAAA,4BACE,yBACF,qBAC8C,O,CAAA,kCAA5C,EAAmD,KAAnD,EAAmD,KAAnD,EAAmD,KAAnD,EAA4C,kB,CAAA,gCAA5C,IAAmD,2EAIzD,OAAE,C,KA3BQ,mBACV,UAjBA,sBACE,0BACE,0BACE,cAAqB,iBAArB,IAA8B,2EAeK,GAVzC,kBACE,kBACE,kBACE,cAAqB,iBAArB,IAA8B,kEAQiB,GAAK,C,EAvBpC,eAA4B,C,EAF1B,iBAA+B,C,OARK,OAAb,OAAb,OAAd,KAApB,OAA+B,mCAAuC,C,EAlBtE,qBAAgD,C,UAtBhD,W,CAAA,yBACA,EAAgD,cAAQ,KAAR,OAAQ,E,CAAA,wBAA5B,G,EACnB,qBAMT,eALA,QAGsB,EAEtB,MACY,uBACV,KADU,kBACV,E,CAAA,4BACE,yBACF,qBACoC,O,CAAA,kCAAlC,EAAyC,KAAzC,EAAyC,KAAzC,EAAkC,kB,CAAA,gCAAlC,IAAyC,kDAG7C,OAAE,C,KArBQ,iBACV,UAbA,sBACE,0BACE,UAAmB,aAAnB,IAA0B,kDAYM,GARpC,kBACE,kBACE,UAAmB,aAAnB,IAA0B,4CAOkB,GAAK,C,OA3BN,OAAb,OAAd,KAApB,OAA+B,2BAA0B,C,EAhBzD,mBAA0C,C,OAbjC,IAAT,S,CAAA,uBAAS,WAAT,EAMA,O,CAAA,oCALA,QAGsB,EAEtB,EAA8D,O,CAAA,kCAAxB,EAAgC,KAAhC,EAAwB,kB,CAAA,gCAAxB,IAAgC,yBACtE,OAAE,C,QAZQ,eACV,UALA,sBAAyB,MAAiB,mBAAjB,IAAsB,yBAMjB,GAJ9B,kBAAoB,MAAiB,mBAAjB,IAAsB,sBAKA,GAAK,C,EAbzC,K,CACS,eACyD,C,EANtC,OAAd,KAApB,OAA+B,eAAY,C,EAd3C,iBAAmC,C,EARnC,EADQ,aACR,WAAO,EACN,C,EARwC,KAAU,Q,kCAPvC,iBAAqB,C,EADrB,aAAqB,C,EADjC,eAAgC,C,sBArBE,OAAyB,SAAU,QAAnC,eAAd,KAApB,OAA+B,eAAuC,C,WAX9D,OACA,QADA,EAER,sBAA6B,WAAT,yCAAoB,yBACxC,OAAC,C,MAZS,WACV,S,CAAA,yBACA,UACc,EAAU,UAAV,WAAsC,GAChC,SAAU,UAAV,WAAgD,GAAK,C,cAVzE,S,EACkB,iCAAS,gBACpB,mCACA,MADc,OACd,OAA8B,yBAHrB,IAAY,iBAAZ,IAAmB,KAI1B,C,WAVT,qCAA+B,IAAY,iBAAZ,IAAmB,E,EAC3B,+BAAS,oBACzB,mCACA,MADc,OACd,OAA8B,+BAC5B,C,EApCT,oCAaa,gDACJ,C,GAmUX,sP","ignoreList":[0]}},{"offset":{"line":0,"column":279209},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/random.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* Xavier Leroy, projet Cambium, College de France and Inria *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Pseudo-random number generator *)\n\nexternal random_seed: unit -> int array = \"caml_sys_random_seed\"\n\nmodule State = struct\n\n open Bigarray\n\n type t = (int64, int64_elt, c_layout) Array1.t\n\n external next: t -> (int64[@unboxed])\n = \"caml_lxm_next\" \"caml_lxm_next_unboxed\" [@@noalloc]\n\n let create () : t =\n Array1.create Int64 C_layout 4\n\n let set s i1 i2 i3 i4 =\n Array1.unsafe_set s 0 (Int64.logor i1 1L); (* must be odd *)\n Array1.unsafe_set s 1 i2;\n Array1.unsafe_set s 2 (if i3 <> 0L then i3 else 1L); (* must not be 0 *)\n Array1.unsafe_set s 3 (if i4 <> 0L then i4 else 2L) (* must not be 0 *)\n\n let mk i1 i2 i3 i4 =\n let s = create () in\n set s i1 i2 i3 i4; s\n\n let serialization_prefix =\n \"lxm1:\"\n (* \"lxm\" denotes the algorithm currently in use, and '1' is\n a version number. We should update this prefix if we change\n the Random algorithm or the serialization format, so that users\n get a clean error instead of believing that they faithfully\n reproduce their previous state and in fact get a different\n stream.\n\n Note that there is no constraint to keep the same\n \":\" format or message size in future versions,\n we could change the format completely if we wanted as long\n as there is no confusion possible with the previous formats. *)\n\n let serialization_prefix_len =\n String.length serialization_prefix\n\n let to_binary_string s =\n let prefix = serialization_prefix in\n let preflen = serialization_prefix_len in\n let buf = Bytes.create (preflen + 4 * 8) in\n Bytes.blit_string prefix 0 buf 0 preflen;\n for i = 0 to 3 do\n Bytes.set_int64_le buf (preflen + i * 8) (Array1.get s i)\n done;\n Bytes.unsafe_to_string buf\n\n let of_binary_string buf =\n let prefix = serialization_prefix in\n let preflen = serialization_prefix_len in\n if String.length buf <> preflen + 4 * 8\n || not (String.starts_with ~prefix buf)\n then\n failwith\n (\"Random.State.of_binary_string: expected a format \\\n compatible with OCaml \" ^ Sys.ocaml_version);\n let i1 = String.get_int64_le buf (preflen + 0 * 8) in\n let i2 = String.get_int64_le buf (preflen + 1 * 8) in\n let i3 = String.get_int64_le buf (preflen + 2 * 8) in\n let i4 = String.get_int64_le buf (preflen + 3 * 8) in\n mk i1 i2 i3 i4\n\n let assign (dst: t) (src: t) =\n Array1.blit src dst\n\n let copy s =\n let s' = create() in assign s' s; s'\n\n (* The seed is an array of integers. It can be just one integer,\n but it can also be 12 or more bytes. To hide the difference,\n we serialize the array as a sequence of bytes, then hash the\n sequence with MD5 (Digest.bytes). MD5 gives only 128 bits while\n we need 256 bits, so we hash twice with different suffixes. *)\n let reinit s seed =\n let n = Array.length seed in\n let b = Bytes.create (n * 8 + 1) in\n for i = 0 to n-1 do\n Bytes.set_int64_le b (i * 8) (Int64.of_int seed.(i))\n done;\n Bytes.set b (n * 8) '\\x01';\n let d1 = Digest.bytes b in\n Bytes.set b (n * 8) '\\x02';\n let d2 = Digest.bytes b in\n set s (String.get_int64_le d1 0)\n (String.get_int64_le d1 8)\n (String.get_int64_le d2 0)\n (String.get_int64_le d2 8)\n\n let make seed =\n let s = create() in reinit s seed; s\n\n let make_self_init () =\n make (random_seed ())\n\n let min_int31 = -0x4000_0000\n (* = -2{^30}, which is [min_int] for 31-bit integers *)\n let max_int31 = 0x3FFF_FFFF\n (* = 2{^30}-1, which is [max_int] for 31-bit integers *)\n (* avoid integer literals for these, 32-bit OCaml would reject them: *)\n let min_int32 = -(1 lsl 31)\n (* = -0x8000_0000 on platforms where [Sys.int_size >= 32] *)\n let max_int32 = (1 lsl 31) - 1\n (* = 0x7FFF_FFFF on platforms where [Sys.int_size >= 32] *)\n\n (* Return 30 random bits as an integer 0 <= x < 2^30 *)\n let bits s =\n Int64.to_int (next s) land max_int31\n\n (* Return an integer between 0 (included) and [n] (excluded).\n [bound] may be any positive [int]. [mask] must be of the form [2{^i}-1]\n and greater or equal to [n]. Larger values of [mask] make the function\n run faster (fewer samples are rejected). Smaller values of [mask]\n are usable on a wider range of OCaml implementations. *)\n let rec int_aux s n mask =\n (* We start by drawing a non-negative integer in the [ [0, mask] ] range *)\n let r = Int64.to_int (next s) land mask in\n let v = r mod n in\n (* For uniform distribution of the result between 0 included and [n]\n * excluded, the random number [r] must have been drawn uniformly in\n * an interval whose length is a multiple of [n]. To achieve this,\n * we use rejection sampling on the greatest interval [ [0, k*n-1] ]\n * that fits in [ [0, mask] ]. That is, we reject the\n * sample if it falls outside of this interval, and draw again.\n * This is what the test below does, while carefuly avoiding\n * overflows and sparing a division [mask / n]. *)\n if r - v > mask - n + 1 then int_aux s n mask else v\n\n (* Return an integer between 0 (included) and [bound] (excluded).\n The bound must fit in 31-bit signed integers.\n This function yields the same output regardless of the integer size. *)\n let int s bound =\n if bound > max_int31 || bound <= 0\n then invalid_arg \"Random.int\"\n else int_aux s bound max_int31\n\n (* Return an integer between 0 (included) and [bound] (excluded).\n [bound] may be any positive [int]. *)\n let full_int s bound =\n if bound <= 0 then\n invalid_arg \"Random.full_int\"\n (* When the bound fits in 31-bit signed integers, we use the same mask\n as in function [int] so as to yield the same output on all platforms\n supported by OCaml (32-bit OCaml, 64-bit OCaml, and JavaScript).\n When the bound fits in 32-bit signed integers, we use [max_int32]\n as the mask so as to yield the same output on all platforms where\n [Sys.int_size >= 32] (i.e. JavaScript and 64-bit OCaml). *)\n else\n int_aux s bound\n (if bound <= max_int31 then max_int31\n else if bound <= max_int32 then max_int32\n else max_int)\n\n (* Return an integer between [min] (included) and [max] (included).\n The [nbits] parameter is the size in bits of the signed integers\n we draw from [s].\n We must have [-2{^nbits - 1} <= min <= max < 2{^nbits - 1}].\n Moreover, for the iteration to converge quickly, the interval\n [[min, max]] should have width at least [2{^nbits - 1}].\n As the width approaches this lower limit, the average number of\n draws approaches 2, with a quite high standard deviation (2 + epsilon). *)\n let rec int_in_large_range s ~min ~max ~nbits =\n let drop = Sys.int_size - nbits in\n (* The bitshifts replicate the [nbits]-th bit (sign bit) to higher bits: *)\n let r = ((Int64.to_int (next s)) lsl drop) asr drop in\n if r < min || r > max then int_in_large_range s ~min ~max ~nbits else r\n\n (* Return an integer between [min] (included) and [max] (included).\n [mask] is as described for [int_aux].\n [nbits] is as described for [int_in_large_range]. *)\n let int_in_range_aux s ~min ~max ~mask ~nbits =\n let span = max - min + 1 in\n if span <= mask (* [span] is small enough *)\n && span > 0 (* no overflow occurred when computing [span] *)\n then\n (* Just draw a number in [[0, span)] and shift it by [min]. *)\n min + int_aux s span mask\n else\n (* Span too large, use the alternative drawing method. *)\n int_in_large_range s ~min ~max ~nbits\n\n (* Return an integer between [min] (included) and [max] (included).\n We must have [min <= max]. *)\n let int_in_range s ~min ~max =\n if min > max then\n invalid_arg \"Random.int_in_range\";\n (* When both bounds fit in 31-bit signed integers, we use parameters\n [mask] and [nbits] appropriate for 31-bit integers, so as to\n yield the same output on all platforms supported by OCaml.\n When both bounds fit in 32-bit signed integers, we use parameters\n [mask] and [nbits] appropriate for 32-bit integers, so as to\n yield the same output on JavaScript and on 64-bit OCaml. *)\n if min >= min_int31 && max <= max_int31 then\n int_in_range_aux s ~min ~max ~mask:max_int31 ~nbits:31\n else if min >= min_int32 && max <= max_int32 then\n int_in_range_aux s ~min ~max ~mask:max_int32 ~nbits:32\n else\n int_in_range_aux s ~min ~max ~mask:max_int ~nbits:Sys.int_size\n\n (* Return 32 random bits as an [int32] *)\n let bits32 s =\n Int64.to_int32 (next s)\n\n (* Return an [int32] between 0 (included) and [bound] (excluded). *)\n let rec int32aux s n =\n let r = Int32.shift_right_logical (bits32 s) 1 in\n let v = Int32.rem r n in\n (* Explanation of this test: see comment in [int_aux]. *)\n if Int32.(sub r v > add (sub max_int n) 1l)\n then int32aux s n\n else v\n\n let int32 s bound =\n if bound <= 0l\n then invalid_arg \"Random.int32\"\n else int32aux s bound\n\n (* Return an [int32] between [min] (included) and [max] (included).\n We must have [min <= max]. *)\n let rec int32_in_range_aux s ~min ~max =\n let r = Int64.to_int32 (next s) in\n if r < min || r > max then int32_in_range_aux s ~min ~max else r\n\n let int32_in_range s ~min ~max =\n if min > max then\n invalid_arg \"Random.int32_in_range\"\n else\n let span = Int32.succ (Int32.sub max min) in\n (* Explanation of this test: see comment in [int_in_range_aux]. *)\n if span <= Int32.zero then\n int32_in_range_aux s ~min ~max\n else\n Int32.add min (int32aux s span)\n\n (* Return 64 random bits as an [int64] *)\n let bits64 s =\n next s\n\n (* Return an [int64] between 0 (included) and [bound] (excluded). *)\n let rec int64aux s n =\n let r = Int64.shift_right_logical (bits64 s) 1 in\n let v = Int64.rem r n in\n (* Explanation of this test: see comment in [int_aux]. *)\n if Int64.(sub r v > add (sub max_int n) 1L)\n then int64aux s n\n else v\n\n let int64 s bound =\n if bound <= 0L\n then invalid_arg \"Random.int64\"\n else int64aux s bound\n\n (* Return an [int64] between [min] (included) and [max] (included).\n We must have [min <= max]. *)\n let rec int64_in_range_aux s ~min ~max =\n let r = next s in\n if r < min || r > max then int64_in_range_aux s ~min ~max else r\n\n let int64_in_range s ~min ~max =\n if min > max then\n invalid_arg \"Random.int64_in_range\"\n else\n let span = Int64.succ (Int64.sub max min) in\n (* Explanation of this test: see comment in [int_in_range_aux]. *)\n if span <= Int64.zero then\n int64_in_range_aux s ~min ~max\n else\n Int64.add min (int64aux s span)\n\n (* Return 32 or 64 random bits as a [nativeint] *)\n let nativebits =\n if Nativeint.size = 32\n then fun s -> Nativeint.of_int32 (bits32 s)\n else fun s -> Int64.to_nativeint (bits64 s)\n\n (* Return a [nativeint] between 0 (included) and [bound] (excluded). *)\n let nativeint =\n if Nativeint.size = 32\n then fun s bound -> Nativeint.of_int32 (int32 s (Nativeint.to_int32 bound))\n else fun s bound -> Int64.to_nativeint (int64 s (Int64.of_nativeint bound))\n\n (* Return a [nativeint] between [min] (included) and [max] (included). *)\n let nativeint_in_range =\n if Nativeint.size = 32\n then fun s ~min ~max ->\n Nativeint.of_int32 (int32_in_range s\n ~min:(Nativeint.to_int32 min) ~max:(Nativeint.to_int32 max))\n else fun s ~min ~max ->\n Int64.to_nativeint (int64_in_range s\n ~min:(Int64.of_nativeint min) ~max:(Int64.of_nativeint max))\n\n (* Return a float 0 < x < 1 uniformly distributed among the\n multiples of 2^-53 *)\n let rec rawfloat s =\n let b = next s in\n let n = Int64.shift_right_logical b 11 in\n if n <> 0L then Int64.to_float n *. 0x1.p-53 else rawfloat s\n\n (* Return a float between 0 and [bound] *)\n let float s bound = rawfloat s *. bound\n\n (* Return a random Boolean *)\n let bool s = next s < 0L\n\n (* Split a new PRNG off the given PRNG *)\n let split s =\n let i1 = bits64 s in let i2 = bits64 s in\n let i3 = bits64 s in let i4 = bits64 s in\n mk i1 i2 i3 i4\nend\n\nlet mk_default () =\n (* This is the state obtained with [State.make [| 314159265 |]]. *)\n State.mk (-6196874289567705097L)\n 586573249833713189L\n (-8591268803865043407L)\n 6388613595849772044L\n\nlet random_key =\n Domain.DLS.new_key ~split_from_parent:State.split mk_default\n\nlet bits () = State.bits (Domain.DLS.get random_key)\nlet int bound = State.int (Domain.DLS.get random_key) bound\nlet full_int bound = State.full_int (Domain.DLS.get random_key) bound\nlet int_in_range ~min ~max =\n State.int_in_range (Domain.DLS.get random_key) ~min ~max\nlet int32 bound = State.int32 (Domain.DLS.get random_key) bound\nlet int32_in_range ~min ~max =\n State.int32_in_range (Domain.DLS.get random_key) ~min ~max\nlet nativeint bound = State.nativeint (Domain.DLS.get random_key) bound\nlet nativeint_in_range ~min ~max =\n State.nativeint_in_range (Domain.DLS.get random_key) ~min ~max\nlet int64 bound = State.int64 (Domain.DLS.get random_key) bound\nlet int64_in_range ~min ~max =\n State.int64_in_range (Domain.DLS.get random_key) ~min ~max\nlet float scale = State.float (Domain.DLS.get random_key) scale\nlet bool () = State.bool (Domain.DLS.get random_key)\nlet bits32 () = State.bits32 (Domain.DLS.get random_key)\nlet bits64 () = State.bits64 (Domain.DLS.get random_key)\nlet nativebits () = State.nativebits (Domain.DLS.get random_key)\n\nlet full_init seed = State.reinit (Domain.DLS.get random_key) seed\nlet init seed = full_init [| seed |]\nlet self_init () = full_init (random_seed())\n\n(* Splitting *)\n\nlet split () = State.split (Domain.DLS.get random_key)\n\n(* Manipulating the current state. *)\n\nlet get_state () = State.copy (Domain.DLS.get random_key)\nlet set_state s = State.assign (Domain.DLS.get random_key) s\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":283681},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/hashtbl.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Hash tables *)\n\n(* We do dynamic hashing, and resize the table and rehash the elements\n when the load factor becomes too high. *)\n\ntype ('a, 'b) t =\n { mutable size: int; (* number of entries *)\n mutable data: ('a, 'b) bucketlist array; (* the buckets *)\n seed: int; (* for randomization *)\n mutable initial_size: int; (* initial array size *)\n }\n\nand ('a, 'b) bucketlist =\n Empty\n | Cons of { mutable key: 'a;\n mutable data: 'b;\n mutable next: ('a, 'b) bucketlist }\n\n(* The sign of initial_size encodes the fact that a traversal is\n ongoing or not.\n\n This disables the efficient in place implementation of resizing.\n*)\n\nlet ongoing_traversal h =\n Obj.size (Obj.repr h) < 4 (* compatibility with old hash tables *)\n || h.initial_size < 0\n\nlet flip_ongoing_traversal h =\n h.initial_size <- - h.initial_size\n\n(* To pick random seeds if requested *)\n\nlet randomized_default =\n let params =\n try Sys.getenv \"OCAMLRUNPARAM\" with Not_found ->\n try Sys.getenv \"CAMLRUNPARAM\" with Not_found -> \"\" in\n String.contains params 'R'\n\nlet randomized = Atomic.make randomized_default\n\nlet randomize () = Atomic.set randomized true\nlet is_randomized () = Atomic.get randomized\n\nlet prng_key = Domain.DLS.new_key Random.State.make_self_init\n\n(* Functions which appear before the functorial interface must either be\n independent of the hash function or take it as a parameter (see #2202 and\n code below the functor definitions. *)\n\n(* Creating a fresh, empty table *)\n\nlet rec power_2_above x n =\n if x >= n then x\n else if x * 2 > Sys.max_array_length then x\n else power_2_above (x * 2) n\n\nlet create ?(random = Atomic.get randomized) initial_size =\n let s = power_2_above 16 initial_size in\n let seed =\n if random then Random.State.bits (Domain.DLS.get prng_key) else 0\n in\n { initial_size = s; size = 0; seed = seed; data = Array.make s Empty }\n\nlet clear h =\n if h.size > 0 then begin\n h.size <- 0;\n Array.fill h.data 0 (Array.length h.data) Empty\n end\n\nlet reset h =\n let len = Array.length h.data in\n if Obj.size (Obj.repr h) < 4 (* compatibility with old hash tables *)\n || len = abs h.initial_size then\n clear h\n else begin\n h.size <- 0;\n h.data <- Array.make (abs h.initial_size) Empty\n end\n\nlet copy_bucketlist = function\n | Empty -> Empty\n | Cons {key; data; next} ->\n let rec loop prec = function\n | Empty -> ()\n | Cons {key; data; next} ->\n let r = Cons {key; data; next} in\n begin match prec with\n | Empty -> assert false\n | Cons prec -> prec.next <- r\n end;\n loop r next\n in\n let r = Cons {key; data; next} in\n loop r next;\n r\n\nlet copy h = { h with data = Array.map copy_bucketlist h.data }\n\nlet length h = h.size\n\nlet insert_all_buckets indexfun inplace odata ndata =\n let nsize = Array.length ndata in\n let ndata_tail = Array.make nsize Empty in\n let rec insert_bucket = function\n | Empty -> ()\n | Cons {key; data; next} as cell ->\n let cell =\n if inplace then cell\n else Cons {key; data; next = Empty}\n in\n let nidx = indexfun key in\n begin match ndata_tail.(nidx) with\n | Empty -> ndata.(nidx) <- cell;\n | Cons tail -> tail.next <- cell;\n end;\n ndata_tail.(nidx) <- cell;\n insert_bucket next\n in\n for i = 0 to Array.length odata - 1 do\n insert_bucket odata.(i)\n done;\n if inplace then\n for i = 0 to nsize - 1 do\n match ndata_tail.(i) with\n | Empty -> ()\n | Cons tail -> tail.next <- Empty\n done\n\nlet resize indexfun h =\n let odata = h.data in\n let osize = Array.length odata in\n let nsize = osize * 2 in\n if nsize < Sys.max_array_length then begin\n let ndata = Array.make nsize Empty in\n let inplace = not (ongoing_traversal h) in\n h.data <- ndata; (* so that indexfun sees the new bucket count *)\n insert_all_buckets (indexfun h) inplace odata ndata\n end\n\nlet iter f h =\n let rec do_bucket = function\n | Empty ->\n ()\n | Cons{key; data; next} ->\n f key data; do_bucket next in\n let old_trav = ongoing_traversal h in\n if not old_trav then flip_ongoing_traversal h;\n try\n let d = h.data in\n for i = 0 to Array.length d - 1 do\n do_bucket d.(i)\n done;\n if not old_trav then flip_ongoing_traversal h;\n with exn when not old_trav ->\n flip_ongoing_traversal h;\n raise exn\n\nlet rec filter_map_inplace_bucket f h i prec = function\n | Empty ->\n begin match prec with\n | Empty -> h.data.(i) <- Empty\n | Cons c -> c.next <- Empty\n end\n | (Cons ({key; data; next} as c)) as slot ->\n begin match f key data with\n | None ->\n h.size <- h.size - 1;\n filter_map_inplace_bucket f h i prec next\n | Some data ->\n begin match prec with\n | Empty -> h.data.(i) <- slot\n | Cons c -> c.next <- slot\n end;\n c.data <- data;\n filter_map_inplace_bucket f h i slot next\n end\n\nlet filter_map_inplace f h =\n let d = h.data in\n let old_trav = ongoing_traversal h in\n if not old_trav then flip_ongoing_traversal h;\n try\n for i = 0 to Array.length d - 1 do\n filter_map_inplace_bucket f h i Empty h.data.(i)\n done;\n if not old_trav then flip_ongoing_traversal h\n with exn when not old_trav ->\n flip_ongoing_traversal h;\n raise exn\n\nlet fold f h init =\n let rec do_bucket b accu =\n match b with\n Empty ->\n accu\n | Cons{key; data; next} ->\n do_bucket next (f key data accu) in\n let old_trav = ongoing_traversal h in\n if not old_trav then flip_ongoing_traversal h;\n try\n let d = h.data in\n let accu = ref init in\n for i = 0 to Array.length d - 1 do\n accu := do_bucket d.(i) !accu\n done;\n if not old_trav then flip_ongoing_traversal h;\n !accu\n with exn when not old_trav ->\n flip_ongoing_traversal h;\n raise exn\n\ntype statistics = {\n num_bindings: int;\n num_buckets: int;\n max_bucket_length: int;\n bucket_histogram: int array\n}\n\nlet rec bucket_length accu = function\n | Empty -> accu\n | Cons{next} -> bucket_length (accu + 1) next\n\nlet stats h =\n let mbl =\n Array.fold_left (fun m b -> Int.max m (bucket_length 0 b)) 0 h.data in\n let histo = Array.make (mbl + 1) 0 in\n Array.iter\n (fun b ->\n let l = bucket_length 0 b in\n histo.(l) <- histo.(l) + 1)\n h.data;\n { num_bindings = h.size;\n num_buckets = Array.length h.data;\n max_bucket_length = mbl;\n bucket_histogram = histo }\n\n(** {1 Iterators} *)\n\nlet to_seq tbl =\n (* capture current array, so that even if the table is resized we\n keep iterating on the same array *)\n let tbl_data = tbl.data in\n (* state: index * next bucket to traverse *)\n let rec aux i buck () = match buck with\n | Empty ->\n if i = Array.length tbl_data\n then Seq.Nil\n else aux(i+1) tbl_data.(i) ()\n | Cons {key; data; next} ->\n Seq.Cons ((key, data), aux i next)\n in\n aux 0 Empty\n\nlet to_seq_keys m = Seq.map fst (to_seq m)\n\nlet to_seq_values m = Seq.map snd (to_seq m)\n\n(* Functorial interface *)\n\nmodule type HashedType =\n sig\n type t\n val equal: t -> t -> bool\n val hash: t -> int\n end\n\nmodule type SeededHashedType =\n sig\n type t\n val equal: t -> t -> bool\n val seeded_hash: int -> t -> int\n end\n\nmodule type S =\n sig\n type key\n type !'a t\n val create: int -> 'a t\n val clear : 'a t -> unit\n val reset : 'a t -> unit\n val copy: 'a t -> 'a t\n val add: 'a t -> key -> 'a -> unit\n val remove: 'a t -> key -> unit\n val find: 'a t -> key -> 'a\n val find_opt: 'a t -> key -> 'a option\n val find_all: 'a t -> key -> 'a list\n val replace : 'a t -> key -> 'a -> unit\n val mem : 'a t -> key -> bool\n val iter: (key -> 'a -> unit) -> 'a t -> unit\n val filter_map_inplace: (key -> 'a -> 'a option) -> 'a t -> unit\n val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b\n val length: 'a t -> int\n val stats: 'a t -> statistics\n val to_seq : 'a t -> (key * 'a) Seq.t\n val to_seq_keys : _ t -> key Seq.t\n val to_seq_values : 'a t -> 'a Seq.t\n val add_seq : 'a t -> (key * 'a) Seq.t -> unit\n val replace_seq : 'a t -> (key * 'a) Seq.t -> unit\n val of_seq : (key * 'a) Seq.t -> 'a t\n end\n\nmodule type SeededS =\n sig\n type key\n type !'a t\n val create : ?random:bool -> int -> 'a t\n val clear : 'a t -> unit\n val reset : 'a t -> unit\n val copy : 'a t -> 'a t\n val add : 'a t -> key -> 'a -> unit\n val remove : 'a t -> key -> unit\n val find : 'a t -> key -> 'a\n val find_opt: 'a t -> key -> 'a option\n val find_all : 'a t -> key -> 'a list\n val replace : 'a t -> key -> 'a -> unit\n val mem : 'a t -> key -> bool\n val iter : (key -> 'a -> unit) -> 'a t -> unit\n val filter_map_inplace: (key -> 'a -> 'a option) -> 'a t -> unit\n val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b\n val length : 'a t -> int\n val stats: 'a t -> statistics\n val to_seq : 'a t -> (key * 'a) Seq.t\n val to_seq_keys : _ t -> key Seq.t\n val to_seq_values : 'a t -> 'a Seq.t\n val add_seq : 'a t -> (key * 'a) Seq.t -> unit\n val replace_seq : 'a t -> (key * 'a) Seq.t -> unit\n val of_seq : (key * 'a) Seq.t -> 'a t\n end\n\nmodule MakeSeeded(H: SeededHashedType): (SeededS with type key = H.t) =\n struct\n type key = H.t\n type 'a hashtbl = (key, 'a) t\n type 'a t = 'a hashtbl\n let create = create\n let clear = clear\n let reset = reset\n let copy = copy\n\n let key_index h key =\n (H.seeded_hash h.seed key) land (Array.length h.data - 1)\n\n let add h key data =\n let i = key_index h key in\n let bucket = Cons{key; data; next=h.data.(i)} in\n h.data.(i) <- bucket;\n h.size <- h.size + 1;\n if h.size > Array.length h.data lsl 1 then resize key_index h\n\n let rec remove_bucket h i key prec = function\n | Empty ->\n ()\n | (Cons {key=k; next}) as c ->\n if H.equal k key\n then begin\n h.size <- h.size - 1;\n match prec with\n | Empty -> h.data.(i) <- next\n | Cons c -> c.next <- next\n end\n else remove_bucket h i key c next\n\n let remove h key =\n let i = key_index h key in\n remove_bucket h i key Empty h.data.(i)\n\n let rec find_rec key = function\n | Empty ->\n raise Not_found\n | Cons{key=k; data; next} ->\n if H.equal key k then data else find_rec key next\n\n let find h key =\n match h.data.(key_index h key) with\n | Empty -> raise Not_found\n | Cons{key=k1; data=d1; next=next1} ->\n if H.equal key k1 then d1 else\n match next1 with\n | Empty -> raise Not_found\n | Cons{key=k2; data=d2; next=next2} ->\n if H.equal key k2 then d2 else\n match next2 with\n | Empty -> raise Not_found\n | Cons{key=k3; data=d3; next=next3} ->\n if H.equal key k3 then d3 else find_rec key next3\n\n let rec find_rec_opt key = function\n | Empty ->\n None\n | Cons{key=k; data; next} ->\n if H.equal key k then Some data else find_rec_opt key next\n\n let find_opt h key =\n match h.data.(key_index h key) with\n | Empty -> None\n | Cons{key=k1; data=d1; next=next1} ->\n if H.equal key k1 then Some d1 else\n match next1 with\n | Empty -> None\n | Cons{key=k2; data=d2; next=next2} ->\n if H.equal key k2 then Some d2 else\n match next2 with\n | Empty -> None\n | Cons{key=k3; data=d3; next=next3} ->\n if H.equal key k3 then Some d3 else find_rec_opt key next3\n\n let find_all h key =\n let[@tail_mod_cons] rec find_in_bucket = function\n | Empty ->\n []\n | Cons{key=k; data=d; next} ->\n if H.equal k key\n then d :: find_in_bucket next\n else find_in_bucket next in\n find_in_bucket h.data.(key_index h key)\n\n let rec replace_bucket key data = function\n | Empty ->\n true\n | Cons ({key=k; next} as slot) ->\n if H.equal k key\n then (slot.key <- key; slot.data <- data; false)\n else replace_bucket key data next\n\n let replace h key data =\n let i = key_index h key in\n let l = h.data.(i) in\n if replace_bucket key data l then begin\n h.data.(i) <- Cons{key; data; next=l};\n h.size <- h.size + 1;\n if h.size > Array.length h.data lsl 1 then resize key_index h\n end\n\n let rec mem_in_bucket key = function\n | Empty ->\n false\n | Cons{key=k; next} ->\n H.equal k key || mem_in_bucket key next\n\n let mem h key =\n mem_in_bucket key h.data.(key_index h key)\n\n let add_seq tbl i =\n Seq.iter (fun (k,v) -> add tbl k v) i\n\n let replace_seq tbl i =\n Seq.iter (fun (k,v) -> replace tbl k v) i\n\n let of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n\n let iter = iter\n let filter_map_inplace = filter_map_inplace\n let fold = fold\n let length = length\n let stats = stats\n let to_seq = to_seq\n let to_seq_keys = to_seq_keys\n let to_seq_values = to_seq_values\n end\n\nmodule Make(H: HashedType): (S with type key = H.t) =\n struct\n include MakeSeeded(struct\n type t = H.t\n let equal = H.equal\n let seeded_hash (_seed: int) x = H.hash x\n end)\n let create sz = create ~random:false sz\n let of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n end\n\n(* Polymorphic hash function-based tables *)\n(* Code included below the functorial interface to guard against accidental\n use - see #2202 *)\n\nexternal seeded_hash_param :\n int -> int -> int -> 'a -> int = \"caml_hash\" [@@noalloc]\n\nlet hash x = seeded_hash_param 10 100 0 x\nlet hash_param n1 n2 x = seeded_hash_param n1 n2 0 x\nlet seeded_hash seed x = seeded_hash_param 10 100 seed x\n\nlet key_index h key =\n if Obj.size (Obj.repr h) >= 4\n then (seeded_hash_param 10 100 h.seed key) land (Array.length h.data - 1)\n else invalid_arg \"Hashtbl: unsupported hash table format\"\n\nlet add h key data =\n let i = key_index h key in\n let bucket = Cons{key; data; next=h.data.(i)} in\n h.data.(i) <- bucket;\n h.size <- h.size + 1;\n if h.size > Array.length h.data lsl 1 then resize key_index h\n\nlet rec remove_bucket h i key prec = function\n | Empty ->\n ()\n | (Cons {key=k; next}) as c ->\n if compare k key = 0\n then begin\n h.size <- h.size - 1;\n match prec with\n | Empty -> h.data.(i) <- next\n | Cons c -> c.next <- next\n end\n else remove_bucket h i key c next\n\nlet remove h key =\n let i = key_index h key in\n remove_bucket h i key Empty h.data.(i)\n\nlet rec find_rec key = function\n | Empty ->\n raise Not_found\n | Cons{key=k; data; next} ->\n if compare key k = 0 then data else find_rec key next\n\nlet find h key =\n match h.data.(key_index h key) with\n | Empty -> raise Not_found\n | Cons{key=k1; data=d1; next=next1} ->\n if compare key k1 = 0 then d1 else\n match next1 with\n | Empty -> raise Not_found\n | Cons{key=k2; data=d2; next=next2} ->\n if compare key k2 = 0 then d2 else\n match next2 with\n | Empty -> raise Not_found\n | Cons{key=k3; data=d3; next=next3} ->\n if compare key k3 = 0 then d3 else find_rec key next3\n\nlet rec find_rec_opt key = function\n | Empty ->\n None\n | Cons{key=k; data; next} ->\n if compare key k = 0 then Some data else find_rec_opt key next\n\nlet find_opt h key =\n match h.data.(key_index h key) with\n | Empty -> None\n | Cons{key=k1; data=d1; next=next1} ->\n if compare key k1 = 0 then Some d1 else\n match next1 with\n | Empty -> None\n | Cons{key=k2; data=d2; next=next2} ->\n if compare key k2 = 0 then Some d2 else\n match next2 with\n | Empty -> None\n | Cons{key=k3; data=d3; next=next3} ->\n if compare key k3 = 0 then Some d3 else find_rec_opt key next3\n\nlet find_all h key =\n let[@tail_mod_cons] rec find_in_bucket = function\n | Empty ->\n []\n | Cons{key=k; data; next} ->\n if compare k key = 0\n then data :: find_in_bucket next\n else find_in_bucket next in\n find_in_bucket h.data.(key_index h key)\n\nlet rec replace_bucket key data = function\n | Empty ->\n true\n | Cons ({key=k; next} as slot) ->\n if compare k key = 0\n then (slot.key <- key; slot.data <- data; false)\n else replace_bucket key data next\n\nlet replace h key data =\n let i = key_index h key in\n let l = h.data.(i) in\n if replace_bucket key data l then begin\n h.data.(i) <- Cons{key; data; next=l};\n h.size <- h.size + 1;\n if h.size > Array.length h.data lsl 1 then resize key_index h\n end\n\nlet rec mem_in_bucket key = function\n | Empty ->\n false\n | Cons{key=k; next} ->\n compare k key = 0 || mem_in_bucket key next\n\nlet mem h key =\n mem_in_bucket key h.data.(key_index h key)\n\nlet add_seq tbl i =\n Seq.iter (fun (k,v) -> add tbl k v) i\n\nlet replace_seq tbl i =\n Seq.iter (fun (k,v) -> replace tbl k v) i\n\nlet of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n\nlet rebuild ?(random = Atomic.get randomized) h =\n let s = power_2_above 16 (Array.length h.data) in\n let seed =\n if random then Random.State.bits (Domain.DLS.get prng_key)\n else if Obj.size (Obj.repr h) >= 4 then h.seed\n else 0 in\n let h' = {\n size = h.size;\n data = Array.make s Empty;\n seed = seed;\n initial_size = if Obj.size (Obj.repr h) >= 4 then h.initial_size else s\n } in\n insert_all_buckets (key_index h') false h.data h'.data;\n h'\n","(* generated code *)"],"names":[],"mappings":"KA4CE,+BAAkC,C,IAJlC,qC,GAAA,mBACqB,C,ECzCvB,W,EDwnBqB,mB,YAZT,kBAAW,4BAAqB,W,EAClC,IAAR,iB,CAAA,uBAAQ,OACR,UAEO,S,CAAA,6BAAmC,WACnC,MAF4B,MAAlB,gBAAkB,aAAyB,gBAA3C,c,EAGjB,S,CAAA,6BAIoD,c,EAF3C,UAIU,GAJQ,oB,CAAA,QAIR,GAAnB,sBAAsD,EACpD,C,EAjBQ,QAAV,MAAU,UACV,UAAiB,EACd,C,KALM,KAAc,IAAd,mBAAc,OAAgB,C,EAAvC,+BAAyC,C,KAHhC,KAAc,IAAd,mBAAc,OAAY,C,EAAnC,+BAAqC,C,WAHX,aAAe,UAAvB,oBAAQ,EAAR,YAAwB,IAPtB,SAEhB,2BAEA,IAAa,G,CAAA,Q,IAAA,GAGyB,C,gBAflC,eACR,UAAQ,oCACL,IAXkB,SAEjB,wBAEG,IACuC,EAArC,SAAkB,SAAmB,GAMlB,IAAM,YAChC,6BADgC,cAChC,GAAqC,wBAErC,c,CAAA,iDAA2C,uBAC1C,C,WAjBoB,aAAe,UAAvB,oBAAQ,EAAR,YAAwB,IAPE,SAErC,oCAEG,IAAa,IACX,kBAAQ,QALwB,SAErC,cAGgC,kCAD7B,IACE,iC,IAAA,GAE8B,C,SArBzB,aAAe,UAAvB,oBAAQ,EAAR,cAAwB,OACnB,6BAEJ,EAFI,OAEJ,EAAc,EACjB,SACW,6BAEJ,EAFI,OAEJ,EAAc,EACjB,SACW,6BAEJ,EAFI,OAEJ,EAAc,EAAU,EAlBpB,SAEf,6BAEG,EAFH,OAEG,EAAuB,c,IAcS,Y,IAJJ,Y,IAJJ,Y,IAND,GAc4C,C,SA/B5D,aAAe,UAAvB,oBAAQ,EAAR,cAAwB,OACnB,iCAEJ,EAFI,OAEJ,EAAc,EACjB,SACW,iCAEJ,EAFI,OAEJ,EAAc,EACjB,SACW,iCAEJ,EAFI,OAEJ,EAAc,EAAU,EAlBxB,SAEX,iCAEG,EAFH,OAEG,EAAuB,M,IAcS,I,IAJJ,I,IAJJ,I,IAND,GAcmC,C,YArBzD,aACR,UAA4B,oBADpB,EAC8B,MAAV,YAAU,IAflB,SAEhB,2BAEG,IAAa,EAKF,WAJT,6BAEH,SACW,yB,EAAA,cAAkB,OACjB,yBAMoB,C,aArB9B,eACR,YAAkC,sBAClC,iCAD4C,QAAV,YAAU,IAC5C,GAAoB,wBAEpB,c,CAAA,iDAA2C,mBAAkB,C,KAT7D,S,CAAA,6BACK,iB,CAAA,iDAAqC,SACrC,wBAAoD,C,EALlC,eAA+B,C,EAD/B,YAA2B,C,EADvC,iBAA4B,C,KAdrB,OAEd,OAFc,SAGd,YAAiB,EACd,C,EAJW,iBAAuB,C,EAFF,iCAAQ,C,MCpejD,gO,MDidgB,QAAV,QAAU,UACV,aAAiB,EACd,C,SALM,QAAc,KAAd,mBAAc,UAAgB,C,EAAvC,2CAAyC,C,SAHhC,QAAc,KAAd,mBAAc,UAAY,C,EAAnC,2CAAqC,C,aAHX,sBAAe,UAAvB,oBAAQ,EAAR,YAAwB,IAPtB,SAEhB,2BAEA,sBAAa,W,IAAA,GAGyB,C,oBAflC,wBACR,UAAQ,oCACL,IAXkB,SAEjB,wBAEG,EAAH,eAAG,GAAa,cACX,YAAkB,SAAmB,IAMlB,IAAM,YAChC,6BADgC,cAChC,GAAqC,wBAErC,c,CAAA,iDAA2C,2BAC1C,C,eAjBoB,sBAAe,UAAvB,oBAAQ,EAAR,YAAwB,IAPE,SAErC,oCAEG,EAAH,eAAG,GAAa,SACX,kBAAK,QAL2B,SAErC,cAG6B,kCAD1B,EAAH,eAAG,GAAa,OACX,+B,IAAA,GAE8B,C,aArBzB,sBAAe,UAAvB,oBAAQ,EAAR,cAAwB,OACnB,6BAEJ,EAFI,OAEP,eAAG,GAAc,OACjB,SACW,6BAEJ,EAFI,OAEP,eAAG,GAAc,OACjB,SACW,6BAEJ,EAFI,OAEP,eAAG,GAAc,SAlBV,SAEf,6BAEG,EAFH,OAEA,eAAG,GAAa,OAAM,Y,IAcS,Y,IAJJ,Y,IAJJ,Y,IAAA,GAQ2C,C,aA/BxD,sBAAe,UAAvB,oBAAQ,EAAR,cAAwB,OACnB,iCAEJ,EAFI,OAEP,eAAG,GAAc,OACjB,SACW,iCAEJ,EAFI,OAEP,eAAG,GAAc,OACjB,SACW,iCAEJ,EAFI,OAEP,eAAG,GAAc,SAlBd,SAEX,iCAEG,EAFH,OAEA,eAAG,GAAa,OAAM,I,IAcS,I,IAJJ,I,IAJJ,I,IAAA,GAQkC,C,gBArBrD,sBACR,UAA4B,oBADpB,EAC8B,MAAV,YAAU,IAflB,SAEhB,2BAEG,EAAH,eAAG,GAAa,cACX,6BAEH,SACW,yB,EAAA,cAAkB,OACjB,yBAMoB,C,iBArB9B,wBACR,YAAkC,sBAClC,iCAD4C,QAAV,YAAU,IAC5C,GAAoB,wBAEpB,c,CAAA,iDAA2C,uBAAkB,C,QAP7D,yB,CAAA,uDAA0B,QAA+B,C,uBCpW/D,oN,KAAA,oC,EAAA,W,ED+Q4C,GAAV,SAAU,Y,KC/Q5C,oC,EAAA,W,ED6Q0C,GAAV,SAAU,Y,EC7Q1C,sB,KDyQ+B,2B,eANL,qBAElB,e,CAAA,4BACK,MACS,+CAAY,c,GAEO,QAFP,mBAEO,IAAV,OAFG,OAEH,GAAU,SAAC,C,EAExC,GAVA,UAEA,GAQA,GAAW,C,QAvBP,OAAQ,WACK,wBADb,EACA,gBAAa,mBAAS,QAAtB,KAA0B,U,EAL6B,EAAnB,SAAmB,sB,WAE3D,GAFE,OADF,oBACE,eACF,QAAY,UACZ,gCAIQ,yB,CAAA,iCAIoB,C,EAhBR,aACT,GACK,WADL,UACK,MAA6B,C,KA5B3C,aAEI,+BAEe,aAAiB,K,cALtC,OAMe,OACf,GAAqB,OACrB,SAGE,KAHF,YAGE,E,CAAA,sCACoB,uCAAV,SAAqB,yBAE/B,KAAqB,OACrB,S,AAAA,I,AAAA,G,EAAA,KACY,SACZ,MAAwB,K,CACf,C,UA/BX,cACe,OACf,GAAqB,OACrB,kB,CAAA,sCAEI,UAAsC,qBAAtC,YAAsC,gBAAtC,GAAgD,yBAElD,OAAqB,KAAwB,c,AAAA,I,AAAA,G,EAAA,KACjC,SACZ,MAAwB,K,CACf,C,WA/BqB,aAE5B,SACW,sB,EAAA,gBAAmB,GAClB,6CAGA,OAAU,OAElB,0BACA,O,EAAA,YAEA,SACW,uCACC,aAEZ,cACA,iBACD,C,KAnCa,WAEd,+BAEA,UAAU,I,CAAgB,C,cAJhC,OAKe,OACf,GAAqB,OACrB,SAEE,KAFF,YAEE,E,CAAA,sCACY,uCAAV,KAAe,yBAEjB,OAAqB,KAAwB,c,AAAA,I,AAAA,G,EAAA,KACjC,SACZ,MAAwB,K,CACf,C,UAzBX,KADA,S,CACA,uBACA,KACA,MADA,QACA,UACc,YACM,KAAqB,GACvC,SACmB,YAAY,M,CAAA,SAC9B,C,YAlCqB,WACX,E,EAAA,cAEP,eAEO,MAJA,OAIA,Y,EAJA,SAMI,wBACC,iDAAiB,OAClB,6CACI,aAEf,4CAAyB,QACP,C,eAfxB,gCACiB,UADjB,EAiBA,2CAfA,cAeA,EACgB,uCAAd,KAAuB,yBAEzB,cACE,qBACQ,yCAAc,K,CAAA,EAEL,gDACb,C,QA9BK,uBAAgB,GAAhB,eAAgB,eAAgC,qBAAE,C,KAjBzC,UACT,KAYP,IAZO,4BAYP,MACA,KAXa,UAWF,GALW,IAHhB,IAQK,4BARL,MAGgB,QAMrB,C,UAxBL,iB,CAAA,yBACA,S,CAAA,4BAC6B,IAD7B,mBACW,aAAkB,C,CAAA,EAExB,WAEH,cAAqB,aAAX,QAAqC,gBAH/C,SAIC,C,SAbH,yBAAmB,WAEjB,yB,CAAA,wDACC,C,OAXM,kBAAW,4BAAqB,W,EACjC,WACR,UACkE,KAA/B,MAAlB,gBAAkB,aAAyB,gBAA3C,c,EAEmD,QAAlB,QAAkB,QAAE,C,EATtE,kBAAe,GACV,2BAAqC,GACrC,gBAAuB,C,EAbP,8BAAqB,C,EADzB,kCAA0B,C,mBAFE,GCtD/C,UDkDQ,KAA0B,I,AAAA,I,AAAA,G,EAAA,GClDlC,a,CAAA,kB,CAAA,6BDmDQ,KAAyB,I,AAAA,I,AAAA,G,EAAA,GCnDjC,a,CAAA,kB,CAAA,yB,CAAA,O,CAAA,IDoDE,e,CAAA,WAA0B,QAEX,E,CAAA,a,CAA8B,U,CAAA,KAKc,W,CAA9C,IALgC,gCAKhC,KAA8C,uE,CAAA,mE,QC3D7D,4D,QAAA,6E,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":293946},"map":{"version":3,"sources":["/builtin/blackbox.ml","/root/.opam/5.2.0/lib/ocaml/weak.ml"],"sourcesContent":["(* generated code *)","(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1997 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(** Weak array operations *)\n\ntype !'a t\n\nexternal create : int -> 'a t = \"caml_weak_create\"\n\n(** number of additional values in a weak pointer\n * - Link\n * - Data *)\nlet additional_values = 2 (* CAML_EPHE_FIRST_KEY in weak.h *)\n\nlet create l =\n if not (0 <= l && l <= Obj.Ephemeron.max_ephe_length) then\n invalid_arg(\"Weak.create\");\n create l\n\n\nlet length x = Obj.size(Obj.repr x) - additional_values\n\nlet raise_if_invalid_offset e o msg =\n if not (0 <= o && o < length e) then\n invalid_arg(msg)\n\nexternal set' : 'a t -> int -> 'a -> unit = \"caml_ephe_set_key\"\nexternal unset : 'a t -> int -> unit = \"caml_ephe_unset_key\"\nlet set e o x =\n raise_if_invalid_offset e o \"Weak.set\";\n match x with\n | None -> unset e o\n | Some x -> set' e o x\n\nexternal get : 'a t -> int -> 'a option = \"caml_weak_get\"\nlet get e o =\n raise_if_invalid_offset e o \"Weak.get\";\n get e o\n\nexternal get_copy : 'a t -> int -> 'a option = \"caml_weak_get_copy\"\nlet get_copy e o =\n raise_if_invalid_offset e o \"Weak.get_copy\";\n get_copy e o\n\nexternal check : 'a t -> int -> bool = \"caml_weak_check\"\nlet check e o =\n raise_if_invalid_offset e o \"Weak.check\";\n check e o\n\nexternal blit : 'a t -> int -> 'a t -> int -> int -> unit = \"caml_weak_blit\"\n\n(* blit: src srcoff dst dstoff len *)\nlet blit e1 o1 e2 o2 l =\n if l < 0 || o1 < 0 || o1 > length e1 - l\n || o2 < 0 || o2 > length e2 - l\n then invalid_arg \"Weak.blit\"\n else if l <> 0 then blit e1 o1 e2 o2 l\n\nlet fill ar ofs len x =\n if ofs < 0 || len < 0 || ofs > length ar - len\n then raise (Invalid_argument \"Weak.fill\")\n else begin\n for i = ofs to (ofs + len - 1) do\n set ar i x\n done\n end\n\n\n(** Weak hash tables *)\n\nmodule type S = sig\n type data\n type t\n val create : int -> t\n val clear : t -> unit\n val merge : t -> data -> data\n val add : t -> data -> unit\n val remove : t -> data -> unit\n val find : t -> data -> data\n val find_opt : t -> data -> data option\n val find_all : t -> data -> data list\n val mem : t -> data -> bool\n val iter : (data -> unit) -> t -> unit\n val fold : (data -> 'acc -> 'acc) -> t -> 'acc -> 'acc\n val count : t -> int\n val stats : t -> int * int * int * int * int * int\nend\n\nmodule Make (H : Hashtbl.HashedType) : (S with type data = H.t) = struct\n\n type 'a weak_t = 'a t\n let weak_create = create\n let emptybucket = weak_create 0\n\n type data = H.t\n\n type t = {\n mutable table : data weak_t array;\n mutable hashes : int array array;\n mutable limit : int; (* bucket size limit *)\n mutable oversize : int; (* number of oversize buckets *)\n mutable rover : int; (* for internal bookkeeping *)\n }\n\n let get_index t h = (h land max_int) mod (Array.length t.table)\n\n let limit = 7\n let over_limit = 2\n\n let create sz =\n let sz = if sz < 7 then 7 else sz in\n let sz = if sz > Sys.max_array_length then Sys.max_array_length else sz in\n {\n table = Array.make sz emptybucket;\n hashes = Array.make sz [| |];\n limit = limit;\n oversize = 0;\n rover = 0;\n }\n\n let clear t =\n for i = 0 to Array.length t.table - 1 do\n t.table.(i) <- emptybucket;\n t.hashes.(i) <- [| |];\n done;\n t.limit <- limit;\n t.oversize <- 0\n\n\n let fold f t init =\n let rec fold_bucket i b accu =\n if i >= length b then accu else\n match get b i with\n | Some v -> fold_bucket (i+1) b (f v accu)\n | None -> fold_bucket (i+1) b accu\n in\n Array.fold_right (fold_bucket 0) t.table init\n\n\n let iter f t =\n let rec iter_bucket i b =\n if i >= length b then () else\n match get b i with\n | Some v -> f v; iter_bucket (i+1) b\n | None -> iter_bucket (i+1) b\n in\n Array.iter (iter_bucket 0) t.table\n\n\n let iter_weak f t =\n let rec iter_bucket i j b =\n if i >= length b then () else\n match check b i with\n | true -> f b t.hashes.(j) i; iter_bucket (i+1) j b\n | false -> iter_bucket (i+1) j b\n in\n Array.iteri (iter_bucket 0) t.table\n\n\n let rec count_bucket i b accu =\n if i >= length b then accu else\n count_bucket (i+1) b (accu + (if check b i then 1 else 0))\n\n\n let count t =\n Array.fold_right (count_bucket 0) t.table 0\n\n\n let next_sz n = Int.min (3 * n / 2 + 3) Sys.max_array_length\n let prev_sz n = ((n - 3) * 2 + 2) / 3\n\n let test_shrink_bucket t =\n let bucket = t.table.(t.rover) in\n let hbucket = t.hashes.(t.rover) in\n let len = length bucket in\n let prev_len = prev_sz len in\n let live = count_bucket 0 bucket 0 in\n if live <= prev_len then begin\n let rec loop i j =\n if j >= prev_len then begin\n if check bucket i then loop (i + 1) j\n else if check bucket j then begin\n blit bucket j bucket i 1;\n hbucket.(i) <- hbucket.(j);\n loop (i + 1) (j - 1);\n end else loop i (j - 1);\n end;\n in\n loop 0 (length bucket - 1);\n if prev_len = 0 then begin\n t.table.(t.rover) <- emptybucket;\n t.hashes.(t.rover) <- [| |];\n end else begin\n let newbucket = weak_create prev_len in\n blit bucket 0 newbucket 0 prev_len;\n t.table.(t.rover) <- newbucket;\n t.hashes.(t.rover) <- Array.sub hbucket 0 prev_len\n end;\n if len > t.limit && prev_len <= t.limit then t.oversize <- t.oversize - 1;\n end;\n t.rover <- (t.rover + 1) mod (Array.length t.table)\n\n\n let rec resize t =\n let oldlen = Array.length t.table in\n let newlen = next_sz oldlen in\n if newlen > oldlen then begin\n let newt = create newlen in\n let add_weak ob oh oi =\n let setter nb ni _ = blit ob oi nb ni 1 in\n let h = oh.(oi) in\n add_aux newt setter None h (get_index newt h);\n in\n iter_weak add_weak t;\n t.table <- newt.table;\n t.hashes <- newt.hashes;\n t.limit <- newt.limit;\n t.oversize <- newt.oversize;\n t.rover <- t.rover mod Array.length newt.table;\n end else begin\n t.limit <- max_int; (* maximum size already reached *)\n t.oversize <- 0;\n end\n\n and add_aux t setter d h index =\n let bucket = t.table.(index) in\n let hashes = t.hashes.(index) in\n let sz = length bucket in\n let rec loop i =\n if i >= sz then begin\n let newsz =\n Int.min (3 * sz / 2 + 3) (Sys.max_array_length - additional_values)\n in\n if newsz <= sz then failwith \"Weak.Make: hash bucket cannot grow more\";\n let newbucket = weak_create newsz in\n let newhashes = Array.make newsz 0 in\n blit bucket 0 newbucket 0 sz;\n Array.blit hashes 0 newhashes 0 sz;\n setter newbucket sz d;\n newhashes.(sz) <- h;\n t.table.(index) <- newbucket;\n t.hashes.(index) <- newhashes;\n if sz <= t.limit && newsz > t.limit then begin\n t.oversize <- t.oversize + 1;\n for _i = 0 to over_limit do test_shrink_bucket t done;\n end;\n if t.oversize > Array.length t.table / over_limit then resize t;\n end else if check bucket i then begin\n loop (i + 1)\n end else begin\n setter bucket i d;\n hashes.(i) <- h;\n end;\n in\n loop 0\n\n\n let add t d =\n let h = H.hash d in\n add_aux t set (Some d) h (get_index t h)\n\n (* General auxiliary function for searching for a particular value\n * in a hash-set, and acting according to whether or not it's found *)\n\n let find_aux t d found notfound =\n let h = H.hash d in\n let index = get_index t h in\n let bucket = t.table.(index) in\n let hashes = t.hashes.(index) in\n let sz = length bucket in\n let rec loop i =\n if i >= sz then notfound h index\n else if h = hashes.(i) then begin\n match get bucket i with\n | Some v as opt when H.equal v d -> found bucket i opt v\n | _ -> loop (i + 1)\n end else loop (i + 1)\n in\n loop 0\n\n let find_opt t d = find_aux t d (fun _b _i o _v -> o)\n (fun _h _i -> None)\n\n let merge t d = find_aux t d (fun _b _i _o v -> v)\n (fun h i ->\n add_aux t set (Some d) h i; d)\n\n let find t d = find_aux t d (fun _b _i _o v -> v)\n (fun _h _i -> raise Not_found)\n\n let remove t d = find_aux t d (fun b i _o _v -> set b i None)\n (fun _h _i -> ())\n\n let mem t d = find_aux t d (fun _b _i _o _v -> true)\n (fun _h _i -> false)\n\n let find_all t d =\n let h = H.hash d in\n let index = get_index t h in\n let bucket = t.table.(index) in\n let hashes = t.hashes.(index) in\n let sz = length bucket in\n let rec loop i accu =\n if i >= sz then accu\n else if h = hashes.(i) then begin\n match get bucket i with\n | Some v when H.equal v d -> loop (i + 1) (v :: accu)\n | _ -> loop (i + 1) accu\n end else loop (i + 1) accu\n in\n loop 0 []\n\n let stats t =\n let len = Array.length t.table in\n let lens = Array.map length t.table in\n Array.sort compare lens;\n let totlen = Array.fold_left ( + ) 0 lens in\n (len, count t, totlen, lens.(0), lens.(len/2), lens.(len-1))\n\n\nend\n"],"names":[],"mappings":"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","ignoreList":[0]}},{"offset":{"line":0,"column":300340},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/format.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Pierre Weis, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* A pretty-printing facility and definition of formatters for 'parallel'\n (i.e. unrelated or independent) pretty-printing on multiple out channels. *)\n\n(*\n The pretty-printing engine internal data structures.\n*)\n\nlet id x = x\n\n(* A devoted type for sizes to avoid confusion\n between sizes and mere integers. *)\nmodule Size : sig\n type t\n\n val to_int : t -> int\n val of_int : int -> t\n val zero : t\n val unknown : t\n val is_known : t -> bool\nend = struct\n type t = int\n\n let to_int = id\n let of_int = id\n let zero = 0\n let unknown = -1\n let is_known n = n >= 0\nend\n\n\n\n(* The pretty-printing boxes definition:\n a pretty-printing box is either\n - hbox: horizontal box (no line splitting)\n - vbox: vertical box (every break hint splits the line)\n - hvbox: horizontal/vertical box\n (the box behaves as an horizontal box if it fits on\n the current line, otherwise the box behaves as a vertical box)\n - hovbox: horizontal or vertical compacting box\n (the box is compacting material, printing as much material as possible\n on every lines)\n - box: horizontal or vertical compacting box with enhanced box structure\n (the box behaves as an horizontal or vertical box but break hints split\n the line if splitting would move to the left)\n*)\ntype box_type = CamlinternalFormatBasics.block_type =\n | Pp_hbox | Pp_vbox | Pp_hvbox | Pp_hovbox | Pp_box | Pp_fits\n\n\n(* The pretty-printing tokens definition:\n are either text to print or pretty printing\n elements that drive indentation and line splitting. *)\ntype pp_token =\n | Pp_text of string (* normal text *)\n | Pp_break of { (* complete break *)\n fits: string * int * string; (* line is not split *)\n breaks: string * int * string; (* line is split *)\n }\n | Pp_tbreak of int * int (* go to next tabulation *)\n | Pp_stab (* set a tabulation *)\n | Pp_begin of int * box_type (* beginning of a box *)\n | Pp_end (* end of a box *)\n | Pp_tbegin of tbox (* beginning of a tabulation box *)\n | Pp_tend (* end of a tabulation box *)\n | Pp_newline (* to force a newline inside a box *)\n | Pp_if_newline (* to do something only if this very\n line has been broken *)\n | Pp_open_tag of stag (* opening a tag name *)\n | Pp_close_tag (* closing the most recently open tag *)\n\nand stag = ..\n\nand tbox = Pp_tbox of int list ref (* Tabulation box *)\n\ntype tag = string\ntype stag += String_tag of tag\n\n\n(* The pretty-printer queue:\n pretty-printing material is not written in the output as soon as emitted;\n instead, the material is simply recorded in the pretty-printer queue,\n until the enclosing box has a known computed size and proper splitting\n decisions can be made.\n\n The pretty-printer queue contains formatting elements to be printed.\n Each formatting element is a tuple (size, token, length), where\n - length is the declared length of the token,\n - size is effective size of the token when it is printed\n (size is set when the size of the box is known, so that size of break\n hints are definitive). *)\ntype pp_queue_elem = {\n mutable size : Size.t;\n token : pp_token;\n length : int;\n}\n\n\n(* The pretty-printer queue definition. *)\ntype pp_queue = pp_queue_elem Queue.t\n\n(* The pretty-printer scanning stack. *)\n\n(* The pretty-printer scanning stack: scanning element definition. *)\ntype pp_scan_elem = {\n left_total : int; (* Value of pp_left_total when the element was enqueued. *)\n queue_elem : pp_queue_elem\n}\n\n(* The pretty-printer formatting stack:\n the formatting stack contains the description of all the currently active\n boxes; the pretty-printer formatting stack is used to split the lines\n while printing tokens. *)\n\n(* The pretty-printer formatting stack: formatting stack element definition.\n Each stack element describes a pretty-printing box. *)\ntype pp_format_elem = { box_type : box_type; width : int }\n\n(* The formatter definition.\n Each formatter value is a pretty-printer instance with all its\n machinery. *)\ntype formatter = {\n (* The pretty-printer scanning stack. *)\n pp_scan_stack : pp_scan_elem Stack.t;\n (* The pretty-printer formatting stack. *)\n pp_format_stack : pp_format_elem Stack.t;\n pp_tbox_stack : tbox Stack.t;\n (* The pretty-printer semantics tag stack. *)\n pp_tag_stack : stag Stack.t;\n pp_mark_stack : stag Stack.t;\n (* Value of right margin. *)\n mutable pp_margin : int;\n (* Minimal space left before margin, when opening a box. *)\n mutable pp_min_space_left : int;\n (* Maximum value of indentation:\n no box can be opened further. *)\n mutable pp_max_indent : int;\n (* Space remaining on the current line. *)\n mutable pp_space_left : int;\n (* Current value of indentation. *)\n mutable pp_current_indent : int;\n (* True when the line has been broken by the pretty-printer. *)\n mutable pp_is_new_line : bool;\n (* Total width of tokens already printed. *)\n mutable pp_left_total : int;\n (* Total width of tokens ever put in queue. *)\n mutable pp_right_total : int;\n (* Current number of open boxes. *)\n mutable pp_curr_depth : int;\n (* Maximum number of boxes which can be simultaneously open. *)\n mutable pp_max_boxes : int;\n (* Ellipsis string. *)\n mutable pp_ellipsis : string;\n (* Output function. *)\n mutable pp_out_string : string -> int -> int -> unit;\n (* Flushing function. *)\n mutable pp_out_flush : unit -> unit;\n (* Output of new lines. *)\n mutable pp_out_newline : unit -> unit;\n (* Output of break hints spaces. *)\n mutable pp_out_spaces : int -> unit;\n (* Output of indentation of new lines. *)\n mutable pp_out_indent : int -> unit;\n (* Are tags printed ? *)\n mutable pp_print_tags : bool;\n (* Are tags marked ? *)\n mutable pp_mark_tags : bool;\n (* Find opening and closing markers of tags. *)\n mutable pp_mark_open_tag : stag -> string;\n mutable pp_mark_close_tag : stag -> string;\n mutable pp_print_open_tag : stag -> unit;\n mutable pp_print_close_tag : stag -> unit;\n (* The pretty-printer queue. *)\n pp_queue : pp_queue;\n}\n\n\n(* The formatter specific tag handling functions. *)\ntype formatter_stag_functions = {\n mark_open_stag : stag -> string;\n mark_close_stag : stag -> string;\n print_open_stag : stag -> unit;\n print_close_stag : stag -> unit;\n}\n\n\n(* The formatter functions to output material. *)\ntype formatter_out_functions = {\n out_string : string -> int -> int -> unit;\n out_flush : unit -> unit;\n out_newline : unit -> unit;\n out_spaces : int -> unit;\n out_indent : int -> unit;\n}\n\n\n(*\n\n Auxiliaries and basic functions.\n\n*)\n\n(* Enter a token in the pretty-printer queue. *)\nlet pp_enqueue state token =\n state.pp_right_total <- state.pp_right_total + token.length;\n Queue.add token state.pp_queue\n\n\nlet pp_clear_queue state =\n state.pp_left_total <- 1; state.pp_right_total <- 1;\n Queue.clear state.pp_queue\n\n\n(* Pp_infinity: large value for default tokens size.\n\n Pp_infinity is documented as being greater than 1e10; to avoid\n confusion about the word 'greater', we choose pp_infinity greater\n than 1e10 + 1; for correct handling of tests in the algorithm,\n pp_infinity must be even one more than 1e10 + 1; let's stand on the\n safe side by choosing 1.e10+10.\n\n Pp_infinity could probably be 1073741823 that is 2^30 - 1, that is\n the minimal upper bound for integers; now that max_int is defined,\n this limit could also be defined as max_int - 1.\n\n However, before setting pp_infinity to something around max_int, we\n must carefully double-check all the integer arithmetic operations\n that involve pp_infinity, since any overflow would wreck havoc the\n pretty-printing algorithm's invariants. Given that this arithmetic\n correctness check is difficult and error prone and given that 1e10\n + 1 is in practice large enough, there is no need to attempt to set\n pp_infinity to the theoretically maximum limit. It is not worth the\n burden ! *)\nlet pp_infinity = 1000000010\n\n(* Output functions for the formatter. *)\nlet pp_output_string state s = state.pp_out_string s 0 (String.length s)\nand pp_output_newline state = state.pp_out_newline ()\nand pp_output_spaces state n = state.pp_out_spaces n\nand pp_output_indent state n = state.pp_out_indent n\n\n(* Format a textual token *)\nlet format_pp_text state size text =\n state.pp_space_left <- state.pp_space_left - size;\n pp_output_string state text;\n state.pp_is_new_line <- false\n\n(* Format a string by its length, if not empty *)\nlet format_string state s =\n if s <> \"\" then format_pp_text state (String.length s) s\n\n(* To format a break, indenting a new line. *)\nlet break_new_line state (before, offset, after) width =\n format_string state before;\n pp_output_newline state;\n state.pp_is_new_line <- true;\n let indent = state.pp_margin - width + offset in\n (* Don't indent more than pp_max_indent. *)\n let real_indent = Int.min state.pp_max_indent indent in\n state.pp_current_indent <- real_indent;\n state.pp_space_left <- state.pp_margin - state.pp_current_indent;\n pp_output_indent state state.pp_current_indent;\n format_string state after\n\n\n(* To force a line break inside a box: no offset is added. *)\nlet break_line state width = break_new_line state (\"\", 0, \"\") width\n\n(* To format a break that fits on the current line. *)\nlet break_same_line state (before, width, after) =\n format_string state before;\n state.pp_space_left <- state.pp_space_left - width;\n pp_output_spaces state width;\n format_string state after\n\n\n(* To indent no more than pp_max_indent, if one tries to open a box\n beyond pp_max_indent, then the box is rejected on the left\n by simulating a break. *)\nlet pp_force_break_line state =\n match Stack.top_opt state.pp_format_stack with\n | None -> pp_output_newline state\n | Some { box_type; width } ->\n if width > state.pp_space_left then\n match box_type with\n | Pp_fits | Pp_hbox -> ()\n | Pp_vbox | Pp_hvbox | Pp_hovbox | Pp_box -> break_line state width\n\n\n(* To skip a token, if the previous line has been broken. *)\nlet pp_skip_token state =\n match Queue.take_opt state.pp_queue with\n | None -> () (* print_if_newline must have been the last printing command *)\n | Some { size; length; _ } ->\n state.pp_left_total <- state.pp_left_total - length;\n state.pp_space_left <- state.pp_space_left + Size.to_int size\n\n\n(*\n\n The main pretty printing functions.\n\n*)\n\n(* Formatting a token with a given size. *)\nlet format_pp_token state size = function\n\n | Pp_text s ->\n format_pp_text state size s\n\n | Pp_begin (off, ty) ->\n let insertion_point = state.pp_margin - state.pp_space_left in\n if insertion_point > state.pp_max_indent then\n (* can not open a box right there. *)\n begin pp_force_break_line state end;\n let width = state.pp_space_left - off in\n let box_type =\n match ty with\n | Pp_vbox -> Pp_vbox\n | Pp_hbox | Pp_hvbox | Pp_hovbox | Pp_box | Pp_fits ->\n if size > state.pp_space_left then ty else Pp_fits in\n Stack.push { box_type; width } state.pp_format_stack\n\n | Pp_end ->\n Stack.pop_opt state.pp_format_stack |> ignore\n\n | Pp_tbegin (Pp_tbox _ as tbox) ->\n Stack.push tbox state.pp_tbox_stack\n\n | Pp_tend ->\n Stack.pop_opt state.pp_tbox_stack |> ignore\n\n | Pp_stab ->\n begin match Stack.top_opt state.pp_tbox_stack with\n | None -> () (* No open tabulation box. *)\n | Some (Pp_tbox tabs) ->\n let rec add_tab n = function\n | [] -> [n]\n | x :: l as ls -> if n < x then n :: ls else x :: add_tab n l in\n tabs := add_tab (state.pp_margin - state.pp_space_left) !tabs\n end\n\n | Pp_tbreak (n, off) ->\n let insertion_point = state.pp_margin - state.pp_space_left in\n begin match Stack.top_opt state.pp_tbox_stack with\n | None -> () (* No open tabulation box. *)\n | Some (Pp_tbox tabs) ->\n let tab =\n match !tabs with\n | [] -> insertion_point\n | first :: _ ->\n let rec find = function\n | head :: tail ->\n if head >= insertion_point then head else find tail\n | [] -> first in\n find !tabs in\n let offset = tab - insertion_point in\n if offset >= 0\n then break_same_line state (\"\", offset + n, \"\")\n else break_new_line state (\"\", tab + off, \"\") state.pp_margin\n end\n\n | Pp_newline ->\n begin match Stack.top_opt state.pp_format_stack with\n | None -> pp_output_newline state (* No open box. *)\n | Some { width; _} -> break_line state width\n end\n\n | Pp_if_newline ->\n if state.pp_current_indent != state.pp_margin - state.pp_space_left\n then pp_skip_token state\n\n | Pp_break { fits; breaks } ->\n let before, off, _ = breaks in\n begin match Stack.top_opt state.pp_format_stack with\n | None -> () (* No open box. *)\n | Some { box_type; width } ->\n begin match box_type with\n | Pp_hovbox ->\n if size + String.length before > state.pp_space_left\n then break_new_line state breaks width\n else break_same_line state fits\n | Pp_box ->\n (* Have the line just been broken here ? *)\n if state.pp_is_new_line then break_same_line state fits else\n if size + String.length before > state.pp_space_left\n then break_new_line state breaks width else\n (* break the line here leads to new indentation ? *)\n if state.pp_current_indent > state.pp_margin - width + off\n then break_new_line state breaks width\n else break_same_line state fits\n | Pp_hvbox -> break_new_line state breaks width\n | Pp_fits -> break_same_line state fits\n | Pp_vbox -> break_new_line state breaks width\n | Pp_hbox -> break_same_line state fits\n end\n end\n\n | Pp_open_tag tag_name ->\n let marker = state.pp_mark_open_tag tag_name in\n pp_output_string state marker;\n Stack.push tag_name state.pp_mark_stack\n\n | Pp_close_tag ->\n begin match Stack.pop_opt state.pp_mark_stack with\n | None -> () (* No more tag to close. *)\n | Some tag_name ->\n let marker = state.pp_mark_close_tag tag_name in\n pp_output_string state marker\n end\n\n\n(* Print if token size is known else printing is delayed.\n Printing is delayed when the text waiting in the queue requires\n more room to format than exists on the current line. *)\nlet rec advance_left state =\n match Queue.peek_opt state.pp_queue with\n | None -> () (* No tokens to print *)\n | Some { size; token; length } ->\n let pending_count = state.pp_right_total - state.pp_left_total in\n if Size.is_known size || pending_count >= state.pp_space_left then begin\n Queue.take state.pp_queue |> ignore; (* Not empty: we peek into it *)\n let size = if Size.is_known size then Size.to_int size else pp_infinity in\n format_pp_token state size token;\n state.pp_left_total <- length + state.pp_left_total;\n (advance_left [@tailcall]) state\n end\n\n\n(* To enqueue a token : try to advance. *)\nlet enqueue_advance state tok = pp_enqueue state tok; advance_left state\n\n\n(* To enqueue strings. *)\nlet enqueue_string_as state size s =\n enqueue_advance state { size; token = Pp_text s; length = Size.to_int size }\n\n\nlet enqueue_string state s =\n enqueue_string_as state (Size.of_int (String.length s)) s\n\n\n(* Routines for scan stack\n determine size of boxes. *)\n\n(* The scan_stack is never empty. *)\nlet initialize_scan_stack stack =\n Stack.clear stack;\n let queue_elem = { size = Size.unknown; token = Pp_text \"\"; length = 0 } in\n Stack.push { left_total = -1; queue_elem } stack\n\n(* Setting the size of boxes on scan stack:\n if ty = true then size of break is set else size of box is set;\n in each case pp_scan_stack is popped.\n\n Note:\n Pattern matching on scan stack is exhaustive, since scan_stack is never\n empty.\n Pattern matching on token in scan stack is also exhaustive,\n since scan_push is used on breaks and opening of boxes. *)\nlet set_size state ty =\n match Stack.top_opt state.pp_scan_stack with\n | None -> () (* scan_stack is never empty. *)\n | Some { left_total; queue_elem } ->\n let size = Size.to_int queue_elem.size in\n (* test if scan stack contains any data that is not obsolete. *)\n if left_total < state.pp_left_total then\n initialize_scan_stack state.pp_scan_stack\n else\n match queue_elem.token with\n | Pp_break _ | Pp_tbreak (_, _) ->\n if ty then begin\n queue_elem.size <- Size.of_int (state.pp_right_total + size);\n Stack.pop_opt state.pp_scan_stack |> ignore\n end\n | Pp_begin (_, _) ->\n if not ty then begin\n queue_elem.size <- Size.of_int (state.pp_right_total + size);\n Stack.pop_opt state.pp_scan_stack |> ignore\n end\n | Pp_text _ | Pp_stab | Pp_tbegin _ | Pp_tend | Pp_end\n | Pp_newline | Pp_if_newline | Pp_open_tag _ | Pp_close_tag ->\n () (* scan_push is only used for breaks and boxes. *)\n\n\n(* Push a token on pretty-printer scanning stack.\n If b is true set_size is called. *)\nlet scan_push state b token =\n pp_enqueue state token;\n if b then set_size state true;\n let elem = { left_total = state.pp_right_total; queue_elem = token } in\n Stack.push elem state.pp_scan_stack\n\n\n(* To open a new box :\n the user may set the depth bound pp_max_boxes\n any text nested deeper is printed as the ellipsis string. *)\nlet pp_open_box_gen state indent br_ty =\n state.pp_curr_depth <- state.pp_curr_depth + 1;\n if state.pp_curr_depth < state.pp_max_boxes then\n let size = Size.of_int (- state.pp_right_total) in\n let elem = { size; token = Pp_begin (indent, br_ty); length = 0 } in\n scan_push state false elem else\n if state.pp_curr_depth = state.pp_max_boxes\n then enqueue_string state state.pp_ellipsis\n\n\n(* The box which is always open. *)\nlet pp_open_sys_box state = pp_open_box_gen state 0 Pp_hovbox\n\n(* Close a box, setting sizes of its sub boxes. *)\nlet pp_close_box state () =\n if state.pp_curr_depth > 1 then\n begin\n if state.pp_curr_depth < state.pp_max_boxes then\n begin\n pp_enqueue state { size = Size.zero; token = Pp_end; length = 0 };\n set_size state true; set_size state false\n end;\n state.pp_curr_depth <- state.pp_curr_depth - 1;\n end\n\n\n(* Open a tag, pushing it on the tag stack. *)\nlet pp_open_stag state tag_name =\n if state.pp_print_tags then\n begin\n Stack.push tag_name state.pp_tag_stack;\n state.pp_print_open_tag tag_name\n end;\n if state.pp_mark_tags then\n let token = Pp_open_tag tag_name in\n pp_enqueue state { size = Size.zero; token; length = 0 }\n\n\n(* Close a tag, popping it from the tag stack. *)\nlet pp_close_stag state () =\n if state.pp_mark_tags then\n pp_enqueue state { size = Size.zero; token = Pp_close_tag; length = 0 };\n if state.pp_print_tags then\n match Stack.pop_opt state.pp_tag_stack with\n | None -> () (* No more tag to close. *)\n | Some tag_name ->\n state.pp_print_close_tag tag_name\n\nlet pp_set_print_tags state b = state.pp_print_tags <- b\nlet pp_set_mark_tags state b = state.pp_mark_tags <- b\nlet pp_get_print_tags state () = state.pp_print_tags\nlet pp_get_mark_tags state () = state.pp_mark_tags\nlet pp_set_tags state b =\n pp_set_print_tags state b; pp_set_mark_tags state b\n\n\n(* Handling tag handling functions: get/set functions. *)\nlet pp_get_formatter_stag_functions state () = {\n mark_open_stag = state.pp_mark_open_tag;\n mark_close_stag = state.pp_mark_close_tag;\n print_open_stag = state.pp_print_open_tag;\n print_close_stag = state.pp_print_close_tag;\n}\n\n\nlet pp_set_formatter_stag_functions state {\n mark_open_stag = mot;\n mark_close_stag = mct;\n print_open_stag = pot;\n print_close_stag = pct;\n } =\n state.pp_mark_open_tag <- mot;\n state.pp_mark_close_tag <- mct;\n state.pp_print_open_tag <- pot;\n state.pp_print_close_tag <- pct\n\n\n(* Initialize pretty-printer. *)\nlet pp_rinit state =\n pp_clear_queue state;\n initialize_scan_stack state.pp_scan_stack;\n Stack.clear state.pp_format_stack;\n Stack.clear state.pp_tbox_stack;\n Stack.clear state.pp_tag_stack;\n Stack.clear state.pp_mark_stack;\n state.pp_current_indent <- 0;\n state.pp_curr_depth <- 0;\n state.pp_space_left <- state.pp_margin;\n pp_open_sys_box state\n\nlet clear_tag_stack state =\n Stack.iter (fun _ -> pp_close_stag state ()) state.pp_tag_stack\n\n\n(* Flushing pretty-printer queue. *)\nlet pp_flush_queue state ~end_with_newline =\n clear_tag_stack state;\n while state.pp_curr_depth > 1 do\n pp_close_box state ()\n done;\n state.pp_right_total <- pp_infinity;\n advance_left state;\n if end_with_newline then pp_output_newline state;\n pp_rinit state\n\n(*\n\n Procedures to format values and use boxes.\n\n*)\n\n(* To format a string. *)\nlet pp_print_as_size state size s =\n if state.pp_curr_depth < state.pp_max_boxes\n then enqueue_string_as state size s\n\n\nlet pp_print_as state isize s =\n pp_print_as_size state (Size.of_int isize) s\n\n\nlet pp_print_string state s =\n pp_print_as state (String.length s) s\n\nlet pp_print_bytes state s =\n pp_print_as state (Bytes.length s) (Bytes.to_string s)\n\n(* To format an integer. *)\nlet pp_print_int state i = pp_print_string state (Int.to_string i)\n\n(* To format a float. *)\nlet pp_print_float state f = pp_print_string state (string_of_float f)\n\n(* To format a boolean. *)\nlet pp_print_bool state b = pp_print_string state (string_of_bool b)\n\n(* To format a char. *)\nlet pp_print_char state c =\n pp_print_as state 1 (String.make 1 c)\n\nlet pp_print_nothing _state () = ()\n\n\n(* Opening boxes. *)\nlet pp_open_hbox state () = pp_open_box_gen state 0 Pp_hbox\nand pp_open_vbox state indent = pp_open_box_gen state indent Pp_vbox\n\nand pp_open_hvbox state indent = pp_open_box_gen state indent Pp_hvbox\nand pp_open_hovbox state indent = pp_open_box_gen state indent Pp_hovbox\nand pp_open_box state indent = pp_open_box_gen state indent Pp_box\n\n\n(* Printing queued text.\n\n [pp_print_flush] prints all pending items in the pretty-printer queue and\n then flushes the low level output device of the formatter to actually\n display printing material.\n\n [pp_print_newline] behaves as [pp_print_flush] after printing an additional\n new line. *)\nlet pp_print_newline state () =\n pp_flush_queue state ~end_with_newline:true; state.pp_out_flush ()\nand pp_print_flush state () =\n pp_flush_queue state ~end_with_newline:false; state.pp_out_flush ()\n\n\n(* To get a newline when one does not want to close the current box. *)\nlet pp_force_newline state () =\n if state.pp_curr_depth < state.pp_max_boxes then\n enqueue_advance state { size = Size.zero; token = Pp_newline; length = 0 }\n\n\n(* To format something, only in case the line has just been broken. *)\nlet pp_print_if_newline state () =\n if state.pp_curr_depth < state.pp_max_boxes then\n enqueue_advance state\n { size = Size.zero; token = Pp_if_newline; length = 0 }\n\n\n(* Generalized break hint that allows printing strings before/after\n same-line offset (width) or new-line offset *)\nlet pp_print_custom_break state ~fits ~breaks =\n let before, width, after = fits in\n if state.pp_curr_depth < state.pp_max_boxes then\n let size = Size.of_int (- state.pp_right_total) in\n let token = Pp_break { fits; breaks } in\n let length = String.length before + width + String.length after in\n let elem = { size; token; length } in\n scan_push state true elem\n\n(* Printing break hints:\n A break hint indicates where a box may be broken.\n If line is broken then offset is added to the indentation of the current\n box else (the value of) width blanks are printed. *)\nlet pp_print_break state width offset =\n pp_print_custom_break state\n ~fits:(\"\", width, \"\") ~breaks:(\"\", offset, \"\")\n\n\n(* Print a space :\n a space is a break hint that prints a single space if the break does not\n split the line;\n a cut is a break hint that prints nothing if the break does not split the\n line. *)\nlet pp_print_space state () = pp_print_break state 1 0\nand pp_print_cut state () = pp_print_break state 0 0\n\n\n(* Tabulation boxes. *)\nlet pp_open_tbox state () =\n state.pp_curr_depth <- state.pp_curr_depth + 1;\n if state.pp_curr_depth < state.pp_max_boxes then\n let size = Size.zero in\n let elem = { size; token = Pp_tbegin (Pp_tbox (ref [])); length = 0 } in\n enqueue_advance state elem\n\n\n(* Close a tabulation box. *)\nlet pp_close_tbox state () =\n if state.pp_curr_depth > 1 then\n begin\n if state.pp_curr_depth < state.pp_max_boxes then\n let elem = { size = Size.zero; token = Pp_tend; length = 0 } in\n enqueue_advance state elem;\n state.pp_curr_depth <- state.pp_curr_depth - 1\n end\n\n\n(* Print a tabulation break. *)\nlet pp_print_tbreak state width offset =\n if state.pp_curr_depth < state.pp_max_boxes then\n let size = Size.of_int (- state.pp_right_total) in\n let elem = { size; token = Pp_tbreak (width, offset); length = width } in\n scan_push state true elem\n\n\nlet pp_print_tab state () = pp_print_tbreak state 0 0\n\nlet pp_set_tab state () =\n if state.pp_curr_depth < state.pp_max_boxes then\n let elem = { size = Size.zero; token = Pp_stab; length = 0 } in\n enqueue_advance state elem\n\n\n(*\n\n Procedures to control the pretty-printers\n\n*)\n\n(* Set_max_boxes. *)\nlet pp_set_max_boxes state n = if n > 1 then state.pp_max_boxes <- n\n\n(* To know the current maximum number of boxes allowed. *)\nlet pp_get_max_boxes state () = state.pp_max_boxes\n\nlet pp_over_max_boxes state () = state.pp_curr_depth = state.pp_max_boxes\n\n(* Ellipsis. *)\nlet pp_set_ellipsis_text state s = state.pp_ellipsis <- s\nand pp_get_ellipsis_text state () = state.pp_ellipsis\n\n\n(* To set the margin of pretty-printer. *)\nlet pp_limit n =\n if n < pp_infinity then n else pred pp_infinity\n\n\n(* Internal pretty-printer functions. *)\nlet pp_set_min_space_left state n =\n if n >= 1 then\n let n = pp_limit n in\n state.pp_min_space_left <- n;\n state.pp_max_indent <- state.pp_margin - state.pp_min_space_left;\n pp_rinit state\n\n\n(* Initially, we have :\n pp_max_indent = pp_margin - pp_min_space_left, and\n pp_space_left = pp_margin. *)\nlet pp_set_max_indent state n =\n if n > 1 then\n pp_set_min_space_left state (state.pp_margin - n)\n\n\nlet pp_get_max_indent state () = state.pp_max_indent\n\nlet pp_set_margin state n =\n if n >= 1 then\n let n = pp_limit n in\n state.pp_margin <- n;\n let new_max_indent =\n (* Try to maintain max_indent to its actual value. *)\n if state.pp_max_indent <= state.pp_margin\n then state.pp_max_indent else\n (* If possible maintain pp_min_space_left to its actual value,\n if this leads to a too small max_indent, take half of the\n new margin, if it is greater than 1. *)\n Int.max (Int.max (state.pp_margin - state.pp_min_space_left)\n (state.pp_margin / 2)) 1 in\n (* Rebuild invariants. *)\n pp_set_max_indent state new_max_indent\n\n\n(** Geometry functions and types *)\ntype geometry = { max_indent:int; margin: int}\n\nlet validate_geometry {margin; max_indent} =\n if max_indent < 2 then\n Error \"max_indent < 2\"\n else if margin <= max_indent then\n Error \"margin <= max_indent\"\n else if margin >= pp_infinity then\n Error \"margin >= pp_infinity\"\n else Ok ()\n\nlet check_geometry geometry =\n match validate_geometry geometry with\n | Ok () -> true\n | Error _ -> false\n\nlet pp_get_margin state () = state.pp_margin\n\nlet pp_set_full_geometry state {margin; max_indent} =\n pp_set_margin state margin;\n pp_set_max_indent state max_indent;\n ()\n\nlet pp_set_geometry state ~max_indent ~margin =\n let geometry = { max_indent; margin } in\n match validate_geometry geometry with\n | Error msg ->\n raise (Invalid_argument (\"Format.pp_set_geometry: \" ^ msg))\n | Ok () ->\n pp_set_full_geometry state geometry\n\nlet pp_safe_set_geometry state ~max_indent ~margin =\n let geometry = { max_indent; margin } in\n match validate_geometry geometry with\n | Error _msg ->\n ()\n | Ok () ->\n pp_set_full_geometry state geometry\n\nlet pp_get_geometry state () =\n { margin = pp_get_margin state (); max_indent = pp_get_max_indent state () }\n\nlet pp_update_geometry state update =\n let geometry = pp_get_geometry state () in\n pp_set_full_geometry state (update geometry)\n\n(* Setting a formatter basic output functions. *)\nlet pp_set_formatter_out_functions state {\n out_string = f;\n out_flush = g;\n out_newline = h;\n out_spaces = i;\n out_indent = j;\n } =\n state.pp_out_string <- f;\n state.pp_out_flush <- g;\n state.pp_out_newline <- h;\n state.pp_out_spaces <- i;\n state.pp_out_indent <- j\n\nlet pp_get_formatter_out_functions state () = {\n out_string = state.pp_out_string;\n out_flush = state.pp_out_flush;\n out_newline = state.pp_out_newline;\n out_spaces = state.pp_out_spaces;\n out_indent = state.pp_out_indent;\n}\n\n\n(* Setting a formatter basic string output and flush functions. *)\nlet pp_set_formatter_output_functions state f g =\n state.pp_out_string <- f; state.pp_out_flush <- g\n\nlet pp_get_formatter_output_functions state () =\n (state.pp_out_string, state.pp_out_flush)\n\n\n(* The default function to output new lines. *)\nlet display_newline state () = state.pp_out_string \"\\n\" 0 1\n\n(* The default function to output spaces. *)\nlet blank_line = String.make 80 ' '\nlet rec display_blanks state n =\n if n > 0 then\n if n <= 80 then state.pp_out_string blank_line 0 n else\n begin\n state.pp_out_string blank_line 0 80;\n display_blanks state (n - 80)\n end\n\n\n(* The default function to output indentation of new lines. *)\nlet display_indent = display_blanks\n\n(* Setting a formatter basic output functions as printing to a given\n [Stdlib.out_channel] value. *)\nlet pp_set_formatter_out_channel state oc =\n state.pp_out_string <- output_substring oc;\n state.pp_out_flush <- (fun () -> flush oc);\n state.pp_out_newline <- display_newline state;\n state.pp_out_spaces <- display_blanks state;\n state.pp_out_indent <- display_indent state\n\n(*\n\n Defining specific formatters\n\n*)\n\nlet default_pp_mark_open_tag = function\n | String_tag s -> \"<\" ^ s ^ \">\"\n | _ -> \"\"\nlet default_pp_mark_close_tag = function\n | String_tag s -> \"\" ^ s ^ \">\"\n | _ -> \"\"\n\nlet default_pp_print_open_tag = ignore\nlet default_pp_print_close_tag = ignore\n\n(* Building a formatter given its basic output functions.\n Other fields get reasonable default values. *)\nlet pp_make_formatter f g h i j =\n (* The initial state of the formatter contains a dummy box. *)\n let pp_queue = Queue.create () in\n let sys_tok =\n { size = Size.unknown; token = Pp_begin (0, Pp_hovbox); length = 0 } in\n Queue.add sys_tok pp_queue;\n let scan_stack = Stack.create () in\n initialize_scan_stack scan_stack;\n Stack.push { left_total = 1; queue_elem = sys_tok } scan_stack;\n let pp_margin = 78\n and pp_min_space_left = 10 in\n {\n pp_scan_stack = scan_stack;\n pp_format_stack = Stack.create ();\n pp_tbox_stack = Stack.create ();\n pp_tag_stack = Stack.create ();\n pp_mark_stack = Stack.create ();\n pp_margin = pp_margin;\n pp_min_space_left = pp_min_space_left;\n pp_max_indent = pp_margin - pp_min_space_left;\n pp_space_left = pp_margin;\n pp_current_indent = 0;\n pp_is_new_line = true;\n pp_left_total = 1;\n pp_right_total = 1;\n pp_curr_depth = 1;\n pp_max_boxes = max_int;\n pp_ellipsis = \".\";\n pp_out_string = f;\n pp_out_flush = g;\n pp_out_newline = h;\n pp_out_spaces = i;\n pp_out_indent = j;\n pp_print_tags = false;\n pp_mark_tags = false;\n pp_mark_open_tag = default_pp_mark_open_tag;\n pp_mark_close_tag = default_pp_mark_close_tag;\n pp_print_open_tag = default_pp_print_open_tag;\n pp_print_close_tag = default_pp_print_close_tag;\n pp_queue = pp_queue;\n }\n\n\n(* Build a formatter out of its out functions. *)\nlet formatter_of_out_functions out_funs =\n pp_make_formatter\n out_funs.out_string\n out_funs.out_flush\n out_funs.out_newline\n out_funs.out_spaces\n out_funs.out_indent\n\n\n(* Make a formatter with default functions to output spaces,\n indentation, and new lines. *)\nlet make_formatter output flush =\n let ppf = pp_make_formatter output flush ignore ignore ignore in\n ppf.pp_out_newline <- display_newline ppf;\n ppf.pp_out_spaces <- display_blanks ppf;\n ppf.pp_out_indent <- display_indent ppf;\n ppf\n\n\n(* Make a formatter writing to a given [Stdlib.out_channel] value. *)\nlet formatter_of_out_channel oc =\n make_formatter (output_substring oc) (fun () -> flush oc)\n\n\n(* Make a formatter writing to a given [Buffer.t] value. *)\nlet formatter_of_buffer b =\n make_formatter (Buffer.add_substring b) ignore\n\n\n(* Allocating buffer for pretty-printing purposes.\n Default buffer size is pp_buffer_size or 512.\n*)\nlet pp_buffer_size = 512\nlet pp_make_buffer () = Buffer.create pp_buffer_size\n\n(* The standard (shared) buffer. *)\nlet stdbuf = pp_make_buffer ()\n\n(* Predefined formatters standard formatter to print\n to [Stdlib.stdout], [Stdlib.stderr], and {!stdbuf}. *)\nlet std_formatter = formatter_of_out_channel Stdlib.stdout\nand err_formatter = formatter_of_out_channel Stdlib.stderr\nand str_formatter = formatter_of_buffer stdbuf\n\n(* Initialise domain local state *)\nmodule DLS = Domain.DLS\n\nlet stdbuf_key = DLS.new_key pp_make_buffer\nlet _ = DLS.set stdbuf_key stdbuf\n\nlet str_formatter_key = DLS.new_key (fun () ->\n formatter_of_buffer (DLS.get stdbuf_key))\nlet _ = DLS.set str_formatter_key str_formatter\n\nlet buffered_out_string key str ofs len =\n Buffer.add_substring (Domain.DLS.get key) str ofs len\n\nlet buffered_out_flush oc key () =\n let buf = Domain.DLS.get key in\n let len = Buffer.length buf in\n let str = Buffer.contents buf in\n output_substring oc str 0 len ;\n Stdlib.flush oc;\n Buffer.clear buf\n\nlet std_buf_key = Domain.DLS.new_key (fun () -> Buffer.create pp_buffer_size)\nlet err_buf_key = Domain.DLS.new_key (fun () -> Buffer.create pp_buffer_size)\n\nlet std_formatter_key = DLS.new_key (fun () ->\n let ppf =\n pp_make_formatter (buffered_out_string std_buf_key)\n (buffered_out_flush Stdlib.stdout std_buf_key) ignore ignore ignore\n in\n ppf.pp_out_newline <- display_newline ppf;\n ppf.pp_out_spaces <- display_blanks ppf;\n ppf.pp_out_indent <- display_indent ppf;\n Domain.at_exit (pp_print_flush ppf);\n ppf)\nlet _ = DLS.set std_formatter_key std_formatter\n\nlet err_formatter_key = DLS.new_key (fun () ->\n let ppf =\n pp_make_formatter (buffered_out_string err_buf_key)\n (buffered_out_flush Stdlib.stderr err_buf_key) ignore ignore ignore\n in\n ppf.pp_out_newline <- display_newline ppf;\n ppf.pp_out_spaces <- display_blanks ppf;\n ppf.pp_out_indent <- display_indent ppf;\n Domain.at_exit (pp_print_flush ppf);\n ppf)\nlet _ = DLS.set err_formatter_key err_formatter\n\nlet get_std_formatter () = DLS.get std_formatter_key\nlet get_err_formatter () = DLS.get err_formatter_key\nlet get_str_formatter () = DLS.get str_formatter_key\nlet get_stdbuf () = DLS.get stdbuf_key\n\n(* [flush_buffer_formatter buf ppf] flushes formatter [ppf],\n then returns the contents of buffer [buf] that is reset.\n Formatter [ppf] is supposed to print to buffer [buf], otherwise this\n function is not really useful. *)\nlet flush_buffer_formatter buf ppf =\n pp_flush_queue ppf ~end_with_newline:false;\n let s = Buffer.contents buf in\n Buffer.reset buf;\n s\n\n(* Flush [str_formatter] and get the contents of [stdbuf]. *)\nlet flush_str_formatter () =\n let stdbuf = DLS.get stdbuf_key in\n let str_formatter = DLS.get str_formatter_key in\n flush_buffer_formatter stdbuf str_formatter\n\nlet make_synchronized_formatter output flush =\n DLS.new_key (fun () ->\n let buf = Buffer.create pp_buffer_size in\n let output' = Buffer.add_substring buf in\n let flush' () =\n output (Buffer.contents buf) 0 (Buffer.length buf);\n Buffer.clear buf;\n flush ()\n in\n make_formatter output' flush')\n\nlet synchronized_formatter_of_out_channel oc =\n make_synchronized_formatter (output_substring oc) (fun () -> flush oc)\n\n(*\n Symbolic pretty-printing\n*)\n\n(*\n Symbolic pretty-printing is pretty-printing with no low level output.\n\n When using a symbolic formatter, all regular pretty-printing activities\n occur but output material is symbolic and stored in a buffer of output\n items. At the end of pretty-printing, flushing the output buffer allows\n post-processing of symbolic output before low level output operations.\n*)\n\ntype symbolic_output_item =\n | Output_flush\n | Output_newline\n | Output_string of string\n | Output_spaces of int\n | Output_indent of int\n\ntype symbolic_output_buffer = {\n mutable symbolic_output_contents : symbolic_output_item list;\n}\n\nlet make_symbolic_output_buffer () =\n { symbolic_output_contents = [] }\n\nlet clear_symbolic_output_buffer sob =\n sob.symbolic_output_contents <- []\n\nlet get_symbolic_output_buffer sob =\n List.rev sob.symbolic_output_contents\n\nlet flush_symbolic_output_buffer sob =\n let items = get_symbolic_output_buffer sob in\n clear_symbolic_output_buffer sob;\n items\n\nlet add_symbolic_output_item sob item =\n sob.symbolic_output_contents <- item :: sob.symbolic_output_contents\n\nlet formatter_of_symbolic_output_buffer sob =\n let symbolic_flush sob () =\n add_symbolic_output_item sob Output_flush\n and symbolic_newline sob () =\n add_symbolic_output_item sob Output_newline\n and symbolic_string sob s i n =\n add_symbolic_output_item sob (Output_string (String.sub s i n))\n and symbolic_spaces sob n =\n add_symbolic_output_item sob (Output_spaces n)\n and symbolic_indent sob n =\n add_symbolic_output_item sob (Output_indent n) in\n\n let f = symbolic_string sob\n and g = symbolic_flush sob\n and h = symbolic_newline sob\n and i = symbolic_spaces sob\n and j = symbolic_indent sob in\n pp_make_formatter f g h i j\n\n(*\n\n Basic functions on the 'standard' formatter\n (the formatter that prints to [Stdlib.stdout]).\n\n*)\n\nlet open_hbox v = pp_open_hbox (DLS.get std_formatter_key) v\nand open_vbox v = pp_open_vbox (DLS.get std_formatter_key) v\nand open_hvbox v = pp_open_hvbox (DLS.get std_formatter_key) v\nand open_hovbox v = pp_open_hovbox (DLS.get std_formatter_key) v\nand open_box v = pp_open_box (DLS.get std_formatter_key) v\nand close_box v = pp_close_box (DLS.get std_formatter_key) v\nand open_stag v = pp_open_stag (DLS.get std_formatter_key) v\nand close_stag v = pp_close_stag (DLS.get std_formatter_key) v\nand print_as v w = pp_print_as (DLS.get std_formatter_key) v w\nand print_string v = pp_print_string (DLS.get std_formatter_key) v\nand print_bytes v = pp_print_bytes (DLS.get std_formatter_key) v\nand print_int v = pp_print_int (DLS.get std_formatter_key) v\nand print_float v = pp_print_float (DLS.get std_formatter_key) v\nand print_char v = pp_print_char (DLS.get std_formatter_key) v\nand print_bool v = pp_print_bool (DLS.get std_formatter_key) v\nand print_break v w = pp_print_break (DLS.get std_formatter_key) v w\nand print_cut v = pp_print_cut (DLS.get std_formatter_key) v\nand print_space v = pp_print_space (DLS.get std_formatter_key) v\nand force_newline v = pp_force_newline (DLS.get std_formatter_key) v\nand print_flush v = pp_print_flush (DLS.get std_formatter_key) v\nand print_newline v = pp_print_newline (DLS.get std_formatter_key) v\nand print_if_newline v = pp_print_if_newline (DLS.get std_formatter_key) v\n\nand open_tbox v = pp_open_tbox (DLS.get std_formatter_key) v\nand close_tbox v = pp_close_tbox (DLS.get std_formatter_key) v\nand print_tbreak v w = pp_print_tbreak (DLS.get std_formatter_key) v w\n\nand set_tab v = pp_set_tab (DLS.get std_formatter_key) v\nand print_tab v = pp_print_tab (DLS.get std_formatter_key) v\n\nand set_margin v = pp_set_margin (DLS.get std_formatter_key) v\nand get_margin v = pp_get_margin (DLS.get std_formatter_key) v\n\nand set_max_indent v = pp_set_max_indent (DLS.get std_formatter_key) v\nand get_max_indent v = pp_get_max_indent (DLS.get std_formatter_key) v\n\nand set_geometry ~max_indent ~margin =\n pp_set_geometry (DLS.get std_formatter_key) ~max_indent ~margin\nand safe_set_geometry ~max_indent ~margin =\n pp_safe_set_geometry (DLS.get std_formatter_key) ~max_indent ~margin\nand get_geometry v = pp_get_geometry (DLS.get std_formatter_key) v\nand update_geometry v = pp_update_geometry (DLS.get std_formatter_key) v\n\nand set_max_boxes v = pp_set_max_boxes (DLS.get std_formatter_key) v\nand get_max_boxes v = pp_get_max_boxes (DLS.get std_formatter_key) v\nand over_max_boxes v = pp_over_max_boxes (DLS.get std_formatter_key) v\n\nand set_ellipsis_text v = pp_set_ellipsis_text (DLS.get std_formatter_key) v\nand get_ellipsis_text v = pp_get_ellipsis_text (DLS.get std_formatter_key) v\n\nand set_formatter_out_channel v =\n pp_set_formatter_out_channel (DLS.get std_formatter_key) v\n\nand set_formatter_out_functions v =\n pp_set_formatter_out_functions (DLS.get std_formatter_key) v\nand get_formatter_out_functions v =\n pp_get_formatter_out_functions (DLS.get std_formatter_key) v\n\nand set_formatter_output_functions v w =\n pp_set_formatter_output_functions (DLS.get std_formatter_key) v w\nand get_formatter_output_functions v =\n pp_get_formatter_output_functions (DLS.get std_formatter_key) v\n\nand set_formatter_stag_functions v =\n pp_set_formatter_stag_functions (DLS.get std_formatter_key) v\nand get_formatter_stag_functions v =\n pp_get_formatter_stag_functions (DLS.get std_formatter_key) v\nand set_print_tags v =\n pp_set_print_tags (DLS.get std_formatter_key) v\nand get_print_tags v =\n pp_get_print_tags (DLS.get std_formatter_key) v\nand set_mark_tags v =\n pp_set_mark_tags (DLS.get std_formatter_key) v\nand get_mark_tags v =\n pp_get_mark_tags (DLS.get std_formatter_key) v\nand set_tags v =\n pp_set_tags (DLS.get std_formatter_key) v\n\n\n(* Convenience functions *)\n\nlet pp_print_iter ?(pp_sep = pp_print_cut) iter pp_v ppf v =\n let is_first = ref true in\n let pp_v v =\n if !is_first then is_first := false else pp_sep ppf ();\n pp_v ppf v\n in\n iter pp_v v\n\n(* To format a list *)\nlet pp_print_list ?(pp_sep = pp_print_cut) pp_v ppf v =\n pp_print_iter ~pp_sep List.iter pp_v ppf v\n\n(* To format an array *)\nlet pp_print_array ?(pp_sep = pp_print_cut) pp_v ppf v =\n pp_print_iter ~pp_sep Array.iter pp_v ppf v\n\n(* To format a sequence *)\nlet pp_print_seq ?(pp_sep = pp_print_cut) pp_v ppf seq =\n pp_print_iter ~pp_sep Seq.iter pp_v ppf seq\n\n(* To format free-flowing text *)\nlet pp_print_text ppf s =\n let len = String.length s in\n let left = ref 0 in\n let right = ref 0 in\n let flush () =\n pp_print_string ppf (String.sub s !left (!right - !left));\n incr right; left := !right;\n in\n while (!right <> len) do\n match s.[!right] with\n | '\\n' ->\n flush ();\n pp_force_newline ppf ()\n | ' ' ->\n flush (); pp_print_space ppf ()\n (* there is no specific support for '\\t'\n as it is unclear what a right semantics would be *)\n | _ -> incr right\n done;\n if !left <> len then flush ()\n\nlet pp_print_option ?(none = fun _ () -> ()) pp_v ppf = function\n| None -> none ppf ()\n| Some v -> pp_v ppf v\n\nlet pp_print_result ~ok ~error ppf = function\n| Ok v -> ok ppf v\n| Error e -> error ppf e\n\nlet pp_print_either ~left ~right ppf = function\n| Either.Left l -> left ppf l\n| Either.Right r -> right ppf r\n\n (**************************************************************)\n\nlet compute_tag output tag_acc =\n let buf = Buffer.create 16 in\n let ppf = formatter_of_buffer buf in\n output ppf tag_acc;\n pp_print_flush ppf ();\n let len = Buffer.length buf in\n if len < 2 then Buffer.contents buf\n else Buffer.sub buf 1 (len - 2)\n\n (**************************************************************\n\n Defining continuations to be passed as arguments of\n CamlinternalFormat.make_printf.\n\n **************************************************************)\n\nopen CamlinternalFormatBasics\nopen CamlinternalFormat\n\n(* Interpret a formatting entity on a formatter. *)\nlet output_formatting_lit ppf fmting_lit = match fmting_lit with\n | Close_box -> pp_close_box ppf ()\n | Close_tag -> pp_close_stag ppf ()\n | Break (_, width, offset) -> pp_print_break ppf width offset\n | FFlush -> pp_print_flush ppf ()\n | Force_newline -> pp_force_newline ppf ()\n | Flush_newline -> pp_print_newline ppf ()\n | Magic_size (_, _) -> ()\n | Escaped_at -> pp_print_char ppf '@'\n | Escaped_percent -> pp_print_char ppf '%'\n | Scan_indic c -> pp_print_char ppf '@'; pp_print_char ppf c\n\n(* Recursively output an \"accumulator\" containing a reversed list of\n printing entities (string, char, flus, ...) in an output_stream. *)\n(* Differ from Printf.output_acc by the interpretation of formatting. *)\n(* Used as a continuation of CamlinternalFormat.make_printf. *)\nlet rec output_acc ppf acc = match acc with\n | Acc_string_literal (Acc_formatting_lit (p, Magic_size (_, size)), s)\n | Acc_data_string (Acc_formatting_lit (p, Magic_size (_, size)), s) ->\n output_acc ppf p;\n pp_print_as_size ppf (Size.of_int size) s;\n | Acc_char_literal (Acc_formatting_lit (p, Magic_size (_, size)), c)\n | Acc_data_char (Acc_formatting_lit (p, Magic_size (_, size)), c) ->\n output_acc ppf p;\n pp_print_as_size ppf (Size.of_int size) (String.make 1 c);\n | Acc_formatting_lit (p, f) ->\n output_acc ppf p;\n output_formatting_lit ppf f;\n | Acc_formatting_gen (p, Acc_open_tag acc') ->\n output_acc ppf p;\n pp_open_stag ppf (String_tag (compute_tag output_acc acc'))\n | Acc_formatting_gen (p, Acc_open_box acc') ->\n output_acc ppf p;\n let (indent, bty) = open_box_of_string (compute_tag output_acc acc') in\n pp_open_box_gen ppf indent bty\n | Acc_string_literal (p, s)\n | Acc_data_string (p, s) -> output_acc ppf p; pp_print_string ppf s;\n | Acc_char_literal (p, c)\n | Acc_data_char (p, c) -> output_acc ppf p; pp_print_char ppf c;\n | Acc_delay (p, f) -> output_acc ppf p; f ppf;\n | Acc_flush p -> output_acc ppf p; pp_print_flush ppf ();\n | Acc_invalid_arg (p, msg) -> output_acc ppf p; invalid_arg msg;\n | End_of_acc -> ()\n\n(* Recursively output an \"accumulator\" containing a reversed list of\n printing entities (string, char, flus, ...) in a buffer. *)\n(* Differ from Printf.bufput_acc by the interpretation of formatting. *)\n(* Used as a continuation of CamlinternalFormat.make_printf. *)\nlet rec strput_acc ppf acc = match acc with\n | Acc_string_literal (Acc_formatting_lit (p, Magic_size (_, size)), s)\n | Acc_data_string (Acc_formatting_lit (p, Magic_size (_, size)), s) ->\n strput_acc ppf p;\n pp_print_as_size ppf (Size.of_int size) s;\n | Acc_char_literal (Acc_formatting_lit (p, Magic_size (_, size)), c)\n | Acc_data_char (Acc_formatting_lit (p, Magic_size (_, size)), c) ->\n strput_acc ppf p;\n pp_print_as_size ppf (Size.of_int size) (String.make 1 c);\n | Acc_delay (Acc_formatting_lit (p, Magic_size (_, size)), f) ->\n strput_acc ppf p;\n pp_print_as_size ppf (Size.of_int size) (f ());\n | Acc_formatting_lit (p, f) ->\n strput_acc ppf p;\n output_formatting_lit ppf f;\n | Acc_formatting_gen (p, Acc_open_tag acc') ->\n strput_acc ppf p;\n pp_open_stag ppf (String_tag (compute_tag strput_acc acc'))\n | Acc_formatting_gen (p, Acc_open_box acc') ->\n strput_acc ppf p;\n let (indent, bty) = open_box_of_string (compute_tag strput_acc acc') in\n pp_open_box_gen ppf indent bty\n | Acc_string_literal (p, s)\n | Acc_data_string (p, s) -> strput_acc ppf p; pp_print_string ppf s;\n | Acc_char_literal (p, c)\n | Acc_data_char (p, c) -> strput_acc ppf p; pp_print_char ppf c;\n | Acc_delay (p, f) -> strput_acc ppf p; pp_print_string ppf (f ());\n | Acc_flush p -> strput_acc ppf p; pp_print_flush ppf ();\n | Acc_invalid_arg (p, msg) -> strput_acc ppf p; invalid_arg msg;\n | End_of_acc -> ()\n\n(*\n\n Defining [fprintf] and various flavors of [fprintf].\n\n*)\n\nlet kfprintf k ppf (Format (fmt, _)) =\n make_printf\n (fun acc -> output_acc ppf acc; k ppf)\n End_of_acc fmt\n\nand ikfprintf k ppf (Format (fmt, _)) =\n make_iprintf k ppf fmt\n\nlet ifprintf _ppf (Format (fmt, _)) =\n make_iprintf ignore () fmt\n\nlet fprintf ppf = kfprintf ignore ppf\n\nlet printf (Format (fmt, _)) =\n make_printf\n (fun acc -> output_acc (DLS.get std_formatter_key) acc)\n End_of_acc fmt\n\nlet eprintf (Format (fmt, _)) =\n make_printf\n (fun acc -> output_acc (DLS.get err_formatter_key) acc)\n End_of_acc fmt\n\nlet kdprintf k (Format (fmt, _)) =\n make_printf\n (fun acc -> k (fun ppf -> output_acc ppf acc))\n End_of_acc fmt\n\nlet dprintf fmt = kdprintf (fun i -> i) fmt\n\nlet ksprintf k (Format (fmt, _)) =\n let b = pp_make_buffer () in\n let ppf = formatter_of_buffer b in\n let k acc =\n strput_acc ppf acc;\n k (flush_buffer_formatter b ppf) in\n make_printf k End_of_acc fmt\n\n\nlet sprintf fmt = ksprintf id fmt\n\nlet kasprintf k (Format (fmt, _)) =\n let b = pp_make_buffer () in\n let ppf = formatter_of_buffer b in\n let k acc =\n output_acc ppf acc;\n k (flush_buffer_formatter b ppf) in\n make_printf k End_of_acc fmt\n\n\nlet asprintf fmt = kasprintf id fmt\n\n(* Flushing standard formatters at end of execution. *)\n\nlet flush_standard_formatters () =\n pp_print_flush (DLS.get std_formatter_key) ();\n pp_print_flush (DLS.get err_formatter_key) ()\n\nlet () = at_exit flush_standard_formatters\n\nlet () = Domain.before_first_spawn (fun () ->\n flush_standard_formatters ();\n let fs = pp_get_formatter_out_functions std_formatter () in\n pp_set_formatter_out_functions std_formatter\n {fs with out_string = buffered_out_string std_buf_key;\n out_flush = buffered_out_flush Stdlib.stdout std_buf_key};\n\n let fs = pp_get_formatter_out_functions err_formatter () in\n pp_set_formatter_out_functions err_formatter\n {fs with out_string = buffered_out_string err_buf_key;\n out_flush = buffered_out_flush Stdlib.stderr err_buf_key};\n)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":319949},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/scanf.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Pierre Weis, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2002 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nopen CamlinternalFormatBasics\nopen CamlinternalFormat\n\n(* alias to avoid warning for ambiguity between\n Stdlib.format6\n and CamlinternalFormatBasics.format6\n\n (the former is in fact an alias for the latter,\n but the ambiguity warning doesn't care)\n*)\ntype ('a, 'b, 'c, 'd, 'e, 'f) format6 =\n ('a, 'b, 'c, 'd, 'e, 'f) Stdlib.format6\n\n\n(* The run-time library for scanners. *)\n\n(* Scanning buffers. *)\nmodule type SCANNING = sig\n\n type in_channel\n\n type scanbuf = in_channel\n\n type file_name = string\n\n val stdin : in_channel\n (* The scanning buffer reading from [Stdlib.stdin]. *)\n\n val next_char : scanbuf -> char\n (* [Scanning.next_char ib] advance the scanning buffer for\n one character.\n If no more character can be read, sets a end of file condition and\n returns '\\000'. *)\n\n val invalidate_current_char : scanbuf -> unit\n (* [Scanning.invalidate_current_char ib] mark the current_char as already\n scanned. *)\n\n val peek_char : scanbuf -> char\n (* [Scanning.peek_char ib] returns the current char available in\n the buffer or reads one if necessary (when the current character is\n already scanned).\n If no character can be read, sets an end of file condition and\n returns '\\000'. *)\n\n val checked_peek_char : scanbuf -> char\n (* Same as [Scanning.peek_char] above but always returns a valid char or\n fails: instead of returning a null char when the reading method of the\n input buffer has reached an end of file, the function raises exception\n [End_of_file]. *)\n\n val store_char : int -> scanbuf -> char -> int\n (* [Scanning.store_char lim ib c] adds [c] to the token buffer\n of the scanning buffer [ib]. It also advances the scanning buffer for\n one character and returns [lim - 1], indicating the new limit for the\n length of the current token. *)\n\n val skip_char : int -> scanbuf -> int\n (* [Scanning.skip_char lim ib] ignores the current character. *)\n\n val ignore_char : int -> scanbuf -> int\n (* [Scanning.ignore_char ib lim] ignores the current character and\n decrements the limit. *)\n\n val token : scanbuf -> string\n (* [Scanning.token ib] returns the string stored into the token\n buffer of the scanning buffer: it returns the token matched by the\n format. *)\n\n val reset_token : scanbuf -> unit\n (* [Scanning.reset_token ib] resets the token buffer of\n the given scanning buffer. *)\n\n val char_count : scanbuf -> int\n (* [Scanning.char_count ib] returns the number of characters\n read so far from the given buffer. *)\n\n val line_count : scanbuf -> int\n (* [Scanning.line_count ib] returns the number of new line\n characters read so far from the given buffer. *)\n\n val token_count : scanbuf -> int\n (* [Scanning.token_count ib] returns the number of tokens read\n so far from [ib]. *)\n\n val eof : scanbuf -> bool\n (* [Scanning.eof ib] returns the end of input condition\n of the given buffer. *)\n\n val end_of_input : scanbuf -> bool\n (* [Scanning.end_of_input ib] tests the end of input condition\n of the given buffer (if no char has ever been read, an attempt to\n read one is performed). *)\n\n val beginning_of_input : scanbuf -> bool\n (* [Scanning.beginning_of_input ib] tests the beginning of input\n condition of the given buffer. *)\n\n val name_of_input : scanbuf -> string\n (* [Scanning.name_of_input ib] returns the name of the character\n source for input buffer [ib]. *)\n\n val open_in : file_name -> in_channel\n val open_in_bin : file_name -> in_channel\n val from_file : file_name -> in_channel\n val from_file_bin : file_name -> in_channel\n val from_string : string -> in_channel\n val from_function : (unit -> char) -> in_channel\n val from_channel : Stdlib.in_channel -> in_channel\n\n val close_in : in_channel -> unit\n\nend\n\n\nmodule Scanning : SCANNING = struct\n\n (* The run-time library for scanf. *)\n\n type file_name = string\n\n type in_channel_name =\n | From_channel of Stdlib.in_channel\n | From_file of file_name * Stdlib.in_channel\n | From_function\n | From_string\n\n\n type in_channel = {\n mutable ic_eof : bool;\n mutable ic_current_char : char;\n mutable ic_current_char_is_valid : bool;\n mutable ic_char_count : int;\n mutable ic_line_count : int;\n mutable ic_token_count : int;\n ic_get_next_char : unit -> char;\n ic_token_buffer : Buffer.t;\n ic_input_name : in_channel_name;\n }\n\n\n type scanbuf = in_channel\n\n let null_char = '\\000'\n\n (* Reads a new character from input buffer.\n Next_char never fails, even in case of end of input:\n it then simply sets the end of file condition. *)\n let next_char ib =\n try\n let c = ib.ic_get_next_char () in\n ib.ic_current_char <- c;\n ib.ic_current_char_is_valid <- true;\n ib.ic_char_count <- succ ib.ic_char_count;\n if c = '\\n' then ib.ic_line_count <- succ ib.ic_line_count;\n c with\n | End_of_file ->\n let c = null_char in\n ib.ic_current_char <- c;\n ib.ic_current_char_is_valid <- false;\n ib.ic_eof <- true;\n c\n\n\n let peek_char ib =\n if ib.ic_current_char_is_valid\n then ib.ic_current_char\n else next_char ib\n\n\n (* Returns a valid current char for the input buffer. In particular\n no irrelevant null character (as set by [next_char] in case of end\n of input) is returned, since [End_of_file] is raised when\n [next_char] sets the end of file condition while trying to read a\n new character. *)\n let checked_peek_char ib =\n let c = peek_char ib in\n if ib.ic_eof then raise End_of_file;\n c\n\n\n let end_of_input ib =\n ignore (peek_char ib);\n ib.ic_eof\n\n\n let eof ib = ib.ic_eof\n\n let beginning_of_input ib = ib.ic_char_count = 0\n\n let name_of_input ib =\n match ib.ic_input_name with\n | From_channel _ic -> \"unnamed Stdlib input channel\"\n | From_file (fname, _ic) -> fname\n | From_function -> \"unnamed function\"\n | From_string -> \"unnamed character string\"\n\n\n let char_count ib =\n if ib.ic_current_char_is_valid\n then ib.ic_char_count - 1\n else ib.ic_char_count\n\n\n let line_count ib = ib.ic_line_count\n\n let reset_token ib = Buffer.reset ib.ic_token_buffer\n\n let invalidate_current_char ib = ib.ic_current_char_is_valid <- false\n\n let token ib =\n let token_buffer = ib.ic_token_buffer in\n let tok = Buffer.contents token_buffer in\n Buffer.clear token_buffer;\n ib.ic_token_count <- succ ib.ic_token_count;\n tok\n\n\n let token_count ib = ib.ic_token_count\n\n let skip_char width ib =\n invalidate_current_char ib;\n width\n\n\n let ignore_char width ib = skip_char (width - 1) ib\n\n let store_char width ib c =\n Buffer.add_char ib.ic_token_buffer c;\n ignore_char width ib\n\n\n let default_token_buffer_size = 1024\n\n let create iname next = {\n ic_eof = false;\n ic_current_char = null_char;\n ic_current_char_is_valid = false;\n ic_char_count = 0;\n ic_line_count = 0;\n ic_token_count = 0;\n ic_get_next_char = next;\n ic_token_buffer = Buffer.create default_token_buffer_size;\n ic_input_name = iname;\n }\n\n\n let from_string s =\n let i = ref 0 in\n let len = String.length s in\n let next () =\n if !i >= len then raise End_of_file else\n let c = s.[!i] in\n incr i;\n c in\n create From_string next\n\n\n let from_function = create From_function\n\n (* Scanning from an input channel. *)\n\n (* Position of the problem:\n\n We cannot prevent the scanning mechanism to use one lookahead character,\n if needed by the semantics of the format string specifications (e.g. a\n trailing 'skip space' specification in the format string); in this case,\n the mandatory lookahead character is indeed read from the input and not\n used to return the token read. It is thus mandatory to be able to store\n an unused lookahead character somewhere to get it as the first character\n of the next scan.\n\n To circumvent this problem, all the scanning functions get a low level\n input buffer argument where they store the lookahead character when\n needed; additionally, the input buffer is the only source of character of\n a scanner. The [scanbuf] input buffers are defined in module {!Scanning}.\n\n Now we understand that it is extremely important that related and\n successive calls to scanners indeed read from the same input buffer.\n In effect, if a scanner [scan1] is reading from [ib1] and stores an\n unused lookahead character [c1] into its input buffer [ib1], then\n another scanner [scan2] not reading from the same buffer [ib1] will miss\n the character [c1], seemingly vanished in the air from the point of view\n of [scan2].\n\n This mechanism works perfectly to read from strings, from files, and from\n functions, since in those cases, allocating two buffers reading from the\n same source is unnatural.\n\n Still, there is a difficulty in the case of scanning from an input\n channel. In effect, when scanning from an input channel [ic], this channel\n may not have been allocated from within this library. Hence, it may be\n shared (two functions of the user's program may successively read from\n [ic]). This is highly error prone since, one of the function may seek the\n input channel, while the other function has still an unused lookahead\n character in its input buffer. In conclusion, you should never mix direct\n low level reading and high level scanning from the same input channel.\n\n *)\n\n (* Perform bufferized input to improve efficiency. *)\n let file_buffer_size = ref 1024\n\n (* The scanner closes the input channel at end of input. *)\n let scan_close_at_end ic = Stdlib.close_in ic; raise End_of_file\n\n (* The scanner does not close the input channel at end of input:\n it just raises [End_of_file]. *)\n let scan_raise_at_end _ic = raise End_of_file\n\n let from_ic scan_close_ic iname ic =\n let len = !file_buffer_size in\n let buf = Bytes.create len in\n let i = ref 0 in\n let lim = ref 0 in\n let eof = ref false in\n let next () =\n if !i < !lim then begin let c = Bytes.get buf !i in incr i; c end else\n if !eof then raise End_of_file else begin\n lim := input ic buf 0 len;\n if !lim = 0 then begin eof := true; scan_close_ic ic end else begin\n i := 1;\n Bytes.get buf 0\n end\n end in\n create iname next\n\n\n let from_ic_close_at_end = from_ic scan_close_at_end\n let from_ic_raise_at_end = from_ic scan_raise_at_end\n\n (* The scanning buffer reading from [Stdlib.stdin].\n One could try to define [stdin] as a scanning buffer reading a character\n at a time (no bufferization at all), but unfortunately the top-level\n interaction would be wrong. This is due to some kind of\n 'race condition' when reading from [Stdlib.stdin],\n since the interactive compiler and [Scanf.scanf] will simultaneously\n read the material they need from [Stdlib.stdin]; then, confusion\n will result from what should be read by the top-level and what should be\n read by [Scanf.scanf].\n This is even more complicated by the one character lookahead that\n [Scanf.scanf] is sometimes obliged to maintain: the lookahead character\n will be available for the next [Scanf.scanf] entry, seemingly coming from\n nowhere.\n Also no [End_of_file] is raised when reading from stdin: if not enough\n characters have been read, we simply ask to read more. *)\n let stdin =\n from_ic scan_raise_at_end\n (From_file (\"-\", Stdlib.stdin)) Stdlib.stdin\n\n let open_in_file open_in fname =\n match fname with\n | \"-\" -> stdin\n | fname ->\n let ic = open_in fname in\n from_ic_close_at_end (From_file (fname, ic)) ic\n\n\n let open_in = open_in_file Stdlib.open_in\n let open_in_bin = open_in_file Stdlib.open_in_bin\n\n let from_file = open_in\n let from_file_bin = open_in_bin\n\n let from_channel ic =\n from_ic_raise_at_end (From_channel ic) ic\n\n\n let close_in ib =\n match ib.ic_input_name with\n | From_channel ic ->\n Stdlib.close_in ic\n | From_file (_fname, ic) -> Stdlib.close_in ic\n | From_function | From_string -> ()\n\nend\n\n\n(* Formatted input functions. *)\n\ntype ('a, 'b, 'c, 'd) scanner =\n ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c\n\ntype ('a, 'b, 'c, 'd) scanner_opt =\n ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd option, 'd) format6 -> 'c\n\n(* Reporting errors. *)\nexception Scan_failure of string\n\nlet bad_input s = raise (Scan_failure s)\n\nlet bad_input_escape c =\n bad_input (Printf.sprintf \"illegal escape character %C\" c)\n\n\nlet bad_token_length message =\n bad_input\n (Printf.sprintf\n \"scanning of %s failed: \\\n the specified length was too short for token\"\n message)\n\n\nlet bad_end_of_input message =\n bad_input\n (Printf.sprintf\n \"scanning of %s failed: \\\n premature end of file occurred before end of token\"\n message)\n\n\nlet bad_float () =\n bad_input \"no dot or exponent part found in float token\"\n\n\nlet bad_hex_float () =\n bad_input \"not a valid float in hexadecimal notation\"\n\n\nlet character_mismatch_err c ci =\n Printf.sprintf \"looking for %C, found %C\" c ci\n\n\nlet character_mismatch c ci =\n bad_input (character_mismatch_err c ci)\n\n\nlet rec skip_whites ib =\n let c = Scanning.peek_char ib in\n if not (Scanning.eof ib) then begin\n match c with\n | ' ' | '\\t' | '\\n' | '\\r' ->\n Scanning.invalidate_current_char ib; skip_whites ib\n | _ -> ()\n end\n\n\n(* Checking that [c] is indeed in the input, then skips it.\n In this case, the character [c] has been explicitly specified in the\n format as being mandatory in the input; hence we should fail with\n [End_of_file] in case of end_of_input.\n (Remember that [Scan_failure] is raised only when (we can prove by\n evidence) that the input does not match the format string given. We must\n thus differentiate [End_of_file] as an error due to lack of input, and\n [Scan_failure] which is due to provably wrong input. I am not sure this is\n worth the burden: it is complex and somehow subliminal; should be clearer\n to fail with Scan_failure \"Not enough input to complete scanning\"!)\n\n That's why, waiting for a better solution, we use checked_peek_char here.\n We are also careful to treat \"\\r\\n\" in the input as an end of line marker:\n it always matches a '\\n' specification in the input format string. *)\nlet rec check_char ib c =\n match c with\n | ' ' -> skip_whites ib\n | '\\n' -> check_newline ib\n | c -> check_this_char ib c\n\nand check_this_char ib c =\n let ci = Scanning.checked_peek_char ib in\n if ci = c then Scanning.invalidate_current_char ib else\n character_mismatch c ci\n\nand check_newline ib =\n let ci = Scanning.checked_peek_char ib in\n match ci with\n | '\\n' -> Scanning.invalidate_current_char ib\n | '\\r' -> Scanning.invalidate_current_char ib; check_this_char ib '\\n'\n | _ -> character_mismatch '\\n' ci\n\n\n(* Extracting tokens from the output token buffer. *)\n\nlet token_char ib = (Scanning.token ib).[0]\n\nlet token_string = Scanning.token\n\nlet token_bool ib =\n match Scanning.token ib with\n | \"true\" -> true\n | \"false\" -> false\n | s -> bad_input (Printf.sprintf \"invalid boolean '%s'\" s)\n\n\n(* The type of integer conversions. *)\ntype integer_conversion =\n | B_conversion (* Unsigned binary conversion *)\n | D_conversion (* Signed decimal conversion *)\n | I_conversion (* Signed integer conversion *)\n | O_conversion (* Unsigned octal conversion *)\n | U_conversion (* Unsigned decimal conversion *)\n | X_conversion (* Unsigned hexadecimal conversion *)\n\n\nlet integer_conversion_of_char = function\n | 'b' -> B_conversion\n | 'd' -> D_conversion\n | 'i' -> I_conversion\n | 'o' -> O_conversion\n | 'u' -> U_conversion\n | 'x' | 'X' -> X_conversion\n | _ -> assert false\n\n\n(* Extract an integer literal token.\n Since the functions Stdlib.*int*_of_string do not accept a leading +,\n we skip it if necessary. *)\nlet token_int_literal conv ib =\n let tok =\n match conv with\n | D_conversion | I_conversion -> Scanning.token ib\n | U_conversion -> \"0u\" ^ Scanning.token ib\n | O_conversion -> \"0o\" ^ Scanning.token ib\n | X_conversion -> \"0x\" ^ Scanning.token ib\n | B_conversion -> \"0b\" ^ Scanning.token ib in\n let l = String.length tok in\n if l = 0 || tok.[0] <> '+' then tok else String.sub tok 1 (l - 1)\n\n\n(* All the functions that convert a string to a number raise the exception\n Failure when the conversion is not possible.\n This exception is then trapped in [kscanf]. *)\nlet token_int conv ib = int_of_string (token_int_literal conv ib)\n\nlet token_float ib = float_of_string (Scanning.token ib)\n\n(* To scan native ints, int32 and int64 integers.\n We cannot access to conversions to/from strings for those types,\n Nativeint.of_string, Int32.of_string, and Int64.of_string,\n since those modules are not available to [Scanf].\n However, we can bind and use the corresponding primitives that are\n available in the runtime. *)\nexternal nativeint_of_string : string -> nativeint\n = \"caml_nativeint_of_string\"\n\nexternal int32_of_string : string -> int32\n = \"caml_int32_of_string\"\n\nexternal int64_of_string : string -> int64\n = \"caml_int64_of_string\"\n\n\nlet token_nativeint conv ib = nativeint_of_string (token_int_literal conv ib)\nlet token_int32 conv ib = int32_of_string (token_int_literal conv ib)\nlet token_int64 conv ib = int64_of_string (token_int_literal conv ib)\n\n(* Scanning numbers. *)\n\n(* Digits scanning functions suppose that one character has been checked and\n is available, since they return at end of file with the currently found\n token selected.\n\n Put it in another way, the digits scanning functions scan for a possibly\n empty sequence of digits, (hence, a successful scanning from one of those\n functions does not imply that the token is a well-formed number: to get a\n true number, it is mandatory to check that at least one valid digit is\n available before calling one of the digit scanning functions). *)\n\n(* The decimal case is treated especially for optimization purposes. *)\nlet rec scan_decimal_digit_star width ib =\n if width = 0 then width else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width else\n match c with\n | '0' .. '9' as c ->\n let width = Scanning.store_char width ib c in\n scan_decimal_digit_star width ib\n | '_' ->\n let width = Scanning.ignore_char width ib in\n scan_decimal_digit_star width ib\n | _ -> width\n\n\nlet scan_decimal_digit_plus width ib =\n if width = 0 then bad_token_length \"decimal digits\" else\n let c = Scanning.checked_peek_char ib in\n match c with\n | '0' .. '9' ->\n let width = Scanning.store_char width ib c in\n scan_decimal_digit_star width ib\n | c ->\n bad_input (Printf.sprintf \"character %C is not a decimal digit\" c)\n\n\n(* To scan numbers from other bases, we use a predicate argument to\n scan digits. *)\nlet scan_digit_star digitp width ib =\n let rec scan_digits width ib =\n if width = 0 then width else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width else\n match c with\n | c when digitp c ->\n let width = Scanning.store_char width ib c in\n scan_digits width ib\n | '_' ->\n let width = Scanning.ignore_char width ib in\n scan_digits width ib\n | _ -> width in\n scan_digits width ib\n\n\nlet scan_digit_plus basis digitp width ib =\n (* Ensure we have got enough width left,\n and read at least one digit. *)\n if width = 0 then bad_token_length \"digits\" else\n let c = Scanning.checked_peek_char ib in\n if digitp c then\n let width = Scanning.store_char width ib c in\n scan_digit_star digitp width ib\n else\n bad_input (Printf.sprintf \"character %C is not a valid %s digit\" c basis)\n\n\nlet is_binary_digit = function\n | '0' .. '1' -> true\n | _ -> false\n\n\nlet scan_binary_int = scan_digit_plus \"binary\" is_binary_digit\n\nlet is_octal_digit = function\n | '0' .. '7' -> true\n | _ -> false\n\n\nlet scan_octal_int = scan_digit_plus \"octal\" is_octal_digit\n\nlet is_hexa_digit = function\n | '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' -> true\n | _ -> false\n\n\nlet scan_hexadecimal_int = scan_digit_plus \"hexadecimal\" is_hexa_digit\n\n(* Scan a decimal integer. *)\nlet scan_unsigned_decimal_int = scan_decimal_digit_plus\n\nlet scan_sign width ib =\n let c = Scanning.checked_peek_char ib in\n match c with\n | '+' -> Scanning.store_char width ib c\n | '-' -> Scanning.store_char width ib c\n | _ -> width\n\n\nlet scan_optionally_signed_decimal_int width ib =\n let width = scan_sign width ib in\n scan_unsigned_decimal_int width ib\n\n\n(* Scan an unsigned integer that could be given in any (common) basis.\n If digits are prefixed by one of 0x, 0X, 0o, or 0b, the number is\n assumed to be written respectively in hexadecimal, hexadecimal,\n octal, or binary. *)\nlet scan_unsigned_int width ib =\n match Scanning.checked_peek_char ib with\n | '0' as c ->\n let width = Scanning.store_char width ib c in\n if width = 0 then width else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width else\n begin match c with\n | 'x' | 'X' -> scan_hexadecimal_int (Scanning.store_char width ib c) ib\n | 'o' -> scan_octal_int (Scanning.store_char width ib c) ib\n | 'b' -> scan_binary_int (Scanning.store_char width ib c) ib\n | _ -> scan_decimal_digit_star width ib end\n | _ -> scan_unsigned_decimal_int width ib\n\n\nlet scan_optionally_signed_int width ib =\n let width = scan_sign width ib in\n scan_unsigned_int width ib\n\n\nlet scan_int_conversion conv width ib =\n match conv with\n | B_conversion -> scan_binary_int width ib\n | D_conversion -> scan_optionally_signed_decimal_int width ib\n | I_conversion -> scan_optionally_signed_int width ib\n | O_conversion -> scan_octal_int width ib\n | U_conversion -> scan_unsigned_decimal_int width ib\n | X_conversion -> scan_hexadecimal_int width ib\n\n\n(* Scanning floating point numbers. *)\n\n(* Fractional part is optional and can be reduced to 0 digits. *)\nlet scan_fractional_part width ib =\n if width = 0 then width else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width else\n match c with\n | '0' .. '9' as c ->\n scan_decimal_digit_star (Scanning.store_char width ib c) ib\n | _ -> width\n\n\n(* Exp part is optional and can be reduced to 0 digits. *)\nlet scan_exponent_part width ib =\n if width = 0 then width else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width else\n match c with\n | 'e' | 'E' as c ->\n scan_optionally_signed_decimal_int (Scanning.store_char width ib c) ib\n | _ -> width\n\n\n(* Scan the integer part of a floating point number, (not using the\n OCaml lexical convention since the integer part can be empty):\n an optional sign, followed by a possibly empty sequence of decimal\n digits (e.g. -.1). *)\nlet scan_integer_part width ib =\n let width = scan_sign width ib in\n scan_decimal_digit_star width ib\n\n\n(*\n For the time being we have (as found in scanf.mli):\n the field width is composed of an optional integer literal\n indicating the maximal width of the token to read.\n Unfortunately, the type-checker let the user write an optional precision,\n since this is valid for printf format strings.\n\n Thus, the next step for Scanf is to support a full width and precision\n indication, more or less similar to the one for printf, possibly extended\n to the specification of a [max, min] range for the width of the token read\n for strings. Something like the following spec for scanf.mli:\n\n The optional [width] is an integer indicating the maximal\n width of the token read. For instance, [%6d] reads an integer,\n having at most 6 characters.\n\n The optional [precision] is a dot [.] followed by an integer:\n\n - in the floating point number conversions ([%f], [%e], [%g], [%F], [%E],\n and [%F] conversions, the [precision] indicates the maximum number of\n digits that may follow the decimal point. For instance, [%.4f] reads a\n [float] with at most 4 fractional digits,\n\n - in the string conversions ([%s], [%S], [%\\[ range \\]]), and in the\n integer number conversions ([%i], [%d], [%u], [%x], [%o], and their\n [int32], [int64], and [native_int] correspondent), the [precision]\n indicates the required minimum width of the token read,\n\n - on all other conversions, the width and precision specify the [max, min]\n range for the width of the token read.\n*)\nlet scan_float width precision ib =\n let width = scan_integer_part width ib in\n if width = 0 then width, precision else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width, precision else\n match c with\n | '.' ->\n let width = Scanning.store_char width ib c in\n let precision = Int.min width precision in\n let width = width - (precision - scan_fractional_part precision ib) in\n scan_exponent_part width ib, precision\n | _ ->\n scan_exponent_part width ib, precision\n\n\nlet check_case_insensitive_string width ib error str =\n let lowercase c =\n match c with\n | 'A' .. 'Z' ->\n char_of_int (int_of_char c - int_of_char 'A' + int_of_char 'a')\n | _ -> c in\n let len = String.length str in\n let width = ref width in\n for i = 0 to len - 1 do\n let c = Scanning.peek_char ib in\n if lowercase c <> lowercase str.[i] then error ();\n if !width = 0 then error ();\n width := Scanning.store_char !width ib c;\n done;\n !width\n\n\nlet scan_hex_float width precision ib =\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n let width = scan_sign width ib in\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n match Scanning.peek_char ib with\n | '0' as c -> (\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n let width = check_case_insensitive_string width ib bad_hex_float \"x\" in\n if width = 0 || Scanning.end_of_input ib then width else\n let width = match Scanning.peek_char ib with\n | '.' | 'p' | 'P' -> width\n | _ -> scan_hexadecimal_int width ib in\n if width = 0 || Scanning.end_of_input ib then width else\n let width = match Scanning.peek_char ib with\n | '.' as c -> (\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then width else\n match Scanning.peek_char ib with\n | 'p' | 'P' -> width\n | _ ->\n let precision = Int.min width precision in\n width - (precision - scan_hexadecimal_int precision ib)\n )\n | _ -> width in\n if width = 0 || Scanning.end_of_input ib then width else\n match Scanning.peek_char ib with\n | 'p' | 'P' as c ->\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n scan_optionally_signed_decimal_int width ib\n | _ -> width\n )\n | 'n' | 'N' as c ->\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n check_case_insensitive_string width ib bad_hex_float \"an\"\n | 'i' | 'I' as c ->\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n check_case_insensitive_string width ib bad_hex_float \"nfinity\"\n | _ -> bad_hex_float ()\n\n\nlet scan_caml_float_rest width precision ib =\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n let width = scan_decimal_digit_star width ib in\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n let c = Scanning.peek_char ib in\n match c with\n | '.' ->\n let width = Scanning.store_char width ib c in\n (* The effective width available for scanning the fractional part is\n the minimum of declared precision and width left. *)\n let precision = Int.min width precision in\n (* After scanning the fractional part with [precision] provisional width,\n [width_precision] is left. *)\n let width_precision = scan_fractional_part precision ib in\n (* Hence, scanning the fractional part took exactly\n [precision - width_precision] chars. *)\n let frac_width = precision - width_precision in\n (* And new provisional width is [width - width_precision. *)\n let width = width - frac_width in\n scan_exponent_part width ib\n | 'e' | 'E' ->\n scan_exponent_part width ib\n | _ -> bad_float ()\n\n\nlet scan_caml_float width precision ib =\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n let width = scan_sign width ib in\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n match Scanning.peek_char ib with\n | '0' as c -> (\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n match Scanning.peek_char ib with\n | 'x' | 'X' as c -> (\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n let width = scan_hexadecimal_int width ib in\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n let width = match Scanning.peek_char ib with\n | '.' as c -> (\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then width else\n match Scanning.peek_char ib with\n | 'p' | 'P' -> width\n | _ ->\n let precision = Int.min width precision in\n width - (precision - scan_hexadecimal_int precision ib)\n )\n | 'p' | 'P' -> width\n | _ -> bad_float () in\n if width = 0 || Scanning.end_of_input ib then width else\n match Scanning.peek_char ib with\n | 'p' | 'P' as c ->\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_hex_float ();\n scan_optionally_signed_decimal_int width ib\n | _ -> width\n )\n | _ ->\n scan_caml_float_rest width precision ib\n )\n | '1' .. '9' as c ->\n let width = Scanning.store_char width ib c in\n if width = 0 || Scanning.end_of_input ib then bad_float ();\n scan_caml_float_rest width precision ib\n(* Special case of nan and infinity:\n | 'i' ->\n | 'n' ->\n*)\n | _ -> bad_float ()\n\n\n(* Scan a regular string:\n stops when encountering a space, if no scanning indication has been given;\n otherwise, stops when encountering the characters in the scanning\n indication [stp].\n It also stops at end of file or when the maximum number of characters has\n been read. *)\nlet scan_string stp width ib =\n let rec loop width =\n if width = 0 then width else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then width else\n match stp with\n | Some c' when c = c' -> Scanning.skip_char width ib\n | Some _ -> loop (Scanning.store_char width ib c)\n | None ->\n match c with\n | ' ' | '\\t' | '\\n' | '\\r' -> width\n | _ -> loop (Scanning.store_char width ib c) in\n loop width\n\n\n(* Scan a char: peek strictly one character in the input, whatsoever. *)\nlet scan_char width ib =\n (* The case width = 0 could not happen here, since it is tested before\n calling scan_char, in the main scanning function.\n if width = 0 then bad_token_length \"a character\" else *)\n Scanning.store_char width ib (Scanning.checked_peek_char ib)\n\n\nlet char_for_backslash = function\n | 'n' -> '\\010'\n | 'r' -> '\\013'\n | 'b' -> '\\008'\n | 't' -> '\\009'\n | c -> c\n\n\n(* The integer value corresponding to the facial value of a valid\n decimal digit character. *)\nlet decimal_value_of_char c = int_of_char c - int_of_char '0'\n\nlet char_for_decimal_code c0 c1 c2 =\n let c =\n 100 * decimal_value_of_char c0 +\n 10 * decimal_value_of_char c1 +\n decimal_value_of_char c2 in\n if c < 0 || c > 255 then\n bad_input\n (Printf.sprintf\n \"bad character decimal encoding \\\\%c%c%c\" c0 c1 c2) else\n char_of_int c\n\n\n(* The integer value corresponding to the facial value of a valid\n hexadecimal digit character. *)\nlet hexadecimal_value_of_char c =\n let d = int_of_char c in\n (* Could also be:\n if d <= int_of_char '9' then d - int_of_char '0' else\n if d <= int_of_char 'F' then 10 + d - int_of_char 'A' else\n if d <= int_of_char 'f' then 10 + d - int_of_char 'a' else assert false\n *)\n if d >= int_of_char 'a' then\n d - 87 (* 10 + int_of_char c - int_of_char 'a' *) else\n if d >= int_of_char 'A' then\n d - 55 (* 10 + int_of_char c - int_of_char 'A' *) else\n d - int_of_char '0'\n\n\nlet char_for_hexadecimal_code c1 c2 =\n let c =\n 16 * hexadecimal_value_of_char c1 +\n hexadecimal_value_of_char c2 in\n if c < 0 || c > 255 then\n bad_input\n (Printf.sprintf \"bad character hexadecimal encoding \\\\%c%c\" c1 c2) else\n char_of_int c\n\n\n(* Called in particular when encountering '\\\\' as starter of a char.\n Stops before the corresponding '\\''. *)\nlet check_next_char message width ib =\n if width = 0 then bad_token_length message else\n let c = Scanning.peek_char ib in\n if Scanning.eof ib then bad_end_of_input message else\n c\n\n\nlet check_next_char_for_char = check_next_char \"a Char\"\nlet check_next_char_for_string = check_next_char \"a String\"\n\nlet scan_backslash_char width ib =\n match check_next_char_for_char width ib with\n | '\\\\' | '\\'' | '\\\"' | 'n' | 't' | 'b' | 'r' as c ->\n Scanning.store_char width ib (char_for_backslash c)\n | '0' .. '9' as c ->\n let get_digit () =\n let c = Scanning.next_char ib in\n match c with\n | '0' .. '9' as c -> c\n | c -> bad_input_escape c in\n let c0 = c in\n let c1 = get_digit () in\n let c2 = get_digit () in\n Scanning.store_char (width - 2) ib (char_for_decimal_code c0 c1 c2)\n | 'x' ->\n let get_digit () =\n let c = Scanning.next_char ib in\n match c with\n | '0' .. '9' | 'A' .. 'F' | 'a' .. 'f' as c -> c\n | c -> bad_input_escape c in\n let c1 = get_digit () in\n let c2 = get_digit () in\n Scanning.store_char (width - 2) ib (char_for_hexadecimal_code c1 c2)\n | c ->\n bad_input_escape c\n\n\n(* Scan a character (an OCaml token). *)\nlet scan_caml_char width ib =\n\n let rec find_start width =\n match Scanning.checked_peek_char ib with\n | '\\'' -> find_char (Scanning.ignore_char width ib)\n | c -> character_mismatch '\\'' c\n\n and find_char width =\n match check_next_char_for_char width ib with\n | '\\\\' ->\n find_stop (scan_backslash_char (Scanning.ignore_char width ib) ib)\n | c ->\n find_stop (Scanning.store_char width ib c)\n\n and find_stop width =\n match check_next_char_for_char width ib with\n | '\\'' -> Scanning.ignore_char width ib\n | c -> character_mismatch '\\'' c in\n\n find_start width\n\n\n(* Scan a delimited string (an OCaml token). *)\nlet scan_caml_string width ib =\n\n let rec find_start width =\n match Scanning.checked_peek_char ib with\n | '\\\"' -> find_stop (Scanning.ignore_char width ib)\n | c -> character_mismatch '\\\"' c\n\n and find_stop width =\n match check_next_char_for_string width ib with\n | '\\\"' -> Scanning.ignore_char width ib\n | '\\\\' -> scan_backslash (Scanning.ignore_char width ib)\n | c -> find_stop (Scanning.store_char width ib c)\n\n and scan_backslash width =\n match check_next_char_for_string width ib with\n | '\\r' -> skip_newline (Scanning.ignore_char width ib)\n | '\\n' -> skip_spaces (Scanning.ignore_char width ib)\n | _ -> find_stop (scan_backslash_char width ib)\n\n and skip_newline width =\n match check_next_char_for_string width ib with\n | '\\n' -> skip_spaces (Scanning.ignore_char width ib)\n | _ -> find_stop (Scanning.store_char width ib '\\r')\n\n and skip_spaces width =\n match check_next_char_for_string width ib with\n | ' ' -> skip_spaces (Scanning.ignore_char width ib)\n | _ -> find_stop width in\n\n find_start width\n\n\n(* Scan a boolean (an OCaml token). *)\nlet scan_bool ib =\n let c = Scanning.checked_peek_char ib in\n let m =\n match c with\n | 't' -> 4\n | 'f' -> 5\n | c ->\n bad_input\n (Printf.sprintf \"the character %C cannot start a boolean\" c) in\n scan_string None m ib\n\n\n(* Scan a string containing elements in char_set and terminated by scan_indic\n if provided. *)\nlet scan_chars_in_char_set char_set scan_indic width ib =\n let rec scan_chars i stp =\n let c = Scanning.peek_char ib in\n if i > 0 && not (Scanning.eof ib) &&\n is_in_char_set char_set c &&\n int_of_char c <> stp then\n let _ = Scanning.store_char max_int ib c in\n scan_chars (i - 1) stp in\n match scan_indic with\n | None -> scan_chars width (-1);\n | Some c ->\n scan_chars width (int_of_char c);\n if not (Scanning.eof ib) then\n let ci = Scanning.peek_char ib in\n if c = ci\n then Scanning.invalidate_current_char ib\n else character_mismatch c ci\n\n\n(* The global error report function for [Scanf]. *)\nlet scanf_bad_input ib = function\n | Scan_failure s | Failure s ->\n let i = Scanning.char_count ib in\n bad_input (Printf.sprintf \"scanf: bad input at char number %i: %s\" i s)\n | x -> raise x\n\n\n(* Get the content of a counter from an input buffer. *)\nlet get_counter ib counter =\n match counter with\n | Line_counter -> Scanning.line_count ib\n | Char_counter -> Scanning.char_count ib\n | Token_counter -> Scanning.token_count ib\n\n\n(* Compute the width of a padding option (see \"%42{\" and \"%123(\"). *)\nlet width_of_pad_opt pad_opt = match pad_opt with\n | None -> max_int\n | Some width -> width\n\n\nlet stopper_of_formatting_lit fmting =\n if fmting = Escaped_percent then '%', \"\" else\n let str = string_of_formatting_lit fmting in\n let stp = str.[1] in\n let sub_str = String.sub str 2 (String.length str - 2) in\n stp, sub_str\n\n\n(******************************************************************************)\n (* Reader management *)\n\n(* A call to take_format_readers on a format is evaluated into functions\n taking readers as arguments and aggregate them into an heterogeneous list *)\n(* When all readers are taken, finally pass the list of the readers to the\n continuation k. *)\nlet rec take_format_readers : type a c d e f .\n ((d, e) heter_list -> e) -> (a, Scanning.in_channel, c, d, e, f) fmt ->\n d =\nfun k fmt -> match fmt with\n | Reader fmt_rest ->\n fun reader ->\n let new_k readers_rest = k (Cons (reader, readers_rest)) in\n take_format_readers new_k fmt_rest\n | Char rest -> take_format_readers k rest\n | Caml_char rest -> take_format_readers k rest\n | String (_, rest) -> take_format_readers k rest\n | Caml_string (_, rest) -> take_format_readers k rest\n | Int (_, _, _, rest) -> take_format_readers k rest\n | Int32 (_, _, _, rest) -> take_format_readers k rest\n | Nativeint (_, _, _, rest) -> take_format_readers k rest\n | Int64 (_, _, _, rest) -> take_format_readers k rest\n | Float (_, _, _, rest) -> take_format_readers k rest\n | Bool (_, rest) -> take_format_readers k rest\n | Alpha rest -> take_format_readers k rest\n | Theta rest -> take_format_readers k rest\n | Flush rest -> take_format_readers k rest\n | String_literal (_, rest) -> take_format_readers k rest\n | Char_literal (_, rest) -> take_format_readers k rest\n | Custom (_, _, rest) -> take_format_readers k rest\n\n | Scan_char_set (_, _, rest) -> take_format_readers k rest\n | Scan_get_counter (_, rest) -> take_format_readers k rest\n | Scan_next_char rest -> take_format_readers k rest\n\n | Formatting_lit (_, rest) -> take_format_readers k rest\n | Formatting_gen (Open_tag (Format (fmt, _)), rest) ->\n take_format_readers k (concat_fmt fmt rest)\n | Formatting_gen (Open_box (Format (fmt, _)), rest) ->\n take_format_readers k (concat_fmt fmt rest)\n\n | Format_arg (_, _, rest) -> take_format_readers k rest\n | Format_subst (_, fmtty, rest) ->\n take_fmtty_format_readers k (erase_rel (symm fmtty)) rest\n | Ignored_param (ign, rest) -> take_ignored_format_readers k ign rest\n\n | End_of_format -> k Nil\n\n(* Take readers associated to an fmtty coming from a Format_subst \"%(...%)\". *)\nand take_fmtty_format_readers : type x y a c d e f .\n ((d, e) heter_list -> e) -> (a, Scanning.in_channel, c, d, x, y) fmtty ->\n (y, Scanning.in_channel, c, x, e, f) fmt -> d =\nfun k fmtty fmt -> match fmtty with\n | Reader_ty fmt_rest ->\n fun reader ->\n let new_k readers_rest = k (Cons (reader, readers_rest)) in\n take_fmtty_format_readers new_k fmt_rest fmt\n | Ignored_reader_ty fmt_rest ->\n fun reader ->\n let new_k readers_rest = k (Cons (reader, readers_rest)) in\n take_fmtty_format_readers new_k fmt_rest fmt\n | Char_ty rest -> take_fmtty_format_readers k rest fmt\n | String_ty rest -> take_fmtty_format_readers k rest fmt\n | Int_ty rest -> take_fmtty_format_readers k rest fmt\n | Int32_ty rest -> take_fmtty_format_readers k rest fmt\n | Nativeint_ty rest -> take_fmtty_format_readers k rest fmt\n | Int64_ty rest -> take_fmtty_format_readers k rest fmt\n | Float_ty rest -> take_fmtty_format_readers k rest fmt\n | Bool_ty rest -> take_fmtty_format_readers k rest fmt\n | Alpha_ty rest -> take_fmtty_format_readers k rest fmt\n | Theta_ty rest -> take_fmtty_format_readers k rest fmt\n | Any_ty rest -> take_fmtty_format_readers k rest fmt\n | Format_arg_ty (_, rest) -> take_fmtty_format_readers k rest fmt\n | End_of_fmtty -> take_format_readers k fmt\n | Format_subst_ty (ty1, ty2, rest) ->\n let ty = trans (symm ty1) ty2 in\n take_fmtty_format_readers k (concat_fmtty ty rest) fmt\n\n(* Take readers associated to an ignored parameter. *)\nand take_ignored_format_readers : type x y a c d e f .\n ((d, e) heter_list -> e) -> (a, Scanning.in_channel, c, d, x, y) ignored ->\n (y, Scanning.in_channel, c, x, e, f) fmt -> d =\nfun k ign fmt -> match ign with\n | Ignored_reader ->\n fun reader ->\n let new_k readers_rest = k (Cons (reader, readers_rest)) in\n take_format_readers new_k fmt\n | Ignored_char -> take_format_readers k fmt\n | Ignored_caml_char -> take_format_readers k fmt\n | Ignored_string _ -> take_format_readers k fmt\n | Ignored_caml_string _ -> take_format_readers k fmt\n | Ignored_int (_, _) -> take_format_readers k fmt\n | Ignored_int32 (_, _) -> take_format_readers k fmt\n | Ignored_nativeint (_, _) -> take_format_readers k fmt\n | Ignored_int64 (_, _) -> take_format_readers k fmt\n | Ignored_float (_, _) -> take_format_readers k fmt\n | Ignored_bool _ -> take_format_readers k fmt\n | Ignored_format_arg _ -> take_format_readers k fmt\n | Ignored_format_subst (_, fmtty) -> take_fmtty_format_readers k fmtty fmt\n | Ignored_scan_char_set _ -> take_format_readers k fmt\n | Ignored_scan_get_counter _ -> take_format_readers k fmt\n | Ignored_scan_next_char -> take_format_readers k fmt\n\n(******************************************************************************)\n (* Generic scanning *)\n\n(* Make a generic scanning function. *)\n(* Scan a stream according to a format and readers obtained by\n take_format_readers, and aggregate scanned values into an\n heterogeneous list. *)\n(* Return the heterogeneous list of scanned values. *)\nlet rec make_scanf : type a c d e f.\n Scanning.in_channel -> (a, Scanning.in_channel, c, d, e, f) fmt ->\n (d, e) heter_list -> (a, f) heter_list =\nfun ib fmt readers -> match fmt with\n | Char rest ->\n let _ = scan_char 0 ib in\n let c = token_char ib in\n Cons (c, make_scanf ib rest readers)\n | Caml_char rest ->\n let _ = scan_caml_char 0 ib in\n let c = token_char ib in\n Cons (c, make_scanf ib rest readers)\n\n | String (pad, Formatting_lit (fmting_lit, rest)) ->\n let stp, str = stopper_of_formatting_lit fmting_lit in\n let scan width _ ib = scan_string (Some stp) width ib in\n let str_rest = String_literal (str, rest) in\n pad_prec_scanf ib str_rest readers pad No_precision scan token_string\n | String (pad, Formatting_gen (Open_tag (Format (fmt', _)), rest)) ->\n let scan width _ ib = scan_string (Some '{') width ib in\n pad_prec_scanf ib (concat_fmt fmt' rest) readers pad No_precision scan\n token_string\n | String (pad, Formatting_gen (Open_box (Format (fmt', _)), rest)) ->\n let scan width _ ib = scan_string (Some '[') width ib in\n pad_prec_scanf ib (concat_fmt fmt' rest) readers pad No_precision scan\n token_string\n | String (pad, rest) ->\n let scan width _ ib = scan_string None width ib in\n pad_prec_scanf ib rest readers pad No_precision scan token_string\n\n | Caml_string (pad, rest) ->\n let scan width _ ib = scan_caml_string width ib in\n pad_prec_scanf ib rest readers pad No_precision scan token_string\n | Int (iconv, pad, prec, rest) ->\n let c = integer_conversion_of_char (char_of_iconv iconv) in\n let scan width _ ib = scan_int_conversion c width ib in\n pad_prec_scanf ib rest readers pad prec scan (token_int c)\n | Int32 (iconv, pad, prec, rest) ->\n let c = integer_conversion_of_char (char_of_iconv iconv) in\n let scan width _ ib = scan_int_conversion c width ib in\n pad_prec_scanf ib rest readers pad prec scan (token_int32 c)\n | Nativeint (iconv, pad, prec, rest) ->\n let c = integer_conversion_of_char (char_of_iconv iconv) in\n let scan width _ ib = scan_int_conversion c width ib in\n pad_prec_scanf ib rest readers pad prec scan (token_nativeint c)\n | Int64 (iconv, pad, prec, rest) ->\n let c = integer_conversion_of_char (char_of_iconv iconv) in\n let scan width _ ib = scan_int_conversion c width ib in\n pad_prec_scanf ib rest readers pad prec scan (token_int64 c)\n | Float ((_, (Float_F | Float_CF)), pad, prec, rest) ->\n pad_prec_scanf ib rest readers pad prec scan_caml_float token_float\n | Float ((_, (Float_f | Float_e | Float_E | Float_g | Float_G)),\n pad, prec, rest) ->\n pad_prec_scanf ib rest readers pad prec scan_float token_float\n | Float ((_, (Float_h | Float_H)), pad, prec, rest) ->\n pad_prec_scanf ib rest readers pad prec scan_hex_float token_float\n | Bool (pad, rest) ->\n let scan _ _ ib = scan_bool ib in\n pad_prec_scanf ib rest readers pad No_precision scan token_bool\n | Alpha _ ->\n invalid_arg \"scanf: bad conversion \\\"%a\\\"\"\n | Theta _ ->\n invalid_arg \"scanf: bad conversion \\\"%t\\\"\"\n | Custom _ ->\n invalid_arg \"scanf: bad conversion \\\"%?\\\" (custom converter)\"\n | Reader fmt_rest ->\n begin match readers with\n | Cons (reader, readers_rest) ->\n let x = reader ib in\n Cons (x, make_scanf ib fmt_rest readers_rest)\n | Nil ->\n invalid_arg \"scanf: missing reader\"\n end\n | Flush rest ->\n if Scanning.end_of_input ib then make_scanf ib rest readers\n else bad_input \"end of input not found\"\n\n | String_literal (str, rest) ->\n String.iter (check_char ib) str;\n make_scanf ib rest readers\n | Char_literal (chr, rest) ->\n check_char ib chr;\n make_scanf ib rest readers\n\n | Format_arg (pad_opt, fmtty, rest) ->\n let _ = scan_caml_string (width_of_pad_opt pad_opt) ib in\n let s = token_string ib in\n let fmt =\n try format_of_string_fmtty s fmtty\n with Failure msg -> bad_input msg\n in\n Cons (fmt, make_scanf ib rest readers)\n | Format_subst (pad_opt, fmtty, rest) ->\n let _ = scan_caml_string (width_of_pad_opt pad_opt) ib in\n let s = token_string ib in\n let fmt, fmt' =\n try\n let Fmt_EBB fmt = fmt_ebb_of_string s in\n let Fmt_EBB fmt' = fmt_ebb_of_string s in\n (* TODO: find a way to avoid reparsing twice *)\n\n (* TODO: these type-checks below *can* fail because of type\n ambiguity in presence of ignored-readers: \"%_r%d\" and \"%d%_r\"\n are typed in the same way.\n\n # Scanf.sscanf \"\\\"%_r%d\\\"3\" \"%(%d%_r%)\" ignore\n (fun fmt n -> string_of_format fmt, n)\n Exception: CamlinternalFormat.Type_mismatch.\n\n We should properly catch this exception.\n *)\n type_format fmt (erase_rel fmtty),\n type_format fmt' (erase_rel (symm fmtty))\n with Failure msg -> bad_input msg\n in\n Cons (Format (fmt, s),\n make_scanf ib (concat_fmt fmt' rest) readers)\n\n | Scan_char_set (width_opt, char_set, Formatting_lit (fmting_lit, rest)) ->\n let stp, str = stopper_of_formatting_lit fmting_lit in\n let width = width_of_pad_opt width_opt in\n scan_chars_in_char_set char_set (Some stp) width ib;\n let s = token_string ib in\n let str_rest = String_literal (str, rest) in\n Cons (s, make_scanf ib str_rest readers)\n | Scan_char_set (width_opt, char_set, rest) ->\n let width = width_of_pad_opt width_opt in\n scan_chars_in_char_set char_set None width ib;\n let s = token_string ib in\n Cons (s, make_scanf ib rest readers)\n | Scan_get_counter (counter, rest) ->\n let count = get_counter ib counter in\n Cons (count, make_scanf ib rest readers)\n | Scan_next_char rest ->\n let c = Scanning.checked_peek_char ib in\n Cons (c, make_scanf ib rest readers)\n\n | Formatting_lit (formatting_lit, rest) ->\n String.iter (check_char ib) (string_of_formatting_lit formatting_lit);\n make_scanf ib rest readers\n | Formatting_gen (Open_tag (Format (fmt', _)), rest) ->\n check_char ib '@'; check_char ib '{';\n make_scanf ib (concat_fmt fmt' rest) readers\n | Formatting_gen (Open_box (Format (fmt', _)), rest) ->\n check_char ib '@'; check_char ib '[';\n make_scanf ib (concat_fmt fmt' rest) readers\n\n | Ignored_param (ign, rest) ->\n let Param_format_EBB fmt' = param_format_of_ignored_format ign rest in\n begin match make_scanf ib fmt' readers with\n | Cons (_, arg_rest) -> arg_rest\n | Nil -> assert false\n end\n\n | End_of_format ->\n Nil\n\n(* Case analysis on padding and precision. *)\n(* Reject formats containing \"%*\" or \"%.*\". *)\n(* Pass padding and precision to the generic scanner `scan'. *)\nand pad_prec_scanf : type a c d e f x y z t .\n Scanning.in_channel -> (a, Scanning.in_channel, c, d, e, f) fmt ->\n (d, e) heter_list -> (x, y) padding -> (y, z -> a) precision ->\n (int -> int -> Scanning.in_channel -> t) ->\n (Scanning.in_channel -> z) ->\n (x, f) heter_list =\nfun ib fmt readers pad prec scan token -> match pad, prec with\n | No_padding, No_precision ->\n let _ = scan max_int max_int ib in\n let x = token ib in\n Cons (x, make_scanf ib fmt readers)\n | No_padding, Lit_precision p ->\n let _ = scan max_int p ib in\n let x = token ib in\n Cons (x, make_scanf ib fmt readers)\n | Lit_padding ((Right | Zeros), w), No_precision ->\n let _ = scan w max_int ib in\n let x = token ib in\n Cons (x, make_scanf ib fmt readers)\n | Lit_padding ((Right | Zeros), w), Lit_precision p ->\n let _ = scan w p ib in\n let x = token ib in\n Cons (x, make_scanf ib fmt readers)\n | Lit_padding (Left, _), _ ->\n invalid_arg \"scanf: bad conversion \\\"%-\\\"\"\n | Lit_padding ((Right | Zeros), _), Arg_precision ->\n invalid_arg \"scanf: bad conversion \\\"%*\\\"\"\n | Arg_padding _, _ ->\n invalid_arg \"scanf: bad conversion \\\"%*\\\"\"\n | No_padding, Arg_precision ->\n invalid_arg \"scanf: bad conversion \\\"%*\\\"\"\n\n(******************************************************************************)\n (* Defining [scanf] and various flavors of [scanf] *)\n\nlet kscanf_gen ib ef af (Format (fmt, str)) =\n let rec apply : type a b . a -> (a, b) heter_list -> b =\n fun f args -> match args with\n | Cons (x, r) -> apply (f x) r\n | Nil -> f\n in\n let k readers f =\n Scanning.reset_token ib;\n match make_scanf ib fmt readers with\n | exception (Scan_failure _ | Failure _ | End_of_file as exc) ->\n ef ib exc\n | exception Invalid_argument msg ->\n invalid_arg (msg ^ \" in format \\\"\" ^ String.escaped str ^ \"\\\"\")\n | args ->\n af (apply f args)\n in\n take_format_readers k fmt\n\nlet kscanf ib ef fmt =\n kscanf_gen ib ef (fun x -> x) fmt\n\nlet kscanf_opt ib fmt =\n kscanf_gen ib (fun _ _ -> None) (fun x -> Some x) fmt\n\n(***)\n\nlet kbscanf = kscanf\nlet bscanf ib fmt = kbscanf ib scanf_bad_input fmt\nlet bscanf_opt ib fmt = kscanf_opt ib fmt\n\nlet ksscanf s ef fmt = kbscanf (Scanning.from_string s) ef fmt\nlet sscanf s fmt = kbscanf (Scanning.from_string s) scanf_bad_input fmt\nlet sscanf_opt s fmt = kscanf_opt (Scanning.from_string s) fmt\n\nlet scanf fmt = kscanf Scanning.stdin scanf_bad_input fmt\nlet scanf_opt fmt = kscanf_opt Scanning.stdin fmt\n\n(***)\n\n(* Scanning format strings. *)\nlet bscanf_format :\n Scanning.in_channel -> ('a, 'b, 'c, 'd, 'e, 'f) format6 ->\n (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g =\n fun ib format f ->\n let _ = scan_caml_string max_int ib in\n let str = token_string ib in\n let fmt' =\n try format_of_string_format str format\n with Failure msg -> bad_input msg in\n f fmt'\n\n\nlet sscanf_format :\n string -> ('a, 'b, 'c, 'd, 'e, 'f) format6 ->\n (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g =\n fun s format f -> bscanf_format (Scanning.from_string s) format f\n\n\nlet format_from_string s fmt =\n sscanf_format (\"\\\"\" ^ String.escaped s ^ \"\\\"\") fmt (fun x -> x)\n\n\nlet unescaped s =\n sscanf (\"\\\"\" ^ s ^ \"\\\"\") \"%S%!\" (fun x -> x)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":336397},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/callback.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Registering OCaml values with the C runtime for later callbacks *)\n\nexternal register_named_value : string -> Obj.t -> unit\n = \"caml_register_named_value\"\n\nlet register name v =\n register_named_value name (Obj.repr v)\n\nlet register_exception name (exn : exn) =\n let exn = Obj.repr exn in\n let slot = if Obj.tag exn = Obj.object_tag then exn else Obj.field exn 0 in\n register_named_value name slot\n","(* generated code *)"],"names":[],"mappings":"OAwBE,UACc,IAAW,oC,CAAA,EAAgC,U,CAAA,6BAAe,GACxE,MAA8B,C,EAL9B,MAAsC,C,ECrBxC,sB,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":336594},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/camlinternalOO.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Jerome Vouillon, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2002 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(**** Object representation ****)\n\nexternal set_id: 'a -> 'a = \"caml_set_oo_id\" [@@noalloc]\n\n(**** Object copy ****)\n\nlet copy o =\n let o = (Obj.obj (Obj.dup (Obj.repr o))) in\n set_id o\n\n(**** Compression options ****)\n(* Parameters *)\ntype params = {\n mutable compact_table : bool;\n mutable copy_parent : bool;\n mutable clean_when_copying : bool;\n mutable retry_count : int;\n mutable bucket_small_size : int\n }\n\nlet params = {\n compact_table = true;\n copy_parent = true;\n clean_when_copying = true;\n retry_count = 3;\n bucket_small_size = 16\n}\n\n(**** Parameters ****)\n\nlet initial_object_size = 2\n\n(**** Items ****)\n\ntype item = DummyA | DummyB | DummyC of int\nlet _ = [DummyA; DummyB; DummyC 0] (* to avoid warnings *)\n\nlet dummy_item = (Obj.magic () : item)\n\n(**** Types ****)\n\ntype tag\ntype label = int\ntype closure = item\ntype t = DummyA | DummyB | DummyC of int\nlet _ = [DummyA; DummyB; DummyC 0] (* to avoid warnings *)\n\ntype obj = t array\nexternal ret : (obj -> 'a) -> closure = \"%identity\"\n\n(**** Labels ****)\n\nlet public_method_label s : tag =\n let accu = ref 0 in\n for i = 0 to String.length s - 1 do\n accu := 223 * !accu + Char.code s.[i]\n done;\n (* reduce to 31 bits *)\n accu := !accu land (1 lsl 31 - 1);\n (* make it signed for 64 bits architectures *)\n let tag = if !accu > 0x3FFFFFFF then !accu - (1 lsl 31) else !accu in\n (* Printf.eprintf \"%s = %d\\n\" s tag; flush stderr; *)\n Obj.magic tag\n\n(**** Sparse array ****)\n\nmodule Vars =\n Map.Make(struct type t = string let compare (x:t) y = compare x y end)\ntype vars = int Vars.t\n\nmodule Meths =\n Map.Make(struct type t = string let compare (x:t) y = compare x y end)\ntype meths = label Meths.t\nmodule Labs =\n Map.Make(struct type t = label let compare (x:t) y = compare x y end)\ntype labs = bool Labs.t\n\n(* The compiler assumes that the first field of this structure is [size]. *)\ntype table =\n { mutable size: int;\n mutable methods: closure array;\n mutable methods_by_name: meths;\n mutable methods_by_label: labs;\n mutable previous_states:\n (meths * labs * (label * item) list * vars *\n label list * string list) list;\n mutable hidden_meths: (label * item) list;\n mutable vars: vars;\n mutable initializers: (obj -> unit) list }\n\nlet dummy_table =\n { methods = [| dummy_item |];\n methods_by_name = Meths.empty;\n methods_by_label = Labs.empty;\n previous_states = [];\n hidden_meths = [];\n vars = Vars.empty;\n initializers = [];\n size = 0 }\n\nlet table_count = ref 0\n\n(* dummy_met should be a pointer, so use an atom *)\nlet dummy_met : item = Obj.obj (Obj.new_block 0 0)\n(* if debugging is needed, this could be a good idea: *)\n(* let dummy_met () = failwith \"Undefined method\" *)\n\nlet rec fit_size n =\n if n <= 2 then n else\n fit_size ((n+1)/2) * 2\n\nlet new_table pub_labels =\n incr table_count;\n let len = Array.length pub_labels in\n let methods = Array.make (len*2+2) dummy_met in\n methods.(0) <- Obj.magic len;\n methods.(1) <- Obj.magic (fit_size len * Sys.word_size / 8 - 1);\n for i = 0 to len - 1 do methods.(i*2+3) <- Obj.magic pub_labels.(i) done;\n { methods = methods;\n methods_by_name = Meths.empty;\n methods_by_label = Labs.empty;\n previous_states = [];\n hidden_meths = [];\n vars = Vars.empty;\n initializers = [];\n size = initial_object_size }\n\nlet resize array new_size =\n let old_size = Array.length array.methods in\n if new_size > old_size then begin\n let new_buck = Array.make new_size dummy_met in\n Array.blit array.methods 0 new_buck 0 old_size;\n array.methods <- new_buck\n end\n\nlet put array label element =\n resize array (label + 1);\n array.methods.(label) <- element\n\n(**** Classes ****)\n\nlet method_count = ref 0\nlet inst_var_count = ref 0\n\n(* type t *)\ntype meth = item\n\nlet new_method table =\n let index = Array.length table.methods in\n resize table (index + 1);\n index\n\nlet get_method_label table name =\n try\n Meths.find name table.methods_by_name\n with Not_found ->\n let label = new_method table in\n table.methods_by_name <- Meths.add name label table.methods_by_name;\n table.methods_by_label <- Labs.add label true table.methods_by_label;\n label\n\nlet get_method_labels table names =\n Array.map (get_method_label table) names\n\nlet set_method table label element =\n incr method_count;\n if Labs.find label table.methods_by_label then\n put table label element\n else\n table.hidden_meths <- (label, element) :: table.hidden_meths\n\nlet get_method table label =\n try List.assoc label table.hidden_meths\n with Not_found -> table.methods.(label)\n\nlet to_list arr =\n if arr == Obj.magic 0 then [] else Array.to_list arr\n\nlet narrow table vars virt_meths concr_meths =\n let vars = to_list vars\n and virt_meths = to_list virt_meths\n and concr_meths = to_list concr_meths in\n let virt_meth_labs = List.map (get_method_label table) virt_meths in\n let concr_meth_labs = List.map (get_method_label table) concr_meths in\n table.previous_states <-\n (table.methods_by_name, table.methods_by_label, table.hidden_meths,\n table.vars, virt_meth_labs, vars)\n :: table.previous_states;\n table.vars <-\n Vars.fold\n (fun lab info tvars ->\n if List.mem lab vars then Vars.add lab info tvars else tvars)\n table.vars Vars.empty;\n let by_name = ref Meths.empty in\n let by_label = ref Labs.empty in\n List.iter2\n (fun met label ->\n by_name := Meths.add met label !by_name;\n by_label :=\n Labs.add label\n (try Labs.find label table.methods_by_label with Not_found -> true)\n !by_label)\n concr_meths concr_meth_labs;\n List.iter2\n (fun met label ->\n by_name := Meths.add met label !by_name;\n by_label := Labs.add label false !by_label)\n virt_meths virt_meth_labs;\n table.methods_by_name <- !by_name;\n table.methods_by_label <- !by_label;\n table.hidden_meths <-\n List.fold_right\n (fun ((lab, _) as met) hm ->\n if List.mem lab virt_meth_labs then hm else met::hm)\n table.hidden_meths\n []\n\nlet widen table =\n let (by_name, by_label, saved_hidden_meths, saved_vars, virt_meths, vars) =\n List.hd table.previous_states\n in\n table.previous_states <- List.tl table.previous_states;\n table.vars <-\n List.fold_left\n (fun s v -> Vars.add v (Vars.find v table.vars) s)\n saved_vars vars;\n table.methods_by_name <- by_name;\n table.methods_by_label <- by_label;\n table.hidden_meths <-\n List.fold_right\n (fun ((lab, _) as met) hm ->\n if List.mem lab virt_meths then hm else met::hm)\n table.hidden_meths\n saved_hidden_meths\n\nlet new_slot table =\n let index = table.size in\n table.size <- index + 1;\n index\n\nlet new_variable table name =\n try Vars.find name table.vars\n with Not_found ->\n let index = new_slot table in\n if name <> \"\" then table.vars <- Vars.add name index table.vars;\n index\n\nlet to_array arr =\n if arr = Obj.magic 0 then [||] else arr\n\nlet new_methods_variables table meths vals =\n let meths = to_array meths in\n let nmeths = Array.length meths and nvals = Array.length vals in\n let res = Array.make (nmeths + nvals) 0 in\n for i = 0 to nmeths - 1 do\n res.(i) <- get_method_label table meths.(i)\n done;\n for i = 0 to nvals - 1 do\n res.(i+nmeths) <- new_variable table vals.(i)\n done;\n res\n\nlet get_variable table name =\n try Vars.find name table.vars with Not_found -> assert false\n\nlet get_variables table names =\n Array.map (get_variable table) names\n\nlet add_initializer table f =\n table.initializers <- f::table.initializers\n\n(*\nmodule Keys =\n Map.Make(struct type t = tag array let compare (x:t) y = compare x y end)\nlet key_map = ref Keys.empty\nlet get_key tags : item =\n try magic (Keys.find tags !key_map : tag array)\n with Not_found ->\n key_map := Keys.add tags tags !key_map;\n magic tags\n*)\n\nlet create_table public_methods =\n if public_methods == Obj.magic 0 then new_table [||] else\n (* [public_methods] must be in ascending order for bytecode *)\n let tags = Array.map public_method_label public_methods in\n let table = new_table tags in\n Array.iteri\n (fun i met ->\n let lab = i*2+2 in\n table.methods_by_name <- Meths.add met lab table.methods_by_name;\n table.methods_by_label <- Labs.add lab true table.methods_by_label)\n public_methods;\n table\n\nlet init_class table =\n inst_var_count := !inst_var_count + table.size - 1;\n table.initializers <- List.rev table.initializers;\n resize table (3 + Obj.magic table.methods.(1) * 16 / Sys.word_size)\n\nlet inherits cla vals virt_meths concr_meths (_, super, _, env) top =\n narrow cla vals virt_meths concr_meths;\n let init =\n if top then super cla env else Obj.repr (super cla) in\n widen cla;\n Array.concat\n [[| Obj.repr init |];\n Obj.magic (Array.map (get_variable cla) (to_array vals) : int array);\n Array.map\n (fun nm -> Obj.repr (get_method cla (get_method_label cla nm) : closure))\n (to_array concr_meths) ]\n\nlet make_class pub_meths class_init =\n let table = create_table pub_meths in\n let env_init = class_init table in\n init_class table;\n (env_init (Obj.repr 0), class_init, env_init, Obj.repr 0)\n\ntype init_table = { mutable env_init: t; mutable class_init: table -> t }\n[@@warning \"-unused-field\"]\n\nlet make_class_store pub_meths class_init init_table =\n let table = create_table pub_meths in\n let env_init = class_init table in\n init_class table;\n init_table.class_init <- class_init;\n init_table.env_init <- env_init\n\nlet dummy_class loc =\n let undef = fun _ -> raise (Undefined_recursive_module loc) in\n (Obj.magic undef, undef, undef, Obj.repr 0)\n\n(**** Objects ****)\n\nlet create_object table =\n (* XXX Appel de [obj_block] | Call to [obj_block] *)\n let obj = Obj.new_block Obj.object_tag table.size in\n (* XXX Appel de [caml_modify] | Call to [caml_modify] *)\n Obj.set_field obj 0 (Obj.repr table.methods);\n Obj.obj (set_id obj)\n\nlet create_object_opt obj_0 table =\n if (Obj.magic obj_0 : bool) then obj_0 else begin\n (* XXX Appel de [obj_block] | Call to [obj_block] *)\n let obj = Obj.new_block Obj.object_tag table.size in\n (* XXX Appel de [caml_modify] | Call to [caml_modify] *)\n Obj.set_field obj 0 (Obj.repr table.methods);\n Obj.obj (set_id obj)\n end\n\nlet rec iter_f obj =\n function\n [] -> ()\n | f::l -> f obj; iter_f obj l\n\nlet run_initializers obj table =\n let inits = table.initializers in\n if inits <> [] then\n iter_f obj inits\n\nlet run_initializers_opt obj_0 obj table =\n if (Obj.magic obj_0 : bool) then obj else begin\n let inits = table.initializers in\n if inits <> [] then iter_f obj inits;\n obj\n end\n\nlet create_object_and_run_initializers obj_0 table =\n if (Obj.magic obj_0 : bool) then obj_0 else begin\n let obj = create_object table in\n run_initializers obj table;\n obj\n end\n\n(* Equivalent primitive below\nlet sendself obj lab =\n (magic obj : (obj -> t) array array).(0).(lab) obj\n*)\nexternal send : obj -> tag -> 'a = \"%send\"\nexternal sendcache : obj -> tag -> t -> int -> 'a = \"%sendcache\"\nexternal sendself : obj -> label -> 'a = \"%sendself\"\nexternal get_public_method : obj -> tag -> closure\n = \"caml_get_public_method\" [@@noalloc]\n\n(**** table collection access ****)\n\ntype tables =\n | Empty\n | Cons of {key : closure; mutable data: tables; mutable next: tables}\n\nlet set_data tables v = match tables with\n | Empty -> assert false\n | Cons tables -> tables.data <- v\nlet set_next tables v = match tables with\n | Empty -> assert false\n | Cons tables -> tables.next <- v\nlet get_key = function\n | Empty -> assert false\n | Cons tables -> tables.key\nlet get_data = function\n | Empty -> assert false\n | Cons tables -> tables.data\nlet get_next = function\n | Empty -> assert false\n | Cons tables -> tables.next\n\nlet build_path n keys tables =\n let res = Cons {key = Obj.magic 0; data = Empty; next = Empty} in\n let r = ref res in\n for i = 0 to n do\n r := Cons {key = keys.(i); data = !r; next = Empty}\n done;\n set_data tables !r;\n res\n\nlet rec lookup_keys i keys tables =\n if i < 0 then tables else\n let key = keys.(i) in\n let rec lookup_key (tables:tables) =\n if get_key tables == key then\n match get_data tables with\n | Empty -> assert false\n | Cons _ as tables_data ->\n lookup_keys (i-1) keys tables_data\n else\n match get_next tables with\n | Cons _ as next -> lookup_key next\n | Empty ->\n let next : tables = Cons {key; data = Empty; next = Empty} in\n set_next tables next;\n build_path (i-1) keys next\n in\n lookup_key tables\n\nlet lookup_tables root keys =\n match get_data root with\n | Cons _ as root_data ->\n lookup_keys (Array.length keys - 1) keys root_data\n | Empty ->\n build_path (Array.length keys - 1) keys root\n\n(**** builtin methods ****)\n\nlet get_const x = ret (fun _obj -> x)\nlet get_var n = ret (fun obj -> Array.unsafe_get obj n)\nlet get_env e n =\n ret (fun obj ->\n Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n)\nlet get_meth n = ret (fun obj -> sendself obj n)\nlet set_var n = ret (fun obj x -> Array.unsafe_set obj n x)\nlet app_const f x = ret (fun _obj -> f x)\nlet app_var f n = ret (fun obj -> f (Array.unsafe_get obj n))\nlet app_env f e n =\n ret (fun obj ->\n f (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n))\nlet app_meth f n = ret (fun obj -> f (sendself obj n))\nlet app_const_const f x y = ret (fun _obj -> f x y)\nlet app_const_var f x n = ret (fun obj -> f x (Array.unsafe_get obj n))\nlet app_const_meth f x n = ret (fun obj -> f x (sendself obj n))\nlet app_var_const f n x = ret (fun obj -> f (Array.unsafe_get obj n) x)\nlet app_meth_const f n x = ret (fun obj -> f (sendself obj n) x)\nlet app_const_env f x e n =\n ret (fun obj ->\n f x (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n))\nlet app_env_const f e n x =\n ret (fun obj ->\n f (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) n) x)\nlet meth_app_const n x = ret (fun obj -> (sendself obj n : _ -> _) x)\nlet meth_app_var n m =\n ret (fun obj -> (sendself obj n : _ -> _) (Array.unsafe_get obj m))\nlet meth_app_env n e m =\n ret (fun obj -> (sendself obj n : _ -> _)\n (Array.unsafe_get (Obj.magic (Array.unsafe_get obj e) : obj) m))\nlet meth_app_meth n m =\n ret (fun obj -> (sendself obj n : _ -> _) (sendself obj m))\nlet send_const m x c =\n ret (fun obj -> sendcache x m (Array.unsafe_get obj 0) c)\nlet send_var m n c =\n ret (fun obj ->\n sendcache (Obj.magic (Array.unsafe_get obj n) : obj) m\n (Array.unsafe_get obj 0) c)\nlet send_env m e n c =\n ret (fun obj ->\n sendcache\n (Obj.magic (Array.unsafe_get\n (Obj.magic (Array.unsafe_get obj e) : obj) n) : obj)\n m (Array.unsafe_get obj 0) c)\nlet send_meth m n c =\n ret (fun obj ->\n sendcache (sendself obj n) m (Array.unsafe_get obj 0) c)\nlet new_cache table =\n let n = new_method table in\n let n =\n if n mod 2 = 0 || n > 2 + Obj.magic table.methods.(1) * 16 / Sys.word_size\n then n else new_method table\n in\n table.methods.(n) <- Obj.magic 0;\n n\n\ntype impl =\n GetConst\n | GetVar\n | GetEnv\n | GetMeth\n | SetVar\n | AppConst\n | AppVar\n | AppEnv\n | AppMeth\n | AppConstConst\n | AppConstVar\n | AppConstEnv\n | AppConstMeth\n | AppVarConst\n | AppEnvConst\n | AppMethConst\n | MethAppConst\n | MethAppVar\n | MethAppEnv\n | MethAppMeth\n | SendConst\n | SendVar\n | SendEnv\n | SendMeth\n | Closure of closure\n\nlet method_impl table i arr =\n let next () = incr i; Obj.magic arr.(!i) in\n match next() with\n GetConst -> let x : t = next() in get_const x\n | GetVar -> let n = next() in get_var n\n | GetEnv -> let e = next() in let n = next() in get_env e n\n | GetMeth -> let n = next() in get_meth n\n | SetVar -> let n = next() in set_var n\n | AppConst -> let f = next() in let x = next() in app_const f x\n | AppVar -> let f = next() in let n = next () in app_var f n\n | AppEnv ->\n let f = next() in let e = next() in let n = next() in\n app_env f e n\n | AppMeth -> let f = next() in let n = next () in app_meth f n\n | AppConstConst ->\n let f = next() in let x = next() in let y = next() in\n app_const_const f x y\n | AppConstVar ->\n let f = next() in let x = next() in let n = next() in\n app_const_var f x n\n | AppConstEnv ->\n let f = next() in let x = next() in let e = next () in let n = next() in\n app_const_env f x e n\n | AppConstMeth ->\n let f = next() in let x = next() in let n = next() in\n app_const_meth f x n\n | AppVarConst ->\n let f = next() in let n = next() in let x = next() in\n app_var_const f n x\n | AppEnvConst ->\n let f = next() in let e = next () in let n = next() in let x = next() in\n app_env_const f e n x\n | AppMethConst ->\n let f = next() in let n = next() in let x = next() in\n app_meth_const f n x\n | MethAppConst ->\n let n = next() in let x = next() in meth_app_const n x\n | MethAppVar ->\n let n = next() in let m = next() in meth_app_var n m\n | MethAppEnv ->\n let n = next() in let e = next() in let m = next() in\n meth_app_env n e m\n | MethAppMeth ->\n let n = next() in let m = next() in meth_app_meth n m\n | SendConst ->\n let m = next() in let x = next() in send_const m x (new_cache table)\n | SendVar ->\n let m = next() in let n = next () in send_var m n (new_cache table)\n | SendEnv ->\n let m = next() in let e = next() in let n = next() in\n send_env m e n (new_cache table)\n | SendMeth ->\n let m = next() in let n = next () in send_meth m n (new_cache table)\n | Closure _ as clo -> Obj.magic clo\n\nlet set_methods table methods =\n let len = Array.length methods in let i = ref 0 in\n while !i < len do\n let label = methods.(!i) in let clo = method_impl table i methods in\n set_method table label clo;\n incr i\n done\n\n(**** Statistics ****)\n\ntype stats =\n { classes: int; methods: int; inst_vars: int; }\n\nlet stats () =\n { classes = !table_count;\n methods = !method_count; inst_vars = !inst_var_count; }\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":346518},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/camlinternalMod.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2004 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype shape =\n | Function\n | Lazy\n | Class\n | Module of shape array\n | Value of Obj.t\n\nlet rec init_mod_field modu i loc shape =\n let init =\n match shape with\n | Function ->\n let rec fn (x : 'a) =\n let fn' : 'a -> 'b = Obj.obj (Obj.field modu i) in\n if fn == fn' then\n raise (Undefined_recursive_module loc)\n else\n fn' x in\n Obj.repr fn\n | Lazy ->\n let rec l =\n lazy (\n let l' = Obj.obj (Obj.field modu i) in\n if l == l' then\n raise (Undefined_recursive_module loc)\n else\n Lazy.force l') in\n Obj.repr l\n | Class ->\n Obj.repr (CamlinternalOO.dummy_class loc)\n | Module comps ->\n Obj.repr (init_mod_block loc comps)\n | Value v -> v\n in\n Obj.set_field modu i init\n\nand init_mod_block loc comps =\n let length = Array.length comps in\n let modu = Obj.new_block 0 length in\n for i = 0 to length - 1 do\n init_mod_field modu i loc comps.(i)\n done;\n modu\n\nlet init_mod loc shape =\n match shape with\n | Module comps ->\n Obj.repr (init_mod_block loc comps)\n | _ -> failwith \"CamlinternalMod.init_mod: not a module\"\n\nlet rec update_mod_field modu i shape n =\n match shape with\n | Function | Lazy ->\n Obj.set_field modu i n\n | Value _ ->\n () (* the value is already there *)\n | Class ->\n assert (Obj.tag n = 0 && Obj.size n = 4);\n let cl = Obj.field modu i in\n for j = 0 to 3 do\n Obj.set_field cl j (Obj.field n j)\n done\n | Module comps ->\n update_mod_block comps (Obj.field modu i) n\n\nand update_mod_block comps o n =\n assert (Obj.tag n = 0 && Obj.size n >= Array.length comps);\n for i = 0 to Array.length comps - 1 do\n update_mod_field o i comps.(i) (Obj.field n i)\n done\n\nlet update_mod shape o n =\n match shape with\n | Module comps ->\n update_mod_block comps o n\n | _ -> failwith \"CamlinternalMod.update_mod: not a module\"\n","(* generated code *)"],"names":[],"mappings":"KAsFE,K,CAAA,4BAEG,YACI,uBAAmD,C,eAxB1D,gBAMoB,IAAT,IAAS,sCACR,mDACT,MACE,UAAmB,kDAAnB,iDAAkC,wB,KAAA,gBAPpC,wDAAsB,8BAUC,iDAAkB,MARzC,IAQ2C,C,WAGtC,EAAS,IAAT,IAAS,kEACjB,6CACiC,oDAAV,uBAArB,MAAqB,gBAArB,MAA8C,iDAC5C,C,KAxBJ,K,CAAA,qBAEG,EAFH,OAEG,KACI,uBAAiD,C,cAnCpB,U,IAAA,Q,CAAA,iDAC7B,I,CAAA,kB,CAAA,Y,CAAA,MACE,a,CAAA,WAEA,kB,CAAK,C,SAKY,W,IAAA,S,CAAA,kDACjB,I,CAAA,4CACE,a,CAAA,YAEA,kC,CAAA,U,CAAA,iC,WAYA,IADX,gCACW,MADX,EAEA,qBAC4B,yCA/B5B,K,EAAA,mBAoBc,EAAT,QAAS,aAAgC,KATzC,qCAOA,GAfA,YAMA,wBAaS,EAbT,OAaS,IAA0B,Q,GAGxC,yDAMqC,yBAErC,OAAI,C,ECxDN,sB,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":348318},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/ephemeron.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Damien Doligez, projet Para, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1997 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nmodule type SeededS = sig\n\n type key\n type !'a t\n val create : ?random (*thwart tools/sync_stdlib_docs*) : bool -> int -> 'a t\n val clear : 'a t -> unit\n val reset : 'a t -> unit\n val copy : 'a t -> 'a t\n val add : 'a t -> key -> 'a -> unit\n val remove : 'a t -> key -> unit\n val find : 'a t -> key -> 'a\n val find_opt : 'a t -> key -> 'a option\n val find_all : 'a t -> key -> 'a list\n val replace : 'a t -> key -> 'a -> unit\n val mem : 'a t -> key -> bool\n val length : 'a t -> int\n val stats : 'a t -> Hashtbl.statistics\n val add_seq : 'a t -> (key * 'a) Seq.t -> unit\n val replace_seq : 'a t -> (key * 'a) Seq.t -> unit\n val of_seq : (key * 'a) Seq.t -> 'a t\n val clean: 'a t -> unit\n val stats_alive: 'a t -> Hashtbl.statistics\n (** same as {!stats} but only count the alive bindings *)\nend\n\nmodule type S = sig\n\n type key\n type !'a t\n val create : int -> 'a t\n val clear : 'a t -> unit\n val reset : 'a t -> unit\n val copy : 'a t -> 'a t\n val add : 'a t -> key -> 'a -> unit\n val remove : 'a t -> key -> unit\n val find : 'a t -> key -> 'a\n val find_opt : 'a t -> key -> 'a option\n val find_all : 'a t -> key -> 'a list\n val replace : 'a t -> key -> 'a -> unit\n val mem : 'a t -> key -> bool\n val length : 'a t -> int\n val stats : 'a t -> Hashtbl.statistics\n val add_seq : 'a t -> (key * 'a) Seq.t -> unit\n val replace_seq : 'a t -> (key * 'a) Seq.t -> unit\n val of_seq : (key * 'a) Seq.t -> 'a t\n val clean: 'a t -> unit\n val stats_alive: 'a t -> Hashtbl.statistics\n (** same as {!stats} but only count the alive bindings *)\nend\n\nmodule GenHashTable = struct\n\n type equal =\n | ETrue | EFalse\n | EDead (** the garbage collector reclaimed the data *)\n\n module MakeSeeded(H: sig\n type t\n type 'a container\n val create: t -> 'a -> 'a container\n val seeded_hash: int -> t -> int\n val equal: 'a container -> t -> equal\n val get_data: 'a container -> 'a option\n val set_key_data: 'a container -> t -> 'a -> unit\n val check_key: 'a container -> bool\n end) : SeededS with type key = H.t\n = struct\n\n type 'a t =\n { mutable size: int; (* number of entries *)\n mutable data: 'a bucketlist array; (* the buckets *)\n seed: int; (* for randomization *)\n initial_size: int; (* initial array size *)\n }\n\n and 'a bucketlist =\n | Empty\n | Cons of int (* hash of the key *) * 'a H.container * 'a bucketlist\n\n (** the hash of the key is kept in order to test the equality of the hash\n before the key. Same reason as for Weak.Make *)\n\n type key = H.t\n\n let rec power_2_above x n =\n if x >= n then x\n else if x * 2 > Sys.max_array_length then x\n else power_2_above (x * 2) n\n\n let prng = lazy (Random.State.make_self_init())\n\n let create ?(random = (Hashtbl.is_randomized ())) initial_size =\n let s = power_2_above 16 initial_size in\n let seed = if random then Random.State.bits (Lazy.force prng) else 0 in\n { initial_size = s; size = 0; seed = seed; data = Array.make s Empty }\n\n let clear h =\n h.size <- 0;\n let len = Array.length h.data in\n for i = 0 to len - 1 do\n h.data.(i) <- Empty\n done\n\n let reset h =\n let len = Array.length h.data in\n if len = h.initial_size then\n clear h\n else begin\n h.size <- 0;\n h.data <- Array.make h.initial_size Empty\n end\n\n let copy h = { h with data = Array.copy h.data }\n\n let key_index h hkey =\n hkey land (Array.length h.data - 1)\n\n let clean h =\n let rec do_bucket = function\n | Empty ->\n Empty\n | Cons(_, c, rest) when not (H.check_key c) ->\n h.size <- h.size - 1;\n do_bucket rest\n | Cons(hkey, c, rest) ->\n Cons(hkey, c, do_bucket rest)\n in\n let d = h.data in\n for i = 0 to Array.length d - 1 do\n d.(i) <- do_bucket d.(i)\n done\n\n (** resize is the only function to do the actual cleaning of dead keys\n (remove does it just because it could).\n\n The goal is to:\n\n - not resize infinitely when the actual number of alive keys is\n bounded but keys are continuously added. That would happen if\n this function always resize.\n - not call this function after each addition, that would happen if this\n function don't resize even when only one key is dead.\n\n So the algorithm:\n - clean the keys before resizing\n - if the number of remaining keys is less than half the size of the\n array, don't resize.\n - if it is more, resize.\n\n The second problem remains if the table reaches {!Sys.max_array_length}.\n\n *)\n let resize h =\n let odata = h.data in\n let osize = Array.length odata in\n let nsize = osize * 2 in\n clean h;\n if nsize < Sys.max_array_length && h.size >= osize lsr 1 then begin\n let ndata = Array.make nsize Empty in\n h.data <- ndata; (* so that key_index sees the new bucket count *)\n let rec insert_bucket = function\n Empty -> ()\n | Cons(hkey, data, rest) ->\n insert_bucket rest; (* preserve original order of elements *)\n let nidx = key_index h hkey in\n ndata.(nidx) <- Cons(hkey, data, ndata.(nidx)) in\n for i = 0 to osize - 1 do\n insert_bucket odata.(i)\n done\n end\n\n let add h key info =\n let hkey = H.seeded_hash h.seed key in\n let i = key_index h hkey in\n let container = H.create key info in\n let bucket = Cons(hkey, container, h.data.(i)) in\n h.data.(i) <- bucket;\n h.size <- h.size + 1;\n if h.size > Array.length h.data lsl 1 then resize h\n\n let remove h key =\n let hkey = H.seeded_hash h.seed key in\n let rec remove_bucket = function\n | Empty -> Empty\n | Cons(hk, c, next) when hkey = hk ->\n begin match H.equal c key with\n | ETrue -> h.size <- h.size - 1; next\n | EFalse -> Cons(hk, c, remove_bucket next)\n | EDead ->\n (* The dead key is automatically removed. It is acceptable\n for this function since it already removes a binding *)\n h.size <- h.size - 1;\n remove_bucket next\n end\n | Cons(hk,c,next) -> Cons(hk, c, remove_bucket next) in\n let i = key_index h hkey in\n h.data.(i) <- remove_bucket h.data.(i)\n\n (** {!find} don't remove dead keys because it would be surprising for\n the user that a read-only function mutates the state (eg. concurrent\n access). Same for {!mem}.\n *)\n let rec find_rec key hkey = function\n | Empty ->\n raise Not_found\n | Cons(hk, c, rest) when hkey = hk ->\n begin match H.equal c key with\n | ETrue ->\n begin match H.get_data c with\n | None ->\n (* This case is not impossible because the gc can run between\n H.equal and H.get_data *)\n find_rec key hkey rest\n | Some d -> d\n end\n | EFalse -> find_rec key hkey rest\n | EDead ->\n find_rec key hkey rest\n end\n | Cons(_, _, rest) ->\n find_rec key hkey rest\n\n let find h key =\n let hkey = H.seeded_hash h.seed key in\n (* TODO inline 3 iterations *)\n find_rec key hkey (h.data.(key_index h hkey))\n\n let rec find_rec_opt key hkey = function\n | Empty ->\n None\n | Cons(hk, c, rest) when hkey = hk ->\n begin match H.equal c key with\n | ETrue ->\n begin match H.get_data c with\n | None ->\n (* This case is not impossible because the gc can run between\n H.equal and H.get_data *)\n find_rec_opt key hkey rest\n | Some _ as d -> d\n end\n | EFalse -> find_rec_opt key hkey rest\n | EDead ->\n find_rec_opt key hkey rest\n end\n | Cons(_, _, rest) ->\n find_rec_opt key hkey rest\n\n let find_opt h key =\n let hkey = H.seeded_hash h.seed key in\n (* TODO inline 3 iterations *)\n find_rec_opt key hkey (h.data.(key_index h hkey))\n\n let find_all h key =\n let hkey = H.seeded_hash h.seed key in\n let rec find_in_bucket = function\n | Empty -> []\n | Cons(hk, c, rest) when hkey = hk ->\n begin match H.equal c key with\n | ETrue -> begin match H.get_data c with\n | None ->\n find_in_bucket rest\n | Some d -> d::find_in_bucket rest\n end\n | EFalse -> find_in_bucket rest\n | EDead ->\n find_in_bucket rest\n end\n | Cons(_, _, rest) ->\n find_in_bucket rest in\n find_in_bucket h.data.(key_index h hkey)\n\n\n let replace h key info =\n let hkey = H.seeded_hash h.seed key in\n let rec replace_bucket = function\n | Empty -> raise Not_found\n | Cons(hk, c, next) when hkey = hk ->\n begin match H.equal c key with\n | ETrue -> H.set_key_data c key info\n | EFalse | EDead -> replace_bucket next\n end\n | Cons(_,_,next) -> replace_bucket next\n in\n let i = key_index h hkey in\n let l = h.data.(i) in\n try\n replace_bucket l\n with Not_found ->\n let container = H.create key info in\n h.data.(i) <- Cons(hkey, container, l);\n h.size <- h.size + 1;\n if h.size > Array.length h.data lsl 1 then resize h\n\n let mem h key =\n let hkey = H.seeded_hash h.seed key in\n let rec mem_in_bucket = function\n | Empty ->\n false\n | Cons(hk, c, rest) when hk = hkey ->\n begin match H.equal c key with\n | ETrue -> true\n | EFalse | EDead -> mem_in_bucket rest\n end\n | Cons(_hk, _c, rest) -> mem_in_bucket rest in\n mem_in_bucket h.data.(key_index h hkey)\n\n let length h = h.size\n\n let rec bucket_length accu = function\n | Empty -> accu\n | Cons(_, _, rest) -> bucket_length (accu + 1) rest\n\n let stats h =\n let mbl =\n Array.fold_left (fun m b -> Int.max m (bucket_length 0 b)) 0 h.data in\n let histo = Array.make (mbl + 1) 0 in\n Array.iter\n (fun b ->\n let l = bucket_length 0 b in\n histo.(l) <- histo.(l) + 1)\n h.data;\n { Hashtbl.num_bindings = h.size;\n num_buckets = Array.length h.data;\n max_bucket_length = mbl;\n bucket_histogram = histo }\n\n let rec bucket_length_alive accu = function\n | Empty -> accu\n | Cons(_, c, rest) when H.check_key c ->\n bucket_length_alive (accu + 1) rest\n | Cons(_, _, rest) -> bucket_length_alive accu rest\n\n let stats_alive h =\n let size = ref 0 in\n let mbl =\n Array.fold_left\n (fun m b -> Int.max m (bucket_length_alive 0 b)) 0 h.data\n in\n let histo = Array.make (mbl + 1) 0 in\n Array.iter\n (fun b ->\n let l = bucket_length_alive 0 b in\n size := !size + l;\n histo.(l) <- histo.(l) + 1)\n h.data;\n { Hashtbl.num_bindings = !size;\n num_buckets = Array.length h.data;\n max_bucket_length = mbl;\n bucket_histogram = histo }\n\n let add_seq tbl i =\n Seq.iter (fun (k,v) -> add tbl k v) i\n\n let replace_seq tbl i =\n Seq.iter (fun (k,v) -> replace tbl k v) i\n\n let of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n\n end\nend\n\nmodule ObjEph = Obj.Ephemeron\n\nlet _obj_opt : Obj.t option -> 'a option = fun x ->\n match x with\n | None -> x\n | Some v -> Some (Obj.obj v)\n\n(** The previous function is typed so this one is also correct *)\nlet obj_opt : Obj.t option -> 'a option = fun x -> Obj.magic x\n\n\nmodule K1 = struct\n type ('k,'d) t = ObjEph.t\n\n let create () : ('k,'d) t = ObjEph.create 1\n\n let get_key (t:('k,'d) t) : 'k option = obj_opt (ObjEph.get_key t 0)\n let set_key (t:('k,'d) t) (k:'k) : unit = ObjEph.set_key t 0 (Obj.repr k)\n let check_key (t:('k,'d) t) : bool = ObjEph.check_key t 0\n\n let get_data (t:('k,'d) t) : 'd option = obj_opt (ObjEph.get_data t)\n let set_data (t:('k,'d) t) (d:'d) : unit = ObjEph.set_data t (Obj.repr d)\n let unset_data (t:('k,'d) t) : unit = ObjEph.unset_data t\n\n let make key data =\n let eph = create () in\n set_data eph data;\n set_key eph key;\n eph\n\n let query eph key =\n match get_key eph with\n | None -> None\n | Some k when k == key -> get_data eph\n | Some _ -> None\n\n module MakeSeeded (H:Hashtbl.SeededHashedType) =\n GenHashTable.MakeSeeded(struct\n type 'a container = (H.t,'a) t\n type t = H.t\n let create k d =\n let c = create () in\n set_data c d;\n set_key c k;\n c\n let seeded_hash = H.seeded_hash\n let equal c k =\n (* {!get_key_copy} is not used because the equality of the user can be\n the physical equality *)\n match get_key c with\n | None -> GenHashTable.EDead\n | Some k' ->\n if H.equal k k' then GenHashTable.ETrue else GenHashTable.EFalse\n let get_data = get_data\n let set_key_data c k d =\n unset_data c;\n set_key c k;\n set_data c d\n let check_key = check_key\n end)\n\n module Make(H: Hashtbl.HashedType): (S with type key = H.t) =\n struct\n include MakeSeeded(struct\n type t = H.t\n let equal = H.equal\n let seeded_hash (_seed: int) x = H.hash x\n end)\n let create sz = create ~random:false sz\n let of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n end\n\n module Bucket = struct\n\n type nonrec ('k, 'd) t = ('k, 'd) t list ref\n let k1_make = make\n let make () = ref []\n let add b k d = b := k1_make k d :: !b\n\n let test_key k e =\n match get_key e with\n | Some x when x == k -> true\n | _ -> false\n\n let remove b k =\n let rec loop l acc =\n match l with\n | [] -> ()\n | h :: t when test_key k h -> b := List.rev_append acc t\n | h :: t -> loop t (h :: acc)\n in\n loop !b []\n\n let find b k =\n match List.find_opt (test_key k) !b with\n | Some e -> get_data e\n | None -> None\n\n let length b = List.length !b\n let clear b = b := []\n\n end\n\nend\n\nmodule K2 = struct\n type ('k1, 'k2, 'd) t = ObjEph.t\n\n let create () : ('k1,'k2,'d) t = ObjEph.create 2\n\n let get_key1 (t:('k1,'k2,'d) t) : 'k1 option = obj_opt (ObjEph.get_key t 0)\n let set_key1 (t:('k1,'k2,'d) t) (k:'k1) : unit =\n ObjEph.set_key t 0 (Obj.repr k)\n let check_key1 (t:('k1,'k2,'d) t) : bool = ObjEph.check_key t 0\n\n let get_key2 (t:('k1,'k2,'d) t) : 'k2 option = obj_opt (ObjEph.get_key t 1)\n let set_key2 (t:('k1,'k2,'d) t) (k:'k2) : unit =\n ObjEph.set_key t 1 (Obj.repr k)\n let check_key2 (t:('k1,'k2,'d) t) : bool = ObjEph.check_key t 1\n\n let get_data (t:('k1,'k2,'d) t) : 'd option = obj_opt (ObjEph.get_data t)\n let set_data (t:('k1,'k2,'d) t) (d:'d) : unit =\n ObjEph.set_data t (Obj.repr d)\n let unset_data (t:('k1,'k2,'d) t) : unit = ObjEph.unset_data t\n\n let make key1 key2 data =\n let eph = create () in\n set_data eph data;\n set_key1 eph key1;\n set_key2 eph key2;\n ignore (Sys.opaque_identity key1);\n eph\n\n let query eph key1 key2 =\n match get_key1 eph with\n | None -> None\n | Some k when k == key1 ->\n begin match get_key2 eph with\n | None -> None\n | Some k when k == key2 -> get_data eph\n | Some _ -> None\n end\n | Some _ -> None\n\n module MakeSeeded\n (H1:Hashtbl.SeededHashedType)\n (H2:Hashtbl.SeededHashedType) =\n GenHashTable.MakeSeeded(struct\n type 'a container = (H1.t,H2.t,'a) t\n type t = H1.t * H2.t\n let create (k1,k2) d =\n let c = create () in\n set_data c d;\n set_key1 c k1; set_key2 c k2;\n c\n let seeded_hash seed (k1,k2) =\n H1.seeded_hash seed k1 + H2.seeded_hash seed k2 * 65599\n let equal c (k1,k2) =\n match get_key1 c, get_key2 c with\n | None, _ | _ , None -> GenHashTable.EDead\n | Some k1', Some k2' ->\n if H1.equal k1 k1' && H2.equal k2 k2'\n then GenHashTable.ETrue else GenHashTable.EFalse\n let get_data = get_data\n let set_key_data c (k1,k2) d =\n unset_data c;\n set_key1 c k1; set_key2 c k2;\n set_data c d\n let check_key c = check_key1 c && check_key2 c\n end)\n\n module Make(H1: Hashtbl.HashedType)(H2: Hashtbl.HashedType):\n (S with type key = H1.t * H2.t) =\n struct\n include MakeSeeded\n (struct\n type t = H1.t\n let equal = H1.equal\n let seeded_hash (_seed: int) x = H1.hash x\n end)\n (struct\n type t = H2.t\n let equal = H2.equal\n let seeded_hash (_seed: int) x = H2.hash x\n end)\n let create sz = create ~random:false sz\n let of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n end\n\n module Bucket = struct\n\n type nonrec ('k1, 'k2, 'd) t = ('k1, 'k2, 'd) t list ref\n let k2_make = make\n let make () = ref []\n let add b k1 k2 d = b := k2_make k1 k2 d :: !b\n\n let test_keys k1 k2 e =\n match get_key1 e, get_key2 e with\n | Some x1, Some x2 when x1 == k1 && x2 == k2 -> true\n | _ -> false\n\n let remove b k1 k2 =\n let rec loop l acc =\n match l with\n | [] -> ()\n | h :: t when test_keys k1 k2 h -> b := List.rev_append acc t\n | h :: t -> loop t (h :: acc)\n in\n loop !b []\n\n let find b k1 k2 =\n match List.find_opt (test_keys k1 k2) !b with\n | Some e -> get_data e\n | None -> None\n\n let length b = List.length !b\n let clear b = b := []\n\n end\n\nend\n\nmodule Kn = struct\n type ('k,'d) t = ObjEph.t\n\n let create n : ('k,'d) t = ObjEph.create n\n let length (k:('k,'d) t) : int = ObjEph.length k\n\n let get_key (t:('k,'d) t) (n:int) : 'k option = obj_opt (ObjEph.get_key t n)\n let set_key (t:('k,'d) t) (n:int) (k:'k) : unit =\n ObjEph.set_key t n (Obj.repr k)\n let check_key (t:('k,'d) t) (n:int) : bool = ObjEph.check_key t n\n\n let get_data (t:('k,'d) t) : 'd option = obj_opt (ObjEph.get_data t)\n let set_data (t:('k,'d) t) (d:'d) : unit = ObjEph.set_data t (Obj.repr d)\n let unset_data (t:('k,'d) t) : unit = ObjEph.unset_data t\n\n let make keys data =\n let l = Array.length keys in\n let eph = create l in\n set_data eph data;\n for i = 0 to l - 1 do set_key eph i keys.(i) done;\n eph\n\n let query eph keys =\n let l = length eph in\n try\n if l <> Array.length keys then raise Exit;\n for i = 0 to l - 1 do\n match get_key eph i with\n | None -> raise Exit\n | Some k when k == keys.(i) -> ()\n | Some _ -> raise Exit\n done;\n get_data eph\n with Exit -> None\n\n module MakeSeeded (H:Hashtbl.SeededHashedType) =\n GenHashTable.MakeSeeded(struct\n type 'a container = (H.t,'a) t\n type t = H.t array\n let create k d =\n let c = create (Array.length k) in\n set_data c d;\n for i=0 to Array.length k -1 do\n set_key c i k.(i);\n done;\n c\n let seeded_hash seed k =\n let h = ref 0 in\n for i=0 to Array.length k -1 do\n h := H.seeded_hash seed k.(i) * 65599 + !h;\n done;\n !h\n let equal c k =\n let len = Array.length k in\n let len' = length c in\n if len != len' then GenHashTable.EFalse\n else\n let rec equal_array k c i =\n if i < 0 then GenHashTable.ETrue\n else\n match get_key c i with\n | None -> GenHashTable.EDead\n | Some ki ->\n if H.equal k.(i) ki\n then equal_array k c (i-1)\n else GenHashTable.EFalse\n in\n equal_array k c (len-1)\n let get_data = get_data\n let set_key_data c k d =\n unset_data c;\n for i=0 to Array.length k -1 do\n set_key c i k.(i);\n done;\n set_data c d\n let check_key c =\n let rec check c i =\n i < 0 || (check_key c i && check c (i-1)) in\n check c (length c - 1)\n end)\n\n module Make(H: Hashtbl.HashedType): (S with type key = H.t array) =\n struct\n include MakeSeeded(struct\n type t = H.t\n let equal = H.equal\n let seeded_hash (_seed: int) x = H.hash x\n end)\n let create sz = create ~random:false sz\n let of_seq i =\n let tbl = create 16 in\n replace_seq tbl i;\n tbl\n end\n\n module Bucket = struct\n\n type nonrec ('k, 'd) t = ('k, 'd) t list ref\n let kn_make = make\n let make () = ref []\n let add b k d = b := kn_make k d :: !b\n\n let test_keys k e =\n try\n if length e <> Array.length k then raise Exit;\n for i = 0 to Array.length k - 1 do\n match get_key e i with\n | Some x when x == k.(i) -> ()\n | _ -> raise Exit\n done;\n true\n with Exit -> false\n\n let remove b k =\n let rec loop l acc =\n match l with\n | [] -> ()\n | h :: t when test_keys k h -> b := List.rev_append acc t\n | h :: t -> loop t (h :: acc)\n in\n loop !b []\n\n let find b k =\n match List.find_opt (test_keys k) !b with\n | Some e -> get_data e\n | None -> None\n\n let length b = List.length !b\n let clear b = b := []\n\n end\n\nend\n","(* generated code *)"],"names":[],"mappings":"EA+tBkB,kBAAO,C,EADN,+BAAc,C,EAJP,iB,EAAA,QAApB,UAAiC,QAA3B,eAA8B,QAE1B,eADE,QACE,C,SALd,qBALE,UACQ,mBACM,EADN,SACM,GAAa,GAAS,IAAL,QAAK,eAAqB,2BAC7C,qBAEJ,C,QAjBV,uCACK,KAAQ,O,EACX,2C,EAAA,MACQ,WAAW,K,CAAA,EACE,yCADF,UACO,EAAL,kDAAK,iEACjB,WAET,KANmC,UAMnC,K,AAAA,I,AAAA,G,EAAA,GC7sBR,iDD8sBmB,QAAK,C,KAXJ,cAAgB,IAAX,WAAW,qBAAM,C,EADxB,I,EAAA,GAAM,C,KAXJ,OAEd,OAFc,SAGd,YAAiB,EACd,C,EAJW,iBAAuB,C,EAFF,iCAAQ,C,MCrrBjD,6L,ID6qBiB,KAAQ,aADf,U,CAAA,EApEqC,2BAoEd,yB,GAAA,KACH,C,OAjEU,kCAyDpB,S,CAAA,sCAEE,O,CAAA,kCAAZ,MAAY,kB,CAAA,gCAAZ,IAAiB,yBAEnB,WAAY,C,WArBZ,iB,CAAA,yBAEA,EADW,KACX,GAYE,SATE,UAEQ,WAAW,OACP,MAEK,O,CAAA,gC,EAFL,YAEK,kB,CAAA,gCAAR,EAAa,cAAb,GAAgB,OAEd,MADA,U,IANG,QAHE,MAGF,GASO,C,WApBzB,UACA,S,CAAA,kC,CAAA,IAC0B,O,CAAA,kCAAK,EAAxB,EAAmB,kB,CAAA,gCAAK,cAAxB,GAAwB,sCAE/B,SAAE,C,OAXF,S,CAAA,uBAAQ,OACR,MADA,EACY,O,CAAA,sCAEE,O,CAAA,kCAAZ,MAAY,kB,CAAA,gCAAZ,IAAiB,yBAEnB,OAAC,C,EC5oBT,8C,UDsnBY,OACR,kB,CAAA,4B,EAEE,sBACQ,WAAa,OACT,UACS,O,CAAA,kCADT,UACiB,EAAR,kB,CAAA,gCAAQ,gEACf,aAEd,SAAY,GAPmB,UAOnB,K,AAAA,I,AAAA,G,EAAA,GC/nBlB,kDDgoBiB,UAAI,C,OAjBjB,S,CAAA,yBACU,OACV,MAFA,EAEiB,qBACmB,O,CAAA,kCAAd,MAAc,kB,CAAA,gCAAd,IAAsB,yBAC5C,OAAG,C,EARsC,uBAA8B,C,EADxB,EAAR,gBAAQ,aAAmB,C,EAHlE,yBAA+B,C,EAFuB,IAAR,gBAAQ,GAAoB,C,EAF3C,+BAAe,C,OADrB,6BAAe,C,KAdlB,yB,EAAA,UAApB,UAAqC,QAA/B,eAAkC,QAE9B,eADE,QACE,C,SALd,qBALE,UACQ,mBACM,IADN,SACM,GAAiB,GAAS,IAAL,QAAK,eAAqB,2BACjD,qBAEJ,C,MAXJ,OAAY,OAAU,O,CAAA,S,CAAA,wBACJ,4EAAwB,OACzC,EAAK,C,KALM,cAAoB,IAAf,aAAe,qBAAM,C,KAZ9B,OAEd,OAFc,SAGd,YAAiB,EACd,C,EAJW,iBAAuB,C,MCvjB3C,4N,ED+e6C,2BAuDT,WAlDS,0BAkDO,C,QAJ7B,uBAzCsB,gCA2CrC,QAAe,QAAa,OAChB,C,aAVJ,+BACF,OAAY,OAAU,O,CAAA,S,CAAA,cAGrB,EAHqB,UAGxB,cAAG,GAAe,K,CAAA,EAAI,IAAJ,cAAI,GAAe,K,CAAA,EAChC,OAAwB,OAHT,IAG4B,C,SAPtC,cACW,EADX,eACd,YAAyB,GAAsB,UAA/C,IAA+C,cAA/C,GAAsB,QAAiC,C,QAN9C,uBACD,KACR,MACA,QAAe,QAAa,EAC3B,C,ECxhBT,kD,GDogBU,OAAY,QACR,eACI,uCACE,OAAY,QACd,eACI,uCAAa,UACf,OAEJ,MAAI,C,EAhBN,KACV,MACA,QACA,QAEA,EAAG,C,EAdH,2BAA+B,C,EAFsB,MAAR,gBAAQ,GAAoB,C,EAHzE,2BAA+B,C,EAFsB,MAAR,gBAAQ,GAAoB,C,KAF1C,iCAAe,C,EAdxB,iB,EAAA,QAApB,UAAgC,QAA1B,eAA6B,QAEzB,eADE,QACE,C,SALd,qBALE,UACQ,mBACM,EADN,SACM,GAAY,GAAS,IAAL,QAAK,eAAqB,2BAC5C,qBAEJ,C,EAXJ,OAAS,K,CAAA,YACD,sCAAU,KACjB,EAAK,C,KALE,cAAgB,IAAX,WAAW,qBAAM,C,KAZtB,OAEd,OAFc,SAGd,YAAiB,EACd,C,EAJW,iBAAuB,C,MC/b3C,6L,EDiZwC,gCAkChC,QAAW,OACC,C,MARN,eAAS,OACL,GAEH,EAFG,UAEN,cAAG,GAAY,MAAM,EAA2C,C,EAX5D,KACR,MACA,QAAW,EACV,C,KCvaT,+C,ED0ZU,OAAW,QACP,eACI,uCAAY,UACd,MAAI,C,EAhBmB,yBAAoB,C,KAJ7B,iCAAe,C,MArB7B,QAAV,QAAU,UACV,aAAiB,EACd,C,SALM,QAAc,KAAd,mBAAc,UAAgB,C,EAAvC,2CAAyC,C,SAHhC,QAAc,KAAd,mBAAc,UAAY,C,EAAnC,2CAAqC,C,UAVxB,MAAR,QAAQ,UACR,yCACa,oBAFb,EAEA,iBAAa,oBAAS,QAAtB,KAA0B,U,EAPoB,EAAzB,MAAV,MAAU,QAAyB,sB,eAHnD,I,EAAA,KACA,MADA,QACA,QACE,IADF,oBACE,eAGF,QAAY,UACZ,8CAKQ,yB,CAAA,iCAIoB,C,QAtBF,aACf,wBACa,2BAAa,cAEf,KADlB,c,GAC+C,C,QAZ9C,OAAQ,WACK,wBADb,EACA,gBAAa,mBAAS,QAAtB,KAA0B,U,EAL4B,EAAnB,SAAmB,sB,WAE3D,GAFE,OADF,oBACE,eACF,QAAY,UACZ,gCAIQ,yB,CAAA,iCAIoB,C,EAhBR,aACT,GACW,WADX,UACW,MAA6B,C,EAJtC,UAAM,C,eAFG,OAVtB,OAAW,EAAX,oBAAW,KAUW,KAAgB,OAAxB,mBAVd,EAUc,gBAAyB,IATf,SAEpB,oCACqB,sCACT,IAAZ,cAAY,GAAa,OACd,a,EAAA,UAGU,K,MAAA,GACc,C,iBArB/B,OAVR,OAAW,EAAX,qBAAW,KAUH,KACR,OAAQ,mBAXR,EAYA,OADQ,kB,CACR,IAXyB,SACZ,wCACc,wCACT,IAAZ,eAAY,GAAa,OACd,wBAQC,S,EAAA,UALI,K,OAAA,I,AAAA,G,EAAA,GCxS5B,iD,ED+SwB,IAAhB,eAAgB,KAChB,wD,CAAA,OAAsC,wBAEtC,c,CAAA,iDAA2C,8BAAQ,C,SArC5B,aACd,mCACc,gDACI,IAAb,SAAZ,eAAY,GAAa,IACF,EAAZ,eAAY,eAAY,eAGG,IAHH,UAGhB,OAAmB,qBAOtC,OAAmB,C,gBAfvB,YAAW,EAAX,oBAAW,KACX,gBAeuB,SAAgB,OAAxB,mBAhBf,EAgBe,gBAAyB,U,eAnBT,OAF/B,OAAW,EAAX,oBAAW,KAEoB,KAAgB,OAAzB,mBAFtB,EAEsB,gBAA2B,IAvB9B,SAEf,oCACqB,wCACI,IAAb,IAAZ,cAAY,GAAa,GAET,EAAZ,cAAY,eAAY,cAKP,I,EAAA,O,EAAA,UAOrB,K,MAAA,GAK6C,C,eAzBtB,OAF3B,OAAW,EAAX,oBAAW,KAEgB,KAAgB,OAAzB,mBAFlB,EAEkB,gBAA2B,IAvB9B,SAEX,wCACqB,wCACI,IAAb,IAAZ,cAAY,GAAa,GAET,EAAZ,cAAY,eAAY,wBAKZ,E,EAAA,O,EAAA,UAOhB,K,MAAA,GAKyC,C,SA3CrB,aACX,mCACc,gDACI,MAAb,SAAZ,eAAY,GAAa,WAMrB,wCACA,GALsC,QAAlB,OAAkB,MAD/B,wCAAsB,GAQc,MARd,cAQJ,KAAkB,OAAC,C,gBAbtD,YAAW,EAAX,oBAAW,KACX,kBAaQ,SAdR,EAeA,OAA4B,qCAAd,OAAwB,OAAtC,uCAAsC,U,cAvB9B,OADR,OAAW,EAAX,qBAAW,KACH,KACQ,IAAhB,eAAgB,KAFhB,EAGA,OAAmC,qBACnC,yCAD6C,QAAV,gBAAU,IAC7C,GAAoB,wBAEpB,c,CAAA,iDAA2C,uBAAQ,C,WAlBzB,SACX,E,EAAA,8BADW,EAGlB,GACW,aACsB,yBAAjC,oBAA6C,QAAZ,uBAAY,IAA7C,GAA8C,O,cAXtD,KADA,S,CACA,yBACA,KACA,aAAO,sDAHP,E,EAGO,KAGL,IADY,YACZ,GAOA,mBANA,SAMA,EACgB,uCAAd,KAAuB,4B,GAAA,KAExB,C,SAnDiB,aAEd,mCACoB,cAAI,aAAe,QACvC,sCACA,GAE4B,MAF5B,cAEc,KAAc,OAAC,C,iBAPnC,SAUA,KADA,YACA,E,CAAA,oCAVA,aAUA,EACqB,uCAAV,OAAT,kBAAwB,kCACtB,C,IAfJ,iB,CAAA,kCAAmC,C,QAHxB,sCAAgB,eAAiB,qBAAE,C,OAR9C,iB,CAAA,uBACA,kBACE,UACG,cAEH,OAAU,QAA+B,cACxC,C,UAbH,kBACA,c,CAAA,uBACA,eACE,mDAAmB,kCACjB,C,SAVK,UAAW,0BAA0B,W,EACtC,MAPR,kBACK,wBACA,YAML,UAAmE,KAAzC,KAFjB,QAEiB,wB,GAAA,Q,CAAA,gB,CAAA,+D,EAC0C,QAAlB,UAAkB,UAAE,C,EC7G5E,kC,sBAAA,0M,GAAA,0J,QAAA,4D,QAAA,6E,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}},{"offset":{"line":0,"column":359998},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/filename.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy and Damien Doligez, INRIA Rocquencourt *)\n(* *)\n(* Copyright 1996 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\nlet generic_quote quotequote s =\n let l = String.length s in\n let b = Buffer.create (l + 20) in\n Buffer.add_char b '\\'';\n for i = 0 to l - 1 do\n if s.[i] = '\\''\n then Buffer.add_string b quotequote\n else Buffer.add_char b s.[i]\n done;\n Buffer.add_char b '\\'';\n Buffer.contents b\n\n(* This function implements the Open Group specification found here:\n [[1]] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/basename.html\n In step 1 of [[1]], we choose to return \".\" for empty input.\n (for compatibility with previous versions of OCaml)\n In step 2, we choose to process \"//\" normally.\n Step 6 is not implemented: we consider that the [suffix] operand is\n always absent. Suffixes are handled by [chop_suffix] and [chop_extension].\n*)\nlet generic_basename is_dir_sep current_dir_name name =\n let rec find_end n =\n if n < 0 then String.sub name 0 1\n else if is_dir_sep name n then find_end (n - 1)\n else find_beg n (n + 1)\n and find_beg n p =\n if n < 0 then String.sub name 0 p\n else if is_dir_sep name n then String.sub name (n + 1) (p - n - 1)\n else find_beg (n - 1) p\n in\n if name = \"\"\n then current_dir_name\n else find_end (String.length name - 1)\n\n(* This function implements the Open Group specification found here:\n [[2]] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/dirname.html\n In step 6 of [[2]], we choose to process \"//\" normally.\n*)\nlet generic_dirname is_dir_sep current_dir_name name =\n let rec trailing_sep n =\n if n < 0 then String.sub name 0 1\n else if is_dir_sep name n then trailing_sep (n - 1)\n else base n\n and base n =\n if n < 0 then current_dir_name\n else if is_dir_sep name n then intermediate_sep n\n else base (n - 1)\n and intermediate_sep n =\n if n < 0 then String.sub name 0 1\n else if is_dir_sep name n then intermediate_sep (n - 1)\n else String.sub name 0 (n + 1)\n in\n if name = \"\"\n then current_dir_name\n else trailing_sep (String.length name - 1)\n\nmodule type SYSDEPS = sig\n val null : string\n val current_dir_name : string\n val parent_dir_name : string\n val dir_sep : string\n val is_dir_sep : string -> int -> bool\n val is_relative : string -> bool\n val is_implicit : string -> bool\n val check_suffix : string -> string -> bool\n val chop_suffix_opt : suffix:string -> string -> string option\n val temp_dir_name : string\n val quote : string -> string\n val quote_command :\n string -> ?stdin: string -> ?stdout: string -> ?stderr: string\n -> string list -> string\n val basename : string -> string\n val dirname : string -> string\nend\n\nmodule Unix : SYSDEPS = struct\n let null = \"/dev/null\"\n let current_dir_name = \".\"\n let parent_dir_name = \"..\"\n let dir_sep = \"/\"\n let is_dir_sep s i = s.[i] = '/'\n let is_relative n = String.length n < 1 || n.[0] <> '/'\n let is_implicit n =\n is_relative n\n && (String.length n < 2 || String.sub n 0 2 <> \"./\")\n && (String.length n < 3 || String.sub n 0 3 <> \"../\")\n let check_suffix name suff =\n String.ends_with ~suffix:suff name\n\n let chop_suffix_opt ~suffix filename =\n let len_s = String.length suffix and len_f = String.length filename in\n if len_f >= len_s then\n let r = String.sub filename (len_f - len_s) len_s in\n if r = suffix then\n Some (String.sub filename 0 (len_f - len_s))\n else\n None\n else\n None\n\n let temp_dir_name =\n try Sys.getenv \"TMPDIR\" with Not_found -> \"/tmp\"\n let quote = generic_quote \"'\\\\''\"\n let quote_command cmd ?stdin ?stdout ?stderr args =\n String.concat \" \" (List.map quote (cmd :: args))\n ^ (match stdin with None -> \"\" | Some f -> \" <\" ^ quote f)\n ^ (match stdout with None -> \"\" | Some f -> \" >\" ^ quote f)\n ^ (match stderr with None -> \"\" | Some f -> if stderr = stdout\n then \" 2>&1\"\n else \" 2>\" ^ quote f)\n let basename = generic_basename is_dir_sep current_dir_name\n let dirname = generic_dirname is_dir_sep current_dir_name\nend\n\nmodule Win32 : SYSDEPS = struct\n let null = \"NUL\"\n let current_dir_name = \".\"\n let parent_dir_name = \"..\"\n let dir_sep = \"\\\\\"\n let is_dir_sep s i = let c = s.[i] in c = '/' || c = '\\\\' || c = ':'\n let is_relative n =\n (String.length n < 1 || n.[0] <> '/')\n && (String.length n < 1 || n.[0] <> '\\\\')\n && (String.length n < 2 || n.[1] <> ':')\n let is_implicit n =\n is_relative n\n && (String.length n < 2 || String.sub n 0 2 <> \"./\")\n && (String.length n < 2 || String.sub n 0 2 <> \".\\\\\")\n && (String.length n < 3 || String.sub n 0 3 <> \"../\")\n && (String.length n < 3 || String.sub n 0 3 <> \"..\\\\\")\n let check_suffix name suff =\n String.length name >= String.length suff &&\n (let s = String.sub name (String.length name - String.length suff)\n (String.length suff) in\n String.lowercase_ascii s = String.lowercase_ascii suff)\n\n let chop_suffix_opt ~suffix filename =\n let len_s = String.length suffix and len_f = String.length filename in\n if len_f >= len_s then\n let r = String.sub filename (len_f - len_s) len_s in\n if String.lowercase_ascii r = String.lowercase_ascii suffix then\n Some (String.sub filename 0 (len_f - len_s))\n else\n None\n else\n None\n\n\n let temp_dir_name =\n try Sys.getenv \"TEMP\" with Not_found -> \".\"\n let quote s =\n let l = String.length s in\n let b = Buffer.create (l + 20) in\n Buffer.add_char b '\\\"';\n let rec loop i =\n if i = l then Buffer.add_char b '\\\"' else\n match s.[i] with\n | '\\\"' -> loop_bs 0 i;\n | '\\\\' -> loop_bs 0 i;\n | c -> Buffer.add_char b c; loop (i+1);\n and loop_bs n i =\n if i = l then begin\n Buffer.add_char b '\\\"';\n add_bs n;\n end else begin\n match s.[i] with\n | '\\\"' -> add_bs (2*n+1); Buffer.add_char b '\\\"'; loop (i+1);\n | '\\\\' -> loop_bs (n+1) (i+1);\n | _ -> add_bs n; loop i\n end\n and add_bs n = for _j = 1 to n do Buffer.add_char b '\\\\'; done\n in\n loop 0;\n Buffer.contents b\n(*\nQuoting commands for execution by cmd.exe is difficult.\n1- Each argument is first quoted using the \"quote\" function above, to\n protect it against the processing performed by the C runtime system,\n then cmd.exe's special characters are escaped with '^', using\n the \"quote_cmd\" function below. For more details, see\n https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23\n2- The command and the redirection files, if any, must be double-quoted\n in case they contain spaces. This quoting is interpreted by cmd.exe,\n not by the C runtime system, hence the \"quote\" function above\n cannot be used. The two characters we don't know how to quote\n inside a double-quoted cmd.exe string are double-quote and percent.\n We just fail if the command name or the redirection file names\n contain a double quote (not allowed in Windows file names, anyway)\n or a percent. See function \"quote_cmd_filename\" below.\n3- The whole string passed to Sys.command is then enclosed in double\n quotes, which are immediately stripped by cmd.exe. Otherwise,\n some of the double quotes from step 2 above can be misparsed.\n See e.g. https://stackoverflow.com/a/9965141\n*)\n let quote_cmd s =\n let b = Buffer.create (String.length s + 20) in\n String.iter\n (fun c ->\n match c with\n | '(' | ')' | '!' | '^' | '%' | '\\\"' | '<' | '>' | '&' | '|' ->\n Buffer.add_char b '^'; Buffer.add_char b c\n | _ ->\n Buffer.add_char b c)\n s;\n Buffer.contents b\n let quote_cmd_filename f =\n if String.exists (function '\\\"' | '%' -> true | _ -> false) f then\n failwith (\"Filename.quote_command: bad file name \" ^ f)\n else if String.contains f ' ' then\n String.concat \"\" [\"\\\"\"; f; \"\\\"\"]\n else\n f\n (* Redirections in cmd.exe: see https://ss64.com/nt/syntax-redirection.html\n and https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490982(v=technet.10)\n *)\n let quote_command cmd ?stdin ?stdout ?stderr args =\n String.concat \"\" [\n \"\\\"\";\n quote_cmd_filename cmd;\n \" \";\n quote_cmd (String.concat \" \" (List.map quote args));\n (match stdin with None -> \"\" | Some f -> \" <\" ^ quote_cmd_filename f);\n (match stdout with None -> \"\" | Some f -> \" >\" ^ quote_cmd_filename f);\n (match stderr with None -> \"\" | Some f ->\n if stderr = stdout\n then \" 2>&1\"\n else \" 2>\" ^ quote_cmd_filename f);\n \"\\\"\"\n ]\n let has_drive s =\n let is_letter = function\n | 'A' .. 'Z' | 'a' .. 'z' -> true\n | _ -> false\n in\n String.length s >= 2 && is_letter s.[0] && s.[1] = ':'\n let drive_and_path s =\n if has_drive s\n then (String.sub s 0 2, String.sub s 2 (String.length s - 2))\n else (\"\", s)\n let dirname s =\n let (drive, path) = drive_and_path s in\n let dir = generic_dirname is_dir_sep current_dir_name path in\n drive ^ dir\n let basename s =\n let (_drive, path) = drive_and_path s in\n generic_basename is_dir_sep current_dir_name path\nend\n\nmodule Cygwin : SYSDEPS = struct\n let null = \"/dev/null\"\n let current_dir_name = \".\"\n let parent_dir_name = \"..\"\n let dir_sep = \"/\"\n let is_dir_sep = Win32.is_dir_sep\n let is_relative = Win32.is_relative\n let is_implicit = Win32.is_implicit\n let check_suffix = Win32.check_suffix\n let chop_suffix_opt = Win32.chop_suffix_opt\n let temp_dir_name = Unix.temp_dir_name\n let quote = Unix.quote\n let quote_command = Unix.quote_command\n let basename = generic_basename is_dir_sep current_dir_name\n let dirname = generic_dirname is_dir_sep current_dir_name\nend\n\nmodule Sysdeps =\n (val (match Sys.os_type with\n | \"Win32\" -> (module Win32: SYSDEPS)\n | \"Cygwin\" -> (module Cygwin: SYSDEPS)\n | _ -> (module Unix: SYSDEPS)))\n\ninclude Sysdeps\n\nlet concat dirname filename =\n let l = String.length dirname in\n if l = 0 || is_dir_sep dirname (l-1)\n then dirname ^ filename\n else dirname ^ dir_sep ^ filename\n\nlet chop_suffix name suff =\n if check_suffix name suff\n then String.sub name 0 (String.length name - String.length suff)\n else invalid_arg \"Filename.chop_suffix\"\n\nlet extension_len name =\n let rec check i0 i =\n if i < 0 || is_dir_sep name i then 0\n else if name.[i] = '.' then check i0 (i - 1)\n else String.length name - i0\n in\n let rec search_dot i =\n if i < 0 || is_dir_sep name i then 0\n else if name.[i] = '.' then check i (i - 1)\n else search_dot (i - 1)\n in\n search_dot (String.length name - 1)\n\nlet extension name =\n let l = extension_len name in\n if l = 0 then \"\" else String.sub name (String.length name - l) l\n\nlet chop_extension name =\n let l = extension_len name in\n if l = 0 then invalid_arg \"Filename.chop_extension\"\n else String.sub name 0 (String.length name - l)\n\nlet remove_extension name =\n let l = extension_len name in\n if l = 0 then name else String.sub name 0 (String.length name - l)\n\nexternal open_desc: string -> open_flag list -> int -> int = \"caml_sys_open\"\nexternal close_desc: int -> unit = \"caml_sys_close\"\n\nlet prng_key =\n Domain.DLS.new_key Random.State.make_self_init\n\nlet temp_file_name temp_dir prefix suffix =\n let random_state = Domain.DLS.get prng_key in\n let rnd = (Random.State.bits random_state) land 0xFFFFFF in\n concat temp_dir (Printf.sprintf \"%s%06x%s\" prefix rnd suffix)\n\nlet current_temp_dir_name =\n Domain.DLS.new_key ~split_from_parent:Fun.id (fun () -> temp_dir_name)\n\nlet set_temp_dir_name s = Domain.DLS.set current_temp_dir_name s\nlet get_temp_dir_name () = Domain.DLS.get current_temp_dir_name\n\nlet temp_file ?(temp_dir = Domain.DLS.get current_temp_dir_name) prefix suffix =\n let rec try_name counter =\n let name = temp_file_name temp_dir prefix suffix in\n try\n close_desc(open_desc name [Open_wronly; Open_creat; Open_excl] 0o600);\n name\n with Sys_error _ as e ->\n if counter >= 20 then raise e else try_name (counter + 1)\n in try_name 0\n\nlet open_temp_file ?(mode = [Open_text]) ?(perms = 0o600)\n ?(temp_dir = Domain.DLS.get current_temp_dir_name)\n prefix suffix =\n let rec try_name counter =\n let name = temp_file_name temp_dir prefix suffix in\n try\n (name,\n open_out_gen (Open_wronly::Open_creat::Open_excl::mode) perms name)\n with Sys_error _ as e ->\n if counter >= 20 then raise e else try_name (counter + 1)\n in try_name 0\n\nlet temp_dir ?(temp_dir = Domain.DLS.get current_temp_dir_name)\n ?(perms = 0o700) prefix suffix =\n let rec try_name counter =\n let name = temp_file_name temp_dir prefix suffix in\n try\n Sys.mkdir name perms;\n name\n with Sys_error _ as e ->\n if counter >= 20 then raise e else try_name (counter + 1)\n in try_name 0\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":367537},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/complex.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)\n(* *)\n(* Copyright 2002 Institut National de Recherche en Informatique et *)\n(* en Automatique. *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\n(* Complex numbers *)\n\ntype t = { re: float; im: float }\n\nlet zero = { re = 0.0; im = 0.0 }\nlet one = { re = 1.0; im = 0.0 }\nlet i = { re = 0.0; im = 1.0 }\n\nlet add x y = { re = x.re +. y.re; im = x.im +. y.im }\n\nlet sub x y = { re = x.re -. y.re; im = x.im -. y.im }\n\nlet neg x = { re = -. x.re; im = -. x.im }\n\nlet conj x = { re = x.re; im = -. x.im }\n\nlet mul x y = { re = x.re *. y.re -. x.im *. y.im;\n im = x.re *. y.im +. x.im *. y.re }\n\nlet div x y =\n if abs_float y.re >= abs_float y.im then\n let r = y.im /. y.re in\n let d = y.re +. r *. y.im in\n { re = (x.re +. r *. x.im) /. d;\n im = (x.im -. r *. x.re) /. d }\n else\n let r = y.re /. y.im in\n let d = y.im +. r *. y.re in\n { re = (r *. x.re +. x.im) /. d;\n im = (r *. x.im -. x.re) /. d }\n\nlet inv x = div one x\n\nlet norm2 x = x.re *. x.re +. x.im *. x.im\n\nlet norm x = Float.hypot x.re x.im\n\nlet arg x = atan2 x.im x.re\n\nlet polar n a = { re = cos a *. n; im = sin a *. n }\n\nlet sqrt x =\n if x.re = 0.0 && x.im = 0.0 then { re = 0.0; im = 0.0 }\n else begin\n let r = abs_float x.re and i = abs_float x.im in\n let w =\n if r >= i then begin\n let q = i /. r in\n sqrt(r) *. sqrt(0.5 *. (1.0 +. sqrt(1.0 +. q *. q)))\n end else begin\n let q = r /. i in\n sqrt(i) *. sqrt(0.5 *. (q +. sqrt(1.0 +. q *. q)))\n end in\n if x.re >= 0.0\n then { re = w; im = 0.5 *. x.im /. w }\n else { re = 0.5 *. i /. w; im = if x.im >= 0.0 then w else -. w }\n end\n\nlet exp x =\n let e = exp x.re in { re = e *. cos x.im; im = e *. sin x.im }\n\nlet log x = { re = log (norm x); im = atan2 x.im x.re }\n\nlet pow x y = exp (mul y (log x))\n","(* generated code *)"],"names":[],"mappings":"KA8EyB,WA/CwB,wBAA5B,CAC4B,cADZ,CAAhB,CAC4B,cAA5B,CADP,cACuB,CAAhB,CAD4B,IA+ChB,Q,OAFrB,mBAA0B,KAAf,SAAJ,UAAY,MAAwB,C,OAFrD,YAAQ,KAAY,OAAgC,GAAL,GAApB,EAAiC,OAA5B,GAAL,CAAa,MAAsB,C,QAjB9D,2CAAiC,MAC5B,UACK,GAAc,OAAS,GAC/B,GAGI,GADQ,OACmC,GAAR,UAAJ,CAAR,UAAR,UAAJ,CAAX,EAGA,GADQ,OACiC,KAAR,UAAJ,CAAN,CAAR,UAAJ,CAAX,E,EAEJ,uBACqC,EAAhC,OAAgB,aAAgB,KACzB,eAAP,EAAuD,GAAvD,qBAAoB,KACxB,C,OAjBmC,4BAAjB,gBAAU,MAAmB,C,KAFxC,yBAAe,C,KAFd,yBAAqB,C,KAFQ,mBAA5B,eAAgB,CAAhB,IAA4B,C,EAF9B,YAAS,C,QAXnB,YAAqB,CAAc,OAAhC,CAAc,IAEU,OADzB,cAAQ,GACR,OAAgB,CAAR,GACiB,YAAT,EACe,OADf,CAAT,IACkB,OAAT,EADhB,OACgB,CAAT,IADwB,KAIN,UADzB,cAAQ,GACR,OAAgB,CAAR,GACA,EACuB,YADvB,CACuB,OADxB,IACC,EADR,OACQ,CADR,OACO,IADwB,KACE,C,KAbY,wBAA5B,CAC4B,cADZ,CAAhB,CAC4B,cAA5B,CADP,cACuB,CAAhB,CAD4B,IACE,C,KAHb,YAAzB,OAAkB,CAAO,IAAE,C,KAFA,YAArB,CAAP,OAAqB,CAAP,IAAgB,C,KAFU,wBAA/B,CAAP,cAA0B,CAAP,IAAqB,C,KAFF,wBAA/B,CAAP,cAA0B,CAAP,IAAqB,C,ECvBtD,sE,EAAA,c,QAAA","ignoreList":[1]}},{"offset":{"line":0,"column":370758},"map":{"version":3,"sources":["/root/.opam/5.2.0/lib/ocaml/effect.ml","/builtin/blackbox.ml"],"sourcesContent":["(**************************************************************************)\n(* *)\n(* OCaml *)\n(* *)\n(* KC Sivaramakrishnan, Indian Institute of Technology, Madras *)\n(* *)\n(* Copyright 2021 Indian Institute of Technology, Madras *)\n(* *)\n(* All rights reserved. This file is distributed under the terms of *)\n(* the GNU Lesser General Public License version 2.1, with the *)\n(* special exception on linking described in the file LICENSE. *)\n(* *)\n(**************************************************************************)\n\ntype 'a t = ..\nexternal perform : 'a t -> 'a = \"%perform\"\n\ntype exn += Unhandled: 'a t -> exn\nexception Continuation_already_resumed\n\nlet () =\n let printer = function\n | Unhandled x ->\n let msg = Printf.sprintf \"Stdlib.Effect.Unhandled(%s)\"\n (Printexc.string_of_extension_constructor @@ Obj.repr x)\n in\n Some msg\n | _ -> None\n in\n Printexc.register_printer printer\n\n(* Register the exceptions so that the runtime can access it *)\ntype _ t += Should_not_see_this__ : unit t\nlet _ = Callback.register_exception \"Effect.Unhandled\"\n (Unhandled Should_not_see_this__)\nlet _ = Callback.register_exception \"Effect.Continuation_already_resumed\"\n Continuation_already_resumed\n\ntype ('a, 'b) stack [@@immediate]\ntype last_fiber [@@immediate]\n\nexternal resume :\n ('a, 'b) stack -> ('c -> 'a) -> 'c -> last_fiber -> 'b = \"%resume\"\nexternal runstack : ('a, 'b) stack -> ('c -> 'a) -> 'c -> 'b = \"%runstack\"\n\nmodule Deep = struct\n\n type ('a,'b) continuation\n\n external take_cont_noexc : ('a, 'b) continuation -> ('a, 'b) stack =\n \"caml_continuation_use_noexc\" [@@noalloc]\n external alloc_stack :\n ('a -> 'b) ->\n (exn -> 'b) ->\n ('c t -> ('c, 'b) continuation -> last_fiber -> 'b) ->\n ('a, 'b) stack = \"caml_alloc_stack\"\n external cont_last_fiber : ('a, 'b) continuation -> last_fiber = \"%field1\"\n external cont_set_last_fiber :\n ('a, 'b) continuation -> last_fiber -> unit = \"%setfield1\"\n\n let continue k v =\n resume (take_cont_noexc k) (fun x -> x) v (cont_last_fiber k)\n\n let discontinue k e =\n resume (take_cont_noexc k) (fun e -> raise e) e (cont_last_fiber k)\n\n let discontinue_with_backtrace k e bt =\n resume (take_cont_noexc k) (fun e -> Printexc.raise_with_backtrace e bt)\n e (cont_last_fiber k)\n\n type ('a,'b) handler =\n { retc: 'a -> 'b;\n exnc: exn -> 'b;\n effc: 'c.'c t -> (('c,'b) continuation -> 'b) option }\n\n external reperform :\n 'a t -> ('a, 'b) continuation -> last_fiber -> 'b = \"%reperform\"\n\n let match_with comp arg handler =\n let effc eff k last_fiber =\n match handler.effc eff with\n | Some f ->\n cont_set_last_fiber k last_fiber;\n f k\n | None -> reperform eff k last_fiber\n in\n let s = alloc_stack handler.retc handler.exnc effc in\n runstack s comp arg\n\n type 'a effect_handler =\n { effc: 'b. 'b t -> (('b,'a) continuation -> 'a) option }\n\n let try_with comp arg handler =\n let effc' eff k last_fiber =\n match handler.effc eff with\n | Some f ->\n cont_set_last_fiber k last_fiber;\n f k\n | None -> reperform eff k last_fiber\n in\n let s = alloc_stack (fun x -> x) (fun e -> raise e) effc' in\n runstack s comp arg\n\n external get_callstack :\n ('a,'b) continuation -> int -> Printexc.raw_backtrace =\n \"caml_get_continuation_callstack\"\nend\n\nmodule Shallow = struct\n\n type ('a,'b) continuation\n\n external alloc_stack :\n ('a -> 'b) ->\n (exn -> 'b) ->\n ('c t -> ('c, 'b) continuation -> last_fiber -> 'b) ->\n ('a, 'b) stack = \"caml_alloc_stack\"\n\n external cont_last_fiber : ('a, 'b) continuation -> last_fiber = \"%field1\"\n external cont_set_last_fiber :\n ('a, 'b) continuation -> last_fiber -> unit = \"%setfield1\"\n\n let fiber : type a b. (a -> b) -> (a, b) continuation = fun f ->\n let module M = struct type _ t += Initial_setup__ : a t end in\n let exception E of (a,b) continuation in\n let f' () = f (perform M.Initial_setup__) in\n let error _ = failwith \"impossible\" in\n let effc eff k last_fiber =\n match eff with\n | M.Initial_setup__ ->\n cont_set_last_fiber k last_fiber;\n raise_notrace (E k)\n | _ -> error ()\n in\n let s = alloc_stack error error effc in\n match runstack s f' () with\n | exception E k -> k\n | _ -> error ()\n\n type ('a,'b) handler =\n { retc: 'a -> 'b;\n exnc: exn -> 'b;\n effc: 'c.'c t -> (('c,'a) continuation -> 'b) option }\n\n external update_handler :\n ('a,'b) continuation ->\n ('b -> 'c) ->\n (exn -> 'c) ->\n ('d t -> ('d,'b) continuation -> last_fiber -> 'c) ->\n ('a,'c) stack = \"caml_continuation_use_and_update_handler_noexc\" [@@noalloc]\n\n external reperform :\n 'a t -> ('a, 'b) continuation -> last_fiber -> 'c = \"%reperform\"\n\n let continue_gen k resume_fun v handler =\n let effc eff k last_fiber =\n match handler.effc eff with\n | Some f ->\n cont_set_last_fiber k last_fiber;\n f k\n | None -> reperform eff k last_fiber\n in\n let last_fiber = cont_last_fiber k in\n let stack = update_handler k handler.retc handler.exnc effc in\n resume stack resume_fun v last_fiber\n\n let continue_with k v handler =\n continue_gen k (fun x -> x) v handler\n\n let discontinue_with k v handler =\n continue_gen k (fun e -> raise e) v handler\n\n let discontinue_with_backtrace k v bt handler =\n continue_gen k (fun e -> Printexc.raise_with_backtrace e bt) v handler\n\n external get_callstack :\n ('a,'b) continuation -> int -> Printexc.raw_backtrace =\n \"caml_get_continuation_callstack\"\nend\n","(* generated code *)"],"names":[],"mappings":"EA6K6B,mBAAkC,C,EAA3D,iBAAsE,C,EAH7C,IAAO,C,EAAhC,YAA2C,C,EAHlB,EAAC,C,EAA1B,YAAqC,C,QAX7B,EAAN,kBAAM,eAAgB,OAIZ,sBAFN,cACA,kB,CACgC,C,KAEtC,cACY,EAAZ,mBARA,WAQY,GACZ,SAAoC,C,SApClC,kBAEI,cACA,oBACG,Y,CAAQ,C,EANH,uBAAqB,C,MADrB,gBAA2B,qB,UAFzC,qDAWQ,MAPR,cAOQ,KACR,SAAM,gBAAgB,I,AAAA,I,AAAA,G,EAAA,KCvI1B,sBDwIuB,O,EACZ,WAAQ,C,QA3CP,EAAN,kBAAM,eAAgB,OAIZ,sBAFN,cACA,kB,CACgC,C,EAE9B,MAPR,WAOQ,GACR,WAAmB,C,KAfnB,mBAPA,WAOQ,GACR,WAAmB,C,QApBnB,wBAAO,KAAmB,SACH,C,KAJvB,cAAO,KAAmB,UAAyC,C,KAHnE,cAAO,KAAmB,UAAmC,C,KAxCjD,yBAKR,IALQ,OAER,QACI,aADM,GACkD,QADlD,0BAGV,KACG,KAAI,C,SC3Bf,gDD6BE,sBAIM,GAJ2B,oCAI3B,cAEA,KADmC,QACnC,cAC8B,+D,ECpCtC,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,c,cAAA","ignoreList":[1]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-02032b37.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-02032b37.wasm
new file mode 100644
index 00000000..192c2553
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-02032b37.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-02032b37.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-02032b37.wasm.map
new file mode 100644
index 00000000..60f9c6f8
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-02032b37.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":69097},"map":{"version":3,"sources":["/workspace_root/lib/sx_types.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Core types for the SX language.\n\n The [value] sum type represents every possible SX runtime value.\n OCaml's algebraic types make the CEK machine's frame dispatch a\n pattern match — exactly what the spec describes. *)\n\n(** {1 Environment} *)\n\n(** Lexical scope chain. Each frame holds a mutable binding table and\n an optional parent link for scope-chain lookup. *)\ntype env = {\n bindings : (string, value) Hashtbl.t;\n parent : env option;\n}\n\n(** {1 Values} *)\n\nand value =\n | Nil\n | Bool of bool\n | Number of float\n | String of string\n | Symbol of string\n | Keyword of string\n | List of value list\n | Dict of dict\n | Lambda of lambda\n | Component of component\n | Island of island\n | Macro of macro\n | Thunk of value * env\n | Continuation of (value -> value) * dict option\n | NativeFn of string * (value list -> value)\n | Signal of signal\n | RawHTML of string\n | Spread of (string * value) list\n | SxExpr of string (** Opaque SX wire-format string — aser output. *)\n | Env of env (** First-class environment — used by CEK machine state dicts. *)\n | ListRef of value list ref (** Mutable list — JS-style array for append! *)\n | CekState of cek_state (** Optimized CEK machine state — avoids Dict allocation. *)\n | CekFrame of cek_frame (** Optimized CEK continuation frame. *)\n | VmClosure of vm_closure (** VM-compiled closure — callable within the VM without allocating a new VM. *)\n\n(** CEK machine state — record instead of Dict for performance.\n 5 fields × 55K steps/sec = 275K Hashtbl allocations/sec eliminated. *)\nand cek_state = {\n cs_control : value;\n cs_env : value;\n cs_kont : value;\n cs_phase : string;\n cs_value : value;\n}\n\n(** CEK continuation frame — tagged record covering all 29 frame types.\n Fields are named generically; not all are used by every frame type.\n Eliminates ~100K Hashtbl allocations per page render. *)\nand cek_frame = {\n cf_type : string; (* frame type tag: \"if\", \"let\", \"call\", etc. *)\n cf_env : value; (* environment — every frame has this *)\n cf_name : value; (* let/define/set/scope: binding name *)\n cf_body : value; (* when/let: body expr *)\n cf_remaining : value; (* begin/cond/map/etc: remaining exprs *)\n cf_f : value; (* call/map/filter/etc: function *)\n cf_args : value; (* call: raw args; arg: evaled args *)\n cf_results : value; (* map/filter/dict: accumulated results *)\n cf_extra : value; (* extra field: scheme, indexed, value, phase, etc. *)\n cf_extra2 : value; (* second extra: emitted, etc. *)\n}\n\n(** Mutable string-keyed table (SX dicts support [dict-set!]). *)\nand dict = (string, value) Hashtbl.t\n\nand lambda = {\n l_params : string list;\n l_body : value;\n l_closure : env;\n mutable l_name : string option;\n mutable l_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand component = {\n c_name : string;\n c_params : string list;\n c_has_children : bool;\n c_body : value;\n c_closure : env;\n c_affinity : string; (** \"auto\" | \"client\" | \"server\" *)\n mutable c_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand island = {\n i_name : string;\n i_params : string list;\n i_has_children : bool;\n i_body : value;\n i_closure : env;\n}\n\nand macro = {\n m_params : string list;\n m_rest_param : string option;\n m_body : value;\n m_closure : env;\n m_name : string option;\n}\n\nand signal = {\n mutable s_value : value;\n mutable s_subscribers : (unit -> unit) list;\n mutable s_deps : signal list;\n}\n\n(** {1 Bytecode VM types}\n\n Defined here (not in sx_vm.ml) because [vm_code.constants] references\n [value] and [lambda.l_compiled] references [vm_closure] — mutual\n recursion requires all types in one [and] chain. *)\n\n(** Compiled function body — bytecode + constant pool. *)\nand vm_code = {\n vc_arity : int;\n vc_locals : int;\n vc_bytecode : int array;\n vc_constants : value array;\n}\n\n(** Upvalue cell — shared mutable reference to a captured variable. *)\nand vm_upvalue_cell = {\n mutable uv_value : value;\n}\n\n(** Closure — compiled code + captured upvalues + live env reference. *)\nand vm_closure = {\n vm_code : vm_code;\n vm_upvalues : vm_upvalue_cell array;\n vm_name : string option;\n vm_env_ref : (string, value) Hashtbl.t;\n vm_closure_env : env option; (** Original closure env for inner functions *)\n}\n\n\n(** {1 Forward ref for calling VM closures from outside the VM} *)\n\nlet _vm_call_closure_ref : (vm_closure -> value list -> value) ref =\n ref (fun _ _ -> raise (Failure \"VM call_closure not initialized\"))\n\n\n(** {1 Errors} *)\n\nexception Eval_error of string\nexception Parse_error of string\n\n\n(** {1 Environment operations} *)\n\nlet make_env () =\n { bindings = Hashtbl.create 16; parent = None }\n\nlet env_extend parent =\n { bindings = Hashtbl.create 16; parent = Some parent }\n\nlet env_bind env name v =\n Hashtbl.replace env.bindings name v; Nil\n\nlet rec env_has env name =\n Hashtbl.mem env.bindings name ||\n match env.parent with Some p -> env_has p name | None -> false\n\nlet rec env_get env name =\n match Hashtbl.find_opt env.bindings name with\n | Some v -> v\n | None ->\n match env.parent with\n | Some p -> env_get p name\n | None ->\n raise (Eval_error (\"Undefined symbol: \" ^ name))\n\nlet rec env_set env name v =\n if Hashtbl.mem env.bindings name then\n (Hashtbl.replace env.bindings name v; Nil)\n else\n match env.parent with\n | Some p -> env_set p name v\n | None -> Hashtbl.replace env.bindings name v; Nil\n\nlet env_merge base overlay =\n (* If base and overlay are the same env (physical equality) or overlay\n is a descendant of base, just extend base — no copying needed.\n This prevents set! inside lambdas from modifying shadow copies. *)\n if base == overlay then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n (* Check if overlay is a descendant of base *)\n let rec is_descendant e depth =\n if depth > 100 then false\n else if e == base then true\n else match e.parent with Some p -> is_descendant p (depth + 1) | None -> false\n in\n if is_descendant overlay 0 then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n (* General case: extend base, copy ONLY overlay bindings that don't\n exist anywhere in the base chain (avoids shadowing closure bindings). *)\n let e = { bindings = Hashtbl.create 16; parent = Some base } in\n Hashtbl.iter (fun k v ->\n if not (env_has base k) then Hashtbl.replace e.bindings k v\n ) overlay.bindings;\n e\n end\n end\n\n\n(** {1 Value extraction helpers} *)\n\nlet value_to_string = function\n | String s -> s | Symbol s -> s | Keyword k -> k\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Bool true -> \"true\" | Bool false -> \"false\"\n | Nil -> \"\" | _ -> \"\"\n\nlet value_to_string_list = function\n | List items | ListRef { contents = items } -> List.map value_to_string items\n | _ -> []\n\nlet value_to_bool = function\n | Bool b -> b | Nil -> false | _ -> true\n\nlet value_to_string_opt = function\n | String s -> Some s | Symbol s -> Some s | Nil -> None | _ -> None\n\n\n(** {1 Constructors — accept [value] args from transpiled code} *)\n\nlet unwrap_env_val = function\n | Env e -> e\n | _ -> raise (Eval_error \"make_lambda: expected env for closure\")\n\nlet make_lambda params body closure =\n let ps = match params with\n | List items -> List.map value_to_string items\n | _ -> value_to_string_list params\n in\n Lambda { l_params = ps; l_body = body; l_closure = unwrap_env_val closure; l_name = None; l_compiled = None }\n\nlet make_component name params has_children body closure affinity =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n let aff = match affinity with String s -> s | _ -> \"auto\" in\n Component {\n c_name = n; c_params = ps; c_has_children = hc;\n c_body = body; c_closure = unwrap_env_val closure; c_affinity = aff;\n c_compiled = None;\n }\n\nlet make_island name params has_children body closure =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n Island {\n i_name = n; i_params = ps; i_has_children = hc;\n i_body = body; i_closure = unwrap_env_val closure;\n }\n\nlet make_macro params rest_param body closure name =\n let ps = value_to_string_list params in\n let rp = value_to_string_opt rest_param in\n let n = value_to_string_opt name in\n Macro {\n m_params = ps; m_rest_param = rp;\n m_body = body; m_closure = unwrap_env_val closure; m_name = n;\n }\n\nlet make_thunk expr env = Thunk (expr, unwrap_env_val env)\n\nlet make_symbol name = Symbol (value_to_string name)\nlet make_keyword name = Keyword (value_to_string name)\n\n\n(** {1 Type inspection} *)\n\nlet type_of = function\n | Nil -> \"nil\"\n | Bool _ -> \"boolean\"\n | Number _ -> \"number\"\n | String _ -> \"string\"\n | Symbol _ -> \"symbol\"\n | Keyword _ -> \"keyword\"\n | List _ | ListRef _ -> \"list\"\n | Dict _ -> \"dict\"\n | Lambda _ -> \"lambda\"\n | Component _ -> \"component\"\n | Island _ -> \"island\"\n | Macro _ -> \"macro\"\n | Thunk _ -> \"thunk\"\n | Continuation (_, _) -> \"continuation\"\n | NativeFn _ -> \"function\"\n | Signal _ -> \"signal\"\n | RawHTML _ -> \"raw-html\"\n | Spread _ -> \"spread\"\n | SxExpr _ -> \"sx-expr\"\n | Env _ -> \"env\"\n | CekState _ -> \"dict\" (* CEK state behaves as a dict for type checks *)\n | CekFrame _ -> \"dict\"\n | VmClosure _ -> \"function\"\n\nlet is_nil = function Nil -> true | _ -> false\nlet is_lambda = function Lambda _ -> true | _ -> false\nlet is_component = function Component _ -> true | _ -> false\nlet is_island = function Island _ -> true | _ -> false\nlet is_macro = function Macro _ -> true | _ -> false\nlet is_thunk = function Thunk _ -> true | _ -> false\nlet is_signal = function\n | Signal _ -> true\n | Dict d -> Hashtbl.mem d \"__signal\"\n | _ -> false\n\nlet is_callable = function\n | Lambda _ | NativeFn _ | Continuation (_, _) | VmClosure _ -> true\n | _ -> false\n\n\n(** {1 Truthiness} *)\n\n(** SX truthiness: everything is truthy except [Nil] and [Bool false]. *)\nlet sx_truthy = function\n | Nil | Bool false -> false\n | _ -> true\n\n\n(** {1 Accessors} *)\n\nlet symbol_name = function\n | Symbol s -> String s\n | v -> raise (Eval_error (\"Expected symbol, got \" ^ type_of v))\n\nlet keyword_name = function\n | Keyword k -> String k\n | v -> raise (Eval_error (\"Expected keyword, got \" ^ type_of v))\n\nlet lambda_params = function\n | Lambda l -> List (List.map (fun s -> String s) l.l_params)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_body = function\n | Lambda l -> l.l_body\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_closure = function\n | Lambda l -> Env l.l_closure\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_name = function\n | Lambda l -> (match l.l_name with Some n -> String n | None -> Nil)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet set_lambda_name l n = match l with\n | Lambda l -> l.l_name <- Some n; Nil\n | _ -> raise (Eval_error \"set-lambda-name!: not a lambda\")\n\nlet component_name = function\n | Component c -> String c.c_name\n | Island i -> String i.i_name\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_params = function\n | Component c -> List (List.map (fun s -> String s) c.c_params)\n | Island i -> List (List.map (fun s -> String s) i.i_params)\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_body = function\n | Component c -> c.c_body\n | Island i -> i.i_body\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_closure = function\n | Component c -> Env c.c_closure\n | Island i -> Env i.i_closure\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_has_children = function\n | Component c -> Bool c.c_has_children\n | Island i -> Bool i.i_has_children\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_affinity = function\n | Component c -> String c.c_affinity\n | Island _ -> String \"client\"\n | _ -> String \"auto\"\n\nlet macro_params = function\n | Macro m -> List (List.map (fun s -> String s) m.m_params)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_rest_param = function\n | Macro m -> (match m.m_rest_param with Some s -> String s | None -> Nil)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_body = function\n | Macro m -> m.m_body\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_closure = function\n | Macro m -> Env m.m_closure\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet thunk_expr = function\n | Thunk (e, _) -> e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\nlet thunk_env = function\n | Thunk (_, e) -> Env e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\n\n(** {1 Dict operations} *)\n\nlet make_dict () : dict = Hashtbl.create 8\n\nlet dict_get (d : dict) key =\n match Hashtbl.find_opt d key with Some v -> v | None -> Nil\n\nlet dict_has (d : dict) key = Hashtbl.mem d key\n\nlet dict_set (d : dict) key v = Hashtbl.replace d key v\n\nlet dict_delete (d : dict) key = Hashtbl.remove d key\n\nlet dict_keys (d : dict) =\n Hashtbl.fold (fun k _ acc -> String k :: acc) d []\n\nlet dict_vals (d : dict) =\n Hashtbl.fold (fun _ v acc -> v :: acc) d []\n\n\n(** {1 Value display} *)\n\nlet rec inspect = function\n | Nil -> \"nil\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then Printf.sprintf \"%d\" (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s ->\n let buf = Buffer.create (String.length s + 2) in\n Buffer.add_char buf '\"';\n String.iter (function\n | '\"' -> Buffer.add_string buf \"\\\\\\\"\"\n | '\\\\' -> Buffer.add_string buf \"\\\\\\\\\"\n | '\\n' -> Buffer.add_string buf \"\\\\n\"\n | '\\r' -> Buffer.add_string buf \"\\\\r\"\n | '\\t' -> Buffer.add_string buf \"\\\\t\"\n | c -> Buffer.add_char buf c) s;\n Buffer.add_char buf '\"';\n Buffer.contents buf\n | Symbol s -> s\n | Keyword k -> \":\" ^ k\n | List items | ListRef { contents = items } ->\n \"(\" ^ String.concat \" \" (List.map inspect items) ^ \")\"\n | Dict d ->\n let pairs = Hashtbl.fold (fun k v acc ->\n (Printf.sprintf \":%s %s\" k (inspect v)) :: acc) d [] in\n \"{\" ^ String.concat \" \" pairs ^ \"}\"\n | Lambda l ->\n let tag = match l.l_name with Some n -> n | None -> \"lambda\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" l.l_params)\n | Component c ->\n Printf.sprintf \"\" c.c_name (String.concat \", \" c.c_params)\n | Island i ->\n Printf.sprintf \"\" i.i_name (String.concat \", \" i.i_params)\n | Macro m ->\n let tag = match m.m_name with Some n -> n | None -> \"macro\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" m.m_params)\n | Thunk _ -> \"\"\n | Continuation (_, _) -> \"\"\n | NativeFn (name, _) -> Printf.sprintf \"\" name\n | Signal _ -> \"\"\n | RawHTML s -> Printf.sprintf \"\" (String.length s)\n | Spread _ -> \"\"\n | SxExpr s -> Printf.sprintf \"\" (String.length s)\n | Env _ -> \"\"\n | CekState _ -> \"\"\n | CekFrame f -> Printf.sprintf \"\" f.cf_type\n | VmClosure cl -> Printf.sprintf \"\" (match cl.vm_name with Some n -> n | None -> \"anon\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":76650},"map":{"version":3,"sources":["/workspace_root/lib/sx_primitives.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Built-in primitive functions (~80 pure functions).\n\n Registered in a global table; the evaluator checks this table\n when a symbol isn't found in the lexical environment. *)\n\nopen Sx_types\n\nlet primitives : (string, value list -> value) Hashtbl.t = Hashtbl.create 128\n\n(** Forward refs for calling SX functions from primitives (breaks cycle). *)\nlet _sx_call_fn : (value -> value list -> value) ref =\n ref (fun _ _ -> raise (Eval_error \"sx_call not initialized\"))\nlet _sx_trampoline_fn : (value -> value) ref =\n ref (fun v -> v)\n\nlet register name fn = Hashtbl.replace primitives name fn\n\nlet is_primitive name = Hashtbl.mem primitives name\n\nlet get_primitive name =\n match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(* --- Helpers --- *)\n\n(* Trampoline hook — set by sx_ref after initialization to break circular dep *)\nlet trampoline_hook : (value -> value) ref = ref (fun v -> v)\n\nlet rec as_number = function\n | Number n -> n\n | Bool true -> 1.0\n | Bool false -> 0.0\n | Nil -> 0.0\n | String s -> (match float_of_string_opt s with Some n -> n | None -> Float.nan)\n | Thunk _ as t ->\n (* Trampoline thunks — they shouldn't leak but sometimes do *)\n as_number (!trampoline_hook t)\n | v -> raise (Eval_error (\"Expected number, got \" ^ type_of v ^ \": \" ^ (match v with Dict d -> (match Hashtbl.find_opt d \"__signal\" with Some _ -> \"signal{value=\" ^ (match Hashtbl.find_opt d \"value\" with Some v' -> value_to_string v' | None -> \"?\") ^ \"}\" | None -> \"dict\") | _ -> \"\")))\n\nlet as_string = function\n | String s -> s\n | v -> raise (Eval_error (\"Expected string, got \" ^ type_of v))\n\nlet rec as_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | Thunk _ as t -> as_list (!_sx_trampoline_fn t)\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\nlet as_bool = function\n | Bool b -> b\n | v -> sx_truthy v\n\nlet rec to_string = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | Thunk _ as t -> to_string (!trampoline_hook t)\n | v -> inspect v\n\nlet () =\n (* === Arithmetic === *)\n register \"+\" (fun args ->\n Number (List.fold_left (fun acc a -> acc +. as_number a) 0.0 args));\n register \"-\" (fun args ->\n match args with\n | [] -> Number 0.0\n | [a] -> Number (-. (as_number a))\n | a :: rest -> Number (List.fold_left (fun acc x -> acc -. as_number x) (as_number a) rest));\n register \"*\" (fun args ->\n Number (List.fold_left (fun acc a -> acc *. as_number a) 1.0 args));\n register \"/\" (fun args ->\n match args with\n | [a; b] -> Number (as_number a /. as_number b)\n | _ -> raise (Eval_error \"/: expected 2 args\"));\n register \"mod\" (fun args ->\n match args with\n | [a; b] -> Number (Float.rem (as_number a) (as_number b))\n | _ -> raise (Eval_error \"mod: expected 2 args\"));\n register \"inc\" (fun args ->\n match args with [a] -> Number (as_number a +. 1.0) | _ -> raise (Eval_error \"inc: 1 arg\"));\n register \"dec\" (fun args ->\n match args with [a] -> Number (as_number a -. 1.0) | _ -> raise (Eval_error \"dec: 1 arg\"));\n register \"abs\" (fun args ->\n match args with [a] -> Number (Float.abs (as_number a)) | _ -> raise (Eval_error \"abs: 1 arg\"));\n register \"floor\" (fun args ->\n match args with [a] -> Number (floor (as_number a))\n | _ -> raise (Eval_error \"floor: 1 arg\"));\n register \"ceil\" (fun args ->\n match args with [a] -> Number (ceil (as_number a))\n | _ -> raise (Eval_error \"ceil: 1 arg\"));\n register \"round\" (fun args ->\n match args with\n | [a] -> Number (Float.round (as_number a))\n | [a; b] ->\n let n = as_number a and places = int_of_float (as_number b) in\n let factor = 10.0 ** float_of_int places in\n Number (Float.round (n *. factor) /. factor)\n | _ -> raise (Eval_error \"round: 1-2 args\"));\n register \"min\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"min: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.min acc (as_number a)) Float.infinity args));\n register \"max\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"max: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.max acc (as_number a)) Float.neg_infinity args));\n register \"sqrt\" (fun args ->\n match args with [a] -> Number (Float.sqrt (as_number a)) | _ -> raise (Eval_error \"sqrt: 1 arg\"));\n register \"pow\" (fun args ->\n match args with [a; b] -> Number (as_number a ** as_number b)\n | _ -> raise (Eval_error \"pow: 2 args\"));\n register \"clamp\" (fun args ->\n match args with\n | [x; lo; hi] ->\n let x = as_number x and lo = as_number lo and hi = as_number hi in\n Number (Float.max lo (Float.min hi x))\n | _ -> raise (Eval_error \"clamp: 3 args\"));\n register \"parse-int\" (fun args ->\n match args with\n | [String s] -> (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> Nil)\n | [String s; default_val] ->\n (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> default_val)\n | [Number n] | [Number n; _] -> Number (float_of_int (int_of_float n))\n | [_; default_val] -> default_val\n | _ -> Nil);\n register \"parse-float\" (fun args ->\n match args with\n | [String s] -> (match float_of_string_opt s with Some n -> Number n | None -> Nil)\n | [Number n] -> Number n\n | _ -> Nil);\n\n (* === Comparison === *)\n (* Safe equality: physical equality for potentially-circular types\n (Dict, Lambda, Component, Island, Signal, NativeFn),\n structural equality for acyclic types (Number, String, Bool, etc.).\n Lists are compared element-wise recursively with the same safety. *)\n let rec safe_eq a b =\n if a == b then true (* physical equality fast path *)\n else match a, b with\n | Number x, Number y -> x = y\n | String x, String y -> x = y\n | Bool x, Bool y -> x = y\n | Nil, Nil -> true\n | Symbol x, Symbol y -> x = y\n | Keyword x, Keyword y -> x = y\n | (List la | ListRef { contents = la }),\n (List lb | ListRef { contents = lb }) ->\n List.length la = List.length lb &&\n List.for_all2 safe_eq la lb\n (* Dict: check __host_handle for DOM node identity *)\n | Dict a, Dict b ->\n (match Hashtbl.find_opt a \"__host_handle\", Hashtbl.find_opt b \"__host_handle\" with\n | Some (Number ha), Some (Number hb) -> ha = hb\n | _ -> false)\n (* Lambda/Component/Island/Signal/NativeFn: physical only *)\n | _ -> false\n in\n register \"=\" (fun args ->\n match args with\n | [a; b] -> Bool (safe_eq a b)\n | _ -> raise (Eval_error \"=: 2 args\"));\n register \"!=\" (fun args ->\n match args with\n | [a; b] -> Bool (not (safe_eq a b))\n | _ -> raise (Eval_error \"!=: 2 args\"));\n register \"<\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a < b)\n | [a; b] -> Bool (as_number a < as_number b)\n | _ -> raise (Eval_error \"<: 2 args\"));\n register \">\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a > b)\n | [a; b] -> Bool (as_number a > as_number b)\n | _ -> raise (Eval_error \">: 2 args\"));\n register \"<=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a <= b)\n | [a; b] -> Bool (as_number a <= as_number b)\n | _ -> raise (Eval_error \"<=: 2 args\"));\n register \">=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a >= b)\n | [a; b] -> Bool (as_number a >= as_number b)\n | _ -> raise (Eval_error \">=: 2 args\"));\n\n (* === Logic === *)\n register \"not\" (fun args ->\n match args with [a] -> Bool (not (sx_truthy a)) | _ -> raise (Eval_error \"not: 1 arg\"));\n\n (* === Predicates === *)\n register \"nil?\" (fun args ->\n match args with [a] -> Bool (is_nil a) | _ -> raise (Eval_error \"nil?: 1 arg\"));\n register \"number?\" (fun args ->\n match args with [Number _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"number?: 1 arg\"));\n register \"string?\" (fun args ->\n match args with [String _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"string?: 1 arg\"));\n register \"boolean?\" (fun args ->\n match args with [Bool _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"boolean?: 1 arg\"));\n register \"list?\" (fun args ->\n match args with [List _] | [ListRef _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"list?: 1 arg\"));\n register \"dict?\" (fun args ->\n match args with [Dict _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"dict?: 1 arg\"));\n register \"symbol?\" (fun args ->\n match args with [Symbol _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"symbol?: 1 arg\"));\n register \"keyword?\" (fun args ->\n match args with [Keyword _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"keyword?: 1 arg\"));\n register \"empty?\" (fun args ->\n match args with\n | [List []] | [ListRef { contents = [] }] -> Bool true\n | [List _] | [ListRef _] -> Bool false\n | [String \"\"] -> Bool true | [String _] -> Bool false\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | [Nil] -> Bool true\n | [_] -> Bool false\n | _ -> raise (Eval_error \"empty?: 1 arg\"));\n register \"odd?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 <> 0) | _ -> raise (Eval_error \"odd?: 1 arg\"));\n register \"even?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 = 0) | _ -> raise (Eval_error \"even?: 1 arg\"));\n register \"zero?\" (fun args ->\n match args with [a] -> Bool (as_number a = 0.0) | _ -> raise (Eval_error \"zero?: 1 arg\"));\n\n (* === Strings === *)\n register \"str\" (fun args -> String (String.concat \"\" (List.map to_string args)));\n register \"upper\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upper: 1 arg\"));\n register \"upcase\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upcase: 1 arg\"));\n register \"lower\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"lower: 1 arg\"));\n register \"downcase\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"downcase: 1 arg\"));\n register \"trim\" (fun args ->\n match args with [a] -> String (String.trim (as_string a)) | _ -> raise (Eval_error \"trim: 1 arg\"));\n register \"string-length\" (fun args ->\n match args with [a] -> Number (float_of_int (String.length (as_string a)))\n | _ -> raise (Eval_error \"string-length: 1 arg\"));\n register \"string-contains?\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let rec find i =\n if i + String.length needle > String.length haystack then false\n else if String.sub haystack i (String.length needle) = needle then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"string-contains?: 2 string args\"));\n register \"starts-with?\" (fun args ->\n match args with\n | [String s; String prefix] ->\n Bool (String.length s >= String.length prefix &&\n String.sub s 0 (String.length prefix) = prefix)\n | _ -> raise (Eval_error \"starts-with?: 2 string args\"));\n register \"ends-with?\" (fun args ->\n match args with\n | [String s; String suffix] ->\n let sl = String.length s and xl = String.length suffix in\n Bool (sl >= xl && String.sub s (sl - xl) xl = suffix)\n | _ -> raise (Eval_error \"ends-with?: 2 string args\"));\n register \"index-of\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let nl = String.length needle and hl = String.length haystack in\n let rec find i =\n if i + nl > hl then Number (-1.0)\n else if String.sub haystack i nl = needle then Number (float_of_int i)\n else find (i + 1)\n in find 0\n | _ -> raise (Eval_error \"index-of: 2 string args\"));\n register \"substring\" (fun args ->\n match args with\n | [String s; Number start; Number end_] ->\n let i = int_of_float start and j = int_of_float end_ in\n let len = String.length s in\n let i = max 0 (min i len) and j = max 0 (min j len) in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"substring: 3 args\"));\n register \"substr\" (fun args ->\n match args with\n | [String s; Number start; Number len] ->\n let i = int_of_float start and n = int_of_float len in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n let n = max 0 (min n (sl - i)) in\n String (String.sub s i n)\n | [String s; Number start] ->\n let i = int_of_float start in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n String (String.sub s i (sl - i))\n | _ -> raise (Eval_error \"substr: 2-3 args\"));\n register \"split\" (fun args ->\n match args with\n | [String s; String sep] ->\n List (List.map (fun p -> String p) (String.split_on_char sep.[0] s))\n | _ -> raise (Eval_error \"split: 2 args\"));\n register \"join\" (fun args ->\n match args with\n | [String sep; (List items | ListRef { contents = items })] ->\n String (String.concat sep (List.map to_string items))\n | _ -> raise (Eval_error \"join: 2 args\"));\n register \"replace\" (fun args ->\n let to_str = function\n | String s -> s | SxExpr s -> s | RawHTML s -> s\n | Keyword k -> k | Symbol s -> s\n | Nil -> \"\" | Bool true -> \"true\" | Bool false -> \"false\"\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Thunk _ as t -> (match !_sx_trampoline_fn t with String s -> s | v -> to_string v)\n | v -> to_string v\n in\n match args with\n | [s; old_s; new_s] ->\n let s = to_str s and old_s = to_str old_s and new_s = to_str new_s in\n let ol = String.length old_s in\n if ol = 0 then String s\n else begin\n let buf = Buffer.create (String.length s) in\n let rec go i =\n if i >= String.length s then ()\n else if i + ol <= String.length s && String.sub s i ol = old_s then begin\n Buffer.add_string buf new_s;\n go (i + ol)\n end else begin\n Buffer.add_char buf s.[i];\n go (i + 1)\n end\n in go 0;\n String (Buffer.contents buf)\n end\n | _ -> raise (Eval_error \"replace: 3 string args\"));\n register \"char-from-code\" (fun args ->\n match args with\n | [Number n] ->\n let buf = Buffer.create 4 in\n Buffer.add_utf_8_uchar buf (Uchar.of_int (int_of_float n));\n String (Buffer.contents buf)\n | _ -> raise (Eval_error \"char-from-code: 1 arg\"));\n\n (* === Collections === *)\n register \"list\" (fun args -> ListRef (ref args));\n register \"len\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> Number (float_of_int (List.length l))\n | [String s] -> Number (float_of_int (String.length s))\n | [Dict d] -> Number (float_of_int (Hashtbl.length d))\n | [Nil] | [Bool false] -> Number 0.0\n | [Bool true] -> Number 1.0\n | [Number _] -> Number 1.0\n | [RawHTML s] -> Number (float_of_int (String.length s))\n | [SxExpr s] -> Number (float_of_int (String.length s))\n | [Spread pairs] -> Number (float_of_int (List.length pairs))\n | [Component _] | [Island _] | [Lambda _] | [NativeFn _]\n | [Macro _] | [Thunk _] | [Keyword _] | [Symbol _] -> Number 0.0\n | _ -> raise (Eval_error (Printf.sprintf \"len: %d args\"\n (List.length args))));\n register \"first\" (fun args ->\n match args with\n | [List (x :: _)] | [ListRef { contents = x :: _ }] -> x\n | [List []] | [ListRef { contents = [] }] -> Nil | [Nil] -> Nil\n | [x] -> raise (Eval_error (\"first: expected list, got \" ^ inspect x))\n | _ -> raise (Eval_error \"first: 1 list arg\"));\n register \"rest\" (fun args ->\n match args with\n | [List (_ :: xs)] | [ListRef { contents = _ :: xs }] -> List xs\n | [List []] | [ListRef { contents = [] }] -> List [] | [Nil] -> List []\n | _ -> raise (Eval_error \"rest: 1 list arg\"));\n register \"last\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error \"last: 1 list arg\"));\n register \"init\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with _ :: rest -> List (List.rev rest) | [] -> List [])\n | _ -> raise (Eval_error \"init: 1 list arg\"));\n register \"nth\" (fun args ->\n match args with\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [String s; Number n] ->\n let i = int_of_float n in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> raise (Eval_error \"nth: list/string and number\"));\n register \"cons\" (fun args ->\n match args with\n | [x; List l] | [x; ListRef { contents = l }] -> List (x :: l)\n | [x; Nil] -> List [x]\n | _ -> raise (Eval_error \"cons: value and list\"));\n register \"append\" (fun args ->\n match args with\n | [List la | ListRef { contents = la }; List lb | ListRef { contents = lb }] ->\n List (la @ lb)\n | [List la | ListRef { contents = la }; Nil] -> List la\n | [Nil; List lb | ListRef { contents = lb }] -> List lb\n | [List la | ListRef { contents = la }; v] -> List (la @ [v])\n | [v; List lb | ListRef { contents = lb }] -> List ([v] @ lb)\n | _ ->\n let all = List.concat_map as_list args in\n List all);\n register \"reverse\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.rev l)\n | _ -> raise (Eval_error \"reverse: 1 list\"));\n register \"flatten\" (fun args ->\n let rec flat = function\n | List items | ListRef { contents = items } -> List.concat_map flat items\n | x -> [x]\n in\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.concat_map flat l)\n | _ -> raise (Eval_error \"flatten: 1 list\"));\n register \"concat\" (fun args -> List (List.concat_map as_list args));\n register \"contains?\" (fun args ->\n match args with\n | [List l; item] | [ListRef { contents = l }; item] ->\n (* Physical equality first (handles signals/dicts/closures safely),\n structural fallback only for acyclic types (string/number/bool/nil/symbol/keyword) *)\n let safe_eq a b =\n a == b ||\n (match a, b with\n | Number x, Number y -> x = y\n | String x, String y -> x = y\n | Bool x, Bool y -> x = y\n | Nil, Nil -> true\n | Symbol x, Symbol y -> x = y\n | Keyword x, Keyword y -> x = y\n | Dict a, Dict b ->\n (match Hashtbl.find_opt a \"__host_handle\", Hashtbl.find_opt b \"__host_handle\" with\n | Some (Number ha), Some (Number hb) -> ha = hb\n | _ -> false)\n | _ -> false)\n in\n Bool (List.exists (fun x -> safe_eq x item) l)\n | [String s; String sub] ->\n let rec find i =\n if i + String.length sub > String.length s then false\n else if String.sub s i (String.length sub) = sub then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"contains?: 2 args\"));\n register \"range\" (fun args ->\n match args with\n | [Number stop] ->\n let n = int_of_float stop in\n List (List.init (max 0 n) (fun i -> Number (float_of_int i)))\n | [Number start; Number stop] ->\n let s = int_of_float start and e = int_of_float stop in\n let len = max 0 (e - s) in\n List (List.init len (fun i -> Number (float_of_int (s + i))))\n | [Number start; Number stop; Number step] ->\n let s = start and e = stop and st = step in\n if st = 0.0 then List []\n else\n let items = ref [] in\n let i = ref s in\n if st > 0.0 then\n (while !i < e do items := Number !i :: !items; i := !i +. st done)\n else\n (while !i > e do items := Number !i :: !items; i := !i +. st done);\n List (List.rev !items)\n | _ -> raise (Eval_error \"range: 1-3 args\"));\n register \"slice\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number start] ->\n let i = max 0 (int_of_float start) in\n let rec drop n = function _ :: xs when n > 0 -> drop (n-1) xs | l -> l in\n List (drop i l)\n | [(List l | ListRef { contents = l }); Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let len = List.length l in\n let j = min j len in\n let rec take_range idx = function\n | [] -> []\n | x :: xs ->\n if idx >= j then []\n else if idx >= i then x :: take_range (idx+1) xs\n else take_range (idx+1) xs\n in List (take_range 0 l)\n | [String s; Number start] ->\n let i = max 0 (int_of_float start) in\n String (String.sub s i (max 0 (String.length s - i)))\n | [String s; Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let sl = String.length s in\n let j = min j sl in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"slice: 2-3 args\"));\n register \"sort\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.sort compare l)\n | _ -> raise (Eval_error \"sort: 1 list\"));\n register \"zip\" (fun args ->\n match args with\n | [a; b] ->\n let la = as_list a and lb = as_list b in\n let rec go l1 l2 acc = match l1, l2 with\n | x :: xs, y :: ys -> go xs ys (List [x; y] :: acc)\n | _ -> List.rev acc\n in List (go la lb [])\n | _ -> raise (Eval_error \"zip: 2 lists\"));\n register \"zip-pairs\" (fun args ->\n match args with\n | [v] ->\n let l = as_list v in\n let rec go = function\n | a :: b :: rest -> List [a; b] :: go rest\n | _ -> []\n in List (go l)\n | _ -> raise (Eval_error \"zip-pairs: 1 list\"));\n register \"take\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in List (take_n (int_of_float n) l)\n | _ -> raise (Eval_error \"take: list and number\"));\n register \"drop\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in List (drop_n (int_of_float n) l)\n | _ -> raise (Eval_error \"drop: list and number\"));\n register \"chunk-every\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let size = int_of_float n in\n let rec go = function\n | [] -> []\n | l ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in\n List (take_n size l) :: go (drop_n size l)\n in List (go l)\n | _ -> raise (Eval_error \"chunk-every: list and number\"));\n register \"unique\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l })] ->\n let seen = Hashtbl.create 16 in\n let result = List.filter (fun x ->\n let key = inspect x in\n if Hashtbl.mem seen key then false\n else (Hashtbl.replace seen key true; true)\n ) l in\n List result\n | _ -> raise (Eval_error \"unique: 1 list\"));\n\n (* === Dict === *)\n register \"dict\" (fun args ->\n let d = make_dict () in\n let rec go = function\n | [] -> Dict d\n | Keyword k :: v :: rest -> dict_set d k v; go rest\n | String k :: v :: rest -> dict_set d k v; go rest\n | _ -> raise (Eval_error \"dict: pairs of key value\")\n in go args);\n register \"get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [Nil; _] -> Nil (* nil.anything → nil *)\n | [_; _] -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n | _ -> Nil);\n register \"has-key?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | [Dict d; Keyword k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"has-key?: dict and key\"));\n register \"assoc\" (fun args ->\n match args with\n | Dict d :: rest ->\n let d2 = Hashtbl.copy d in\n let rec go = function\n | [] -> Dict d2\n | String k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | Keyword k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | _ -> raise (Eval_error \"assoc: pairs\")\n in go rest\n | _ -> raise (Eval_error \"assoc: dict + pairs\"));\n register \"dissoc\" (fun args ->\n match args with\n | Dict d :: keys ->\n let d2 = Hashtbl.copy d in\n List.iter (fun k -> Hashtbl.remove d2 (to_string k)) keys;\n Dict d2\n | _ -> raise (Eval_error \"dissoc: dict + keys\"));\n register \"merge\" (fun args ->\n let d = make_dict () in\n List.iter (function\n | Dict src -> Hashtbl.iter (fun k v -> Hashtbl.replace d k v) src\n | _ -> raise (Eval_error \"merge: all args must be dicts\")\n ) args;\n Dict d);\n register \"keys\" (fun args ->\n match args with [Dict d] -> List (dict_keys d) | _ -> raise (Eval_error \"keys: 1 dict\"));\n register \"vals\" (fun args ->\n match args with [Dict d] -> List (dict_vals d) | _ -> raise (Eval_error \"vals: 1 dict\"));\n register \"mutable-list\" (fun _args -> ListRef (ref []));\n register \"set-nth!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n let l = !r in\n r := List.mapi (fun j x -> if j = i then v else x) l;\n Nil\n | [List _; _; _] ->\n raise (Eval_error \"set-nth!: list is immutable, use ListRef\")\n | _ -> raise (Eval_error \"set-nth!: expected (list idx val)\"));\n register \"dict-set!\" (fun args ->\n match args with\n | [Dict d; String k; v] -> dict_set d k v; v\n | [Dict d; Keyword k; v] -> dict_set d k v; v\n | _ -> raise (Eval_error \"dict-set!: dict key val\"));\n register \"dict-get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | _ -> raise (Eval_error \"dict-get: dict and key\"));\n register \"dict-has?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"dict-has?: dict and key\"));\n register \"dict-delete!\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_delete d k; Nil\n | _ -> raise (Eval_error \"dict-delete!: dict and key\"));\n\n (* === Misc === *)\n register \"type-of\" (fun args ->\n match args with [a] -> String (type_of a) | _ -> raise (Eval_error \"type-of: 1 arg\"));\n register \"inspect\" (fun args ->\n match args with [a] -> String (inspect a) | _ -> raise (Eval_error \"inspect: 1 arg\"));\n register \"serialize\" (fun args ->\n match args with\n | [a] -> String (inspect a) (* used for dedup keys in compiler *)\n | _ -> raise (Eval_error \"serialize: 1 arg\"));\n register \"make-symbol\" (fun args ->\n match args with\n | [String s] -> Symbol s\n | _ -> raise (Eval_error \"make-symbol: expected string\"));\n register \"error\" (fun args ->\n match args with [String msg] -> raise (Eval_error msg)\n | [a] -> raise (Eval_error (to_string a))\n | _ -> raise (Eval_error \"error: 1 arg\"));\n register \"apply\" (fun args ->\n match args with\n | [NativeFn (_, f); (List a | ListRef { contents = a })] -> f a\n | [NativeFn (_, f); Nil] -> f []\n | _ -> raise (Eval_error \"apply: function and list\"));\n register \"identical?\" (fun args ->\n match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?: 2 args\"));\n register \"make-spread\" (fun args ->\n match args with\n | [Dict d] ->\n let pairs = Hashtbl.fold (fun k v acc -> (k, v) :: acc) d [] in\n Spread pairs\n | _ -> raise (Eval_error \"make-spread: 1 dict\"));\n register \"spread?\" (fun args ->\n match args with [Spread _] -> Bool true | [_] -> Bool false\n | _ -> raise (Eval_error \"spread?: 1 arg\"));\n register \"spread-attrs\" (fun args ->\n match args with\n | [Spread pairs] ->\n let d = make_dict () in\n List.iter (fun (k, v) -> dict_set d k v) pairs;\n Dict d\n | _ -> raise (Eval_error \"spread-attrs: 1 spread\"));\n\n (* Higher-order forms as callable primitives — used by the VM.\n The CEK machine handles these as special forms with dedicated frames;\n the VM needs them as plain callable values. *)\n (* Call any SX callable — handles NativeFn, Lambda (via trampoline), VM closures *)\n let call_any f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | _ -> !_sx_trampoline_fn (!_sx_call_fn f args)\n in\n register \"map\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.map (fun x -> call_any f [x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map: expected (fn list)\"));\n register \"map-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.mapi (fun i x -> call_any f [Number (float_of_int i); x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map-indexed: expected (fn list)\"));\n register \"filter\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.filter (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"filter: expected (fn list)\"));\n register \"for-each\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iter (fun x -> ignore (call_any f [x])) items; Nil\n | [_; Nil] -> Nil (* nil collection = no-op *)\n | _ ->\n let types = String.concat \", \" (List.map (fun v -> type_of v) args) in\n raise (Eval_error (Printf.sprintf \"for-each: expected (fn list), got (%s) %d args\" types (List.length args))));\n register \"reduce\" (fun args ->\n match args with\n | [f; init; (List items | ListRef { contents = items })] ->\n List.fold_left (fun acc x -> call_any f [acc; x]) init items\n | _ -> raise (Eval_error \"reduce: expected (fn init list)\"));\n register \"some\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n (try List.find (fun x -> sx_truthy (call_any f [x])) items\n with Not_found -> Bool false)\n | [_; Nil] -> Bool false\n | _ -> raise (Eval_error \"some: expected (fn list)\"));\n register \"every?\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n Bool (List.for_all (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> Bool true\n | _ -> raise (Eval_error \"every?: expected (fn list)\"));\n\n (* ---- VM stack primitives (vm.sx platform interface) ---- *)\n register \"make-vm-stack\" (fun args ->\n match args with\n | [Number n] -> ListRef (ref (List.init (int_of_float n) (fun _ -> Nil)))\n | _ -> raise (Eval_error \"make-vm-stack: expected (size)\"));\n register \"vm-stack-get\" (fun args ->\n match args with\n | [ListRef r; Number n] -> List.nth !r (int_of_float n)\n | _ -> raise (Eval_error \"vm-stack-get: expected (stack idx)\"));\n register \"vm-stack-set!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n r := List.mapi (fun j x -> if j = i then v else x) !r; Nil\n | _ -> raise (Eval_error \"vm-stack-set!: expected (stack idx val)\"));\n register \"vm-stack-length\" (fun args ->\n match args with\n | [ListRef r] -> Number (float_of_int (List.length !r))\n | _ -> raise (Eval_error \"vm-stack-length: expected (stack)\"));\n register \"vm-stack-copy!\" (fun args ->\n match args with\n | [ListRef src; ListRef dst; Number n] ->\n let count = int_of_float n in\n let src_items = !src in\n dst := List.mapi (fun i x -> if i < count then List.nth src_items i else x) !dst; Nil\n | _ -> raise (Eval_error \"vm-stack-copy!: expected (src dst count)\"));\n register \"primitive?\" (fun args ->\n match args with\n | [String name] -> Bool (Hashtbl.mem primitives name)\n | _ -> Bool false);\n\n (* Scope stack primitives are registered by sx_server.ml / run_tests.ml\n because they use a shared scope stacks table with collect!/collected. *)\n\n (* ---- Predicates needed by adapter-html.sx ---- *)\n register \"lambda?\" (fun args ->\n match args with [Lambda _] -> Bool true | _ -> Bool false);\n register \"island?\" (fun args ->\n match args with [Island _] -> Bool true | _ -> Bool false);\n register \"is-else-clause?\" (fun args ->\n match args with\n | [Keyword \"else\"] -> Bool true\n | [Bool true] -> Bool true\n | _ -> Bool false);\n register \"cond-scheme?\" (fun args ->\n match args with\n | [List clauses] ->\n Bool (List.for_all (fun c ->\n match c with\n | List l -> List.length l = 2\n | _ -> false) clauses)\n | _ -> Bool false);\n register \"component?\" (fun args ->\n match args with [Component _] -> Bool true | [Island _] -> Bool true | _ -> Bool false);\n register \"lambda-closure\" (fun args ->\n match args with [Lambda l] -> Env l.l_closure | _ -> Nil);\n register \"component-closure\" (fun args ->\n match args with\n | [Component c] -> Env c.c_closure\n | [Island i] -> Env i.i_closure\n | _ -> Nil);\n register \"component-has-children?\" (fun args ->\n match args with\n | [Component c] -> Bool c.c_has_children\n | [Island i] -> Bool i.i_has_children\n | _ -> Bool false);\n register \"component-name\" (fun args ->\n match args with\n | [Component c] -> String c.c_name\n | [Island i] -> String i.i_name\n | _ -> Nil);\n register \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> List []);\n register \"component-body\" (fun args ->\n match args with\n | [Component c] -> c.c_body\n | [Island i] -> i.i_body\n | _ -> Nil);\n register \"macro?\" (fun args ->\n match args with [Macro _] -> Bool true | _ -> Bool false);\n register \"for-each-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iteri (fun i x -> ignore (call_any f [Number (float_of_int i); x])) items; Nil\n | _ -> raise (Eval_error \"for-each-indexed: expected (fn list)\"));\n register \"lambda-params\" (fun args ->\n match args with\n | [Lambda l] -> List (List.map (fun s -> String s) l.l_params)\n | _ -> List []);\n register \"lambda-body\" (fun args ->\n match args with [Lambda l] -> l.l_body | _ -> Nil);\n (* expand-macro is registered later by run_tests.ml / sx_server.ml\n because it needs eval_expr which creates a dependency cycle *);\n register \"empty-dict?\" (fun args ->\n match args with\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | _ -> Bool true);\n register \"make-raw-html\" (fun args ->\n match args with [String s] -> RawHTML s | _ -> Nil);\n register \"raw-html-content\" (fun args ->\n match args with [RawHTML s] -> String s | _ -> String \"\");\n register \"get-primitive\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"get-primitive: expected (name)\"));\n register \"call-primitive\" (fun args ->\n match args with\n | [String name; (List a | ListRef { contents = a })] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn a\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | [String name; Nil] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn []\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"call-primitive: expected (name args-list)\"));\n ()\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":112961},"map":{"version":3,"sources":["/workspace_root/lib/sx_runtime.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Runtime helpers for transpiled code.\n\n These bridge the gap between the transpiler's output and the\n foundation types/primitives. The transpiled evaluator calls these\n functions directly. *)\n\nopen Sx_types\n\n(** Call a registered primitive by name. *)\nlet prim_call name args =\n match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f args\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(** Convert any SX value to an OCaml string (internal). *)\nlet value_to_str = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | v -> inspect v\n\n(** sx_to_string returns a value (String) for transpiled code. *)\nlet sx_to_string v = String (value_to_str v)\n\n(** String concatenation helper — [sx_str] takes a list of values. *)\nlet sx_str args =\n String.concat \"\" (List.map value_to_str args)\n\n(** Convert a value to a list. *)\nlet sx_to_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\n(** Call an SX callable (lambda, native fn, continuation). *)\nlet sx_call f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | VmClosure cl -> !Sx_types._vm_call_closure_ref cl args\n | Lambda l ->\n let local = Sx_types.env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (Sx_types.env_bind local p a)) l.l_params args;\n Thunk (l.l_body, local)\n | Continuation (k, _) ->\n k (match args with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error (\"Not callable: \" ^ inspect f))\n\n(* Initialize forward ref so primitives can call SX functions *)\nlet () = Sx_primitives._sx_call_fn := sx_call\n(* Trampoline ref is set by sx_ref.ml after it's loaded *)\n\n(** Apply a function to a list of args. *)\nlet sx_apply f args_list =\n sx_call f (sx_to_list args_list)\n\n(** Mutable append — add item to a list ref or accumulator.\n In transpiled code, lists that get appended to are mutable refs. *)\nlet sx_append_b lst item =\n match lst with\n | List items -> List (items @ [item])\n | ListRef r -> r := !r @ [item]; lst (* mutate in place, return same ref *)\n | _ -> raise (Eval_error (\"append!: expected list, got \" ^ type_of lst))\n\n(** Mutable dict-set — set key in dict, return value. *)\nlet sx_dict_set_b d k v =\n match d, k with\n | Dict tbl, String key -> Hashtbl.replace tbl key v; v\n | Dict tbl, Keyword key -> Hashtbl.replace tbl key v; v\n | _ -> raise (Eval_error \"dict-set!: expected dict and string key\")\n\n(** Get from dict or list. *)\nlet get_val container key =\n match container, key with\n | CekState s, String k ->\n (match k with\n | \"control\" -> s.cs_control | \"env\" -> s.cs_env\n | \"kont\" -> s.cs_kont | \"phase\" -> String s.cs_phase\n | \"value\" -> s.cs_value | _ -> Nil)\n | CekFrame f, String k ->\n (match k with\n | \"type\" -> String f.cf_type | \"env\" -> f.cf_env\n | \"name\" -> f.cf_name | \"body\" -> f.cf_body\n | \"remaining\" -> f.cf_remaining | \"f\" -> f.cf_f\n | \"args\" -> f.cf_args | \"evaled\" -> f.cf_args\n | \"results\" -> f.cf_results | \"raw-args\" -> f.cf_results\n | \"then\" -> f.cf_body | \"else\" -> f.cf_name\n | \"ho-type\" -> f.cf_extra | \"scheme\" -> f.cf_extra\n | \"indexed\" -> f.cf_extra | \"value\" -> f.cf_extra\n | \"phase\" -> f.cf_extra | \"has-effects\" -> f.cf_extra\n | \"match-val\" -> f.cf_extra | \"current-item\" -> f.cf_extra\n | \"update-fn\" -> f.cf_extra | \"head-name\" -> f.cf_extra\n | \"emitted\" -> f.cf_extra2 | \"effect-list\" -> f.cf_extra2\n | \"first-render\" -> f.cf_extra2\n | _ -> Nil)\n | Dict d, String k -> dict_get d k\n | Dict d, Keyword k -> dict_get d k\n | (List l | ListRef { contents = l }), Number n ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | Nil, _ -> Nil (* nil.anything → nil *)\n | _, _ -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n\n(** Register get as a primitive override — transpiled code calls (get d k). *)\nlet () =\n Sx_primitives.register \"get\" (fun args ->\n match args with\n | [c; k] -> get_val c k\n | [c; k; default] ->\n (try\n let v = get_val c k in\n if v = Nil then default else v\n with _ -> default)\n | _ -> raise (Eval_error \"get: 2-3 args\"))\n\n\n(* ====================================================================== *)\n(* Primitive aliases — top-level functions called by transpiled code *)\n(* ====================================================================== *)\n\n(** The transpiled evaluator calls primitives directly by their mangled\n OCaml name. These aliases delegate to the primitives table so the\n transpiled code compiles without needing [prim_call] everywhere. *)\n\nlet _prim name = match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f | None -> (fun _ -> raise (Eval_error (\"Missing prim: \" ^ name)))\n\n(* Collection ops *)\nlet first args = _prim \"first\" [args]\nlet rest args = _prim \"rest\" [args]\nlet last args = _prim \"last\" [args]\nlet nth coll i = _prim \"nth\" [coll; i]\nlet cons x l = _prim \"cons\" [x; l]\nlet append a b = _prim \"append\" [a; b]\nlet reverse l = _prim \"reverse\" [l]\nlet flatten l = _prim \"flatten\" [l]\nlet concat a b = _prim \"concat\" [a; b]\nlet slice a b = _prim \"slice\" [a; b]\nlet len a = _prim \"len\" [a]\nlet get a b = get_val a b\nlet sort' a = _prim \"sort\" [a]\nlet range' a = _prim \"range\" [a]\nlet unique a = _prim \"unique\" [a]\nlet zip a b = _prim \"zip\" [a; b]\nlet zip_pairs a = _prim \"zip-pairs\" [a]\nlet take a b = _prim \"take\" [a; b]\nlet drop a b = _prim \"drop\" [a; b]\nlet chunk_every a b = _prim \"chunk-every\" [a; b]\n\n(* Predicates *)\nlet empty_p a = _prim \"empty?\" [a]\nlet nil_p a = _prim \"nil?\" [a]\nlet number_p a = _prim \"number?\" [a]\nlet string_p a = _prim \"string?\" [a]\nlet boolean_p a = _prim \"boolean?\" [a]\nlet list_p a = _prim \"list?\" [a]\nlet dict_p a = _prim \"dict?\" [a]\nlet symbol_p a = _prim \"symbol?\" [a]\nlet keyword_p a = _prim \"keyword?\" [a]\nlet contains_p a b = _prim \"contains?\" [a; b]\nlet has_key_p a b = _prim \"has-key?\" [a; b]\nlet starts_with_p a b = _prim \"starts-with?\" [a; b]\nlet ends_with_p a b = _prim \"ends-with?\" [a; b]\nlet string_contains_p a b = _prim \"string-contains?\" [a; b]\nlet odd_p a = _prim \"odd?\" [a]\nlet even_p a = _prim \"even?\" [a]\nlet zero_p a = _prim \"zero?\" [a]\n\n(* String ops *)\nlet str' args = String (sx_str args)\nlet upper a = _prim \"upper\" [a]\nlet upcase a = _prim \"upcase\" [a]\nlet lower a = _prim \"lower\" [a]\nlet downcase a = _prim \"downcase\" [a]\nlet trim a = _prim \"trim\" [a]\nlet split a b = _prim \"split\" [a; b]\nlet join a b = _prim \"join\" [a; b]\nlet replace a b c = _prim \"replace\" [a; b; c]\nlet index_of a b = _prim \"index-of\" [a; b]\nlet substring a b c = _prim \"substring\" [a; b; c]\nlet string_length a = _prim \"string-length\" [a]\nlet char_from_code a = _prim \"char-from-code\" [a]\n\n(* Dict ops *)\nlet assoc d k v = _prim \"assoc\" [d; k; v]\nlet dissoc d k = _prim \"dissoc\" [d; k]\nlet merge' a b = _prim \"merge\" [a; b]\nlet keys a = _prim \"keys\" [a]\nlet vals a = _prim \"vals\" [a]\nlet dict_set a b c = _prim \"dict-set!\" [a; b; c]\nlet dict_get a b = _prim \"dict-get\" [a; b]\nlet dict_has_p a b = _prim \"dict-has?\" [a; b]\nlet dict_delete a b = _prim \"dict-delete!\" [a; b]\n\n(* Math *)\nlet abs' a = _prim \"abs\" [a]\nlet sqrt' a = _prim \"sqrt\" [a]\nlet pow' a b = _prim \"pow\" [a; b]\nlet floor' a = _prim \"floor\" [a]\nlet ceil' a = _prim \"ceil\" [a]\nlet round' a = _prim \"round\" [a]\nlet min' a b = _prim \"min\" [a; b]\nlet max' a b = _prim \"max\" [a; b]\nlet clamp a b c = _prim \"clamp\" [a; b; c]\nlet parse_int a = _prim \"parse-int\" [a]\nlet parse_float a = _prim \"parse-float\" [a]\n\n(* Misc *)\nlet error msg = raise (Eval_error (value_to_str msg))\n\n(* inspect wrapper — returns String value instead of OCaml string *)\nlet inspect v = String (Sx_types.inspect v)\nlet apply' f args = sx_apply f args\nlet identical_p a b = _prim \"identical?\" [a; b]\nlet _is_spread_prim a = _prim \"spread?\" [a]\nlet spread_attrs a = _prim \"spread-attrs\" [a]\nlet make_spread a = _prim \"make-spread\" [a]\n\n(* Scope primitives — delegate to sx_ref.py's shared scope stacks *)\nlet sx_collect a b = prim_call \"collect!\" [a; b]\nlet sx_collected a = prim_call \"collected\" [a]\nlet sx_clear_collected a = prim_call \"clear-collected!\" [a]\nlet sx_emit a b = prim_call \"emit!\" [a; b]\nlet sx_emitted a = prim_call \"emitted\" [a]\nlet sx_context a b = prim_call \"context\" [a; b]\n\n(* Trampoline — forward-declared in sx_ref.ml, delegates to CEK eval_expr *)\n(* This is a stub; the real trampoline is wired up in sx_ref.ml after eval_expr is defined *)\nlet trampoline v = v\n\n(* Value-returning type predicates — the transpiled code passes these through\n sx_truthy, so they need to return Bool, not OCaml bool. *)\n(* type_of returns value, not string *)\nlet type_of v = String (Sx_types.type_of v)\n\n(* Env operations — accept Env-wrapped values and value keys.\n The transpiled CEK machine stores envs in dicts as Env values. *)\nlet unwrap_env = function\n | Env e -> e\n | Dict d ->\n (* Dict used as env — wrap it. Needed by adapter-html.sx which\n passes dicts as env args (e.g. empty {} as caller env). *)\n let e = Sx_types.make_env () in\n Hashtbl.iter (fun k v -> ignore (Sx_types.env_bind e k v)) d;\n e\n | Nil ->\n Sx_types.make_env ()\n | v -> raise (Eval_error (\"Expected env, got \" ^ Sx_types.type_of v))\n\nlet env_has e name = Bool (Sx_types.env_has (unwrap_env e) (value_to_str name))\nlet env_get e name = Sx_types.env_get (unwrap_env e) (value_to_str name)\nlet env_bind e name v = Sx_types.env_bind (unwrap_env e) (value_to_str name) v\nlet env_set e name v = Sx_types.env_set (unwrap_env e) (value_to_str name) v\n\nlet make_env () = Env (Sx_types.make_env ())\nlet env_extend e = Env (Sx_types.env_extend (unwrap_env e))\nlet env_merge a b = Env (Sx_types.env_merge (unwrap_env a) (unwrap_env b))\n\n(* set_lambda_name wrapper — accepts value, extracts string *)\nlet set_lambda_name l n = Sx_types.set_lambda_name l (value_to_str n)\n\nlet is_nil v = Bool (Sx_types.is_nil v)\nlet is_thunk v = Bool (Sx_types.is_thunk v)\nlet is_lambda v = Bool (Sx_types.is_lambda v)\nlet is_component v = Bool (Sx_types.is_component v)\nlet is_island v = Bool (Sx_types.is_island v)\nlet is_macro v = Bool (Sx_types.is_macro v)\nlet is_signal v = Bool (Sx_types.is_signal v)\nlet is_callable v = Bool (Sx_types.is_callable v)\nlet is_identical a b = Bool (a == b)\nlet is_primitive name = Bool (Sx_primitives.is_primitive (value_to_str name))\nlet get_primitive name = Sx_primitives.get_primitive (value_to_str name)\nlet is_spread v = match v with Spread _ -> Bool true | _ -> Bool false\n\n(* Stubs for functions defined in sx_ref.ml — resolved at link time *)\n(* These are forward-declared here; sx_ref.ml defines the actual implementations *)\n\n(* strip-prefix *)\n(* Stubs for evaluator functions — defined in sx_ref.ml but\n sometimes referenced before their definition via forward calls.\n These get overridden by the actual transpiled definitions. *)\n\nlet map_indexed fn coll =\n List (List.mapi (fun i x -> sx_call fn [Number (float_of_int i); x]) (sx_to_list coll))\n\nlet map_dict fn d =\n match d with\n | Dict tbl ->\n let result = Hashtbl.create (Hashtbl.length tbl) in\n Hashtbl.iter (fun k v -> Hashtbl.replace result k (sx_call fn [String k; v])) tbl;\n Dict result\n | _ -> raise (Eval_error \"map-dict: expected dict\")\n\nlet for_each fn coll =\n List.iter (fun x -> ignore (sx_call fn [x])) (sx_to_list coll);\n Nil\n\nlet for_each_indexed fn coll =\n List.iteri (fun i x -> ignore (sx_call fn [Number (float_of_int i); x])) (sx_to_list coll);\n Nil\n\n(* Continuation support *)\nlet continuation_p v = match v with Continuation (_, _) -> Bool true | _ -> Bool false\n\nlet make_cek_continuation captured rest_kont =\n let data = Hashtbl.create 2 in\n Hashtbl.replace data \"captured\" captured;\n Hashtbl.replace data \"rest-kont\" rest_kont;\n Continuation ((fun v -> v), Some data)\n\nlet continuation_data v = match v with\n | Continuation (_, Some d) -> Dict d\n | Continuation (_, None) -> Dict (Hashtbl.create 0)\n | _ -> raise (Eval_error \"not a continuation\")\n\n(* Dynamic wind — simplified for OCaml (no async) *)\nlet dynamic_wind_call before body after _env =\n ignore (sx_call before []);\n let result = sx_call body [] in\n ignore (sx_call after []);\n result\n\n(* Scope stack — all delegated to primitives registered in sx_server.ml *)\nlet scope_push name value = prim_call \"scope-push!\" [name; value]\nlet scope_pop name = prim_call \"scope-pop!\" [name]\nlet scope_peek name = prim_call \"scope-peek\" [name]\nlet scope_emit name value = prim_call \"scope-emit!\" [name; value]\nlet provide_push name value = prim_call \"scope-push!\" [name; value]\nlet provide_pop name = prim_call \"scope-pop!\" [name]\n\n(* Custom special forms registry — mutable dict *)\nlet custom_special_forms = Dict (Hashtbl.create 4)\n\n(* register-special-form! — add a handler to the custom registry *)\nlet register_special_form name handler =\n (match custom_special_forms with\n | Dict tbl -> Hashtbl.replace tbl (value_to_str name) handler; handler\n | _ -> raise (Eval_error \"custom_special_forms not a dict\"))\n\n(* Render check/fn hooks — nil by default, set by platform if needed *)\nlet render_check = Nil\nlet render_fn = Nil\n\n(* is-else-clause? — check if a cond/case test is an else marker *)\nlet is_else_clause v =\n match v with\n | Keyword k -> Bool (k = \"else\" || k = \"default\")\n | Symbol s -> Bool (s = \"else\" || s = \"default\")\n | Bool true -> Bool true\n | _ -> Bool false\n\n(* Signal accessors *)\nlet signal_value s = match s with\n | Signal sig' -> sig'.s_value\n | Dict d -> (match Hashtbl.find_opt d \"value\" with Some v -> v | None -> Nil)\n | _ -> raise (Eval_error \"not a signal\")\nlet signal_set_value s v = match s with Signal sig' -> sig'.s_value <- v; v | _ -> raise (Eval_error \"not a signal\")\nlet signal_subscribers s = match s with Signal sig' -> List (List.map (fun _ -> Nil) sig'.s_subscribers) | _ -> List []\nlet signal_add_sub_b s f =\n match s with\n | Dict d ->\n (match Hashtbl.find_opt d \"subscribers\" with\n | Some (ListRef r) -> r := !r @ [f]; Nil\n | Some (List items) -> Hashtbl.replace d \"subscribers\" (ListRef (ref (items @ [f]))); Nil\n | _ -> Hashtbl.replace d \"subscribers\" (ListRef (ref [f])); Nil)\n | _ -> Nil\n\nlet signal_remove_sub_b s f =\n match s with\n | Dict d ->\n (match Hashtbl.find_opt d \"subscribers\" with\n | Some (ListRef r) -> r := List.filter (fun x -> x != f) !r; Nil\n | Some (List items) -> Hashtbl.replace d \"subscribers\" (List (List.filter (fun x -> x != f) items)); Nil\n | _ -> Nil)\n | _ -> Nil\n\nlet signal_deps s =\n match s with\n | Dict d -> (match Hashtbl.find_opt d \"deps\" with Some v -> v | None -> List [])\n | _ -> List []\n\nlet signal_set_deps s d =\n match s with\n | Dict tbl -> Hashtbl.replace tbl \"deps\" d; Nil\n | _ -> Nil\n\nlet notify_subscribers s =\n let subs = match s with\n | Dict d -> (match Hashtbl.find_opt d \"subscribers\" with\n | Some (ListRef { contents = items }) | Some (List items) -> items\n | _ -> [])\n | _ -> []\n in\n List.iter (fun f -> ignore (sx_call f [])) subs;\n Nil\n\nlet flush_subscribers _s = Nil\nlet dispose_computed _s = Nil\n\n(* Island scope stubs — accept both bare OCaml fns and NativeFn values\n from transpiled code (NativeFn wrapping for value-storable lambdas). *)\nlet with_island_scope _register_fn body_fn =\n match body_fn with\n | NativeFn (_, f) -> f []\n | _ -> Nil\nlet register_in_scope _dispose_fn = Nil\n\n(* Component type annotation stub *)\nlet component_set_param_types_b _comp _types = Nil\n\n(* Parse keyword args from a call — this is defined in evaluator.sx,\n the transpiled version will override this stub. *)\n(* Forward-reference stubs for evaluator functions used before definition *)\nlet parse_comp_params _params = List [List []; Nil; Bool false]\nlet parse_macro_params _params = List [List []; Nil]\n\nlet parse_keyword_args _raw_args _env =\n (* Stub — the real implementation is transpiled from evaluator.sx *)\n List [Dict (Hashtbl.create 0); List []]\n\n(* Make handler/query/action/page def stubs *)\nlet make_handler_def name params body _env = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"handler\"); Hashtbl.replace d \"name\" name; Hashtbl.replace d \"params\" params; Hashtbl.replace d \"body\" body; d)\nlet make_query_def name params body _env = make_handler_def name params body _env\nlet make_action_def name params body _env = make_handler_def name params body _env\nlet make_page_def name _opts = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"page\"); Hashtbl.replace d \"name\" name; d)\n\n(* sf-def* stubs — platform-specific def-forms, not in the SX spec *)\nlet sf_defhandler args env =\n let name = first args in let rest_args = rest args in\n make_handler_def name (first rest_args) (nth rest_args (Number 1.0)) env\nlet sf_defquery args env = sf_defhandler args env\nlet sf_defaction args env = sf_defhandler args env\nlet sf_defpage args _env =\n let name = first args in make_page_def name (rest args)\n\nlet strip_prefix s prefix =\n match s, prefix with\n | String s, String p ->\n let pl = String.length p in\n if String.length s >= pl && String.sub s 0 pl = p\n then String (String.sub s pl (String.length s - pl))\n else String s\n | _ -> s\n\n(* debug_log — no-op in production, used by CEK evaluator for component warnings *)\nlet debug_log _ _ = Nil\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":124981},"map":{"version":3,"sources":["/workspace_root/lib/sx_ref.ml","/builtin/blackbox.ml"],"sourcesContent":["(* sx_ref.ml — Auto-generated from SX spec by hosts/ocaml/bootstrap.py *)\n(* Do not edit — regenerate with: python3 hosts/ocaml/bootstrap.py *)\n\n[@@@warning \"-26-27\"]\n\nopen Sx_types\nopen Sx_runtime\n\n(* Trampoline — forward ref, resolved after eval_expr is defined. *)\nlet trampoline_fn : (value -> value) ref = ref (fun v -> v)\nlet trampoline v = !trampoline_fn v\n\n\n\n(* === Mutable state for strict mode === *)\n(* These are defined as top-level refs because the transpiler cannot handle\n global set! mutation (it creates local refs that shadow the global). *)\nlet _strict_ref = ref (Bool false)\nlet _prim_param_types_ref = ref Nil\n\n(* JIT call hook — cek_call checks this before CEK dispatch for named\n lambdas. Registered by sx_server.ml after compiler loads. Tests\n run with hook = None (pure CEK, no compilation dependency). *)\nlet jit_call_hook : (value -> value list -> value option) option ref = ref None\n\n\n\n(* === Transpiled from evaluator (frames + eval + CEK) === *)\n\n(* make-cek-state *)\nlet rec make_cek_state control env kont =\n (CekState { cs_control = control; cs_env = env; cs_kont = kont; cs_phase = \"eval\"; cs_value = Nil })\n\n(* make-cek-value *)\nand make_cek_value value env kont =\n (CekState { cs_control = Nil; cs_env = env; cs_kont = kont; cs_phase = \"continue\"; cs_value = value })\n\n(* cek-terminal? *)\nand cek_terminal_p state =\n (let _and = (prim_call \"=\" [(get (state) ((String \"phase\"))); (String \"continue\")]) in if not (sx_truthy _and) then _and else (empty_p ((get (state) ((String \"kont\"))))))\n\n(* cek-control *)\nand cek_control s =\n (get (s) ((String \"control\")))\n\n(* cek-env *)\nand cek_env s =\n (get (s) ((String \"env\")))\n\n(* cek-kont *)\nand cek_kont s =\n (get (s) ((String \"kont\")))\n\n(* cek-phase *)\nand cek_phase s =\n (get (s) ((String \"phase\")))\n\n(* cek-value *)\nand cek_value s =\n (get (s) ((String \"value\")))\n\n(* make-if-frame *)\nand make_if_frame then_expr else_expr env =\n (CekFrame { cf_type = \"if\"; cf_env = env; cf_name = else_expr; cf_body = then_expr; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-when-frame *)\nand make_when_frame body_exprs env =\n (CekFrame { cf_type = \"when\"; cf_env = env; cf_name = Nil; cf_body = body_exprs; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-begin-frame *)\nand make_begin_frame remaining env =\n (CekFrame { cf_type = \"begin\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-let-frame *)\nand make_let_frame name remaining body local =\n (CekFrame { cf_type = \"let\"; cf_env = local; cf_name = name; cf_body = body; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-define-frame *)\nand make_define_frame name env has_effects effect_list =\n (CekFrame { cf_type = \"define\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = has_effects; cf_extra2 = effect_list })\n\n(* make-set-frame *)\nand make_set_frame name env =\n (CekFrame { cf_type = \"set\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-arg-frame *)\nand make_arg_frame f evaled remaining env raw_args head_name =\n (CekFrame { cf_type = \"arg\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = evaled; cf_results = raw_args; cf_extra = (let _or = head_name in if sx_truthy _or then _or else Nil); cf_extra2 = Nil })\n\n(* make-call-frame *)\nand make_call_frame f args env =\n (CekFrame { cf_type = \"call\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = f; cf_args = args; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-cond-frame *)\nand make_cond_frame remaining env scheme_p =\n (CekFrame { cf_type = \"cond\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = scheme_p; cf_extra2 = Nil })\n\n(* make-case-frame *)\nand make_case_frame match_val remaining env =\n (CekFrame { cf_type = \"case\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = match_val; cf_extra2 = Nil })\n\n(* make-thread-frame *)\nand make_thread_frame remaining env =\n (CekFrame { cf_type = \"thread\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-map-frame *)\nand make_map_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool false); cf_extra2 = Nil })\n\n(* make-map-indexed-frame *)\nand make_map_indexed_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool true); cf_extra2 = Nil })\n\n(* make-filter-frame *)\nand make_filter_frame f remaining results current_item env =\n (CekFrame { cf_type = \"filter\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = current_item; cf_extra2 = Nil })\n\n(* make-reduce-frame *)\nand make_reduce_frame f remaining env =\n (CekFrame { cf_type = \"reduce\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-for-each-frame *)\nand make_for_each_frame f remaining env =\n (CekFrame { cf_type = \"for-each\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-some-frame *)\nand make_some_frame f remaining env =\n (CekFrame { cf_type = \"some\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-every-frame *)\nand make_every_frame f remaining env =\n (CekFrame { cf_type = \"every\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-scope-frame *)\nand make_scope_frame name remaining env =\n (CekFrame { cf_type = \"scope\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-provide-frame *)\nand make_provide_frame name value remaining env =\n (CekFrame { cf_type = \"provide\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = value; cf_extra2 = Nil })\n\n(* make-scope-acc-frame *)\nand make_scope_acc_frame name value remaining env =\n (CekFrame { cf_type = \"scope-acc\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = (let _or = value in if sx_truthy _or then _or else Nil); cf_extra2 = (List []) })\n\n(* make-reset-frame *)\nand make_reset_frame env =\n (CekFrame { cf_type = \"reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dict-frame *)\nand make_dict_frame remaining results env =\n (CekFrame { cf_type = \"dict\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = results; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-and-frame *)\nand make_and_frame remaining env =\n (CekFrame { cf_type = \"and\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-or-frame *)\nand make_or_frame remaining env =\n (CekFrame { cf_type = \"or\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dynamic-wind-frame *)\nand make_dynamic_wind_frame phase body_thunk after_thunk env =\n (CekFrame { cf_type = \"dynamic-wind\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = phase; cf_extra2 = Nil })\n\n(* make-reactive-reset-frame *)\nand make_reactive_reset_frame env update_fn first_render_p =\n (CekFrame { cf_type = \"reactive-reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = update_fn; cf_extra2 = first_render_p })\n\n(* make-deref-frame *)\nand make_deref_frame env =\n (CekFrame { cf_type = \"deref\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-ho-setup-frame *)\nand make_ho_setup_frame ho_type remaining_args evaled_args env =\n (CekFrame { cf_type = \"ho-setup\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining_args; cf_f = Nil; cf_args = evaled_args; cf_results = Nil; cf_extra = ho_type; cf_extra2 = Nil })\n\n(* frame-type *)\nand frame_type f =\n (get (f) ((String \"type\")))\n\n(* kont-push *)\nand kont_push frame kont =\n (cons (frame) (kont))\n\n(* kont-top *)\nand kont_top kont =\n (first (kont))\n\n(* kont-pop *)\nand kont_pop kont =\n (rest (kont))\n\n(* kont-empty? *)\nand kont_empty_p kont =\n (empty_p (kont))\n\n(* kont-capture-to-reset *)\nand kont_capture_to_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"shift without enclosing reset\")))) else (let frame = (first (k)) in (if sx_truthy ((let _or = (prim_call \"=\" [(frame_type (frame)); (String \"reset\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")]))) then (List [captured; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* kont-find-provide *)\nand kont_find_provide kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"provide\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_provide ((rest (kont))) (name)))))\n\n(* kont-find-scope-acc *)\nand kont_find_scope_acc kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"scope-acc\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_scope_acc ((rest (kont))) (name)))))\n\n(* has-reactive-reset-frame? *)\nand has_reactive_reset_frame_p kont =\n (if sx_truthy ((empty_p (kont))) then (Bool false) else (if sx_truthy ((prim_call \"=\" [(frame_type ((first (kont)))); (String \"reactive-reset\")])) then (Bool true) else (has_reactive_reset_frame_p ((rest (kont))))))\n\n(* kont-capture-to-reactive-reset *)\nand kont_capture_to_reactive_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"reactive deref without enclosing reactive-reset\")))) else (let frame = (first (k)) in (if sx_truthy ((prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")])) then (List [captured; frame; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* *custom-special-forms* *)\nand custom_special_forms =\n (Dict (Hashtbl.create 0))\n\n(* register-special-form! *)\nand register_special_form name handler =\n (sx_dict_set_b custom_special_forms name handler)\n\n(* *render-check* *)\nand render_check =\n Nil\n\n(* *render-fn* *)\nand render_fn =\n Nil\n\n(* *strict* *)\nand _strict_ = !_strict_ref\n\n(* set-strict! *)\nand set_strict_b val' =\n _strict_ref := val'; Nil\n\n(* *prim-param-types* *)\nand _prim_param_types_ = !_prim_param_types_ref\n\n(* set-prim-param-types! *)\nand set_prim_param_types_b types =\n _prim_param_types_ref := types; Nil\n\n(* value-matches-type? *)\nand value_matches_type_p val' expected_type =\n (if sx_truthy ((prim_call \"=\" [expected_type; (String \"any\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"number\")])) then (number_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"string\")])) then (string_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"boolean\")])) then (boolean_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"nil\")])) then (is_nil (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"list\")])) then (list_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"dict\")])) then (dict_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"lambda\")])) then (is_lambda (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"symbol\")])) then (prim_call \"=\" [(type_of (val')); (String \"symbol\")]) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"keyword\")])) then (prim_call \"=\" [(type_of (val')); (String \"keyword\")]) else (if sx_truthy ((let _and = (string_p (expected_type)) in if not (sx_truthy _and) then _and else (prim_call \"ends-with?\" [expected_type; (String \"?\")]))) then (let _or = (is_nil (val')) in if sx_truthy _or then _or else (value_matches_type_p (val') ((prim_call \"slice\" [expected_type; (Number 0.0); (prim_call \"-\" [(prim_call \"string-length\" [expected_type]); (Number 1.0)])])))) else (Bool true))))))))))))\n\n(* strict-check-args *)\nand strict_check_args name args =\n (if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else !_prim_param_types_ref)) then (let spec = (get (!_prim_param_types_ref) (name)) in (if sx_truthy (spec) then (let positional = (get (spec) ((String \"positional\"))) in let rest_type = (get (spec) ((String \"rest-type\"))) in (let () = ignore ((if sx_truthy (positional) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let param = (nth (pair) ((Number 1.0))) in let p_name = (first (param)) in let p_type = (nth (param) ((Number 1.0))) in (if sx_truthy ((prim_call \"<\" [idx; (len (args))])) then (let val' = (nth (args) (idx)) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (p_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); p_type; (String \" for param \"); p_name; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [i; p])) (sx_to_list positional)))); Nil) else Nil)) in (if sx_truthy ((let _and = rest_type in if not (sx_truthy _and) then _and else (prim_call \">\" [(len (args)); (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let val' = (nth (pair) ((Number 1.0))) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (rest_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); rest_type; (String \" for rest arg \"); idx; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)))) (sx_to_list (List (List.mapi (fun i v -> let i = Number (float_of_int i) in (List [i; v])) (sx_to_list (prim_call \"slice\" [args; (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))))); Nil) else Nil))) else Nil)) else Nil)\n\n(* bind_lambda_params — shared helper for call-lambda and CEK dispatch.\n Handles &rest params: binds required params, collects rest into list. *)\nand bind_lambda_params f args local =\n let params = lambda_params f in\n let param_list = match params with List l | ListRef { contents = l } -> l | _ -> [] in\n let args_list = match args with List l | ListRef { contents = l } -> l | _ -> [] in\n let rest_idx = ref (-1) in\n List.iteri (fun i p -> match p with Symbol \"&rest\" | String \"&rest\" -> rest_idx := i | _ -> ()) param_list;\n if !rest_idx >= 0 then begin\n let required = List.filteri (fun i _ -> i < !rest_idx) param_list in\n let rest_name = (match List.nth_opt param_list (!rest_idx + 1) with\n | Some (Symbol s | String s) -> s | _ -> \"rest\") in\n List.iteri (fun i p ->\n let name = sx_to_string p in\n let v = match List.nth_opt args_list i with Some v -> v | None -> Nil in\n ignore (env_bind local name v)) required;\n let rest_vals = if !rest_idx <= List.length args_list\n then List (List.filteri (fun i _ -> i >= !rest_idx) args_list) else List [] in\n ignore (env_bind local (String rest_name) rest_vals)\n end else begin\n if sx_truthy (prim_call \">\" [len args; len params]) then\n raise (Eval_error (value_to_str (String (sx_str [\n (let _or = lambda_name f in if sx_truthy _or then _or else String \"lambda\");\n String \" expects \"; len params; String \" args, got \"; len args]))));\n ignore (List.iter (fun pair ->\n ignore (env_bind local (sx_to_string (first pair)) (nth pair (Number 1.0))))\n (sx_to_list (prim_call \"zip\" [params; args])));\n ignore (List.iter (fun p ->\n ignore (env_bind local (sx_to_string p) Nil))\n (sx_to_list (prim_call \"slice\" [params; len args])))\n end\n\n(* call-lambda — uses shared bind_lambda_params for &rest support *)\nand call_lambda f args caller_env =\n let local = env_merge (lambda_closure f) caller_env in\n bind_lambda_params f args local;\n make_thunk (lambda_body f) local\n\n(* call-component *)\nand call_component comp raw_args env =\n (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (comp))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (comp))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (comp))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_thunk ((component_body (comp))) (local)))))\n\n(* parse-keyword-args *)\nand parse_keyword_args raw_args env =\n (let kwargs = (Dict (Hashtbl.create 0)) in let children = ref ((List [])) in let i = (Number 0.0) in (let () = ignore ((List.fold_left (fun state arg -> (let idx = (get (state) ((String \"i\"))) in let skip = (get (state) ((String \"skip\"))) in (if sx_truthy (skip) then (prim_call \"assoc\" [state; (String \"skip\"); (Bool false); (String \"i\"); (prim_call \"inc\" [idx])]) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (arg)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"inc\" [idx]); (len (raw_args))]))) then (let () = ignore ((sx_dict_set_b kwargs (keyword_name (arg)) (trampoline ((eval_expr ((nth (raw_args) ((prim_call \"inc\" [idx])))) (env)))))) in (prim_call \"assoc\" [state; (String \"skip\"); (Bool true); (String \"i\"); (prim_call \"inc\" [idx])])) else (let () = ignore ((children := sx_append_b !children (trampoline ((eval_expr (arg) (env)))); Nil)) in (prim_call \"assoc\" [state; (String \"i\"); (prim_call \"inc\" [idx])])))))) (let _d = Hashtbl.create 2 in Hashtbl.replace _d (value_to_str (String \"i\")) (Number 0.0); Hashtbl.replace _d (value_to_str (String \"skip\")) (Bool false); Dict _d) (sx_to_list raw_args))) in (List [kwargs; !children])))\n\n(* cond-scheme? *)\nand cond_scheme_p clauses =\n (Bool (List.for_all (fun c -> sx_truthy ((let _and = (prim_call \"=\" [(type_of (c)); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len (c)); (Number 2.0)])))) (sx_to_list clauses)))\n\n(* is-else-clause? *)\nand is_else_clause test =\n (let _or = (let _and = (prim_call \"=\" [(type_of (test)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name (test)); (String \"else\")])) in if sx_truthy _or then _or else (let _and = (prim_call \"=\" [(type_of (test)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _or = (prim_call \"=\" [(symbol_name (test)); (String \"else\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(symbol_name (test)); (String \":else\")]))))\n\n(* sf-named-let *)\nand sf_named_let args env =\n (let loop_name = (symbol_name ((first (args)))) in let bindings = (nth (args) ((Number 1.0))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in let params = ref ((List [])) in let inits = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))); Nil)) in (inits := sx_append_b !inits (nth (binding) ((Number 1.0))); Nil)))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))); Nil)) in (inits := sx_append_b !inits (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))); Nil))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let loop_body = (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (first (body)) else (cons ((make_symbol ((String \"begin\")))) (body))) in let loop_fn = (make_lambda (!params) (loop_body) (env)) in (let () = ignore ((set_lambda_name loop_fn (sx_to_string loop_name))) in (let () = ignore ((env_bind (lambda_closure (loop_fn)) (sx_to_string loop_name) loop_fn)) in (let init_vals = (List (List.map (fun e -> (trampoline ((eval_expr (e) (env))))) (sx_to_list !inits))) in (call_lambda (loop_fn) (init_vals) (env))))))))\n\n(* sf-lambda *)\nand sf_lambda args env =\n (let params_expr = (first (args)) in let body_exprs = (rest (args)) in let body = (if sx_truthy ((prim_call \"=\" [(len (body_exprs)); (Number 1.0)])) then (first (body_exprs)) else (cons ((make_symbol ((String \"begin\")))) (body_exprs))) in let param_names = (List (List.map (fun p -> (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")]))))) then (symbol_name ((first (p)))) else p))) (sx_to_list params_expr))) in (make_lambda (param_names) (body) (env)))\n\n(* sf-defcomp *)\nand sf_defcomp args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (last (args)) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in let param_types = (nth (parsed) ((Number 2.0))) in let affinity = (defcomp_kwarg (args) ((String \"affinity\")) ((String \"auto\"))) in (let comp = (make_component (comp_name) (params) (has_children) (body) (env) (affinity)) in let effects = (defcomp_kwarg (args) ((String \"effects\")) (Nil)) in (let () = ignore ((if sx_truthy ((let _and = (Bool (not (sx_truthy ((is_nil (param_types)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((empty_p ((prim_call \"keys\" [param_types]))))))))) then (component_set_param_types_b (comp) (param_types)) else Nil)) in (let () = ignore ((if sx_truthy ((Bool (not (sx_truthy ((is_nil (effects))))))) then (let effect_list = (if sx_truthy ((prim_call \"=\" [(type_of (effects)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effects))) else (List [(String (sx_str [effects]))])) in let effect_anns = (if sx_truthy ((env_has (env) ((String \"*effect-annotations*\")))) then (env_get (env) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns (symbol_name (name_sym)) effect_list)) in (env_bind env (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) comp)) in comp)))))\n\n(* defcomp-kwarg *)\nand defcomp_kwarg args key default =\n (let end' = (prim_call \"-\" [(len (args)); (Number 1.0)]) in let result' = ref (default) in (let () = ignore ((List.iter (fun i -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((nth (args) (i)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(keyword_name ((nth (args) (i)))); key]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"+\" [i; (Number 1.0)]); end'])))) then (let val' = (nth (args) ((prim_call \"+\" [i; (Number 1.0)]))) in (result' := (if sx_truthy ((prim_call \"=\" [(type_of (val')); (String \"keyword\")])) then (keyword_name (val')) else val'); Nil)) else Nil))) (sx_to_list (prim_call \"range\" [(Number 2.0); end'; (Number 1.0)])); Nil)) in !result'))\n\n(* parse-comp-params *)\nand parse_comp_params params_expr =\n (let params = ref ((List [])) in let param_types = (Dict (Hashtbl.create 0)) in let has_children = ref ((Bool false)) in let in_key = ref ((Bool false)) in (let () = ignore ((List.iter (fun p -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (p)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")])))))) then (let name = (symbol_name ((first (p)))) in let ptype = (nth (p) ((Number 2.0))) in (let type_val = (if sx_truthy ((prim_call \"=\" [(type_of (ptype)); (String \"symbol\")])) then (symbol_name (ptype)) else ptype) in (if sx_truthy ((Bool (not (sx_truthy (!has_children))))) then (let () = ignore ((params := sx_append_b !params name; Nil)) in (sx_dict_set_b param_types name type_val)) else Nil))) else (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (let name = (symbol_name (p)) in (if sx_truthy ((prim_call \"=\" [name; (String \"&key\")])) then (in_key := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&rest\")])) then (has_children := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&children\")])) then (has_children := (Bool true); Nil) else (if sx_truthy (!has_children) then Nil else (if sx_truthy (!in_key) then (params := sx_append_b !params name; Nil) else (params := sx_append_b !params name; Nil))))))) else Nil)))) (sx_to_list params_expr); Nil)) in (List [!params; !has_children; param_types])))\n\n(* sf-defisland — multi-expression bodies wrapped in (begin ...) *)\nand sf_defisland args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body_exprs = (slice (args) ((Number 2.0))) in let body = (if sx_truthy ((prim_call \"=\" [(len (body_exprs)); (Number 1.0)])) then (first (body_exprs)) else (prim_call \"cons\" [(make_symbol ((String \"begin\"))); body_exprs])) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in (let island = (make_island (comp_name) (params) (has_children) (body) (env)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) island)) in island)))\n\n(* sf-defmacro *)\nand sf_defmacro args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (nth (args) ((Number 2.0))) in let parsed = (parse_macro_params (params_raw)) in let params = (first (parsed)) in let rest_param = (nth (parsed) ((Number 1.0))) in (let mac = (make_macro (params) (rest_param) (body) (env) ((symbol_name (name_sym)))) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) mac)) in mac)))\n\n(* parse-macro-params *)\nand parse_macro_params params_expr =\n (let params = ref ((List [])) in let rest_param = ref (Nil) in (let () = ignore ((List.fold_left (fun state p -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (p)); (String \"&rest\")]))) then (prim_call \"assoc\" [state; (String \"in-rest\"); (Bool true)]) else (if sx_truthy ((get (state) ((String \"in-rest\")))) then (let () = ignore ((rest_param := (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state) else (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state)))) (let _d = Hashtbl.create 1 in Hashtbl.replace _d (value_to_str (String \"in-rest\")) (Bool false); Dict _d) (sx_to_list params_expr))) in (List [!params; !rest_param])))\n\n(* qq-expand *)\nand qq_expand template env =\n (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"=\" [(type_of (template)); (String \"list\")])))))) then template else (if sx_truthy ((empty_p (template))) then (List []) else (let head = (first (template)) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (head)); (String \"unquote\")]))) then (trampoline ((eval_expr ((nth (template) ((Number 1.0)))) (env)))) else (List.fold_left (fun result' item -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (item)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (item)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (item)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name ((first (item)))); (String \"splice-unquote\")]))))) then (let spliced = (trampoline ((eval_expr ((nth (item) ((Number 1.0)))) (env)))) in (if sx_truthy ((prim_call \"=\" [(type_of (spliced)); (String \"list\")])) then (prim_call \"concat\" [result'; spliced]) else (if sx_truthy ((is_nil (spliced))) then result' else (prim_call \"concat\" [result'; (List [spliced])])))) else (prim_call \"concat\" [result'; (List [(qq_expand (item) (env))])]))) (List []) (sx_to_list template))))))\n\n(* sf-letrec *)\nand sf_letrec args env =\n (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in let names = ref ((List [])) in let val_exprs = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs (nth (binding) ((Number 1.0))); Nil)) in (env_bind local (sx_to_string vname) Nil)))))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))) in let val_expr = (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs val_expr; Nil)) in (env_bind local (sx_to_string vname) Nil))))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let () = ignore ((let values = (List (List.map (fun e -> (trampoline ((eval_expr (e) (local))))) (sx_to_list !val_exprs))) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (nth (pair) ((Number 1.0)))))) (sx_to_list (prim_call \"zip\" [!names; values])); Nil)) in (List.iter (fun val' -> ignore ((if sx_truthy ((is_lambda (val'))) then (List.iter (fun n -> ignore ((env_bind (lambda_closure (val')) (sx_to_string n) (env_get (local) (n))))) (sx_to_list !names); Nil) else Nil))) (sx_to_list values); Nil)))) in (let () = ignore ((List.iter (fun e -> ignore ((trampoline ((eval_expr (e) (local)))))) (sx_to_list (prim_call \"slice\" [body; (Number 0.0); (prim_call \"dec\" [(len (body))])])); Nil)) in (make_thunk ((last (body))) (local))))))\n\n(* step-sf-letrec *)\nand step_sf_letrec args env kont =\n (let thk = (sf_letrec (args) (env)) in (make_cek_state ((thunk_expr (thk))) ((thunk_env (thk))) (kont)))\n\n(* sf-dynamic-wind *)\nand sf_dynamic_wind args env =\n (let before = (trampoline ((eval_expr ((first (args))) (env)))) in let body = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let after = (trampoline ((eval_expr ((nth (args) ((Number 2.0)))) (env)))) in (dynamic_wind_call (before) (body) (after) (env)))\n\n(* sf-scope *)\nand sf_scope args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body_exprs = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest) ((Number 1.0)))) (env)))); Nil)) in (body_exprs := (prim_call \"slice\" [rest; (Number 2.0)]); Nil)) else (body_exprs := rest; Nil))) in (let () = ignore ((scope_push (name) (!val'))) in (let result' = ref (Nil) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list !body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))))\n\n(* sf-provide *)\nand sf_provide args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body_exprs = (prim_call \"slice\" [args; (Number 2.0)]) in let result' = ref (Nil) in (let () = ignore ((scope_push (name) (val'))) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))\n\n(* expand-macro *)\nand expand_macro mac raw_args env =\n (let local = (env_merge ((macro_closure (mac))) (env)) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (if sx_truthy ((prim_call \"<\" [(nth (pair) ((Number 1.0))); (len (raw_args))])) then (nth (raw_args) ((nth (pair) ((Number 1.0))))) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [p; i])) (sx_to_list (macro_params (mac)))))); Nil)) in (let () = ignore ((if sx_truthy ((macro_rest_param (mac))) then (env_bind local (sx_to_string (macro_rest_param (mac))) (prim_call \"slice\" [raw_args; (len ((macro_params (mac))))])) else Nil)) in (trampoline ((eval_expr ((macro_body (mac))) (local)))))))\n\n(* cek-run — iterative to avoid OCaml stack overflow in js_of_ocaml/WASM *)\nand cek_run state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n(* cek-step *)\nand cek_step state =\n (if sx_truthy ((prim_call \"=\" [(cek_phase (state)); (String \"eval\")])) then (step_eval (state)) else (step_continue (state)))\n\n(* step-eval *)\nand step_eval state =\n (let expr = (cek_control (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (let _match_val = (type_of (expr)) in (if _match_val = (String \"number\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"string\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"boolean\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"nil\") then (make_cek_value (Nil) (env) (kont)) else (if _match_val = (String \"symbol\") then (let name = (symbol_name (expr)) in (let val' = (if sx_truthy ((env_has (env) (name))) then (env_get (env) (name)) else (if sx_truthy ((is_primitive (name))) then (get_primitive (name)) else (if sx_truthy ((prim_call \"=\" [name; (String \"true\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [name; (String \"false\")])) then (Bool false) else (if sx_truthy ((prim_call \"=\" [name; (String \"nil\")])) then Nil else (raise (Eval_error (value_to_str (String (sx_str [(String \"Undefined symbol: \"); name])))))))))) in (let () = ignore ((if sx_truthy ((let _and = (is_nil (val')) in if not (sx_truthy _and) then _and else (prim_call \"starts-with?\" [name; (String \"~\")]))) then (debug_log ((String \"Component not found:\")) (name)) else Nil)) in (make_cek_value (val') (env) (kont))))) else (if _match_val = (String \"keyword\") then (make_cek_value ((keyword_name (expr))) (env) (kont)) else (if _match_val = (String \"dict\") then (let ks = (prim_call \"keys\" [expr]) in (if sx_truthy ((empty_p (ks))) then (make_cek_value ((Dict (Hashtbl.create 0))) (env) (kont)) else (let first_key = (first (ks)) in let remaining_entries = ref ((List [])) in (let () = ignore ((List.iter (fun k -> ignore ((remaining_entries := sx_append_b !remaining_entries (List [k; (get (expr) (k))]); Nil))) (sx_to_list (rest (ks))); Nil)) in (make_cek_state ((get (expr) (first_key))) (env) ((kont_push ((make_dict_frame (!remaining_entries) ((List [(List [first_key])])) (env))) (kont)))))))) else (if _match_val = (String \"list\") then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (step_eval_list (expr) (env) (kont))) else (make_cek_value (expr) (env) (kont))))))))))))\n\n(* step-eval-list *)\nand step_eval_list expr env kont =\n (let head = (first (expr)) in let args = (rest (expr)) in (if sx_truthy ((Bool (not (sx_truthy ((let _or = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [(type_of (head)); (String \"lambda\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(type_of (head)); (String \"list\")])))))))) then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (make_cek_state ((first (expr))) (env) ((kont_push ((make_map_frame (Nil) ((rest (expr))) ((List [])) (env))) (kont))))) else (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (let name = (symbol_name (head)) in (if sx_truthy ((prim_call \"=\" [name; (String \"if\")])) then (step_sf_if (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"when\")])) then (step_sf_when (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"cond\")])) then (step_sf_cond (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"case\")])) then (step_sf_case (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"and\")])) then (step_sf_and (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"or\")])) then (step_sf_or (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let*\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"lambda\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"fn\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"define\")])) then (step_sf_define (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defcomp\")])) then (make_cek_value ((sf_defcomp (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defisland\")])) then (make_cek_value ((sf_defisland (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defmacro\")])) then (make_cek_value ((sf_defmacro (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"begin\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"do\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quote\")])) then (make_cek_value ((if sx_truthy ((empty_p (args))) then Nil else (first (args)))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quasiquote\")])) then (make_cek_value ((qq_expand ((first (args))) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"->\")])) then (step_sf_thread_first (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"set!\")])) then (step_sf_set_b (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"letrec\")])) then (step_sf_letrec (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reset\")])) then (step_sf_reset (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"shift\")])) then (step_sf_shift (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"deref\")])) then (step_sf_deref (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"scope\")])) then (step_sf_scope (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"provide\")])) then (step_sf_provide (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"context\")])) then (step_sf_context (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emit!\")])) then (step_sf_emit (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emitted\")])) then (step_sf_emitted (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"dynamic-wind\")])) then (make_cek_value ((sf_dynamic_wind (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map\")])) then (step_ho_map (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map-indexed\")])) then (step_ho_map_indexed (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"filter\")])) then (step_ho_filter (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reduce\")])) then (step_ho_reduce (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"some\")])) then (step_ho_some (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"every?\")])) then (step_ho_every (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"for-each\")])) then (step_ho_for_each (args) (env) (kont)) else (if sx_truthy ((prim_call \"has-key?\" [custom_special_forms; name])) then (make_cek_value ((cek_call ((get (custom_special_forms) (name))) (List [args; env]))) (env) (kont)) else (if sx_truthy ((let _and = (env_has (env) (name)) in if not (sx_truthy _and) then _and else (is_macro ((env_get (env) (name)))))) then (let mac = (env_get (env) (name)) in (make_cek_state ((expand_macro (mac) (args) (env))) (env) (kont))) else (if sx_truthy ((let _and = render_check in if not (sx_truthy _and) then _and else (cek_call (render_check) (List [expr; env])))) then (make_cek_value ((cek_call (render_fn) (List [expr; env]))) (env) (kont)) else (step_eval_call (head) (args) (env) (kont))))))))))))))))))))))))))))))))))))))))))) else (step_eval_call (head) (args) (env) (kont)))))\n\n(* step-sf-if *)\nand step_sf_if args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_if_frame ((nth (args) ((Number 1.0)))) ((if sx_truthy ((prim_call \">\" [(len (args)); (Number 2.0)])) then (nth (args) ((Number 2.0))) else Nil)) (env))) (kont))))\n\n(* step-sf-when *)\nand step_sf_when args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_when_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-begin *)\nand step_sf_begin args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [(len (args)); (Number 1.0)])) then (make_cek_state ((first (args))) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_begin_frame ((rest (args))) (env))) (kont))))))\n\n(* step-sf-let *)\nand step_sf_let args env kont =\n let pairs = ref Nil in (if sx_truthy ((prim_call \"=\" [(type_of ((first (args)))); (String \"symbol\")])) then (make_cek_value ((trampoline ((sf_named_let (args) (env))))) (env) (kont)) else (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in (if sx_truthy ((empty_p (bindings))) then (step_sf_begin (body) (local) (kont)) else (let first_binding = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (first (bindings)) else (List [(first (bindings)); (nth (bindings) ((Number 1.0)))])) in let rest_bindings = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (rest (bindings)) else (let pairs = ref ((List [])) in (let () = ignore ((List.fold_left (fun _acc i -> (pairs := sx_append_b !pairs (List [(nth (bindings) ((prim_call \"*\" [i; (Number 2.0)]))); (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [i; (Number 2.0)])])))]); Nil)) Nil (sx_to_list (prim_call \"range\" [(Number 1.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])])))) in !pairs))) in (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (first_binding)))); (String \"symbol\")])) then (symbol_name ((first (first_binding)))) else (first (first_binding))) in (make_cek_state ((nth (first_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) (rest_bindings) (body) (local))) (kont)))))))))\n\n(* step-sf-define *)\nand step_sf_define args env kont =\n (let name_sym = (first (args)) in let has_effects = (let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")]))) in let val_idx = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (Number 3.0) else (Number 1.0)) in let effect_list = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (nth (args) ((Number 2.0))) else Nil) in (make_cek_state ((nth (args) (val_idx))) (env) ((kont_push ((make_define_frame ((symbol_name (name_sym))) (env) (has_effects) (effect_list))) (kont)))))\n\n(* step-sf-set! *)\nand step_sf_set_b args env kont =\n (make_cek_state ((nth (args) ((Number 1.0)))) (env) ((kont_push ((make_set_frame ((symbol_name ((first (args))))) (env))) (kont))))\n\n(* step-sf-and *)\nand step_sf_and args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool true)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_and_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-or *)\nand step_sf_or args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool false)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_or_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-cond *)\nand step_sf_cond args env kont =\n (let scheme_p = (cond_scheme_p (args)) in (if sx_truthy (scheme_p) then (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (let clause = (first (args)) in let test = (first (clause)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (clause) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool true)))) (kont))))))) else (if sx_truthy ((prim_call \"<\" [(len (args)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (args)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (args) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool false)))) (kont)))))))))\n\n(* step-sf-case *)\nand step_sf_case args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_case_frame (Nil) ((rest (args))) (env))) (kont))))\n\n(* step-sf-thread-first *)\nand step_sf_thread_first args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_thread_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-lambda *)\nand step_sf_lambda args env kont =\n (make_cek_value ((sf_lambda (args) (env))) (env) (kont))\n\n(* step-sf-scope *)\nand step_sf_scope args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest_args = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest_args)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest_args)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest_args)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest_args) ((Number 1.0)))) (env)))); Nil)) in (body := (prim_call \"slice\" [rest_args; (Number 2.0)]); Nil)) else (body := rest_args; Nil))) in (if sx_truthy ((empty_p (!body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (!body))) (env) ((kont_push ((make_scope_acc_frame (name) (!val') ((rest (!body))) (env))) (kont)))))))\n\n(* step-sf-provide *)\nand step_sf_provide args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (body))) (env) ((kont_push ((make_provide_frame (name) (val') ((rest (body))) (env))) (kont))))))\n\n(* step-sf-context *)\nand step_sf_context args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let default_val = (if sx_truthy ((prim_call \">=\" [(len (args)); (Number 2.0)])) then (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) else Nil) in let frame = (kont_find_provide (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then default_val else (get (frame) ((String \"value\"))))) (env) (kont)))\n\n(* step-sf-emit *)\nand step_sf_emit args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (let () = ignore ((if sx_truthy (frame) then (sx_dict_set_b frame (String \"emitted\") (prim_call \"append\" [(get (frame) ((String \"emitted\"))); (List [val'])])) else Nil)) in (make_cek_value (Nil) (env) (kont))))\n\n(* step-sf-emitted *)\nand step_sf_emitted args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then (List []) else (get (frame) ((String \"emitted\"))))) (env) (kont)))\n\n(* step-sf-reset *)\nand step_sf_reset args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_reset_frame (env))) (kont))))\n\n(* step-sf-shift *)\nand step_sf_shift args env kont =\n (let k_name = (symbol_name ((first (args)))) in let body = (nth (args) ((Number 1.0))) in let captured_result = (kont_capture_to_reset (kont)) in let captured = (first (captured_result)) in let rest_kont = (nth (captured_result) ((Number 1.0))) in (let k = (make_cek_continuation (captured) (rest_kont)) in (let shift_env = (env_extend (env)) in (let () = ignore ((env_bind shift_env (sx_to_string k_name) k)) in (make_cek_state (body) (shift_env) (rest_kont))))))\n\n(* step-sf-deref *)\nand step_sf_deref args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_deref_frame (env))) (kont))))\n\n(* cek-call *)\nand cek_call f args =\n (let a = (if sx_truthy ((is_nil (args))) then (List []) else args) in (if sx_truthy ((is_nil (f))) then Nil else (if sx_truthy ((let _or = (is_lambda (f)) in if sx_truthy _or then _or else (is_callable (f)))) then (cek_run ((continue_with_call (f) (a) ((make_env ())) (a) ((List []))))) else Nil)))\n\n(* reactive-shift-deref *)\nand reactive_shift_deref sig' env kont =\n (let scan_result = (kont_capture_to_reactive_reset (kont)) in let captured_frames = (first (scan_result)) in let reset_frame = (nth (scan_result) ((Number 1.0))) in let remaining_kont = (nth (scan_result) ((Number 2.0))) in let update_fn = (get (reset_frame) ((String \"update-fn\"))) in (let sub_disposers = ref ((List [])) in (let subscriber = (NativeFn (\"\\206\\187\", fun _args -> (fun () -> let sub_disposers = ref Nil in (let () = ignore ((List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil)) in (let () = ignore ((sub_disposers := (List []); Nil)) in (let new_reset = (make_reactive_reset_frame (env) (update_fn) ((Bool false))) in let new_kont = (prim_call \"concat\" [captured_frames; (List [new_reset]); remaining_kont]) in (with_island_scope ((NativeFn (\"\\206\\187\", fun _args -> match _args with [d] -> (fun d -> let sub_disposers = ref Nil in (sub_disposers := sx_append_b !sub_disposers d; Nil)) d | _ -> Nil))) ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (cek_run ((make_cek_value ((signal_value (sig'))) (env) (new_kont))))) ())))))))) ())) in (let () = ignore ((signal_add_sub_b (sig') (subscriber))) in (let () = ignore ((register_in_scope ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (let () = ignore ((signal_remove_sub_b (sig') (subscriber))) in (List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil))) ()))))) in (let initial_kont = (prim_call \"concat\" [captured_frames; (List [reset_frame]); remaining_kont]) in (make_cek_value ((signal_value (sig'))) (env) (initial_kont))))))))\n\n(* step-eval-call *)\nand step_eval_call head args env kont =\n (let hname = (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (symbol_name (head)) else Nil) in (make_cek_state (head) (env) ((kont_push ((make_arg_frame (Nil) ((List [])) (args) (env) (args) (hname))) (kont)))))\n\n(* ho-form-name? *)\nand ho_form_name_p name =\n (let _or = (prim_call \"=\" [name; (String \"map\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"map-indexed\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"filter\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"reduce\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"some\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"every?\")]) in if sx_truthy _or then _or else (prim_call \"=\" [name; (String \"for-each\")])))))))\n\n(* ho-fn? *)\nand ho_fn_p v =\n (let _or = (is_callable (v)) in if sx_truthy _or then _or else (is_lambda (v)))\n\n(* ho-swap-args *)\nand ho_swap_args ho_type evaled =\n (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; (nth (evaled) ((Number 2.0))); a]) else evaled)) else (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; a]) else evaled)))\n\n(* ho-setup-dispatch *)\nand ho_setup_dispatch ho_type evaled env kont =\n (let ordered = (ho_swap_args (ho_type) (evaled)) in (let f = (first (ordered)) in (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_map_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map-indexed\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(Number 0.0); (first (coll))])) (env) ((List [])) ((kont_push ((make_map_indexed_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"filter\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (coll))) ((List [])) ((first (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let init = (nth (ordered) ((Number 1.0))) in let coll = (nth (ordered) ((Number 2.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (init) (env) (kont)) else (continue_with_call (f) ((List [init; (first (coll))])) (env) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"some\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool false)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_some_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"every\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool true)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_every_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"for-each\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (Nil) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (coll))) (env))) (kont)))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown HO type: \"); ho_type]))))))))))))))\n\n(* step-ho-map *)\nand step_ho_map args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-map-indexed *)\nand step_ho_map_indexed args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map-indexed\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-filter *)\nand step_ho_filter args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"filter\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-reduce *)\nand step_ho_reduce args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"reduce\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-some *)\nand step_ho_some args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"some\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-every *)\nand step_ho_every args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"every\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-for-each *)\nand step_ho_for_each args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"for-each\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-continue *)\nand step_continue state =\n (let value = (cek_value (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (if sx_truthy ((kont_empty_p (kont))) then state else (let frame = (kont_top (kont)) in let rest_k = (kont_pop (kont)) in let ft = (frame_type (frame)) in (if sx_truthy ((prim_call \"=\" [ft; (String \"if\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (make_cek_state ((get (frame) ((String \"then\")))) ((get (frame) ((String \"env\")))) (rest_k)) else (if sx_truthy ((is_nil ((get (frame) ((String \"else\")))))) then (make_cek_value (Nil) (env) (rest_k)) else (make_cek_state ((get (frame) ((String \"else\")))) ((get (frame) ((String \"env\")))) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"when\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (let body = (get (frame) ((String \"body\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (make_cek_state ((first (body))) (fenv) (rest_k)) else (make_cek_state ((first (body))) (fenv) ((kont_push ((make_begin_frame ((rest (body))) (fenv))) (rest_k))))))) else (make_cek_value (Nil) (env) (rest_k))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"begin\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then (make_cek_state ((first (remaining))) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_begin_frame ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"let\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let body = (get (frame) ((String \"body\"))) in let local = (get (frame) ((String \"env\"))) in (let () = ignore ((env_bind local (sx_to_string name) value)) in (if sx_truthy ((empty_p (remaining))) then (step_sf_begin (body) (local) (rest_k)) else (let next_binding = (first (remaining)) in let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (next_binding)))); (String \"symbol\")])) then (symbol_name ((first (next_binding)))) else (first (next_binding))) in (make_cek_state ((nth (next_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) ((rest (remaining))) (body) (local))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"define\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in let has_effects = (get (frame) ((String \"has-effects\"))) in let effect_list = (get (frame) ((String \"effect-list\"))) in (let () = ignore ((if sx_truthy ((let _and = (is_lambda (value)) in if not (sx_truthy _and) then _and else (is_nil ((lambda_name (value)))))) then (set_lambda_name value (sx_to_string name)) else Nil)) in (let () = ignore ((env_bind fenv (sx_to_string name) value)) in (let () = ignore ((if sx_truthy (has_effects) then (let effect_names = (if sx_truthy ((prim_call \"=\" [(type_of (effect_list)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effect_list))) else (List [(String (sx_str [effect_list]))])) in let effect_anns = (if sx_truthy ((env_has (fenv) ((String \"*effect-annotations*\")))) then (env_get (fenv) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns name effect_names)) in (env_bind fenv (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (make_cek_value (value) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"set\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in (let () = ignore ((env_set fenv (sx_to_string name) value)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"and\")])) then (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_and_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"or\")])) then (if sx_truthy (value) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_or_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"cond\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let scheme_p = (get (frame) ((String \"scheme\"))) in (if sx_truthy (scheme_p) then (if sx_truthy (value) then (make_cek_state ((nth ((first (remaining))) ((Number 1.0)))) (fenv) (rest_k)) else (let next_clauses = (rest (remaining)) in (if sx_truthy ((empty_p (next_clauses))) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_clause = (first (next_clauses)) in let next_test = (first (next_clause)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next_clause) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next_clauses) (fenv) ((Bool true)))) (rest_k))))))))) else (if sx_truthy (value) then (make_cek_state ((nth (remaining) ((Number 1.0)))) (fenv) (rest_k)) else (let next = (prim_call \"slice\" [remaining; (Number 2.0)]) in (if sx_truthy ((prim_call \"<\" [(len (next)); (Number 2.0)])) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_test = (first (next)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next) (fenv) ((Bool false)))) (rest_k))))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"case\")])) then (let match_val = (get (frame) ((String \"match-val\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((is_nil (match_val))) then (sf_case_step_loop (value) (remaining) (fenv) (rest_k)) else (sf_case_step_loop (match_val) (remaining) (fenv) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"thread\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (let form = (first (remaining)) in let rest_forms = (rest (remaining)) in let new_kont = (if sx_truthy ((empty_p ((rest (remaining))))) then rest_k else (kont_push ((make_thread_frame ((rest (remaining))) (fenv))) (rest_k))) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (form)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((empty_p (form)))))) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (form)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (ho_form_name_p ((symbol_name ((first (form)))))))))) then (make_cek_state ((cons ((first (form))) ((cons ((List [(Symbol \"quote\"); value])) ((rest (form))))))) (fenv) (new_kont)) else (let result' = (if sx_truthy ((prim_call \"=\" [(type_of (form)); (String \"list\")])) then (let f = (trampoline ((eval_expr ((first (form))) (fenv)))) in let rargs = (List (List.map (fun a -> (trampoline ((eval_expr (a) (fenv))))) (sx_to_list (rest (form))))) in let all_args = (cons (value) (rargs)) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (sx_apply f all_args) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) (all_args) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))])))))))) else (let f = (trampoline ((eval_expr (form) (fenv)))) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (cek_call (f) (List [value])) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) ((List [value])) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))]))))))))) in (if sx_truthy ((empty_p (rest_forms))) then (make_cek_value (result') (fenv) (rest_k)) else (make_cek_value (result') (fenv) ((kont_push ((make_thread_frame (rest_forms) (fenv))) (rest_k)))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"arg\")])) then (let f = (get (frame) ((String \"f\"))) in let evaled = (get (frame) ((String \"evaled\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let raw_args = (get (frame) ((String \"raw-args\"))) in let hname = (get (frame) ((String \"head-name\"))) in (if sx_truthy ((is_nil (f))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) ((List []))) else Nil)) in (if sx_truthy ((empty_p (remaining))) then (continue_with_call (value) ((List [])) (fenv) (raw_args) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (value) ((List [])) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))) else (let new_evaled = (prim_call \"append\" [evaled; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) (new_evaled)) else Nil)) in (continue_with_call (f) (new_evaled) (fenv) (raw_args) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (f) (new_evaled) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"dict\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let fenv = (get (frame) ((String \"env\"))) in (let last_result = (last (results)) in let completed = (prim_call \"append\" [(prim_call \"slice\" [results; (Number 0.0); (prim_call \"dec\" [(len (results))])]); (List [(List [(first (last_result)); value])])]) in (if sx_truthy ((empty_p (remaining))) then (let d = (Dict (Hashtbl.create 0)) in (let () = ignore ((List.iter (fun pair -> ignore ((sx_dict_set_b d (first (pair)) (nth (pair) ((Number 1.0)))))) (sx_to_list completed); Nil)) in (make_cek_value (d) (fenv) (rest_k)))) else (let next_entry = (first (remaining)) in (make_cek_state ((nth (next_entry) ((Number 1.0)))) (fenv) ((kont_push ((make_dict_frame ((rest (remaining))) ((prim_call \"append\" [completed; (List [(List [(first (next_entry))])])])) (fenv))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"ho-setup\")])) then (let ho_type = (get (frame) ((String \"ho-type\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let evaled = (prim_call \"append\" [(get (frame) ((String \"evaled\"))); (List [value])]) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (ho_setup_dispatch (ho_type) (evaled) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_ho_setup_frame (ho_type) ((rest (remaining))) (evaled) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reset\")])) then (make_cek_value (value) (env) (rest_k)) else (if sx_truthy ((prim_call \"=\" [ft; (String \"deref\")])) then (let val' = value in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy ((is_signal (val'))))))) then (make_cek_value (val') (fenv) (rest_k)) else (if sx_truthy ((has_reactive_reset_frame_p (rest_k))) then (reactive_shift_deref (val') (fenv) (rest_k)) else (let () = ignore ((let ctx = (sx_context ((String \"sx-reactive\")) (Nil)) in (if sx_truthy (ctx) then (let dep_list = ref ((get (ctx) ((String \"deps\")))) in let notify_fn = (get (ctx) ((String \"notify\"))) in (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"contains?\" [!dep_list; val'])))))) then (let () = ignore ((dep_list := sx_append_b !dep_list val'; Nil)) in (signal_add_sub_b (val') (notify_fn))) else Nil)) else Nil))) in (make_cek_value ((signal_value (val'))) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reactive-reset\")])) then (let update_fn = (get (frame) ((String \"update-fn\"))) in let first_p = (get (frame) ((String \"first-render\"))) in (let () = ignore ((if sx_truthy ((let _and = update_fn in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy (first_p)))))) then (cek_call (update_fn) ((List [value]))) else Nil)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((scope_pop (name))) in (make_cek_value (value) (fenv) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_scope_frame (name) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"provide\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_provide_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope-acc\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((let new_frame = (make_scope_acc_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv)) in (let () = ignore ((sx_dict_set_b new_frame (String \"emitted\") (get (frame) ((String \"emitted\"))))) in new_frame))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"map\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let indexed = (get (frame) ((String \"indexed\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (prim_call \"append\" [results; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (let call_args = (if sx_truthy (indexed) then (List [(len (new_results)); (first (remaining))]) else (List [(first (remaining))])) in let next_frame = (if sx_truthy (indexed) then (make_map_indexed_frame (f) ((rest (remaining))) (new_results) (fenv)) else (make_map_frame (f) ((rest (remaining))) (new_results) (fenv))) in (continue_with_call (f) (call_args) (fenv) ((List [])) ((kont_push (next_frame) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"filter\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let current_item = (get (frame) ((String \"current-item\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (if sx_truthy (value) then (prim_call \"append\" [results; (List [current_item])]) else results) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (remaining))) (new_results) ((first (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reduce\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (continue_with_call (f) ((List [value; (first (remaining))])) (fenv) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"for-each\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (Nil) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"some\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy (value) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_some_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"every\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool true)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_every_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown frame type: \"); ft]))))))))))))))))))))))))))))))))))\n\n(* continue-with-call *)\nand continue_with_call f args env raw_args kont =\n (if sx_truthy ((continuation_p (f))) then (let arg = (if sx_truthy ((empty_p (args))) then Nil else (first (args))) in let cont_data = (continuation_data (f)) in (let captured = (get (cont_data) ((String \"captured\"))) in (let result' = (cek_run ((make_cek_value (arg) (env) (captured)))) in (make_cek_value (result') (env) (kont))))) else (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_lambda (f)))))) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_component (f)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_island (f)))))))))) then (make_cek_value ((sx_apply f args)) (env) (kont)) else (if sx_truthy ((is_lambda (f))) then (let local = (env_merge ((lambda_closure (f))) (env)) in let () = bind_lambda_params f args local in (match !jit_call_hook, f with | Some hook, Lambda l when l.l_name <> None -> let args_list = match args with List a | ListRef { contents = a } -> a | _ -> [] in (match hook f args_list with Some result -> make_cek_value result local kont | None -> make_cek_state (lambda_body f) local kont) | _ -> make_cek_state ((lambda_body (f))) (local) (kont))) else (if sx_truthy ((let _or = (is_component (f)) in if sx_truthy _or then _or else (is_island (f)))) then (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (f))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (f))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (f))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_cek_state ((component_body (f))) (local) (kont))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Not callable: \"); (inspect (f))])))))))))\n\n(* sf-case-step-loop *)\nand sf_case_step_loop match_val clauses env kont =\n (if sx_truthy ((prim_call \"<\" [(len (clauses)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (clauses)) in let body = (nth (clauses) ((Number 1.0))) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state (body) (env) (kont)) else (let test_val = (trampoline ((eval_expr (test) (env)))) in (if sx_truthy ((prim_call \"=\" [match_val; test_val])) then (make_cek_state (body) (env) (kont)) else (sf_case_step_loop (match_val) ((prim_call \"slice\" [clauses; (Number 2.0)])) (env) (kont)))))))\n\n(* eval-expr-cek *)\nand eval_expr_cek expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n(* trampoline-cek *)\nand trampoline_cek val' =\n (if sx_truthy ((is_thunk (val'))) then (eval_expr_cek ((thunk_expr (val'))) ((thunk_env (val')))) else val')\n\n(* eval-expr *)\nand eval_expr expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n\n(* Wire up trampoline to resolve thunks via the CEK machine *)\nlet () = trampoline_fn := (fun v ->\n match v with\n | Thunk (expr, env) -> eval_expr expr (Env env)\n | _ -> v)\n\n(* Wire up the primitives trampoline so call_any in HO forms resolves Thunks *)\nlet () = Sx_primitives._sx_trampoline_fn := !trampoline_fn\n\n(* Wire up as_number trampoline so arithmetic on leaked thunks auto-resolves *)\nlet () = Sx_primitives.trampoline_hook := !trampoline_fn\n\n(* Override recursive cek_run with iterative loop *)\nlet cek_run_iterative state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":190237},"map":{"version":3,"sources":["/workspace_root/lib/sx_vm.ml","/builtin/blackbox.ml"],"sourcesContent":["(** SX bytecode VM — stack-based interpreter.\n\n Executes bytecode produced by compiler.sx.\n Designed for speed: array-based stack, direct dispatch,\n no allocation per step (unlike the CEK machine).\n\n This is the platform-native execution engine. The same bytecode\n runs on all platforms (OCaml, JS, WASM).\n\n VM types (vm_code, vm_upvalue_cell, vm_closure) are defined in\n sx_types.ml to share the mutual recursion block with [value]. *)\n\nopen Sx_types\n\n(** Call frame — one per function invocation. *)\ntype frame = {\n closure : vm_closure;\n mutable ip : int;\n base : int; (* base index in value stack for locals *)\n local_cells : (int, vm_upvalue_cell) Hashtbl.t; (* slot → shared cell for captured locals *)\n}\n\n(** VM state. *)\ntype vm = {\n mutable stack : value array;\n mutable sp : int;\n mutable frames : frame list;\n globals : (string, value) Hashtbl.t; (* live reference to kernel env *)\n}\n\n(** Forward reference for JIT compilation — set after definition. *)\nlet jit_compile_ref : (lambda -> (string, value) Hashtbl.t -> vm_closure option) ref =\n ref (fun _ _ -> None)\n\n(** Sentinel closure indicating JIT compilation was attempted and failed.\n Prevents retrying compilation on every call. *)\nlet jit_failed_sentinel = {\n vm_code = { vc_arity = -1; vc_locals = 0; vc_bytecode = [||]; vc_constants = [||] };\n vm_upvalues = [||]; vm_name = Some \"__jit_failed__\"; vm_env_ref = Hashtbl.create 0; vm_closure_env = None\n}\n\nlet is_jit_failed cl = cl.vm_code.vc_arity = -1\n\nlet create globals =\n { stack = Array.make 4096 Nil; sp = 0; frames = []; globals }\n\n(** Stack ops — inlined for speed. *)\nlet push vm v =\n if vm.sp >= Array.length vm.stack then begin\n let ns = Array.make (vm.sp * 2) Nil in\n Array.blit vm.stack 0 ns 0 vm.sp;\n vm.stack <- ns\n end;\n vm.stack.(vm.sp) <- v;\n vm.sp <- vm.sp + 1\n\nlet[@inline] pop vm =\n vm.sp <- vm.sp - 1;\n vm.stack.(vm.sp)\n\nlet[@inline] peek vm = vm.stack.(vm.sp - 1)\n\n(** Read operands. *)\nlet[@inline] read_u8 f =\n let v = f.closure.vm_code.vc_bytecode.(f.ip) in\n f.ip <- f.ip + 1; v\n\nlet[@inline] read_u16 f =\n let lo = f.closure.vm_code.vc_bytecode.(f.ip) in\n let hi = f.closure.vm_code.vc_bytecode.(f.ip + 1) in\n f.ip <- f.ip + 2;\n lo lor (hi lsl 8)\n\nlet[@inline] read_i16 f =\n let v = read_u16 f in\n if v >= 32768 then v - 65536 else v\n\n(** Wrap a VM closure as an SX value (NativeFn). *)\nlet closure_to_value cl =\n NativeFn (\"vm:\" ^ (match cl.vm_name with Some n -> n | None -> \"anon\"),\n fun args -> raise (Eval_error (\"VM_CLOSURE_CALL:\" ^ String.concat \",\" (List.map Sx_runtime.value_to_str args))))\n (* Placeholder — actual calls go through vm_call below *)\n\nlet _vm_insn_count = ref 0\nlet _vm_call_count = ref 0\nlet _vm_cek_count = ref 0\nlet vm_reset_counters () = _vm_insn_count := 0; _vm_call_count := 0; _vm_cek_count := 0\nlet vm_report_counters () =\n Printf.eprintf \"[vm-perf] insns=%d calls=%d cek_fallbacks=%d\\n%!\"\n !_vm_insn_count !_vm_call_count !_vm_cek_count\n\n(** Push a VM closure frame onto the current VM — no new VM allocation.\n This is the fast path for intra-VM closure calls. *)\nlet push_closure_frame vm cl args =\n let frame = { closure = cl; ip = 0; base = vm.sp; local_cells = Hashtbl.create 4 } in\n List.iter (fun a -> push vm a) args;\n for _ = List.length args to cl.vm_code.vc_locals - 1 do push vm Nil done;\n vm.frames <- frame :: vm.frames\n\n(** Convert compiler output (SX dict) to a vm_code object. *)\nlet code_from_value v =\n match v with\n | Dict d ->\n let bc_list = match Hashtbl.find_opt d \"bytecode\" with\n | Some (List l | ListRef { contents = l }) ->\n Array.of_list (List.map (fun x -> match x with Number n -> int_of_float n | _ -> 0) l)\n | _ -> [||]\n in\n let entries = match Hashtbl.find_opt d \"constants\" with\n | Some (List l | ListRef { contents = l }) -> Array.of_list l\n | _ -> [||]\n in\n let constants = Array.map (fun entry ->\n match entry with\n | Dict ed when Hashtbl.mem ed \"bytecode\" -> entry (* nested code — convert lazily *)\n | _ -> entry\n ) entries in\n let arity = match Hashtbl.find_opt d \"arity\" with\n | Some (Number n) -> int_of_float n | _ -> 0\n in\n { vc_arity = arity; vc_locals = arity + 16; vc_bytecode = bc_list; vc_constants = constants }\n | _ -> { vc_arity = 0; vc_locals = 16; vc_bytecode = [||]; vc_constants = [||] }\n\n(** Execute a closure with arguments — creates a fresh VM.\n Used for entry points: JIT Lambda calls, module execution, cross-boundary. *)\nlet rec call_closure cl args globals =\n incr _vm_call_count;\n let vm = create globals in\n push_closure_frame vm cl args;\n (try run vm with e -> raise e);\n pop vm\n\n(** Call a value as a function — dispatch by type.\n VmClosure: pushes frame on current VM (fast intra-VM path).\n Lambda: tries JIT then falls back to CEK.\n NativeFn: calls directly. *)\nand vm_call vm f args =\n match f with\n | VmClosure cl ->\n (* Fast path: push frame on current VM — no allocation, enables TCO *)\n push_closure_frame vm cl args\n | NativeFn (_name, fn) ->\n let result = fn args in\n push vm result\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (is_jit_failed cl) ->\n (* Cached bytecode — run on VM using the closure's captured env,\n not the caller's globals. Closure vars were merged at compile time. *)\n (try push vm (call_closure cl args cl.vm_env_ref)\n with _ -> push vm (Sx_ref.cek_call f (List args)))\n | Some _ ->\n (* Compile failed — CEK *)\n push vm (Sx_ref.cek_call f (List args))\n | None ->\n if l.l_name <> None\n then begin\n (* Pre-mark before compile attempt to prevent re-entrancy *)\n l.l_compiled <- Some jit_failed_sentinel;\n match !jit_compile_ref l vm.globals with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try push vm (call_closure cl args cl.vm_env_ref)\n with _ ->\n l.l_compiled <- Some jit_failed_sentinel;\n push vm (Sx_ref.cek_call f (List args)))\n | None ->\n push vm (Sx_ref.cek_call f (List args))\n end\n else\n push vm (Sx_ref.cek_call f (List args)))\n | Component _ | Island _ ->\n (* Components use keyword-arg parsing — CEK handles this *)\n incr _vm_cek_count;\n let result = Sx_ref.cek_call f (List args) in\n push vm result\n | _ ->\n raise (Eval_error (\"VM: not callable: \" ^ Sx_runtime.value_to_str f))\n\n(** Main execution loop — iterative (no OCaml stack growth).\n VmClosure calls push frames; the loop picks them up.\n OP_TAIL_CALL + VmClosure = true TCO: drop frame, push new, loop. *)\nand run vm =\n while vm.frames <> [] do\n match vm.frames with\n | [] -> () (* guard handled by while condition *)\n | frame :: rest_frames ->\n let bc = frame.closure.vm_code.vc_bytecode in\n let consts = frame.closure.vm_code.vc_constants in\n if frame.ip >= Array.length bc then\n vm.frames <- [] (* bytecode exhausted — stop *)\n else begin\n let saved_ip = frame.ip in\n let op = bc.(frame.ip) in\n frame.ip <- frame.ip + 1;\n (try match op with\n (* ---- Constants ---- *)\n | 1 (* OP_CONST *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CONST index %d out of bounds (pool size %d)\"\n idx (Array.length consts)));\n push vm consts.(idx)\n | 2 (* OP_NIL *) -> push vm Nil\n | 3 (* OP_TRUE *) -> push vm (Bool true)\n | 4 (* OP_FALSE *) -> push vm (Bool false)\n | 5 (* OP_POP *) -> ignore (pop vm)\n | 6 (* OP_DUP *) -> push vm (peek vm)\n\n (* ---- Variable access ---- *)\n | 16 (* OP_LOCAL_GET *) ->\n let slot = read_u8 frame in\n let v = match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value\n | None ->\n let idx = frame.base + slot in\n if idx >= vm.sp then\n raise (Eval_error (Printf.sprintf\n \"VM: LOCAL_GET slot=%d base=%d sp=%d out of bounds\" slot frame.base vm.sp));\n vm.stack.(idx)\n in\n push vm v\n | 17 (* OP_LOCAL_SET *) ->\n let slot = read_u8 frame in\n let v = peek vm in\n (* Write to shared cell if captured, else to stack *)\n (match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value <- v\n | None -> vm.stack.(frame.base + slot) <- v)\n | 18 (* OP_UPVALUE_GET *) ->\n let idx = read_u8 frame in\n if idx >= Array.length frame.closure.vm_upvalues then\n raise (Eval_error (Printf.sprintf\n \"VM: UPVALUE_GET idx=%d out of bounds (have %d)\" idx\n (Array.length frame.closure.vm_upvalues)));\n push vm frame.closure.vm_upvalues.(idx).uv_value\n | 19 (* OP_UPVALUE_SET *) ->\n let idx = read_u8 frame in\n frame.closure.vm_upvalues.(idx).uv_value <- peek vm\n | 20 (* OP_GLOBAL_GET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = try Hashtbl.find vm.globals name with Not_found ->\n (* Walk the closure env chain for inner functions *)\n let rec env_lookup e =\n try Hashtbl.find e.bindings name\n with Not_found ->\n match e.parent with Some p -> env_lookup p | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n match frame.closure.vm_closure_env with\n | Some env -> env_lookup env\n | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n push vm v\n | 21 (* OP_GLOBAL_SET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n (* Write to closure env if the name exists there (mutable closure vars) *)\n let written = match frame.closure.vm_closure_env with\n | Some env ->\n let rec find_env e =\n if Hashtbl.mem e.bindings name then\n (Hashtbl.replace e.bindings name (peek vm); true)\n else match e.parent with Some p -> find_env p | None -> false\n in find_env env\n | None -> false\n in\n if not written then Hashtbl.replace vm.globals name (peek vm)\n\n (* ---- Control flow ---- *)\n | 32 (* OP_JUMP *) ->\n let offset = read_i16 frame in\n frame.ip <- frame.ip + offset\n | 33 (* OP_JUMP_IF_FALSE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if not (sx_truthy v) then frame.ip <- frame.ip + offset\n | 34 (* OP_JUMP_IF_TRUE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if sx_truthy v then frame.ip <- frame.ip + offset\n\n (* ---- Function calls ---- *)\n | 48 (* OP_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n vm_call vm f args_list\n (* Loop continues — if VmClosure, new frame runs next iteration *)\n | 49 (* OP_TAIL_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n (* Drop current frame, reuse stack space — true TCO for VmClosure *)\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n vm_call vm f args_list\n | 50 (* OP_RETURN *) ->\n let result = pop vm in\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n push vm result\n (* Loop continues with caller frame *)\n | 51 (* OP_CLOSURE *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CLOSURE idx %d >= consts %d\" idx (Array.length consts)));\n let code_val = consts.(idx) in\n let code = code_from_value code_val in\n (* Read upvalue descriptors from bytecode *)\n let uv_count = match code_val with\n | Dict d -> (match Hashtbl.find_opt d \"upvalue-count\" with\n | Some (Number n) -> int_of_float n | _ -> 0)\n | _ -> 0\n in\n let upvalues = Array.init uv_count (fun _ ->\n let is_local = read_u8 frame in\n let index = read_u8 frame in\n if is_local = 1 then begin\n (* Capture from enclosing frame's local slot.\n Create a shared cell — both parent and closure\n read/write through this cell. *)\n let cell = match Hashtbl.find_opt frame.local_cells index with\n | Some existing -> existing (* reuse existing cell *)\n | None ->\n let c = { uv_value = vm.stack.(frame.base + index) } in\n Hashtbl.replace frame.local_cells index c;\n c\n in\n cell\n end else\n (* Capture from enclosing frame's upvalue — already a shared cell *)\n frame.closure.vm_upvalues.(index)\n ) in\n let cl = { vm_code = code; vm_upvalues = upvalues; vm_name = None;\n vm_env_ref = vm.globals; vm_closure_env = None } in\n push vm (VmClosure cl)\n | 52 (* OP_CALL_PRIM *) ->\n let idx = read_u16 frame in\n let argc = read_u8 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let args = List.init argc (fun _ -> pop vm) |> List.rev in\n (* Resolve thunks — the CEK evaluator does this automatically\n via trampoline, but the VM must do it explicitly before\n passing args to primitives. *)\n let args = List.map (fun v ->\n match v with\n | Thunk _ -> !Sx_primitives._sx_trampoline_fn v\n | _ -> v) args in\n let result =\n try\n (* Check primitives FIRST (native implementations of map/filter/etc.),\n then globals (which may have ho_via_cek wrappers that route\n through the CEK — these can't call VM closures). *)\n let fn_val = try Sx_primitives.get_primitive name with _ ->\n try Hashtbl.find vm.globals name with Not_found ->\n raise (Eval_error (\"VM: unknown primitive \" ^ name))\n in\n (match fn_val with\n | NativeFn (_, fn) -> fn args\n | _ -> Nil)\n with Eval_error msg ->\n raise (Eval_error (Printf.sprintf \"%s (in CALL_PRIM \\\"%s\\\" with %d args)\"\n msg name argc))\n in\n push vm result\n\n (* ---- Collections ---- *)\n | 64 (* OP_LIST *) ->\n let count = read_u16 frame in\n let items = List.init count (fun _ -> pop vm) |> List.rev in\n push vm (List items)\n | 65 (* OP_DICT *) ->\n let count = read_u16 frame in\n let d = Hashtbl.create count in\n for _ = 1 to count do\n let v = pop vm in\n let k = pop vm in\n let key = match k with String s -> s | Keyword s -> s | _ -> Sx_runtime.value_to_str k in\n Hashtbl.replace d key v\n done;\n push vm (Dict d)\n\n (* ---- String ops ---- *)\n | 144 (* OP_STR_CONCAT *) ->\n let count = read_u8 frame in\n let parts = List.init count (fun _ -> pop vm) |> List.rev in\n let s = String.concat \"\" (List.map Sx_runtime.value_to_str parts) in\n push vm (String s)\n\n (* ---- Define ---- *)\n | 128 (* OP_DEFINE *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = peek vm in\n Hashtbl.replace vm.globals name v\n\n (* ---- Inline primitives ----\n Fast path for common types; fallback to actual primitive\n for edge cases (type coercion, thunks, RawHTML, etc.)\n to guarantee behavioral parity with CALL_PRIM. *)\n | 160 (* OP_ADD *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x +. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"+\") [a; b])\n | 161 (* OP_SUB *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x -. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [a; b])\n | 162 (* OP_MUL *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x *. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"*\") [a; b])\n | 163 (* OP_DIV *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x /. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"/\") [a; b])\n | 164 (* OP_EQ *) ->\n let b = pop vm and a = pop vm in\n let rec norm = function\n | ListRef { contents = l } -> List (List.map norm l)\n | List l -> List (List.map norm l) | v -> v in\n push vm (Bool (norm a = norm b))\n | 165 (* OP_LT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x < y)\n | String x, String y -> Bool (x < y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"<\") [a; b])\n | 166 (* OP_GT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x > y)\n | String x, String y -> Bool (x > y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \">\") [a; b])\n | 167 (* OP_NOT *) ->\n let v = pop vm in\n push vm (Bool (not (sx_truthy v)))\n | 168 (* OP_LEN *) ->\n let v = pop vm in\n push vm (match v with\n | List l | ListRef { contents = l } -> Number (float_of_int (List.length l))\n | String s -> Number (float_of_int (String.length s))\n | Dict d -> Number (float_of_int (Hashtbl.length d))\n | Nil -> Number 0.0\n | _ -> (Hashtbl.find Sx_primitives.primitives \"len\") [v])\n | 169 (* OP_FIRST *) ->\n let v = pop vm in\n push vm (match v with\n | List (x :: _) | ListRef { contents = x :: _ } -> x\n | List [] | ListRef { contents = [] } | Nil -> Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"first\") [v])\n | 170 (* OP_REST *) ->\n let v = pop vm in\n push vm (match v with\n | List (_ :: xs) | ListRef { contents = _ :: xs } -> List xs\n | List [] | ListRef { contents = [] } | Nil -> List []\n | _ -> (Hashtbl.find Sx_primitives.primitives \"rest\") [v])\n | 171 (* OP_NTH *) ->\n let n = pop vm and coll = pop vm in\n push vm (match coll, n with\n | (List l | ListRef { contents = l }), Number f ->\n (try List.nth l (int_of_float f) with _ -> Nil)\n | String s, Number f ->\n let i = int_of_float f in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"nth\") [coll; n])\n | 172 (* OP_CONS *) ->\n let coll = pop vm and x = pop vm in\n push vm (match coll with\n | List l -> List (x :: l)\n | ListRef { contents = l } -> List (x :: l)\n | Nil -> List [x]\n | _ -> (Hashtbl.find Sx_primitives.primitives \"cons\") [x; coll])\n | 173 (* OP_NEG *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (-.x)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [v])\n | 174 (* OP_INC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x +. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"inc\") [v])\n | 175 (* OP_DEC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x -. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"dec\") [v])\n\n | opcode ->\n raise (Eval_error (Printf.sprintf \"VM: unknown opcode %d at ip=%d\"\n opcode (frame.ip - 1)))\n with Invalid_argument msg ->\n let fn_name = match frame.closure.vm_name with Some n -> n | None -> \"?\" in\n raise (Eval_error (Printf.sprintf\n \"VM: %s at ip=%d op=%d in %s (base=%d sp=%d bc_len=%d consts=%d)\"\n msg saved_ip op fn_name frame.base vm.sp\n (Array.length bc) (Array.length consts))))\n end\n done\n\n(** Execute a compiled module (top-level bytecode). *)\nlet execute_module code globals =\n let cl = { vm_code = code; vm_upvalues = [||]; vm_name = Some \"module\"; vm_env_ref = globals; vm_closure_env = None } in\n let vm = create globals in\n let frame = { closure = cl; ip = 0; base = 0; local_cells = Hashtbl.create 4 } in\n for _ = 0 to code.vc_locals - 1 do push vm Nil done;\n vm.frames <- [frame];\n run vm;\n pop vm\n\n\n(** {1 Lazy JIT compilation} *)\n\n(** Compile a lambda or component body to bytecode using the SX compiler.\n Invokes [compile] from spec/compiler.sx via the CEK machine.\n Returns a [vm_closure] ready for execution, or [None] on failure\n (safe fallback to CEK interpretation).\n\n The compilation cost is a single CEK evaluation of the compiler —\n microseconds per function. The result is cached in the lambda/component\n record so subsequent calls go straight to the VM. *)\nlet jit_compile_lambda (l : lambda) globals =\n let fn_name = match l.l_name with Some n -> n | None -> \"\" in\n try\n let compile_fn = try Hashtbl.find globals \"compile\"\n with Not_found -> raise (Eval_error \"JIT: compiler not loaded\") in\n (* Reconstruct the (fn (params) body) form so the compiler produces\n a proper closure. l.l_body is the inner body; we need the full\n function form with params so the compiled code binds them. *)\n let param_syms = List (List.map (fun s -> Symbol s) l.l_params) in\n let fn_expr = List [Symbol \"fn\"; param_syms; l.l_body] in\n let quoted = List [Symbol \"quote\"; fn_expr] in\n let result = Sx_ref.eval_expr (List [compile_fn; quoted]) (Env (make_env ())) in\n (* If the lambda has closure-captured variables, merge them into globals\n so the VM can find them via GLOBAL_GET. The compiler doesn't know\n about the enclosing scope, so closure vars get compiled as globals. *)\n let effective_globals =\n let closure = l.l_closure in\n if Hashtbl.length closure.bindings = 0 && closure.parent = None then\n globals (* no closure vars — use globals directly *)\n else begin\n (* Merge: closure bindings layered on top of globals.\n Use a shallow copy so we don't pollute the real globals. *)\n let merged = Hashtbl.copy globals in\n let rec inject env =\n Hashtbl.iter (fun k v -> Hashtbl.replace merged k v) env.bindings;\n match env.parent with Some p -> inject p | None -> ()\n in\n inject closure;\n let n = Hashtbl.length merged - Hashtbl.length globals in\n if n > 0 then\n Printf.eprintf \"[jit] %s: injected %d closure bindings\\n%!\" fn_name n;\n merged\n end\n in\n (match result with\n | Dict d when Hashtbl.mem d \"bytecode\" ->\n let outer_code = code_from_value result in\n let bc = outer_code.vc_bytecode in\n if Array.length bc >= 4 && bc.(0) = 51 (* OP_CLOSURE *) then begin\n let idx = bc.(1) lor (bc.(2) lsl 8) in\n if idx < Array.length outer_code.vc_constants then\n let inner_val = outer_code.vc_constants.(idx) in\n let code = code_from_value inner_val in\n Some { vm_code = code; vm_upvalues = [||];\n vm_name = l.l_name; vm_env_ref = effective_globals; vm_closure_env = Some l.l_closure }\n else begin\n Printf.eprintf \"[jit] FAIL %s: closure index %d out of bounds (pool=%d)\\n%!\"\n fn_name idx (Array.length outer_code.vc_constants);\n\n None\n end\n end else begin\n (* Not a closure — constant expression, alias, or simple computation.\n Execute the bytecode as a module to get the value, then wrap\n as a NativeFn if it's callable (so the CEK can dispatch to it). *)\n (try\n let value = execute_module outer_code globals in\n Printf.eprintf \"[jit] RESOLVED %s: %s (bc[0]=%d)\\n%!\"\n fn_name (type_of value) (if Array.length bc > 0 then bc.(0) else -1);\n (* If the resolved value is a NativeFn, we can't wrap it as a\n vm_closure — just let the CEK handle it directly. Return None\n so the lambda falls through to CEK, which will find the\n resolved value in the env on next lookup. *)\n None\n with _ ->\n Printf.eprintf \"[jit] SKIP %s: non-closure execution failed (bc[0]=%d, len=%d)\\n%!\"\n fn_name (if Array.length bc > 0 then bc.(0) else -1) (Array.length bc);\n None)\n end\n | _ ->\n Printf.eprintf \"[jit] FAIL %s: compiler returned %s\\n%!\" fn_name (type_of result);\n None)\n with e ->\n Printf.eprintf \"[jit] FAIL %s: %s\\n%!\" fn_name (Printexc.to_string e);\n None\n\n(* Wire up forward references *)\nlet () = jit_compile_ref := jit_compile_lambda\nlet () = _vm_call_closure_ref := (fun cl args -> call_closure cl args cl.vm_env_ref)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":205312},"map":{"version":3,"sources":["/workspace_root/lib/sx_scope.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Scope stacks — dynamic scope for render-time effects.\n\n Provides scope-push!/pop!/peek, collect!/collected/clear-collected!,\n scope-emit!/emitted/scope-emitted, context, and cookie access.\n\n All functions are registered as primitives so both the CEK evaluator\n and the JIT VM can find them in the same place. *)\n\nopen Sx_types\n\n(** The shared scope stacks hashtable. Each key maps to a stack of values.\n Used by aser for spread/provide/emit patterns, CSSX collect/flush, etc. *)\nlet scope_stacks : (string, value list) Hashtbl.t = Hashtbl.create 8\n\n(** Request cookies — set by the Python bridge before each render.\n get-cookie reads from here; set-cookie is a no-op on the server. *)\nlet request_cookies : (string, string) Hashtbl.t = Hashtbl.create 8\n\n(** Clear all scope stacks. Called between requests if needed. *)\nlet clear_all () = Hashtbl.clear scope_stacks\n\nlet () =\n let register = Sx_primitives.register in\n\n (* --- Cookies --- *)\n\n register \"get-cookie\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt request_cookies name with\n | Some v -> String v\n | None -> Nil)\n | _ -> Nil);\n\n register \"set-cookie\" (fun _args -> Nil);\n\n (* --- Core scope stack operations --- *)\n\n register \"scope-push!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n Hashtbl.replace scope_stacks name (value :: stack); Nil\n | _ -> Nil);\n\n register \"scope-pop!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with _ :: rest -> Hashtbl.replace scope_stacks name rest | [] -> ()); Nil\n | _ -> Nil);\n\n register \"scope-peek\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with v :: _ -> v | [] -> Nil)\n | _ -> Nil);\n\n (* --- Context (scope lookup with optional default) --- *)\n\n register \"context\" (fun args ->\n match args with\n | [String name] | [String name; _] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack, args with\n | v :: _, _ -> v\n | [], [_; default_val] -> default_val\n | [], _ -> Nil)\n | _ -> Nil);\n\n (* --- Collect / collected / clear-collected! --- *)\n\n register \"collect!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n if not (List.mem value items) then\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"collected\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"clear-collected!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | _ :: rest -> Hashtbl.replace scope_stacks name (List [] :: rest)\n | [] -> Hashtbl.replace scope_stacks name [List []]);\n Nil\n | _ -> Nil);\n\n (* --- Emit / emitted (for spread attrs in adapter-html.sx) --- *)\n\n register \"scope-emit!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | Nil :: rest ->\n Hashtbl.replace scope_stacks name (List [value] :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"emit!\" (fun args ->\n (* Alias for scope-emit! *)\n match Sx_primitives.get_primitive \"scope-emit!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"emitted\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"scope-emitted\" (fun args ->\n match Sx_primitives.get_primitive \"emitted\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-collected\" (fun args ->\n match Sx_primitives.get_primitive \"collected\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-clear-collected!\" (fun args ->\n match Sx_primitives.get_primitive \"clear-collected!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n (* --- Provide aliases --- *)\n\n register \"provide-push!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-push!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"provide-pop!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-pop!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":209507},"map":{"version":3,"sources":["/workspace_root/lib/sx_parser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** S-expression parser.\n\n Recursive descent over a string, producing [Sx_types.value list].\n Supports: lists, dicts, symbols, keywords, strings (with escapes),\n numbers, booleans, nil, comments, quote/quasiquote/unquote sugar. *)\n\nopen Sx_types\n\ntype state = {\n src : string;\n len : int;\n mutable pos : int;\n}\n\nlet make_state src = { src; len = String.length src; pos = 0 }\n\nlet peek s = if s.pos < s.len then Some s.src.[s.pos] else None\nlet advance s = s.pos <- s.pos + 1\nlet at_end s = s.pos >= s.len\n\nlet skip_whitespace_and_comments s =\n let rec go () =\n if at_end s then ()\n else match s.src.[s.pos] with\n | ' ' | '\\t' | '\\n' | '\\r' -> advance s; go ()\n | ';' ->\n while s.pos < s.len && s.src.[s.pos] <> '\\n' do advance s done;\n if s.pos < s.len then advance s;\n go ()\n | _ -> ()\n in go ()\n\n(* Character classification — matches spec/parser.sx ident-start/ident-char.\n ident-start: a-z A-Z _ ~ * + - > < = / ! ? &\n ident-char: ident-start plus 0-9 . : / # , *)\nlet is_ident_start = function\n | 'a'..'z' | 'A'..'Z' | '_' | '~' | '*' | '+' | '-'\n | '>' | '<' | '=' | '/' | '!' | '?' | '&' -> true\n | _ -> false\n\nlet is_ident_char = function\n | c when is_ident_start c -> true\n | '0'..'9' | '.' | ':' | '#' | ',' -> true\n | _ -> false\n\n(* Symbol reading uses ident_char; first char must be ident_start or digit/colon *)\nlet is_symbol_char = is_ident_char\n\nlet read_string s =\n (* s.pos is on the opening quote *)\n advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '\"' then Buffer.contents buf\n else if c = '\\\\' then begin\n if at_end s then raise (Parse_error \"Unterminated string escape\");\n let esc = s.src.[s.pos] in\n advance s;\n (match esc with\n | 'n' -> Buffer.add_char buf '\\n'\n | 't' -> Buffer.add_char buf '\\t'\n | 'r' -> Buffer.add_char buf '\\r'\n | '\"' -> Buffer.add_char buf '\"'\n | '\\\\' -> Buffer.add_char buf '\\\\'\n | 'u' ->\n (* \\uXXXX — read 4 hex digits, encode as UTF-8 *)\n if s.pos + 4 > s.len then raise (Parse_error \"Incomplete \\\\u escape\");\n let hex = String.sub s.src s.pos 4 in\n s.pos <- s.pos + 4;\n let code = int_of_string (\"0x\" ^ hex) in\n let ubuf = Buffer.create 4 in\n Buffer.add_utf_8_uchar ubuf (Uchar.of_int code);\n Buffer.add_string buf (Buffer.contents ubuf)\n | '`' -> Buffer.add_char buf '`'\n | _ -> Buffer.add_char buf '\\\\'; Buffer.add_char buf esc);\n go ()\n end else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n\nlet read_symbol s =\n let start = s.pos in\n while s.pos < s.len && is_symbol_char s.src.[s.pos] do advance s done;\n String.sub s.src start (s.pos - start)\n\nlet try_number str =\n match float_of_string_opt str with\n | Some n -> Some (Number n)\n | None -> None\n\nlet rec read_value s : value =\n skip_whitespace_and_comments s;\n if at_end s then begin\n let line = ref 1 in\n String.iter (fun c -> if c = '\\n' then incr line) s.src;\n raise (Parse_error (Printf.sprintf \"Unexpected end of input at line %d (pos %d)\" !line s.pos))\n end;\n match s.src.[s.pos] with\n | '(' -> read_list s ')'\n | '[' -> read_list s ']'\n | '{' -> read_dict s\n | '\"' -> String (read_string s)\n | '\\'' -> advance s; List [Symbol \"quote\"; read_value s]\n | '`' -> advance s; List [Symbol \"quasiquote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = ';' ->\n (* Datum comment: #; discards next expression *)\n advance s; advance s;\n ignore (read_value s);\n read_value s\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '\\'' ->\n (* Quote shorthand: #'expr -> (quote expr) *)\n advance s; advance s;\n List [Symbol \"quote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '|' ->\n (* Raw string: #|...| — ends at next | *)\n advance s; advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated raw string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '|' then\n String (Buffer.contents buf)\n else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n | ',' ->\n (* Unquote / splice-unquote — matches spec: , always triggers unquote *)\n advance s;\n if s.pos < s.len && s.src.[s.pos] = '@' then begin\n advance s;\n List [Symbol \"splice-unquote\"; read_value s]\n end else\n List [Symbol \"unquote\"; read_value s]\n | _ ->\n begin\n (* Symbol, keyword, number, or boolean *)\n let token = read_symbol s in\n if token = \"\" then begin\n let line = ref 1 and col = ref 1 in\n for i = 0 to s.pos - 1 do\n if s.src.[i] = '\\n' then (incr line; col := 1) else incr col\n done;\n raise (Parse_error (Printf.sprintf \"Unexpected char: %c at line %d col %d (pos %d)\"\n s.src.[s.pos] !line !col s.pos))\n end;\n match token with\n | \"true\" -> Bool true\n | \"false\" -> Bool false\n | \"nil\" -> Nil\n | _ when token.[0] = ':' ->\n Keyword (String.sub token 1 (String.length token - 1))\n | _ ->\n match try_number token with\n | Some n -> n\n | None -> Symbol token\n end\n\nand read_list s close_char =\n advance s; (* skip opening paren/bracket *)\n let items = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated list\");\n if s.src.[s.pos] = close_char then begin\n advance s;\n List (List.rev !items)\n end else begin\n items := read_value s :: !items;\n go ()\n end\n in go ()\n\nand read_dict s =\n advance s; (* skip { *)\n let d = make_dict () in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated dict\");\n if s.src.[s.pos] = '}' then begin\n advance s;\n Dict d\n end else begin\n let key = read_value s in\n let key_str = match key with\n | Keyword k -> k\n | String k -> k\n | Symbol k -> k\n | _ -> raise (Parse_error \"Dict key must be keyword, string, or symbol\")\n in\n let v = read_value s in\n dict_set d key_str v;\n go ()\n end\n in go ()\n\n\n(** Parse a string into a list of SX values. *)\nlet parse_all src =\n let s = make_state src in\n let results = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then List.rev !results\n else begin\n results := read_value s :: !results;\n go ()\n end\n in go ()\n\n(** Parse a file into a list of SX values. *)\nlet parse_file path =\n let ic = open_in path in\n let n = in_channel_length ic in\n let src = really_input_string ic n in\n close_in ic;\n parse_all src\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":214327},"map":{"version":3,"sources":["/workspace_root/lib/sx_render.ml","/builtin/blackbox.ml"],"sourcesContent":["(** HTML renderer for SX values.\n\n Extracted from run_tests.ml — renders an SX expression tree to an\n HTML string, expanding components and macros along the way.\n\n Depends on [Sx_ref.eval_expr] for evaluating sub-expressions\n during rendering (keyword arg values, conditionals, etc.). *)\n\nopen Sx_types\n\n(* ====================================================================== *)\n(* Tag / attribute registries *)\n(* ====================================================================== *)\n\nlet html_tags = [\n \"html\"; \"head\"; \"body\"; \"title\"; \"meta\"; \"link\"; \"script\"; \"style\"; \"noscript\";\n \"header\"; \"nav\"; \"main\"; \"section\"; \"article\"; \"aside\"; \"footer\";\n \"h1\"; \"h2\"; \"h3\"; \"h4\"; \"h5\"; \"h6\"; \"hgroup\";\n \"div\"; \"p\"; \"blockquote\"; \"pre\"; \"figure\"; \"figcaption\"; \"address\"; \"hr\";\n \"ul\"; \"ol\"; \"li\"; \"dl\"; \"dt\"; \"dd\"; \"menu\";\n \"a\"; \"span\"; \"em\"; \"strong\"; \"small\"; \"b\"; \"i\"; \"u\"; \"s\"; \"sub\"; \"sup\";\n \"mark\"; \"del\"; \"ins\"; \"q\"; \"cite\"; \"dfn\"; \"abbr\"; \"code\"; \"var\"; \"samp\";\n \"kbd\"; \"data\"; \"time\"; \"ruby\"; \"rt\"; \"rp\"; \"bdi\"; \"bdo\"; \"wbr\"; \"br\";\n \"table\"; \"thead\"; \"tbody\"; \"tfoot\"; \"tr\"; \"th\"; \"td\"; \"caption\"; \"colgroup\"; \"col\";\n \"form\"; \"input\"; \"textarea\"; \"select\"; \"option\"; \"optgroup\"; \"button\"; \"label\";\n \"fieldset\"; \"legend\"; \"datalist\"; \"output\"; \"progress\"; \"meter\";\n \"details\"; \"summary\"; \"dialog\";\n \"img\"; \"video\"; \"audio\"; \"source\"; \"picture\"; \"canvas\"; \"iframe\"; \"embed\"; \"object\"; \"param\";\n \"svg\"; \"path\"; \"circle\"; \"rect\"; \"line\"; \"polyline\"; \"polygon\"; \"ellipse\";\n \"g\"; \"defs\"; \"use\"; \"text\"; \"tspan\"; \"clipPath\"; \"mask\"; \"pattern\";\n \"linearGradient\"; \"radialGradient\"; \"stop\"; \"filter\"; \"feBlend\"; \"feFlood\";\n \"feGaussianBlur\"; \"feOffset\"; \"feMerge\"; \"feMergeNode\"; \"feComposite\";\n \"template\"; \"slot\";\n]\n\nlet void_elements = [\n \"area\"; \"base\"; \"br\"; \"col\"; \"embed\"; \"hr\"; \"img\"; \"input\";\n \"link\"; \"meta\"; \"param\"; \"source\"; \"track\"; \"wbr\"\n]\n\nlet boolean_attrs = [\n \"async\"; \"autofocus\"; \"autoplay\"; \"checked\"; \"controls\"; \"default\";\n \"defer\"; \"disabled\"; \"formnovalidate\"; \"hidden\"; \"inert\"; \"ismap\";\n \"loop\"; \"multiple\"; \"muted\"; \"nomodule\"; \"novalidate\"; \"open\";\n \"playsinline\"; \"readonly\"; \"required\"; \"reversed\"; \"selected\"\n]\n\nlet is_html_tag name = List.mem name html_tags\nlet is_void name = List.mem name void_elements\nlet is_boolean_attr name = List.mem name boolean_attrs\n\n\n(* ====================================================================== *)\n(* HTML escaping *)\n(* ====================================================================== *)\n\nlet escape_html s =\n let buf = Buffer.create (String.length s) in\n String.iter (function\n | '&' -> Buffer.add_string buf \"&\"\n | '<' -> Buffer.add_string buf \"<\"\n | '>' -> Buffer.add_string buf \">\"\n | '\"' -> Buffer.add_string buf \""\"\n | c -> Buffer.add_char buf c) s;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* Attribute rendering *)\n(* ====================================================================== *)\n\nlet render_attrs attrs =\n let buf = Buffer.create 64 in\n Hashtbl.iter (fun k v ->\n if is_boolean_attr k then begin\n if sx_truthy v then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k\n end\n end else if not (is_nil v) then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k;\n Buffer.add_string buf \"=\\\"\";\n Buffer.add_string buf (escape_html (value_to_string v));\n Buffer.add_char buf '\"'\n end) attrs;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* HTML renderer *)\n(* ====================================================================== *)\n\n(* Forward ref — resolved at setup time *)\nlet render_to_html_ref : (value -> env -> string) ref =\n ref (fun _expr _env -> \"\")\n\nlet render_to_html expr env = !render_to_html_ref expr env\n\nlet render_children children env =\n String.concat \"\" (List.map (fun c -> render_to_html c env) children)\n\n(** Parse keyword attrs and positional children from an element call's args.\n Attrs are evaluated; children are returned UNEVALUATED for render dispatch. *)\nlet parse_element_args args env =\n let attrs = Hashtbl.create 8 in\n let children = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace attrs k v;\n skip := true\n | Spread pairs ->\n List.iter (fun (k, v) -> Hashtbl.replace attrs k v) pairs\n | _ ->\n children := arg :: !children\n ) args;\n (attrs, List.rev !children)\n\nlet render_html_element tag args env =\n let (attrs, children) = parse_element_args args env in\n let attr_str = render_attrs attrs in\n if is_void tag then\n \"<\" ^ tag ^ attr_str ^ \" />\"\n else\n let content = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n \"<\" ^ tag ^ attr_str ^ \">\" ^ content ^ \"\" ^ tag ^ \">\"\n\nlet render_component comp args env =\n match comp with\n | Component c ->\n let kwargs = Hashtbl.create 8 in\n let children_exprs = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace kwargs k v;\n skip := true\n | _ ->\n children_exprs := arg :: !children_exprs\n ) args;\n let children = List.rev !children_exprs in\n let local = env_merge c.c_closure env in\n List.iter (fun p ->\n let v = match Hashtbl.find_opt kwargs p with Some v -> v | None -> Nil in\n ignore (env_bind local p v)\n ) c.c_params;\n if c.c_has_children then begin\n let rendered_children = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n ignore (env_bind local \"children\" (RawHTML rendered_children))\n end;\n render_to_html c.c_body local\n | _ -> \"\"\n\nlet expand_macro (m : macro) args _env =\n let local = env_extend m.m_closure in\n let params = m.m_params in\n let rec bind_params ps as' =\n match ps, as' with\n | [], rest ->\n (match m.m_rest_param with\n | Some rp -> ignore (env_bind local rp (List rest))\n | None -> ())\n | p :: ps_rest, a :: as_rest ->\n ignore (env_bind local p a);\n bind_params ps_rest as_rest\n | _ :: _, [] ->\n List.iter (fun p -> ignore (env_bind local p Nil)) (List.rev ps)\n in\n bind_params params args;\n Sx_ref.eval_expr m.m_body (Env local)\n\nlet rec do_render_to_html (expr : value) (env : env) : string =\n match expr with\n | Nil -> \"\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s -> escape_html s\n | Keyword k -> escape_html k\n | RawHTML s -> s\n | Symbol s ->\n let v = Sx_ref.eval_expr (Symbol s) (Env env) in\n do_render_to_html v env\n | List [] | ListRef { contents = [] } -> \"\"\n | List (head :: args) | ListRef { contents = head :: args } ->\n render_list_to_html head args env\n | _ ->\n let v = Sx_ref.eval_expr expr (Env env) in\n do_render_to_html v env\n\nand render_list_to_html head args env =\n match head with\n | Symbol \"<>\" ->\n render_children args env\n | Symbol \"raw!\" ->\n (* Inject pre-rendered HTML without escaping *)\n let v = Sx_ref.eval_expr (List.hd args) (Env env) in\n (match v with\n | String s | RawHTML s -> s\n | _ -> value_to_string v)\n | Symbol tag when is_html_tag tag ->\n render_html_element tag args env\n | Symbol \"if\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n (if List.length args > 1 then do_render_to_html (List.nth args 1) env else \"\")\n else\n (if List.length args > 2 then do_render_to_html (List.nth args 2) env else \"\")\n | Symbol \"when\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n String.concat \"\" (List.map (fun e -> do_render_to_html e env) (List.tl args))\n else \"\"\n | Symbol \"cond\" ->\n render_cond args env\n | Symbol \"case\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol (\"let\" | \"let*\") ->\n render_let args env\n | Symbol (\"begin\" | \"do\") ->\n let rec go = function\n | [] -> \"\"\n | [last] -> do_render_to_html last env\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env env));\n go rest\n in go args\n | Symbol (\"define\" | \"defcomp\" | \"defmacro\" | \"defisland\") ->\n ignore (Sx_ref.eval_expr (List (head :: args)) (Env env));\n \"\"\n | Symbol \"map\" ->\n render_map args env false\n | Symbol \"map-indexed\" ->\n render_map args env true\n | Symbol \"filter\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol \"for-each\" ->\n render_for_each args env\n | Symbol name ->\n (try\n let v = env_get env name in\n (match v with\n | Component c when c.c_affinity = \"client\" -> \"\" (* skip client-only *)\n | Component _ -> render_component v args env\n | Island _i ->\n (* Islands: SSR via the SX render-to-html from adapter-html.sx.\n It handles deref/signal/computed through the CEK correctly,\n and renders island bodies with hydration markers. *)\n (try\n let call_expr = List (Symbol name :: args) in\n let quoted = List [Symbol \"quote\"; call_expr] in\n let render_call = List [Symbol \"render-to-html\"; quoted; Env env] in\n let result = Sx_ref.eval_expr render_call (Env env) in\n (match result with\n | String s | RawHTML s -> s\n | _ -> value_to_string result)\n with e ->\n Printf.eprintf \"[ssr-island] ~%s FAILED: %s\\n%s\\n%!\" _i.i_name (Printexc.to_string e) (Printexc.get_backtrace ());\n \"\")\n | Macro m ->\n let expanded = expand_macro m args env in\n do_render_to_html expanded env\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n with Eval_error _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env\n\nand render_cond args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let is_scheme = List.for_all (fun a -> match as_list a with\n | Some items when List.length items = 2 -> true\n | _ -> false) args\n in\n if is_scheme then begin\n let rec go = function\n | [] -> \"\"\n | clause :: rest ->\n (match as_list clause with\n | Some [test; body] ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n | _ -> \"\")\n in go args\n end else begin\n let rec go = function\n | [] -> \"\"\n | [_] -> \"\"\n | test :: body :: rest ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n in go args\n end\n\nand render_let args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let bindings_expr = List.hd args in\n let body = List.tl args in\n let local = env_extend env in\n let bindings = match as_list bindings_expr with Some l -> l | None -> [] in\n let is_scheme = match bindings with\n | (List _ :: _) | (ListRef _ :: _) -> true\n | _ -> false\n in\n if is_scheme then\n List.iter (fun b ->\n match as_list b with\n | Some [Symbol name; expr] | Some [String name; expr] ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v)\n | _ -> ()\n ) bindings\n else begin\n let rec go = function\n | [] -> ()\n | (Symbol name) :: expr :: rest | (String name) :: expr :: rest ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v);\n go rest\n | _ -> ()\n in go bindings\n end;\n let rec render_body = function\n | [] -> \"\"\n | [last] -> do_render_to_html last local\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env local));\n render_body rest\n in render_body body\n\nand render_map args env indexed =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.mapi (fun i item ->\n let call_args = if indexed then [Number (float_of_int i); item] else [item] in\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params call_args;\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val call_args in\n do_render_to_html result env\n ) items)\n\nand render_for_each args env =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.map (fun item ->\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params [item];\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val [item] in\n do_render_to_html result env\n ) items)\n\n\n(* ====================================================================== *)\n(* Setup — bind render primitives in an env and wire up the ref *)\n(* ====================================================================== *)\n\nlet setup_render_env env =\n render_to_html_ref := do_render_to_html;\n\n let bind name fn =\n ignore (env_bind env name (NativeFn (name, fn)))\n in\n\n bind \"render-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\");\n\n bind \"render-to-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-2dae9b2f.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-2dae9b2f.wasm
new file mode 100644
index 00000000..1668c5f6
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-2dae9b2f.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-2dae9b2f.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-2dae9b2f.wasm.map
new file mode 100644
index 00000000..1fdfcda8
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-2dae9b2f.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":67944},"map":{"version":3,"sources":["/workspace_root/lib/sx_types.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Core types for the SX language.\n\n The [value] sum type represents every possible SX runtime value.\n OCaml's algebraic types make the CEK machine's frame dispatch a\n pattern match — exactly what the spec describes. *)\n\n(** {1 Environment} *)\n\n(** Lexical scope chain. Each frame holds a mutable binding table and\n an optional parent link for scope-chain lookup. *)\ntype env = {\n bindings : (string, value) Hashtbl.t;\n parent : env option;\n}\n\n(** {1 Values} *)\n\nand value =\n | Nil\n | Bool of bool\n | Number of float\n | String of string\n | Symbol of string\n | Keyword of string\n | List of value list\n | Dict of dict\n | Lambda of lambda\n | Component of component\n | Island of island\n | Macro of macro\n | Thunk of value * env\n | Continuation of (value -> value) * dict option\n | NativeFn of string * (value list -> value)\n | Signal of signal\n | RawHTML of string\n | Spread of (string * value) list\n | SxExpr of string (** Opaque SX wire-format string — aser output. *)\n | Env of env (** First-class environment — used by CEK machine state dicts. *)\n | ListRef of value list ref (** Mutable list — JS-style array for append! *)\n | CekState of cek_state (** Optimized CEK machine state — avoids Dict allocation. *)\n | CekFrame of cek_frame (** Optimized CEK continuation frame. *)\n | VmClosure of vm_closure (** VM-compiled closure — callable within the VM without allocating a new VM. *)\n\n(** CEK machine state — record instead of Dict for performance.\n 5 fields × 55K steps/sec = 275K Hashtbl allocations/sec eliminated. *)\nand cek_state = {\n cs_control : value;\n cs_env : value;\n cs_kont : value;\n cs_phase : string;\n cs_value : value;\n}\n\n(** CEK continuation frame — tagged record covering all 29 frame types.\n Fields are named generically; not all are used by every frame type.\n Eliminates ~100K Hashtbl allocations per page render. *)\nand cek_frame = {\n cf_type : string; (* frame type tag: \"if\", \"let\", \"call\", etc. *)\n cf_env : value; (* environment — every frame has this *)\n cf_name : value; (* let/define/set/scope: binding name *)\n cf_body : value; (* when/let: body expr *)\n cf_remaining : value; (* begin/cond/map/etc: remaining exprs *)\n cf_f : value; (* call/map/filter/etc: function *)\n cf_args : value; (* call: raw args; arg: evaled args *)\n cf_results : value; (* map/filter/dict: accumulated results *)\n cf_extra : value; (* extra field: scheme, indexed, value, phase, etc. *)\n cf_extra2 : value; (* second extra: emitted, etc. *)\n}\n\n(** Mutable string-keyed table (SX dicts support [dict-set!]). *)\nand dict = (string, value) Hashtbl.t\n\nand lambda = {\n l_params : string list;\n l_body : value;\n l_closure : env;\n mutable l_name : string option;\n mutable l_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand component = {\n c_name : string;\n c_params : string list;\n c_has_children : bool;\n c_body : value;\n c_closure : env;\n c_affinity : string; (** \"auto\" | \"client\" | \"server\" *)\n mutable c_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand island = {\n i_name : string;\n i_params : string list;\n i_has_children : bool;\n i_body : value;\n i_closure : env;\n}\n\nand macro = {\n m_params : string list;\n m_rest_param : string option;\n m_body : value;\n m_closure : env;\n m_name : string option;\n}\n\nand signal = {\n mutable s_value : value;\n mutable s_subscribers : (unit -> unit) list;\n mutable s_deps : signal list;\n}\n\n(** {1 Bytecode VM types}\n\n Defined here (not in sx_vm.ml) because [vm_code.constants] references\n [value] and [lambda.l_compiled] references [vm_closure] — mutual\n recursion requires all types in one [and] chain. *)\n\n(** Compiled function body — bytecode + constant pool. *)\nand vm_code = {\n vc_arity : int;\n vc_locals : int;\n vc_bytecode : int array;\n vc_constants : value array;\n}\n\n(** Upvalue cell — shared mutable reference to a captured variable. *)\nand vm_upvalue_cell = {\n mutable uv_value : value;\n}\n\n(** Closure — compiled code + captured upvalues + live env reference. *)\nand vm_closure = {\n vm_code : vm_code;\n vm_upvalues : vm_upvalue_cell array;\n vm_name : string option;\n vm_env_ref : (string, value) Hashtbl.t;\n vm_closure_env : env option; (** Original closure env for inner functions *)\n}\n\n\n(** {1 Forward ref for calling VM closures from outside the VM} *)\n\nlet _vm_call_closure_ref : (vm_closure -> value list -> value) ref =\n ref (fun _ _ -> raise (Failure \"VM call_closure not initialized\"))\n\n\n(** {1 Errors} *)\n\nexception Eval_error of string\nexception Parse_error of string\n\n\n(** {1 Environment operations} *)\n\nlet make_env () =\n { bindings = Hashtbl.create 16; parent = None }\n\nlet env_extend parent =\n { bindings = Hashtbl.create 16; parent = Some parent }\n\nlet env_bind env name v =\n Hashtbl.replace env.bindings name v; Nil\n\nlet rec env_has env name =\n Hashtbl.mem env.bindings name ||\n match env.parent with Some p -> env_has p name | None -> false\n\nlet rec env_get env name =\n match Hashtbl.find_opt env.bindings name with\n | Some v -> v\n | None ->\n match env.parent with\n | Some p -> env_get p name\n | None -> raise (Eval_error (\"Undefined symbol: \" ^ name))\n\nlet rec env_set env name v =\n if Hashtbl.mem env.bindings name then\n (Hashtbl.replace env.bindings name v; Nil)\n else\n match env.parent with\n | Some p -> env_set p name v\n | None -> Hashtbl.replace env.bindings name v; Nil\n\nlet env_merge base overlay =\n (* If base and overlay are the same env (physical equality) or overlay\n is a descendant of base, just extend base — no copying needed.\n This prevents set! inside lambdas from modifying shadow copies. *)\n if base == overlay then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n (* Check if overlay is a descendant of base *)\n let rec is_descendant e depth =\n if depth > 100 then false\n else if e == base then true\n else match e.parent with Some p -> is_descendant p (depth + 1) | None -> false\n in\n if is_descendant overlay 0 then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n (* General case: extend base, copy ONLY overlay bindings that don't\n exist anywhere in the base chain (avoids shadowing closure bindings). *)\n let e = { bindings = Hashtbl.create 16; parent = Some base } in\n Hashtbl.iter (fun k v ->\n if not (env_has base k) then Hashtbl.replace e.bindings k v\n ) overlay.bindings;\n e\n end\n end\n\n\n(** {1 Value extraction helpers} *)\n\nlet value_to_string = function\n | String s -> s | Symbol s -> s | Keyword k -> k\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Bool true -> \"true\" | Bool false -> \"false\"\n | Nil -> \"\" | _ -> \"\"\n\nlet value_to_string_list = function\n | List items | ListRef { contents = items } -> List.map value_to_string items\n | _ -> []\n\nlet value_to_bool = function\n | Bool b -> b | Nil -> false | _ -> true\n\nlet value_to_string_opt = function\n | String s -> Some s | Symbol s -> Some s | Nil -> None | _ -> None\n\n\n(** {1 Constructors — accept [value] args from transpiled code} *)\n\nlet unwrap_env_val = function\n | Env e -> e\n | _ -> raise (Eval_error \"make_lambda: expected env for closure\")\n\nlet make_lambda params body closure =\n let ps = match params with\n | List items -> List.map value_to_string items\n | _ -> value_to_string_list params\n in\n Lambda { l_params = ps; l_body = body; l_closure = unwrap_env_val closure; l_name = None; l_compiled = None }\n\nlet make_component name params has_children body closure affinity =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n let aff = match affinity with String s -> s | _ -> \"auto\" in\n Component {\n c_name = n; c_params = ps; c_has_children = hc;\n c_body = body; c_closure = unwrap_env_val closure; c_affinity = aff;\n c_compiled = None;\n }\n\nlet make_island name params has_children body closure =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n Island {\n i_name = n; i_params = ps; i_has_children = hc;\n i_body = body; i_closure = unwrap_env_val closure;\n }\n\nlet make_macro params rest_param body closure name =\n let ps = value_to_string_list params in\n let rp = value_to_string_opt rest_param in\n let n = value_to_string_opt name in\n Macro {\n m_params = ps; m_rest_param = rp;\n m_body = body; m_closure = unwrap_env_val closure; m_name = n;\n }\n\nlet make_thunk expr env = Thunk (expr, unwrap_env_val env)\n\nlet make_symbol name = Symbol (value_to_string name)\nlet make_keyword name = Keyword (value_to_string name)\n\n\n(** {1 Type inspection} *)\n\nlet type_of = function\n | Nil -> \"nil\"\n | Bool _ -> \"boolean\"\n | Number _ -> \"number\"\n | String _ -> \"string\"\n | Symbol _ -> \"symbol\"\n | Keyword _ -> \"keyword\"\n | List _ | ListRef _ -> \"list\"\n | Dict _ -> \"dict\"\n | Lambda _ -> \"lambda\"\n | Component _ -> \"component\"\n | Island _ -> \"island\"\n | Macro _ -> \"macro\"\n | Thunk _ -> \"thunk\"\n | Continuation (_, _) -> \"continuation\"\n | NativeFn _ -> \"function\"\n | Signal _ -> \"signal\"\n | RawHTML _ -> \"raw-html\"\n | Spread _ -> \"spread\"\n | SxExpr _ -> \"sx-expr\"\n | Env _ -> \"env\"\n | CekState _ -> \"dict\" (* CEK state behaves as a dict for type checks *)\n | CekFrame _ -> \"dict\"\n | VmClosure _ -> \"function\"\n\nlet is_nil = function Nil -> true | _ -> false\nlet is_lambda = function Lambda _ -> true | _ -> false\nlet is_component = function Component _ -> true | _ -> false\nlet is_island = function Island _ -> true | _ -> false\nlet is_macro = function Macro _ -> true | _ -> false\nlet is_thunk = function Thunk _ -> true | _ -> false\nlet is_signal = function\n | Signal _ -> true\n | Dict d -> Hashtbl.mem d \"__signal\"\n | _ -> false\n\nlet is_callable = function\n | Lambda _ | NativeFn _ | Continuation (_, _) | VmClosure _ -> true\n | _ -> false\n\n\n(** {1 Truthiness} *)\n\n(** SX truthiness: everything is truthy except [Nil] and [Bool false]. *)\nlet sx_truthy = function\n | Nil | Bool false -> false\n | _ -> true\n\n\n(** {1 Accessors} *)\n\nlet symbol_name = function\n | Symbol s -> String s\n | v -> raise (Eval_error (\"Expected symbol, got \" ^ type_of v))\n\nlet keyword_name = function\n | Keyword k -> String k\n | v -> raise (Eval_error (\"Expected keyword, got \" ^ type_of v))\n\nlet lambda_params = function\n | Lambda l -> List (List.map (fun s -> String s) l.l_params)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_body = function\n | Lambda l -> l.l_body\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_closure = function\n | Lambda l -> Env l.l_closure\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_name = function\n | Lambda l -> (match l.l_name with Some n -> String n | None -> Nil)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet set_lambda_name l n = match l with\n | Lambda l -> l.l_name <- Some n; Nil\n | _ -> raise (Eval_error \"set-lambda-name!: not a lambda\")\n\nlet component_name = function\n | Component c -> String c.c_name\n | Island i -> String i.i_name\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_params = function\n | Component c -> List (List.map (fun s -> String s) c.c_params)\n | Island i -> List (List.map (fun s -> String s) i.i_params)\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_body = function\n | Component c -> c.c_body\n | Island i -> i.i_body\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_closure = function\n | Component c -> Env c.c_closure\n | Island i -> Env i.i_closure\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_has_children = function\n | Component c -> Bool c.c_has_children\n | Island i -> Bool i.i_has_children\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_affinity = function\n | Component c -> String c.c_affinity\n | Island _ -> String \"client\"\n | _ -> String \"auto\"\n\nlet macro_params = function\n | Macro m -> List (List.map (fun s -> String s) m.m_params)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_rest_param = function\n | Macro m -> (match m.m_rest_param with Some s -> String s | None -> Nil)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_body = function\n | Macro m -> m.m_body\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_closure = function\n | Macro m -> Env m.m_closure\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet thunk_expr = function\n | Thunk (e, _) -> e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\nlet thunk_env = function\n | Thunk (_, e) -> Env e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\n\n(** {1 Dict operations} *)\n\nlet make_dict () : dict = Hashtbl.create 8\n\nlet dict_get (d : dict) key =\n match Hashtbl.find_opt d key with Some v -> v | None -> Nil\n\nlet dict_has (d : dict) key = Hashtbl.mem d key\n\nlet dict_set (d : dict) key v = Hashtbl.replace d key v\n\nlet dict_delete (d : dict) key = Hashtbl.remove d key\n\nlet dict_keys (d : dict) =\n Hashtbl.fold (fun k _ acc -> String k :: acc) d []\n\nlet dict_vals (d : dict) =\n Hashtbl.fold (fun _ v acc -> v :: acc) d []\n\n\n(** {1 Value display} *)\n\nlet rec inspect = function\n | Nil -> \"nil\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then Printf.sprintf \"%d\" (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s ->\n let buf = Buffer.create (String.length s + 2) in\n Buffer.add_char buf '\"';\n String.iter (function\n | '\"' -> Buffer.add_string buf \"\\\\\\\"\"\n | '\\\\' -> Buffer.add_string buf \"\\\\\\\\\"\n | '\\n' -> Buffer.add_string buf \"\\\\n\"\n | '\\r' -> Buffer.add_string buf \"\\\\r\"\n | '\\t' -> Buffer.add_string buf \"\\\\t\"\n | c -> Buffer.add_char buf c) s;\n Buffer.add_char buf '\"';\n Buffer.contents buf\n | Symbol s -> s\n | Keyword k -> \":\" ^ k\n | List items | ListRef { contents = items } ->\n \"(\" ^ String.concat \" \" (List.map inspect items) ^ \")\"\n | Dict d ->\n let pairs = Hashtbl.fold (fun k v acc ->\n (Printf.sprintf \":%s %s\" k (inspect v)) :: acc) d [] in\n \"{\" ^ String.concat \" \" pairs ^ \"}\"\n | Lambda l ->\n let tag = match l.l_name with Some n -> n | None -> \"lambda\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" l.l_params)\n | Component c ->\n Printf.sprintf \"\" c.c_name (String.concat \", \" c.c_params)\n | Island i ->\n Printf.sprintf \"\" i.i_name (String.concat \", \" i.i_params)\n | Macro m ->\n let tag = match m.m_name with Some n -> n | None -> \"macro\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" m.m_params)\n | Thunk _ -> \"\"\n | Continuation (_, _) -> \"\"\n | NativeFn (name, _) -> Printf.sprintf \"\" name\n | Signal _ -> \"\"\n | RawHTML s -> Printf.sprintf \"\" (String.length s)\n | Spread _ -> \"\"\n | SxExpr s -> Printf.sprintf \"\" (String.length s)\n | Env _ -> \"\"\n | CekState _ -> \"\"\n | CekFrame f -> Printf.sprintf \"\" f.cf_type\n | VmClosure cl -> Printf.sprintf \"\" (match cl.vm_name with Some n -> n | None -> \"anon\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":75497},"map":{"version":3,"sources":["/workspace_root/lib/sx_primitives.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Built-in primitive functions (~80 pure functions).\n\n Registered in a global table; the evaluator checks this table\n when a symbol isn't found in the lexical environment. *)\n\nopen Sx_types\n\nlet primitives : (string, value list -> value) Hashtbl.t = Hashtbl.create 128\n\n(** Forward refs for calling SX functions from primitives (breaks cycle). *)\nlet _sx_call_fn : (value -> value list -> value) ref =\n ref (fun _ _ -> raise (Eval_error \"sx_call not initialized\"))\nlet _sx_trampoline_fn : (value -> value) ref =\n ref (fun v -> v)\n\nlet register name fn = Hashtbl.replace primitives name fn\n\nlet is_primitive name = Hashtbl.mem primitives name\n\nlet get_primitive name =\n match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(* --- Helpers --- *)\n\nlet as_number = function\n | Number n -> n\n | Bool true -> 1.0\n | Bool false -> 0.0\n | Nil -> 0.0\n | String s -> (match float_of_string_opt s with Some n -> n | None -> Float.nan)\n | v -> raise (Eval_error (\"Expected number, got \" ^ type_of v ^ \": \" ^ (match v with Dict d -> (match Hashtbl.find_opt d \"__signal\" with Some _ -> \"signal{value=\" ^ (match Hashtbl.find_opt d \"value\" with Some v' -> value_to_string v' | None -> \"?\") ^ \"}\" | None -> \"dict\") | _ -> \"\")))\n\nlet as_string = function\n | String s -> s\n | v -> raise (Eval_error (\"Expected string, got \" ^ type_of v))\n\nlet rec as_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | Thunk _ as t -> as_list (!_sx_trampoline_fn t)\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\nlet as_bool = function\n | Bool b -> b\n | v -> sx_truthy v\n\nlet to_string = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | v -> inspect v\n\nlet () =\n (* === Arithmetic === *)\n register \"+\" (fun args ->\n Number (List.fold_left (fun acc a -> acc +. as_number a) 0.0 args));\n register \"-\" (fun args ->\n match args with\n | [] -> Number 0.0\n | [a] -> Number (-. (as_number a))\n | a :: rest -> Number (List.fold_left (fun acc x -> acc -. as_number x) (as_number a) rest));\n register \"*\" (fun args ->\n Number (List.fold_left (fun acc a -> acc *. as_number a) 1.0 args));\n register \"/\" (fun args ->\n match args with\n | [a; b] -> Number (as_number a /. as_number b)\n | _ -> raise (Eval_error \"/: expected 2 args\"));\n register \"mod\" (fun args ->\n match args with\n | [a; b] -> Number (Float.rem (as_number a) (as_number b))\n | _ -> raise (Eval_error \"mod: expected 2 args\"));\n register \"inc\" (fun args ->\n match args with [a] -> Number (as_number a +. 1.0) | _ -> raise (Eval_error \"inc: 1 arg\"));\n register \"dec\" (fun args ->\n match args with [a] -> Number (as_number a -. 1.0) | _ -> raise (Eval_error \"dec: 1 arg\"));\n register \"abs\" (fun args ->\n match args with [a] -> Number (Float.abs (as_number a)) | _ -> raise (Eval_error \"abs: 1 arg\"));\n register \"floor\" (fun args ->\n match args with [a] -> Number (floor (as_number a))\n | _ -> raise (Eval_error \"floor: 1 arg\"));\n register \"ceil\" (fun args ->\n match args with [a] -> Number (ceil (as_number a))\n | _ -> raise (Eval_error \"ceil: 1 arg\"));\n register \"round\" (fun args ->\n match args with\n | [a] -> Number (Float.round (as_number a))\n | [a; b] ->\n let n = as_number a and places = int_of_float (as_number b) in\n let factor = 10.0 ** float_of_int places in\n Number (Float.round (n *. factor) /. factor)\n | _ -> raise (Eval_error \"round: 1-2 args\"));\n register \"min\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"min: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.min acc (as_number a)) Float.infinity args));\n register \"max\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"max: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.max acc (as_number a)) Float.neg_infinity args));\n register \"sqrt\" (fun args ->\n match args with [a] -> Number (Float.sqrt (as_number a)) | _ -> raise (Eval_error \"sqrt: 1 arg\"));\n register \"pow\" (fun args ->\n match args with [a; b] -> Number (as_number a ** as_number b)\n | _ -> raise (Eval_error \"pow: 2 args\"));\n register \"clamp\" (fun args ->\n match args with\n | [x; lo; hi] ->\n let x = as_number x and lo = as_number lo and hi = as_number hi in\n Number (Float.max lo (Float.min hi x))\n | _ -> raise (Eval_error \"clamp: 3 args\"));\n register \"parse-int\" (fun args ->\n match args with\n | [String s] -> (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> Nil)\n | [String s; default_val] ->\n (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> default_val)\n | [Number n] | [Number n; _] -> Number (float_of_int (int_of_float n))\n | [_; default_val] -> default_val\n | _ -> Nil);\n register \"parse-float\" (fun args ->\n match args with\n | [String s] -> (match float_of_string_opt s with Some n -> Number n | None -> Nil)\n | [Number n] -> Number n\n | _ -> Nil);\n\n (* === Comparison === *)\n (* Normalize ListRef to List for structural equality *)\n let rec normalize_for_eq = function\n | ListRef { contents = items } -> List (List.map normalize_for_eq items)\n | List items -> List (List.map normalize_for_eq items)\n | v -> v\n in\n register \"=\" (fun args ->\n match args with\n | [a; b] -> Bool (normalize_for_eq a = normalize_for_eq b)\n | _ -> raise (Eval_error \"=: 2 args\"));\n register \"!=\" (fun args ->\n match args with\n | [a; b] -> Bool (normalize_for_eq a <> normalize_for_eq b)\n | _ -> raise (Eval_error \"!=: 2 args\"));\n register \"<\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a < b)\n | [a; b] -> Bool (as_number a < as_number b)\n | _ -> raise (Eval_error \"<: 2 args\"));\n register \">\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a > b)\n | [a; b] -> Bool (as_number a > as_number b)\n | _ -> raise (Eval_error \">: 2 args\"));\n register \"<=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a <= b)\n | [a; b] -> Bool (as_number a <= as_number b)\n | _ -> raise (Eval_error \"<=: 2 args\"));\n register \">=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a >= b)\n | [a; b] -> Bool (as_number a >= as_number b)\n | _ -> raise (Eval_error \">=: 2 args\"));\n\n (* === Logic === *)\n register \"not\" (fun args ->\n match args with [a] -> Bool (not (sx_truthy a)) | _ -> raise (Eval_error \"not: 1 arg\"));\n\n (* === Predicates === *)\n register \"nil?\" (fun args ->\n match args with [a] -> Bool (is_nil a) | _ -> raise (Eval_error \"nil?: 1 arg\"));\n register \"number?\" (fun args ->\n match args with [Number _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"number?: 1 arg\"));\n register \"string?\" (fun args ->\n match args with [String _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"string?: 1 arg\"));\n register \"boolean?\" (fun args ->\n match args with [Bool _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"boolean?: 1 arg\"));\n register \"list?\" (fun args ->\n match args with [List _] | [ListRef _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"list?: 1 arg\"));\n register \"dict?\" (fun args ->\n match args with [Dict _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"dict?: 1 arg\"));\n register \"symbol?\" (fun args ->\n match args with [Symbol _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"symbol?: 1 arg\"));\n register \"keyword?\" (fun args ->\n match args with [Keyword _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"keyword?: 1 arg\"));\n register \"empty?\" (fun args ->\n match args with\n | [List []] | [ListRef { contents = [] }] -> Bool true\n | [List _] | [ListRef _] -> Bool false\n | [String \"\"] -> Bool true | [String _] -> Bool false\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | [Nil] -> Bool true\n | [_] -> Bool false\n | _ -> raise (Eval_error \"empty?: 1 arg\"));\n register \"odd?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 <> 0) | _ -> raise (Eval_error \"odd?: 1 arg\"));\n register \"even?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 = 0) | _ -> raise (Eval_error \"even?: 1 arg\"));\n register \"zero?\" (fun args ->\n match args with [a] -> Bool (as_number a = 0.0) | _ -> raise (Eval_error \"zero?: 1 arg\"));\n\n (* === Strings === *)\n register \"str\" (fun args -> String (String.concat \"\" (List.map to_string args)));\n register \"upper\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upper: 1 arg\"));\n register \"upcase\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upcase: 1 arg\"));\n register \"lower\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"lower: 1 arg\"));\n register \"downcase\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"downcase: 1 arg\"));\n register \"trim\" (fun args ->\n match args with [a] -> String (String.trim (as_string a)) | _ -> raise (Eval_error \"trim: 1 arg\"));\n register \"string-length\" (fun args ->\n match args with [a] -> Number (float_of_int (String.length (as_string a)))\n | _ -> raise (Eval_error \"string-length: 1 arg\"));\n register \"string-contains?\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let rec find i =\n if i + String.length needle > String.length haystack then false\n else if String.sub haystack i (String.length needle) = needle then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"string-contains?: 2 string args\"));\n register \"starts-with?\" (fun args ->\n match args with\n | [String s; String prefix] ->\n Bool (String.length s >= String.length prefix &&\n String.sub s 0 (String.length prefix) = prefix)\n | _ -> raise (Eval_error \"starts-with?: 2 string args\"));\n register \"ends-with?\" (fun args ->\n match args with\n | [String s; String suffix] ->\n let sl = String.length s and xl = String.length suffix in\n Bool (sl >= xl && String.sub s (sl - xl) xl = suffix)\n | _ -> raise (Eval_error \"ends-with?: 2 string args\"));\n register \"index-of\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let nl = String.length needle and hl = String.length haystack in\n let rec find i =\n if i + nl > hl then Number (-1.0)\n else if String.sub haystack i nl = needle then Number (float_of_int i)\n else find (i + 1)\n in find 0\n | _ -> raise (Eval_error \"index-of: 2 string args\"));\n register \"substring\" (fun args ->\n match args with\n | [String s; Number start; Number end_] ->\n let i = int_of_float start and j = int_of_float end_ in\n let len = String.length s in\n let i = max 0 (min i len) and j = max 0 (min j len) in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"substring: 3 args\"));\n register \"substr\" (fun args ->\n match args with\n | [String s; Number start; Number len] ->\n let i = int_of_float start and n = int_of_float len in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n let n = max 0 (min n (sl - i)) in\n String (String.sub s i n)\n | [String s; Number start] ->\n let i = int_of_float start in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n String (String.sub s i (sl - i))\n | _ -> raise (Eval_error \"substr: 2-3 args\"));\n register \"split\" (fun args ->\n match args with\n | [String s; String sep] ->\n List (List.map (fun p -> String p) (String.split_on_char sep.[0] s))\n | _ -> raise (Eval_error \"split: 2 args\"));\n register \"join\" (fun args ->\n match args with\n | [String sep; (List items | ListRef { contents = items })] ->\n String (String.concat sep (List.map to_string items))\n | _ -> raise (Eval_error \"join: 2 args\"));\n register \"replace\" (fun args ->\n let to_str = function\n | String s -> s | SxExpr s -> s | RawHTML s -> s\n | Keyword k -> k | Symbol s -> s\n | Nil -> \"\" | Bool true -> \"true\" | Bool false -> \"false\"\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Thunk _ as t -> (match !_sx_trampoline_fn t with String s -> s | v -> to_string v)\n | v -> to_string v\n in\n match args with\n | [s; old_s; new_s] ->\n let s = to_str s and old_s = to_str old_s and new_s = to_str new_s in\n let ol = String.length old_s in\n if ol = 0 then String s\n else begin\n let buf = Buffer.create (String.length s) in\n let rec go i =\n if i >= String.length s then ()\n else if i + ol <= String.length s && String.sub s i ol = old_s then begin\n Buffer.add_string buf new_s;\n go (i + ol)\n end else begin\n Buffer.add_char buf s.[i];\n go (i + 1)\n end\n in go 0;\n String (Buffer.contents buf)\n end\n | _ -> raise (Eval_error \"replace: 3 string args\"));\n register \"char-from-code\" (fun args ->\n match args with\n | [Number n] ->\n let buf = Buffer.create 4 in\n Buffer.add_utf_8_uchar buf (Uchar.of_int (int_of_float n));\n String (Buffer.contents buf)\n | _ -> raise (Eval_error \"char-from-code: 1 arg\"));\n\n (* === Collections === *)\n register \"list\" (fun args -> ListRef (ref args));\n register \"len\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> Number (float_of_int (List.length l))\n | [String s] -> Number (float_of_int (String.length s))\n | [Dict d] -> Number (float_of_int (Hashtbl.length d))\n | [Nil] | [Bool false] -> Number 0.0\n | [Bool true] -> Number 1.0\n | [Number _] -> Number 1.0\n | [RawHTML s] -> Number (float_of_int (String.length s))\n | [SxExpr s] -> Number (float_of_int (String.length s))\n | [Spread pairs] -> Number (float_of_int (List.length pairs))\n | [Component _] | [Island _] | [Lambda _] | [NativeFn _]\n | [Macro _] | [Thunk _] | [Keyword _] | [Symbol _] -> Number 0.0\n | _ -> raise (Eval_error (Printf.sprintf \"len: %d args\"\n (List.length args))));\n register \"first\" (fun args ->\n match args with\n | [List (x :: _)] | [ListRef { contents = x :: _ }] -> x\n | [List []] | [ListRef { contents = [] }] -> Nil | [Nil] -> Nil\n | _ -> raise (Eval_error \"first: 1 list arg\"));\n register \"rest\" (fun args ->\n match args with\n | [List (_ :: xs)] | [ListRef { contents = _ :: xs }] -> List xs\n | [List []] | [ListRef { contents = [] }] -> List [] | [Nil] -> List []\n | _ -> raise (Eval_error \"rest: 1 list arg\"));\n register \"last\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error \"last: 1 list arg\"));\n register \"init\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with _ :: rest -> List (List.rev rest) | [] -> List [])\n | _ -> raise (Eval_error \"init: 1 list arg\"));\n register \"nth\" (fun args ->\n match args with\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [String s; Number n] ->\n let i = int_of_float n in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> raise (Eval_error \"nth: list/string and number\"));\n register \"cons\" (fun args ->\n match args with\n | [x; List l] | [x; ListRef { contents = l }] -> List (x :: l)\n | [x; Nil] -> List [x]\n | _ -> raise (Eval_error \"cons: value and list\"));\n register \"append\" (fun args ->\n match args with\n | [List la | ListRef { contents = la }; List lb | ListRef { contents = lb }] ->\n List (la @ lb)\n | [List la | ListRef { contents = la }; Nil] -> List la\n | [Nil; List lb | ListRef { contents = lb }] -> List lb\n | [List la | ListRef { contents = la }; v] -> List (la @ [v])\n | [v; List lb | ListRef { contents = lb }] -> List ([v] @ lb)\n | _ ->\n let all = List.concat_map as_list args in\n List all);\n register \"reverse\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.rev l)\n | _ -> raise (Eval_error \"reverse: 1 list\"));\n register \"flatten\" (fun args ->\n let rec flat = function\n | List items | ListRef { contents = items } -> List.concat_map flat items\n | x -> [x]\n in\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.concat_map flat l)\n | _ -> raise (Eval_error \"flatten: 1 list\"));\n register \"concat\" (fun args -> List (List.concat_map as_list args));\n register \"contains?\" (fun args ->\n match args with\n | [List l; item] | [ListRef { contents = l }; item] -> Bool (List.mem item l)\n | [String s; String sub] ->\n let rec find i =\n if i + String.length sub > String.length s then false\n else if String.sub s i (String.length sub) = sub then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"contains?: 2 args\"));\n register \"range\" (fun args ->\n match args with\n | [Number stop] ->\n let n = int_of_float stop in\n List (List.init (max 0 n) (fun i -> Number (float_of_int i)))\n | [Number start; Number stop] ->\n let s = int_of_float start and e = int_of_float stop in\n let len = max 0 (e - s) in\n List (List.init len (fun i -> Number (float_of_int (s + i))))\n | [Number start; Number stop; Number step] ->\n let s = start and e = stop and st = step in\n if st = 0.0 then List []\n else\n let items = ref [] in\n let i = ref s in\n if st > 0.0 then\n (while !i < e do items := Number !i :: !items; i := !i +. st done)\n else\n (while !i > e do items := Number !i :: !items; i := !i +. st done);\n List (List.rev !items)\n | _ -> raise (Eval_error \"range: 1-3 args\"));\n register \"slice\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number start] ->\n let i = max 0 (int_of_float start) in\n let rec drop n = function _ :: xs when n > 0 -> drop (n-1) xs | l -> l in\n List (drop i l)\n | [(List l | ListRef { contents = l }); Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let len = List.length l in\n let j = min j len in\n let rec take_range idx = function\n | [] -> []\n | x :: xs ->\n if idx >= j then []\n else if idx >= i then x :: take_range (idx+1) xs\n else take_range (idx+1) xs\n in List (take_range 0 l)\n | [String s; Number start] ->\n let i = max 0 (int_of_float start) in\n String (String.sub s i (max 0 (String.length s - i)))\n | [String s; Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let sl = String.length s in\n let j = min j sl in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"slice: 2-3 args\"));\n register \"sort\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.sort compare l)\n | _ -> raise (Eval_error \"sort: 1 list\"));\n register \"zip\" (fun args ->\n match args with\n | [a; b] ->\n let la = as_list a and lb = as_list b in\n let rec go l1 l2 acc = match l1, l2 with\n | x :: xs, y :: ys -> go xs ys (List [x; y] :: acc)\n | _ -> List.rev acc\n in List (go la lb [])\n | _ -> raise (Eval_error \"zip: 2 lists\"));\n register \"zip-pairs\" (fun args ->\n match args with\n | [v] ->\n let l = as_list v in\n let rec go = function\n | a :: b :: rest -> List [a; b] :: go rest\n | _ -> []\n in List (go l)\n | _ -> raise (Eval_error \"zip-pairs: 1 list\"));\n register \"take\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in List (take_n (int_of_float n) l)\n | _ -> raise (Eval_error \"take: list and number\"));\n register \"drop\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in List (drop_n (int_of_float n) l)\n | _ -> raise (Eval_error \"drop: list and number\"));\n register \"chunk-every\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let size = int_of_float n in\n let rec go = function\n | [] -> []\n | l ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in\n List (take_n size l) :: go (drop_n size l)\n in List (go l)\n | _ -> raise (Eval_error \"chunk-every: list and number\"));\n register \"unique\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l })] ->\n let seen = Hashtbl.create 16 in\n let result = List.filter (fun x ->\n let key = inspect x in\n if Hashtbl.mem seen key then false\n else (Hashtbl.replace seen key true; true)\n ) l in\n List result\n | _ -> raise (Eval_error \"unique: 1 list\"));\n\n (* === Dict === *)\n register \"dict\" (fun args ->\n let d = make_dict () in\n let rec go = function\n | [] -> Dict d\n | Keyword k :: v :: rest -> dict_set d k v; go rest\n | String k :: v :: rest -> dict_set d k v; go rest\n | _ -> raise (Eval_error \"dict: pairs of key value\")\n in go args);\n register \"get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [Nil; _] -> Nil (* nil.anything → nil *)\n | [_; _] -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n | _ -> Nil);\n register \"has-key?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | [Dict d; Keyword k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"has-key?: dict and key\"));\n register \"assoc\" (fun args ->\n match args with\n | Dict d :: rest ->\n let d2 = Hashtbl.copy d in\n let rec go = function\n | [] -> Dict d2\n | String k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | Keyword k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | _ -> raise (Eval_error \"assoc: pairs\")\n in go rest\n | _ -> raise (Eval_error \"assoc: dict + pairs\"));\n register \"dissoc\" (fun args ->\n match args with\n | Dict d :: keys ->\n let d2 = Hashtbl.copy d in\n List.iter (fun k -> Hashtbl.remove d2 (to_string k)) keys;\n Dict d2\n | _ -> raise (Eval_error \"dissoc: dict + keys\"));\n register \"merge\" (fun args ->\n let d = make_dict () in\n List.iter (function\n | Dict src -> Hashtbl.iter (fun k v -> Hashtbl.replace d k v) src\n | _ -> raise (Eval_error \"merge: all args must be dicts\")\n ) args;\n Dict d);\n register \"keys\" (fun args ->\n match args with [Dict d] -> List (dict_keys d) | _ -> raise (Eval_error \"keys: 1 dict\"));\n register \"vals\" (fun args ->\n match args with [Dict d] -> List (dict_vals d) | _ -> raise (Eval_error \"vals: 1 dict\"));\n register \"mutable-list\" (fun _args -> ListRef (ref []));\n register \"set-nth!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n let l = !r in\n r := List.mapi (fun j x -> if j = i then v else x) l;\n Nil\n | [List _; _; _] ->\n raise (Eval_error \"set-nth!: list is immutable, use ListRef\")\n | _ -> raise (Eval_error \"set-nth!: expected (list idx val)\"));\n register \"dict-set!\" (fun args ->\n match args with\n | [Dict d; String k; v] -> dict_set d k v; v\n | [Dict d; Keyword k; v] -> dict_set d k v; v\n | _ -> raise (Eval_error \"dict-set!: dict key val\"));\n register \"dict-get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | _ -> raise (Eval_error \"dict-get: dict and key\"));\n register \"dict-has?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"dict-has?: dict and key\"));\n register \"dict-delete!\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_delete d k; Nil\n | _ -> raise (Eval_error \"dict-delete!: dict and key\"));\n\n (* === Misc === *)\n register \"type-of\" (fun args ->\n match args with [a] -> String (type_of a) | _ -> raise (Eval_error \"type-of: 1 arg\"));\n register \"inspect\" (fun args ->\n match args with [a] -> String (inspect a) | _ -> raise (Eval_error \"inspect: 1 arg\"));\n register \"serialize\" (fun args ->\n match args with\n | [a] -> String (inspect a) (* used for dedup keys in compiler *)\n | _ -> raise (Eval_error \"serialize: 1 arg\"));\n register \"make-symbol\" (fun args ->\n match args with\n | [String s] -> Symbol s\n | _ -> raise (Eval_error \"make-symbol: expected string\"));\n register \"error\" (fun args ->\n match args with [String msg] -> raise (Eval_error msg)\n | [a] -> raise (Eval_error (to_string a))\n | _ -> raise (Eval_error \"error: 1 arg\"));\n register \"apply\" (fun args ->\n match args with\n | [NativeFn (_, f); (List a | ListRef { contents = a })] -> f a\n | [NativeFn (_, f); Nil] -> f []\n | _ -> raise (Eval_error \"apply: function and list\"));\n register \"identical?\" (fun args ->\n match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?: 2 args\"));\n register \"make-spread\" (fun args ->\n match args with\n | [Dict d] ->\n let pairs = Hashtbl.fold (fun k v acc -> (k, v) :: acc) d [] in\n Spread pairs\n | _ -> raise (Eval_error \"make-spread: 1 dict\"));\n register \"spread?\" (fun args ->\n match args with [Spread _] -> Bool true | [_] -> Bool false\n | _ -> raise (Eval_error \"spread?: 1 arg\"));\n register \"spread-attrs\" (fun args ->\n match args with\n | [Spread pairs] ->\n let d = make_dict () in\n List.iter (fun (k, v) -> dict_set d k v) pairs;\n Dict d\n | _ -> raise (Eval_error \"spread-attrs: 1 spread\"));\n\n (* Higher-order forms as callable primitives — used by the VM.\n The CEK machine handles these as special forms with dedicated frames;\n the VM needs them as plain callable values. *)\n (* Call any SX callable — handles NativeFn, Lambda (via trampoline), VM closures *)\n let call_any f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | _ -> !_sx_trampoline_fn (!_sx_call_fn f args)\n in\n register \"map\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.map (fun x -> call_any f [x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map: expected (fn list)\"));\n register \"map-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.mapi (fun i x -> call_any f [Number (float_of_int i); x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map-indexed: expected (fn list)\"));\n register \"filter\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.filter (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"filter: expected (fn list)\"));\n register \"for-each\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iter (fun x -> ignore (call_any f [x])) items; Nil\n | [_; Nil] -> Nil (* nil collection = no-op *)\n | _ ->\n let types = String.concat \", \" (List.map (fun v -> type_of v) args) in\n raise (Eval_error (Printf.sprintf \"for-each: expected (fn list), got (%s) %d args\" types (List.length args))));\n register \"reduce\" (fun args ->\n match args with\n | [f; init; (List items | ListRef { contents = items })] ->\n List.fold_left (fun acc x -> call_any f [acc; x]) init items\n | _ -> raise (Eval_error \"reduce: expected (fn init list)\"));\n register \"some\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n (try List.find (fun x -> sx_truthy (call_any f [x])) items\n with Not_found -> Bool false)\n | [_; Nil] -> Bool false\n | _ -> raise (Eval_error \"some: expected (fn list)\"));\n register \"every?\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n Bool (List.for_all (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> Bool true\n | _ -> raise (Eval_error \"every?: expected (fn list)\"));\n\n (* ---- VM stack primitives (vm.sx platform interface) ---- *)\n register \"make-vm-stack\" (fun args ->\n match args with\n | [Number n] -> ListRef (ref (List.init (int_of_float n) (fun _ -> Nil)))\n | _ -> raise (Eval_error \"make-vm-stack: expected (size)\"));\n register \"vm-stack-get\" (fun args ->\n match args with\n | [ListRef r; Number n] -> List.nth !r (int_of_float n)\n | _ -> raise (Eval_error \"vm-stack-get: expected (stack idx)\"));\n register \"vm-stack-set!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n r := List.mapi (fun j x -> if j = i then v else x) !r; Nil\n | _ -> raise (Eval_error \"vm-stack-set!: expected (stack idx val)\"));\n register \"vm-stack-length\" (fun args ->\n match args with\n | [ListRef r] -> Number (float_of_int (List.length !r))\n | _ -> raise (Eval_error \"vm-stack-length: expected (stack)\"));\n register \"vm-stack-copy!\" (fun args ->\n match args with\n | [ListRef src; ListRef dst; Number n] ->\n let count = int_of_float n in\n let src_items = !src in\n dst := List.mapi (fun i x -> if i < count then List.nth src_items i else x) !dst; Nil\n | _ -> raise (Eval_error \"vm-stack-copy!: expected (src dst count)\"));\n register \"primitive?\" (fun args ->\n match args with\n | [String name] -> Bool (Hashtbl.mem primitives name)\n | _ -> Bool false);\n\n (* Scope stack primitives are registered by sx_server.ml / run_tests.ml\n because they use a shared scope stacks table with collect!/collected. *)\n\n (* ---- Predicates needed by adapter-html.sx ---- *)\n register \"lambda?\" (fun args ->\n match args with [Lambda _] -> Bool true | _ -> Bool false);\n register \"island?\" (fun args ->\n match args with [Island _] -> Bool true | _ -> Bool false);\n register \"is-else-clause?\" (fun args ->\n match args with\n | [Keyword \"else\"] -> Bool true\n | [Bool true] -> Bool true\n | _ -> Bool false);\n register \"component?\" (fun args ->\n match args with [Component _] -> Bool true | [Island _] -> Bool true | _ -> Bool false);\n register \"lambda-closure\" (fun args ->\n match args with [Lambda l] -> Env l.l_closure | _ -> Nil);\n register \"component-closure\" (fun args ->\n match args with\n | [Component c] -> Env c.c_closure\n | [Island i] -> Env i.i_closure\n | _ -> Nil);\n register \"component-has-children?\" (fun args ->\n match args with\n | [Component c] -> Bool c.c_has_children\n | [Island i] -> Bool i.i_has_children\n | _ -> Bool false);\n register \"component-name\" (fun args ->\n match args with\n | [Component c] -> String c.c_name\n | [Island i] -> String i.i_name\n | _ -> Nil);\n register \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> List []);\n register \"component-body\" (fun args ->\n match args with\n | [Component c] -> c.c_body\n | [Island i] -> i.i_body\n | _ -> Nil);\n register \"macro?\" (fun args ->\n match args with [Macro _] -> Bool true | _ -> Bool false);\n register \"for-each-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iteri (fun i x -> ignore (call_any f [Number (float_of_int i); x])) items; Nil\n | _ -> raise (Eval_error \"for-each-indexed: expected (fn list)\"));\n register \"lambda-params\" (fun args ->\n match args with\n | [Lambda l] -> List (List.map (fun s -> String s) l.l_params)\n | _ -> List []);\n register \"lambda-body\" (fun args ->\n match args with [Lambda l] -> l.l_body | _ -> Nil);\n (* expand-macro is registered later by run_tests.ml / sx_server.ml\n because it needs eval_expr which creates a dependency cycle *);\n register \"empty-dict?\" (fun args ->\n match args with\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | _ -> Bool true);\n register \"make-raw-html\" (fun args ->\n match args with [String s] -> RawHTML s | _ -> Nil);\n register \"raw-html-content\" (fun args ->\n match args with [RawHTML s] -> String s | _ -> String \"\");\n register \"get-primitive\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"get-primitive: expected (name)\"));\n register \"call-primitive\" (fun args ->\n match args with\n | [String name; (List a | ListRef { contents = a })] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn a\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | [String name; Nil] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn []\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"call-primitive: expected (name args-list)\"));\n ()\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":109337},"map":{"version":3,"sources":["/workspace_root/lib/sx_runtime.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Runtime helpers for transpiled code.\n\n These bridge the gap between the transpiler's output and the\n foundation types/primitives. The transpiled evaluator calls these\n functions directly. *)\n\nopen Sx_types\n\n(** Call a registered primitive by name. *)\nlet prim_call name args =\n match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f args\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(** Convert any SX value to an OCaml string (internal). *)\nlet value_to_str = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | v -> inspect v\n\n(** sx_to_string returns a value (String) for transpiled code. *)\nlet sx_to_string v = String (value_to_str v)\n\n(** String concatenation helper — [sx_str] takes a list of values. *)\nlet sx_str args =\n String.concat \"\" (List.map value_to_str args)\n\n(** Convert a value to a list. *)\nlet sx_to_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\n(** Call an SX callable (lambda, native fn, continuation). *)\nlet sx_call f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | VmClosure cl -> !Sx_types._vm_call_closure_ref cl args\n | Lambda l ->\n let local = Sx_types.env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (Sx_types.env_bind local p a)) l.l_params args;\n Thunk (l.l_body, local)\n | Continuation (k, _) ->\n k (match args with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error (\"Not callable: \" ^ inspect f))\n\n(* Initialize forward ref so primitives can call SX functions *)\nlet () = Sx_primitives._sx_call_fn := sx_call\n(* Trampoline ref is set by sx_ref.ml after it's loaded *)\n\n(** Apply a function to a list of args. *)\nlet sx_apply f args_list =\n sx_call f (sx_to_list args_list)\n\n(** Mutable append — add item to a list ref or accumulator.\n In transpiled code, lists that get appended to are mutable refs. *)\nlet sx_append_b lst item =\n match lst with\n | List items -> List (items @ [item])\n | ListRef r -> r := !r @ [item]; lst (* mutate in place, return same ref *)\n | _ -> raise (Eval_error (\"append!: expected list, got \" ^ type_of lst))\n\n(** Mutable dict-set — set key in dict, return value. *)\nlet sx_dict_set_b d k v =\n match d, k with\n | Dict tbl, String key -> Hashtbl.replace tbl key v; v\n | Dict tbl, Keyword key -> Hashtbl.replace tbl key v; v\n | _ -> raise (Eval_error \"dict-set!: expected dict and string key\")\n\n(** Get from dict or list. *)\nlet get_val container key =\n match container, key with\n | CekState s, String k ->\n (match k with\n | \"control\" -> s.cs_control | \"env\" -> s.cs_env\n | \"kont\" -> s.cs_kont | \"phase\" -> String s.cs_phase\n | \"value\" -> s.cs_value | _ -> Nil)\n | CekFrame f, String k ->\n (match k with\n | \"type\" -> String f.cf_type | \"env\" -> f.cf_env\n | \"name\" -> f.cf_name | \"body\" -> f.cf_body\n | \"remaining\" -> f.cf_remaining | \"f\" -> f.cf_f\n | \"args\" -> f.cf_args | \"evaled\" -> f.cf_args\n | \"results\" -> f.cf_results | \"raw-args\" -> f.cf_results\n | \"then\" -> f.cf_body | \"else\" -> f.cf_name\n | \"ho-type\" -> f.cf_extra | \"scheme\" -> f.cf_extra\n | \"indexed\" -> f.cf_extra | \"value\" -> f.cf_extra\n | \"phase\" -> f.cf_extra | \"has-effects\" -> f.cf_extra\n | \"match-val\" -> f.cf_extra | \"current-item\" -> f.cf_extra\n | \"update-fn\" -> f.cf_extra | \"head-name\" -> f.cf_extra\n | \"emitted\" -> f.cf_extra2 | \"effect-list\" -> f.cf_extra2\n | \"first-render\" -> f.cf_extra2\n | _ -> Nil)\n | Dict d, String k -> dict_get d k\n | Dict d, Keyword k -> dict_get d k\n | (List l | ListRef { contents = l }), Number n ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | Nil, _ -> Nil (* nil.anything → nil *)\n | _, _ -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n\n(** Register get as a primitive override — transpiled code calls (get d k). *)\nlet () =\n Sx_primitives.register \"get\" (fun args ->\n match args with\n | [c; k] -> get_val c k\n | [c; k; default] ->\n (try\n let v = get_val c k in\n if v = Nil then default else v\n with _ -> default)\n | _ -> raise (Eval_error \"get: 2-3 args\"))\n\n\n(* ====================================================================== *)\n(* Primitive aliases — top-level functions called by transpiled code *)\n(* ====================================================================== *)\n\n(** The transpiled evaluator calls primitives directly by their mangled\n OCaml name. These aliases delegate to the primitives table so the\n transpiled code compiles without needing [prim_call] everywhere. *)\n\nlet _prim name = match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f | None -> (fun _ -> raise (Eval_error (\"Missing prim: \" ^ name)))\n\n(* Collection ops *)\nlet first args = _prim \"first\" [args]\nlet rest args = _prim \"rest\" [args]\nlet last args = _prim \"last\" [args]\nlet nth coll i = _prim \"nth\" [coll; i]\nlet cons x l = _prim \"cons\" [x; l]\nlet append a b = _prim \"append\" [a; b]\nlet reverse l = _prim \"reverse\" [l]\nlet flatten l = _prim \"flatten\" [l]\nlet concat a b = _prim \"concat\" [a; b]\nlet slice a b = _prim \"slice\" [a; b]\nlet len a = _prim \"len\" [a]\nlet get a b = get_val a b\nlet sort' a = _prim \"sort\" [a]\nlet range' a = _prim \"range\" [a]\nlet unique a = _prim \"unique\" [a]\nlet zip a b = _prim \"zip\" [a; b]\nlet zip_pairs a = _prim \"zip-pairs\" [a]\nlet take a b = _prim \"take\" [a; b]\nlet drop a b = _prim \"drop\" [a; b]\nlet chunk_every a b = _prim \"chunk-every\" [a; b]\n\n(* Predicates *)\nlet empty_p a = _prim \"empty?\" [a]\nlet nil_p a = _prim \"nil?\" [a]\nlet number_p a = _prim \"number?\" [a]\nlet string_p a = _prim \"string?\" [a]\nlet boolean_p a = _prim \"boolean?\" [a]\nlet list_p a = _prim \"list?\" [a]\nlet dict_p a = _prim \"dict?\" [a]\nlet symbol_p a = _prim \"symbol?\" [a]\nlet keyword_p a = _prim \"keyword?\" [a]\nlet contains_p a b = _prim \"contains?\" [a; b]\nlet has_key_p a b = _prim \"has-key?\" [a; b]\nlet starts_with_p a b = _prim \"starts-with?\" [a; b]\nlet ends_with_p a b = _prim \"ends-with?\" [a; b]\nlet string_contains_p a b = _prim \"string-contains?\" [a; b]\nlet odd_p a = _prim \"odd?\" [a]\nlet even_p a = _prim \"even?\" [a]\nlet zero_p a = _prim \"zero?\" [a]\n\n(* String ops *)\nlet str' args = String (sx_str args)\nlet upper a = _prim \"upper\" [a]\nlet upcase a = _prim \"upcase\" [a]\nlet lower a = _prim \"lower\" [a]\nlet downcase a = _prim \"downcase\" [a]\nlet trim a = _prim \"trim\" [a]\nlet split a b = _prim \"split\" [a; b]\nlet join a b = _prim \"join\" [a; b]\nlet replace a b c = _prim \"replace\" [a; b; c]\nlet index_of a b = _prim \"index-of\" [a; b]\nlet substring a b c = _prim \"substring\" [a; b; c]\nlet string_length a = _prim \"string-length\" [a]\nlet char_from_code a = _prim \"char-from-code\" [a]\n\n(* Dict ops *)\nlet assoc d k v = _prim \"assoc\" [d; k; v]\nlet dissoc d k = _prim \"dissoc\" [d; k]\nlet merge' a b = _prim \"merge\" [a; b]\nlet keys a = _prim \"keys\" [a]\nlet vals a = _prim \"vals\" [a]\nlet dict_set a b c = _prim \"dict-set!\" [a; b; c]\nlet dict_get a b = _prim \"dict-get\" [a; b]\nlet dict_has_p a b = _prim \"dict-has?\" [a; b]\nlet dict_delete a b = _prim \"dict-delete!\" [a; b]\n\n(* Math *)\nlet abs' a = _prim \"abs\" [a]\nlet sqrt' a = _prim \"sqrt\" [a]\nlet pow' a b = _prim \"pow\" [a; b]\nlet floor' a = _prim \"floor\" [a]\nlet ceil' a = _prim \"ceil\" [a]\nlet round' a = _prim \"round\" [a]\nlet min' a b = _prim \"min\" [a; b]\nlet max' a b = _prim \"max\" [a; b]\nlet clamp a b c = _prim \"clamp\" [a; b; c]\nlet parse_int a = _prim \"parse-int\" [a]\nlet parse_float a = _prim \"parse-float\" [a]\n\n(* Misc *)\nlet error msg = raise (Eval_error (value_to_str msg))\n\n(* inspect wrapper — returns String value instead of OCaml string *)\nlet inspect v = String (Sx_types.inspect v)\nlet apply' f args = sx_apply f args\nlet identical_p a b = _prim \"identical?\" [a; b]\nlet _is_spread_prim a = _prim \"spread?\" [a]\nlet spread_attrs a = _prim \"spread-attrs\" [a]\nlet make_spread a = _prim \"make-spread\" [a]\n\n(* Scope primitives — delegate to sx_ref.py's shared scope stacks *)\nlet sx_collect a b = prim_call \"collect!\" [a; b]\nlet sx_collected a = prim_call \"collected\" [a]\nlet sx_clear_collected a = prim_call \"clear-collected!\" [a]\nlet sx_emit a b = prim_call \"emit!\" [a; b]\nlet sx_emitted a = prim_call \"emitted\" [a]\nlet sx_context a b = prim_call \"context\" [a; b]\n\n(* Trampoline — forward-declared in sx_ref.ml, delegates to CEK eval_expr *)\n(* This is a stub; the real trampoline is wired up in sx_ref.ml after eval_expr is defined *)\nlet trampoline v = v\n\n(* Value-returning type predicates — the transpiled code passes these through\n sx_truthy, so they need to return Bool, not OCaml bool. *)\n(* type_of returns value, not string *)\nlet type_of v = String (Sx_types.type_of v)\n\n(* Env operations — accept Env-wrapped values and value keys.\n The transpiled CEK machine stores envs in dicts as Env values. *)\nlet unwrap_env = function\n | Env e -> e\n | Dict d ->\n (* Dict used as env — wrap it. Needed by adapter-html.sx which\n passes dicts as env args (e.g. empty {} as caller env). *)\n let e = Sx_types.make_env () in\n Hashtbl.iter (fun k v -> ignore (Sx_types.env_bind e k v)) d;\n e\n | Nil ->\n Sx_types.make_env ()\n | v -> raise (Eval_error (\"Expected env, got \" ^ Sx_types.type_of v))\n\nlet env_has e name = Bool (Sx_types.env_has (unwrap_env e) (value_to_str name))\nlet env_get e name = Sx_types.env_get (unwrap_env e) (value_to_str name)\nlet env_bind e name v = Sx_types.env_bind (unwrap_env e) (value_to_str name) v\nlet env_set e name v = Sx_types.env_set (unwrap_env e) (value_to_str name) v\n\nlet make_env () = Env (Sx_types.make_env ())\nlet env_extend e = Env (Sx_types.env_extend (unwrap_env e))\nlet env_merge a b = Env (Sx_types.env_merge (unwrap_env a) (unwrap_env b))\n\n(* set_lambda_name wrapper — accepts value, extracts string *)\nlet set_lambda_name l n = Sx_types.set_lambda_name l (value_to_str n)\n\nlet is_nil v = Bool (Sx_types.is_nil v)\nlet is_thunk v = Bool (Sx_types.is_thunk v)\nlet is_lambda v = Bool (Sx_types.is_lambda v)\nlet is_component v = Bool (Sx_types.is_component v)\nlet is_island v = Bool (Sx_types.is_island v)\nlet is_macro v = Bool (Sx_types.is_macro v)\nlet is_signal v = Bool (Sx_types.is_signal v)\nlet is_callable v = Bool (Sx_types.is_callable v)\nlet is_identical a b = Bool (a == b)\nlet is_primitive name = Bool (Sx_primitives.is_primitive (value_to_str name))\nlet get_primitive name = Sx_primitives.get_primitive (value_to_str name)\nlet is_spread v = match v with Spread _ -> Bool true | _ -> Bool false\n\n(* Stubs for functions defined in sx_ref.ml — resolved at link time *)\n(* These are forward-declared here; sx_ref.ml defines the actual implementations *)\n\n(* strip-prefix *)\n(* Stubs for evaluator functions — defined in sx_ref.ml but\n sometimes referenced before their definition via forward calls.\n These get overridden by the actual transpiled definitions. *)\n\nlet map_indexed fn coll =\n List (List.mapi (fun i x -> sx_call fn [Number (float_of_int i); x]) (sx_to_list coll))\n\nlet map_dict fn d =\n match d with\n | Dict tbl ->\n let result = Hashtbl.create (Hashtbl.length tbl) in\n Hashtbl.iter (fun k v -> Hashtbl.replace result k (sx_call fn [String k; v])) tbl;\n Dict result\n | _ -> raise (Eval_error \"map-dict: expected dict\")\n\nlet for_each fn coll =\n List.iter (fun x -> ignore (sx_call fn [x])) (sx_to_list coll);\n Nil\n\nlet for_each_indexed fn coll =\n List.iteri (fun i x -> ignore (sx_call fn [Number (float_of_int i); x])) (sx_to_list coll);\n Nil\n\n(* Continuation support *)\nlet continuation_p v = match v with Continuation (_, _) -> Bool true | _ -> Bool false\n\nlet make_cek_continuation captured rest_kont =\n let data = Hashtbl.create 2 in\n Hashtbl.replace data \"captured\" captured;\n Hashtbl.replace data \"rest-kont\" rest_kont;\n Continuation ((fun v -> v), Some data)\n\nlet continuation_data v = match v with\n | Continuation (_, Some d) -> Dict d\n | Continuation (_, None) -> Dict (Hashtbl.create 0)\n | _ -> raise (Eval_error \"not a continuation\")\n\n(* Dynamic wind — simplified for OCaml (no async) *)\nlet dynamic_wind_call before body after _env =\n ignore (sx_call before []);\n let result = sx_call body [] in\n ignore (sx_call after []);\n result\n\n(* Scope stack — all delegated to primitives registered in sx_server.ml *)\nlet scope_push name value = prim_call \"scope-push!\" [name; value]\nlet scope_pop name = prim_call \"scope-pop!\" [name]\nlet scope_peek name = prim_call \"scope-peek\" [name]\nlet scope_emit name value = prim_call \"scope-emit!\" [name; value]\nlet provide_push name value = prim_call \"scope-push!\" [name; value]\nlet provide_pop name = prim_call \"scope-pop!\" [name]\n\n(* Custom special forms registry — mutable dict *)\nlet custom_special_forms = Dict (Hashtbl.create 4)\n\n(* register-special-form! — add a handler to the custom registry *)\nlet register_special_form name handler =\n (match custom_special_forms with\n | Dict tbl -> Hashtbl.replace tbl (value_to_str name) handler; handler\n | _ -> raise (Eval_error \"custom_special_forms not a dict\"))\n\n(* Render check/fn hooks — nil by default, set by platform if needed *)\nlet render_check = Nil\nlet render_fn = Nil\n\n(* is-else-clause? — check if a cond/case test is an else marker *)\nlet is_else_clause v =\n match v with\n | Keyword k -> Bool (k = \"else\" || k = \"default\")\n | Symbol s -> Bool (s = \"else\" || s = \"default\")\n | Bool true -> Bool true\n | _ -> Bool false\n\n(* Signal accessors *)\nlet signal_value s = match s with\n | Signal sig' -> sig'.s_value\n | Dict d -> (match Hashtbl.find_opt d \"value\" with Some v -> v | None -> Nil)\n | _ -> raise (Eval_error \"not a signal\")\nlet signal_set_value s v = match s with Signal sig' -> sig'.s_value <- v; v | _ -> raise (Eval_error \"not a signal\")\nlet signal_subscribers s = match s with Signal sig' -> List (List.map (fun _ -> Nil) sig'.s_subscribers) | _ -> List []\nlet signal_add_sub_b _s _f = Nil\nlet signal_remove_sub_b _s _f = Nil\nlet signal_deps _s = List []\nlet signal_set_deps _s _d = Nil\nlet notify_subscribers _s = Nil\nlet flush_subscribers _s = Nil\nlet dispose_computed _s = Nil\n\n(* Island scope stubs — accept both bare OCaml fns and NativeFn values\n from transpiled code (NativeFn wrapping for value-storable lambdas). *)\nlet with_island_scope _register_fn body_fn =\n match body_fn with\n | NativeFn (_, f) -> f []\n | _ -> Nil\nlet register_in_scope _dispose_fn = Nil\n\n(* Component type annotation stub *)\nlet component_set_param_types_b _comp _types = Nil\n\n(* Parse keyword args from a call — this is defined in evaluator.sx,\n the transpiled version will override this stub. *)\n(* Forward-reference stubs for evaluator functions used before definition *)\nlet parse_comp_params _params = List [List []; Nil; Bool false]\nlet parse_macro_params _params = List [List []; Nil]\n\nlet parse_keyword_args _raw_args _env =\n (* Stub — the real implementation is transpiled from evaluator.sx *)\n List [Dict (Hashtbl.create 0); List []]\n\n(* Make handler/query/action/page def stubs *)\nlet make_handler_def name params body _env = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"handler\"); Hashtbl.replace d \"name\" name; Hashtbl.replace d \"params\" params; Hashtbl.replace d \"body\" body; d)\nlet make_query_def name params body _env = make_handler_def name params body _env\nlet make_action_def name params body _env = make_handler_def name params body _env\nlet make_page_def name _opts = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"page\"); Hashtbl.replace d \"name\" name; d)\n\n(* sf-def* stubs — platform-specific def-forms, not in the SX spec *)\nlet sf_defhandler args env =\n let name = first args in let rest_args = rest args in\n make_handler_def name (first rest_args) (nth rest_args (Number 1.0)) env\nlet sf_defquery args env = sf_defhandler args env\nlet sf_defaction args env = sf_defhandler args env\nlet sf_defpage args _env =\n let name = first args in make_page_def name (rest args)\n\nlet strip_prefix s prefix =\n match s, prefix with\n | String s, String p ->\n let pl = String.length p in\n if String.length s >= pl && String.sub s 0 pl = p\n then String (String.sub s pl (String.length s - pl))\n else String s\n | _ -> s\n\n(* debug_log — no-op in production, used by CEK evaluator for component warnings *)\nlet debug_log _ _ = Nil\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":120236},"map":{"version":3,"sources":["/workspace_root/lib/sx_ref.ml","/builtin/blackbox.ml"],"sourcesContent":["(* sx_ref.ml — Auto-generated from SX spec by hosts/ocaml/bootstrap.py *)\n(* Do not edit — regenerate with: python3 hosts/ocaml/bootstrap.py *)\n\n[@@@warning \"-26-27\"]\n\nopen Sx_types\nopen Sx_runtime\n\n(* Trampoline — forward ref, resolved after eval_expr is defined. *)\nlet trampoline_fn : (value -> value) ref = ref (fun v -> v)\nlet trampoline v = !trampoline_fn v\n\n\n\n(* === Mutable state for strict mode === *)\n(* These are defined as top-level refs because the transpiler cannot handle\n global set! mutation (it creates local refs that shadow the global). *)\nlet _strict_ref = ref (Bool false)\nlet _prim_param_types_ref = ref Nil\n\n(* JIT call hook — cek_call checks this before CEK dispatch for named\n lambdas. Registered by sx_server.ml after compiler loads. Tests\n run with hook = None (pure CEK, no compilation dependency). *)\nlet jit_call_hook : (value -> value list -> value option) option ref = ref None\n\n\n\n(* === Transpiled from evaluator (frames + eval + CEK) === *)\n\n(* make-cek-state *)\nlet rec make_cek_state control env kont =\n (CekState { cs_control = control; cs_env = env; cs_kont = kont; cs_phase = \"eval\"; cs_value = Nil })\n\n(* make-cek-value *)\nand make_cek_value value env kont =\n (CekState { cs_control = Nil; cs_env = env; cs_kont = kont; cs_phase = \"continue\"; cs_value = value })\n\n(* cek-terminal? *)\nand cek_terminal_p state =\n (let _and = (prim_call \"=\" [(get (state) ((String \"phase\"))); (String \"continue\")]) in if not (sx_truthy _and) then _and else (empty_p ((get (state) ((String \"kont\"))))))\n\n(* cek-control *)\nand cek_control s =\n (get (s) ((String \"control\")))\n\n(* cek-env *)\nand cek_env s =\n (get (s) ((String \"env\")))\n\n(* cek-kont *)\nand cek_kont s =\n (get (s) ((String \"kont\")))\n\n(* cek-phase *)\nand cek_phase s =\n (get (s) ((String \"phase\")))\n\n(* cek-value *)\nand cek_value s =\n (get (s) ((String \"value\")))\n\n(* make-if-frame *)\nand make_if_frame then_expr else_expr env =\n (CekFrame { cf_type = \"if\"; cf_env = env; cf_name = else_expr; cf_body = then_expr; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-when-frame *)\nand make_when_frame body_exprs env =\n (CekFrame { cf_type = \"when\"; cf_env = env; cf_name = Nil; cf_body = body_exprs; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-begin-frame *)\nand make_begin_frame remaining env =\n (CekFrame { cf_type = \"begin\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-let-frame *)\nand make_let_frame name remaining body local =\n (CekFrame { cf_type = \"let\"; cf_env = local; cf_name = name; cf_body = body; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-define-frame *)\nand make_define_frame name env has_effects effect_list =\n (CekFrame { cf_type = \"define\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = has_effects; cf_extra2 = effect_list })\n\n(* make-set-frame *)\nand make_set_frame name env =\n (CekFrame { cf_type = \"set\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-arg-frame *)\nand make_arg_frame f evaled remaining env raw_args head_name =\n (CekFrame { cf_type = \"arg\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = evaled; cf_results = raw_args; cf_extra = (let _or = head_name in if sx_truthy _or then _or else Nil); cf_extra2 = Nil })\n\n(* make-call-frame *)\nand make_call_frame f args env =\n (CekFrame { cf_type = \"call\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = f; cf_args = args; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-cond-frame *)\nand make_cond_frame remaining env scheme_p =\n (CekFrame { cf_type = \"cond\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = scheme_p; cf_extra2 = Nil })\n\n(* make-case-frame *)\nand make_case_frame match_val remaining env =\n (CekFrame { cf_type = \"case\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = match_val; cf_extra2 = Nil })\n\n(* make-thread-frame *)\nand make_thread_frame remaining env =\n (CekFrame { cf_type = \"thread\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-map-frame *)\nand make_map_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool false); cf_extra2 = Nil })\n\n(* make-map-indexed-frame *)\nand make_map_indexed_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool true); cf_extra2 = Nil })\n\n(* make-filter-frame *)\nand make_filter_frame f remaining results current_item env =\n (CekFrame { cf_type = \"filter\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = current_item; cf_extra2 = Nil })\n\n(* make-reduce-frame *)\nand make_reduce_frame f remaining env =\n (CekFrame { cf_type = \"reduce\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-for-each-frame *)\nand make_for_each_frame f remaining env =\n (CekFrame { cf_type = \"for-each\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-some-frame *)\nand make_some_frame f remaining env =\n (CekFrame { cf_type = \"some\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-every-frame *)\nand make_every_frame f remaining env =\n (CekFrame { cf_type = \"every\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-scope-frame *)\nand make_scope_frame name remaining env =\n (CekFrame { cf_type = \"scope\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-provide-frame *)\nand make_provide_frame name value remaining env =\n (CekFrame { cf_type = \"provide\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = value; cf_extra2 = Nil })\n\n(* make-scope-acc-frame *)\nand make_scope_acc_frame name value remaining env =\n (CekFrame { cf_type = \"scope-acc\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = (let _or = value in if sx_truthy _or then _or else Nil); cf_extra2 = (List []) })\n\n(* make-reset-frame *)\nand make_reset_frame env =\n (CekFrame { cf_type = \"reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dict-frame *)\nand make_dict_frame remaining results env =\n (CekFrame { cf_type = \"dict\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = results; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-and-frame *)\nand make_and_frame remaining env =\n (CekFrame { cf_type = \"and\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-or-frame *)\nand make_or_frame remaining env =\n (CekFrame { cf_type = \"or\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dynamic-wind-frame *)\nand make_dynamic_wind_frame phase body_thunk after_thunk env =\n (CekFrame { cf_type = \"dynamic-wind\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = phase; cf_extra2 = Nil })\n\n(* make-reactive-reset-frame *)\nand make_reactive_reset_frame env update_fn first_render_p =\n (CekFrame { cf_type = \"reactive-reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = update_fn; cf_extra2 = first_render_p })\n\n(* make-deref-frame *)\nand make_deref_frame env =\n (CekFrame { cf_type = \"deref\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-ho-setup-frame *)\nand make_ho_setup_frame ho_type remaining_args evaled_args env =\n (CekFrame { cf_type = \"ho-setup\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining_args; cf_f = Nil; cf_args = evaled_args; cf_results = Nil; cf_extra = ho_type; cf_extra2 = Nil })\n\n(* frame-type *)\nand frame_type f =\n (get (f) ((String \"type\")))\n\n(* kont-push *)\nand kont_push frame kont =\n (cons (frame) (kont))\n\n(* kont-top *)\nand kont_top kont =\n (first (kont))\n\n(* kont-pop *)\nand kont_pop kont =\n (rest (kont))\n\n(* kont-empty? *)\nand kont_empty_p kont =\n (empty_p (kont))\n\n(* kont-capture-to-reset *)\nand kont_capture_to_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"shift without enclosing reset\")))) else (let frame = (first (k)) in (if sx_truthy ((let _or = (prim_call \"=\" [(frame_type (frame)); (String \"reset\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")]))) then (List [captured; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* kont-find-provide *)\nand kont_find_provide kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"provide\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_provide ((rest (kont))) (name)))))\n\n(* kont-find-scope-acc *)\nand kont_find_scope_acc kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"scope-acc\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_scope_acc ((rest (kont))) (name)))))\n\n(* has-reactive-reset-frame? *)\nand has_reactive_reset_frame_p kont =\n (if sx_truthy ((empty_p (kont))) then (Bool false) else (if sx_truthy ((prim_call \"=\" [(frame_type ((first (kont)))); (String \"reactive-reset\")])) then (Bool true) else (has_reactive_reset_frame_p ((rest (kont))))))\n\n(* kont-capture-to-reactive-reset *)\nand kont_capture_to_reactive_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"reactive deref without enclosing reactive-reset\")))) else (let frame = (first (k)) in (if sx_truthy ((prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")])) then (List [captured; frame; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* *custom-special-forms* *)\nand custom_special_forms =\n (Dict (Hashtbl.create 0))\n\n(* register-special-form! *)\nand register_special_form name handler =\n (sx_dict_set_b custom_special_forms name handler)\n\n(* *render-check* *)\nand render_check =\n Nil\n\n(* *render-fn* *)\nand render_fn =\n Nil\n\n(* *strict* *)\nand _strict_ = !_strict_ref\n\n(* set-strict! *)\nand set_strict_b val' =\n _strict_ref := val'; Nil\n\n(* *prim-param-types* *)\nand _prim_param_types_ = !_prim_param_types_ref\n\n(* set-prim-param-types! *)\nand set_prim_param_types_b types =\n _prim_param_types_ref := types; Nil\n\n(* value-matches-type? *)\nand value_matches_type_p val' expected_type =\n (if sx_truthy ((prim_call \"=\" [expected_type; (String \"any\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"number\")])) then (number_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"string\")])) then (string_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"boolean\")])) then (boolean_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"nil\")])) then (is_nil (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"list\")])) then (list_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"dict\")])) then (dict_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"lambda\")])) then (is_lambda (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"symbol\")])) then (prim_call \"=\" [(type_of (val')); (String \"symbol\")]) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"keyword\")])) then (prim_call \"=\" [(type_of (val')); (String \"keyword\")]) else (if sx_truthy ((let _and = (string_p (expected_type)) in if not (sx_truthy _and) then _and else (prim_call \"ends-with?\" [expected_type; (String \"?\")]))) then (let _or = (is_nil (val')) in if sx_truthy _or then _or else (value_matches_type_p (val') ((prim_call \"slice\" [expected_type; (Number 0.0); (prim_call \"-\" [(prim_call \"string-length\" [expected_type]); (Number 1.0)])])))) else (Bool true))))))))))))\n\n(* strict-check-args *)\nand strict_check_args name args =\n (if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else !_prim_param_types_ref)) then (let spec = (get (!_prim_param_types_ref) (name)) in (if sx_truthy (spec) then (let positional = (get (spec) ((String \"positional\"))) in let rest_type = (get (spec) ((String \"rest-type\"))) in (let () = ignore ((if sx_truthy (positional) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let param = (nth (pair) ((Number 1.0))) in let p_name = (first (param)) in let p_type = (nth (param) ((Number 1.0))) in (if sx_truthy ((prim_call \"<\" [idx; (len (args))])) then (let val' = (nth (args) (idx)) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (p_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); p_type; (String \" for param \"); p_name; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [i; p])) (sx_to_list positional)))); Nil) else Nil)) in (if sx_truthy ((let _and = rest_type in if not (sx_truthy _and) then _and else (prim_call \">\" [(len (args)); (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let val' = (nth (pair) ((Number 1.0))) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (rest_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); rest_type; (String \" for rest arg \"); idx; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)))) (sx_to_list (List (List.mapi (fun i v -> let i = Number (float_of_int i) in (List [i; v])) (sx_to_list (prim_call \"slice\" [args; (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))))); Nil) else Nil))) else Nil)) else Nil)\n\n(* call-lambda *)\nand call_lambda f args caller_env =\n (let params = (lambda_params (f)) in let local = (env_merge ((lambda_closure (f))) (caller_env)) in (if sx_truthy ((prim_call \">\" [(len (args)); (len (params))])) then (raise (Eval_error (value_to_str (String (sx_str [(let _or = (lambda_name (f)) in if sx_truthy _or then _or else (String \"lambda\")); (String \" expects \"); (len (params)); (String \" args, got \"); (len (args))]))))) else (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (nth (pair) ((Number 1.0)))))) (sx_to_list (prim_call \"zip\" [params; args])); Nil)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) Nil))) (sx_to_list (prim_call \"slice\" [params; (len (args))])); Nil)) in (make_thunk ((lambda_body (f))) (local))))))\n\n(* call-component *)\nand call_component comp raw_args env =\n (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (comp))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (comp))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (comp))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_thunk ((component_body (comp))) (local)))))\n\n(* parse-keyword-args *)\nand parse_keyword_args raw_args env =\n (let kwargs = (Dict (Hashtbl.create 0)) in let children = ref ((List [])) in let i = (Number 0.0) in (let () = ignore ((List.fold_left (fun state arg -> (let idx = (get (state) ((String \"i\"))) in let skip = (get (state) ((String \"skip\"))) in (if sx_truthy (skip) then (prim_call \"assoc\" [state; (String \"skip\"); (Bool false); (String \"i\"); (prim_call \"inc\" [idx])]) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (arg)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"inc\" [idx]); (len (raw_args))]))) then (let () = ignore ((sx_dict_set_b kwargs (keyword_name (arg)) (trampoline ((eval_expr ((nth (raw_args) ((prim_call \"inc\" [idx])))) (env)))))) in (prim_call \"assoc\" [state; (String \"skip\"); (Bool true); (String \"i\"); (prim_call \"inc\" [idx])])) else (let () = ignore ((children := sx_append_b !children (trampoline ((eval_expr (arg) (env)))); Nil)) in (prim_call \"assoc\" [state; (String \"i\"); (prim_call \"inc\" [idx])])))))) (let _d = Hashtbl.create 2 in Hashtbl.replace _d (value_to_str (String \"i\")) (Number 0.0); Hashtbl.replace _d (value_to_str (String \"skip\")) (Bool false); Dict _d) (sx_to_list raw_args))) in (List [kwargs; !children])))\n\n(* cond-scheme? *)\nand cond_scheme_p clauses =\n (Bool (List.for_all (fun c -> sx_truthy ((let _and = (prim_call \"=\" [(type_of (c)); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len (c)); (Number 2.0)])))) (sx_to_list clauses)))\n\n(* is-else-clause? *)\nand is_else_clause test =\n (let _or = (let _and = (prim_call \"=\" [(type_of (test)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name (test)); (String \"else\")])) in if sx_truthy _or then _or else (let _and = (prim_call \"=\" [(type_of (test)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _or = (prim_call \"=\" [(symbol_name (test)); (String \"else\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(symbol_name (test)); (String \":else\")]))))\n\n(* sf-named-let *)\nand sf_named_let args env =\n (let loop_name = (symbol_name ((first (args)))) in let bindings = (nth (args) ((Number 1.0))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in let params = ref ((List [])) in let inits = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))); Nil)) in (inits := sx_append_b !inits (nth (binding) ((Number 1.0))); Nil)))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))); Nil)) in (inits := sx_append_b !inits (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))); Nil))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let loop_body = (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (first (body)) else (cons ((make_symbol ((String \"begin\")))) (body))) in let loop_fn = (make_lambda (!params) (loop_body) (env)) in (let () = ignore ((set_lambda_name loop_fn (sx_to_string loop_name))) in (let () = ignore ((env_bind (lambda_closure (loop_fn)) (sx_to_string loop_name) loop_fn)) in (let init_vals = (List (List.map (fun e -> (trampoline ((eval_expr (e) (env))))) (sx_to_list !inits))) in (call_lambda (loop_fn) (init_vals) (env))))))))\n\n(* sf-lambda *)\nand sf_lambda args env =\n (let params_expr = (first (args)) in let body_exprs = (rest (args)) in let body = (if sx_truthy ((prim_call \"=\" [(len (body_exprs)); (Number 1.0)])) then (first (body_exprs)) else (cons ((make_symbol ((String \"begin\")))) (body_exprs))) in let param_names = (List (List.map (fun p -> (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")]))))) then (symbol_name ((first (p)))) else p))) (sx_to_list params_expr))) in (make_lambda (param_names) (body) (env)))\n\n(* sf-defcomp *)\nand sf_defcomp args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (last (args)) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in let param_types = (nth (parsed) ((Number 2.0))) in let affinity = (defcomp_kwarg (args) ((String \"affinity\")) ((String \"auto\"))) in (let comp = (make_component (comp_name) (params) (has_children) (body) (env) (affinity)) in let effects = (defcomp_kwarg (args) ((String \"effects\")) (Nil)) in (let () = ignore ((if sx_truthy ((let _and = (Bool (not (sx_truthy ((is_nil (param_types)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((empty_p ((prim_call \"keys\" [param_types]))))))))) then (component_set_param_types_b (comp) (param_types)) else Nil)) in (let () = ignore ((if sx_truthy ((Bool (not (sx_truthy ((is_nil (effects))))))) then (let effect_list = (if sx_truthy ((prim_call \"=\" [(type_of (effects)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effects))) else (List [(String (sx_str [effects]))])) in let effect_anns = (if sx_truthy ((env_has (env) ((String \"*effect-annotations*\")))) then (env_get (env) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns (symbol_name (name_sym)) effect_list)) in (env_bind env (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) comp)) in comp)))))\n\n(* defcomp-kwarg *)\nand defcomp_kwarg args key default =\n (let end' = (prim_call \"-\" [(len (args)); (Number 1.0)]) in let result' = ref (default) in (let () = ignore ((List.iter (fun i -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((nth (args) (i)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(keyword_name ((nth (args) (i)))); key]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"+\" [i; (Number 1.0)]); end'])))) then (let val' = (nth (args) ((prim_call \"+\" [i; (Number 1.0)]))) in (result' := (if sx_truthy ((prim_call \"=\" [(type_of (val')); (String \"keyword\")])) then (keyword_name (val')) else val'); Nil)) else Nil))) (sx_to_list (prim_call \"range\" [(Number 2.0); end'; (Number 1.0)])); Nil)) in !result'))\n\n(* parse-comp-params *)\nand parse_comp_params params_expr =\n (let params = ref ((List [])) in let param_types = (Dict (Hashtbl.create 0)) in let has_children = ref ((Bool false)) in let in_key = ref ((Bool false)) in (let () = ignore ((List.iter (fun p -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (p)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")])))))) then (let name = (symbol_name ((first (p)))) in let ptype = (nth (p) ((Number 2.0))) in (let type_val = (if sx_truthy ((prim_call \"=\" [(type_of (ptype)); (String \"symbol\")])) then (symbol_name (ptype)) else ptype) in (if sx_truthy ((Bool (not (sx_truthy (!has_children))))) then (let () = ignore ((params := sx_append_b !params name; Nil)) in (sx_dict_set_b param_types name type_val)) else Nil))) else (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (let name = (symbol_name (p)) in (if sx_truthy ((prim_call \"=\" [name; (String \"&key\")])) then (in_key := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&rest\")])) then (has_children := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&children\")])) then (has_children := (Bool true); Nil) else (if sx_truthy (!has_children) then Nil else (if sx_truthy (!in_key) then (params := sx_append_b !params name; Nil) else (params := sx_append_b !params name; Nil))))))) else Nil)))) (sx_to_list params_expr); Nil)) in (List [!params; !has_children; param_types])))\n\n(* sf-defisland *)\nand sf_defisland args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (last (args)) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in (let island = (make_island (comp_name) (params) (has_children) (body) (env)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) island)) in island)))\n\n(* sf-defmacro *)\nand sf_defmacro args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (nth (args) ((Number 2.0))) in let parsed = (parse_macro_params (params_raw)) in let params = (first (parsed)) in let rest_param = (nth (parsed) ((Number 1.0))) in (let mac = (make_macro (params) (rest_param) (body) (env) ((symbol_name (name_sym)))) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) mac)) in mac)))\n\n(* parse-macro-params *)\nand parse_macro_params params_expr =\n (let params = ref ((List [])) in let rest_param = ref (Nil) in (let () = ignore ((List.fold_left (fun state p -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (p)); (String \"&rest\")]))) then (prim_call \"assoc\" [state; (String \"in-rest\"); (Bool true)]) else (if sx_truthy ((get (state) ((String \"in-rest\")))) then (let () = ignore ((rest_param := (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state) else (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state)))) (let _d = Hashtbl.create 1 in Hashtbl.replace _d (value_to_str (String \"in-rest\")) (Bool false); Dict _d) (sx_to_list params_expr))) in (List [!params; !rest_param])))\n\n(* qq-expand *)\nand qq_expand template env =\n (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"=\" [(type_of (template)); (String \"list\")])))))) then template else (if sx_truthy ((empty_p (template))) then (List []) else (let head = (first (template)) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (head)); (String \"unquote\")]))) then (trampoline ((eval_expr ((nth (template) ((Number 1.0)))) (env)))) else (List.fold_left (fun result' item -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (item)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (item)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (item)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name ((first (item)))); (String \"splice-unquote\")]))))) then (let spliced = (trampoline ((eval_expr ((nth (item) ((Number 1.0)))) (env)))) in (if sx_truthy ((prim_call \"=\" [(type_of (spliced)); (String \"list\")])) then (prim_call \"concat\" [result'; spliced]) else (if sx_truthy ((is_nil (spliced))) then result' else (prim_call \"concat\" [result'; (List [spliced])])))) else (prim_call \"concat\" [result'; (List [(qq_expand (item) (env))])]))) (List []) (sx_to_list template))))))\n\n(* sf-letrec *)\nand sf_letrec args env =\n (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in let names = ref ((List [])) in let val_exprs = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs (nth (binding) ((Number 1.0))); Nil)) in (env_bind local (sx_to_string vname) Nil)))))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))) in let val_expr = (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs val_expr; Nil)) in (env_bind local (sx_to_string vname) Nil))))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let () = ignore ((let values = (List (List.map (fun e -> (trampoline ((eval_expr (e) (local))))) (sx_to_list !val_exprs))) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (nth (pair) ((Number 1.0)))))) (sx_to_list (prim_call \"zip\" [!names; values])); Nil)) in (List.iter (fun val' -> ignore ((if sx_truthy ((is_lambda (val'))) then (List.iter (fun n -> ignore ((env_bind (lambda_closure (val')) (sx_to_string n) (env_get (local) (n))))) (sx_to_list !names); Nil) else Nil))) (sx_to_list values); Nil)))) in (let () = ignore ((List.iter (fun e -> ignore ((trampoline ((eval_expr (e) (local)))))) (sx_to_list (prim_call \"slice\" [body; (Number 0.0); (prim_call \"dec\" [(len (body))])])); Nil)) in (make_thunk ((last (body))) (local))))))\n\n(* step-sf-letrec *)\nand step_sf_letrec args env kont =\n (let thk = (sf_letrec (args) (env)) in (make_cek_state ((thunk_expr (thk))) ((thunk_env (thk))) (kont)))\n\n(* sf-dynamic-wind *)\nand sf_dynamic_wind args env =\n (let before = (trampoline ((eval_expr ((first (args))) (env)))) in let body = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let after = (trampoline ((eval_expr ((nth (args) ((Number 2.0)))) (env)))) in (dynamic_wind_call (before) (body) (after) (env)))\n\n(* sf-scope *)\nand sf_scope args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body_exprs = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest) ((Number 1.0)))) (env)))); Nil)) in (body_exprs := (prim_call \"slice\" [rest; (Number 2.0)]); Nil)) else (body_exprs := rest; Nil))) in (let () = ignore ((scope_push (name) (!val'))) in (let result' = ref (Nil) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list !body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))))\n\n(* sf-provide *)\nand sf_provide args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body_exprs = (prim_call \"slice\" [args; (Number 2.0)]) in let result' = ref (Nil) in (let () = ignore ((scope_push (name) (val'))) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))\n\n(* expand-macro *)\nand expand_macro mac raw_args env =\n (let local = (env_merge ((macro_closure (mac))) (env)) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (if sx_truthy ((prim_call \"<\" [(nth (pair) ((Number 1.0))); (len (raw_args))])) then (nth (raw_args) ((nth (pair) ((Number 1.0))))) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [p; i])) (sx_to_list (macro_params (mac)))))); Nil)) in (let () = ignore ((if sx_truthy ((macro_rest_param (mac))) then (env_bind local (sx_to_string (macro_rest_param (mac))) (prim_call \"slice\" [raw_args; (len ((macro_params (mac))))])) else Nil)) in (trampoline ((eval_expr ((macro_body (mac))) (local)))))))\n\n(* cek-run — iterative to avoid OCaml stack overflow in js_of_ocaml/WASM *)\nand cek_run state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n(* cek-step *)\nand cek_step state =\n (if sx_truthy ((prim_call \"=\" [(cek_phase (state)); (String \"eval\")])) then (step_eval (state)) else (step_continue (state)))\n\n(* step-eval *)\nand step_eval state =\n (let expr = (cek_control (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (let _match_val = (type_of (expr)) in (if _match_val = (String \"number\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"string\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"boolean\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"nil\") then (make_cek_value (Nil) (env) (kont)) else (if _match_val = (String \"symbol\") then (let name = (symbol_name (expr)) in (let val' = (if sx_truthy ((env_has (env) (name))) then (env_get (env) (name)) else (if sx_truthy ((is_primitive (name))) then (get_primitive (name)) else (if sx_truthy ((prim_call \"=\" [name; (String \"true\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [name; (String \"false\")])) then (Bool false) else (if sx_truthy ((prim_call \"=\" [name; (String \"nil\")])) then Nil else (raise (Eval_error (value_to_str (String (sx_str [(String \"Undefined symbol: \"); name])))))))))) in (let () = ignore ((if sx_truthy ((let _and = (is_nil (val')) in if not (sx_truthy _and) then _and else (prim_call \"starts-with?\" [name; (String \"~\")]))) then (debug_log ((String \"Component not found:\")) (name)) else Nil)) in (make_cek_value (val') (env) (kont))))) else (if _match_val = (String \"keyword\") then (make_cek_value ((keyword_name (expr))) (env) (kont)) else (if _match_val = (String \"dict\") then (let ks = (prim_call \"keys\" [expr]) in (if sx_truthy ((empty_p (ks))) then (make_cek_value ((Dict (Hashtbl.create 0))) (env) (kont)) else (let first_key = (first (ks)) in let remaining_entries = ref ((List [])) in (let () = ignore ((List.iter (fun k -> ignore ((remaining_entries := sx_append_b !remaining_entries (List [k; (get (expr) (k))]); Nil))) (sx_to_list (rest (ks))); Nil)) in (make_cek_state ((get (expr) (first_key))) (env) ((kont_push ((make_dict_frame (!remaining_entries) ((List [(List [first_key])])) (env))) (kont)))))))) else (if _match_val = (String \"list\") then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (step_eval_list (expr) (env) (kont))) else (make_cek_value (expr) (env) (kont))))))))))))\n\n(* step-eval-list *)\nand step_eval_list expr env kont =\n (let head = (first (expr)) in let args = (rest (expr)) in (if sx_truthy ((Bool (not (sx_truthy ((let _or = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [(type_of (head)); (String \"lambda\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(type_of (head)); (String \"list\")])))))))) then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (make_cek_state ((first (expr))) (env) ((kont_push ((make_map_frame (Nil) ((rest (expr))) ((List [])) (env))) (kont))))) else (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (let name = (symbol_name (head)) in (if sx_truthy ((prim_call \"=\" [name; (String \"if\")])) then (step_sf_if (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"when\")])) then (step_sf_when (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"cond\")])) then (step_sf_cond (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"case\")])) then (step_sf_case (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"and\")])) then (step_sf_and (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"or\")])) then (step_sf_or (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let*\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"lambda\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"fn\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"define\")])) then (step_sf_define (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defcomp\")])) then (make_cek_value ((sf_defcomp (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defisland\")])) then (make_cek_value ((sf_defisland (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defmacro\")])) then (make_cek_value ((sf_defmacro (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"begin\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"do\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quote\")])) then (make_cek_value ((if sx_truthy ((empty_p (args))) then Nil else (first (args)))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quasiquote\")])) then (make_cek_value ((qq_expand ((first (args))) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"->\")])) then (step_sf_thread_first (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"set!\")])) then (step_sf_set_b (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"letrec\")])) then (step_sf_letrec (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reset\")])) then (step_sf_reset (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"shift\")])) then (step_sf_shift (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"deref\")])) then (step_sf_deref (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"scope\")])) then (step_sf_scope (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"provide\")])) then (step_sf_provide (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"context\")])) then (step_sf_context (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emit!\")])) then (step_sf_emit (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emitted\")])) then (step_sf_emitted (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"dynamic-wind\")])) then (make_cek_value ((sf_dynamic_wind (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map\")])) then (step_ho_map (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map-indexed\")])) then (step_ho_map_indexed (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"filter\")])) then (step_ho_filter (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reduce\")])) then (step_ho_reduce (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"some\")])) then (step_ho_some (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"every?\")])) then (step_ho_every (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"for-each\")])) then (step_ho_for_each (args) (env) (kont)) else (if sx_truthy ((prim_call \"has-key?\" [custom_special_forms; name])) then (make_cek_value ((cek_call ((get (custom_special_forms) (name))) (List [args; env]))) (env) (kont)) else (if sx_truthy ((let _and = (env_has (env) (name)) in if not (sx_truthy _and) then _and else (is_macro ((env_get (env) (name)))))) then (let mac = (env_get (env) (name)) in (make_cek_state ((expand_macro (mac) (args) (env))) (env) (kont))) else (if sx_truthy ((let _and = render_check in if not (sx_truthy _and) then _and else (cek_call (render_check) (List [expr; env])))) then (make_cek_value ((cek_call (render_fn) (List [expr; env]))) (env) (kont)) else (step_eval_call (head) (args) (env) (kont))))))))))))))))))))))))))))))))))))))))))) else (step_eval_call (head) (args) (env) (kont)))))\n\n(* step-sf-if *)\nand step_sf_if args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_if_frame ((nth (args) ((Number 1.0)))) ((if sx_truthy ((prim_call \">\" [(len (args)); (Number 2.0)])) then (nth (args) ((Number 2.0))) else Nil)) (env))) (kont))))\n\n(* step-sf-when *)\nand step_sf_when args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_when_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-begin *)\nand step_sf_begin args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [(len (args)); (Number 1.0)])) then (make_cek_state ((first (args))) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_begin_frame ((rest (args))) (env))) (kont))))))\n\n(* step-sf-let *)\nand step_sf_let args env kont =\n let pairs = ref Nil in (if sx_truthy ((prim_call \"=\" [(type_of ((first (args)))); (String \"symbol\")])) then (make_cek_value ((sf_named_let (args) (env))) (env) (kont)) else (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in (if sx_truthy ((empty_p (bindings))) then (step_sf_begin (body) (local) (kont)) else (let first_binding = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (first (bindings)) else (List [(first (bindings)); (nth (bindings) ((Number 1.0)))])) in let rest_bindings = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (rest (bindings)) else (let pairs = ref ((List [])) in (let () = ignore ((List.fold_left (fun _acc i -> (pairs := sx_append_b !pairs (List [(nth (bindings) ((prim_call \"*\" [i; (Number 2.0)]))); (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [i; (Number 2.0)])])))]); Nil)) Nil (sx_to_list (prim_call \"range\" [(Number 1.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])])))) in !pairs))) in (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (first_binding)))); (String \"symbol\")])) then (symbol_name ((first (first_binding)))) else (first (first_binding))) in (make_cek_state ((nth (first_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) (rest_bindings) (body) (local))) (kont)))))))))\n\n(* step-sf-define *)\nand step_sf_define args env kont =\n (let name_sym = (first (args)) in let has_effects = (let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")]))) in let val_idx = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (Number 3.0) else (Number 1.0)) in let effect_list = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (nth (args) ((Number 2.0))) else Nil) in (make_cek_state ((nth (args) (val_idx))) (env) ((kont_push ((make_define_frame ((symbol_name (name_sym))) (env) (has_effects) (effect_list))) (kont)))))\n\n(* step-sf-set! *)\nand step_sf_set_b args env kont =\n (make_cek_state ((nth (args) ((Number 1.0)))) (env) ((kont_push ((make_set_frame ((symbol_name ((first (args))))) (env))) (kont))))\n\n(* step-sf-and *)\nand step_sf_and args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool true)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_and_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-or *)\nand step_sf_or args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool false)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_or_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-cond *)\nand step_sf_cond args env kont =\n (let scheme_p = (cond_scheme_p (args)) in (if sx_truthy (scheme_p) then (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (let clause = (first (args)) in let test = (first (clause)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (clause) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool true)))) (kont))))))) else (if sx_truthy ((prim_call \"<\" [(len (args)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (args)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (args) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool false)))) (kont)))))))))\n\n(* step-sf-case *)\nand step_sf_case args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_case_frame (Nil) ((rest (args))) (env))) (kont))))\n\n(* step-sf-thread-first *)\nand step_sf_thread_first args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_thread_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-lambda *)\nand step_sf_lambda args env kont =\n (make_cek_value ((sf_lambda (args) (env))) (env) (kont))\n\n(* step-sf-scope *)\nand step_sf_scope args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest_args = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest_args)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest_args)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest_args)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest_args) ((Number 1.0)))) (env)))); Nil)) in (body := (prim_call \"slice\" [rest_args; (Number 2.0)]); Nil)) else (body := rest_args; Nil))) in (if sx_truthy ((empty_p (!body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (!body))) (env) ((kont_push ((make_scope_acc_frame (name) (!val') ((rest (!body))) (env))) (kont)))))))\n\n(* step-sf-provide *)\nand step_sf_provide args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (body))) (env) ((kont_push ((make_provide_frame (name) (val') ((rest (body))) (env))) (kont))))))\n\n(* step-sf-context *)\nand step_sf_context args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let default_val = (if sx_truthy ((prim_call \">=\" [(len (args)); (Number 2.0)])) then (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) else Nil) in let frame = (kont_find_provide (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then default_val else (get (frame) ((String \"value\"))))) (env) (kont)))\n\n(* step-sf-emit *)\nand step_sf_emit args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (let () = ignore ((if sx_truthy (frame) then (sx_dict_set_b frame (String \"emitted\") (prim_call \"append\" [(get (frame) ((String \"emitted\"))); (List [val'])])) else Nil)) in (make_cek_value (Nil) (env) (kont))))\n\n(* step-sf-emitted *)\nand step_sf_emitted args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then (List []) else (get (frame) ((String \"emitted\"))))) (env) (kont)))\n\n(* step-sf-reset *)\nand step_sf_reset args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_reset_frame (env))) (kont))))\n\n(* step-sf-shift *)\nand step_sf_shift args env kont =\n (let k_name = (symbol_name ((first (args)))) in let body = (nth (args) ((Number 1.0))) in let captured_result = (kont_capture_to_reset (kont)) in let captured = (first (captured_result)) in let rest_kont = (nth (captured_result) ((Number 1.0))) in (let k = (make_cek_continuation (captured) (rest_kont)) in (let shift_env = (env_extend (env)) in (let () = ignore ((env_bind shift_env (sx_to_string k_name) k)) in (make_cek_state (body) (shift_env) (rest_kont))))))\n\n(* step-sf-deref *)\nand step_sf_deref args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_deref_frame (env))) (kont))))\n\n(* cek-call *)\nand cek_call f args =\n (let a = (if sx_truthy ((is_nil (args))) then (List []) else args) in (if sx_truthy ((is_nil (f))) then Nil else (if sx_truthy ((let _or = (is_lambda (f)) in if sx_truthy _or then _or else (is_callable (f)))) then (cek_run ((continue_with_call (f) (a) ((make_env ())) (a) ((List []))))) else Nil)))\n\n(* reactive-shift-deref *)\nand reactive_shift_deref sig' env kont =\n (let scan_result = (kont_capture_to_reactive_reset (kont)) in let captured_frames = (first (scan_result)) in let reset_frame = (nth (scan_result) ((Number 1.0))) in let remaining_kont = (nth (scan_result) ((Number 2.0))) in let update_fn = (get (reset_frame) ((String \"update-fn\"))) in (let sub_disposers = ref ((List [])) in (let subscriber = (NativeFn (\"\\206\\187\", fun _args -> (fun () -> let sub_disposers = ref Nil in (let () = ignore ((List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil)) in (let () = ignore ((sub_disposers := (List []); Nil)) in (let new_reset = (make_reactive_reset_frame (env) (update_fn) ((Bool false))) in let new_kont = (prim_call \"concat\" [captured_frames; (List [new_reset]); remaining_kont]) in (with_island_scope ((NativeFn (\"\\206\\187\", fun _args -> match _args with [d] -> (fun d -> let sub_disposers = ref Nil in (sub_disposers := sx_append_b !sub_disposers d; Nil)) d | _ -> Nil))) ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (cek_run ((make_cek_value ((signal_value (sig'))) (env) (new_kont))))) ())))))))) ())) in (let () = ignore ((signal_add_sub_b (sig') (subscriber))) in (let () = ignore ((register_in_scope ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (let () = ignore ((signal_remove_sub_b (sig') (subscriber))) in (List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil))) ()))))) in (let initial_kont = (prim_call \"concat\" [captured_frames; (List [reset_frame]); remaining_kont]) in (make_cek_value ((signal_value (sig'))) (env) (initial_kont))))))))\n\n(* step-eval-call *)\nand step_eval_call head args env kont =\n (let hname = (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (symbol_name (head)) else Nil) in (make_cek_state (head) (env) ((kont_push ((make_arg_frame (Nil) ((List [])) (args) (env) (args) (hname))) (kont)))))\n\n(* ho-form-name? *)\nand ho_form_name_p name =\n (let _or = (prim_call \"=\" [name; (String \"map\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"map-indexed\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"filter\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"reduce\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"some\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"every?\")]) in if sx_truthy _or then _or else (prim_call \"=\" [name; (String \"for-each\")])))))))\n\n(* ho-fn? *)\nand ho_fn_p v =\n (let _or = (is_callable (v)) in if sx_truthy _or then _or else (is_lambda (v)))\n\n(* ho-swap-args *)\nand ho_swap_args ho_type evaled =\n (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; (nth (evaled) ((Number 2.0))); a]) else evaled)) else (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; a]) else evaled)))\n\n(* ho-setup-dispatch *)\nand ho_setup_dispatch ho_type evaled env kont =\n (let ordered = (ho_swap_args (ho_type) (evaled)) in (let f = (first (ordered)) in (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_map_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map-indexed\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(Number 0.0); (first (coll))])) (env) ((List [])) ((kont_push ((make_map_indexed_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"filter\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (coll))) ((List [])) ((first (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let init = (nth (ordered) ((Number 1.0))) in let coll = (nth (ordered) ((Number 2.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (init) (env) (kont)) else (continue_with_call (f) ((List [init; (first (coll))])) (env) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"some\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool false)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_some_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"every\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool true)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_every_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"for-each\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (Nil) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (coll))) (env))) (kont)))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown HO type: \"); ho_type]))))))))))))))\n\n(* step-ho-map *)\nand step_ho_map args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-map-indexed *)\nand step_ho_map_indexed args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map-indexed\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-filter *)\nand step_ho_filter args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"filter\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-reduce *)\nand step_ho_reduce args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"reduce\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-some *)\nand step_ho_some args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"some\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-every *)\nand step_ho_every args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"every\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-for-each *)\nand step_ho_for_each args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"for-each\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-continue *)\nand step_continue state =\n (let value = (cek_value (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (if sx_truthy ((kont_empty_p (kont))) then state else (let frame = (kont_top (kont)) in let rest_k = (kont_pop (kont)) in let ft = (frame_type (frame)) in (if sx_truthy ((prim_call \"=\" [ft; (String \"if\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (make_cek_state ((get (frame) ((String \"then\")))) ((get (frame) ((String \"env\")))) (rest_k)) else (if sx_truthy ((is_nil ((get (frame) ((String \"else\")))))) then (make_cek_value (Nil) (env) (rest_k)) else (make_cek_state ((get (frame) ((String \"else\")))) ((get (frame) ((String \"env\")))) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"when\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (let body = (get (frame) ((String \"body\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (make_cek_state ((first (body))) (fenv) (rest_k)) else (make_cek_state ((first (body))) (fenv) ((kont_push ((make_begin_frame ((rest (body))) (fenv))) (rest_k))))))) else (make_cek_value (Nil) (env) (rest_k))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"begin\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then (make_cek_state ((first (remaining))) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_begin_frame ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"let\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let body = (get (frame) ((String \"body\"))) in let local = (get (frame) ((String \"env\"))) in (let () = ignore ((env_bind local (sx_to_string name) value)) in (if sx_truthy ((empty_p (remaining))) then (step_sf_begin (body) (local) (rest_k)) else (let next_binding = (first (remaining)) in let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (next_binding)))); (String \"symbol\")])) then (symbol_name ((first (next_binding)))) else (first (next_binding))) in (make_cek_state ((nth (next_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) ((rest (remaining))) (body) (local))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"define\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in let has_effects = (get (frame) ((String \"has-effects\"))) in let effect_list = (get (frame) ((String \"effect-list\"))) in (let () = ignore ((if sx_truthy ((let _and = (is_lambda (value)) in if not (sx_truthy _and) then _and else (is_nil ((lambda_name (value)))))) then (set_lambda_name value (sx_to_string name)) else Nil)) in (let () = ignore ((env_bind fenv (sx_to_string name) value)) in (let () = ignore ((if sx_truthy (has_effects) then (let effect_names = (if sx_truthy ((prim_call \"=\" [(type_of (effect_list)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effect_list))) else (List [(String (sx_str [effect_list]))])) in let effect_anns = (if sx_truthy ((env_has (fenv) ((String \"*effect-annotations*\")))) then (env_get (fenv) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns name effect_names)) in (env_bind fenv (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (make_cek_value (value) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"set\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in (let () = ignore ((env_set fenv (sx_to_string name) value)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"and\")])) then (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_and_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"or\")])) then (if sx_truthy (value) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_or_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"cond\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let scheme_p = (get (frame) ((String \"scheme\"))) in (if sx_truthy (scheme_p) then (if sx_truthy (value) then (make_cek_state ((nth ((first (remaining))) ((Number 1.0)))) (fenv) (rest_k)) else (let next_clauses = (rest (remaining)) in (if sx_truthy ((empty_p (next_clauses))) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_clause = (first (next_clauses)) in let next_test = (first (next_clause)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next_clause) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next_clauses) (fenv) ((Bool true)))) (rest_k))))))))) else (if sx_truthy (value) then (make_cek_state ((nth (remaining) ((Number 1.0)))) (fenv) (rest_k)) else (let next = (prim_call \"slice\" [remaining; (Number 2.0)]) in (if sx_truthy ((prim_call \"<\" [(len (next)); (Number 2.0)])) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_test = (first (next)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next) (fenv) ((Bool false)))) (rest_k))))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"case\")])) then (let match_val = (get (frame) ((String \"match-val\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((is_nil (match_val))) then (sf_case_step_loop (value) (remaining) (fenv) (rest_k)) else (sf_case_step_loop (match_val) (remaining) (fenv) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"thread\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (let form = (first (remaining)) in let rest_forms = (rest (remaining)) in let new_kont = (if sx_truthy ((empty_p ((rest (remaining))))) then rest_k else (kont_push ((make_thread_frame ((rest (remaining))) (fenv))) (rest_k))) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (form)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((empty_p (form)))))) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (form)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (ho_form_name_p ((symbol_name ((first (form)))))))))) then (make_cek_state ((cons ((first (form))) ((cons ((List [(Symbol \"quote\"); value])) ((rest (form))))))) (fenv) (new_kont)) else (let result' = (if sx_truthy ((prim_call \"=\" [(type_of (form)); (String \"list\")])) then (let f = (trampoline ((eval_expr ((first (form))) (fenv)))) in let rargs = (List (List.map (fun a -> (trampoline ((eval_expr (a) (fenv))))) (sx_to_list (rest (form))))) in let all_args = (cons (value) (rargs)) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (sx_apply f all_args) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) (all_args) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))])))))))) else (let f = (trampoline ((eval_expr (form) (fenv)))) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (cek_call (f) (List [value])) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) ((List [value])) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))]))))))))) in (if sx_truthy ((empty_p (rest_forms))) then (make_cek_value (result') (fenv) (rest_k)) else (make_cek_value (result') (fenv) ((kont_push ((make_thread_frame (rest_forms) (fenv))) (rest_k)))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"arg\")])) then (let f = (get (frame) ((String \"f\"))) in let evaled = (get (frame) ((String \"evaled\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let raw_args = (get (frame) ((String \"raw-args\"))) in let hname = (get (frame) ((String \"head-name\"))) in (if sx_truthy ((is_nil (f))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) ((List []))) else Nil)) in (if sx_truthy ((empty_p (remaining))) then (continue_with_call (value) ((List [])) (fenv) (raw_args) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (value) ((List [])) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))) else (let new_evaled = (prim_call \"append\" [evaled; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) (new_evaled)) else Nil)) in (continue_with_call (f) (new_evaled) (fenv) (raw_args) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (f) (new_evaled) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"dict\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let fenv = (get (frame) ((String \"env\"))) in (let last_result = (last (results)) in let completed = (prim_call \"append\" [(prim_call \"slice\" [results; (Number 0.0); (prim_call \"dec\" [(len (results))])]); (List [(List [(first (last_result)); value])])]) in (if sx_truthy ((empty_p (remaining))) then (let d = (Dict (Hashtbl.create 0)) in (let () = ignore ((List.iter (fun pair -> ignore ((sx_dict_set_b d (first (pair)) (nth (pair) ((Number 1.0)))))) (sx_to_list completed); Nil)) in (make_cek_value (d) (fenv) (rest_k)))) else (let next_entry = (first (remaining)) in (make_cek_state ((nth (next_entry) ((Number 1.0)))) (fenv) ((kont_push ((make_dict_frame ((rest (remaining))) ((prim_call \"append\" [completed; (List [(List [(first (next_entry))])])])) (fenv))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"ho-setup\")])) then (let ho_type = (get (frame) ((String \"ho-type\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let evaled = (prim_call \"append\" [(get (frame) ((String \"evaled\"))); (List [value])]) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (ho_setup_dispatch (ho_type) (evaled) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_ho_setup_frame (ho_type) ((rest (remaining))) (evaled) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reset\")])) then (make_cek_value (value) (env) (rest_k)) else (if sx_truthy ((prim_call \"=\" [ft; (String \"deref\")])) then (let val' = value in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy ((is_signal (val'))))))) then (make_cek_value (val') (fenv) (rest_k)) else (if sx_truthy ((has_reactive_reset_frame_p (rest_k))) then (reactive_shift_deref (val') (fenv) (rest_k)) else (let () = ignore ((let ctx = (sx_context ((String \"sx-reactive\")) (Nil)) in (if sx_truthy (ctx) then (let dep_list = ref ((get (ctx) ((String \"deps\")))) in let notify_fn = (get (ctx) ((String \"notify\"))) in (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"contains?\" [!dep_list; val'])))))) then (let () = ignore ((dep_list := sx_append_b !dep_list val'; Nil)) in (signal_add_sub_b (val') (notify_fn))) else Nil)) else Nil))) in (make_cek_value ((signal_value (val'))) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reactive-reset\")])) then (let update_fn = (get (frame) ((String \"update-fn\"))) in let first_p = (get (frame) ((String \"first-render\"))) in (let () = ignore ((if sx_truthy ((let _and = update_fn in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy (first_p)))))) then (cek_call (update_fn) ((List [value]))) else Nil)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((scope_pop (name))) in (make_cek_value (value) (fenv) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_scope_frame (name) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"provide\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_provide_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope-acc\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((let new_frame = (make_scope_acc_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv)) in (let () = ignore ((sx_dict_set_b new_frame (String \"emitted\") (get (frame) ((String \"emitted\"))))) in new_frame))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"map\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let indexed = (get (frame) ((String \"indexed\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (prim_call \"append\" [results; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (let call_args = (if sx_truthy (indexed) then (List [(len (new_results)); (first (remaining))]) else (List [(first (remaining))])) in let next_frame = (if sx_truthy (indexed) then (make_map_indexed_frame (f) ((rest (remaining))) (new_results) (fenv)) else (make_map_frame (f) ((rest (remaining))) (new_results) (fenv))) in (continue_with_call (f) (call_args) (fenv) ((List [])) ((kont_push (next_frame) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"filter\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let current_item = (get (frame) ((String \"current-item\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (if sx_truthy (value) then (prim_call \"append\" [results; (List [current_item])]) else results) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (remaining))) (new_results) ((first (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reduce\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (continue_with_call (f) ((List [value; (first (remaining))])) (fenv) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"for-each\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (Nil) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"some\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy (value) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_some_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"every\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool true)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_every_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown frame type: \"); ft]))))))))))))))))))))))))))))))))))\n\n(* continue-with-call *)\nand continue_with_call f args env raw_args kont =\n (if sx_truthy ((continuation_p (f))) then (let arg = (if sx_truthy ((empty_p (args))) then Nil else (first (args))) in let cont_data = (continuation_data (f)) in (let captured = (get (cont_data) ((String \"captured\"))) in (let result' = (cek_run ((make_cek_value (arg) (env) (captured)))) in (make_cek_value (result') (env) (kont))))) else (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_lambda (f)))))) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_component (f)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_island (f)))))))))) then (make_cek_value ((sx_apply f args)) (env) (kont)) else (if sx_truthy ((is_lambda (f))) then (let params = (lambda_params (f)) in let local = (env_merge ((lambda_closure (f))) (env)) in (if sx_truthy ((prim_call \">\" [(len (args)); (len (params))])) then (raise (Eval_error (value_to_str (String (sx_str [(let _or = (lambda_name (f)) in if sx_truthy _or then _or else (String \"lambda\")); (String \" expects \"); (len (params)); (String \" args, got \"); (len (args))]))))) else (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (nth (pair) ((Number 1.0)))))) (sx_to_list (prim_call \"zip\" [params; args])); Nil)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) Nil))) (sx_to_list (prim_call \"slice\" [params; (len (args))])); Nil)) in (match !jit_call_hook, f with | Some hook, Lambda l when l.l_name <> None -> let args_list = match args with List a | ListRef { contents = a } -> a | _ -> [] in (match hook f args_list with Some result -> make_cek_value result local kont | None -> make_cek_state (lambda_body f) local kont) | _ -> make_cek_state ((lambda_body (f))) (local) (kont)))))) else (if sx_truthy ((let _or = (is_component (f)) in if sx_truthy _or then _or else (is_island (f)))) then (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (f))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (f))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (f))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_cek_state ((component_body (f))) (local) (kont))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Not callable: \"); (inspect (f))])))))))))\n\n(* sf-case-step-loop *)\nand sf_case_step_loop match_val clauses env kont =\n (if sx_truthy ((prim_call \"<\" [(len (clauses)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (clauses)) in let body = (nth (clauses) ((Number 1.0))) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state (body) (env) (kont)) else (let test_val = (trampoline ((eval_expr (test) (env)))) in (if sx_truthy ((prim_call \"=\" [match_val; test_val])) then (make_cek_state (body) (env) (kont)) else (sf_case_step_loop (match_val) ((prim_call \"slice\" [clauses; (Number 2.0)])) (env) (kont)))))))\n\n(* eval-expr-cek *)\nand eval_expr_cek expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n(* trampoline-cek *)\nand trampoline_cek val' =\n (if sx_truthy ((is_thunk (val'))) then (eval_expr_cek ((thunk_expr (val'))) ((thunk_env (val')))) else val')\n\n(* eval-expr *)\nand eval_expr expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n\n(* Wire up trampoline to resolve thunks via the CEK machine *)\nlet () = trampoline_fn := (fun v ->\n match v with\n | Thunk (expr, env) -> eval_expr expr (Env env)\n | _ -> v)\n\n(* Wire up the primitives trampoline so call_any in HO forms resolves Thunks *)\nlet () = Sx_primitives._sx_trampoline_fn := !trampoline_fn\n\n(* Override recursive cek_run with iterative loop *)\nlet cek_run_iterative state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":184469},"map":{"version":3,"sources":["/workspace_root/lib/sx_vm.ml","/builtin/blackbox.ml"],"sourcesContent":["(** SX bytecode VM — stack-based interpreter.\n\n Executes bytecode produced by compiler.sx.\n Designed for speed: array-based stack, direct dispatch,\n no allocation per step (unlike the CEK machine).\n\n This is the platform-native execution engine. The same bytecode\n runs on all platforms (OCaml, JS, WASM).\n\n VM types (vm_code, vm_upvalue_cell, vm_closure) are defined in\n sx_types.ml to share the mutual recursion block with [value]. *)\n\nopen Sx_types\n\n(** Call frame — one per function invocation. *)\ntype frame = {\n closure : vm_closure;\n mutable ip : int;\n base : int; (* base index in value stack for locals *)\n local_cells : (int, vm_upvalue_cell) Hashtbl.t; (* slot → shared cell for captured locals *)\n}\n\n(** VM state. *)\ntype vm = {\n mutable stack : value array;\n mutable sp : int;\n mutable frames : frame list;\n globals : (string, value) Hashtbl.t; (* live reference to kernel env *)\n}\n\n(** Forward reference for JIT compilation — set after definition. *)\nlet jit_compile_ref : (lambda -> (string, value) Hashtbl.t -> vm_closure option) ref =\n ref (fun _ _ -> None)\n\n(** Sentinel closure indicating JIT compilation was attempted and failed.\n Prevents retrying compilation on every call. *)\nlet jit_failed_sentinel = {\n vm_code = { vc_arity = -1; vc_locals = 0; vc_bytecode = [||]; vc_constants = [||] };\n vm_upvalues = [||]; vm_name = Some \"__jit_failed__\"; vm_env_ref = Hashtbl.create 0; vm_closure_env = None\n}\n\nlet is_jit_failed cl = cl.vm_code.vc_arity = -1\n\nlet create globals =\n { stack = Array.make 4096 Nil; sp = 0; frames = []; globals }\n\n(** Stack ops — inlined for speed. *)\nlet push vm v =\n if vm.sp >= Array.length vm.stack then begin\n let ns = Array.make (vm.sp * 2) Nil in\n Array.blit vm.stack 0 ns 0 vm.sp;\n vm.stack <- ns\n end;\n vm.stack.(vm.sp) <- v;\n vm.sp <- vm.sp + 1\n\nlet[@inline] pop vm =\n vm.sp <- vm.sp - 1;\n vm.stack.(vm.sp)\n\nlet[@inline] peek vm = vm.stack.(vm.sp - 1)\n\n(** Read operands. *)\nlet[@inline] read_u8 f =\n let v = f.closure.vm_code.vc_bytecode.(f.ip) in\n f.ip <- f.ip + 1; v\n\nlet[@inline] read_u16 f =\n let lo = f.closure.vm_code.vc_bytecode.(f.ip) in\n let hi = f.closure.vm_code.vc_bytecode.(f.ip + 1) in\n f.ip <- f.ip + 2;\n lo lor (hi lsl 8)\n\nlet[@inline] read_i16 f =\n let v = read_u16 f in\n if v >= 32768 then v - 65536 else v\n\n(** Wrap a VM closure as an SX value (NativeFn). *)\nlet closure_to_value cl =\n NativeFn (\"vm:\" ^ (match cl.vm_name with Some n -> n | None -> \"anon\"),\n fun args -> raise (Eval_error (\"VM_CLOSURE_CALL:\" ^ String.concat \",\" (List.map Sx_runtime.value_to_str args))))\n (* Placeholder — actual calls go through vm_call below *)\n\nlet _vm_insn_count = ref 0\nlet _vm_call_count = ref 0\nlet _vm_cek_count = ref 0\nlet vm_reset_counters () = _vm_insn_count := 0; _vm_call_count := 0; _vm_cek_count := 0\nlet vm_report_counters () =\n Printf.eprintf \"[vm-perf] insns=%d calls=%d cek_fallbacks=%d\\n%!\"\n !_vm_insn_count !_vm_call_count !_vm_cek_count\n\n(** Push a VM closure frame onto the current VM — no new VM allocation.\n This is the fast path for intra-VM closure calls. *)\nlet push_closure_frame vm cl args =\n let frame = { closure = cl; ip = 0; base = vm.sp; local_cells = Hashtbl.create 4 } in\n List.iter (fun a -> push vm a) args;\n for _ = List.length args to cl.vm_code.vc_locals - 1 do push vm Nil done;\n vm.frames <- frame :: vm.frames\n\n(** Convert compiler output (SX dict) to a vm_code object. *)\nlet code_from_value v =\n match v with\n | Dict d ->\n let bc_list = match Hashtbl.find_opt d \"bytecode\" with\n | Some (List l | ListRef { contents = l }) ->\n Array.of_list (List.map (fun x -> match x with Number n -> int_of_float n | _ -> 0) l)\n | _ -> [||]\n in\n let entries = match Hashtbl.find_opt d \"constants\" with\n | Some (List l | ListRef { contents = l }) -> Array.of_list l\n | _ -> [||]\n in\n let constants = Array.map (fun entry ->\n match entry with\n | Dict ed when Hashtbl.mem ed \"bytecode\" -> entry (* nested code — convert lazily *)\n | _ -> entry\n ) entries in\n let arity = match Hashtbl.find_opt d \"arity\" with\n | Some (Number n) -> int_of_float n | _ -> 0\n in\n { vc_arity = arity; vc_locals = arity + 16; vc_bytecode = bc_list; vc_constants = constants }\n | _ -> { vc_arity = 0; vc_locals = 16; vc_bytecode = [||]; vc_constants = [||] }\n\n(** Execute a closure with arguments — creates a fresh VM.\n Used for entry points: JIT Lambda calls, module execution, cross-boundary. *)\nlet rec call_closure cl args globals =\n incr _vm_call_count;\n let vm = create globals in\n push_closure_frame vm cl args;\n (try run vm with e -> raise e);\n pop vm\n\n(** Call a value as a function — dispatch by type.\n VmClosure: pushes frame on current VM (fast intra-VM path).\n Lambda: tries JIT then falls back to CEK.\n NativeFn: calls directly. *)\nand vm_call vm f args =\n match f with\n | VmClosure cl ->\n (* Fast path: push frame on current VM — no allocation, enables TCO *)\n push_closure_frame vm cl args\n | NativeFn (_name, fn) ->\n let result = fn args in\n push vm result\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (is_jit_failed cl) ->\n (* Cached bytecode — run on VM, fall back to CEK on runtime error *)\n (try push vm (call_closure cl args vm.globals)\n with _ -> push vm (Sx_ref.cek_call f (List args)))\n | Some _ ->\n (* Compile failed — CEK *)\n push vm (Sx_ref.cek_call f (List args))\n | None ->\n if l.l_name <> None\n then begin\n (* Pre-mark before compile attempt to prevent re-entrancy *)\n l.l_compiled <- Some jit_failed_sentinel;\n match !jit_compile_ref l vm.globals with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try push vm (call_closure cl args vm.globals)\n with _ ->\n l.l_compiled <- Some jit_failed_sentinel;\n push vm (Sx_ref.cek_call f (List args)))\n | None ->\n push vm (Sx_ref.cek_call f (List args))\n end\n else\n push vm (Sx_ref.cek_call f (List args)))\n | Component _ | Island _ ->\n (* Components use keyword-arg parsing — CEK handles this *)\n incr _vm_cek_count;\n let result = Sx_ref.cek_call f (List args) in\n push vm result\n | _ ->\n raise (Eval_error (\"VM: not callable: \" ^ Sx_runtime.value_to_str f))\n\n(** Main execution loop — iterative (no OCaml stack growth).\n VmClosure calls push frames; the loop picks them up.\n OP_TAIL_CALL + VmClosure = true TCO: drop frame, push new, loop. *)\nand run vm =\n while vm.frames <> [] do\n match vm.frames with\n | [] -> () (* guard handled by while condition *)\n | frame :: rest_frames ->\n let bc = frame.closure.vm_code.vc_bytecode in\n let consts = frame.closure.vm_code.vc_constants in\n if frame.ip >= Array.length bc then\n vm.frames <- [] (* bytecode exhausted — stop *)\n else begin\n let saved_ip = frame.ip in\n let op = bc.(frame.ip) in\n frame.ip <- frame.ip + 1;\n (try match op with\n (* ---- Constants ---- *)\n | 1 (* OP_CONST *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CONST index %d out of bounds (pool size %d)\"\n idx (Array.length consts)));\n push vm consts.(idx)\n | 2 (* OP_NIL *) -> push vm Nil\n | 3 (* OP_TRUE *) -> push vm (Bool true)\n | 4 (* OP_FALSE *) -> push vm (Bool false)\n | 5 (* OP_POP *) -> ignore (pop vm)\n | 6 (* OP_DUP *) -> push vm (peek vm)\n\n (* ---- Variable access ---- *)\n | 16 (* OP_LOCAL_GET *) ->\n let slot = read_u8 frame in\n let v = match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value\n | None ->\n let idx = frame.base + slot in\n if idx >= vm.sp then\n raise (Eval_error (Printf.sprintf\n \"VM: LOCAL_GET slot=%d base=%d sp=%d out of bounds\" slot frame.base vm.sp));\n vm.stack.(idx)\n in\n push vm v\n | 17 (* OP_LOCAL_SET *) ->\n let slot = read_u8 frame in\n let v = peek vm in\n (* Write to shared cell if captured, else to stack *)\n (match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value <- v\n | None -> vm.stack.(frame.base + slot) <- v)\n | 18 (* OP_UPVALUE_GET *) ->\n let idx = read_u8 frame in\n if idx >= Array.length frame.closure.vm_upvalues then\n raise (Eval_error (Printf.sprintf\n \"VM: UPVALUE_GET idx=%d out of bounds (have %d)\" idx\n (Array.length frame.closure.vm_upvalues)));\n push vm frame.closure.vm_upvalues.(idx).uv_value\n | 19 (* OP_UPVALUE_SET *) ->\n let idx = read_u8 frame in\n frame.closure.vm_upvalues.(idx).uv_value <- peek vm\n | 20 (* OP_GLOBAL_GET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = try Hashtbl.find vm.globals name with Not_found ->\n (* Walk the closure env chain for inner functions *)\n let rec env_lookup e =\n try Hashtbl.find e.bindings name\n with Not_found ->\n match e.parent with Some p -> env_lookup p | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n match frame.closure.vm_closure_env with\n | Some env -> env_lookup env\n | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n push vm v\n | 21 (* OP_GLOBAL_SET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n (* Write to closure env if the name exists there (mutable closure vars) *)\n let written = match frame.closure.vm_closure_env with\n | Some env ->\n let rec find_env e =\n if Hashtbl.mem e.bindings name then\n (Hashtbl.replace e.bindings name (peek vm); true)\n else match e.parent with Some p -> find_env p | None -> false\n in find_env env\n | None -> false\n in\n if not written then Hashtbl.replace vm.globals name (peek vm)\n\n (* ---- Control flow ---- *)\n | 32 (* OP_JUMP *) ->\n let offset = read_i16 frame in\n frame.ip <- frame.ip + offset\n | 33 (* OP_JUMP_IF_FALSE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if not (sx_truthy v) then frame.ip <- frame.ip + offset\n | 34 (* OP_JUMP_IF_TRUE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if sx_truthy v then frame.ip <- frame.ip + offset\n\n (* ---- Function calls ---- *)\n | 48 (* OP_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n vm_call vm f args_list\n (* Loop continues — if VmClosure, new frame runs next iteration *)\n | 49 (* OP_TAIL_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n (* Drop current frame, reuse stack space — true TCO for VmClosure *)\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n vm_call vm f args_list\n | 50 (* OP_RETURN *) ->\n let result = pop vm in\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n push vm result\n (* Loop continues with caller frame *)\n | 51 (* OP_CLOSURE *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CLOSURE idx %d >= consts %d\" idx (Array.length consts)));\n let code_val = consts.(idx) in\n let code = code_from_value code_val in\n (* Read upvalue descriptors from bytecode *)\n let uv_count = match code_val with\n | Dict d -> (match Hashtbl.find_opt d \"upvalue-count\" with\n | Some (Number n) -> int_of_float n | _ -> 0)\n | _ -> 0\n in\n let upvalues = Array.init uv_count (fun _ ->\n let is_local = read_u8 frame in\n let index = read_u8 frame in\n if is_local = 1 then begin\n (* Capture from enclosing frame's local slot.\n Create a shared cell — both parent and closure\n read/write through this cell. *)\n let cell = match Hashtbl.find_opt frame.local_cells index with\n | Some existing -> existing (* reuse existing cell *)\n | None ->\n let c = { uv_value = vm.stack.(frame.base + index) } in\n Hashtbl.replace frame.local_cells index c;\n c\n in\n cell\n end else\n (* Capture from enclosing frame's upvalue — already a shared cell *)\n frame.closure.vm_upvalues.(index)\n ) in\n let cl = { vm_code = code; vm_upvalues = upvalues; vm_name = None;\n vm_env_ref = vm.globals; vm_closure_env = None } in\n push vm (VmClosure cl)\n | 52 (* OP_CALL_PRIM *) ->\n let idx = read_u16 frame in\n let argc = read_u8 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let args = List.init argc (fun _ -> pop vm) |> List.rev in\n (* Resolve thunks — the CEK evaluator does this automatically\n via trampoline, but the VM must do it explicitly before\n passing args to primitives. *)\n let args = List.map (fun v ->\n match v with\n | Thunk _ -> !Sx_primitives._sx_trampoline_fn v\n | _ -> v) args in\n let result =\n try\n (* Check primitives FIRST (native implementations of map/filter/etc.),\n then globals (which may have ho_via_cek wrappers that route\n through the CEK — these can't call VM closures). *)\n let fn_val = try Sx_primitives.get_primitive name with _ ->\n try Hashtbl.find vm.globals name with Not_found ->\n raise (Eval_error (\"VM: unknown primitive \" ^ name))\n in\n (match fn_val with\n | NativeFn (_, fn) -> fn args\n | _ -> Nil)\n with Eval_error msg ->\n raise (Eval_error (Printf.sprintf \"%s (in CALL_PRIM \\\"%s\\\" with %d args)\"\n msg name argc))\n in\n push vm result\n\n (* ---- Collections ---- *)\n | 64 (* OP_LIST *) ->\n let count = read_u16 frame in\n let items = List.init count (fun _ -> pop vm) |> List.rev in\n push vm (List items)\n | 65 (* OP_DICT *) ->\n let count = read_u16 frame in\n let d = Hashtbl.create count in\n for _ = 1 to count do\n let v = pop vm in\n let k = pop vm in\n let key = match k with String s -> s | Keyword s -> s | _ -> Sx_runtime.value_to_str k in\n Hashtbl.replace d key v\n done;\n push vm (Dict d)\n\n (* ---- String ops ---- *)\n | 144 (* OP_STR_CONCAT *) ->\n let count = read_u8 frame in\n let parts = List.init count (fun _ -> pop vm) |> List.rev in\n let s = String.concat \"\" (List.map Sx_runtime.value_to_str parts) in\n push vm (String s)\n\n (* ---- Define ---- *)\n | 128 (* OP_DEFINE *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = peek vm in\n Hashtbl.replace vm.globals name v\n\n (* ---- Inline primitives ----\n Fast path for common types; fallback to actual primitive\n for edge cases (type coercion, thunks, RawHTML, etc.)\n to guarantee behavioral parity with CALL_PRIM. *)\n | 160 (* OP_ADD *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x +. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"+\") [a; b])\n | 161 (* OP_SUB *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x -. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [a; b])\n | 162 (* OP_MUL *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x *. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"*\") [a; b])\n | 163 (* OP_DIV *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x /. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"/\") [a; b])\n | 164 (* OP_EQ *) ->\n let b = pop vm and a = pop vm in\n let rec norm = function\n | ListRef { contents = l } -> List (List.map norm l)\n | List l -> List (List.map norm l) | v -> v in\n push vm (Bool (norm a = norm b))\n | 165 (* OP_LT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x < y)\n | String x, String y -> Bool (x < y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"<\") [a; b])\n | 166 (* OP_GT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x > y)\n | String x, String y -> Bool (x > y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \">\") [a; b])\n | 167 (* OP_NOT *) ->\n let v = pop vm in\n push vm (Bool (not (sx_truthy v)))\n | 168 (* OP_LEN *) ->\n let v = pop vm in\n push vm (match v with\n | List l | ListRef { contents = l } -> Number (float_of_int (List.length l))\n | String s -> Number (float_of_int (String.length s))\n | Dict d -> Number (float_of_int (Hashtbl.length d))\n | Nil -> Number 0.0\n | _ -> (Hashtbl.find Sx_primitives.primitives \"len\") [v])\n | 169 (* OP_FIRST *) ->\n let v = pop vm in\n push vm (match v with\n | List (x :: _) | ListRef { contents = x :: _ } -> x\n | List [] | ListRef { contents = [] } | Nil -> Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"first\") [v])\n | 170 (* OP_REST *) ->\n let v = pop vm in\n push vm (match v with\n | List (_ :: xs) | ListRef { contents = _ :: xs } -> List xs\n | List [] | ListRef { contents = [] } | Nil -> List []\n | _ -> (Hashtbl.find Sx_primitives.primitives \"rest\") [v])\n | 171 (* OP_NTH *) ->\n let n = pop vm and coll = pop vm in\n push vm (match coll, n with\n | (List l | ListRef { contents = l }), Number f ->\n (try List.nth l (int_of_float f) with _ -> Nil)\n | String s, Number f ->\n let i = int_of_float f in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"nth\") [coll; n])\n | 172 (* OP_CONS *) ->\n let coll = pop vm and x = pop vm in\n push vm (match coll with\n | List l -> List (x :: l)\n | ListRef { contents = l } -> List (x :: l)\n | Nil -> List [x]\n | _ -> (Hashtbl.find Sx_primitives.primitives \"cons\") [x; coll])\n | 173 (* OP_NEG *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (-.x)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [v])\n | 174 (* OP_INC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x +. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"inc\") [v])\n | 175 (* OP_DEC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x -. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"dec\") [v])\n\n | opcode ->\n raise (Eval_error (Printf.sprintf \"VM: unknown opcode %d at ip=%d\"\n opcode (frame.ip - 1)))\n with Invalid_argument msg ->\n let fn_name = match frame.closure.vm_name with Some n -> n | None -> \"?\" in\n raise (Eval_error (Printf.sprintf\n \"VM: %s at ip=%d op=%d in %s (base=%d sp=%d bc_len=%d consts=%d)\"\n msg saved_ip op fn_name frame.base vm.sp\n (Array.length bc) (Array.length consts))))\n end\n done\n\n(** Execute a compiled module (top-level bytecode). *)\nlet execute_module code globals =\n let cl = { vm_code = code; vm_upvalues = [||]; vm_name = Some \"module\"; vm_env_ref = globals; vm_closure_env = None } in\n let vm = create globals in\n let frame = { closure = cl; ip = 0; base = 0; local_cells = Hashtbl.create 4 } in\n for _ = 0 to code.vc_locals - 1 do push vm Nil done;\n vm.frames <- [frame];\n run vm;\n pop vm\n\n\n(** {1 Lazy JIT compilation} *)\n\n(** Compile a lambda or component body to bytecode using the SX compiler.\n Invokes [compile] from spec/compiler.sx via the CEK machine.\n Returns a [vm_closure] ready for execution, or [None] on failure\n (safe fallback to CEK interpretation).\n\n The compilation cost is a single CEK evaluation of the compiler —\n microseconds per function. The result is cached in the lambda/component\n record so subsequent calls go straight to the VM. *)\nlet jit_compile_lambda (l : lambda) globals =\n let fn_name = match l.l_name with Some n -> n | None -> \"\" in\n try\n let compile_fn = try Hashtbl.find globals \"compile\"\n with Not_found -> raise (Eval_error \"JIT: compiler not loaded\") in\n (* Reconstruct the (fn (params) body) form so the compiler produces\n a proper closure. l.l_body is the inner body; we need the full\n function form with params so the compiled code binds them. *)\n let param_syms = List (List.map (fun s -> Symbol s) l.l_params) in\n let fn_expr = List [Symbol \"fn\"; param_syms; l.l_body] in\n let quoted = List [Symbol \"quote\"; fn_expr] in\n let result = Sx_ref.eval_expr (List [compile_fn; quoted]) (Env (make_env ())) in\n (* If the lambda has closure-captured variables, merge them into globals\n so the VM can find them via GLOBAL_GET. The compiler doesn't know\n about the enclosing scope, so closure vars get compiled as globals. *)\n let effective_globals =\n let closure = l.l_closure in\n if Hashtbl.length closure.bindings = 0 && closure.parent = None then\n globals (* no closure vars — use globals directly *)\n else begin\n (* Merge: closure bindings layered on top of globals.\n Use a shallow copy so we don't pollute the real globals. *)\n let merged = Hashtbl.copy globals in\n let rec inject env =\n Hashtbl.iter (fun k v -> Hashtbl.replace merged k v) env.bindings;\n match env.parent with Some p -> inject p | None -> ()\n in\n inject closure;\n let n = Hashtbl.length merged - Hashtbl.length globals in\n if n > 0 then\n Printf.eprintf \"[jit] %s: injected %d closure bindings\\n%!\" fn_name n;\n merged\n end\n in\n (match result with\n | Dict d when Hashtbl.mem d \"bytecode\" ->\n let outer_code = code_from_value result in\n let bc = outer_code.vc_bytecode in\n if Array.length bc >= 4 && bc.(0) = 51 (* OP_CLOSURE *) then begin\n let idx = bc.(1) lor (bc.(2) lsl 8) in\n if idx < Array.length outer_code.vc_constants then\n let inner_val = outer_code.vc_constants.(idx) in\n let code = code_from_value inner_val in\n Some { vm_code = code; vm_upvalues = [||];\n vm_name = l.l_name; vm_env_ref = effective_globals; vm_closure_env = Some l.l_closure }\n else begin\n Printf.eprintf \"[jit] FAIL %s: closure index %d out of bounds (pool=%d)\\n%!\"\n fn_name idx (Array.length outer_code.vc_constants);\n\n None\n end\n end else begin\n (* Not a closure — constant expression, alias, or simple computation.\n Execute the bytecode as a module to get the value, then wrap\n as a NativeFn if it's callable (so the CEK can dispatch to it). *)\n (try\n let value = execute_module outer_code globals in\n Printf.eprintf \"[jit] RESOLVED %s: %s (bc[0]=%d)\\n%!\"\n fn_name (type_of value) (if Array.length bc > 0 then bc.(0) else -1);\n (* If the resolved value is a NativeFn, we can't wrap it as a\n vm_closure — just let the CEK handle it directly. Return None\n so the lambda falls through to CEK, which will find the\n resolved value in the env on next lookup. *)\n None\n with _ ->\n Printf.eprintf \"[jit] SKIP %s: non-closure execution failed (bc[0]=%d, len=%d)\\n%!\"\n fn_name (if Array.length bc > 0 then bc.(0) else -1) (Array.length bc);\n None)\n end\n | _ ->\n Printf.eprintf \"[jit] FAIL %s: compiler returned %s\\n%!\" fn_name (type_of result);\n None)\n with e ->\n Printf.eprintf \"[jit] FAIL %s: %s\\n%!\" fn_name (Printexc.to_string e);\n None\n\n(* Wire up forward references *)\nlet () = jit_compile_ref := jit_compile_lambda\nlet () = _vm_call_closure_ref := (fun cl args -> call_closure cl args cl.vm_env_ref)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":199542},"map":{"version":3,"sources":["/workspace_root/lib/sx_scope.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Scope stacks — dynamic scope for render-time effects.\n\n Provides scope-push!/pop!/peek, collect!/collected/clear-collected!,\n scope-emit!/emitted/scope-emitted, context, and cookie access.\n\n All functions are registered as primitives so both the CEK evaluator\n and the JIT VM can find them in the same place. *)\n\nopen Sx_types\n\n(** The shared scope stacks hashtable. Each key maps to a stack of values.\n Used by aser for spread/provide/emit patterns, CSSX collect/flush, etc. *)\nlet scope_stacks : (string, value list) Hashtbl.t = Hashtbl.create 8\n\n(** Request cookies — set by the Python bridge before each render.\n get-cookie reads from here; set-cookie is a no-op on the server. *)\nlet request_cookies : (string, string) Hashtbl.t = Hashtbl.create 8\n\n(** Clear all scope stacks. Called between requests if needed. *)\nlet clear_all () = Hashtbl.clear scope_stacks\n\nlet () =\n let register = Sx_primitives.register in\n\n (* --- Cookies --- *)\n\n register \"get-cookie\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt request_cookies name with\n | Some v -> String v\n | None -> Nil)\n | _ -> Nil);\n\n register \"set-cookie\" (fun _args -> Nil);\n\n (* --- Core scope stack operations --- *)\n\n register \"scope-push!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n Hashtbl.replace scope_stacks name (value :: stack); Nil\n | _ -> Nil);\n\n register \"scope-pop!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with _ :: rest -> Hashtbl.replace scope_stacks name rest | [] -> ()); Nil\n | _ -> Nil);\n\n register \"scope-peek\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with v :: _ -> v | [] -> Nil)\n | _ -> Nil);\n\n (* --- Context (scope lookup with optional default) --- *)\n\n register \"context\" (fun args ->\n match args with\n | [String name] | [String name; _] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack, args with\n | v :: _, _ -> v\n | [], [_; default_val] -> default_val\n | [], _ -> Nil)\n | _ -> Nil);\n\n (* --- Collect / collected / clear-collected! --- *)\n\n register \"collect!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n if not (List.mem value items) then\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"collected\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"clear-collected!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | _ :: rest -> Hashtbl.replace scope_stacks name (List [] :: rest)\n | [] -> Hashtbl.replace scope_stacks name [List []]);\n Nil\n | _ -> Nil);\n\n (* --- Emit / emitted (for spread attrs in adapter-html.sx) --- *)\n\n register \"scope-emit!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | Nil :: rest ->\n Hashtbl.replace scope_stacks name (List [value] :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"emit!\" (fun args ->\n (* Alias for scope-emit! *)\n match Sx_primitives.get_primitive \"scope-emit!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"emitted\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"scope-emitted\" (fun args ->\n match Sx_primitives.get_primitive \"emitted\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-collected\" (fun args ->\n match Sx_primitives.get_primitive \"collected\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-clear-collected!\" (fun args ->\n match Sx_primitives.get_primitive \"clear-collected!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n (* --- Provide aliases --- *)\n\n register \"provide-push!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-push!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"provide-pop!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-pop!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":203737},"map":{"version":3,"sources":["/workspace_root/lib/sx_parser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** S-expression parser.\n\n Recursive descent over a string, producing [Sx_types.value list].\n Supports: lists, dicts, symbols, keywords, strings (with escapes),\n numbers, booleans, nil, comments, quote/quasiquote/unquote sugar. *)\n\nopen Sx_types\n\ntype state = {\n src : string;\n len : int;\n mutable pos : int;\n}\n\nlet make_state src = { src; len = String.length src; pos = 0 }\n\nlet peek s = if s.pos < s.len then Some s.src.[s.pos] else None\nlet advance s = s.pos <- s.pos + 1\nlet at_end s = s.pos >= s.len\n\nlet skip_whitespace_and_comments s =\n let rec go () =\n if at_end s then ()\n else match s.src.[s.pos] with\n | ' ' | '\\t' | '\\n' | '\\r' -> advance s; go ()\n | ';' ->\n while s.pos < s.len && s.src.[s.pos] <> '\\n' do advance s done;\n if s.pos < s.len then advance s;\n go ()\n | _ -> ()\n in go ()\n\n(* Character classification — matches spec/parser.sx ident-start/ident-char.\n ident-start: a-z A-Z _ ~ * + - > < = / ! ? &\n ident-char: ident-start plus 0-9 . : / # , *)\nlet is_ident_start = function\n | 'a'..'z' | 'A'..'Z' | '_' | '~' | '*' | '+' | '-'\n | '>' | '<' | '=' | '/' | '!' | '?' | '&' -> true\n | _ -> false\n\nlet is_ident_char = function\n | c when is_ident_start c -> true\n | '0'..'9' | '.' | ':' | '#' | ',' -> true\n | _ -> false\n\n(* Symbol reading uses ident_char; first char must be ident_start or digit/colon *)\nlet is_symbol_char = is_ident_char\n\nlet read_string s =\n (* s.pos is on the opening quote *)\n advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '\"' then Buffer.contents buf\n else if c = '\\\\' then begin\n if at_end s then raise (Parse_error \"Unterminated string escape\");\n let esc = s.src.[s.pos] in\n advance s;\n (match esc with\n | 'n' -> Buffer.add_char buf '\\n'\n | 't' -> Buffer.add_char buf '\\t'\n | 'r' -> Buffer.add_char buf '\\r'\n | '\"' -> Buffer.add_char buf '\"'\n | '\\\\' -> Buffer.add_char buf '\\\\'\n | 'u' ->\n (* \\uXXXX — read 4 hex digits, encode as UTF-8 *)\n if s.pos + 4 > s.len then raise (Parse_error \"Incomplete \\\\u escape\");\n let hex = String.sub s.src s.pos 4 in\n s.pos <- s.pos + 4;\n let code = int_of_string (\"0x\" ^ hex) in\n let ubuf = Buffer.create 4 in\n Buffer.add_utf_8_uchar ubuf (Uchar.of_int code);\n Buffer.add_string buf (Buffer.contents ubuf)\n | '`' -> Buffer.add_char buf '`'\n | _ -> Buffer.add_char buf '\\\\'; Buffer.add_char buf esc);\n go ()\n end else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n\nlet read_symbol s =\n let start = s.pos in\n while s.pos < s.len && is_symbol_char s.src.[s.pos] do advance s done;\n String.sub s.src start (s.pos - start)\n\nlet try_number str =\n match float_of_string_opt str with\n | Some n -> Some (Number n)\n | None -> None\n\nlet rec read_value s : value =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unexpected end of input\");\n match s.src.[s.pos] with\n | '(' -> read_list s ')'\n | '[' -> read_list s ']'\n | '{' -> read_dict s\n | '\"' -> String (read_string s)\n | '\\'' -> advance s; List [Symbol \"quote\"; read_value s]\n | '`' -> advance s; List [Symbol \"quasiquote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = ';' ->\n (* Datum comment: #; discards next expression *)\n advance s; advance s;\n ignore (read_value s);\n read_value s\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '\\'' ->\n (* Quote shorthand: #'expr -> (quote expr) *)\n advance s; advance s;\n List [Symbol \"quote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '|' ->\n (* Raw string: #|...| — ends at next | *)\n advance s; advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated raw string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '|' then\n String (Buffer.contents buf)\n else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n | ',' ->\n (* Unquote / splice-unquote — matches spec: , always triggers unquote *)\n advance s;\n if s.pos < s.len && s.src.[s.pos] = '@' then begin\n advance s;\n List [Symbol \"splice-unquote\"; read_value s]\n end else\n List [Symbol \"unquote\"; read_value s]\n | _ ->\n begin\n (* Symbol, keyword, number, or boolean *)\n let token = read_symbol s in\n if token = \"\" then raise (Parse_error (\"Unexpected char: \" ^ String.make 1 s.src.[s.pos]));\n match token with\n | \"true\" -> Bool true\n | \"false\" -> Bool false\n | \"nil\" -> Nil\n | _ when token.[0] = ':' ->\n Keyword (String.sub token 1 (String.length token - 1))\n | _ ->\n match try_number token with\n | Some n -> n\n | None -> Symbol token\n end\n\nand read_list s close_char =\n advance s; (* skip opening paren/bracket *)\n let items = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated list\");\n if s.src.[s.pos] = close_char then begin\n advance s;\n List (List.rev !items)\n end else begin\n items := read_value s :: !items;\n go ()\n end\n in go ()\n\nand read_dict s =\n advance s; (* skip { *)\n let d = make_dict () in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated dict\");\n if s.src.[s.pos] = '}' then begin\n advance s;\n Dict d\n end else begin\n let key = read_value s in\n let key_str = match key with\n | Keyword k -> k\n | String k -> k\n | Symbol k -> k\n | _ -> raise (Parse_error \"Dict key must be keyword, string, or symbol\")\n in\n let v = read_value s in\n dict_set d key_str v;\n go ()\n end\n in go ()\n\n\n(** Parse a string into a list of SX values. *)\nlet parse_all src =\n let s = make_state src in\n let results = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then List.rev !results\n else begin\n results := read_value s :: !results;\n go ()\n end\n in go ()\n\n(** Parse a file into a list of SX values. *)\nlet parse_file path =\n let ic = open_in path in\n let n = in_channel_length ic in\n let src = really_input_string ic n in\n close_in ic;\n parse_all src\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":208077},"map":{"version":3,"sources":["/workspace_root/lib/sx_render.ml","/builtin/blackbox.ml"],"sourcesContent":["(** HTML renderer for SX values.\n\n Extracted from run_tests.ml — renders an SX expression tree to an\n HTML string, expanding components and macros along the way.\n\n Depends on [Sx_ref.eval_expr] for evaluating sub-expressions\n during rendering (keyword arg values, conditionals, etc.). *)\n\nopen Sx_types\n\n(* ====================================================================== *)\n(* Tag / attribute registries *)\n(* ====================================================================== *)\n\nlet html_tags = [\n \"html\"; \"head\"; \"body\"; \"title\"; \"meta\"; \"link\"; \"script\"; \"style\"; \"noscript\";\n \"header\"; \"nav\"; \"main\"; \"section\"; \"article\"; \"aside\"; \"footer\";\n \"h1\"; \"h2\"; \"h3\"; \"h4\"; \"h5\"; \"h6\"; \"hgroup\";\n \"div\"; \"p\"; \"blockquote\"; \"pre\"; \"figure\"; \"figcaption\"; \"address\"; \"hr\";\n \"ul\"; \"ol\"; \"li\"; \"dl\"; \"dt\"; \"dd\"; \"menu\";\n \"a\"; \"span\"; \"em\"; \"strong\"; \"small\"; \"b\"; \"i\"; \"u\"; \"s\"; \"sub\"; \"sup\";\n \"mark\"; \"del\"; \"ins\"; \"q\"; \"cite\"; \"dfn\"; \"abbr\"; \"code\"; \"var\"; \"samp\";\n \"kbd\"; \"data\"; \"time\"; \"ruby\"; \"rt\"; \"rp\"; \"bdi\"; \"bdo\"; \"wbr\"; \"br\";\n \"table\"; \"thead\"; \"tbody\"; \"tfoot\"; \"tr\"; \"th\"; \"td\"; \"caption\"; \"colgroup\"; \"col\";\n \"form\"; \"input\"; \"textarea\"; \"select\"; \"option\"; \"optgroup\"; \"button\"; \"label\";\n \"fieldset\"; \"legend\"; \"datalist\"; \"output\"; \"progress\"; \"meter\";\n \"details\"; \"summary\"; \"dialog\";\n \"img\"; \"video\"; \"audio\"; \"source\"; \"picture\"; \"canvas\"; \"iframe\"; \"embed\"; \"object\"; \"param\";\n \"svg\"; \"path\"; \"circle\"; \"rect\"; \"line\"; \"polyline\"; \"polygon\"; \"ellipse\";\n \"g\"; \"defs\"; \"use\"; \"text\"; \"tspan\"; \"clipPath\"; \"mask\"; \"pattern\";\n \"linearGradient\"; \"radialGradient\"; \"stop\"; \"filter\"; \"feBlend\"; \"feFlood\";\n \"feGaussianBlur\"; \"feOffset\"; \"feMerge\"; \"feMergeNode\"; \"feComposite\";\n \"template\"; \"slot\";\n]\n\nlet void_elements = [\n \"area\"; \"base\"; \"br\"; \"col\"; \"embed\"; \"hr\"; \"img\"; \"input\";\n \"link\"; \"meta\"; \"param\"; \"source\"; \"track\"; \"wbr\"\n]\n\nlet boolean_attrs = [\n \"async\"; \"autofocus\"; \"autoplay\"; \"checked\"; \"controls\"; \"default\";\n \"defer\"; \"disabled\"; \"formnovalidate\"; \"hidden\"; \"inert\"; \"ismap\";\n \"loop\"; \"multiple\"; \"muted\"; \"nomodule\"; \"novalidate\"; \"open\";\n \"playsinline\"; \"readonly\"; \"required\"; \"reversed\"; \"selected\"\n]\n\nlet is_html_tag name = List.mem name html_tags\nlet is_void name = List.mem name void_elements\nlet is_boolean_attr name = List.mem name boolean_attrs\n\n\n(* ====================================================================== *)\n(* HTML escaping *)\n(* ====================================================================== *)\n\nlet escape_html s =\n let buf = Buffer.create (String.length s) in\n String.iter (function\n | '&' -> Buffer.add_string buf \"&\"\n | '<' -> Buffer.add_string buf \"<\"\n | '>' -> Buffer.add_string buf \">\"\n | '\"' -> Buffer.add_string buf \""\"\n | c -> Buffer.add_char buf c) s;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* Attribute rendering *)\n(* ====================================================================== *)\n\nlet render_attrs attrs =\n let buf = Buffer.create 64 in\n Hashtbl.iter (fun k v ->\n if is_boolean_attr k then begin\n if sx_truthy v then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k\n end\n end else if not (is_nil v) then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k;\n Buffer.add_string buf \"=\\\"\";\n Buffer.add_string buf (escape_html (value_to_string v));\n Buffer.add_char buf '\"'\n end) attrs;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* HTML renderer *)\n(* ====================================================================== *)\n\n(* Forward ref — resolved at setup time *)\nlet render_to_html_ref : (value -> env -> string) ref =\n ref (fun _expr _env -> \"\")\n\nlet render_to_html expr env = !render_to_html_ref expr env\n\nlet render_children children env =\n String.concat \"\" (List.map (fun c -> render_to_html c env) children)\n\n(** Parse keyword attrs and positional children from an element call's args.\n Attrs are evaluated; children are returned UNEVALUATED for render dispatch. *)\nlet parse_element_args args env =\n let attrs = Hashtbl.create 8 in\n let children = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace attrs k v;\n skip := true\n | Spread pairs ->\n List.iter (fun (k, v) -> Hashtbl.replace attrs k v) pairs\n | _ ->\n children := arg :: !children\n ) args;\n (attrs, List.rev !children)\n\nlet render_html_element tag args env =\n let (attrs, children) = parse_element_args args env in\n let attr_str = render_attrs attrs in\n if is_void tag then\n \"<\" ^ tag ^ attr_str ^ \" />\"\n else\n let content = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n \"<\" ^ tag ^ attr_str ^ \">\" ^ content ^ \"\" ^ tag ^ \">\"\n\nlet render_component comp args env =\n match comp with\n | Component c ->\n let kwargs = Hashtbl.create 8 in\n let children_exprs = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace kwargs k v;\n skip := true\n | _ ->\n children_exprs := arg :: !children_exprs\n ) args;\n let children = List.rev !children_exprs in\n let local = env_merge c.c_closure env in\n List.iter (fun p ->\n let v = match Hashtbl.find_opt kwargs p with Some v -> v | None -> Nil in\n ignore (env_bind local p v)\n ) c.c_params;\n if c.c_has_children then begin\n let rendered_children = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n ignore (env_bind local \"children\" (RawHTML rendered_children))\n end;\n render_to_html c.c_body local\n | _ -> \"\"\n\nlet expand_macro (m : macro) args _env =\n let local = env_extend m.m_closure in\n let params = m.m_params in\n let rec bind_params ps as' =\n match ps, as' with\n | [], rest ->\n (match m.m_rest_param with\n | Some rp -> ignore (env_bind local rp (List rest))\n | None -> ())\n | p :: ps_rest, a :: as_rest ->\n ignore (env_bind local p a);\n bind_params ps_rest as_rest\n | _ :: _, [] ->\n List.iter (fun p -> ignore (env_bind local p Nil)) (List.rev ps)\n in\n bind_params params args;\n Sx_ref.eval_expr m.m_body (Env local)\n\nlet rec do_render_to_html (expr : value) (env : env) : string =\n match expr with\n | Nil -> \"\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s -> escape_html s\n | Keyword k -> escape_html k\n | RawHTML s -> s\n | Symbol s ->\n let v = Sx_ref.eval_expr (Symbol s) (Env env) in\n do_render_to_html v env\n | List [] | ListRef { contents = [] } -> \"\"\n | List (head :: args) | ListRef { contents = head :: args } ->\n render_list_to_html head args env\n | _ ->\n let v = Sx_ref.eval_expr expr (Env env) in\n do_render_to_html v env\n\nand render_list_to_html head args env =\n match head with\n | Symbol \"<>\" ->\n render_children args env\n | Symbol \"raw!\" ->\n (* Inject pre-rendered HTML without escaping *)\n let v = Sx_ref.eval_expr (List.hd args) (Env env) in\n (match v with\n | String s | RawHTML s -> s\n | _ -> value_to_string v)\n | Symbol tag when is_html_tag tag ->\n render_html_element tag args env\n | Symbol \"if\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n (if List.length args > 1 then do_render_to_html (List.nth args 1) env else \"\")\n else\n (if List.length args > 2 then do_render_to_html (List.nth args 2) env else \"\")\n | Symbol \"when\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n String.concat \"\" (List.map (fun e -> do_render_to_html e env) (List.tl args))\n else \"\"\n | Symbol \"cond\" ->\n render_cond args env\n | Symbol \"case\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol (\"let\" | \"let*\") ->\n render_let args env\n | Symbol (\"begin\" | \"do\") ->\n let rec go = function\n | [] -> \"\"\n | [last] -> do_render_to_html last env\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env env));\n go rest\n in go args\n | Symbol (\"define\" | \"defcomp\" | \"defmacro\" | \"defisland\") ->\n ignore (Sx_ref.eval_expr (List (head :: args)) (Env env));\n \"\"\n | Symbol \"map\" ->\n render_map args env false\n | Symbol \"map-indexed\" ->\n render_map args env true\n | Symbol \"filter\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol \"for-each\" ->\n render_for_each args env\n | Symbol name ->\n (try\n let v = env_get env name in\n (match v with\n | Component c when c.c_affinity = \"client\" -> \"\" (* skip client-only *)\n | Component _ -> render_component v args env\n | Island _i ->\n (* Islands: SSR via the SX render-to-html from adapter-html.sx.\n It handles deref/signal/computed through the CEK correctly,\n and renders island bodies with hydration markers. *)\n (try\n let call_expr = List (Symbol name :: args) in\n let quoted = List [Symbol \"quote\"; call_expr] in\n let render_call = List [Symbol \"render-to-html\"; quoted; Env env] in\n let result = Sx_ref.eval_expr render_call (Env env) in\n (match result with\n | String s | RawHTML s -> s\n | _ -> value_to_string result)\n with e ->\n Printf.eprintf \"[ssr-island] ~%s FAILED: %s\\n%s\\n%!\" _i.i_name (Printexc.to_string e) (Printexc.get_backtrace ());\n \"\")\n | Macro m ->\n let expanded = expand_macro m args env in\n do_render_to_html expanded env\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n with Eval_error _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env\n\nand render_cond args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let is_scheme = List.for_all (fun a -> match as_list a with\n | Some items when List.length items = 2 -> true\n | _ -> false) args\n in\n if is_scheme then begin\n let rec go = function\n | [] -> \"\"\n | clause :: rest ->\n (match as_list clause with\n | Some [test; body] ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n | _ -> \"\")\n in go args\n end else begin\n let rec go = function\n | [] -> \"\"\n | [_] -> \"\"\n | test :: body :: rest ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n in go args\n end\n\nand render_let args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let bindings_expr = List.hd args in\n let body = List.tl args in\n let local = env_extend env in\n let bindings = match as_list bindings_expr with Some l -> l | None -> [] in\n let is_scheme = match bindings with\n | (List _ :: _) | (ListRef _ :: _) -> true\n | _ -> false\n in\n if is_scheme then\n List.iter (fun b ->\n match as_list b with\n | Some [Symbol name; expr] | Some [String name; expr] ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v)\n | _ -> ()\n ) bindings\n else begin\n let rec go = function\n | [] -> ()\n | (Symbol name) :: expr :: rest | (String name) :: expr :: rest ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v);\n go rest\n | _ -> ()\n in go bindings\n end;\n let rec render_body = function\n | [] -> \"\"\n | [last] -> do_render_to_html last local\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env local));\n render_body rest\n in render_body body\n\nand render_map args env indexed =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.mapi (fun i item ->\n let call_args = if indexed then [Number (float_of_int i); item] else [item] in\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params call_args;\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val call_args in\n do_render_to_html result env\n ) items)\n\nand render_for_each args env =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.map (fun item ->\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params [item];\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val [item] in\n do_render_to_html result env\n ) items)\n\n\n(* ====================================================================== *)\n(* Setup — bind render primitives in an env and wire up the ref *)\n(* ====================================================================== *)\n\nlet setup_render_env env =\n render_to_html_ref := do_render_to_html;\n\n let bind name fn =\n ignore (env_bind env name (NativeFn (name, fn)))\n in\n\n bind \"render-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\");\n\n bind \"render-to-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-30805295.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-30805295.wasm
new file mode 100644
index 00000000..8c9947a4
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-30805295.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-30805295.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-30805295.wasm.map
new file mode 100644
index 00000000..b6a91e6b
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-30805295.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":67831},"map":{"version":3,"sources":["/workspace_root/lib/sx_types.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Core types for the SX language.\n\n The [value] sum type represents every possible SX runtime value.\n OCaml's algebraic types make the CEK machine's frame dispatch a\n pattern match — exactly what the spec describes. *)\n\n(** {1 Environment} *)\n\n(** Lexical scope chain. Each frame holds a mutable binding table and\n an optional parent link for scope-chain lookup. *)\ntype env = {\n bindings : (string, value) Hashtbl.t;\n parent : env option;\n}\n\n(** {1 Values} *)\n\nand value =\n | Nil\n | Bool of bool\n | Number of float\n | String of string\n | Symbol of string\n | Keyword of string\n | List of value list\n | Dict of dict\n | Lambda of lambda\n | Component of component\n | Island of island\n | Macro of macro\n | Thunk of value * env\n | Continuation of (value -> value) * dict option\n | NativeFn of string * (value list -> value)\n | Signal of signal\n | RawHTML of string\n | Spread of (string * value) list\n | SxExpr of string (** Opaque SX wire-format string — aser output. *)\n | Env of env (** First-class environment — used by CEK machine state dicts. *)\n | ListRef of value list ref (** Mutable list — JS-style array for append! *)\n | CekState of cek_state (** Optimized CEK machine state — avoids Dict allocation. *)\n | CekFrame of cek_frame (** Optimized CEK continuation frame. *)\n | VmClosure of vm_closure (** VM-compiled closure — callable within the VM without allocating a new VM. *)\n\n(** CEK machine state — record instead of Dict for performance.\n 5 fields × 55K steps/sec = 275K Hashtbl allocations/sec eliminated. *)\nand cek_state = {\n cs_control : value;\n cs_env : value;\n cs_kont : value;\n cs_phase : string;\n cs_value : value;\n}\n\n(** CEK continuation frame — tagged record covering all 29 frame types.\n Fields are named generically; not all are used by every frame type.\n Eliminates ~100K Hashtbl allocations per page render. *)\nand cek_frame = {\n cf_type : string; (* frame type tag: \"if\", \"let\", \"call\", etc. *)\n cf_env : value; (* environment — every frame has this *)\n cf_name : value; (* let/define/set/scope: binding name *)\n cf_body : value; (* when/let: body expr *)\n cf_remaining : value; (* begin/cond/map/etc: remaining exprs *)\n cf_f : value; (* call/map/filter/etc: function *)\n cf_args : value; (* call: raw args; arg: evaled args *)\n cf_results : value; (* map/filter/dict: accumulated results *)\n cf_extra : value; (* extra field: scheme, indexed, value, phase, etc. *)\n cf_extra2 : value; (* second extra: emitted, etc. *)\n}\n\n(** Mutable string-keyed table (SX dicts support [dict-set!]). *)\nand dict = (string, value) Hashtbl.t\n\nand lambda = {\n l_params : string list;\n l_body : value;\n l_closure : env;\n mutable l_name : string option;\n mutable l_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand component = {\n c_name : string;\n c_params : string list;\n c_has_children : bool;\n c_body : value;\n c_closure : env;\n c_affinity : string; (** \"auto\" | \"client\" | \"server\" *)\n mutable c_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand island = {\n i_name : string;\n i_params : string list;\n i_has_children : bool;\n i_body : value;\n i_closure : env;\n}\n\nand macro = {\n m_params : string list;\n m_rest_param : string option;\n m_body : value;\n m_closure : env;\n m_name : string option;\n}\n\nand signal = {\n mutable s_value : value;\n mutable s_subscribers : (unit -> unit) list;\n mutable s_deps : signal list;\n}\n\n(** {1 Bytecode VM types}\n\n Defined here (not in sx_vm.ml) because [vm_code.constants] references\n [value] and [lambda.l_compiled] references [vm_closure] — mutual\n recursion requires all types in one [and] chain. *)\n\n(** Compiled function body — bytecode + constant pool. *)\nand vm_code = {\n vc_arity : int;\n vc_locals : int;\n vc_bytecode : int array;\n vc_constants : value array;\n}\n\n(** Upvalue cell — shared mutable reference to a captured variable. *)\nand vm_upvalue_cell = {\n mutable uv_value : value;\n}\n\n(** Closure — compiled code + captured upvalues + live env reference. *)\nand vm_closure = {\n vm_code : vm_code;\n vm_upvalues : vm_upvalue_cell array;\n vm_name : string option;\n vm_env_ref : (string, value) Hashtbl.t;\n vm_closure_env : env option; (** Original closure env for inner functions *)\n}\n\n\n(** {1 Forward ref for calling VM closures from outside the VM} *)\n\nlet _vm_call_closure_ref : (vm_closure -> value list -> value) ref =\n ref (fun _ _ -> raise (Failure \"VM call_closure not initialized\"))\n\n\n(** {1 Errors} *)\n\nexception Eval_error of string\nexception Parse_error of string\n\n\n(** {1 Environment operations} *)\n\nlet make_env () =\n { bindings = Hashtbl.create 16; parent = None }\n\nlet env_extend parent =\n { bindings = Hashtbl.create 16; parent = Some parent }\n\nlet env_bind env name v =\n Hashtbl.replace env.bindings name v; Nil\n\nlet rec env_has env name =\n Hashtbl.mem env.bindings name ||\n match env.parent with Some p -> env_has p name | None -> false\n\nlet rec env_get env name =\n match Hashtbl.find_opt env.bindings name with\n | Some v -> v\n | None ->\n match env.parent with\n | Some p -> env_get p name\n | None -> raise (Eval_error (\"Undefined symbol: \" ^ name))\n\nlet rec env_set env name v =\n if Hashtbl.mem env.bindings name then\n (Hashtbl.replace env.bindings name v; Nil)\n else\n match env.parent with\n | Some p -> env_set p name v\n | None -> Hashtbl.replace env.bindings name v; Nil\n\nlet env_merge base overlay =\n (* If base and overlay are the same env (physical equality) or overlay\n is a descendant of base, just extend base — no copying needed.\n This prevents set! inside lambdas from modifying shadow copies. *)\n if base == overlay then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n (* Check if overlay is a descendant of base *)\n let rec is_descendant e depth =\n if depth > 100 then false\n else if e == base then true\n else match e.parent with Some p -> is_descendant p (depth + 1) | None -> false\n in\n if is_descendant overlay 0 then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n (* General case: extend base, copy ONLY overlay bindings that don't\n exist anywhere in the base chain (avoids shadowing closure bindings). *)\n let e = { bindings = Hashtbl.create 16; parent = Some base } in\n Hashtbl.iter (fun k v ->\n if not (env_has base k) then Hashtbl.replace e.bindings k v\n ) overlay.bindings;\n e\n end\n end\n\n\n(** {1 Value extraction helpers} *)\n\nlet value_to_string = function\n | String s -> s | Symbol s -> s | Keyword k -> k\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Bool true -> \"true\" | Bool false -> \"false\"\n | Nil -> \"\" | _ -> \"\"\n\nlet value_to_string_list = function\n | List items | ListRef { contents = items } -> List.map value_to_string items\n | _ -> []\n\nlet value_to_bool = function\n | Bool b -> b | Nil -> false | _ -> true\n\nlet value_to_string_opt = function\n | String s -> Some s | Symbol s -> Some s | Nil -> None | _ -> None\n\n\n(** {1 Constructors — accept [value] args from transpiled code} *)\n\nlet unwrap_env_val = function\n | Env e -> e\n | _ -> raise (Eval_error \"make_lambda: expected env for closure\")\n\nlet make_lambda params body closure =\n let ps = match params with\n | List items -> List.map value_to_string items\n | _ -> value_to_string_list params\n in\n Lambda { l_params = ps; l_body = body; l_closure = unwrap_env_val closure; l_name = None; l_compiled = None }\n\nlet make_component name params has_children body closure affinity =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n let aff = match affinity with String s -> s | _ -> \"auto\" in\n Component {\n c_name = n; c_params = ps; c_has_children = hc;\n c_body = body; c_closure = unwrap_env_val closure; c_affinity = aff;\n c_compiled = None;\n }\n\nlet make_island name params has_children body closure =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n Island {\n i_name = n; i_params = ps; i_has_children = hc;\n i_body = body; i_closure = unwrap_env_val closure;\n }\n\nlet make_macro params rest_param body closure name =\n let ps = value_to_string_list params in\n let rp = value_to_string_opt rest_param in\n let n = value_to_string_opt name in\n Macro {\n m_params = ps; m_rest_param = rp;\n m_body = body; m_closure = unwrap_env_val closure; m_name = n;\n }\n\nlet make_thunk expr env = Thunk (expr, unwrap_env_val env)\n\nlet make_symbol name = Symbol (value_to_string name)\nlet make_keyword name = Keyword (value_to_string name)\n\n\n(** {1 Type inspection} *)\n\nlet type_of = function\n | Nil -> \"nil\"\n | Bool _ -> \"boolean\"\n | Number _ -> \"number\"\n | String _ -> \"string\"\n | Symbol _ -> \"symbol\"\n | Keyword _ -> \"keyword\"\n | List _ | ListRef _ -> \"list\"\n | Dict _ -> \"dict\"\n | Lambda _ -> \"lambda\"\n | Component _ -> \"component\"\n | Island _ -> \"island\"\n | Macro _ -> \"macro\"\n | Thunk _ -> \"thunk\"\n | Continuation (_, _) -> \"continuation\"\n | NativeFn _ -> \"function\"\n | Signal _ -> \"signal\"\n | RawHTML _ -> \"raw-html\"\n | Spread _ -> \"spread\"\n | SxExpr _ -> \"sx-expr\"\n | Env _ -> \"env\"\n | CekState _ -> \"dict\" (* CEK state behaves as a dict for type checks *)\n | CekFrame _ -> \"dict\"\n | VmClosure _ -> \"function\"\n\nlet is_nil = function Nil -> true | _ -> false\nlet is_lambda = function Lambda _ -> true | _ -> false\nlet is_component = function Component _ -> true | _ -> false\nlet is_island = function Island _ -> true | _ -> false\nlet is_macro = function Macro _ -> true | _ -> false\nlet is_thunk = function Thunk _ -> true | _ -> false\nlet is_signal = function\n | Signal _ -> true\n | Dict d -> Hashtbl.mem d \"__signal\"\n | _ -> false\n\nlet is_callable = function\n | Lambda _ | NativeFn _ | Continuation (_, _) | VmClosure _ -> true\n | _ -> false\n\n\n(** {1 Truthiness} *)\n\n(** SX truthiness: everything is truthy except [Nil] and [Bool false]. *)\nlet sx_truthy = function\n | Nil | Bool false -> false\n | _ -> true\n\n\n(** {1 Accessors} *)\n\nlet symbol_name = function\n | Symbol s -> String s\n | v -> raise (Eval_error (\"Expected symbol, got \" ^ type_of v))\n\nlet keyword_name = function\n | Keyword k -> String k\n | v -> raise (Eval_error (\"Expected keyword, got \" ^ type_of v))\n\nlet lambda_params = function\n | Lambda l -> List (List.map (fun s -> String s) l.l_params)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_body = function\n | Lambda l -> l.l_body\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_closure = function\n | Lambda l -> Env l.l_closure\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_name = function\n | Lambda l -> (match l.l_name with Some n -> String n | None -> Nil)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet set_lambda_name l n = match l with\n | Lambda l -> l.l_name <- Some n; Nil\n | _ -> raise (Eval_error \"set-lambda-name!: not a lambda\")\n\nlet component_name = function\n | Component c -> String c.c_name\n | Island i -> String i.i_name\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_params = function\n | Component c -> List (List.map (fun s -> String s) c.c_params)\n | Island i -> List (List.map (fun s -> String s) i.i_params)\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_body = function\n | Component c -> c.c_body\n | Island i -> i.i_body\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_closure = function\n | Component c -> Env c.c_closure\n | Island i -> Env i.i_closure\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_has_children = function\n | Component c -> Bool c.c_has_children\n | Island i -> Bool i.i_has_children\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_affinity = function\n | Component c -> String c.c_affinity\n | Island _ -> String \"client\"\n | _ -> String \"auto\"\n\nlet macro_params = function\n | Macro m -> List (List.map (fun s -> String s) m.m_params)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_rest_param = function\n | Macro m -> (match m.m_rest_param with Some s -> String s | None -> Nil)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_body = function\n | Macro m -> m.m_body\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_closure = function\n | Macro m -> Env m.m_closure\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet thunk_expr = function\n | Thunk (e, _) -> e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\nlet thunk_env = function\n | Thunk (_, e) -> Env e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\n\n(** {1 Dict operations} *)\n\nlet make_dict () : dict = Hashtbl.create 8\n\nlet dict_get (d : dict) key =\n match Hashtbl.find_opt d key with Some v -> v | None -> Nil\n\nlet dict_has (d : dict) key = Hashtbl.mem d key\n\nlet dict_set (d : dict) key v = Hashtbl.replace d key v\n\nlet dict_delete (d : dict) key = Hashtbl.remove d key\n\nlet dict_keys (d : dict) =\n Hashtbl.fold (fun k _ acc -> String k :: acc) d []\n\nlet dict_vals (d : dict) =\n Hashtbl.fold (fun _ v acc -> v :: acc) d []\n\n\n(** {1 Value display} *)\n\nlet rec inspect = function\n | Nil -> \"nil\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then Printf.sprintf \"%d\" (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s ->\n let buf = Buffer.create (String.length s + 2) in\n Buffer.add_char buf '\"';\n String.iter (function\n | '\"' -> Buffer.add_string buf \"\\\\\\\"\"\n | '\\\\' -> Buffer.add_string buf \"\\\\\\\\\"\n | '\\n' -> Buffer.add_string buf \"\\\\n\"\n | '\\r' -> Buffer.add_string buf \"\\\\r\"\n | '\\t' -> Buffer.add_string buf \"\\\\t\"\n | c -> Buffer.add_char buf c) s;\n Buffer.add_char buf '\"';\n Buffer.contents buf\n | Symbol s -> s\n | Keyword k -> \":\" ^ k\n | List items | ListRef { contents = items } ->\n \"(\" ^ String.concat \" \" (List.map inspect items) ^ \")\"\n | Dict d ->\n let pairs = Hashtbl.fold (fun k v acc ->\n (Printf.sprintf \":%s %s\" k (inspect v)) :: acc) d [] in\n \"{\" ^ String.concat \" \" pairs ^ \"}\"\n | Lambda l ->\n let tag = match l.l_name with Some n -> n | None -> \"lambda\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" l.l_params)\n | Component c ->\n Printf.sprintf \"\" c.c_name (String.concat \", \" c.c_params)\n | Island i ->\n Printf.sprintf \"\" i.i_name (String.concat \", \" i.i_params)\n | Macro m ->\n let tag = match m.m_name with Some n -> n | None -> \"macro\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" m.m_params)\n | Thunk _ -> \"\"\n | Continuation (_, _) -> \"\"\n | NativeFn (name, _) -> Printf.sprintf \"\" name\n | Signal _ -> \"\"\n | RawHTML s -> Printf.sprintf \"\" (String.length s)\n | Spread _ -> \"\"\n | SxExpr s -> Printf.sprintf \"\" (String.length s)\n | Env _ -> \"\"\n | CekState _ -> \"\"\n | CekFrame f -> Printf.sprintf \"\" f.cf_type\n | VmClosure cl -> Printf.sprintf \"\" (match cl.vm_name with Some n -> n | None -> \"anon\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":75384},"map":{"version":3,"sources":["/workspace_root/lib/sx_primitives.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Built-in primitive functions (~80 pure functions).\n\n Registered in a global table; the evaluator checks this table\n when a symbol isn't found in the lexical environment. *)\n\nopen Sx_types\n\nlet primitives : (string, value list -> value) Hashtbl.t = Hashtbl.create 128\n\n(** Forward refs for calling SX functions from primitives (breaks cycle). *)\nlet _sx_call_fn : (value -> value list -> value) ref =\n ref (fun _ _ -> raise (Eval_error \"sx_call not initialized\"))\nlet _sx_trampoline_fn : (value -> value) ref =\n ref (fun v -> v)\n\nlet register name fn = Hashtbl.replace primitives name fn\n\nlet is_primitive name = Hashtbl.mem primitives name\n\nlet get_primitive name =\n match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(* --- Helpers --- *)\n\nlet as_number = function\n | Number n -> n\n | Bool true -> 1.0\n | Bool false -> 0.0\n | Nil -> 0.0\n | String s -> (match float_of_string_opt s with Some n -> n | None -> Float.nan)\n | v -> raise (Eval_error (\"Expected number, got \" ^ type_of v ^ \": \" ^ (match v with Dict d -> (match Hashtbl.find_opt d \"__signal\" with Some _ -> \"signal{value=\" ^ (match Hashtbl.find_opt d \"value\" with Some v' -> value_to_string v' | None -> \"?\") ^ \"}\" | None -> \"dict\") | _ -> \"\")))\n\nlet as_string = function\n | String s -> s\n | v -> raise (Eval_error (\"Expected string, got \" ^ type_of v))\n\nlet rec as_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | Thunk _ as t -> as_list (!_sx_trampoline_fn t)\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\nlet as_bool = function\n | Bool b -> b\n | v -> sx_truthy v\n\nlet to_string = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | v -> inspect v\n\nlet () =\n (* === Arithmetic === *)\n register \"+\" (fun args ->\n Number (List.fold_left (fun acc a -> acc +. as_number a) 0.0 args));\n register \"-\" (fun args ->\n match args with\n | [] -> Number 0.0\n | [a] -> Number (-. (as_number a))\n | a :: rest -> Number (List.fold_left (fun acc x -> acc -. as_number x) (as_number a) rest));\n register \"*\" (fun args ->\n Number (List.fold_left (fun acc a -> acc *. as_number a) 1.0 args));\n register \"/\" (fun args ->\n match args with\n | [a; b] -> Number (as_number a /. as_number b)\n | _ -> raise (Eval_error \"/: expected 2 args\"));\n register \"mod\" (fun args ->\n match args with\n | [a; b] -> Number (Float.rem (as_number a) (as_number b))\n | _ -> raise (Eval_error \"mod: expected 2 args\"));\n register \"inc\" (fun args ->\n match args with [a] -> Number (as_number a +. 1.0) | _ -> raise (Eval_error \"inc: 1 arg\"));\n register \"dec\" (fun args ->\n match args with [a] -> Number (as_number a -. 1.0) | _ -> raise (Eval_error \"dec: 1 arg\"));\n register \"abs\" (fun args ->\n match args with [a] -> Number (Float.abs (as_number a)) | _ -> raise (Eval_error \"abs: 1 arg\"));\n register \"floor\" (fun args ->\n match args with [a] -> Number (floor (as_number a))\n | _ -> raise (Eval_error \"floor: 1 arg\"));\n register \"ceil\" (fun args ->\n match args with [a] -> Number (ceil (as_number a))\n | _ -> raise (Eval_error \"ceil: 1 arg\"));\n register \"round\" (fun args ->\n match args with\n | [a] -> Number (Float.round (as_number a))\n | [a; b] ->\n let n = as_number a and places = int_of_float (as_number b) in\n let factor = 10.0 ** float_of_int places in\n Number (Float.round (n *. factor) /. factor)\n | _ -> raise (Eval_error \"round: 1-2 args\"));\n register \"min\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"min: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.min acc (as_number a)) Float.infinity args));\n register \"max\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"max: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.max acc (as_number a)) Float.neg_infinity args));\n register \"sqrt\" (fun args ->\n match args with [a] -> Number (Float.sqrt (as_number a)) | _ -> raise (Eval_error \"sqrt: 1 arg\"));\n register \"pow\" (fun args ->\n match args with [a; b] -> Number (as_number a ** as_number b)\n | _ -> raise (Eval_error \"pow: 2 args\"));\n register \"clamp\" (fun args ->\n match args with\n | [x; lo; hi] ->\n let x = as_number x and lo = as_number lo and hi = as_number hi in\n Number (Float.max lo (Float.min hi x))\n | _ -> raise (Eval_error \"clamp: 3 args\"));\n register \"parse-int\" (fun args ->\n match args with\n | [String s] -> (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> Nil)\n | [String s; default_val] ->\n (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> default_val)\n | [Number n] | [Number n; _] -> Number (float_of_int (int_of_float n))\n | [_; default_val] -> default_val\n | _ -> Nil);\n register \"parse-float\" (fun args ->\n match args with\n | [String s] -> (match float_of_string_opt s with Some n -> Number n | None -> Nil)\n | [Number n] -> Number n\n | _ -> Nil);\n\n (* === Comparison === *)\n (* Normalize ListRef to List for structural equality *)\n let rec normalize_for_eq = function\n | ListRef { contents = items } -> List (List.map normalize_for_eq items)\n | List items -> List (List.map normalize_for_eq items)\n | v -> v\n in\n register \"=\" (fun args ->\n match args with\n | [a; b] -> Bool (normalize_for_eq a = normalize_for_eq b)\n | _ -> raise (Eval_error \"=: 2 args\"));\n register \"!=\" (fun args ->\n match args with\n | [a; b] -> Bool (normalize_for_eq a <> normalize_for_eq b)\n | _ -> raise (Eval_error \"!=: 2 args\"));\n register \"<\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a < b)\n | [a; b] -> Bool (as_number a < as_number b)\n | _ -> raise (Eval_error \"<: 2 args\"));\n register \">\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a > b)\n | [a; b] -> Bool (as_number a > as_number b)\n | _ -> raise (Eval_error \">: 2 args\"));\n register \"<=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a <= b)\n | [a; b] -> Bool (as_number a <= as_number b)\n | _ -> raise (Eval_error \"<=: 2 args\"));\n register \">=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a >= b)\n | [a; b] -> Bool (as_number a >= as_number b)\n | _ -> raise (Eval_error \">=: 2 args\"));\n\n (* === Logic === *)\n register \"not\" (fun args ->\n match args with [a] -> Bool (not (sx_truthy a)) | _ -> raise (Eval_error \"not: 1 arg\"));\n\n (* === Predicates === *)\n register \"nil?\" (fun args ->\n match args with [a] -> Bool (is_nil a) | _ -> raise (Eval_error \"nil?: 1 arg\"));\n register \"number?\" (fun args ->\n match args with [Number _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"number?: 1 arg\"));\n register \"string?\" (fun args ->\n match args with [String _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"string?: 1 arg\"));\n register \"boolean?\" (fun args ->\n match args with [Bool _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"boolean?: 1 arg\"));\n register \"list?\" (fun args ->\n match args with [List _] | [ListRef _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"list?: 1 arg\"));\n register \"dict?\" (fun args ->\n match args with [Dict _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"dict?: 1 arg\"));\n register \"symbol?\" (fun args ->\n match args with [Symbol _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"symbol?: 1 arg\"));\n register \"keyword?\" (fun args ->\n match args with [Keyword _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"keyword?: 1 arg\"));\n register \"empty?\" (fun args ->\n match args with\n | [List []] | [ListRef { contents = [] }] -> Bool true\n | [List _] | [ListRef _] -> Bool false\n | [String \"\"] -> Bool true | [String _] -> Bool false\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | [Nil] -> Bool true\n | [_] -> Bool false\n | _ -> raise (Eval_error \"empty?: 1 arg\"));\n register \"odd?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 <> 0) | _ -> raise (Eval_error \"odd?: 1 arg\"));\n register \"even?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 = 0) | _ -> raise (Eval_error \"even?: 1 arg\"));\n register \"zero?\" (fun args ->\n match args with [a] -> Bool (as_number a = 0.0) | _ -> raise (Eval_error \"zero?: 1 arg\"));\n\n (* === Strings === *)\n register \"str\" (fun args -> String (String.concat \"\" (List.map to_string args)));\n register \"upper\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upper: 1 arg\"));\n register \"upcase\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upcase: 1 arg\"));\n register \"lower\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"lower: 1 arg\"));\n register \"downcase\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"downcase: 1 arg\"));\n register \"trim\" (fun args ->\n match args with [a] -> String (String.trim (as_string a)) | _ -> raise (Eval_error \"trim: 1 arg\"));\n register \"string-length\" (fun args ->\n match args with [a] -> Number (float_of_int (String.length (as_string a)))\n | _ -> raise (Eval_error \"string-length: 1 arg\"));\n register \"string-contains?\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let rec find i =\n if i + String.length needle > String.length haystack then false\n else if String.sub haystack i (String.length needle) = needle then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"string-contains?: 2 string args\"));\n register \"starts-with?\" (fun args ->\n match args with\n | [String s; String prefix] ->\n Bool (String.length s >= String.length prefix &&\n String.sub s 0 (String.length prefix) = prefix)\n | _ -> raise (Eval_error \"starts-with?: 2 string args\"));\n register \"ends-with?\" (fun args ->\n match args with\n | [String s; String suffix] ->\n let sl = String.length s and xl = String.length suffix in\n Bool (sl >= xl && String.sub s (sl - xl) xl = suffix)\n | _ -> raise (Eval_error \"ends-with?: 2 string args\"));\n register \"index-of\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let nl = String.length needle and hl = String.length haystack in\n let rec find i =\n if i + nl > hl then Number (-1.0)\n else if String.sub haystack i nl = needle then Number (float_of_int i)\n else find (i + 1)\n in find 0\n | _ -> raise (Eval_error \"index-of: 2 string args\"));\n register \"substring\" (fun args ->\n match args with\n | [String s; Number start; Number end_] ->\n let i = int_of_float start and j = int_of_float end_ in\n let len = String.length s in\n let i = max 0 (min i len) and j = max 0 (min j len) in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"substring: 3 args\"));\n register \"substr\" (fun args ->\n match args with\n | [String s; Number start; Number len] ->\n let i = int_of_float start and n = int_of_float len in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n let n = max 0 (min n (sl - i)) in\n String (String.sub s i n)\n | [String s; Number start] ->\n let i = int_of_float start in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n String (String.sub s i (sl - i))\n | _ -> raise (Eval_error \"substr: 2-3 args\"));\n register \"split\" (fun args ->\n match args with\n | [String s; String sep] ->\n List (List.map (fun p -> String p) (String.split_on_char sep.[0] s))\n | _ -> raise (Eval_error \"split: 2 args\"));\n register \"join\" (fun args ->\n match args with\n | [String sep; (List items | ListRef { contents = items })] ->\n String (String.concat sep (List.map to_string items))\n | _ -> raise (Eval_error \"join: 2 args\"));\n register \"replace\" (fun args ->\n let to_str = function\n | String s -> s | SxExpr s -> s | RawHTML s -> s\n | Keyword k -> k | Symbol s -> s\n | Nil -> \"\" | Bool true -> \"true\" | Bool false -> \"false\"\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Thunk _ as t -> (match !_sx_trampoline_fn t with String s -> s | v -> to_string v)\n | v -> to_string v\n in\n match args with\n | [s; old_s; new_s] ->\n let s = to_str s and old_s = to_str old_s and new_s = to_str new_s in\n let ol = String.length old_s in\n if ol = 0 then String s\n else begin\n let buf = Buffer.create (String.length s) in\n let rec go i =\n if i >= String.length s then ()\n else if i + ol <= String.length s && String.sub s i ol = old_s then begin\n Buffer.add_string buf new_s;\n go (i + ol)\n end else begin\n Buffer.add_char buf s.[i];\n go (i + 1)\n end\n in go 0;\n String (Buffer.contents buf)\n end\n | _ -> raise (Eval_error \"replace: 3 string args\"));\n register \"char-from-code\" (fun args ->\n match args with\n | [Number n] ->\n let buf = Buffer.create 4 in\n Buffer.add_utf_8_uchar buf (Uchar.of_int (int_of_float n));\n String (Buffer.contents buf)\n | _ -> raise (Eval_error \"char-from-code: 1 arg\"));\n\n (* === Collections === *)\n register \"list\" (fun args -> ListRef (ref args));\n register \"len\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> Number (float_of_int (List.length l))\n | [String s] -> Number (float_of_int (String.length s))\n | [Dict d] -> Number (float_of_int (Hashtbl.length d))\n | [Nil] | [Bool false] -> Number 0.0\n | [Bool true] -> Number 1.0\n | [Number _] -> Number 1.0\n | [RawHTML s] -> Number (float_of_int (String.length s))\n | [SxExpr s] -> Number (float_of_int (String.length s))\n | [Spread pairs] -> Number (float_of_int (List.length pairs))\n | [Component _] | [Island _] | [Lambda _] | [NativeFn _]\n | [Macro _] | [Thunk _] | [Keyword _] | [Symbol _] -> Number 0.0\n | _ -> raise (Eval_error (Printf.sprintf \"len: %d args\"\n (List.length args))));\n register \"first\" (fun args ->\n match args with\n | [List (x :: _)] | [ListRef { contents = x :: _ }] -> x\n | [List []] | [ListRef { contents = [] }] -> Nil | [Nil] -> Nil\n | _ -> raise (Eval_error \"first: 1 list arg\"));\n register \"rest\" (fun args ->\n match args with\n | [List (_ :: xs)] | [ListRef { contents = _ :: xs }] -> List xs\n | [List []] | [ListRef { contents = [] }] -> List [] | [Nil] -> List []\n | _ -> raise (Eval_error \"rest: 1 list arg\"));\n register \"last\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error \"last: 1 list arg\"));\n register \"init\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with _ :: rest -> List (List.rev rest) | [] -> List [])\n | _ -> raise (Eval_error \"init: 1 list arg\"));\n register \"nth\" (fun args ->\n match args with\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [String s; Number n] ->\n let i = int_of_float n in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> raise (Eval_error \"nth: list/string and number\"));\n register \"cons\" (fun args ->\n match args with\n | [x; List l] | [x; ListRef { contents = l }] -> List (x :: l)\n | [x; Nil] -> List [x]\n | _ -> raise (Eval_error \"cons: value and list\"));\n register \"append\" (fun args ->\n match args with\n | [List la | ListRef { contents = la }; List lb | ListRef { contents = lb }] ->\n List (la @ lb)\n | [List la | ListRef { contents = la }; Nil] -> List la\n | [Nil; List lb | ListRef { contents = lb }] -> List lb\n | [List la | ListRef { contents = la }; v] -> List (la @ [v])\n | [v; List lb | ListRef { contents = lb }] -> List ([v] @ lb)\n | _ ->\n let all = List.concat_map as_list args in\n List all);\n register \"reverse\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.rev l)\n | _ -> raise (Eval_error \"reverse: 1 list\"));\n register \"flatten\" (fun args ->\n let rec flat = function\n | List items | ListRef { contents = items } -> List.concat_map flat items\n | x -> [x]\n in\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.concat_map flat l)\n | _ -> raise (Eval_error \"flatten: 1 list\"));\n register \"concat\" (fun args -> List (List.concat_map as_list args));\n register \"contains?\" (fun args ->\n match args with\n | [List l; item] | [ListRef { contents = l }; item] -> Bool (List.mem item l)\n | [String s; String sub] ->\n let rec find i =\n if i + String.length sub > String.length s then false\n else if String.sub s i (String.length sub) = sub then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"contains?: 2 args\"));\n register \"range\" (fun args ->\n match args with\n | [Number stop] ->\n let n = int_of_float stop in\n List (List.init (max 0 n) (fun i -> Number (float_of_int i)))\n | [Number start; Number stop] ->\n let s = int_of_float start and e = int_of_float stop in\n let len = max 0 (e - s) in\n List (List.init len (fun i -> Number (float_of_int (s + i))))\n | [Number start; Number stop; Number step] ->\n let s = start and e = stop and st = step in\n if st = 0.0 then List []\n else\n let items = ref [] in\n let i = ref s in\n if st > 0.0 then\n (while !i < e do items := Number !i :: !items; i := !i +. st done)\n else\n (while !i > e do items := Number !i :: !items; i := !i +. st done);\n List (List.rev !items)\n | _ -> raise (Eval_error \"range: 1-3 args\"));\n register \"slice\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number start] ->\n let i = max 0 (int_of_float start) in\n let rec drop n = function _ :: xs when n > 0 -> drop (n-1) xs | l -> l in\n List (drop i l)\n | [(List l | ListRef { contents = l }); Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let len = List.length l in\n let j = min j len in\n let rec take_range idx = function\n | [] -> []\n | x :: xs ->\n if idx >= j then []\n else if idx >= i then x :: take_range (idx+1) xs\n else take_range (idx+1) xs\n in List (take_range 0 l)\n | [String s; Number start] ->\n let i = max 0 (int_of_float start) in\n String (String.sub s i (max 0 (String.length s - i)))\n | [String s; Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let sl = String.length s in\n let j = min j sl in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"slice: 2-3 args\"));\n register \"sort\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.sort compare l)\n | _ -> raise (Eval_error \"sort: 1 list\"));\n register \"zip\" (fun args ->\n match args with\n | [a; b] ->\n let la = as_list a and lb = as_list b in\n let rec go l1 l2 acc = match l1, l2 with\n | x :: xs, y :: ys -> go xs ys (List [x; y] :: acc)\n | _ -> List.rev acc\n in List (go la lb [])\n | _ -> raise (Eval_error \"zip: 2 lists\"));\n register \"zip-pairs\" (fun args ->\n match args with\n | [v] ->\n let l = as_list v in\n let rec go = function\n | a :: b :: rest -> List [a; b] :: go rest\n | _ -> []\n in List (go l)\n | _ -> raise (Eval_error \"zip-pairs: 1 list\"));\n register \"take\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in List (take_n (int_of_float n) l)\n | _ -> raise (Eval_error \"take: list and number\"));\n register \"drop\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in List (drop_n (int_of_float n) l)\n | _ -> raise (Eval_error \"drop: list and number\"));\n register \"chunk-every\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let size = int_of_float n in\n let rec go = function\n | [] -> []\n | l ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in\n List (take_n size l) :: go (drop_n size l)\n in List (go l)\n | _ -> raise (Eval_error \"chunk-every: list and number\"));\n register \"unique\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l })] ->\n let seen = Hashtbl.create 16 in\n let result = List.filter (fun x ->\n let key = inspect x in\n if Hashtbl.mem seen key then false\n else (Hashtbl.replace seen key true; true)\n ) l in\n List result\n | _ -> raise (Eval_error \"unique: 1 list\"));\n\n (* === Dict === *)\n register \"dict\" (fun args ->\n let d = make_dict () in\n let rec go = function\n | [] -> Dict d\n | Keyword k :: v :: rest -> dict_set d k v; go rest\n | String k :: v :: rest -> dict_set d k v; go rest\n | _ -> raise (Eval_error \"dict: pairs of key value\")\n in go args);\n register \"get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [Nil; _] -> Nil (* nil.anything → nil *)\n | [_; _] -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n | _ -> Nil);\n register \"has-key?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | [Dict d; Keyword k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"has-key?: dict and key\"));\n register \"assoc\" (fun args ->\n match args with\n | Dict d :: rest ->\n let d2 = Hashtbl.copy d in\n let rec go = function\n | [] -> Dict d2\n | String k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | Keyword k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | _ -> raise (Eval_error \"assoc: pairs\")\n in go rest\n | _ -> raise (Eval_error \"assoc: dict + pairs\"));\n register \"dissoc\" (fun args ->\n match args with\n | Dict d :: keys ->\n let d2 = Hashtbl.copy d in\n List.iter (fun k -> Hashtbl.remove d2 (to_string k)) keys;\n Dict d2\n | _ -> raise (Eval_error \"dissoc: dict + keys\"));\n register \"merge\" (fun args ->\n let d = make_dict () in\n List.iter (function\n | Dict src -> Hashtbl.iter (fun k v -> Hashtbl.replace d k v) src\n | _ -> raise (Eval_error \"merge: all args must be dicts\")\n ) args;\n Dict d);\n register \"keys\" (fun args ->\n match args with [Dict d] -> List (dict_keys d) | _ -> raise (Eval_error \"keys: 1 dict\"));\n register \"vals\" (fun args ->\n match args with [Dict d] -> List (dict_vals d) | _ -> raise (Eval_error \"vals: 1 dict\"));\n register \"mutable-list\" (fun _args -> ListRef (ref []));\n register \"set-nth!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n let l = !r in\n r := List.mapi (fun j x -> if j = i then v else x) l;\n Nil\n | [List _; _; _] ->\n raise (Eval_error \"set-nth!: list is immutable, use ListRef\")\n | _ -> raise (Eval_error \"set-nth!: expected (list idx val)\"));\n register \"dict-set!\" (fun args ->\n match args with\n | [Dict d; String k; v] -> dict_set d k v; v\n | [Dict d; Keyword k; v] -> dict_set d k v; v\n | _ -> raise (Eval_error \"dict-set!: dict key val\"));\n register \"dict-get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | _ -> raise (Eval_error \"dict-get: dict and key\"));\n register \"dict-has?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"dict-has?: dict and key\"));\n register \"dict-delete!\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_delete d k; Nil\n | _ -> raise (Eval_error \"dict-delete!: dict and key\"));\n\n (* === Misc === *)\n register \"type-of\" (fun args ->\n match args with [a] -> String (type_of a) | _ -> raise (Eval_error \"type-of: 1 arg\"));\n register \"inspect\" (fun args ->\n match args with [a] -> String (inspect a) | _ -> raise (Eval_error \"inspect: 1 arg\"));\n register \"serialize\" (fun args ->\n match args with\n | [a] -> String (inspect a) (* used for dedup keys in compiler *)\n | _ -> raise (Eval_error \"serialize: 1 arg\"));\n register \"make-symbol\" (fun args ->\n match args with\n | [String s] -> Symbol s\n | _ -> raise (Eval_error \"make-symbol: expected string\"));\n register \"error\" (fun args ->\n match args with [String msg] -> raise (Eval_error msg)\n | [a] -> raise (Eval_error (to_string a))\n | _ -> raise (Eval_error \"error: 1 arg\"));\n register \"apply\" (fun args ->\n match args with\n | [NativeFn (_, f); (List a | ListRef { contents = a })] -> f a\n | [NativeFn (_, f); Nil] -> f []\n | _ -> raise (Eval_error \"apply: function and list\"));\n register \"identical?\" (fun args ->\n match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?: 2 args\"));\n register \"make-spread\" (fun args ->\n match args with\n | [Dict d] ->\n let pairs = Hashtbl.fold (fun k v acc -> (k, v) :: acc) d [] in\n Spread pairs\n | _ -> raise (Eval_error \"make-spread: 1 dict\"));\n register \"spread?\" (fun args ->\n match args with [Spread _] -> Bool true | [_] -> Bool false\n | _ -> raise (Eval_error \"spread?: 1 arg\"));\n register \"spread-attrs\" (fun args ->\n match args with\n | [Spread pairs] ->\n let d = make_dict () in\n List.iter (fun (k, v) -> dict_set d k v) pairs;\n Dict d\n | _ -> raise (Eval_error \"spread-attrs: 1 spread\"));\n\n (* Higher-order forms as callable primitives — used by the VM.\n The CEK machine handles these as special forms with dedicated frames;\n the VM needs them as plain callable values. *)\n (* Call any SX callable — handles NativeFn, Lambda (via trampoline), VM closures *)\n let call_any f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | _ -> !_sx_trampoline_fn (!_sx_call_fn f args)\n in\n register \"map\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.map (fun x -> call_any f [x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map: expected (fn list)\"));\n register \"map-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.mapi (fun i x -> call_any f [Number (float_of_int i); x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map-indexed: expected (fn list)\"));\n register \"filter\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.filter (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"filter: expected (fn list)\"));\n register \"for-each\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iter (fun x -> ignore (call_any f [x])) items; Nil\n | [_; Nil] -> Nil (* nil collection = no-op *)\n | _ ->\n let types = String.concat \", \" (List.map (fun v -> type_of v) args) in\n raise (Eval_error (Printf.sprintf \"for-each: expected (fn list), got (%s) %d args\" types (List.length args))));\n register \"reduce\" (fun args ->\n match args with\n | [f; init; (List items | ListRef { contents = items })] ->\n List.fold_left (fun acc x -> call_any f [acc; x]) init items\n | _ -> raise (Eval_error \"reduce: expected (fn init list)\"));\n register \"some\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n (try List.find (fun x -> sx_truthy (call_any f [x])) items\n with Not_found -> Bool false)\n | [_; Nil] -> Bool false\n | _ -> raise (Eval_error \"some: expected (fn list)\"));\n register \"every?\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n Bool (List.for_all (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> Bool true\n | _ -> raise (Eval_error \"every?: expected (fn list)\"));\n\n (* ---- VM stack primitives (vm.sx platform interface) ---- *)\n register \"make-vm-stack\" (fun args ->\n match args with\n | [Number n] -> ListRef (ref (List.init (int_of_float n) (fun _ -> Nil)))\n | _ -> raise (Eval_error \"make-vm-stack: expected (size)\"));\n register \"vm-stack-get\" (fun args ->\n match args with\n | [ListRef r; Number n] -> List.nth !r (int_of_float n)\n | _ -> raise (Eval_error \"vm-stack-get: expected (stack idx)\"));\n register \"vm-stack-set!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n r := List.mapi (fun j x -> if j = i then v else x) !r; Nil\n | _ -> raise (Eval_error \"vm-stack-set!: expected (stack idx val)\"));\n register \"vm-stack-length\" (fun args ->\n match args with\n | [ListRef r] -> Number (float_of_int (List.length !r))\n | _ -> raise (Eval_error \"vm-stack-length: expected (stack)\"));\n register \"vm-stack-copy!\" (fun args ->\n match args with\n | [ListRef src; ListRef dst; Number n] ->\n let count = int_of_float n in\n let src_items = !src in\n dst := List.mapi (fun i x -> if i < count then List.nth src_items i else x) !dst; Nil\n | _ -> raise (Eval_error \"vm-stack-copy!: expected (src dst count)\"));\n register \"primitive?\" (fun args ->\n match args with\n | [String name] -> Bool (Hashtbl.mem primitives name)\n | _ -> Bool false);\n\n (* Scope stack primitives are registered by sx_server.ml / run_tests.ml\n because they use a shared scope stacks table with collect!/collected. *)\n\n (* ---- Predicates needed by adapter-html.sx ---- *)\n register \"lambda?\" (fun args ->\n match args with [Lambda _] -> Bool true | _ -> Bool false);\n register \"island?\" (fun args ->\n match args with [Island _] -> Bool true | _ -> Bool false);\n register \"is-else-clause?\" (fun args ->\n match args with\n | [Keyword \"else\"] -> Bool true\n | [Bool true] -> Bool true\n | _ -> Bool false);\n register \"component?\" (fun args ->\n match args with [Component _] -> Bool true | [Island _] -> Bool true | _ -> Bool false);\n register \"lambda-closure\" (fun args ->\n match args with [Lambda l] -> Env l.l_closure | _ -> Nil);\n register \"component-closure\" (fun args ->\n match args with\n | [Component c] -> Env c.c_closure\n | [Island i] -> Env i.i_closure\n | _ -> Nil);\n register \"component-has-children?\" (fun args ->\n match args with\n | [Component c] -> Bool c.c_has_children\n | [Island i] -> Bool i.i_has_children\n | _ -> Bool false);\n register \"component-name\" (fun args ->\n match args with\n | [Component c] -> String c.c_name\n | [Island i] -> String i.i_name\n | _ -> Nil);\n register \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> List []);\n register \"component-body\" (fun args ->\n match args with\n | [Component c] -> c.c_body\n | [Island i] -> i.i_body\n | _ -> Nil);\n register \"macro?\" (fun args ->\n match args with [Macro _] -> Bool true | _ -> Bool false);\n register \"for-each-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iteri (fun i x -> ignore (call_any f [Number (float_of_int i); x])) items; Nil\n | _ -> raise (Eval_error \"for-each-indexed: expected (fn list)\"));\n register \"lambda-params\" (fun args ->\n match args with\n | [Lambda l] -> List (List.map (fun s -> String s) l.l_params)\n | _ -> List []);\n register \"lambda-body\" (fun args ->\n match args with [Lambda l] -> l.l_body | _ -> Nil);\n (* expand-macro is registered later by run_tests.ml / sx_server.ml\n because it needs eval_expr which creates a dependency cycle *);\n register \"empty-dict?\" (fun args ->\n match args with\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | _ -> Bool true);\n register \"make-raw-html\" (fun args ->\n match args with [String s] -> RawHTML s | _ -> Nil);\n register \"raw-html-content\" (fun args ->\n match args with [RawHTML s] -> String s | _ -> String \"\");\n register \"get-primitive\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"get-primitive: expected (name)\"));\n register \"call-primitive\" (fun args ->\n match args with\n | [String name; (List a | ListRef { contents = a })] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn a\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | [String name; Nil] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn []\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"call-primitive: expected (name args-list)\"));\n ()\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":109224},"map":{"version":3,"sources":["/workspace_root/lib/sx_runtime.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Runtime helpers for transpiled code.\n\n These bridge the gap between the transpiler's output and the\n foundation types/primitives. The transpiled evaluator calls these\n functions directly. *)\n\nopen Sx_types\n\n(** Call a registered primitive by name. *)\nlet prim_call name args =\n match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f args\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(** Convert any SX value to an OCaml string (internal). *)\nlet value_to_str = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | v -> inspect v\n\n(** sx_to_string returns a value (String) for transpiled code. *)\nlet sx_to_string v = String (value_to_str v)\n\n(** String concatenation helper — [sx_str] takes a list of values. *)\nlet sx_str args =\n String.concat \"\" (List.map value_to_str args)\n\n(** Convert a value to a list. *)\nlet sx_to_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\n(** Call an SX callable (lambda, native fn, continuation). *)\nlet sx_call f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | VmClosure cl -> !Sx_types._vm_call_closure_ref cl args\n | Lambda l ->\n let local = Sx_types.env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (Sx_types.env_bind local p a)) l.l_params args;\n Thunk (l.l_body, local)\n | Continuation (k, _) ->\n k (match args with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error (\"Not callable: \" ^ inspect f))\n\n(* Initialize forward ref so primitives can call SX functions *)\nlet () = Sx_primitives._sx_call_fn := sx_call\n(* Trampoline ref is set by sx_ref.ml after it's loaded *)\n\n(** Apply a function to a list of args. *)\nlet sx_apply f args_list =\n sx_call f (sx_to_list args_list)\n\n(** Mutable append — add item to a list ref or accumulator.\n In transpiled code, lists that get appended to are mutable refs. *)\nlet sx_append_b lst item =\n match lst with\n | List items -> List (items @ [item])\n | ListRef r -> r := !r @ [item]; lst (* mutate in place, return same ref *)\n | _ -> raise (Eval_error (\"append!: expected list, got \" ^ type_of lst))\n\n(** Mutable dict-set — set key in dict, return value. *)\nlet sx_dict_set_b d k v =\n match d, k with\n | Dict tbl, String key -> Hashtbl.replace tbl key v; v\n | Dict tbl, Keyword key -> Hashtbl.replace tbl key v; v\n | _ -> raise (Eval_error \"dict-set!: expected dict and string key\")\n\n(** Get from dict or list. *)\nlet get_val container key =\n match container, key with\n | CekState s, String k ->\n (match k with\n | \"control\" -> s.cs_control | \"env\" -> s.cs_env\n | \"kont\" -> s.cs_kont | \"phase\" -> String s.cs_phase\n | \"value\" -> s.cs_value | _ -> Nil)\n | CekFrame f, String k ->\n (match k with\n | \"type\" -> String f.cf_type | \"env\" -> f.cf_env\n | \"name\" -> f.cf_name | \"body\" -> f.cf_body\n | \"remaining\" -> f.cf_remaining | \"f\" -> f.cf_f\n | \"args\" -> f.cf_args | \"evaled\" -> f.cf_args\n | \"results\" -> f.cf_results | \"raw-args\" -> f.cf_results\n | \"then\" -> f.cf_body | \"else\" -> f.cf_name\n | \"ho-type\" -> f.cf_extra | \"scheme\" -> f.cf_extra\n | \"indexed\" -> f.cf_extra | \"value\" -> f.cf_extra\n | \"phase\" -> f.cf_extra | \"has-effects\" -> f.cf_extra\n | \"match-val\" -> f.cf_extra | \"current-item\" -> f.cf_extra\n | \"update-fn\" -> f.cf_extra | \"head-name\" -> f.cf_extra\n | \"emitted\" -> f.cf_extra2 | \"effect-list\" -> f.cf_extra2\n | \"first-render\" -> f.cf_extra2\n | _ -> Nil)\n | Dict d, String k -> dict_get d k\n | Dict d, Keyword k -> dict_get d k\n | (List l | ListRef { contents = l }), Number n ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | Nil, _ -> Nil (* nil.anything → nil *)\n | _, _ -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n\n(** Register get as a primitive override — transpiled code calls (get d k). *)\nlet () =\n Sx_primitives.register \"get\" (fun args ->\n match args with\n | [c; k] -> get_val c k\n | [c; k; default] ->\n (try\n let v = get_val c k in\n if v = Nil then default else v\n with _ -> default)\n | _ -> raise (Eval_error \"get: 2-3 args\"))\n\n\n(* ====================================================================== *)\n(* Primitive aliases — top-level functions called by transpiled code *)\n(* ====================================================================== *)\n\n(** The transpiled evaluator calls primitives directly by their mangled\n OCaml name. These aliases delegate to the primitives table so the\n transpiled code compiles without needing [prim_call] everywhere. *)\n\nlet _prim name = match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f | None -> (fun _ -> raise (Eval_error (\"Missing prim: \" ^ name)))\n\n(* Collection ops *)\nlet first args = _prim \"first\" [args]\nlet rest args = _prim \"rest\" [args]\nlet last args = _prim \"last\" [args]\nlet nth coll i = _prim \"nth\" [coll; i]\nlet cons x l = _prim \"cons\" [x; l]\nlet append a b = _prim \"append\" [a; b]\nlet reverse l = _prim \"reverse\" [l]\nlet flatten l = _prim \"flatten\" [l]\nlet concat a b = _prim \"concat\" [a; b]\nlet slice a b = _prim \"slice\" [a; b]\nlet len a = _prim \"len\" [a]\nlet get a b = get_val a b\nlet sort' a = _prim \"sort\" [a]\nlet range' a = _prim \"range\" [a]\nlet unique a = _prim \"unique\" [a]\nlet zip a b = _prim \"zip\" [a; b]\nlet zip_pairs a = _prim \"zip-pairs\" [a]\nlet take a b = _prim \"take\" [a; b]\nlet drop a b = _prim \"drop\" [a; b]\nlet chunk_every a b = _prim \"chunk-every\" [a; b]\n\n(* Predicates *)\nlet empty_p a = _prim \"empty?\" [a]\nlet nil_p a = _prim \"nil?\" [a]\nlet number_p a = _prim \"number?\" [a]\nlet string_p a = _prim \"string?\" [a]\nlet boolean_p a = _prim \"boolean?\" [a]\nlet list_p a = _prim \"list?\" [a]\nlet dict_p a = _prim \"dict?\" [a]\nlet symbol_p a = _prim \"symbol?\" [a]\nlet keyword_p a = _prim \"keyword?\" [a]\nlet contains_p a b = _prim \"contains?\" [a; b]\nlet has_key_p a b = _prim \"has-key?\" [a; b]\nlet starts_with_p a b = _prim \"starts-with?\" [a; b]\nlet ends_with_p a b = _prim \"ends-with?\" [a; b]\nlet string_contains_p a b = _prim \"string-contains?\" [a; b]\nlet odd_p a = _prim \"odd?\" [a]\nlet even_p a = _prim \"even?\" [a]\nlet zero_p a = _prim \"zero?\" [a]\n\n(* String ops *)\nlet str' args = String (sx_str args)\nlet upper a = _prim \"upper\" [a]\nlet upcase a = _prim \"upcase\" [a]\nlet lower a = _prim \"lower\" [a]\nlet downcase a = _prim \"downcase\" [a]\nlet trim a = _prim \"trim\" [a]\nlet split a b = _prim \"split\" [a; b]\nlet join a b = _prim \"join\" [a; b]\nlet replace a b c = _prim \"replace\" [a; b; c]\nlet index_of a b = _prim \"index-of\" [a; b]\nlet substring a b c = _prim \"substring\" [a; b; c]\nlet string_length a = _prim \"string-length\" [a]\nlet char_from_code a = _prim \"char-from-code\" [a]\n\n(* Dict ops *)\nlet assoc d k v = _prim \"assoc\" [d; k; v]\nlet dissoc d k = _prim \"dissoc\" [d; k]\nlet merge' a b = _prim \"merge\" [a; b]\nlet keys a = _prim \"keys\" [a]\nlet vals a = _prim \"vals\" [a]\nlet dict_set a b c = _prim \"dict-set!\" [a; b; c]\nlet dict_get a b = _prim \"dict-get\" [a; b]\nlet dict_has_p a b = _prim \"dict-has?\" [a; b]\nlet dict_delete a b = _prim \"dict-delete!\" [a; b]\n\n(* Math *)\nlet abs' a = _prim \"abs\" [a]\nlet sqrt' a = _prim \"sqrt\" [a]\nlet pow' a b = _prim \"pow\" [a; b]\nlet floor' a = _prim \"floor\" [a]\nlet ceil' a = _prim \"ceil\" [a]\nlet round' a = _prim \"round\" [a]\nlet min' a b = _prim \"min\" [a; b]\nlet max' a b = _prim \"max\" [a; b]\nlet clamp a b c = _prim \"clamp\" [a; b; c]\nlet parse_int a = _prim \"parse-int\" [a]\nlet parse_float a = _prim \"parse-float\" [a]\n\n(* Misc *)\nlet error msg = raise (Eval_error (value_to_str msg))\n\n(* inspect wrapper — returns String value instead of OCaml string *)\nlet inspect v = String (Sx_types.inspect v)\nlet apply' f args = sx_apply f args\nlet identical_p a b = _prim \"identical?\" [a; b]\nlet _is_spread_prim a = _prim \"spread?\" [a]\nlet spread_attrs a = _prim \"spread-attrs\" [a]\nlet make_spread a = _prim \"make-spread\" [a]\n\n(* Scope primitives — delegate to sx_ref.py's shared scope stacks *)\nlet sx_collect a b = prim_call \"collect!\" [a; b]\nlet sx_collected a = prim_call \"collected\" [a]\nlet sx_clear_collected a = prim_call \"clear-collected!\" [a]\nlet sx_emit a b = prim_call \"emit!\" [a; b]\nlet sx_emitted a = prim_call \"emitted\" [a]\nlet sx_context a b = prim_call \"context\" [a; b]\n\n(* Trampoline — forward-declared in sx_ref.ml, delegates to CEK eval_expr *)\n(* This is a stub; the real trampoline is wired up in sx_ref.ml after eval_expr is defined *)\nlet trampoline v = v\n\n(* Value-returning type predicates — the transpiled code passes these through\n sx_truthy, so they need to return Bool, not OCaml bool. *)\n(* type_of returns value, not string *)\nlet type_of v = String (Sx_types.type_of v)\n\n(* Env operations — accept Env-wrapped values and value keys.\n The transpiled CEK machine stores envs in dicts as Env values. *)\nlet unwrap_env = function\n | Env e -> e\n | Dict d ->\n (* Dict used as env — wrap it. Needed by adapter-html.sx which\n passes dicts as env args (e.g. empty {} as caller env). *)\n let e = Sx_types.make_env () in\n Hashtbl.iter (fun k v -> ignore (Sx_types.env_bind e k v)) d;\n e\n | Nil ->\n Sx_types.make_env ()\n | v -> raise (Eval_error (\"Expected env, got \" ^ Sx_types.type_of v))\n\nlet env_has e name = Bool (Sx_types.env_has (unwrap_env e) (value_to_str name))\nlet env_get e name = Sx_types.env_get (unwrap_env e) (value_to_str name)\nlet env_bind e name v = Sx_types.env_bind (unwrap_env e) (value_to_str name) v\nlet env_set e name v = Sx_types.env_set (unwrap_env e) (value_to_str name) v\n\nlet make_env () = Env (Sx_types.make_env ())\nlet env_extend e = Env (Sx_types.env_extend (unwrap_env e))\nlet env_merge a b = Env (Sx_types.env_merge (unwrap_env a) (unwrap_env b))\n\n(* set_lambda_name wrapper — accepts value, extracts string *)\nlet set_lambda_name l n = Sx_types.set_lambda_name l (value_to_str n)\n\nlet is_nil v = Bool (Sx_types.is_nil v)\nlet is_thunk v = Bool (Sx_types.is_thunk v)\nlet is_lambda v = Bool (Sx_types.is_lambda v)\nlet is_component v = Bool (Sx_types.is_component v)\nlet is_island v = Bool (Sx_types.is_island v)\nlet is_macro v = Bool (Sx_types.is_macro v)\nlet is_signal v = Bool (Sx_types.is_signal v)\nlet is_callable v = Bool (Sx_types.is_callable v)\nlet is_identical a b = Bool (a == b)\nlet is_primitive name = Bool (Sx_primitives.is_primitive (value_to_str name))\nlet get_primitive name = Sx_primitives.get_primitive (value_to_str name)\nlet is_spread v = match v with Spread _ -> Bool true | _ -> Bool false\n\n(* Stubs for functions defined in sx_ref.ml — resolved at link time *)\n(* These are forward-declared here; sx_ref.ml defines the actual implementations *)\n\n(* strip-prefix *)\n(* Stubs for evaluator functions — defined in sx_ref.ml but\n sometimes referenced before their definition via forward calls.\n These get overridden by the actual transpiled definitions. *)\n\nlet map_indexed fn coll =\n List (List.mapi (fun i x -> sx_call fn [Number (float_of_int i); x]) (sx_to_list coll))\n\nlet map_dict fn d =\n match d with\n | Dict tbl ->\n let result = Hashtbl.create (Hashtbl.length tbl) in\n Hashtbl.iter (fun k v -> Hashtbl.replace result k (sx_call fn [String k; v])) tbl;\n Dict result\n | _ -> raise (Eval_error \"map-dict: expected dict\")\n\nlet for_each fn coll =\n List.iter (fun x -> ignore (sx_call fn [x])) (sx_to_list coll);\n Nil\n\nlet for_each_indexed fn coll =\n List.iteri (fun i x -> ignore (sx_call fn [Number (float_of_int i); x])) (sx_to_list coll);\n Nil\n\n(* Continuation support *)\nlet continuation_p v = match v with Continuation (_, _) -> Bool true | _ -> Bool false\n\nlet make_cek_continuation captured rest_kont =\n let data = Hashtbl.create 2 in\n Hashtbl.replace data \"captured\" captured;\n Hashtbl.replace data \"rest-kont\" rest_kont;\n Continuation ((fun v -> v), Some data)\n\nlet continuation_data v = match v with\n | Continuation (_, Some d) -> Dict d\n | Continuation (_, None) -> Dict (Hashtbl.create 0)\n | _ -> raise (Eval_error \"not a continuation\")\n\n(* Dynamic wind — simplified for OCaml (no async) *)\nlet dynamic_wind_call before body after _env =\n ignore (sx_call before []);\n let result = sx_call body [] in\n ignore (sx_call after []);\n result\n\n(* Scope stack — all delegated to primitives registered in sx_server.ml *)\nlet scope_push name value = prim_call \"scope-push!\" [name; value]\nlet scope_pop name = prim_call \"scope-pop!\" [name]\nlet scope_peek name = prim_call \"scope-peek\" [name]\nlet scope_emit name value = prim_call \"scope-emit!\" [name; value]\nlet provide_push name value = prim_call \"scope-push!\" [name; value]\nlet provide_pop name = prim_call \"scope-pop!\" [name]\n\n(* Custom special forms registry — mutable dict *)\nlet custom_special_forms = Dict (Hashtbl.create 4)\n\n(* register-special-form! — add a handler to the custom registry *)\nlet register_special_form name handler =\n (match custom_special_forms with\n | Dict tbl -> Hashtbl.replace tbl (value_to_str name) handler; handler\n | _ -> raise (Eval_error \"custom_special_forms not a dict\"))\n\n(* Render check/fn hooks — nil by default, set by platform if needed *)\nlet render_check = Nil\nlet render_fn = Nil\n\n(* is-else-clause? — check if a cond/case test is an else marker *)\nlet is_else_clause v =\n match v with\n | Keyword k -> Bool (k = \"else\" || k = \"default\")\n | Symbol s -> Bool (s = \"else\" || s = \"default\")\n | Bool true -> Bool true\n | _ -> Bool false\n\n(* Signal accessors *)\nlet signal_value s = match s with\n | Signal sig' -> sig'.s_value\n | Dict d -> (match Hashtbl.find_opt d \"value\" with Some v -> v | None -> Nil)\n | _ -> raise (Eval_error \"not a signal\")\nlet signal_set_value s v = match s with Signal sig' -> sig'.s_value <- v; v | _ -> raise (Eval_error \"not a signal\")\nlet signal_subscribers s = match s with Signal sig' -> List (List.map (fun _ -> Nil) sig'.s_subscribers) | _ -> List []\nlet signal_add_sub_b _s _f = Nil\nlet signal_remove_sub_b _s _f = Nil\nlet signal_deps _s = List []\nlet signal_set_deps _s _d = Nil\nlet notify_subscribers _s = Nil\nlet flush_subscribers _s = Nil\nlet dispose_computed _s = Nil\n\n(* Island scope stubs — accept both bare OCaml fns and NativeFn values\n from transpiled code (NativeFn wrapping for value-storable lambdas). *)\nlet with_island_scope _register_fn body_fn =\n match body_fn with\n | NativeFn (_, f) -> f []\n | _ -> Nil\nlet register_in_scope _dispose_fn = Nil\n\n(* Component type annotation stub *)\nlet component_set_param_types_b _comp _types = Nil\n\n(* Parse keyword args from a call — this is defined in evaluator.sx,\n the transpiled version will override this stub. *)\n(* Forward-reference stubs for evaluator functions used before definition *)\nlet parse_comp_params _params = List [List []; Nil; Bool false]\nlet parse_macro_params _params = List [List []; Nil]\n\nlet parse_keyword_args _raw_args _env =\n (* Stub — the real implementation is transpiled from evaluator.sx *)\n List [Dict (Hashtbl.create 0); List []]\n\n(* Make handler/query/action/page def stubs *)\nlet make_handler_def name params body _env = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"handler\"); Hashtbl.replace d \"name\" name; Hashtbl.replace d \"params\" params; Hashtbl.replace d \"body\" body; d)\nlet make_query_def name params body _env = make_handler_def name params body _env\nlet make_action_def name params body _env = make_handler_def name params body _env\nlet make_page_def name _opts = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"page\"); Hashtbl.replace d \"name\" name; d)\n\n(* sf-def* stubs — platform-specific def-forms, not in the SX spec *)\nlet sf_defhandler args env =\n let name = first args in let rest_args = rest args in\n make_handler_def name (first rest_args) (nth rest_args (Number 1.0)) env\nlet sf_defquery args env = sf_defhandler args env\nlet sf_defaction args env = sf_defhandler args env\nlet sf_defpage args _env =\n let name = first args in make_page_def name (rest args)\n\nlet strip_prefix s prefix =\n match s, prefix with\n | String s, String p ->\n let pl = String.length p in\n if String.length s >= pl && String.sub s 0 pl = p\n then String (String.sub s pl (String.length s - pl))\n else String s\n | _ -> s\n\n(* debug_log — no-op in production, used by CEK evaluator for component warnings *)\nlet debug_log _ _ = Nil\n\n","(* generated code *)"],"names":[],"mappings":"EAiaoB,IAAG,C,WATrB,K,CAAA,0B,CAAA,4BAEE,SAFF,SAGE,UAA4B,UAA5B,OAA4B,iBAAqB,K,CAAA,EACG,IAAxC,MAAP,OAAO,EAAP,OAAO,aAAwC,OAC/C,eACA,EAAC,C,EATG,SAAiC,SAAW,Q,EAF7B,WAAsB,C,KAHrC,WAA8B,WACD,YAAD,EAAjB,SAAiB,WAAiC,C,EAL7B,QAAd,OAAc,eAAoB,2BAA0C,OAAF,OAAE,cAA6B,UAAI,C,EADhG,eAAsC,C,GAFvB,QAAd,OAAc,eAAoB,2BAA6C,OAAF,OAAE,cAA+B,OAAF,OAAE,cAAmC,OAAF,OAAE,cAA6B,UAAI,C,EAHhM,YAAlB,QAAX,OAAW,aAAkB,eAAU,C,EAJR,GAAmB,C,EADpB,GAA+B,C,EAR3B,IAAG,C,KAHrC,K,CAAA,qBACqB,IADrB,OACqB,eACd,IAAG,C,EAXS,GAAO,C,KAHD,K,CAAA,qBAA6E,IAA5C,GAAjC,OAA4B,eAAK,aAA4C,OAAQ,GAAO,C,KAD5F,K,CAAA,4BAA4B,UAAmB,KAAS,qBAAiC,C,GAJ/F,K,CAAA,E,EAAA,mB,GAAA,uBACF,oBACE,GAAP,OAAO,eAA0B,OAA4B,gBAAZ,E,GACtD,qBAAiC,C,GAVxC,K,CAAA,E,EAAA,0CACqB,OAAU,OAAI,OAAa,2BAC5B,OAAU,OAAI,OAAa,8B,CAAA,EAChC,OACR,GAAU,C,KAdjB,mCACmC,SAApB,EAAuC,OAAvC,cAA+C,GACtD,sBAAqD,C,EATxC,wBAA6B,C,EADtB,kCAAqC,C,EADvC,kCAAqC,C,EAD3C,wBAA6B,C,EAD9B,wBAA6B,C,EADtB,kCAAqC,C,EANxD,cACM,eACN,cACP,EAAM,C,MAVkB,K,CAAA,sCAE2B,IAAlB,QAAL,OAAK,aAAkB,KADrB,IACqB,UADrB,QAEvB,qBAAuC,C,EALtB,EAAC,C,EAHd,QAAX,OAAW,eACX,0BACA,OADwC,OACxC,cAA0C,qBACJ,C,EANjB,K,CAAA,mBAAoC,MAAiB,GAAU,C,EAJ7D,KAAO,IAAoC,QAAhB,WAAgB,IAA3C,cAA2C,IAApC,QAAyC,K,EAAmB,WAAjB,SAAiB,OAA1F,cAA0F,IACvF,C,EALiB,KAAO,IAAP,cAAO,QAAgB,K,EAAmB,QAAjB,SAAiB,OAA9D,cAA8D,IAC3D,C,MANwB,QAAyB,IAAzB,gCAAyB,SAA0B,+B,MAH9E,K,CAAA,qBAGE,QADa,IAFf,SAEE,OAA4B,aAAoB,OAAnC,eACb,0BAAiF,aAE5E,qBAA4C,C,EARvB,KAAmC,YAAhB,WAAgB,IAAnC,cAAmC,WAAI,C,EAAoB,IAAD,WAAjB,SAAiB,OAAjF,aAAkF,K,EAXvE,K,CAAA,mBAAyB,MAAiB,GAAU,C,EADjB,SAAmB,sB,EADK,IAApB,SAAmB,QAA/C,aAAgD,K,EADtD,8CAAa,C,EADa,IAAxB,EAAL,QAAK,aAAwB,K,EADJ,IAAtB,EAAL,QAAK,aAAsB,K,EADF,IAArB,EAAL,QAAK,aAAqB,K,EADE,IAAtB,EAAL,QAAK,aAAsB,K,EADM,IAAzB,EAAL,QAAK,aAAyB,K,EADN,IAAtB,EAAL,QAAK,aAAsB,K,EADF,IAArB,EAAL,QAAK,aAAqB,K,EADJ,IAAnB,EAAL,QAAK,aAAmB,K,EAF8B,EAAhB,SAAgB,sB,EAHV,WAAe,IAA9B,SAApB,EAAkC,QAAlC,aAAkD,K,EADf,IAAf,SAAc,QAAnC,aAAoC,K,EADf,IAAtB,IAAJ,QAAI,aAAsB,K,EAFW,WAAf,SAAc,yBAAsB,C,EADnB,WAAf,SAAc,yBAAsB,C,EADzB,WAAf,SAAc,uBAAoB,C,EADb,WAAoB,IAAnC,SAAlB,EAAgC,QAAhC,aAAqD,K,EANlD,KAAO,QAAP,QAAO,cAAyB,K,GAN5C,OASb,+C,GAAA,2BARS,cAKT,MADQ,IAAR,QAAQ,eACR,0BAA4D,IAIrC,GAAwB,EAA1C,QAA0C,aAAkB,OAA1C,eAA2C,qB,CAAC,C,EAd5B,IAApB,EAAP,QAAO,aAAoB,K,EATtB,kCAA0B,C,EAD5B,wBAAuB,C,EADxB,kCAAwB,C,EADf,wBAAgC,C,EADtC,wBAAyB,C,EADzB,kCAA2B,C,EAH5B,qCAAuB,C,EADtB,qCAAwB,C,EADrB,qCAAmB,C,EADrB,+CAAyB,C,EAD3B,WAAe,C,EADQ,IAApB,EAAP,QAAO,aAAoB,K,EAHT,WAAkB,oBAAC,C,EAHjC,qCAAuB,C,EADzB,qCAAqB,C,EADrB,yDAAuB,C,EAD1B,+CAAkB,C,EADlB,+CAAkB,C,EADlB,qCAAiB,C,EADlB,qCAAgB,C,EADf,qCAAiB,C,EADjB,+CAAkB,C,EADnB,qCAAgB,C,EADjB,qCAAe,C,EAHN,+CAA2B,C,EAD5B,+CAAwB,C,EAD1B,+CAAuB,C,EADrB,yDAA2B,C,EADnC,qCAAgB,C,EADhB,qCAAgB,C,EADZ,+CAAoB,C,EADpB,+CAAqB,C,EADpB,yDAAuB,C,EAHlB,qCAA0B,C,EAD3B,qCAAyB,C,EADzB,yDAA2B,C,EAD9B,+CAAuB,C,EADtB,yDAAyB,C,EAD9B,+CAAmB,C,EADlB,+CAAoB,C,EADvB,qCAAgB,C,EADZ,qCAAoB,C,EADvB,qCAAiB,C,EADhB,qCAAkB,C,EADnB,qCAAiB,C,EADK,IAAb,SAAa,K,EAHrB,qCAAiB,C,EADjB,qCAAiB,C,EADlB,qCAAgB,C,EADF,+CAA+B,C,EADrC,+CAAyB,C,EADvB,+CAA2B,C,EAD/B,+CAAuB,C,EADtB,+CAAwB,C,EAD3B,qCAAoB,C,EADrB,qCAAmB,C,EADrB,qCAAiB,C,EADjB,qCAAiB,C,EADd,qCAAoB,C,EADrB,qCAAmB,C,EADnB,qCAAmB,C,EADtB,qCAAgB,C,EADd,qCAAkB,C,EAHZ,+CAA0B,C,EADjC,+CAAmB,C,EADnB,+CAAmB,C,EADhB,qCAAqB,C,EADzB,+CAAkB,C,EADjB,qCAAkB,C,EADlB,qCAAiB,C,EADlB,qCAAgB,C,EADhB,WAAW,C,EADb,qCAAe,C,EADX,+CAAoB,C,EADnB,+CAAqB,C,EADtB,qCAAmB,C,EADnB,qCAAmB,C,EADlB,+CAAqB,C,EADvB,+CAAmB,C,EADjB,+CAAqB,C,EADtB,qCAAmB,C,EADnB,qCAAmB,C,EADlB,qCAAoB,C,EAHiB,GAAlB,KAAkB,IAAlB,OAAkB,eAAyB,oBAAC,C,EAD/D,QAAM,EAAN,OAAM,eAA8C,QAC3C,oBAAuD,C,SAnB7E,O,CAAA,qB,CAAA,yCACY,wCAEV,OAEE,IADQ,aACR,a,AAAA,I,AAAA,G,EAAA,IACQ,OACL,qBAAkC,C,SAvC3C,QA0BY,mC,GAAA,6C,CALF,EAKE,qBAnBV,oEAOyC,0BAD5B,0BALA,kCAUK,0BAHsB,iBAHxB,2BAGA,0BAEE,0BARL,0BAOC,0BAJ+B,0BAF3B,mBAIF,uDAHqB,0BADK,0BAUrB,0BAJuB,0BAEE,iBAVL,2BAG5B,0BAFsB,0BAQc,0BAEF,0BANZ,0BAMnB,mBAER,8B,CAhBwB,EAgBxB,qBAnBR,YACgB,0BAAwB,0BAC3B,0BAAuB,kCACtB,YAAkB,M,UAAA,yD,GAAA,oDAqBtB,EArBsB,K,CAAA,qBAoBhC,OAAK,EApB2B,OAoBhC,SAAK,EAAL,OAAK,aAA2B,G,AAAA,I,AAAA,G,EAAA,IAAW,QAEnC,KAAG,C,MAlCb,K,CAAA,0B,CAAA,E,EAAA,0B,GAAA,iDAGO,qBAA4D,C,MAVnE,K,CAAA,E,EAAA,mB,GAAA,+BAEe,+BAAK,eAAW,SAAE,IADI,IACJ,UADjB,qBAAK,aAAgB,OAEZ,GAAkC,EAApD,QAAoD,aAAW,OAA7C,eAA8C,oBAAC,C,EARxC,EAAtB,SAAsB,Q,MAjBhC,K,CAAA,E,EAAA,2DAEkB,sBADI,EACJ,UADI,cAOpB,UAAuC,gBAPnB,UAOS,cAH7B,MAG6B,UAJ7B,kBAAY,eACZ,iCAA4E,oBAIrD,GAAoB,EAAtC,QAAsC,aAAS,OAA7B,eAA8B,oBAAC,C,GAjBzC,QAGN,0B,GAAA,6BADM,oBADH,EAGa,GAAyB,EAA3C,QAA2C,aAAS,OAAlC,eAAmC,qBAAC,C,EAPhB,GAA5B,KAAjB,OAAiB,aAA4B,qB,EAJH,IAAhB,SAAgB,K,GAbzB,QAOR,4DAJP,OAAG,aAAkB,OAChB,uCADsB,kC,EAGb,GADD,GAFc,mBAEd,EAKR,wBAAS,C,EAfhB,QAAM,EAAN,OAAM,eAA8C,OAExB,KAAlB,OAAkB,eAA8B,qBAD9C,EAC8C,UAD9C,c,CAC+C,C,SCZ7D,mBD8GE,MC9GF,QD8GE,cAkOgD,iZAAlB,QA1Nc,OA0Nd,aAAkB,uH,QChVlD,4D,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA,0C,EAAA,c,EAAA,c,EAAA,e,gBAAA","ignoreList":[1]}},{"offset":{"line":0,"column":120123},"map":{"version":3,"sources":["/workspace_root/lib/sx_ref.ml","/builtin/blackbox.ml"],"sourcesContent":["(* sx_ref.ml — Auto-generated from SX spec by hosts/ocaml/bootstrap.py *)\n(* Do not edit — regenerate with: python3 hosts/ocaml/bootstrap.py *)\n\n[@@@warning \"-26-27\"]\n\nopen Sx_types\nopen Sx_runtime\n\n(* Trampoline — forward ref, resolved after eval_expr is defined. *)\nlet trampoline_fn : (value -> value) ref = ref (fun v -> v)\nlet trampoline v = !trampoline_fn v\n\n\n\n(* === Mutable state for strict mode === *)\n(* These are defined as top-level refs because the transpiler cannot handle\n global set! mutation (it creates local refs that shadow the global). *)\nlet _strict_ref = ref (Bool false)\nlet _prim_param_types_ref = ref Nil\n\n(* JIT call hook — cek_call checks this before CEK dispatch for named\n lambdas. Registered by sx_server.ml after compiler loads. Tests\n run with hook = None (pure CEK, no compilation dependency). *)\nlet jit_call_hook : (value -> value list -> value option) option ref = ref None\n\n\n\n(* === Transpiled from evaluator (frames + eval + CEK) === *)\n\n(* make-cek-state *)\nlet rec make_cek_state control env kont =\n (CekState { cs_control = control; cs_env = env; cs_kont = kont; cs_phase = \"eval\"; cs_value = Nil })\n\n(* make-cek-value *)\nand make_cek_value value env kont =\n (CekState { cs_control = Nil; cs_env = env; cs_kont = kont; cs_phase = \"continue\"; cs_value = value })\n\n(* cek-terminal? *)\nand cek_terminal_p state =\n (let _and = (prim_call \"=\" [(get (state) ((String \"phase\"))); (String \"continue\")]) in if not (sx_truthy _and) then _and else (empty_p ((get (state) ((String \"kont\"))))))\n\n(* cek-control *)\nand cek_control s =\n (get (s) ((String \"control\")))\n\n(* cek-env *)\nand cek_env s =\n (get (s) ((String \"env\")))\n\n(* cek-kont *)\nand cek_kont s =\n (get (s) ((String \"kont\")))\n\n(* cek-phase *)\nand cek_phase s =\n (get (s) ((String \"phase\")))\n\n(* cek-value *)\nand cek_value s =\n (get (s) ((String \"value\")))\n\n(* make-if-frame *)\nand make_if_frame then_expr else_expr env =\n (CekFrame { cf_type = \"if\"; cf_env = env; cf_name = else_expr; cf_body = then_expr; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-when-frame *)\nand make_when_frame body_exprs env =\n (CekFrame { cf_type = \"when\"; cf_env = env; cf_name = Nil; cf_body = body_exprs; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-begin-frame *)\nand make_begin_frame remaining env =\n (CekFrame { cf_type = \"begin\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-let-frame *)\nand make_let_frame name remaining body local =\n (CekFrame { cf_type = \"let\"; cf_env = local; cf_name = name; cf_body = body; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-define-frame *)\nand make_define_frame name env has_effects effect_list =\n (CekFrame { cf_type = \"define\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = has_effects; cf_extra2 = effect_list })\n\n(* make-set-frame *)\nand make_set_frame name env =\n (CekFrame { cf_type = \"set\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-arg-frame *)\nand make_arg_frame f evaled remaining env raw_args head_name =\n (CekFrame { cf_type = \"arg\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = evaled; cf_results = raw_args; cf_extra = (let _or = head_name in if sx_truthy _or then _or else Nil); cf_extra2 = Nil })\n\n(* make-call-frame *)\nand make_call_frame f args env =\n (CekFrame { cf_type = \"call\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = f; cf_args = args; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-cond-frame *)\nand make_cond_frame remaining env scheme_p =\n (CekFrame { cf_type = \"cond\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = scheme_p; cf_extra2 = Nil })\n\n(* make-case-frame *)\nand make_case_frame match_val remaining env =\n (CekFrame { cf_type = \"case\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = match_val; cf_extra2 = Nil })\n\n(* make-thread-frame *)\nand make_thread_frame remaining env =\n (CekFrame { cf_type = \"thread\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-map-frame *)\nand make_map_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool false); cf_extra2 = Nil })\n\n(* make-map-indexed-frame *)\nand make_map_indexed_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool true); cf_extra2 = Nil })\n\n(* make-filter-frame *)\nand make_filter_frame f remaining results current_item env =\n (CekFrame { cf_type = \"filter\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = current_item; cf_extra2 = Nil })\n\n(* make-reduce-frame *)\nand make_reduce_frame f remaining env =\n (CekFrame { cf_type = \"reduce\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-for-each-frame *)\nand make_for_each_frame f remaining env =\n (CekFrame { cf_type = \"for-each\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-some-frame *)\nand make_some_frame f remaining env =\n (CekFrame { cf_type = \"some\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-every-frame *)\nand make_every_frame f remaining env =\n (CekFrame { cf_type = \"every\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-scope-frame *)\nand make_scope_frame name remaining env =\n (CekFrame { cf_type = \"scope\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-provide-frame *)\nand make_provide_frame name value remaining env =\n (CekFrame { cf_type = \"provide\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = value; cf_extra2 = Nil })\n\n(* make-scope-acc-frame *)\nand make_scope_acc_frame name value remaining env =\n (CekFrame { cf_type = \"scope-acc\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = (let _or = value in if sx_truthy _or then _or else Nil); cf_extra2 = (List []) })\n\n(* make-reset-frame *)\nand make_reset_frame env =\n (CekFrame { cf_type = \"reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dict-frame *)\nand make_dict_frame remaining results env =\n (CekFrame { cf_type = \"dict\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = results; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-and-frame *)\nand make_and_frame remaining env =\n (CekFrame { cf_type = \"and\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-or-frame *)\nand make_or_frame remaining env =\n (CekFrame { cf_type = \"or\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dynamic-wind-frame *)\nand make_dynamic_wind_frame phase body_thunk after_thunk env =\n (CekFrame { cf_type = \"dynamic-wind\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = phase; cf_extra2 = Nil })\n\n(* make-reactive-reset-frame *)\nand make_reactive_reset_frame env update_fn first_render_p =\n (CekFrame { cf_type = \"reactive-reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = update_fn; cf_extra2 = first_render_p })\n\n(* make-deref-frame *)\nand make_deref_frame env =\n (CekFrame { cf_type = \"deref\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-ho-setup-frame *)\nand make_ho_setup_frame ho_type remaining_args evaled_args env =\n (CekFrame { cf_type = \"ho-setup\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining_args; cf_f = Nil; cf_args = evaled_args; cf_results = Nil; cf_extra = ho_type; cf_extra2 = Nil })\n\n(* frame-type *)\nand frame_type f =\n (get (f) ((String \"type\")))\n\n(* kont-push *)\nand kont_push frame kont =\n (cons (frame) (kont))\n\n(* kont-top *)\nand kont_top kont =\n (first (kont))\n\n(* kont-pop *)\nand kont_pop kont =\n (rest (kont))\n\n(* kont-empty? *)\nand kont_empty_p kont =\n (empty_p (kont))\n\n(* kont-capture-to-reset *)\nand kont_capture_to_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"shift without enclosing reset\")))) else (let frame = (first (k)) in (if sx_truthy ((let _or = (prim_call \"=\" [(frame_type (frame)); (String \"reset\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")]))) then (List [captured; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* kont-find-provide *)\nand kont_find_provide kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"provide\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_provide ((rest (kont))) (name)))))\n\n(* kont-find-scope-acc *)\nand kont_find_scope_acc kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"scope-acc\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_scope_acc ((rest (kont))) (name)))))\n\n(* has-reactive-reset-frame? *)\nand has_reactive_reset_frame_p kont =\n (if sx_truthy ((empty_p (kont))) then (Bool false) else (if sx_truthy ((prim_call \"=\" [(frame_type ((first (kont)))); (String \"reactive-reset\")])) then (Bool true) else (has_reactive_reset_frame_p ((rest (kont))))))\n\n(* kont-capture-to-reactive-reset *)\nand kont_capture_to_reactive_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"reactive deref without enclosing reactive-reset\")))) else (let frame = (first (k)) in (if sx_truthy ((prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")])) then (List [captured; frame; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* *custom-special-forms* *)\nand custom_special_forms =\n (Dict (Hashtbl.create 0))\n\n(* register-special-form! *)\nand register_special_form name handler =\n (sx_dict_set_b custom_special_forms name handler)\n\n(* *render-check* *)\nand render_check =\n Nil\n\n(* *render-fn* *)\nand render_fn =\n Nil\n\n(* *strict* *)\nand _strict_ = !_strict_ref\n\n(* set-strict! *)\nand set_strict_b val' =\n _strict_ref := val'; Nil\n\n(* *prim-param-types* *)\nand _prim_param_types_ = !_prim_param_types_ref\n\n(* set-prim-param-types! *)\nand set_prim_param_types_b types =\n _prim_param_types_ref := types; Nil\n\n(* value-matches-type? *)\nand value_matches_type_p val' expected_type =\n (if sx_truthy ((prim_call \"=\" [expected_type; (String \"any\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"number\")])) then (number_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"string\")])) then (string_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"boolean\")])) then (boolean_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"nil\")])) then (is_nil (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"list\")])) then (list_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"dict\")])) then (dict_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"lambda\")])) then (is_lambda (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"symbol\")])) then (prim_call \"=\" [(type_of (val')); (String \"symbol\")]) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"keyword\")])) then (prim_call \"=\" [(type_of (val')); (String \"keyword\")]) else (if sx_truthy ((let _and = (string_p (expected_type)) in if not (sx_truthy _and) then _and else (prim_call \"ends-with?\" [expected_type; (String \"?\")]))) then (let _or = (is_nil (val')) in if sx_truthy _or then _or else (value_matches_type_p (val') ((prim_call \"slice\" [expected_type; (Number 0.0); (prim_call \"-\" [(prim_call \"string-length\" [expected_type]); (Number 1.0)])])))) else (Bool true))))))))))))\n\n(* strict-check-args *)\nand strict_check_args name args =\n (if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else !_prim_param_types_ref)) then (let spec = (get (!_prim_param_types_ref) (name)) in (if sx_truthy (spec) then (let positional = (get (spec) ((String \"positional\"))) in let rest_type = (get (spec) ((String \"rest-type\"))) in (let () = ignore ((if sx_truthy (positional) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let param = (nth (pair) ((Number 1.0))) in let p_name = (first (param)) in let p_type = (nth (param) ((Number 1.0))) in (if sx_truthy ((prim_call \"<\" [idx; (len (args))])) then (let val' = (nth (args) (idx)) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (p_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); p_type; (String \" for param \"); p_name; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [i; p])) (sx_to_list positional)))); Nil) else Nil)) in (if sx_truthy ((let _and = rest_type in if not (sx_truthy _and) then _and else (prim_call \">\" [(len (args)); (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let val' = (nth (pair) ((Number 1.0))) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (rest_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); rest_type; (String \" for rest arg \"); idx; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)))) (sx_to_list (List (List.mapi (fun i v -> let i = Number (float_of_int i) in (List [i; v])) (sx_to_list (prim_call \"slice\" [args; (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))))); Nil) else Nil))) else Nil)) else Nil)\n\n(* bind_lambda_params — shared helper for call-lambda and CEK dispatch.\n Handles &rest params: binds required params, collects rest into list. *)\nand bind_lambda_params f args local =\n let params = lambda_params f in\n let param_list = match params with List l | ListRef { contents = l } -> l | _ -> [] in\n let args_list = match args with List l | ListRef { contents = l } -> l | _ -> [] in\n let rest_idx = ref (-1) in\n List.iteri (fun i p -> match p with Symbol \"&rest\" | String \"&rest\" -> rest_idx := i | _ -> ()) param_list;\n if !rest_idx >= 0 then begin\n let required = List.filteri (fun i _ -> i < !rest_idx) param_list in\n let rest_name = (match List.nth_opt param_list (!rest_idx + 1) with\n | Some (Symbol s | String s) -> s | _ -> \"rest\") in\n List.iteri (fun i p ->\n let name = sx_to_string p in\n let v = match List.nth_opt args_list i with Some v -> v | None -> Nil in\n ignore (env_bind local name v)) required;\n let rest_vals = if !rest_idx <= List.length args_list\n then List (List.filteri (fun i _ -> i >= !rest_idx) args_list) else List [] in\n ignore (env_bind local (String rest_name) rest_vals)\n end else begin\n if sx_truthy (prim_call \">\" [len args; len params]) then\n raise (Eval_error (value_to_str (String (sx_str [\n (let _or = lambda_name f in if sx_truthy _or then _or else String \"lambda\");\n String \" expects \"; len params; String \" args, got \"; len args]))));\n ignore (List.iter (fun pair ->\n ignore (env_bind local (sx_to_string (first pair)) (nth pair (Number 1.0))))\n (sx_to_list (prim_call \"zip\" [params; args])));\n ignore (List.iter (fun p ->\n ignore (env_bind local (sx_to_string p) Nil))\n (sx_to_list (prim_call \"slice\" [params; len args])))\n end\n\n(* call-lambda — uses shared bind_lambda_params for &rest support *)\nand call_lambda f args caller_env =\n let local = env_merge (lambda_closure f) caller_env in\n bind_lambda_params f args local;\n make_thunk (lambda_body f) local\n\n(* call-component *)\nand call_component comp raw_args env =\n (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (comp))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (comp))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (comp))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_thunk ((component_body (comp))) (local)))))\n\n(* parse-keyword-args *)\nand parse_keyword_args raw_args env =\n (let kwargs = (Dict (Hashtbl.create 0)) in let children = ref ((List [])) in let i = (Number 0.0) in (let () = ignore ((List.fold_left (fun state arg -> (let idx = (get (state) ((String \"i\"))) in let skip = (get (state) ((String \"skip\"))) in (if sx_truthy (skip) then (prim_call \"assoc\" [state; (String \"skip\"); (Bool false); (String \"i\"); (prim_call \"inc\" [idx])]) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (arg)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"inc\" [idx]); (len (raw_args))]))) then (let () = ignore ((sx_dict_set_b kwargs (keyword_name (arg)) (trampoline ((eval_expr ((nth (raw_args) ((prim_call \"inc\" [idx])))) (env)))))) in (prim_call \"assoc\" [state; (String \"skip\"); (Bool true); (String \"i\"); (prim_call \"inc\" [idx])])) else (let () = ignore ((children := sx_append_b !children (trampoline ((eval_expr (arg) (env)))); Nil)) in (prim_call \"assoc\" [state; (String \"i\"); (prim_call \"inc\" [idx])])))))) (let _d = Hashtbl.create 2 in Hashtbl.replace _d (value_to_str (String \"i\")) (Number 0.0); Hashtbl.replace _d (value_to_str (String \"skip\")) (Bool false); Dict _d) (sx_to_list raw_args))) in (List [kwargs; !children])))\n\n(* cond-scheme? *)\nand cond_scheme_p clauses =\n (Bool (List.for_all (fun c -> sx_truthy ((let _and = (prim_call \"=\" [(type_of (c)); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len (c)); (Number 2.0)])))) (sx_to_list clauses)))\n\n(* is-else-clause? *)\nand is_else_clause test =\n (let _or = (let _and = (prim_call \"=\" [(type_of (test)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name (test)); (String \"else\")])) in if sx_truthy _or then _or else (let _and = (prim_call \"=\" [(type_of (test)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _or = (prim_call \"=\" [(symbol_name (test)); (String \"else\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(symbol_name (test)); (String \":else\")]))))\n\n(* sf-named-let *)\nand sf_named_let args env =\n (let loop_name = (symbol_name ((first (args)))) in let bindings = (nth (args) ((Number 1.0))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in let params = ref ((List [])) in let inits = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))); Nil)) in (inits := sx_append_b !inits (nth (binding) ((Number 1.0))); Nil)))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))); Nil)) in (inits := sx_append_b !inits (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))); Nil))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let loop_body = (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (first (body)) else (cons ((make_symbol ((String \"begin\")))) (body))) in let loop_fn = (make_lambda (!params) (loop_body) (env)) in (let () = ignore ((set_lambda_name loop_fn (sx_to_string loop_name))) in (let () = ignore ((env_bind (lambda_closure (loop_fn)) (sx_to_string loop_name) loop_fn)) in (let init_vals = (List (List.map (fun e -> (trampoline ((eval_expr (e) (env))))) (sx_to_list !inits))) in (call_lambda (loop_fn) (init_vals) (env))))))))\n\n(* sf-lambda *)\nand sf_lambda args env =\n (let params_expr = (first (args)) in let body_exprs = (rest (args)) in let body = (if sx_truthy ((prim_call \"=\" [(len (body_exprs)); (Number 1.0)])) then (first (body_exprs)) else (cons ((make_symbol ((String \"begin\")))) (body_exprs))) in let param_names = (List (List.map (fun p -> (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")]))))) then (symbol_name ((first (p)))) else p))) (sx_to_list params_expr))) in (make_lambda (param_names) (body) (env)))\n\n(* sf-defcomp *)\nand sf_defcomp args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (last (args)) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in let param_types = (nth (parsed) ((Number 2.0))) in let affinity = (defcomp_kwarg (args) ((String \"affinity\")) ((String \"auto\"))) in (let comp = (make_component (comp_name) (params) (has_children) (body) (env) (affinity)) in let effects = (defcomp_kwarg (args) ((String \"effects\")) (Nil)) in (let () = ignore ((if sx_truthy ((let _and = (Bool (not (sx_truthy ((is_nil (param_types)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((empty_p ((prim_call \"keys\" [param_types]))))))))) then (component_set_param_types_b (comp) (param_types)) else Nil)) in (let () = ignore ((if sx_truthy ((Bool (not (sx_truthy ((is_nil (effects))))))) then (let effect_list = (if sx_truthy ((prim_call \"=\" [(type_of (effects)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effects))) else (List [(String (sx_str [effects]))])) in let effect_anns = (if sx_truthy ((env_has (env) ((String \"*effect-annotations*\")))) then (env_get (env) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns (symbol_name (name_sym)) effect_list)) in (env_bind env (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) comp)) in comp)))))\n\n(* defcomp-kwarg *)\nand defcomp_kwarg args key default =\n (let end' = (prim_call \"-\" [(len (args)); (Number 1.0)]) in let result' = ref (default) in (let () = ignore ((List.iter (fun i -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((nth (args) (i)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(keyword_name ((nth (args) (i)))); key]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"+\" [i; (Number 1.0)]); end'])))) then (let val' = (nth (args) ((prim_call \"+\" [i; (Number 1.0)]))) in (result' := (if sx_truthy ((prim_call \"=\" [(type_of (val')); (String \"keyword\")])) then (keyword_name (val')) else val'); Nil)) else Nil))) (sx_to_list (prim_call \"range\" [(Number 2.0); end'; (Number 1.0)])); Nil)) in !result'))\n\n(* parse-comp-params *)\nand parse_comp_params params_expr =\n (let params = ref ((List [])) in let param_types = (Dict (Hashtbl.create 0)) in let has_children = ref ((Bool false)) in let in_key = ref ((Bool false)) in (let () = ignore ((List.iter (fun p -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (p)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")])))))) then (let name = (symbol_name ((first (p)))) in let ptype = (nth (p) ((Number 2.0))) in (let type_val = (if sx_truthy ((prim_call \"=\" [(type_of (ptype)); (String \"symbol\")])) then (symbol_name (ptype)) else ptype) in (if sx_truthy ((Bool (not (sx_truthy (!has_children))))) then (let () = ignore ((params := sx_append_b !params name; Nil)) in (sx_dict_set_b param_types name type_val)) else Nil))) else (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (let name = (symbol_name (p)) in (if sx_truthy ((prim_call \"=\" [name; (String \"&key\")])) then (in_key := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&rest\")])) then (has_children := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&children\")])) then (has_children := (Bool true); Nil) else (if sx_truthy (!has_children) then Nil else (if sx_truthy (!in_key) then (params := sx_append_b !params name; Nil) else (params := sx_append_b !params name; Nil))))))) else Nil)))) (sx_to_list params_expr); Nil)) in (List [!params; !has_children; param_types])))\n\n(* sf-defisland *)\nand sf_defisland args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (last (args)) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in (let island = (make_island (comp_name) (params) (has_children) (body) (env)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) island)) in island)))\n\n(* sf-defmacro *)\nand sf_defmacro args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (nth (args) ((Number 2.0))) in let parsed = (parse_macro_params (params_raw)) in let params = (first (parsed)) in let rest_param = (nth (parsed) ((Number 1.0))) in (let mac = (make_macro (params) (rest_param) (body) (env) ((symbol_name (name_sym)))) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) mac)) in mac)))\n\n(* parse-macro-params *)\nand parse_macro_params params_expr =\n (let params = ref ((List [])) in let rest_param = ref (Nil) in (let () = ignore ((List.fold_left (fun state p -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (p)); (String \"&rest\")]))) then (prim_call \"assoc\" [state; (String \"in-rest\"); (Bool true)]) else (if sx_truthy ((get (state) ((String \"in-rest\")))) then (let () = ignore ((rest_param := (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state) else (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state)))) (let _d = Hashtbl.create 1 in Hashtbl.replace _d (value_to_str (String \"in-rest\")) (Bool false); Dict _d) (sx_to_list params_expr))) in (List [!params; !rest_param])))\n\n(* qq-expand *)\nand qq_expand template env =\n (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"=\" [(type_of (template)); (String \"list\")])))))) then template else (if sx_truthy ((empty_p (template))) then (List []) else (let head = (first (template)) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (head)); (String \"unquote\")]))) then (trampoline ((eval_expr ((nth (template) ((Number 1.0)))) (env)))) else (List.fold_left (fun result' item -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (item)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (item)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (item)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name ((first (item)))); (String \"splice-unquote\")]))))) then (let spliced = (trampoline ((eval_expr ((nth (item) ((Number 1.0)))) (env)))) in (if sx_truthy ((prim_call \"=\" [(type_of (spliced)); (String \"list\")])) then (prim_call \"concat\" [result'; spliced]) else (if sx_truthy ((is_nil (spliced))) then result' else (prim_call \"concat\" [result'; (List [spliced])])))) else (prim_call \"concat\" [result'; (List [(qq_expand (item) (env))])]))) (List []) (sx_to_list template))))))\n\n(* sf-letrec *)\nand sf_letrec args env =\n (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in let names = ref ((List [])) in let val_exprs = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs (nth (binding) ((Number 1.0))); Nil)) in (env_bind local (sx_to_string vname) Nil)))))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))) in let val_expr = (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs val_expr; Nil)) in (env_bind local (sx_to_string vname) Nil))))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let () = ignore ((let values = (List (List.map (fun e -> (trampoline ((eval_expr (e) (local))))) (sx_to_list !val_exprs))) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (nth (pair) ((Number 1.0)))))) (sx_to_list (prim_call \"zip\" [!names; values])); Nil)) in (List.iter (fun val' -> ignore ((if sx_truthy ((is_lambda (val'))) then (List.iter (fun n -> ignore ((env_bind (lambda_closure (val')) (sx_to_string n) (env_get (local) (n))))) (sx_to_list !names); Nil) else Nil))) (sx_to_list values); Nil)))) in (let () = ignore ((List.iter (fun e -> ignore ((trampoline ((eval_expr (e) (local)))))) (sx_to_list (prim_call \"slice\" [body; (Number 0.0); (prim_call \"dec\" [(len (body))])])); Nil)) in (make_thunk ((last (body))) (local))))))\n\n(* step-sf-letrec *)\nand step_sf_letrec args env kont =\n (let thk = (sf_letrec (args) (env)) in (make_cek_state ((thunk_expr (thk))) ((thunk_env (thk))) (kont)))\n\n(* sf-dynamic-wind *)\nand sf_dynamic_wind args env =\n (let before = (trampoline ((eval_expr ((first (args))) (env)))) in let body = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let after = (trampoline ((eval_expr ((nth (args) ((Number 2.0)))) (env)))) in (dynamic_wind_call (before) (body) (after) (env)))\n\n(* sf-scope *)\nand sf_scope args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body_exprs = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest) ((Number 1.0)))) (env)))); Nil)) in (body_exprs := (prim_call \"slice\" [rest; (Number 2.0)]); Nil)) else (body_exprs := rest; Nil))) in (let () = ignore ((scope_push (name) (!val'))) in (let result' = ref (Nil) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list !body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))))\n\n(* sf-provide *)\nand sf_provide args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body_exprs = (prim_call \"slice\" [args; (Number 2.0)]) in let result' = ref (Nil) in (let () = ignore ((scope_push (name) (val'))) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))\n\n(* expand-macro *)\nand expand_macro mac raw_args env =\n (let local = (env_merge ((macro_closure (mac))) (env)) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (if sx_truthy ((prim_call \"<\" [(nth (pair) ((Number 1.0))); (len (raw_args))])) then (nth (raw_args) ((nth (pair) ((Number 1.0))))) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [p; i])) (sx_to_list (macro_params (mac)))))); Nil)) in (let () = ignore ((if sx_truthy ((macro_rest_param (mac))) then (env_bind local (sx_to_string (macro_rest_param (mac))) (prim_call \"slice\" [raw_args; (len ((macro_params (mac))))])) else Nil)) in (trampoline ((eval_expr ((macro_body (mac))) (local)))))))\n\n(* cek-run — iterative to avoid OCaml stack overflow in js_of_ocaml/WASM *)\nand cek_run state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n(* cek-step *)\nand cek_step state =\n (if sx_truthy ((prim_call \"=\" [(cek_phase (state)); (String \"eval\")])) then (step_eval (state)) else (step_continue (state)))\n\n(* step-eval *)\nand step_eval state =\n (let expr = (cek_control (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (let _match_val = (type_of (expr)) in (if _match_val = (String \"number\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"string\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"boolean\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"nil\") then (make_cek_value (Nil) (env) (kont)) else (if _match_val = (String \"symbol\") then (let name = (symbol_name (expr)) in (let val' = (if sx_truthy ((env_has (env) (name))) then (env_get (env) (name)) else (if sx_truthy ((is_primitive (name))) then (get_primitive (name)) else (if sx_truthy ((prim_call \"=\" [name; (String \"true\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [name; (String \"false\")])) then (Bool false) else (if sx_truthy ((prim_call \"=\" [name; (String \"nil\")])) then Nil else (raise (Eval_error (value_to_str (String (sx_str [(String \"Undefined symbol: \"); name])))))))))) in (let () = ignore ((if sx_truthy ((let _and = (is_nil (val')) in if not (sx_truthy _and) then _and else (prim_call \"starts-with?\" [name; (String \"~\")]))) then (debug_log ((String \"Component not found:\")) (name)) else Nil)) in (make_cek_value (val') (env) (kont))))) else (if _match_val = (String \"keyword\") then (make_cek_value ((keyword_name (expr))) (env) (kont)) else (if _match_val = (String \"dict\") then (let ks = (prim_call \"keys\" [expr]) in (if sx_truthy ((empty_p (ks))) then (make_cek_value ((Dict (Hashtbl.create 0))) (env) (kont)) else (let first_key = (first (ks)) in let remaining_entries = ref ((List [])) in (let () = ignore ((List.iter (fun k -> ignore ((remaining_entries := sx_append_b !remaining_entries (List [k; (get (expr) (k))]); Nil))) (sx_to_list (rest (ks))); Nil)) in (make_cek_state ((get (expr) (first_key))) (env) ((kont_push ((make_dict_frame (!remaining_entries) ((List [(List [first_key])])) (env))) (kont)))))))) else (if _match_val = (String \"list\") then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (step_eval_list (expr) (env) (kont))) else (make_cek_value (expr) (env) (kont))))))))))))\n\n(* step-eval-list *)\nand step_eval_list expr env kont =\n (let head = (first (expr)) in let args = (rest (expr)) in (if sx_truthy ((Bool (not (sx_truthy ((let _or = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [(type_of (head)); (String \"lambda\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(type_of (head)); (String \"list\")])))))))) then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (make_cek_state ((first (expr))) (env) ((kont_push ((make_map_frame (Nil) ((rest (expr))) ((List [])) (env))) (kont))))) else (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (let name = (symbol_name (head)) in (if sx_truthy ((prim_call \"=\" [name; (String \"if\")])) then (step_sf_if (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"when\")])) then (step_sf_when (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"cond\")])) then (step_sf_cond (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"case\")])) then (step_sf_case (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"and\")])) then (step_sf_and (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"or\")])) then (step_sf_or (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let*\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"lambda\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"fn\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"define\")])) then (step_sf_define (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defcomp\")])) then (make_cek_value ((sf_defcomp (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defisland\")])) then (make_cek_value ((sf_defisland (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defmacro\")])) then (make_cek_value ((sf_defmacro (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"begin\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"do\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quote\")])) then (make_cek_value ((if sx_truthy ((empty_p (args))) then Nil else (first (args)))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quasiquote\")])) then (make_cek_value ((qq_expand ((first (args))) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"->\")])) then (step_sf_thread_first (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"set!\")])) then (step_sf_set_b (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"letrec\")])) then (step_sf_letrec (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reset\")])) then (step_sf_reset (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"shift\")])) then (step_sf_shift (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"deref\")])) then (step_sf_deref (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"scope\")])) then (step_sf_scope (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"provide\")])) then (step_sf_provide (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"context\")])) then (step_sf_context (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emit!\")])) then (step_sf_emit (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emitted\")])) then (step_sf_emitted (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"dynamic-wind\")])) then (make_cek_value ((sf_dynamic_wind (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map\")])) then (step_ho_map (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map-indexed\")])) then (step_ho_map_indexed (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"filter\")])) then (step_ho_filter (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reduce\")])) then (step_ho_reduce (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"some\")])) then (step_ho_some (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"every?\")])) then (step_ho_every (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"for-each\")])) then (step_ho_for_each (args) (env) (kont)) else (if sx_truthy ((prim_call \"has-key?\" [custom_special_forms; name])) then (make_cek_value ((cek_call ((get (custom_special_forms) (name))) (List [args; env]))) (env) (kont)) else (if sx_truthy ((let _and = (env_has (env) (name)) in if not (sx_truthy _and) then _and else (is_macro ((env_get (env) (name)))))) then (let mac = (env_get (env) (name)) in (make_cek_state ((expand_macro (mac) (args) (env))) (env) (kont))) else (if sx_truthy ((let _and = render_check in if not (sx_truthy _and) then _and else (cek_call (render_check) (List [expr; env])))) then (make_cek_value ((cek_call (render_fn) (List [expr; env]))) (env) (kont)) else (step_eval_call (head) (args) (env) (kont))))))))))))))))))))))))))))))))))))))))))) else (step_eval_call (head) (args) (env) (kont)))))\n\n(* step-sf-if *)\nand step_sf_if args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_if_frame ((nth (args) ((Number 1.0)))) ((if sx_truthy ((prim_call \">\" [(len (args)); (Number 2.0)])) then (nth (args) ((Number 2.0))) else Nil)) (env))) (kont))))\n\n(* step-sf-when *)\nand step_sf_when args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_when_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-begin *)\nand step_sf_begin args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [(len (args)); (Number 1.0)])) then (make_cek_state ((first (args))) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_begin_frame ((rest (args))) (env))) (kont))))))\n\n(* step-sf-let *)\nand step_sf_let args env kont =\n let pairs = ref Nil in (if sx_truthy ((prim_call \"=\" [(type_of ((first (args)))); (String \"symbol\")])) then (make_cek_value ((trampoline ((sf_named_let (args) (env))))) (env) (kont)) else (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in (if sx_truthy ((empty_p (bindings))) then (step_sf_begin (body) (local) (kont)) else (let first_binding = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (first (bindings)) else (List [(first (bindings)); (nth (bindings) ((Number 1.0)))])) in let rest_bindings = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (rest (bindings)) else (let pairs = ref ((List [])) in (let () = ignore ((List.fold_left (fun _acc i -> (pairs := sx_append_b !pairs (List [(nth (bindings) ((prim_call \"*\" [i; (Number 2.0)]))); (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [i; (Number 2.0)])])))]); Nil)) Nil (sx_to_list (prim_call \"range\" [(Number 1.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])])))) in !pairs))) in (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (first_binding)))); (String \"symbol\")])) then (symbol_name ((first (first_binding)))) else (first (first_binding))) in (make_cek_state ((nth (first_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) (rest_bindings) (body) (local))) (kont)))))))))\n\n(* step-sf-define *)\nand step_sf_define args env kont =\n (let name_sym = (first (args)) in let has_effects = (let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")]))) in let val_idx = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (Number 3.0) else (Number 1.0)) in let effect_list = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (nth (args) ((Number 2.0))) else Nil) in (make_cek_state ((nth (args) (val_idx))) (env) ((kont_push ((make_define_frame ((symbol_name (name_sym))) (env) (has_effects) (effect_list))) (kont)))))\n\n(* step-sf-set! *)\nand step_sf_set_b args env kont =\n (make_cek_state ((nth (args) ((Number 1.0)))) (env) ((kont_push ((make_set_frame ((symbol_name ((first (args))))) (env))) (kont))))\n\n(* step-sf-and *)\nand step_sf_and args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool true)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_and_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-or *)\nand step_sf_or args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool false)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_or_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-cond *)\nand step_sf_cond args env kont =\n (let scheme_p = (cond_scheme_p (args)) in (if sx_truthy (scheme_p) then (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (let clause = (first (args)) in let test = (first (clause)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (clause) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool true)))) (kont))))))) else (if sx_truthy ((prim_call \"<\" [(len (args)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (args)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (args) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool false)))) (kont)))))))))\n\n(* step-sf-case *)\nand step_sf_case args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_case_frame (Nil) ((rest (args))) (env))) (kont))))\n\n(* step-sf-thread-first *)\nand step_sf_thread_first args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_thread_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-lambda *)\nand step_sf_lambda args env kont =\n (make_cek_value ((sf_lambda (args) (env))) (env) (kont))\n\n(* step-sf-scope *)\nand step_sf_scope args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest_args = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest_args)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest_args)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest_args)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest_args) ((Number 1.0)))) (env)))); Nil)) in (body := (prim_call \"slice\" [rest_args; (Number 2.0)]); Nil)) else (body := rest_args; Nil))) in (if sx_truthy ((empty_p (!body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (!body))) (env) ((kont_push ((make_scope_acc_frame (name) (!val') ((rest (!body))) (env))) (kont)))))))\n\n(* step-sf-provide *)\nand step_sf_provide args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (body))) (env) ((kont_push ((make_provide_frame (name) (val') ((rest (body))) (env))) (kont))))))\n\n(* step-sf-context *)\nand step_sf_context args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let default_val = (if sx_truthy ((prim_call \">=\" [(len (args)); (Number 2.0)])) then (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) else Nil) in let frame = (kont_find_provide (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then default_val else (get (frame) ((String \"value\"))))) (env) (kont)))\n\n(* step-sf-emit *)\nand step_sf_emit args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (let () = ignore ((if sx_truthy (frame) then (sx_dict_set_b frame (String \"emitted\") (prim_call \"append\" [(get (frame) ((String \"emitted\"))); (List [val'])])) else Nil)) in (make_cek_value (Nil) (env) (kont))))\n\n(* step-sf-emitted *)\nand step_sf_emitted args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then (List []) else (get (frame) ((String \"emitted\"))))) (env) (kont)))\n\n(* step-sf-reset *)\nand step_sf_reset args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_reset_frame (env))) (kont))))\n\n(* step-sf-shift *)\nand step_sf_shift args env kont =\n (let k_name = (symbol_name ((first (args)))) in let body = (nth (args) ((Number 1.0))) in let captured_result = (kont_capture_to_reset (kont)) in let captured = (first (captured_result)) in let rest_kont = (nth (captured_result) ((Number 1.0))) in (let k = (make_cek_continuation (captured) (rest_kont)) in (let shift_env = (env_extend (env)) in (let () = ignore ((env_bind shift_env (sx_to_string k_name) k)) in (make_cek_state (body) (shift_env) (rest_kont))))))\n\n(* step-sf-deref *)\nand step_sf_deref args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_deref_frame (env))) (kont))))\n\n(* cek-call *)\nand cek_call f args =\n (let a = (if sx_truthy ((is_nil (args))) then (List []) else args) in (if sx_truthy ((is_nil (f))) then Nil else (if sx_truthy ((let _or = (is_lambda (f)) in if sx_truthy _or then _or else (is_callable (f)))) then (cek_run ((continue_with_call (f) (a) ((make_env ())) (a) ((List []))))) else Nil)))\n\n(* reactive-shift-deref *)\nand reactive_shift_deref sig' env kont =\n (let scan_result = (kont_capture_to_reactive_reset (kont)) in let captured_frames = (first (scan_result)) in let reset_frame = (nth (scan_result) ((Number 1.0))) in let remaining_kont = (nth (scan_result) ((Number 2.0))) in let update_fn = (get (reset_frame) ((String \"update-fn\"))) in (let sub_disposers = ref ((List [])) in (let subscriber = (NativeFn (\"\\206\\187\", fun _args -> (fun () -> let sub_disposers = ref Nil in (let () = ignore ((List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil)) in (let () = ignore ((sub_disposers := (List []); Nil)) in (let new_reset = (make_reactive_reset_frame (env) (update_fn) ((Bool false))) in let new_kont = (prim_call \"concat\" [captured_frames; (List [new_reset]); remaining_kont]) in (with_island_scope ((NativeFn (\"\\206\\187\", fun _args -> match _args with [d] -> (fun d -> let sub_disposers = ref Nil in (sub_disposers := sx_append_b !sub_disposers d; Nil)) d | _ -> Nil))) ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (cek_run ((make_cek_value ((signal_value (sig'))) (env) (new_kont))))) ())))))))) ())) in (let () = ignore ((signal_add_sub_b (sig') (subscriber))) in (let () = ignore ((register_in_scope ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (let () = ignore ((signal_remove_sub_b (sig') (subscriber))) in (List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil))) ()))))) in (let initial_kont = (prim_call \"concat\" [captured_frames; (List [reset_frame]); remaining_kont]) in (make_cek_value ((signal_value (sig'))) (env) (initial_kont))))))))\n\n(* step-eval-call *)\nand step_eval_call head args env kont =\n (let hname = (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (symbol_name (head)) else Nil) in (make_cek_state (head) (env) ((kont_push ((make_arg_frame (Nil) ((List [])) (args) (env) (args) (hname))) (kont)))))\n\n(* ho-form-name? *)\nand ho_form_name_p name =\n (let _or = (prim_call \"=\" [name; (String \"map\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"map-indexed\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"filter\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"reduce\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"some\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"every?\")]) in if sx_truthy _or then _or else (prim_call \"=\" [name; (String \"for-each\")])))))))\n\n(* ho-fn? *)\nand ho_fn_p v =\n (let _or = (is_callable (v)) in if sx_truthy _or then _or else (is_lambda (v)))\n\n(* ho-swap-args *)\nand ho_swap_args ho_type evaled =\n (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; (nth (evaled) ((Number 2.0))); a]) else evaled)) else (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; a]) else evaled)))\n\n(* ho-setup-dispatch *)\nand ho_setup_dispatch ho_type evaled env kont =\n (let ordered = (ho_swap_args (ho_type) (evaled)) in (let f = (first (ordered)) in (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_map_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map-indexed\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(Number 0.0); (first (coll))])) (env) ((List [])) ((kont_push ((make_map_indexed_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"filter\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (coll))) ((List [])) ((first (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let init = (nth (ordered) ((Number 1.0))) in let coll = (nth (ordered) ((Number 2.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (init) (env) (kont)) else (continue_with_call (f) ((List [init; (first (coll))])) (env) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"some\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool false)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_some_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"every\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool true)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_every_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"for-each\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (Nil) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (coll))) (env))) (kont)))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown HO type: \"); ho_type]))))))))))))))\n\n(* step-ho-map *)\nand step_ho_map args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-map-indexed *)\nand step_ho_map_indexed args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map-indexed\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-filter *)\nand step_ho_filter args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"filter\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-reduce *)\nand step_ho_reduce args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"reduce\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-some *)\nand step_ho_some args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"some\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-every *)\nand step_ho_every args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"every\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-for-each *)\nand step_ho_for_each args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"for-each\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-continue *)\nand step_continue state =\n (let value = (cek_value (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (if sx_truthy ((kont_empty_p (kont))) then state else (let frame = (kont_top (kont)) in let rest_k = (kont_pop (kont)) in let ft = (frame_type (frame)) in (if sx_truthy ((prim_call \"=\" [ft; (String \"if\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (make_cek_state ((get (frame) ((String \"then\")))) ((get (frame) ((String \"env\")))) (rest_k)) else (if sx_truthy ((is_nil ((get (frame) ((String \"else\")))))) then (make_cek_value (Nil) (env) (rest_k)) else (make_cek_state ((get (frame) ((String \"else\")))) ((get (frame) ((String \"env\")))) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"when\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (let body = (get (frame) ((String \"body\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (make_cek_state ((first (body))) (fenv) (rest_k)) else (make_cek_state ((first (body))) (fenv) ((kont_push ((make_begin_frame ((rest (body))) (fenv))) (rest_k))))))) else (make_cek_value (Nil) (env) (rest_k))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"begin\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then (make_cek_state ((first (remaining))) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_begin_frame ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"let\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let body = (get (frame) ((String \"body\"))) in let local = (get (frame) ((String \"env\"))) in (let () = ignore ((env_bind local (sx_to_string name) value)) in (if sx_truthy ((empty_p (remaining))) then (step_sf_begin (body) (local) (rest_k)) else (let next_binding = (first (remaining)) in let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (next_binding)))); (String \"symbol\")])) then (symbol_name ((first (next_binding)))) else (first (next_binding))) in (make_cek_state ((nth (next_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) ((rest (remaining))) (body) (local))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"define\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in let has_effects = (get (frame) ((String \"has-effects\"))) in let effect_list = (get (frame) ((String \"effect-list\"))) in (let () = ignore ((if sx_truthy ((let _and = (is_lambda (value)) in if not (sx_truthy _and) then _and else (is_nil ((lambda_name (value)))))) then (set_lambda_name value (sx_to_string name)) else Nil)) in (let () = ignore ((env_bind fenv (sx_to_string name) value)) in (let () = ignore ((if sx_truthy (has_effects) then (let effect_names = (if sx_truthy ((prim_call \"=\" [(type_of (effect_list)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effect_list))) else (List [(String (sx_str [effect_list]))])) in let effect_anns = (if sx_truthy ((env_has (fenv) ((String \"*effect-annotations*\")))) then (env_get (fenv) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns name effect_names)) in (env_bind fenv (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (make_cek_value (value) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"set\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in (let () = ignore ((env_set fenv (sx_to_string name) value)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"and\")])) then (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_and_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"or\")])) then (if sx_truthy (value) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_or_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"cond\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let scheme_p = (get (frame) ((String \"scheme\"))) in (if sx_truthy (scheme_p) then (if sx_truthy (value) then (make_cek_state ((nth ((first (remaining))) ((Number 1.0)))) (fenv) (rest_k)) else (let next_clauses = (rest (remaining)) in (if sx_truthy ((empty_p (next_clauses))) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_clause = (first (next_clauses)) in let next_test = (first (next_clause)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next_clause) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next_clauses) (fenv) ((Bool true)))) (rest_k))))))))) else (if sx_truthy (value) then (make_cek_state ((nth (remaining) ((Number 1.0)))) (fenv) (rest_k)) else (let next = (prim_call \"slice\" [remaining; (Number 2.0)]) in (if sx_truthy ((prim_call \"<\" [(len (next)); (Number 2.0)])) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_test = (first (next)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next) (fenv) ((Bool false)))) (rest_k))))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"case\")])) then (let match_val = (get (frame) ((String \"match-val\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((is_nil (match_val))) then (sf_case_step_loop (value) (remaining) (fenv) (rest_k)) else (sf_case_step_loop (match_val) (remaining) (fenv) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"thread\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (let form = (first (remaining)) in let rest_forms = (rest (remaining)) in let new_kont = (if sx_truthy ((empty_p ((rest (remaining))))) then rest_k else (kont_push ((make_thread_frame ((rest (remaining))) (fenv))) (rest_k))) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (form)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((empty_p (form)))))) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (form)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (ho_form_name_p ((symbol_name ((first (form)))))))))) then (make_cek_state ((cons ((first (form))) ((cons ((List [(Symbol \"quote\"); value])) ((rest (form))))))) (fenv) (new_kont)) else (let result' = (if sx_truthy ((prim_call \"=\" [(type_of (form)); (String \"list\")])) then (let f = (trampoline ((eval_expr ((first (form))) (fenv)))) in let rargs = (List (List.map (fun a -> (trampoline ((eval_expr (a) (fenv))))) (sx_to_list (rest (form))))) in let all_args = (cons (value) (rargs)) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (sx_apply f all_args) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) (all_args) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))])))))))) else (let f = (trampoline ((eval_expr (form) (fenv)))) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (cek_call (f) (List [value])) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) ((List [value])) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))]))))))))) in (if sx_truthy ((empty_p (rest_forms))) then (make_cek_value (result') (fenv) (rest_k)) else (make_cek_value (result') (fenv) ((kont_push ((make_thread_frame (rest_forms) (fenv))) (rest_k)))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"arg\")])) then (let f = (get (frame) ((String \"f\"))) in let evaled = (get (frame) ((String \"evaled\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let raw_args = (get (frame) ((String \"raw-args\"))) in let hname = (get (frame) ((String \"head-name\"))) in (if sx_truthy ((is_nil (f))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) ((List []))) else Nil)) in (if sx_truthy ((empty_p (remaining))) then (continue_with_call (value) ((List [])) (fenv) (raw_args) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (value) ((List [])) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))) else (let new_evaled = (prim_call \"append\" [evaled; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) (new_evaled)) else Nil)) in (continue_with_call (f) (new_evaled) (fenv) (raw_args) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (f) (new_evaled) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"dict\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let fenv = (get (frame) ((String \"env\"))) in (let last_result = (last (results)) in let completed = (prim_call \"append\" [(prim_call \"slice\" [results; (Number 0.0); (prim_call \"dec\" [(len (results))])]); (List [(List [(first (last_result)); value])])]) in (if sx_truthy ((empty_p (remaining))) then (let d = (Dict (Hashtbl.create 0)) in (let () = ignore ((List.iter (fun pair -> ignore ((sx_dict_set_b d (first (pair)) (nth (pair) ((Number 1.0)))))) (sx_to_list completed); Nil)) in (make_cek_value (d) (fenv) (rest_k)))) else (let next_entry = (first (remaining)) in (make_cek_state ((nth (next_entry) ((Number 1.0)))) (fenv) ((kont_push ((make_dict_frame ((rest (remaining))) ((prim_call \"append\" [completed; (List [(List [(first (next_entry))])])])) (fenv))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"ho-setup\")])) then (let ho_type = (get (frame) ((String \"ho-type\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let evaled = (prim_call \"append\" [(get (frame) ((String \"evaled\"))); (List [value])]) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (ho_setup_dispatch (ho_type) (evaled) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_ho_setup_frame (ho_type) ((rest (remaining))) (evaled) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reset\")])) then (make_cek_value (value) (env) (rest_k)) else (if sx_truthy ((prim_call \"=\" [ft; (String \"deref\")])) then (let val' = value in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy ((is_signal (val'))))))) then (make_cek_value (val') (fenv) (rest_k)) else (if sx_truthy ((has_reactive_reset_frame_p (rest_k))) then (reactive_shift_deref (val') (fenv) (rest_k)) else (let () = ignore ((let ctx = (sx_context ((String \"sx-reactive\")) (Nil)) in (if sx_truthy (ctx) then (let dep_list = ref ((get (ctx) ((String \"deps\")))) in let notify_fn = (get (ctx) ((String \"notify\"))) in (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"contains?\" [!dep_list; val'])))))) then (let () = ignore ((dep_list := sx_append_b !dep_list val'; Nil)) in (signal_add_sub_b (val') (notify_fn))) else Nil)) else Nil))) in (make_cek_value ((signal_value (val'))) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reactive-reset\")])) then (let update_fn = (get (frame) ((String \"update-fn\"))) in let first_p = (get (frame) ((String \"first-render\"))) in (let () = ignore ((if sx_truthy ((let _and = update_fn in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy (first_p)))))) then (cek_call (update_fn) ((List [value]))) else Nil)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((scope_pop (name))) in (make_cek_value (value) (fenv) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_scope_frame (name) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"provide\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_provide_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope-acc\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((let new_frame = (make_scope_acc_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv)) in (let () = ignore ((sx_dict_set_b new_frame (String \"emitted\") (get (frame) ((String \"emitted\"))))) in new_frame))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"map\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let indexed = (get (frame) ((String \"indexed\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (prim_call \"append\" [results; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (let call_args = (if sx_truthy (indexed) then (List [(len (new_results)); (first (remaining))]) else (List [(first (remaining))])) in let next_frame = (if sx_truthy (indexed) then (make_map_indexed_frame (f) ((rest (remaining))) (new_results) (fenv)) else (make_map_frame (f) ((rest (remaining))) (new_results) (fenv))) in (continue_with_call (f) (call_args) (fenv) ((List [])) ((kont_push (next_frame) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"filter\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let current_item = (get (frame) ((String \"current-item\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (if sx_truthy (value) then (prim_call \"append\" [results; (List [current_item])]) else results) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (remaining))) (new_results) ((first (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reduce\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (continue_with_call (f) ((List [value; (first (remaining))])) (fenv) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"for-each\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (Nil) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"some\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy (value) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_some_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"every\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool true)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_every_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown frame type: \"); ft]))))))))))))))))))))))))))))))))))\n\n(* continue-with-call *)\nand continue_with_call f args env raw_args kont =\n (if sx_truthy ((continuation_p (f))) then (let arg = (if sx_truthy ((empty_p (args))) then Nil else (first (args))) in let cont_data = (continuation_data (f)) in (let captured = (get (cont_data) ((String \"captured\"))) in (let result' = (cek_run ((make_cek_value (arg) (env) (captured)))) in (make_cek_value (result') (env) (kont))))) else (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_lambda (f)))))) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_component (f)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_island (f)))))))))) then (make_cek_value ((sx_apply f args)) (env) (kont)) else (if sx_truthy ((is_lambda (f))) then (let local = (env_merge ((lambda_closure (f))) (env)) in let () = bind_lambda_params f args local in (match !jit_call_hook, f with | Some hook, Lambda l when l.l_name <> None -> let args_list = match args with List a | ListRef { contents = a } -> a | _ -> [] in (match hook f args_list with Some result -> make_cek_value result local kont | None -> make_cek_state (lambda_body f) local kont) | _ -> make_cek_state ((lambda_body (f))) (local) (kont))) else (if sx_truthy ((let _or = (is_component (f)) in if sx_truthy _or then _or else (is_island (f)))) then (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (f))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (f))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (f))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_cek_state ((component_body (f))) (local) (kont))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Not callable: \"); (inspect (f))])))))))))\n\n(* sf-case-step-loop *)\nand sf_case_step_loop match_val clauses env kont =\n (if sx_truthy ((prim_call \"<\" [(len (clauses)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (clauses)) in let body = (nth (clauses) ((Number 1.0))) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state (body) (env) (kont)) else (let test_val = (trampoline ((eval_expr (test) (env)))) in (if sx_truthy ((prim_call \"=\" [match_val; test_val])) then (make_cek_state (body) (env) (kont)) else (sf_case_step_loop (match_val) ((prim_call \"slice\" [clauses; (Number 2.0)])) (env) (kont)))))))\n\n(* eval-expr-cek *)\nand eval_expr_cek expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n(* trampoline-cek *)\nand trampoline_cek val' =\n (if sx_truthy ((is_thunk (val'))) then (eval_expr_cek ((thunk_expr (val'))) ((thunk_env (val')))) else val')\n\n(* eval-expr *)\nand eval_expr expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n\n(* Wire up trampoline to resolve thunks via the CEK machine *)\nlet () = trampoline_fn := (fun v ->\n match v with\n | Thunk (expr, env) -> eval_expr expr (Env env)\n | _ -> v)\n\n(* Wire up the primitives trampoline so call_any in HO forms resolves Thunks *)\nlet () = Sx_primitives._sx_trampoline_fn := !trampoline_fn\n\n(* Override recursive cek_run with iterative loop *)\nlet cek_run_iterative state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":184551},"map":{"version":3,"sources":["/workspace_root/lib/sx_vm.ml","/builtin/blackbox.ml"],"sourcesContent":["(** SX bytecode VM — stack-based interpreter.\n\n Executes bytecode produced by compiler.sx.\n Designed for speed: array-based stack, direct dispatch,\n no allocation per step (unlike the CEK machine).\n\n This is the platform-native execution engine. The same bytecode\n runs on all platforms (OCaml, JS, WASM).\n\n VM types (vm_code, vm_upvalue_cell, vm_closure) are defined in\n sx_types.ml to share the mutual recursion block with [value]. *)\n\nopen Sx_types\n\n(** Call frame — one per function invocation. *)\ntype frame = {\n closure : vm_closure;\n mutable ip : int;\n base : int; (* base index in value stack for locals *)\n local_cells : (int, vm_upvalue_cell) Hashtbl.t; (* slot → shared cell for captured locals *)\n}\n\n(** VM state. *)\ntype vm = {\n mutable stack : value array;\n mutable sp : int;\n mutable frames : frame list;\n globals : (string, value) Hashtbl.t; (* live reference to kernel env *)\n}\n\n(** Forward reference for JIT compilation — set after definition. *)\nlet jit_compile_ref : (lambda -> (string, value) Hashtbl.t -> vm_closure option) ref =\n ref (fun _ _ -> None)\n\n(** Sentinel closure indicating JIT compilation was attempted and failed.\n Prevents retrying compilation on every call. *)\nlet jit_failed_sentinel = {\n vm_code = { vc_arity = -1; vc_locals = 0; vc_bytecode = [||]; vc_constants = [||] };\n vm_upvalues = [||]; vm_name = Some \"__jit_failed__\"; vm_env_ref = Hashtbl.create 0; vm_closure_env = None\n}\n\nlet is_jit_failed cl = cl.vm_code.vc_arity = -1\n\nlet create globals =\n { stack = Array.make 4096 Nil; sp = 0; frames = []; globals }\n\n(** Stack ops — inlined for speed. *)\nlet push vm v =\n if vm.sp >= Array.length vm.stack then begin\n let ns = Array.make (vm.sp * 2) Nil in\n Array.blit vm.stack 0 ns 0 vm.sp;\n vm.stack <- ns\n end;\n vm.stack.(vm.sp) <- v;\n vm.sp <- vm.sp + 1\n\nlet[@inline] pop vm =\n vm.sp <- vm.sp - 1;\n vm.stack.(vm.sp)\n\nlet[@inline] peek vm = vm.stack.(vm.sp - 1)\n\n(** Read operands. *)\nlet[@inline] read_u8 f =\n let v = f.closure.vm_code.vc_bytecode.(f.ip) in\n f.ip <- f.ip + 1; v\n\nlet[@inline] read_u16 f =\n let lo = f.closure.vm_code.vc_bytecode.(f.ip) in\n let hi = f.closure.vm_code.vc_bytecode.(f.ip + 1) in\n f.ip <- f.ip + 2;\n lo lor (hi lsl 8)\n\nlet[@inline] read_i16 f =\n let v = read_u16 f in\n if v >= 32768 then v - 65536 else v\n\n(** Wrap a VM closure as an SX value (NativeFn). *)\nlet closure_to_value cl =\n NativeFn (\"vm:\" ^ (match cl.vm_name with Some n -> n | None -> \"anon\"),\n fun args -> raise (Eval_error (\"VM_CLOSURE_CALL:\" ^ String.concat \",\" (List.map Sx_runtime.value_to_str args))))\n (* Placeholder — actual calls go through vm_call below *)\n\nlet _vm_insn_count = ref 0\nlet _vm_call_count = ref 0\nlet _vm_cek_count = ref 0\nlet vm_reset_counters () = _vm_insn_count := 0; _vm_call_count := 0; _vm_cek_count := 0\nlet vm_report_counters () =\n Printf.eprintf \"[vm-perf] insns=%d calls=%d cek_fallbacks=%d\\n%!\"\n !_vm_insn_count !_vm_call_count !_vm_cek_count\n\n(** Push a VM closure frame onto the current VM — no new VM allocation.\n This is the fast path for intra-VM closure calls. *)\nlet push_closure_frame vm cl args =\n let frame = { closure = cl; ip = 0; base = vm.sp; local_cells = Hashtbl.create 4 } in\n List.iter (fun a -> push vm a) args;\n for _ = List.length args to cl.vm_code.vc_locals - 1 do push vm Nil done;\n vm.frames <- frame :: vm.frames\n\n(** Convert compiler output (SX dict) to a vm_code object. *)\nlet code_from_value v =\n match v with\n | Dict d ->\n let bc_list = match Hashtbl.find_opt d \"bytecode\" with\n | Some (List l | ListRef { contents = l }) ->\n Array.of_list (List.map (fun x -> match x with Number n -> int_of_float n | _ -> 0) l)\n | _ -> [||]\n in\n let entries = match Hashtbl.find_opt d \"constants\" with\n | Some (List l | ListRef { contents = l }) -> Array.of_list l\n | _ -> [||]\n in\n let constants = Array.map (fun entry ->\n match entry with\n | Dict ed when Hashtbl.mem ed \"bytecode\" -> entry (* nested code — convert lazily *)\n | _ -> entry\n ) entries in\n let arity = match Hashtbl.find_opt d \"arity\" with\n | Some (Number n) -> int_of_float n | _ -> 0\n in\n { vc_arity = arity; vc_locals = arity + 16; vc_bytecode = bc_list; vc_constants = constants }\n | _ -> { vc_arity = 0; vc_locals = 16; vc_bytecode = [||]; vc_constants = [||] }\n\n(** Execute a closure with arguments — creates a fresh VM.\n Used for entry points: JIT Lambda calls, module execution, cross-boundary. *)\nlet rec call_closure cl args globals =\n incr _vm_call_count;\n let vm = create globals in\n push_closure_frame vm cl args;\n (try run vm with e -> raise e);\n pop vm\n\n(** Call a value as a function — dispatch by type.\n VmClosure: pushes frame on current VM (fast intra-VM path).\n Lambda: tries JIT then falls back to CEK.\n NativeFn: calls directly. *)\nand vm_call vm f args =\n match f with\n | VmClosure cl ->\n (* Fast path: push frame on current VM — no allocation, enables TCO *)\n push_closure_frame vm cl args\n | NativeFn (_name, fn) ->\n let result = fn args in\n push vm result\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (is_jit_failed cl) ->\n (* Cached bytecode — run on VM, fall back to CEK on runtime error *)\n (try push vm (call_closure cl args vm.globals)\n with _ -> push vm (Sx_ref.cek_call f (List args)))\n | Some _ ->\n (* Compile failed — CEK *)\n push vm (Sx_ref.cek_call f (List args))\n | None ->\n if l.l_name <> None\n then begin\n (* Pre-mark before compile attempt to prevent re-entrancy *)\n l.l_compiled <- Some jit_failed_sentinel;\n match !jit_compile_ref l vm.globals with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try push vm (call_closure cl args vm.globals)\n with _ ->\n l.l_compiled <- Some jit_failed_sentinel;\n push vm (Sx_ref.cek_call f (List args)))\n | None ->\n push vm (Sx_ref.cek_call f (List args))\n end\n else\n push vm (Sx_ref.cek_call f (List args)))\n | Component _ | Island _ ->\n (* Components use keyword-arg parsing — CEK handles this *)\n incr _vm_cek_count;\n let result = Sx_ref.cek_call f (List args) in\n push vm result\n | _ ->\n raise (Eval_error (\"VM: not callable: \" ^ Sx_runtime.value_to_str f))\n\n(** Main execution loop — iterative (no OCaml stack growth).\n VmClosure calls push frames; the loop picks them up.\n OP_TAIL_CALL + VmClosure = true TCO: drop frame, push new, loop. *)\nand run vm =\n while vm.frames <> [] do\n match vm.frames with\n | [] -> () (* guard handled by while condition *)\n | frame :: rest_frames ->\n let bc = frame.closure.vm_code.vc_bytecode in\n let consts = frame.closure.vm_code.vc_constants in\n if frame.ip >= Array.length bc then\n vm.frames <- [] (* bytecode exhausted — stop *)\n else begin\n let saved_ip = frame.ip in\n let op = bc.(frame.ip) in\n frame.ip <- frame.ip + 1;\n (try match op with\n (* ---- Constants ---- *)\n | 1 (* OP_CONST *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CONST index %d out of bounds (pool size %d)\"\n idx (Array.length consts)));\n push vm consts.(idx)\n | 2 (* OP_NIL *) -> push vm Nil\n | 3 (* OP_TRUE *) -> push vm (Bool true)\n | 4 (* OP_FALSE *) -> push vm (Bool false)\n | 5 (* OP_POP *) -> ignore (pop vm)\n | 6 (* OP_DUP *) -> push vm (peek vm)\n\n (* ---- Variable access ---- *)\n | 16 (* OP_LOCAL_GET *) ->\n let slot = read_u8 frame in\n let v = match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value\n | None ->\n let idx = frame.base + slot in\n if idx >= vm.sp then\n raise (Eval_error (Printf.sprintf\n \"VM: LOCAL_GET slot=%d base=%d sp=%d out of bounds\" slot frame.base vm.sp));\n vm.stack.(idx)\n in\n push vm v\n | 17 (* OP_LOCAL_SET *) ->\n let slot = read_u8 frame in\n let v = peek vm in\n (* Write to shared cell if captured, else to stack *)\n (match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value <- v\n | None -> vm.stack.(frame.base + slot) <- v)\n | 18 (* OP_UPVALUE_GET *) ->\n let idx = read_u8 frame in\n if idx >= Array.length frame.closure.vm_upvalues then\n raise (Eval_error (Printf.sprintf\n \"VM: UPVALUE_GET idx=%d out of bounds (have %d)\" idx\n (Array.length frame.closure.vm_upvalues)));\n push vm frame.closure.vm_upvalues.(idx).uv_value\n | 19 (* OP_UPVALUE_SET *) ->\n let idx = read_u8 frame in\n frame.closure.vm_upvalues.(idx).uv_value <- peek vm\n | 20 (* OP_GLOBAL_GET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = try Hashtbl.find vm.globals name with Not_found ->\n (* Walk the closure env chain for inner functions *)\n let rec env_lookup e =\n try Hashtbl.find e.bindings name\n with Not_found ->\n match e.parent with Some p -> env_lookup p | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n match frame.closure.vm_closure_env with\n | Some env -> env_lookup env\n | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n push vm v\n | 21 (* OP_GLOBAL_SET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n (* Write to closure env if the name exists there (mutable closure vars) *)\n let written = match frame.closure.vm_closure_env with\n | Some env ->\n let rec find_env e =\n if Hashtbl.mem e.bindings name then\n (Hashtbl.replace e.bindings name (peek vm); true)\n else match e.parent with Some p -> find_env p | None -> false\n in find_env env\n | None -> false\n in\n if not written then Hashtbl.replace vm.globals name (peek vm)\n\n (* ---- Control flow ---- *)\n | 32 (* OP_JUMP *) ->\n let offset = read_i16 frame in\n frame.ip <- frame.ip + offset\n | 33 (* OP_JUMP_IF_FALSE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if not (sx_truthy v) then frame.ip <- frame.ip + offset\n | 34 (* OP_JUMP_IF_TRUE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if sx_truthy v then frame.ip <- frame.ip + offset\n\n (* ---- Function calls ---- *)\n | 48 (* OP_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n vm_call vm f args_list\n (* Loop continues — if VmClosure, new frame runs next iteration *)\n | 49 (* OP_TAIL_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n (* Drop current frame, reuse stack space — true TCO for VmClosure *)\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n vm_call vm f args_list\n | 50 (* OP_RETURN *) ->\n let result = pop vm in\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n push vm result\n (* Loop continues with caller frame *)\n | 51 (* OP_CLOSURE *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CLOSURE idx %d >= consts %d\" idx (Array.length consts)));\n let code_val = consts.(idx) in\n let code = code_from_value code_val in\n (* Read upvalue descriptors from bytecode *)\n let uv_count = match code_val with\n | Dict d -> (match Hashtbl.find_opt d \"upvalue-count\" with\n | Some (Number n) -> int_of_float n | _ -> 0)\n | _ -> 0\n in\n let upvalues = Array.init uv_count (fun _ ->\n let is_local = read_u8 frame in\n let index = read_u8 frame in\n if is_local = 1 then begin\n (* Capture from enclosing frame's local slot.\n Create a shared cell — both parent and closure\n read/write through this cell. *)\n let cell = match Hashtbl.find_opt frame.local_cells index with\n | Some existing -> existing (* reuse existing cell *)\n | None ->\n let c = { uv_value = vm.stack.(frame.base + index) } in\n Hashtbl.replace frame.local_cells index c;\n c\n in\n cell\n end else\n (* Capture from enclosing frame's upvalue — already a shared cell *)\n frame.closure.vm_upvalues.(index)\n ) in\n let cl = { vm_code = code; vm_upvalues = upvalues; vm_name = None;\n vm_env_ref = vm.globals; vm_closure_env = None } in\n push vm (VmClosure cl)\n | 52 (* OP_CALL_PRIM *) ->\n let idx = read_u16 frame in\n let argc = read_u8 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let args = List.init argc (fun _ -> pop vm) |> List.rev in\n (* Resolve thunks — the CEK evaluator does this automatically\n via trampoline, but the VM must do it explicitly before\n passing args to primitives. *)\n let args = List.map (fun v ->\n match v with\n | Thunk _ -> !Sx_primitives._sx_trampoline_fn v\n | _ -> v) args in\n let result =\n try\n (* Check primitives FIRST (native implementations of map/filter/etc.),\n then globals (which may have ho_via_cek wrappers that route\n through the CEK — these can't call VM closures). *)\n let fn_val = try Sx_primitives.get_primitive name with _ ->\n try Hashtbl.find vm.globals name with Not_found ->\n raise (Eval_error (\"VM: unknown primitive \" ^ name))\n in\n (match fn_val with\n | NativeFn (_, fn) -> fn args\n | _ -> Nil)\n with Eval_error msg ->\n raise (Eval_error (Printf.sprintf \"%s (in CALL_PRIM \\\"%s\\\" with %d args)\"\n msg name argc))\n in\n push vm result\n\n (* ---- Collections ---- *)\n | 64 (* OP_LIST *) ->\n let count = read_u16 frame in\n let items = List.init count (fun _ -> pop vm) |> List.rev in\n push vm (List items)\n | 65 (* OP_DICT *) ->\n let count = read_u16 frame in\n let d = Hashtbl.create count in\n for _ = 1 to count do\n let v = pop vm in\n let k = pop vm in\n let key = match k with String s -> s | Keyword s -> s | _ -> Sx_runtime.value_to_str k in\n Hashtbl.replace d key v\n done;\n push vm (Dict d)\n\n (* ---- String ops ---- *)\n | 144 (* OP_STR_CONCAT *) ->\n let count = read_u8 frame in\n let parts = List.init count (fun _ -> pop vm) |> List.rev in\n let s = String.concat \"\" (List.map Sx_runtime.value_to_str parts) in\n push vm (String s)\n\n (* ---- Define ---- *)\n | 128 (* OP_DEFINE *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = peek vm in\n Hashtbl.replace vm.globals name v\n\n (* ---- Inline primitives ----\n Fast path for common types; fallback to actual primitive\n for edge cases (type coercion, thunks, RawHTML, etc.)\n to guarantee behavioral parity with CALL_PRIM. *)\n | 160 (* OP_ADD *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x +. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"+\") [a; b])\n | 161 (* OP_SUB *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x -. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [a; b])\n | 162 (* OP_MUL *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x *. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"*\") [a; b])\n | 163 (* OP_DIV *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x /. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"/\") [a; b])\n | 164 (* OP_EQ *) ->\n let b = pop vm and a = pop vm in\n let rec norm = function\n | ListRef { contents = l } -> List (List.map norm l)\n | List l -> List (List.map norm l) | v -> v in\n push vm (Bool (norm a = norm b))\n | 165 (* OP_LT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x < y)\n | String x, String y -> Bool (x < y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"<\") [a; b])\n | 166 (* OP_GT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x > y)\n | String x, String y -> Bool (x > y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \">\") [a; b])\n | 167 (* OP_NOT *) ->\n let v = pop vm in\n push vm (Bool (not (sx_truthy v)))\n | 168 (* OP_LEN *) ->\n let v = pop vm in\n push vm (match v with\n | List l | ListRef { contents = l } -> Number (float_of_int (List.length l))\n | String s -> Number (float_of_int (String.length s))\n | Dict d -> Number (float_of_int (Hashtbl.length d))\n | Nil -> Number 0.0\n | _ -> (Hashtbl.find Sx_primitives.primitives \"len\") [v])\n | 169 (* OP_FIRST *) ->\n let v = pop vm in\n push vm (match v with\n | List (x :: _) | ListRef { contents = x :: _ } -> x\n | List [] | ListRef { contents = [] } | Nil -> Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"first\") [v])\n | 170 (* OP_REST *) ->\n let v = pop vm in\n push vm (match v with\n | List (_ :: xs) | ListRef { contents = _ :: xs } -> List xs\n | List [] | ListRef { contents = [] } | Nil -> List []\n | _ -> (Hashtbl.find Sx_primitives.primitives \"rest\") [v])\n | 171 (* OP_NTH *) ->\n let n = pop vm and coll = pop vm in\n push vm (match coll, n with\n | (List l | ListRef { contents = l }), Number f ->\n (try List.nth l (int_of_float f) with _ -> Nil)\n | String s, Number f ->\n let i = int_of_float f in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"nth\") [coll; n])\n | 172 (* OP_CONS *) ->\n let coll = pop vm and x = pop vm in\n push vm (match coll with\n | List l -> List (x :: l)\n | ListRef { contents = l } -> List (x :: l)\n | Nil -> List [x]\n | _ -> (Hashtbl.find Sx_primitives.primitives \"cons\") [x; coll])\n | 173 (* OP_NEG *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (-.x)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [v])\n | 174 (* OP_INC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x +. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"inc\") [v])\n | 175 (* OP_DEC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x -. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"dec\") [v])\n\n | opcode ->\n raise (Eval_error (Printf.sprintf \"VM: unknown opcode %d at ip=%d\"\n opcode (frame.ip - 1)))\n with Invalid_argument msg ->\n let fn_name = match frame.closure.vm_name with Some n -> n | None -> \"?\" in\n raise (Eval_error (Printf.sprintf\n \"VM: %s at ip=%d op=%d in %s (base=%d sp=%d bc_len=%d consts=%d)\"\n msg saved_ip op fn_name frame.base vm.sp\n (Array.length bc) (Array.length consts))))\n end\n done\n\n(** Execute a compiled module (top-level bytecode). *)\nlet execute_module code globals =\n let cl = { vm_code = code; vm_upvalues = [||]; vm_name = Some \"module\"; vm_env_ref = globals; vm_closure_env = None } in\n let vm = create globals in\n let frame = { closure = cl; ip = 0; base = 0; local_cells = Hashtbl.create 4 } in\n for _ = 0 to code.vc_locals - 1 do push vm Nil done;\n vm.frames <- [frame];\n run vm;\n pop vm\n\n\n(** {1 Lazy JIT compilation} *)\n\n(** Compile a lambda or component body to bytecode using the SX compiler.\n Invokes [compile] from spec/compiler.sx via the CEK machine.\n Returns a [vm_closure] ready for execution, or [None] on failure\n (safe fallback to CEK interpretation).\n\n The compilation cost is a single CEK evaluation of the compiler —\n microseconds per function. The result is cached in the lambda/component\n record so subsequent calls go straight to the VM. *)\nlet jit_compile_lambda (l : lambda) globals =\n let fn_name = match l.l_name with Some n -> n | None -> \"\" in\n try\n let compile_fn = try Hashtbl.find globals \"compile\"\n with Not_found -> raise (Eval_error \"JIT: compiler not loaded\") in\n (* Reconstruct the (fn (params) body) form so the compiler produces\n a proper closure. l.l_body is the inner body; we need the full\n function form with params so the compiled code binds them. *)\n let param_syms = List (List.map (fun s -> Symbol s) l.l_params) in\n let fn_expr = List [Symbol \"fn\"; param_syms; l.l_body] in\n let quoted = List [Symbol \"quote\"; fn_expr] in\n let result = Sx_ref.eval_expr (List [compile_fn; quoted]) (Env (make_env ())) in\n (* If the lambda has closure-captured variables, merge them into globals\n so the VM can find them via GLOBAL_GET. The compiler doesn't know\n about the enclosing scope, so closure vars get compiled as globals. *)\n let effective_globals =\n let closure = l.l_closure in\n if Hashtbl.length closure.bindings = 0 && closure.parent = None then\n globals (* no closure vars — use globals directly *)\n else begin\n (* Merge: closure bindings layered on top of globals.\n Use a shallow copy so we don't pollute the real globals. *)\n let merged = Hashtbl.copy globals in\n let rec inject env =\n Hashtbl.iter (fun k v -> Hashtbl.replace merged k v) env.bindings;\n match env.parent with Some p -> inject p | None -> ()\n in\n inject closure;\n let n = Hashtbl.length merged - Hashtbl.length globals in\n if n > 0 then\n Printf.eprintf \"[jit] %s: injected %d closure bindings\\n%!\" fn_name n;\n merged\n end\n in\n (match result with\n | Dict d when Hashtbl.mem d \"bytecode\" ->\n let outer_code = code_from_value result in\n let bc = outer_code.vc_bytecode in\n if Array.length bc >= 4 && bc.(0) = 51 (* OP_CLOSURE *) then begin\n let idx = bc.(1) lor (bc.(2) lsl 8) in\n if idx < Array.length outer_code.vc_constants then\n let inner_val = outer_code.vc_constants.(idx) in\n let code = code_from_value inner_val in\n Some { vm_code = code; vm_upvalues = [||];\n vm_name = l.l_name; vm_env_ref = effective_globals; vm_closure_env = Some l.l_closure }\n else begin\n Printf.eprintf \"[jit] FAIL %s: closure index %d out of bounds (pool=%d)\\n%!\"\n fn_name idx (Array.length outer_code.vc_constants);\n\n None\n end\n end else begin\n (* Not a closure — constant expression, alias, or simple computation.\n Execute the bytecode as a module to get the value, then wrap\n as a NativeFn if it's callable (so the CEK can dispatch to it). *)\n (try\n let value = execute_module outer_code globals in\n Printf.eprintf \"[jit] RESOLVED %s: %s (bc[0]=%d)\\n%!\"\n fn_name (type_of value) (if Array.length bc > 0 then bc.(0) else -1);\n (* If the resolved value is a NativeFn, we can't wrap it as a\n vm_closure — just let the CEK handle it directly. Return None\n so the lambda falls through to CEK, which will find the\n resolved value in the env on next lookup. *)\n None\n with _ ->\n Printf.eprintf \"[jit] SKIP %s: non-closure execution failed (bc[0]=%d, len=%d)\\n%!\"\n fn_name (if Array.length bc > 0 then bc.(0) else -1) (Array.length bc);\n None)\n end\n | _ ->\n Printf.eprintf \"[jit] FAIL %s: compiler returned %s\\n%!\" fn_name (type_of result);\n None)\n with e ->\n Printf.eprintf \"[jit] FAIL %s: %s\\n%!\" fn_name (Printexc.to_string e);\n None\n\n(* Wire up forward references *)\nlet () = jit_compile_ref := jit_compile_lambda\nlet () = _vm_call_closure_ref := (fun cl args -> call_closure cl args cl.vm_env_ref)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":199624},"map":{"version":3,"sources":["/workspace_root/lib/sx_scope.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Scope stacks — dynamic scope for render-time effects.\n\n Provides scope-push!/pop!/peek, collect!/collected/clear-collected!,\n scope-emit!/emitted/scope-emitted, context, and cookie access.\n\n All functions are registered as primitives so both the CEK evaluator\n and the JIT VM can find them in the same place. *)\n\nopen Sx_types\n\n(** The shared scope stacks hashtable. Each key maps to a stack of values.\n Used by aser for spread/provide/emit patterns, CSSX collect/flush, etc. *)\nlet scope_stacks : (string, value list) Hashtbl.t = Hashtbl.create 8\n\n(** Request cookies — set by the Python bridge before each render.\n get-cookie reads from here; set-cookie is a no-op on the server. *)\nlet request_cookies : (string, string) Hashtbl.t = Hashtbl.create 8\n\n(** Clear all scope stacks. Called between requests if needed. *)\nlet clear_all () = Hashtbl.clear scope_stacks\n\nlet () =\n let register = Sx_primitives.register in\n\n (* --- Cookies --- *)\n\n register \"get-cookie\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt request_cookies name with\n | Some v -> String v\n | None -> Nil)\n | _ -> Nil);\n\n register \"set-cookie\" (fun _args -> Nil);\n\n (* --- Core scope stack operations --- *)\n\n register \"scope-push!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n Hashtbl.replace scope_stacks name (value :: stack); Nil\n | _ -> Nil);\n\n register \"scope-pop!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with _ :: rest -> Hashtbl.replace scope_stacks name rest | [] -> ()); Nil\n | _ -> Nil);\n\n register \"scope-peek\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with v :: _ -> v | [] -> Nil)\n | _ -> Nil);\n\n (* --- Context (scope lookup with optional default) --- *)\n\n register \"context\" (fun args ->\n match args with\n | [String name] | [String name; _] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack, args with\n | v :: _, _ -> v\n | [], [_; default_val] -> default_val\n | [], _ -> Nil)\n | _ -> Nil);\n\n (* --- Collect / collected / clear-collected! --- *)\n\n register \"collect!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n if not (List.mem value items) then\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"collected\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"clear-collected!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | _ :: rest -> Hashtbl.replace scope_stacks name (List [] :: rest)\n | [] -> Hashtbl.replace scope_stacks name [List []]);\n Nil\n | _ -> Nil);\n\n (* --- Emit / emitted (for spread attrs in adapter-html.sx) --- *)\n\n register \"scope-emit!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | Nil :: rest ->\n Hashtbl.replace scope_stacks name (List [value] :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"emit!\" (fun args ->\n (* Alias for scope-emit! *)\n match Sx_primitives.get_primitive \"scope-emit!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"emitted\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"scope-emitted\" (fun args ->\n match Sx_primitives.get_primitive \"emitted\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-collected\" (fun args ->\n match Sx_primitives.get_primitive \"collected\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-clear-collected!\" (fun args ->\n match Sx_primitives.get_primitive \"clear-collected!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n (* --- Provide aliases --- *)\n\n register \"provide-push!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-push!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"provide-pop!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-pop!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":203819},"map":{"version":3,"sources":["/workspace_root/lib/sx_parser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** S-expression parser.\n\n Recursive descent over a string, producing [Sx_types.value list].\n Supports: lists, dicts, symbols, keywords, strings (with escapes),\n numbers, booleans, nil, comments, quote/quasiquote/unquote sugar. *)\n\nopen Sx_types\n\ntype state = {\n src : string;\n len : int;\n mutable pos : int;\n}\n\nlet make_state src = { src; len = String.length src; pos = 0 }\n\nlet peek s = if s.pos < s.len then Some s.src.[s.pos] else None\nlet advance s = s.pos <- s.pos + 1\nlet at_end s = s.pos >= s.len\n\nlet skip_whitespace_and_comments s =\n let rec go () =\n if at_end s then ()\n else match s.src.[s.pos] with\n | ' ' | '\\t' | '\\n' | '\\r' -> advance s; go ()\n | ';' ->\n while s.pos < s.len && s.src.[s.pos] <> '\\n' do advance s done;\n if s.pos < s.len then advance s;\n go ()\n | _ -> ()\n in go ()\n\n(* Character classification — matches spec/parser.sx ident-start/ident-char.\n ident-start: a-z A-Z _ ~ * + - > < = / ! ? &\n ident-char: ident-start plus 0-9 . : / # , *)\nlet is_ident_start = function\n | 'a'..'z' | 'A'..'Z' | '_' | '~' | '*' | '+' | '-'\n | '>' | '<' | '=' | '/' | '!' | '?' | '&' -> true\n | _ -> false\n\nlet is_ident_char = function\n | c when is_ident_start c -> true\n | '0'..'9' | '.' | ':' | '#' | ',' -> true\n | _ -> false\n\n(* Symbol reading uses ident_char; first char must be ident_start or digit/colon *)\nlet is_symbol_char = is_ident_char\n\nlet read_string s =\n (* s.pos is on the opening quote *)\n advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '\"' then Buffer.contents buf\n else if c = '\\\\' then begin\n if at_end s then raise (Parse_error \"Unterminated string escape\");\n let esc = s.src.[s.pos] in\n advance s;\n (match esc with\n | 'n' -> Buffer.add_char buf '\\n'\n | 't' -> Buffer.add_char buf '\\t'\n | 'r' -> Buffer.add_char buf '\\r'\n | '\"' -> Buffer.add_char buf '\"'\n | '\\\\' -> Buffer.add_char buf '\\\\'\n | 'u' ->\n (* \\uXXXX — read 4 hex digits, encode as UTF-8 *)\n if s.pos + 4 > s.len then raise (Parse_error \"Incomplete \\\\u escape\");\n let hex = String.sub s.src s.pos 4 in\n s.pos <- s.pos + 4;\n let code = int_of_string (\"0x\" ^ hex) in\n let ubuf = Buffer.create 4 in\n Buffer.add_utf_8_uchar ubuf (Uchar.of_int code);\n Buffer.add_string buf (Buffer.contents ubuf)\n | '`' -> Buffer.add_char buf '`'\n | _ -> Buffer.add_char buf '\\\\'; Buffer.add_char buf esc);\n go ()\n end else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n\nlet read_symbol s =\n let start = s.pos in\n while s.pos < s.len && is_symbol_char s.src.[s.pos] do advance s done;\n String.sub s.src start (s.pos - start)\n\nlet try_number str =\n match float_of_string_opt str with\n | Some n -> Some (Number n)\n | None -> None\n\nlet rec read_value s : value =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unexpected end of input\");\n match s.src.[s.pos] with\n | '(' -> read_list s ')'\n | '[' -> read_list s ']'\n | '{' -> read_dict s\n | '\"' -> String (read_string s)\n | '\\'' -> advance s; List [Symbol \"quote\"; read_value s]\n | '`' -> advance s; List [Symbol \"quasiquote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = ';' ->\n (* Datum comment: #; discards next expression *)\n advance s; advance s;\n ignore (read_value s);\n read_value s\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '\\'' ->\n (* Quote shorthand: #'expr -> (quote expr) *)\n advance s; advance s;\n List [Symbol \"quote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '|' ->\n (* Raw string: #|...| — ends at next | *)\n advance s; advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated raw string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '|' then\n String (Buffer.contents buf)\n else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n | ',' ->\n (* Unquote / splice-unquote — matches spec: , always triggers unquote *)\n advance s;\n if s.pos < s.len && s.src.[s.pos] = '@' then begin\n advance s;\n List [Symbol \"splice-unquote\"; read_value s]\n end else\n List [Symbol \"unquote\"; read_value s]\n | _ ->\n begin\n (* Symbol, keyword, number, or boolean *)\n let token = read_symbol s in\n if token = \"\" then raise (Parse_error (\"Unexpected char: \" ^ String.make 1 s.src.[s.pos]));\n match token with\n | \"true\" -> Bool true\n | \"false\" -> Bool false\n | \"nil\" -> Nil\n | _ when token.[0] = ':' ->\n Keyword (String.sub token 1 (String.length token - 1))\n | _ ->\n match try_number token with\n | Some n -> n\n | None -> Symbol token\n end\n\nand read_list s close_char =\n advance s; (* skip opening paren/bracket *)\n let items = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated list\");\n if s.src.[s.pos] = close_char then begin\n advance s;\n List (List.rev !items)\n end else begin\n items := read_value s :: !items;\n go ()\n end\n in go ()\n\nand read_dict s =\n advance s; (* skip { *)\n let d = make_dict () in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated dict\");\n if s.src.[s.pos] = '}' then begin\n advance s;\n Dict d\n end else begin\n let key = read_value s in\n let key_str = match key with\n | Keyword k -> k\n | String k -> k\n | Symbol k -> k\n | _ -> raise (Parse_error \"Dict key must be keyword, string, or symbol\")\n in\n let v = read_value s in\n dict_set d key_str v;\n go ()\n end\n in go ()\n\n\n(** Parse a string into a list of SX values. *)\nlet parse_all src =\n let s = make_state src in\n let results = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then List.rev !results\n else begin\n results := read_value s :: !results;\n go ()\n end\n in go ()\n\n(** Parse a file into a list of SX values. *)\nlet parse_file path =\n let ic = open_in path in\n let n = in_channel_length ic in\n let src = really_input_string ic n in\n close_in ic;\n parse_all src\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":208159},"map":{"version":3,"sources":["/workspace_root/lib/sx_render.ml","/builtin/blackbox.ml"],"sourcesContent":["(** HTML renderer for SX values.\n\n Extracted from run_tests.ml — renders an SX expression tree to an\n HTML string, expanding components and macros along the way.\n\n Depends on [Sx_ref.eval_expr] for evaluating sub-expressions\n during rendering (keyword arg values, conditionals, etc.). *)\n\nopen Sx_types\n\n(* ====================================================================== *)\n(* Tag / attribute registries *)\n(* ====================================================================== *)\n\nlet html_tags = [\n \"html\"; \"head\"; \"body\"; \"title\"; \"meta\"; \"link\"; \"script\"; \"style\"; \"noscript\";\n \"header\"; \"nav\"; \"main\"; \"section\"; \"article\"; \"aside\"; \"footer\";\n \"h1\"; \"h2\"; \"h3\"; \"h4\"; \"h5\"; \"h6\"; \"hgroup\";\n \"div\"; \"p\"; \"blockquote\"; \"pre\"; \"figure\"; \"figcaption\"; \"address\"; \"hr\";\n \"ul\"; \"ol\"; \"li\"; \"dl\"; \"dt\"; \"dd\"; \"menu\";\n \"a\"; \"span\"; \"em\"; \"strong\"; \"small\"; \"b\"; \"i\"; \"u\"; \"s\"; \"sub\"; \"sup\";\n \"mark\"; \"del\"; \"ins\"; \"q\"; \"cite\"; \"dfn\"; \"abbr\"; \"code\"; \"var\"; \"samp\";\n \"kbd\"; \"data\"; \"time\"; \"ruby\"; \"rt\"; \"rp\"; \"bdi\"; \"bdo\"; \"wbr\"; \"br\";\n \"table\"; \"thead\"; \"tbody\"; \"tfoot\"; \"tr\"; \"th\"; \"td\"; \"caption\"; \"colgroup\"; \"col\";\n \"form\"; \"input\"; \"textarea\"; \"select\"; \"option\"; \"optgroup\"; \"button\"; \"label\";\n \"fieldset\"; \"legend\"; \"datalist\"; \"output\"; \"progress\"; \"meter\";\n \"details\"; \"summary\"; \"dialog\";\n \"img\"; \"video\"; \"audio\"; \"source\"; \"picture\"; \"canvas\"; \"iframe\"; \"embed\"; \"object\"; \"param\";\n \"svg\"; \"path\"; \"circle\"; \"rect\"; \"line\"; \"polyline\"; \"polygon\"; \"ellipse\";\n \"g\"; \"defs\"; \"use\"; \"text\"; \"tspan\"; \"clipPath\"; \"mask\"; \"pattern\";\n \"linearGradient\"; \"radialGradient\"; \"stop\"; \"filter\"; \"feBlend\"; \"feFlood\";\n \"feGaussianBlur\"; \"feOffset\"; \"feMerge\"; \"feMergeNode\"; \"feComposite\";\n \"template\"; \"slot\";\n]\n\nlet void_elements = [\n \"area\"; \"base\"; \"br\"; \"col\"; \"embed\"; \"hr\"; \"img\"; \"input\";\n \"link\"; \"meta\"; \"param\"; \"source\"; \"track\"; \"wbr\"\n]\n\nlet boolean_attrs = [\n \"async\"; \"autofocus\"; \"autoplay\"; \"checked\"; \"controls\"; \"default\";\n \"defer\"; \"disabled\"; \"formnovalidate\"; \"hidden\"; \"inert\"; \"ismap\";\n \"loop\"; \"multiple\"; \"muted\"; \"nomodule\"; \"novalidate\"; \"open\";\n \"playsinline\"; \"readonly\"; \"required\"; \"reversed\"; \"selected\"\n]\n\nlet is_html_tag name = List.mem name html_tags\nlet is_void name = List.mem name void_elements\nlet is_boolean_attr name = List.mem name boolean_attrs\n\n\n(* ====================================================================== *)\n(* HTML escaping *)\n(* ====================================================================== *)\n\nlet escape_html s =\n let buf = Buffer.create (String.length s) in\n String.iter (function\n | '&' -> Buffer.add_string buf \"&\"\n | '<' -> Buffer.add_string buf \"<\"\n | '>' -> Buffer.add_string buf \">\"\n | '\"' -> Buffer.add_string buf \""\"\n | c -> Buffer.add_char buf c) s;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* Attribute rendering *)\n(* ====================================================================== *)\n\nlet render_attrs attrs =\n let buf = Buffer.create 64 in\n Hashtbl.iter (fun k v ->\n if is_boolean_attr k then begin\n if sx_truthy v then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k\n end\n end else if not (is_nil v) then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k;\n Buffer.add_string buf \"=\\\"\";\n Buffer.add_string buf (escape_html (value_to_string v));\n Buffer.add_char buf '\"'\n end) attrs;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* HTML renderer *)\n(* ====================================================================== *)\n\n(* Forward ref — resolved at setup time *)\nlet render_to_html_ref : (value -> env -> string) ref =\n ref (fun _expr _env -> \"\")\n\nlet render_to_html expr env = !render_to_html_ref expr env\n\nlet render_children children env =\n String.concat \"\" (List.map (fun c -> render_to_html c env) children)\n\n(** Parse keyword attrs and positional children from an element call's args.\n Attrs are evaluated; children are returned UNEVALUATED for render dispatch. *)\nlet parse_element_args args env =\n let attrs = Hashtbl.create 8 in\n let children = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace attrs k v;\n skip := true\n | Spread pairs ->\n List.iter (fun (k, v) -> Hashtbl.replace attrs k v) pairs\n | _ ->\n children := arg :: !children\n ) args;\n (attrs, List.rev !children)\n\nlet render_html_element tag args env =\n let (attrs, children) = parse_element_args args env in\n let attr_str = render_attrs attrs in\n if is_void tag then\n \"<\" ^ tag ^ attr_str ^ \" />\"\n else\n let content = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n \"<\" ^ tag ^ attr_str ^ \">\" ^ content ^ \"\" ^ tag ^ \">\"\n\nlet render_component comp args env =\n match comp with\n | Component c ->\n let kwargs = Hashtbl.create 8 in\n let children_exprs = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace kwargs k v;\n skip := true\n | _ ->\n children_exprs := arg :: !children_exprs\n ) args;\n let children = List.rev !children_exprs in\n let local = env_merge c.c_closure env in\n List.iter (fun p ->\n let v = match Hashtbl.find_opt kwargs p with Some v -> v | None -> Nil in\n ignore (env_bind local p v)\n ) c.c_params;\n if c.c_has_children then begin\n let rendered_children = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n ignore (env_bind local \"children\" (RawHTML rendered_children))\n end;\n render_to_html c.c_body local\n | _ -> \"\"\n\nlet expand_macro (m : macro) args _env =\n let local = env_extend m.m_closure in\n let params = m.m_params in\n let rec bind_params ps as' =\n match ps, as' with\n | [], rest ->\n (match m.m_rest_param with\n | Some rp -> ignore (env_bind local rp (List rest))\n | None -> ())\n | p :: ps_rest, a :: as_rest ->\n ignore (env_bind local p a);\n bind_params ps_rest as_rest\n | _ :: _, [] ->\n List.iter (fun p -> ignore (env_bind local p Nil)) (List.rev ps)\n in\n bind_params params args;\n Sx_ref.eval_expr m.m_body (Env local)\n\nlet rec do_render_to_html (expr : value) (env : env) : string =\n match expr with\n | Nil -> \"\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s -> escape_html s\n | Keyword k -> escape_html k\n | RawHTML s -> s\n | Symbol s ->\n let v = Sx_ref.eval_expr (Symbol s) (Env env) in\n do_render_to_html v env\n | List [] | ListRef { contents = [] } -> \"\"\n | List (head :: args) | ListRef { contents = head :: args } ->\n render_list_to_html head args env\n | _ ->\n let v = Sx_ref.eval_expr expr (Env env) in\n do_render_to_html v env\n\nand render_list_to_html head args env =\n match head with\n | Symbol \"<>\" ->\n render_children args env\n | Symbol \"raw!\" ->\n (* Inject pre-rendered HTML without escaping *)\n let v = Sx_ref.eval_expr (List.hd args) (Env env) in\n (match v with\n | String s | RawHTML s -> s\n | _ -> value_to_string v)\n | Symbol tag when is_html_tag tag ->\n render_html_element tag args env\n | Symbol \"if\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n (if List.length args > 1 then do_render_to_html (List.nth args 1) env else \"\")\n else\n (if List.length args > 2 then do_render_to_html (List.nth args 2) env else \"\")\n | Symbol \"when\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n String.concat \"\" (List.map (fun e -> do_render_to_html e env) (List.tl args))\n else \"\"\n | Symbol \"cond\" ->\n render_cond args env\n | Symbol \"case\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol (\"let\" | \"let*\") ->\n render_let args env\n | Symbol (\"begin\" | \"do\") ->\n let rec go = function\n | [] -> \"\"\n | [last] -> do_render_to_html last env\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env env));\n go rest\n in go args\n | Symbol (\"define\" | \"defcomp\" | \"defmacro\" | \"defisland\") ->\n ignore (Sx_ref.eval_expr (List (head :: args)) (Env env));\n \"\"\n | Symbol \"map\" ->\n render_map args env false\n | Symbol \"map-indexed\" ->\n render_map args env true\n | Symbol \"filter\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol \"for-each\" ->\n render_for_each args env\n | Symbol name ->\n (try\n let v = env_get env name in\n (match v with\n | Component c when c.c_affinity = \"client\" -> \"\" (* skip client-only *)\n | Component _ -> render_component v args env\n | Island _i ->\n (* Islands: SSR via the SX render-to-html from adapter-html.sx.\n It handles deref/signal/computed through the CEK correctly,\n and renders island bodies with hydration markers. *)\n (try\n let call_expr = List (Symbol name :: args) in\n let quoted = List [Symbol \"quote\"; call_expr] in\n let render_call = List [Symbol \"render-to-html\"; quoted; Env env] in\n let result = Sx_ref.eval_expr render_call (Env env) in\n (match result with\n | String s | RawHTML s -> s\n | _ -> value_to_string result)\n with e ->\n Printf.eprintf \"[ssr-island] ~%s FAILED: %s\\n%s\\n%!\" _i.i_name (Printexc.to_string e) (Printexc.get_backtrace ());\n \"\")\n | Macro m ->\n let expanded = expand_macro m args env in\n do_render_to_html expanded env\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n with Eval_error _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env\n\nand render_cond args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let is_scheme = List.for_all (fun a -> match as_list a with\n | Some items when List.length items = 2 -> true\n | _ -> false) args\n in\n if is_scheme then begin\n let rec go = function\n | [] -> \"\"\n | clause :: rest ->\n (match as_list clause with\n | Some [test; body] ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n | _ -> \"\")\n in go args\n end else begin\n let rec go = function\n | [] -> \"\"\n | [_] -> \"\"\n | test :: body :: rest ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n in go args\n end\n\nand render_let args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let bindings_expr = List.hd args in\n let body = List.tl args in\n let local = env_extend env in\n let bindings = match as_list bindings_expr with Some l -> l | None -> [] in\n let is_scheme = match bindings with\n | (List _ :: _) | (ListRef _ :: _) -> true\n | _ -> false\n in\n if is_scheme then\n List.iter (fun b ->\n match as_list b with\n | Some [Symbol name; expr] | Some [String name; expr] ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v)\n | _ -> ()\n ) bindings\n else begin\n let rec go = function\n | [] -> ()\n | (Symbol name) :: expr :: rest | (String name) :: expr :: rest ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v);\n go rest\n | _ -> ()\n in go bindings\n end;\n let rec render_body = function\n | [] -> \"\"\n | [last] -> do_render_to_html last local\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env local));\n render_body rest\n in render_body body\n\nand render_map args env indexed =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.mapi (fun i item ->\n let call_args = if indexed then [Number (float_of_int i); item] else [item] in\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params call_args;\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val call_args in\n do_render_to_html result env\n ) items)\n\nand render_for_each args env =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.map (fun item ->\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params [item];\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val [item] in\n do_render_to_html result env\n ) items)\n\n\n(* ====================================================================== *)\n(* Setup — bind render primitives in an env and wire up the ref *)\n(* ====================================================================== *)\n\nlet setup_render_env env =\n render_to_html_ref := do_render_to_html;\n\n let bind name fn =\n ignore (env_bind env name (NativeFn (name, fn)))\n in\n\n bind \"render-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\");\n\n bind \"render-to-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-ea36a0db.wasm b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-ea36a0db.wasm
new file mode 100644
index 00000000..58ca0d70
Binary files /dev/null and b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-ea36a0db.wasm differ
diff --git a/shared/static/wasm/sx_browser.bc.wasm.assets/sx-ea36a0db.wasm.map b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-ea36a0db.wasm.map
new file mode 100644
index 00000000..67567666
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.assets/sx-ea36a0db.wasm.map
@@ -0,0 +1 @@
+{"version":3,"sections":[{"offset":{"line":0,"column":69211},"map":{"version":3,"sources":["/workspace_root/lib/sx_types.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Core types for the SX language.\n\n The [value] sum type represents every possible SX runtime value.\n OCaml's algebraic types make the CEK machine's frame dispatch a\n pattern match — exactly what the spec describes. *)\n\n(** {1 Symbol interning} *)\n\n(** Map symbol names to small integers for O(1) env lookups.\n The intern table is populated once per unique symbol name;\n all subsequent env operations use the integer key. *)\n\nlet sym_to_id : (string, int) Hashtbl.t = Hashtbl.create 512\nlet id_to_sym : (int, string) Hashtbl.t = Hashtbl.create 512\nlet sym_next = ref 0\n\nlet intern s =\n match Hashtbl.find_opt sym_to_id s with\n | Some id -> id\n | None ->\n let id = !sym_next in\n incr sym_next;\n Hashtbl.replace sym_to_id s id;\n Hashtbl.replace id_to_sym id s;\n id\n\nlet unintern id =\n match Hashtbl.find_opt id_to_sym id with\n | Some s -> s\n | None -> \"\"\n\n\n(** {1 Environment} *)\n\n(** Lexical scope chain. Each frame holds a mutable binding table\n keyed by interned symbol IDs for fast lookup. *)\ntype env = {\n bindings : (int, value) Hashtbl.t;\n parent : env option;\n}\n\n(** {1 Values} *)\n\nand value =\n | Nil\n | Bool of bool\n | Number of float\n | String of string\n | Symbol of string\n | Keyword of string\n | List of value list\n | Dict of dict\n | Lambda of lambda\n | Component of component\n | Island of island\n | Macro of macro\n | Thunk of value * env\n | Continuation of (value -> value) * dict option\n | NativeFn of string * (value list -> value)\n | Signal of signal\n | RawHTML of string\n | Spread of (string * value) list\n | SxExpr of string (** Opaque SX wire-format string — aser output. *)\n | Env of env (** First-class environment — used by CEK machine state dicts. *)\n | ListRef of value list ref (** Mutable list — JS-style array for append! *)\n | CekState of cek_state (** Optimized CEK machine state — avoids Dict allocation. *)\n | CekFrame of cek_frame (** Optimized CEK continuation frame. *)\n | VmClosure of vm_closure (** VM-compiled closure — callable within the VM without allocating a new VM. *)\n\n(** CEK machine state — record instead of Dict for performance.\n 5 fields × 55K steps/sec = 275K Hashtbl allocations/sec eliminated. *)\nand cek_state = {\n cs_control : value;\n cs_env : value;\n cs_kont : value;\n cs_phase : string;\n cs_value : value;\n}\n\n(** CEK continuation frame — tagged record covering all 29 frame types.\n Fields are named generically; not all are used by every frame type.\n Eliminates ~100K Hashtbl allocations per page render. *)\nand cek_frame = {\n cf_type : string; (* frame type tag: \"if\", \"let\", \"call\", etc. *)\n cf_env : value; (* environment — every frame has this *)\n cf_name : value; (* let/define/set/scope: binding name *)\n cf_body : value; (* when/let: body expr *)\n cf_remaining : value; (* begin/cond/map/etc: remaining exprs *)\n cf_f : value; (* call/map/filter/etc: function *)\n cf_args : value; (* call: raw args; arg: evaled args *)\n cf_results : value; (* map/filter/dict: accumulated results *)\n cf_extra : value; (* extra field: scheme, indexed, value, phase, etc. *)\n cf_extra2 : value; (* second extra: emitted, etc. *)\n}\n\n(** Mutable string-keyed table (SX dicts support [dict-set!]). *)\nand dict = (string, value) Hashtbl.t\n\nand lambda = {\n l_params : string list;\n l_body : value;\n l_closure : env;\n mutable l_name : string option;\n mutable l_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand component = {\n c_name : string;\n c_params : string list;\n c_has_children : bool;\n c_body : value;\n c_closure : env;\n c_affinity : string; (** \"auto\" | \"client\" | \"server\" *)\n mutable c_compiled : vm_closure option; (** Lazy JIT cache *)\n}\n\nand island = {\n i_name : string;\n i_params : string list;\n i_has_children : bool;\n i_body : value;\n i_closure : env;\n}\n\nand macro = {\n m_params : string list;\n m_rest_param : string option;\n m_body : value;\n m_closure : env;\n m_name : string option;\n}\n\nand signal = {\n mutable s_value : value;\n mutable s_subscribers : (unit -> unit) list;\n mutable s_deps : signal list;\n}\n\n(** {1 Bytecode VM types}\n\n Defined here (not in sx_vm.ml) because [vm_code.constants] references\n [value] and [lambda.l_compiled] references [vm_closure] — mutual\n recursion requires all types in one [and] chain. *)\n\n(** Compiled function body — bytecode + constant pool. *)\nand vm_code = {\n vc_arity : int;\n vc_locals : int;\n vc_bytecode : int array;\n vc_constants : value array;\n}\n\n(** Upvalue cell — shared mutable reference to a captured variable. *)\nand vm_upvalue_cell = {\n mutable uv_value : value;\n}\n\n(** Closure — compiled code + captured upvalues + live env reference. *)\nand vm_closure = {\n vm_code : vm_code;\n vm_upvalues : vm_upvalue_cell array;\n vm_name : string option;\n vm_env_ref : (string, value) Hashtbl.t;\n vm_closure_env : env option; (** Original closure env for inner functions *)\n}\n\n\n(** {1 Forward ref for calling VM closures from outside the VM} *)\n\nlet _vm_call_closure_ref : (vm_closure -> value list -> value) ref =\n ref (fun _ _ -> raise (Failure \"VM call_closure not initialized\"))\n\n\n(** {1 Errors} *)\n\nexception Eval_error of string\nexception Parse_error of string\n\n\n(** {1 Environment operations} *)\n\nlet make_env () =\n { bindings = Hashtbl.create 16; parent = None }\n\nlet env_extend parent =\n { bindings = Hashtbl.create 16; parent = Some parent }\n\nlet env_bind env name v =\n Hashtbl.replace env.bindings (intern name) v; Nil\n\n(* Internal: scope-chain lookup with pre-interned ID *)\nlet rec env_has_id env id =\n Hashtbl.mem env.bindings id ||\n match env.parent with Some p -> env_has_id p id | None -> false\n\nlet env_has env name = env_has_id env (intern name)\n\nlet rec env_get_id env id name =\n match Hashtbl.find_opt env.bindings id with\n | Some v -> v\n | None ->\n match env.parent with\n | Some p -> env_get_id p id name\n | None ->\n raise (Eval_error (\"Undefined symbol: \" ^ name))\n\nlet env_get env name = env_get_id env (intern name) name\n\nlet rec env_set_id env id v =\n if Hashtbl.mem env.bindings id then\n (Hashtbl.replace env.bindings id v; Nil)\n else\n match env.parent with\n | Some p -> env_set_id p id v\n | None -> Hashtbl.replace env.bindings id v; Nil\n\nlet env_set env name v = env_set_id env (intern name) v\n\nlet env_merge base overlay =\n if base == overlay then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n let rec is_descendant e depth =\n if depth > 100 then false\n else if e == base then true\n else match e.parent with Some p -> is_descendant p (depth + 1) | None -> false\n in\n if is_descendant overlay 0 then\n { bindings = Hashtbl.create 16; parent = Some base }\n else begin\n let e = { bindings = Hashtbl.create 16; parent = Some base } in\n Hashtbl.iter (fun id v ->\n if not (env_has_id base id) then Hashtbl.replace e.bindings id v\n ) overlay.bindings;\n e\n end\n end\n\n\n(** {1 Value extraction helpers} *)\n\nlet value_to_string = function\n | String s -> s | Symbol s -> s | Keyword k -> k\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Bool true -> \"true\" | Bool false -> \"false\"\n | Nil -> \"\" | _ -> \"\"\n\nlet value_to_string_list = function\n | List items | ListRef { contents = items } -> List.map value_to_string items\n | _ -> []\n\nlet value_to_bool = function\n | Bool b -> b | Nil -> false | _ -> true\n\nlet value_to_string_opt = function\n | String s -> Some s | Symbol s -> Some s | Nil -> None | _ -> None\n\n\n(** {1 Constructors — accept [value] args from transpiled code} *)\n\nlet unwrap_env_val = function\n | Env e -> e\n | _ -> raise (Eval_error \"make_lambda: expected env for closure\")\n\nlet make_lambda params body closure =\n let ps = match params with\n | List items -> List.map value_to_string items\n | _ -> value_to_string_list params\n in\n Lambda { l_params = ps; l_body = body; l_closure = unwrap_env_val closure; l_name = None; l_compiled = None }\n\nlet make_component name params has_children body closure affinity =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n let aff = match affinity with String s -> s | _ -> \"auto\" in\n Component {\n c_name = n; c_params = ps; c_has_children = hc;\n c_body = body; c_closure = unwrap_env_val closure; c_affinity = aff;\n c_compiled = None;\n }\n\nlet make_island name params has_children body closure =\n let n = value_to_string name in\n let ps = value_to_string_list params in\n let hc = value_to_bool has_children in\n Island {\n i_name = n; i_params = ps; i_has_children = hc;\n i_body = body; i_closure = unwrap_env_val closure;\n }\n\nlet make_macro params rest_param body closure name =\n let ps = value_to_string_list params in\n let rp = value_to_string_opt rest_param in\n let n = value_to_string_opt name in\n Macro {\n m_params = ps; m_rest_param = rp;\n m_body = body; m_closure = unwrap_env_val closure; m_name = n;\n }\n\nlet make_thunk expr env = Thunk (expr, unwrap_env_val env)\n\nlet make_symbol name = Symbol (value_to_string name)\nlet make_keyword name = Keyword (value_to_string name)\n\n\n(** {1 Type inspection} *)\n\nlet type_of = function\n | Nil -> \"nil\"\n | Bool _ -> \"boolean\"\n | Number _ -> \"number\"\n | String _ -> \"string\"\n | Symbol _ -> \"symbol\"\n | Keyword _ -> \"keyword\"\n | List _ | ListRef _ -> \"list\"\n | Dict _ -> \"dict\"\n | Lambda _ -> \"lambda\"\n | Component _ -> \"component\"\n | Island _ -> \"island\"\n | Macro _ -> \"macro\"\n | Thunk _ -> \"thunk\"\n | Continuation (_, _) -> \"continuation\"\n | NativeFn _ -> \"function\"\n | Signal _ -> \"signal\"\n | RawHTML _ -> \"raw-html\"\n | Spread _ -> \"spread\"\n | SxExpr _ -> \"sx-expr\"\n | Env _ -> \"env\"\n | CekState _ -> \"dict\" (* CEK state behaves as a dict for type checks *)\n | CekFrame _ -> \"dict\"\n | VmClosure _ -> \"function\"\n\nlet is_nil = function Nil -> true | _ -> false\nlet is_lambda = function Lambda _ -> true | _ -> false\nlet is_component = function Component _ -> true | _ -> false\nlet is_island = function Island _ -> true | _ -> false\nlet is_macro = function Macro _ -> true | _ -> false\nlet is_thunk = function Thunk _ -> true | _ -> false\nlet is_signal = function\n | Signal _ -> true\n | Dict d -> Hashtbl.mem d \"__signal\"\n | _ -> false\n\nlet is_callable = function\n | Lambda _ | NativeFn _ | Continuation (_, _) | VmClosure _ -> true\n | _ -> false\n\n\n(** {1 Truthiness} *)\n\n(** SX truthiness: everything is truthy except [Nil] and [Bool false]. *)\nlet sx_truthy = function\n | Nil | Bool false -> false\n | _ -> true\n\n\n(** {1 Accessors} *)\n\nlet symbol_name = function\n | Symbol s -> String s\n | v -> raise (Eval_error (\"Expected symbol, got \" ^ type_of v))\n\nlet keyword_name = function\n | Keyword k -> String k\n | v -> raise (Eval_error (\"Expected keyword, got \" ^ type_of v))\n\nlet lambda_params = function\n | Lambda l -> List (List.map (fun s -> String s) l.l_params)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_body = function\n | Lambda l -> l.l_body\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_closure = function\n | Lambda l -> Env l.l_closure\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet lambda_name = function\n | Lambda l -> (match l.l_name with Some n -> String n | None -> Nil)\n | v -> raise (Eval_error (\"Expected lambda, got \" ^ type_of v))\n\nlet set_lambda_name l n = match l with\n | Lambda l -> l.l_name <- Some n; Nil\n | _ -> raise (Eval_error \"set-lambda-name!: not a lambda\")\n\nlet component_name = function\n | Component c -> String c.c_name\n | Island i -> String i.i_name\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_params = function\n | Component c -> List (List.map (fun s -> String s) c.c_params)\n | Island i -> List (List.map (fun s -> String s) i.i_params)\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_body = function\n | Component c -> c.c_body\n | Island i -> i.i_body\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_closure = function\n | Component c -> Env c.c_closure\n | Island i -> Env i.i_closure\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_has_children = function\n | Component c -> Bool c.c_has_children\n | Island i -> Bool i.i_has_children\n | v -> raise (Eval_error (\"Expected component, got \" ^ type_of v))\n\nlet component_affinity = function\n | Component c -> String c.c_affinity\n | Island _ -> String \"client\"\n | _ -> String \"auto\"\n\nlet macro_params = function\n | Macro m -> List (List.map (fun s -> String s) m.m_params)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_rest_param = function\n | Macro m -> (match m.m_rest_param with Some s -> String s | None -> Nil)\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_body = function\n | Macro m -> m.m_body\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet macro_closure = function\n | Macro m -> Env m.m_closure\n | v -> raise (Eval_error (\"Expected macro, got \" ^ type_of v))\n\nlet thunk_expr = function\n | Thunk (e, _) -> e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\nlet thunk_env = function\n | Thunk (_, e) -> Env e\n | v -> raise (Eval_error (\"Expected thunk, got \" ^ type_of v))\n\n\n(** {1 Dict operations} *)\n\nlet make_dict () : dict = Hashtbl.create 8\n\nlet dict_get (d : dict) key =\n match Hashtbl.find_opt d key with Some v -> v | None -> Nil\n\nlet dict_has (d : dict) key = Hashtbl.mem d key\n\nlet dict_set (d : dict) key v = Hashtbl.replace d key v\n\nlet dict_delete (d : dict) key = Hashtbl.remove d key\n\nlet dict_keys (d : dict) =\n Hashtbl.fold (fun k _ acc -> String k :: acc) d []\n\nlet dict_vals (d : dict) =\n Hashtbl.fold (fun _ v acc -> v :: acc) d []\n\n\n(** {1 Value display} *)\n\nlet rec inspect = function\n | Nil -> \"nil\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then Printf.sprintf \"%d\" (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s ->\n let buf = Buffer.create (String.length s + 2) in\n Buffer.add_char buf '\"';\n String.iter (function\n | '\"' -> Buffer.add_string buf \"\\\\\\\"\"\n | '\\\\' -> Buffer.add_string buf \"\\\\\\\\\"\n | '\\n' -> Buffer.add_string buf \"\\\\n\"\n | '\\r' -> Buffer.add_string buf \"\\\\r\"\n | '\\t' -> Buffer.add_string buf \"\\\\t\"\n | c -> Buffer.add_char buf c) s;\n Buffer.add_char buf '\"';\n Buffer.contents buf\n | Symbol s -> s\n | Keyword k -> \":\" ^ k\n | List items | ListRef { contents = items } ->\n \"(\" ^ String.concat \" \" (List.map inspect items) ^ \")\"\n | Dict d ->\n let pairs = Hashtbl.fold (fun k v acc ->\n (Printf.sprintf \":%s %s\" k (inspect v)) :: acc) d [] in\n \"{\" ^ String.concat \" \" pairs ^ \"}\"\n | Lambda l ->\n let tag = match l.l_name with Some n -> n | None -> \"lambda\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" l.l_params)\n | Component c ->\n Printf.sprintf \"\" c.c_name (String.concat \", \" c.c_params)\n | Island i ->\n Printf.sprintf \"\" i.i_name (String.concat \", \" i.i_params)\n | Macro m ->\n let tag = match m.m_name with Some n -> n | None -> \"macro\" in\n Printf.sprintf \"<%s(%s)>\" tag (String.concat \", \" m.m_params)\n | Thunk _ -> \"\"\n | Continuation (_, _) -> \"\"\n | NativeFn (name, _) -> Printf.sprintf \"\" name\n | Signal _ -> \"\"\n | RawHTML s -> Printf.sprintf \"\" (String.length s)\n | Spread _ -> \"\"\n | SxExpr s -> Printf.sprintf \"\" (String.length s)\n | Env _ -> \"\"\n | CekState _ -> \"\"\n | CekFrame f -> Printf.sprintf \"\" f.cf_type\n | VmClosure cl -> Printf.sprintf \"\" (match cl.vm_name with Some n -> n | None -> \"anon\")\n","(* generated code *)"],"names":[],"mappings":"SA0dgB,gBACA,qDACA,0C,EAAA,2BAEA,6BADA,6BAEA,+BACA,6B,CAAsB,C,EASO,IAAvC,EAA2B,QAA3B,EAAsC,OAAtC,eAAuC,MAAO,C,SAzBlC,QACP,aAqB+C,EAAhD,EAAkB,EArBjB,0FA8CS,gCAA0D,8CAD5D,4CADA,yBADL,cADG,2CADA,cADC,2CADD,cADU,oCADC,IADZ,gBAFX,gCAC8B,EAA9B,iBAA8B,aAA+B,yBAHlB,EAGkB,UAH7D,iBAA2C,eAA+B,kCAF5B,EAE4B,UAF1E,iBAA8C,eAA+B,8CAH7E,gCAC8B,EAA9B,iBAA8B,aAA+B,yBAH1B,EAA7B,EAFM,GAKiD,UALjD,IAAZ,OAAY,aAEZ,OAAM,eAAuB,OAAvB,aAA6B,gCAJnC,OAAwB,aAAwB,OAA1C,eAA0C,OAA1C,aAAgD,qBAFzC,EAEyC,UAFzC,+BADD,YAXZ,UAAU,EAAV,OAAU,eACV,yBAAuB,OACvB,EADuB,OACvB,cAOA,MADoC,OACpC,cAAuB,mCAZvB,OAAG,aAAkB,OAChB,sCADsB,iD,EAFb,EADD,EAGc,oBA0CkE,C,EApDlE,YAAQ,C,EAArC,6BAA2C,C,EAHd,oBAAe,C,EAA5C,6BAAkD,C,EAHnB,wBAAoB,C,EAFrB,0BAAuB,C,EAFzB,wBAAiB,C,EAFvC,IAAN,OAAM,eAAsB,QAA4B,gBAAG,C,EAHnC,4BAAgB,C,KAP1B,K,CAAA,qBACI,IADJ,OACI,OAC2C,IAF/C,KAE+C,IAApC,EAA0B,QAAS,OAAnC,aAAoC,MAAC,C,KAN/C,K,CAAA,4BACG,GAC2C,IAF9C,KAE8C,IAApC,EAA0B,QAAS,OAAnC,aAAoC,MAAC,C,KAN5C,K,CAAA,qBACL,IADK,OACL,eACgD,IAF3C,KAE2C,IAApC,EAA0B,QAAS,OAAnC,aAAoC,MAAC,C,KAN/C,K,CAAA,4BACF,WACgD,IAF9C,KAE8C,IAApC,EAA0B,QAAS,OAAnC,aAAoC,MAAC,C,MANzC,K,CAAA,4BACR,iBAAwD,MAAnB,IAAmB,UAAnB,M,GACW,IAFxC,KAEwC,IAApC,EAA0B,QAAS,OAAnC,aAAoC,MAAC,C,EALxB,UAAQ,C,MAD7B,K,CAAA,qBAC0C,IAAzC,GADD,OACJ,eAAK,aAAyC,OACE,IAF5C,KAE4C,IAApC,EAA0B,QAAS,OAAnC,aAAoC,MAAC,C,EAPvC,K,CAAA,E,EAAA,mB,GAAA,MAET,IADG,IACH,UADG,eAEV,EAAa,C,KARO,K,CAAA,wDAGsC,IAHtC,KAGsC,IAAxC,EAA8B,QAAS,OAAvC,aAAwC,MAAC,C,KAR5C,K,CAAA,wDAG2C,IAH3C,KAG2C,IAAxC,EAA8B,QAAS,OAAvC,aAAwC,MAAC,C,KAR/C,K,CAAA,gDAG8C,IAH9C,KAG8C,IAAxC,EAA8B,QAAS,OAAvC,aAAwC,MAAC,C,GAR7C,K,CAAA,E,EAAA,mB,GAAA,MAEuC,IAAzC,GAFE,UAEP,eAAK,aAAyC,MADG,IAAzC,GACsC,UAD3C,eAAK,aAAyC,OAEE,IAH5C,KAG4C,IAAxC,EAA8B,QAAS,OAAvC,aAAwC,MAAC,C,KAR/C,K,CAAA,wDAG8C,IAH9C,KAG8C,IAAxC,EAA8B,QAAS,OAAvC,aAAwC,MAAC,C,KAP1C,K,CAAA,4BACV,kBAAoB,OAC3B,IAFiB,KAEjB,YAAmD,C,MAN1C,K,CAAA,4BACF,iBAAkD,MAAnB,IAAmB,UAAnB,M,GACiB,IAF9C,KAE8C,IAArC,EAA2B,QAAS,OAApC,aAAqC,MAAC,C,KAN5C,K,CAAA,qBACL,IADK,OACL,eACgD,IAF3C,KAE2C,IAArC,EAA2B,QAAS,OAApC,aAAqC,MAAC,C,KAN/C,K,CAAA,4BACF,WACgD,IAF9C,KAE8C,IAArC,EAA2B,QAAS,OAApC,aAAqC,MAAC,C,MAN7C,K,CAAA,qBAC0C,IAAzC,GADD,OACJ,eAAK,aAAyC,OACE,IAF5C,KAE4C,IAArC,EAA2B,QAAS,OAApC,aAAqC,MAAC,C,KAN9C,K,CAAA,qBACF,IADE,OACF,OACgD,IAF9C,KAE8C,IAAtC,EAA4B,QAAS,OAArC,aAAsC,MAAC,C,KANhD,K,CAAA,qBACF,IADE,OACF,OACgD,IAF9C,KAE8C,IAArC,EAA2B,QAAS,OAApC,aAAqC,MAAC,C,KATjD,K,CAAA,E,EAAA,kCAEP,OADe,IACX,C,EAVK,K,CAAA,E,EAAA,2CAC+C,OACxD,IAAK,C,EAPE,K,CAAA,E,EAAA,mB,GAAA,aACA,gBACF,wBACL,IAAK,C,EAJC,K,CAAA,mBAAoB,OAAY,IAAK,C,EADrC,K,CAAA,mBAAoB,OAAY,IAAK,C,EADpC,K,CAAA,mBAAqB,OAAY,IAAK,C,EADnC,K,CAAA,mBAAwB,OAAY,IAAK,C,EAD5C,K,CAAA,mBAAqB,OAAY,IAAK,C,EADzC,KAA4B,EAAK,C,GAzBhC,QACQ,wFAMI,IAgBJ,IADA,IADA,IADA,IADA,IADA,IADA,IADA,IADA,IADK,IADL,IADA,IADA,IADA,IADA,IADA,IAFA,IADA,IADA,IADA,IADA,GAqBU,C,EA5BsB,IAAtB,QAAsB,K,EADF,IAAtB,QAAsB,K,EAFK,MAAlB,aAAkB,IAAC,C,KAR/C,iBACA,UACD,UAG2C,cAAtB,UAAsB,UAClD,C,KAfO,OAK2C,QAL3C,QACC,QACA,QAG0C,EAAtB,UAAsB,QAClD,C,SAjBO,iBACC,UACA,UACT,uCAA0C,I,EAGS,gBAAtB,UAAsB,cAElD,C,QAfD,OAIyE,QAJzE,Q,CAAA,qBACkB,EADlB,OACkB,oBAA8B,IACvC,SAEgE,EAAtB,UAAsB,gBAAoC,C,KAT1F,K,CAAA,4BACR,GACJ,IAFY,KAEZ,YAA0D,C,KARzC,QAC2B,kDAAY,MAAI,C,KAJjD,QACK,iCAAa,MAAI,C,EALf,K,CAAA,E,EACsB,EADtB,sB,GAAA,mDACsB,sBACxC,IAAE,C,GARW,QAIX,2DAFK,OAAG,aAAkB,OAA0C,sCAApC,kC,EACH,EAAvB,EAD0B,mBAC1B,EACI,GAAS,C,OAbf,mBAAoB,WAAM,yCAA+B,C,QAbtE,uCACE,YAA8B,IAAjB,QAAb,OAAa,aAAiB,OAO3B,YAJD,WACK,sCACA,iB,CAAA,YAA8B,aAAsC,KADlD,KADH,GAII,GACxB,YAA8B,IAAjB,QAAb,OAAa,aAAiB,OAC3B,YAEH,MADsC,IAAjB,QADlB,OACkB,aAAiB,QACtC,kCAEkB,IAGnB,C,EApBgD,EAAb,aAAa,QAAE,C,MAPrD,eAAG,EAAH,OAAG,aAA2B,QAG5B,iBAEU,gCAAiC,eAD/B,MAHZ,UAAC,IAAD,OAAC,cAAiC,MAIc,C,KARD,EAAb,eAAa,UAAK,C,SARtD,sBAAM,EAAN,OAAM,eAAgC,QAGpC,gBAGiD,UAA7B,IAAlB,OAAkB,aAA6B,iBAFrC,K,EAAA,YAEsC,C,EATH,EAAb,aAAa,O,KAHjD,uCAA2B,wBAC+B,eAA1B,K,GAAA,GAA+B,C,EALlC,eAAa,UAA1C,IAA0C,OAA1C,cAA4C,IAAK,C,KAHjD,YAA8B,IAAjB,QAAb,OAAa,aAAiB,MAAwB,C,EAHxB,IAAjB,QAAb,OAAa,aAAiB,QAAiB,C,EAZ/B,mBAAiD,C,EA/IjE,KAAM,MAAN,OAAM,eAA6B,QAEO,EAAtB,EAAV,OAAU,eAAgB,OAAhB,aAAsB,iC,SAZ1C,OAAM,MAAN,OAAM,eAA4B,QAGhC,aACA,gCACA,+BACA,UAD8B,OAC9B,cAA8B,cAC5B,C,kBAXsD,EADlB,SCZ1C,ODY0C,eACA,SADkB,OAClB,eAAkB,I,EAAA,oY,QCb5D,4D,EAAA,a,QAAA,8B,EAAA,a,EAAA,a,WAAA,0C,EAAA,a,EAAA,a,EAAA,a,EAAA,a,iBAAA,kE,EAAA,a,EAAA,a,EAAA,a,EAAA,a,EAAA,a,oBAAA","ignoreList":[1]}},{"offset":{"line":0,"column":77301},"map":{"version":3,"sources":["/workspace_root/lib/sx_primitives.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Built-in primitive functions (~80 pure functions).\n\n Registered in a global table; the evaluator checks this table\n when a symbol isn't found in the lexical environment. *)\n\nopen Sx_types\n\nlet primitives : (string, value list -> value) Hashtbl.t = Hashtbl.create 128\n\n(** Forward refs for calling SX functions from primitives (breaks cycle). *)\nlet _sx_call_fn : (value -> value list -> value) ref =\n ref (fun _ _ -> raise (Eval_error \"sx_call not initialized\"))\nlet _sx_trampoline_fn : (value -> value) ref =\n ref (fun v -> v)\n\nlet register name fn = Hashtbl.replace primitives name fn\n\nlet is_primitive name = Hashtbl.mem primitives name\n\nlet get_primitive name =\n match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(* --- Helpers --- *)\n\n(* Trampoline hook — set by sx_ref after initialization to break circular dep *)\nlet trampoline_hook : (value -> value) ref = ref (fun v -> v)\n\nlet rec as_number = function\n | Number n -> n\n | Bool true -> 1.0\n | Bool false -> 0.0\n | Nil -> 0.0\n | String s -> (match float_of_string_opt s with Some n -> n | None -> Float.nan)\n | Thunk _ as t ->\n (* Trampoline thunks — they shouldn't leak but sometimes do *)\n as_number (!trampoline_hook t)\n | v -> raise (Eval_error (\"Expected number, got \" ^ type_of v ^ \": \" ^ (match v with Dict d -> (match Hashtbl.find_opt d \"__signal\" with Some _ -> \"signal{value=\" ^ (match Hashtbl.find_opt d \"value\" with Some v' -> value_to_string v' | None -> \"?\") ^ \"}\" | None -> \"dict\") | _ -> \"\")))\n\nlet as_string = function\n | String s -> s\n | v -> raise (Eval_error (\"Expected string, got \" ^ type_of v))\n\nlet rec as_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | Thunk _ as t -> as_list (!_sx_trampoline_fn t)\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\nlet as_bool = function\n | Bool b -> b\n | v -> sx_truthy v\n\nlet rec to_string = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | Thunk _ as t -> to_string (!trampoline_hook t)\n | v -> inspect v\n\nlet () =\n (* === Arithmetic === *)\n register \"+\" (fun args ->\n Number (List.fold_left (fun acc a -> acc +. as_number a) 0.0 args));\n register \"-\" (fun args ->\n match args with\n | [] -> Number 0.0\n | [a] -> Number (-. (as_number a))\n | a :: rest -> Number (List.fold_left (fun acc x -> acc -. as_number x) (as_number a) rest));\n register \"*\" (fun args ->\n Number (List.fold_left (fun acc a -> acc *. as_number a) 1.0 args));\n register \"/\" (fun args ->\n match args with\n | [a; b] -> Number (as_number a /. as_number b)\n | _ -> raise (Eval_error \"/: expected 2 args\"));\n register \"mod\" (fun args ->\n match args with\n | [a; b] -> Number (Float.rem (as_number a) (as_number b))\n | _ -> raise (Eval_error \"mod: expected 2 args\"));\n register \"inc\" (fun args ->\n match args with [a] -> Number (as_number a +. 1.0) | _ -> raise (Eval_error \"inc: 1 arg\"));\n register \"dec\" (fun args ->\n match args with [a] -> Number (as_number a -. 1.0) | _ -> raise (Eval_error \"dec: 1 arg\"));\n register \"abs\" (fun args ->\n match args with [a] -> Number (Float.abs (as_number a)) | _ -> raise (Eval_error \"abs: 1 arg\"));\n register \"floor\" (fun args ->\n match args with [a] -> Number (floor (as_number a))\n | _ -> raise (Eval_error \"floor: 1 arg\"));\n register \"ceil\" (fun args ->\n match args with [a] -> Number (ceil (as_number a))\n | _ -> raise (Eval_error \"ceil: 1 arg\"));\n register \"round\" (fun args ->\n match args with\n | [a] -> Number (Float.round (as_number a))\n | [a; b] ->\n let n = as_number a and places = int_of_float (as_number b) in\n let factor = 10.0 ** float_of_int places in\n Number (Float.round (n *. factor) /. factor)\n | _ -> raise (Eval_error \"round: 1-2 args\"));\n register \"min\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"min: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.min acc (as_number a)) Float.infinity args));\n register \"max\" (fun args ->\n match args with\n | [] -> raise (Eval_error \"max: at least 1 arg\")\n | _ -> Number (List.fold_left (fun acc a -> Float.max acc (as_number a)) Float.neg_infinity args));\n register \"sqrt\" (fun args ->\n match args with [a] -> Number (Float.sqrt (as_number a)) | _ -> raise (Eval_error \"sqrt: 1 arg\"));\n register \"pow\" (fun args ->\n match args with [a; b] -> Number (as_number a ** as_number b)\n | _ -> raise (Eval_error \"pow: 2 args\"));\n register \"clamp\" (fun args ->\n match args with\n | [x; lo; hi] ->\n let x = as_number x and lo = as_number lo and hi = as_number hi in\n Number (Float.max lo (Float.min hi x))\n | _ -> raise (Eval_error \"clamp: 3 args\"));\n register \"parse-int\" (fun args ->\n match args with\n | [String s] -> (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> Nil)\n | [String s; default_val] ->\n (match int_of_string_opt s with Some n -> Number (float_of_int n) | None -> default_val)\n | [Number n] | [Number n; _] -> Number (float_of_int (int_of_float n))\n | [_; default_val] -> default_val\n | _ -> Nil);\n register \"parse-float\" (fun args ->\n match args with\n | [String s] -> (match float_of_string_opt s with Some n -> Number n | None -> Nil)\n | [Number n] -> Number n\n | _ -> Nil);\n\n (* === Comparison === *)\n (* Safe equality: physical equality for potentially-circular types\n (Dict, Lambda, Component, Island, Signal, NativeFn),\n structural equality for acyclic types (Number, String, Bool, etc.).\n Lists are compared element-wise recursively with the same safety. *)\n let rec safe_eq a b =\n if a == b then true (* physical equality fast path *)\n else match a, b with\n | Number x, Number y -> x = y\n | String x, String y -> x = y\n | Bool x, Bool y -> x = y\n | Nil, Nil -> true\n | Symbol x, Symbol y -> x = y\n | Keyword x, Keyword y -> x = y\n | (List la | ListRef { contents = la }),\n (List lb | ListRef { contents = lb }) ->\n List.length la = List.length lb &&\n List.for_all2 safe_eq la lb\n (* Dict: check __host_handle for DOM node identity *)\n | Dict a, Dict b ->\n (match Hashtbl.find_opt a \"__host_handle\", Hashtbl.find_opt b \"__host_handle\" with\n | Some (Number ha), Some (Number hb) -> ha = hb\n | _ -> false)\n (* Lambda/Component/Island/Signal/NativeFn: physical only *)\n | _ -> false\n in\n register \"=\" (fun args ->\n match args with\n | [a; b] -> Bool (safe_eq a b)\n | _ -> raise (Eval_error \"=: 2 args\"));\n register \"!=\" (fun args ->\n match args with\n | [a; b] -> Bool (not (safe_eq a b))\n | _ -> raise (Eval_error \"!=: 2 args\"));\n register \"<\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a < b)\n | [a; b] -> Bool (as_number a < as_number b)\n | _ -> raise (Eval_error \"<: 2 args\"));\n register \">\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a > b)\n | [a; b] -> Bool (as_number a > as_number b)\n | _ -> raise (Eval_error \">: 2 args\"));\n register \"<=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a <= b)\n | [a; b] -> Bool (as_number a <= as_number b)\n | _ -> raise (Eval_error \"<=: 2 args\"));\n register \">=\" (fun args ->\n match args with\n | [String a; String b] -> Bool (a >= b)\n | [a; b] -> Bool (as_number a >= as_number b)\n | _ -> raise (Eval_error \">=: 2 args\"));\n\n (* === Logic === *)\n register \"not\" (fun args ->\n match args with [a] -> Bool (not (sx_truthy a)) | _ -> raise (Eval_error \"not: 1 arg\"));\n\n (* === Predicates === *)\n register \"nil?\" (fun args ->\n match args with [a] -> Bool (is_nil a) | _ -> raise (Eval_error \"nil?: 1 arg\"));\n register \"number?\" (fun args ->\n match args with [Number _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"number?: 1 arg\"));\n register \"string?\" (fun args ->\n match args with [String _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"string?: 1 arg\"));\n register \"boolean?\" (fun args ->\n match args with [Bool _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"boolean?: 1 arg\"));\n register \"list?\" (fun args ->\n match args with [List _] | [ListRef _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"list?: 1 arg\"));\n register \"dict?\" (fun args ->\n match args with [Dict _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"dict?: 1 arg\"));\n register \"symbol?\" (fun args ->\n match args with [Symbol _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"symbol?: 1 arg\"));\n register \"keyword?\" (fun args ->\n match args with [Keyword _] -> Bool true | [_] -> Bool false | _ -> raise (Eval_error \"keyword?: 1 arg\"));\n register \"empty?\" (fun args ->\n match args with\n | [List []] | [ListRef { contents = [] }] -> Bool true\n | [List _] | [ListRef _] -> Bool false\n | [String \"\"] -> Bool true | [String _] -> Bool false\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | [Nil] -> Bool true\n | [_] -> Bool false\n | _ -> raise (Eval_error \"empty?: 1 arg\"));\n register \"odd?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 <> 0) | _ -> raise (Eval_error \"odd?: 1 arg\"));\n register \"even?\" (fun args ->\n match args with [a] -> Bool (int_of_float (as_number a) mod 2 = 0) | _ -> raise (Eval_error \"even?: 1 arg\"));\n register \"zero?\" (fun args ->\n match args with [a] -> Bool (as_number a = 0.0) | _ -> raise (Eval_error \"zero?: 1 arg\"));\n\n (* === Strings === *)\n register \"str\" (fun args -> String (String.concat \"\" (List.map to_string args)));\n register \"upper\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upper: 1 arg\"));\n register \"upcase\" (fun args ->\n match args with [a] -> String (String.uppercase_ascii (as_string a)) | _ -> raise (Eval_error \"upcase: 1 arg\"));\n register \"lower\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"lower: 1 arg\"));\n register \"downcase\" (fun args ->\n match args with [a] -> String (String.lowercase_ascii (as_string a)) | _ -> raise (Eval_error \"downcase: 1 arg\"));\n register \"trim\" (fun args ->\n match args with [a] -> String (String.trim (as_string a)) | _ -> raise (Eval_error \"trim: 1 arg\"));\n register \"string-length\" (fun args ->\n match args with [a] -> Number (float_of_int (String.length (as_string a)))\n | _ -> raise (Eval_error \"string-length: 1 arg\"));\n register \"string-contains?\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let rec find i =\n if i + String.length needle > String.length haystack then false\n else if String.sub haystack i (String.length needle) = needle then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"string-contains?: 2 string args\"));\n register \"starts-with?\" (fun args ->\n match args with\n | [String s; String prefix] ->\n Bool (String.length s >= String.length prefix &&\n String.sub s 0 (String.length prefix) = prefix)\n | _ -> raise (Eval_error \"starts-with?: 2 string args\"));\n register \"ends-with?\" (fun args ->\n match args with\n | [String s; String suffix] ->\n let sl = String.length s and xl = String.length suffix in\n Bool (sl >= xl && String.sub s (sl - xl) xl = suffix)\n | _ -> raise (Eval_error \"ends-with?: 2 string args\"));\n register \"index-of\" (fun args ->\n match args with\n | [String haystack; String needle] ->\n let nl = String.length needle and hl = String.length haystack in\n let rec find i =\n if i + nl > hl then Number (-1.0)\n else if String.sub haystack i nl = needle then Number (float_of_int i)\n else find (i + 1)\n in find 0\n | _ -> raise (Eval_error \"index-of: 2 string args\"));\n register \"substring\" (fun args ->\n match args with\n | [String s; Number start; Number end_] ->\n let i = int_of_float start and j = int_of_float end_ in\n let len = String.length s in\n let i = max 0 (min i len) and j = max 0 (min j len) in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"substring: 3 args\"));\n register \"substr\" (fun args ->\n match args with\n | [String s; Number start; Number len] ->\n let i = int_of_float start and n = int_of_float len in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n let n = max 0 (min n (sl - i)) in\n String (String.sub s i n)\n | [String s; Number start] ->\n let i = int_of_float start in\n let sl = String.length s in\n let i = max 0 (min i sl) in\n String (String.sub s i (sl - i))\n | _ -> raise (Eval_error \"substr: 2-3 args\"));\n register \"split\" (fun args ->\n match args with\n | [String s; String sep] ->\n List (List.map (fun p -> String p) (String.split_on_char sep.[0] s))\n | _ -> raise (Eval_error \"split: 2 args\"));\n register \"join\" (fun args ->\n match args with\n | [String sep; (List items | ListRef { contents = items })] ->\n String (String.concat sep (List.map to_string items))\n | _ -> raise (Eval_error \"join: 2 args\"));\n register \"replace\" (fun args ->\n let to_str = function\n | String s -> s | SxExpr s -> s | RawHTML s -> s\n | Keyword k -> k | Symbol s -> s\n | Nil -> \"\" | Bool true -> \"true\" | Bool false -> \"false\"\n | Number n -> if Float.is_integer n then string_of_int (int_of_float n) else Printf.sprintf \"%g\" n\n | Thunk _ as t -> (match !_sx_trampoline_fn t with String s -> s | v -> to_string v)\n | v -> to_string v\n in\n match args with\n | [s; old_s; new_s] ->\n let s = to_str s and old_s = to_str old_s and new_s = to_str new_s in\n let ol = String.length old_s in\n if ol = 0 then String s\n else begin\n let buf = Buffer.create (String.length s) in\n let rec go i =\n if i >= String.length s then ()\n else if i + ol <= String.length s && String.sub s i ol = old_s then begin\n Buffer.add_string buf new_s;\n go (i + ol)\n end else begin\n Buffer.add_char buf s.[i];\n go (i + 1)\n end\n in go 0;\n String (Buffer.contents buf)\n end\n | _ -> raise (Eval_error \"replace: 3 string args\"));\n register \"char-from-code\" (fun args ->\n match args with\n | [Number n] ->\n let buf = Buffer.create 4 in\n Buffer.add_utf_8_uchar buf (Uchar.of_int (int_of_float n));\n String (Buffer.contents buf)\n | _ -> raise (Eval_error \"char-from-code: 1 arg\"));\n\n (* === Collections === *)\n register \"list\" (fun args -> ListRef (ref args));\n register \"len\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> Number (float_of_int (List.length l))\n | [String s] -> Number (float_of_int (String.length s))\n | [Dict d] -> Number (float_of_int (Hashtbl.length d))\n | [Nil] | [Bool false] -> Number 0.0\n | [Bool true] -> Number 1.0\n | [Number _] -> Number 1.0\n | [RawHTML s] -> Number (float_of_int (String.length s))\n | [SxExpr s] -> Number (float_of_int (String.length s))\n | [Spread pairs] -> Number (float_of_int (List.length pairs))\n | [Component _] | [Island _] | [Lambda _] | [NativeFn _]\n | [Macro _] | [Thunk _] | [Keyword _] | [Symbol _] -> Number 0.0\n | _ -> raise (Eval_error (Printf.sprintf \"len: %d args\"\n (List.length args))));\n register \"first\" (fun args ->\n match args with\n | [List (x :: _)] | [ListRef { contents = x :: _ }] -> x\n | [List []] | [ListRef { contents = [] }] -> Nil | [Nil] -> Nil\n | [x] -> raise (Eval_error (\"first: expected list, got \" ^ inspect x))\n | _ -> raise (Eval_error \"first: 1 list arg\"));\n register \"rest\" (fun args ->\n match args with\n | [List (_ :: xs)] | [ListRef { contents = _ :: xs }] -> List xs\n | [List []] | [ListRef { contents = [] }] -> List [] | [Nil] -> List []\n | _ -> raise (Eval_error \"rest: 1 list arg\"));\n register \"last\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error \"last: 1 list arg\"));\n register \"init\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] ->\n (match List.rev l with _ :: rest -> List (List.rev rest) | [] -> List [])\n | _ -> raise (Eval_error \"init: 1 list arg\"));\n register \"nth\" (fun args ->\n match args with\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [String s; Number n] ->\n let i = int_of_float n in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> raise (Eval_error \"nth: list/string and number\"));\n register \"cons\" (fun args ->\n match args with\n | [x; List l] | [x; ListRef { contents = l }] -> List (x :: l)\n | [x; Nil] -> List [x]\n | _ -> raise (Eval_error \"cons: value and list\"));\n register \"append\" (fun args ->\n match args with\n | [List la | ListRef { contents = la }; List lb | ListRef { contents = lb }] ->\n List (la @ lb)\n | [List la | ListRef { contents = la }; Nil] -> List la\n | [Nil; List lb | ListRef { contents = lb }] -> List lb\n | [List la | ListRef { contents = la }; v] -> List (la @ [v])\n | [v; List lb | ListRef { contents = lb }] -> List ([v] @ lb)\n | _ ->\n let all = List.concat_map as_list args in\n List all);\n register \"reverse\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.rev l)\n | _ -> raise (Eval_error \"reverse: 1 list\"));\n register \"flatten\" (fun args ->\n let rec flat = function\n | List items | ListRef { contents = items } -> List.concat_map flat items\n | x -> [x]\n in\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.concat_map flat l)\n | _ -> raise (Eval_error \"flatten: 1 list\"));\n register \"concat\" (fun args -> List (List.concat_map as_list args));\n register \"contains?\" (fun args ->\n match args with\n | [List l; item] | [ListRef { contents = l }; item] ->\n (* Physical equality first (handles signals/dicts/closures safely),\n structural fallback only for acyclic types (string/number/bool/nil/symbol/keyword) *)\n let safe_eq a b =\n a == b ||\n (match a, b with\n | Number x, Number y -> x = y\n | String x, String y -> x = y\n | Bool x, Bool y -> x = y\n | Nil, Nil -> true\n | Symbol x, Symbol y -> x = y\n | Keyword x, Keyword y -> x = y\n | Dict a, Dict b ->\n (match Hashtbl.find_opt a \"__host_handle\", Hashtbl.find_opt b \"__host_handle\" with\n | Some (Number ha), Some (Number hb) -> ha = hb\n | _ -> false)\n | _ -> false)\n in\n Bool (List.exists (fun x -> safe_eq x item) l)\n | [String s; String sub] ->\n let rec find i =\n if i + String.length sub > String.length s then false\n else if String.sub s i (String.length sub) = sub then true\n else find (i + 1)\n in Bool (find 0)\n | _ -> raise (Eval_error \"contains?: 2 args\"));\n register \"range\" (fun args ->\n match args with\n | [Number stop] ->\n let n = int_of_float stop in\n List (List.init (max 0 n) (fun i -> Number (float_of_int i)))\n | [Number start; Number stop] ->\n let s = int_of_float start and e = int_of_float stop in\n let len = max 0 (e - s) in\n List (List.init len (fun i -> Number (float_of_int (s + i))))\n | [Number start; Number stop; Number step] ->\n let s = start and e = stop and st = step in\n if st = 0.0 then List []\n else\n let items = ref [] in\n let i = ref s in\n if st > 0.0 then\n (while !i < e do items := Number !i :: !items; i := !i +. st done)\n else\n (while !i > e do items := Number !i :: !items; i := !i +. st done);\n List (List.rev !items)\n | _ -> raise (Eval_error \"range: 1-3 args\"));\n register \"slice\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number start] ->\n let i = max 0 (int_of_float start) in\n let rec drop n = function _ :: xs when n > 0 -> drop (n-1) xs | l -> l in\n List (drop i l)\n | [(List l | ListRef { contents = l }); Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let len = List.length l in\n let j = min j len in\n let rec take_range idx = function\n | [] -> []\n | x :: xs ->\n if idx >= j then []\n else if idx >= i then x :: take_range (idx+1) xs\n else take_range (idx+1) xs\n in List (take_range 0 l)\n | [String s; Number start] ->\n let i = max 0 (int_of_float start) in\n String (String.sub s i (max 0 (String.length s - i)))\n | [String s; Number start; Number end_] ->\n let i = max 0 (int_of_float start) and j = int_of_float end_ in\n let sl = String.length s in\n let j = min j sl in\n String (String.sub s i (max 0 (j - i)))\n | _ -> raise (Eval_error \"slice: 2-3 args\"));\n register \"sort\" (fun args ->\n match args with\n | [List l] | [ListRef { contents = l }] -> List (List.sort compare l)\n | _ -> raise (Eval_error \"sort: 1 list\"));\n register \"zip\" (fun args ->\n match args with\n | [a; b] ->\n let la = as_list a and lb = as_list b in\n let rec go l1 l2 acc = match l1, l2 with\n | x :: xs, y :: ys -> go xs ys (List [x; y] :: acc)\n | _ -> List.rev acc\n in List (go la lb [])\n | _ -> raise (Eval_error \"zip: 2 lists\"));\n register \"zip-pairs\" (fun args ->\n match args with\n | [v] ->\n let l = as_list v in\n let rec go = function\n | a :: b :: rest -> List [a; b] :: go rest\n | _ -> []\n in List (go l)\n | _ -> raise (Eval_error \"zip-pairs: 1 list\"));\n register \"take\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in List (take_n (int_of_float n) l)\n | _ -> raise (Eval_error \"take: list and number\"));\n register \"drop\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in List (drop_n (int_of_float n) l)\n | _ -> raise (Eval_error \"drop: list and number\"));\n register \"chunk-every\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l }); Number n] ->\n let size = int_of_float n in\n let rec go = function\n | [] -> []\n | l ->\n let rec take_n i = function\n | x :: xs when i > 0 -> x :: take_n (i-1) xs\n | _ -> []\n in\n let rec drop_n i = function\n | _ :: xs when i > 0 -> drop_n (i-1) xs\n | l -> l\n in\n List (take_n size l) :: go (drop_n size l)\n in List (go l)\n | _ -> raise (Eval_error \"chunk-every: list and number\"));\n register \"unique\" (fun args ->\n match args with\n | [(List l | ListRef { contents = l })] ->\n let seen = Hashtbl.create 16 in\n let result = List.filter (fun x ->\n let key = inspect x in\n if Hashtbl.mem seen key then false\n else (Hashtbl.replace seen key true; true)\n ) l in\n List result\n | _ -> raise (Eval_error \"unique: 1 list\"));\n\n (* === Dict === *)\n register \"dict\" (fun args ->\n let d = make_dict () in\n let rec go = function\n | [] -> Dict d\n | Keyword k :: v :: rest -> dict_set d k v; go rest\n | String k :: v :: rest -> dict_set d k v; go rest\n | _ -> raise (Eval_error \"dict: pairs of key value\")\n in go args);\n register \"get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | [List l; Number n] | [ListRef { contents = l }; Number n] ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | [Nil; _] -> Nil (* nil.anything → nil *)\n | [_; _] -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n | _ -> Nil);\n register \"has-key?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | [Dict d; Keyword k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"has-key?: dict and key\"));\n register \"assoc\" (fun args ->\n match args with\n | Dict d :: rest ->\n let d2 = Hashtbl.copy d in\n let rec go = function\n | [] -> Dict d2\n | String k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | Keyword k :: v :: rest -> Hashtbl.replace d2 k v; go rest\n | _ -> raise (Eval_error \"assoc: pairs\")\n in go rest\n | _ -> raise (Eval_error \"assoc: dict + pairs\"));\n register \"dissoc\" (fun args ->\n match args with\n | Dict d :: keys ->\n let d2 = Hashtbl.copy d in\n List.iter (fun k -> Hashtbl.remove d2 (to_string k)) keys;\n Dict d2\n | _ -> raise (Eval_error \"dissoc: dict + keys\"));\n register \"merge\" (fun args ->\n let d = make_dict () in\n List.iter (function\n | Dict src -> Hashtbl.iter (fun k v -> Hashtbl.replace d k v) src\n | _ -> raise (Eval_error \"merge: all args must be dicts\")\n ) args;\n Dict d);\n register \"keys\" (fun args ->\n match args with [Dict d] -> List (dict_keys d) | _ -> raise (Eval_error \"keys: 1 dict\"));\n register \"vals\" (fun args ->\n match args with [Dict d] -> List (dict_vals d) | _ -> raise (Eval_error \"vals: 1 dict\"));\n register \"mutable-list\" (fun _args -> ListRef (ref []));\n register \"set-nth!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n let l = !r in\n r := List.mapi (fun j x -> if j = i then v else x) l;\n Nil\n | [List _; _; _] ->\n raise (Eval_error \"set-nth!: list is immutable, use ListRef\")\n | _ -> raise (Eval_error \"set-nth!: expected (list idx val)\"));\n register \"dict-set!\" (fun args ->\n match args with\n | [Dict d; String k; v] -> dict_set d k v; v\n | [Dict d; Keyword k; v] -> dict_set d k v; v\n | _ -> raise (Eval_error \"dict-set!: dict key val\"));\n register \"dict-get\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_get d k\n | [Dict d; Keyword k] -> dict_get d k\n | _ -> raise (Eval_error \"dict-get: dict and key\"));\n register \"dict-has?\" (fun args ->\n match args with\n | [Dict d; String k] -> Bool (dict_has d k)\n | _ -> raise (Eval_error \"dict-has?: dict and key\"));\n register \"dict-delete!\" (fun args ->\n match args with\n | [Dict d; String k] -> dict_delete d k; Nil\n | _ -> raise (Eval_error \"dict-delete!: dict and key\"));\n\n (* === Misc === *)\n register \"type-of\" (fun args ->\n match args with [a] -> String (type_of a) | _ -> raise (Eval_error \"type-of: 1 arg\"));\n register \"inspect\" (fun args ->\n match args with [a] -> String (inspect a) | _ -> raise (Eval_error \"inspect: 1 arg\"));\n register \"serialize\" (fun args ->\n match args with\n | [a] -> String (inspect a) (* used for dedup keys in compiler *)\n | _ -> raise (Eval_error \"serialize: 1 arg\"));\n register \"make-symbol\" (fun args ->\n match args with\n | [String s] -> Symbol s\n | _ -> raise (Eval_error \"make-symbol: expected string\"));\n register \"error\" (fun args ->\n match args with [String msg] -> raise (Eval_error msg)\n | [a] -> raise (Eval_error (to_string a))\n | _ -> raise (Eval_error \"error: 1 arg\"));\n register \"apply\" (fun args ->\n match args with\n | [NativeFn (_, f); (List a | ListRef { contents = a })] -> f a\n | [NativeFn (_, f); Nil] -> f []\n | _ -> raise (Eval_error \"apply: function and list\"));\n register \"identical?\" (fun args ->\n match args with [a; b] -> Bool (a == b) | _ -> raise (Eval_error \"identical?: 2 args\"));\n register \"make-spread\" (fun args ->\n match args with\n | [Dict d] ->\n let pairs = Hashtbl.fold (fun k v acc -> (k, v) :: acc) d [] in\n Spread pairs\n | _ -> raise (Eval_error \"make-spread: 1 dict\"));\n register \"spread?\" (fun args ->\n match args with [Spread _] -> Bool true | [_] -> Bool false\n | _ -> raise (Eval_error \"spread?: 1 arg\"));\n register \"spread-attrs\" (fun args ->\n match args with\n | [Spread pairs] ->\n let d = make_dict () in\n List.iter (fun (k, v) -> dict_set d k v) pairs;\n Dict d\n | _ -> raise (Eval_error \"spread-attrs: 1 spread\"));\n\n (* Higher-order forms as callable primitives — used by the VM.\n The CEK machine handles these as special forms with dedicated frames;\n the VM needs them as plain callable values. *)\n (* Call any SX callable — handles NativeFn, Lambda (via trampoline), VM closures *)\n let call_any f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | _ -> !_sx_trampoline_fn (!_sx_call_fn f args)\n in\n register \"map\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.map (fun x -> call_any f [x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map: expected (fn list)\"));\n register \"map-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.mapi (fun i x -> call_any f [Number (float_of_int i); x]) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"map-indexed: expected (fn list)\"));\n register \"filter\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List (List.filter (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> List []\n | _ -> raise (Eval_error \"filter: expected (fn list)\"));\n register \"for-each\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iter (fun x -> ignore (call_any f [x])) items; Nil\n | [_; Nil] -> Nil (* nil collection = no-op *)\n | _ ->\n let types = String.concat \", \" (List.map (fun v -> type_of v) args) in\n raise (Eval_error (Printf.sprintf \"for-each: expected (fn list), got (%s) %d args\" types (List.length args))));\n register \"reduce\" (fun args ->\n match args with\n | [f; init; (List items | ListRef { contents = items })] ->\n List.fold_left (fun acc x -> call_any f [acc; x]) init items\n | _ -> raise (Eval_error \"reduce: expected (fn init list)\"));\n register \"some\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n (try List.find (fun x -> sx_truthy (call_any f [x])) items\n with Not_found -> Bool false)\n | [_; Nil] -> Bool false\n | _ -> raise (Eval_error \"some: expected (fn list)\"));\n register \"every?\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n Bool (List.for_all (fun x -> sx_truthy (call_any f [x])) items)\n | [_; Nil] -> Bool true\n | _ -> raise (Eval_error \"every?: expected (fn list)\"));\n\n (* ---- VM stack primitives (vm.sx platform interface) ---- *)\n register \"make-vm-stack\" (fun args ->\n match args with\n | [Number n] -> ListRef (ref (List.init (int_of_float n) (fun _ -> Nil)))\n | _ -> raise (Eval_error \"make-vm-stack: expected (size)\"));\n register \"vm-stack-get\" (fun args ->\n match args with\n | [ListRef r; Number n] -> List.nth !r (int_of_float n)\n | _ -> raise (Eval_error \"vm-stack-get: expected (stack idx)\"));\n register \"vm-stack-set!\" (fun args ->\n match args with\n | [ListRef r; Number n; v] ->\n let i = int_of_float n in\n r := List.mapi (fun j x -> if j = i then v else x) !r; Nil\n | _ -> raise (Eval_error \"vm-stack-set!: expected (stack idx val)\"));\n register \"vm-stack-length\" (fun args ->\n match args with\n | [ListRef r] -> Number (float_of_int (List.length !r))\n | _ -> raise (Eval_error \"vm-stack-length: expected (stack)\"));\n register \"vm-stack-copy!\" (fun args ->\n match args with\n | [ListRef src; ListRef dst; Number n] ->\n let count = int_of_float n in\n let src_items = !src in\n dst := List.mapi (fun i x -> if i < count then List.nth src_items i else x) !dst; Nil\n | _ -> raise (Eval_error \"vm-stack-copy!: expected (src dst count)\"));\n register \"primitive?\" (fun args ->\n match args with\n | [String name] -> Bool (Hashtbl.mem primitives name)\n | _ -> Bool false);\n\n (* Scope stack primitives are registered by sx_server.ml / run_tests.ml\n because they use a shared scope stacks table with collect!/collected. *)\n\n (* ---- Predicates needed by adapter-html.sx ---- *)\n register \"lambda?\" (fun args ->\n match args with [Lambda _] -> Bool true | _ -> Bool false);\n register \"island?\" (fun args ->\n match args with [Island _] -> Bool true | _ -> Bool false);\n register \"is-else-clause?\" (fun args ->\n match args with\n | [Keyword \"else\"] -> Bool true\n | [Bool true] -> Bool true\n | _ -> Bool false);\n register \"cond-scheme?\" (fun args ->\n match args with\n | [List clauses] ->\n Bool (List.for_all (fun c ->\n match c with\n | List l -> List.length l = 2\n | _ -> false) clauses)\n | _ -> Bool false);\n register \"component?\" (fun args ->\n match args with [Component _] -> Bool true | [Island _] -> Bool true | _ -> Bool false);\n register \"lambda-closure\" (fun args ->\n match args with [Lambda l] -> Env l.l_closure | _ -> Nil);\n register \"component-closure\" (fun args ->\n match args with\n | [Component c] -> Env c.c_closure\n | [Island i] -> Env i.i_closure\n | _ -> Nil);\n register \"component-has-children?\" (fun args ->\n match args with\n | [Component c] -> Bool c.c_has_children\n | [Island i] -> Bool i.i_has_children\n | _ -> Bool false);\n register \"component-name\" (fun args ->\n match args with\n | [Component c] -> String c.c_name\n | [Island i] -> String i.i_name\n | _ -> Nil);\n register \"component-params\" (fun args ->\n match args with\n | [Component c] -> List (List.map (fun s -> String s) c.c_params)\n | [Island i] -> List (List.map (fun s -> String s) i.i_params)\n | _ -> List []);\n register \"component-body\" (fun args ->\n match args with\n | [Component c] -> c.c_body\n | [Island i] -> i.i_body\n | _ -> Nil);\n register \"macro?\" (fun args ->\n match args with [Macro _] -> Bool true | _ -> Bool false);\n register \"for-each-indexed\" (fun args ->\n match args with\n | [f; (List items | ListRef { contents = items })] ->\n List.iteri (fun i x -> ignore (call_any f [Number (float_of_int i); x])) items; Nil\n | _ -> raise (Eval_error \"for-each-indexed: expected (fn list)\"));\n register \"lambda-params\" (fun args ->\n match args with\n | [Lambda l] -> List (List.map (fun s -> String s) l.l_params)\n | _ -> List []);\n register \"lambda-body\" (fun args ->\n match args with [Lambda l] -> l.l_body | _ -> Nil);\n (* expand-macro is registered later by run_tests.ml / sx_server.ml\n because it needs eval_expr which creates a dependency cycle *);\n register \"empty-dict?\" (fun args ->\n match args with\n | [Dict d] -> Bool (Hashtbl.length d = 0)\n | _ -> Bool true);\n register \"make-raw-html\" (fun args ->\n match args with [String s] -> RawHTML s | _ -> Nil);\n register \"raw-html-content\" (fun args ->\n match args with [RawHTML s] -> String s | _ -> String \"\");\n register \"get-primitive\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> NativeFn (name, fn)\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"get-primitive: expected (name)\"));\n register \"call-primitive\" (fun args ->\n match args with\n | [String name; (List a | ListRef { contents = a })] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn a\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | [String name; Nil] ->\n (match Hashtbl.find_opt primitives name with\n | Some fn -> fn []\n | None -> raise (Eval_error (\"VM undefined: \" ^ name)))\n | _ -> raise (Eval_error \"call-primitive: expected (name args-list)\"));\n ()\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":113622},"map":{"version":3,"sources":["/workspace_root/lib/sx_runtime.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Runtime helpers for transpiled code.\n\n These bridge the gap between the transpiler's output and the\n foundation types/primitives. The transpiled evaluator calls these\n functions directly. *)\n\nopen Sx_types\n\n(** Call a registered primitive by name. *)\nlet prim_call name args =\n match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f args\n | None -> raise (Eval_error (\"Unknown primitive: \" ^ name))\n\n(** Convert any SX value to an OCaml string (internal). *)\nlet value_to_str = function\n | String s -> s\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Nil -> \"\"\n | Symbol s -> s\n | Keyword k -> k\n | v -> inspect v\n\n(** sx_to_string returns a value (String) for transpiled code. *)\nlet sx_to_string v = String (value_to_str v)\n\n(** String concatenation helper — [sx_str] takes a list of values. *)\nlet sx_str args =\n String.concat \"\" (List.map value_to_str args)\n\n(** Convert a value to a list. *)\nlet sx_to_list = function\n | List l -> l\n | ListRef r -> !r\n | Nil -> []\n | v -> raise (Eval_error (\"Expected list, got \" ^ type_of v))\n\n(** Call an SX callable (lambda, native fn, continuation). *)\nlet sx_call f args =\n match f with\n | NativeFn (_, fn) -> fn args\n | VmClosure cl -> !Sx_types._vm_call_closure_ref cl args\n | Lambda l ->\n let local = Sx_types.env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (Sx_types.env_bind local p a)) l.l_params args;\n Thunk (l.l_body, local)\n | Continuation (k, _) ->\n k (match args with x :: _ -> x | [] -> Nil)\n | _ -> raise (Eval_error (\"Not callable: \" ^ inspect f))\n\n(* Initialize forward ref so primitives can call SX functions *)\nlet () = Sx_primitives._sx_call_fn := sx_call\n(* Trampoline ref is set by sx_ref.ml after it's loaded *)\n\n(** Apply a function to a list of args. *)\nlet sx_apply f args_list =\n sx_call f (sx_to_list args_list)\n\n(** Mutable append — add item to a list ref or accumulator.\n In transpiled code, lists that get appended to are mutable refs. *)\nlet sx_append_b lst item =\n match lst with\n | List items -> List (items @ [item])\n | ListRef r -> r := !r @ [item]; lst (* mutate in place, return same ref *)\n | _ -> raise (Eval_error (\"append!: expected list, got \" ^ type_of lst))\n\n(** Mutable dict-set — set key in dict, return value. *)\nlet sx_dict_set_b d k v =\n match d, k with\n | Dict tbl, String key -> Hashtbl.replace tbl key v; v\n | Dict tbl, Keyword key -> Hashtbl.replace tbl key v; v\n | _ -> raise (Eval_error \"dict-set!: expected dict and string key\")\n\n(** Get from dict or list. *)\nlet get_val container key =\n match container, key with\n | CekState s, String k ->\n (match k with\n | \"control\" -> s.cs_control | \"env\" -> s.cs_env\n | \"kont\" -> s.cs_kont | \"phase\" -> String s.cs_phase\n | \"value\" -> s.cs_value | _ -> Nil)\n | CekFrame f, String k ->\n (match k with\n | \"type\" -> String f.cf_type | \"env\" -> f.cf_env\n | \"name\" -> f.cf_name | \"body\" -> f.cf_body\n | \"remaining\" -> f.cf_remaining | \"f\" -> f.cf_f\n | \"args\" -> f.cf_args | \"evaled\" -> f.cf_args\n | \"results\" -> f.cf_results | \"raw-args\" -> f.cf_results\n | \"then\" -> f.cf_body | \"else\" -> f.cf_name\n | \"ho-type\" -> f.cf_extra | \"scheme\" -> f.cf_extra\n | \"indexed\" -> f.cf_extra | \"value\" -> f.cf_extra\n | \"phase\" -> f.cf_extra | \"has-effects\" -> f.cf_extra\n | \"match-val\" -> f.cf_extra | \"current-item\" -> f.cf_extra\n | \"update-fn\" -> f.cf_extra | \"head-name\" -> f.cf_extra\n | \"emitted\" -> f.cf_extra2 | \"effect-list\" -> f.cf_extra2\n | \"first-render\" -> f.cf_extra2\n | _ -> Nil)\n | Dict d, String k -> dict_get d k\n | Dict d, Keyword k -> dict_get d k\n | (List l | ListRef { contents = l }), Number n ->\n (try List.nth l (int_of_float n) with _ -> Nil)\n | Nil, _ -> Nil (* nil.anything → nil *)\n | _, _ -> Nil (* type mismatch → nil (matches JS/Python behavior) *)\n\n(** Register get as a primitive override — transpiled code calls (get d k). *)\nlet () =\n Sx_primitives.register \"get\" (fun args ->\n match args with\n | [c; k] -> get_val c k\n | [c; k; default] ->\n (try\n let v = get_val c k in\n if v = Nil then default else v\n with _ -> default)\n | _ -> raise (Eval_error \"get: 2-3 args\"))\n\n\n(* ====================================================================== *)\n(* Primitive aliases — top-level functions called by transpiled code *)\n(* ====================================================================== *)\n\n(** The transpiled evaluator calls primitives directly by their mangled\n OCaml name. These aliases delegate to the primitives table so the\n transpiled code compiles without needing [prim_call] everywhere. *)\n\nlet _prim name = match Hashtbl.find_opt Sx_primitives.primitives name with\n | Some f -> f | None -> (fun _ -> raise (Eval_error (\"Missing prim: \" ^ name)))\n\n(* Collection ops *)\nlet first args = _prim \"first\" [args]\nlet rest args = _prim \"rest\" [args]\nlet last args = _prim \"last\" [args]\nlet nth coll i = _prim \"nth\" [coll; i]\nlet cons x l = _prim \"cons\" [x; l]\nlet append a b = _prim \"append\" [a; b]\nlet reverse l = _prim \"reverse\" [l]\nlet flatten l = _prim \"flatten\" [l]\nlet concat a b = _prim \"concat\" [a; b]\nlet slice a b = _prim \"slice\" [a; b]\nlet len a = _prim \"len\" [a]\nlet get a b = get_val a b\nlet sort' a = _prim \"sort\" [a]\nlet range' a = _prim \"range\" [a]\nlet unique a = _prim \"unique\" [a]\nlet zip a b = _prim \"zip\" [a; b]\nlet zip_pairs a = _prim \"zip-pairs\" [a]\nlet take a b = _prim \"take\" [a; b]\nlet drop a b = _prim \"drop\" [a; b]\nlet chunk_every a b = _prim \"chunk-every\" [a; b]\n\n(* Predicates *)\nlet empty_p a = _prim \"empty?\" [a]\nlet nil_p a = _prim \"nil?\" [a]\nlet number_p a = _prim \"number?\" [a]\nlet string_p a = _prim \"string?\" [a]\nlet boolean_p a = _prim \"boolean?\" [a]\nlet list_p a = _prim \"list?\" [a]\nlet dict_p a = _prim \"dict?\" [a]\nlet symbol_p a = _prim \"symbol?\" [a]\nlet keyword_p a = _prim \"keyword?\" [a]\nlet contains_p a b = _prim \"contains?\" [a; b]\nlet has_key_p a b = _prim \"has-key?\" [a; b]\nlet starts_with_p a b = _prim \"starts-with?\" [a; b]\nlet ends_with_p a b = _prim \"ends-with?\" [a; b]\nlet string_contains_p a b = _prim \"string-contains?\" [a; b]\nlet odd_p a = _prim \"odd?\" [a]\nlet even_p a = _prim \"even?\" [a]\nlet zero_p a = _prim \"zero?\" [a]\n\n(* String ops *)\nlet str' args = String (sx_str args)\nlet upper a = _prim \"upper\" [a]\nlet upcase a = _prim \"upcase\" [a]\nlet lower a = _prim \"lower\" [a]\nlet downcase a = _prim \"downcase\" [a]\nlet trim a = _prim \"trim\" [a]\nlet split a b = _prim \"split\" [a; b]\nlet join a b = _prim \"join\" [a; b]\nlet replace a b c = _prim \"replace\" [a; b; c]\nlet index_of a b = _prim \"index-of\" [a; b]\nlet substring a b c = _prim \"substring\" [a; b; c]\nlet string_length a = _prim \"string-length\" [a]\nlet char_from_code a = _prim \"char-from-code\" [a]\n\n(* Dict ops *)\nlet assoc d k v = _prim \"assoc\" [d; k; v]\nlet dissoc d k = _prim \"dissoc\" [d; k]\nlet merge' a b = _prim \"merge\" [a; b]\nlet keys a = _prim \"keys\" [a]\nlet vals a = _prim \"vals\" [a]\nlet dict_set a b c = _prim \"dict-set!\" [a; b; c]\nlet dict_get a b = _prim \"dict-get\" [a; b]\nlet dict_has_p a b = _prim \"dict-has?\" [a; b]\nlet dict_delete a b = _prim \"dict-delete!\" [a; b]\n\n(* Math *)\nlet abs' a = _prim \"abs\" [a]\nlet sqrt' a = _prim \"sqrt\" [a]\nlet pow' a b = _prim \"pow\" [a; b]\nlet floor' a = _prim \"floor\" [a]\nlet ceil' a = _prim \"ceil\" [a]\nlet round' a = _prim \"round\" [a]\nlet min' a b = _prim \"min\" [a; b]\nlet max' a b = _prim \"max\" [a; b]\nlet clamp a b c = _prim \"clamp\" [a; b; c]\nlet parse_int a = _prim \"parse-int\" [a]\nlet parse_float a = _prim \"parse-float\" [a]\n\n(* Misc *)\nlet error msg = raise (Eval_error (value_to_str msg))\n\n(* inspect wrapper — returns String value instead of OCaml string *)\nlet inspect v = String (Sx_types.inspect v)\nlet apply' f args = sx_apply f args\nlet identical_p a b = _prim \"identical?\" [a; b]\nlet _is_spread_prim a = _prim \"spread?\" [a]\nlet spread_attrs a = _prim \"spread-attrs\" [a]\nlet make_spread a = _prim \"make-spread\" [a]\n\n(* Scope primitives — delegate to sx_ref.py's shared scope stacks *)\nlet sx_collect a b = prim_call \"collect!\" [a; b]\nlet sx_collected a = prim_call \"collected\" [a]\nlet sx_clear_collected a = prim_call \"clear-collected!\" [a]\nlet sx_emit a b = prim_call \"emit!\" [a; b]\nlet sx_emitted a = prim_call \"emitted\" [a]\nlet sx_context a b = prim_call \"context\" [a; b]\n\n(* Trampoline — forward-declared in sx_ref.ml, delegates to CEK eval_expr *)\n(* This is a stub; the real trampoline is wired up in sx_ref.ml after eval_expr is defined *)\nlet trampoline v = v\n\n(* Value-returning type predicates — the transpiled code passes these through\n sx_truthy, so they need to return Bool, not OCaml bool. *)\n(* type_of returns value, not string *)\nlet type_of v = String (Sx_types.type_of v)\n\n(* Env operations — accept Env-wrapped values and value keys.\n The transpiled CEK machine stores envs in dicts as Env values. *)\nlet unwrap_env = function\n | Env e -> e\n | Dict d ->\n (* Dict used as env — wrap it. Needed by adapter-html.sx which\n passes dicts as env args (e.g. empty {} as caller env). *)\n let e = Sx_types.make_env () in\n Hashtbl.iter (fun k v -> ignore (Sx_types.env_bind e k v)) d;\n e\n | Nil ->\n Sx_types.make_env ()\n | v -> raise (Eval_error (\"Expected env, got \" ^ Sx_types.type_of v))\n\nlet env_has e name = Bool (Sx_types.env_has (unwrap_env e) (value_to_str name))\nlet env_get e name = Sx_types.env_get (unwrap_env e) (value_to_str name)\nlet env_bind e name v = Sx_types.env_bind (unwrap_env e) (value_to_str name) v\nlet env_set e name v = Sx_types.env_set (unwrap_env e) (value_to_str name) v\n\nlet make_env () = Env (Sx_types.make_env ())\nlet env_extend e = Env (Sx_types.env_extend (unwrap_env e))\nlet env_merge a b = Env (Sx_types.env_merge (unwrap_env a) (unwrap_env b))\n\n(* set_lambda_name wrapper — accepts value, extracts string *)\nlet set_lambda_name l n = Sx_types.set_lambda_name l (value_to_str n)\n\nlet is_nil v = Bool (Sx_types.is_nil v)\nlet is_thunk v = Bool (Sx_types.is_thunk v)\nlet is_lambda v = Bool (Sx_types.is_lambda v)\nlet is_component v = Bool (Sx_types.is_component v)\nlet is_island v = Bool (Sx_types.is_island v)\nlet is_macro v = Bool (Sx_types.is_macro v)\nlet is_signal v = Bool (Sx_types.is_signal v)\nlet is_callable v = Bool (Sx_types.is_callable v)\nlet is_identical a b = Bool (a == b)\nlet is_primitive name = Bool (Sx_primitives.is_primitive (value_to_str name))\nlet get_primitive name = Sx_primitives.get_primitive (value_to_str name)\nlet is_spread v = match v with Spread _ -> Bool true | _ -> Bool false\n\n(* Stubs for functions defined in sx_ref.ml — resolved at link time *)\n(* These are forward-declared here; sx_ref.ml defines the actual implementations *)\n\n(* strip-prefix *)\n(* Stubs for evaluator functions — defined in sx_ref.ml but\n sometimes referenced before their definition via forward calls.\n These get overridden by the actual transpiled definitions. *)\n\nlet map_indexed fn coll =\n List (List.mapi (fun i x -> sx_call fn [Number (float_of_int i); x]) (sx_to_list coll))\n\nlet map_dict fn d =\n match d with\n | Dict tbl ->\n let result = Hashtbl.create (Hashtbl.length tbl) in\n Hashtbl.iter (fun k v -> Hashtbl.replace result k (sx_call fn [String k; v])) tbl;\n Dict result\n | _ -> raise (Eval_error \"map-dict: expected dict\")\n\nlet for_each fn coll =\n List.iter (fun x -> ignore (sx_call fn [x])) (sx_to_list coll);\n Nil\n\nlet for_each_indexed fn coll =\n List.iteri (fun i x -> ignore (sx_call fn [Number (float_of_int i); x])) (sx_to_list coll);\n Nil\n\n(* Continuation support *)\nlet continuation_p v = match v with Continuation (_, _) -> Bool true | _ -> Bool false\n\nlet make_cek_continuation captured rest_kont =\n let data = Hashtbl.create 2 in\n Hashtbl.replace data \"captured\" captured;\n Hashtbl.replace data \"rest-kont\" rest_kont;\n Continuation ((fun v -> v), Some data)\n\nlet continuation_data v = match v with\n | Continuation (_, Some d) -> Dict d\n | Continuation (_, None) -> Dict (Hashtbl.create 0)\n | _ -> raise (Eval_error \"not a continuation\")\n\n(* Dynamic wind — simplified for OCaml (no async) *)\nlet dynamic_wind_call before body after _env =\n ignore (sx_call before []);\n let result = sx_call body [] in\n ignore (sx_call after []);\n result\n\n(* Scope stack — all delegated to primitives registered in sx_server.ml *)\nlet scope_push name value = prim_call \"scope-push!\" [name; value]\nlet scope_pop name = prim_call \"scope-pop!\" [name]\nlet scope_peek name = prim_call \"scope-peek\" [name]\nlet scope_emit name value = prim_call \"scope-emit!\" [name; value]\nlet provide_push name value = prim_call \"scope-push!\" [name; value]\nlet provide_pop name = prim_call \"scope-pop!\" [name]\n\n(* Custom special forms registry — mutable dict *)\nlet custom_special_forms = Dict (Hashtbl.create 4)\n\n(* register-special-form! — add a handler to the custom registry *)\nlet register_special_form name handler =\n (match custom_special_forms with\n | Dict tbl -> Hashtbl.replace tbl (value_to_str name) handler; handler\n | _ -> raise (Eval_error \"custom_special_forms not a dict\"))\n\n(* Render check/fn hooks — nil by default, set by platform if needed *)\nlet render_check = Nil\nlet render_fn = Nil\n\n(* is-else-clause? — check if a cond/case test is an else marker *)\nlet is_else_clause v =\n match v with\n | Keyword k -> Bool (k = \"else\" || k = \"default\")\n | Symbol s -> Bool (s = \"else\" || s = \"default\")\n | Bool true -> Bool true\n | _ -> Bool false\n\n(* Signal accessors *)\nlet signal_value s = match s with\n | Signal sig' -> sig'.s_value\n | Dict d -> (match Hashtbl.find_opt d \"value\" with Some v -> v | None -> Nil)\n | _ -> raise (Eval_error \"not a signal\")\nlet signal_set_value s v = match s with Signal sig' -> sig'.s_value <- v; v | _ -> raise (Eval_error \"not a signal\")\nlet signal_subscribers s = match s with Signal sig' -> List (List.map (fun _ -> Nil) sig'.s_subscribers) | _ -> List []\nlet signal_add_sub_b s f =\n match s with\n | Dict d ->\n (match Hashtbl.find_opt d \"subscribers\" with\n | Some (ListRef r) -> r := !r @ [f]; Nil\n | Some (List items) -> Hashtbl.replace d \"subscribers\" (ListRef (ref (items @ [f]))); Nil\n | _ -> Hashtbl.replace d \"subscribers\" (ListRef (ref [f])); Nil)\n | _ -> Nil\n\nlet signal_remove_sub_b s f =\n match s with\n | Dict d ->\n (match Hashtbl.find_opt d \"subscribers\" with\n | Some (ListRef r) -> r := List.filter (fun x -> x != f) !r; Nil\n | Some (List items) -> Hashtbl.replace d \"subscribers\" (List (List.filter (fun x -> x != f) items)); Nil\n | _ -> Nil)\n | _ -> Nil\n\nlet signal_deps s =\n match s with\n | Dict d -> (match Hashtbl.find_opt d \"deps\" with Some v -> v | None -> List [])\n | _ -> List []\n\nlet signal_set_deps s d =\n match s with\n | Dict tbl -> Hashtbl.replace tbl \"deps\" d; Nil\n | _ -> Nil\n\nlet notify_subscribers s =\n let subs = match s with\n | Dict d -> (match Hashtbl.find_opt d \"subscribers\" with\n | Some (ListRef { contents = items }) | Some (List items) -> items\n | _ -> [])\n | _ -> []\n in\n List.iter (fun f -> ignore (sx_call f [])) subs;\n Nil\n\nlet flush_subscribers _s = Nil\nlet dispose_computed _s = Nil\n\n(* Island scope stubs — accept both bare OCaml fns and NativeFn values\n from transpiled code (NativeFn wrapping for value-storable lambdas). *)\nlet with_island_scope _register_fn body_fn =\n match body_fn with\n | NativeFn (_, f) -> f []\n | _ -> Nil\nlet register_in_scope _dispose_fn = Nil\n\n(* Component type annotation stub *)\nlet component_set_param_types_b _comp _types = Nil\n\n(* Parse keyword args from a call — this is defined in evaluator.sx,\n the transpiled version will override this stub. *)\n(* Forward-reference stubs for evaluator functions used before definition *)\nlet parse_comp_params _params = List [List []; Nil; Bool false]\nlet parse_macro_params _params = List [List []; Nil]\n\nlet parse_keyword_args _raw_args _env =\n (* Stub — the real implementation is transpiled from evaluator.sx *)\n List [Dict (Hashtbl.create 0); List []]\n\n(* Make handler/query/action/page def stubs *)\nlet make_handler_def name params body _env = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"handler\"); Hashtbl.replace d \"name\" name; Hashtbl.replace d \"params\" params; Hashtbl.replace d \"body\" body; d)\nlet make_query_def name params body _env = make_handler_def name params body _env\nlet make_action_def name params body _env = make_handler_def name params body _env\nlet make_page_def name _opts = Dict (let d = Hashtbl.create 4 in Hashtbl.replace d \"type\" (String \"page\"); Hashtbl.replace d \"name\" name; d)\n\n(* sf-def* stubs — platform-specific def-forms, not in the SX spec *)\nlet sf_defhandler args env =\n let name = first args in let rest_args = rest args in\n make_handler_def name (first rest_args) (nth rest_args (Number 1.0)) env\nlet sf_defquery args env = sf_defhandler args env\nlet sf_defaction args env = sf_defhandler args env\nlet sf_defpage args _env =\n let name = first args in make_page_def name (rest args)\n\nlet strip_prefix s prefix =\n match s, prefix with\n | String s, String p ->\n let pl = String.length p in\n if String.length s >= pl && String.sub s 0 pl = p\n then String (String.sub s pl (String.length s - pl))\n else String s\n | _ -> s\n\n(* debug_log — no-op in production, used by CEK evaluator for component warnings *)\nlet debug_log _ _ = Nil\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":125645},"map":{"version":3,"sources":["/workspace_root/lib/sx_ref.ml","/builtin/blackbox.ml"],"sourcesContent":["(* sx_ref.ml — Auto-generated from SX spec by hosts/ocaml/bootstrap.py *)\n(* Do not edit — regenerate with: python3 hosts/ocaml/bootstrap.py *)\n\n[@@@warning \"-26-27\"]\n\nopen Sx_types\nopen Sx_runtime\n\n(* Trampoline — forward ref, resolved after eval_expr is defined. *)\nlet trampoline_fn : (value -> value) ref = ref (fun v -> v)\nlet trampoline v = !trampoline_fn v\n\n\n\n(* === Mutable state for strict mode === *)\n(* These are defined as top-level refs because the transpiler cannot handle\n global set! mutation (it creates local refs that shadow the global). *)\nlet _strict_ref = ref (Bool false)\nlet _prim_param_types_ref = ref Nil\n\n(* JIT call hook — cek_call checks this before CEK dispatch for named\n lambdas. Registered by sx_server.ml after compiler loads. Tests\n run with hook = None (pure CEK, no compilation dependency). *)\nlet jit_call_hook : (value -> value list -> value option) option ref = ref None\n\n\n\n(* === Transpiled from evaluator (frames + eval + CEK) === *)\n\n(* make-cek-state *)\nlet rec make_cek_state control env kont =\n (CekState { cs_control = control; cs_env = env; cs_kont = kont; cs_phase = \"eval\"; cs_value = Nil })\n\n(* make-cek-value *)\nand make_cek_value value env kont =\n (CekState { cs_control = Nil; cs_env = env; cs_kont = kont; cs_phase = \"continue\"; cs_value = value })\n\n(* cek-terminal? *)\nand cek_terminal_p state =\n (let _and = (prim_call \"=\" [(get (state) ((String \"phase\"))); (String \"continue\")]) in if not (sx_truthy _and) then _and else (empty_p ((get (state) ((String \"kont\"))))))\n\n(* cek-control *)\nand cek_control s =\n (get (s) ((String \"control\")))\n\n(* cek-env *)\nand cek_env s =\n (get (s) ((String \"env\")))\n\n(* cek-kont *)\nand cek_kont s =\n (get (s) ((String \"kont\")))\n\n(* cek-phase *)\nand cek_phase s =\n (get (s) ((String \"phase\")))\n\n(* cek-value *)\nand cek_value s =\n (get (s) ((String \"value\")))\n\n(* make-if-frame *)\nand make_if_frame then_expr else_expr env =\n (CekFrame { cf_type = \"if\"; cf_env = env; cf_name = else_expr; cf_body = then_expr; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-when-frame *)\nand make_when_frame body_exprs env =\n (CekFrame { cf_type = \"when\"; cf_env = env; cf_name = Nil; cf_body = body_exprs; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-begin-frame *)\nand make_begin_frame remaining env =\n (CekFrame { cf_type = \"begin\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-let-frame *)\nand make_let_frame name remaining body local =\n (CekFrame { cf_type = \"let\"; cf_env = local; cf_name = name; cf_body = body; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-define-frame *)\nand make_define_frame name env has_effects effect_list =\n (CekFrame { cf_type = \"define\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = has_effects; cf_extra2 = effect_list })\n\n(* make-set-frame *)\nand make_set_frame name env =\n (CekFrame { cf_type = \"set\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-arg-frame *)\nand make_arg_frame f evaled remaining env raw_args head_name =\n (CekFrame { cf_type = \"arg\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = evaled; cf_results = raw_args; cf_extra = (let _or = head_name in if sx_truthy _or then _or else Nil); cf_extra2 = Nil })\n\n(* make-call-frame *)\nand make_call_frame f args env =\n (CekFrame { cf_type = \"call\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = f; cf_args = args; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-cond-frame *)\nand make_cond_frame remaining env scheme_p =\n (CekFrame { cf_type = \"cond\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = scheme_p; cf_extra2 = Nil })\n\n(* make-case-frame *)\nand make_case_frame match_val remaining env =\n (CekFrame { cf_type = \"case\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = match_val; cf_extra2 = Nil })\n\n(* make-thread-frame *)\nand make_thread_frame remaining env =\n (CekFrame { cf_type = \"thread\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-map-frame *)\nand make_map_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool false); cf_extra2 = Nil })\n\n(* make-map-indexed-frame *)\nand make_map_indexed_frame f remaining results env =\n (CekFrame { cf_type = \"map\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = (Bool true); cf_extra2 = Nil })\n\n(* make-filter-frame *)\nand make_filter_frame f remaining results current_item env =\n (CekFrame { cf_type = \"filter\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = results; cf_extra = current_item; cf_extra2 = Nil })\n\n(* make-reduce-frame *)\nand make_reduce_frame f remaining env =\n (CekFrame { cf_type = \"reduce\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-for-each-frame *)\nand make_for_each_frame f remaining env =\n (CekFrame { cf_type = \"for-each\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-some-frame *)\nand make_some_frame f remaining env =\n (CekFrame { cf_type = \"some\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-every-frame *)\nand make_every_frame f remaining env =\n (CekFrame { cf_type = \"every\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = f; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-scope-frame *)\nand make_scope_frame name remaining env =\n (CekFrame { cf_type = \"scope\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-provide-frame *)\nand make_provide_frame name value remaining env =\n (CekFrame { cf_type = \"provide\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = value; cf_extra2 = Nil })\n\n(* make-scope-acc-frame *)\nand make_scope_acc_frame name value remaining env =\n (CekFrame { cf_type = \"scope-acc\"; cf_env = env; cf_name = name; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = (let _or = value in if sx_truthy _or then _or else Nil); cf_extra2 = (List []) })\n\n(* make-reset-frame *)\nand make_reset_frame env =\n (CekFrame { cf_type = \"reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dict-frame *)\nand make_dict_frame remaining results env =\n (CekFrame { cf_type = \"dict\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = results; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-and-frame *)\nand make_and_frame remaining env =\n (CekFrame { cf_type = \"and\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-or-frame *)\nand make_or_frame remaining env =\n (CekFrame { cf_type = \"or\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-dynamic-wind-frame *)\nand make_dynamic_wind_frame phase body_thunk after_thunk env =\n (CekFrame { cf_type = \"dynamic-wind\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = phase; cf_extra2 = Nil })\n\n(* make-reactive-reset-frame *)\nand make_reactive_reset_frame env update_fn first_render_p =\n (CekFrame { cf_type = \"reactive-reset\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = update_fn; cf_extra2 = first_render_p })\n\n(* make-deref-frame *)\nand make_deref_frame env =\n (CekFrame { cf_type = \"deref\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = Nil; cf_f = Nil; cf_args = Nil; cf_results = Nil; cf_extra = Nil; cf_extra2 = Nil })\n\n(* make-ho-setup-frame *)\nand make_ho_setup_frame ho_type remaining_args evaled_args env =\n (CekFrame { cf_type = \"ho-setup\"; cf_env = env; cf_name = Nil; cf_body = Nil; cf_remaining = remaining_args; cf_f = Nil; cf_args = evaled_args; cf_results = Nil; cf_extra = ho_type; cf_extra2 = Nil })\n\n(* frame-type *)\nand frame_type f =\n (get (f) ((String \"type\")))\n\n(* kont-push *)\nand kont_push frame kont =\n (cons (frame) (kont))\n\n(* kont-top *)\nand kont_top kont =\n (first (kont))\n\n(* kont-pop *)\nand kont_pop kont =\n (rest (kont))\n\n(* kont-empty? *)\nand kont_empty_p kont =\n (empty_p (kont))\n\n(* kont-capture-to-reset *)\nand kont_capture_to_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"shift without enclosing reset\")))) else (let frame = (first (k)) in (if sx_truthy ((let _or = (prim_call \"=\" [(frame_type (frame)); (String \"reset\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")]))) then (List [captured; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* kont-find-provide *)\nand kont_find_provide kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"provide\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_provide ((rest (kont))) (name)))))\n\n(* kont-find-scope-acc *)\nand kont_find_scope_acc kont name =\n (if sx_truthy ((empty_p (kont))) then Nil else (let frame = (first (kont)) in (if sx_truthy ((let _and = (prim_call \"=\" [(frame_type (frame)); (String \"scope-acc\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(get (frame) ((String \"name\"))); name]))) then frame else (kont_find_scope_acc ((rest (kont))) (name)))))\n\n(* has-reactive-reset-frame? *)\nand has_reactive_reset_frame_p kont =\n (if sx_truthy ((empty_p (kont))) then (Bool false) else (if sx_truthy ((prim_call \"=\" [(frame_type ((first (kont)))); (String \"reactive-reset\")])) then (Bool true) else (has_reactive_reset_frame_p ((rest (kont))))))\n\n(* kont-capture-to-reactive-reset *)\nand kont_capture_to_reactive_reset kont =\n (let rec scan = (fun k captured -> (if sx_truthy ((empty_p (k))) then (raise (Eval_error (value_to_str (String \"reactive deref without enclosing reactive-reset\")))) else (let frame = (first (k)) in (if sx_truthy ((prim_call \"=\" [(frame_type (frame)); (String \"reactive-reset\")])) then (List [captured; frame; (rest (k))]) else (scan ((rest (k))) ((prim_call \"append\" [captured; (List [frame])]))))))) in (scan (kont) ((List []))))\n\n(* *custom-special-forms* *)\nand custom_special_forms =\n (Dict (Hashtbl.create 0))\n\n(* register-special-form! *)\nand register_special_form name handler =\n (sx_dict_set_b custom_special_forms name handler)\n\n(* *render-check* *)\nand render_check =\n Nil\n\n(* *render-fn* *)\nand render_fn =\n Nil\n\n(* *strict* *)\nand _strict_ = !_strict_ref\n\n(* set-strict! *)\nand set_strict_b val' =\n _strict_ref := val'; Nil\n\n(* *prim-param-types* *)\nand _prim_param_types_ = !_prim_param_types_ref\n\n(* set-prim-param-types! *)\nand set_prim_param_types_b types =\n _prim_param_types_ref := types; Nil\n\n(* value-matches-type? *)\nand value_matches_type_p val' expected_type =\n (if sx_truthy ((prim_call \"=\" [expected_type; (String \"any\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"number\")])) then (number_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"string\")])) then (string_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"boolean\")])) then (boolean_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"nil\")])) then (is_nil (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"list\")])) then (list_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"dict\")])) then (dict_p (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"lambda\")])) then (is_lambda (val')) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"symbol\")])) then (prim_call \"=\" [(type_of (val')); (String \"symbol\")]) else (if sx_truthy ((prim_call \"=\" [expected_type; (String \"keyword\")])) then (prim_call \"=\" [(type_of (val')); (String \"keyword\")]) else (if sx_truthy ((let _and = (string_p (expected_type)) in if not (sx_truthy _and) then _and else (prim_call \"ends-with?\" [expected_type; (String \"?\")]))) then (let _or = (is_nil (val')) in if sx_truthy _or then _or else (value_matches_type_p (val') ((prim_call \"slice\" [expected_type; (Number 0.0); (prim_call \"-\" [(prim_call \"string-length\" [expected_type]); (Number 1.0)])])))) else (Bool true))))))))))))\n\n(* strict-check-args *)\nand strict_check_args name args =\n (if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else !_prim_param_types_ref)) then (let spec = (get (!_prim_param_types_ref) (name)) in (if sx_truthy (spec) then (let positional = (get (spec) ((String \"positional\"))) in let rest_type = (get (spec) ((String \"rest-type\"))) in (let () = ignore ((if sx_truthy (positional) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let param = (nth (pair) ((Number 1.0))) in let p_name = (first (param)) in let p_type = (nth (param) ((Number 1.0))) in (if sx_truthy ((prim_call \"<\" [idx; (len (args))])) then (let val' = (nth (args) (idx)) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (p_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); p_type; (String \" for param \"); p_name; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [i; p])) (sx_to_list positional)))); Nil) else Nil)) in (if sx_truthy ((let _and = rest_type in if not (sx_truthy _and) then _and else (prim_call \">\" [(len (args)); (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))) then (List.iter (fun pair -> ignore ((let idx = (first (pair)) in let val' = (nth (pair) ((Number 1.0))) in (if sx_truthy ((Bool (not (sx_truthy ((value_matches_type_p (val') (rest_type))))))) then (raise (Eval_error (value_to_str (String (sx_str [(String \"Type error: \"); name; (String \" expected \"); rest_type; (String \" for rest arg \"); idx; (String \", got \"); (type_of (val')); (String \" (\"); (String (sx_str [val'])); (String \")\")]))))) else Nil)))) (sx_to_list (List (List.mapi (fun i v -> let i = Number (float_of_int i) in (List [i; v])) (sx_to_list (prim_call \"slice\" [args; (len ((let _or = positional in if sx_truthy _or then _or else (List []))))]))))); Nil) else Nil))) else Nil)) else Nil)\n\n(* bind_lambda_params — shared helper for call-lambda and CEK dispatch.\n Handles &rest params: binds required params, collects rest into list. *)\nand bind_lambda_params f args local =\n let params = lambda_params f in\n let param_list = match params with List l | ListRef { contents = l } -> l | _ -> [] in\n let args_list = match args with List l | ListRef { contents = l } -> l | _ -> [] in\n let rest_idx = ref (-1) in\n List.iteri (fun i p -> match p with Symbol \"&rest\" | String \"&rest\" -> rest_idx := i | _ -> ()) param_list;\n if !rest_idx >= 0 then begin\n let required = List.filteri (fun i _ -> i < !rest_idx) param_list in\n let rest_name = (match List.nth_opt param_list (!rest_idx + 1) with\n | Some (Symbol s | String s) -> s | _ -> \"rest\") in\n List.iteri (fun i p ->\n let name = sx_to_string p in\n let v = match List.nth_opt args_list i with Some v -> v | None -> Nil in\n ignore (env_bind local name v)) required;\n let rest_vals = if !rest_idx <= List.length args_list\n then List (List.filteri (fun i _ -> i >= !rest_idx) args_list) else List [] in\n ignore (env_bind local (String rest_name) rest_vals)\n end else begin\n if sx_truthy (prim_call \">\" [len args; len params]) then\n raise (Eval_error (value_to_str (String (sx_str [\n (let _or = lambda_name f in if sx_truthy _or then _or else String \"lambda\");\n String \" expects \"; len params; String \" args, got \"; len args]))));\n ignore (List.iter (fun pair ->\n ignore (env_bind local (sx_to_string (first pair)) (nth pair (Number 1.0))))\n (sx_to_list (prim_call \"zip\" [params; args])));\n ignore (List.iter (fun p ->\n ignore (env_bind local (sx_to_string p) Nil))\n (sx_to_list (prim_call \"slice\" [params; len args])))\n end\n\n(* call-lambda — uses shared bind_lambda_params for &rest support *)\nand call_lambda f args caller_env =\n let local = env_merge (lambda_closure f) caller_env in\n bind_lambda_params f args local;\n make_thunk (lambda_body f) local\n\n(* call-component *)\nand call_component comp raw_args env =\n (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (comp))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (comp))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (comp))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_thunk ((component_body (comp))) (local)))))\n\n(* parse-keyword-args *)\nand parse_keyword_args raw_args env =\n (let kwargs = (Dict (Hashtbl.create 0)) in let children = ref ((List [])) in let i = (Number 0.0) in (let () = ignore ((List.fold_left (fun state arg -> (let idx = (get (state) ((String \"i\"))) in let skip = (get (state) ((String \"skip\"))) in (if sx_truthy (skip) then (prim_call \"assoc\" [state; (String \"skip\"); (Bool false); (String \"i\"); (prim_call \"inc\" [idx])]) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (arg)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"inc\" [idx]); (len (raw_args))]))) then (let () = ignore ((sx_dict_set_b kwargs (keyword_name (arg)) (trampoline ((eval_expr ((nth (raw_args) ((prim_call \"inc\" [idx])))) (env)))))) in (prim_call \"assoc\" [state; (String \"skip\"); (Bool true); (String \"i\"); (prim_call \"inc\" [idx])])) else (let () = ignore ((children := sx_append_b !children (trampoline ((eval_expr (arg) (env)))); Nil)) in (prim_call \"assoc\" [state; (String \"i\"); (prim_call \"inc\" [idx])])))))) (let _d = Hashtbl.create 2 in Hashtbl.replace _d (value_to_str (String \"i\")) (Number 0.0); Hashtbl.replace _d (value_to_str (String \"skip\")) (Bool false); Dict _d) (sx_to_list raw_args))) in (List [kwargs; !children])))\n\n(* cond-scheme? *)\nand cond_scheme_p clauses =\n (Bool (List.for_all (fun c -> sx_truthy ((let _and = (prim_call \"=\" [(type_of (c)); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len (c)); (Number 2.0)])))) (sx_to_list clauses)))\n\n(* is-else-clause? *)\nand is_else_clause test =\n (let _or = (let _and = (prim_call \"=\" [(type_of (test)); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name (test)); (String \"else\")])) in if sx_truthy _or then _or else (let _and = (prim_call \"=\" [(type_of (test)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _or = (prim_call \"=\" [(symbol_name (test)); (String \"else\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(symbol_name (test)); (String \":else\")]))))\n\n(* sf-named-let *)\nand sf_named_let args env =\n (let loop_name = (symbol_name ((first (args)))) in let bindings = (nth (args) ((Number 1.0))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in let params = ref ((List [])) in let inits = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))); Nil)) in (inits := sx_append_b !inits (nth (binding) ((Number 1.0))); Nil)))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))); Nil)) in (inits := sx_append_b !inits (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))); Nil))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let loop_body = (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (first (body)) else (cons ((make_symbol ((String \"begin\")))) (body))) in let loop_fn = (make_lambda (!params) (loop_body) (env)) in (let () = ignore ((set_lambda_name loop_fn (sx_to_string loop_name))) in (let () = ignore ((env_bind (lambda_closure (loop_fn)) (sx_to_string loop_name) loop_fn)) in (let init_vals = (List (List.map (fun e -> (trampoline ((eval_expr (e) (env))))) (sx_to_list !inits))) in (call_lambda (loop_fn) (init_vals) (env))))))))\n\n(* sf-lambda *)\nand sf_lambda args env =\n (let params_expr = (first (args)) in let body_exprs = (rest (args)) in let body = (if sx_truthy ((prim_call \"=\" [(len (body_exprs)); (Number 1.0)])) then (first (body_exprs)) else (cons ((make_symbol ((String \"begin\")))) (body_exprs))) in let param_names = (List (List.map (fun p -> (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")]))))) then (symbol_name ((first (p)))) else p))) (sx_to_list params_expr))) in (make_lambda (param_names) (body) (env)))\n\n(* sf-defcomp *)\nand sf_defcomp args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (last (args)) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in let param_types = (nth (parsed) ((Number 2.0))) in let affinity = (defcomp_kwarg (args) ((String \"affinity\")) ((String \"auto\"))) in (let comp = (make_component (comp_name) (params) (has_children) (body) (env) (affinity)) in let effects = (defcomp_kwarg (args) ((String \"effects\")) (Nil)) in (let () = ignore ((if sx_truthy ((let _and = (Bool (not (sx_truthy ((is_nil (param_types)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((empty_p ((prim_call \"keys\" [param_types]))))))))) then (component_set_param_types_b (comp) (param_types)) else Nil)) in (let () = ignore ((if sx_truthy ((Bool (not (sx_truthy ((is_nil (effects))))))) then (let effect_list = (if sx_truthy ((prim_call \"=\" [(type_of (effects)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effects))) else (List [(String (sx_str [effects]))])) in let effect_anns = (if sx_truthy ((env_has (env) ((String \"*effect-annotations*\")))) then (env_get (env) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns (symbol_name (name_sym)) effect_list)) in (env_bind env (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) comp)) in comp)))))\n\n(* defcomp-kwarg *)\nand defcomp_kwarg args key default =\n (let end' = (prim_call \"-\" [(len (args)); (Number 1.0)]) in let result' = ref (default) in (let () = ignore ((List.iter (fun i -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((nth (args) (i)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(keyword_name ((nth (args) (i)))); key]) in if not (sx_truthy _and) then _and else (prim_call \"<\" [(prim_call \"+\" [i; (Number 1.0)]); end'])))) then (let val' = (nth (args) ((prim_call \"+\" [i; (Number 1.0)]))) in (result' := (if sx_truthy ((prim_call \"=\" [(type_of (val')); (String \"keyword\")])) then (keyword_name (val')) else val'); Nil)) else Nil))) (sx_to_list (prim_call \"range\" [(Number 2.0); end'; (Number 1.0)])); Nil)) in !result'))\n\n(* parse-comp-params *)\nand parse_comp_params params_expr =\n (let params = ref ((List [])) in let param_types = (Dict (Hashtbl.create 0)) in let has_children = ref ((Bool false)) in let in_key = ref ((Bool false)) in (let () = ignore ((List.iter (fun p -> ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (p)); (Number 3.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (p)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (p) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (p) ((Number 1.0))))); (String \"as\")])))))) then (let name = (symbol_name ((first (p)))) in let ptype = (nth (p) ((Number 2.0))) in (let type_val = (if sx_truthy ((prim_call \"=\" [(type_of (ptype)); (String \"symbol\")])) then (symbol_name (ptype)) else ptype) in (if sx_truthy ((Bool (not (sx_truthy (!has_children))))) then (let () = ignore ((params := sx_append_b !params name; Nil)) in (sx_dict_set_b param_types name type_val)) else Nil))) else (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (let name = (symbol_name (p)) in (if sx_truthy ((prim_call \"=\" [name; (String \"&key\")])) then (in_key := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&rest\")])) then (has_children := (Bool true); Nil) else (if sx_truthy ((prim_call \"=\" [name; (String \"&children\")])) then (has_children := (Bool true); Nil) else (if sx_truthy (!has_children) then Nil else (if sx_truthy (!in_key) then (params := sx_append_b !params name; Nil) else (params := sx_append_b !params name; Nil))))))) else Nil)))) (sx_to_list params_expr); Nil)) in (List [!params; !has_children; param_types])))\n\n(* sf-defisland — multi-expression bodies wrapped in (begin ...) *)\nand sf_defisland args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body_exprs = (slice (args) ((Number 2.0))) in let body = (if sx_truthy ((prim_call \"=\" [(len (body_exprs)); (Number 1.0)])) then (first (body_exprs)) else (prim_call \"cons\" [(make_symbol ((String \"begin\"))); body_exprs])) in let comp_name = (strip_prefix ((symbol_name (name_sym))) ((String \"~\"))) in let parsed = (parse_comp_params (params_raw)) in let params = (first (parsed)) in let has_children = (nth (parsed) ((Number 1.0))) in (let island = (make_island (comp_name) (params) (has_children) (body) (env)) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) island)) in island)))\n\n(* sf-defmacro *)\nand sf_defmacro args env =\n (let name_sym = (first (args)) in let params_raw = (nth (args) ((Number 1.0))) in let body = (nth (args) ((Number 2.0))) in let parsed = (parse_macro_params (params_raw)) in let params = (first (parsed)) in let rest_param = (nth (parsed) ((Number 1.0))) in (let mac = (make_macro (params) (rest_param) (body) (env) ((symbol_name (name_sym)))) in (let () = ignore ((env_bind env (sx_to_string (symbol_name (name_sym))) mac)) in mac)))\n\n(* parse-macro-params *)\nand parse_macro_params params_expr =\n (let params = ref ((List [])) in let rest_param = ref (Nil) in (let () = ignore ((List.fold_left (fun state p -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (p)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (p)); (String \"&rest\")]))) then (prim_call \"assoc\" [state; (String \"in-rest\"); (Bool true)]) else (if sx_truthy ((get (state) ((String \"in-rest\")))) then (let () = ignore ((rest_param := (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state) else (let () = ignore ((params := sx_append_b !params (if sx_truthy ((prim_call \"=\" [(type_of (p)); (String \"symbol\")])) then (symbol_name (p)) else p); Nil)) in state)))) (let _d = Hashtbl.create 1 in Hashtbl.replace _d (value_to_str (String \"in-rest\")) (Bool false); Dict _d) (sx_to_list params_expr))) in (List [!params; !rest_param])))\n\n(* qq-expand *)\nand qq_expand template env =\n (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"=\" [(type_of (template)); (String \"list\")])))))) then template else (if sx_truthy ((empty_p (template))) then (List []) else (let head = (first (template)) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name (head)); (String \"unquote\")]))) then (trampoline ((eval_expr ((nth (template) ((Number 1.0)))) (env)))) else (List.fold_left (fun result' item -> (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (item)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(len (item)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (item)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(symbol_name ((first (item)))); (String \"splice-unquote\")]))))) then (let spliced = (trampoline ((eval_expr ((nth (item) ((Number 1.0)))) (env)))) in (if sx_truthy ((prim_call \"=\" [(type_of (spliced)); (String \"list\")])) then (prim_call \"concat\" [result'; spliced]) else (if sx_truthy ((is_nil (spliced))) then result' else (prim_call \"concat\" [result'; (List [spliced])])))) else (prim_call \"concat\" [result'; (List [(qq_expand (item) (env))])]))) (List []) (sx_to_list template))))))\n\n(* sf-letrec *)\nand sf_letrec args env =\n (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in let names = ref ((List [])) in let val_exprs = ref ((List [])) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (List.iter (fun binding -> ignore ((let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (binding)))); (String \"symbol\")])) then (symbol_name ((first (binding)))) else (first (binding))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs (nth (binding) ((Number 1.0))); Nil)) in (env_bind local (sx_to_string vname) Nil)))))) (sx_to_list bindings); Nil) else (List.fold_left (fun _acc pair_idx -> (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))); (String \"symbol\")])) then (symbol_name ((nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)]))))) else (nth (bindings) ((prim_call \"*\" [pair_idx; (Number 2.0)])))) in let val_expr = (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [pair_idx; (Number 2.0)])]))) in (let () = ignore ((names := sx_append_b !names vname; Nil)) in (let () = ignore ((val_exprs := sx_append_b !val_exprs val_expr; Nil)) in (env_bind local (sx_to_string vname) Nil))))) Nil (sx_to_list (prim_call \"range\" [(Number 0.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])]))))) in (let () = ignore ((let values = (List (List.map (fun e -> (trampoline ((eval_expr (e) (local))))) (sx_to_list !val_exprs))) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (nth (pair) ((Number 1.0)))))) (sx_to_list (prim_call \"zip\" [!names; values])); Nil)) in (List.iter (fun val' -> ignore ((if sx_truthy ((is_lambda (val'))) then (List.iter (fun n -> ignore ((env_bind (lambda_closure (val')) (sx_to_string n) (env_get (local) (n))))) (sx_to_list !names); Nil) else Nil))) (sx_to_list values); Nil)))) in (let () = ignore ((List.iter (fun e -> ignore ((trampoline ((eval_expr (e) (local)))))) (sx_to_list (prim_call \"slice\" [body; (Number 0.0); (prim_call \"dec\" [(len (body))])])); Nil)) in (make_thunk ((last (body))) (local))))))\n\n(* step-sf-letrec *)\nand step_sf_letrec args env kont =\n (let thk = (sf_letrec (args) (env)) in (make_cek_state ((thunk_expr (thk))) ((thunk_env (thk))) (kont)))\n\n(* sf-dynamic-wind *)\nand sf_dynamic_wind args env =\n (let before = (trampoline ((eval_expr ((first (args))) (env)))) in let body = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let after = (trampoline ((eval_expr ((nth (args) ((Number 2.0)))) (env)))) in (dynamic_wind_call (before) (body) (after) (env)))\n\n(* sf-scope *)\nand sf_scope args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body_exprs = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest) ((Number 1.0)))) (env)))); Nil)) in (body_exprs := (prim_call \"slice\" [rest; (Number 2.0)]); Nil)) else (body_exprs := rest; Nil))) in (let () = ignore ((scope_push (name) (!val'))) in (let result' = ref (Nil) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list !body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))))\n\n(* sf-provide *)\nand sf_provide args env =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body_exprs = (prim_call \"slice\" [args; (Number 2.0)]) in let result' = ref (Nil) in (let () = ignore ((scope_push (name) (val'))) in (let () = ignore ((List.iter (fun e -> ignore ((result' := (trampoline ((eval_expr (e) (env)))); Nil))) (sx_to_list body_exprs); Nil)) in (let () = ignore ((scope_pop (name))) in !result'))))\n\n(* expand-macro *)\nand expand_macro mac raw_args env =\n (let local = (env_merge ((macro_closure (mac))) (env)) in (let () = ignore ((List.iter (fun pair -> ignore ((env_bind local (sx_to_string (first (pair))) (if sx_truthy ((prim_call \"<\" [(nth (pair) ((Number 1.0))); (len (raw_args))])) then (nth (raw_args) ((nth (pair) ((Number 1.0))))) else Nil)))) (sx_to_list (List (List.mapi (fun i p -> let i = Number (float_of_int i) in (List [p; i])) (sx_to_list (macro_params (mac)))))); Nil)) in (let () = ignore ((if sx_truthy ((macro_rest_param (mac))) then (env_bind local (sx_to_string (macro_rest_param (mac))) (prim_call \"slice\" [raw_args; (len ((macro_params (mac))))])) else Nil)) in (trampoline ((eval_expr ((macro_body (mac))) (local)))))))\n\n(* cek-run — iterative to avoid OCaml stack overflow in js_of_ocaml/WASM *)\nand cek_run state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n(* cek-step *)\nand cek_step state =\n (if sx_truthy ((prim_call \"=\" [(cek_phase (state)); (String \"eval\")])) then (step_eval (state)) else (step_continue (state)))\n\n(* step-eval *)\nand step_eval state =\n (let expr = (cek_control (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (let _match_val = (type_of (expr)) in (if _match_val = (String \"number\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"string\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"boolean\") then (make_cek_value (expr) (env) (kont)) else (if _match_val = (String \"nil\") then (make_cek_value (Nil) (env) (kont)) else (if _match_val = (String \"symbol\") then (let name = (symbol_name (expr)) in (let val' = (if sx_truthy ((env_has (env) (name))) then (env_get (env) (name)) else (if sx_truthy ((is_primitive (name))) then (get_primitive (name)) else (if sx_truthy ((prim_call \"=\" [name; (String \"true\")])) then (Bool true) else (if sx_truthy ((prim_call \"=\" [name; (String \"false\")])) then (Bool false) else (if sx_truthy ((prim_call \"=\" [name; (String \"nil\")])) then Nil else (raise (Eval_error (value_to_str (String (sx_str [(String \"Undefined symbol: \"); name])))))))))) in (let () = ignore ((if sx_truthy ((let _and = (is_nil (val')) in if not (sx_truthy _and) then _and else (prim_call \"starts-with?\" [name; (String \"~\")]))) then (debug_log ((String \"Component not found:\")) (name)) else Nil)) in (make_cek_value (val') (env) (kont))))) else (if _match_val = (String \"keyword\") then (make_cek_value ((keyword_name (expr))) (env) (kont)) else (if _match_val = (String \"dict\") then (let ks = (prim_call \"keys\" [expr]) in (if sx_truthy ((empty_p (ks))) then (make_cek_value ((Dict (Hashtbl.create 0))) (env) (kont)) else (let first_key = (first (ks)) in let remaining_entries = ref ((List [])) in (let () = ignore ((List.iter (fun k -> ignore ((remaining_entries := sx_append_b !remaining_entries (List [k; (get (expr) (k))]); Nil))) (sx_to_list (rest (ks))); Nil)) in (make_cek_state ((get (expr) (first_key))) (env) ((kont_push ((make_dict_frame (!remaining_entries) ((List [(List [first_key])])) (env))) (kont)))))))) else (if _match_val = (String \"list\") then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (step_eval_list (expr) (env) (kont))) else (make_cek_value (expr) (env) (kont))))))))))))\n\n(* step-eval-list *)\nand step_eval_list expr env kont =\n (let head = (first (expr)) in let args = (rest (expr)) in (if sx_truthy ((Bool (not (sx_truthy ((let _or = (prim_call \"=\" [(type_of (head)); (String \"symbol\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [(type_of (head)); (String \"lambda\")]) in if sx_truthy _or then _or else (prim_call \"=\" [(type_of (head)); (String \"list\")])))))))) then (if sx_truthy ((empty_p (expr))) then (make_cek_value ((List [])) (env) (kont)) else (make_cek_state ((first (expr))) (env) ((kont_push ((make_map_frame (Nil) ((rest (expr))) ((List [])) (env))) (kont))))) else (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (let name = (symbol_name (head)) in (if sx_truthy ((prim_call \"=\" [name; (String \"if\")])) then (step_sf_if (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"when\")])) then (step_sf_when (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"cond\")])) then (step_sf_cond (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"case\")])) then (step_sf_case (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"and\")])) then (step_sf_and (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"or\")])) then (step_sf_or (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"let*\")])) then (step_sf_let (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"lambda\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"fn\")])) then (step_sf_lambda (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"define\")])) then (step_sf_define (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defcomp\")])) then (make_cek_value ((sf_defcomp (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defisland\")])) then (make_cek_value ((sf_defisland (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"defmacro\")])) then (make_cek_value ((sf_defmacro (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"begin\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"do\")])) then (step_sf_begin (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quote\")])) then (make_cek_value ((if sx_truthy ((empty_p (args))) then Nil else (first (args)))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"quasiquote\")])) then (make_cek_value ((qq_expand ((first (args))) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"->\")])) then (step_sf_thread_first (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"set!\")])) then (step_sf_set_b (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"letrec\")])) then (step_sf_letrec (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reset\")])) then (step_sf_reset (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"shift\")])) then (step_sf_shift (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"deref\")])) then (step_sf_deref (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"scope\")])) then (step_sf_scope (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"provide\")])) then (step_sf_provide (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"context\")])) then (step_sf_context (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emit!\")])) then (step_sf_emit (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"emitted\")])) then (step_sf_emitted (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"dynamic-wind\")])) then (make_cek_value ((sf_dynamic_wind (args) (env))) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map\")])) then (step_ho_map (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"map-indexed\")])) then (step_ho_map_indexed (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"filter\")])) then (step_ho_filter (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"reduce\")])) then (step_ho_reduce (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"some\")])) then (step_ho_some (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"every?\")])) then (step_ho_every (args) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [name; (String \"for-each\")])) then (step_ho_for_each (args) (env) (kont)) else (if sx_truthy ((prim_call \"has-key?\" [custom_special_forms; name])) then (make_cek_value ((cek_call ((get (custom_special_forms) (name))) (List [args; env]))) (env) (kont)) else (if sx_truthy ((let _and = (env_has (env) (name)) in if not (sx_truthy _and) then _and else (is_macro ((env_get (env) (name)))))) then (let mac = (env_get (env) (name)) in (make_cek_state ((expand_macro (mac) (args) (env))) (env) (kont))) else (if sx_truthy ((let _and = render_check in if not (sx_truthy _and) then _and else (cek_call (render_check) (List [expr; env])))) then (make_cek_value ((cek_call (render_fn) (List [expr; env]))) (env) (kont)) else (step_eval_call (head) (args) (env) (kont))))))))))))))))))))))))))))))))))))))))))) else (step_eval_call (head) (args) (env) (kont)))))\n\n(* step-sf-if *)\nand step_sf_if args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_if_frame ((nth (args) ((Number 1.0)))) ((if sx_truthy ((prim_call \">\" [(len (args)); (Number 2.0)])) then (nth (args) ((Number 2.0))) else Nil)) (env))) (kont))))\n\n(* step-sf-when *)\nand step_sf_when args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_when_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-begin *)\nand step_sf_begin args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (if sx_truthy ((prim_call \"=\" [(len (args)); (Number 1.0)])) then (make_cek_state ((first (args))) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_begin_frame ((rest (args))) (env))) (kont))))))\n\n(* step-sf-let *)\nand step_sf_let args env kont =\n let pairs = ref Nil in (if sx_truthy ((prim_call \"=\" [(type_of ((first (args)))); (String \"symbol\")])) then (make_cek_value ((trampoline ((sf_named_let (args) (env))))) (env) (kont)) else (let bindings = (first (args)) in let body = (rest (args)) in let local = (env_extend (env)) in (if sx_truthy ((empty_p (bindings))) then (step_sf_begin (body) (local) (kont)) else (let first_binding = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (first (bindings)) else (List [(first (bindings)); (nth (bindings) ((Number 1.0)))])) in let rest_bindings = (if sx_truthy ((let _and = (prim_call \"=\" [(type_of ((first (bindings)))); (String \"list\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(len ((first (bindings)))); (Number 2.0)]))) then (rest (bindings)) else (let pairs = ref ((List [])) in (let () = ignore ((List.fold_left (fun _acc i -> (pairs := sx_append_b !pairs (List [(nth (bindings) ((prim_call \"*\" [i; (Number 2.0)]))); (nth (bindings) ((prim_call \"inc\" [(prim_call \"*\" [i; (Number 2.0)])])))]); Nil)) Nil (sx_to_list (prim_call \"range\" [(Number 1.0); (prim_call \"/\" [(len (bindings)); (Number 2.0)])])))) in !pairs))) in (let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (first_binding)))); (String \"symbol\")])) then (symbol_name ((first (first_binding)))) else (first (first_binding))) in (make_cek_state ((nth (first_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) (rest_bindings) (body) (local))) (kont)))))))))\n\n(* step-sf-define *)\nand step_sf_define args env kont =\n (let name_sym = (first (args)) in let has_effects = (let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")]))) in let val_idx = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (Number 3.0) else (Number 1.0)) in let effect_list = (if sx_truthy ((let _and = (prim_call \">=\" [(len (args)); (Number 4.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((nth (args) ((Number 1.0))))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((nth (args) ((Number 1.0))))); (String \"effects\")])))) then (nth (args) ((Number 2.0))) else Nil) in (make_cek_state ((nth (args) (val_idx))) (env) ((kont_push ((make_define_frame ((symbol_name (name_sym))) (env) (has_effects) (effect_list))) (kont)))))\n\n(* step-sf-set! *)\nand step_sf_set_b args env kont =\n (make_cek_state ((nth (args) ((Number 1.0)))) (env) ((kont_push ((make_set_frame ((symbol_name ((first (args))))) (env))) (kont))))\n\n(* step-sf-and *)\nand step_sf_and args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool true)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_and_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-or *)\nand step_sf_or args env kont =\n (if sx_truthy ((empty_p (args))) then (make_cek_value ((Bool false)) (env) (kont)) else (make_cek_state ((first (args))) (env) ((kont_push ((make_or_frame ((rest (args))) (env))) (kont)))))\n\n(* step-sf-cond *)\nand step_sf_cond args env kont =\n (let scheme_p = (cond_scheme_p (args)) in (if sx_truthy (scheme_p) then (if sx_truthy ((empty_p (args))) then (make_cek_value (Nil) (env) (kont)) else (let clause = (first (args)) in let test = (first (clause)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (clause) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool true)))) (kont))))))) else (if sx_truthy ((prim_call \"<\" [(len (args)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (args)) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state ((nth (args) ((Number 1.0)))) (env) (kont)) else (make_cek_state (test) (env) ((kont_push ((make_cond_frame (args) (env) ((Bool false)))) (kont)))))))))\n\n(* step-sf-case *)\nand step_sf_case args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_case_frame (Nil) ((rest (args))) (env))) (kont))))\n\n(* step-sf-thread-first *)\nand step_sf_thread_first args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_thread_frame ((rest (args))) (env))) (kont))))\n\n(* step-sf-lambda *)\nand step_sf_lambda args env kont =\n (make_cek_value ((sf_lambda (args) (env))) (env) (kont))\n\n(* step-sf-scope *)\nand step_sf_scope args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let rest_args = (prim_call \"slice\" [args; (Number 1.0)]) in let val' = ref (Nil) in let body = ref (Nil) in (let () = ignore ((if sx_truthy ((let _and = (prim_call \">=\" [(len (rest_args)); (Number 2.0)]) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (rest_args)))); (String \"keyword\")]) in if not (sx_truthy _and) then _and else (prim_call \"=\" [(keyword_name ((first (rest_args)))); (String \"value\")])))) then (let () = ignore ((val' := (trampoline ((eval_expr ((nth (rest_args) ((Number 1.0)))) (env)))); Nil)) in (body := (prim_call \"slice\" [rest_args; (Number 2.0)]); Nil)) else (body := rest_args; Nil))) in (if sx_truthy ((empty_p (!body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (!body))) (env) ((kont_push ((make_scope_acc_frame (name) (!val') ((rest (!body))) (env))) (kont)))))))\n\n(* step-sf-provide *)\nand step_sf_provide args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let body = (prim_call \"slice\" [args; (Number 2.0)]) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (env) (kont)) else (make_cek_state ((first (body))) (env) ((kont_push ((make_provide_frame (name) (val') ((rest (body))) (env))) (kont))))))\n\n(* step-sf-context *)\nand step_sf_context args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let default_val = (if sx_truthy ((prim_call \">=\" [(len (args)); (Number 2.0)])) then (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) else Nil) in let frame = (kont_find_provide (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then default_val else (get (frame) ((String \"value\"))))) (env) (kont)))\n\n(* step-sf-emit *)\nand step_sf_emit args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let val' = (trampoline ((eval_expr ((nth (args) ((Number 1.0)))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (let () = ignore ((if sx_truthy (frame) then (sx_dict_set_b frame (String \"emitted\") (prim_call \"append\" [(get (frame) ((String \"emitted\"))); (List [val'])])) else Nil)) in (make_cek_value (Nil) (env) (kont))))\n\n(* step-sf-emitted *)\nand step_sf_emitted args env kont =\n (let name = (trampoline ((eval_expr ((first (args))) (env)))) in let frame = (kont_find_scope_acc (kont) (name)) in (make_cek_value ((if sx_truthy ((is_nil (frame))) then (List []) else (get (frame) ((String \"emitted\"))))) (env) (kont)))\n\n(* step-sf-reset *)\nand step_sf_reset args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_reset_frame (env))) (kont))))\n\n(* step-sf-shift *)\nand step_sf_shift args env kont =\n (let k_name = (symbol_name ((first (args)))) in let body = (nth (args) ((Number 1.0))) in let captured_result = (kont_capture_to_reset (kont)) in let captured = (first (captured_result)) in let rest_kont = (nth (captured_result) ((Number 1.0))) in (let k = (make_cek_continuation (captured) (rest_kont)) in (let shift_env = (env_extend (env)) in (let () = ignore ((env_bind shift_env (sx_to_string k_name) k)) in (make_cek_state (body) (shift_env) (rest_kont))))))\n\n(* step-sf-deref *)\nand step_sf_deref args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_deref_frame (env))) (kont))))\n\n(* cek-call *)\nand cek_call f args =\n (let a = (if sx_truthy ((is_nil (args))) then (List []) else args) in (if sx_truthy ((is_nil (f))) then Nil else (if sx_truthy ((let _or = (is_lambda (f)) in if sx_truthy _or then _or else (is_callable (f)))) then (cek_run ((continue_with_call (f) (a) ((make_env ())) (a) ((List []))))) else Nil)))\n\n(* reactive-shift-deref *)\nand reactive_shift_deref sig' env kont =\n (let scan_result = (kont_capture_to_reactive_reset (kont)) in let captured_frames = (first (scan_result)) in let reset_frame = (nth (scan_result) ((Number 1.0))) in let remaining_kont = (nth (scan_result) ((Number 2.0))) in let update_fn = (get (reset_frame) ((String \"update-fn\"))) in (let sub_disposers = ref ((List [])) in (let subscriber = (NativeFn (\"\\206\\187\", fun _args -> (fun () -> let sub_disposers = ref Nil in (let () = ignore ((List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil)) in (let () = ignore ((sub_disposers := (List []); Nil)) in (let new_reset = (make_reactive_reset_frame (env) (update_fn) ((Bool false))) in let new_kont = (prim_call \"concat\" [captured_frames; (List [new_reset]); remaining_kont]) in (with_island_scope ((NativeFn (\"\\206\\187\", fun _args -> match _args with [d] -> (fun d -> let sub_disposers = ref Nil in (sub_disposers := sx_append_b !sub_disposers d; Nil)) d | _ -> Nil))) ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (cek_run ((make_cek_value ((signal_value (sig'))) (env) (new_kont))))) ())))))))) ())) in (let () = ignore ((signal_add_sub_b (sig') (subscriber))) in (let () = ignore ((register_in_scope ((NativeFn (\"\\206\\187\", fun _args -> (fun () -> (let () = ignore ((signal_remove_sub_b (sig') (subscriber))) in (List.iter (fun d -> ignore ((cek_call (d) (Nil)))) (sx_to_list !sub_disposers); Nil))) ()))))) in (let initial_kont = (prim_call \"concat\" [captured_frames; (List [reset_frame]); remaining_kont]) in (make_cek_value ((signal_value (sig'))) (env) (initial_kont))))))))\n\n(* step-eval-call *)\nand step_eval_call head args env kont =\n (let hname = (if sx_truthy ((prim_call \"=\" [(type_of (head)); (String \"symbol\")])) then (symbol_name (head)) else Nil) in (make_cek_state (head) (env) ((kont_push ((make_arg_frame (Nil) ((List [])) (args) (env) (args) (hname))) (kont)))))\n\n(* ho-form-name? *)\nand ho_form_name_p name =\n (let _or = (prim_call \"=\" [name; (String \"map\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"map-indexed\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"filter\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"reduce\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"some\")]) in if sx_truthy _or then _or else (let _or = (prim_call \"=\" [name; (String \"every?\")]) in if sx_truthy _or then _or else (prim_call \"=\" [name; (String \"for-each\")])))))))\n\n(* ho-fn? *)\nand ho_fn_p v =\n (let _or = (is_callable (v)) in if sx_truthy _or then _or else (is_lambda (v)))\n\n(* ho-swap-args *)\nand ho_swap_args ho_type evaled =\n (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; (nth (evaled) ((Number 2.0))); a]) else evaled)) else (let a = (first (evaled)) in let b = (nth (evaled) ((Number 1.0))) in (if sx_truthy ((let _and = (Bool (not (sx_truthy ((ho_fn_p (a)))))) in if not (sx_truthy _and) then _and else (ho_fn_p (b)))) then (List [b; a]) else evaled)))\n\n(* ho-setup-dispatch *)\nand ho_setup_dispatch ho_type evaled env kont =\n (let ordered = (ho_swap_args (ho_type) (evaled)) in (let f = (first (ordered)) in (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_map_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"map-indexed\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(Number 0.0); (first (coll))])) (env) ((List [])) ((kont_push ((make_map_indexed_frame (f) ((rest (coll))) ((List [])) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"filter\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((List [])) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (coll))) ((List [])) ((first (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"reduce\")])) then (let init = (nth (ordered) ((Number 1.0))) in let coll = (nth (ordered) ((Number 2.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (init) (env) (kont)) else (continue_with_call (f) ((List [init; (first (coll))])) (env) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"some\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool false)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_some_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"every\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value ((Bool true)) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_every_frame (f) ((rest (coll))) (env))) (kont)))))) else (if sx_truthy ((prim_call \"=\" [ho_type; (String \"for-each\")])) then (let coll = (nth (ordered) ((Number 1.0))) in (if sx_truthy ((empty_p (coll))) then (make_cek_value (Nil) (env) (kont)) else (continue_with_call (f) ((List [(first (coll))])) (env) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (coll))) (env))) (kont)))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown HO type: \"); ho_type]))))))))))))))\n\n(* step-ho-map *)\nand step_ho_map args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-map-indexed *)\nand step_ho_map_indexed args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"map-indexed\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-filter *)\nand step_ho_filter args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"filter\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-reduce *)\nand step_ho_reduce args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"reduce\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-some *)\nand step_ho_some args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"some\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-every *)\nand step_ho_every args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"every\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-ho-for-each *)\nand step_ho_for_each args env kont =\n (make_cek_state ((first (args))) (env) ((kont_push ((make_ho_setup_frame ((String \"for-each\")) ((rest (args))) ((List [])) (env))) (kont))))\n\n(* step-continue *)\nand step_continue state =\n (let value = (cek_value (state)) in let env = (cek_env (state)) in let kont = (cek_kont (state)) in (if sx_truthy ((kont_empty_p (kont))) then state else (let frame = (kont_top (kont)) in let rest_k = (kont_pop (kont)) in let ft = (frame_type (frame)) in (if sx_truthy ((prim_call \"=\" [ft; (String \"if\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (make_cek_state ((get (frame) ((String \"then\")))) ((get (frame) ((String \"env\")))) (rest_k)) else (if sx_truthy ((is_nil ((get (frame) ((String \"else\")))))) then (make_cek_value (Nil) (env) (rest_k)) else (make_cek_state ((get (frame) ((String \"else\")))) ((get (frame) ((String \"env\")))) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"when\")])) then (if sx_truthy ((let _and = value in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_nil (value)))))))) then (let body = (get (frame) ((String \"body\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (body))) then (make_cek_value (Nil) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (body)); (Number 1.0)])) then (make_cek_state ((first (body))) (fenv) (rest_k)) else (make_cek_state ((first (body))) (fenv) ((kont_push ((make_begin_frame ((rest (body))) (fenv))) (rest_k))))))) else (make_cek_value (Nil) (env) (rest_k))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"begin\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then (make_cek_state ((first (remaining))) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_begin_frame ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"let\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let body = (get (frame) ((String \"body\"))) in let local = (get (frame) ((String \"env\"))) in (let () = ignore ((env_bind local (sx_to_string name) value)) in (if sx_truthy ((empty_p (remaining))) then (step_sf_begin (body) (local) (rest_k)) else (let next_binding = (first (remaining)) in let vname = (if sx_truthy ((prim_call \"=\" [(type_of ((first (next_binding)))); (String \"symbol\")])) then (symbol_name ((first (next_binding)))) else (first (next_binding))) in (make_cek_state ((nth (next_binding) ((Number 1.0)))) (local) ((kont_push ((make_let_frame (vname) ((rest (remaining))) (body) (local))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"define\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in let has_effects = (get (frame) ((String \"has-effects\"))) in let effect_list = (get (frame) ((String \"effect-list\"))) in (let () = ignore ((if sx_truthy ((let _and = (is_lambda (value)) in if not (sx_truthy _and) then _and else (is_nil ((lambda_name (value)))))) then (set_lambda_name value (sx_to_string name)) else Nil)) in (let () = ignore ((env_bind fenv (sx_to_string name) value)) in (let () = ignore ((if sx_truthy (has_effects) then (let effect_names = (if sx_truthy ((prim_call \"=\" [(type_of (effect_list)); (String \"list\")])) then (List (List.map (fun e -> (if sx_truthy ((prim_call \"=\" [(type_of (e)); (String \"symbol\")])) then (symbol_name (e)) else (String (sx_str [e])))) (sx_to_list effect_list))) else (List [(String (sx_str [effect_list]))])) in let effect_anns = (if sx_truthy ((env_has (fenv) ((String \"*effect-annotations*\")))) then (env_get (fenv) ((String \"*effect-annotations*\"))) else (Dict (Hashtbl.create 0))) in (let () = ignore ((sx_dict_set_b effect_anns name effect_names)) in (env_bind fenv (sx_to_string (String \"*effect-annotations*\")) effect_anns))) else Nil)) in (make_cek_value (value) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"set\")])) then (let name = (get (frame) ((String \"name\"))) in let fenv = (get (frame) ((String \"env\"))) in (let () = ignore ((env_set fenv (sx_to_string name) value)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"and\")])) then (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_and_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"or\")])) then (if sx_truthy (value) then (make_cek_value (value) (env) (rest_k)) else (let remaining = (get (frame) ((String \"remaining\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (env) (rest_k)) else (make_cek_state ((first (remaining))) ((get (frame) ((String \"env\")))) ((if sx_truthy ((prim_call \"=\" [(len (remaining)); (Number 1.0)])) then rest_k else (kont_push ((make_or_frame ((rest (remaining))) ((get (frame) ((String \"env\")))))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"cond\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let scheme_p = (get (frame) ((String \"scheme\"))) in (if sx_truthy (scheme_p) then (if sx_truthy (value) then (make_cek_state ((nth ((first (remaining))) ((Number 1.0)))) (fenv) (rest_k)) else (let next_clauses = (rest (remaining)) in (if sx_truthy ((empty_p (next_clauses))) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_clause = (first (next_clauses)) in let next_test = (first (next_clause)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next_clause) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next_clauses) (fenv) ((Bool true)))) (rest_k))))))))) else (if sx_truthy (value) then (make_cek_state ((nth (remaining) ((Number 1.0)))) (fenv) (rest_k)) else (let next = (prim_call \"slice\" [remaining; (Number 2.0)]) in (if sx_truthy ((prim_call \"<\" [(len (next)); (Number 2.0)])) then (make_cek_value (Nil) (fenv) (rest_k)) else (let next_test = (first (next)) in (if sx_truthy ((is_else_clause (next_test))) then (make_cek_state ((nth (next) ((Number 1.0)))) (fenv) (rest_k)) else (make_cek_state (next_test) (fenv) ((kont_push ((make_cond_frame (next) (fenv) ((Bool false)))) (rest_k))))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"case\")])) then (let match_val = (get (frame) ((String \"match-val\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((is_nil (match_val))) then (sf_case_step_loop (value) (remaining) (fenv) (rest_k)) else (sf_case_step_loop (match_val) (remaining) (fenv) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"thread\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (let form = (first (remaining)) in let rest_forms = (rest (remaining)) in let new_kont = (if sx_truthy ((empty_p ((rest (remaining))))) then rest_k else (kont_push ((make_thread_frame ((rest (remaining))) (fenv))) (rest_k))) in (if sx_truthy ((let _and = (prim_call \"=\" [(type_of (form)); (String \"list\")]) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((empty_p (form)))))) in if not (sx_truthy _and) then _and else (let _and = (prim_call \"=\" [(type_of ((first (form)))); (String \"symbol\")]) in if not (sx_truthy _and) then _and else (ho_form_name_p ((symbol_name ((first (form)))))))))) then (make_cek_state ((cons ((first (form))) ((cons ((List [(Symbol \"quote\"); value])) ((rest (form))))))) (fenv) (new_kont)) else (let result' = (if sx_truthy ((prim_call \"=\" [(type_of (form)); (String \"list\")])) then (let f = (trampoline ((eval_expr ((first (form))) (fenv)))) in let rargs = (List (List.map (fun a -> (trampoline ((eval_expr (a) (fenv))))) (sx_to_list (rest (form))))) in let all_args = (cons (value) (rargs)) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (sx_apply f all_args) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) (all_args) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))])))))))) else (let f = (trampoline ((eval_expr (form) (fenv)))) in (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_lambda (f)))))))) then (cek_call (f) (List [value])) else (if sx_truthy ((is_lambda (f))) then (trampoline ((call_lambda (f) ((List [value])) (fenv)))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"-> form not callable: \"); (inspect (f))]))))))))) in (if sx_truthy ((empty_p (rest_forms))) then (make_cek_value (result') (fenv) (rest_k)) else (make_cek_value (result') (fenv) ((kont_push ((make_thread_frame (rest_forms) (fenv))) (rest_k)))))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"arg\")])) then (let f = (get (frame) ((String \"f\"))) in let evaled = (get (frame) ((String \"evaled\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in let raw_args = (get (frame) ((String \"raw-args\"))) in let hname = (get (frame) ((String \"head-name\"))) in (if sx_truthy ((is_nil (f))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) ((List []))) else Nil)) in (if sx_truthy ((empty_p (remaining))) then (continue_with_call (value) ((List [])) (fenv) (raw_args) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (value) ((List [])) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))) else (let new_evaled = (prim_call \"append\" [evaled; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((if sx_truthy ((let _and = !_strict_ref in if not (sx_truthy _and) then _and else hname)) then (strict_check_args (hname) (new_evaled)) else Nil)) in (continue_with_call (f) (new_evaled) (fenv) (raw_args) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_arg_frame (f) (new_evaled) ((rest (remaining))) (fenv) (raw_args) (hname))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"dict\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let fenv = (get (frame) ((String \"env\"))) in (let last_result = (last (results)) in let completed = (prim_call \"append\" [(prim_call \"slice\" [results; (Number 0.0); (prim_call \"dec\" [(len (results))])]); (List [(List [(first (last_result)); value])])]) in (if sx_truthy ((empty_p (remaining))) then (let d = (Dict (Hashtbl.create 0)) in (let () = ignore ((List.iter (fun pair -> ignore ((sx_dict_set_b d (first (pair)) (nth (pair) ((Number 1.0)))))) (sx_to_list completed); Nil)) in (make_cek_value (d) (fenv) (rest_k)))) else (let next_entry = (first (remaining)) in (make_cek_state ((nth (next_entry) ((Number 1.0)))) (fenv) ((kont_push ((make_dict_frame ((rest (remaining))) ((prim_call \"append\" [completed; (List [(List [(first (next_entry))])])])) (fenv))) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"ho-setup\")])) then (let ho_type = (get (frame) ((String \"ho-type\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let evaled = (prim_call \"append\" [(get (frame) ((String \"evaled\"))); (List [value])]) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (ho_setup_dispatch (ho_type) (evaled) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_ho_setup_frame (ho_type) ((rest (remaining))) (evaled) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reset\")])) then (make_cek_value (value) (env) (rest_k)) else (if sx_truthy ((prim_call \"=\" [ft; (String \"deref\")])) then (let val' = value in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy ((is_signal (val'))))))) then (make_cek_value (val') (fenv) (rest_k)) else (if sx_truthy ((has_reactive_reset_frame_p (rest_k))) then (reactive_shift_deref (val') (fenv) (rest_k)) else (let () = ignore ((let ctx = (sx_context ((String \"sx-reactive\")) (Nil)) in (if sx_truthy (ctx) then (let dep_list = ref ((get (ctx) ((String \"deps\")))) in let notify_fn = (get (ctx) ((String \"notify\"))) in (if sx_truthy ((Bool (not (sx_truthy ((prim_call \"contains?\" [!dep_list; val'])))))) then (let () = ignore ((dep_list := sx_append_b !dep_list val'; Nil)) in (signal_add_sub_b (val') (notify_fn))) else Nil)) else Nil))) in (make_cek_value ((signal_value (val'))) (fenv) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reactive-reset\")])) then (let update_fn = (get (frame) ((String \"update-fn\"))) in let first_p = (get (frame) ((String \"first-render\"))) in (let () = ignore ((if sx_truthy ((let _and = update_fn in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy (first_p)))))) then (cek_call (update_fn) ((List [value]))) else Nil)) in (make_cek_value (value) (env) (rest_k)))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope\")])) then (let name = (get (frame) ((String \"name\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (let () = ignore ((scope_pop (name))) in (make_cek_value (value) (fenv) (rest_k))) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_scope_frame (name) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"provide\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((make_provide_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"scope-acc\")])) then (let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (make_cek_state ((first (remaining))) (fenv) ((kont_push ((let new_frame = (make_scope_acc_frame ((get (frame) ((String \"name\")))) ((get (frame) ((String \"value\")))) ((rest (remaining))) (fenv)) in (let () = ignore ((sx_dict_set_b new_frame (String \"emitted\") (get (frame) ((String \"emitted\"))))) in new_frame))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"map\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let indexed = (get (frame) ((String \"indexed\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (prim_call \"append\" [results; (List [value])]) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (let call_args = (if sx_truthy (indexed) then (List [(len (new_results)); (first (remaining))]) else (List [(first (remaining))])) in let next_frame = (if sx_truthy (indexed) then (make_map_indexed_frame (f) ((rest (remaining))) (new_results) (fenv)) else (make_map_frame (f) ((rest (remaining))) (new_results) (fenv))) in (continue_with_call (f) (call_args) (fenv) ((List [])) ((kont_push (next_frame) (rest_k)))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"filter\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let results = (get (frame) ((String \"results\"))) in let current_item = (get (frame) ((String \"current-item\"))) in let fenv = (get (frame) ((String \"env\"))) in (let new_results = (if sx_truthy (value) then (prim_call \"append\" [results; (List [current_item])]) else results) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (new_results) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_filter_frame (f) ((rest (remaining))) (new_results) ((first (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"reduce\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (value) (fenv) (rest_k)) else (continue_with_call (f) ((List [value; (first (remaining))])) (fenv) ((List [])) ((kont_push ((make_reduce_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"for-each\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((empty_p (remaining))) then (make_cek_value (Nil) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_for_each_frame (f) ((rest (remaining))) (fenv))) (rest_k)))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"some\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy (value) then (make_cek_value (value) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_some_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (if sx_truthy ((prim_call \"=\" [ft; (String \"every\")])) then (let f = (get (frame) ((String \"f\"))) in let remaining = (get (frame) ((String \"remaining\"))) in let fenv = (get (frame) ((String \"env\"))) in (if sx_truthy ((Bool (not (sx_truthy (value))))) then (make_cek_value ((Bool false)) (fenv) (rest_k)) else (if sx_truthy ((empty_p (remaining))) then (make_cek_value ((Bool true)) (fenv) (rest_k)) else (continue_with_call (f) ((List [(first (remaining))])) (fenv) ((List [])) ((kont_push ((make_every_frame (f) ((rest (remaining))) (fenv))) (rest_k))))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Unknown frame type: \"); ft]))))))))))))))))))))))))))))))))))\n\n(* continue-with-call *)\nand continue_with_call f args env raw_args kont =\n (if sx_truthy ((continuation_p (f))) then (let arg = (if sx_truthy ((empty_p (args))) then Nil else (first (args))) in let cont_data = (continuation_data (f)) in (let captured = (get (cont_data) ((String \"captured\"))) in (let result' = (cek_run ((make_cek_value (arg) (env) (captured)))) in (make_cek_value (result') (env) (kont))))) else (if sx_truthy ((let _and = (is_callable (f)) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_lambda (f)))))) in if not (sx_truthy _and) then _and else (let _and = (Bool (not (sx_truthy ((is_component (f)))))) in if not (sx_truthy _and) then _and else (Bool (not (sx_truthy ((is_island (f)))))))))) then (make_cek_value ((sx_apply f args)) (env) (kont)) else (if sx_truthy ((is_lambda (f))) then (let local = (env_merge ((lambda_closure (f))) (env)) in let () = bind_lambda_params f args local in (match !jit_call_hook, f with | Some hook, Lambda l when l.l_name <> None -> let args_list = match args with List a | ListRef { contents = a } -> a | _ -> [] in (match hook f args_list with Some result -> make_cek_value result local kont | None -> make_cek_state (lambda_body f) local kont) | _ -> make_cek_state ((lambda_body (f))) (local) (kont))) else (if sx_truthy ((let _or = (is_component (f)) in if sx_truthy _or then _or else (is_island (f)))) then (let parsed = (parse_keyword_args (raw_args) (env)) in let kwargs = (first (parsed)) in let children = (nth (parsed) ((Number 1.0))) in let local = (env_merge ((component_closure (f))) (env)) in (let () = ignore ((List.iter (fun p -> ignore ((env_bind local (sx_to_string p) (let _or = (dict_get (kwargs) (p)) in if sx_truthy _or then _or else Nil)))) (sx_to_list (component_params (f))); Nil)) in (let () = ignore ((if sx_truthy ((component_has_children (f))) then (env_bind local (sx_to_string (String \"children\")) children) else Nil)) in (make_cek_state ((component_body (f))) (local) (kont))))) else (raise (Eval_error (value_to_str (String (sx_str [(String \"Not callable: \"); (inspect (f))])))))))))\n\n(* sf-case-step-loop *)\nand sf_case_step_loop match_val clauses env kont =\n (if sx_truthy ((prim_call \"<\" [(len (clauses)); (Number 2.0)])) then (make_cek_value (Nil) (env) (kont)) else (let test = (first (clauses)) in let body = (nth (clauses) ((Number 1.0))) in (if sx_truthy ((is_else_clause (test))) then (make_cek_state (body) (env) (kont)) else (let test_val = (trampoline ((eval_expr (test) (env)))) in (if sx_truthy ((prim_call \"=\" [match_val; test_val])) then (make_cek_state (body) (env) (kont)) else (sf_case_step_loop (match_val) ((prim_call \"slice\" [clauses; (Number 2.0)])) (env) (kont)))))))\n\n(* eval-expr-cek *)\nand eval_expr_cek expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n(* trampoline-cek *)\nand trampoline_cek val' =\n (if sx_truthy ((is_thunk (val'))) then (eval_expr_cek ((thunk_expr (val'))) ((thunk_env (val')))) else val')\n\n(* eval-expr *)\nand eval_expr expr env =\n (cek_run ((make_cek_state (expr) (env) ((List [])))))\n\n\n(* Wire up trampoline to resolve thunks via the CEK machine *)\nlet () = trampoline_fn := (fun v ->\n match v with\n | Thunk (expr, env) -> eval_expr expr (Env env)\n | _ -> v)\n\n(* Wire up the primitives trampoline so call_any in HO forms resolves Thunks *)\nlet () = Sx_primitives._sx_trampoline_fn := !trampoline_fn\n\n(* Wire up as_number trampoline so arithmetic on leaked thunks auto-resolves *)\nlet () = Sx_primitives.trampoline_hook := !trampoline_fn\n\n(* Override recursive cek_run with iterative loop *)\nlet cek_run_iterative state =\n let s = ref state in\n while not (match cek_terminal_p !s with Bool true -> true | _ -> false) do\n s := cek_step !s\n done;\n cek_value !s\n\n\n\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":190901},"map":{"version":3,"sources":["/workspace_root/lib/sx_vm.ml","/builtin/blackbox.ml"],"sourcesContent":["(** SX bytecode VM — stack-based interpreter.\n\n Executes bytecode produced by compiler.sx.\n Designed for speed: array-based stack, direct dispatch,\n no allocation per step (unlike the CEK machine).\n\n This is the platform-native execution engine. The same bytecode\n runs on all platforms (OCaml, JS, WASM).\n\n VM types (vm_code, vm_upvalue_cell, vm_closure) are defined in\n sx_types.ml to share the mutual recursion block with [value]. *)\n\nopen Sx_types\n\n(** Call frame — one per function invocation. *)\ntype frame = {\n closure : vm_closure;\n mutable ip : int;\n base : int; (* base index in value stack for locals *)\n local_cells : (int, vm_upvalue_cell) Hashtbl.t; (* slot → shared cell for captured locals *)\n}\n\n(** VM state. *)\ntype vm = {\n mutable stack : value array;\n mutable sp : int;\n mutable frames : frame list;\n globals : (string, value) Hashtbl.t; (* live reference to kernel env *)\n}\n\n(** Forward reference for JIT compilation — set after definition. *)\nlet jit_compile_ref : (lambda -> (string, value) Hashtbl.t -> vm_closure option) ref =\n ref (fun _ _ -> None)\n\n(** Sentinel closure indicating JIT compilation was attempted and failed.\n Prevents retrying compilation on every call. *)\nlet jit_failed_sentinel = {\n vm_code = { vc_arity = -1; vc_locals = 0; vc_bytecode = [||]; vc_constants = [||] };\n vm_upvalues = [||]; vm_name = Some \"__jit_failed__\"; vm_env_ref = Hashtbl.create 0; vm_closure_env = None\n}\n\nlet is_jit_failed cl = cl.vm_code.vc_arity = -1\n\nlet create globals =\n { stack = Array.make 4096 Nil; sp = 0; frames = []; globals }\n\n(** Stack ops — inlined for speed. *)\nlet push vm v =\n if vm.sp >= Array.length vm.stack then begin\n let ns = Array.make (vm.sp * 2) Nil in\n Array.blit vm.stack 0 ns 0 vm.sp;\n vm.stack <- ns\n end;\n vm.stack.(vm.sp) <- v;\n vm.sp <- vm.sp + 1\n\nlet[@inline] pop vm =\n vm.sp <- vm.sp - 1;\n vm.stack.(vm.sp)\n\nlet[@inline] peek vm = vm.stack.(vm.sp - 1)\n\n(** Read operands. *)\nlet[@inline] read_u8 f =\n let v = f.closure.vm_code.vc_bytecode.(f.ip) in\n f.ip <- f.ip + 1; v\n\nlet[@inline] read_u16 f =\n let lo = f.closure.vm_code.vc_bytecode.(f.ip) in\n let hi = f.closure.vm_code.vc_bytecode.(f.ip + 1) in\n f.ip <- f.ip + 2;\n lo lor (hi lsl 8)\n\nlet[@inline] read_i16 f =\n let v = read_u16 f in\n if v >= 32768 then v - 65536 else v\n\n(** Wrap a VM closure as an SX value (NativeFn). *)\nlet closure_to_value cl =\n NativeFn (\"vm:\" ^ (match cl.vm_name with Some n -> n | None -> \"anon\"),\n fun args -> raise (Eval_error (\"VM_CLOSURE_CALL:\" ^ String.concat \",\" (List.map Sx_runtime.value_to_str args))))\n (* Placeholder — actual calls go through vm_call below *)\n\nlet _vm_insn_count = ref 0\nlet _vm_call_count = ref 0\nlet _vm_cek_count = ref 0\nlet vm_reset_counters () = _vm_insn_count := 0; _vm_call_count := 0; _vm_cek_count := 0\nlet vm_report_counters () =\n Printf.eprintf \"[vm-perf] insns=%d calls=%d cek_fallbacks=%d\\n%!\"\n !_vm_insn_count !_vm_call_count !_vm_cek_count\n\n(** Push a VM closure frame onto the current VM — no new VM allocation.\n This is the fast path for intra-VM closure calls. *)\nlet push_closure_frame vm cl args =\n let frame = { closure = cl; ip = 0; base = vm.sp; local_cells = Hashtbl.create 4 } in\n List.iter (fun a -> push vm a) args;\n for _ = List.length args to cl.vm_code.vc_locals - 1 do push vm Nil done;\n vm.frames <- frame :: vm.frames\n\n(** Convert compiler output (SX dict) to a vm_code object. *)\nlet code_from_value v =\n match v with\n | Dict d ->\n let bc_list = match Hashtbl.find_opt d \"bytecode\" with\n | Some (List l | ListRef { contents = l }) ->\n Array.of_list (List.map (fun x -> match x with Number n -> int_of_float n | _ -> 0) l)\n | _ -> [||]\n in\n let entries = match Hashtbl.find_opt d \"constants\" with\n | Some (List l | ListRef { contents = l }) -> Array.of_list l\n | _ -> [||]\n in\n let constants = Array.map (fun entry ->\n match entry with\n | Dict ed when Hashtbl.mem ed \"bytecode\" -> entry (* nested code — convert lazily *)\n | _ -> entry\n ) entries in\n let arity = match Hashtbl.find_opt d \"arity\" with\n | Some (Number n) -> int_of_float n | _ -> 0\n in\n { vc_arity = arity; vc_locals = arity + 16; vc_bytecode = bc_list; vc_constants = constants }\n | _ -> { vc_arity = 0; vc_locals = 16; vc_bytecode = [||]; vc_constants = [||] }\n\n(** Execute a closure with arguments — creates a fresh VM.\n Used for entry points: JIT Lambda calls, module execution, cross-boundary. *)\nlet rec call_closure cl args globals =\n incr _vm_call_count;\n let vm = create globals in\n push_closure_frame vm cl args;\n (try run vm with e -> raise e);\n pop vm\n\n(** Call a value as a function — dispatch by type.\n VmClosure: pushes frame on current VM (fast intra-VM path).\n Lambda: tries JIT then falls back to CEK.\n NativeFn: calls directly. *)\nand vm_call vm f args =\n match f with\n | VmClosure cl ->\n (* Fast path: push frame on current VM — no allocation, enables TCO *)\n push_closure_frame vm cl args\n | NativeFn (_name, fn) ->\n let result = fn args in\n push vm result\n | Lambda l ->\n (match l.l_compiled with\n | Some cl when not (is_jit_failed cl) ->\n (* Cached bytecode — run on VM using the closure's captured env,\n not the caller's globals. Closure vars were merged at compile time. *)\n (try push vm (call_closure cl args cl.vm_env_ref)\n with _ -> push vm (Sx_ref.cek_call f (List args)))\n | Some _ ->\n (* Compile failed — CEK *)\n push vm (Sx_ref.cek_call f (List args))\n | None ->\n if l.l_name <> None\n then begin\n (* Pre-mark before compile attempt to prevent re-entrancy *)\n l.l_compiled <- Some jit_failed_sentinel;\n match !jit_compile_ref l vm.globals with\n | Some cl ->\n l.l_compiled <- Some cl;\n (try push vm (call_closure cl args cl.vm_env_ref)\n with _ ->\n l.l_compiled <- Some jit_failed_sentinel;\n push vm (Sx_ref.cek_call f (List args)))\n | None ->\n push vm (Sx_ref.cek_call f (List args))\n end\n else\n push vm (Sx_ref.cek_call f (List args)))\n | Component _ | Island _ ->\n (* Components use keyword-arg parsing — CEK handles this *)\n incr _vm_cek_count;\n let result = Sx_ref.cek_call f (List args) in\n push vm result\n | _ ->\n raise (Eval_error (\"VM: not callable: \" ^ Sx_runtime.value_to_str f))\n\n(** Main execution loop — iterative (no OCaml stack growth).\n VmClosure calls push frames; the loop picks them up.\n OP_TAIL_CALL + VmClosure = true TCO: drop frame, push new, loop. *)\nand run vm =\n while vm.frames <> [] do\n match vm.frames with\n | [] -> () (* guard handled by while condition *)\n | frame :: rest_frames ->\n let bc = frame.closure.vm_code.vc_bytecode in\n let consts = frame.closure.vm_code.vc_constants in\n if frame.ip >= Array.length bc then\n vm.frames <- [] (* bytecode exhausted — stop *)\n else begin\n let saved_ip = frame.ip in\n let op = bc.(frame.ip) in\n frame.ip <- frame.ip + 1;\n (try match op with\n (* ---- Constants ---- *)\n | 1 (* OP_CONST *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CONST index %d out of bounds (pool size %d)\"\n idx (Array.length consts)));\n push vm consts.(idx)\n | 2 (* OP_NIL *) -> push vm Nil\n | 3 (* OP_TRUE *) -> push vm (Bool true)\n | 4 (* OP_FALSE *) -> push vm (Bool false)\n | 5 (* OP_POP *) -> ignore (pop vm)\n | 6 (* OP_DUP *) -> push vm (peek vm)\n\n (* ---- Variable access ---- *)\n | 16 (* OP_LOCAL_GET *) ->\n let slot = read_u8 frame in\n let v = match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value\n | None ->\n let idx = frame.base + slot in\n if idx >= vm.sp then\n raise (Eval_error (Printf.sprintf\n \"VM: LOCAL_GET slot=%d base=%d sp=%d out of bounds\" slot frame.base vm.sp));\n vm.stack.(idx)\n in\n push vm v\n | 17 (* OP_LOCAL_SET *) ->\n let slot = read_u8 frame in\n let v = peek vm in\n (* Write to shared cell if captured, else to stack *)\n (match Hashtbl.find_opt frame.local_cells slot with\n | Some cell -> cell.uv_value <- v\n | None -> vm.stack.(frame.base + slot) <- v)\n | 18 (* OP_UPVALUE_GET *) ->\n let idx = read_u8 frame in\n if idx >= Array.length frame.closure.vm_upvalues then\n raise (Eval_error (Printf.sprintf\n \"VM: UPVALUE_GET idx=%d out of bounds (have %d)\" idx\n (Array.length frame.closure.vm_upvalues)));\n push vm frame.closure.vm_upvalues.(idx).uv_value\n | 19 (* OP_UPVALUE_SET *) ->\n let idx = read_u8 frame in\n frame.closure.vm_upvalues.(idx).uv_value <- peek vm\n | 20 (* OP_GLOBAL_GET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = try Hashtbl.find vm.globals name with Not_found ->\n (* Walk the closure env chain for inner functions *)\n let id = Sx_types.intern name in\n let rec env_lookup e =\n try Hashtbl.find e.bindings id\n with Not_found ->\n match e.parent with Some p -> env_lookup p | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n match frame.closure.vm_closure_env with\n | Some env -> env_lookup env\n | None ->\n try Sx_primitives.get_primitive name\n with _ -> raise (Eval_error (\"VM undefined: \" ^ name))\n in\n push vm v\n | 21 (* OP_GLOBAL_SET *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n (* Write to closure env if the name exists there (mutable closure vars) *)\n let written = match frame.closure.vm_closure_env with\n | Some env ->\n let id = Sx_types.intern name in\n let rec find_env e =\n if Hashtbl.mem e.bindings id then\n (Hashtbl.replace e.bindings id (peek vm); true)\n else match e.parent with Some p -> find_env p | None -> false\n in find_env env\n | None -> false\n in\n if not written then Hashtbl.replace vm.globals name (peek vm)\n\n (* ---- Control flow ---- *)\n | 32 (* OP_JUMP *) ->\n let offset = read_i16 frame in\n frame.ip <- frame.ip + offset\n | 33 (* OP_JUMP_IF_FALSE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if not (sx_truthy v) then frame.ip <- frame.ip + offset\n | 34 (* OP_JUMP_IF_TRUE *) ->\n let offset = read_i16 frame in\n let v = pop vm in\n if sx_truthy v then frame.ip <- frame.ip + offset\n\n (* ---- Function calls ---- *)\n | 48 (* OP_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n vm_call vm f args_list\n (* Loop continues — if VmClosure, new frame runs next iteration *)\n | 49 (* OP_TAIL_CALL *) ->\n let argc = read_u8 frame in\n let args = Array.init argc (fun _ -> pop vm) in\n let f = pop vm in\n let args_list = List.rev (Array.to_list args) in\n (* Drop current frame, reuse stack space — true TCO for VmClosure *)\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n vm_call vm f args_list\n | 50 (* OP_RETURN *) ->\n let result = pop vm in\n vm.frames <- rest_frames;\n vm.sp <- frame.base;\n push vm result\n (* Loop continues with caller frame *)\n | 51 (* OP_CLOSURE *) ->\n let idx = read_u16 frame in\n if idx >= Array.length consts then\n raise (Eval_error (Printf.sprintf \"VM: CLOSURE idx %d >= consts %d\" idx (Array.length consts)));\n let code_val = consts.(idx) in\n let code = code_from_value code_val in\n (* Read upvalue descriptors from bytecode *)\n let uv_count = match code_val with\n | Dict d -> (match Hashtbl.find_opt d \"upvalue-count\" with\n | Some (Number n) -> int_of_float n | _ -> 0)\n | _ -> 0\n in\n let upvalues = Array.init uv_count (fun _ ->\n let is_local = read_u8 frame in\n let index = read_u8 frame in\n if is_local = 1 then begin\n (* Capture from enclosing frame's local slot.\n Create a shared cell — both parent and closure\n read/write through this cell. *)\n let cell = match Hashtbl.find_opt frame.local_cells index with\n | Some existing -> existing (* reuse existing cell *)\n | None ->\n let c = { uv_value = vm.stack.(frame.base + index) } in\n Hashtbl.replace frame.local_cells index c;\n c\n in\n cell\n end else\n (* Capture from enclosing frame's upvalue — already a shared cell *)\n frame.closure.vm_upvalues.(index)\n ) in\n let cl = { vm_code = code; vm_upvalues = upvalues; vm_name = None;\n vm_env_ref = vm.globals; vm_closure_env = None } in\n push vm (VmClosure cl)\n | 52 (* OP_CALL_PRIM *) ->\n let idx = read_u16 frame in\n let argc = read_u8 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let args = List.init argc (fun _ -> pop vm) |> List.rev in\n (* Resolve thunks — the CEK evaluator does this automatically\n via trampoline, but the VM must do it explicitly before\n passing args to primitives. *)\n let args = List.map (fun v ->\n match v with\n | Thunk _ -> !Sx_primitives._sx_trampoline_fn v\n | _ -> v) args in\n let result =\n try\n (* Check primitives FIRST (native implementations of map/filter/etc.),\n then globals (which may have ho_via_cek wrappers that route\n through the CEK — these can't call VM closures). *)\n let fn_val = try Sx_primitives.get_primitive name with _ ->\n try Hashtbl.find vm.globals name with Not_found ->\n raise (Eval_error (\"VM: unknown primitive \" ^ name))\n in\n (match fn_val with\n | NativeFn (_, fn) -> fn args\n | _ -> Nil)\n with Eval_error msg ->\n raise (Eval_error (Printf.sprintf \"%s (in CALL_PRIM \\\"%s\\\" with %d args)\"\n msg name argc))\n in\n push vm result\n\n (* ---- Collections ---- *)\n | 64 (* OP_LIST *) ->\n let count = read_u16 frame in\n let items = List.init count (fun _ -> pop vm) |> List.rev in\n push vm (List items)\n | 65 (* OP_DICT *) ->\n let count = read_u16 frame in\n let d = Hashtbl.create count in\n for _ = 1 to count do\n let v = pop vm in\n let k = pop vm in\n let key = match k with String s -> s | Keyword s -> s | _ -> Sx_runtime.value_to_str k in\n Hashtbl.replace d key v\n done;\n push vm (Dict d)\n\n (* ---- String ops ---- *)\n | 144 (* OP_STR_CONCAT *) ->\n let count = read_u8 frame in\n let parts = List.init count (fun _ -> pop vm) |> List.rev in\n let s = String.concat \"\" (List.map Sx_runtime.value_to_str parts) in\n push vm (String s)\n\n (* ---- Define ---- *)\n | 128 (* OP_DEFINE *) ->\n let idx = read_u16 frame in\n let name = match consts.(idx) with String s -> s | _ -> \"\" in\n let v = peek vm in\n Hashtbl.replace vm.globals name v\n\n (* ---- Inline primitives ----\n Fast path for common types; fallback to actual primitive\n for edge cases (type coercion, thunks, RawHTML, etc.)\n to guarantee behavioral parity with CALL_PRIM. *)\n | 160 (* OP_ADD *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x +. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"+\") [a; b])\n | 161 (* OP_SUB *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x -. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [a; b])\n | 162 (* OP_MUL *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x *. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"*\") [a; b])\n | 163 (* OP_DIV *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Number (x /. y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"/\") [a; b])\n | 164 (* OP_EQ *) ->\n let b = pop vm and a = pop vm in\n let rec norm = function\n | ListRef { contents = l } -> List (List.map norm l)\n | List l -> List (List.map norm l) | v -> v in\n push vm (Bool (norm a = norm b))\n | 165 (* OP_LT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x < y)\n | String x, String y -> Bool (x < y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"<\") [a; b])\n | 166 (* OP_GT *) ->\n let b = pop vm and a = pop vm in\n push vm (match a, b with\n | Number x, Number y -> Bool (x > y)\n | String x, String y -> Bool (x > y)\n | _ -> (Hashtbl.find Sx_primitives.primitives \">\") [a; b])\n | 167 (* OP_NOT *) ->\n let v = pop vm in\n push vm (Bool (not (sx_truthy v)))\n | 168 (* OP_LEN *) ->\n let v = pop vm in\n push vm (match v with\n | List l | ListRef { contents = l } -> Number (float_of_int (List.length l))\n | String s -> Number (float_of_int (String.length s))\n | Dict d -> Number (float_of_int (Hashtbl.length d))\n | Nil -> Number 0.0\n | _ -> (Hashtbl.find Sx_primitives.primitives \"len\") [v])\n | 169 (* OP_FIRST *) ->\n let v = pop vm in\n push vm (match v with\n | List (x :: _) | ListRef { contents = x :: _ } -> x\n | List [] | ListRef { contents = [] } | Nil -> Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"first\") [v])\n | 170 (* OP_REST *) ->\n let v = pop vm in\n push vm (match v with\n | List (_ :: xs) | ListRef { contents = _ :: xs } -> List xs\n | List [] | ListRef { contents = [] } | Nil -> List []\n | _ -> (Hashtbl.find Sx_primitives.primitives \"rest\") [v])\n | 171 (* OP_NTH *) ->\n let n = pop vm and coll = pop vm in\n push vm (match coll, n with\n | (List l | ListRef { contents = l }), Number f ->\n (try List.nth l (int_of_float f) with _ -> Nil)\n | String s, Number f ->\n let i = int_of_float f in\n if i >= 0 && i < String.length s then String (String.make 1 s.[i])\n else Nil\n | _ -> (Hashtbl.find Sx_primitives.primitives \"nth\") [coll; n])\n | 172 (* OP_CONS *) ->\n let coll = pop vm and x = pop vm in\n push vm (match coll with\n | List l -> List (x :: l)\n | ListRef { contents = l } -> List (x :: l)\n | Nil -> List [x]\n | _ -> (Hashtbl.find Sx_primitives.primitives \"cons\") [x; coll])\n | 173 (* OP_NEG *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (-.x)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"-\") [v])\n | 174 (* OP_INC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x +. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"inc\") [v])\n | 175 (* OP_DEC *) ->\n let v = pop vm in\n push vm (match v with\n | Number x -> Number (x -. 1.0)\n | _ -> (Hashtbl.find Sx_primitives.primitives \"dec\") [v])\n\n | opcode ->\n raise (Eval_error (Printf.sprintf \"VM: unknown opcode %d at ip=%d\"\n opcode (frame.ip - 1)))\n with Invalid_argument msg ->\n let fn_name = match frame.closure.vm_name with Some n -> n | None -> \"?\" in\n raise (Eval_error (Printf.sprintf\n \"VM: %s at ip=%d op=%d in %s (base=%d sp=%d bc_len=%d consts=%d)\"\n msg saved_ip op fn_name frame.base vm.sp\n (Array.length bc) (Array.length consts))))\n end\n done\n\n(** Execute a compiled module (top-level bytecode). *)\nlet execute_module code globals =\n let cl = { vm_code = code; vm_upvalues = [||]; vm_name = Some \"module\"; vm_env_ref = globals; vm_closure_env = None } in\n let vm = create globals in\n let frame = { closure = cl; ip = 0; base = 0; local_cells = Hashtbl.create 4 } in\n for _ = 0 to code.vc_locals - 1 do push vm Nil done;\n vm.frames <- [frame];\n run vm;\n pop vm\n\n\n(** {1 Lazy JIT compilation} *)\n\n(** Compile a lambda or component body to bytecode using the SX compiler.\n Invokes [compile] from spec/compiler.sx via the CEK machine.\n Returns a [vm_closure] ready for execution, or [None] on failure\n (safe fallback to CEK interpretation).\n\n The compilation cost is a single CEK evaluation of the compiler —\n microseconds per function. The result is cached in the lambda/component\n record so subsequent calls go straight to the VM. *)\nlet jit_compile_lambda (l : lambda) globals =\n let fn_name = match l.l_name with Some n -> n | None -> \"\" in\n try\n let compile_fn = try Hashtbl.find globals \"compile\"\n with Not_found -> raise (Eval_error \"JIT: compiler not loaded\") in\n (* Reconstruct the (fn (params) body) form so the compiler produces\n a proper closure. l.l_body is the inner body; we need the full\n function form with params so the compiled code binds them. *)\n let param_syms = List (List.map (fun s -> Symbol s) l.l_params) in\n let fn_expr = List [Symbol \"fn\"; param_syms; l.l_body] in\n let quoted = List [Symbol \"quote\"; fn_expr] in\n let result = Sx_ref.eval_expr (List [compile_fn; quoted]) (Env (make_env ())) in\n (* If the lambda has closure-captured variables, merge them into globals\n so the VM can find them via GLOBAL_GET. The compiler doesn't know\n about the enclosing scope, so closure vars get compiled as globals. *)\n let effective_globals =\n let closure = l.l_closure in\n if Hashtbl.length closure.bindings = 0 && closure.parent = None then\n globals (* no closure vars — use globals directly *)\n else begin\n (* Merge: closure bindings layered on top of globals.\n Use a shallow copy so we don't pollute the real globals. *)\n let merged = Hashtbl.copy globals in\n let rec inject env =\n Hashtbl.iter (fun id v -> Hashtbl.replace merged (Sx_types.unintern id) v) env.bindings;\n match env.parent with Some p -> inject p | None -> ()\n in\n inject closure;\n let n = Hashtbl.length merged - Hashtbl.length globals in\n if n > 0 then\n Printf.eprintf \"[jit] %s: injected %d closure bindings\\n%!\" fn_name n;\n merged\n end\n in\n (match result with\n | Dict d when Hashtbl.mem d \"bytecode\" ->\n let outer_code = code_from_value result in\n let bc = outer_code.vc_bytecode in\n if Array.length bc >= 4 && bc.(0) = 51 (* OP_CLOSURE *) then begin\n let idx = bc.(1) lor (bc.(2) lsl 8) in\n if idx < Array.length outer_code.vc_constants then\n let inner_val = outer_code.vc_constants.(idx) in\n let code = code_from_value inner_val in\n Some { vm_code = code; vm_upvalues = [||];\n vm_name = l.l_name; vm_env_ref = effective_globals; vm_closure_env = Some l.l_closure }\n else begin\n Printf.eprintf \"[jit] FAIL %s: closure index %d out of bounds (pool=%d)\\n%!\"\n fn_name idx (Array.length outer_code.vc_constants);\n\n None\n end\n end else begin\n (* Not a closure — constant expression, alias, or simple computation.\n Execute the bytecode as a module to get the value, then wrap\n as a NativeFn if it's callable (so the CEK can dispatch to it). *)\n (try\n let value = execute_module outer_code globals in\n Printf.eprintf \"[jit] RESOLVED %s: %s (bc[0]=%d)\\n%!\"\n fn_name (type_of value) (if Array.length bc > 0 then bc.(0) else -1);\n (* If the resolved value is a NativeFn, we can't wrap it as a\n vm_closure — just let the CEK handle it directly. Return None\n so the lambda falls through to CEK, which will find the\n resolved value in the env on next lookup. *)\n None\n with _ ->\n Printf.eprintf \"[jit] SKIP %s: non-closure execution failed (bc[0]=%d, len=%d)\\n%!\"\n fn_name (if Array.length bc > 0 then bc.(0) else -1) (Array.length bc);\n None)\n end\n | _ ->\n Printf.eprintf \"[jit] FAIL %s: compiler returned %s\\n%!\" fn_name (type_of result);\n None)\n with e ->\n Printf.eprintf \"[jit] FAIL %s: %s\\n%!\" fn_name (Printexc.to_string e);\n None\n\n(* Wire up forward references *)\nlet () = jit_compile_ref := jit_compile_lambda\nlet () = _vm_call_closure_ref := (fun cl args -> call_closure cl args cl.vm_env_ref)\n","(* generated code *)"],"names":[],"mappings":"KAsmBiD,6BAAkC,C,EAtErC,UAAQ,C,EAgBlB,KAA6C,IAAtB,EAAvB,QAAuB,aAAsB,sBAAE,C,iBAvBjF,2CAwEE,E,CAvEF,gBACuB,KADvB,OACuB,eAA8B,I,AAAA,I,AAAA,G,EAAA,GC3hBvD,WD4hBwB,EC5hBxB,oC,CD4hBwB,E,CAAA,sBAOwD,cAD5E,eADA,eAD+D,IAAzC,GAAtB,mBAAsB,aAAyC,IAC/D,+BACA,gBAC4E,oBAAb,IAA/D,QAA+D,aAAa,aAA/D,eAMuB,MAFpC,SAEE,iBAAG,aAA+B,yBAKnB,EAHV,OAGU,eAKb,EAHE,4CAAuF,gBAIzD,EADlB,OACkB,eAAxB,EAA8C,OAA9C,aAAqB,eAC7B,QACE,E,CAAA,iCACF,UANkC,OAvBxC,EAgCE,Q,CAAA,4BACc,uBAAwB,K,CAAA,EAGpC,KAFiB,WACjB,UACA,E,CAAA,6BAA2B,cAAM,IAAN,OAAM,GACT,YAAZ,YAAY,OAAM,QAAlB,OAAM,QAChB,oB,CAAA,8BACE,UAAgB,qBAEhB,QAFgB,gBACL,OACX,gDAGA,E,CAAA,IADG,iB,CAAA,wBACH,KADG,OACH,iBACoD,O,GAI/C,OAKO,E,CAAA,aALP,EAML,S,CAAA,8BACuD,sBAAY,K,EADnE,E,CACU,EAAyD,QAAzD,aADV,KACyB,OADzB,iBACsE,Y,AAAA,I,AAAA,G,EAAA,IAOtE,S,CAAA,iC,CAAA,8BACuC,sBAAY,K,EADnD,E,CAAA,SACmD,OADnD,iBACwE,SAI5E,E,CAAiE,EAAjE,QAAiE,aAAjE,GAAiF,OAAjF,iBAAiF,Y,AAAA,I,AAAA,G,EAAA,GAGnF,OAA+C,aAA/C,GAAqE,OAArE,iBAAqE,K,YA5FvE,qCAzd6B,IAAnB,WAAmB,gBA2d+B,QAA5D,OAA4D,eAC5D,8BAAmC,cAAW,yBAC9C,QAF4E,oBAE5E,WACA,YAAM,SACA,C,UA7YN,0CAlF6B,IAAnB,WAAmB,gBAoF7B,YAA6B,SACxB,YAAM,I,AAAA,I,AAAA,G,EAAA,GCjIb,GDkIE,SAAM,C,aAON,K,CAAA,E,EAAA,6DAoCE,gCAEA,EADa,EAAb,mBAAa,aACb,QAnCA,EAmCA,UAnCA,UAGA,EADa,EAFb,UAEa,aACb,sBAEA,mBAUG,cAeyC,EAA/B,EAAR,mBAAQ,aAA+B,QAdpC,0BAGG,EAAN,uBAAM,KAA6B,OAQM,EAA/B,EAAR,mBAAQ,aAA+B,QANvC,WAMuC,YANvC,OACA,OAAK,EAAQ,SAAb,OAAa,SAAR,OAA4C,G,AAAA,I,AAAA,G,EAAA,IAE9C,wBACuC,EAA/B,EAAR,mBAAQ,aAA+B,Q,IAAA,YAnB7B,OAAkB,cAG9B,EAAQ,SAHsB,OAGtB,SAAR,OAA4C,G,AAAA,I,AAAA,G,EAAA,IACC,EAA/B,EAAR,mBAAQ,aAA+B,QAGX,EAA/B,EAAR,mBAAQ,aAA+B,Q,KAwBxB,GAAwB,EAA1C,QAA0C,aAAyB,OAAjD,eAAkD,oBAAC,C,MAqE3D,mBAAI,MAAJ,OAAI,aAA0B,G,AAAA,I,AAAA,G,EAAA,GCtP5C,iDDwPgB,0BACM,MADN,QACM,aAAgC,G,AAAA,I,AAAA,G,EAAA,IACR,SAAlB,OAAkB,eAAyB,+BAFzB,K,EAAA,K,GAE0B,C,MAiBxD,cAAG,MAAH,OAAG,aAAyB,OAEvB,gBAAmD,aAArB,MADF,eAAS,OAAvC,QAAuC,OAAvC,cAAuC,IACmB,C,EAsB9B,gBAAM,C,eAiC1B,qBACH,e,EACZ,SAAqB,cAIF,EAJE,OAIF,eAAwC,QAGrD,cAAqB,UAArB,+BAAqB,SACrB,gBADkD,IAA7B,gBAA6B,MAClD,qBAAyC,cAG7C,EAGA,wDAAiC,E,EAAA,I,KAcnC,K,CAAA,qBACa,iCACN,EAAC,C,GA2EK,K,CAAA,E,EAAA,mB,GAAA,mBACuC,IAAjB,GADtB,kBACiB,OAAK,aAAiB,MAClB,IAAjB,GADmC,UACxC,OAAK,aAAiB,OAAQ,EAAC,C,uBA1PrD,yCACE,+BAGE,4BACA,yBACA,S,CAAA,wCACE,iBANJ,YAOO,YAEM,YAAT,OAAS,wBACT,wBACA,2C,EAAA,+FAgTE,KADQ,W,CACR,G,CAAA,qBACiC,IADjC,OACuB,oBAAU,QACxB,M,CAAA,4B,CAAA,a,CAAA,YAFT,QAE2D,GAP3D,KADQ,W,CACR,G,CAAA,qBACiC,IADjC,OACuB,oBAAU,QACxB,M,CAAA,4B,CAAA,a,CAAA,YAFT,QAE2D,GAP3D,KADQ,W,CACR,G,CAAA,qBAC4B,IAD5B,OACuB,WAAK,QACnB,M,CAAA,4B,CAAA,a,CAAA,YAFT,QAEyD,GAV9C,WAAe,WAC1B,I,CAAA,MAGW,uB,GAAA,qB,GAAA,mBADqB,UACrB,kBADqB,WADlB,UACkB,UADlB,WAGL,Y,CAAA,gC,CAAA,a,CAAA,aAJT,QAIkE,GAf1D,WACR,KAD0B,WAC1B,G,CAAA,E,EAAA,wB,GAAA,0D,CAAA,sB,CAE+C,EAA3C,OAAK,E,CAFT,OAEI,SAAK,EAAL,OAAK,E,CAAA,WAA2B,I,AAAA,I,AAAA,G,EAAA,IAAW,S,CAAA,G,CAAA,4BAE3C,WACA,aAH2C,UAG3C,aAA4D,eAAM,IAArB,IAAe,aAAf,EAAoB,OAApB,E,CAAA,WAAqB,QAC7D,UACA,Y,CAAA,gC,CAAA,a,CAAA,YAPT,QAOiE,GAbjE,EADQ,W,CACR,U,GAAA,EACuD,IADvD,sB,GAAA,iD,CAAA,mC,CAAA,WACuD,OAE9C,M,CAAA,4B,CAAA,a,CAAA,aAHT,QAG4D,GAT5D,KADQ,W,CACR,G,CAAA,E,EAAA,qB,GAAA,2FAGS,M,CAAA,4B,CAAA,a,CAAA,WAAmD,IADX,KAFjD,QAG6D,GAX7D,EADQ,W,CACR,U,GAAA,IAC8E,IAD9E,wB,GAAA,2CAGsD,IAHtD,UAGc,OAAqB,E,CAAA,WAAd,SAAiC,kBAFb,OAAqB,E,CAAA,WAAd,SAA8B,OACvB,IADuB,UAC9D,KAAO,IAAgC,OAG9C,M,CAAA,4B,CAAA,a,CAAA,aALT,QAK2D,GAR3D,EAAgC,IADxB,SACR,QAAmB,E,CAAA,WAAa,YAAhC,QAAkC,GAP1B,WACR,KADuB,WACvB,G,CAAA,E,EAAA,mB,GAAA,Q,CAAA,sB,CAEsC,MAFtC,iBAE+B,EAAO,S,CAAA,G,CAAA,qBADZ,IACY,UADZ,OACY,OADZ,oBAEjB,Y,CAAA,gC,CAAA,a,CAAA,YAHT,QAG4D,GAVpD,WACR,KADuB,WACvB,G,CAAA,E,EAAA,mB,GAAA,Q,CAAA,sB,CAEsC,MAFtC,iBAE+B,EAAO,S,CAAA,G,CAAA,qBADZ,IACY,UADZ,OACY,OADZ,oBAEjB,Y,CAAA,gC,CAAA,a,CAAA,YAHT,QAG4D,GAVpD,WAAe,WAIC,E,CAAA,SAAxB,EAA+B,IAAhB,SAAD,E,CAAA,EAAiB,MAA/B,QAAgC,GATxB,WACR,KADuB,WACvB,G,CAAA,uB,CAAA,G,CAAA,qBACyC,IADzC,OACiC,OADjC,OACiC,WAAQ,UAChC,Y,CAAA,gC,CAAA,a,CAAA,YAFT,QAE4D,GARpD,WACR,KADuB,WACvB,G,CAAA,uB,CAAA,G,CAAA,qBACyC,IADzC,OACiC,OADjC,OACiC,WAAQ,UAChC,Y,CAAA,gC,CAAA,a,CAAA,YAFT,QAE4D,GARpD,WACR,KADuB,WACvB,G,CAAA,uB,CAAA,G,CAAA,qBACyC,IADzC,OACiC,OADjC,OACiC,WAAQ,UAChC,Y,CAAA,gC,CAAA,a,CAAA,YAFT,QAE4D,GARpD,WACR,KADuB,WACvB,G,CAAA,uB,CAAA,G,CAAA,qBACyC,IADzC,OACiC,OADjC,OACiC,WAAQ,UAChC,Y,CAAA,gC,CAAA,a,CAAA,YAFT,QAE4D,GApBhD,E,CAAA,OACZ,eAAY,E,CAAA,WAAiC,OAAjC,E,CAAA,aAEZ,MADQ,GAAR,QAAyB,E,CAAzB,OAAyB,E,CAAA,WAAwC,OAAzD,E,CAAA,WACR,YAAkB,GAIR,E,CAAA,SACO,sC,CAAY,sCAAkB,K,EACvC,WACR,Y,CAAA,W,CAAA,YAAiC,iB,EAAA,6HArBzB,IADI,E,CAAA,SACZ,OAAQ,E,CAAA,aACR,kBACU,WAER,GADQ,W,CACR,G,CAAA,E,EAAA,iB,GAAA,qBAA6D,E,CAAA,U,CAAA,YAA7D,EACA,E,CAAA,E,CAAA,W,CAAA,YAAuB,sBAEzB,Q,CAAA,YAAgB,GAVhB,MAFY,E,CAAA,OACZ,eAAY,E,CAAA,WAAiC,OAAjC,E,CAAA,WACZ,YAAoB,GAjCV,E,CAAA,SACC,E,CAAA,SACM,sC,CAAY,sCAAkB,K,EAKpC,GAJA,EAAX,eAAW,aAAgC,OAAhC,aAIX,OAAW,eAIX,kBAKqB,E,CALrB,QAKqB,aAAgC,M,AAAA,I,AAAA,G,EAAA,IC1W/D,mBD2WoB,E,CC3WpB,OD2WoB,aAA4B,M,AAAA,I,AAAA,G,EAAA,GC3WhD,WD4WqE,EC5WrE,S,CAAA,a,CAAA,c,CD4WqE,E,CAAjC,K,CAAlB,OAAkB,eAAiC,sBAEvD,Q,CAAA,qBACuB,E,CADvB,OACuB,aAAO,IACtB,KAFR,EAEQ,I,AAAA,I,AAAA,G,EAAA,KChXtB,sBDmX8B,ECnX9B,S,CAAA,a,CAAA,c,CDmX8B,E,CCnX9B,UDkXgC,E,CAAA,KAAlB,OAAkB,E,CAAA,gBACF,c,CAAA,OAEpB,I,CAAA,QAAc,GA7DJ,E,CAAA,SACV,c,CAAA,2BACoB,E,CAAlB,O,CAAA,wBAAkB,KAAlB,OAAkB,E,CAAA,gBAA4E,c,CAAA,OACjF,wBA6Bf,MAFA,IA3Be,c,CACJ,OAEX,I,CAAA,G,CAAA,4BACqB,GAAP,OAAO,E,CAAA,aAAkC,K,CAAA,c,CAAA,G,CAAA,4BAC5B,cAAsB,MACxC,GAEM,EAAf,O,CAAA,UAAe,E,CAAA,WAmBf,sBAEA,YAAsB,G,EAtCT,WACb,W,CAAA,GACA,iBACA,YAAc,GAZH,E,CAAA,OACX,eAAW,eACH,WACiB,EAAzB,OAAyB,aAAoB,OAA7B,eAEhB,W,CAAA,GACA,iBACA,I,CAAA,YAAsB,GAdX,E,CAAA,OACX,eAAW,E,CAAA,aAGX,EAFQ,SACiB,E,CAAzB,OAAyB,E,CAAA,WAAoB,OAA7B,E,CAAA,WAChB,UAAsB,GAVT,E,CAAA,SACL,SACR,QAAG,aAAW,OAAM,mCANP,E,CAAA,SACL,SACR,QAAO,aAAa,KAAM,qCALb,E,CAAA,SACb,mCAlBU,E,CAAA,SACO,sC,CAAY,sCAAkB,K,EAE/C,2BAQY,aALR,EADS,E,CAAT,QAAS,aACT,GAIG,IAGsD,EAAT,WAAS,UAAzC,E,CAAA,EAAyC,OAAzC,E,CAAA,YAAyC,GAjCnD,E,CAAA,SACO,wBACjB,mBADiB,c,CAAY,sCAAkB,KACnC,E,CAAZ,OAAY,aAA4B,M,AAAA,I,AAAA,G,EAAA,GClPlD,WD6PwC,EC7PxC,S,CAAA,a,CAAA,c,CD6PwC,E,CATnB,E,CAAT,QAAS,eAQT,oCAGM,E,CAHN,QAGM,aAAgC,M,AAAA,I,AAAA,G,EAAA,IACR,K,CAAlB,OAAkB,E,CAAA,aAAyB,c,CAAA,kBAXvD,E,CAAA,KAQc,GAAc,IAK9B,I,CAAA,QAAS,GArBC,E,CAAA,SACkC,WAAO,kBAAnD,kCAA+B,aARrB,E,CAAA,SACV,8B,CAAA,2BACoB,E,CAAlB,yB,CAAA,wBAAkB,KAAlB,OAAkB,E,CAAA,gBAEyB,c,CAAA,OAC7C,kBAAQ,sBAAR,EAAQ,YAA+B,QAAvC,QAAgD,G,EAZrC,E,CAAA,SACH,WAER,UAAO,E,CAAP,OAAO,E,CAAA,aAAuC,OAEnC,qEAAiC,aAD5B,a,EAhBL,E,CAAA,SAUX,EATA,UAAc,E,CAAd,OAAc,eAAuC,QAGjD,wBACA,2BACoB,EAAlB,cAAkB,GAAlB,OAAkB,E,CAAA,gBAC0D,c,CAAA,OAC9E,iDAAc,UAND,SAQjB,QAAS,GAdW,EAAQ,SAAR,QAAiB,GADV,UAAQ,GADf,aAAoB,GADpB,aAAmB,GADnB,cAAW,GALrB,E,CAAA,SACV,c,CAAA,2BACoB,E,CAAlB,O,CAAA,wBAAkB,KAAlB,OAAkB,E,CAAA,gBACU,c,CAAA,OACtB,wBAAR,EAAQ,YAAR,QAAoB,G,IA8SF,E,CAAlB,kBAAkB,KAAlB,OAAkB,E,CAAA,gBACyB,c,CAAA,Y,AAAA,I,AAAA,G,EAAA,MAlUnD,ECvLF,qB,CAAA,kB,CAAA,kBD2fU,2C,EC3fV,YD4fU,S,CAAA,0BAAkB,E,CAAA,E,CAAA,E,CAAA,EAAlB,6B,CAAA,wBAAkB,SAAlB,OAAkB,kBAGwB,uB,CAAA,G,EAAA,I,KAtZV,K,CAAA,4BAAyB,cAAsB,IAAC,C,KAQpF,K,CAAA,4BACe,uBAAyB,K,CAAA,EAAI,MACrC,EAAK,C,aAdhB,K,CAAA,qBAEmD,GAFnD,S,CAEsB,GAApB,OAAoB,eAA6B,K,CAAA,iB,CAAA,E,EAE/B,GAF+B,sB,GAAA,mDAE7C,OAAc,aAAwE,OAAtF,aAAsF,KACjF,SAHwC,EASjC,GAJkC,GAA9B,E,CAAA,GAApB,OAAoB,eAA8B,K,CAAA,iB,CAAA,E,EAAA,sB,GAAA,mDACF,oBAAe,KACtD,SAET,OAAgB,eAQhB,IAH4C,EAA1B,E,CAAA,GAAlB,OAAkB,eAA0B,K,CAAA,iB,CAAA,4BACrB,cAAsB,GADD,EAG5C,oBACK,gCAAyE,C,EA1B5D,kBAAS,C,WADmC,QAAhE,OAAgE,eAAgB,8BAChF,+BACQ,EAD2B,OAC3B,eAAgB,gDAAgC,cAAW,0BACnE,+BAA+B,C,MAT/B,qEACgD,C,MAHvB,qBAAqB,eAAqB,mBAAkB,C,EANrD,GAAsB,GAAxC,QAA0D,EAA1D,OAA0D,aAAuC,OAAzD,aAAyD,OAA/E,eAAgF,oBAAC,C,EAD3C,IAA5D,GAAV,mCAAmD,OAAzC,aAA4D,OAC4C,C,KAN1G,WACR,eAAmB,YAAe,GAAC,C,WAPnC,8BAAS,UAAT,OAAS,UACT,uBAAS,UAAT,iBAAS,SADA,cACA,kBACT,wBACA,yBAAiB,C,QAPjB,4BAAQ,UAAR,OAAQ,QAAR,EAAQ,cACR,wBAAkB,OAAC,C,OALE,gEAAoB,M,QAHzC,6BACA,gCADA,EACA,YAAgB,M,cAVhB,+B,CAAA,2BAAuC,kBAC5B,UACT,6CAAgC,UAGlC,mCALA,EAKA,cAAqB,iCACH,C,EAVW,IAAnB,WAAmB,cAAgC,C,EAHxC,yBAAwB,C,EAT7B,IAAI,C,8CAM8D,eCtCpF,aDsCoF,+CAAhB,QCtCpE,ODsCoE,aAAgB,c,EAAA,S,EAAA,8J,EAAA,6D,QCtCpF,4D,QAAA,6E,UAAA,mK,EAAA,c,QAAA,8B,EAAA,c,EAAA,c,WAAA","ignoreList":[1]}},{"offset":{"line":0,"column":206046},"map":{"version":3,"sources":["/workspace_root/lib/sx_scope.ml","/builtin/blackbox.ml"],"sourcesContent":["(** Scope stacks — dynamic scope for render-time effects.\n\n Provides scope-push!/pop!/peek, collect!/collected/clear-collected!,\n scope-emit!/emitted/scope-emitted, context, and cookie access.\n\n All functions are registered as primitives so both the CEK evaluator\n and the JIT VM can find them in the same place. *)\n\nopen Sx_types\n\n(** The shared scope stacks hashtable. Each key maps to a stack of values.\n Used by aser for spread/provide/emit patterns, CSSX collect/flush, etc. *)\nlet scope_stacks : (string, value list) Hashtbl.t = Hashtbl.create 8\n\n(** Request cookies — set by the Python bridge before each render.\n get-cookie reads from here; set-cookie is a no-op on the server. *)\nlet request_cookies : (string, string) Hashtbl.t = Hashtbl.create 8\n\n(** Clear all scope stacks. Called between requests if needed. *)\nlet clear_all () = Hashtbl.clear scope_stacks\n\nlet () =\n let register = Sx_primitives.register in\n\n (* --- Cookies --- *)\n\n register \"get-cookie\" (fun args ->\n match args with\n | [String name] ->\n (match Hashtbl.find_opt request_cookies name with\n | Some v -> String v\n | None -> Nil)\n | _ -> Nil);\n\n register \"set-cookie\" (fun _args -> Nil);\n\n (* --- Core scope stack operations --- *)\n\n register \"scope-push!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n Hashtbl.replace scope_stacks name (value :: stack); Nil\n | _ -> Nil);\n\n register \"scope-pop!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with _ :: rest -> Hashtbl.replace scope_stacks name rest | [] -> ()); Nil\n | _ -> Nil);\n\n register \"scope-peek\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with v :: _ -> v | [] -> Nil)\n | _ -> Nil);\n\n (* --- Context (scope lookup with optional default) --- *)\n\n register \"context\" (fun args ->\n match args with\n | [String name] | [String name; _] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack, args with\n | v :: _, _ -> v\n | [], [_; default_val] -> default_val\n | [], _ -> Nil)\n | _ -> Nil);\n\n (* --- Collect / collected / clear-collected! --- *)\n\n register \"collect!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n if not (List.mem value items) then\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"collected\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"clear-collected!\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | _ :: rest -> Hashtbl.replace scope_stacks name (List [] :: rest)\n | [] -> Hashtbl.replace scope_stacks name [List []]);\n Nil\n | _ -> Nil);\n\n (* --- Emit / emitted (for spread attrs in adapter-html.sx) --- *)\n\n register \"scope-emit!\" (fun args ->\n match args with\n | [String name; value] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with\n | List items :: rest ->\n Hashtbl.replace scope_stacks name (List (items @ [value]) :: rest)\n | Nil :: rest ->\n Hashtbl.replace scope_stacks name (List [value] :: rest)\n | [] ->\n Hashtbl.replace scope_stacks name [List [value]]\n | _ :: _ -> ());\n Nil\n | _ -> Nil);\n\n register \"emit!\" (fun args ->\n (* Alias for scope-emit! *)\n match Sx_primitives.get_primitive \"scope-emit!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"emitted\" (fun args ->\n match args with\n | [String name] ->\n let stack = try Hashtbl.find scope_stacks name with Not_found -> [] in\n (match stack with List items :: _ -> List items | _ -> List [])\n | _ -> List []);\n\n register \"scope-emitted\" (fun args ->\n match Sx_primitives.get_primitive \"emitted\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-collected\" (fun args ->\n match Sx_primitives.get_primitive \"collected\" with\n | NativeFn (_, fn) -> fn args | _ -> List []);\n\n register \"scope-clear-collected!\" (fun args ->\n match Sx_primitives.get_primitive \"clear-collected!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n (* --- Provide aliases --- *)\n\n register \"provide-push!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-push!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil);\n\n register \"provide-pop!\" (fun args ->\n match Sx_primitives.get_primitive \"scope-pop!\" with\n | NativeFn (_, fn) -> fn args | _ -> Nil)\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":210241},"map":{"version":3,"sources":["/workspace_root/lib/sx_parser.ml","/builtin/blackbox.ml"],"sourcesContent":["(** S-expression parser.\n\n Recursive descent over a string, producing [Sx_types.value list].\n Supports: lists, dicts, symbols, keywords, strings (with escapes),\n numbers, booleans, nil, comments, quote/quasiquote/unquote sugar. *)\n\nopen Sx_types\n\ntype state = {\n src : string;\n len : int;\n mutable pos : int;\n}\n\nlet make_state src = { src; len = String.length src; pos = 0 }\n\nlet peek s = if s.pos < s.len then Some s.src.[s.pos] else None\nlet advance s = s.pos <- s.pos + 1\nlet at_end s = s.pos >= s.len\n\nlet skip_whitespace_and_comments s =\n let rec go () =\n if at_end s then ()\n else match s.src.[s.pos] with\n | ' ' | '\\t' | '\\n' | '\\r' -> advance s; go ()\n | ';' ->\n while s.pos < s.len && s.src.[s.pos] <> '\\n' do advance s done;\n if s.pos < s.len then advance s;\n go ()\n | _ -> ()\n in go ()\n\n(* Character classification — matches spec/parser.sx ident-start/ident-char.\n ident-start: a-z A-Z _ ~ * + - > < = / ! ? &\n ident-char: ident-start plus 0-9 . : / # , *)\nlet is_ident_start = function\n | 'a'..'z' | 'A'..'Z' | '_' | '~' | '*' | '+' | '-'\n | '>' | '<' | '=' | '/' | '!' | '?' | '&' -> true\n | _ -> false\n\nlet is_ident_char = function\n | c when is_ident_start c -> true\n | '0'..'9' | '.' | ':' | '#' | ',' -> true\n | _ -> false\n\n(* Symbol reading uses ident_char; first char must be ident_start or digit/colon *)\nlet is_symbol_char = is_ident_char\n\nlet read_string s =\n (* s.pos is on the opening quote *)\n advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '\"' then Buffer.contents buf\n else if c = '\\\\' then begin\n if at_end s then raise (Parse_error \"Unterminated string escape\");\n let esc = s.src.[s.pos] in\n advance s;\n (match esc with\n | 'n' -> Buffer.add_char buf '\\n'\n | 't' -> Buffer.add_char buf '\\t'\n | 'r' -> Buffer.add_char buf '\\r'\n | '\"' -> Buffer.add_char buf '\"'\n | '\\\\' -> Buffer.add_char buf '\\\\'\n | 'u' ->\n (* \\uXXXX — read 4 hex digits, encode as UTF-8 *)\n if s.pos + 4 > s.len then raise (Parse_error \"Incomplete \\\\u escape\");\n let hex = String.sub s.src s.pos 4 in\n s.pos <- s.pos + 4;\n let code = int_of_string (\"0x\" ^ hex) in\n let ubuf = Buffer.create 4 in\n Buffer.add_utf_8_uchar ubuf (Uchar.of_int code);\n Buffer.add_string buf (Buffer.contents ubuf)\n | '`' -> Buffer.add_char buf '`'\n | _ -> Buffer.add_char buf '\\\\'; Buffer.add_char buf esc);\n go ()\n end else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n\nlet read_symbol s =\n let start = s.pos in\n while s.pos < s.len && is_symbol_char s.src.[s.pos] do advance s done;\n String.sub s.src start (s.pos - start)\n\nlet try_number str =\n match float_of_string_opt str with\n | Some n -> Some (Number n)\n | None -> None\n\nlet rec read_value s : value =\n skip_whitespace_and_comments s;\n if at_end s then begin\n let line = ref 1 in\n String.iter (fun c -> if c = '\\n' then incr line) s.src;\n raise (Parse_error (Printf.sprintf \"Unexpected end of input at line %d (pos %d)\" !line s.pos))\n end;\n match s.src.[s.pos] with\n | '(' -> read_list s ')'\n | '[' -> read_list s ']'\n | '{' -> read_dict s\n | '\"' -> String (read_string s)\n | '\\'' -> advance s; List [Symbol \"quote\"; read_value s]\n | '`' -> advance s; List [Symbol \"quasiquote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = ';' ->\n (* Datum comment: #; discards next expression *)\n advance s; advance s;\n ignore (read_value s);\n read_value s\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '\\'' ->\n (* Quote shorthand: #'expr -> (quote expr) *)\n advance s; advance s;\n List [Symbol \"quote\"; read_value s]\n | '#' when s.pos + 1 < s.len && s.src.[s.pos + 1] = '|' ->\n (* Raw string: #|...| — ends at next | *)\n advance s; advance s;\n let buf = Buffer.create 64 in\n let rec go () =\n if at_end s then raise (Parse_error \"Unterminated raw string\");\n let c = s.src.[s.pos] in\n advance s;\n if c = '|' then\n String (Buffer.contents buf)\n else begin\n Buffer.add_char buf c;\n go ()\n end\n in go ()\n | ',' ->\n (* Unquote / splice-unquote — matches spec: , always triggers unquote *)\n advance s;\n if s.pos < s.len && s.src.[s.pos] = '@' then begin\n advance s;\n List [Symbol \"splice-unquote\"; read_value s]\n end else\n List [Symbol \"unquote\"; read_value s]\n | _ ->\n begin\n (* Symbol, keyword, number, or boolean *)\n let token = read_symbol s in\n if token = \"\" then begin\n let line = ref 1 and col = ref 1 in\n for i = 0 to s.pos - 1 do\n if s.src.[i] = '\\n' then (incr line; col := 1) else incr col\n done;\n raise (Parse_error (Printf.sprintf \"Unexpected char: %c at line %d col %d (pos %d)\"\n s.src.[s.pos] !line !col s.pos))\n end;\n match token with\n | \"true\" -> Bool true\n | \"false\" -> Bool false\n | \"nil\" -> Nil\n | _ when token.[0] = ':' ->\n Keyword (String.sub token 1 (String.length token - 1))\n | _ ->\n match try_number token with\n | Some n -> n\n | None -> Symbol token\n end\n\nand read_list s close_char =\n advance s; (* skip opening paren/bracket *)\n let items = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated list\");\n if s.src.[s.pos] = close_char then begin\n advance s;\n List (List.rev !items)\n end else begin\n items := read_value s :: !items;\n go ()\n end\n in go ()\n\nand read_dict s =\n advance s; (* skip { *)\n let d = make_dict () in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then raise (Parse_error \"Unterminated dict\");\n if s.src.[s.pos] = '}' then begin\n advance s;\n Dict d\n end else begin\n let key = read_value s in\n let key_str = match key with\n | Keyword k -> k\n | String k -> k\n | Symbol k -> k\n | _ -> raise (Parse_error \"Dict key must be keyword, string, or symbol\")\n in\n let v = read_value s in\n dict_set d key_str v;\n go ()\n end\n in go ()\n\n\n(** Parse a string into a list of SX values. *)\nlet parse_all src =\n let s = make_state src in\n let results = ref [] in\n let rec go () =\n skip_whitespace_and_comments s;\n if at_end s then List.rev !results\n else begin\n results := read_value s :: !results;\n go ()\n end\n in go ()\n\n(** Parse a file into a list of SX values. *)\nlet parse_file path =\n let ic = open_in path in\n let n = in_channel_length ic in\n let src = really_input_string ic n in\n close_in ic;\n parse_all src\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}},{"offset":{"line":0,"column":215061},"map":{"version":3,"sources":["/workspace_root/lib/sx_render.ml","/builtin/blackbox.ml"],"sourcesContent":["(** HTML renderer for SX values.\n\n Extracted from run_tests.ml — renders an SX expression tree to an\n HTML string, expanding components and macros along the way.\n\n Depends on [Sx_ref.eval_expr] for evaluating sub-expressions\n during rendering (keyword arg values, conditionals, etc.). *)\n\nopen Sx_types\n\n(* ====================================================================== *)\n(* Tag / attribute registries *)\n(* ====================================================================== *)\n\nlet html_tags = [\n \"html\"; \"head\"; \"body\"; \"title\"; \"meta\"; \"link\"; \"script\"; \"style\"; \"noscript\";\n \"header\"; \"nav\"; \"main\"; \"section\"; \"article\"; \"aside\"; \"footer\";\n \"h1\"; \"h2\"; \"h3\"; \"h4\"; \"h5\"; \"h6\"; \"hgroup\";\n \"div\"; \"p\"; \"blockquote\"; \"pre\"; \"figure\"; \"figcaption\"; \"address\"; \"hr\";\n \"ul\"; \"ol\"; \"li\"; \"dl\"; \"dt\"; \"dd\"; \"menu\";\n \"a\"; \"span\"; \"em\"; \"strong\"; \"small\"; \"b\"; \"i\"; \"u\"; \"s\"; \"sub\"; \"sup\";\n \"mark\"; \"del\"; \"ins\"; \"q\"; \"cite\"; \"dfn\"; \"abbr\"; \"code\"; \"var\"; \"samp\";\n \"kbd\"; \"data\"; \"time\"; \"ruby\"; \"rt\"; \"rp\"; \"bdi\"; \"bdo\"; \"wbr\"; \"br\";\n \"table\"; \"thead\"; \"tbody\"; \"tfoot\"; \"tr\"; \"th\"; \"td\"; \"caption\"; \"colgroup\"; \"col\";\n \"form\"; \"input\"; \"textarea\"; \"select\"; \"option\"; \"optgroup\"; \"button\"; \"label\";\n \"fieldset\"; \"legend\"; \"datalist\"; \"output\"; \"progress\"; \"meter\";\n \"details\"; \"summary\"; \"dialog\";\n \"img\"; \"video\"; \"audio\"; \"source\"; \"picture\"; \"canvas\"; \"iframe\"; \"embed\"; \"object\"; \"param\";\n \"svg\"; \"path\"; \"circle\"; \"rect\"; \"line\"; \"polyline\"; \"polygon\"; \"ellipse\";\n \"g\"; \"defs\"; \"use\"; \"text\"; \"tspan\"; \"clipPath\"; \"mask\"; \"pattern\";\n \"linearGradient\"; \"radialGradient\"; \"stop\"; \"filter\"; \"feBlend\"; \"feFlood\";\n \"feGaussianBlur\"; \"feOffset\"; \"feMerge\"; \"feMergeNode\"; \"feComposite\";\n \"template\"; \"slot\";\n]\n\nlet void_elements = [\n \"area\"; \"base\"; \"br\"; \"col\"; \"embed\"; \"hr\"; \"img\"; \"input\";\n \"link\"; \"meta\"; \"param\"; \"source\"; \"track\"; \"wbr\"\n]\n\nlet boolean_attrs = [\n \"async\"; \"autofocus\"; \"autoplay\"; \"checked\"; \"controls\"; \"default\";\n \"defer\"; \"disabled\"; \"formnovalidate\"; \"hidden\"; \"inert\"; \"ismap\";\n \"loop\"; \"multiple\"; \"muted\"; \"nomodule\"; \"novalidate\"; \"open\";\n \"playsinline\"; \"readonly\"; \"required\"; \"reversed\"; \"selected\"\n]\n\nlet is_html_tag name = List.mem name html_tags\nlet is_void name = List.mem name void_elements\nlet is_boolean_attr name = List.mem name boolean_attrs\n\n\n(* ====================================================================== *)\n(* HTML escaping *)\n(* ====================================================================== *)\n\nlet escape_html s =\n let buf = Buffer.create (String.length s) in\n String.iter (function\n | '&' -> Buffer.add_string buf \"&\"\n | '<' -> Buffer.add_string buf \"<\"\n | '>' -> Buffer.add_string buf \">\"\n | '\"' -> Buffer.add_string buf \""\"\n | c -> Buffer.add_char buf c) s;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* Attribute rendering *)\n(* ====================================================================== *)\n\nlet render_attrs attrs =\n let buf = Buffer.create 64 in\n Hashtbl.iter (fun k v ->\n if is_boolean_attr k then begin\n if sx_truthy v then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k\n end\n end else if not (is_nil v) then begin\n Buffer.add_char buf ' ';\n Buffer.add_string buf k;\n Buffer.add_string buf \"=\\\"\";\n Buffer.add_string buf (escape_html (value_to_string v));\n Buffer.add_char buf '\"'\n end) attrs;\n Buffer.contents buf\n\n\n(* ====================================================================== *)\n(* HTML renderer *)\n(* ====================================================================== *)\n\n(* Forward ref — resolved at setup time *)\nlet render_to_html_ref : (value -> env -> string) ref =\n ref (fun _expr _env -> \"\")\n\nlet render_to_html expr env = !render_to_html_ref expr env\n\nlet render_children children env =\n String.concat \"\" (List.map (fun c -> render_to_html c env) children)\n\n(** Parse keyword attrs and positional children from an element call's args.\n Attrs are evaluated; children are returned UNEVALUATED for render dispatch. *)\nlet parse_element_args args env =\n let attrs = Hashtbl.create 8 in\n let children = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace attrs k v;\n skip := true\n | Spread pairs ->\n List.iter (fun (k, v) -> Hashtbl.replace attrs k v) pairs\n | _ ->\n children := arg :: !children\n ) args;\n (attrs, List.rev !children)\n\nlet render_html_element tag args env =\n let (attrs, children) = parse_element_args args env in\n let attr_str = render_attrs attrs in\n if is_void tag then\n \"<\" ^ tag ^ attr_str ^ \" />\"\n else\n let content = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n \"<\" ^ tag ^ attr_str ^ \">\" ^ content ^ \"\" ^ tag ^ \">\"\n\nlet render_component comp args env =\n match comp with\n | Component c ->\n let kwargs = Hashtbl.create 8 in\n let children_exprs = ref [] in\n let skip = ref false in\n let len = List.length args in\n List.iteri (fun idx arg ->\n if !skip then skip := false\n else match arg with\n | Keyword k when idx + 1 < len ->\n let v = Sx_ref.eval_expr (List.nth args (idx + 1)) (Env env) in\n Hashtbl.replace kwargs k v;\n skip := true\n | _ ->\n children_exprs := arg :: !children_exprs\n ) args;\n let children = List.rev !children_exprs in\n let local = env_merge c.c_closure env in\n List.iter (fun p ->\n let v = match Hashtbl.find_opt kwargs p with Some v -> v | None -> Nil in\n ignore (env_bind local p v)\n ) c.c_params;\n if c.c_has_children then begin\n let rendered_children = String.concat \"\"\n (List.map (fun c -> render_to_html c env) children) in\n ignore (env_bind local \"children\" (RawHTML rendered_children))\n end;\n render_to_html c.c_body local\n | _ -> \"\"\n\nlet expand_macro (m : macro) args _env =\n let local = env_extend m.m_closure in\n let params = m.m_params in\n let rec bind_params ps as' =\n match ps, as' with\n | [], rest ->\n (match m.m_rest_param with\n | Some rp -> ignore (env_bind local rp (List rest))\n | None -> ())\n | p :: ps_rest, a :: as_rest ->\n ignore (env_bind local p a);\n bind_params ps_rest as_rest\n | _ :: _, [] ->\n List.iter (fun p -> ignore (env_bind local p Nil)) (List.rev ps)\n in\n bind_params params args;\n Sx_ref.eval_expr m.m_body (Env local)\n\nlet rec do_render_to_html (expr : value) (env : env) : string =\n match expr with\n | Nil -> \"\"\n | Bool true -> \"true\"\n | Bool false -> \"false\"\n | Number n ->\n if Float.is_integer n then string_of_int (int_of_float n)\n else Printf.sprintf \"%g\" n\n | String s -> escape_html s\n | Keyword k -> escape_html k\n | RawHTML s -> s\n | Symbol s ->\n let v = Sx_ref.eval_expr (Symbol s) (Env env) in\n do_render_to_html v env\n | List [] | ListRef { contents = [] } -> \"\"\n | List (head :: args) | ListRef { contents = head :: args } ->\n render_list_to_html head args env\n | _ ->\n let v = Sx_ref.eval_expr expr (Env env) in\n do_render_to_html v env\n\nand render_list_to_html head args env =\n match head with\n | Symbol \"<>\" ->\n render_children args env\n | Symbol \"raw!\" ->\n (* Inject pre-rendered HTML without escaping *)\n let v = Sx_ref.eval_expr (List.hd args) (Env env) in\n (match v with\n | String s | RawHTML s -> s\n | _ -> value_to_string v)\n | Symbol tag when is_html_tag tag ->\n render_html_element tag args env\n | Symbol \"if\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n (if List.length args > 1 then do_render_to_html (List.nth args 1) env else \"\")\n else\n (if List.length args > 2 then do_render_to_html (List.nth args 2) env else \"\")\n | Symbol \"when\" ->\n let cond_val = Sx_ref.eval_expr (List.hd args) (Env env) in\n if sx_truthy cond_val then\n String.concat \"\" (List.map (fun e -> do_render_to_html e env) (List.tl args))\n else \"\"\n | Symbol \"cond\" ->\n render_cond args env\n | Symbol \"case\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol (\"let\" | \"let*\") ->\n render_let args env\n | Symbol (\"begin\" | \"do\") ->\n let rec go = function\n | [] -> \"\"\n | [last] -> do_render_to_html last env\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env env));\n go rest\n in go args\n | Symbol (\"define\" | \"defcomp\" | \"defmacro\" | \"defisland\") ->\n ignore (Sx_ref.eval_expr (List (head :: args)) (Env env));\n \"\"\n | Symbol \"map\" ->\n render_map args env false\n | Symbol \"map-indexed\" ->\n render_map args env true\n | Symbol \"filter\" ->\n let v = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html v env\n | Symbol \"for-each\" ->\n render_for_each args env\n | Symbol name ->\n (try\n let v = env_get env name in\n (match v with\n | Component c when c.c_affinity = \"client\" -> \"\" (* skip client-only *)\n | Component _ -> render_component v args env\n | Island _i ->\n (* Islands: SSR via the SX render-to-html from adapter-html.sx.\n It handles deref/signal/computed through the CEK correctly,\n and renders island bodies with hydration markers. *)\n (try\n let call_expr = List (Symbol name :: args) in\n let quoted = List [Symbol \"quote\"; call_expr] in\n let render_call = List [Symbol \"render-to-html\"; quoted; Env env] in\n let result = Sx_ref.eval_expr render_call (Env env) in\n (match result with\n | String s | RawHTML s -> s\n | _ -> value_to_string result)\n with e ->\n Printf.eprintf \"[ssr-island] ~%s FAILED: %s\\n%s\\n%!\" _i.i_name (Printexc.to_string e) (Printexc.get_backtrace ());\n \"\")\n | Macro m ->\n let expanded = expand_macro m args env in\n do_render_to_html expanded env\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n with Eval_error _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env)\n | _ ->\n let result = Sx_ref.eval_expr (List (head :: args)) (Env env) in\n do_render_to_html result env\n\nand render_cond args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let is_scheme = List.for_all (fun a -> match as_list a with\n | Some items when List.length items = 2 -> true\n | _ -> false) args\n in\n if is_scheme then begin\n let rec go = function\n | [] -> \"\"\n | clause :: rest ->\n (match as_list clause with\n | Some [test; body] ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n | _ -> \"\")\n in go args\n end else begin\n let rec go = function\n | [] -> \"\"\n | [_] -> \"\"\n | test :: body :: rest ->\n let is_else = match test with\n | Keyword \"else\" -> true\n | Symbol \"else\" | Symbol \":else\" -> true\n | _ -> false\n in\n if is_else then do_render_to_html body env\n else\n let v = Sx_ref.eval_expr test (Env env) in\n if sx_truthy v then do_render_to_html body env\n else go rest\n in go args\n end\n\nand render_let args env =\n let as_list = function List l | ListRef { contents = l } -> Some l | _ -> None in\n let bindings_expr = List.hd args in\n let body = List.tl args in\n let local = env_extend env in\n let bindings = match as_list bindings_expr with Some l -> l | None -> [] in\n let is_scheme = match bindings with\n | (List _ :: _) | (ListRef _ :: _) -> true\n | _ -> false\n in\n if is_scheme then\n List.iter (fun b ->\n match as_list b with\n | Some [Symbol name; expr] | Some [String name; expr] ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v)\n | _ -> ()\n ) bindings\n else begin\n let rec go = function\n | [] -> ()\n | (Symbol name) :: expr :: rest | (String name) :: expr :: rest ->\n let v = Sx_ref.eval_expr expr (Env local) in\n ignore (env_bind local name v);\n go rest\n | _ -> ()\n in go bindings\n end;\n let rec render_body = function\n | [] -> \"\"\n | [last] -> do_render_to_html last local\n | e :: rest ->\n ignore (Sx_ref.eval_expr e (Env local));\n render_body rest\n in render_body body\n\nand render_map args env indexed =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.mapi (fun i item ->\n let call_args = if indexed then [Number (float_of_int i); item] else [item] in\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params call_args;\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val call_args in\n do_render_to_html result env\n ) items)\n\nand render_for_each args env =\n let (fn_val, coll_val) = match args with\n | [a; b] ->\n let va = Sx_ref.eval_expr a (Env env) in\n let vb = Sx_ref.eval_expr b (Env env) in\n (match va, vb with\n | (Lambda _ | NativeFn _), _ -> (va, vb)\n | _, (Lambda _ | NativeFn _) -> (vb, va)\n | _ -> (va, vb))\n | _ -> (Nil, Nil)\n in\n let items = match coll_val with List l | ListRef { contents = l } -> l | _ -> [] in\n String.concat \"\" (List.map (fun item ->\n match fn_val with\n | Lambda l ->\n let local = env_extend l.l_closure in\n List.iter2 (fun p a -> ignore (env_bind local p a))\n l.l_params [item];\n do_render_to_html l.l_body local\n | _ ->\n let result = Sx_runtime.sx_call fn_val [item] in\n do_render_to_html result env\n ) items)\n\n\n(* ====================================================================== *)\n(* Setup — bind render primitives in an env and wire up the ref *)\n(* ====================================================================== *)\n\nlet setup_render_env env =\n render_to_html_ref := do_render_to_html;\n\n let bind name fn =\n ignore (env_bind env name (NativeFn (name, fn)))\n in\n\n bind \"render-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\");\n\n bind \"render-to-html\" (fun args ->\n match args with\n | [String src] ->\n let exprs = Sx_parser.parse_all src in\n let expr = match exprs with\n | [e] -> e\n | [] -> Nil\n | _ -> List (Symbol \"do\" :: exprs)\n in\n String (render_to_html expr env)\n | [expr] ->\n String (render_to_html expr env)\n | [expr; Env e] ->\n String (render_to_html expr e)\n | _ -> String \"\")\n","(* generated code *)"],"names":[],"mappings":"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","ignoreList":[1]}}]}
diff --git a/shared/static/wasm/sx_browser.bc.wasm.js b/shared/static/wasm/sx_browser.bc.wasm.js
new file mode 100644
index 00000000..94c0deb3
--- /dev/null
+++ b/shared/static/wasm/sx_browser.bc.wasm.js
@@ -0,0 +1,1821 @@
+(function(Object){
+ typeof globalThis !== "object"
+ &&
+ (this
+ ? get()
+ : (Object.defineProperty
+ (Object.prototype, "_T_", {configurable: true, get: get}),
+ _T_));
+ function get(){
+ var global = this || self;
+ global.globalThis = global;
+ delete Object.prototype._T_;
+ }
+ }
+ (Object));
+(js=>
+ async args=>{
+ "use strict";
+ const
+ {link, src, generated, disable_effects} = args,
+ isNode = globalThis.process?.versions?.node,
+ math =
+ {cos: Math.cos,
+ sin: Math.sin,
+ tan: Math.tan,
+ acos: Math.acos,
+ asin: Math.asin,
+ atan: Math.atan,
+ cosh: Math.cosh,
+ sinh: Math.sinh,
+ tanh: Math.tanh,
+ acosh: Math.acosh,
+ asinh: Math.asinh,
+ atanh: Math.atanh,
+ cbrt: Math.cbrt,
+ exp: Math.exp,
+ expm1: Math.expm1,
+ log: Math.log,
+ log1p: Math.log1p,
+ log2: Math.log2,
+ log10: Math.log10,
+ atan2: Math.atan2,
+ hypot: Math.hypot,
+ pow: Math.pow,
+ fmod: (x, y)=>x % y},
+ typed_arrays =
+ [Float32Array,
+ Float64Array,
+ Int8Array,
+ Uint8Array,
+ Int16Array,
+ Uint16Array,
+ Int32Array,
+ Int32Array,
+ Int32Array,
+ Int32Array,
+ Float32Array,
+ Float64Array,
+ Uint8Array,
+ Uint16Array,
+ Uint8ClampedArray],
+ fs = isNode && require("node:fs"),
+ fs_cst = fs?.constants,
+ access_flags =
+ fs ? [fs_cst.R_OK, fs_cst.W_OK, fs_cst.X_OK, fs_cst.F_OK] : [],
+ open_flags =
+ fs
+ ? [fs_cst.O_RDONLY,
+ fs_cst.O_WRONLY,
+ fs_cst.O_RDWR,
+ fs_cst.O_APPEND,
+ fs_cst.O_CREAT,
+ fs_cst.O_TRUNC,
+ fs_cst.O_EXCL,
+ fs_cst.O_NONBLOCK,
+ fs_cst.O_NOCTTY,
+ fs_cst.O_DSYNC,
+ fs_cst.O_SYNC]
+ : [];
+ var
+ out_channels =
+ {map: new WeakMap(),
+ set: new Set(),
+ finalization:
+ new FinalizationRegistry(ref=>out_channels.set.delete(ref))};
+ function register_channel(ch){
+ const ref = new WeakRef(ch);
+ out_channels.map.set(ch, ref);
+ out_channels.set.add(ref);
+ out_channels.finalization.register(ch, ref, ch);
+ }
+ function unregister_channel(ch){
+ const ref = out_channels.map.get(ch);
+ if(ref){
+ out_channels.map.delete(ch);
+ out_channels.set.delete(ref);
+ out_channels.finalization.unregister(ch);
+ }
+ }
+ function channel_list(){
+ return [...out_channels.set].map(ref=>ref.deref()).filter(ch=>ch);
+ }
+ var start_fiber;
+ function make_suspending(f){
+ return WebAssembly?.Suspending ? new WebAssembly.Suspending(f) : f;
+ }
+ function make_promising(f){
+ return ! disable_effects && WebAssembly?.promising && f
+ ? WebAssembly.promising(f)
+ : f;
+ }
+ const
+ decoder = new TextDecoder("utf-8", {ignoreBOM: 1}),
+ encoder = new TextEncoder();
+ function hash_int(h, d){
+ d = Math.imul(d, 0xcc9e2d51 | 0);
+ d = d << 15 | d >>> 17;
+ d = Math.imul(d, 0x1b873593);
+ h ^= d;
+ h = h << 13 | h >>> 19;
+ return (h + (h << 2) | 0) + (0xe6546b64 | 0) | 0;
+ }
+ function hash_string(h, s){
+ for(var i = 0; i < s.length; i++) h = hash_int(h, s.charCodeAt(i));
+ return h ^ s.length;
+ }
+ function getenv(n){
+ if(isNode && globalThis.process.env[n] !== undefined)
+ return globalThis.process.env[n];
+ return globalThis.jsoo_env?.[n];
+ }
+ let record_backtrace_flag = 0;
+ for(const l of getenv("OCAMLRUNPARAM")?.split(",") || []){
+ if(l === "b") record_backtrace_flag = 1;
+ if(l.startsWith("b=")) record_backtrace_flag = + l.slice(2) ? 1 : 0;
+ }
+ function alloc_stat(s, large){
+ var kind;
+ if(s.isFile())
+ kind = 0;
+ else if(s.isDirectory())
+ kind = 1;
+ else if(s.isCharacterDevice())
+ kind = 2;
+ else if(s.isBlockDevice())
+ kind = 3;
+ else if(s.isSymbolicLink())
+ kind = 4;
+ else if(s.isFIFO()) kind = 5; else if(s.isSocket()) kind = 6;
+ return caml_alloc_stat
+ (large,
+ s.dev,
+ s.ino | 0,
+ kind,
+ s.mode,
+ s.nlink,
+ s.uid,
+ s.gid,
+ s.rdev,
+ BigInt(s.size),
+ s.atimeMs / 1000,
+ s.mtimeMs / 1000,
+ s.ctimeMs / 1000);
+ }
+ const
+ on_windows = isNode && globalThis.process.platform === "win32",
+ call = Function.prototype.call,
+ DV = DataView.prototype,
+ bindings =
+ {jstag:
+ WebAssembly.JSTag
+ || new WebAssembly.Tag({parameters: ["externref"], results: []}),
+ identity: x=>x,
+ from_bool: x=>! ! x,
+ get: (x, y)=>x[y],
+ set: (x, y, z)=>x[y] = z,
+ delete: (x, y)=>delete x[y],
+ instanceof: (x, y)=>x instanceof y,
+ typeof: x=>typeof x,
+ equals: (x, y)=>x == y,
+ strict_equals: (x, y)=>x === y,
+ fun_call: (f, o, args)=>f.apply(o, args),
+ meth_call: (o, f, args)=>o[f].apply(o, args),
+ new_array: n=>new Array(n),
+ new_obj: ()=>({}),
+ new: (c, args)=>new c(...args),
+ global_this: globalThis,
+ iter_props:
+ (o, f)=>{for(var nm in o) if(Object.hasOwn(o, nm)) f(nm);},
+ array_length: a=>a.length,
+ array_get: (a, i)=>a[i],
+ array_set: (a, i, v)=>a[i] = v,
+ read_string: l=>decoder.decode(new Uint8Array(buffer, 0, l)),
+ read_string_stream:
+ (l, stream)=>
+ decoder.decode(new Uint8Array(buffer, 0, l), {stream: stream}),
+ append_string: (s1, s2)=>s1 + s2,
+ write_string:
+ s=>{
+ var start = 0, len = s.length;
+ for(;;){
+ const
+ {read, written} = encoder.encodeInto(s.slice(start), out_buffer);
+ len -= read;
+ if(! len) return written;
+ caml_extract_bytes(written);
+ start += read;
+ }},
+ ta_create: (k, sz)=>new typed_arrays[k](sz),
+ ta_normalize:
+ a=>
+ a instanceof Uint32Array
+ ? new Int32Array(a.buffer, a.byteOffset, a.length)
+ : a,
+ ta_kind: a=>typed_arrays.findIndex(c=>a instanceof c),
+ ta_length: a=>a.length,
+ ta_get_i32: (a, i)=>a[i],
+ ta_fill: (a, v)=>a.fill(v),
+ ta_blit: (s, d)=>d.set(s),
+ ta_subarray: (a, i, j)=>a.subarray(i, j),
+ ta_set: (a, b, i)=>a.set(b, i),
+ ta_new: len=>new Uint8Array(len),
+ ta_copy: (ta, t, s, e)=>ta.copyWithin(t, s, e),
+ ta_bytes:
+ a=>
+ new
+ Uint8Array
+ (a.buffer, a.byteOffset, a.length * a.BYTES_PER_ELEMENT),
+ ta_blit_from_bytes:
+ (s, p1, a, p2, l)=>{
+ for(let i = 0; i < l; i++) a[p2 + i] = bytes_get(s, p1 + i);},
+ ta_blit_to_bytes:
+ (a, p1, s, p2, l)=>{
+ for(let i = 0; i < l; i++) bytes_set(s, p2 + i, a[p1 + i]);},
+ dv_make: a=>new DataView(a.buffer, a.byteOffset, a.byteLength),
+ dv_get_f64: call.bind(DV.getFloat64),
+ dv_get_f32: call.bind(DV.getFloat32),
+ dv_get_i64: call.bind(DV.getBigInt64),
+ dv_get_i32: call.bind(DV.getInt32),
+ dv_get_i16: call.bind(DV.getInt16),
+ dv_get_ui16: call.bind(DV.getUint16),
+ dv_get_i8: call.bind(DV.getInt8),
+ dv_get_ui8: call.bind(DV.getUint8),
+ dv_set_f64: call.bind(DV.setFloat64),
+ dv_set_f32: call.bind(DV.setFloat32),
+ dv_set_i64: call.bind(DV.setBigInt64),
+ dv_set_i32: call.bind(DV.setInt32),
+ dv_set_i16: call.bind(DV.setInt16),
+ dv_set_i8: call.bind(DV.setInt8),
+ littleEndian: new Uint8Array(new Uint32Array([1]).buffer)[0],
+ wrap_callback:
+ f=>
+ function(...args){
+ if(args.length === 0) args = [undefined];
+ return caml_callback(f, args.length, args, 1);
+ },
+ wrap_callback_args:
+ f=>function(...args){return caml_callback(f, 1, [args], 0);},
+ wrap_callback_strict:
+ (arity, f)=>
+ function(...args){
+ args.length = arity;
+ return caml_callback(f, arity, args, 0);
+ },
+ wrap_callback_unsafe:
+ f=>function(...args){return caml_callback(f, args.length, args, 2);},
+ wrap_meth_callback:
+ f=>
+ function(...args){
+ args.unshift(this);
+ return caml_callback(f, args.length, args, 1);
+ },
+ wrap_meth_callback_args:
+ f=>function(...args){return caml_callback(f, 2, [this, args], 0);},
+ wrap_meth_callback_strict:
+ (arity, f)=>
+ function(...args){
+ args.length = arity;
+ args.unshift(this);
+ return caml_callback(f, args.length, args, 0);
+ },
+ wrap_meth_callback_unsafe:
+ f=>
+ function(...args){
+ args.unshift(this);
+ return caml_callback(f, args.length, args, 2);
+ },
+ wrap_fun_arguments: f=>function(...args){return f(args);},
+ format_float:
+ (prec, conversion, pad, x)=>{
+ function toFixed(x, dp){
+ if(Math.abs(x) < 1.0)
+ return x.toFixed(dp);
+ else{
+ var e = Number.parseInt(x.toString().split("+")[1]);
+ if(e > 20){
+ e -= 20;
+ x /= Math.pow(10, e);
+ x += new Array(e + 1).join("0");
+ if(dp > 0) x = x + "." + new Array(dp + 1).join("0");
+ return x;
+ }
+ else
+ return x.toFixed(dp);
+ }
+ }
+ switch(conversion){
+ case 0:
+ var s = x.toExponential(prec), i = s.length;
+ if(s.charAt(i - 3) === "e")
+ s = s.slice(0, i - 1) + "0" + s.slice(i - 1);
+ break;
+ case 1:
+ s = toFixed(x, prec); break;
+ case 2:
+ prec = prec ? prec : 1;
+ s = x.toExponential(prec - 1);
+ var j = s.indexOf("e"), exp = + s.slice(j + 1);
+ if(exp < - 4 || x >= 1e21 || x.toFixed(0).length > prec){
+ var i = j - 1;
+ while(s.charAt(i) === "0") i--;
+ if(s.charAt(i) === ".") i--;
+ s = s.slice(0, i + 1) + s.slice(j);
+ i = s.length;
+ if(s.charAt(i - 3) === "e")
+ s = s.slice(0, i - 1) + "0" + s.slice(i - 1);
+ break;
+ }
+ else{
+ var p = prec;
+ if(exp < 0){
+ p -= exp + 1;
+ s = x.toFixed(p);
+ }
+ else
+ while(s = x.toFixed(p), s.length > prec + 1) p--;
+ if(p){
+ var i = s.length - 1;
+ while(s.charAt(i) === "0") i--;
+ if(s.charAt(i) === ".") i--;
+ s = s.slice(0, i + 1);
+ }
+ }
+ break;
+ }
+ return pad ? " " + s : s;},
+ gettimeofday: ()=>new Date().getTime() / 1000,
+ times:
+ ()=>{
+ if(globalThis.process?.cpuUsage){
+ var t = globalThis.process.cpuUsage();
+ return caml_alloc_times(t.user / 1e6, t.system / 1e6);
+ }
+ else{
+ var t = performance.now() / 1000;
+ return caml_alloc_times(t, 0);
+ }},
+ gmtime:
+ t=>{
+ var
+ d = new Date(t * 1000),
+ d_num = d.getTime(),
+ januaryfirst =
+ new Date(Date.UTC(d.getUTCFullYear(), 0, 1)).getTime(),
+ doy = Math.floor((d_num - januaryfirst) / 86400000);
+ return caml_alloc_tm
+ (d.getUTCSeconds(),
+ d.getUTCMinutes(),
+ d.getUTCHours(),
+ d.getUTCDate(),
+ d.getUTCMonth(),
+ d.getUTCFullYear() - 1900,
+ d.getUTCDay(),
+ doy,
+ false);},
+ localtime:
+ t=>{
+ var
+ d = new Date(t * 1000),
+ d_num = d.getTime(),
+ januaryfirst = new Date(d.getFullYear(), 0, 1).getTime(),
+ doy = Math.floor((d_num - januaryfirst) / 86400000),
+ jan = new Date(d.getFullYear(), 0, 1),
+ jul = new Date(d.getFullYear(), 6, 1),
+ stdTimezoneOffset =
+ Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
+ return caml_alloc_tm
+ (d.getSeconds(),
+ d.getMinutes(),
+ d.getHours(),
+ d.getDate(),
+ d.getMonth(),
+ d.getFullYear() - 1900,
+ d.getDay(),
+ doy,
+ d.getTimezoneOffset() < stdTimezoneOffset);},
+ mktime:
+ (year, month, day, h, m, s)=>
+ new Date(year, month, day, h, m, s).getTime(),
+ random_seed: ()=>crypto.getRandomValues(new Int32Array(12)),
+ access:
+ (p, flags)=>
+ fs.accessSync
+ (p,
+ access_flags.reduce((f, v, i)=>flags & 1 << i ? f | v : f, 0)),
+ open:
+ (p, flags, perm)=>
+ fs.openSync
+ (p,
+ open_flags.reduce((f, v, i)=>flags & 1 << i ? f | v : f, 0),
+ perm),
+ close: fd=>fs.closeSync(fd),
+ write:
+ (fd, b, o, l, p)=>
+ fs
+ ? fs.writeSync(fd, b, o, l, p === null ? p : Number(p))
+ : (console
+ [fd === 2 ? "error" : "log"]
+ (typeof b === "string"
+ ? b
+ : decoder.decode(b.slice(o, o + l))),
+ l),
+ read: (fd, b, o, l, p)=>fs.readSync(fd, b, o, l, p),
+ fsync: fd=>fs.fsyncSync(fd),
+ file_size: fd=>fs.fstatSync(fd, {bigint: true}).size,
+ register_channel: register_channel,
+ unregister_channel: unregister_channel,
+ channel_list: channel_list,
+ exit: n=>isNode && globalThis.process.exit(n),
+ argv: ()=>isNode ? globalThis.process.argv.slice(1) : ["a.out"],
+ on_windows: + on_windows,
+ getenv: getenv,
+ backtrace_status: ()=>record_backtrace_flag,
+ record_backtrace: b=>record_backtrace_flag = b,
+ system:
+ c=>{
+ var
+ res =
+ require("node:child_process").spawnSync
+ (c, {shell: true, stdio: "inherit"});
+ if(res.error) throw res.error;
+ return res.signal ? 255 : res.status;},
+ isatty: fd=>+ require("node:tty").isatty(fd),
+ time: ()=>performance.now(),
+ getcwd: ()=>isNode ? globalThis.process.cwd() : "/static",
+ chdir: x=>globalThis.process.chdir(x),
+ mkdir: (p, m)=>fs.mkdirSync(p, m),
+ rmdir: p=>fs.rmdirSync(p),
+ link: (d, s)=>fs.linkSync(d, s),
+ symlink:
+ (t, p, kind)=>fs.symlinkSync(t, p, [null, "file", "dir"][kind]),
+ readlink: p=>fs.readlinkSync(p),
+ unlink: p=>fs.unlinkSync(p),
+ read_dir: p=>fs.readdirSync(p),
+ opendir: p=>fs.opendirSync(p),
+ readdir:
+ d=>{var n = d.readSync()?.name; return n === undefined ? null : n;},
+ closedir: d=>d.closeSync(),
+ stat: (p, l)=>alloc_stat(fs.statSync(p), l),
+ lstat: (p, l)=>alloc_stat(fs.lstatSync(p), l),
+ fstat: (fd, l)=>alloc_stat(fs.fstatSync(fd), l),
+ chmod: (p, perms)=>fs.chmodSync(p, perms),
+ fchmod: (p, perms)=>fs.fchmodSync(p, perms),
+ file_exists: p=>+ fs.existsSync(p),
+ is_directory: p=>+ fs.lstatSync(p).isDirectory(),
+ is_file: p=>+ fs.lstatSync(p).isFile(),
+ utimes: (p, a, m)=>fs.utimesSync(p, a, m),
+ truncate: (p, l)=>fs.truncateSync(p, l),
+ ftruncate: (fd, l)=>fs.ftruncateSync(fd, l),
+ rename:
+ (o, n)=>{
+ var n_stat;
+ if
+ (on_windows && (n_stat = fs.statSync(n, {throwIfNoEntry: false}))
+ && fs.statSync(o, {throwIfNoEntry: false})?.isDirectory())
+ if(n_stat.isDirectory()){
+ if(! n.startsWith(o)) try{fs.rmdirSync(n);}catch{}
+ }
+ else{
+ var
+ e =
+ new Error(`ENOTDIR: not a directory, rename '${o}' -> '${n}'`);
+ throw Object.assign
+ (e,
+ {errno: - 20, code: "ENOTDIR", syscall: "rename", path: n});
+ }
+ fs.renameSync(o, n);},
+ tmpdir: ()=>require("node:os").tmpdir(),
+ start_fiber: x=>start_fiber(x),
+ suspend_fiber: make_suspending((f, env)=>new Promise(k=>f(k, env))),
+ resume_fiber: (k, v)=>k(v),
+ weak_new: v=>new WeakRef(v),
+ weak_deref:
+ w=>{var v = w.deref(); return v === undefined ? null : v;},
+ weak_map_new: ()=>new WeakMap(),
+ map_new: ()=>new Map(),
+ map_get:
+ (m, x)=>{var v = m.get(x); return v === undefined ? null : v;},
+ map_set: (m, x, v)=>m.set(x, v),
+ map_delete: (m, x)=>m.delete(x),
+ hash_string: hash_string,
+ log: x=>console.log(x)},
+ string_ops =
+ {test: v=>+ (typeof v === "string"),
+ compare: (s1, s2)=>s1 < s2 ? - 1 : + (s1 > s2),
+ decodeStringFromUTF8Array: ()=>"",
+ encodeStringToUTF8Array: ()=>0,
+ fromCharCodeArray: ()=>""},
+ imports =
+ Object.assign
+ ({Math: math,
+ bindings: bindings,
+ js: js,
+ "wasm:js-string": string_ops,
+ "wasm:text-decoder": string_ops,
+ "wasm:text-encoder": string_ops,
+ str: new globalThis.Proxy({}, {get(_, prop){return prop;}}),
+ env: {}},
+ generated),
+ options =
+ {builtins: ["js-string", "text-decoder", "text-encoder"],
+ importedStringConstants: "str"};
+ function loadRelative(src){
+ const
+ path = require("node:path"),
+ f = path.join(path.dirname(require.main.filename), src);
+ return require("node:fs/promises").readFile(f);
+ }
+ const fetchBase = globalThis?.document?.currentScript?.src;
+ function fetchRelative(src){
+ const url = fetchBase ? new URL(src, fetchBase) : src;
+ return fetch(url);
+ }
+ const loadCode = isNode ? loadRelative : fetchRelative;
+ async function instantiateModule(code){
+ return isNode
+ ? WebAssembly.instantiate(await code, imports, options)
+ : WebAssembly.instantiateStreaming(code, imports, options);
+ }
+ async function instantiateFromDir(){
+ imports.OCaml = {};
+ const deps = [];
+ async function loadModule(module, isRuntime){
+ const sync = module[1].constructor !== Array;
+ async function instantiate(){
+ const code = loadCode(src + "/" + module[0] + ".wasm");
+ await Promise.all(sync ? deps : module[1].map(i=>deps[i]));
+ const wasmModule = await instantiateModule(code);
+ Object.assign
+ (isRuntime ? imports.env : imports.OCaml,
+ wasmModule.instance.exports);
+ }
+ const promise = instantiate();
+ deps.push(promise);
+ return promise;
+ }
+ async function loadModules(lst){
+ for(const module of lst) await loadModule(module);
+ }
+ await loadModule(link[0], 1);
+ if(link.length > 1){
+ await loadModule(link[1]);
+ const
+ workers = new Array(20).fill(link.slice(2).values()).map(loadModules);
+ await Promise.all(workers);
+ }
+ return {instance: {exports: Object.assign(imports.env, imports.OCaml)}};
+ }
+ const wasmModule = await instantiateFromDir();
+ var
+ {caml_callback,
+ caml_alloc_times,
+ caml_alloc_tm,
+ caml_alloc_stat,
+ caml_start_fiber,
+ caml_handle_uncaught_exception,
+ caml_buffer,
+ caml_extract_bytes,
+ bytes_get,
+ bytes_set,
+ _initialize}
+ = wasmModule.instance.exports,
+ buffer = caml_buffer?.buffer,
+ out_buffer = buffer && new Uint8Array(buffer, 0, buffer.length);
+ start_fiber = make_promising(caml_start_fiber);
+ var _initialize = make_promising(_initialize);
+ if(globalThis.process?.on)
+ globalThis.process.on
+ ("uncaughtException",
+ (err, _origin)=>caml_handle_uncaught_exception(err));
+ else if(globalThis.addEventListener)
+ globalThis.addEventListener
+ ("error",
+ event=>event.error && caml_handle_uncaught_exception(event.error));
+ await _initialize();})
+ (function(globalThis){
+ "use strict";
+ var
+ blake2b =
+ function(){
+ function ADD64AA(v, a, b){
+ const o0 = v[a] + v[b];
+ let o1 = v[a + 1] + v[b + 1];
+ if(o0 >= 0x100000000) o1++;
+ v[a] = o0;
+ v[a + 1] = o1;
+ }
+ function ADD64AC(v, a, b0, b1){
+ let o0 = v[a] + b0;
+ if(b0 < 0) o0 += 0x100000000;
+ let o1 = v[a + 1] + b1;
+ if(o0 >= 0x100000000) o1++;
+ v[a] = o0;
+ v[a + 1] = o1;
+ }
+ function B2B_GET32(arr, i){
+ return arr[i] ^ arr[i + 1] << 8 ^ arr[i + 2] << 16
+ ^ arr[i + 3] << 24;
+ }
+ function B2B_G(a, b, c, d, ix, iy){
+ const x0 = m[ix], x1 = m[ix + 1], y0 = m[iy], y1 = m[iy + 1];
+ ADD64AA(v, a, b);
+ ADD64AC(v, a, x0, x1);
+ let xor0 = v[d] ^ v[a], xor1 = v[d + 1] ^ v[a + 1];
+ v[d] = xor1;
+ v[d + 1] = xor0;
+ ADD64AA(v, c, d);
+ xor0 = v[b] ^ v[c];
+ xor1 = v[b + 1] ^ v[c + 1];
+ v[b] = xor0 >>> 24 ^ xor1 << 8;
+ v[b + 1] = xor1 >>> 24 ^ xor0 << 8;
+ ADD64AA(v, a, b);
+ ADD64AC(v, a, y0, y1);
+ xor0 = v[d] ^ v[a];
+ xor1 = v[d + 1] ^ v[a + 1];
+ v[d] = xor0 >>> 16 ^ xor1 << 16;
+ v[d + 1] = xor1 >>> 16 ^ xor0 << 16;
+ ADD64AA(v, c, d);
+ xor0 = v[b] ^ v[c];
+ xor1 = v[b + 1] ^ v[c + 1];
+ v[b] = xor1 >>> 31 ^ xor0 << 1;
+ v[b + 1] = xor0 >>> 31 ^ xor1 << 1;
+ }
+ const
+ BLAKE2B_IV32 =
+ new
+ Uint32Array
+ ([0xf3bcc908,
+ 0x6a09e667,
+ 0x84caa73b,
+ 0xbb67ae85,
+ 0xfe94f82b,
+ 0x3c6ef372,
+ 0x5f1d36f1,
+ 0xa54ff53a,
+ 0xade682d1,
+ 0x510e527f,
+ 0x2b3e6c1f,
+ 0x9b05688c,
+ 0xfb41bd6b,
+ 0x1f83d9ab,
+ 0x137e2179,
+ 0x5be0cd19]),
+ SIGMA8 =
+ [0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 14,
+ 10,
+ 4,
+ 8,
+ 9,
+ 15,
+ 13,
+ 6,
+ 1,
+ 12,
+ 0,
+ 2,
+ 11,
+ 7,
+ 5,
+ 3,
+ 11,
+ 8,
+ 12,
+ 0,
+ 5,
+ 2,
+ 15,
+ 13,
+ 10,
+ 14,
+ 3,
+ 6,
+ 7,
+ 1,
+ 9,
+ 4,
+ 7,
+ 9,
+ 3,
+ 1,
+ 13,
+ 12,
+ 11,
+ 14,
+ 2,
+ 6,
+ 5,
+ 10,
+ 4,
+ 0,
+ 15,
+ 8,
+ 9,
+ 0,
+ 5,
+ 7,
+ 2,
+ 4,
+ 10,
+ 15,
+ 14,
+ 1,
+ 11,
+ 12,
+ 6,
+ 8,
+ 3,
+ 13,
+ 2,
+ 12,
+ 6,
+ 10,
+ 0,
+ 11,
+ 8,
+ 3,
+ 4,
+ 13,
+ 7,
+ 5,
+ 15,
+ 14,
+ 1,
+ 9,
+ 12,
+ 5,
+ 1,
+ 15,
+ 14,
+ 13,
+ 4,
+ 10,
+ 0,
+ 7,
+ 6,
+ 3,
+ 9,
+ 2,
+ 8,
+ 11,
+ 13,
+ 11,
+ 7,
+ 14,
+ 12,
+ 1,
+ 3,
+ 9,
+ 5,
+ 0,
+ 15,
+ 4,
+ 8,
+ 6,
+ 2,
+ 10,
+ 6,
+ 15,
+ 14,
+ 9,
+ 11,
+ 3,
+ 0,
+ 8,
+ 12,
+ 2,
+ 13,
+ 7,
+ 1,
+ 4,
+ 10,
+ 5,
+ 10,
+ 2,
+ 8,
+ 4,
+ 7,
+ 6,
+ 1,
+ 5,
+ 15,
+ 11,
+ 9,
+ 14,
+ 3,
+ 12,
+ 13,
+ 0,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 14,
+ 10,
+ 4,
+ 8,
+ 9,
+ 15,
+ 13,
+ 6,
+ 1,
+ 12,
+ 0,
+ 2,
+ 11,
+ 7,
+ 5,
+ 3],
+ SIGMA82 = new Uint8Array(SIGMA8.map(function(x){return x * 2;})),
+ v = new Uint32Array(32),
+ m = new Uint32Array(32);
+ function blake2bCompress(ctx, last){
+ let i = 0;
+ for(i = 0; i < 16; i++){
+ v[i] = ctx.h[i];
+ v[i + 16] = BLAKE2B_IV32[i];
+ }
+ v[24] = v[24] ^ ctx.t;
+ v[25] = v[25] ^ ctx.t / 0x100000000;
+ if(last){v[28] = ~ v[28]; v[29] = ~ v[29];}
+ for(i = 0; i < 32; i++) m[i] = B2B_GET32(ctx.b, 4 * i);
+ for(i = 0; i < 12; i++){
+ B2B_G(0, 8, 16, 24, SIGMA82[i * 16 + 0], SIGMA82[i * 16 + 1]);
+ B2B_G(2, 10, 18, 26, SIGMA82[i * 16 + 2], SIGMA82[i * 16 + 3]);
+ B2B_G(4, 12, 20, 28, SIGMA82[i * 16 + 4], SIGMA82[i * 16 + 5]);
+ B2B_G(6, 14, 22, 30, SIGMA82[i * 16 + 6], SIGMA82[i * 16 + 7]);
+ B2B_G(0, 10, 20, 30, SIGMA82[i * 16 + 8], SIGMA82[i * 16 + 9]);
+ B2B_G(2, 12, 22, 24, SIGMA82[i * 16 + 10], SIGMA82[i * 16 + 11]);
+ B2B_G(4, 14, 16, 26, SIGMA82[i * 16 + 12], SIGMA82[i * 16 + 13]);
+ B2B_G(6, 8, 18, 28, SIGMA82[i * 16 + 14], SIGMA82[i * 16 + 15]);
+ }
+ for(i = 0; i < 16; i++) ctx.h[i] = ctx.h[i] ^ v[i] ^ v[i + 16];
+ }
+ const
+ parameterBlock =
+ new
+ Uint8Array
+ ([0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0]);
+ function blake2bInit(outlen, key){
+ if(outlen === 0 || outlen > 64)
+ throw new Error("Illegal output length, expected 0 < length <= 64");
+ if(key.length > 64)
+ throw new
+ Error
+ ("Illegal key, expected Uint8Array with 0 < length <= 64");
+ const
+ ctx =
+ {b: new Uint8Array(128),
+ h: new Uint32Array(16),
+ t: 0,
+ c: 0,
+ outlen: outlen};
+ parameterBlock.fill(0);
+ parameterBlock[0] = outlen;
+ parameterBlock[1] = key.length;
+ parameterBlock[2] = 1;
+ parameterBlock[3] = 1;
+ for(let i = 0; i < 16; i++)
+ ctx.h[i] = BLAKE2B_IV32[i] ^ B2B_GET32(parameterBlock, i * 4);
+ if(key.length > 0){blake2bUpdate(ctx, key); ctx.c = 128;}
+ return ctx;
+ }
+ function blake2bUpdate(ctx, input){
+ for(let i = 0; i < input.length; i++){
+ if(ctx.c === 128){
+ ctx.t += ctx.c;
+ blake2bCompress(ctx, false);
+ ctx.c = 0;
+ }
+ ctx.b[ctx.c++] = input[i];
+ }
+ }
+ function blake2bFinal(ctx){
+ ctx.t += ctx.c;
+ while(ctx.c < 128) ctx.b[ctx.c++] = 0;
+ blake2bCompress(ctx, true);
+ const out = new Uint8Array(ctx.outlen);
+ for(let i = 0; i < ctx.outlen; i++)
+ out[i] = ctx.h[i >> 2] >> 8 * (i & 3);
+ return out;
+ }
+ return {Init: blake2bInit,
+ Update: blake2bUpdate,
+ Final: blake2bFinal};
+ }
+ ();
+ function caml_ml_string_length(s){return s.length;}
+ function caml_string_unsafe_get(s, i){return s.charCodeAt(i);}
+ function caml_uint8_array_of_string(s){
+ var l = caml_ml_string_length(s), a = new Uint8Array(l), i = 0;
+ for(; i < l; i++) a[i] = caml_string_unsafe_get(s, i);
+ return a;
+ }
+ function caml_blake2_create(hashlen, key){
+ key = caml_uint8_array_of_string(key);
+ if(key.length > 64) key.subarray(0, 64);
+ return blake2b.Init(hashlen, key);
+ }
+ function caml_string_of_jsbytes(x){return x;}
+ function blake2_js_for_wasm_create(hashlen, key){
+ const key_jsoo_string = caml_string_of_jsbytes(key);
+ return caml_blake2_create(hashlen, key_jsoo_string);
+ }
+ function caml_sub_uint8_array_to_jsbytes(a, i, len){
+ var f = String.fromCharCode;
+ if(i === 0 && len <= 4096 && len === a.length) return f.apply(null, a);
+ var s = "";
+ for(; 0 < len; i += 1024, len -= 1024)
+ s += f.apply(null, a.subarray(i, i + Math.min(len, 1024)));
+ return s;
+ }
+ function caml_string_of_uint8_array(a){
+ return caml_sub_uint8_array_to_jsbytes(a, 0, a.length);
+ }
+ function caml_blake2_final(ctx, _hashlen){
+ var r = blake2b.Final(ctx);
+ return caml_string_of_uint8_array(r);
+ }
+ function caml_jsbytes_of_string(x){return x;}
+ function blake2_js_for_wasm_final(ctx, hashlen){
+ return caml_jsbytes_of_string(caml_blake2_final(ctx, hashlen));
+ }
+ function caml_blake2_update(ctx, buf, ofs, len){
+ var input = caml_uint8_array_of_string(buf);
+ input = input.subarray(ofs, ofs + len);
+ blake2b.Update(ctx, input);
+ return 0;
+ }
+ function blake2_js_for_wasm_update(ctx, buf, ofs, len){
+ const buf_jsoo_string = caml_string_of_jsbytes(buf);
+ return caml_blake2_update(ctx, buf_jsoo_string, ofs, len);
+ }
+ function caml_js_html_entities(s){
+ var entity = /^?[0-9a-zA-Z]+;$/;
+ if(s.match(entity)){
+ var str, temp = document.createElement("p");
+ temp.innerHTML = s;
+ str = temp.textContent || temp.innerText;
+ temp = null;
+ return str;
+ }
+ else
+ return null;
+ }
+ var caml_js_regexps = {amp: /&/g, lt: /= 0){
+ const code = unix_error[errno];
+ return util.getSystemErrorMap().entries().find(x=>x[1][0] === code)[1]
+ [1];
+ }
+ else
+ return util.getSystemErrorMessage(errno);
+ }
+ var
+ zstd_decompress =
+ function(){
+ var
+ ab = ArrayBuffer,
+ u8 = Uint8Array,
+ u16 = Uint16Array,
+ i16 = Int16Array,
+ i32 = Int32Array;
+ function slc(v, s, e){
+ if(u8.prototype.slice) return u8.prototype.slice.call(v, s, e);
+ if(s == null || s < 0) s = 0;
+ if(e == null || e > v.length) e = v.length;
+ var n = new u8(e - s);
+ n.set(v.subarray(s, e));
+ return n;
+ }
+ function fill(v, n, s, e){
+ if(u8.prototype.fill) return u8.prototype.fill.call(v, n, s, e);
+ if(s == null || s < 0) s = 0;
+ if(e == null || e > v.length) e = v.length;
+ for(; s < e; ++s) v[s] = n;
+ return v;
+ }
+ function cpw(v, t, s, e){
+ if(u8.prototype.copyWithin)
+ return u8.prototype.copyWithin.call(v, t, s, e);
+ if(s == null || s < 0) s = 0;
+ if(e == null || e > v.length) e = v.length;
+ while(s < e) v[t++] = v[s++];
+ }
+ var
+ ec =
+ ["invalid zstd data",
+ "window size too large (>2046MB)",
+ "invalid block type",
+ "FSE accuracy too high",
+ "match distance too far back",
+ "unexpected EOF"];
+ function err(ind, msg, nt){
+ var e = new Error(msg || ec[ind]);
+ e.code = ind;
+ if(! nt) throw e;
+ return e;
+ }
+ function rb(d, b, n){
+ var i = 0, o = 0;
+ for(; i < n; ++i) o |= d[b++] << (i << 3);
+ return o;
+ }
+ function b4(d, b){
+ return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24)
+ >>> 0;
+ }
+ function rzfh(dat, w){
+ var n3 = dat[0] | dat[1] << 8 | dat[2] << 16;
+ if(n3 === 0x2fb528 && dat[3] === 253){
+ var
+ flg = dat[4],
+ ss = flg >> 5 & 1,
+ cc = flg >> 2 & 1,
+ df = flg & 3,
+ fcf = flg >> 6;
+ if(flg & 8) err(0);
+ var bt = 6 - ss, db = df === 3 ? 4 : df, di = rb(dat, bt, db);
+ bt += db;
+ var
+ fsb = fcf ? 1 << fcf : ss,
+ fss = rb(dat, bt, fsb) + (fcf === 1 && 256),
+ ws = fss;
+ if(! ss){
+ var wb = 1 << 10 + (dat[5] >> 3);
+ ws = wb + (wb >> 3) * (dat[5] & 7);
+ }
+ if(ws > 2145386496) err(1);
+ var buf = new u8((w === 1 ? fss || ws : w ? 0 : ws) + 12);
+ buf[0] = 1, buf[4] = 4, buf[8] = 8;
+ return {b: bt + fsb,
+ y: 0,
+ l: 0,
+ d: di,
+ w: w && w !== 1 ? w : buf.subarray(12),
+ e: ws,
+ o: new i32(buf.buffer, 0, 3),
+ u: fss,
+ c: cc,
+ m: Math.min(131072, ws)};
+ }
+ else if((n3 >> 4 | dat[3] << 20) === 0x184d2a5)
+ return b4(dat, 4) + 8;
+ err(0);
+ }
+ function msb(val){
+ var bits = 0;
+ for(; 1 << bits <= val; ++bits) ;
+ return bits - 1;
+ }
+ function rfse(dat, bt, mal){
+ var tpos = (bt << 3) + 4, al = (dat[bt] & 15) + 5;
+ if(al > mal) err(3);
+ var
+ sz = 1 << al,
+ probs = sz,
+ sym = - 1,
+ re = - 1,
+ i = - 1,
+ ht = sz,
+ buf = new ab(512 + (sz << 2)),
+ freq = new i16(buf, 0, 256),
+ dstate = new u16(buf, 0, 256),
+ nstate = new u16(buf, 512, sz),
+ bb1 = 512 + (sz << 1),
+ syms = new u8(buf, bb1, sz),
+ nbits = new u8(buf, bb1 + sz);
+ while(sym < 255 && probs > 0){
+ var
+ bits = msb(probs + 1),
+ cbt = tpos >> 3,
+ msk = (1 << bits + 1) - 1,
+ val =
+ (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16)
+ >> (tpos & 7)
+ & msk,
+ msk1fb = (1 << bits) - 1,
+ msv = msk - probs - 1,
+ sval = val & msk1fb;
+ if(sval < msv)
+ tpos += bits, val = sval;
+ else{tpos += bits + 1; if(val > msk1fb) val -= msv;}
+ freq[++sym] = --val;
+ if(val === - 1){probs += val; syms[--ht] = sym;} else probs -= val;
+ if(! val)
+ do{
+ var rbt = tpos >> 3;
+ re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3;
+ tpos += 2;
+ sym += re;
+ }
+ while
+ (re === 3);
+ }
+ if(sym > 255 || probs) err(0);
+ var sympos = 0, sstep = (sz >> 1) + (sz >> 3) + 3, smask = sz - 1;
+ for(var s = 0; s <= sym; ++s){
+ var sf = freq[s];
+ if(sf < 1){dstate[s] = - sf; continue;}
+ for(i = 0; i < sf; ++i){
+ syms[sympos] = s;
+ do sympos = sympos + sstep & smask;while(sympos >= ht);
+ }
+ }
+ if(sympos) err(0);
+ for(i = 0; i < sz; ++i){
+ var ns = dstate[syms[i]]++, nb = nbits[i] = al - msb(ns);
+ nstate[i] = (ns << nb) - sz;
+ }
+ return [tpos + 7 >> 3, {b: al, s: syms, n: nbits, t: nstate}];
+ }
+ function rhu(dat, bt){
+ var
+ i = 0,
+ wc = - 1,
+ buf = new u8(292),
+ hb = dat[bt],
+ hw = buf.subarray(0, 256),
+ rc = buf.subarray(256, 268),
+ ri = new u16(buf.buffer, 268);
+ if(hb < 128){
+ var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];
+ bt += hb;
+ var epos = ebt << 3, lb = dat[bt];
+ if(! lb) err(0);
+ var
+ st1 = 0,
+ st2 = 0,
+ btr1 = fdt.b,
+ btr2 = btr1,
+ fpos = (++bt << 3) - 8 + msb(lb);
+ for(;;){
+ fpos -= btr1;
+ if(fpos < epos) break;
+ var cbt = fpos >> 3;
+ st1 +=
+ (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1;
+ hw[++wc] = fdt.s[st1];
+ fpos -= btr2;
+ if(fpos < epos) break;
+ cbt = fpos >> 3;
+ st2 +=
+ (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1;
+ hw[++wc] = fdt.s[st2];
+ btr1 = fdt.n[st1];
+ st1 = fdt.t[st1];
+ btr2 = fdt.n[st2];
+ st2 = fdt.t[st2];
+ }
+ if(++wc > 255) err(0);
+ }
+ else{
+ wc = hb - 127;
+ for(; i < wc; i += 2){
+ var byte = dat[++bt];
+ hw[i] = byte >> 4;
+ hw[i + 1] = byte & 15;
+ }
+ ++bt;
+ }
+ var wes = 0;
+ for(i = 0; i < wc; ++i){
+ var wt = hw[i];
+ if(wt > 11) err(0);
+ wes += wt && 1 << wt - 1;
+ }
+ var mb = msb(wes) + 1, ts = 1 << mb, rem = ts - wes;
+ if(rem & rem - 1) err(0);
+ hw[wc++] = msb(rem) + 1;
+ for(i = 0; i < wc; ++i){
+ var wt = hw[i];
+ ++rc[hw[i] = wt && mb + 1 - wt];
+ }
+ var
+ hbuf = new u8(ts << 1),
+ syms = hbuf.subarray(0, ts),
+ nb = hbuf.subarray(ts);
+ ri[mb] = 0;
+ for(i = mb; i > 0; --i){
+ var pv = ri[i];
+ fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i));
+ }
+ if(ri[0] !== ts) err(0);
+ for(i = 0; i < wc; ++i){
+ var bits = hw[i];
+ if(bits){
+ var code = ri[bits];
+ fill(syms, i, code, ri[bits] = code + (1 << mb - bits));
+ }
+ }
+ return [bt, {n: nb, b: mb, s: syms}];
+ }
+ var
+ dllt =
+ rfse
+ (new
+ u8
+ ([81,
+ 16,
+ 99,
+ 140,
+ 49,
+ 198,
+ 24,
+ 99,
+ 12,
+ 33,
+ 196,
+ 24,
+ 99,
+ 102,
+ 102,
+ 134,
+ 70,
+ 146,
+ 4]),
+ 0,
+ 6)
+ [1],
+ dmlt =
+ rfse
+ (new
+ u8
+ ([33,
+ 20,
+ 196,
+ 24,
+ 99,
+ 140,
+ 33,
+ 132,
+ 16,
+ 66,
+ 8,
+ 33,
+ 132,
+ 16,
+ 66,
+ 8,
+ 33,
+ 68,
+ 68,
+ 68,
+ 68,
+ 68,
+ 68,
+ 68,
+ 68,
+ 36,
+ 9]),
+ 0,
+ 6)
+ [1],
+ doct =
+ rfse
+ (new u8([32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2]),
+ 0,
+ 5)
+ [1];
+ function b2bl(b, s){
+ var len = b.length, bl = new i32(len);
+ for(var i = 0; i < len; ++i){bl[i] = s; s += 1 << b[i];}
+ return bl;
+ }
+ var
+ llb =
+ new
+ u8
+ (new
+ i32
+ ([0,
+ 0,
+ 0,
+ 0,
+ 16843009,
+ 50528770,
+ 134678020,
+ 202050057,
+ 269422093]).buffer,
+ 0,
+ 36),
+ llbl = b2bl(llb, 0),
+ mlb =
+ new
+ u8
+ (new
+ i32
+ ([0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16843009,
+ 50528770,
+ 117769220,
+ 185207048,
+ 252579084,
+ 16]).buffer,
+ 0,
+ 53),
+ mlbl = b2bl(mlb, 3);
+ function dhu(dat, out, hu){
+ var
+ len = dat.length,
+ ss = out.length,
+ lb = dat[len - 1],
+ msk = (1 << hu.b) - 1,
+ eb = - hu.b;
+ if(! lb) err(0);
+ var
+ st = 0,
+ btr = hu.b,
+ pos = (len << 3) - 8 + msb(lb) - btr,
+ i = - 1;
+ while(pos > eb && i < ss){
+ var
+ cbt = pos >> 3,
+ val =
+ (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7);
+ st = (st << btr | val) & msk;
+ out[++i] = hu.s[st];
+ pos -= btr = hu.n[st];
+ }
+ if(pos !== eb || i + 1 !== ss) err(0);
+ }
+ function dhu4(dat, out, hu){
+ var
+ bt = 6,
+ ss = out.length,
+ sz1 = ss + 3 >> 2,
+ sz2 = sz1 << 1,
+ sz3 = sz1 + sz2;
+ dhu
+ (dat.subarray(bt, bt += dat[0] | dat[1] << 8),
+ out.subarray(0, sz1),
+ hu);
+ dhu
+ (dat.subarray(bt, bt += dat[2] | dat[3] << 8),
+ out.subarray(sz1, sz2),
+ hu);
+ dhu
+ (dat.subarray(bt, bt += dat[4] | dat[5] << 8),
+ out.subarray(sz2, sz3),
+ hu);
+ dhu(dat.subarray(bt), out.subarray(sz3), hu);
+ }
+ function rzb(dat, st, out){
+ var _a, bt = st.b, b0 = dat[bt], btype = b0 >> 1 & 3;
+ st.l = b0 & 1;
+ var
+ sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13,
+ ebt = (bt += 3) + sz;
+ if(btype === 1){
+ if(bt >= dat.length) return;
+ st.b = bt + 1;
+ if(out){fill(out, dat[bt], st.y, st.y += sz); return out;}
+ return fill(new u8(sz), dat[bt]);
+ }
+ if(ebt > dat.length) return;
+ if(btype === 0){
+ st.b = ebt;
+ if(out){
+ out.set(dat.subarray(bt, ebt), st.y);
+ st.y += sz;
+ return out;
+ }
+ return slc(dat, bt, ebt);
+ }
+ if(btype === 2){
+ var
+ b3 = dat[bt],
+ lbt = b3 & 3,
+ sf = b3 >> 2 & 3,
+ lss = b3 >> 4,
+ lcs = 0,
+ s4 = 0;
+ if(lbt < 2)
+ if(sf & 1)
+ lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12);
+ else
+ lss = b3 >> 3;
+ else{
+ s4 = sf;
+ if(sf < 2)
+ lss |= (dat[++bt] & 63) << 4,
+ lcs = dat[bt] >> 6 | dat[++bt] << 2;
+ else if(sf === 2)
+ lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12,
+ lcs = dat[bt] >> 2 | dat[++bt] << 6;
+ else
+ lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12,
+ lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10;
+ }
+ ++bt;
+ var
+ buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m),
+ spl = buf.length - lss;
+ if(lbt === 0)
+ buf.set(dat.subarray(bt, bt += lss), spl);
+ else if(lbt === 1)
+ fill(buf, dat[bt++], spl);
+ else{
+ var hu = st.h;
+ if(lbt === 2){
+ var hud = rhu(dat, bt);
+ lcs += bt - (bt = hud[0]);
+ st.h = hu = hud[1];
+ }
+ else if(! hu) err(0);
+ (s4 ? dhu4 : dhu)
+ (dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);
+ }
+ var ns = dat[bt++];
+ if(ns){
+ if(ns === 255)
+ ns = (dat[bt++] | dat[bt++] << 8) + 0x7f00;
+ else if(ns > 127) ns = ns - 128 << 8 | dat[bt++];
+ var scm = dat[bt++];
+ if(scm & 3) err(0);
+ var dts = [dmlt, doct, dllt];
+ for(var i = 2; i > - 1; --i){
+ var md = scm >> (i << 1) + 2 & 3;
+ if(md === 1){
+ var rbuf = new u8([0, 0, dat[bt++]]);
+ dts[i] =
+ {s: rbuf.subarray(2, 3),
+ n: rbuf.subarray(0, 1),
+ t: new u16(rbuf.buffer, 0, 1),
+ b: 0};
+ }
+ else if(md === 2)
+ _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];
+ else if(md === 3){if(! st.t) err(0); dts[i] = st.t[i];}
+ }
+ var
+ _b = st.t = dts,
+ mlt = _b[0],
+ oct = _b[1],
+ llt = _b[2],
+ lb = dat[ebt - 1];
+ if(! lb) err(0);
+ var
+ spos = (ebt << 3) - 8 + msb(lb) - llt.b,
+ cbt = spos >> 3,
+ oubt = 0,
+ lst =
+ (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1;
+ cbt = (spos -= oct.b) >> 3;
+ var
+ ost =
+ (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1;
+ cbt = (spos -= mlt.b) >> 3;
+ var
+ mst =
+ (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1;
+ for(++ns; --ns;){
+ var
+ llc = llt.s[lst],
+ lbtr = llt.n[lst],
+ mlc = mlt.s[mst],
+ mbtr = mlt.n[mst],
+ ofc = oct.s[ost],
+ obtr = oct.n[ost];
+ cbt = (spos -= ofc) >> 3;
+ var
+ ofp = 1 << ofc,
+ off =
+ ofp
+ +
+ ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16
+ | dat[cbt + 3] << 24)
+ >>> (spos & 7)
+ & ofp - 1);
+ cbt = (spos -= mlb[mlc]) >> 3;
+ var
+ ml =
+ mlbl[mlc]
+ +
+ ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16)
+ >> (spos & 7)
+ & (1 << mlb[mlc]) - 1);
+ cbt = (spos -= llb[llc]) >> 3;
+ var
+ ll =
+ llbl[llc]
+ +
+ ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16)
+ >> (spos & 7)
+ & (1 << llb[llc]) - 1);
+ cbt = (spos -= lbtr) >> 3;
+ lst =
+ llt.t[lst]
+ +
+ ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7)
+ & (1 << lbtr) - 1);
+ cbt = (spos -= mbtr) >> 3;
+ mst =
+ mlt.t[mst]
+ +
+ ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7)
+ & (1 << mbtr) - 1);
+ cbt = (spos -= obtr) >> 3;
+ ost =
+ oct.t[ost]
+ +
+ ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7)
+ & (1 << obtr) - 1);
+ if(off > 3){
+ st.o[2] = st.o[1];
+ st.o[1] = st.o[0];
+ st.o[0] = off -= 3;
+ }
+ else{
+ var idx = off - (ll !== 0);
+ if(idx){
+ off = idx === 3 ? st.o[0] - 1 : st.o[idx];
+ if(idx > 1) st.o[2] = st.o[1];
+ st.o[1] = st.o[0];
+ st.o[0] = off;
+ }
+ else
+ off = st.o[0];
+ }
+ for(var i = 0; i < ll; ++i) buf[oubt + i] = buf[spl + i];
+ oubt += ll, spl += ll;
+ var stin = oubt - off;
+ if(stin < 0){
+ var len = - stin, bs = st.e + stin;
+ if(len > ml) len = ml;
+ for(var i = 0; i < len; ++i) buf[oubt + i] = st.w[bs + i];
+ oubt += len, ml -= len, stin = 0;
+ }
+ for(var i = 0; i < ml; ++i) buf[oubt + i] = buf[stin + i];
+ oubt += ml;
+ }
+ if(oubt !== spl)
+ while(spl < buf.length) buf[oubt++] = buf[spl++];
+ else
+ oubt = buf.length;
+ if(out) st.y += oubt; else buf = slc(buf, 0, oubt);
+ }
+ else if(out){
+ st.y += lss;
+ if(spl) for(var i = 0; i < lss; ++i) buf[i] = buf[spl + i];
+ }
+ else if(spl) buf = slc(buf, spl);
+ st.b = ebt;
+ return buf;
+ }
+ err(2);
+ }
+ function cct(bufs, ol){
+ if(bufs.length === 1) return bufs[0];
+ var buf = new u8(ol);
+ for(var i = 0, b = 0; i < bufs.length; ++i){
+ var chk = bufs[i];
+ buf.set(chk, b);
+ b += chk.length;
+ }
+ return buf;
+ }
+ return function(dat, buf){
+ var bt = 0, bufs = [], nb = + ! buf, ol = 0;
+ while(dat.length){
+ var st = rzfh(dat, nb || buf);
+ if(typeof st === "object"){
+ if(nb){
+ buf = null;
+ if(st.w.length === st.u){bufs.push(buf = st.w); ol += st.u;}
+ }
+ else{bufs.push(buf); st.e = 0;}
+ while(! st.l){
+ var blk = rzb(dat, st, buf);
+ if(! blk) err(5);
+ if(buf)
+ st.e = st.y;
+ else{
+ bufs.push(blk);
+ ol += blk.length;
+ cpw(st.w, 0, blk.length);
+ st.w.set(blk, st.w.length - blk.length);
+ }
+ }
+ bt = st.b + st.c * 4;
+ }
+ else
+ bt = st;
+ dat = dat.subarray(bt);
+ }
+ return cct(bufs, ol);};
+ }
+ ();
+ return {zstd_decompress: zstd_decompress,
+ unix_error: unix_error,
+ caml_strerror: caml_strerror,
+ caml_js_html_escape: caml_js_html_escape,
+ caml_js_html_entities: caml_js_html_entities,
+ blake2_js_for_wasm_update: blake2_js_for_wasm_update,
+ blake2_js_for_wasm_final: blake2_js_for_wasm_final,
+ blake2_js_for_wasm_create: blake2_js_for_wasm_create};
+ }
+ (globalThis))
+({"link":[["runtime-0db9b496",0],["prelude-d7e4b000",0],["stdlib-23ce0836",[]],["sx-ea36a0db",[2]],["jsoo_runtime-f96b44a8",[2]],["js_of_ocaml-651f6707",[2,4]],["dune__exe__Sx_browser-4feaf1fd",[2,3,5]],["std_exit-10fb8830",[2]],["start-9e868ccd",0]],"generated":(b=>{var
+c=b,a=b?.module?.export||b;return{"env":{"caml_ba_kind_of_typed_array":()=>{throw new
+Error("caml_ba_kind_of_typed_array not implemented")},"caml_exn_with_js_backtrace":()=>{throw new
+Error("caml_exn_with_js_backtrace not implemented")},"caml_int64_create_lo_mi_hi":()=>{throw new
+Error("caml_int64_create_lo_mi_hi not implemented")},"caml_jsoo_flags_effects":()=>{throw new
+Error("caml_jsoo_flags_effects not implemented")},"caml_list_mount_point":()=>{throw new
+Error("caml_list_mount_point not implemented")},"caml_ml_set_channel_output":()=>{throw new
+Error("caml_ml_set_channel_output not implemented")},"caml_ml_set_channel_refill":()=>{throw new
+Error("caml_ml_set_channel_refill not implemented")},"caml_unmount":()=>{throw new
+Error("caml_unmount not implemented")}},"Js_of_ocaml__Js.fragments":{"fun_call_1":(a,b)=>a(b),"get_Array":a=>a.Array,"get_Date":a=>a.Date,"get_Error":a=>a.Error,"get_JSON":a=>a.JSON,"get_Math":a=>a.Math,"get_Object":a=>a.Object,"get_RegExp":a=>a.RegExp,"get_String":a=>a.String,"get_decodeURI":a=>a.decodeURI,"get_decodeURIComponent":a=>a.decodeURIComponent,"get_encodeURI":a=>a.encodeURI,"get_encodeURIComponent":a=>a.encodeURIComponent,"get_escape":a=>a.escape,"get_isNaN":a=>a.isNaN,"get_length":a=>a.length,"get_message":a=>a.message,"get_name":a=>a.name,"get_parseFloat":a=>a.parseFloat,"get_parseInt":a=>a.parseInt,"get_stack":a=>a.stack,"get_unescape":a=>a.unescape,"js_expr_12c48ca8":()=>b,"js_expr_21711c2a":()=>a,"js_expr_26f07992":()=>null,"js_expr_28647a4c":()=>false,"js_expr_34edcf72":()=>true,"js_expr_ba692c1":()=>undefined,"meth_call_0_toString":a=>a.toString(),"meth_call_1_forEach":(a,b)=>a.forEach(b),"meth_call_1_keys":(a,b)=>a.keys(b),"meth_call_1_map":(a,b)=>a.map(b)},"Js_of_ocaml__Dom.fragments":{"call_1":(a,b,c)=>a.call(b,c),"get_CustomEvent":a=>a.CustomEvent,"get_addEventListener":a=>a.addEventListener,"get_length":a=>a.length,"get_nodeType":a=>a.nodeType,"get_srcElement":a=>a.srcElement,"get_target":a=>a.target,"meth_call_0_preventDefault":a=>a.preventDefault(),"meth_call_1_appendChild":(a,b)=>a.appendChild(b),"meth_call_1_concat":(a,b)=>a.concat(b),"meth_call_1_item":(a,b)=>a.item(b),"meth_call_1_removeChild":(a,b)=>a.removeChild(b),"meth_call_2_attachEvent":(a,b,c)=>a.attachEvent(b,c),"meth_call_2_detachEvent":(a,b,c)=>a.detachEvent(b,c),"meth_call_2_insertBefore":(a,b,c)=>a.insertBefore(b,c),"meth_call_2_replaceChild":(a,b,c)=>a.replaceChild(b,c),"meth_call_3_addEventListener":(a,b,c,d)=>a.addEventListener(b,c,d),"meth_call_3_removeEventListener":(a,b,c,d)=>a.removeEventListener(b,c,d),"new_2":(a,b,c)=>new
+a(b,c),"obj_0":()=>({}),"obj_1":()=>({}),"set_bubbles":(a,b)=>a.bubbles=b,"set_cancelable":(a,b)=>a.cancelable=b,"set_capture":(a,b)=>a.capture=b,"set_detail":(a,b)=>a.detail=b,"set_once":(a,b)=>a.once=b,"set_passive":(a,b)=>a.passive=b},"Js_of_ocaml__Typed_array.fragments":{"get_ArrayBuffer":a=>a.ArrayBuffer,"get_DataView":a=>a.DataView,"get_Float32Array":a=>a.Float32Array,"get_Float64Array":a=>a.Float64Array,"get_Int16Array":a=>a.Int16Array,"get_Int32Array":a=>a.Int32Array,"get_Int8Array":a=>a.Int8Array,"get_Uint16Array":a=>a.Uint16Array,"get_Uint32Array":a=>a.Uint32Array,"get_Uint8Array":a=>a.Uint8Array,"new_1":(a,b)=>new
+a(b)},"Js_of_ocaml__File.fragments":{"get_Blob":a=>a.Blob,"get_Document":a=>a.Document,"get_FileReader":a=>a.FileReader,"get_fileName":a=>a.fileName,"get_name":a=>a.name,"new_2":(a,b,c)=>new
+a(b,c)},"Js_of_ocaml__Dom_html.fragments":{"fun_call_1":(a,b)=>a(b),"get_HTMLElement":a=>a.HTMLElement,"get_KeyboardEvent":a=>a.KeyboardEvent,"get_MessageEvent":a=>a.MessageEvent,"get_MouseEvent":a=>a.MouseEvent,"get_MouseScrollEvent":a=>a.MouseScrollEvent,"get_PopStateEvent":a=>a.PopStateEvent,"get_WheelEvent":a=>a.WheelEvent,"get_body":a=>a.body,"get_button":a=>a.button,"get_charCode":a=>a.charCode,"get_clientLeft":a=>a.clientLeft,"get_clientTop":a=>a.clientTop,"get_clientX":a=>a.clientX,"get_clientY":a=>a.clientY,"get_code":a=>a.code,"get_document":a=>a.document,"get_documentElement":a=>a.documentElement,"get_getContext":a=>a.getContext,"get_history":a=>a.history,"get_key":a=>a.key,"get_keyCode":a=>a.keyCode,"get_left":a=>a.left,"get_length":a=>a.length,"get_location":a=>a.location,"get_mozRequestAnimationFrame":a=>a.mozRequestAnimationFrame,"get_msRequestAnimationFrame":a=>a.msRequestAnimationFrame,"get_name":a=>a.name,"get_oRequestAnimationFrame":a=>a.oRequestAnimationFrame,"get_origin":a=>a.origin,"get_pageX":a=>a.pageX,"get_pageY":a=>a.pageY,"get_placeholder":a=>a.placeholder,"get_pushState":a=>a.pushState,"get_readyState":a=>a.readyState,"get_relatedTarget":a=>a.relatedTarget,"get_requestAnimationFrame":a=>a.requestAnimationFrame,"get_required":a=>a.required,"get_scrollLeft":a=>a.scrollLeft,"get_scrollTop":a=>a.scrollTop,"get_stopPropagation":a=>a.stopPropagation,"get_tagName":a=>a.tagName,"get_top":a=>a.top,"get_webkitRequestAnimationFrame":a=>a.webkitRequestAnimationFrame,"get_wheelDelta":a=>a.wheelDelta,"get_wheelDeltaX":a=>a.wheelDeltaX,"get_wheelDeltaY":a=>a.wheelDeltaY,"get_which":a=>a.which,"js_expr_4c8b1c6":()=>[].slice,"meth_call_0_getBoundingClientRect":a=>a.getBoundingClientRect(),"meth_call_0_getTime":a=>a.getTime(),"meth_call_0_stopPropagation":a=>a.stopPropagation(),"meth_call_0_toLowerCase":a=>a.toLowerCase(),"meth_call_1_call":(a,b)=>a.call(b),"meth_call_1_charCodeAt":(a,b)=>a.charCodeAt(b),"meth_call_1_clearTimeout":(a,b)=>a.clearTimeout(b),"meth_call_1_createElement":(a,b)=>a.createElement(b),"meth_call_1_getElementById":(a,b)=>a.getElementById(b),"meth_call_1_join":(a,b)=>a.join(b),"meth_call_1_push":(a,b)=>a.push(b),"meth_call_2_push":(a,b,c)=>a.push(b,c),"meth_call_2_setTimeout":(a,b,c)=>a.setTimeout(b,c),"meth_call_3_push":(a,b,c,d)=>a.push(b,c,d),"new_0":a=>new
+a(),"set_cancelBubble":(a,b)=>a.cancelBubble=b,"set_name":(a,b)=>a.name=b,"set_type":(a,b)=>a.type=b},"Js_of_ocaml__Form.fragments":{"get_FormData":a=>a.FormData,"get_checked":a=>a.checked,"get_disabled":a=>a.disabled,"get_elements":a=>a.elements,"get_files":a=>a.files,"get_length":a=>a.length,"get_multiple":a=>a.multiple,"get_name":a=>a.name,"get_options":a=>a.options,"get_selected":a=>a.selected,"get_type":a=>a.type,"get_value":a=>a.value,"meth_call_0_toLowerCase":a=>a.toLowerCase(),"meth_call_1_item":(a,b)=>a.item(b),"meth_call_2_append":(a,b,c)=>a.append(b,c),"new_0":a=>new
+a()},"Js_of_ocaml__Worker.fragments":{"get_Worker":a=>a.Worker,"get_data":a=>a.data,"get_importScripts":a=>a.importScripts,"get_onmessage":a=>a.onmessage,"get_postMessage":a=>a.postMessage,"meth_call_1_postMessage":(a,b)=>a.postMessage(b),"new_1":(a,b)=>new
+a(b),"set_onmessage":(a,b)=>a.onmessage=b},"Js_of_ocaml__WebSockets.fragments":{"get_WebSocket":a=>a.WebSocket},"Js_of_ocaml__WebGL.fragments":{"meth_call_1_getContext":(a,b)=>a.getContext(b),"meth_call_2_getContext":(a,b,c)=>a.getContext(b,c),"obj_2":(a,b,c,d,e,f,g,h)=>({alpha:a,depth:b,stencil:c,antialias:d,premultipliedAlpha:e,preserveDrawingBuffer:f,preferLowPowerToHighPerformance:g,failIfMajorPerformanceCaveat:h})},"Js_of_ocaml__Regexp.fragments":{"get_ignoreCase":a=>a.ignoreCase,"get_index":a=>a.index,"get_length":a=>a.length,"get_multiline":a=>a.multiline,"get_source":a=>a.source,"meth_call_1_exec":(a,b)=>a.exec(b),"meth_call_1_split":(a,b)=>a.split(b),"meth_call_2_replace":(a,b,c)=>a.replace(b,c),"meth_call_2_split":(a,b,c)=>a.split(b,c),"new_2":(a,b,c)=>new
+a(b,c),"set_lastIndex":(a,b)=>a.lastIndex=b},"Js_of_ocaml__Url.fragments":{"get_hash":a=>a.hash,"get_hostname":a=>a.hostname,"get_href":a=>a.href,"get_length":a=>a.length,"get_location":a=>a.location,"get_pathname":a=>a.pathname,"get_port":a=>a.port,"get_protocol":a=>a.protocol,"get_search":a=>a.search,"meth_call_0_toLowerCase":a=>a.toLowerCase(),"meth_call_1_charAt":(a,b)=>a.charAt(b),"meth_call_1_exec":(a,b)=>a.exec(b),"meth_call_1_indexOf":(a,b)=>a.indexOf(b),"meth_call_1_slice":(a,b)=>a.slice(b),"meth_call_1_split":(a,b)=>a.split(b),"meth_call_2_replace":(a,b,c)=>a.replace(b,c),"meth_call_2_slice":(a,b,c)=>a.slice(b,c),"new_1":(a,b)=>new
+a(b),"new_2":(a,b,c)=>new
+a(b,c),"obj_3":(a,b,c,d,e,f,g,h,i,j,k,l)=>({href:a,protocol:b,host:c,hostname:d,port:e,pathname:f,search:g,hash:h,origin:i,reload:j,replace:k,assign:l}),"set_hash":(a,b)=>a.hash=b,"set_href":(a,b)=>a.href=b,"set_lastIndex":(a,b)=>a.lastIndex=b},"Js_of_ocaml__ResizeObserver.fragments":{"get_ResizeObserver":a=>a.ResizeObserver,"meth_call_1_observe":(a,b)=>a.observe(b),"meth_call_2_observe":(a,b,c)=>a.observe(b,c),"new_1":(a,b)=>new
+a(b),"obj_4":()=>({}),"obj_5":()=>({}),"set_box":(a,b)=>a.box=b},"Js_of_ocaml__PerformanceObserver.fragments":{"get_PerformanceObserver":a=>a.PerformanceObserver,"meth_call_1_observe":(a,b)=>a.observe(b),"new_1":(a,b)=>new
+a(b),"obj_6":()=>({}),"set_entryTypes":(a,b)=>a.entryTypes=b},"Js_of_ocaml__MutationObserver.fragments":{"get_MutationObserver":a=>a.MutationObserver,"meth_call_2_observe":(a,b,c)=>a.observe(b,c),"new_1":(a,b)=>new
+a(b),"obj_7":()=>({}),"obj_8":()=>({}),"set_attributeFilter":(a,b)=>a.attributeFilter=b,"set_attributeOldValue":(a,b)=>a.attributeOldValue=b,"set_attributes":(a,b)=>a.attributes=b,"set_characterData":(a,b)=>a.characterData=b,"set_characterDataOldValue":(a,b)=>a.characterDataOldValue=b,"set_childList":(a,b)=>a.childList=b,"set_subtree":(a,b)=>a.subtree=b},"Js_of_ocaml__Jstable.fragments":{"get_Object":a=>a.Object,"get_length":a=>a.length,"meth_call_1_concat":(a,b)=>a.concat(b),"meth_call_1_keys":(a,b)=>a.keys(b),"meth_call_2_substring":(a,b,c)=>a.substring(b,c),"new_0":a=>new
+a()},"Js_of_ocaml__Json.fragments":{"get_JSON":a=>a.JSON,"get_constructor":a=>a.constructor,"get_hi":a=>a.hi,"get_length":a=>a.length,"get_lo":a=>a.lo,"get_mi":a=>a.mi,"meth_call_1_stringify":(a,b)=>a.stringify(b),"meth_call_2_parse":(a,b,c)=>a.parse(b,c),"meth_call_2_stringify":(a,b,c)=>a.stringify(b,c)},"Js_of_ocaml__CSS.fragments":{"meth_call_1_test":(a,b)=>a.test(b),"new_1":(a,b)=>new
+a(b)},"Js_of_ocaml__Dom_svg.fragments":{"get_SVGElement":a=>a.SVGElement,"get_document":a=>a.document,"get_tagName":a=>a.tagName,"meth_call_0_toLowerCase":a=>a.toLowerCase(),"meth_call_1_getElementById":(a,b)=>a.getElementById(b),"meth_call_2_createElementNS":(a,b,c)=>a.createElementNS(b,c)},"Js_of_ocaml__EventSource.fragments":{"get_EventSource":a=>a.EventSource,"obj_9":()=>({}),"set_withCredentials":(a,b)=>a.withCredentials=b},"Js_of_ocaml__Geolocation.fragments":{"get_geolocation":a=>a.geolocation,"get_navigator":a=>a.navigator,"obj_10":()=>({})},"Js_of_ocaml__IntersectionObserver.fragments":{"get_IntersectionObserver":a=>a.IntersectionObserver,"obj_11":()=>({})},"Js_of_ocaml__Intl.fragments":{"get_Collator":a=>a.Collator,"get_DateTimeFormat":a=>a.DateTimeFormat,"get_Intl":a=>a.Intl,"get_NumberFormat":a=>a.NumberFormat,"get_PluralRules":a=>a.PluralRules,"obj_12":a=>({localeMatcher:a}),"obj_13":(a,b,c,d,e,f)=>({localeMatcher:a,usage:b,sensitivity:c,ignorePunctuation:d,numeric:e,caseFirst:f}),"obj_14":(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)=>({dateStyle:a,timeStyle:b,calendar:c,dayPeriod:d,numberingSystem:e,localeMatcher:f,timeZone:g,hour12:h,hourCycle:i,formatMatcher:j,weekday:k,era:l,year:m,month:n,day:o,hour:p,minute:q,second:r,fractionalSecondDigits:s,timeZoneName:t}),"obj_15":(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u)=>({compactDisplay:a,currency:b,currencyDisplay:c,currencySign:d,localeMatcher:e,notation:f,numberingSystem:g,signDisplay:h,style:i,unit:j,unitDisplay:k,useGrouping:l,roundingMode:m,roundingPriority:n,roundingIncrement:o,trailingZeroDisplay:p,minimumIntegerDigits:q,minimumFractionDigits:r,maximumFractionDigits:s,minimumSignificantDigits:t,maximumSignificantDigits:u}),"obj_16":(a,b)=>({localeMatcher:a,type:b})},"Dune__exe__Sx_browser.fragments":{"fun_call_1":(a,b)=>a(b),"fun_call_3":(a,b,c,d)=>a(b,c,d),"get_Array":a=>a.Array,"get_Object":a=>a.Object,"get___sx_handle":a=>a.__sx_handle,"get__type":a=>a._type,"get_console":a=>a.console,"get_items":a=>a.items,"get_length":a=>a.length,"get_name":a=>a.name,"js_expr_10d25c5c":()=>function(a){return function(){b.__sxR=undefined;var
+c=a.apply(null,arguments);return b.__sxR!==undefined?b.__sxR:c}},"js_expr_1ab4fffb":()=>function(){var
+b={},d=0;return{put:function(a){var
+c=d++;b[c]=a;return c},get:function(a){return b[a]}}}(),"js_expr_36506fc1":()=>function(a,b,c){a.__sx_handle=b;a._type=c;return a},"meth_call_1_error":(a,b)=>a.error(b),"meth_call_1_get":(a,b)=>a.get(b),"meth_call_1_isArray":(a,b)=>a.isArray(b),"meth_call_1_keys":(a,b)=>a.keys(b),"meth_call_1_put":(a,b)=>a.put(b),"obj_0":()=>({}),"obj_1":()=>({}),"obj_2":(a,b)=>({_type:a,items:b}),"obj_3":(a,b)=>({_type:a,name:b}),"obj_4":(a,b)=>({_type:a,name:b}),"obj_5":(a,b)=>({_type:a,__sx_handle:b}),"set_SxKernel":(a,b)=>a.SxKernel=b,"set___sxR":(a,b)=>a.__sxR=b,"set__type":(a,b)=>a._type=b,"set_callFn":(a,b)=>a.callFn=b,"set_engine":(a,b)=>a.engine=b,"set_eval":(a,b)=>a.eval=b,"set_evalExpr":(a,b)=>a.evalExpr=b,"set_fnArity":(a,b)=>a.fnArity=b,"set_inspect":(a,b)=>a.inspect=b,"set_isCallable":(a,b)=>a.isCallable=b,"set_load":(a,b)=>a.load=b,"set_loadSource":(a,b)=>a.loadSource=b,"set_parse":(a,b)=>a.parse=b,"set_registerNative":(a,b)=>a.registerNative=b,"set_renderToHtml":(a,b)=>a.renderToHtml=b,"set_stringify":(a,b)=>a.stringify=b,"set_typeOf":(a,b)=>a.typeOf=b}}})(globalThis),"src":"sx_browser.bc.wasm.assets"});
diff --git a/sx/Dockerfile b/sx/Dockerfile
index 02c5a5a7..3fb62955 100644
--- a/sx/Dockerfile
+++ b/sx/Dockerfile
@@ -43,6 +43,11 @@ RUN cp -r sx-app-tmp/app.py sx-app-tmp/path_setup.py \
([ -d sx-app-tmp/sx ] && cp -r sx-app-tmp/sx ./sx || true) && \
rm -rf sx-app-tmp
+# SX spec, library, and web adapter files (loaded by OCaml kernel)
+COPY spec/ ./spec/
+COPY lib/ ./lib/
+COPY web/ ./web/
+
# Sibling models for cross-domain SQLAlchemy imports
COPY blog/__init__.py ./blog/__init__.py
COPY blog/models/ ./blog/models/
diff --git a/sx/sx/plans/reader-macro-demo.sx.future b/sx/sx/plans/reader-macro-demo.sx.future
index d03c05a4..890545f1 100644
--- a/sx/sx/plans/reader-macro-demo.sx.future
+++ b/sx/sx/plans/reader-macro-demo.sx.future
@@ -6,10 +6,10 @@
(div :class "grid grid-cols-1 md:grid-cols-2 gap-4"
(div
(p :class "text-xs text-stone-500 uppercase tracking-wider mb-1" "SX Source")
- (~docs/code :code (highlight sx-source "lisp")))
+ (~docs/code :src (highlight sx-source "lisp")))
(div
(p :class "text-xs text-stone-500 uppercase tracking-wider mb-1" "SMT-LIB Output (live from z3.sx)")
- (~docs/code :code (highlight smt-output "lisp")))))
+ (~docs/code :src (highlight smt-output "lisp")))))
(defcomp ~plans/reader-macro-demo/plan-reader-macro-demo-content ()
(~docs/page :title "Reader Macro Demo: #z3"
@@ -75,12 +75,12 @@
"Below is the live SMT-LIB output from translating the full " (code "primitives.sx") " — all 87 primitive declarations. The composition is pure SX: " (code "(z3-translate-file (sx-parse (read-spec-file \"primitives.sx\")))") " — read the file, parse it, translate it. No Python glue.")
(~docs/subsection :title "primitives.sx (87 primitives)"
- (~docs/code :code (highlight (z3-translate-file (sx-parse (read-spec-file "primitives.sx"))) "lisp"))))
+ (~docs/code :src (highlight (z3-translate-file (sx-parse (read-spec-file "primitives.sx"))) "lisp"))))
(~docs/section :title "The translator: z3.sx" :id "z3-source"
(p :class "text-stone-600"
"The entire translator is a single SX file — s-expressions that walk other s-expressions and emit strings. No host language logic. The same file runs in Python (server) and could run in JavaScript (browser) via the bootstrapped evaluator.")
- (~docs/code :code (highlight (read-spec-file "z3.sx") "lisp"))
+ (~docs/code :src (highlight (read-spec-file "z3.sx") "lisp"))
(p :class "text-stone-600 mt-4"
"359 lines. The key functions: " (code "z3-sort") " maps SX types to SMT-LIB sorts. " (code "z3-expr") " recursively translates expressions — identity ops pass through unchanged, " (code "max") "/" (code "min") " become " (code "ite") ", predicates get renamed. " (code "z3-translate") " dispatches on form type. " (code "z3-translate-file") " filters and batch-translates."))
diff --git a/tests/playwright/sx-inspect.js b/tests/playwright/sx-inspect.js
new file mode 100644
index 00000000..560991a9
--- /dev/null
+++ b/tests/playwright/sx-inspect.js
@@ -0,0 +1,739 @@
+#!/usr/bin/env node
+// sx-inspect.js — SX-aware Playwright page inspector
+// Usage: node sx-inspect.js '{"mode":"...","url":"/",...}'
+// Modes: inspect, diff, hydrate, eval, interact, screenshot
+// Output: JSON to stdout
+
+const { chromium } = require('playwright');
+
+const BASE_URL = process.env.SX_TEST_URL || 'http://localhost:8013';
+const SCREENSHOT_DIR = process.env.SX_SCREENSHOT_DIR || '/tmp';
+
+// Code display markers — elements that intentionally show SX source
+const CODE_DISPLAY_SELECTORS = [
+ '[data-code-view]',
+ 'pre code',
+ '.sx-source',
+ '[data-sx-source]',
+ '.font-mono[style*="font-size:0.5rem"]', // stepper code view
+].join(', ');
+
+// ---------------------------------------------------------------------------
+// Helpers
+// ---------------------------------------------------------------------------
+
+/** Recursive DOM tree snapshot — tag, id, classes, data-sx-* attrs, text */
+function snapshotScript() {
+ return `(function snapshot(el) {
+ if (el.nodeType === 3) {
+ const text = el.textContent.trim();
+ return text ? { type: 'text', value: text } : null;
+ }
+ if (el.nodeType !== 1) return null;
+ const node = { tag: el.tagName.toLowerCase() };
+ if (el.id) node.id = el.id;
+ const cls = Array.from(el.classList).sort().join(' ');
+ if (cls) node.cls = cls;
+ const island = el.getAttribute('data-sx-island');
+ if (island) node.island = island;
+ const lake = el.getAttribute('data-sx-lake');
+ if (lake) node.lake = lake;
+ const marsh = el.getAttribute('data-sx-marsh');
+ if (marsh) node.marsh = marsh;
+ const signal = el.getAttribute('data-sx-signal');
+ if (signal) node.signal = signal;
+ const reactiveAttrs = el.getAttribute('data-sx-reactive-attrs');
+ if (reactiveAttrs) node.reactiveAttrs = reactiveAttrs;
+ const style = el.getAttribute('style');
+ if (style) node.style = style;
+ const children = [];
+ for (const child of el.childNodes) {
+ const s = snapshot(child);
+ if (s) children.push(s);
+ }
+ if (children.length) node.children = children;
+ return node;
+ })`;
+}
+
+/** Diff two tree snapshots, returning list of changes */
+function diffTrees(a, b, path = '') {
+ const changes = [];
+ if (!a && !b) return changes;
+ if (!a) { changes.push({ path, kind: 'added', node: summarize(b) }); return changes; }
+ if (!b) { changes.push({ path, kind: 'removed', node: summarize(a) }); return changes; }
+ if (a.type === 'text' && b.type === 'text') {
+ if (a.value !== b.value)
+ changes.push({ path: path || 'text', kind: 'text-changed', ssr: a.value.substring(0, 120), hydrated: b.value.substring(0, 120) });
+ return changes;
+ }
+ if (a.type === 'text' || b.type === 'text') {
+ changes.push({ path, kind: 'type-changed', ssr: summarize(a), hydrated: summarize(b) });
+ return changes;
+ }
+ if (a.tag !== b.tag) changes.push({ path, kind: 'tag-changed', ssr: a.tag, hydrated: b.tag });
+ if (a.cls !== b.cls) changes.push({ path: path || a.tag, kind: 'class-changed', ssr: a.cls || '', hydrated: b.cls || '' });
+ if (a.island !== b.island) changes.push({ path, kind: 'island-changed', ssr: a.island, hydrated: b.island });
+ if (a.style !== b.style) changes.push({ path: path || a.tag, kind: 'style-changed', ssr: a.style || '', hydrated: b.style || '' });
+
+ const ac = a.children || [];
+ const bc = b.children || [];
+ const maxLen = Math.max(ac.length, bc.length);
+ for (let i = 0; i < maxLen; i++) {
+ const childPath = path ? `${path} > [${i}]` : `[${i}]`;
+ const aTag = ac[i]?.tag || ac[i]?.type || '';
+ const bTag = bc[i]?.tag || bc[i]?.type || '';
+ const label = bTag ? `${childPath} <${bTag}>` : childPath;
+ changes.push(...diffTrees(ac[i] || null, bc[i] || null, label));
+ }
+ return changes;
+}
+
+function summarize(node) {
+ if (!node) return 'null';
+ if (node.type === 'text') return `"${node.value.substring(0, 60)}"`;
+ let s = `<${node.tag}`;
+ if (node.island) s += ` island="${node.island}"`;
+ if (node.lake) s += ` lake="${node.lake}"`;
+ if (node.id) s += ` #${node.id}`;
+ s += '>';
+ return s;
+}
+
+async function waitForHydration(page) {
+ try {
+ await page.waitForSelector('[data-sx-island]', { timeout: 8000 });
+ await page.waitForTimeout(1500);
+ } catch (e) {
+ // No islands on page — that's OK
+ }
+}
+
+// ---------------------------------------------------------------------------
+// Leak detection — excludes code display elements
+// ---------------------------------------------------------------------------
+
+function leakDetectionScript(codeSelectors) {
+ return `(function(els) {
+ const codeEls = new Set();
+ document.querySelectorAll(${JSON.stringify(codeSelectors)}).forEach(el => {
+ // Mark all code-display elements and their descendants
+ el.querySelectorAll('*').forEach(d => codeEls.add(d));
+ codeEls.add(el);
+ });
+
+ return els.flatMap(el => {
+ const name = el.getAttribute('data-sx-island');
+ const leaks = [];
+
+ // Walk text nodes, skipping code display areas
+ const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, {
+ acceptNode: (node) => {
+ let p = node.parentElement;
+ while (p && p !== el) {
+ if (codeEls.has(p)) return NodeFilter.FILTER_REJECT;
+ p = p.parentElement;
+ }
+ return NodeFilter.FILTER_ACCEPT;
+ }
+ });
+
+ let fullText = '';
+ let node;
+ while (node = walker.nextNode()) fullText += node.textContent;
+
+ // Raw dict patterns (SX keyword-keyed dicts)
+ const dictMatch = fullText.match(/\\{:(?:type|tag|expr|spreads|attrs)\\s[^}]{0,80}/);
+ if (dictMatch) leaks.push({ island: name, kind: 'raw-dict', sample: dictMatch[0] });
+ // Unresolved component calls
+ const compMatch = fullText.match(/\\(~[\\w/]+[^)]{0,60}/);
+ if (compMatch) leaks.push({ island: name, kind: 'unresolved-component', sample: compMatch[0] });
+ // CSSX tokens leaked as text
+ const cssxMatch = fullText.match(/:tokens\\s+"[^"]{0,60}/);
+ if (cssxMatch) leaks.push({ island: name, kind: 'cssx-leak', sample: cssxMatch[0] });
+ // String-keyed dicts (JS evaluator format)
+ const strDictMatch = fullText.match(/\\{"(?:type|tag|expr|text|cls|step)"\\s[^}]{0,80}/);
+ if (strDictMatch) leaks.push({ island: name, kind: 'raw-dict-str', sample: strDictMatch[0] });
+ // Raw SX list as text (parens around tag names)
+ const sxListMatch = fullText.match(/\\((?:div|span|h[1-6]|p|a|button|ul|li|section|article)\\s+:(?:class|id|style)/);
+ if (sxListMatch) leaks.push({ island: name, kind: 'raw-sx-element', sample: sxListMatch[0] });
+ return leaks;
+ });
+ })`;
+}
+
+// ---------------------------------------------------------------------------
+// Handler audit — check if event handlers are wired
+// ---------------------------------------------------------------------------
+
+function handlerAuditScript() {
+ return `(function(island) {
+ const buttons = island.querySelectorAll('button, [on-click], [data-sx-on-click]');
+ const inputs = island.querySelectorAll('input, textarea, select');
+ const results = [];
+
+ buttons.forEach((btn, i) => {
+ const tag = btn.tagName.toLowerCase();
+ const text = btn.textContent.trim().substring(0, 30);
+ const hasReactiveClass = btn.hasAttribute('data-sx-reactive-attrs');
+ // Check for attached event listeners via getEventListeners (Chrome DevTools only)
+ // Fallback: check for onclick attribute or __sx handler
+ const hasOnclick = btn.hasAttribute('onclick') || btn.onclick !== null;
+ const hasSxHandler = !!(btn.__sx_listeners || btn._sxListeners);
+ // Check all registered listeners
+ const listeners = [];
+ try {
+ const evts = getEventListeners ? getEventListeners(btn) : {};
+ for (const [evt, handlers] of Object.entries(evts)) {
+ listeners.push({ event: evt, count: handlers.length });
+ }
+ } catch(e) { /* getEventListeners not available outside DevTools */ }
+
+ results.push({
+ element: tag,
+ index: i,
+ text: text,
+ reactiveAttrs: hasReactiveClass,
+ hasOnclick: hasOnclick,
+ listenerCount: listeners.length || (hasOnclick ? 1 : 0),
+ wired: hasOnclick || listeners.length > 0
+ });
+ });
+
+ inputs.forEach((inp, i) => {
+ const tag = inp.tagName.toLowerCase();
+ const type = inp.type || '';
+ const hasBind = inp.hasAttribute('data-sx-bind');
+ const hasOnInput = inp.oninput !== null;
+ results.push({
+ element: tag,
+ type: type,
+ index: i,
+ bind: hasBind,
+ hasOnInput: hasOnInput,
+ wired: hasOnInput || hasBind
+ });
+ });
+
+ return results;
+ })`;
+}
+
+// ---------------------------------------------------------------------------
+// Mode: inspect
+// ---------------------------------------------------------------------------
+
+async function modeInspect(page, url, islandFilter) {
+ await page.goto(BASE_URL + url, { waitUntil: 'networkidle', timeout: 15000 });
+ await waitForHydration(page);
+
+ const pageErrors = [];
+ page.on('pageerror', err => pageErrors.push(err.message));
+
+ const selector = islandFilter
+ ? `[data-sx-island*="${islandFilter}"]`
+ : '[data-sx-island]';
+
+ const islands = await page.$$eval(selector, (els, codeSelectors) => {
+ return els.map(el => {
+ const name = el.getAttribute('data-sx-island');
+
+ // Lakes with detail
+ const lakes = [...el.querySelectorAll('[data-sx-lake]')].map(l => {
+ const id = l.getAttribute('data-sx-lake');
+ const html = l.innerHTML;
+ const hasElements = l.children.length > 0;
+ const textOnly = !hasElements && l.textContent.trim().length > 0;
+ const looksLikeSx = /^\s*\(/.test(l.textContent.trim());
+ return {
+ id,
+ htmlLength: html.length,
+ childElements: l.children.length,
+ textPreview: l.textContent.trim().substring(0, 100),
+ status: hasElements ? 'rendered' : (looksLikeSx ? 'raw-sx-text' : (textOnly ? 'text-only' : 'empty'))
+ };
+ });
+
+ // Marshes
+ const marshes = [...el.querySelectorAll('[data-sx-marsh]')].map(m => ({
+ id: m.getAttribute('data-sx-marsh'),
+ transform: m.getAttribute('data-sx-transform') || null
+ }));
+
+ // Signals
+ const signals = [...el.querySelectorAll('[data-sx-signal]')].map(s => {
+ const spec = s.getAttribute('data-sx-signal');
+ const colonIdx = spec.indexOf(':');
+ return {
+ store: colonIdx > 0 ? spec.substring(0, colonIdx) : spec,
+ value: colonIdx > 0 ? spec.substring(colonIdx + 1).substring(0, 50) : null
+ };
+ });
+
+ // Reactive attrs
+ const reactiveEls = [...el.querySelectorAll('[data-sx-reactive-attrs]')].map(r => ({
+ tag: r.tagName.toLowerCase(),
+ attrs: r.getAttribute('data-sx-reactive-attrs'),
+ preview: r.outerHTML.substring(0, 80)
+ }));
+
+ return {
+ name,
+ tag: el.tagName.toLowerCase(),
+ stateSize: (el.getAttribute('data-sx-state') || '').length,
+ textLength: el.textContent.length,
+ textPreview: el.textContent.replace(/\s+/g, ' ').trim().substring(0, 150),
+ lakes,
+ marshes,
+ signals,
+ reactiveElements: reactiveEls.length,
+ reactiveDetail: reactiveEls.slice(0, 10)
+ };
+ });
+ }, CODE_DISPLAY_SELECTORS);
+
+ // Leak detection with code display exclusion
+ const leaks = await page.$$eval(selector, (els, codeSelectors) => {
+ // Build the leak detection inline (can't pass function refs to $$eval)
+ const codeEls = new Set();
+ document.querySelectorAll(codeSelectors).forEach(el => {
+ el.querySelectorAll('*').forEach(d => codeEls.add(d));
+ codeEls.add(el);
+ });
+
+ return els.flatMap(el => {
+ const name = el.getAttribute('data-sx-island');
+ const leaks = [];
+
+ // Walk text nodes, skipping code display areas
+ const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, {
+ acceptNode: (node) => {
+ let p = node.parentElement;
+ while (p && p !== el) {
+ if (codeEls.has(p)) return NodeFilter.FILTER_REJECT;
+ p = p.parentElement;
+ }
+ return NodeFilter.FILTER_ACCEPT;
+ }
+ });
+
+ let fullText = '';
+ let node;
+ while (node = walker.nextNode()) fullText += node.textContent;
+
+ const dictMatch = fullText.match(/\{:(?:type|tag|expr|spreads|attrs)\s[^}]{0,80}/);
+ if (dictMatch) leaks.push({ island: name, kind: 'raw-dict', sample: dictMatch[0] });
+ const compMatch = fullText.match(/\(~[\w/]+[^)]{0,60}/);
+ if (compMatch) leaks.push({ island: name, kind: 'unresolved-component', sample: compMatch[0] });
+ const cssxMatch = fullText.match(/:tokens\s+"[^"]{0,60}/);
+ if (cssxMatch) leaks.push({ island: name, kind: 'cssx-leak', sample: cssxMatch[0] });
+ const strDictMatch = fullText.match(/\{"(?:type|tag|expr|text|cls|step)"\s[^}]{0,80}/);
+ if (strDictMatch) leaks.push({ island: name, kind: 'raw-dict-str', sample: strDictMatch[0] });
+ const sxListMatch = fullText.match(/\((?:div|span|h[1-6]|p|a|button|ul|li|section|article)\s+:(?:class|id|style)/);
+ if (sxListMatch) leaks.push({ island: name, kind: 'raw-sx-element', sample: sxListMatch[0] });
+ return leaks;
+ });
+ }, CODE_DISPLAY_SELECTORS);
+
+ // Handler audit for each island
+ const handlers = await page.$$eval(selector, (els) => {
+ return els.map(el => {
+ const name = el.getAttribute('data-sx-island');
+ const buttons = [...el.querySelectorAll('button')];
+ const inputs = [...el.querySelectorAll('input, textarea, select')];
+
+ const buttonAudit = buttons.map((btn, i) => {
+ const hasOnclick = btn.onclick !== null;
+ const hasReactive = btn.hasAttribute('data-sx-reactive-attrs');
+ // SX wires handlers via addEventListener, not onclick property.
+ // We can't detect addEventListener from JS. Heuristic: if the
+ // button has reactive attrs, it was rendered by an island and
+ // likely has handlers. Only flag buttons with NO island markers.
+ const inIsland = !!btn.closest('[data-sx-island]');
+ const likelyWired = hasOnclick || (inIsland && hasReactive);
+ return {
+ text: btn.textContent.trim().substring(0, 20),
+ hasOnclick,
+ reactiveAttrs: hasReactive,
+ inIsland,
+ wired: likelyWired ? 'yes' : (inIsland ? 'probable' : 'unknown')
+ };
+ });
+
+ const inputAudit = inputs.map((inp, i) => {
+ const hasBind = inp.hasAttribute('data-sx-bind');
+ const hasOnInput = inp.oninput !== null;
+ const inIsland = !!inp.closest('[data-sx-island]');
+ return {
+ type: inp.type || inp.tagName.toLowerCase(),
+ hasBind,
+ hasOnInput,
+ inIsland,
+ wired: hasOnInput || hasBind ? 'yes' : (inIsland ? 'probable' : 'unknown')
+ };
+ });
+
+ const suspectButtons = buttonAudit.filter(b => b.wired === 'unknown');
+ const suspectInputs = inputAudit.filter(i => i.wired === 'unknown');
+
+ return {
+ island: name,
+ buttons: buttonAudit.length,
+ inputs: inputAudit.length,
+ suspectButtons: suspectButtons.length,
+ suspectInputs: suspectInputs.length,
+ allButtons: buttonAudit,
+ detail: suspectButtons.length + suspectInputs.length > 0
+ ? { suspectButtons, suspectInputs }
+ : undefined
+ };
+ });
+ });
+
+ const globalLeaks = await page.$eval('#sx-root', el => {
+ const text = el.textContent;
+ const leaks = [];
+ const dictMatch = text.match(/\{:(?:type|tag|expr)\s[^}]{0,80}/);
+ if (dictMatch) leaks.push({ kind: 'raw-dict-outside-island', sample: dictMatch[0] });
+ return leaks;
+ }).catch(() => []);
+
+ return { url, islands, leaks: [...leaks, ...globalLeaks], handlers, pageErrors };
+}
+
+// ---------------------------------------------------------------------------
+// Mode: diff — SSR vs hydrated DOM (full page)
+// ---------------------------------------------------------------------------
+
+async function modeDiff(browser, url) {
+ const snap = snapshotScript();
+
+ const ssrCtx = await browser.newContext({ javaScriptEnabled: false });
+ const ssrPage = await ssrCtx.newPage();
+ await ssrPage.goto(BASE_URL + url, { waitUntil: 'domcontentloaded', timeout: 15000 });
+ const ssrTree = await ssrPage.evaluate(`${snap}(document.getElementById('sx-root'))`);
+ const ssrText = await ssrPage.evaluate(() => {
+ const root = document.getElementById('sx-root');
+ return root ? root.innerText.replace(/\s+/g, ' ').trim().substring(0, 500) : '';
+ });
+ await ssrCtx.close();
+
+ const hydCtx = await browser.newContext({ javaScriptEnabled: true });
+ const hydPage = await hydCtx.newPage();
+ const pageErrors = [];
+ hydPage.on('pageerror', err => pageErrors.push(err.message));
+ await hydPage.goto(BASE_URL + url, { waitUntil: 'networkidle', timeout: 15000 });
+ await waitForHydration(hydPage);
+ const hydTree = await hydPage.evaluate(`${snap}(document.getElementById('sx-root'))`);
+ const hydText = await hydPage.evaluate(() => {
+ const root = document.getElementById('sx-root');
+ return root ? root.innerText.replace(/\s+/g, ' ').trim().substring(0, 500) : '';
+ });
+ await hydCtx.close();
+
+ const changes = diffTrees(ssrTree, hydTree);
+ const textMatch = ssrText === hydText;
+
+ return {
+ url,
+ ssrTextPreview: ssrText.substring(0, 300),
+ hydratedTextPreview: hydText.substring(0, 300),
+ textMatch,
+ structuralChanges: changes.length,
+ changes: changes.slice(0, 50),
+ pageErrors
+ };
+}
+
+// ---------------------------------------------------------------------------
+// Mode: hydrate — SSR vs hydrated comparison focused on lakes
+// ---------------------------------------------------------------------------
+
+async function modeHydrate(browser, url) {
+ // SSR: capture lake innerHTML without JS
+ const ssrCtx = await browser.newContext({ javaScriptEnabled: false });
+ const ssrPage = await ssrCtx.newPage();
+ await ssrPage.goto(BASE_URL + url, { waitUntil: 'domcontentloaded', timeout: 15000 });
+
+ const ssrLakes = await ssrPage.$$eval('[data-sx-lake]', els =>
+ els.map(el => ({
+ id: el.getAttribute('data-sx-lake'),
+ island: el.closest('[data-sx-island]')?.getAttribute('data-sx-island') || null,
+ html: el.innerHTML.substring(0, 500),
+ hasElements: el.children.length > 0,
+ text: el.textContent.trim().substring(0, 200)
+ })));
+
+ const ssrIslands = await ssrPage.$$eval('[data-sx-island]', els =>
+ els.map(el => ({
+ name: el.getAttribute('data-sx-island'),
+ text: el.textContent.replace(/\s+/g, ' ').trim().substring(0, 200),
+ hasError: /Island error:|Undefined symbol:/.test(el.textContent)
+ })));
+
+ await ssrCtx.close();
+
+ // Hydrated: capture same after JS runs
+ const hydCtx = await browser.newContext({ javaScriptEnabled: true });
+ const hydPage = await hydCtx.newPage();
+ const pageErrors = [];
+ hydPage.on('pageerror', err => pageErrors.push(err.message));
+ await hydPage.goto(BASE_URL + url, { waitUntil: 'networkidle', timeout: 15000 });
+ await waitForHydration(hydPage);
+
+ const hydLakes = await hydPage.$$eval('[data-sx-lake]', els =>
+ els.map(el => ({
+ id: el.getAttribute('data-sx-lake'),
+ island: el.closest('[data-sx-island]')?.getAttribute('data-sx-island') || null,
+ html: el.innerHTML.substring(0, 500),
+ hasElements: el.children.length > 0,
+ text: el.textContent.trim().substring(0, 200)
+ })));
+
+ const hydIslands = await hydPage.$$eval('[data-sx-island]', els =>
+ els.map(el => ({
+ name: el.getAttribute('data-sx-island'),
+ text: el.textContent.replace(/\s+/g, ' ').trim().substring(0, 200),
+ hasError: /Island error:|Undefined symbol:/.test(el.textContent)
+ })));
+
+ await hydCtx.close();
+
+ // Compare lakes
+ const lakeReport = [];
+ const ssrMap = Object.fromEntries(ssrLakes.map(l => [l.id, l]));
+ const hydMap = Object.fromEntries(hydLakes.map(l => [l.id, l]));
+ const allIds = new Set([...ssrLakes.map(l => l.id), ...hydLakes.map(l => l.id)]);
+
+ for (const id of allIds) {
+ const ssr = ssrMap[id];
+ const hyd = hydMap[id];
+ const entry = { id, island: ssr?.island || hyd?.island };
+
+ if (!ssr) { entry.status = 'added-by-hydration'; }
+ else if (!hyd) { entry.status = 'removed-by-hydration'; }
+ else if (ssr.html === hyd.html) { entry.status = 'identical'; }
+ else {
+ const ssrHasEls = ssr.hasElements;
+ const hydHasEls = hyd.hasElements;
+ if (ssrHasEls && !hydHasEls) {
+ entry.status = 'CLOBBERED';
+ entry.detail = 'SSR had DOM elements, hydration replaced with text';
+ entry.ssrPreview = ssr.text.substring(0, 100);
+ entry.hydPreview = hyd.text.substring(0, 100);
+ } else if (!ssrHasEls && hydHasEls) {
+ entry.status = 'upgraded';
+ entry.detail = 'SSR had text, hydration rendered DOM';
+ } else {
+ entry.status = 'changed';
+ entry.ssrPreview = ssr.text.substring(0, 100);
+ entry.hydPreview = hyd.text.substring(0, 100);
+ }
+ }
+ lakeReport.push(entry);
+ }
+
+ // Compare islands
+ const islandReport = [];
+ const ssrIslandMap = Object.fromEntries(ssrIslands.map(i => [i.name, i]));
+ const hydIslandMap = Object.fromEntries(hydIslands.map(i => [i.name, i]));
+
+ for (const name of new Set([...ssrIslands.map(i => i.name), ...hydIslands.map(i => i.name)])) {
+ const ssr = ssrIslandMap[name];
+ const hyd = hydIslandMap[name];
+ const entry = { name };
+
+ if (ssr?.hasError) entry.ssrError = true;
+ if (hyd?.hasError) entry.hydrationError = true;
+ if (ssr && hyd && ssr.text === hyd.text) entry.textMatch = true;
+ else if (ssr && hyd) {
+ entry.textMatch = false;
+ entry.ssrPreview = ssr.text.substring(0, 100);
+ entry.hydPreview = hyd.text.substring(0, 100);
+ }
+ islandReport.push(entry);
+ }
+
+ const clobbered = lakeReport.filter(l => l.status === 'CLOBBERED');
+
+ return {
+ url,
+ summary: {
+ lakes: lakeReport.length,
+ identical: lakeReport.filter(l => l.status === 'identical').length,
+ clobbered: clobbered.length,
+ changed: lakeReport.filter(l => l.status === 'changed').length
+ },
+ lakes: lakeReport,
+ islands: islandReport,
+ pageErrors
+ };
+}
+
+// ---------------------------------------------------------------------------
+// Mode: eval — evaluate JS expression
+// ---------------------------------------------------------------------------
+
+async function modeEval(page, url, expr) {
+ await page.goto(BASE_URL + url, { waitUntil: 'networkidle', timeout: 15000 });
+ await waitForHydration(page);
+ const result = await page.evaluate(expr);
+ return { url, expr, result };
+}
+
+// ---------------------------------------------------------------------------
+// Mode: interact — action sequence
+// ---------------------------------------------------------------------------
+
+async function modeInteract(page, url, actionsStr) {
+ await page.goto(BASE_URL + url, { waitUntil: 'networkidle', timeout: 15000 });
+ await waitForHydration(page);
+
+ const actions = actionsStr.split(';').map(a => a.trim()).filter(Boolean);
+ const results = [];
+
+ for (const action of actions) {
+ const [cmd, ...rest] = action.split(':');
+ const arg = rest.join(':');
+
+ try {
+ switch (cmd) {
+ case 'click':
+ await page.locator(arg).first().click();
+ results.push({ action: 'click', selector: arg, ok: true });
+ break;
+ case 'fill': {
+ const [sel, ...valParts] = arg.split(':');
+ const val = valParts.join(':');
+ await page.locator(sel).first().fill(val);
+ results.push({ action: 'fill', selector: sel, value: val, ok: true });
+ break;
+ }
+ case 'wait':
+ await page.waitForTimeout(parseInt(arg) || 500);
+ results.push({ action: 'wait', ms: parseInt(arg) || 500 });
+ break;
+ case 'text': {
+ const text = await page.locator(arg).first().textContent();
+ results.push({ action: 'text', selector: arg, value: text?.trim() });
+ break;
+ }
+ case 'html': {
+ const html = await page.locator(arg).first().innerHTML();
+ results.push({ action: 'html', selector: arg, value: html?.substring(0, 500) });
+ break;
+ }
+ case 'attrs': {
+ const attrs = await page.locator(arg).first().evaluate(el => {
+ const a = {};
+ for (const attr of el.attributes) a[attr.name] = attr.value.substring(0, 200);
+ return a;
+ });
+ results.push({ action: 'attrs', selector: arg, value: attrs });
+ break;
+ }
+ case 'screenshot': {
+ const ts = Date.now();
+ const path = `${SCREENSHOT_DIR}/sx-inspect-${ts}.png`;
+ if (arg) {
+ await page.locator(arg).first().screenshot({ path });
+ } else {
+ await page.screenshot({ path });
+ }
+ results.push({ action: 'screenshot', selector: arg || 'full-page', path });
+ break;
+ }
+ case 'count': {
+ const count = await page.locator(arg).count();
+ results.push({ action: 'count', selector: arg, value: count });
+ break;
+ }
+ case 'visible': {
+ const visible = await page.locator(arg).first().isVisible().catch(() => false);
+ results.push({ action: 'visible', selector: arg, value: visible });
+ break;
+ }
+ default:
+ results.push({ action: cmd, error: 'unknown action' });
+ }
+ } catch (e) {
+ results.push({ action: cmd, selector: arg, error: e.message });
+ }
+ }
+
+ return { url, results };
+}
+
+// ---------------------------------------------------------------------------
+// Mode: screenshot
+// ---------------------------------------------------------------------------
+
+async function modeScreenshot(page, url, selector) {
+ await page.goto(BASE_URL + url, { waitUntil: 'networkidle', timeout: 15000 });
+ await waitForHydration(page);
+
+ const ts = Date.now();
+ const path = `${SCREENSHOT_DIR}/sx-screenshot-${ts}.png`;
+
+ if (selector) {
+ await page.locator(selector).first().screenshot({ path });
+ } else {
+ await page.screenshot({ path });
+ }
+
+ return { url, selector: selector || 'full-page', path };
+}
+
+// ---------------------------------------------------------------------------
+// Main
+// ---------------------------------------------------------------------------
+
+async function main() {
+ const argsJson = process.argv[2] || '{}';
+ let args;
+ try {
+ args = JSON.parse(argsJson);
+ } catch (e) {
+ console.log(JSON.stringify({ error: `Invalid JSON args: ${e.message}` }));
+ process.exit(1);
+ }
+
+ const mode = args.mode || 'inspect';
+ const url = args.url || '/';
+
+ const browser = await chromium.launch({ headless: true });
+ const page = await browser.newPage();
+
+ try {
+ let result;
+ switch (mode) {
+ case 'inspect':
+ result = await modeInspect(page, url, args.island);
+ break;
+ case 'diff':
+ result = await modeDiff(browser, url);
+ break;
+ case 'hydrate':
+ result = await modeHydrate(browser, url);
+ break;
+ case 'eval':
+ result = await modeEval(page, url, args.expr || 'document.title');
+ break;
+ case 'interact':
+ result = await modeInteract(page, url, args.actions || '');
+ break;
+ case 'screenshot':
+ result = await modeScreenshot(page, url, args.selector);
+ break;
+ default:
+ result = { error: `Unknown mode: ${mode}` };
+ }
+ console.log(JSON.stringify(result, null, 2));
+ } catch (e) {
+ console.log(JSON.stringify({ error: e.message, stack: e.stack?.split('\n').slice(0, 5) }));
+ } finally {
+ await browser.close();
+ }
+}
+
+main();
diff --git a/web/harness-web.sx b/web/harness-web.sx
index 52d90194..871acd6a 100644
--- a/web/harness-web.sx
+++ b/web/harness-web.sx
@@ -1,154 +1,320 @@
-;; ==========================================================================
-;; web/harness-web.sx — Web platform testing extensions
-;;
-;; Extends spec/harness.sx with DOM mocking, event simulation, and
-;; web-specific assertions. Depends on web/signals.sx for reactive features.
-;;
-;; Mock DOM: lightweight element stubs that record operations.
-;; No real browser needed — runs on any host.
-;; ==========================================================================
+(define
+ mock-element
+ :effects ()
+ (fn ((tag :as string) &key class id) {:children (list) :listeners {} :event-log (list) :tag tag :text "" :attrs (merge {} (if class {:class class} {}) (if id {:id id} {}))}))
+(define
+ mock-set-text!
+ :effects (mutation)
+ (fn (el (text :as string)) (dict-set! el "text" text)))
-;; --------------------------------------------------------------------------
-;; Mock DOM elements
-;; --------------------------------------------------------------------------
+(define
+ mock-append-child!
+ :effects (mutation)
+ (fn (parent child) (append! (get parent "children") child)))
-;; Create a mock element with tag name, attrs dict, children list, and event log
-(define mock-element :effects []
- (fn ((tag :as string) &key class id)
- {:tag tag
- :attrs (merge {} (if class {:class class} {}) (if id {:id id} {}))
- :children (list)
- :text ""
- :event-log (list)
- :listeners {}}))
+(define
+ mock-set-attr!
+ :effects (mutation)
+ (fn (el (name :as string) value) (dict-set! (get el "attrs") name value)))
-;; Set text content on mock element
-(define mock-set-text! :effects [mutation]
- (fn (el (text :as string))
- (dict-set! el "text" text)))
+(define
+ mock-get-attr
+ :effects ()
+ (fn (el (name :as string)) (get (get el "attrs") name)))
-;; Append child to mock element
-(define mock-append-child! :effects [mutation]
- (fn (parent child)
- (append! (get parent "children") child)))
-
-;; Set attribute on mock element
-(define mock-set-attr! :effects [mutation]
- (fn (el (name :as string) value)
- (dict-set! (get el "attrs") name value)))
-
-;; Get attribute from mock element
-(define mock-get-attr :effects []
- (fn (el (name :as string))
- (get (get el "attrs") name)))
-
-;; Add event listener to mock element
-(define mock-add-listener! :effects [mutation]
- (fn (el (event-name :as string) (handler :as lambda))
- (let ((listeners (get el "listeners")))
- (when (not (has-key? listeners event-name))
+(define
+ mock-add-listener!
+ :effects (mutation)
+ (fn
+ (el (event-name :as string) (handler :as lambda))
+ (let
+ ((listeners (get el "listeners")))
+ (when
+ (not (has-key? listeners event-name))
(dict-set! listeners event-name (list)))
(append! (get listeners event-name) handler))))
-
-;; --------------------------------------------------------------------------
-;; Event simulation
-;; --------------------------------------------------------------------------
-
-;; Simulate a click event on a mock element
-(define simulate-click :effects [mutation]
- (fn (el)
- (let ((handlers (get (get el "listeners") "click")))
- (when handlers
- (for-each (fn (h) (cek-call h (list {:type "click" :target el})))
- handlers))
+(define
+ simulate-click
+ :effects (mutation)
+ (fn
+ (el)
+ (let
+ ((handlers (get (get el "listeners") "click")))
+ (when
+ handlers
+ (for-each (fn (h) (cek-call h (list {:target el :type "click"}))) handlers))
(append! (get el "event-log") {:type "click"}))))
-;; Simulate an input event with a value
-(define simulate-input :effects [mutation]
- (fn (el (value :as string))
+(define
+ simulate-input
+ :effects (mutation)
+ (fn
+ (el (value :as string))
(mock-set-attr! el "value" value)
- (let ((handlers (get (get el "listeners") "input")))
- (when handlers
- (for-each (fn (h) (cek-call h (list {:type "input" :target el})))
- handlers))
- (append! (get el "event-log") {:type "input" :value value}))))
+ (let
+ ((handlers (get (get el "listeners") "input")))
+ (when
+ handlers
+ (for-each (fn (h) (cek-call h (list {:target el :type "input"}))) handlers))
+ (append! (get el "event-log") {:value value :type "input"}))))
-;; Simulate a custom event (for lake→island bridge)
-(define simulate-event :effects [mutation]
- (fn (el (event-name :as string) detail)
- (let ((handlers (get (get el "listeners") event-name)))
- (when handlers
- (for-each (fn (h) (cek-call h (list {:type event-name :detail detail :target el})))
- handlers))
- (append! (get el "event-log") {:type event-name :detail detail}))))
+(define
+ simulate-event
+ :effects (mutation)
+ (fn
+ (el (event-name :as string) detail)
+ (let
+ ((handlers (get (get el "listeners") event-name)))
+ (when
+ handlers
+ (for-each (fn (h) (cek-call h (list {:target el :detail detail :type event-name}))) handlers))
+ (append! (get el "event-log") {:detail detail :type event-name}))))
-
-;; --------------------------------------------------------------------------
-;; DOM assertions
-;; --------------------------------------------------------------------------
-
-;; Assert mock element has specific text content
-(define assert-text :effects []
- (fn (el (expected :as string))
- (let ((actual (get el "text")))
- (assert= actual expected
+(define
+ assert-text
+ :effects ()
+ (fn
+ (el (expected :as string))
+ (let
+ ((actual (get el "text")))
+ (assert=
+ actual
+ expected
(str "Expected text \"" expected "\", got \"" actual "\"")))))
-;; Assert mock element has an attribute with expected value
-(define assert-attr :effects []
- (fn (el (name :as string) expected)
- (let ((actual (mock-get-attr el name)))
- (assert= actual expected
+(define
+ assert-attr
+ :effects ()
+ (fn
+ (el (name :as string) expected)
+ (let
+ ((actual (mock-get-attr el name)))
+ (assert=
+ actual
+ expected
(str "Expected attr " name "=\"" expected "\", got \"" actual "\"")))))
-;; Assert mock element has a CSS class
-(define assert-class :effects []
- (fn (el (class-name :as string))
- (let ((classes (or (mock-get-attr el "class") "")))
- (assert (contains? (split classes " ") class-name)
+(define
+ assert-class
+ :effects ()
+ (fn
+ (el (class-name :as string))
+ (let
+ ((classes (or (mock-get-attr el "class") "")))
+ (assert
+ (contains? (split classes " ") class-name)
(str "Expected class \"" class-name "\" in \"" classes "\"")))))
-;; Assert mock element does NOT have a CSS class
-(define assert-no-class :effects []
- (fn (el (class-name :as string))
- (let ((classes (or (mock-get-attr el "class") "")))
- (assert (not (contains? (split classes " ") class-name))
+(define
+ assert-no-class
+ :effects ()
+ (fn
+ (el (class-name :as string))
+ (let
+ ((classes (or (mock-get-attr el "class") "")))
+ (assert
+ (not (contains? (split classes " ") class-name))
(str "Expected no class \"" class-name "\" but found in \"" classes "\"")))))
-;; Assert mock element has N children
-(define assert-child-count :effects []
- (fn (el (n :as number))
- (let ((actual (len (get el "children"))))
- (assert= actual n
- (str "Expected " n " children, got " actual)))))
+(define
+ assert-child-count
+ :effects ()
+ (fn
+ (el (n :as number))
+ (let
+ ((actual (len (get el "children"))))
+ (assert= actual n (str "Expected " n " children, got " actual)))))
-;; Assert an event was fired on mock element
-(define assert-event-fired :effects []
- (fn (el (event-name :as string))
- (assert (some (fn (e) (= (get e "type") event-name)) (get el "event-log"))
+(define
+ assert-event-fired
+ :effects ()
+ (fn
+ (el (event-name :as string))
+ (assert
+ (some (fn (e) (= (get e "type") event-name)) (get el "event-log"))
(str "Expected event \"" event-name "\" to have been fired"))))
-;; Assert an event was NOT fired on mock element
-(define assert-no-event :effects []
- (fn (el (event-name :as string))
- (assert (not (some (fn (e) (= (get e "type") event-name)) (get el "event-log")))
+(define
+ assert-no-event
+ :effects ()
+ (fn
+ (el (event-name :as string))
+ (assert
+ (not
+ (some (fn (e) (= (get e "type") event-name)) (get el "event-log")))
(str "Expected event \"" event-name "\" to NOT have been fired"))))
-;; Count how many times an event was fired
-(define event-fire-count :effects []
- (fn (el (event-name :as string))
- (len (filter (fn (e) (= (get e "type") event-name)) (get el "event-log")))))
+(define
+ event-fire-count
+ :effects ()
+ (fn
+ (el (event-name :as string))
+ (len
+ (filter (fn (e) (= (get e "type") event-name)) (get el "event-log")))))
-
-;; --------------------------------------------------------------------------
-;; Web harness constructor — extends make-harness with DOM mock state
-;; --------------------------------------------------------------------------
-
-(define make-web-harness :effects []
- (fn (&key platform)
- (let ((h (make-harness :platform platform)))
- (harness-set! h "dom" {:root (mock-element "div" :id "root")
- :elements {}})
+(define
+ make-web-harness
+ :effects ()
+ (fn
+ (&key platform)
+ (let
+ ((h (make-harness :platform platform)))
+ (harness-set! h "dom" {:elements {} :root (mock-element "div" :id "root")})
h)))
+
+(define
+ is-renderable?
+ :effects ()
+ (fn
+ (value)
+ (cond
+ (nil? value)
+ true
+ (string? value)
+ true
+ (number? value)
+ true
+ (boolean? value)
+ true
+ (dict? value)
+ false
+ (not (list? value))
+ false
+ (empty? value)
+ true
+ :else (let
+ ((head (first value)))
+ (and (= (type-of head) "symbol") (not (dict? head)))))))
+
+(define
+ is-render-leak?
+ :effects ()
+ (fn (value) (and (not (nil? value)) (not (is-renderable? value)))))
+
+(define
+ assert-renderable
+ :effects ()
+ (fn
+ (value label)
+ (assert
+ (is-renderable? value)
+ (str
+ "Render leak in "
+ label
+ ": "
+ (type-of value)
+ (cond
+ (dict? value)
+ " — dict would appear as {:key val} text in output"
+ (and (list? value) (not (empty? value)) (dict? (first value)))
+ " — list of dicts would appear as raw data in output"
+ :else " — non-renderable value would appear as text")))))
+
+(define
+ render-body-audit
+ :effects ()
+ (fn
+ (values)
+ (let
+ ((leaks (list)))
+ (for-each
+ (fn (v) (when (is-render-leak? v) (append! leaks {:leak-kind (cond (dict? v) "dict" (and (list? v) (not (empty? v)) (dict? (first v))) "list-of-dicts" :else "other") :value-type (type-of v)})))
+ values)
+ leaks)))
+
+(define
+ assert-render-body-clean
+ :effects ()
+ (fn
+ (values label)
+ (let
+ ((leaks (render-body-audit values)))
+ (assert
+ (empty? leaks)
+ (str
+ "Render body has "
+ (len leaks)
+ " leak(s) in "
+ label
+ ". "
+ "render-to-html/render-to-dom render ALL body expressions — "
+ "put side effects in let bindings, not body expressions.")))))
+
+(define
+ mock-render
+ :effects (mutation)
+ (fn
+ (expr)
+ (cond
+ (nil? expr)
+ nil
+ (string? expr)
+ (let ((el (mock-element "TEXT"))) (mock-set-text! el expr) el)
+ (number? expr)
+ (let ((el (mock-element "TEXT"))) (mock-set-text! el (str expr)) el)
+ (not (list? expr))
+ nil
+ (empty? expr)
+ nil
+ :else (let
+ ((head (first expr)))
+ (if
+ (not (= (type-of head) "symbol"))
+ nil
+ (let
+ ((el (mock-element (symbol-name head))))
+ (let
+ loop
+ ((args (rest expr)))
+ (when
+ (not (empty? args))
+ (let
+ ((arg (first args)))
+ (if
+ (= (type-of arg) "keyword")
+ (when
+ (not (empty? (rest args)))
+ (mock-set-attr! el (keyword-name arg) (nth args 1))
+ (loop (rest (rest args))))
+ (do
+ (let
+ ((child-el (mock-render arg)))
+ (when child-el (mock-append-child! el child-el)))
+ (loop (rest args)))))))
+ el))))))
+
+(define
+ mock-render-fragment
+ :effects (mutation)
+ (fn
+ (exprs)
+ (filter (fn (el) (not (nil? el))) (map mock-render exprs))))
+
+(define
+ assert-single-render-root
+ :effects ()
+ (fn
+ (exprs label)
+ (let
+ ((rendered (mock-render-fragment exprs)))
+ (assert
+ (= (len rendered) 1)
+ (str
+ "Expected single render root in "
+ label
+ " but got "
+ (len rendered)
+ " element(s). "
+ "Multi-body let/begin in render-to-html/render-to-dom renders "
+ "ALL expressions — put side effects in let bindings.")))))
+
+(define
+ assert-tag
+ :effects ()
+ (fn
+ (el expected-tag)
+ (assert
+ (= (get el "tag") expected-tag)
+ (str "Expected <" expected-tag "> but got <" (get el "tag") ">"))))