cesium-mars-op-cog 0.1.0 → 0.1.1
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/dist/index.js +338 -338
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/cogTile.worker-BmAOLWmU.js +0 -9703
- package/dist/assets/cogTile.worker-BmAOLWmU.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import { Event as
|
|
3
|
-
import
|
|
4
|
-
import { onUnmounted as
|
|
5
|
-
var
|
|
1
|
+
import * as N from "cesium";
|
|
2
|
+
import { Event as p, GeographicTilingScheme as K, Rectangle as V } from "cesium";
|
|
3
|
+
import D from "proj4";
|
|
4
|
+
import { onUnmounted as X, ref as u, shallowRef as S } from "vue";
|
|
5
|
+
var w = class {
|
|
6
6
|
poolSize;
|
|
7
7
|
maxLoadPerWorker;
|
|
8
8
|
workers = [];
|
|
@@ -14,141 +14,137 @@ var R = class {
|
|
|
14
14
|
workerInitializing = /* @__PURE__ */ new Set();
|
|
15
15
|
initPayload = null;
|
|
16
16
|
_initPromise = null;
|
|
17
|
-
constructor(
|
|
18
|
-
this.poolSize =
|
|
19
|
-
for (let
|
|
20
|
-
const
|
|
21
|
-
|
|
17
|
+
constructor(g, I = navigator.hardwareConcurrency || 4, C = 4) {
|
|
18
|
+
this.poolSize = I, this.maxLoadPerWorker = C;
|
|
19
|
+
for (let A = 0; A < I; A++) {
|
|
20
|
+
const i = g();
|
|
21
|
+
i.onmessage = (e) => this._handleMessage(e, A), i.onerror = (e) => console.error("Worker error:", e), this.workers.push(i), this.workerLoad.set(A, 0);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
async initOne(
|
|
25
|
-
this.initPayload =
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
this.taskMap.set(
|
|
29
|
-
resolve:
|
|
30
|
-
reject:
|
|
24
|
+
async initOne(g) {
|
|
25
|
+
this.initPayload = g, this.workerInitialized.clear(), this.workerInitializing.clear();
|
|
26
|
+
const I = await new Promise((C, A) => {
|
|
27
|
+
const i = ++this.taskIdCounter;
|
|
28
|
+
this.taskMap.set(i, {
|
|
29
|
+
resolve: C,
|
|
30
|
+
reject: A
|
|
31
31
|
}), this.workerLoad.set(0, (this.workerLoad.get(0) || 0) + 1), this.workerInitializing.add(0), this.workers[0].postMessage({
|
|
32
32
|
type: "INIT",
|
|
33
|
-
payload:
|
|
34
|
-
taskId:
|
|
33
|
+
payload: g,
|
|
34
|
+
taskId: i
|
|
35
35
|
});
|
|
36
36
|
});
|
|
37
|
-
return this._initPromise = this._initRemainingWorkers(),
|
|
37
|
+
return this._initPromise = this._initRemainingWorkers(), I;
|
|
38
38
|
}
|
|
39
39
|
async _initRemainingWorkers() {
|
|
40
|
-
const
|
|
41
|
-
for (let
|
|
42
|
-
this.workerInitializing.add(
|
|
43
|
-
const
|
|
44
|
-
this.taskMap.set(
|
|
45
|
-
resolve: () =>
|
|
46
|
-
reject: () =>
|
|
47
|
-
}), this.workerLoad.set(
|
|
40
|
+
const g = [];
|
|
41
|
+
for (let I = 1; I < this.poolSize; I++) !this.workerInitialized.has(I) && !this.workerInitializing.has(I) && g.push(new Promise((C) => {
|
|
42
|
+
this.workerInitializing.add(I);
|
|
43
|
+
const A = ++this.taskIdCounter;
|
|
44
|
+
this.taskMap.set(A, {
|
|
45
|
+
resolve: () => C(),
|
|
46
|
+
reject: () => C()
|
|
47
|
+
}), this.workerLoad.set(I, (this.workerLoad.get(I) || 0) + 1), this.workers[I].postMessage({
|
|
48
48
|
type: "LAZY_INIT",
|
|
49
49
|
payload: this.initPayload,
|
|
50
|
-
taskId:
|
|
50
|
+
taskId: A
|
|
51
51
|
});
|
|
52
52
|
}));
|
|
53
|
-
await Promise.allSettled(
|
|
53
|
+
await Promise.allSettled(g);
|
|
54
54
|
}
|
|
55
55
|
_getLeastLoadedWorker() {
|
|
56
|
-
let
|
|
57
|
-
for (const
|
|
58
|
-
const
|
|
59
|
-
|
|
56
|
+
let g = -1, I = 1 / 0;
|
|
57
|
+
for (const C of this.workerInitialized) {
|
|
58
|
+
const A = this.workerLoad.get(C) ?? 0;
|
|
59
|
+
A < I && (I = A, g = C);
|
|
60
60
|
}
|
|
61
|
-
if (
|
|
62
|
-
for (const [
|
|
63
|
-
return
|
|
61
|
+
if (g === -1)
|
|
62
|
+
for (const [C, A] of this.workerLoad.entries()) A < I && (I = A, g = C);
|
|
63
|
+
return g >= 0 ? g : 0;
|
|
64
64
|
}
|
|
65
|
-
_handleMessage(
|
|
66
|
-
const { type:
|
|
67
|
-
if (!
|
|
68
|
-
const
|
|
69
|
-
this.workerLoad.set(
|
|
65
|
+
_handleMessage(g, I) {
|
|
66
|
+
const { type: C, taskId: A, payload: i } = g.data, e = this.taskMap.get(A);
|
|
67
|
+
if (!e) return;
|
|
68
|
+
const o = this.workerLoad.get(I) || 1;
|
|
69
|
+
this.workerLoad.set(I, Math.max(0, o - 1)), C === "INIT_DONE" ? (this.workerInitialized.add(I), this.workerInitializing.delete(I), e.resolve(i)) : C === "TILE_DONE" ? e.resolve(i) : C === "ERROR" && (this.workerInitializing.has(I) && (this.workerInitialized.add(I), this.workerInitializing.delete(I)), e.reject(new Error(i?.error || "Worker error"))), this.taskMap.delete(A), this._processQueue();
|
|
70
70
|
}
|
|
71
71
|
_processQueue() {
|
|
72
72
|
if (this.queue.length === 0) return;
|
|
73
|
-
let
|
|
74
|
-
const
|
|
75
|
-
for (let
|
|
76
|
-
let
|
|
77
|
-
for (const
|
|
78
|
-
const
|
|
79
|
-
|
|
73
|
+
let g = 0;
|
|
74
|
+
const I = Math.min(this.queue.length, this.poolSize);
|
|
75
|
+
for (let C = 0; C < I; C++) {
|
|
76
|
+
let A = -1, i = 1 / 0;
|
|
77
|
+
for (const l of this.workerInitialized) {
|
|
78
|
+
const c = this.workerLoad.get(l) ?? 0;
|
|
79
|
+
c < this.maxLoadPerWorker && c < i && (i = c, A = l);
|
|
80
80
|
}
|
|
81
|
-
if (
|
|
82
|
-
for (let
|
|
83
|
-
this.workerInitializing.add(
|
|
84
|
-
const
|
|
85
|
-
this.taskMap.set(
|
|
81
|
+
if (A === -1) {
|
|
82
|
+
for (let l = 0; l < this.poolSize; l++) if (!this.workerInitialized.has(l) && !this.workerInitializing.has(l)) {
|
|
83
|
+
this.workerInitializing.add(l);
|
|
84
|
+
const c = ++this.taskIdCounter;
|
|
85
|
+
this.taskMap.set(c, {
|
|
86
86
|
resolve: () => {
|
|
87
87
|
},
|
|
88
88
|
reject: () => {
|
|
89
89
|
}
|
|
90
|
-
}), this.workerLoad.set(
|
|
90
|
+
}), this.workerLoad.set(l, (this.workerLoad.get(l) || 0) + 1), this.workers[l].postMessage({
|
|
91
91
|
type: "LAZY_INIT",
|
|
92
92
|
payload: this.initPayload,
|
|
93
|
-
taskId:
|
|
93
|
+
taskId: c
|
|
94
94
|
});
|
|
95
95
|
break;
|
|
96
96
|
}
|
|
97
97
|
break;
|
|
98
98
|
}
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
this.taskMap.set(
|
|
103
|
-
resolve:
|
|
104
|
-
reject:
|
|
105
|
-
}), this.workerLoad.set(
|
|
106
|
-
type:
|
|
107
|
-
payload:
|
|
108
|
-
taskId:
|
|
99
|
+
const e = this.queue.shift();
|
|
100
|
+
g++;
|
|
101
|
+
const o = ++this.taskIdCounter;
|
|
102
|
+
this.taskMap.set(o, {
|
|
103
|
+
resolve: e.resolve,
|
|
104
|
+
reject: e.reject
|
|
105
|
+
}), this.workerLoad.set(A, (this.workerLoad.get(A) || 0) + 1), this.workers[A].postMessage({
|
|
106
|
+
type: e.type,
|
|
107
|
+
payload: e.payload,
|
|
108
|
+
taskId: o
|
|
109
109
|
});
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
-
execute(
|
|
113
|
-
return new Promise((
|
|
112
|
+
execute(g, I) {
|
|
113
|
+
return new Promise((C, A) => {
|
|
114
114
|
this.queue.push({
|
|
115
|
-
type:
|
|
116
|
-
payload:
|
|
117
|
-
resolve:
|
|
118
|
-
reject:
|
|
115
|
+
type: g,
|
|
116
|
+
payload: I,
|
|
117
|
+
resolve: C,
|
|
118
|
+
reject: A
|
|
119
119
|
}), this._processQueue();
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
122
|
terminate() {
|
|
123
|
-
for (const
|
|
124
|
-
for (const [,
|
|
125
|
-
for (const
|
|
123
|
+
for (const g of this.queue) g.reject?.(/* @__PURE__ */ new Error("WorkerPool 已终止"));
|
|
124
|
+
for (const [, g] of this.taskMap) g.reject?.(/* @__PURE__ */ new Error("WorkerPool 已终止"));
|
|
125
|
+
for (const g of this.workers) g.terminate();
|
|
126
126
|
this.workers = [], this.queue = [], this.taskMap.clear(), this.workerInitialized.clear(), this.workerInitializing.clear();
|
|
127
127
|
}
|
|
128
|
-
}
|
|
129
|
-
function G(e) {
|
|
130
|
-
return new Worker("/assets/cogTile.worker-BmAOLWmU.js", { name: e?.name });
|
|
131
|
-
}
|
|
132
|
-
var W = class {
|
|
128
|
+
}, v = class {
|
|
133
129
|
max;
|
|
134
130
|
map;
|
|
135
131
|
onEvict;
|
|
136
|
-
constructor(
|
|
137
|
-
this.max =
|
|
132
|
+
constructor(g = 256, I) {
|
|
133
|
+
this.max = g, this.map = /* @__PURE__ */ new Map(), this.onEvict = I ?? null;
|
|
138
134
|
}
|
|
139
|
-
get(
|
|
140
|
-
if (!this.map.has(
|
|
141
|
-
const
|
|
142
|
-
return this.map.delete(
|
|
135
|
+
get(g) {
|
|
136
|
+
if (!this.map.has(g)) return;
|
|
137
|
+
const I = this.map.get(g);
|
|
138
|
+
return this.map.delete(g), this.map.set(g, I), I;
|
|
143
139
|
}
|
|
144
|
-
set(
|
|
145
|
-
if (this.map.has(
|
|
146
|
-
const
|
|
147
|
-
this.map.delete(
|
|
140
|
+
set(g, I) {
|
|
141
|
+
if (this.map.has(g) && this.map.delete(g), this.map.set(g, I), this.map.size > this.max) {
|
|
142
|
+
const C = this.map.keys().next().value, A = this.map.get(C);
|
|
143
|
+
this.map.delete(C), this.onEvict?.(C, A);
|
|
148
144
|
}
|
|
149
145
|
}
|
|
150
|
-
delete(
|
|
151
|
-
return this.map.delete(
|
|
146
|
+
delete(g) {
|
|
147
|
+
return this.map.delete(g);
|
|
152
148
|
}
|
|
153
149
|
clear() {
|
|
154
150
|
this.map.clear();
|
|
@@ -157,24 +153,28 @@ var W = class {
|
|
|
157
153
|
return this.map.size;
|
|
158
154
|
}
|
|
159
155
|
};
|
|
160
|
-
function
|
|
161
|
-
|
|
162
|
-
for (let
|
|
163
|
-
const
|
|
164
|
-
|
|
156
|
+
function J() {
|
|
157
|
+
D.defs("EPSG:3857", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs"), D.defs("EPSG:4326", "+proj=longlat +datum=WGS84 +no_defs"), D.defs("EPSG:4548", "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
|
|
158
|
+
for (let g = 75; g <= 135; g += 3) {
|
|
159
|
+
const I = 4524 + Math.floor((g - 75) / 3);
|
|
160
|
+
D.defs(`EPSG:${I}`, `+proj=tmerc +lat_0=0 +lon_0=${g} +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs`);
|
|
165
161
|
}
|
|
166
162
|
}
|
|
167
|
-
|
|
168
|
-
var q = {
|
|
163
|
+
function F() {
|
|
164
|
+
const g = new URL("data:video/mp2t;base64,aW1wb3J0ICogYXMgR2VvVElGRiBmcm9tICdnZW90aWZmJw0KaW1wb3J0IHR5cGUgeyBHZW9USUZGIGFzIEdlb1RJRkZUeXBlLCBHZW9USUZGSW1hZ2UgfSBmcm9tICdnZW90aWZmJw0KaW1wb3J0IHByb2o0IGZyb20gJ3Byb2o0Jw0KDQovLyBaU1REIOWOi+e8qeino+eggeWZqOmdmeaAgeWvvOWFpQ0KLy8gZ2VvdGlmZi5qcyDlhoXpg6jkvb/nlKjliqjmgIEgaW1wb3J0KCkg5p2l5Yqg6L29IHpzdGQg6Kej56CB5Zmo77yM5L2GIFZpdGUg55qE57uP5YW4IFdvcmtlciAoID93b3JrZXIgKQ0KLy8g5LiN5pSv5oyB5Yqo5oCB5a+85YWl44CC5q2k5aSE6Z2Z5oCB5a+85YWl5bm25o+Q5YmN5rOo5YaM77yM56Gu5L+dIDM4NTcg5b2x5YOP77yI5L2/55SoIFpTVEQg5Y6L57yp77yJ6IO95q2j5bi46Kej56CB44CCDQppbXBvcnQgeyBaU1RERGVjb2RlciB9IGZyb20gJ3pzdGRkZWMvc3RyZWFtJw0KDQovLyAtLS0tIFdvcmtlciDmtojmga/nsbvlnovlrprkuYkgLS0tLQ0KDQovKiog5Li757q/56iLIOKGkiBXb3JrZXIg5raI5oGvICovDQp0eXBlIFdvcmtlckluTWVzc2FnZSA9DQogIHwgeyB0eXBlOiAnSU5JVCc7IHBheWxvYWQ6IHsgdXJsOiBzdHJpbmcgfTsgdGFza0lkOiBudW1iZXIgfQ0KICB8IHsgdHlwZTogJ0xBWllfSU5JVCc7IHBheWxvYWQ6IHsgdXJsOiBzdHJpbmcgfTsgdGFza0lkOiBudW1iZXIgfQ0KICB8IHsNCiAgICAgIHR5cGU6ICdQUk9DRVNTX1RJTEUnDQogICAgICBwYXlsb2FkOiB7DQogICAgICAgIHg6IG51bWJlcg0KICAgICAgICB5OiBudW1iZXINCiAgICAgICAgbGV2ZWw6IG51bWJlcg0KICAgICAgICB0aWxlUmVjdDogeyB3ZXN0OiBudW1iZXI7IHNvdXRoOiBudW1iZXI7IGVhc3Q6IG51bWJlcjsgbm9ydGg6IG51bWJlciB9DQogICAgICAgIGFscGhhPzogbnVtYmVyDQogICAgICB9DQogICAgICB0YXNrSWQ6IG51bWJlcg0KICAgIH0NCg0KLyoqIFdvcmtlciDihpIg5Li757q/56iLIOWTjeW6lOa2iOaBryAqLw0KdHlwZSBXb3JrZXJPdXRNZXNzYWdlID0NCiAgfCB7DQogICAgICB0eXBlOiAnSU5JVF9ET05FJw0KICAgICAgdGFza0lkOiBudW1iZXINCiAgICAgIHBheWxvYWQ6IHsNCiAgICAgICAgc3VjY2VzczogYm9vbGVhbg0KICAgICAgICBiYm94OiBudW1iZXJbXQ0KICAgICAgICBjcnNUeXBlOiBDcnNUeXBlDQogICAgICAgIG1heExldmVsOiBudW1iZXINCiAgICAgICAgbWluTGV2ZWw6IG51bWJlcg0KICAgICAgfQ0KICAgIH0NCiAgfCB7IHR5cGU6ICdUSUxFX0RPTkUnOyB0YXNrSWQ6IG51bWJlcjsgcGF5bG9hZDogeyBiaXRtYXA/OiBJbWFnZUJpdG1hcDsgZW1wdHk6IGJvb2xlYW4gfSB9DQogIHwgeyB0eXBlOiAnRVJST1InOyB0YXNrSWQ6IG51bWJlcjsgcGF5bG9hZDogeyBlcnJvcjogc3RyaW5nIH0gfQ0KDQovKiogQ1JTIOexu+WeiyAqLw0KdHlwZSBDcnNUeXBlID0gJzQzMjYnIHwgJzM4NTcnIHwgJzQ1NDgnDQoNCi8qKiDnsbvlnovljJbmlbDnu4TogZTlkIjnsbvlnosgKi8NCnR5cGUgVHlwZWRBcnJheSA9DQogIHwgSW50OEFycmF5DQogIHwgVWludDhBcnJheQ0KICB8IEludDE2QXJyYXkNCiAgfCBVaW50MTZBcnJheQ0KICB8IEludDMyQXJyYXkNCiAgfCBVaW50MzJBcnJheQ0KICB8IFVpbnQ4Q2xhbXBlZEFycmF5DQogIHwgRmxvYXQzMkFycmF5DQogIHwgRmxvYXQ2NEFycmF5DQoNCi8qKiDlr7npvZDnqpflj6PorqHnrpfnu5PmnpwgKi8NCmludGVyZmFjZSBBbGlnbmVkV2luZG93IHsNCiAgYmxvY2tzOiBudW1iZXINCiAgaW1nVzogbnVtYmVyDQogIGltZ0g6IG51bWJlcg0KICByZWFkWDogbnVtYmVyDQogIHJlYWRZOiBudW1iZXINCiAgcmVhZFc6IG51bWJlcg0KICByZWFkSDogbnVtYmVyDQogIGFsaWduZWRYOiBudW1iZXINCiAgYWxpZ25lZFk6IG51bWJlcg0KICBhbGlnbmVkVzogbnVtYmVyDQogIGFsaWduZWRIOiBudW1iZXINCn0NCg0KLy8g5omp5bGVIFdvcmtlciDlhajlsYDkvZznlKjln5/nsbvlnovvvIjkuI3kvp3otZYgd2Vid29ya2VyIGxpYu+8iQ0KZGVjbGFyZSBjb25zdCBzZWxmOiB7DQogIHBvc3RNZXNzYWdlKG1lc3NhZ2U6IFdvcmtlck91dE1lc3NhZ2UsIHRyYW5zZmVyPzogVHJhbnNmZXJhYmxlW10pOiB2b2lkDQogIG9ubWVzc2FnZTogKChldjogTWVzc2FnZUV2ZW50PFdvcmtlckluTWVzc2FnZT4pID0+IHZvaWQpIHwgbnVsbA0KfQ0KDQovLyAtLS0tIENSUyDms6jlhowgLS0tLQ0KDQovLyDms6jlhozluLjnlKggQ1JTIOWumuS5iQ0KcHJvajQuZGVmcygNCiAgJ0VQU0c6Mzg1NycsDQogICcrcHJvaj1tZXJjICthPTYzNzgxMzcgK2I9NjM3ODEzNyArbGF0X3RzPTAgK2xvbl8wPTAgK3hfMD0wICt5XzA9MCAraz0xICt1bml0cz1tICtuYWRncmlkcz1AbnVsbCArd2t0ZXh0ICtub19kZWZzJywNCikNCnByb2o0LmRlZnMoJ0VQU0c6NDMyNicsICcrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCArbm9fZGVmcycpDQovLyBFUFNHOjQ1NDggPSBDR0NTMjAwMCAvIDMtZGVncmVlIEdhdXNzLUtydWdlciB6b25lIDQwIChDTSAxMjDCsEUpDQovLyDms6jmhI/vvJrpg6jliIYgQ09HIOaWh+S7tiBFUFNHIOWFg+aVsOaNrue8uuWkse+8jOWunumZheWdkOagh+WxnuS6juS4jeWQjCAzwrAg5bim44CCDQovLyDmoIflh4YgM8KwIOW4pu+8muS4nOe7jyAxMTjCsDMwJ34xMjHCsDMwJyDkuLogem9uZSAzOSAoQ00gMTE3wrBFKeOAgg0KLy8gR2V0R2VvS2V5cyDml6Dms5Xor7vlj5YgRVBTRyDlj7fml7bvvIxkZXRlY3RDcnNUeXBlIOm7mOiupOWIpOS4uiA0NTQ4IOS9huS4reWkrue7j+e6v+WPr+iDveS4jeWMuemFjeOAgg0KLy8g5pys5paH5Lu25Z2Q5qCHIGVhc3Rpbmcg4omIIDcwNmtt77yI5ZCrIDUwMGttIOWBh+S4nOenu++8ie+8jOeUqCBDTSAxMTfCsEUg6K6h566XIOKGkiDpmYblnLANCnByb2o0LmRlZnMoDQogICdFUFNHOjQ1NDgnLA0KICAnK3Byb2o9dG1lcmMgK2xhdF8wPTAgK2xvbl8wPTExNyAraz0xICt4XzA9NTAwMDAwICt5XzA9MCArZWxscHM9R1JTODAgK3VuaXRzPW0gK25vX2RlZnMnLA0KKQ0KDQovLyAtLS0tIOW4uOmHj+S4jueKtuaAgSAtLS0tDQoNCmNvbnN0IFRJTEVfU0laRSA9IDI1Ng0KDQpjb25zdCB0aWxlQ2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhUSUxFX1NJWkUsIFRJTEVfU0laRSkNCmNvbnN0IHRpbGVDdHggPSB0aWxlQ2FudmFzLmdldENvbnRleHQoJzJkJywgew0KICB3aWxsUmVhZEZyZXF1ZW50bHk6IGZhbHNlLA0KICBhbHBoYTogdHJ1ZSwNCn0pIQ0KDQovLyDkuK3pl7QgQ2FudmFz77ya55So5LqO5Y6f55Sf5YiG6L6o546H5riy5p+T5ZCO6YCa6L+HIEdQVSDnvKnmlL7vvIjlsLrlr7jlnKjliJ3lp4vljJbml7bliqjmgIHorr7lrprvvIkNCmxldCBzdGFnaW5nQ2FudmFzOiBPZmZzY3JlZW5DYW52YXMNCmxldCBzdGFnaW5nQ3R4OiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbA0KDQpmdW5jdGlvbiBlbnN1cmVTdGFnaW5nQ2FudmFzKHNpemU6IG51bWJlcik6IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB7DQogIGlmICghc3RhZ2luZ0NhbnZhcyB8fCBzdGFnaW5nQ2FudmFzLndpZHRoIDwgc2l6ZSB8fCBzdGFnaW5nQ2FudmFzLmhlaWdodCA8IHNpemUpIHsNCiAgICBjb25zdCBuZXdTaXplID0gTWF0aC5jZWlsKHNpemUgLyA1MTIpICogNTEyDQogICAgc3RhZ2luZ0NhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3U2l6ZSwgbmV3U2l6ZSkNCiAgICBzdGFnaW5nQ3R4ID0gc3RhZ2luZ0NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsNCiAgICAgIGFscGhhOiB0cnVlLA0KICAgICAgZGVzeW5jaHJvbml6ZWQ6IHRydWUsDQogICAgfSkhDQogIH0NCiAgcmV0dXJuIHN0YWdpbmdDdHghDQp9DQoNCi8vIOmihOWIhumFjeWPr+WkjeeUqOeahOWDj+e0oOe8k+WGsuWMuu+8jOmBv+WFjeavj+S4queTpueJh+mDvemHjeaWsOWIhumFjeWGheWtmA0KY29uc3QgTUFYX1NUQUdJTkdfU0laRSA9IDQwOTYNCmNvbnN0IHJldXNhYmxlUGl4ZWxCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoTUFYX1NUQUdJTkdfU0laRSAqIE1BWF9TVEFHSU5HX1NJWkUgKiA0KQ0KY29uc3QgcmV1c2FibGVQeDMyID0gbmV3IFVpbnQzMkFycmF5KHJldXNhYmxlUGl4ZWxCdWZmZXIpDQpjb25zdCByZXVzYWJsZVB4OCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyZXVzYWJsZVBpeGVsQnVmZmVyKQ0KDQovKiog5Yqo5oCB6I635Y+W55qEIENPRyDlhoXpg6ggdGlsZSDlnZflpKflsI/vvIzliJ3lp4vljJbml7bku47mlofku7bor7vlj5YgKi8NCmxldCBibG9ja1NpemUgPSA1MTINCg0KLy8g5oeS5Yid5aeL5YyW6ZSB77yM6Ziy5q2i5aSa5LiqIFBST0NFU1NfVElMRSDlubblj5HosIPnlKggX2Z1bGxJbml0DQpsZXQgX2luaXRMb2NrOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGwNCg0KbGV0IHRpZmY6IEdlb1RJRkZUeXBlIHwgbnVsbCA9IG51bGwNCmxldCBpbWFnZXM6IEdlb1RJRkZJbWFnZVtdID0gW10NCmxldCBpbWFnZVJlc29sdXRpb25zOiBudW1iZXJbXSA9IFtdDQpsZXQgc2FtcGxlc1BlclBpeGVsID0gMQ0KbGV0IGhhc0FscGhhID0gZmFsc2UNCmxldCBjb2dCYm94OiBudW1iZXJbXSB8IG51bGwgPSBudWxsDQpsZXQgY3JzVHlwZTogQ3JzVHlwZSA9ICc0MzI2JyAvLyDlvZPliY0gQ09HIOeahCBDUlMg57G75Z6LDQpsZXQgYmJveElzUHJvamVjdGVkID0gZmFsc2UgLy8gY29nQmJveCDmmK/lkKbku6XmipXlvbHlnZDmoIfvvIjnsbPvvInkuLrljZXkvY3vvIxmYWxzZSDliJnkuLrluqblnZDmoIcNCg0KLy8g5oeS5Yid5aeL5YyW77ya6Z2e5Li7IFdvcmtlciDlhYjlrZggVVJM77yM6aaW5qyh5aSE55CG55Om54mH5pe25YaN5Yqg6L29DQpsZXQgbGF6eVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGwNCg0KLy8gLS0tLSDovoXliqnlh73mlbAgLS0tLQ0KDQovKiog5b2T5YmNIENPRyDmmK/lkKbkuLrmipXlvbHlnZDmoIfns7vvvIgzODU3LzQ1NDgg562J57Gz5Y2V5L2NIENSU++8iSAqLw0KZnVuY3Rpb24gaXNQcm9qZWN0ZWRDcnMoKTogYm9vbGVhbiB7DQogIHJldHVybiBjcnNUeXBlID09PSAnMzg1NycgfHwgY3JzVHlwZSA9PT0gJzQ1NDgnDQp9DQoNCi8vIOe8k+WtmCBwcm9qNCDlnZDmoIfovazmjaLlmajvvIzpgb/lhY3mr4/nk6bniYfpg73ph43mlrDliJvlu7oNCmNvbnN0IHRvTWVyY2F0b3IgPSBwcm9qNCgnRVBTRzo0MzI2JywgJ0VQU0c6Mzg1NycpIC8vIOW6piDihpIgMzg1NyDnsbMNCmNvbnN0IGZyb21NZXJjYXRvciA9IHByb2o0KCdFUFNHOjM4NTcnLCAnRVBTRzo0MzI2JykgLy8gMzg1NyDnsbMg4oaSIOW6pg0KbGV0IF90bzQ1NDg6IHByb2o0LkNvbnZlcnRlciB8IG51bGwgPSBudWxsDQpsZXQgX2Zyb200NTQ4OiBwcm9qNC5Db252ZXJ0ZXIgfCBudWxsID0gbnVsbA0KDQpmdW5jdGlvbiBnZXRUbzQ1NDgoKTogcHJvajQuQ29udmVydGVyIHsNCiAgaWYgKCFfdG80NTQ4KSBfdG80NTQ4ID0gcHJvajQoJ0VQU0c6NDMyNicsICdFUFNHOjQ1NDgnKQ0KICByZXR1cm4gX3RvNDU0OA0KfQ0KZnVuY3Rpb24gZ2V0RnJvbTQ1NDgoKTogcHJvajQuQ29udmVydGVyIHsNCiAgaWYgKCFfZnJvbTQ1NDgpIF9mcm9tNDU0OCA9IHByb2o0KCdFUFNHOjQ1NDgnLCAnRVBTRzo0MzI2JykNCiAgcmV0dXJuIF9mcm9tNDU0OA0KfQ0KDQovKiog5bCGIENPRyDmipXlvbHlnZDmoIcgKDM4NTcvNDU0OCkg6L2s5o2i5Li6IFdHUzg0IOW6puWdkOaghyAqLw0KZnVuY3Rpb24gcHJvamVjdGVkVG9EZWdyZWVzKHg6IG51bWJlciwgeTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7DQogIGlmIChjcnNUeXBlID09PSAnMzg1NycpIHJldHVybiBmcm9tTWVyY2F0b3IuZm9yd2FyZChbeCwgeV0pIGFzIFtudW1iZXIsIG51bWJlcl0NCiAgaWYgKGNyc1R5cGUgPT09ICc0NTQ4JykgcmV0dXJuIGdldEZyb200NTQ4KCkuZm9yd2FyZChbeCwgeV0pIGFzIFtudW1iZXIsIG51bWJlcl0NCiAgcmV0dXJuIFt4LCB5XQ0KfQ0KDQovKiog5bCGIFdHUzg0IOW6puWdkOagh+i9rOaNouS4uiBDT0cg5oqV5b2x5Z2Q5qCHICovDQpmdW5jdGlvbiBkZWdyZWVzVG9Qcm9qZWN0ZWQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHsNCiAgaWYgKGNyc1R5cGUgPT09ICczODU3JykgcmV0dXJuIHRvTWVyY2F0b3IuZm9yd2FyZChbeCwgeV0pIGFzIFtudW1iZXIsIG51bWJlcl0NCiAgaWYgKGNyc1R5cGUgPT09ICc0NTQ4JykgcmV0dXJuIGdldFRvNDU0OCgpLmZvcndhcmQoW3gsIHldKSBhcyBbbnVtYmVyLCBudW1iZXJdDQogIHJldHVybiBbeCwgeV0NCn0NCg0KLyoqDQogKiDmo4DmtYsgQ1JTIOexu+Weiw0KICogQHBhcmFtIGJib3ggLSBDT0cg55qE5Y6f5aeLIGJib3gNCiAqIEBwYXJhbSBlcHNnIC0g5LuOIENPRyDlhYPmlbDmja7or7vlj5bnmoQgRVBTRyDnvJblj7cNCiAqLw0KZnVuY3Rpb24gZGV0ZWN0Q3JzVHlwZShiYm94OiBudW1iZXJbXSwgZXBzZzogbnVtYmVyIHwgbnVsbCk6IENyc1R5cGUgew0KICAvLyBXZWIgTWVyY2F0b3Ig55qE5bi46KeBIEVQU0cg5Luj56CBDQogIC8vIDM4NTcgKFdHUyA4NCAvIFBzZXVkby1NZXJjYXRvcikNCiAgLy8gMTAyMTAwIChFc3JpIFdlYiBNZXJjYXRvcikNCiAgLy8gOTAwOTEzIChHb29nbGUgV2ViIE1lcmNhdG9yKQ0KICAvLyA0MTAwMSAocG9wdWxhciBXZWIgTWVyY2F0b3IgYWxpYXMpDQogIGlmIChlcHNnID09PSAzODU3IHx8IGVwc2cgPT09IDEwMjEwMCB8fCBlcHNnID09PSA5MDA5MTMgfHwgZXBzZyA9PT0gNDEwMDEpIHJldHVybiAnMzg1NycNCiAgaWYgKGVwc2cgPT09IDQ1NDgpIHJldHVybiAnNDU0OCcNCiAgaWYgKGVwc2cgPT09IDQzMjYpIHJldHVybiAnNDMyNicNCiAgLy8g5pegIEVQU0cg5oiW5pyq6K+G5Yir55qEIEVQU0cg5pe26Z2gIGJib3gg5YC86IyD5Zu05Yik5patDQogIGlmICghZXBzZyB8fCBlcHNnID09PSAwIHx8IGVwc2cgPiA0MDAwKSB7DQogICAgY29uc3QgW3csIHMsIGUsIG5dID0gYmJveCBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXQ0KICAgIGNvbnN0IGFueUxhcmdlID0gTWF0aC5hYnModykgPiAzNjAgfHwgTWF0aC5hYnMoZSkgPiAzNjAgfHwgTWF0aC5hYnMocykgPiA5MCB8fCBNYXRoLmFicyhuKSA+IDkwDQogICAgaWYgKGFueUxhcmdlKSB7DQogICAgICAvLyDljLrliIYgMzg1N++8iOWFqOeQg+iMg+WbtCDCsTIwMDM3NTA477yJ5LiO5pys5Zyw5oqV5b2xIENSU++8iOWmgiA0NTQ4IOeahOWAvOi+g+Wwj++8iQ0KICAgICAgLy8gMzg1NyDnmoTnsbPlnZDmoIfpgJrluLjlnKjljYPkuIfnuqfvvIjlpoIgMTMwMDAwMDAr77yJ77yM6ICMIDQ1NDgg562J5pys5Zyw5oqV5b2x5Zyo55m+5LiH57qn77yI5aaCIDcwNDcyMO+8iQ0KICAgICAgY29uc3QgbWF4QWJzID0gTWF0aC5tYXgoTWF0aC5hYnModyksIE1hdGguYWJzKGUpLCBNYXRoLmFicyhzKSwgTWF0aC5hYnMobikpDQogICAgICBpZiAobWF4QWJzID49IDEwMDAwMDAwKSByZXR1cm4gJzM4NTcnDQogICAgICAvLyDlsI/kuo4gMTAwMCDkuIfkuJQgPiAzNjAg4oaSIOW+iOWPr+iDveaYr+acrOWcsOaKleW9sSBDUlPvvIjlpoIgNDU0OC80NTQ5LzQ1NTAg562J77yJDQogICAgICAvLyDov5Tlm54gJzQ1NDgnIOS9nOS4uuacgOS9s+m7mOiupOWAvO+8iOWvueS4reWbveWMuuWfn+mAgueUqO+8iQ0KICAgICAgcmV0dXJuICc0NTQ4Jw0KICAgIH0NCiAgfQ0KICByZXR1cm4gJzQzMjYnDQp9DQoNCi8vID09PT09PSBIVFRQIOivt+axguiKgua1geWZqO+8iOW3suemgeeUqCDigJQg5rWP6KeI5Zmo6buY6K6kIDYg5bm25Y+RL+Wfn+WQjeabtOWPr+mdoO+8iSA9PT09PT0NCg0KLy8g5q+P55Om54mH5pyA5aSn5Z2X5pWw6ZmQ5Yi277ya6K6+5Li66L6D5aSn5YC877yM6YG/5YWN5aSn5paH5Lu2IDM4NTcg5Zug6LaF6ZmQ6L+U5Zue56m65a+86Ie0IENlc2l1bSDlgZzmraLor7fmsYINCi8vIOS5i+WJjemZkOWItui/h+Wwj++8iDI1LzQ577yJ5pivIDM4NTcg5Yqg6L295LiN5Ye655qE5Li76KaB5Y6f5Zug5LmL5LiADQovLyDlkI7mj5DljYfliLAgMjU2IOS7jeS4jeWkn++8iDM4NTcg5aSn5b2x5YOP5ZyoIGxldmVsIDEzLTE0IOS7jei2hemZkO+8ie+8jOWGjeaPkOWNh+WIsCA0MDk2DQpjb25zdCBNQVhfQkxPQ0tTX1BFUl9USUxFID0gNDA5Ng0KDQovLyDnroDljZXnmoQgV29ya2VyIOWGhemDqOWdl+e8k+WtmA0KY29uc3QgYmxvY2tDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlZEFycmF5W10+KCkNCmNvbnN0IE1BWF9DQUNIRV9TSVpFID0gNTAwDQoNCi8vIC0tLS0g5a6M5pW05Yid5aeL5YyW77yI5oeS5Yqg6L295pe25Lmf5aSN55So5q2k5Ye95pWw77yJIC0tLS0NCg0KLyoqDQogKiDlrozmlbTnmoQgQ09HIOWIneWni+WMlua1geeoi++8muazqOWGjOino+eggeWZqOOAgeaJk+W8gOaWh+S7tuOAgeino+aekOWFg+aVsOaNrg0KICog6K6+572u5YWo5bGA5Y+Y6YeP77yadGlmZiwgaW1hZ2VzLCBpbWFnZVJlc29sdXRpb25zLCBjb2dCYm94LCBjcnNUeXBlIOetiQ0KICovDQphc3luYyBmdW5jdGlvbiBfZnVsbEluaXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsNCiAgYmJveERlZ3JlZXM6IG51bWJlcltdDQogIGNyc1R5cGU6IENyc1R5cGUNCiAgbWF4TGV2ZWw6IG51bWJlcg0KICBtaW5MZXZlbDogbnVtYmVyDQogIG1haW5JbWc6IEdlb1RJRkZJbWFnZQ0KfT4gew0KICAvLyDpooTms6jlhowgWlNURCDop6PnoIHlmagNCiAgY29uc3QgenN0ZEluc3RhbmNlID0gbmV3IFpTVEREZWNvZGVyKCkNCiAgYXdhaXQgenN0ZEluc3RhbmNlLmluaXQoKQ0KICBHZW9USUZGLmFkZERlY29kZXIoDQogICAgNTAwMDAsDQogICAgKCk6IFByb21pc2U8dHlwZW9mIEdlb1RJRkYuQmFzZURlY29kZXI+ID0+DQogICAgICBQcm9taXNlLnJlc29sdmUoDQogICAgICAgIGNsYXNzIGV4dGVuZHMgR2VvVElGRi5CYXNlRGVjb2RlciB7DQogICAgICAgICAgZGVjb2RlQmxvY2soYnVmZmVyOiBBcnJheUJ1ZmZlcik6IEFycmF5QnVmZmVyIHsNCiAgICAgICAgICAgIHJldHVybiB6c3RkSW5zdGFuY2UuZGVjb2RlKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcg0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICksDQogICkNCg0KICB0aWZmID0gYXdhaXQgR2VvVElGRi5mcm9tVXJsKHVybCwgew0KICAgIHVzZVdvcmtlcnM6IGZhbHNlLA0KICAgIG1heFJhbmdlczogNTAwLA0KICB9IGFzIFBhcmFtZXRlcnM8dHlwZW9mIEdlb1RJRkYuZnJvbVVybD5bMV0pDQogIGNvbnN0IGltYWdlQ291bnQgPSBhd2FpdCB0aWZmLmdldEltYWdlQ291bnQoKQ0KICBpbWFnZXMgPSBbXQ0KICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlQ291bnQ7IGkrKykgew0KICAgIGltYWdlcy5wdXNoKGF3YWl0IHRpZmYuZ2V0SW1hZ2UoaSkpDQogIH0NCiAgY29uc3QgbWFpbkltZyA9IGltYWdlc1swXSEgYXMgR2VvVElGRkltYWdlDQoNCiAgLy8g5Yqo5oCB6K+75Y+WIENPRyDlhoXpg6ggdGlsZSDlnZflpKflsI8NCiAgLy8gZ2VvdGlmZi5qcyDnmoQgZ2V0VGlsZVdpZHRoL2dldFRpbGVIZWlnaHQg6L+U5ZueIFRJRkYg5YaF6YOoIHRpbGUg5bC65a+4DQogIC8vIOWmguaenOmdniB0aWxlZO+8iHN0cmlwcGVk77yJ77yM5YiZ5Zue6YCA5YiwIDUxMg0KICB0cnkgew0KICAgIGNvbnN0IHR3ID0gbWFpbkltZy5nZXRUaWxlV2lkdGgoKQ0KICAgIGNvbnN0IHRoID0gbWFpbkltZy5nZXRUaWxlSGVpZ2h0KCkNCiAgICBpZiAodHcgPiAwICYmIHRoID4gMCkgew0KICAgICAgYmxvY2tTaXplID0gTWF0aC5tYXgodHcsIHRoKQ0KICAgIH0NCiAgfSBjYXRjaCB7DQogICAgYmxvY2tTaXplID0gNTEyDQogIH0NCiAgLy8g56Gu5L+dIHN0YWdpbmcgY2FudmFzIOWwuuWvuOWMuemFjQ0KICBlbnN1cmVTdGFnaW5nQ2FudmFzKGJsb2NrU2l6ZSkNCg0KICAvLyDojrflj5YgYmJveA0KICBjb2dCYm94ID0gbWFpbkltZy5nZXRCb3VuZGluZ0JveCgpIGFzIG51bWJlcltdIHwgbnVsbA0KICBpZiAoDQogICAgIWNvZ0Jib3ggfHwNCiAgICAhQXJyYXkuaXNBcnJheShjb2dCYm94KSB8fA0KICAgIGNvZ0Jib3gubGVuZ3RoICE9PSA0IHx8DQogICAgIWlzRmluaXRlKGNvZ0Jib3hbMF0hKSB8fA0KICAgICFpc0Zpbml0ZShjb2dCYm94WzFdISkgfHwNCiAgICAhaXNGaW5pdGUoY29nQmJveFsyXSEpIHx8DQogICAgIWlzRmluaXRlKGNvZ0Jib3hbM10hKQ0KICApIHsNCiAgICBsZXQgb3JpZ2luWDogbnVtYmVyIHwgdW5kZWZpbmVkDQogICAgbGV0IG9yaWdpblk6IG51bWJlciB8IHVuZGVmaW5lZA0KICAgIGxldCByZXNYOiBudW1iZXIgfCB1bmRlZmluZWQNCiAgICBsZXQgcmVzWTogbnVtYmVyIHwgdW5kZWZpbmVkDQogICAgbGV0IGZhbGxiYWNrT2sgPSBmYWxzZQ0KICAgIHRyeSB7DQogICAgICBjb25zdCBbb3gsIG95XSA9IG1haW5JbWcuZ2V0T3JpZ2luKCkgYXMgW251bWJlciwgbnVtYmVyXQ0KICAgICAgY29uc3QgW3J4LCByeV0gPSBtYWluSW1nLmdldFJlc29sdXRpb24oKSBhcyBbbnVtYmVyLCBudW1iZXJdDQogICAgICBvcmlnaW5YID0gb3gNCiAgICAgIG9yaWdpblkgPSBveQ0KICAgICAgcmVzWCA9IHJ4DQogICAgICByZXNZID0gcnkNCiAgICAgIGlmIChpc0Zpbml0ZShvcmlnaW5YKSAmJiBpc0Zpbml0ZShvcmlnaW5ZKSAmJiBpc0Zpbml0ZShyZXNYKSAmJiBpc0Zpbml0ZShyZXNZKSkNCiAgICAgICAgZmFsbGJhY2tPayA9IHRydWUNCiAgICB9IGNhdGNoIHsNCiAgICAgIC8qIGlnbm9yZSAqLw0KICAgIH0NCiAgICBpZiAoIWZhbGxiYWNrT2spIHsNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IGZkID0gKG1haW5JbWcgYXMgdW5rbm93biBhcyB7IGZpbGVEaXJlY3Rvcnk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS5maWxlRGlyZWN0b3J5DQogICAgICAgIGlmIChmZCAmJiB0eXBlb2YgKGZkIGFzIHsgbG9hZFZhbHVlPzogdW5rbm93biB9KS5sb2FkVmFsdWUgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICBjb25zdCB0aWVQb2ludHMgPSBhd2FpdCAoDQogICAgICAgICAgICBmZCBhcyB1bmtub3duIGFzIHsgbG9hZFZhbHVlOiAodGFnOiBzdHJpbmcpID0+IFByb21pc2U8bnVtYmVyW10+IH0NCiAgICAgICAgICApLmxvYWRWYWx1ZSgnTW9kZWxUaWVwb2ludCcpDQogICAgICAgICAgY29uc3QgcGl4ZWxTY2FsZSA9IGF3YWl0ICgNCiAgICAgICAgICAgIGZkIGFzIHVua25vd24gYXMgeyBsb2FkVmFsdWU6ICh0YWc6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXJbXT4gfQ0KICAgICAgICAgICkubG9hZFZhbHVlKCdNb2RlbFBpeGVsU2NhbGUnKQ0KICAgICAgICAgIGlmICh0aWVQb2ludHMgJiYgdGllUG9pbnRzLmxlbmd0aCA+PSA2ICYmIHBpeGVsU2NhbGUgJiYgcGl4ZWxTY2FsZS5sZW5ndGggPj0gMikgew0KICAgICAgICAgICAgb3JpZ2luWCA9IHRpZVBvaW50c1szXSENCiAgICAgICAgICAgIG9yaWdpblkgPSB0aWVQb2ludHNbNF0hDQogICAgICAgICAgICByZXNYID0gcGl4ZWxTY2FsZVswXSENCiAgICAgICAgICAgIHJlc1kgPSAtcGl4ZWxTY2FsZVsxXSENCiAgICAgICAgICAgIGZhbGxiYWNrT2sgPSB0cnVlDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGNhdGNoIHsNCiAgICAgICAgLyogaWdub3JlICovDQogICAgICB9DQogICAgfQ0KICAgIGlmIChmYWxsYmFja09rKSB7DQogICAgICBjb25zdCB3ID0gbWFpbkltZy5nZXRXaWR0aCgpDQogICAgICBjb25zdCBoID0gbWFpbkltZy5nZXRIZWlnaHQoKQ0KICAgICAgY29nQmJveCA9IFtvcmlnaW5YISwgb3JpZ2luWSEgKyByZXNZISAqIGgsIG9yaWdpblghICsgcmVzWCEgKiB3LCBvcmlnaW5ZIV0NCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCfml6Dms5Xojrflj5YgQ09HIGJib3gnKQ0KICAgIH0NCiAgfQ0KDQogIHNhbXBsZXNQZXJQaXhlbCA9IG1haW5JbWcuZ2V0U2FtcGxlc1BlclBpeGVsKCkNCg0KICAvLyDmo4DmtYsgQWxwaGENCiAgaGFzQWxwaGEgPSBmYWxzZQ0KICBpZiAoc2FtcGxlc1BlclBpeGVsID49IDQpIHsNCiAgICB0cnkgew0KICAgICAgY29uc3QgZmlsZURpciA9DQogICAgICAgIChtYWluSW1nIGFzIHVua25vd24gYXMgeyBmaWxlRGlyZWN0b3J5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkuZmlsZURpcmVjdG9yeSB8fA0KICAgICAgICAoYXdhaXQgKA0KICAgICAgICAgIG1haW5JbWcgYXMgdW5rbm93biBhcyB7IGdldEZpbGVEaXJlY3Rvcnk/OiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9DQogICAgICAgICkuZ2V0RmlsZURpcmVjdG9yeT8uKCkpIHx8DQogICAgICAgIHt9DQogICAgICBjb25zdCBleHRyYVNhbXBsZXMgPSBmaWxlRGlyLkV4dHJhU2FtcGxlcyBhcyBudW1iZXJbXSB8IHVuZGVmaW5lZA0KICAgICAgaWYgKGV4dHJhU2FtcGxlcyAmJiBleHRyYVNhbXBsZXMubGVuZ3RoID4gMCkNCiAgICAgICAgaGFzQWxwaGEgPSBleHRyYVNhbXBsZXNbMF0gPT09IDEgfHwgZXh0cmFTYW1wbGVzWzBdID09PSAyDQogICAgfSBjYXRjaCB7DQogICAgICAvKiBpZ25vcmUgKi8NCiAgICB9DQogIH0NCg0KICAvLyDmo4DmtYsgQ1JTDQogIGxldCBlcHNnOiBudW1iZXIgfCBudWxsID0gbnVsbA0KICB0cnkgew0KICAgIGNvbnN0IGdlb0tleXMgPSBtYWluSW1nLmdldEdlb0tleXMoKSBhcyB7DQogICAgICBQcm9qZWN0ZWRDU1R5cGVHZW9LZXk/OiBudW1iZXINCiAgICAgIEdlb2dyYXBoaWNUeXBlR2VvS2V5PzogbnVtYmVyDQogICAgfSB8IG51bGwNCiAgICBpZiAoZ2VvS2V5cykgZXBzZyA9IGdlb0tleXMuUHJvamVjdGVkQ1NUeXBlR2VvS2V5IHx8IGdlb0tleXMuR2VvZ3JhcGhpY1R5cGVHZW9LZXkgfHwgbnVsbA0KICB9IGNhdGNoIHsNCiAgICAvKiBpZ25vcmUgKi8NCiAgfQ0KICBjcnNUeXBlID0gZGV0ZWN0Q3JzVHlwZShjb2dCYm94ISwgZXBzZykNCg0KICBjb25zb2xlLmxvZygNCiAgICBgW0NPRzpJTklUXSBjcnNUeXBlPSR7Y3JzVHlwZX0sIGNvZ0Jib3g9WyR7KGNvZ0Jib3ghIGFzIG51bWJlcltdKS5tYXAoKHYpID0+IHYudG9GaXhlZCgxKSkuam9pbignLCcpfV0sIGVwc2c9JHtlcHNnfWAsDQogICkNCg0KICAvLyDovazmjaLkuLogV0dTODQg5bqmIGJib3gNCiAgbGV0IGJib3hEZWdyZWVzOiBudW1iZXJbXQ0KICBpZiAoaXNQcm9qZWN0ZWRDcnMoKSkgew0KICAgIGNvbnN0IFt3LCBzLCBlLCBuXSA9IGNvZ0Jib3ghIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdDQogICAgY29uc3QgaXNEZWcgPSBNYXRoLmFicyh3KSA8PSAxODAgJiYgTWF0aC5hYnMoZSkgPD0gMTgwICYmIE1hdGguYWJzKHMpIDw9IDkwICYmIE1hdGguYWJzKG4pIDw9IDkwDQogICAgaWYgKGlzRGVnKSB7DQogICAgICBiYm94RGVncmVlcyA9IGNvZ0Jib3ghDQogICAgICBiYm94SXNQcm9qZWN0ZWQgPSBmYWxzZQ0KICAgIH0gZWxzZSB7DQogICAgICBjb25zdCBbbG9uVywgbGF0U10gPSBwcm9qZWN0ZWRUb0RlZ3JlZXModywgcykNCiAgICAgIGNvbnN0IFtsb25FLCBsYXROXSA9IHByb2plY3RlZFRvRGVncmVlcyhlLCBuKQ0KICAgICAgaWYgKGlzRmluaXRlKGxvblcpICYmIGlzRmluaXRlKGxhdFMpICYmIGlzRmluaXRlKGxvbkUpICYmIGlzRmluaXRlKGxhdE4pKSB7DQogICAgICAgIGJib3hEZWdyZWVzID0gW2xvblcsIGxhdFMsIGxvbkUsIGxhdE5dDQogICAgICAgIGJib3hJc1Byb2plY3RlZCA9IHRydWUNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGJib3hEZWdyZWVzID0gY29nQmJveCENCiAgICAgICAgYmJveElzUHJvamVjdGVkID0gZmFsc2UNCiAgICAgIH0NCiAgICB9DQogIH0gZWxzZSB7DQogICAgYmJveERlZ3JlZXMgPSBjb2dCYm94IQ0KICAgIGJib3hJc1Byb2plY3RlZCA9IGZhbHNlDQogIH0NCg0KICBjb25zb2xlLmxvZygNCiAgICBgW0NPRzpJTklUXSBiYm94SXNQcm9qZWN0ZWQ9JHtiYm94SXNQcm9qZWN0ZWR9LCBiYm94RGVncmVlcz1bJHtiYm94RGVncmVlcy5tYXAoKHYpID0+IHYudG9GaXhlZCg0KSkuam9pbignLCcpfV1gLA0KICApDQoNCiAgLy8g6aKE6K6h566X5YiG6L6o546HDQogIGNvbnN0IFtjb2dXLCBjb2dTLCBjb2dFLCBjb2dOXSA9IGNvZ0Jib3ghIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdDQogIGNvbnN0IHNwYW4gPSBjb2dFIC0gY29nVw0KICBpbWFnZVJlc29sdXRpb25zID0gaW1hZ2VzLm1hcCgoaW1nKSA9PiBzcGFuIC8gaW1nLmdldFdpZHRoKCkpDQoNCiAgLy8g6K6h566XIG1heExldmVsDQogIGNvbnN0IGJib3hMb25TcGFuID0gYmJveERlZ3JlZXNbMl0hIC0gYmJveERlZ3JlZXNbMF0hDQogIGNvbnN0IGNvZ1JlcyA9IGJib3hMb25TcGFuIC8gbWFpbkltZy5nZXRXaWR0aCgpDQogIGxldCBtYXhMZXZlbCA9IE1hdGgubWluKDE3LCBNYXRoLmNlaWwoTWF0aC5sb2cyKDM2MCAvICgyNTYgKiBjb2dSZXMpKSkpDQoNCiAgLy8g6K6h566XIG1pbkxldmVs77yI5L2/55So5pyA5bCPIG92ZXJ2aWV3IOWBmuWGheWtmOmihOeul++8iQ0KICBjb25zdCBNQVhfVElMRV9CVUZGRVJfQllURVMgPSA2NCAqIDEwMjQgKiAxMDI0DQogIGNvbnN0IE1BWF9USUxFX1BJWEVMUyA9IE1BWF9USUxFX0JVRkZFUl9CWVRFUyAvIDQNCiAgY29uc3QgbGFzdEltZyA9IGltYWdlc1tpbWFnZXMubGVuZ3RoIC0gMV0hDQogIGNvbnN0IGVmZmVjdGl2ZUltZ1cgPSBNYXRoLm1heChsYXN0SW1nLmdldFdpZHRoKCksIDUxMikNCiAgY29uc3QgZWZmZWN0aXZlSW1nSCA9IE1hdGgubWF4KGxhc3RJbWcuZ2V0SGVpZ2h0KCksIDUxMikNCiAgY29uc3QgYmJveExhdFNwYW4gPSBiYm94RGVncmVlc1szXSEgLSBiYm94RGVncmVlc1sxXSENCiAgY29uc3QgY29nU3BhbiA9IE1hdGgubWF4KGJib3hMb25TcGFuLCBiYm94TGF0U3BhbikNCiAgbGV0IG1pbkxldmVsID0gMA0KICBpZiAoY29nU3BhbiA+IDApIHsNCiAgICBtaW5MZXZlbCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKDM2MCAvIGNvZ1NwYW4pKQ0KICAgIG1pbkxldmVsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWluTGV2ZWwsIG1heExldmVsKSkNCiAgfQ0KICBmb3IgKGxldCBsdmwgPSBtaW5MZXZlbDsgbHZsIDw9IG1heExldmVsOyBsdmwrKykgew0KICAgIGNvbnN0IHR3ID0gMzYwIC8gTWF0aC5wb3coMiwgbHZsICsgMSkNCiAgICBjb25zdCB0aCA9IDE4MCAvIE1hdGgucG93KDIsIGx2bCkNCiAgICBjb25zdCBydyA9DQogICAgICBNYXRoLmNlaWwoKChNYXRoLm1pbih0dywgYmJveExvblNwYW4pIC8gYmJveExvblNwYW4pICogZWZmZWN0aXZlSW1nVykgLyBibG9ja1NpemUpICogYmxvY2tTaXplDQogICAgY29uc3QgcmggPQ0KICAgICAgTWF0aC5jZWlsKCgoTWF0aC5taW4odGgsIGJib3hMYXRTcGFuKSAvIGJib3hMYXRTcGFuKSAqIGVmZmVjdGl2ZUltZ0gpIC8gYmxvY2tTaXplKSAqIGJsb2NrU2l6ZQ0KICAgIGlmIChydyAqIHJoIDw9IE1BWF9USUxFX1BJWEVMUykgew0KICAgICAgaWYgKGx2bCA+IG1pbkxldmVsKQ0KICAgICAgICBjb25zb2xlLmxvZygNCiAgICAgICAgICBgW0NPRzpJTklUXSBtaW5MZXZlbCDku44gJHttaW5MZXZlbH0g5o+Q5Y2H5YiwICR7bHZsfSAo55Om54mH57yT5a2YIH4keygocncgKiByaCAqIDQpIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMCl9TUIsIElGRCAke2ltYWdlcy5sZW5ndGggLSAxfSlgLA0KICAgICAgICApDQogICAgICBtaW5MZXZlbCA9IGx2bA0KICAgICAgYnJlYWsNCiAgICB9DQogIH0NCg0KICAvLyDkv67mraMgbWF4TGV2ZWzvvJrljZXlsYIgQ09HDQogIGlmIChpbWFnZUNvdW50IDw9IDEpIHsNCiAgICBsZXQgbGltaXRlZE1heCA9IG1heExldmVsDQogICAgZm9yIChsZXQgbHZsID0gbWF4TGV2ZWw7IGx2bCA+PSBtaW5MZXZlbDsgbHZsLS0pIHsNCiAgICAgIGNvbnN0IHRpbGVXID0gMzYwIC8gTWF0aC5wb3coMiwgbHZsICsgMSkNCiAgICAgIGNvbnN0IHRpbGVIID0gMTgwIC8gTWF0aC5wb3coMiwgbHZsKQ0KICAgICAgaWYgKE1hdGguY2VpbChiYm94TG9uU3BhbiAvIHRpbGVXKSAqIE1hdGguY2VpbChiYm94TGF0U3BhbiAvIHRpbGVIKSA8PSAxMDAwKSB7DQogICAgICAgIGxpbWl0ZWRNYXggPSBsdmwNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGxpbWl0ZWRNYXggPCBtYXhMZXZlbCkgew0KICAgICAgY29uc29sZS5sb2coYFtDT0c6SU5JVF0gbWF4TGV2ZWwg5LuOICR7bWF4TGV2ZWx9IOS/ruato+S4uiAke2xpbWl0ZWRNYXh9ICjljZXlsYIgQ09H77yM55Om54mH6L+H5aSaKWApDQogICAgICBtYXhMZXZlbCA9IGxpbWl0ZWRNYXgNCiAgICB9DQogIH0NCg0KICBjb25zb2xlLmxvZygNCiAgICBgW0NPR10g5Yid5aeL5YyW5a6M5oiQOiBFUFNHOiR7Y3JzVHlwZX0sICR7aW1hZ2VDb3VudH0g5bGCLCDkuLvlm74gJHttYWluSW1nLmdldFdpZHRoKCl9eCR7bWFpbkltZy5nZXRIZWlnaHQoKX0sIGAgKw0KICAgICAgYGJib3g9WyR7YmJveERlZ3JlZXMubWFwKCh2KSA9PiB2LnRvRml4ZWQoNCkpLmpvaW4oJywnKX1dLCBtYXhMZXZlbD0ke21heExldmVsfSwgbWluTGV2ZWw9JHttaW5MZXZlbH0sIHNhbXBsZXM9JHtzYW1wbGVzUGVyUGl4ZWx9YCwNCiAgKQ0KDQogIHJldHVybiB7IGJib3hEZWdyZWVzLCBjcnNUeXBlLCBtYXhMZXZlbCwgbWluTGV2ZWwsIG1haW5JbWcgfQ0KfQ0KDQovLyAtLS0tIFdvcmtlciDmtojmga/lpITnkIYgLS0tLQ0KDQpzZWxmLm9ubWVzc2FnZSA9IGFzeW5jIChlOiBNZXNzYWdlRXZlbnQ8V29ya2VySW5NZXNzYWdlPikgPT4gew0KICBjb25zdCB7IHR5cGUsIHBheWxvYWQsIHRhc2tJZCB9ID0gZS5kYXRhDQoNCiAgdHJ5IHsNCiAgICBzd2l0Y2ggKHR5cGUpIHsNCiAgICAgIGNhc2UgJ0xBWllfSU5JVCc6IHsNCiAgICAgICAgLy8g5oeS5Yid5aeL5YyW77ya5Y+q5a2YIFVSTO+8jOS4jeino+aekCBDT0fvvIzpppbmrKEgUFJPQ0VTU19USUxFIOaXtuWGjeWKoOi9vQ0KICAgICAgICBsYXp5VXJsID0gcGF5bG9hZC51cmwNCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7DQogICAgICAgICAgdHlwZTogJ0lOSVRfRE9ORScsDQogICAgICAgICAgdGFza0lkLA0KICAgICAgICAgIHBheWxvYWQ6IHsNCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsDQogICAgICAgICAgICBiYm94OiBbMCwgMCwgMCwgMF0sDQogICAgICAgICAgICBjcnNUeXBlOiAnNDMyNicsDQogICAgICAgICAgICBtYXhMZXZlbDogMTcsDQogICAgICAgICAgICBtaW5MZXZlbDogOSwNCiAgICAgICAgICB9LA0KICAgICAgICB9KQ0KICAgICAgICBicmVhaw0KICAgICAgfQ0KICAgICAgY2FzZSAnSU5JVCc6IHsNCiAgICAgICAgY29uc3QgeyB1cmwgfSA9IHBheWxvYWQNCiAgICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IF9mdWxsSW5pdCh1cmwpDQogICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoew0KICAgICAgICAgIHR5cGU6ICdJTklUX0RPTkUnLA0KICAgICAgICAgIHRhc2tJZCwNCiAgICAgICAgICBwYXlsb2FkOiB7DQogICAgICAgICAgICBzdWNjZXNzOiB0cnVlLA0KICAgICAgICAgICAgYmJveDogbWV0YS5iYm94RGVncmVlcywNCiAgICAgICAgICAgIGNyc1R5cGU6IG1ldGEuY3JzVHlwZSwNCiAgICAgICAgICAgIG1heExldmVsOiBtZXRhLm1heExldmVsLA0KICAgICAgICAgICAgbWluTGV2ZWw6IG1ldGEubWluTGV2ZWwsDQogICAgICAgICAgfSwNCiAgICAgICAgfSkNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCg0KICAgICAgY2FzZSAnUFJPQ0VTU19USUxFJzogew0KICAgICAgICBjb25zdCB7IHgsIHksIGxldmVsLCB0aWxlUmVjdCB9ID0gcGF5bG9hZA0KICAgICAgICBpZiAobGV2ZWwgPCAwIHx8IHggPCAwIHx8IHkgPCAwKSB7DQogICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgZW1wdHk6IHRydWUgfSB9KQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQoNCiAgICAgICAgLy8g5oeS5Yid5aeL5YyW77ya5aaC5p6cIHRpZmYg5pyq5Yid5aeL5YyW5L2GIGxhenlVcmwg5a2Y5Zyo77yM6aaW5qyh5L2/55So5YmN5Yqg6L29IENPRw0KICAgICAgICBpZiAoIXRpZmYgJiYgbGF6eVVybCkgew0KICAgICAgICAgIGlmICghX2luaXRMb2NrKSB7DQogICAgICAgICAgICBfaW5pdExvY2sgPSAoYXN5bmMgKCkgPT4gew0KICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGF3YWl0IF9mdWxsSW5pdChsYXp5VXJsISkNCiAgICAgICAgICAgICAgICBsYXp5VXJsID0gbnVsbA0KICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KICAgICAgICAgICAgICAgIF9pbml0TG9jayA9IG51bGwNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICAgIH0NCiAgICAgICAgICBhd2FpdCBfaW5pdExvY2sNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IFtjb2dXLCBjb2dTLCBjb2dFLCBjb2dOXSA9IGNvZ0Jib3ghIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdDQoNCiAgICAgICAgLy8g5bCG55Om54mH55+p5b2i57uf5LiA5YiwIENPRyDlnZDmoIfnqbrpl7QNCiAgICAgICAgbGV0IHRXOiBudW1iZXIsIHRTOiBudW1iZXIsIHRFOiBudW1iZXIsIHROOiBudW1iZXINCiAgICAgICAgaWYgKGJib3hJc1Byb2plY3RlZCkgew0KICAgICAgICAgIGNvbnN0IHN3ID0gZGVncmVlc1RvUHJvamVjdGVkKHRpbGVSZWN0Lndlc3QsIHRpbGVSZWN0LnNvdXRoKQ0KICAgICAgICAgIGNvbnN0IG5lID0gZGVncmVlc1RvUHJvamVjdGVkKHRpbGVSZWN0LmVhc3QsIHRpbGVSZWN0Lm5vcnRoKQ0KICAgICAgICAgIDtbdFcsIHRTXSA9IHN3DQogICAgICAgICAgO1t0RSwgdE5dID0gbmUNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0VyA9IHRpbGVSZWN0Lndlc3QNCiAgICAgICAgICB0UyA9IHRpbGVSZWN0LnNvdXRoDQogICAgICAgICAgdEUgPSB0aWxlUmVjdC5lYXN0DQogICAgICAgICAgdE4gPSB0aWxlUmVjdC5ub3J0aA0KICAgICAgICB9DQoNCiAgICAgICAgLy8g6K6h566X5Lqk6ZuGDQogICAgICAgIGNvbnN0IGludGVyVyA9IE1hdGgubWF4KHRXLCBjb2dXKQ0KICAgICAgICBjb25zdCBpbnRlclMgPSBNYXRoLm1heCh0UywgY29nUykNCiAgICAgICAgY29uc3QgaW50ZXJFID0gTWF0aC5taW4odEUsIGNvZ0UpDQogICAgICAgIGNvbnN0IGludGVyTiA9IE1hdGgubWluKHROLCBjb2dOKQ0KDQogICAgICAgIGlmIChpbnRlclcgPj0gaW50ZXJFIHx8IGludGVyUyA+PSBpbnRlck4pIHsNCiAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogJ1RJTEVfRE9ORScsIHRhc2tJZCwgcGF5bG9hZDogeyBlbXB0eTogdHJ1ZSB9IH0pDQogICAgICAgICAgcmV0dXJuDQogICAgICAgIH0NCg0KICAgICAgICAvLyDpgInmi6kgb3ZlcnZpZXcg5bGCDQogICAgICAgIGNvbnN0IHJlc05lZWRlZCA9ICh0RSAtIHRXKSAvIFRJTEVfU0laRQ0KICAgICAgICBjb25zdCBvdmVydmlld0JpYXMgPSBpc1Byb2plY3RlZENycygpID8gMS4wIDogMS4wDQogICAgICAgIGxldCBpbWFnZUluZGV4ID0gMA0KICAgICAgICBmb3IgKGxldCBpID0gaW1hZ2VSZXNvbHV0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgIGlmIChpbWFnZVJlc29sdXRpb25zW2ldISA8PSByZXNOZWVkZWQgKiBvdmVydmlld0JpYXMpIHsNCiAgICAgICAgICAgIGltYWdlSW5kZXggPSBpDQogICAgICAgICAgICBicmVhaw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIOi+heWKqe+8muiuoeeul+WcqOaMh+WumiBJRkQg5LiK6K+75Y+W55qE5a+56b2Q5Yy65Z+fDQogICAgICAgIGNvbnN0IGNhbGNBbGlnbmVkV2luZG93ID0gKGlmZElkeDogbnVtYmVyKTogQWxpZ25lZFdpbmRvdyA9PiB7DQogICAgICAgICAgY29uc3QgaW1nID0gaW1hZ2VzW2lmZElkeF0hDQogICAgICAgICAgY29uc3QgaXcgPSBpbWcuZ2V0V2lkdGgoKQ0KICAgICAgICAgIGNvbnN0IGloID0gaW1nLmdldEhlaWdodCgpDQogICAgICAgICAgY29uc3QgcnggPSBNYXRoLmZsb29yKCgoaW50ZXJXIC0gY29nVykgLyAoY29nRSAtIGNvZ1cpKSAqIGl3KQ0KICAgICAgICAgIGNvbnN0IHJ5ID0gTWF0aC5mbG9vcigoKGNvZ04gLSBpbnRlck4pIC8gKGNvZ04gLSBjb2dTKSkgKiBpaCkNCiAgICAgICAgICBjb25zdCBydyA9IE1hdGguY2VpbCgoKGludGVyRSAtIGludGVyVykgLyAoY29nRSAtIGNvZ1cpKSAqIGl3KQ0KICAgICAgICAgIGNvbnN0IHJoID0gTWF0aC5jZWlsKCgoaW50ZXJOIC0gaW50ZXJTKSAvIChjb2dOIC0gY29nUykpICogaWgpDQogICAgICAgICAgLy8g5a+56b2Q5YiwIGJsb2NrIOi+ueeVjA0KICAgICAgICAgIGNvbnN0IGF4ID0gTWF0aC5mbG9vcihyeCAvIGJsb2NrU2l6ZSkgKiBibG9ja1NpemUNCiAgICAgICAgICBjb25zdCBheSA9IE1hdGguZmxvb3IocnkgLyBibG9ja1NpemUpICogYmxvY2tTaXplDQogICAgICAgICAgY29uc3QgYXcgPSBNYXRoLm1pbihNYXRoLmNlaWwoKHJ4ICsgcncpIC8gYmxvY2tTaXplKSAqIGJsb2NrU2l6ZSAtIGF4LCBpdyAtIGF4KQ0KICAgICAgICAgIGNvbnN0IGFoID0gTWF0aC5taW4oTWF0aC5jZWlsKChyeSArIHJoKSAvIGJsb2NrU2l6ZSkgKiBibG9ja1NpemUgLSBheSwgaWggLSBheSkNCiAgICAgICAgICBjb25zdCBibG9ja3MgPSBNYXRoLmNlaWwoYXcgLyBibG9ja1NpemUpICogTWF0aC5jZWlsKGFoIC8gYmxvY2tTaXplKQ0KICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBibG9ja3MsDQogICAgICAgICAgICBpbWdXOiBpdywNCiAgICAgICAgICAgIGltZ0g6IGloLA0KICAgICAgICAgICAgcmVhZFg6IHJ4LA0KICAgICAgICAgICAgcmVhZFk6IHJ5LA0KICAgICAgICAgICAgcmVhZFc6IHJ3LA0KICAgICAgICAgICAgcmVhZEg6IHJoLA0KICAgICAgICAgICAgYWxpZ25lZFg6IGF4LA0KICAgICAgICAgICAgYWxpZ25lZFk6IGF5LA0KICAgICAgICAgICAgYWxpZ25lZFc6IGF3LA0KICAgICAgICAgICAgYWxpZ25lZEg6IGFoLA0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vIOS7juW9k+WJjSBJRkQg5byA5aeL77yM5bCd6K+V5om+5Yiw5Z2X5pWw5rKh6LaF6ZmQ55qEIElGRA0KICAgICAgICBsZXQgaW5mbyA9IGNhbGNBbGlnbmVkV2luZG93KGltYWdlSW5kZXgpDQogICAgICAgIGlmIChpbmZvLmJsb2NrcyA+IE1BWF9CTE9DS1NfUEVSX1RJTEUpIHsNCiAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZQ0KICAgICAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IGltYWdlSW5kZXggKyAxOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGNvbnN0IGFsdCA9IGNhbGNBbGlnbmVkV2luZG93KGkpDQogICAgICAgICAgICAgIGlmIChhbHQuYmxvY2tzIDw9IE1BWF9CTE9DS1NfUEVSX1RJTEUgfHwgaSA9PT0gaW1hZ2VzLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICBpbmZvID0gYWx0DQogICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9IGkNCiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWUNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vIOWNleWxgiBDT0cg5LiU6LaF6ZmQ5pe25LiN6L+U5Zue56m677yM55u05o6l55So5Y6f57uT5p6c57un57ut77yI6Jm954S25oWi5L2G5LiN5Ye656m655Om54mH77yJDQogICAgICAgICAgaWYgKCFmb3VuZCAmJiBpbWFnZXMubGVuZ3RoIDw9IDEpIHsNCiAgICAgICAgICAgIGNvbnNvbGUud2FybigNCiAgICAgICAgICAgICAgYFtDT0ddIOeTpueJhyAke3h9LCR7eX1AJHtsZXZlbH06IOWdl+aVsOi2hemZkCAoJHtpbmZvLmJsb2Nrc30gPiAke01BWF9CTE9DS1NfUEVSX1RJTEV9Ke+8jOS7jee7p+e7reWkhOeQhmAsDQogICAgICAgICAgICApDQogICAgICAgICAgICAvLyDkuI3ov5Tlm57nqbrvvIznu6fnu63lpITnkIYNCiAgICAgICAgICB9IGVsc2UgaWYgKCFmb3VuZCkgew0KICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgZW1wdHk6IHRydWUgfSB9KQ0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgeyByZWFkWCwgcmVhZFksIHJlYWRXLCByZWFkSCwgYWxpZ25lZFgsIGFsaWduZWRZLCBhbGlnbmVkVywgYWxpZ25lZEggfSA9IGluZm8NCg0KICAgICAgICBpZiAocmVhZFcgPD0gMCB8fCByZWFkSCA8PSAwKSB7DQogICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgZW1wdHk6IHRydWUgfSB9KQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQoNCiAgICAgICAgLy8g6K+75Y+W5rOi5q6177yI5bimIFdvcmtlciDlhoXpg6jnvJPlrZjvvIkNCiAgICAgICAgY29uc3Qgc2FtcGxlTGlzdDogbnVtYmVyW10gPSBoYXNBbHBoYQ0KICAgICAgICAgID8gWzAsIDEsIDIsIDNdDQogICAgICAgICAgOiBzYW1wbGVzUGVyUGl4ZWwgPj0gMw0KICAgICAgICAgICAgPyBbMCwgMSwgMl0NCiAgICAgICAgICAgIDogWzBdDQogICAgICAgIGNvbnN0IHdpbmRvd0tleSA9IGAke2ltYWdlSW5kZXh9XyR7YWxpZ25lZFh9XyR7YWxpZ25lZFl9XyR7YWxpZ25lZFd9XyR7YWxpZ25lZEh9XyR7c2FtcGxlTGlzdC5qb2luKCcsJyl9YA0KICAgICAgICBsZXQgcmFzdGVycyA9IGJsb2NrQ2FjaGUuZ2V0KHdpbmRvd0tleSkgYXMgVHlwZWRBcnJheVtdIHwgdW5kZWZpbmVkDQogICAgICAgIGlmICghcmFzdGVycykgew0KICAgICAgICAgIHJhc3RlcnMgPSAoYXdhaXQgaW1hZ2VzW2ltYWdlSW5kZXhdIS5yZWFkUmFzdGVycyh7DQogICAgICAgICAgICB3aW5kb3c6IFthbGlnbmVkWCwgYWxpZ25lZFksIGFsaWduZWRYICsgYWxpZ25lZFcsIGFsaWduZWRZICsgYWxpZ25lZEhdLA0KICAgICAgICAgICAgc2FtcGxlczogc2FtcGxlTGlzdCwNCiAgICAgICAgICB9KSkgYXMgVHlwZWRBcnJheVtdDQogICAgICAgICAgLy8g57yT5a2Y6Kej56CB57uT5p6c77yM5o6n5Yi257yT5a2Y5aSn5bCPDQogICAgICAgICAgaWYgKGJsb2NrQ2FjaGUuc2l6ZSA+IE1BWF9DQUNIRV9TSVpFKSB7DQogICAgICAgICAgICBjb25zdCBmaXJzdEtleSA9IGJsb2NrQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZQ0KICAgICAgICAgICAgaWYgKGZpcnN0S2V5KSBibG9ja0NhY2hlLmRlbGV0ZShmaXJzdEtleSBhcyBzdHJpbmcpDQogICAgICAgICAgfQ0KICAgICAgICAgIGJsb2NrQ2FjaGUuc2V0KHdpbmRvd0tleSwgcmFzdGVycykNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIOehruS/nSBzdGFnaW5nIGNhbnZhcyDotrPlpJ/lpKcNCiAgICAgICAgZW5zdXJlU3RhZ2luZ0NhbnZhcyhNYXRoLm1heChhbGlnbmVkVywgYWxpZ25lZEgpKQ0KDQogICAgICAgIC8vIOS9v+eUqOmihOWIhumFjeeahOWDj+e0oOe8k+WGsuWMug0KICAgICAgICBjb25zdCBwaXhlbENvdW50ID0gYWxpZ25lZFcgKiBhbGlnbmVkSA0KICAgICAgICBsZXQgcHgzMjogVWludDMyQXJyYXkgPSByZXVzYWJsZVB4MzINCiAgICAgICAgbGV0IHB4ODogVWludDhDbGFtcGVkQXJyYXkgPSByZXVzYWJsZVB4OA0KICAgICAgICBpZiAocGl4ZWxDb3VudCAqIDQgPiByZXVzYWJsZVBpeGVsQnVmZmVyLmJ5dGVMZW5ndGgpIHsNCiAgICAgICAgICBjb25zdCBiaWdCdWYgPSBuZXcgQXJyYXlCdWZmZXIocGl4ZWxDb3VudCAqIDQpDQogICAgICAgICAgcHgzMiA9IG5ldyBVaW50MzJBcnJheShiaWdCdWYpDQogICAgICAgICAgcHg4ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJpZ0J1ZikNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHIwID0gcmFzdGVyc1swXSENCiAgICAgICAgY29uc3QgbGVuID0gcjAubGVuZ3RoDQoNCiAgICAgICAgaWYgKGhhc0FscGhhKSB7DQogICAgICAgICAgY29uc3QgcjEgPSByYXN0ZXJzWzFdISwNCiAgICAgICAgICAgIHIyID0gcmFzdGVyc1syXSEsDQogICAgICAgICAgICByMyA9IHJhc3RlcnNbM10hDQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgY29uc3QgYSA9IHIzW2ldIQ0KICAgICAgICAgICAgcHgzMltpXSA9IGEgPCAzMCA/IDAgOiAoYSA8PCAyNCkgfCAocjJbaV0hIDw8IDE2KSB8IChyMVtpXSEgPDwgOCkgfCByMFtpXSENCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlc1BlclBpeGVsID49IDMpIHsNCiAgICAgICAgICBjb25zdCByMSA9IHJhc3RlcnNbMV0hLA0KICAgICAgICAgICAgcjIgPSByYXN0ZXJzWzJdIQ0KICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCiAgICAgICAgICAgIGNvbnN0IHIgPSByMFtpXSEsDQogICAgICAgICAgICAgIGcgPSByMVtpXSEsDQogICAgICAgICAgICAgIGIgPSByMltpXSENCiAgICAgICAgICAgIHB4MzJbaV0gPSByICsgZyArIGIgPCA5MCA/IDAgOiAoMHhmZjAwMDAwMCB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDANCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KICAgICAgICAgICAgY29uc3QgdiA9IHIwW2ldIQ0KICAgICAgICAgICAgcHgzMltpXSA9ICgweGZmMDAwMDAwIHwgKHYgPDwgMTYpIHwgKHYgPDwgOCkgfCB2KSA+Pj4gMA0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHJhd0ltZ0RhdGEgPSBuZXcgSW1hZ2VEYXRhKA0KICAgICAgICAgIHB4OC5zdWJhcnJheSgwLCBwaXhlbENvdW50ICogNCkgYXMgVWludDhDbGFtcGVkQXJyYXk8QXJyYXlCdWZmZXI+LA0KICAgICAgICAgIGFsaWduZWRXLA0KICAgICAgICAgIGFsaWduZWRILA0KICAgICAgICApDQogICAgICAgIHN0YWdpbmdDdHghLnB1dEltYWdlRGF0YShyYXdJbWdEYXRhLCAwLCAwKQ0KDQogICAgICAgIC8vIEdQVSDliqDpgJ/nvKnmlL4gKyDoo4HliarvvIhkcmF3SW1hZ2Ug6KaG55uW5YWo5Yy65Z+f77yM5peg6ZyAIGNsZWFyUmVjdO+8iQ0KICAgICAgICBjb25zdCBzcmNYID0gcmVhZFggLSBhbGlnbmVkWA0KICAgICAgICBjb25zdCBzcmNZID0gcmVhZFkgLSBhbGlnbmVkWQ0KICAgICAgICBjb25zdCBkZXN0VyA9IE1hdGgucm91bmQoKChpbnRlckUgLSBpbnRlclcpIC8gKHRFIC0gdFcpKSAqIFRJTEVfU0laRSkNCiAgICAgICAgY29uc3QgZGVzdEggPSBNYXRoLnJvdW5kKCgoaW50ZXJOIC0gaW50ZXJTKSAvICh0TiAtIHRTKSkgKiBUSUxFX1NJWkUpDQogICAgICAgIGNvbnN0IGRlc3RYID0gTWF0aC5mbG9vcigoKGludGVyVyAtIHRXKSAvICh0RSAtIHRXKSkgKiBUSUxFX1NJWkUpDQogICAgICAgIGNvbnN0IGRlc3RZID0gTWF0aC5mbG9vcigoKHROIC0gaW50ZXJOKSAvICh0TiAtIHRTKSkgKiBUSUxFX1NJWkUpDQogICAgICAgIHRpbGVDdHguZHJhd0ltYWdlKHN0YWdpbmdDYW52YXMsIHNyY1gsIHNyY1ksIHJlYWRXLCByZWFkSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpDQoNCiAgICAgICAgLy8gdHJhbnNmZXJUb0ltYWdlQml0bWFwIOavlCBjcmVhdGVJbWFnZUJpdG1hcCDmm7Tlv6vvvIznm7TmjqXovaznp7sgR1BVIOe6ueeQhuiAjOaXoOmcgOaLt+i0nQ0KICAgICAgICBjb25zdCBiaXRtYXAgPSB0aWxlQ2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpDQoNCiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICdUSUxFX0RPTkUnLCB0YXNrSWQsIHBheWxvYWQ6IHsgYml0bWFwLCBlbXB0eTogZmFsc2UgfSB9LCBbYml0bWFwXSkNCiAgICAgICAgYnJlYWsNCiAgICAgIH0NCg0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgYnJlYWsNCiAgICB9DQogIH0gY2F0Y2ggKGVycjogdW5rbm93bikgew0KICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikNCiAgICBjb25zdCBzdGFjayA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkDQogICAgY29uc29sZS5lcnJvcihgW0NPRyBXb3JrZXJdIOmUmeivryAodHlwZT0ke3R5cGV9LCB0YXNrSWQ9JHt0YXNrSWR9KTpgLCBtZXNzYWdlLCBzdGFjaykNCiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogJ0VSUk9SJywgdGFza0lkLCBwYXlsb2FkOiB7IGVycm9yOiBtZXNzYWdlIH0gfSkNCiAgfQ0KfQ0K", "" + import.meta.url);
|
|
165
|
+
return new Worker(g.href, { type: "module" });
|
|
166
|
+
}
|
|
167
|
+
J();
|
|
168
|
+
var H = {
|
|
169
169
|
poolSize: Math.max(2, Math.min(6, Math.floor((navigator.hardwareConcurrency || 4) / 2))),
|
|
170
170
|
maxLoadPerWorker: 8,
|
|
171
171
|
timeout: 3e4,
|
|
172
172
|
tileCacheSize: 512,
|
|
173
173
|
alpha: 1
|
|
174
|
-
},
|
|
174
|
+
}, Q = class {
|
|
175
175
|
tileWidth = 256;
|
|
176
176
|
tileHeight = 256;
|
|
177
|
-
tilingScheme = new
|
|
177
|
+
tilingScheme = new K();
|
|
178
178
|
hasAlphaChannel = !0;
|
|
179
179
|
ready = !0;
|
|
180
180
|
maximumLevel;
|
|
@@ -201,128 +201,128 @@ var q = {
|
|
|
201
201
|
0
|
|
202
202
|
];
|
|
203
203
|
_initialized = !1;
|
|
204
|
-
constructor(
|
|
205
|
-
this._url =
|
|
206
|
-
...
|
|
207
|
-
...
|
|
208
|
-
}, this._tileCache = new
|
|
209
|
-
|
|
204
|
+
constructor(g, I) {
|
|
205
|
+
this._url = g, this._options = {
|
|
206
|
+
...H,
|
|
207
|
+
...I
|
|
208
|
+
}, this._tileCache = new v(this._options.tileCacheSize, (C, A) => {
|
|
209
|
+
A.close();
|
|
210
210
|
}), this._emptyTile = document.createElement("canvas"), this._emptyTile.width = 256, this._emptyTile.height = 256;
|
|
211
211
|
}
|
|
212
212
|
async init() {
|
|
213
213
|
if (this._initialized) return;
|
|
214
214
|
if (this._destroyed) throw new Error("CogImageryProvider 已销毁");
|
|
215
|
-
this._workerPool = new
|
|
216
|
-
const
|
|
217
|
-
if (!
|
|
218
|
-
const
|
|
219
|
-
if (!isFinite(
|
|
220
|
-
const
|
|
221
|
-
this._bbox = this._normalizeBbox(
|
|
215
|
+
this._workerPool = new w(() => F(), this._options.poolSize, this._options.maxLoadPerWorker);
|
|
216
|
+
const g = await Promise.race([this._workerPool.initOne({ url: this._url }), new Promise((t, a) => setTimeout(() => a(/* @__PURE__ */ new Error("COG 初始化超时")), this._options.timeout))]);
|
|
217
|
+
if (!g || !Array.isArray(g.bbox) || g.bbox.length !== 4) throw new Error("COG 元数据无效: bbox 格式错误");
|
|
218
|
+
const I = g.bbox, C = I[0], A = I[1], i = I[2], e = I[3];
|
|
219
|
+
if (!isFinite(C) || !isFinite(A) || !isFinite(i) || !isFinite(e)) throw new Error("COG 元数据无效: bbox 包含非数值");
|
|
220
|
+
const o = g.maxLevel ?? 17, l = g.minLevel ?? Math.max(0, o - 8), c = g.crsType ?? "4326";
|
|
221
|
+
this._bbox = this._normalizeBbox(C, A, i, e, c), this.maximumLevel = o, this.minimumLevel = l, this.rectangle = V.fromDegrees(this._bbox[0], this._bbox[1], this._bbox[2], this._bbox[3]), this._errorEvent = new p(), this._initialized = !0, console.log(`[COG] 初始化完成, 级别 ${l}-${o}, bbox: [${this._bbox.join(", ")}]`);
|
|
222
222
|
}
|
|
223
|
-
_normalizeBbox(
|
|
224
|
-
if (Math.abs(
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
223
|
+
_normalizeBbox(g, I, C, A, i) {
|
|
224
|
+
if (Math.abs(g) <= 360 && Math.abs(C) <= 360 && Math.abs(I) <= 90 && Math.abs(A) <= 90) return [
|
|
225
|
+
g,
|
|
226
|
+
I,
|
|
227
|
+
C,
|
|
228
|
+
A
|
|
229
229
|
];
|
|
230
230
|
try {
|
|
231
|
-
const
|
|
232
|
-
if (isFinite(
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
231
|
+
const e = D(`EPSG:${i}`, "EPSG:4326"), o = e.forward([g, I]), l = e.forward([C, A]);
|
|
232
|
+
if (isFinite(o[0]) && isFinite(o[1]) && isFinite(l[0]) && isFinite(l[1]) && Math.abs(o[0]) <= 180 && Math.abs(l[0]) <= 180 && Math.abs(o[1]) <= 90 && Math.abs(l[1]) <= 90) return [
|
|
233
|
+
o[0],
|
|
234
|
+
o[1],
|
|
235
|
+
l[0],
|
|
236
|
+
l[1]
|
|
237
237
|
];
|
|
238
238
|
} catch {
|
|
239
239
|
}
|
|
240
|
-
throw new Error(`bbox 超出度坐标范围 [${
|
|
240
|
+
throw new Error(`bbox 超出度坐标范围 [${g}, ${I}, ${C}, ${A}],CRS=${i},转换失败`);
|
|
241
241
|
}
|
|
242
242
|
isDestroyed() {
|
|
243
243
|
return this._destroyed;
|
|
244
244
|
}
|
|
245
|
-
async requestImage(
|
|
245
|
+
async requestImage(g, I, C) {
|
|
246
246
|
if (this._destroyed || !this._initialized) return;
|
|
247
|
-
const [i,
|
|
248
|
-
if (
|
|
249
|
-
const
|
|
250
|
-
if (
|
|
251
|
-
const
|
|
252
|
-
return
|
|
247
|
+
const [A, i, e, o] = this._bbox, l = Math.pow(2, C + 1), c = Math.pow(2, C), t = 360 / l, a = 180 / c, b = g * t - 180, h = b + t, d = 90 - I * a, r = d - a;
|
|
248
|
+
if (h <= A || b >= e || d <= i || r >= o) return this._emptyTile;
|
|
249
|
+
const m = `${this._url}_${g}_${I}_${C}`, G = this._tileCache.get(m);
|
|
250
|
+
if (G) {
|
|
251
|
+
const n = document.createElement("canvas");
|
|
252
|
+
return n.width = G.width, n.height = G.height, n.getContext("2d").drawImage(G, 0, 0), n;
|
|
253
253
|
}
|
|
254
|
-
let
|
|
255
|
-
|
|
256
|
-
west:
|
|
257
|
-
south:
|
|
258
|
-
east:
|
|
259
|
-
north:
|
|
260
|
-
}), this._inflightRequests.set(
|
|
261
|
-
const
|
|
262
|
-
if (!
|
|
263
|
-
const
|
|
264
|
-
return
|
|
254
|
+
let Z = this._inflightRequests.get(m);
|
|
255
|
+
Z || (Z = this._fetchTile(m, g, I, C, {
|
|
256
|
+
west: b,
|
|
257
|
+
south: r,
|
|
258
|
+
east: h,
|
|
259
|
+
north: d
|
|
260
|
+
}), this._inflightRequests.set(m, Z));
|
|
261
|
+
const W = await Z;
|
|
262
|
+
if (!W) return this._emptyTile;
|
|
263
|
+
const s = document.createElement("canvas");
|
|
264
|
+
return s.width = W.width, s.height = W.height, s.getContext("2d").drawImage(W, 0, 0), s;
|
|
265
265
|
}
|
|
266
|
-
async _fetchTile(
|
|
266
|
+
async _fetchTile(g, I, C, A, i) {
|
|
267
267
|
try {
|
|
268
|
-
const
|
|
269
|
-
x:
|
|
270
|
-
y:
|
|
271
|
-
level:
|
|
272
|
-
tileRect:
|
|
268
|
+
const e = await this._workerPool.execute("PROCESS_TILE", {
|
|
269
|
+
x: I,
|
|
270
|
+
y: C,
|
|
271
|
+
level: A,
|
|
272
|
+
tileRect: i,
|
|
273
273
|
alpha: this._options.alpha
|
|
274
274
|
});
|
|
275
|
-
return !
|
|
275
|
+
return !e || e.empty || !e.bitmap ? null : (this._tileCache.set(g, e.bitmap), e.bitmap);
|
|
276
276
|
} finally {
|
|
277
|
-
this._inflightRequests.delete(
|
|
277
|
+
this._inflightRequests.delete(g);
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
destroy() {
|
|
281
281
|
this._destroyed = !0, this._workerPool?.terminate(), this._tileCache.clear(), this._inflightRequests.clear(), this._initialized = !1;
|
|
282
282
|
}
|
|
283
283
|
};
|
|
284
|
-
function
|
|
285
|
-
const
|
|
284
|
+
function k(g, I = 0.3) {
|
|
285
|
+
const C = g.east - g.west, A = g.north - g.south, i = C * I, e = A * I;
|
|
286
286
|
return {
|
|
287
|
-
west:
|
|
288
|
-
south:
|
|
289
|
-
east:
|
|
290
|
-
north:
|
|
287
|
+
west: g.west - i,
|
|
288
|
+
south: g.south - e,
|
|
289
|
+
east: g.east + i,
|
|
290
|
+
north: g.north + e
|
|
291
291
|
};
|
|
292
292
|
}
|
|
293
|
-
async function
|
|
294
|
-
const
|
|
295
|
-
return await
|
|
293
|
+
async function U(g, I) {
|
|
294
|
+
const C = new Q(g, I);
|
|
295
|
+
return await C.init(), C;
|
|
296
296
|
}
|
|
297
|
-
async function
|
|
298
|
-
const
|
|
299
|
-
await
|
|
300
|
-
const
|
|
301
|
-
if (
|
|
302
|
-
const
|
|
303
|
-
west:
|
|
304
|
-
south:
|
|
305
|
-
east:
|
|
306
|
-
north:
|
|
297
|
+
async function f(g, I, C) {
|
|
298
|
+
const A = new Q(I, C);
|
|
299
|
+
await A.init();
|
|
300
|
+
const i = g.imageryLayers.addImageryProvider(A);
|
|
301
|
+
if (i.alpha = C?.alpha ?? 1, C?.flyTo !== !1 && g.camera) {
|
|
302
|
+
const e = A.bboxDegrees, o = k({
|
|
303
|
+
west: e[0],
|
|
304
|
+
south: e[1],
|
|
305
|
+
east: e[2],
|
|
306
|
+
north: e[3]
|
|
307
307
|
}, 0.3);
|
|
308
|
-
|
|
308
|
+
g.camera.flyTo({
|
|
309
309
|
destination: {
|
|
310
|
-
west:
|
|
311
|
-
south:
|
|
312
|
-
east:
|
|
313
|
-
north:
|
|
310
|
+
west: o.west,
|
|
311
|
+
south: o.south,
|
|
312
|
+
east: o.east,
|
|
313
|
+
north: o.north
|
|
314
314
|
},
|
|
315
315
|
duration: 1.5
|
|
316
316
|
});
|
|
317
317
|
}
|
|
318
|
-
return
|
|
318
|
+
return i;
|
|
319
319
|
}
|
|
320
|
-
async function
|
|
321
|
-
const
|
|
322
|
-
await
|
|
323
|
-
const
|
|
324
|
-
for (let
|
|
325
|
-
const
|
|
320
|
+
async function x(g, I, C) {
|
|
321
|
+
const A = new Q(I, C);
|
|
322
|
+
await A.init();
|
|
323
|
+
const i = A.bboxDegrees, e = A.maximumLevel, o = A.minimumLevel, l = await R(), { TileGrid: c } = l.tilegrid, t = 256, a = [];
|
|
324
|
+
for (let m = 0; m <= e; m++) a.push(360 / (t * Math.pow(2, m + 1)));
|
|
325
|
+
const b = new c({
|
|
326
326
|
extent: [
|
|
327
327
|
-180,
|
|
328
328
|
-90,
|
|
@@ -330,43 +330,43 @@ async function Y(e, t, r) {
|
|
|
330
330
|
90
|
|
331
331
|
],
|
|
332
332
|
origin: [-180, 90],
|
|
333
|
-
resolutions:
|
|
334
|
-
tileSize: [
|
|
335
|
-
}),
|
|
333
|
+
resolutions: a,
|
|
334
|
+
tileSize: [t, t]
|
|
335
|
+
}), h = new l.source.TileImage({
|
|
336
336
|
projection: "EPSG:4326",
|
|
337
|
-
tileGrid:
|
|
338
|
-
tileUrlFunction: (
|
|
339
|
-
tileLoadFunction: (
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
if (
|
|
344
|
-
const
|
|
345
|
-
|
|
337
|
+
tileGrid: b,
|
|
338
|
+
tileUrlFunction: (m) => `cog://${m[0]}/${m[1]}/${m[2]}`,
|
|
339
|
+
tileLoadFunction: (m, G) => {
|
|
340
|
+
const Z = G.replace("cog://", "").split("/"), W = Number(Z[0]), s = Number(Z[1]), n = Number(Z[2]);
|
|
341
|
+
A.requestImage(s, n, W).then((y) => {
|
|
342
|
+
y && y.toBlob((B) => {
|
|
343
|
+
if (B) {
|
|
344
|
+
const Y = m.getImage();
|
|
345
|
+
Y.src = URL.createObjectURL(B);
|
|
346
346
|
}
|
|
347
347
|
});
|
|
348
348
|
}).catch(() => {
|
|
349
349
|
});
|
|
350
350
|
}
|
|
351
|
-
}),
|
|
352
|
-
source:
|
|
353
|
-
opacity:
|
|
351
|
+
}), d = new l.layer.Tile({
|
|
352
|
+
source: h,
|
|
353
|
+
opacity: C?.opacity ?? 1,
|
|
354
354
|
extent: [
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
355
|
+
i[0],
|
|
356
|
+
i[1],
|
|
357
|
+
i[2],
|
|
358
|
+
i[3]
|
|
359
359
|
],
|
|
360
|
-
minResolution:
|
|
361
|
-
maxResolution:
|
|
360
|
+
minResolution: a[Math.min(e, a.length - 1)],
|
|
361
|
+
maxResolution: a[Math.min(o, a.length - 1)]
|
|
362
362
|
});
|
|
363
|
-
|
|
364
|
-
const
|
|
365
|
-
return
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
363
|
+
g.addLayer(d);
|
|
364
|
+
const r = g.getView();
|
|
365
|
+
return r && r.fit([
|
|
366
|
+
i[0],
|
|
367
|
+
i[1],
|
|
368
|
+
i[2],
|
|
369
|
+
i[3]
|
|
370
370
|
], {
|
|
371
371
|
padding: [
|
|
372
372
|
50,
|
|
@@ -375,208 +375,208 @@ async function Y(e, t, r) {
|
|
|
375
375
|
50
|
|
376
376
|
],
|
|
377
377
|
duration: 1500
|
|
378
|
-
}),
|
|
378
|
+
}), d;
|
|
379
379
|
}
|
|
380
|
-
async function
|
|
380
|
+
async function R() {
|
|
381
381
|
try {
|
|
382
|
-
const
|
|
382
|
+
const g = (await import("ol/tilegrid/TileGrid")).default, I = (await import("ol/source/TileImage")).default, C = (await import("ol/layer/Tile")).default;
|
|
383
383
|
return {
|
|
384
|
-
tilegrid: { TileGrid:
|
|
385
|
-
source: { TileImage:
|
|
386
|
-
layer: { Tile:
|
|
384
|
+
tilegrid: { TileGrid: g },
|
|
385
|
+
source: { TileImage: I },
|
|
386
|
+
layer: { Tile: C }
|
|
387
387
|
};
|
|
388
388
|
} catch {
|
|
389
389
|
throw new Error("OpenLayers 依赖未找到,请安装: npm install ol");
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
|
-
function
|
|
393
|
-
const
|
|
392
|
+
function L(g) {
|
|
393
|
+
const I = /* @__PURE__ */ new Map();
|
|
394
394
|
return {
|
|
395
|
-
async addCogLayer(
|
|
396
|
-
const
|
|
397
|
-
if (!
|
|
398
|
-
const
|
|
395
|
+
async addCogLayer(C, A, i = {}) {
|
|
396
|
+
const e = g();
|
|
397
|
+
if (!e) throw new Error("Cesium Viewer 未初始化");
|
|
398
|
+
const o = {
|
|
399
399
|
alpha: 1,
|
|
400
400
|
flyTo: !0,
|
|
401
|
-
...
|
|
401
|
+
...i
|
|
402
402
|
};
|
|
403
|
-
let
|
|
403
|
+
let l = null, c = null;
|
|
404
404
|
try {
|
|
405
|
-
|
|
406
|
-
const
|
|
407
|
-
imageryLayer:
|
|
408
|
-
layerId:
|
|
409
|
-
provider:
|
|
410
|
-
bbox: [...
|
|
405
|
+
l = new Q(A, o), await l.init(), c = e.imageryLayers.addImageryProvider(l), c.alpha = o.alpha;
|
|
406
|
+
const t = l.bboxDegrees, a = {
|
|
407
|
+
imageryLayer: c,
|
|
408
|
+
layerId: C,
|
|
409
|
+
provider: l,
|
|
410
|
+
bbox: [...t]
|
|
411
411
|
};
|
|
412
|
-
if (
|
|
413
|
-
const [
|
|
414
|
-
|
|
415
|
-
destination:
|
|
412
|
+
if (I.set(C, a), o.flyTo !== !1) {
|
|
413
|
+
const [b, h, d, r] = t, m = d - b, G = r - h, Z = m * 0.3, W = G * 0.3, s = V.fromDegrees(b - Z, h - W, d + Z, r + W);
|
|
414
|
+
e.camera.flyTo({
|
|
415
|
+
destination: s,
|
|
416
416
|
duration: 1.5
|
|
417
417
|
});
|
|
418
418
|
}
|
|
419
|
-
return console.log("[COG] 加载成功:",
|
|
420
|
-
} catch (
|
|
421
|
-
if (
|
|
422
|
-
|
|
419
|
+
return console.log("[COG] 加载成功:", C), a;
|
|
420
|
+
} catch (t) {
|
|
421
|
+
if (l?.destroy(), c) try {
|
|
422
|
+
e.imageryLayers.remove(c, !0);
|
|
423
423
|
} catch {
|
|
424
424
|
}
|
|
425
|
-
throw
|
|
425
|
+
throw t;
|
|
426
426
|
}
|
|
427
427
|
},
|
|
428
|
-
removeCogLayer(
|
|
429
|
-
const
|
|
430
|
-
if (!
|
|
431
|
-
console.warn("[COG] 图层不存在:",
|
|
428
|
+
removeCogLayer(C) {
|
|
429
|
+
const A = I.get(C);
|
|
430
|
+
if (!A) {
|
|
431
|
+
console.warn("[COG] 图层不存在:", C);
|
|
432
432
|
return;
|
|
433
433
|
}
|
|
434
434
|
try {
|
|
435
|
-
|
|
436
|
-
const
|
|
437
|
-
|
|
435
|
+
A.provider.destroy();
|
|
436
|
+
const i = g();
|
|
437
|
+
i && (A.imageryLayer.show = !1, i.scene.requestRender(), requestAnimationFrame(() => {
|
|
438
438
|
try {
|
|
439
|
-
|
|
439
|
+
i.imageryLayers.remove(A.imageryLayer, !0), i.scene.requestRender();
|
|
440
440
|
} catch {
|
|
441
441
|
}
|
|
442
442
|
}));
|
|
443
|
-
} catch (
|
|
444
|
-
console.warn("[COG] 移除图层时出错:",
|
|
443
|
+
} catch (i) {
|
|
444
|
+
console.warn("[COG] 移除图层时出错:", i);
|
|
445
445
|
}
|
|
446
|
-
|
|
446
|
+
I.delete(C);
|
|
447
447
|
},
|
|
448
|
-
flyToCogLayer(
|
|
449
|
-
const
|
|
450
|
-
if (!
|
|
451
|
-
console.warn("[COG] 图层不存在:",
|
|
448
|
+
flyToCogLayer(C) {
|
|
449
|
+
const A = I.get(C);
|
|
450
|
+
if (!A) {
|
|
451
|
+
console.warn("[COG] 图层不存在:", C);
|
|
452
452
|
return;
|
|
453
453
|
}
|
|
454
|
-
const
|
|
455
|
-
if (!
|
|
456
|
-
const [
|
|
457
|
-
|
|
458
|
-
destination:
|
|
454
|
+
const i = g();
|
|
455
|
+
if (!i) return;
|
|
456
|
+
const [e, o, l, c] = A.bbox, t = (l - e) * 0.3, a = (c - o) * 0.3, b = V.fromDegrees(e - t, o - a, l + t, c + a);
|
|
457
|
+
i.camera.flyTo({
|
|
458
|
+
destination: b,
|
|
459
459
|
duration: 1.5
|
|
460
460
|
});
|
|
461
461
|
},
|
|
462
462
|
destroyCogTools() {
|
|
463
|
-
for (const [
|
|
464
|
-
|
|
463
|
+
for (const [C] of I) this.removeCogLayer(C);
|
|
464
|
+
I.clear();
|
|
465
465
|
}
|
|
466
466
|
};
|
|
467
467
|
}
|
|
468
|
-
function
|
|
469
|
-
const { baseUrl:
|
|
470
|
-
let
|
|
471
|
-
const
|
|
468
|
+
function j(g = {}) {
|
|
469
|
+
const { baseUrl: I = "/Cesium/", cogApiUrl: C = "http://localhost:5158/api/cog/list", cogStaticBaseUrl: A = "http://localhost:5158", viewerOptions: i = {} } = g, e = S(null), o = u([]), l = u(""), c = u(!1), t = u(null);
|
|
470
|
+
let a = null, b = null;
|
|
471
|
+
const h = async (s = "cesiumContainer") => {
|
|
472
472
|
try {
|
|
473
|
-
window.CESIUM_BASE_URL =
|
|
473
|
+
window.CESIUM_BASE_URL = I, N.RequestScheduler.maximumRequests = 100, N.RequestScheduler.maximumRequestsPerServer = 24, e.value = new N.Viewer(s, {
|
|
474
474
|
geocoder: !1,
|
|
475
475
|
animation: !1,
|
|
476
476
|
timeline: !1,
|
|
477
477
|
baseLayerPicker: !1,
|
|
478
|
-
terrainProvider: new
|
|
478
|
+
terrainProvider: new N.EllipsoidTerrainProvider(),
|
|
479
479
|
imagery: !1,
|
|
480
480
|
sun: !1,
|
|
481
481
|
moon: !1,
|
|
482
|
-
...
|
|
483
|
-
}),
|
|
482
|
+
...i
|
|
483
|
+
}), e.value.imageryLayers.length > 0 ? console.log("[CogManager] 当前已有底图,不再重复清理") : e.value.imageryLayers.addImageryProvider(new N.UrlTemplateImageryProvider({
|
|
484
484
|
url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
|
|
485
|
-
tilingScheme: new
|
|
485
|
+
tilingScheme: new N.WebMercatorTilingScheme(),
|
|
486
486
|
maximumLevel: 18
|
|
487
487
|
}));
|
|
488
|
-
const
|
|
489
|
-
|
|
490
|
-
} catch (
|
|
491
|
-
throw
|
|
488
|
+
const n = e.value.scene;
|
|
489
|
+
n.fog.enabled = !1, n.highDynamicRange = !1, n.globe.depthTestAgainstTerrain = !1, n.globe.baseColor = N.Color.fromCssColorString("#1a1a2e"), n.backgroundColor = N.Color.fromCssColorString("#1a1a2e"), n.skyAtmosphere && (n.skyAtmosphere.show = !1), n.light.enabled = !1, e.value.cesiumWidget.creditContainer && (e.value.cesiumWidget.creditContainer.style.display = "none"), await new Promise((y) => requestAnimationFrame(() => y())), a = L(() => e.value), t.value = null;
|
|
490
|
+
} catch (n) {
|
|
491
|
+
throw t.value = n.message || "Viewer 初始化失败", console.error("[CogManager] 初始化失败:", n), n;
|
|
492
492
|
}
|
|
493
|
-
},
|
|
493
|
+
}, d = async () => {
|
|
494
494
|
try {
|
|
495
|
-
const
|
|
496
|
-
clearTimeout(
|
|
497
|
-
name:
|
|
498
|
-
url:
|
|
499
|
-
})),
|
|
500
|
-
} catch (
|
|
501
|
-
console.error("[CogManager] 获取 COG 列表失败:",
|
|
495
|
+
const s = new AbortController(), n = setTimeout(() => s.abort(), 1e4), y = await fetch(C, { signal: s.signal });
|
|
496
|
+
clearTimeout(n), o.value = (await y.json()).map((B) => ({
|
|
497
|
+
name: B.name,
|
|
498
|
+
url: B.staticUrl.startsWith("http") ? B.staticUrl : `${A}${B.staticUrl}`
|
|
499
|
+
})), o.value.length > 0 && (l.value = o.value[0].url), t.value = null;
|
|
500
|
+
} catch (s) {
|
|
501
|
+
console.error("[CogManager] 获取 COG 列表失败:", s), o.value = [], t.value = "获取 COG 列表失败: " + (s.name === "AbortError" ? "请求超时" : s.message);
|
|
502
502
|
}
|
|
503
|
-
},
|
|
504
|
-
if (!(!
|
|
505
|
-
|
|
503
|
+
}, r = async () => {
|
|
504
|
+
if (!(!l.value || c.value)) {
|
|
505
|
+
c.value = !0, t.value = null;
|
|
506
506
|
try {
|
|
507
|
-
if (
|
|
507
|
+
if (b) {
|
|
508
508
|
try {
|
|
509
|
-
|
|
510
|
-
} catch (
|
|
511
|
-
console.warn("[CogManager] 移除旧图层时出错(继续加载):",
|
|
509
|
+
a?.removeCogLayer(b);
|
|
510
|
+
} catch (n) {
|
|
511
|
+
console.warn("[CogManager] 移除旧图层时出错(继续加载):", n);
|
|
512
512
|
}
|
|
513
|
-
|
|
513
|
+
b = null, await new Promise((n) => requestAnimationFrame(() => requestAnimationFrame(() => n())));
|
|
514
514
|
}
|
|
515
|
-
const
|
|
516
|
-
await
|
|
515
|
+
const s = "cog-layer-" + Date.now();
|
|
516
|
+
await a.addCogLayer(s, l.value, {
|
|
517
517
|
alpha: 1,
|
|
518
518
|
flyTo: !0
|
|
519
|
-
}),
|
|
520
|
-
} catch (
|
|
521
|
-
throw console.error("[CogManager] 加载失败:",
|
|
519
|
+
}), b = s, console.log("[CogManager] 加载成功:", s);
|
|
520
|
+
} catch (s) {
|
|
521
|
+
throw console.error("[CogManager] 加载失败:", s), t.value = s.message, s;
|
|
522
522
|
} finally {
|
|
523
|
-
|
|
523
|
+
c.value = !1;
|
|
524
524
|
}
|
|
525
525
|
}
|
|
526
|
-
},
|
|
527
|
-
if (!
|
|
528
|
-
|
|
526
|
+
}, m = () => {
|
|
527
|
+
if (!b) {
|
|
528
|
+
t.value = "没有可移除的图层";
|
|
529
529
|
return;
|
|
530
530
|
}
|
|
531
|
-
if (!
|
|
532
|
-
|
|
531
|
+
if (!a) {
|
|
532
|
+
t.value = "系统未初始化";
|
|
533
533
|
return;
|
|
534
534
|
}
|
|
535
|
-
console.log("[CogManager] 移除图层:",
|
|
536
|
-
},
|
|
537
|
-
if (!
|
|
538
|
-
|
|
535
|
+
console.log("[CogManager] 移除图层:", b), a.removeCogLayer(b), b = null, t.value = null;
|
|
536
|
+
}, G = () => {
|
|
537
|
+
if (!b) {
|
|
538
|
+
t.value = "没有可飞行的图层";
|
|
539
539
|
return;
|
|
540
540
|
}
|
|
541
|
-
if (!
|
|
542
|
-
|
|
541
|
+
if (!a) {
|
|
542
|
+
t.value = "系统未初始化";
|
|
543
543
|
return;
|
|
544
544
|
}
|
|
545
|
-
|
|
546
|
-
},
|
|
547
|
-
|
|
545
|
+
a.flyToCogLayer(b), t.value = null;
|
|
546
|
+
}, Z = async (s) => {
|
|
547
|
+
l.value = s;
|
|
548
548
|
try {
|
|
549
|
-
await
|
|
550
|
-
} catch (
|
|
551
|
-
console.error("[CogManager] 切换 COG 失败:",
|
|
549
|
+
await r();
|
|
550
|
+
} catch (n) {
|
|
551
|
+
console.error("[CogManager] 切换 COG 失败:", n);
|
|
552
552
|
}
|
|
553
|
-
},
|
|
554
|
-
|
|
553
|
+
}, W = () => {
|
|
554
|
+
a?.destroyCogTools(), e.value?.destroy(), e.value = null, a = null, b = null;
|
|
555
555
|
};
|
|
556
|
-
return
|
|
557
|
-
viewer:
|
|
558
|
-
cogList:
|
|
559
|
-
selectedCog:
|
|
560
|
-
isLoading:
|
|
561
|
-
error:
|
|
562
|
-
initViewer:
|
|
563
|
-
fetchCogList:
|
|
564
|
-
loadCOG:
|
|
565
|
-
removeCOG:
|
|
566
|
-
flyTo:
|
|
567
|
-
switchCog:
|
|
568
|
-
destroy:
|
|
556
|
+
return X(W), {
|
|
557
|
+
viewer: e,
|
|
558
|
+
cogList: o,
|
|
559
|
+
selectedCog: l,
|
|
560
|
+
isLoading: c,
|
|
561
|
+
error: t,
|
|
562
|
+
initViewer: h,
|
|
563
|
+
fetchCogList: d,
|
|
564
|
+
loadCOG: r,
|
|
565
|
+
removeCOG: m,
|
|
566
|
+
flyTo: G,
|
|
567
|
+
switchCog: Z,
|
|
568
|
+
destroy: W
|
|
569
569
|
};
|
|
570
570
|
}
|
|
571
571
|
export {
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
572
|
+
Q as CogImageryProvider,
|
|
573
|
+
v as LRUCache,
|
|
574
|
+
f as addCogLayerToMap,
|
|
575
|
+
x as addCogLayerToOpenLayers,
|
|
576
|
+
U as createCogProvider,
|
|
577
|
+
k as expandRectangle,
|
|
578
|
+
j as useCogManager,
|
|
579
|
+
L as useCogTif
|
|
580
580
|
};
|
|
581
581
|
|
|
582
582
|
//# sourceMappingURL=index.js.map
|