@dwelle/excalidraw 0.3.19 → 0.3.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README_NEXT.md +2 -17
- package/dist/excalidraw-assets/image-0db17e06143a31f9772b.js +1 -0
- package/dist/excalidraw-assets/image-6f8d3b9873832b5f7a67.js +1 -0
- package/dist/excalidraw-assets/image-8e0c265e832504f62477.js +1 -0
- package/dist/excalidraw-assets/image-9592159c56d563857679.js +1 -0
- package/dist/excalidraw-assets/image-98a7b39bd21998c69c4b.js +1 -0
- package/dist/excalidraw-assets/image-af02967a8a4c328f2713.js +1 -0
- package/dist/excalidraw-assets/image-bd5991c772b4867c8d27.js +1 -0
- package/dist/excalidraw-assets/image-c198828284ec0dba28dc.js +1 -0
- package/dist/excalidraw-assets/image-eac20119cbc2ceb81523.js +1 -0
- package/dist/excalidraw-assets/vendor-64ea3ed78bc76a895e61.js +2 -0
- package/dist/excalidraw-assets/vendor-64ea3ed78bc76a895e61.js.LICENSE.txt +14 -0
- package/dist/excalidraw-assets/vendor-e5c6cd57013e8e575a61.js +1 -0
- package/dist/excalidraw-assets-dev/image-469d5bd946743969995a.js +42 -0
- package/dist/excalidraw.development.js +39 -39
- package/dist/excalidraw.production.min.js +1 -2
- package/package.json +8 -5
- package/types/appState.d.ts +5 -5
- package/types/components/CheckboxItem.d.ts +1 -1
- package/types/components/LibraryMenuItems.d.ts +1 -1
- package/types/components/LibraryUnit.d.ts +1 -1
- package/types/components/Tooltip.d.ts +2 -1
- package/types/constants.d.ts +4 -0
- package/types/data/blob.d.ts +5 -1
- package/types/data/types.d.ts +2 -1
- package/types/element/index.d.ts +0 -3
- package/types/element/mutateElement.d.ts +1 -1
- package/types/element/newElement.d.ts +1 -1
- package/types/element/types.d.ts +2 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-0db17e06143a31f9772b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-6f8d3b9873832b5f7a67.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-8e0c265e832504f62477.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-9592159c56d563857679.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-98a7b39bd21998c69c4b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-af02967a8a4c328f2713.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-bd5991c772b4867c8d27.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-c198828284ec0dba28dc.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-eac20119cbc2ceb81523.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-64ea3ed78bc76a895e61.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-e5c6cd57013e8e575a61.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/image-469d5bd946743969995a.d.ts +0 -0
- package/types/packages/excalidraw/env.d.ts +1 -0
- package/types/packages/excalidraw/index.d.ts +1 -1
- package/types/packages/excalidraw/webpack.dev.config.d.ts +1 -1
- package/types/packages/excalidraw/webpack.prod.config.d.ts +0 -2
- package/types/packages/utils.d.ts +3 -2
- package/types/renderer/renderElement.d.ts +4 -4
- package/types/renderer/renderScene.d.ts +4 -9
- package/types/scene/types.d.ts +15 -8
- package/types/utils.d.ts +9 -1
package/CHANGELOG.md
CHANGED
|
@@ -13,6 +13,17 @@ Please add the latest change on the top under the correct section.
|
|
|
13
13
|
|
|
14
14
|
## Unreleased
|
|
15
15
|
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
- #### BREAKING CHANGE
|
|
19
|
+
|
|
20
|
+
Removed `getElementMap` util method.
|
|
21
|
+
|
|
22
|
+
- Changes to [`exportToCanvas`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#exportToCanvas) util function:
|
|
23
|
+
|
|
24
|
+
- Add `maxWidthOrHeight?: number` attribute.
|
|
25
|
+
- `scale` returned from `getDimensions()` is now optional (default to `1`).
|
|
26
|
+
|
|
16
27
|
- Image support.
|
|
17
28
|
|
|
18
29
|
NOTE: the unreleased API is highly unstable and may change significantly before the next stable release. As such it's largely undocumented at this point. You are encouraged to read through the [PR](https://github.com/excalidraw/excalidraw/pull/4011) description if you want to know more about the internals.
|
package/README_NEXT.md
CHANGED
|
@@ -756,7 +756,8 @@ This function makes sure elements and state is set to appropriate values and set
|
|
|
756
756
|
| --- | --- | --- | --- |
|
|
757
757
|
| elements | [Excalidraw Element []](https://github.com/excalidraw/excalidraw/blob/master/src/element/types) | | The elements to be exported to canvas |
|
|
758
758
|
| appState | [AppState](https://github.com/excalidraw/excalidraw/blob/master/src/packages/utils.ts#L12) | [defaultAppState](https://github.com/excalidraw/excalidraw/blob/master/src/appState.ts#L11) | The app state of the scene |
|
|
759
|
-
| getDimensions | `(width: number, height: number) => {width: number, height: number, scale
|
|
759
|
+
| getDimensions | `(width: number, height: number) => { width: number, height: number, scale?: number }` | undefined | A function which returns the `width`, `height`, and optionally `scale` (defaults `1`), with which canvas is to be exported. |
|
|
760
|
+
| maxWidthOrHeight | `number` | undefined | The maximum width or height of the exported image. If provided, `getDimensions` is ignored. |
|
|
760
761
|
|
|
761
762
|
**How to use**
|
|
762
763
|
|
|
@@ -864,22 +865,6 @@ import { isInvisiblySmallElement } from "@excalidraw/excalidraw-next";
|
|
|
864
865
|
|
|
865
866
|
Returns `true` if element is invisibly small (e.g. width & height are zero).
|
|
866
867
|
|
|
867
|
-
#### `getElementMap`
|
|
868
|
-
|
|
869
|
-
**_Signature_**
|
|
870
|
-
|
|
871
|
-
<pre>
|
|
872
|
-
getElementsMap(elements: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>): {[id: string]: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement</a>}
|
|
873
|
-
</pre>
|
|
874
|
-
|
|
875
|
-
**How to use**
|
|
876
|
-
|
|
877
|
-
```js
|
|
878
|
-
import { getElementsMap } from "@excalidraw/excalidraw-next";
|
|
879
|
-
```
|
|
880
|
-
|
|
881
|
-
This function returns an object where each element is mapped to its id.
|
|
882
|
-
|
|
883
868
|
#### `loadLibraryFromBlob`
|
|
884
869
|
|
|
885
870
|
```js
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{673:(e,r,n)=>{n.r(r),n.d(r,{decodePngMetadata:()=>k,decodeSvgMetadata:()=>L,encodePngMetadata:()=>E,encodeSvgMetadata:()=>m,getTEXtChunk:()=>A});var t=n(8950),a=n(2983),o=n.n(a),c=n(1194),i=n(3434),u=n.n(i),s=n(2744),l=n(8288),f=function(e,r){var n,t,a,o,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return o={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(o){return function(i){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;c;)try{if(n=1,t&&(a=2&o[0]?t.return:o[0]?t.throw||((a=t.return)&&a.call(t),0):t.next)&&!(a=a.call(t,o[1])).done)return a;switch(t=0,a&&(o=[2&o[0],a.value]),o[0]){case 0:case 1:a=o;break;case 4:return c.label++,{value:o[1],done:!1};case 5:c.label++,t=o[1],o=[0];continue;case 7:o=c.ops.pop(),c.trys.pop();continue;default:if(!(a=c.trys,(a=a.length>0&&a[a.length-1])||6!==o[0]&&2!==o[0])){c=0;continue}if(3===o[0]&&(!a||o[1]>a[0]&&o[1]<a[3])){c.label=o[1];break}if(6===o[0]&&c.label<a[1]){c.label=a[1],a=o;break}if(a&&c.label<a[2]){c.label=a[2],c.ops.push(o);break}a[2]&&c.ops.pop(),c.trys.pop();continue}o=r.call(e,c)}catch(e){o=[6,e],t=0}finally{n=a=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,i])}}},d=function(e){return new Promise((function(r,n){var t="string"==typeof e?new Blob([(new TextEncoder).encode(e)]):new Blob([e instanceof Uint8Array?e:new Uint8Array(e)]),a=new FileReader;a.onload=function(e){if(!e.target||"string"!=typeof e.target.result)return n(new Error("couldn't convert to byte string"));r(e.target.result)},a.readAsBinaryString(t)}))},p=function(e){for(var r=new ArrayBuffer(e.length),n=new Uint8Array(r),t=0,a=e.length;t<a;t++)n[t]=e.charCodeAt(t);return r},y=function(e){return new TextDecoder("utf-8").decode(p(e))},w=function(){var e=(0,t.Z)((function(e){var r,n,t;return f(this,(function(a){switch(a.label){case 0:return arguments.length>1&&void 0!==arguments[1]&&arguments[1]?(r=window.btoa(e),[3,3]):[3,1];case 1:return t=(n=window).btoa,[4,d(e)];case 2:r=t.apply(n,[a.sent()]),a.label=3;case 3:return[2,r]}}))}));return function(r){return e.apply(this,arguments)}}(),h=function(){var e=(0,t.Z)((function(e){return f(this,(function(r){return[2,arguments.length>1&&void 0!==arguments[1]&&arguments[1]?window.atob(e):y(window.atob(e))]}))}));return function(r){return e.apply(this,arguments)}}(),b=function(){var e=(0,t.Z)((function(e){var r,n,t,a,o;return f(this,(function(c){switch(c.label){case 0:if(r=e.text,!1===e.compress)return[3,4];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,d((0,s.deflate)(r))];case 2:return n=c.sent(),[3,4];case 3:return t=c.sent(),console.error("encode: cannot deflate",t),[3,4];case 4:return a={version:"1",encoding:"bstring",compressed:!!n},(o=n)?[3,6]:[4,d(r)];case 5:o=c.sent(),c.label=6;case 6:return[2,(a.encoded=o,a)]}}))}));return function(r){return e.apply(this,arguments)}}(),v=function(){var e=(0,t.Z)((function(e){var r,n;return f(this,(function(t){switch(t.label){case 0:return"bstring"===e.encoding?[3,1]:[3,5];case 1:return e.compressed?(n=e.encoded,[3,4]):[3,2];case 2:return[4,y(e.encoded)];case 3:n=t.sent(),t.label=4;case 4:return r=n,[3,6];case 5:throw new Error('decode: unknown encoding "'.concat(e.encoding,'"'));case 6:return e.compressed?[2,(0,s.inflate)(new Uint8Array(p(r)),{to:"string"})]:[2,r]}}))}));return function(r){return e.apply(this,arguments)}}();var g=function(e,r){var n,t,a,o,c={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return o={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function i(o){return function(i){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;c;)try{if(n=1,t&&(a=2&o[0]?t.return:o[0]?t.throw||((a=t.return)&&a.call(t),0):t.next)&&!(a=a.call(t,o[1])).done)return a;switch(t=0,a&&(o=[2&o[0],a.value]),o[0]){case 0:case 1:a=o;break;case 4:return c.label++,{value:o[1],done:!1};case 5:c.label++,t=o[1],o=[0];continue;case 7:o=c.ops.pop(),c.trys.pop();continue;default:if(!(a=c.trys,(a=a.length>0&&a[a.length-1])||6!==o[0]&&2!==o[0])){c=0;continue}if(3===o[0]&&(!a||o[1]>a[0]&&o[1]<a[3])){c.label=o[1];break}if(6===o[0]&&c.label<a[1]){c.label=a[1],a=o;break}if(a&&c.label<a[2]){c.label=a[2],c.ops.push(o);break}a[2]&&c.ops.pop(),c.trys.pop();continue}o=r.call(e,c)}catch(e){o=[6,e],t=0}finally{n=a=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,i])}}},x=function(e){return"arrayBuffer"in e?e.arrayBuffer():new Promise((function(r,n){var t=new FileReader;t.onload=function(e){var t;if(null===(t=e.target)||void 0===t||!t.result)return n(new Error("couldn't convert blob to ArrayBuffer"));r(e.target.result)},t.readAsArrayBuffer(e)}))},A=function(){var e=(0,t.Z)((function(e){var r,n,t,a;return g(this,(function(i){switch(i.label){case 0:return n=o(),t=Uint8Array.bind,[4,x(e)];case 1:return r=n.apply(void 0,[new(t.apply(Uint8Array,[void 0,i.sent()]))]),(a=r.find((function(e){return"tEXt"===e.name})))?[2,c.decode(a.data)]:[2,null]}}))}));return function(r){return e.apply(this,arguments)}}(),E=function(){var e=(0,t.Z)((function(e){var r,n,t,a,i,s,f,d,p,y,w;return g(this,(function(h){switch(h.label){case 0:return r=e.blob,n=e.metadata,a=o(),i=Uint8Array.bind,[4,x(r)];case 1:return t=a.apply(void 0,[new(i.apply(Uint8Array,[void 0,h.sent()]))]),d=(f=c).encode,p=[l.LO.excalidraw],w=(y=JSON).stringify,[4,b({text:n,compress:!0})];case 2:return s=d.apply(f,p.concat([w.apply(y,[h.sent()])])),t.splice(-1,0,s),[2,new Blob([u()(t)],{type:l.LO.png})]}}))}));return function(r){return e.apply(this,arguments)}}(),k=function(){var e=(0,t.Z)((function(e){var r,n,t;return g(this,(function(a){switch(a.label){case 0:return[4,A(e)];case 1:if((null==(r=a.sent())?void 0:r.keyword)!==l.LO.excalidraw)return[3,5];a.label=2;case 2:if(a.trys.push([2,4,,5]),!("encoded"in(n=JSON.parse(r.text)))){if("type"in n&&n.type===l.r8.excalidraw)return[2,r.text];throw new Error("FAILED")}return[4,v(n)];case 3:return[2,a.sent()];case 4:throw t=a.sent(),console.error(t),new Error("FAILED");case 5:throw new Error("INVALID")}}))}));return function(r){return e.apply(this,arguments)}}(),m=function(){var e=(0,t.Z)((function(e){var r,n,t,a,o,c;return g(this,(function(i){switch(i.label){case 0:return r=e.text,t=w,o=(a=JSON).stringify,[4,b({text:r})];case 1:return[4,t.apply(void 0,[o.apply(a,[i.sent()]),!0])];case 2:return n=i.sent(),c="",c+="\x3c!-- payload-type:".concat(l.LO.excalidraw," --\x3e"),c+="\x3c!-- payload-version:2 --\x3e",c+="\x3c!-- payload-start --\x3e",c+=n,[2,c+="\x3c!-- payload-end --\x3e"]}}))}));return function(r){return e.apply(this,arguments)}}(),L=function(){var e=(0,t.Z)((function(e){var r,n,t,a,o,c,i,u;return g(this,(function(s){switch(s.label){case 0:if(!(r=e.svg).includes("payload-type:".concat(l.LO.excalidraw)))return[3,5];if(!(n=r.match(/<!-- payload-start -->(.+?)<!-- payload-end -->/)))throw new Error("INVALID");t=r.match(/<!-- payload-version:(\d+) -->/),a=(null==t?void 0:t[1])||"1",o="1"!==a,s.label=1;case 1:return s.trys.push([1,4,,5]),[4,h(n[1],o)];case 2:if(c=s.sent(),!("encoded"in(i=JSON.parse(c)))){if("type"in i&&i.type===l.r8.excalidraw)return[2,c];throw new Error("FAILED")}return[4,v(i)];case 3:return[2,s.sent()];case 4:throw u=s.sent(),console.error(u),new Error("FAILED");case 5:throw new Error("INVALID")}}))}));return function(r){return e.apply(this,arguments)}}()}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{673:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "decodePngMetadata": () => (/* binding */ decodePngMetadata),\n "decodeSvgMetadata": () => (/* binding */ decodeSvgMetadata),\n "encodePngMetadata": () => (/* binding */ encodePngMetadata),\n "encodeSvgMetadata": () => (/* binding */ encodeSvgMetadata),\n "getTEXtChunk": () => (/* binding */ getTEXtChunk)\n});\n\n// EXTERNAL MODULE: ../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\nvar asyncToGenerator = __webpack_require__(8950);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-extract/index.js\nvar png_chunks_extract = __webpack_require__(2983);\nvar png_chunks_extract_default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract);\n// EXTERNAL MODULE: ../../../node_modules/png-chunk-text/index.js\nvar png_chunk_text = __webpack_require__(1194);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-encode/index.js\nvar png_chunks_encode = __webpack_require__(3434);\nvar png_chunks_encode_default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode);\n// EXTERNAL MODULE: ../../../node_modules/pako/index.js\nvar pako = __webpack_require__(2744);\n// EXTERNAL MODULE: ../../constants.ts\nvar constants = __webpack_require__(8288);\n;// CONCATENATED MODULE: ../../data/encryption.ts\nvar __generator = (undefined && undefined.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n\r\n\r\nvar IV_LENGTH_BYTES = 12;\r\nvar createIV = function () {\r\n var arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nvar generateEncryptionKey = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref = _asyncToGenerator(function (returnAs) {\r\n var key, _a;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, window.crypto.subtle.generateKey({\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS\r\n }, true, // extractable\r\n ["encrypt", "decrypt"])];\r\n case 1:\r\n key = _b.sent();\r\n if (!(returnAs === "cryptoKey")) return [3 /*break*/, 2];\r\n _a = key;\r\n return [3 /*break*/, 4];\r\n case 2: return [4 /*yield*/, window.crypto.subtle.exportKey("jwk", key)];\r\n case 3:\r\n _a = (_b.sent()).k;\r\n _b.label = 4;\r\n case 4: return [2 /*return*/, _a];\r\n }\r\n });\r\n });\r\n return function generateEncryptionKey(_x) {\r\n return _ref.apply(this, arguments);\r\n };\r\n}()));\r\nvar getCryptoKey = function (key, usage) {\r\n return window.crypto.subtle.importKey("jwk", {\r\n alg: "A128GCM",\r\n ext: true,\r\n k: key,\r\n key_ops: ["encrypt", "decrypt"],\r\n kty: "oct"\r\n }, {\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS\r\n }, false, // extractable\r\n [usage]);\r\n};\r\nvar encryption_encryptData = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref2 = _asyncToGenerator(function (key, data) {\r\n var importedKey, _a, iv, buffer, _b, _c, _d, encryptedBuffer;\r\n return __generator(this, function (_e) {\r\n switch (_e.label) {\r\n case 0:\r\n if (!(typeof key === "string")) return [3 /*break*/, 2];\r\n return [4 /*yield*/, getCryptoKey(key, "encrypt")];\r\n case 1:\r\n _a = _e.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n _a = key;\r\n _e.label = 3;\r\n case 3:\r\n importedKey = _a;\r\n iv = createIV();\r\n if (!(typeof data === "string")) return [3 /*break*/, 4];\r\n _b = new TextEncoder().encode(data);\r\n return [3 /*break*/, 10];\r\n case 4:\r\n if (!(data instanceof Uint8Array)) return [3 /*break*/, 5];\r\n _c = data;\r\n return [3 /*break*/, 9];\r\n case 5:\r\n if (!(data instanceof Blob)) return [3 /*break*/, 7];\r\n return [4 /*yield*/, data.arrayBuffer()];\r\n case 6:\r\n _d = _e.sent();\r\n return [3 /*break*/, 8];\r\n case 7:\r\n _d = data;\r\n _e.label = 8;\r\n case 8:\r\n _c = _d;\r\n _e.label = 9;\r\n case 9:\r\n _b = _c;\r\n _e.label = 10;\r\n case 10:\r\n buffer = _b;\r\n return [4 /*yield*/, window.crypto.subtle.encrypt({\r\n name: "AES-GCM",\r\n iv: iv\r\n }, importedKey, buffer)];\r\n case 11:\r\n encryptedBuffer = _e.sent();\r\n return [2 /*return*/, {\r\n encryptedBuffer: encryptedBuffer,\r\n iv: iv\r\n }];\r\n }\r\n });\r\n });\r\n return function encryptData(_x2, _x3) {\r\n return _ref2.apply(this, arguments);\r\n };\r\n}()));\r\nvar encryption_decryptData = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref3 = _asyncToGenerator(function (iv, encrypted, privateKey) {\r\n var key;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, getCryptoKey(privateKey, "decrypt")];\r\n case 1:\r\n key = _a.sent();\r\n return [2 /*return*/, window.crypto.subtle.decrypt({\r\n name: "AES-GCM",\r\n iv: iv\r\n }, key, encrypted)];\r\n }\r\n });\r\n });\r\n return function decryptData(_x4, _x5, _x6) {\r\n return _ref3.apply(this, arguments);\r\n };\r\n}()));\r\n\n;// CONCATENATED MODULE: ../../data/encode.ts\nvar encode_generator = (undefined && undefined.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n\r\n\r\n // -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nvar toByteString = function (data) {\r\n return new Promise(function (resolve, reject) {\r\n var blob = typeof data === "string" ? new Blob([new TextEncoder().encode(data)]) : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n var reader = new FileReader();\r\n reader.onload = function (event) {\r\n if (!event.target || typeof event.target.result !== "string") {\r\n return reject(new Error("couldn\'t convert to byte string"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nvar byteStringToArrayBuffer = function (byteString) {\r\n var buffer = new ArrayBuffer(byteString.length);\r\n var bufferView = new Uint8Array(buffer);\r\n for (var i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nvar byteStringToString = function (byteString) {\r\n return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));\r\n}; // -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nvar stringToBase64 = /*#__PURE__*/ function () {\r\n var _ref = (0,asyncToGenerator/* default */.Z)(function (str) {\r\n var isByteString, _a, _b, _c;\r\n return encode_generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n isByteString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n if (!isByteString) return [3 /*break*/, 1];\r\n _a = window.btoa(str);\r\n return [3 /*break*/, 3];\r\n case 1:\r\n _c = (_b = window).btoa;\r\n return [4 /*yield*/, toByteString(str)];\r\n case 2:\r\n _a = _c.apply(_b, [_d.sent()]);\r\n _d.label = 3;\r\n case 3: return [2 /*return*/, _a];\r\n }\r\n });\r\n });\r\n return function stringToBase64(_x) {\r\n return _ref.apply(this, arguments);\r\n };\r\n}(); // async to align with stringToBase64\r\nvar base64ToString = /*#__PURE__*/ function () {\r\n var _ref2 = (0,asyncToGenerator/* default */.Z)(function (base64) {\r\n var isByteString;\r\n return encode_generator(this, function (_a) {\r\n isByteString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\r\n return [2 /*return*/, isByteString ? window.atob(base64) : byteStringToString(window.atob(base64))];\r\n });\r\n });\r\n return function base64ToString(_x2) {\r\n return _ref2.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// text encoding\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nvar encode = /*#__PURE__*/ function () {\r\n var _ref3 = (0,asyncToGenerator/* default */.Z)(function (_ref4) {\r\n var text, compress, deflated, error_1, _a, _b;\r\n return encode_generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n text = _ref4.text, compress = _ref4.compress;\r\n if (!(compress !== false)) return [3 /*break*/, 4];\r\n _c.label = 1;\r\n case 1:\r\n _c.trys.push([1, 3, , 4]);\r\n return [4 /*yield*/, toByteString((0,pako.deflate)(text))];\r\n case 2:\r\n deflated = _c.sent();\r\n return [3 /*break*/, 4];\r\n case 3:\r\n error_1 = _c.sent();\r\n console.error("encode: cannot deflate", error_1);\r\n return [3 /*break*/, 4];\r\n case 4:\r\n _a = {\r\n version: "1",\r\n encoding: "bstring",\r\n compressed: !!deflated\r\n };\r\n _b = deflated;\r\n if (_b) return [3 /*break*/, 6];\r\n return [4 /*yield*/, toByteString(text)];\r\n case 5:\r\n _b = (_c.sent());\r\n _c.label = 6;\r\n case 6: return [2 /*return*/, (_a.encoded = _b,\r\n _a)];\r\n }\r\n });\r\n });\r\n return function encode(_x3) {\r\n return _ref3.apply(this, arguments);\r\n };\r\n}();\r\nvar decode = /*#__PURE__*/ function () {\r\n var _ref5 = (0,asyncToGenerator/* default */.Z)(function (data) {\r\n var decoded, _a, _b;\r\n return encode_generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n _a = data.encoding;\r\n switch (_a) {\r\n case "bstring": return [3 /*break*/, 1];\r\n }\r\n return [3 /*break*/, 5];\r\n case 1:\r\n if (!data.compressed) return [3 /*break*/, 2];\r\n _b = data.encoded;\r\n return [3 /*break*/, 4];\r\n case 2: return [4 /*yield*/, byteStringToString(data.encoded)];\r\n case 3:\r\n _b = _c.sent();\r\n _c.label = 4;\r\n case 4:\r\n // if compressed, do not double decode the bstring\r\n decoded = _b;\r\n return [3 /*break*/, 6];\r\n case 5: throw new Error("decode: unknown encoding \\"".concat(data.encoding, "\\""));\r\n case 6:\r\n if (data.compressed) {\r\n return [2 /*return*/, (0,pako.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: "string"\r\n })];\r\n }\r\n return [2 /*return*/, decoded];\r\n }\r\n });\r\n });\r\n return function decode(_x4) {\r\n return _ref5.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// binary encoding\r\n// -----------------------------------------------------------------------------\r\n// -----------------------------------------------------------------------------\r\nvar CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nvar VERSION_DATAVIEW_BYTES = 4;\r\nvar NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4; // -----------------------------------------------------------------------------\r\nvar DATA_VIEW_BITS_MAP = {\r\n 1: 8,\r\n 2: 16,\r\n 4: 32\r\n}; // getter\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you\'re using constants for the byte size and want to ensure there\'s no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error("attempting to set value higher than the allocated bytes (value: ".concat(value, ", bytes: ").concat(bytes, ")"));\r\n }\r\n var method_1 = "setUint".concat(DATA_VIEW_BITS_MAP[bytes]);\r\n new DataView(buffer.buffer)[method_1](offset, value);\r\n return buffer;\r\n }\r\n var method = "getUint".concat(DATA_VIEW_BITS_MAP[bytes]);\r\n return new DataView(buffer.buffer)[method](offset);\r\n} // -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nvar concatBuffers = function () {\r\n for (var _len = arguments.length, buffers = new Array(_len), _key = 0; _key < _len; _key++) {\r\n buffers[_key] = arguments[_key];\r\n }\r\n var bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES + NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length + buffers.reduce(function (acc, buffer) {\r\n return acc + buffer.byteLength;\r\n }, 0));\r\n var cursor = 0; // as the first chunk we\'ll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (var _i = 0, buffers_1 = buffers; _i < buffers_1.length; _i++) {\r\n var buffer = buffers_1[_i];\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nvar splitBuffers = function (concatenatedBuffer) {\r\n var buffers = [];\r\n var cursor = 0; // first chunk is the version\r\n var version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor); // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn\'t encoded using this API, so we\'d only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error("invalid version ".concat(version));\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n var chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n}; // helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nvar _encryptAndCompress = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref6 = _asyncToGenerator(function (data, encryptionKey) {\r\n var _a, encryptedBuffer, iv;\r\n return encode_generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0: return [4 /*yield*/, encryptData(encryptionKey, deflate(data))];\r\n case 1:\r\n _a = _b.sent(), encryptedBuffer = _a.encryptedBuffer, iv = _a.iv;\r\n return [2 /*return*/, {\r\n iv: iv,\r\n buffer: new Uint8Array(encryptedBuffer)\r\n }];\r\n }\r\n });\r\n });\r\n return function _encryptAndCompress(_x5, _x6) {\r\n return _ref6.apply(this, arguments);\r\n };\r\n}()));\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nvar compressData = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref7 = _asyncToGenerator(function (dataBuffer, options) {\r\n var fileInfo, encodingMetadataBuffer, contentsMetadataBuffer, _a, iv, buffer;\r\n return encode_generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n fileInfo = {\r\n version: 2,\r\n compression: "pako@1",\r\n encryption: "AES-GCM"\r\n };\r\n encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n return [4 /*yield*/, _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey)];\r\n case 1:\r\n _a = _b.sent(), iv = _a.iv, buffer = _a.buffer;\r\n return [2 /*return*/, concatBuffers(encodingMetadataBuffer, iv, buffer)];\r\n }\r\n });\r\n });\r\n return function compressData(_x7, _x8) {\r\n return _ref7.apply(this, arguments);\r\n };\r\n}()));\r\n/** @private */\r\nvar _decryptAndDecompress = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref8 = _asyncToGenerator(function (iv, decryptedBuffer, decryptionKey, isCompressed) {\r\n var _a;\r\n return encode_generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _a = Uint8Array.bind;\r\n return [4 /*yield*/, decryptData(iv, decryptedBuffer, decryptionKey)];\r\n case 1:\r\n decryptedBuffer = new (_a.apply(Uint8Array, [void 0, _b.sent()]))();\r\n if (isCompressed) {\r\n return [2 /*return*/, inflate(decryptedBuffer)];\r\n }\r\n return [2 /*return*/, decryptedBuffer];\r\n }\r\n });\r\n });\r\n return function _decryptAndDecompress(_x9, _x10, _x11, _x12) {\r\n return _ref8.apply(this, arguments);\r\n };\r\n}()));\r\nvar decompressData = /*#__PURE__*/ (/* unused pure expression or super */ null && (function () {\r\n var _ref9 = _asyncToGenerator(function (bufferView, options) {\r\n var _a, encodingMetadataBuffer, iv, buffer, encodingMetadata, _b, contentsMetadataBuffer, contentsBuffer, _c, metadata, error_2;\r\n return encode_generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n _a = splitBuffers(bufferView), encodingMetadataBuffer = _a[0], iv = _a[1], buffer = _a[2];\r\n encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n _d.label = 1;\r\n case 1:\r\n _d.trys.push([1, 3, , 4]);\r\n _c = splitBuffers;\r\n return [4 /*yield*/, _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression)];\r\n case 2:\r\n _b = _c.apply(void 0, [_d.sent()]), contentsMetadataBuffer = _b[0], contentsBuffer = _b[1];\r\n metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return [2 /*return*/, {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata: metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer\r\n }];\r\n case 3:\r\n error_2 = _d.sent();\r\n console.error("Error during decompressing and decrypting the file.", encodingMetadata);\r\n throw error_2;\r\n case 4: return [2 /*return*/];\r\n }\r\n });\r\n });\r\n return function decompressData(_x13, _x14) {\r\n return _ref9.apply(this, arguments);\r\n };\r\n}())); // -----------------------------------------------------------------------------\r\n\n;// CONCATENATED MODULE: ../../data/image.ts\nvar image_generator = (undefined && undefined.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n\r\n // -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nvar blobToArrayBuffer = function (blob) {\r\n if ("arrayBuffer" in blob) {\r\n return blob.arrayBuffer();\r\n } // Safari\r\n return new Promise(function (resolve, reject) {\r\n var reader = new FileReader();\r\n reader.onload = function (event) {\r\n var _event$target;\r\n if (!((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.result)) {\r\n return reject(new Error("couldn\'t convert blob to ArrayBuffer"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nvar getTEXtChunk = /*#__PURE__*/ function () {\r\n var _ref = (0,asyncToGenerator/* default */.Z)(function (blob) {\r\n var chunks, _a, _b, metadataChunk;\r\n return image_generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n _a = (png_chunks_extract_default());\r\n _b = Uint8Array.bind;\r\n return [4 /*yield*/, blobToArrayBuffer(blob)];\r\n case 1:\r\n chunks = _a.apply(void 0, [new (_b.apply(Uint8Array, [void 0, _c.sent()]))()]);\r\n metadataChunk = chunks.find(function (chunk) {\r\n return chunk.name === "tEXt";\r\n });\r\n if (metadataChunk) {\r\n return [2 /*return*/, png_chunk_text.decode(metadataChunk.data)];\r\n }\r\n return [2 /*return*/, null];\r\n }\r\n });\r\n });\r\n return function getTEXtChunk(_x) {\r\n return _ref.apply(this, arguments);\r\n };\r\n}();\r\nvar encodePngMetadata = /*#__PURE__*/ function () {\r\n var _ref2 = (0,asyncToGenerator/* default */.Z)(function (_ref3) {\r\n var blob, metadata, chunks, _a, _b, metadataChunk, _c, _d, _e, _f, _g;\r\n return image_generator(this, function (_h) {\r\n switch (_h.label) {\r\n case 0:\r\n blob = _ref3.blob, metadata = _ref3.metadata;\r\n _a = (png_chunks_extract_default());\r\n _b = Uint8Array.bind;\r\n return [4 /*yield*/, blobToArrayBuffer(blob)];\r\n case 1:\r\n chunks = _a.apply(void 0, [new (_b.apply(Uint8Array, [void 0, _h.sent()]))()]);\r\n _d = (_c = png_chunk_text).encode;\r\n _e = [constants/* MIME_TYPES.excalidraw */.LO.excalidraw];\r\n _g = (_f = JSON).stringify;\r\n return [4 /*yield*/, encode({\r\n text: metadata,\r\n compress: true\r\n })];\r\n case 2:\r\n metadataChunk = _d.apply(_c, _e.concat([_g.apply(_f, [_h.sent()])]));\r\n chunks.splice(-1, 0, metadataChunk);\r\n return [2 /*return*/, new Blob([png_chunks_encode_default()(chunks)], {\r\n type: constants/* MIME_TYPES.png */.LO.png\r\n })];\r\n }\r\n });\r\n });\r\n return function encodePngMetadata(_x2) {\r\n return _ref2.apply(this, arguments);\r\n };\r\n}();\r\nvar decodePngMetadata = /*#__PURE__*/ function () {\r\n var _ref4 = (0,asyncToGenerator/* default */.Z)(function (blob) {\r\n var metadata, encodedData, error_1;\r\n return image_generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4 /*yield*/, getTEXtChunk(blob)];\r\n case 1:\r\n metadata = _a.sent();\r\n if (!((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === constants/* MIME_TYPES.excalidraw */.LO.excalidraw)) return [3 /*break*/, 5];\r\n _a.label = 2;\r\n case 2:\r\n _a.trys.push([2, 4, , 5]);\r\n encodedData = JSON.parse(metadata.text);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData && encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return [2 /*return*/, metadata.text];\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return [4 /*yield*/, decode(encodedData)];\r\n case 3: return [2 /*return*/, _a.sent()];\r\n case 4:\r\n error_1 = _a.sent();\r\n console.error(error_1);\r\n throw new Error("FAILED");\r\n case 5: throw new Error("INVALID");\r\n }\r\n });\r\n });\r\n return function decodePngMetadata(_x3) {\r\n return _ref4.apply(this, arguments);\r\n };\r\n}(); // -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nvar encodeSvgMetadata = /*#__PURE__*/ function () {\r\n var _ref5 = (0,asyncToGenerator/* default */.Z)(function (_ref6) {\r\n var text, base64, _a, _b, _c, metadata;\r\n return image_generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n text = _ref6.text;\r\n _a = stringToBase64;\r\n _c = (_b = JSON).stringify;\r\n return [4 /*yield*/, encode({\r\n text: text\r\n })];\r\n case 1: return [4 /*yield*/, _a.apply(void 0, [_c.apply(_b, [_d.sent()]), true\r\n /* is already byte string */\r\n ])];\r\n case 2:\r\n base64 = _d.sent();\r\n metadata = "";\r\n metadata += "\x3c!-- payload-type:".concat(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, " --\x3e");\r\n metadata += "\x3c!-- payload-version:2 --\x3e";\r\n metadata += "\x3c!-- payload-start --\x3e";\r\n metadata += base64;\r\n metadata += "\x3c!-- payload-end --\x3e";\r\n return [2 /*return*/, metadata];\r\n }\r\n });\r\n });\r\n return function encodeSvgMetadata(_x4) {\r\n return _ref5.apply(this, arguments);\r\n };\r\n}();\r\nvar decodeSvgMetadata = /*#__PURE__*/ function () {\r\n var _ref7 = (0,asyncToGenerator/* default */.Z)(function (_ref8) {\r\n var svg, match, versionMatch, version, isByteString, json, encodedData, error_2;\r\n return image_generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n svg = _ref8.svg;\r\n if (!svg.includes("payload-type:".concat(constants/* MIME_TYPES.excalidraw */.LO.excalidraw))) return [3 /*break*/, 5];\r\n match = svg.match(/\x3c!-- payload-start --\x3e(.+?)\x3c!-- payload-end --\x3e/);\r\n if (!match) {\r\n throw new Error("INVALID");\r\n }\r\n versionMatch = svg.match(/\x3c!-- payload-version:(\\d+) --\x3e/);\r\n version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || "1";\r\n isByteString = version !== "1";\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4 /*yield*/, base64ToString(match[1], isByteString)];\r\n case 2:\r\n json = _a.sent();\r\n encodedData = JSON.parse(json);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData && encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return [2 /*return*/, json];\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return [4 /*yield*/, decode(encodedData)];\r\n case 3: return [2 /*return*/, _a.sent()];\r\n case 4:\r\n error_2 = _a.sent();\r\n console.error(error_2);\r\n throw new Error("FAILED");\r\n case 5: throw new Error("INVALID");\r\n }\r\n });\r\n });\r\n return function decodeSvgMetadata(_x5) {\r\n return _ref7.apply(this, arguments);\r\n };\r\n}();\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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ekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGtEQUFxQjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDTTtBQUNQLGdCQUFnQixtQ0FBaUI7QUFDakM7QUFDQSxlQUFlLGVBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGtEQUFxQjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxjQUFjO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUseURBQTRCO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE1BQU07QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNyeXB0aW9uLnRzPzAyNzIiLCJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jb2RlLnRzPzMxZWMiLCJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvaW1hZ2UudHM/OTE2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn07XHJcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XHJcbmltcG9ydCB7IEVOQ1JZUFRJT05fS0VZX0JJVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmV4cG9ydCB2YXIgSVZfTEVOR1RIX0JZVEVTID0gMTI7XHJcbmV4cG9ydCB2YXIgY3JlYXRlSVYgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoSVZfTEVOR1RIX0JZVEVTKTtcclxuICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xyXG59O1xyXG5leHBvcnQgdmFyIGdlbmVyYXRlRW5jcnlwdGlvbktleSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiAocmV0dXJuQXMpIHtcclxuICAgICAgICB2YXIga2V5LCBfYTtcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgdHJ1ZSwgLy8gZXh0cmFjdGFibGVcclxuICAgICAgICAgICAgICAgICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IF9iLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIShyZXR1cm5BcyA9PT0gXCJjcnlwdG9LZXlcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xyXG4gICAgICAgICAgICAgICAgICAgIF9hID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXCJqd2tcIiwga2V5KV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgX2EgPSAoX2Iuc2VudCgpKS5rO1xyXG4gICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNDtcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVFbmNyeXB0aW9uS2V5KF94KSB7XHJcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTtcclxuZXhwb3J0IHZhciBnZXRDcnlwdG9LZXkgPSBmdW5jdGlvbiAoa2V5LCB1c2FnZSkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcImp3a1wiLCB7XHJcbiAgICAgICAgYWxnOiBcIkExMjhHQ01cIixcclxuICAgICAgICBleHQ6IHRydWUsXHJcbiAgICAgICAgazoga2V5LFxyXG4gICAgICAgIGtleV9vcHM6IFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdLFxyXG4gICAgICAgIGt0eTogXCJvY3RcIlxyXG4gICAgfSwge1xyXG4gICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgIGxlbmd0aDogRU5DUllQVElPTl9LRVlfQklUU1xyXG4gICAgfSwgZmFsc2UsIC8vIGV4dHJhY3RhYmxlXHJcbiAgICBbdXNhZ2VdKTtcclxufTtcclxuZXhwb3J0IHZhciBlbmNyeXB0RGF0YSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24gKGtleSwgZGF0YSkge1xyXG4gICAgICAgIHZhciBpbXBvcnRlZEtleSwgX2EsIGl2LCBidWZmZXIsIF9iLCBfYywgX2QsIGVuY3J5cHRlZEJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZ2V0Q3J5cHRvS2V5KGtleSwgXCJlbmNyeXB0XCIpXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICBfYSA9IF9lLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICBfYSA9IGtleTtcclxuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDM7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWRLZXkgPSBfYTtcclxuICAgICAgICAgICAgICAgICAgICBpdiA9IGNyZWF0ZUlWKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcclxuICAgICAgICAgICAgICAgICAgICBfYiA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcclxuICAgICAgICAgICAgICAgICAgICBfYyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEJsb2IpKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBkYXRhLmFycmF5QnVmZmVyKCldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA2OlxyXG4gICAgICAgICAgICAgICAgICAgIF9kID0gX2Uuc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICAgICAgICAgIF9kID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDg7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDg6XHJcbiAgICAgICAgICAgICAgICAgICAgX2MgPSBfZDtcclxuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDk6XHJcbiAgICAgICAgICAgICAgICAgICAgX2IgPSBfYztcclxuICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDEwO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcclxuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBfYjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGltcG9ydGVkS2V5LCBidWZmZXIpXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTE6XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkQnVmZmVyID0gX2Uuc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXI6IGVuY3J5cHRlZEJ1ZmZlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2OiBpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gZW5jcnlwdERhdGEoX3gyLCBfeDMpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTtcclxuZXhwb3J0IHZhciBkZWNyeXB0RGF0YSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWYzID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24gKGl2LCBlbmNyeXB0ZWQsIHByaXZhdGVLZXkpIHtcclxuICAgICAgICB2YXIga2V5O1xyXG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRDcnlwdG9LZXkocHJpdmF0ZUtleSwgXCJkZWNyeXB0XCIpXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPSBfYS5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdjogaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwga2V5LCBlbmNyeXB0ZWQpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVjcnlwdERhdGEoX3g0LCBfeDUsIF94Nikge1xyXG4gICAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufSgpO1xyXG4iLCJ2YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn07XHJcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XHJcbmltcG9ydCB7IGRlZmxhdGUsIGluZmxhdGUgfSBmcm9tIFwicGFrb1wiO1xyXG5pbXBvcnQgeyBlbmNyeXB0RGF0YSwgZGVjcnlwdERhdGEgfSBmcm9tIFwiLi9lbmNyeXB0aW9uXCI7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIGJ5dGUgKGJpbmFyeSkgc3RyaW5nc1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBmYXN0LCBCdWZmZXItY29tcGF0aWJsZSBpbXBsZW1cclxuZXhwb3J0IHZhciB0b0J5dGVTdHJpbmcgPSBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICB2YXIgYmxvYiA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gbmV3IEJsb2IoW25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKV0pIDogbmV3IEJsb2IoW2RhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXSk7XHJcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldCB8fCB0eXBlb2YgZXZlbnQudGFyZ2V0LnJlc3VsdCAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJjb3VsZG4ndCBjb252ZXJ0IHRvIGJ5dGUgc3RyaW5nXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcclxuICAgIH0pO1xyXG59O1xyXG52YXIgYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoYnl0ZVN0cmluZykge1xyXG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICB2YXIgYnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnl0ZVN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGJ1ZmZlclZpZXdbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyO1xyXG59O1xyXG52YXIgYnl0ZVN0cmluZ1RvU3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVTdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKS5kZWNvZGUoYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIoYnl0ZVN0cmluZykpO1xyXG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBiYXNlNjRcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqXHJcbiAqIEBwYXJhbSBpc0J5dGVTdHJpbmcgc2V0IHRvIHRydWUgaWYgYWxyZWFkeSBieXRlIHN0cmluZyB0byBwcmV2ZW50IGJsb2F0XHJcbiAqICBkdWUgdG8gcmVlbmNvZGluZ1xyXG4gKi9cclxuZXhwb3J0IHZhciBzdHJpbmdUb0Jhc2U2NCA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgdmFyIGlzQnl0ZVN0cmluZywgX2EsIF9iLCBfYztcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBpc0J5dGVTdHJpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCeXRlU3RyaW5nKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcclxuICAgICAgICAgICAgICAgICAgICBfYSA9IHdpbmRvdy5idG9hKHN0cik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgX2MgPSAoX2IgPSB3aW5kb3cpLmJ0b2E7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdG9CeXRlU3RyaW5nKHN0cildO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIF9hID0gX2MuYXBwbHkoX2IsIFtfZC5zZW50KCldKTtcclxuICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDM7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCBfYV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN0cmluZ1RvQmFzZTY0KF94KSB7XHJcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTsgLy8gYXN5bmMgdG8gYWxpZ24gd2l0aCBzdHJpbmdUb0Jhc2U2NFxyXG5leHBvcnQgdmFyIGJhc2U2NFRvU3RyaW5nID0gLyojX19QVVJFX18qLyBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiAoYmFzZTY0KSB7XHJcbiAgICAgICAgdmFyIGlzQnl0ZVN0cmluZztcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgIGlzQnl0ZVN0cmluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYXRvYihiYXNlNjQpIDogYnl0ZVN0cmluZ1RvU3RyaW5nKHdpbmRvdy5hdG9iKGJhc2U2NCkpXTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJhc2U2NFRvU3RyaW5nKF94Mikge1xyXG4gICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufSgpOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyB0ZXh0IGVuY29kaW5nXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBFbmNvZGVzIChhbmQgcG90ZW50aWFsbHkgY29tcHJlc3NlcyB2aWEgemxpYikgdGV4dCB0byBieXRlIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IHZhciBlbmNvZGUgPSAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uIChfcmVmNCkge1xyXG4gICAgICAgIHZhciB0ZXh0LCBjb21wcmVzcywgZGVmbGF0ZWQsIGVycm9yXzEsIF9hLCBfYjtcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gX3JlZjQudGV4dCwgY29tcHJlc3MgPSBfcmVmNC5jb21wcmVzcztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIShjb21wcmVzcyAhPT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcclxuICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0b0J5dGVTdHJpbmcoZGVmbGF0ZSh0ZXh0KSldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIGRlZmxhdGVkID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYy5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVuY29kZTogY2Fubm90IGRlZmxhdGVcIiwgZXJyb3JfMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgX2EgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQ6ICEhZGVmbGF0ZWRcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIF9iID0gZGVmbGF0ZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9iKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0b0J5dGVTdHJpbmcodGV4dCldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgIF9iID0gKF9jLnNlbnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA2O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9hLmVuY29kZWQgPSBfYixcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2EpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gZW5jb2RlKF94Mykge1xyXG4gICAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufSgpO1xyXG5leHBvcnQgdmFyIGRlY29kZSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWY1ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICB2YXIgZGVjb2RlZCwgX2EsIF9iO1xyXG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgIF9hID0gZGF0YS5lbmNvZGluZztcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJic3RyaW5nXCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuY29tcHJlc3NlZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XHJcbiAgICAgICAgICAgICAgICAgICAgX2IgPSBkYXRhLmVuY29kZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCAvKnlpZWxkKi8sIGJ5dGVTdHJpbmdUb1N0cmluZyhkYXRhLmVuY29kZWQpXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgICAgICBfYiA9IF9jLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDQ7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgY29tcHJlc3NlZCwgZG8gbm90IGRvdWJsZSBkZWNvZGUgdGhlIGJzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICBkZWNvZGVkID0gX2I7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IHRocm93IG5ldyBFcnJvcihcImRlY29kZTogdW5rbm93biBlbmNvZGluZyBcXFwiXCIuY29uY2F0KGRhdGEuZW5jb2RpbmcsIFwiXFxcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcHJlc3NlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaW5mbGF0ZShuZXcgVWludDhBcnJheShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKSksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bzogXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGVjb2RlZF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRlY29kZShfeDQpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gYmluYXJ5IGVuY29kaW5nXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbnZhciBDT05DQVRfQlVGRkVSU19WRVJTSU9OID0gMTtcclxuLyoqIGhvdyBtYW55IGJ5dGVzIHdlIHVzZSB0byBlbmNvZGUgaG93IG1hbnkgYnl0ZXMgdGhlIG5leHQgY2h1bmsgaGFzLlxyXG4gKiBDb3JyZXNwb25kcyB0byBEYXRhVmlldyBzZXR0ZXIgbWV0aG9kcyAoc2V0VWludDMyLCBzZXRVaW50MTYsIGV0YykuXHJcbiAqXHJcbiAqIE5PVEUgISB2YWx1ZXMgbXVzdCBub3QgYmUgY2hhbmdlZCwgd2hpY2ggd291bGQgYmUgYmFja3dhcmRzIGluY29tcGF0aWJsZSAhXHJcbiAqL1xyXG52YXIgVkVSU0lPTl9EQVRBVklFV19CWVRFUyA9IDQ7XHJcbnZhciBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgPSA0OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG52YXIgREFUQV9WSUVXX0JJVFNfTUFQID0ge1xyXG4gICAgMTogOCxcclxuICAgIDI6IDE2LFxyXG4gICAgNDogMzJcclxufTsgLy8gZ2V0dGVyXHJcbi8qKlxyXG4gKiBhYnN0cmFjdGlvbiBvdmVyIERhdGFWaWV3IHRoYXQgc2VydmVzIGFzIGEgdHlwZWQgZ2V0dGVyL3NldHRlciBpbiBjYXNlXHJcbiAqIHlvdSdyZSB1c2luZyBjb25zdGFudHMgZm9yIHRoZSBieXRlIHNpemUgYW5kIHdhbnQgdG8gZW5zdXJlIHRoZXJlJ3Mgbm9cclxuICogZGlzY3JlcGVuYW5jeSBpbiB0aGUgZW5jb2RpbmcgYWNyb3NzIHJlZmFjdG9ycy5cclxuICpcclxuICogRGF0YVZpZXcgc2VydmVzIGZvciBhbiBlbmRpYW4tYWdub3N0aWMgaGFuZGxpbmcgb2YgbnVtYmVycyBpbiBBcnJheUJ1ZmZlcnMuXHJcbiAqL1xyXG5mdW5jdGlvbiBkYXRhVmlldyhidWZmZXIsIGJ5dGVzLCBvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA+IE1hdGgucG93KDIsIERBVEFfVklFV19CSVRTX01BUFtieXRlc10pIC0gMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdHRlbXB0aW5nIHRvIHNldCB2YWx1ZSBoaWdoZXIgdGhhbiB0aGUgYWxsb2NhdGVkIGJ5dGVzICh2YWx1ZTogXCIuY29uY2F0KHZhbHVlLCBcIiwgYnl0ZXM6IFwiKS5jb25jYXQoYnl0ZXMsIFwiKVwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBtZXRob2RfMSA9IFwic2V0VWludFwiLmNvbmNhdChEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdKTtcclxuICAgICAgICBuZXcgRGF0YVZpZXcoYnVmZmVyLmJ1ZmZlcilbbWV0aG9kXzFdKG9mZnNldCwgdmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICB9XHJcbiAgICB2YXIgbWV0aG9kID0gXCJnZXRVaW50XCIuY29uY2F0KERBVEFfVklFV19CSVRTX01BUFtieXRlc10pO1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCk7XHJcbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqXHJcbiAqIFJlc3VsdGluZyBjb25jYXRlbmF0ZWQgYnVmZmVyIGhhcyB0aGlzIGZvcm1hdDpcclxuICpcclxuICogW1xyXG4gKiAgIFZFUlNJT04gY2h1bmsgKDQgYnl0ZXMpXHJcbiAqICAgTEVOR1RIIGNodW5rIDEgKDQgYnl0ZXMpXHJcbiAqICAgREFUQSBjaHVuayAxICh1cCB0byAyXjMyIGJpdHMpXHJcbiAqICAgTEVOR1RIIGNodW5rIDIgKDQgYnl0ZXMpXHJcbiAqICAgREFUQSBjaHVuayAyICh1cCB0byAyXjMyIGJpdHMpXHJcbiAqICAgLi4uXHJcbiAqIF1cclxuICpcclxuICogQHBhcmFtIGJ1ZmZlcnMgZWFjaCBidWZmZXIgKGNodW5rKSBtdXN0IGJlIGF0IG1vc3QgMl4zMiBiaXRzIGxhcmdlICh+NEdCKVxyXG4gKi9cclxudmFyIGNvbmNhdEJ1ZmZlcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYnVmZmVycyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcclxuICAgICAgICBidWZmZXJzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xyXG4gICAgfVxyXG4gICAgdmFyIGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShWRVJTSU9OX0RBVEFWSUVXX0JZVEVTICsgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTICogYnVmZmVycy5sZW5ndGggKyBidWZmZXJzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBidWZmZXIpIHtcclxuICAgICAgICByZXR1cm4gYWNjICsgYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9LCAwKSk7XHJcbiAgICB2YXIgY3Vyc29yID0gMDsgLy8gYXMgdGhlIGZpcnN0IGNodW5rIHdlJ2xsIGVuY29kZSB0aGUgdmVyc2lvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIFZFUlNJT05fREFUQVZJRVdfQllURVMsIGN1cnNvciwgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTik7XHJcbiAgICBjdXJzb3IgKz0gVkVSU0lPTl9EQVRBVklFV19CWVRFUztcclxuICAgIGZvciAodmFyIF9pID0gMCwgYnVmZmVyc18xID0gYnVmZmVyczsgX2kgPCBidWZmZXJzXzEubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlcnNfMVtfaV07XHJcbiAgICAgICAgZGF0YVZpZXcoYnVmZmVyVmlldywgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcclxuICAgICAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgICAgIGJ1ZmZlclZpZXcuc2V0KGJ1ZmZlciwgY3Vyc29yKTtcclxuICAgICAgICBjdXJzb3IgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVmZmVyVmlldztcclxufTtcclxuLyoqIGNhbiBvbmx5IGJlIHVzZWQgb24gYnVmZmVycyBjcmVhdGVkIHZpYSBgY29uY2F0QnVmZmVycygpYCAqL1xyXG52YXIgc3BsaXRCdWZmZXJzID0gZnVuY3Rpb24gKGNvbmNhdGVuYXRlZEJ1ZmZlcikge1xyXG4gICAgdmFyIGJ1ZmZlcnMgPSBbXTtcclxuICAgIHZhciBjdXJzb3IgPSAwOyAvLyBmaXJzdCBjaHVuayBpcyB0aGUgdmVyc2lvblxyXG4gICAgdmFyIHZlcnNpb24gPSBkYXRhVmlldyhjb25jYXRlbmF0ZWRCdWZmZXIsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yKTsgLy8gSWYgdmVyc2lvbiBpcyBvdXRzaWRlIG9mIHRoZSBzdXBwb3J0ZWQgdmVyc2lvbnMsIHRocm93IGFuIGVycm9yLlxyXG4gICAgLy8gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBidWZmZXIgd2Fzbid0IGVuY29kZWQgdXNpbmcgdGhpcyBBUEksIHNvIHdlJ2Qgb25seVxyXG4gICAgLy8gd2FzdGUgY29tcHV0ZS5cclxuICAgIGlmICh2ZXJzaW9uID4gQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdmVyc2lvbiBcIi5jb25jYXQodmVyc2lvbikpO1xyXG4gICAgfVxyXG4gICAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgIHZhciBjaHVua1NpemUgPSBkYXRhVmlldyhjb25jYXRlbmF0ZWRCdWZmZXIsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yKTtcclxuICAgICAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xyXG4gICAgICAgIGJ1ZmZlcnMucHVzaChjb25jYXRlbmF0ZWRCdWZmZXIuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyBjaHVua1NpemUpKTtcclxuICAgICAgICBjdXJzb3IgKz0gY2h1bmtTaXplO1xyXG4gICAgICAgIGlmIChjdXJzb3IgPj0gY29uY2F0ZW5hdGVkQnVmZmVyLmJ5dGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlcnM7XHJcbn07IC8vIGhlbHBlcnMgZm9yIChkZSljb21wcmVzc2luZyBkYXRhIHdpdGggSlNPTiBtZXRhZGF0YSBpbmNsdWRpbmcgZW5jcnlwdGlvblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKiogQHByaXZhdGUgKi9cclxudmFyIF9lbmNyeXB0QW5kQ29tcHJlc3MgPSAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBfcmVmNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uIChkYXRhLCBlbmNyeXB0aW9uS2V5KSB7XHJcbiAgICAgICAgdmFyIF9hLCBlbmNyeXB0ZWRCdWZmZXIsIGl2O1xyXG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBlbmNyeXB0RGF0YShlbmNyeXB0aW9uS2V5LCBkZWZsYXRlKGRhdGEpKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCksIGVuY3J5cHRlZEJ1ZmZlciA9IF9hLmVuY3J5cHRlZEJ1ZmZlciwgaXYgPSBfYS5pdjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGl2LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiBuZXcgVWludDhBcnJheShlbmNyeXB0ZWRCdWZmZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBfZW5jcnlwdEFuZENvbXByZXNzKF94NSwgX3g2KSB7XHJcbiAgICAgICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59KCk7XHJcbi8qKlxyXG4gKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBmb2xsb3dpbmcgZm9ybWF0OlxyXG4gKiBgW11gIHJlZmVycyB0byBhIGJ1ZmZlcnMgd3JhcHBlciAoc2VlIGBjb25jYXRCdWZmZXJzYClcclxuICpcclxuICogW1xyXG4gKiAgIGVuY29kaW5nTWV0YWRhdGFCdWZmZXIsXHJcbiAqICAgaXYsXHJcbiAqICAgW1xyXG4gKiAgICAgIGNvbnRlbnRzTWV0YWRhdGFCdWZmZXJcclxuICogICAgICBjb250ZW50c0J1ZmZlclxyXG4gKiAgIF1cclxuICogXVxyXG4gKi9cclxuZXhwb3J0IHZhciBjb21wcmVzc0RhdGEgPSAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBfcmVmNyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uIChkYXRhQnVmZmVyLCBvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIGZpbGVJbmZvLCBlbmNvZGluZ01ldGFkYXRhQnVmZmVyLCBjb250ZW50c01ldGFkYXRhQnVmZmVyLCBfYSwgaXYsIGJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mbyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb246IFwicGFrb0AxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb246IFwiQUVTLUdDTVwiXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGZpbGVJbmZvKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHNNZXRhZGF0YUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShvcHRpb25zLm1ldGFkYXRhIHx8IG51bGwpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBfZW5jcnlwdEFuZENvbXByZXNzKGNvbmNhdEJ1ZmZlcnMoY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciksIG9wdGlvbnMuZW5jcnlwdGlvbktleSldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpLCBpdiA9IF9hLml2LCBidWZmZXIgPSBfYS5idWZmZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbmNhdEJ1ZmZlcnMoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcildO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBjb21wcmVzc0RhdGEoX3g3LCBfeDgpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTtcclxuLyoqIEBwcml2YXRlICovXHJcbnZhciBfZGVjcnlwdEFuZERlY29tcHJlc3MgPSAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBfcmVmOCA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uIChpdiwgZGVjcnlwdGVkQnVmZmVyLCBkZWNyeXB0aW9uS2V5LCBpc0NvbXByZXNzZWQpIHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBVaW50OEFycmF5LmJpbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZGVjcnlwdERhdGEoaXYsIGRlY3J5cHRlZEJ1ZmZlciwgZGVjcnlwdGlvbktleSldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZEJ1ZmZlciA9IG5ldyAoX2EuYXBwbHkoVWludDhBcnJheSwgW3ZvaWQgMCwgX2Iuc2VudCgpXSkpKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaW5mbGF0ZShkZWNyeXB0ZWRCdWZmZXIpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRlY3J5cHRlZEJ1ZmZlcl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIF9kZWNyeXB0QW5kRGVjb21wcmVzcyhfeDksIF94MTAsIF94MTEsIF94MTIpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTtcclxuZXhwb3J0IHZhciBkZWNvbXByZXNzRGF0YSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWY5ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24gKGJ1ZmZlclZpZXcsIG9wdGlvbnMpIHtcclxuICAgICAgICB2YXIgX2EsIGVuY29kaW5nTWV0YWRhdGFCdWZmZXIsIGl2LCBidWZmZXIsIGVuY29kaW5nTWV0YWRhdGEsIF9iLCBjb250ZW50c01ldGFkYXRhQnVmZmVyLCBjb250ZW50c0J1ZmZlciwgX2MsIG1ldGFkYXRhLCBlcnJvcl8yO1xyXG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgIF9hID0gc3BsaXRCdWZmZXJzKGJ1ZmZlclZpZXcpLCBlbmNvZGluZ01ldGFkYXRhQnVmZmVyID0gX2FbMF0sIGl2ID0gX2FbMV0sIGJ1ZmZlciA9IF9hWzJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nTWV0YWRhdGEgPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbmNvZGluZ01ldGFkYXRhQnVmZmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgX2MgPSBzcGxpdEJ1ZmZlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgX2RlY3J5cHRBbmREZWNvbXByZXNzKGl2LCBidWZmZXIsIG9wdGlvbnMuZGVjcnlwdGlvbktleSwgISFlbmNvZGluZ01ldGFkYXRhLmNvbXByZXNzaW9uKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgX2IgPSBfYy5hcHBseSh2b2lkIDAsIFtfZC5zZW50KCldKSwgY29udGVudHNNZXRhZGF0YUJ1ZmZlciA9IF9iWzBdLCBjb250ZW50c0J1ZmZlciA9IF9iWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gSlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29udGVudHNNZXRhZGF0YUJ1ZmZlcikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogbWV0YWRhdGEgc291cmNlIGlzIGFsd2F5cyBKU09OIHNvIHdlIGNhbiBkZWNvZGUgaXQgaGVyZSAqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIGRhdGEgY2FuIGJlIGFueXRoaW5nIHNvIHRoZSBjYWxsZXIgbXVzdCBkZWNvZGUgaXQgKi9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGNvbnRlbnRzQnVmZmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfZC5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBkZWNvbXByZXNzaW5nIGFuZCBkZWNyeXB0aW5nIHRoZSBmaWxlLlwiLCBlbmNvZGluZ01ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8yO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRlY29tcHJlc3NEYXRhKF94MTMsIF94MTQpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIiwidmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xyXG5pbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcclxuaW1wb3J0IHRFWHQgZnJvbSBcInBuZy1jaHVuay10ZXh0XCI7XHJcbmltcG9ydCBlbmNvZGVQbmcgZnJvbSBcInBuZy1jaHVua3MtZW5jb2RlXCI7XHJcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcclxuaW1wb3J0IHsgRVhQT1JUX0RBVEFfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFBOR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG52YXIgYmxvYlRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoYmxvYikge1xyXG4gICAgaWYgKFwiYXJyYXlCdWZmZXJcIiBpbiBibG9iKSB7XHJcbiAgICAgICAgcmV0dXJuIGJsb2IuYXJyYXlCdWZmZXIoKTtcclxuICAgIH0gLy8gU2FmYXJpXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdmFyIF9ldmVudCR0YXJnZXQ7XHJcbiAgICAgICAgICAgIGlmICghKChfZXZlbnQkdGFyZ2V0ID0gZXZlbnQudGFyZ2V0KSAhPT0gbnVsbCAmJiBfZXZlbnQkdGFyZ2V0ICE9PSB2b2lkIDAgJiYgX2V2ZW50JHRhcmdldC5yZXN1bHQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcclxuICAgIH0pO1xyXG59O1xyXG5leHBvcnQgdmFyIGdldFRFWHRDaHVuayA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiAoYmxvYikge1xyXG4gICAgICAgIHZhciBjaHVua3MsIF9hLCBfYiwgbWV0YWRhdGFDaHVuaztcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBfYSA9IGRlY29kZVBuZztcclxuICAgICAgICAgICAgICAgICAgICBfYiA9IFVpbnQ4QXJyYXkuYmluZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBibG9iVG9BcnJheUJ1ZmZlcihibG9iKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzID0gX2EuYXBwbHkodm9pZCAwLCBbbmV3IChfYi5hcHBseShVaW50OEFycmF5LCBbdm9pZCAwLCBfYy5zZW50KCldKSkoKV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQ2h1bmsgPSBjaHVua3MuZmluZChmdW5jdGlvbiAoY2h1bmspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rLm5hbWUgPT09IFwidEVYdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YUNodW5rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0RVh0LmRlY29kZShtZXRhZGF0YUNodW5rLmRhdGEpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG51bGxdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBnZXRURVh0Q2h1bmsoX3gpIHtcclxuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgfTtcclxufSgpO1xyXG5leHBvcnQgdmFyIGVuY29kZVBuZ01ldGFkYXRhID0gLyojX19QVVJFX18qLyBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiAoX3JlZjMpIHtcclxuICAgICAgICB2YXIgYmxvYiwgbWV0YWRhdGEsIGNodW5rcywgX2EsIF9iLCBtZXRhZGF0YUNodW5rLCBfYywgX2QsIF9lLCBfZiwgX2c7XHJcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfaCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKF9oLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgYmxvYiA9IF9yZWYzLmJsb2IsIG1ldGFkYXRhID0gX3JlZjMubWV0YWRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBkZWNvZGVQbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgX2IgPSBVaW50OEFycmF5LmJpbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYmxvYlRvQXJyYXlCdWZmZXIoYmxvYildO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IF9hLmFwcGx5KHZvaWQgMCwgW25ldyAoX2IuYXBwbHkoVWludDhBcnJheSwgW3ZvaWQgMCwgX2guc2VudCgpXSkpKCldKTtcclxuICAgICAgICAgICAgICAgICAgICBfZCA9IChfYyA9IHRFWHQpLmVuY29kZTtcclxuICAgICAgICAgICAgICAgICAgICBfZSA9IFtNSU1FX1RZUEVTLmV4Y2FsaWRyYXddO1xyXG4gICAgICAgICAgICAgICAgICAgIF9nID0gKF9mID0gSlNPTikuc3RyaW5naWZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGVuY29kZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXRhZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUNodW5rID0gX2QuYXBwbHkoX2MsIF9lLmNvbmNhdChbX2cuYXBwbHkoX2YsIFtfaC5zZW50KCldKV0pKTtcclxuICAgICAgICAgICAgICAgICAgICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IEJsb2IoW2VuY29kZVBuZyhjaHVua3MpXSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTUlNRV9UWVBFUy5wbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBlbmNvZGVQbmdNZXRhZGF0YShfeDIpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTtcclxuZXhwb3J0IHZhciBkZWNvZGVQbmdNZXRhZGF0YSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWY0ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24gKGJsb2IpIHtcclxuICAgICAgICB2YXIgbWV0YWRhdGEsIGVuY29kZWREYXRhLCBlcnJvcl8xO1xyXG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRURVh0Q2h1bmsoYmxvYildO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKChtZXRhZGF0YSA9PT0gbnVsbCB8fCBtZXRhZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWV0YWRhdGEua2V5d29yZCkgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhdykpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xyXG4gICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcclxuICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsIDQsICwgNV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY29kZWREYXRhID0gSlNPTi5wYXJzZShtZXRhZGF0YS50ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVnYWN5LCB1bi1lbmNvZGVkIHNjZW5lIEpTT05cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwidHlwZVwiIGluIGVuY29kZWREYXRhICYmIGVuY29kZWREYXRhLnR5cGUgPT09IEVYUE9SVF9EQVRBX1RZUEVTLmV4Y2FsaWRyYXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBtZXRhZGF0YS50ZXh0XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGRlY29kZShlbmNvZGVkRGF0YSldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX2Euc2VudCgpXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNDpcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JfMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBkZWNvZGVQbmdNZXRhZGF0YShfeDMpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gU1ZHXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCB2YXIgZW5jb2RlU3ZnTWV0YWRhdGEgPSAvKiNfX1BVUkVfXyovIGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBfcmVmNSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uIChfcmVmNikge1xyXG4gICAgICAgIHZhciB0ZXh0LCBiYXNlNjQsIF9hLCBfYiwgX2MsIG1ldGFkYXRhO1xyXG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBfcmVmNi50ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIF9hID0gc3RyaW5nVG9CYXNlNjQ7XHJcbiAgICAgICAgICAgICAgICAgICAgX2MgPSAoX2IgPSBKU09OKS5zdHJpbmdpZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZW5jb2RlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRleHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCBfYS5hcHBseSh2b2lkIDAsIFtfYy5hcHBseShfYiwgW19kLnNlbnQoKV0pLCB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi9cclxuICAgICAgICAgICAgICAgICAgICBdKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gX2Quc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC10eXBlOlwiLmNvbmNhdChNSU1FX1RZUEVTLmV4Y2FsaWRyYXcsIFwiIC0tPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC12ZXJzaW9uOjIgLS0+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKz0gXCI8IS0tIHBheWxvYWQtc3RhcnQgLS0+XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKz0gYmFzZTY0O1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICs9IFwiPCEtLSBwYXlsb2FkLWVuZCAtLT5cIjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbWV0YWRhdGFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiBlbmNvZGVTdmdNZXRhZGF0YShfeDQpIHtcclxuICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0oKTtcclxuZXhwb3J0IHZhciBkZWNvZGVTdmdNZXRhZGF0YSA9IC8qI19fUFVSRV9fKi8gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9yZWY3ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24gKF9yZWY4KSB7XHJcbiAgICAgICAgdmFyIHN2ZywgbWF0Y2gsIHZlcnNpb25NYXRjaCwgdmVyc2lvbiwgaXNCeXRlU3RyaW5nLCBqc29uLCBlbmNvZGVkRGF0YSwgZXJyb3JfMjtcclxuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgICAgICBzdmcgPSBfcmVmOC5zdmc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdmcuaW5jbHVkZXMoXCJwYXlsb2FkLXR5cGU6XCIuY29uY2F0KE1JTUVfVFlQRVMuZXhjYWxpZHJhdykpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHN2Zy5tYXRjaCgvPCEtLSBwYXlsb2FkLXN0YXJ0IC0tPiguKz8pPCEtLSBwYXlsb2FkLWVuZCAtLT4vKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb25NYXRjaCA9IHN2Zy5tYXRjaCgvPCEtLSBwYXlsb2FkLXZlcnNpb246KFxcZCspIC0tPi8pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAodmVyc2lvbk1hdGNoID09PSBudWxsIHx8IHZlcnNpb25NYXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmVyc2lvbk1hdGNoWzFdKSB8fCBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBpc0J5dGVTdHJpbmcgPSB2ZXJzaW9uICE9PSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCA0LCAsIDVdKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBiYXNlNjRUb1N0cmluZyhtYXRjaFsxXSwgaXNCeXRlU3RyaW5nKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAganNvbiA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YSA9IEpTT04ucGFyc2UoanNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoXCJlbmNvZGVkXCIgaW4gZW5jb2RlZERhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInR5cGVcIiBpbiBlbmNvZGVkRGF0YSAmJiBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywganNvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBkZWNvZGUoZW5jb2RlZERhdGEpXTtcclxuICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9hLnNlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yXzIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZBSUxFRFwiKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVjb2RlU3ZnTWV0YWRhdGEoX3g1KSB7XHJcbiAgICAgICAgcmV0dXJuIF9yZWY3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59KCk7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///673\n')}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkExcalidraw=self.webpackChunkExcalidraw||[]).push([[9],{4706:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "decodePngMetadata": () => (/* binding */ decodePngMetadata),\n "decodeSvgMetadata": () => (/* binding */ decodeSvgMetadata),\n "encodePngMetadata": () => (/* binding */ encodePngMetadata),\n "encodeSvgMetadata": () => (/* binding */ encodeSvgMetadata),\n "getTEXtChunk": () => (/* binding */ getTEXtChunk)\n});\n\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-extract/index.js\nvar png_chunks_extract = __webpack_require__(2983);\nvar png_chunks_extract_default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract);\n// EXTERNAL MODULE: ../../../node_modules/png-chunk-text/index.js\nvar png_chunk_text = __webpack_require__(1194);\n// EXTERNAL MODULE: ../../../node_modules/png-chunks-encode/index.js\nvar png_chunks_encode = __webpack_require__(3434);\nvar png_chunks_encode_default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode);\n// EXTERNAL MODULE: ../../../node_modules/pako/index.js\nvar pako = __webpack_require__(2744);\n// EXTERNAL MODULE: ../../constants.ts\nvar constants = __webpack_require__(4942);\n;// CONCATENATED MODULE: ../../data/encryption.ts\n\r\nconst IV_LENGTH_BYTES = 12;\r\nconst createIV = () => {\r\n const arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nconst generateEncryptionKey = async (returnAs) => {\r\n const key = await window.crypto.subtle.generateKey({\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS,\r\n }, true, // extractable\r\n ["encrypt", "decrypt"]);\r\n return (returnAs === "cryptoKey"\r\n ? key\r\n : (await window.crypto.subtle.exportKey("jwk", key)).k);\r\n};\r\nconst getCryptoKey = (key, usage) => window.crypto.subtle.importKey("jwk", {\r\n alg: "A128GCM",\r\n ext: true,\r\n k: key,\r\n key_ops: ["encrypt", "decrypt"],\r\n kty: "oct",\r\n}, {\r\n name: "AES-GCM",\r\n length: ENCRYPTION_KEY_BITS,\r\n}, false, // extractable\r\n[usage]);\r\nconst encryption_encryptData = async (key, data) => {\r\n const importedKey = typeof key === "string" ? await getCryptoKey(key, "encrypt") : key;\r\n const iv = createIV();\r\n const buffer = typeof data === "string"\r\n ? new TextEncoder().encode(data)\r\n : data instanceof Uint8Array\r\n ? data\r\n : data instanceof Blob\r\n ? await data.arrayBuffer()\r\n : data;\r\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\r\n // includes checks that the ciphertext has not been modified by an attacker.\r\n const encryptedBuffer = await window.crypto.subtle.encrypt({\r\n name: "AES-GCM",\r\n iv,\r\n }, importedKey, buffer);\r\n return { encryptedBuffer, iv };\r\n};\r\nconst encryption_decryptData = async (iv, encrypted, privateKey) => {\r\n const key = await getCryptoKey(privateKey, "decrypt");\r\n return window.crypto.subtle.decrypt({\r\n name: "AES-GCM",\r\n iv,\r\n }, key, encrypted);\r\n};\r\n\n;// CONCATENATED MODULE: ../../data/encode.ts\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = (data) => {\r\n return new Promise((resolve, reject) => {\r\n const blob = typeof data === "string"\r\n ? new Blob([new TextEncoder().encode(data)])\r\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (!event.target || typeof event.target.result !== "string") {\r\n return reject(new Error("couldn\'t convert to byte string"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = (byteString) => {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = (byteString) => {\r\n return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));\r\n};\r\n// -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = async (str, isByteString = false) => {\r\n return isByteString ? window.btoa(str) : window.btoa(await toByteString(str));\r\n};\r\n// async to align with stringToBase64\r\nconst base64ToString = async (base64, isByteString = false) => {\r\n return isByteString\r\n ? window.atob(base64)\r\n : byteStringToString(window.atob(base64));\r\n};\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = async ({ text, compress, }) => {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = await toByteString((0,pako.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error("encode: cannot deflate", error);\r\n }\r\n }\r\n return {\r\n version: "1",\r\n encoding: "bstring",\r\n compressed: !!deflated,\r\n encoded: deflated || (await toByteString(text)),\r\n };\r\n};\r\nconst decode = async (data) => {\r\n let decoded;\r\n switch (data.encoding) {\r\n case "bstring":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed\r\n ? data.encoded\r\n : await byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding "${data.encoding}"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: "string",\r\n });\r\n }\r\n return decoded;\r\n};\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\r\n// -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 };\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you\'re using constants for the byte size and want to ensure there\'s no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n}\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = (...buffers) => {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES +\r\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\r\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0));\r\n let cursor = 0;\r\n // as the first chunk we\'ll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = (concatenatedBuffer) => {\r\n const buffers = [];\r\n let cursor = 0;\r\n // first chunk is the version\r\n const version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn\'t encoded using this API, so we\'d only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error(`invalid version ${version}`);\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n};\r\n// helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = async (data, encryptionKey) => {\r\n const { encryptedBuffer, iv } = await encryptData(encryptionKey, deflate(data));\r\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\r\n};\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = async (dataBuffer, options) => {\r\n const fileInfo = {\r\n version: 2,\r\n compression: "pako@1",\r\n encryption: "AES-GCM",\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = await _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n};\r\n/** @private */\r\nconst _decryptAndDecompress = async (iv, decryptedBuffer, decryptionKey, isCompressed) => {\r\n decryptedBuffer = new Uint8Array(await decryptData(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return inflate(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n};\r\nconst decompressData = async (bufferView, options) => {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(await _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer,\r\n };\r\n }\r\n catch (error) {\r\n console.error(`Error during decompressing and decrypting the file.`, encodingMetadata);\r\n throw error;\r\n }\r\n};\r\n// -----------------------------------------------------------------------------\r\n\n;// CONCATENATED MODULE: ../../data/image.ts\n\r\n\r\n\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nconst blobToArrayBuffer = (blob) => {\r\n if ("arrayBuffer" in blob) {\r\n return blob.arrayBuffer();\r\n }\r\n // Safari\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (!event.target?.result) {\r\n return reject(new Error("couldn\'t convert blob to ArrayBuffer"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nconst getTEXtChunk = async (blob) => {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(await blobToArrayBuffer(blob)));\r\n const metadataChunk = chunks.find((chunk) => chunk.name === "tEXt");\r\n if (metadataChunk) {\r\n return png_chunk_text.decode(metadataChunk.data);\r\n }\r\n return null;\r\n};\r\nconst encodePngMetadata = async ({ blob, metadata, }) => {\r\n const chunks = png_chunks_extract_default()(new Uint8Array(await blobToArrayBuffer(blob)));\r\n const metadataChunk = png_chunk_text.encode(constants/* MIME_TYPES.excalidraw */.LO.excalidraw, JSON.stringify(await encode({\r\n text: metadata,\r\n compress: true,\r\n })));\r\n // insert metadata before last chunk (iEND)\r\n chunks.splice(-1, 0, metadataChunk);\r\n return new Blob([png_chunks_encode_default()(chunks)], { type: constants/* MIME_TYPES.png */.LO.png });\r\n};\r\nconst decodePngMetadata = async (blob) => {\r\n const metadata = await getTEXtChunk(blob);\r\n if (metadata?.keyword === constants/* MIME_TYPES.excalidraw */.LO.excalidraw) {\r\n try {\r\n const encodedData = JSON.parse(metadata.text);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData &&\r\n encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return metadata.text;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return await decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n};\r\n// -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nconst encodeSvgMetadata = async ({ text }) => {\r\n const base64 = await stringToBase64(JSON.stringify(await encode({ text })), true /* is already byte string */);\r\n let metadata = "";\r\n metadata += `\x3c!-- payload-type:${constants/* MIME_TYPES.excalidraw */.LO.excalidraw} --\x3e`;\r\n metadata += `\x3c!-- payload-version:2 --\x3e`;\r\n metadata += "\x3c!-- payload-start --\x3e";\r\n metadata += base64;\r\n metadata += "\x3c!-- payload-end --\x3e";\r\n return metadata;\r\n};\r\nconst decodeSvgMetadata = async ({ svg }) => {\r\n if (svg.includes(`payload-type:${constants/* MIME_TYPES.excalidraw */.LO.excalidraw}`)) {\r\n const match = svg.match(/\x3c!-- payload-start --\x3e(.+?)\x3c!-- payload-end --\x3e/);\r\n if (!match) {\r\n throw new Error("INVALID");\r\n }\r\n const versionMatch = svg.match(/\x3c!-- payload-version:(\\d+) --\x3e/);\r\n const version = versionMatch?.[1] || "1";\r\n const isByteString = version !== "1";\r\n try {\r\n const json = await base64ToString(match[1], isByteString);\r\n const encodedData = JSON.parse(json);\r\n if (!("encoded" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if ("type" in encodedData &&\r\n encodedData.type === constants/* EXPORT_DATA_TYPES.excalidraw */.r8.excalidraw) {\r\n return json;\r\n }\r\n throw new Error("FAILED");\r\n }\r\n return await decode(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error("FAILED");\r\n }\r\n }\r\n throw new Error("INVALID");\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUCxtQkFBbUIsNEJBQVM7QUFDNUI7QUFDQTtBQUNBLGVBQWUscUJBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ08sbUNBQW1DLGlCQUFpQjtBQUMzRCxtQkFBbUIsNEJBQVM7QUFDNUIsMEJBQTBCLHFCQUFXLENBQUMsa0RBQXFCLHVCQUF1QixNQUFNO0FBQ3hGO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQiwyQkFBUyxhQUFhLE1BQU0sb0NBQWMsRUFBRTtBQUNqRTtBQUNPO0FBQ1A7QUFDQSw4QkFBOEIsa0RBQXFCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMseURBQTRCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE1BQU07QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyxNQUFNO0FBQ2hELHlCQUF5QixjQUFjLHNCQUFzQixNQUFNLEdBQUcsTUFBTTtBQUM1RTtBQUNBLHFDQUFxQyxrREFBcUIsRUFBRTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxtQ0FBbUMsS0FBSztBQUMvQyxxQ0FBcUMsa0RBQXFCLENBQUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHlEQUE0QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixNQUFNO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNyeXB0aW9uLnRzPzQ4NzkiLCJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jb2RlLnRzP2M2NmEiLCJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvaW1hZ2UudHM/NTc3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTkNSWVBUSU9OX0tFWV9CSVRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5leHBvcnQgY29uc3QgSVZfTEVOR1RIX0JZVEVTID0gMTI7XHJcbmV4cG9ydCBjb25zdCBjcmVhdGVJViA9ICgpID0+IHtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KElWX0xFTkdUSF9CWVRFUyk7XHJcbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlRW5jcnlwdGlvbktleSA9IGFzeW5jIChyZXR1cm5BcykgPT4ge1xyXG4gICAgY29uc3Qga2V5ID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoe1xyXG4gICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgIGxlbmd0aDogRU5DUllQVElPTl9LRVlfQklUUyxcclxuICAgIH0sIHRydWUsIC8vIGV4dHJhY3RhYmxlXHJcbiAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSk7XHJcbiAgICByZXR1cm4gKHJldHVybkFzID09PSBcImNyeXB0b0tleVwiXHJcbiAgICAgICAgPyBrZXlcclxuICAgICAgICA6IChhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXCJqd2tcIiwga2V5KSkuayk7XHJcbn07XHJcbmV4cG9ydCBjb25zdCBnZXRDcnlwdG9LZXkgPSAoa2V5LCB1c2FnZSkgPT4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFwiandrXCIsIHtcclxuICAgIGFsZzogXCJBMTI4R0NNXCIsXHJcbiAgICBleHQ6IHRydWUsXHJcbiAgICBrOiBrZXksXHJcbiAgICBrZXlfb3BzOiBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSxcclxuICAgIGt0eTogXCJvY3RcIixcclxufSwge1xyXG4gICAgbmFtZTogXCJBRVMtR0NNXCIsXHJcbiAgICBsZW5ndGg6IEVOQ1JZUFRJT05fS0VZX0JJVFMsXHJcbn0sIGZhbHNlLCAvLyBleHRyYWN0YWJsZVxyXG5bdXNhZ2VdKTtcclxuZXhwb3J0IGNvbnN0IGVuY3J5cHREYXRhID0gYXN5bmMgKGtleSwgZGF0YSkgPT4ge1xyXG4gICAgY29uc3QgaW1wb3J0ZWRLZXkgPSB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiID8gYXdhaXQgZ2V0Q3J5cHRvS2V5KGtleSwgXCJlbmNyeXB0XCIpIDoga2V5O1xyXG4gICAgY29uc3QgaXYgPSBjcmVhdGVJVigpO1xyXG4gICAgY29uc3QgYnVmZmVyID0gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcclxuICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKVxyXG4gICAgICAgIDogZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcclxuICAgICAgICAgICAgPyBkYXRhXHJcbiAgICAgICAgICAgIDogZGF0YSBpbnN0YW5jZW9mIEJsb2JcclxuICAgICAgICAgICAgICAgID8gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpXHJcbiAgICAgICAgICAgICAgICA6IGRhdGE7XHJcbiAgICAvLyBXZSB1c2Ugc3ltbWV0cmljIGVuY3J5cHRpb24uIEFFUy1HQ00gaXMgdGhlIHJlY29tbWVuZGVkIGFsZ29yaXRobSBhbmRcclxuICAgIC8vIGluY2x1ZGVzIGNoZWNrcyB0aGF0IHRoZSBjaXBoZXJ0ZXh0IGhhcyBub3QgYmVlbiBtb2RpZmllZCBieSBhbiBhdHRhY2tlci5cclxuICAgIGNvbnN0IGVuY3J5cHRlZEJ1ZmZlciA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoe1xyXG4gICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgIGl2LFxyXG4gICAgfSwgaW1wb3J0ZWRLZXksIGJ1ZmZlcik7XHJcbiAgICByZXR1cm4geyBlbmNyeXB0ZWRCdWZmZXIsIGl2IH07XHJcbn07XHJcbmV4cG9ydCBjb25zdCBkZWNyeXB0RGF0YSA9IGFzeW5jIChpdiwgZW5jcnlwdGVkLCBwcml2YXRlS2V5KSA9PiB7XHJcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBnZXRDcnlwdG9LZXkocHJpdmF0ZUtleSwgXCJkZWNyeXB0XCIpO1xyXG4gICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoe1xyXG4gICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxyXG4gICAgICAgIGl2LFxyXG4gICAgfSwga2V5LCBlbmNyeXB0ZWQpO1xyXG59O1xyXG4iLCJpbXBvcnQgeyBkZWZsYXRlLCBpbmZsYXRlIH0gZnJvbSBcInBha29cIjtcclxuaW1wb3J0IHsgZW5jcnlwdERhdGEsIGRlY3J5cHREYXRhIH0gZnJvbSBcIi4vZW5jcnlwdGlvblwiO1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBieXRlIChiaW5hcnkpIHN0cmluZ3NcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gZmFzdCwgQnVmZmVyLWNvbXBhdGlibGUgaW1wbGVtXHJcbmV4cG9ydCBjb25zdCB0b0J5dGVTdHJpbmcgPSAoZGF0YSkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCBibG9iID0gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgPyBuZXcgQmxvYihbbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXSlcclxuICAgICAgICAgICAgOiBuZXcgQmxvYihbZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBkYXRhIDogbmV3IFVpbnQ4QXJyYXkoZGF0YSldKTtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQgfHwgdHlwZW9mIGV2ZW50LnRhcmdldC5yZXN1bHQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiY291bGRuJ3QgY29udmVydCB0byBieXRlIHN0cmluZ1wiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XHJcbiAgICB9KTtcclxufTtcclxuY29uc3QgYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIgPSAoYnl0ZVN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcclxuICAgIGNvbnN0IGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGJ5dGVTdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBidWZmZXJWaWV3W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1ZmZlcjtcclxufTtcclxuY29uc3QgYnl0ZVN0cmluZ1RvU3RyaW5nID0gKGJ5dGVTdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKS5kZWNvZGUoYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIoYnl0ZVN0cmluZykpO1xyXG59O1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBiYXNlNjRcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqXHJcbiAqIEBwYXJhbSBpc0J5dGVTdHJpbmcgc2V0IHRvIHRydWUgaWYgYWxyZWFkeSBieXRlIHN0cmluZyB0byBwcmV2ZW50IGJsb2F0XHJcbiAqICBkdWUgdG8gcmVlbmNvZGluZ1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvQmFzZTY0ID0gYXN5bmMgKHN0ciwgaXNCeXRlU3RyaW5nID0gZmFsc2UpID0+IHtcclxuICAgIHJldHVybiBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYnRvYShzdHIpIDogd2luZG93LmJ0b2EoYXdhaXQgdG9CeXRlU3RyaW5nKHN0cikpO1xyXG59O1xyXG4vLyBhc3luYyB0byBhbGlnbiB3aXRoIHN0cmluZ1RvQmFzZTY0XHJcbmV4cG9ydCBjb25zdCBiYXNlNjRUb1N0cmluZyA9IGFzeW5jIChiYXNlNjQsIGlzQnl0ZVN0cmluZyA9IGZhbHNlKSA9PiB7XHJcbiAgICByZXR1cm4gaXNCeXRlU3RyaW5nXHJcbiAgICAgICAgPyB3aW5kb3cuYXRvYihiYXNlNjQpXHJcbiAgICAgICAgOiBieXRlU3RyaW5nVG9TdHJpbmcod2luZG93LmF0b2IoYmFzZTY0KSk7XHJcbn07XHJcbi8qKlxyXG4gKiBFbmNvZGVzIChhbmQgcG90ZW50aWFsbHkgY29tcHJlc3NlcyB2aWEgemxpYikgdGV4dCB0byBieXRlIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVuY29kZSA9IGFzeW5jICh7IHRleHQsIGNvbXByZXNzLCB9KSA9PiB7XHJcbiAgICBsZXQgZGVmbGF0ZWQ7XHJcbiAgICBpZiAoY29tcHJlc3MgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVmbGF0ZWQgPSBhd2FpdCB0b0J5dGVTdHJpbmcoZGVmbGF0ZSh0ZXh0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZW5jb2RlOiBjYW5ub3QgZGVmbGF0ZVwiLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB2ZXJzaW9uOiBcIjFcIixcclxuICAgICAgICBlbmNvZGluZzogXCJic3RyaW5nXCIsXHJcbiAgICAgICAgY29tcHJlc3NlZDogISFkZWZsYXRlZCxcclxuICAgICAgICBlbmNvZGVkOiBkZWZsYXRlZCB8fCAoYXdhaXQgdG9CeXRlU3RyaW5nKHRleHQpKSxcclxuICAgIH07XHJcbn07XHJcbmV4cG9ydCBjb25zdCBkZWNvZGUgPSBhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgbGV0IGRlY29kZWQ7XHJcbiAgICBzd2l0Y2ggKGRhdGEuZW5jb2RpbmcpIHtcclxuICAgICAgICBjYXNlIFwiYnN0cmluZ1wiOlxyXG4gICAgICAgICAgICAvLyBpZiBjb21wcmVzc2VkLCBkbyBub3QgZG91YmxlIGRlY29kZSB0aGUgYnN0cmluZ1xyXG4gICAgICAgICAgICBkZWNvZGVkID0gZGF0YS5jb21wcmVzc2VkXHJcbiAgICAgICAgICAgICAgICA/IGRhdGEuZW5jb2RlZFxyXG4gICAgICAgICAgICAgICAgOiBhd2FpdCBieXRlU3RyaW5nVG9TdHJpbmcoZGF0YS5lbmNvZGVkKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBkZWNvZGU6IHVua25vd24gZW5jb2RpbmcgXCIke2RhdGEuZW5jb2Rpbmd9XCJgKTtcclxuICAgIH1cclxuICAgIGlmIChkYXRhLmNvbXByZXNzZWQpIHtcclxuICAgICAgICByZXR1cm4gaW5mbGF0ZShuZXcgVWludDhBcnJheShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKSksIHtcclxuICAgICAgICAgICAgdG86IFwic3RyaW5nXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGVjb2RlZDtcclxufTtcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuY29uc3QgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTiA9IDE7XHJcbi8qKiBob3cgbWFueSBieXRlcyB3ZSB1c2UgdG8gZW5jb2RlIGhvdyBtYW55IGJ5dGVzIHRoZSBuZXh0IGNodW5rIGhhcy5cclxuICogQ29ycmVzcG9uZHMgdG8gRGF0YVZpZXcgc2V0dGVyIG1ldGhvZHMgKHNldFVpbnQzMiwgc2V0VWludDE2LCBldGMpLlxyXG4gKlxyXG4gKiBOT1RFICEgdmFsdWVzIG11c3Qgbm90IGJlIGNoYW5nZWQsIHdoaWNoIHdvdWxkIGJlIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUgIVxyXG4gKi9cclxuY29uc3QgVkVSU0lPTl9EQVRBVklFV19CWVRFUyA9IDQ7XHJcbmNvbnN0IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUyA9IDQ7XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmNvbnN0IERBVEFfVklFV19CSVRTX01BUCA9IHsgMTogOCwgMjogMTYsIDQ6IDMyIH07XHJcbi8qKlxyXG4gKiBhYnN0cmFjdGlvbiBvdmVyIERhdGFWaWV3IHRoYXQgc2VydmVzIGFzIGEgdHlwZWQgZ2V0dGVyL3NldHRlciBpbiBjYXNlXHJcbiAqIHlvdSdyZSB1c2luZyBjb25zdGFudHMgZm9yIHRoZSBieXRlIHNpemUgYW5kIHdhbnQgdG8gZW5zdXJlIHRoZXJlJ3Mgbm9cclxuICogZGlzY3JlcGVuYW5jeSBpbiB0aGUgZW5jb2RpbmcgYWNyb3NzIHJlZmFjdG9ycy5cclxuICpcclxuICogRGF0YVZpZXcgc2VydmVzIGZvciBhbiBlbmRpYW4tYWdub3N0aWMgaGFuZGxpbmcgb2YgbnVtYmVycyBpbiBBcnJheUJ1ZmZlcnMuXHJcbiAqL1xyXG5mdW5jdGlvbiBkYXRhVmlldyhidWZmZXIsIGJ5dGVzLCBvZmZzZXQsIHZhbHVlKSB7XHJcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA+IE1hdGgucG93KDIsIERBVEFfVklFV19CSVRTX01BUFtieXRlc10pIC0gMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGF0dGVtcHRpbmcgdG8gc2V0IHZhbHVlIGhpZ2hlciB0aGFuIHRoZSBhbGxvY2F0ZWQgYnl0ZXMgKHZhbHVlOiAke3ZhbHVlfSwgYnl0ZXM6ICR7Ynl0ZXN9KWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtZXRob2QgPSBgc2V0VWludCR7REFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXX1gO1xyXG4gICAgICAgIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCwgdmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBidWZmZXI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtZXRob2QgPSBgZ2V0VWludCR7REFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXX1gO1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCk7XHJcbn1cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqXHJcbiAqIFJlc3VsdGluZyBjb25jYXRlbmF0ZWQgYnVmZmVyIGhhcyB0aGlzIGZvcm1hdDpcclxuICpcclxuICogW1xyXG4gKiAgIFZFUlNJT04gY2h1bmsgKDQgYnl0ZXMpXHJcbiAqICAgTEVOR1RIIGNodW5rIDEgKDQgYnl0ZXMpXHJcbiAqICAgREFUQSBjaHVuayAxICh1cCB0byAyXjMyIGJpdHMpXHJcbiAqICAgTEVOR1RIIGNodW5rIDIgKDQgYnl0ZXMpXHJcbiAqICAgREFUQSBjaHVuayAyICh1cCB0byAyXjMyIGJpdHMpXHJcbiAqICAgLi4uXHJcbiAqIF1cclxuICpcclxuICogQHBhcmFtIGJ1ZmZlcnMgZWFjaCBidWZmZXIgKGNodW5rKSBtdXN0IGJlIGF0IG1vc3QgMl4zMiBiaXRzIGxhcmdlICh+NEdCKVxyXG4gKi9cclxuY29uc3QgY29uY2F0QnVmZmVycyA9ICguLi5idWZmZXJzKSA9PiB7XHJcbiAgICBjb25zdCBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoVkVSU0lPTl9EQVRBVklFV19CWVRFUyArXHJcbiAgICAgICAgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTICogYnVmZmVycy5sZW5ndGggK1xyXG4gICAgICAgIGJ1ZmZlcnMucmVkdWNlKChhY2MsIGJ1ZmZlcikgPT4gYWNjICsgYnVmZmVyLmJ5dGVMZW5ndGgsIDApKTtcclxuICAgIGxldCBjdXJzb3IgPSAwO1xyXG4gICAgLy8gYXMgdGhlIGZpcnN0IGNodW5rIHdlJ2xsIGVuY29kZSB0aGUgdmVyc2lvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIGRhdGFWaWV3KGJ1ZmZlclZpZXcsIFZFUlNJT05fREFUQVZJRVdfQllURVMsIGN1cnNvciwgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTik7XHJcbiAgICBjdXJzb3IgKz0gVkVSU0lPTl9EQVRBVklFV19CWVRFUztcclxuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcclxuICAgICAgICBkYXRhVmlldyhidWZmZXJWaWV3LCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvciwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XHJcbiAgICAgICAgYnVmZmVyVmlldy5zZXQoYnVmZmVyLCBjdXJzb3IpO1xyXG4gICAgICAgIGN1cnNvciArPSBidWZmZXIuYnl0ZUxlbmd0aDtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXJWaWV3O1xyXG59O1xyXG4vKiogY2FuIG9ubHkgYmUgdXNlZCBvbiBidWZmZXJzIGNyZWF0ZWQgdmlhIGBjb25jYXRCdWZmZXJzKClgICovXHJcbmNvbnN0IHNwbGl0QnVmZmVycyA9IChjb25jYXRlbmF0ZWRCdWZmZXIpID0+IHtcclxuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcclxuICAgIGxldCBjdXJzb3IgPSAwO1xyXG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgdGhlIHZlcnNpb25cclxuICAgIGNvbnN0IHZlcnNpb24gPSBkYXRhVmlldyhjb25jYXRlbmF0ZWRCdWZmZXIsIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUywgY3Vyc29yKTtcclxuICAgIC8vIElmIHZlcnNpb24gaXMgb3V0c2lkZSBvZiB0aGUgc3VwcG9ydGVkIHZlcnNpb25zLCB0aHJvdyBhbiBlcnJvci5cclxuICAgIC8vIFRoaXMgdXN1YWxseSBtZWFucyB0aGUgYnVmZmVyIHdhc24ndCBlbmNvZGVkIHVzaW5nIHRoaXMgQVBJLCBzbyB3ZSdkIG9ubHlcclxuICAgIC8vIHdhc3RlIGNvbXB1dGUuXHJcbiAgICBpZiAodmVyc2lvbiA+IENPTkNBVF9CVUZGRVJTX1ZFUlNJT04pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdmVyc2lvbiAke3ZlcnNpb259YCk7XHJcbiAgICB9XHJcbiAgICBjdXJzb3IgKz0gVkVSU0lPTl9EQVRBVklFV19CWVRFUztcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gZGF0YVZpZXcoY29uY2F0ZW5hdGVkQnVmZmVyLCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsIGN1cnNvcik7XHJcbiAgICAgICAgY3Vyc29yICs9IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUztcclxuICAgICAgICBidWZmZXJzLnB1c2goY29uY2F0ZW5hdGVkQnVmZmVyLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgY2h1bmtTaXplKSk7XHJcbiAgICAgICAgY3Vyc29yICs9IGNodW5rU2l6ZTtcclxuICAgICAgICBpZiAoY3Vyc29yID49IGNvbmNhdGVuYXRlZEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXJzO1xyXG59O1xyXG4vLyBoZWxwZXJzIGZvciAoZGUpY29tcHJlc3NpbmcgZGF0YSB3aXRoIEpTT04gbWV0YWRhdGEgaW5jbHVkaW5nIGVuY3J5cHRpb25cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLyoqIEBwcml2YXRlICovXHJcbmNvbnN0IF9lbmNyeXB0QW5kQ29tcHJlc3MgPSBhc3luYyAoZGF0YSwgZW5jcnlwdGlvbktleSkgPT4ge1xyXG4gICAgY29uc3QgeyBlbmNyeXB0ZWRCdWZmZXIsIGl2IH0gPSBhd2FpdCBlbmNyeXB0RGF0YShlbmNyeXB0aW9uS2V5LCBkZWZsYXRlKGRhdGEpKTtcclxuICAgIHJldHVybiB7IGl2LCBidWZmZXI6IG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEJ1ZmZlcikgfTtcclxufTtcclxuLyoqXHJcbiAqIFRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQ6XHJcbiAqIGBbXWAgcmVmZXJzIHRvIGEgYnVmZmVycyB3cmFwcGVyIChzZWUgYGNvbmNhdEJ1ZmZlcnNgKVxyXG4gKlxyXG4gKiBbXHJcbiAqICAgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlcixcclxuICogICBpdixcclxuICogICBbXHJcbiAqICAgICAgY29udGVudHNNZXRhZGF0YUJ1ZmZlclxyXG4gKiAgICAgIGNvbnRlbnRzQnVmZmVyXHJcbiAqICAgXVxyXG4gKiBdXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29tcHJlc3NEYXRhID0gYXN5bmMgKGRhdGFCdWZmZXIsIG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGZpbGVJbmZvID0ge1xyXG4gICAgICAgIHZlcnNpb246IDIsXHJcbiAgICAgICAgY29tcHJlc3Npb246IFwicGFrb0AxXCIsXHJcbiAgICAgICAgZW5jcnlwdGlvbjogXCJBRVMtR0NNXCIsXHJcbiAgICB9O1xyXG4gICAgY29uc3QgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShmaWxlSW5mbykpO1xyXG4gICAgY29uc3QgY29udGVudHNNZXRhZGF0YUJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShvcHRpb25zLm1ldGFkYXRhIHx8IG51bGwpKTtcclxuICAgIGNvbnN0IHsgaXYsIGJ1ZmZlciB9ID0gYXdhaXQgX2VuY3J5cHRBbmRDb21wcmVzcyhjb25jYXRCdWZmZXJzKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIGRhdGFCdWZmZXIpLCBvcHRpb25zLmVuY3J5cHRpb25LZXkpO1xyXG4gICAgcmV0dXJuIGNvbmNhdEJ1ZmZlcnMoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcik7XHJcbn07XHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5jb25zdCBfZGVjcnlwdEFuZERlY29tcHJlc3MgPSBhc3luYyAoaXYsIGRlY3J5cHRlZEJ1ZmZlciwgZGVjcnlwdGlvbktleSwgaXNDb21wcmVzc2VkKSA9PiB7XHJcbiAgICBkZWNyeXB0ZWRCdWZmZXIgPSBuZXcgVWludDhBcnJheShhd2FpdCBkZWNyeXB0RGF0YShpdiwgZGVjcnlwdGVkQnVmZmVyLCBkZWNyeXB0aW9uS2V5KSk7XHJcbiAgICBpZiAoaXNDb21wcmVzc2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGluZmxhdGUoZGVjcnlwdGVkQnVmZmVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZWNyeXB0ZWRCdWZmZXI7XHJcbn07XHJcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzRGF0YSA9IGFzeW5jIChidWZmZXJWaWV3LCBvcHRpb25zKSA9PiB7XHJcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBlbmNvZGluZyBtZXRhZGF0YSAoaWdub3JlZCBmb3Igbm93KVxyXG4gICAgY29uc3QgW2VuY29kaW5nTWV0YWRhdGFCdWZmZXIsIGl2LCBidWZmZXJdID0gc3BsaXRCdWZmZXJzKGJ1ZmZlclZpZXcpO1xyXG4gICAgY29uc3QgZW5jb2RpbmdNZXRhZGF0YSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVuY29kaW5nTWV0YWRhdGFCdWZmZXIpKTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgW2NvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIGNvbnRlbnRzQnVmZmVyXSA9IHNwbGl0QnVmZmVycyhhd2FpdCBfZGVjcnlwdEFuZERlY29tcHJlc3MoaXYsIGJ1ZmZlciwgb3B0aW9ucy5kZWNyeXB0aW9uS2V5LCAhIWVuY29kaW5nTWV0YWRhdGEuY29tcHJlc3Npb24pKTtcclxuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIpKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAvKiogbWV0YWRhdGEgc291cmNlIGlzIGFsd2F5cyBKU09OIHNvIHdlIGNhbiBkZWNvZGUgaXQgaGVyZSAqL1xyXG4gICAgICAgICAgICBtZXRhZGF0YSxcclxuICAgICAgICAgICAgLyoqIGRhdGEgY2FuIGJlIGFueXRoaW5nIHNvIHRoZSBjYWxsZXIgbXVzdCBkZWNvZGUgaXQgKi9cclxuICAgICAgICAgICAgZGF0YTogY29udGVudHNCdWZmZXIsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGR1cmluZyBkZWNvbXByZXNzaW5nIGFuZCBkZWNyeXB0aW5nIHRoZSBmaWxlLmAsIGVuY29kaW5nTWV0YWRhdGEpO1xyXG4gICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG59O1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4iLCJpbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcclxuaW1wb3J0IHRFWHQgZnJvbSBcInBuZy1jaHVuay10ZXh0XCI7XHJcbmltcG9ydCBlbmNvZGVQbmcgZnJvbSBcInBuZy1jaHVua3MtZW5jb2RlXCI7XHJcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcclxuaW1wb3J0IHsgRVhQT1JUX0RBVEFfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFBOR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5jb25zdCBibG9iVG9BcnJheUJ1ZmZlciA9IChibG9iKSA9PiB7XHJcbiAgICBpZiAoXCJhcnJheUJ1ZmZlclwiIGluIGJsb2IpIHtcclxuICAgICAgICByZXR1cm4gYmxvYi5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG4gICAgLy8gU2FmYXJpXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldD8ucmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcclxuICAgIH0pO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2V0VEVYdENodW5rID0gYXN5bmMgKGJsb2IpID0+IHtcclxuICAgIGNvbnN0IGNodW5rcyA9IGRlY29kZVBuZyhuZXcgVWludDhBcnJheShhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihibG9iKSkpO1xyXG4gICAgY29uc3QgbWV0YWRhdGFDaHVuayA9IGNodW5rcy5maW5kKChjaHVuaykgPT4gY2h1bmsubmFtZSA9PT0gXCJ0RVh0XCIpO1xyXG4gICAgaWYgKG1ldGFkYXRhQ2h1bmspIHtcclxuICAgICAgICByZXR1cm4gdEVYdC5kZWNvZGUobWV0YWRhdGFDaHVuay5kYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZW5jb2RlUG5nTWV0YWRhdGEgPSBhc3luYyAoeyBibG9iLCBtZXRhZGF0YSwgfSkgPT4ge1xyXG4gICAgY29uc3QgY2h1bmtzID0gZGVjb2RlUG5nKG5ldyBVaW50OEFycmF5KGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGJsb2IpKSk7XHJcbiAgICBjb25zdCBtZXRhZGF0YUNodW5rID0gdEVYdC5lbmNvZGUoTUlNRV9UWVBFUy5leGNhbGlkcmF3LCBKU09OLnN0cmluZ2lmeShhd2FpdCBlbmNvZGUoe1xyXG4gICAgICAgIHRleHQ6IG1ldGFkYXRhLFxyXG4gICAgICAgIGNvbXByZXNzOiB0cnVlLFxyXG4gICAgfSkpKTtcclxuICAgIC8vIGluc2VydCBtZXRhZGF0YSBiZWZvcmUgbGFzdCBjaHVuayAoaUVORClcclxuICAgIGNodW5rcy5zcGxpY2UoLTEsIDAsIG1ldGFkYXRhQ2h1bmspO1xyXG4gICAgcmV0dXJuIG5ldyBCbG9iKFtlbmNvZGVQbmcoY2h1bmtzKV0sIHsgdHlwZTogTUlNRV9UWVBFUy5wbmcgfSk7XHJcbn07XHJcbmV4cG9ydCBjb25zdCBkZWNvZGVQbmdNZXRhZGF0YSA9IGFzeW5jIChibG9iKSA9PiB7XHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGdldFRFWHRDaHVuayhibG9iKTtcclxuICAgIGlmIChtZXRhZGF0YT8ua2V5d29yZCA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKG1ldGFkYXRhLnRleHQpO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn07XHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIFNWR1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgY29uc3QgZW5jb2RlU3ZnTWV0YWRhdGEgPSBhc3luYyAoeyB0ZXh0IH0pID0+IHtcclxuICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHN0cmluZ1RvQmFzZTY0KEpTT04uc3RyaW5naWZ5KGF3YWl0IGVuY29kZSh7IHRleHQgfSkpLCB0cnVlIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi8pO1xyXG4gICAgbGV0IG1ldGFkYXRhID0gXCJcIjtcclxuICAgIG1ldGFkYXRhICs9IGA8IS0tIHBheWxvYWQtdHlwZToke01JTUVfVFlQRVMuZXhjYWxpZHJhd30gLS0+YDtcclxuICAgIG1ldGFkYXRhICs9IGA8IS0tIHBheWxvYWQtdmVyc2lvbjoyIC0tPmA7XHJcbiAgICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1zdGFydCAtLT5cIjtcclxuICAgIG1ldGFkYXRhICs9IGJhc2U2NDtcclxuICAgIG1ldGFkYXRhICs9IFwiPCEtLSBwYXlsb2FkLWVuZCAtLT5cIjtcclxuICAgIHJldHVybiBtZXRhZGF0YTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGRlY29kZVN2Z01ldGFkYXRhID0gYXN5bmMgKHsgc3ZnIH0pID0+IHtcclxuICAgIGlmIChzdmcuaW5jbHVkZXMoYHBheWxvYWQtdHlwZToke01JTUVfVFlQRVMuZXhjYWxpZHJhd31gKSkge1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtc3RhcnQgLS0+KC4rPyk8IS0tIHBheWxvYWQtZW5kIC0tPi8pO1xyXG4gICAgICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtdmVyc2lvbjooXFxkKykgLS0+Lyk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHZlcnNpb25NYXRjaD8uWzFdIHx8IFwiMVwiO1xyXG4gICAgICAgIGNvbnN0IGlzQnl0ZVN0cmluZyA9IHZlcnNpb24gIT09IFwiMVwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCBiYXNlNjRUb1N0cmluZyhtYXRjaFsxXSwgaXNCeXRlU3RyaW5nKTtcclxuICAgICAgICAgICAgY29uc3QgZW5jb2RlZERhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgICAgICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSwgdW4tZW5jb2RlZCBzY2VuZSBKU09OXHJcbiAgICAgICAgICAgICAgICBpZiAoXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlY29kZShlbmNvZGVkRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURcIik7XHJcbn07XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///4706\n')}}]);
|