wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import { batch, createSignal, untrack } from "/node_modules/.vite/deps/solid-js.js?v=a1f48509";
import {
  closeSingleConnectionAPI,
  fetchProxiesAPI,
  fetchProxyProvidersAPI,
  proxyGroupLatencyTestAPI,
  proxyLatencyTestAPI,
  proxyProviderHealthCheckAPI,
  selectProxyInGroupAPI,
  updateProxyProviderAPI
} from "/@fs/E:/go_projects/metacubexd/src/apis/index.ts";
import { useStringBooleanMap } from "/@fs/E:/go_projects/metacubexd/src/helpers/index.ts";
import {
  autoCloseConns,
  latencyQualityMap,
  latencyTestTimeoutDuration,
  latestConnectionMsg,
  restructRawMsgToConnection,
  urlForLatencyTest
} from "/@fs/E:/go_projects/metacubexd/src/signals/index.ts";
const { map: collapsedMap, set: setCollapsedMap } = useStringBooleanMap();
const {
  map: proxyLatencyTestingMap,
  setWithCallback: setProxyLatencyTestingMap
} = useStringBooleanMap();
const {
  map: proxyGroupLatencyTestingMap,
  setWithCallback: setProxyGroupLatencyTestingMap
} = useStringBooleanMap();
const {
  map: proxyProviderLatencyTestingMap,
  setWithCallback: setProxyProviderLatencyTestingMap
} = useStringBooleanMap();
const { map: updatingMap, setWithCallback: setUpdatingMap } = useStringBooleanMap();
const [isAllProviderUpdating, setIsAllProviderUpdating] = createSignal(false);
const [proxies, setProxies] = createSignal([]);
const [proxyProviders, setProxyProviders] = createSignal([]);
const [latencyMap, setLatencyMap] = createSignal({});
const [proxyNodeMap, setProxyNodeMap] = createSignal(
  {}
);
const setProxiesInfo = (proxies2) => {
  const newProxyNodeMap = { ...proxyNodeMap() };
  const newLatencyMap = { ...latencyMap() };
  proxies2.forEach((proxy) => {
    const { udp, xudp, type, now, name, provider = "" } = proxy;
    const latency = proxy.history.at(-1)?.delay || latencyQualityMap().NOT_CONNECTED;
    newProxyNodeMap[proxy.name] = { udp, xudp, type, now, name, provider };
    newLatencyMap[proxy.name] = latency;
  });
  batch(() => {
    setProxyNodeMap(newProxyNodeMap);
    setLatencyMap(newLatencyMap);
  });
};
export const useProxies = () => {
  const fetchProxies = async () => {
    const [{ providers }, { proxies: proxies2 }] = await Promise.all([
      fetchProxyProvidersAPI(),
      fetchProxiesAPI()
    ]);
    const sortIndex = [...proxies2["GLOBAL"].all ?? [], "GLOBAL"];
    const sortedProxies = Object.values(proxies2).filter((proxy) => proxy.all?.length).sort(
      (prev, next) => sortIndex.indexOf(prev.name) - sortIndex.indexOf(next.name)
    );
    const sortedProviders = Object.values(providers).filter(
      (provider) => provider.name !== "default" && provider.vehicleType !== "Compatible"
    );
    const allProxies = [
      ...Object.values(proxies2),
      ...sortedProviders.flatMap(
        (provider) => provider.proxies.filter((proxy) => !(proxy.name in proxies2)).map((proxy) => ({
          ...proxy,
          provider: provider.name
        }))
      )
    ];
    batch(() => {
      setProxies(sortedProxies);
      setProxyProviders(sortedProviders);
      setProxiesInfo(allProxies);
    });
  };
  const selectProxyInGroup = async (proxy, proxyName) => {
    await selectProxyInGroupAPI(proxy.name, proxyName);
    await fetchProxies();
    if (autoCloseConns()) {
      untrack(() => {
        const activeConns = restructRawMsgToConnection(
          latestConnectionMsg()?.connections ?? [],
          []
        );
        if (activeConns.length > 0) {
          activeConns.forEach(({ id, chains }) => {
            if (chains.includes(proxy.name)) {
              closeSingleConnectionAPI(id);
            }
          });
        }
      });
    }
  };
  const proxyLatencyTest = (proxyName, provider) => setProxyLatencyTestingMap(proxyName, async () => {
    const { delay } = await proxyLatencyTestAPI(
      proxyName,
      provider,
      urlForLatencyTest(),
      latencyTestTimeoutDuration()
    );
    setLatencyMap((latencyMap2) => ({
      ...latencyMap2,
      [proxyName]: delay
    }));
  });
  const proxyGroupLatencyTest = (proxyGroupName) => setProxyGroupLatencyTestingMap(proxyGroupName, async () => {
    const newLatencyMap = await proxyGroupLatencyTestAPI(
      proxyGroupName,
      urlForLatencyTest(),
      latencyTestTimeoutDuration()
    );
    setLatencyMap((latencyMap2) => ({
      ...latencyMap2,
      ...newLatencyMap
    }));
    await fetchProxies();
  });
  const updateProviderByProviderName = (providerName) => setUpdatingMap(providerName, async () => {
    try {
      await updateProxyProviderAPI(providerName);
    } catch {
    }
    await fetchProxies();
  });
  const updateAllProvider = async () => {
    setIsAllProviderUpdating(true);
    try {
      await Promise.allSettled(
        proxyProviders().map(
          (provider) => updateProxyProviderAPI(provider.name)
        )
      );
      await fetchProxies();
    } finally {
      setIsAllProviderUpdating(false);
    }
  };
  const proxyProviderLatencyTest = (providerName) => setProxyProviderLatencyTestingMap(providerName, async () => {
    await proxyProviderHealthCheckAPI(providerName);
    await fetchProxies();
  });
  return {
    collapsedMap,
    setCollapsedMap,
    proxyLatencyTestingMap,
    proxyGroupLatencyTestingMap,
    proxyProviderLatencyTestingMap,
    updatingMap,
    isAllProviderUpdating,
    proxies,
    proxyProviders,
    proxyLatencyTest,
    proxyGroupLatencyTest,
    latencyMap,
    proxyNodeMap,
    fetchProxies,
    selectProxyInGroup,
    updateProviderByProviderName,
    updateAllProvider,
    proxyProviderLatencyTest
  };
};
 
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb3hpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmF0Y2gsIGNyZWF0ZVNpZ25hbCwgdW50cmFjayB9IGZyb20gJ3NvbGlkLWpzJ1xyXG5pbXBvcnQge1xyXG4gIGNsb3NlU2luZ2xlQ29ubmVjdGlvbkFQSSxcclxuICBmZXRjaFByb3hpZXNBUEksXHJcbiAgZmV0Y2hQcm94eVByb3ZpZGVyc0FQSSxcclxuICBwcm94eUdyb3VwTGF0ZW5jeVRlc3RBUEksXHJcbiAgcHJveHlMYXRlbmN5VGVzdEFQSSxcclxuICBwcm94eVByb3ZpZGVySGVhbHRoQ2hlY2tBUEksXHJcbiAgc2VsZWN0UHJveHlJbkdyb3VwQVBJLFxyXG4gIHVwZGF0ZVByb3h5UHJvdmlkZXJBUEksXHJcbn0gZnJvbSAnfi9hcGlzJ1xyXG5pbXBvcnQgeyB1c2VTdHJpbmdCb29sZWFuTWFwIH0gZnJvbSAnfi9oZWxwZXJzJ1xyXG5pbXBvcnQge1xyXG4gIGF1dG9DbG9zZUNvbm5zLFxyXG4gIGxhdGVuY3lRdWFsaXR5TWFwLFxyXG4gIGxhdGVuY3lUZXN0VGltZW91dER1cmF0aW9uLFxyXG4gIGxhdGVzdENvbm5lY3Rpb25Nc2csXHJcbiAgcmVzdHJ1Y3RSYXdNc2dUb0Nvbm5lY3Rpb24sXHJcbiAgdXJsRm9yTGF0ZW5jeVRlc3QsXHJcbn0gZnJvbSAnfi9zaWduYWxzJ1xyXG5pbXBvcnQgdHlwZSB7IFByb3h5LCBQcm94eU5vZGUsIFByb3h5UHJvdmlkZXIgfSBmcm9tICd+L3R5cGVzJ1xyXG5cclxudHlwZSBQcm94eUluZm8gPSB7XHJcbiAgbmFtZTogc3RyaW5nXHJcbiAgdWRwOiBib29sZWFuXHJcbiAgbm93OiBzdHJpbmdcclxuICB4dWRwOiBib29sZWFuXHJcbiAgdHlwZTogc3RyaW5nXHJcbiAgcHJvdmlkZXI6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQcm94eVdpdGhQcm92aWRlciA9IFByb3h5ICYgeyBwcm92aWRlcj86IHN0cmluZyB9XHJcbmV4cG9ydCB0eXBlIFByb3h5Tm9kZVdpdGhQcm92aWRlciA9IFByb3h5Tm9kZSAmIHsgcHJvdmlkZXI/OiBzdHJpbmcgfVxyXG5cclxuY29uc3QgeyBtYXA6IGNvbGxhcHNlZE1hcCwgc2V0OiBzZXRDb2xsYXBzZWRNYXAgfSA9IHVzZVN0cmluZ0Jvb2xlYW5NYXAoKVxyXG5jb25zdCB7XHJcbiAgbWFwOiBwcm94eUxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gIHNldFdpdGhDYWxsYmFjazogc2V0UHJveHlMYXRlbmN5VGVzdGluZ01hcCxcclxufSA9IHVzZVN0cmluZ0Jvb2xlYW5NYXAoKVxyXG5jb25zdCB7XHJcbiAgbWFwOiBwcm94eUdyb3VwTGF0ZW5jeVRlc3RpbmdNYXAsXHJcbiAgc2V0V2l0aENhbGxiYWNrOiBzZXRQcm94eUdyb3VwTGF0ZW5jeVRlc3RpbmdNYXAsXHJcbn0gPSB1c2VTdHJpbmdCb29sZWFuTWFwKClcclxuY29uc3Qge1xyXG4gIG1hcDogcHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gIHNldFdpdGhDYWxsYmFjazogc2V0UHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwLFxyXG59ID0gdXNlU3RyaW5nQm9vbGVhbk1hcCgpXHJcbmNvbnN0IHsgbWFwOiB1cGRhdGluZ01hcCwgc2V0V2l0aENhbGxiYWNrOiBzZXRVcGRhdGluZ01hcCB9ID1cclxuICB1c2VTdHJpbmdCb29sZWFuTWFwKClcclxuY29uc3QgW2lzQWxsUHJvdmlkZXJVcGRhdGluZywgc2V0SXNBbGxQcm92aWRlclVwZGF0aW5nXSA9IGNyZWF0ZVNpZ25hbChmYWxzZSlcclxuXHJcbi8vIHRoZXNlIHNpZ25hbHMgc2hvdWxkIGJlIGdsb2JhbCBzdGF0ZVxyXG5jb25zdCBbcHJveGllcywgc2V0UHJveGllc10gPSBjcmVhdGVTaWduYWw8UHJveHlXaXRoUHJvdmlkZXJbXT4oW10pXHJcbmNvbnN0IFtwcm94eVByb3ZpZGVycywgc2V0UHJveHlQcm92aWRlcnNdID0gY3JlYXRlU2lnbmFsPFxyXG4gIChQcm94eVByb3ZpZGVyICYgeyBwcm94aWVzOiBQcm94eU5vZGVXaXRoUHJvdmlkZXJbXSB9KVtdXHJcbj4oW10pXHJcblxyXG5jb25zdCBbbGF0ZW5jeU1hcCwgc2V0TGF0ZW5jeU1hcF0gPSBjcmVhdGVTaWduYWw8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oe30pXHJcbmNvbnN0IFtwcm94eU5vZGVNYXAsIHNldFByb3h5Tm9kZU1hcF0gPSBjcmVhdGVTaWduYWw8UmVjb3JkPHN0cmluZywgUHJveHlJbmZvPj4oXHJcbiAge30sXHJcbilcclxuXHJcbmNvbnN0IHNldFByb3hpZXNJbmZvID0gKFxyXG4gIHByb3hpZXM6IChQcm94eVdpdGhQcm92aWRlciB8IFByb3h5Tm9kZVdpdGhQcm92aWRlcilbXSxcclxuKSA9PiB7XHJcbiAgY29uc3QgbmV3UHJveHlOb2RlTWFwID0geyAuLi5wcm94eU5vZGVNYXAoKSB9XHJcbiAgY29uc3QgbmV3TGF0ZW5jeU1hcCA9IHsgLi4ubGF0ZW5jeU1hcCgpIH1cclxuXHJcbiAgcHJveGllcy5mb3JFYWNoKChwcm94eSkgPT4ge1xyXG4gICAgY29uc3QgeyB1ZHAsIHh1ZHAsIHR5cGUsIG5vdywgbmFtZSwgcHJvdmlkZXIgPSAnJyB9ID0gcHJveHlcclxuXHJcbiAgICBjb25zdCBsYXRlbmN5ID1cclxuICAgICAgcHJveHkuaGlzdG9yeS5hdCgtMSk/LmRlbGF5IHx8IGxhdGVuY3lRdWFsaXR5TWFwKCkuTk9UX0NPTk5FQ1RFRFxyXG5cclxuICAgIG5ld1Byb3h5Tm9kZU1hcFtwcm94eS5uYW1lXSA9IHsgdWRwLCB4dWRwLCB0eXBlLCBub3csIG5hbWUsIHByb3ZpZGVyIH1cclxuICAgIG5ld0xhdGVuY3lNYXBbcHJveHkubmFtZV0gPSBsYXRlbmN5XHJcbiAgfSlcclxuXHJcbiAgYmF0Y2goKCkgPT4ge1xyXG4gICAgc2V0UHJveHlOb2RlTWFwKG5ld1Byb3h5Tm9kZU1hcClcclxuICAgIHNldExhdGVuY3lNYXAobmV3TGF0ZW5jeU1hcClcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgdXNlUHJveGllcyA9ICgpID0+IHtcclxuICBjb25zdCBmZXRjaFByb3hpZXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBbeyBwcm92aWRlcnMgfSwgeyBwcm94aWVzIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICBmZXRjaFByb3h5UHJvdmlkZXJzQVBJKCksXHJcbiAgICAgIGZldGNoUHJveGllc0FQSSgpLFxyXG4gICAgXSlcclxuXHJcbiAgICBjb25zdCBzb3J0SW5kZXggPSBbLi4uKHByb3hpZXNbJ0dMT0JBTCddLmFsbCA/PyBbXSksICdHTE9CQUwnXVxyXG4gICAgY29uc3Qgc29ydGVkUHJveGllcyA9IE9iamVjdC52YWx1ZXMocHJveGllcylcclxuICAgICAgLmZpbHRlcigocHJveHkpID0+IHByb3h5LmFsbD8ubGVuZ3RoKVxyXG4gICAgICAuc29ydChcclxuICAgICAgICAocHJldiwgbmV4dCkgPT5cclxuICAgICAgICAgIHNvcnRJbmRleC5pbmRleE9mKHByZXYubmFtZSkgLSBzb3J0SW5kZXguaW5kZXhPZihuZXh0Lm5hbWUpLFxyXG4gICAgICApXHJcbiAgICBjb25zdCBzb3J0ZWRQcm92aWRlcnMgPSBPYmplY3QudmFsdWVzKHByb3ZpZGVycykuZmlsdGVyKFxyXG4gICAgICAocHJvdmlkZXIpID0+XHJcbiAgICAgICAgcHJvdmlkZXIubmFtZSAhPT0gJ2RlZmF1bHQnICYmIHByb3ZpZGVyLnZlaGljbGVUeXBlICE9PSAnQ29tcGF0aWJsZScsXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgYWxsUHJveGllcyA9IFtcclxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm94aWVzKSxcclxuICAgICAgLi4uc29ydGVkUHJvdmlkZXJzLmZsYXRNYXAoKHByb3ZpZGVyKSA9PlxyXG4gICAgICAgIHByb3ZpZGVyLnByb3hpZXNcclxuICAgICAgICAgIC5maWx0ZXIoKHByb3h5KSA9PiAhKHByb3h5Lm5hbWUgaW4gcHJveGllcykpXHJcbiAgICAgICAgICAubWFwKChwcm94eSkgPT4gKHtcclxuICAgICAgICAgICAgLi4ucHJveHksXHJcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwcm92aWRlci5uYW1lLFxyXG4gICAgICAgICAgfSkpLFxyXG4gICAgICApLFxyXG4gICAgXVxyXG5cclxuICAgIGJhdGNoKCgpID0+IHtcclxuICAgICAgc2V0UHJveGllcyhzb3J0ZWRQcm94aWVzKVxyXG4gICAgICBzZXRQcm94eVByb3ZpZGVycyhzb3J0ZWRQcm92aWRlcnMpXHJcbiAgICAgIHNldFByb3hpZXNJbmZvKGFsbFByb3hpZXMpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2VsZWN0UHJveHlJbkdyb3VwID0gYXN5bmMgKHByb3h5OiBQcm94eSwgcHJveHlOYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIGF3YWl0IHNlbGVjdFByb3h5SW5Hcm91cEFQSShwcm94eS5uYW1lLCBwcm94eU5hbWUpXHJcbiAgICBhd2FpdCBmZXRjaFByb3hpZXMoKVxyXG5cclxuICAgIGlmIChhdXRvQ2xvc2VDb25ucygpKSB7XHJcbiAgICAgIC8vIHdlIGRvbid0IHVzZSBhY3RpdmVDb25ucyBmcm9tIHVzZUNvbm5lY3Rpb24gaGVyZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLFxyXG4gICAgICAvLyBhbmQgd2UgdXNlIGVtcHR5IGFycmF5IHRvIHJlc3RydWN0IG1zZyBiZWNhdXNlIHRoZXkgYXJlIGNsb3NlZCwgdGhleSB3b24ndCBoYXZlIHNwZWVkIGFueXdheVxyXG4gICAgICB1bnRyYWNrKCgpID0+IHtcclxuICAgICAgICBjb25zdCBhY3RpdmVDb25ucyA9IHJlc3RydWN0UmF3TXNnVG9Db25uZWN0aW9uKFxyXG4gICAgICAgICAgbGF0ZXN0Q29ubmVjdGlvbk1zZygpPy5jb25uZWN0aW9ucyA/PyBbXSxcclxuICAgICAgICAgIFtdLFxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUNvbm5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGFjdGl2ZUNvbm5zLmZvckVhY2goKHsgaWQsIGNoYWlucyB9KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGFpbnMuaW5jbHVkZXMocHJveHkubmFtZSkpIHtcclxuICAgICAgICAgICAgICBjbG9zZVNpbmdsZUNvbm5lY3Rpb25BUEkoaWQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcHJveHlMYXRlbmN5VGVzdCA9IChwcm94eU5hbWU6IHN0cmluZywgcHJvdmlkZXI6IHN0cmluZykgPT5cclxuICAgIHNldFByb3h5TGF0ZW5jeVRlc3RpbmdNYXAocHJveHlOYW1lLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGVsYXkgfSA9IGF3YWl0IHByb3h5TGF0ZW5jeVRlc3RBUEkoXHJcbiAgICAgICAgcHJveHlOYW1lLFxyXG4gICAgICAgIHByb3ZpZGVyLFxyXG4gICAgICAgIHVybEZvckxhdGVuY3lUZXN0KCksXHJcbiAgICAgICAgbGF0ZW5jeVRlc3RUaW1lb3V0RHVyYXRpb24oKSxcclxuICAgICAgKVxyXG5cclxuICAgICAgc2V0TGF0ZW5jeU1hcCgobGF0ZW5jeU1hcCkgPT4gKHtcclxuICAgICAgICAuLi5sYXRlbmN5TWFwLFxyXG4gICAgICAgIFtwcm94eU5hbWVdOiBkZWxheSxcclxuICAgICAgfSkpXHJcbiAgICB9KVxyXG5cclxuICBjb25zdCBwcm94eUdyb3VwTGF0ZW5jeVRlc3QgPSAocHJveHlHcm91cE5hbWU6IHN0cmluZykgPT5cclxuICAgIHNldFByb3h5R3JvdXBMYXRlbmN5VGVzdGluZ01hcChwcm94eUdyb3VwTmFtZSwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdMYXRlbmN5TWFwID0gYXdhaXQgcHJveHlHcm91cExhdGVuY3lUZXN0QVBJKFxyXG4gICAgICAgIHByb3h5R3JvdXBOYW1lLFxyXG4gICAgICAgIHVybEZvckxhdGVuY3lUZXN0KCksXHJcbiAgICAgICAgbGF0ZW5jeVRlc3RUaW1lb3V0RHVyYXRpb24oKSxcclxuICAgICAgKVxyXG5cclxuICAgICAgc2V0TGF0ZW5jeU1hcCgobGF0ZW5jeU1hcCkgPT4gKHtcclxuICAgICAgICAuLi5sYXRlbmN5TWFwLFxyXG4gICAgICAgIC4uLm5ld0xhdGVuY3lNYXAsXHJcbiAgICAgIH0pKVxyXG5cclxuICAgICAgYXdhaXQgZmV0Y2hQcm94aWVzKClcclxuICAgIH0pXHJcblxyXG4gIGNvbnN0IHVwZGF0ZVByb3ZpZGVyQnlQcm92aWRlck5hbWUgPSAocHJvdmlkZXJOYW1lOiBzdHJpbmcpID0+XHJcbiAgICBzZXRVcGRhdGluZ01hcChwcm92aWRlck5hbWUsIGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB1cGRhdGVQcm94eVByb3ZpZGVyQVBJKHByb3ZpZGVyTmFtZSlcclxuICAgICAgfSBjYXRjaCB7fVxyXG4gICAgICBhd2FpdCBmZXRjaFByb3hpZXMoKVxyXG4gICAgfSlcclxuXHJcbiAgY29uc3QgdXBkYXRlQWxsUHJvdmlkZXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBzZXRJc0FsbFByb3ZpZGVyVXBkYXRpbmcodHJ1ZSlcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcclxuICAgICAgICBwcm94eVByb3ZpZGVycygpLm1hcCgocHJvdmlkZXIpID0+XHJcbiAgICAgICAgICB1cGRhdGVQcm94eVByb3ZpZGVyQVBJKHByb3ZpZGVyLm5hbWUpLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgYXdhaXQgZmV0Y2hQcm94aWVzKClcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHNldElzQWxsUHJvdmlkZXJVcGRhdGluZyhmYWxzZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdCA9IChwcm92aWRlck5hbWU6IHN0cmluZykgPT5cclxuICAgIHNldFByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdGluZ01hcChwcm92aWRlck5hbWUsIGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgcHJveHlQcm92aWRlckhlYWx0aENoZWNrQVBJKHByb3ZpZGVyTmFtZSlcclxuICAgICAgYXdhaXQgZmV0Y2hQcm94aWVzKClcclxuICAgIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjb2xsYXBzZWRNYXAsXHJcbiAgICBzZXRDb2xsYXBzZWRNYXAsXHJcbiAgICBwcm94eUxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gICAgcHJveHlHcm91cExhdGVuY3lUZXN0aW5nTWFwLFxyXG4gICAgcHJveHlQcm92aWRlckxhdGVuY3lUZXN0aW5nTWFwLFxyXG4gICAgdXBkYXRpbmdNYXAsXHJcbiAgICBpc0FsbFByb3ZpZGVyVXBkYXRpbmcsXHJcbiAgICBwcm94aWVzLFxyXG4gICAgcHJveHlQcm92aWRlcnMsXHJcbiAgICBwcm94eUxhdGVuY3lUZXN0LFxyXG4gICAgcHJveHlHcm91cExhdGVuY3lUZXN0LFxyXG4gICAgbGF0ZW5jeU1hcCxcclxuICAgIHByb3h5Tm9kZU1hcCxcclxuICAgIGZldGNoUHJveGllcyxcclxuICAgIHNlbGVjdFByb3h5SW5Hcm91cCxcclxuICAgIHVwZGF0ZVByb3ZpZGVyQnlQcm92aWRlck5hbWUsXHJcbiAgICB1cGRhdGVBbGxQcm92aWRlcixcclxuICAgIHByb3h5UHJvdmlkZXJMYXRlbmN5VGVzdCxcclxuICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLE9BQU8sY0FBYyxlQUFlO0FBQzdDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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