From 0921f3c66343d9235660fc930ce7e1477a02ef83 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Mon, 17 Mar 2025 03:37:34 +0100
Subject: [PATCH 1/8] fix: some past PRs that added doc comments
---
src/stdlib/stdlib/std/internal/address.tact | 2 +-
src/stdlib/stdlib/std/internal/cells.tact | 157 +++++++++++++++-----
2 files changed, 120 insertions(+), 39 deletions(-)
diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact
index a0ea3a23a..695b7db2d 100644
--- a/src/stdlib/stdlib/std/internal/address.tact
+++ b/src/stdlib/stdlib/std/internal/address.tact
@@ -220,7 +220,7 @@ asm( -> 1 0) extends mutates fun loadAddress(self: Slice): Address { LDMSGADDR }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadaddress
+/// See: https://docs.tact-lang.org/ref/core-cells#sliceskipaddress
///
asm extends mutates fun skipAddress(self: Slice) { LDMSGADDR NIP }
diff --git a/src/stdlib/stdlib/std/internal/cells.tact b/src/stdlib/stdlib/std/internal/cells.tact
index 6cf57ee0e..73d474c31 100644
--- a/src/stdlib/stdlib/std/internal/cells.tact
+++ b/src/stdlib/stdlib/std/internal/cells.tact
@@ -338,8 +338,7 @@ asm extends fun depth(self: Builder): Int { BDEPTH }
/// }
/// ```
///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#cellbeginparse
+/// See: https://docs.tact-lang.org/ref/core-cells#cellbeginparse
///
asm extends fun beginParse(self: Cell): Slice { CTOS }
@@ -368,6 +367,10 @@ asm extends fun beginParse(self: Cell): Slice { CTOS }
/// }
/// ```
///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadref
+/// * https://docs.tact-lang.org/book/exit-codes
+///
/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
@@ -395,6 +398,10 @@ asm(-> 1 0) extends mutates fun loadRef(self: Slice): Cell { LDREF }
/// }
/// ```
///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipref
+/// * https://docs.tact-lang.org/book/exit-codes
+///
/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
@@ -477,7 +484,7 @@ asm(-> 1 0) extends mutates fun loadMaybeRef(self: Slice): Cell? { LDOPTREF }
/// ```
///
/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#sliceloadmayberef
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipmayberef
/// * https://docs.tact-lang.org/book/exit-codes
///
asm extends mutates fun skipMaybeRef(self: Slice) { LDOPTREF NIP }
@@ -532,6 +539,7 @@ asm extends fun preloadMaybeRef(self: Slice): Cell? { PLDOPTREF }
///
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#sliceloadbits
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -559,6 +567,7 @@ extends mutates native loadBits(self: Slice, l: Int): Slice;
///
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#slicepreloadbits
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -585,6 +594,7 @@ extends native preloadBits(self: Slice, l: Int): Slice;
///
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#sliceloadint
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -612,6 +622,7 @@ extends mutates native loadInt(self: Slice, l: Int): Int;
///
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#slicepreloadint
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -638,6 +649,7 @@ extends native preloadInt(self: Slice, l: Int): Int;
///
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#sliceloaduint
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -665,6 +677,7 @@ extends mutates native loadUint(self: Slice, l: Int): Int;
///
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#slicepreloaduint
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -690,6 +703,10 @@ extends native preloadUint(self: Slice, l: Int): Int;
/// }
/// ```
///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadbool
+/// * https://docs.tact-lang.org/book/exit-codes
+///
/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
@@ -717,6 +734,10 @@ asm(-> 1 0) extends mutates fun loadBool(self: Slice): Bool { 1 LDI }
/// }
/// ```
///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipbool
+/// * https://docs.tact-lang.org/book/exit-codes
+///
/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
@@ -741,9 +762,9 @@ asm(-> 1 0) extends mutates fun loadBit(self: Slice): Bool { 1 LDI }
///
/// Loads and returns a serialized unsigned `Int` value in the range from 0 to 2^120 - 1 inclusive from the `Slice`. This value usually represents the amount in nanoToncoins.
///
-/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -752,7 +773,12 @@ asm(-> 1 0) extends mutates fun loadBit(self: Slice): Bool { 1 LDI }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadcoins
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadcoins
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm( -> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 }
@@ -760,9 +786,9 @@ asm( -> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 }
///
/// Skips a serialized unsigned `Int` value in the range from 0 to 2^120 - 1 inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadCoins()`.
///
-/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -776,7 +802,12 @@ asm( -> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadcoins
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipcoins
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends mutates fun skipCoins(self: Slice) { LDVARUINT16 NIP }
@@ -814,8 +845,8 @@ asm( -> 1 0) extends mutates fun loadVarUint16(self: Slice): Int { LDVARUINT16 }
/// ```
///
/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint16
-/// * https://docs.tact-lang.org/ref/core-cells#sliceloadcoins
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint16
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipcoins
///
asm extends mutates fun skipVarUint16(self: Slice){ LDVARUINT16 NIP }
@@ -823,9 +854,9 @@ asm extends mutates fun skipVarUint16(self: Slice){ LDVARUINT16 NIP }
///
/// Similar to `Slice.loadCoins()`, but with a different `value` range: from -2^119 to 2^119 - 1 inclusive.
///
-/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -834,7 +865,12 @@ asm extends mutates fun skipVarUint16(self: Slice){ LDVARUINT16 NIP }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm( -> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 }
@@ -842,9 +878,9 @@ asm( -> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 }
///
/// Similar to `Slice.skipCoins()`, but with a different `value` range: from -2^119 to 2^119 - 1 inclusive.
///
-/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -858,7 +894,12 @@ asm( -> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvarint16
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP }
@@ -866,9 +907,9 @@ asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP }
///
/// Loads and returns a serialized unsigned `Int` value in the range from 0 to 2^248 − 1 inclusive from the `Slice`.
///
-/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -877,7 +918,12 @@ asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm( -> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 }
@@ -885,9 +931,9 @@ asm( -> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 }
///
/// Skips a serialized unsigned `Int` value in the range from 0 to 2^248 − 1 inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadVarUint32()`.
///
-/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -901,7 +947,12 @@ asm( -> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint32
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP }
@@ -909,9 +960,9 @@ asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP }
///
/// Similar to `Slice.loadVarUint32()`, but with a different `value` range: from -2^247 to 2^247 - 1 inclusive.
///
-/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to load such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to load more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -920,7 +971,12 @@ asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvarint32
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadvarint32
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm( -> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 }
@@ -928,9 +984,9 @@ asm( -> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 }
///
/// Similar to `Slice.skipVarUint32()`, but with a different `value` range: from -2^247 to 2^247 - 1 inclusive.
///
-/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with exit code 8: `Cell overflow`.
+/// Attempts to skip such `Int` when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
///
-/// Attempts to skip more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -944,7 +1000,12 @@ asm( -> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipvarint32
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends mutates fun skipVarInt32(self: Slice) { LDVARINT32 NIP }
@@ -966,7 +1027,9 @@ asm extends mutates fun skipVarInt32(self: Slice) { LDVARINT32 NIP }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceskipbits
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipbits
+/// * https://docs.tact-lang.org/book/exit-codes
///
/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
@@ -990,6 +1053,10 @@ asm extends mutates fun skipBits(self: Slice, l: Int) { SDSKIPFIRST }
/// }
/// ```
///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceendparse
+/// * https://docs.tact-lang.org/book/exit-codes
+///
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends fun endParse(self: Slice) { ENDS }
@@ -998,9 +1065,9 @@ asm extends fun endParse(self: Slice) { ENDS }
///
/// Preloads all but the last 0 ≤ `len` ≤ 1023 bits from the `Slice`.
///
-/// Attempts to specify an out-of-bounds `len` value throw an exception with exit code 5: `Integer out of expected range`.
+/// Attempts to specify an out-of-bounds `len` value throw an exception with [exit code 5]: `Integer out of expected range`.
///
-/// Attempts to preload more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to preload more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -1010,7 +1077,12 @@ asm extends fun endParse(self: Slice) { ENDS }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#sliceskiplastbits
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskiplastbits
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST }
@@ -1018,9 +1090,9 @@ asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST }
///
/// Preloads the first 0 ≤ `len` ≤ 1023 bits from the `Slice`.
///
-/// Attempts to specify an out-of-bounds `len` value throw an exception with exit code 5: `Integer out of expected range`.
+/// Attempts to specify an out-of-bounds `len` value throw an exception with [exit code 5]: `Integer out of expected range`.
///
-/// Attempts to preload more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to preload more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -1034,6 +1106,10 @@ asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST }
/// See:
/// * https://docs.tact-lang.org/ref/core-cells#slicefirstbits
/// * https://docs.tact-lang.org/ref/core-cells#slicepreloadbits
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST }
@@ -1041,9 +1117,9 @@ asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST }
///
/// Preloads the last 0 ≤ `len` ≤ 1023 bits from the `Slice`.
///
-/// Attempts to specify an out-of-bounds `len` value throw an exception with exit code 5: `Integer out of expected range`.
+/// Attempts to specify an out-of-bounds `len` value throw an exception with [exit code 5]: `Integer out of expected range`.
///
-/// Attempts to preload more data than `Slice` contains throw an exception with exit code 9: `Cell underflow`.
+/// Attempts to preload more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
///
/// ```tact
/// fun example() {
@@ -1052,7 +1128,12 @@ asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST }
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#slicelastbits
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#slicelastbits
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
asm extends fun lastBits(self: Slice, len: Int): Slice { SDCUTLAST }
From c9789d3be0bb3891c13144b38f6f6ae0228103f2 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Mon, 17 Mar 2025 04:16:03 +0100
Subject: [PATCH 2/8] feat(docs/stdlib): `Slice.loadBasechainAddress()` and
`Slice.skipBasechainAddress()`
---
docs/src/content/docs/ref/core-cells.mdx | 54 +++++++++++++++
src/stdlib/stdlib/std/internal/address.tact | 75 ++++++++++++++++++++-
2 files changed, 128 insertions(+), 1 deletion(-)
diff --git a/docs/src/content/docs/ref/core-cells.mdx b/docs/src/content/docs/ref/core-cells.mdx
index 728c0c54c..6ea949cfb 100644
--- a/docs/src/content/docs/ref/core-cells.mdx
+++ b/docs/src/content/docs/ref/core-cells.mdx
@@ -1169,6 +1169,59 @@ s1.skipAddress();
let fizz: Int = s1.loadUint(32); // 42
```
+### Slice.loadBasechainAddress
+
+
+
+```tact
+extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress;
+```
+
+Extension mutation function for the [`Slice{:tact}`][slice] type.
+
+Loads and returns a [`BasechainAddress{:tact}`][base-addr] [struct][struct] from the [`Slice{:tact}`][slice].
+
+Attempts to load such [`BasechainAddress{:tact}`][base-addr] struct when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
+Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
+
+Usage example:
+
+```tact
+let s: Slice = beginCell()
+ .storeBasechainAddress(BasechainAddress{ hash: null })
+ .asSlice();
+let fizz: BasechainAddress = s.loadBasechainAddress();
+```
+
+### Slice.skipBasechainAddress
+
+
+
+```tact
+extends mutates fun skipBasechainAddress(self: Slice);
+```
+
+Extension mutation function for the [`Slice{:tact}`][slice] type.
+
+Skips a [`BasechainAddress{:tact}`][base-addr] [struct][struct] from the [`Slice{:tact}`][slice].
+
+Attempts to skip such [`BasechainAddress{:tact}`][base-addr] struct when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
+Attempts to skip more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
+
+Usage example:
+
+```tact
+let s1: Slice = beginCell()
+ .storeBasechainAddress(BasechainAddress{ hash: null })
+ .storeUint(42, 32)
+ .asSlice();
+
+s1.skipBasechainAddress();
+let fizz: Int = s1.loadUint(32); // 42
+```
+
### Slice.loadRef
```tact
@@ -2015,6 +2068,7 @@ fun cautiousParse(payload: Slice): TripleAxe? {
[message]: /book/structs-and-messages#messages
[null]: /book/optionals
+[base-addr]: /ref/core-addresses#basechainaddress
[std-repr]: /book/cells#cells-representation
[tlb]: https://docs.ton.org/develop/data-formats/tl-b-language
diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact
index 695b7db2d..8f7fe25e0 100644
--- a/src/stdlib/stdlib/std/internal/address.tact
+++ b/src/stdlib/stdlib/std/internal/address.tact
@@ -307,12 +307,15 @@ inline fun contractBasechainAddress(s: StateInit): BasechainAddress {
///
/// ```tact
/// fun example() {
-/// let addr: BasechainAddress = newBasechainAddress(0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8);
+/// let addr: BasechainAddress =
+/// newBasechainAddress(0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8);
/// let b: Builder = beginCell();
/// let b2: Builder = b.storeBasechainAddress(addr);
/// }
/// ```
///
+/// See: https://docs.tact-lang.org/ref/core-cells#builder.storebasechainaddress
+///
extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Builder {
if (address.hash == null) {
return self.storeUint(0, 2); // 0b00
@@ -323,6 +326,76 @@ extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Bui
.storeUint(address.hash!!, 256);
}
+/// Extension mutation function for the `Slice` type. Available since Tact 1.6.4.
+///
+/// Loads and returns a `BasechainAddress` struct from the `Slice`.
+///
+/// Attempts to load such `BasechainAddress` struct when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
+///
+/// Attempts to load more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
+///
+/// ```tact
+/// fun example() {
+/// let s: Slice = beginCell()
+/// .storeBasechainAddress(BasechainAddress{ hash: null })
+/// .asSlice();
+/// let fizz: BasechainAddress = s.loadBasechainAddress();
+/// }
+/// ```
+///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceloadbasechainaddress
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+///
+extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress {
+ if (self.loadUint(2) == 0) {
+ return BasechainAddress{ hash: null };
+ } else {
+ // Skip the remaining prefix
+ self.skipBits(9);
+ // Load the hash (account ID)
+ return BasechainAddress{ hash: self.loadUint(256) };
+ }
+}
+
+/// Extension mutation function for the `Slice` type. Available since Tact 1.6.4.
+///
+/// Skips a `BasechainAddress` struct from the `Slice`.
+///
+/// Attempts to skip such `BasechainAddress` struct when `Slice` doesn't contain it throw an exception with [exit code 8]: `Cell overflow`.
+///
+/// Attempts to skip more data than `Slice` contains throw an exception with [exit code 9]: `Cell underflow`.
+///
+/// ```tact
+/// fun example() {
+/// let s1: Slice = beginCell()
+/// .storeBasechainAddress(BasechainAddress{ hash: null })
+/// .storeUint(42, 32)
+/// .asSlice();
+///
+/// s1.skipBasechainAddress();
+/// let fizz: Int = s1.loadUint(32); // 42
+/// }
+/// ```
+///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-cells#sliceskipbasechainaddress
+/// * https://docs.tact-lang.org/book/exit-codes
+///
+/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
+/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+///
+extends mutates fun skipBasechainAddress(self: Slice) {
+ if (self.loadUint(2) != 0) {
+ // 9 bits of the remaining prefix since first 2 are loaded already
+ // plus 256 bits of the hash (account ID)
+ self.skipBits(265);
+ }
+}
+
/// Global function. Available since Tact 1.6.3.
///
/// Checks whether the `address` is in the basechain, i.e., its chain ID is 0. If it is not, throws an exception with exit code 138: `Not a basechain address`.
From 85eb255fccfd5b32de2c0f66aba998d1da0805e2 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Tue, 18 Mar 2025 09:55:54 +0100
Subject: [PATCH 3/8] fix
---
dev-docs/CHANGELOG.md | 1 +
src/stdlib/stdlib/std/internal/address.tact | 17 +++++++++++------
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md
index c6a63d3a0..f47be2d34 100644
--- a/dev-docs/CHANGELOG.md
+++ b/dev-docs/CHANGELOG.md
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Standard Library
- Added `forceWorkchain()` function: PR [#2387](https://github.com/tact-lang/tact/pull/2387)
+- Added `Slice.store` and functions: PR [#2395](https://github.com/tact-lang/tact/pull/2395)
### Docs
diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact
index 8f7fe25e0..d44c23464 100644
--- a/src/stdlib/stdlib/std/internal/address.tact
+++ b/src/stdlib/stdlib/std/internal/address.tact
@@ -314,7 +314,7 @@ inline fun contractBasechainAddress(s: StateInit): BasechainAddress {
/// }
/// ```
///
-/// See: https://docs.tact-lang.org/ref/core-cells#builder.storebasechainaddress
+/// See: https://docs.tact-lang.org/ref/core-cells#builderstorebasechainaddress
///
extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Builder {
if (address.hash == null) {
@@ -351,14 +351,15 @@ extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Bui
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress {
+ // addr_none
if (self.loadUint(2) == 0) {
return BasechainAddress{ hash: null };
- } else {
- // Skip the remaining prefix
- self.skipBits(9);
- // Load the hash (account ID)
- return BasechainAddress{ hash: self.loadUint(256) };
}
+
+ // addr_std, skip the remaining prefix bits
+ self.skipBits(9);
+ // Load the hash (account ID)
+ return BasechainAddress{ hash: self.loadUint(256) };
}
/// Extension mutation function for the `Slice` type. Available since Tact 1.6.4.
@@ -389,11 +390,15 @@ extends mutates fun loadBasechainAddress(self: Slice): BasechainAddress {
/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
///
extends mutates fun skipBasechainAddress(self: Slice) {
+ // addr_std
if (self.loadUint(2) != 0) {
// 9 bits of the remaining prefix since first 2 are loaded already
// plus 256 bits of the hash (account ID)
self.skipBits(265);
}
+
+ // addr_none, nothing to load since its 2 bits
+ // are loaded in the if statement above
}
/// Global function. Available since Tact 1.6.3.
From 350955bd4f9ce8f8fc7fb0a61306ee1a33fe5066 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Tue, 18 Mar 2025 09:56:41 +0100
Subject: [PATCH 4/8] changelog
---
dev-docs/CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md
index f47be2d34..2f960eea3 100644
--- a/dev-docs/CHANGELOG.md
+++ b/dev-docs/CHANGELOG.md
@@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Standard Library
- Added `forceWorkchain()` function: PR [#2387](https://github.com/tact-lang/tact/pull/2387)
-- Added `Slice.store` and functions: PR [#2395](https://github.com/tact-lang/tact/pull/2395)
+- Added `Slice.loadBasechainAddress()` and `Slice.skipBasechainAddress()` functions: PR [#2395](https://github.com/tact-lang/tact/pull/2395)
### Docs
From 12cdac0cb194efddcd30d85f3a85e28a0040ef92 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Tue, 18 Mar 2025 10:04:30 +0100
Subject: [PATCH 5/8] stdlib.ts
---
src/stdlib/stdlib.ts | 859 +++++++++++++++++++++++--------------------
1 file changed, 460 insertions(+), 399 deletions(-)
diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts
index 37a52636a..5009f4bba 100644
--- a/src/stdlib/stdlib.ts
+++ b/src/stdlib/stdlib.ts
@@ -273,7 +273,7 @@ files["std/internal/address.tact"] =
"eGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6" +
"IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3JlQWRkcmVzcyhteUFkZHJlc3MoKSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgMzIpCi8vLyAg" +
"ICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMxLnNraXBBZGRyZXNzKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIK" +
- "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkYWRkcmVzcwovLy8KYXNtIGV4" +
+ "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYWRkcmVzcwovLy8KYXNtIGV4" +
"dGVuZHMgbXV0YXRlcyBmdW4gc2tpcEFkZHJlc3Moc2VsZjogU2xpY2UpIHsgTERNU0dBRERSIE5JUCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1" +
"aWxkZXJgIHR5cGUuCi8vLwovLy8gU3RvcmVzIHRoZSBgYWRkcmVzc2AgaW4gdGhlIGNvcHkgb2YgdGhlIGBCdWlsZGVyYC4gUmV0dXJucyB0aGF0IGNvcHkuCi8vLwov" +
"Ly8gQXR0ZW1wdHMgdG8gc3RvcmUgYW4gYGFkZHJlc3NgIGludG8gdGhlIGBCdWlsZGVyYCBgc2VsZmAsIGlmIGBzZWxmYCBjYW5ub3QgZml0IGl0LCB0aHJvdyBhbiBl" +
@@ -302,35 +302,64 @@ files["std/internal/address.tact"] =
"eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTdG9yZXMgdGhlIGJhc2VjaGFpbiBhZGRyZXNzIGluIHRoZSBjb3B5IG9mIHRoZSBCdWlsZGVy" +
"IGFuZCByZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBJZiB0aGUgYWRkcmVzcyBoYXMgYSBgbnVsbGAgaGFzaCwgc3RvcmVzIDBiMDAgKGBhZGRyX25vbmVgKS4gT3Ro" +
"ZXJ3aXNlLCBzdG9yZXMgdGhlIGZ1bGwgYWRkcmVzcwovLy8gd2l0aCBwcmVmaXggMGIxMDAgZm9sbG93ZWQgYnkgd29ya2NoYWluICgwKSBhbmQgdGhlIDI1Ni1iaXQg" +
- "aGFzaC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYWRkcjogQmFzZWNoYWluQWRkcmVzcyA9IG5ld0Jhc2VjaGFpbkFkZHJl" +
- "c3MoMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNjNjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9" +
- "IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBiMjogQnVpbGRlciA9IGIuc3RvcmVCYXNlY2hhaW5BZGRyZXNzKGFkZHIpOwovLy8gfQovLy8gYGBgCi8vLwpleHRlbmRz" +
+ "aGFzaC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYWRkcjogQmFzZWNoYWluQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0Jh" +
+ "c2VjaGFpbkFkZHJlc3MoMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNjNjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vICAgICBsZXQg" +
+ "YjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBiMjogQnVpbGRlciA9IGIuc3RvcmVCYXNlY2hhaW5BZGRyZXNzKGFkZHIpOwovLy8gfQovLy8gYGBg" +
+ "Ci8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmViYXNlY2hhaW5hZGRyZXNzCi8vLwpleHRlbmRz" +
"IGZ1biBzdG9yZUJhc2VjaGFpbkFkZHJlc3Moc2VsZjogQnVpbGRlciwgYWRkcmVzczogQmFzZWNoYWluQWRkcmVzcyk6IEJ1aWxkZXIgewogICAgaWYgKGFkZHJlc3Mu" +
"aGFzaCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHNlbGYuc3RvcmVVaW50KDAsIDIpOyAvLyAwYjAwCiAgICB9CgogICAgcmV0dXJuIHNlbGYKICAgICAgICAuc3Rv" +
- "cmVVaW50KDBiMTBfMF8wMDAwMDAwMCwgMyArIDgpCiAgICAgICAgLnN0b3JlVWludChhZGRyZXNzLmhhc2ghISwgMjU2KTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4g" +
- "QXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjMuCi8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBhZGRyZXNzYCBpcyBpbiB0aGUgYmFzZWNoYWluLCBpLmUuLCBpdHMg" +
- "Y2hhaW4gSUQgaXMgMC4gSWYgaXQgaXMgbm90LCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDEzODogYE5vdCBhIGJhc2VjaGFpbiBhZGRyZXNzYC4K" +
- "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHNvbWVCYXNlY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3" +
- "QWRkcmVzcygwLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICBsZXQg" +
- "c29tZU1hc3RlcmNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoLTEsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2" +
- "OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8gICAgIC8vIERvZXMgbm90IHRocm93IGJlY2F1c2UgdGhlIGNoYWluIElEIGlzIDAKLy8vICAg" +
- "ICBmb3JjZUJhc2VjaGFpbihzb21lQmFzZWNoYWluQWRkcmVzcyk7Ci8vLwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIC8vIFRocm93cyBiZWNhdXNlIHRoZSBjaGFp" +
- "biBJRCBpcyAtMSAobWFzdGVyY2hhaW4pCi8vLyAgICAgICAgIGZvcmNlQmFzZWNoYWluKHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3MpOwovLy8gICAgIH0gY2F0Y2ggKGV4" +
- "aXRDb2RlKSB7Ci8vLyAgICAgICAgIC8vIGV4aXRDb2RlIGlzIDEzOAovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3Qt" +
- "bGFuZy5vcmcvcmVmL2NvcmUtYWRkcmVzc2VzI2ZvcmNlYmFzZWNoYWluCi8vLwphc20gZnVuIGZvcmNlQmFzZWNoYWluKGFkZHJlc3M6IEFkZHJlc3MpIHsgUkVXUklU" +
- "RVNUREFERFIgRFJPUCAxMzggVEhST1dJRiB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuNC4KLy8vCi8vLyBDaGVja3Mgd2hl" +
- "dGhlciB0aGUgYGFkZHJlc3NgIGlzIGluIHRoZSBgd29ya2NoYWluYCwgaS5lLiwgaXRzIGNoYWluIElEIGlzIGVxdWFsIHRvIGB3b3JrY2hhaW5gLiBJZiBpdCBpcyBu" +
- "b3QsIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgYGVycm9yQ29kZWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewovLy8gICAg" +
- "IGxldCBzb21lQmFzZWNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoMCwgMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNj" +
- "NjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vCi8vLyAgICAgbGV0IHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3M6IEFkZHJlc3MgPQovLy8gICAgICAg" +
- "ICBuZXdBZGRyZXNzKC0xLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAg" +
- "ICAvLyBEb2VzIG5vdCB0aHJvdyBiZWNhdXNlIHRoZSBjaGFpbiBJRCBtYXRjaGVzIHdvcmtjaGFpbiBwYXJhbWV0ZXIKLy8vICAgICBmb3JjZVdvcmtjaGFpbihzb21l" +
- "QmFzZWNoYWluQWRkcmVzcywgMCwgNTkzKTsKLy8vICAgICBmb3JjZVdvcmtjaGFpbihzb21lTWFzdGVyY2hhaW5BZGRyZXNzLCAtMSwgNTkzKTsKLy8vCi8vLyAgICAg" +
- "dHJ5IHsKLy8vICAgICAgICAgLy8gVGhyb3dzIGJlY2F1c2UgdGhlIGNoYWluIElEIGlzIDAgd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgd29ya2NoYWluIHBhcmFtZXRl" +
- "ciwgLTEKLy8vICAgICAgICAgZm9yY2VXb3JrY2hhaW4oc29tZUJhc2VjaGFpbkFkZHJlc3MsIC0xLCA1OTMpOwovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8v" +
- "LyAgICAgICAgIC8vIGV4aXRDb2RlIGlzIDU5MwovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
- "L2NvcmUtYWRkcmVzc2VzI2ZvcmNld29ya2NoYWluCi8vLwphc20oZXJyb3JDb2RlIHdvcmtjaGFpbiBhZGRyZXNzKSBmdW4gZm9yY2VXb3JrY2hhaW4oYWRkcmVzczog" +
- "QWRkcmVzcywgd29ya2NoYWluOiBJbnQsIGVycm9yQ29kZTogSW50KSB7CiAgICBSRVdSSVRFU1REQUREUgogICAgRFJPUAogICAgQ01QCiAgICBUSFJPV0FOWUlGCn0K";
+ "cmVVaW50KDBiMTBfMF8wMDAwMDAwMCwgMyArIDgpCiAgICAgICAgLnN0b3JlVWludChhZGRyZXNzLmhhc2ghISwgMjU2KTsKfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlv" +
+ "biBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjQuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBgQmFzZWNo" +
+ "YWluQWRkcmVzc2Agc3RydWN0IGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIGBCYXNlY2hhaW5BZGRyZXNzYCBzdHJ1Y3Qgd2hl" +
+ "biBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0" +
+ "ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVy" +
+ "Zmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3Jl" +
+ "QmFzZWNoYWluQWRkcmVzcyhCYXNlY2hhaW5BZGRyZXNzeyBoYXNoOiBudWxsIH0pCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJhc2Vj" +
+ "aGFpbkFkZHJlc3MgPSBzLmxvYWRCYXNlY2hhaW5BZGRyZXNzKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+ "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGJhc2VjaGFpbmFkZHJlc3MKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8v" +
+ "LwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9j" +
+ "cy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRCYXNlY2hhaW5BZGRyZXNzKHNlbGY6IFNsaWNlKTogQmFz" +
+ "ZWNoYWluQWRkcmVzcyB7CiAgICAvLyBhZGRyX25vbmUKICAgIGlmIChzZWxmLmxvYWRVaW50KDIpID09IDApIHsKICAgICAgICByZXR1cm4gQmFzZWNoYWluQWRkcmVz" +
+ "c3sgaGFzaDogbnVsbCB9OwogICAgfQoKICAgIC8vIGFkZHJfc3RkLCBza2lwIHRoZSByZW1haW5pbmcgcHJlZml4IGJpdHMKICAgIHNlbGYuc2tpcEJpdHMoOSk7CiAg" +
+ "ICAvLyBMb2FkIHRoZSBoYXNoIChhY2NvdW50IElEKQogICAgcmV0dXJuIEJhc2VjaGFpbkFkZHJlc3N7IGhhc2g6IHNlbGYubG9hZFVpbnQoMjU2KSB9Owp9CgovLy8g" +
+ "RXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuNC4KLy8vCi8vLyBTa2lwcyBhIGBC" +
+ "YXNlY2hhaW5BZGRyZXNzYCBzdHJ1Y3QgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggYEJhc2VjaGFpbkFkZHJlc3NgIHN0cnVj" +
+ "dCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8v" +
+ "LyBBdHRlbXB0cyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29kZSA5XTogYENlbGwg" +
+ "dW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAg" +
+ "LnN0b3JlQmFzZWNoYWluQWRkcmVzcyhCYXNlY2hhaW5BZGRyZXNzeyBoYXNoOiBudWxsIH0pCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDMyKQovLy8gICAgICAg" +
+ "ICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzMS5za2lwQmFzZWNoYWluQWRkcmVzcygpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzMS5sb2FkVWludCgzMik7IC8v" +
+ "IDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGJhc2VjaGFp" +
+ "bmFkZHJlc3MKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRh" +
+ "Y3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8v" +
+ "LwpleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBCYXNlY2hhaW5BZGRyZXNzKHNlbGY6IFNsaWNlKSB7CiAgICAvLyBhZGRyX3N0ZAogICAgaWYgKHNlbGYubG9hZFVpbnQo" +
+ "MikgIT0gMCkgewogICAgICAgIC8vIDkgYml0cyBvZiB0aGUgcmVtYWluaW5nIHByZWZpeCBzaW5jZSBmaXJzdCAyIGFyZSBsb2FkZWQgYWxyZWFkeQogICAgICAgIC8v" +
+ "IHBsdXMgMjU2IGJpdHMgb2YgdGhlIGhhc2ggKGFjY291bnQgSUQpCiAgICAgICAgc2VsZi5za2lwQml0cygyNjUpOwogICAgfQoKICAgIC8vIGFkZHJfbm9uZSwgbm90" +
+ "aGluZyB0byBsb2FkIHNpbmNlIGl0cyAyIGJpdHMKICAgIC8vIGFyZSBsb2FkZWQgaW4gdGhlIGlmIHN0YXRlbWVudCBhYm92ZQp9CgovLy8gR2xvYmFsIGZ1bmN0aW9u" +
+ "LiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMy4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYGFkZHJlc3NgIGlzIGluIHRoZSBiYXNlY2hhaW4sIGkuZS4sIGl0" +
+ "cyBjaGFpbiBJRCBpcyAwLiBJZiBpdCBpcyBub3QsIHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgMTM4OiBgTm90IGEgYmFzZWNoYWluIGFkZHJlc3Ng" +
+ "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgc29tZUJhc2VjaGFpbkFkZHJlc3M6IEFkZHJlc3MgPQovLy8gICAgICAgICBu" +
+ "ZXdBZGRyZXNzKDAsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8gICAgIGxl" +
+ "dCBzb21lTWFzdGVyY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygtMSwgMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNj" +
+ "NjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vCi8vLyAgICAgLy8gRG9lcyBub3QgdGhyb3cgYmVjYXVzZSB0aGUgY2hhaW4gSUQgaXMgMAovLy8g" +
+ "ICAgIGZvcmNlQmFzZWNoYWluKHNvbWVCYXNlY2hhaW5BZGRyZXNzKTsKLy8vCi8vLyAgICAgdHJ5IHsKLy8vICAgICAgICAgLy8gVGhyb3dzIGJlY2F1c2UgdGhlIGNo" +
+ "YWluIElEIGlzIC0xIChtYXN0ZXJjaGFpbikKLy8vICAgICAgICAgZm9yY2VCYXNlY2hhaW4oc29tZU1hc3RlcmNoYWluQWRkcmVzcyk7Ci8vLyAgICAgfSBjYXRjaCAo" +
+ "ZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gZXhpdENvZGUgaXMgMTM4Ci8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFj" +
+ "dC1sYW5nLm9yZy9yZWYvY29yZS1hZGRyZXNzZXMjZm9yY2ViYXNlY2hhaW4KLy8vCmFzbSBmdW4gZm9yY2VCYXNlY2hhaW4oYWRkcmVzczogQWRkcmVzcykgeyBSRVdS" +
+ "SVRFU1REQUREUiBEUk9QIDEzOCBUSFJPV0lGIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi40LgovLy8KLy8vIENoZWNrcyB3" +
+ "aGV0aGVyIHRoZSBgYWRkcmVzc2AgaXMgaW4gdGhlIGB3b3JrY2hhaW5gLCBpLmUuLCBpdHMgY2hhaW4gSUQgaXMgZXF1YWwgdG8gYHdvcmtjaGFpbmAuIElmIGl0IGlz" +
+ "IG5vdCwgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSBgZXJyb3JDb2RlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAg" +
+ "ICAgbGV0IHNvbWVCYXNlY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygwLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWVi" +
+ "Y2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICBsZXQgc29tZU1hc3RlcmNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAg" +
+ "ICAgIG5ld0FkZHJlc3MoLTEsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8g" +
+ "ICAgIC8vIERvZXMgbm90IHRocm93IGJlY2F1c2UgdGhlIGNoYWluIElEIG1hdGNoZXMgd29ya2NoYWluIHBhcmFtZXRlcgovLy8gICAgIGZvcmNlV29ya2NoYWluKHNv" +
+ "bWVCYXNlY2hhaW5BZGRyZXNzLCAwLCA1OTMpOwovLy8gICAgIGZvcmNlV29ya2NoYWluKHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3MsIC0xLCA1OTMpOwovLy8KLy8vICAg" +
+ "ICB0cnkgewovLy8gICAgICAgICAvLyBUaHJvd3MgYmVjYXVzZSB0aGUgY2hhaW4gSUQgaXMgMCB3aGljaCBkb2Vzbid0IG1hdGNoIHRoZSB3b3JrY2hhaW4gcGFyYW1l" +
+ "dGVyLCAtMQovLy8gICAgICAgICBmb3JjZVdvcmtjaGFpbihzb21lQmFzZWNoYWluQWRkcmVzcywgLTEsIDU5Myk7Ci8vLyAgICAgfSBjYXRjaCAoZXhpdENvZGUpIHsK" +
+ "Ly8vICAgICAgICAgLy8gZXhpdENvZGUgaXMgNTkzCi8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9y" +
+ "ZWYvY29yZS1hZGRyZXNzZXMjZm9yY2V3b3JrY2hhaW4KLy8vCmFzbShlcnJvckNvZGUgd29ya2NoYWluIGFkZHJlc3MpIGZ1biBmb3JjZVdvcmtjaGFpbihhZGRyZXNz" +
+ "OiBBZGRyZXNzLCB3b3JrY2hhaW46IEludCwgZXJyb3JDb2RlOiBJbnQpIHsKICAgIFJFV1JJVEVTVERBRERSCiAgICBEUk9QCiAgICBDTVAKICAgIFRIUk9XQU5ZSUYK" +
+ "fQo=";
files["std/internal/base.tact"] =
"Ly8vIERlc2NyaWJlcyB0aGUgYmFzZSBsb2dpYyB0aGF0IGlzIGF2YWlsYWJsZSBpbiBhbGwgY29udHJhY3RzIGFuZCB0cmFpdHMgYnkgZGVmYXVsdC4KLy8vCi8vLyBU" +
"aGlzIHRyYWl0IGlzIGltcGxpY2l0bHkgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGNvbnRyYWN0IGFuZCB0cmFpdC4KLy8vIEl0IGNvbnRhaW5zIGEgbnVtYmVyIG9m" +
@@ -496,378 +525,410 @@ files["std/internal/cells.tact"] =
"b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmRlcHRoCi8vLwphc20gZXh0ZW5kcyBmdW4gZGVwdGgoc2VsZjogQnVpbGRlcik6IEludCB7IEJE" +
"RVBUSCB9CgovLwovLyBTbGljZQovLwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBDZWxsYCB0eXBlLgovLy8KLy8vIE9wZW5zIHRoZSBgQ2VsbGAgZm9y" +
"IHBhcnNpbmcgYW5kIHJldHVybnMgaXQgYXMgYSBgU2xpY2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0g" +
- "YmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYy5iZWdpblBhcnNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9j" +
- "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxiZWdpbnBhcnNlCi8vLwphc20gZXh0ZW5kcyBmdW4gYmVnaW5QYXJzZShzZWxmOiBDZWxsKTogU2xpY2Ug" +
- "eyBDVE9TIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgdGhlIG5leHQgcmVmZXJlbmNl" +
- "IGZyb20gdGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNu" +
- "J3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxv" +
- "YWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4K" +
- "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFz" +
- "U2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLmxvYWRSZWYoKTsKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAg" +
- "ICAgIC5zdG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAgIGxl" +
- "dCByZWYxOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gZmFs" +
- "c2UKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBj" +
- "b2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkUmVm" +
- "KHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBz" +
- "aW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIHRoZSBuZXh0IHJlZmVyZW5jZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJl" +
- "dHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZFJlZigpYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9l" +
- "c24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8g" +
- "c2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dg" +
- "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVSZWYo" +
- "ZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDMyKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzMS5za2lwUmVmKCk7Ci8v" +
- "LyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50" +
- "YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQov" +
- "Ly8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFJlZihzZWxmOiBTbGljZSkgeyBMRFJFRiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" +
- "bGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gUHJlbG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20gdGhlIGBTbGljZWAgYXMg" +
- "YSBgQ2VsbGAuIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgc3VjaCByZWZlcmVuY2UgYENlbGxg" +
- "IHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBB" +
- "dHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVu" +
- "ZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0" +
- "eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEucHJlbG9hZFJlZigpOyAvLyBkaWRuJ3QgbW9kaWZ5IHMxCi8vLwovLy8gICAgIGxl" +
- "dCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVSZWYoZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVJlZihzMS5hc0NlbGwoKSkK" +
- "Ly8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgbGV0IHJlZjE6IENlbGwgPSBzMi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgbGV0IHJlZjI6IENlbGwgPSBz" +
- "Mi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgcmVmMSA9PSByZWYyOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0" +
- "LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHJlZgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCmFz" +
- "bSBleHRlbmRzIGZ1biBwcmVsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IFBMRFJFRiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUg" +
- "YFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBMb2FkcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYDogaWYgaXQncyAx" +
- "LCB0aGVuIHRoZSByZWZlcmVuY2VkIGBDZWxsYCBpcyBsb2FkZWQgYW5kIHJldHVybmVkLiBJZiB0aGUgbG9hZGVkIGJpdCBpcyAwLCB0aGVuIG5vdGhpbmcgZWxzZSBp" +
- "cyBsb2FkZWQgYW5kIGBudWxsYCBpcyByZXR1cm5lZC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9l" +
- "c24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBt" +
- "b3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBg" +
- "YHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzID0gbXNnLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgb3V0QWN0aW9ucyA9IHMubG9hZE1heWJlUmVm" +
- "KCk7Ci8vLwovLy8gICAgIGlmIChvdXRBY3Rpb25zICE9IG51bGwpIHsKLy8vICAgICAgICAgbGV0IGFjdGlvbnMgPSBvdXRBY3Rpb25zISE7Ci8vLyAgICAgICAgIC8v" +
- "IC4uLnByb2Nlc3MgYWN0aW9ucy4uLgovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
- "L2NvcmUtY2VsbHMjc2xpY2Vsb2FkbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20oLT4gMSAwKSBl" +
- "eHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgTERPUFRSRUYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" +
- "biBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYENlbGw/YCBmcm9tIHRoZSBgU2xpY2VgLiBTaW1p" +
- "bGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZE1heWJlUmVmKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCByZWZl" +
- "cmVuY2UgYENlbGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93" +
- "YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6" +
- "IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAg" +
- "ICAgICAgIC5zdG9yZU1heWJlUmVmKGVtcHR5Q2VsbCgpKQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCAzMikKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8v" +
- "LyAgICAgczEuc2tpcE1heWJlUmVmKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNl" +
- "ZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
- "Zy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwTWF5YmVSZWYoc2VsZjogU2xpY2UpIHsgTERPUFRSRUYgTklQIH0KCi8v" +
- "LyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIGEgc2luZ2xl" +
- "IGJpdCBmcm9tIHRoZSBgU2xpY2VgOiBpZiBpdCdzIDEsIHRoZW4gdGhlIHJlZmVyZW5jZWQgYENlbGxgIGlzIHByZWxvYWRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZSBw" +
- "cmVsb2FkZWQgYml0IGlzIDAsIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLiBEb2Vzbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0" +
- "cyB0byBwcmVsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQg" +
- "Y29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4" +
- "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgczE6" +
- "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEucHJlbG9hZE1h" +
- "eWJlUmVmKCk7IC8vIHJldHVybnMgZW1wdHlDZWxsKCkgYW5kIGRvZXNuJ3QgbW9kaWZ5IHMxCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQov" +
- "Ly8gICAgICAgICAuc3RvcmVNYXliZVJlZihudWxsKQovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihzMS5hc0NlbGwoKSkKLy8vICAgICAgICAgLmFzU2xpY2UoKTsK" +
- "Ly8vCi8vLyAgICAgbGV0IHJlZjE6IENlbGwgPSBzMi5wcmVsb2FkTWF5YmVSZWYoKTsgLy8gcmV0dXJucyBudWxsIGFuZCBkb2Vzbid0IG1vZGlmeSBzMgovLy8gICAg" +
- "IGxldCByZWYyOiBDZWxsID0gczIucHJlbG9hZE1heWJlUmVmKCk7IC8vIHNhbWUgZWZmZWN0Ci8vLyAgICAgcmVmMSA9PSBudWxsOyAvLyB0cnVlCi8vLyAgICAgcmVm" +
- "MSA9PSByZWYyOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3Ns" +
- "aWNlcHJlbG9hZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KYXNtIGV4dGVuZHMgZnVuIHByZWxvYWRN" +
- "YXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgUExET1BUUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUu" +
- "Ci8vLwovLy8gTG9hZHMgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4K" +
- "Ly8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVd" +
- "OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMg" +
- "dGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7" +
- "Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRC" +
- "aXRzKDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXRz" +
- "Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8v" +
- "ZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShsb2FkX2JpdHMpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIs" +
- "IHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERTTElDRVgiCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgbG9hZEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCk6IFNsaWNl" +
- "OwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBQcmVsb2FkcyAwIOKJpCBgbGAg4omkIDEwMjMgYml0cyBmcm9tIHRo" +
- "ZSBgU2xpY2VgIGFuZCByZXR1cm5zIHRoZW0gYXMgYSBzZXBhcmF0ZSBgU2xpY2VgLgovLy8gRG9lc24ndCBtb2RpZnkgdGhlIG9yaWdpbmFsIGBTbGljZWAuCi8vLwov" +
- "Ly8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYElu" +
- "dGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRo" +
- "cm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" +
- "Ly8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gcy5wcmVsb2Fk" +
- "Qml0cyg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2Fk" +
- "Yml0cwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRw" +
- "czovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUocHJlbG9hZF9iaXRzKSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNv" +
- "bXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlBMRFNMSUNFWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCk6IFNs" +
- "aWNlOwoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhIHNpZ25lZCBg" +
- "bGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTcuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRz" +
- "IGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBB" +
- "dHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBg" +
- "Q2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50" +
- "KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6" +
- "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkaW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5v" +
- "cmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShs" +
- "b2FkX2ludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRElYIgpleHRlbmRzIG11dGF0ZXMg" +
- "bmF0aXZlIGxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8g" +
- "UHJlbG9hZHMgYW5kIHJldHVybnMgYSBzaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2VgLCBmb3IgMCDiiaQgbCDiiaQgMjU3LgovLy8gRG9lc24ndCBt" +
- "b2RpZnkgdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0" +
- "aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFu" +
- "IHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRh" +
- "Y3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0" +
- "IGZpeno6IEludCA9IHMucHJlbG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" +
- "cmUtY2VsbHMjc2xpY2VwcmVsb2FkaW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8v" +
- "IFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShwcmVsb2FkX2ludCkgLy8gc3BlY2lhbCB0" +
- "cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERJWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEludChzZWxmOiBTbGlj" +
- "ZSwgbDogSW50KTogSW50OwoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJu" +
- "cyBhbiB1bnNpZ25lZCBgbGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTYuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBh" +
- "biBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJh" +
- "bmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBb" +
- "ZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2lu" +
- "Q2VsbCgpLnN0b3JlVWludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8g" +
- "U2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR1aW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6" +
- "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1j" +
- "b2RlcyM5Ci8vLwpAbmFtZShsb2FkX3VpbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERV" +
- "WCIKZXh0ZW5kcyBtdXRhdGVzIG5hdGl2ZSBsb2FkVWludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" +
- "bGljZWAgdHlwZS4KLy8vCi8vLyBQcmVsb2FkcyBhbmQgcmV0dXJucyBhbiB1bnNpZ25lZCBgbGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBs" +
- "IOKJpCAyNTYuCi8vLyBEb2Vzbid0IG1vZGlmeSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVl" +
- "IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRv" +
- "IHByZWxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVu" +
- "ZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVVaW50KDQyLCA3" +
- "KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucHJlbG9hZFVpbnQoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8v" +
- "ZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHVpbnQKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
- "Lm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1l" +
- "KHByZWxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERVWCIKZXh0ZW5kcyBu" +
- "YXRpdmUgcHJlbG9hZFVpbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5" +
- "cGUuCi8vLwovLy8gTG9hZHMgYSBzaW5nbGUgYml0IGFuZCByZXR1cm5zIGEgYEJvb2xgIHZhbHVlIGZyb20gdGhlIGBTbGljZWAuCi8vLyBSZWFkcyBgdHJ1ZWAgaWYg" +
- "dGhlIGxvYWRlZCBiaXQgaXMgZXF1YWwgdG8gMSwgYW5kIHJlYWRzIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAg" +
- "d2hlbiB0aGUgYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4K" +
- "Ly8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBj" +
- "b2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" +
- "LnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCb29sKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8v" +
- "IFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFj" +
- "dC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQm9vbChzZWxmOiBTbGljZSk6IEJvb2wgeyAx" +
- "IExESSB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8v" +
- "LyBTa2lwcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJkaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFNsaWNlLmxvYWRCb29s" +
- "KClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAgd2hlbiB0aGUgYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9u" +
- "IHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNv" +
- "bnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
- "cGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZUJvb2wodHJ1ZSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0" +
- "MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5za2lwQm9vbCgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAv" +
- "LyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0" +
- "IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQm9vbChzZWxm" +
- "OiBTbGljZSkgeyAxIExESSBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" +
- "Y3QgMS41LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxvYWRCb29sKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBz" +
- "OiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCaXQoKTsgLy8gdHJ1ZQov" +
- "Ly8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXQKLy8vCmFzbSgtPiAxIDAp" +
- "IGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJpdChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0" +
- "aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2VyaWFsaXplZCB1bnNpZ25lZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAw" +
- "IHRvIDJeMTIwIC0gMSBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gVGhpcyB2YWx1ZSB1c3VhbGx5IHJlcHJlc2VudHMgdGhlIGFtb3VudCBpbiBuYW5vVG9uY29p" +
- "bnMuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgg" +
- "ZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4g" +
- "ZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" +
- "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRDb2lucygpOyAvLyA0MgovLy8g" +
- "fQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRjb2lucwovLy8KYXNtKCAtPiAxIDAp" +
- "IGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZENvaW5zKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" +
+ "YmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYy5iZWdpblBhcnNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0" +
+ "LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxiZWdpbnBhcnNlCi8vLwphc20gZXh0ZW5kcyBmdW4gYmVnaW5QYXJzZShzZWxmOiBDZWxsKTogU2xpY2UgeyBDVE9T" +
+ "IH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20g" +
+ "dGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29u" +
+ "dGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9y" +
+ "ZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8v" +
+ "LyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2Uo" +
+ "KTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLmxvYWRSZWYoKTsKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5z" +
+ "dG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAgIGxldCByZWYx" +
+ "OiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gZmFsc2UKLy8v" +
+ "IH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkcmVmCi8vLyAqIGh0dHBz" +
+ "Oi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhp" +
+ "dC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5k" +
+ "cyBtdXRhdGVzIGZ1biBsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xp" +
+ "Y2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIHRoZSBuZXh0IHJlZmVyZW5jZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFy" +
+ "IHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZFJlZigpYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggcmVmZXJlbmNlIGBD" +
+ "ZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2Au" +
+ "Ci8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2Rl" +
+ "IDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKQov" +
+ "Ly8gICAgICAgICAuc3RvcmVSZWYoZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDMyKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8v" +
+ "ICAgICBzMS5za2lwUmVmKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8v" +
+ "ICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
+ "ZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDld" +
+ "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFJlZihzZWxmOiBTbGljZSkg" +
+ "eyBMRFJFRiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8g" +
+ "UHJlbG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20gdGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBgU2xpY2VgLgov" +
+ "Ly8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgc3VjaCByZWZlcmVuY2UgYENlbGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0" +
+ "aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFp" +
+ "bnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewov" +
+ "Ly8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEu" +
+ "cHJlbG9hZFJlZigpOyAvLyBkaWRuJ3QgbW9kaWZ5IHMxCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVSZWYo" +
+ "ZW1wdHlDZWxsKCkpCi8vLyAgICAgICAgIC5zdG9yZVJlZihzMS5hc0NlbGwoKSkKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgbGV0IHJlZjE6IENl" +
+ "bGwgPSBzMi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgbGV0IHJlZjI6IENlbGwgPSBzMi5wcmVsb2FkUmVmKCk7Ci8vLyAgICAgcmVmMSA9PSByZWYyOyAvLyB0cnVlCi8v" +
+ "LyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHJlZgovLy8gKiBo" +
+ "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCmFzbSBleHRlbmRzIGZ1biBwcmVsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IFBM" +
+ "RFJFRiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8v" +
+ "LyBMb2FkcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYDogaWYgaXQncyAxLCB0aGVuIHRoZSByZWZlcmVuY2VkIGBDZWxsYCBpcyBsb2FkZWQgYW5kIHJldHVy" +
+ "bmVkLiBJZiB0aGUgbG9hZGVkIGJpdCBpcyAwLCB0aGVuIG5vdGhpbmcgZWxzZSBpcyBsb2FkZWQgYW5kIGBudWxsYCBpcyByZXR1cm5lZC4KLy8vCi8vLyBBdHRlbXB0" +
+ "cyB0byBsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29k" +
+ "ZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlv" +
+ "biB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzID0gbXNnLmFz" +
+ "U2xpY2UoKTsKLy8vICAgICBsZXQgb3V0QWN0aW9ucyA9IHMubG9hZE1heWJlUmVmKCk7Ci8vLwovLy8gICAgIGlmIChvdXRBY3Rpb25zICE9IG51bGwpIHsKLy8vICAg" +
+ "ICAgICAgbGV0IGFjdGlvbnMgPSBvdXRBY3Rpb25zISE7Ci8vLyAgICAgICAgIC8vIC4uLnByb2Nlc3MgYWN0aW9ucy4uLgovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAov" +
+ "Ly8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2Nz" +
+ "LnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENl" +
+ "bGw/IHsgTERPUFRSRUYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42" +
+ "LjIuCi8vLwovLy8gU2tpcHMgYENlbGw/YCBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9h" +
+ "ZE1heWJlUmVmKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCByZWZlcmVuY2UgYENlbGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhy" +
+ "b3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGlj" +
+ "ZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1w" +
+ "bGUoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZU1heWJlUmVmKGVtcHR5Q2VsbCgpKQovLy8gICAgICAgICAu" +
+ "c3RvcmVVaW50KDQyLCAzMikKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgczEuc2tpcE1heWJlUmVmKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9" +
+ "IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2Vs" +
+ "bHMjc2xpY2Vza2lwbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1" +
+ "biBza2lwTWF5YmVSZWYoc2VsZjogU2xpY2UpIHsgTERPUFRSRUYgTklQIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWls" +
+ "YWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIGEgc2luZ2xlIGJpdCBmcm9tIHRoZSBgU2xpY2VgOiBpZiBpdCdzIDEsIHRoZW4gdGhlIHJlZmVy" +
+ "ZW5jZWQgYENlbGxgIGlzIHByZWxvYWRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZSBwcmVsb2FkZWQgYml0IGlzIDAsIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLiBEb2Vz" +
+ "bid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIHN1Y2ggcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAg" +
+ "ZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJl" +
+ "bG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8K" +
+ "Ly8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSku" +
+ "YXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gczEucHJlbG9hZE1heWJlUmVmKCk7IC8vIHJldHVybnMgZW1wdHlDZWxsKCkgYW5kIGRvZXNuJ3QgbW9k" +
+ "aWZ5IHMxCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihudWxsKQovLy8gICAgICAgICAuc3Rv" +
+ "cmVNYXliZVJlZihzMS5hc0NlbGwoKSkKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgbGV0IHJlZjE6IENlbGwgPSBzMi5wcmVsb2FkTWF5YmVSZWYo" +
+ "KTsgLy8gcmV0dXJucyBudWxsIGFuZCBkb2Vzbid0IG1vZGlmeSBzMgovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIucHJlbG9hZE1heWJlUmVmKCk7IC8vIHNhbWUg" +
+ "ZWZmZWN0Ci8vLyAgICAgcmVmMSA9PSBudWxsOyAvLyB0cnVlCi8vLyAgICAgcmVmMSA9PSByZWYyOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8v" +
+ "LyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+ "b3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KYXNtIGV4dGVuZHMgZnVuIHByZWxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgUExET1BUUkVGIH0KCi8vLyBF" +
+ "eHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUg" +
+ "YFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxg" +
+ "IHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVt" +
+ "cHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxs" +
+ "IHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIs" +
+ "IDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRCaXRzKDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczov" +
+ "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXRzCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" +
+ "cwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczov" +
+ "L2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUobG9hZF9iaXRzKSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVy" +
+ "LCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIkxEU0xJQ0VYIgpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGlj" +
+ "ZTsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gUHJlbG9hZHMgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0" +
+ "aGUgYFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4KLy8vIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBgU2xpY2VgLgovLy8K" +
+ "Ly8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAgdmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgNV06IGBJ" +
+ "bnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucyB0" +
+ "aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsK" +
+ "Ly8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMucHJlbG9h" +
+ "ZEJpdHMoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9h" +
+ "ZGJpdHMKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3Qt" +
+ "bGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpA" +
+ "bmFtZShwcmVsb2FkX2JpdHMpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiUExEU0xJQ0VYIgpl" +
+ "eHRlbmRzIG5hdGl2ZSBwcmVsb2FkQml0cyhzZWxmOiBTbGljZSwgbDogSW50KTogU2xpY2U7CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUg" +
+ "YFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2lnbmVkIGBsYC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNlYCwgZm9yIDAg4omkIGwg4omk" +
+ "IDI1Ny4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBj" +
+ "b2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29u" +
+ "dGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1w" +
+ "bGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5s" +
+ "b2FkSW50KDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRp" +
+ "bnQKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
+ "Zy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFt" +
+ "ZShsb2FkX2ludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRElYIgpleHRlbmRzIG11dGF0" +
+ "ZXMgbmF0aXZlIGxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwov" +
+ "Ly8gUHJlbG9hZHMgYW5kIHJldHVybnMgYSBzaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2VgLCBmb3IgMCDiiaQgbCDiiaQgMjU3LgovLy8gRG9lc24n" +
+ "dCBtb2RpZnkgdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24g" +
+ "d2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0" +
+ "aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBg" +
+ "YHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAg" +
+ "bGV0IGZpeno6IEludCA9IHMucHJlbG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
+ "L2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkaW50Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUg" +
+ "NV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" +
+ "b29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUocHJlbG9hZF9pbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3" +
+ "aXRoIGFzbSAiUExESVgiCmV4dGVuZHMgbmF0aXZlIHByZWxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVu" +
+ "Y3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYW4gdW5zaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2Vg" +
+ "LCBmb3IgMCDiiaQgbCDiiaQgMjU2LgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAgdmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9u" +
+ "IHdpdGgKLy8vIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhh" +
+ "biB0aGUgYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0" +
+ "YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVVpbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBs" +
+ "ZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" +
+ "cmUtY2VsbHMjc2xpY2Vsb2FkdWludAovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBo" +
+ "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9l" +
+ "eGl0LWNvZGVzIzkKLy8vCkBuYW1lKGxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNt" +
+ "ICJMRFVYIgpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0" +
+ "aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFByZWxvYWRzIGFuZCByZXR1cm5zIGFuIHVuc2lnbmVkIGBsYC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNlYCwgZm9yIDAg" +
+ "4omkIGwg4omkIDI1Ni4KLy8vIERvZXNuJ3QgbW9kaWZ5IHRoZSBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAg" +
+ "dmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1w" +
+ "dHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENl" +
+ "bGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVVpbnQo" +
+ "NDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5wcmVsb2FkVWludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0" +
+ "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkdWludAovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4" +
+ "aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTog" +
+ "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1lKHByZWxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVu" +
+ "YyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERVWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZFVpbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IElu" +
+ "dDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYSBzaW5nbGUgYml0IGFuZCByZXR1cm5z" +
+ "IGEgYEJvb2xgIHZhbHVlIGZyb20gdGhlIGBTbGljZWAuCi8vLyBSZWFkcyBgdHJ1ZWAgaWYgdGhlIGxvYWRlZCBiaXQgaXMgZXF1YWwgdG8gMSwgYW5kIHJlYWRzIGBm" +
+ "YWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAgd2hlbiB0aGUgYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cg" +
+ "YW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRo" +
+ "ZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QK" +
+ "Ly8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZp" +
+ "eno6IEJvb2wgPSBzLmxvYWRCb29sKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
+ "L2NvcmUtY2VsbHMjc2xpY2Vsb2FkYm9vbAovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhd" +
+ "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9v" +
+ "ay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJvb2woc2VsZjogU2xpY2UpOiBCb29sIHsgMSBMREkgfQoKLy8vIEV4" +
+ "dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzaW5n" +
+ "bGUgYml0IGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBTbGljZS5sb2FkQm9vbCgpYC4KLy8vCi8vLyBB" +
+ "dHRlbXB0cyB0byBsb2FkIHN1Y2ggYEJvb2xgIHdoZW4gdGhlIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhp" +
+ "dCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucyB0aHJvdyBh" +
+ "biBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAg" +
+ "ICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVCb29sKHRydWUpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAg" +
+ "ICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcEJvb2woKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8v" +
+ "IGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYm9vbAovLy8gKiBodHRwczovL2Rv" +
+ "Y3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29k" +
+ "ZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVu" +
+ "IHNraXBCb29sKHNlbGY6IFNsaWNlKSB7IDEgTERJIE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFp" +
+ "bGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBBbGlhcyB0byBgU2xpY2UubG9hZEJvb2woKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7" +
+ "Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVCb29sKHRydWUpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQm9vbCA9IHMubG9hZEJp" +
+ "dCgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGJpdAov" +
+ "Ly8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQml0KHNlbGY6IFNsaWNlKTogQm9vbCB7IDEgTERJIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24g" +
+ "ZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRo" +
+ "ZSByYW5nZSBmcm9tIDAgdG8gMl4xMjAgLSAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLiBUaGlzIHZhbHVlIHVzdWFsbHkgcmVwcmVzZW50cyB0aGUgYW1vdW50" +
+ "IGluIG5hbm9Ub25jb2lucy4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBl" +
+ "eGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNv" +
+ "bnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUo" +
+ "KSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRD" +
+ "b2lucygpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxv" +
+ "YWRjb2lucwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhdOiBodHRwczovL2RvY3MudGFj" +
+ "dC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8v" +
+ "CmFzbSggLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRDb2lucyhzZWxmOiBTbGljZSk6IEludCB7IExEVkFSVUlOVDE2IH0KCi8vLyBFeHRlbnNpb24gbXV0" +
+ "YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIGEgc2VyaWFsaXplZCB1bnNp" +
+ "Z25lZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMTIwIC0gMSBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJk" +
+ "aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFNsaWNlLmxvYWRDb2lucygpYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRv" +
+ "ZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tp" +
+ "cCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwov" +
+ "Ly8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3JlQ29pbnMoMjM5KQov" +
+ "Ly8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBDb2lucygpOwovLy8gICAgIGxldCBmaXp6" +
+ "OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29y" +
+ "ZS1jZWxscyNzbGljZXNraXBjb2lucwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDhdOiBo" +
+ "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9l" +
+ "eGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBDb2lucyhzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQxNiBOSVAgfQoKLy8vIEV4dGVuc2lv" +
+ "biBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxv" +
+ "YWRDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhclVpbnQx" +
+ "Nig0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRWYXJVaW50MTYoKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8v" +
+ "ICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
+ "L3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGNvaW5zCi8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFyVWludDE2KHNlbGY6IFNsaWNlKTog" +
+ "SW50IHsgTERWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3Qg" +
+ "MS42LjIuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLnNraXBDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczog" +
+ "U2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJVaW50MTYoMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAu" +
+ "YXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJVaW50MTYoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8v" +
+ "IGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwdmFydWludDE2Ci8vLyAqIGh0dHBz" +
+ "Oi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGNvaW5zCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFyVWludDE2KHNl" +
+ "bGY6IFNsaWNlKXsgTERWQVJVSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBz" +
+ "aW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNlLmxvYWRDb2lucygpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJv" +
+ "bSAtMl4xMTkgdG8gMl4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFp" +
+ "biBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEg" +
+ "dGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAov" +
+ "Ly8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQxNigtNDIpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQg" +
+ "Zml6ejogSW50ID0gcy5sb2FkVmFySW50MTYoKTsgLy8gLTQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
+ "L3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcmludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0" +
+ "IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
+ "Lm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKCAtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFZhckludDE2KHNlbGY6IFNsaWNlKTogSW50IHsgTERW" +
+ "QVJJTlQxNiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8v" +
+ "Ci8vLyBTaW1pbGFyIHRvIGBTbGljZS5za2lwQ29pbnMoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMTE5IHRvIDJeMTE5IC0g" +
+ "MSBpbmNsdXNpdmUuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0" +
+ "aW9uIHdpdGggW2V4aXQgY29kZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlu" +
+ "cyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" +
+ "Ly8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDE2KC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcp" +
+ "Ci8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDE2KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8v" +
+ "IDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcmludDE2" +
+ "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+ "b3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4" +
+ "dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFZhckludDE2KHNlbGY6IFNsaWNlKSB7IExEVkFSSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24g" +
+ "Zm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2VyaWFsaXplZCB1bnNpZ25l" +
+ "ZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMjQ4IOKIkiAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRzIHRv" +
+ "IGxvYWQgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOF06IGBDZWxsIG92" +
+ "ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQg" +
+ "Y29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwo" +
+ "KS5zdG9yZVZhclVpbnQzMig0MjAwMDApLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVmFyVWludDMyKCk7IC8vIDQyMDAwMAovLy8gfQov" +
+ "Ly8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2YXJ1aW50MzIKLy8vICogaHR0" +
+ "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9l" +
+ "eGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20oIC0+IDEgMCkgZXh0" +
+ "ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFyVWludDMyKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" +
"biBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZh" +
- "bHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4xMjAgLSAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVy" +
- "biB2YWx1ZSBvZiBgU2xpY2UubG9hZENvaW5zKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWlu" +
- "IGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhh" +
- "biBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1" +
- "biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZUNvaW5zKDIzOSkKLy8vICAgICAgICAgLnN0b3Jl" +
- "VWludCg0MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5za2lwQ29pbnMoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWlu" +
- "dCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkY29pbnMK" +
- "Ly8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBDb2lucyhzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQxNiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBm" +
- "dW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxvYWRDb2lucygpYC4K" +
- "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhclVpbnQxNig0MikuYXNTbGlj" +
- "ZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRWYXJVaW50MTYoKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9k" +
- "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNl" +
- "bGxzI3NsaWNlbG9hZGNvaW5zCi8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFyVWludDE2KHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJV" +
- "SU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwov" +
- "Ly8gQWxpYXMgdG8gYFNsaWNlLnNraXBDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdp" +
- "bkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJVaW50MTYoMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwov" +
- "Ly8KLy8vICAgICBzLnNraXBWYXJVaW50MTYoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8v" +
- "IFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0" +
- "LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGNvaW5zCi8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFyVWludDE2KHNlbGY6IFNsaWNlKXsg" +
- "TERWQVJVSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEu" +
- "Ni4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNlLmxvYWRDb2lucygpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4xMTkgdG8g" +
- "Ml4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBh" +
- "biBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBj" +
- "b250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgp" +
- "IHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhckludDE2KC00MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxv" +
- "YWRWYXJJbnQxNigpOyAvLyAtNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vs" +
- "b2FkdmFyaW50MTYKLy8vCmFzbSggLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRWYXJJbnQxNihzZWxmOiBTbGljZSk6IEludCB7IExEVkFSSU5UMTYgfQoK" +
- "Ly8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2ltaWxh" +
- "ciB0byBgU2xpY2Uuc2tpcENvaW5zKClgLCBidXQgd2l0aCBhIGRpZmZlcmVudCBgdmFsdWVgIHJhbmdlOiBmcm9tIC0yXjExOSB0byAyXjExOSAtIDEgaW5jbHVzaXZl" +
- "LgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4" +
- "aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4" +
- "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBT" +
- "bGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDE2KC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5h" +
- "c1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDE2KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBg" +
- "YGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcmludDE2Ci8vLwphc20gZXh0ZW5kcyBtdXRh" +
- "dGVzIGZ1biBza2lwVmFySW50MTYoc2VsZjogU2xpY2UpIHsgTERWQVJJTlQxNiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" +
- "bGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZh" +
- "bHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNo" +
- "IGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDg6IGBDZWxsIG92ZXJmbG93YC4KLy8v" +
- "Ci8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDk6IGBDZWxs" +
- "IHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJVaW50" +
- "MzIoNDIwMDAwKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhclVpbnQzMigpOyAvLyA0MjAwMDAKLy8vIH0KLy8vIGBgYAovLy8KLy8v" +
- "IFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDMyCi8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRh" +
- "dGVzIGZ1biBsb2FkVmFyVWludDMyKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhl" +
- "IGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRo" +
- "ZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0dXJuIHZhbHVl" +
- "IG9mIGBTbGljZS5sb2FkVmFyVWludDMyKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0" +
- "IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4OiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBg" +
- "U2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBl" +
- "eGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhclVpbnQzMigyMzkpCi8vLyAgICAgICAgIC5zdG9y" +
- "ZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhclVpbnQzMigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxv" +
- "YWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2" +
- "YXJ1aW50MzIKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBWYXJVaW50MzIoc2VsZjogU2xpY2UpIHsgTERWQVJVSU5UMzIgTklQIH0KCi8vLyBFeHRlbnNp" +
- "b24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNl" +
- "LmxvYWRWYXJVaW50MzIoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMjQ3IHRvIDJeMjQ3IC0gMSBpbmNsdXNpdmUuCi8vLwov" +
- "Ly8gQXR0ZW1wdHMgdG8gbG9hZCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2Rl" +
- "IDg6IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9u" +
- "IHdpdGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0g" +
- "YmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQzMigtNDIwMDAwKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhckludDMyKCk7IC8vIC00MjAw" +
- "MDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFyaW50MzIKLy8vCmFz" +
- "bSggLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRWYXJJbnQzMihzZWxmOiBTbGljZSk6IEludCB7IExEVkFSSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBtdXRh" +
- "dGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2ltaWxhciB0byBgU2xpY2Uuc2tpcFZh" +
- "clVpbnQzMigpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBBdHRl" +
- "bXB0cyB0byBza2lwIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgODogYENl" +
- "bGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBl" +
- "eGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNl" +
- "bGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJJbnQzMigtMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8K" +
- "Ly8vICAgICBzLnNraXBWYXJJbnQzMigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" +
- "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2YXJ1aW50MzIKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBW" +
- "YXJJbnQzMihzZWxmOiBTbGljZSkgeyBMRFZBUklOVDMyIE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgov" +
- "Ly8KLy8vIExvYWRzIGFsbCBidXQgdGhlIGZpcnN0IDAg4omkIGBsYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3Bl" +
- "Y2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVj" +
- "dGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRo" +
- "Ci8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9" +
- "IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgcy5za2lwQml0cyg1KTsgICAgICAgICAgICAgICAgICAgLy8gYWxsIGJ1dCBmaXJz" +
- "dCA1IGJpdHMKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRCaXRzKDEpOyAvLyBsb2FkIG9ubHkgMSBiaXQKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTog" +
- "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYml0cwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0" +
- "LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8K" +
- "YXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCkgeyBTRFNLSVBGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZv" +
- "ciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBgU2xpY2VgIGlzIGVtcHR5IChpLmUuLCBjb250YWlucyBubyBiaXRzIG9mIGRhdGEg" +
- "YW5kIG5vIGNlbGwgcmVmZXJlbmNlcykuCi8vLyBJZiBpdCBpcyBub3QsIGl0IHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRl" +
- "cmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBlbXB0eU9uZTogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAg" +
- "ZW1wdHlPbmUuZW5kUGFyc2UoKTsgLy8gbm90aGluZywgYXMgaXQncyBlbXB0eQovLy8KLy8vICAgICBsZXQgcGF1bDogU2xpY2UgPSAiRmVhciBpcyB0aGUgbWluZC1r" +
- "aWxsZXIiLmFzU2xpY2UoKTsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBwYXVsLmVuZFBhcnNlKCk7IC8vIHRocm93cyBleGl0IGNvZGUgOQovLy8gICAgIH0KLy8v" +
- "IH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBm" +
- "dW4gZW5kUGFyc2Uoc2VsZjogU2xpY2UpIHsgRU5EUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2Ug" +
- "VGFjdCAxLjYuMC4KLy8vCi8vLyBQcmVsb2FkcyBhbGwgYnV0IHRoZSBsYXN0IDAg4omkIGBsZW5gIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8v" +
- "LyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxlbmAgdmFsdWUgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggZXhpdCBjb2RlIDU6IGBJbnRlZ2Vy" +
- "IG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4" +
- "Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA5OiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBT" +
- "bGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGFsbEJ1dExhc3RGaXZlOiBTbGljZSA9IHMuc2tpcExhc3RCaXRz" +
- "KDUpOyAvLyBhbGwgYnV0IGxhc3QgNSBiaXRzLAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lLiBvbmx5" +
- "IGZpcnN0IDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwbGFzdGJpdHMK" +
- "Ly8vCmFzbSBleHRlbmRzIGZ1biBza2lwTGFzdEJpdHMoc2VsZjogU2xpY2UsIGxlbjogSW50KTogU2xpY2UgeyBTRFNLSVBMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVu" +
- "Y3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIHRoZSBmaXJzdCAwIOKJpCBgbGVuYCDi" +
- "iaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFu" +
- "IGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgbW9yZSBk" +
- "YXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0YWN0" +
- "Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBm" +
- "aXJzdEZpdmU6IFNsaWNlID0gcy5maXJzdEJpdHMoNSk7IC8vIGZpcnN0IDUgYml0cwovLy8gfQovLy8gYGBgCi8vLwovLy8gSW4gb3JkZXIgdG8gcmVkdWNlIGdhcyB1" +
- "c2FnZSwgcHJlZmVyIGNhbGxpbmcgYFNsaWNlLnByZWxvYWRCaXRzKClgIG92ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiBzaW5jZSB0aGUgZm9ybWVyIGlzIG1vcmUgb3B0" +
- "aW1pemVkLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VmaXJzdGJpdHMKLy8vICogaHR0cHM6" +
- "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkYml0cwovLy8KYXNtIGV4dGVuZHMgZnVuIGZpcnN0Qml0cyhzZWxmOiBTbGljZSwg" +
- "bGVuOiBJbnQpOiBTbGljZSB7IFNEQ1VURklSU1QgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" +
- "Y3QgMS42LjAuCi8vLwovLy8gUHJlbG9hZHMgdGhlIGxhc3QgMCDiiaQgYGxlbmAg4omkIDEwMjMgYml0cyBmcm9tIHRoZSBgU2xpY2VgLgovLy8KLy8vIEF0dGVtcHRz" +
- "IHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGVuYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgNTogYEludGVnZXIgb3V0IG9mIGV4" +
- "cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdp" +
- "dGggZXhpdCBjb2RlIDk6IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVn" +
- "aW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgbGFzdEZpdmU6IFNsaWNlID0gcy5sYXN0Qml0cyg1KTsgLy8gbGFzdCA1IGJpdHMK" +
- "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VsYXN0Yml0cwovLy8KYXNtIGV4dGVu" +
- "ZHMgZnVuIGxhc3RCaXRzKHNlbGY6IFNsaWNlLCBsZW46IEludCk6IFNsaWNlIHsgU0RDVVRMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xp" +
- "Y2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBgSW50YCBkZXB0aCBvZiB0aGUgYFNsaWNl" +
- "YC4gUHJvZHVjZXMgMCBpZiB0aGUgYFNsaWNlYCBoYXMgbm8gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIDEgcGx1cyB0aGUgbWF4aW11bSBvZiB0aGUgZGVwdGhzIG9mIHRo" +
- "ZSByZWZlcmVuY2VkIGNlbGxzLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3Jl" +
- "SW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGRlcHRoOiBJbnQgPSBzLmRlcHRoKCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6" +
- "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VkZXB0aAovLy8KYXNtIGV4dGVuZHMgZnVuIGRlcHRoKHNlbGY6IFNsaWNlKTogSW50IHsgU0RF" +
- "UFRIIH0KCi8vCi8vIFNsaWNlIHNpemUKLy8KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gUmV0dXJucyB0aGUgbnVt" +
- "YmVyIG9mIHJlZmVyZW5jZXMgaW4gdGhlIGBTbGljZWAgYXMgYW4gYEludGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" +
- "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5yZWZzKCk7Ci8vLyB9Ci8v" +
- "LyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcmVmcwovLy8KYXNtIGV4dGVuZHMgZnVuIHJlZnMo" +
- "c2VsZjogU2xpY2UpOiBJbnQgeyBTUkVGUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFJldHVybnMgdGhlIG51" +
- "bWJlciBvZiBkYXRhIGJpdHMgaW4gdGhlIGBTbGljZWAgYXMgYW4gYEludGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" +
- "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5iaXRzKCk7Ci8vLyB9Ci8v" +
- "LyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlYml0cwovLy8KYXNtIGV4dGVuZHMgZnVuIGJpdHMo" +
- "c2VsZjogU2xpY2UpOiBJbnQgeyBTQklUUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3aGV0aGVy" +
- "IHRoZSBgU2xpY2VgIGlzIGVtcHR5IChpLmUuLCBjb250YWlucyBubyBiaXRzIG9mIGRhdGEgYW5kIG5vIGNlbGwgcmVmZXJlbmNlcykuCi8vLyBSZXR1cm5zIGB0cnVl" +
- "YCBpZiBpdCBpcyBlbXB0eSwgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0g" +
- "YmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQm9vbCA9IHMuZW1wdHkoKTsgICAgICAgICAgICAgICAg" +
- "ICAgICAvLyBmYWxzZQovLy8gICAgIGxldCBidXp6OiBCb29sID0gYmVnaW5DZWxsKCkuYXNTbGljZSgpLmVtcHR5KCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8K" +
- "Ly8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VlbXB0eQovLy8KYXNtIGV4dGVuZHMgZnVuIGVtcHR5KHNlbGY6IFNs" +
- "aWNlKTogQm9vbCB7IFNFTVBUWSB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBg" +
- "U2xpY2VgIGhhcyBubyBiaXRzIG9mIGRhdGEuCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBpdCBoYXMgbm8gZGF0YSwgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gYGBg" +
- "dGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8v" +
- "ICAgICBsZXQgZml6ejogQm9vbCA9IHMuZGF0YUVtcHR5KCk7ICAvLyB0cnVlCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0" +
- "MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBidXp6OiBCb29sID0gczIuZGF0YUVtcHR5KCk7IC8vIGZhbHNlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0" +
- "dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZGF0YWVtcHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZGF0YUVtcHR5KHNlbGY6IFNsaWNl" +
- "KTogQm9vbCB7IFNERU1QVFkgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNs" +
- "aWNlYCBoYXMgbm8gcmVmZXJlbmNlcy4KLy8vIFJldHVybnMgYHRydWVgIGlmIGl0IGhhcyBubyByZWZlcmVuY2VzLCBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBg" +
- "YGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwov" +
- "Ly8gICAgIGxldCBmaXp6OiBCb29sID0gcy5yZWZzRW1wdHkoKTsgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQovLy8gICAgIGxldCBidXp6OiBCb29sID0gYmVn" +
- "aW5DZWxsKCkuYXNTbGljZSgpLnJlZnNFbXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3Jl" +
- "Zi9jb3JlLWNlbGxzI3NsaWNlcmVmc2VtcHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gcmVmc0VtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNSRU1QVFkgfQoKLy8KLy8g" +
- "Q29udmVyc2lvbnMKLy8KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgYEJ1aWxkZXJgIGlu" +
- "dG8gYSBgU2xpY2VgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuZW5kQ2VsbCgpLmJlZ2luUGFyc2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8g" +
- "ZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBiLmFzU2xpY2UoKTsKLy8v" +
- "IH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzc2xpY2UKLy8vCmlubGluZSBleHRl" +
- "bmRzIGZ1biBhc1NsaWNlKHNlbGY6IEJ1aWxkZXIpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCkuYmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9u" +
- "IGZ1bmN0aW9uIGZvciB0aGUgYENlbGxgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBDZWxsYCB0byBhIGBTbGljZWAgYW5kIHJldHVybnMgaXQuCi8vLyBBbiBh" +
- "bGlhcyB0byBgc2VsZi5iZWdpblBhcnNlKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0gZW1wdHlDZWxs" +
- "KCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gYy5hc1NsaWNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
- "L3JlZi9jb3JlLWNlbGxzI2NlbGxhc3NsaWNlCi8vLwppbmxpbmUgZXh0ZW5kcyBmdW4gYXNTbGljZShzZWxmOiBDZWxsKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYu" +
- "YmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgU2xpY2VgIHRvIGEg" +
- "YENlbGxgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYGJlZ2luQ2VsbCgpLnN0b3JlU2xpY2Uoc2VsZikuZW5kQ2VsbCgpYC4KLy8vCi8vLyBOT1RFOiAq" +
- "KkdhcyBleHBlbnNpdmUhKiogVGhpcyBmdW5jdGlvbiB1c2VzIDUwMCBnYXMgdW5pdHMgb3IgbW9yZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsK" +
- "Ly8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzLmFzQ2VsbCgpOwovLy8gICAgIGxldCBi" +
- "dXp6OiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVTbGljZShzKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0gYnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBg" +
- "Ci8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2Vs" +
- "bChzZWxmOiBTbGljZSk6IENlbGwgewogICAgcmV0dXJuIGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlU2xpY2Uoc2VsZikKICAgICAgICAuZW5kQ2VsbCgpOwp9Cgov" +
- "Ly8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBCdWlsZGVyYCBpbnRvIGEgYENlbGxgIGFuZCBy" +
- "ZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuZW5kQ2VsbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjog" +
- "QnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gYi5hc0NlbGwoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9k" +
- "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBCdWlsZGVyKTogQ2Vs" +
- "bCB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCk7Cn0KCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGBDZWxsYCAod2l0aG91dCBkYXRhIGFuZCByZWZl" +
- "cmVuY2VzKS4KLy8vIEFuIGFsaWFzIHRvIGBiZWdpbkNlbGwoKS5lbmRDZWxsKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxl" +
- "dCBmaXp6OiBDZWxsID0gZW1wdHlDZWxsKCk7Ci8vLyAgICAgbGV0IGJ1eno6IENlbGwgPSBiZWdpbkNlbGwoKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0g" +
- "YnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNlbXB0eWNlbGwKLy8v" +
- "CmFzbSBmdW4gZW1wdHlDZWxsKCk6IENlbGwgewogICAgPGIgYj4gUFVTSFJFRiAvLyBQdXJlIEZpZnQ6ICI8YiIgY3JlYXRlcyBhIGJ1aWxkZXIsICJiPiIgdHVybnMg" +
- "aXQgaW50byBhIGNlbGwgYXQgY29tcGlsZSB0aW1lCn0KCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGBTbGljZWAgKHdpdGhvdXQgZGF0YSBhbmQgcmVm" +
- "ZXJlbmNlcykuCi8vLyBBbiBhbGlhcyB0byBgZW1wdHlDZWxsKCkuYXNTbGljZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBs" +
- "ZXQgZml6ejogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAgbGV0IGJ1eno6IFNsaWNlID0gZW1wdHlDZWxsKCkuYXNTbGljZSgpOwovLy8KLy8vICAgICBmaXp6" +
- "ID09IGJ1eno7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjZW1wdHlzbGlj" +
- "ZQovLy8KYXNtIGZ1biBlbXB0eVNsaWNlKCk6IFNsaWNlIHsKICAgIGJ7fSBQVVNIU0xJQ0UKfQoKLy8vIFN0cnVjdCBmb3IgaG9sZGluZyB2YWx1ZXMgY29tcHV0ZWQg" +
- "YnkgdGhlIGBDZWxsLmNvbXB1dGVEYXRhU2l6ZSgpYCBhbmQgYFNsaWNlLmNvbXB1dGVEYXRhU2l6ZSgpYCBleHRlbnNpb24gZnVuY3Rpb25zLiBBdmFpbGFibGUgc2lu" +
- "Y2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxjb21wdXRlZGF0YXNpemUK" +
- "Ly8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vjb21wdXRlZGF0YXNpemUKLy8vCnN0cnVjdCBEYXRhU2l6ZSB7CiAgICAv" +
- "Ly8gVGhlIHRvdGFsIG51bWJlciBvZiBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgY2VsbHM6IEludDsKCiAgICAvLy8gVGhlIHRv" +
- "dGFsIG51bWJlciBvZiBiaXRzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgYml0czogSW50OwoKICAgIC8vLyBUaGUg" +
- "dG90YWwgbnVtYmVyIG9mIHJlZnMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUuCiAgICByZWZzOiBJbnQ7Cn0KCi8vLyBFeHRl" +
- "bnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhl" +
- "IG51bWJlciBvZiBkaXN0aW5jdCBjZWxscywgYml0cyBhbmQgcmVmcyBpbiB0aGUgYENlbGxgIGJ5IHVzaW5nIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIChERlMpIGFsZ29y" +
- "aXRobSwgcmVjdXJzaXZlbHkgdHJhdmVyc2luZyBlYWNoIHJlZmVyZW5jZWQgY2VsbC4gVGhpcyBmdW5jdGlvbiBpcyBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGFu" +
- "ZCBjYW4gY29uc3VtZSBhIGxvdCBvZiBnYXMuIElmIGBzZWxmYCBpcyBgbnVsbGAsIHJldHVybnMgYERhdGFTaXplYCB3aXRoIGFsbCBmaWVsZHMgc2V0IHRvIDAuCi8v" +
- "LwovLy8gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgYERhdGFTaXplYCBTdHJ1Y3QgY29uc2lzdGluZyBvZjoKLy8vICogYGNlbGxzOiBJbnRgLCB0aGUgdG90" +
- "YWwgbnVtYmVyIG9mIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8vICogYGJpdHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0" +
- "cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZQovLy8gKiBgcmVmczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiByZWZzIGlu" +
- "IGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLwovLy8gSWYgdGhlIHNwZWNpZmllZCBgbWF4Q2VsbHNgIHZhbHVlIGlzbid0IGVu" +
- "b3VnaCB0byB0cmF2ZXJzZSBhbGwgY2VsbHMgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUsIGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4IGlzIHRocm93bjog" +
- "YENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZSBvZiBgbWF4Q2VsbHNgIHRocm93IGFuIGV4Y2VwdGlvbiB3" +
- "aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxl" +
- "dCBjOiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5lbmRDZWxsKCk7Ci8vLyAgICAgdHJ5IHsKLy8vICAgICAg" +
- "ICAgbGV0IGRhdGFTaXplOiBEYXRhU2l6ZSA9IGMuY29tcHV0ZURhdGFTaXplKDIpOwovLy8gICAgICAgICBkYXRhU2l6ZS5jZWxsczsgLy8gMgovLy8gICAgICAgICBk" +
- "YXRhU2l6ZS5iaXRzOyAgLy8gNwovLy8gICAgICAgICBkYXRhU2l6ZS5yZWZzOyAgLy8gMQovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8vLyAgICAgICAgIC8v" +
- "IGlmIG1heENlbGxzIHdhcyBpbnN1ZmZpY2llbnQgdG8gdHJhdmVyc2UgdGhlIGNlbGwKLy8vICAgICAgICAgLy8gYW5kIGFsbCBvZiBpdHMgcmVmZXJlbmNlcywgdGhl" +
- "IGV4aXRDb2RlIGhlcmUgd291bGQgYmUgOAovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" +
- "cmUtY2VsbHMjY2VsbGNvbXB1dGVkYXRhc2l6ZQovLy8KYXNtIGV4dGVuZHMgZnVuIGNvbXB1dGVEYXRhU2l6ZShzZWxmOiBDZWxsPywgbWF4Q2VsbHM6IEludCk6IERh" +
- "dGFTaXplIHsgQ0RBVEFTSVpFIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgov" +
- "Ly8KLy8vIFNpbWlsYXIgdG8gYENlbGwuY29tcHV0ZURhdGFTaXplKClgLCBidXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgY2VsbCB0aGF0IGNvbnRhaW5z" +
- "IHRoZSBgU2xpY2VgIGl0c2VsZi4gSG93ZXZlciwgYWNjb3VudHMgZm9yIGl0cyBiaXRzIGFuZCByZWZzLgovLy8KLy8vIFRoZSByZXN1bHRzIGFyZSBwYWNrZWQgaW50" +
- "byBhIGBEYXRhU2l6ZWAgU3RydWN0IGNvbnNpc3Rpbmcgb2Y6Ci8vLyAqIGBjZWxsczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiBuZXN0ZWQgY2VsbHMsIGluY2x1" +
- "ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLyAqIGBiaXRzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5n" +
- "IHRoZSBzdGFydGluZyBvbmUKLy8vICogYHJlZnM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVmcyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhl" +
- "IHN0YXJ0aW5nIG9uZQovLy8KLy8vIElmIHRoZSBzcGVjaWZpZWQgYG1heENlbGxzYCB2YWx1ZSBpc24ndCBlbm91Z2ggdG8gdHJhdmVyc2UgYWxsIGNlbGxzICoqbm90" +
- "KiogaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUsIGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA4IGlzIHRocm93bjogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8v" +
- "IEF0dGVtcHRzIHRvIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZSBvZiBgbWF4Q2VsbHNgIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIGV4aXQgY29kZSA1OiBgSW50ZWdl" +
- "ciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" +
- "LnN0b3JlSW50KDQyLCA3KS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIGxldCBkYXRhU2l6ZTogRGF0YVNp" +
- "emUgPSBzLmNvbXB1dGVEYXRhU2l6ZSgxKTsKLy8vICAgICAgICAgZGF0YVNpemUuY2VsbHM7IC8vIDEKLy8vICAgICAgICAgZGF0YVNpemUuYml0czsgIC8vIDcKLy8v" +
- "ICAgICAgICAgZGF0YVNpemUucmVmczsgIC8vIDEKLy8vICAgICB9IGNhdGNoIChleGl0Q29kZSkgewovLy8gICAgICAgICAvLyBpZiBtYXhDZWxscyB3YXMgaW5zdWZm" +
- "aWNpZW50IHRvIHRyYXZlcnNlIHRoZSBjZWxsCi8vLyAgICAgICAgIC8vIGFuZCBhbGwgb2YgaXRzIHJlZmVyZW5jZXMsIHRoZSBleGl0Q29kZSBoZXJlIHdvdWxkIGJl" +
- "IDgKLy8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlY29tcHV0ZWRh" +
- "dGFzaXplCi8vLwphc20gZXh0ZW5kcyBmdW4gY29tcHV0ZURhdGFTaXplKHNlbGY6IFNsaWNlLCBtYXhDZWxsczogSW50KTogRGF0YVNpemUgeyBTREFUQVNJWkUgfQoK" +
- "Ly8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBDZWxsYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDb21wdXRlcyBhbmQgcmV0" +
- "dXJucyB0aGUgYEludGAgZGVwdGggb2YgdGhlIGBDZWxsYC4gUHJvZHVjZXMgMCBpZiB0aGUgYENlbGxgIGhhcyBubyByZWZlcmVuY2VzLCBvdGhlcndpc2UgMSBwbHVz" +
- "IHRoZSBtYXhpbXVtIG9mIHRoZSBkZXB0aHMgb2YgdGhlIHJlZmVyZW5jZWQgY2VsbHMuIElmIGMgaXMgbnVsbCwgcmV0dXJucyB6ZXJvLgovLy8KLy8vIGBgYHRhY3QK" +
- "Ly8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmVuZENlbGwoKTsKLy8vICAgICBsZXQgZGVw" +
- "dGg6IEludCA9IGMuZGVwdGgoKTsgLy8gMAovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNj" +
- "ZWxsZGVwdGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBDZWxsPyk6IEludCB7IENERVBUSCB9Cg==";
+ "bHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0" +
+ "dXJuIHZhbHVlIG9mIGBTbGljZS5sb2FkVmFyVWludDMyKClgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgc3VjaCBgSW50YCB3aGVuIGBTbGljZWAgZG9lc24ndCBj" +
+ "b250YWluIGl0IHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBza2lwIG1vcmUg" +
+ "ZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJmbG93YC4KLy8vCi8vLyBgYGB0" +
+ "YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJVaW50MzIoMjM5KQovLy8g" +
+ "ICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJVaW50MzIoKTsKLy8vICAgICBsZXQgZml6" +
+ "ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" +
+ "cmUtY2VsbHMjc2xpY2Vza2lwdmFydWludDMyCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUg" +
+ "OF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" +
+ "b29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFZhclVpbnQzMihzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQzMiBOSVAgfQoKLy8v" +
+ "IEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2ltaWxhciB0" +
+ "byBgU2xpY2UubG9hZFZhclVpbnQzMigpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2" +
+ "ZS4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2FkIHN1Y2ggYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBb" +
+ "ZXhpdCBjb2RlIDhdOiBgQ2VsbCBvdmVyZmxvd2AuCi8vLwovLy8gQXR0ZW1wdHMgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFu" +
+ "IGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0" +
+ "IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQzMigtNDIwMDAwKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhckludDMy" +
+ "KCk7IC8vIC00MjAwMDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vs" +
+ "b2FkdmFyaW50MzIKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW2V4aXQgY29kZSA4XTogaHR0cHM6Ly9kb2Nz" +
+ "LnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5" +
+ "Ci8vLwphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFySW50MzIoc2VsZjogU2xpY2UpOiBJbnQgeyBMRFZBUklOVDMyIH0KCi8vLyBFeHRlbnNp" +
+ "b24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNl" +
+ "LnNraXBWYXJVaW50MzIoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMjQ3IHRvIDJeMjQ3IC0gMSBpbmNsdXNpdmUuCi8vLwov" +
+ "Ly8gQXR0ZW1wdHMgdG8gc2tpcCBzdWNoIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29k" +
+ "ZSA4XTogYENlbGwgb3ZlcmZsb3dgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucyB0aHJvdyBhbiBleGNlcHRp" +
+ "b24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGlj" +
+ "ZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDMyKC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1Ns" +
+ "aWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDMyKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAK" +
+ "Ly8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcmludDMyCi8vLyAqIGh0dHBzOi8vZG9j" +
+ "cy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgOF06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" +
+ "cyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4g" +
+ "c2tpcFZhckludDMyKHNlbGY6IFNsaWNlKSB7IExEVkFSSU5UMzIgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5" +
+ "cGUuCi8vLwovLy8gTG9hZHMgYWxsIGJ1dCB0aGUgZmlyc3QgMCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0" +
+ "byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2Yg" +
+ "ZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9u" +
+ "IHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNs" +
+ "aWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBzLnNraXBCaXRzKDUpOyAgICAgICAgICAgICAgICAgICAvLyBhbGwgYnV0" +
+ "IGZpcnN0IDUgYml0cwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMubG9hZEJpdHMoMSk7IC8vIGxvYWQgb25seSAxIGJpdAovLy8gfQovLy8gYGBgCi8vLwovLy8g" +
+ "U2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBiaXRzCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+ "b3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtleGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhp" +
+ "dCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcEJpdHMoc2Vs" +
+ "ZjogU2xpY2UsIGw6IEludCkgeyBTRFNLSVBGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENoZWNrcyB3" +
+ "aGV0aGVyIHRoZSBgU2xpY2VgIGlzIGVtcHR5IChpLmUuLCBjb250YWlucyBubyBiaXRzIG9mIGRhdGEgYW5kIG5vIGNlbGwgcmVmZXJlbmNlcykuCi8vLyBJZiBpdCBp" +
+ "cyBub3QsIGl0IHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
+ "cGxlKCkgewovLy8gICAgIGxldCBlbXB0eU9uZTogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAgZW1wdHlPbmUuZW5kUGFyc2UoKTsgLy8gbm90aGluZywgYXMg" +
+ "aXQncyBlbXB0eQovLy8KLy8vICAgICBsZXQgcGF1bDogU2xpY2UgPSAiRmVhciBpcyB0aGUgbWluZC1raWxsZXIiLmFzU2xpY2UoKTsKLy8vICAgICB0cnkgewovLy8g" +
+ "ICAgICAgICBwYXVsLmVuZFBhcnNlKCk7IC8vIHRocm93cyBleGl0IGNvZGUgOQovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6" +
+ "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VlbmRwYXJzZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29k" +
+ "ZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVuIGVuZFBh" +
+ "cnNlKHNlbGY6IFNsaWNlKSB7IEVORFMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42" +
+ "LjAuCi8vLwovLy8gUHJlbG9hZHMgYWxsIGJ1dCB0aGUgbGFzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1w" +
+ "dHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBv" +
+ "ZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlv" +
+ "biB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNl" +
+ "ID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgYWxsQnV0TGFzdEZpdmU6IFNsaWNlID0gcy5za2lwTGFzdEJpdHMoNSk7" +
+ "IC8vIGFsbCBidXQgbGFzdCA1IGJpdHMsCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG9ubHkgZmly" +
+ "c3QgMgovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBsYXN0Yml0" +
+ "cwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
+ "Lm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBl" +
+ "eHRlbmRzIGZ1biBza2lwTGFzdEJpdHMoc2VsZjogU2xpY2UsIGxlbjogSW50KTogU2xpY2UgeyBTRFNLSVBMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9y" +
+ "IHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIHRoZSBmaXJzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBi" +
+ "aXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlv" +
+ "biB3aXRoIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhh" +
+ "biBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8g" +
+ "ZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZmlyc3RG" +
+ "aXZlOiBTbGljZSA9IHMuZmlyc3RCaXRzKDUpOyAvLyBmaXJzdCA1IGJpdHMKLy8vIH0KLy8vIGBgYAovLy8KLy8vIEluIG9yZGVyIHRvIHJlZHVjZSBnYXMgdXNhZ2Us" +
+ "IHByZWZlciBjYWxsaW5nIGBTbGljZS5wcmVsb2FkQml0cygpYCBvdmVyIHVzaW5nIHRoaXMgZnVuY3Rpb24gc2luY2UgdGhlIGZvcm1lciBpcyBtb3JlIG9wdGltaXpl" +
+ "ZC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZmlyc3RiaXRzCi8vLyAqIGh0dHBzOi8vZG9j" +
+ "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZGJpdHMKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVz" +
+ "Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8v" +
+ "ZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZmlyc3RCaXRzKHNlbGY6IFNsaWNlLCBsZW46IEludCk6IFNsaWNl" +
+ "IHsgU0RDVVRGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8v" +
+ "LyBQcmVsb2FkcyB0aGUgbGFzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBv" +
+ "dXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgNV06IGBJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZWAu" +
+ "Ci8vLwovLy8gQXR0ZW1wdHMgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUg" +
+ "OV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3Rv" +
+ "cmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgbGFzdEZpdmU6IFNsaWNlID0gcy5sYXN0Qml0cyg1KTsgLy8gbGFzdCA1IGJpdHMKLy8vIH0KLy8vIGBg" +
+ "YAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VsYXN0Yml0cwovLy8gKiBodHRwczovL2RvY3Mu" +
+ "dGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMj" +
+ "NQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIGZ1biBsYXN0Qml0cyhz" +
+ "ZWxmOiBTbGljZSwgbGVuOiBJbnQpOiBTbGljZSB7IFNEQ1VUTEFTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFi" +
+ "bGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgYEludGAgZGVwdGggb2YgdGhlIGBTbGljZWAuIFByb2R1Y2VzIDAgaWYg" +
+ "dGhlIGBTbGljZWAgaGFzIG5vIHJlZmVyZW5jZXMsIG90aGVyd2lzZSAxIHBsdXMgdGhlIG1heGltdW0gb2YgdGhlIGRlcHRocyBvZiB0aGUgcmVmZXJlbmNlZCBjZWxs" +
+ "cy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGlj" +
+ "ZSgpOwovLy8gICAgIGxldCBkZXB0aDogSW50ID0gcy5kZXB0aCgpOyAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+ "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZGVwdGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBTbGljZSk6IEludCB7IFNERVBUSCB9CgovLwovLyBTbGlj" +
+ "ZSBzaXplCi8vCgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiByZWZlcmVuY2Vz" +
+ "IGluIHRoZSBgU2xpY2VgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2Vs" +
+ "bCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucmVmcygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" +
+ "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXJlZnMKLy8vCmFzbSBleHRlbmRzIGZ1biByZWZzKHNlbGY6IFNsaWNlKTogSW50" +
+ "IHsgU1JFRlMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRz" +
+ "IGluIHRoZSBgU2xpY2VgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2Vs" +
+ "bCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMuYml0cygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2Vl" +
+ "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWJpdHMKLy8vCmFzbSBleHRlbmRzIGZ1biBiaXRzKHNlbGY6IFNsaWNlKTogSW50" +
+ "IHsgU0JJVFMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBpcyBl" +
+ "bXB0eSAoaS5lLiwgY29udGFpbnMgbm8gYml0cyBvZiBkYXRhIGFuZCBubyBjZWxsIHJlZmVyZW5jZXMpLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgZW1wdHks" +
+ "IGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3Jl" +
+ "UmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmVtcHR5KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLy8v" +
+ "ICAgICBsZXQgYnV6ejogQm9vbCA9IGJlZ2luQ2VsbCgpLmFzU2xpY2UoKS5lbXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8v" +
+ "ZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZW1wdHkKLy8vCmFzbSBleHRlbmRzIGZ1biBlbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTRU1Q" +
+ "VFkgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBoYXMgbm8gYml0" +
+ "cyBvZiBkYXRhLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaGFzIG5vIGRhdGEsIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
+ "cGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJv" +
+ "b2wgPSBzLmRhdGFFbXB0eSgpOyAgLy8gdHJ1ZQovLy8KLy8vICAgICBsZXQgczI6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsK" +
+ "Ly8vICAgICBsZXQgYnV6ejogQm9vbCA9IHMyLmRhdGFFbXB0eSgpOyAvLyBmYWxzZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1s" +
+ "YW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWRhdGFlbXB0eQovLy8KYXNtIGV4dGVuZHMgZnVuIGRhdGFFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTREVNUFRZ" +
+ "IH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBTbGljZWAgaGFzIG5vIHJlZmVy" +
+ "ZW5jZXMuCi8vLyBSZXR1cm5zIGB0cnVlYCBpZiBpdCBoYXMgbm8gcmVmZXJlbmNlcywgYGZhbHNlYCBvdGhlcndpc2UuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4" +
+ "YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejog" +
+ "Qm9vbCA9IHMucmVmc0VtcHR5KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLy8vICAgICBsZXQgYnV6ejogQm9vbCA9IGJlZ2luQ2VsbCgpLmFzU2xpY2Uo" +
+ "KS5yZWZzRW1wdHkoKTsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGlj" +
+ "ZXJlZnNlbXB0eQovLy8KYXNtIGV4dGVuZHMgZnVuIHJlZnNFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTUkVNUFRZIH0KCi8vCi8vIENvbnZlcnNpb25zCi8vCgov" +
+ "Ly8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBCdWlsZGVyYCBpbnRvIGEgYFNsaWNlYCBhbmQg" +
+ "cmV0dXJucyBpdC4KLy8vIEFuIGFsaWFzIHRvIGBzZWxmLmVuZENlbGwoKS5iZWdpblBhcnNlKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewov" +
+ "Ly8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gYi5hc1NsaWNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8v" +
+ "LyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJhc3NsaWNlCi8vLwppbmxpbmUgZXh0ZW5kcyBmdW4gYXNTbGljZShz" +
+ "ZWxmOiBCdWlsZGVyKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYuZW5kQ2VsbCgpLmJlZ2luUGFyc2UoKTsKfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhl" +
+ "IGBDZWxsYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgQ2VsbGAgdG8gYSBgU2xpY2VgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuYmVn" +
+ "aW5QYXJzZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGVtcHR5Q2VsbCgpOwovLy8gICAgIGxldCBm" +
+ "aXp6OiBTbGljZSA9IGMuYXNTbGljZSgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNj" +
+ "ZWxsYXNzbGljZQovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzU2xpY2Uoc2VsZjogQ2VsbCk6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmJlZ2luUGFyc2UoKTsKfQoK" +
+ "Ly8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgYFNsaWNlYCB0byBhIGBDZWxsYCBhbmQgcmV0dXJu" +
+ "cyBpdC4KLy8vIEFuIGFsaWFzIHRvIGBiZWdpbkNlbGwoKS5zdG9yZVNsaWNlKHNlbGYpLmVuZENlbGwoKWAuCi8vLwovLy8gTk9URTogKipHYXMgZXhwZW5zaXZlISoq" +
+ "IFRoaXMgZnVuY3Rpb24gdXNlcyA1MDAgZ2FzIHVuaXRzIG9yIG1vcmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNs" +
+ "aWNlID0gYmVnaW5DZWxsKCkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gcy5hc0NlbGwoKTsKLy8vICAgICBsZXQgYnV6ejogQ2VsbCA9IGJlZ2lu" +
+ "Q2VsbCgpLnN0b3JlU2xpY2UocykuZW5kQ2VsbCgpOwovLy8KLy8vICAgICBmaXp6ID09IGJ1eno7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0" +
+ "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vhc2NlbGwKLy8vCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogU2xpY2UpOiBD" +
+ "ZWxsIHsKICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVNsaWNlKHNlbGYpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKLy8vIEV4dGVuc2lvbiBmdW5j" +
+ "dGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgQnVpbGRlcmAgaW50byBhIGBDZWxsYCBhbmQgcmV0dXJucyBpdC4KLy8vIEFu" +
+ "IGFsaWFzIHRvIGBzZWxmLmVuZENlbGwoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNl" +
+ "bGwoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IGIuYXNDZWxsKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
+ "L3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJhc2NlbGwKLy8vCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgewogICAgcmV0dXJuIHNl" +
+ "bGYuZW5kQ2VsbCgpOwp9CgovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBgQ2VsbGAgKHdpdGhvdXQgZGF0YSBhbmQgcmVmZXJlbmNlcykuCi8vLyBBbiBh" +
+ "bGlhcyB0byBgYmVnaW5DZWxsKCkuZW5kQ2VsbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IGVt" +
+ "cHR5Q2VsbCgpOwovLy8gICAgIGxldCBidXp6OiBDZWxsID0gYmVnaW5DZWxsKCkuZW5kQ2VsbCgpOwovLy8KLy8vICAgICBmaXp6ID09IGJ1eno7IC8vIHRydWUKLy8v" +
+ "IH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjZW1wdHljZWxsCi8vLwphc20gZnVuIGVtcHR5Q2Vs" +
+ "bCgpOiBDZWxsIHsKICAgIDxiIGI+IFBVU0hSRUYgLy8gUHVyZSBGaWZ0OiAiPGIiIGNyZWF0ZXMgYSBidWlsZGVyLCAiYj4iIHR1cm5zIGl0IGludG8gYSBjZWxsIGF0" +
+ "IGNvbXBpbGUgdGltZQp9CgovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBgU2xpY2VgICh3aXRob3V0IGRhdGEgYW5kIHJlZmVyZW5jZXMpLgovLy8gQW4g" +
+ "YWxpYXMgdG8gYGVtcHR5Q2VsbCgpLmFzU2xpY2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0g" +
+ "ZW1wdHlTbGljZSgpOwovLy8gICAgIGxldCBidXp6OiBTbGljZSA9IGVtcHR5Q2VsbCgpLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgZml6eiA9PSBidXp6OyAvLyB0cnVl" +
+ "Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2VtcHR5c2xpY2UKLy8vCmFzbSBmdW4gZW1w" +
+ "dHlTbGljZSgpOiBTbGljZSB7CiAgICBie30gUFVTSFNMSUNFCn0KCi8vLyBTdHJ1Y3QgZm9yIGhvbGRpbmcgdmFsdWVzIGNvbXB1dGVkIGJ5IHRoZSBgQ2VsbC5jb21w" +
+ "dXRlRGF0YVNpemUoKWAgYW5kIGBTbGljZS5jb21wdXRlRGF0YVNpemUoKWAgZXh0ZW5zaW9uIGZ1bmN0aW9ucy4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8v" +
+ "LwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNjZWxsY29tcHV0ZWRhdGFzaXplCi8vLyAqIGh0dHBzOi8vZG9j" +
+ "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlY29tcHV0ZWRhdGFzaXplCi8vLwpzdHJ1Y3QgRGF0YVNpemUgewogICAgLy8vIFRoZSB0b3RhbCBudW1i" +
+ "ZXIgb2YgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZS4KICAgIGNlbGxzOiBJbnQ7CgogICAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgYml0" +
+ "cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZS4KICAgIGJpdHM6IEludDsKCiAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBy" +
+ "ZWZzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgcmVmczogSW50Owp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZv" +
+ "ciB0aGUgYENlbGxgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlzdGlu" +
+ "Y3QgY2VsbHMsIGJpdHMgYW5kIHJlZnMgaW4gdGhlIGBDZWxsYCBieSB1c2luZyBhIGRlcHRoLWZpcnN0IHNlYXJjaCAoREZTKSBhbGdvcml0aG0sIHJlY3Vyc2l2ZWx5" +
+ "IHRyYXZlcnNpbmcgZWFjaCByZWZlcmVuY2VkIGNlbGwuIFRoaXMgZnVuY3Rpb24gaXMgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSBhbmQgY2FuIGNvbnN1bWUgYSBs" +
+ "b3Qgb2YgZ2FzLiBJZiBgc2VsZmAgaXMgYG51bGxgLCByZXR1cm5zIGBEYXRhU2l6ZWAgd2l0aCBhbGwgZmllbGRzIHNldCB0byAwLgovLy8KLy8vIFRoZSByZXN1bHRz" +
+ "IGFyZSBwYWNrZWQgaW50byBhIGBEYXRhU2l6ZWAgU3RydWN0IGNvbnNpc3Rpbmcgb2Y6Ci8vLyAqIGBjZWxsczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiBuZXN0" +
+ "ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLyAqIGBiaXRzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gYWxsIG5lc3RlZCBj" +
+ "ZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8vICogYHJlZnM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVmcyBpbiBhbGwgbmVzdGVkIGNlbGxz" +
+ "LCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZQovLy8KLy8vIElmIHRoZSBzcGVjaWZpZWQgYG1heENlbGxzYCB2YWx1ZSBpc24ndCBlbm91Z2ggdG8gdHJhdmVyc2Ug" +
+ "YWxsIGNlbGxzIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLCBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOCBpcyB0aHJvd246IGBDZWxsIG92ZXJmbG93YC4K" +
+ "Ly8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGEgbmVnYXRpdmUgdmFsdWUgb2YgYG1heENlbGxzYCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgNTog" +
+ "YEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGJlZ2lu" +
+ "Q2VsbCgpLnN0b3JlSW50KDQyLCA3KS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuZW5kQ2VsbCgpOwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIGxldCBkYXRhU2l6ZTog" +
+ "RGF0YVNpemUgPSBjLmNvbXB1dGVEYXRhU2l6ZSgyKTsKLy8vICAgICAgICAgZGF0YVNpemUuY2VsbHM7IC8vIDIKLy8vICAgICAgICAgZGF0YVNpemUuYml0czsgIC8v" +
+ "IDcKLy8vICAgICAgICAgZGF0YVNpemUucmVmczsgIC8vIDEKLy8vICAgICB9IGNhdGNoIChleGl0Q29kZSkgewovLy8gICAgICAgICAvLyBpZiBtYXhDZWxscyB3YXMg" +
+ "aW5zdWZmaWNpZW50IHRvIHRyYXZlcnNlIHRoZSBjZWxsCi8vLyAgICAgICAgIC8vIGFuZCBhbGwgb2YgaXRzIHJlZmVyZW5jZXMsIHRoZSBleGl0Q29kZSBoZXJlIHdv" +
+ "dWxkIGJlIDgKLy8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxjb21w" +
+ "dXRlZGF0YXNpemUKLy8vCmFzbSBleHRlbmRzIGZ1biBjb21wdXRlRGF0YVNpemUoc2VsZjogQ2VsbD8sIG1heENlbGxzOiBJbnQpOiBEYXRhU2l6ZSB7IENEQVRBU0la" +
+ "RSB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTaW1pbGFyIHRv" +
+ "IGBDZWxsLmNvbXB1dGVEYXRhU2l6ZSgpYCwgYnV0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGNlbGwgdGhhdCBjb250YWlucyB0aGUgYFNsaWNlYCBpdHNl" +
+ "bGYuIEhvd2V2ZXIsIGFjY291bnRzIGZvciBpdHMgYml0cyBhbmQgcmVmcy4KLy8vCi8vLyBUaGUgcmVzdWx0cyBhcmUgcGFja2VkIGludG8gYSBgRGF0YVNpemVgIFN0" +
+ "cnVjdCBjb25zaXN0aW5nIG9mOgovLy8gKiBgY2VsbHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5n" +
+ "IG9uZQovLy8gKiBgYml0czogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25l" +
+ "Ci8vLyAqIGByZWZzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZnMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8v" +
+ "Ci8vLyBJZiB0aGUgc3BlY2lmaWVkIGBtYXhDZWxsc2AgdmFsdWUgaXNuJ3QgZW5vdWdoIHRvIHRyYXZlcnNlIGFsbCBjZWxscyAqKm5vdCoqIGluY2x1ZGluZyB0aGUg" +
+ "c3RhcnRpbmcgb25lLCBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgOCBpcyB0aHJvd246IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVj" +
+ "aWZ5IGEgbmVnYXRpdmUgdmFsdWUgb2YgYG1heENlbGxzYCB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBleGl0IGNvZGUgNTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVk" +
+ "IHJhbmdlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNyku" +
+ "c3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBsZXQgZGF0YVNpemU6IERhdGFTaXplID0gcy5jb21wdXRlRGF0" +
+ "YVNpemUoMSk7Ci8vLyAgICAgICAgIGRhdGFTaXplLmNlbGxzOyAvLyAxCi8vLyAgICAgICAgIGRhdGFTaXplLmJpdHM7ICAvLyA3Ci8vLyAgICAgICAgIGRhdGFTaXpl" +
+ "LnJlZnM7ICAvLyAxCi8vLyAgICAgfSBjYXRjaCAoZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gaWYgbWF4Q2VsbHMgd2FzIGluc3VmZmljaWVudCB0byB0cmF2ZXJz" +
+ "ZSB0aGUgY2VsbAovLy8gICAgICAgICAvLyBhbmQgYWxsIG9mIGl0cyByZWZlcmVuY2VzLCB0aGUgZXhpdENvZGUgaGVyZSB3b3VsZCBiZSA4Ci8vLyAgICAgfQovLy8g" +
+ "fQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWNvbXB1dGVkYXRhc2l6ZQovLy8KYXNtIGV4" +
+ "dGVuZHMgZnVuIGNvbXB1dGVEYXRhU2l6ZShzZWxmOiBTbGljZSwgbWF4Q2VsbHM6IEludCk6IERhdGFTaXplIHsgU0RBVEFTSVpFIH0KCi8vLyBFeHRlbnNpb24gZnVu" +
+ "Y3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGBJbnRgIGRl" +
+ "cHRoIG9mIHRoZSBgQ2VsbGAuIFByb2R1Y2VzIDAgaWYgdGhlIGBDZWxsYCBoYXMgbm8gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIDEgcGx1cyB0aGUgbWF4aW11bSBvZiB0" +
+ "aGUgZGVwdGhzIG9mIHRoZSByZWZlcmVuY2VkIGNlbGxzLiBJZiBjIGlzIG51bGwsIHJldHVybnMgemVyby4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgp" +
+ "IHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5lbmRDZWxsKCk7Ci8vLyAgICAgbGV0IGRlcHRoOiBJbnQgPSBjLmRlcHRo" +
+ "KCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGRlcHRoCi8vLwphc20g" +
+ "ZXh0ZW5kcyBmdW4gZGVwdGgoc2VsZjogQ2VsbD8pOiBJbnQgeyBDREVQVEggfQo=";
files["std/internal/config.tact"] =
"Ly8vIExvYWRzIGEgW2NvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXSBvZiBUT04gQmxvY2tjaGFpbiBieSBpdHMgYGlkYCBudW1iZXIuCi8vLwovLy8gU2VlOiBodHRwczov" +
"L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jb250ZXh0c3RhdGUjZ2V0Y29uZmlncGFyYW0KLy8vCi8vLyBbY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJdOiBodHRw" +
From 5946f1ea70bcdd7923cda84bc0383fe19f8c6ff7 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Tue, 18 Mar 2025 11:50:24 +0100
Subject: [PATCH 6/8] tests
---
src/test/e2e-emulated/address.spec.ts | 26 +++++++++++++++
src/test/e2e-emulated/contracts/address.tact | 34 ++++++++++++++------
2 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/src/test/e2e-emulated/address.spec.ts b/src/test/e2e-emulated/address.spec.ts
index b2f59aa50..6125a83ad 100644
--- a/src/test/e2e-emulated/address.spec.ts
+++ b/src/test/e2e-emulated/address.spec.ts
@@ -43,4 +43,30 @@ describe("address", () => {
"0:4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873",
);
});
+
+ it("should implement (de)serialization of BasechainAddresses correctly", async () => {
+ // Check the instantiation
+ const addr1 = await contract.getBasechainAddressFromHash(null);
+ const addr2 =
+ await contract.getBasechainAddressFromHash(
+ 0x4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873n,
+ );
+
+ const cell1 = await contract.getBasechainAddressStore(addr1);
+ const cell2 = await contract.getBasechainAddressStore(addr2);
+
+ // Check .skip...
+ await contract.getBasechainAddressSkip(cell1.asSlice());
+ await contract.getBasechainAddressSkip(cell2.asSlice());
+
+ // Check .load...
+ const loadedAddr1 = await contract.getBasechainAddressLoad(
+ cell1.asSlice(),
+ );
+ expect(addr1.hash === loadedAddr1.hash).toBe(true);
+ const loadedAddr2 = await contract.getBasechainAddressLoad(
+ cell2.asSlice(),
+ );
+ expect(addr2.hash === loadedAddr2.hash).toBe(true);
+ });
});
diff --git a/src/test/e2e-emulated/contracts/address.tact b/src/test/e2e-emulated/contracts/address.tact
index 851847aa8..6b4d6811a 100644
--- a/src/test/e2e-emulated/contracts/address.tact
+++ b/src/test/e2e-emulated/contracts/address.tact
@@ -1,11 +1,5 @@
-contract AddressTester {
- init() {
-
- }
-
- receive() {
-
- }
+contract AddressTester() {
+ receive() { }
get fun test1(): Address {
return address("UQBKgXCNLPexWhs2L79kiARR1phGH1LwXxRbNsCFF9doczSI");
@@ -18,4 +12,26 @@ contract AddressTester {
get fun test3(): Address {
return address("0:4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873");
}
-}
\ No newline at end of file
+
+ get fun basechainAddressFromHash(hash: Int?): BasechainAddress {
+ return BasechainAddress{ hash };
+ }
+
+ get fun basechainAddressStore(ba: BasechainAddress): Cell {
+ return beginCell()
+ .storeBasechainAddress(ba)
+ .endCell();
+ }
+
+ get fun basechainAddressLoad(baCell: Slice): BasechainAddress {
+ let ba = baCell.loadBasechainAddress();
+ baCell.endParse(); // make sure it's empty
+ return ba;
+ }
+
+ get fun basechainAddressSkip(baCell: Slice): Bool {
+ baCell.skipBasechainAddress();
+ baCell.endParse(); // make sure it's empty
+ return true;
+ }
+}
From 3afc9bae555218a252c80965dd8c35a70cfc2bf8 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Tue, 18 Mar 2025 12:29:40 +0100
Subject: [PATCH 7/8] tests for addr_var and addr_extern, just in case
---
src/test/e2e-emulated/address.spec.ts | 27 +++++++++++++++++++-
src/test/e2e-emulated/contracts/address.tact | 20 +++++++++++++++
2 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/src/test/e2e-emulated/address.spec.ts b/src/test/e2e-emulated/address.spec.ts
index 6125a83ad..4a0a9d790 100644
--- a/src/test/e2e-emulated/address.spec.ts
+++ b/src/test/e2e-emulated/address.spec.ts
@@ -1,4 +1,4 @@
-import { toNano } from "@ton/core";
+import { beginCell, toNano } from "@ton/core";
import type { SandboxContract, TreasuryContract } from "@ton/sandbox";
import { Blockchain } from "@ton/sandbox";
import { AddressTester } from "./contracts/output/address_AddressTester";
@@ -68,5 +68,30 @@ describe("address", () => {
cell2.asSlice(),
);
expect(addr2.hash === loadedAddr2.hash).toBe(true);
+
+ // Check .load... and .skip... of an addr_var
+ const varAddr = beginCell()
+ .storeUint(6, 3)
+ .storeUint(123, 9)
+ .storeUint(234, 32)
+ .storeUint(345, 123)
+ .endCell()
+ .asSlice();
+ const resLoad1 = await contract.getBasechainAddressTryLoad(varAddr);
+ expect(resLoad1).toBe(false);
+ const resSkip1 = await contract.getBasechainAddressTrySkip(varAddr);
+ expect(resSkip1).toBe(false);
+
+ // Check .load... and .skip... of an addr_extern
+ const externAddr = beginCell()
+ .storeUint(1, 2) // $01
+ .storeUint(42, 9) // len:(## 9)
+ .storeUint(0, 42) // external_address:(bits len)
+ .endCell()
+ .asSlice();
+ const resLoad2 = await contract.getBasechainAddressTryLoad(externAddr);
+ expect(resLoad2).toBe(false);
+ const resSkip2 = await contract.getBasechainAddressTrySkip(externAddr);
+ expect(resSkip2).toBe(false);
});
});
diff --git a/src/test/e2e-emulated/contracts/address.tact b/src/test/e2e-emulated/contracts/address.tact
index 6b4d6811a..a7b959ad5 100644
--- a/src/test/e2e-emulated/contracts/address.tact
+++ b/src/test/e2e-emulated/contracts/address.tact
@@ -29,9 +29,29 @@ contract AddressTester() {
return ba;
}
+ get fun basechainAddressTryLoad(baCell: Slice): Bool {
+ try {
+ let _ = baCell.loadBasechainAddress();
+ baCell.endParse(); // make sure it's empty
+ return true;
+ } catch (_) {
+ return false;
+ }
+ }
+
get fun basechainAddressSkip(baCell: Slice): Bool {
baCell.skipBasechainAddress();
baCell.endParse(); // make sure it's empty
return true;
}
+
+ get fun basechainAddressTrySkip(baCell: Slice): Bool {
+ try {
+ baCell.skipBasechainAddress();
+ baCell.endParse();
+ return true;
+ } catch(_) {
+ return false;
+ }
+ }
}
From ec560dcd8ebe4a0bbbde83a8bc9600d4b57e1c52 Mon Sep 17 00:00:00 2001
From: Novus Nota <68142933+novusnota@users.noreply.github.com>
Date: Tue, 18 Mar 2025 12:39:44 +0100
Subject: [PATCH 8/8] more visibility for address methods in core-cells
---
docs/src/content/docs/ref/core-addresses.mdx | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/docs/src/content/docs/ref/core-addresses.mdx b/docs/src/content/docs/ref/core-addresses.mdx
index 387ca080a..8d64a42b2 100644
--- a/docs/src/content/docs/ref/core-addresses.mdx
+++ b/docs/src/content/docs/ref/core-addresses.mdx
@@ -7,7 +7,10 @@ import { Badge } from '@astrojs/starlight/components';
`Address{:tact}` represents a standard [smart contract address](https://docs.ton.org/v3/concepts/dive-into-ton/ton-blockchain/smart-contract-addresses#address-of-smart-contract) on TON Blockchain.
-See also: [`myAddress(){:tact}` function in the context and state reference](/ref/core-contextstate#myaddress).
+See also:
+
+* [`myAddress(){:tact}` function in the context and state reference](/ref/core-contextstate#myaddress).
+* Address-oriented extension functions for [`Builder{:tact}`][builder] and [`Slice{:tact}`][slice] types on their reference page: [Cells, Builders and Slices](/ref/core-cells).
## newAddress
@@ -413,6 +416,7 @@ fun example() {
[int]: /book/integers
[nano]: /book/integers#nanotoncoin
[cell]: /book/cells#cells
+[builder]: /book/cells#builders
[slice]: /book/cells#slices
[struct]: /book/structs-and-messages#structs
[opt]: /book/optionals