├── .github
└── workflows
│ └── updateclash.yaml
├── .gitignore
├── .idea
├── .gitignore
├── modules.xml
├── proxypool.iml
└── vcs.xml
├── LICENSE
├── README.md
├── cdn
├── FastlyIpRange.txt
├── GcoreIpRange.txt
└── cloudflare
│ ├── CloudflareIpRange.txt
│ ├── CloudflarePremiumDomain.txt
│ └── CloudflarePremiumIp.txt
├── config
└── config.go
├── go.mod
├── go.sum
├── main.go
├── script
├── alive.sh
├── rebase.sh
├── result.log
└── test.sh
├── source
├── clash-meta-2.yaml
├── clash-meta.yaml
├── nodelist.txt
├── proxies.txt
├── tgchannel.json
├── v2ray-2.txt
├── v2ray.txt
└── webfuzz.yaml
├── spider
├── IP2LOCATION-LITE-DB1.BIN
├── clash.go
├── flags.json
├── fuzzy.go
├── getter.go
├── mypool.go
├── sharelink.go
├── spider.go
└── v2ray.go
└── tools
├── httpclient.go
├── randstr.go
├── snowflake.go
└── tools.go
/.github/workflows/updateclash.yaml:
--------------------------------------------------------------------------------
1 | name: update clash-meta.yaml
2 |
3 | on:
4 | push:
5 | paths-ignore:
6 | - "README.md"
7 | - "script/**"
8 | - "source/**"
9 | - ".gitignore"
10 | branches:
11 | - main
12 | schedule:
13 | - cron: '0 */6 * * *'
14 |
15 | jobs:
16 | Build:
17 | permissions: write-all
18 | runs-on: ubuntu-latest
19 | steps:
20 | - uses: actions/checkout@v4
21 | with:
22 | persist-credentials: false
23 | fetch-depth: 0
24 |
25 | - name: Update Clash 1
26 | run: |
27 | curl -L ${{ secrets.V2RAY_API }} > source/v2ray.txt
28 | curl -L ${{ secrets.CLASH_API }} > source/clash-meta.yaml
29 | rand=_$(date +%s%N | md5sum |cut -c 2-6)_
30 | sed -i "s/${{ secrets.CLASH_REPLACE }}/$rand/g" source/clash-meta.yaml
31 |
32 | - name: Update Clash 2
33 | run: |
34 | curl ${{ secrets.CLASH_API_2 }} > source/clash-meta-2.yaml
35 | curl ${{ secrets.V2RAY_API_2 }} > source/v2ray-2.txt
36 |
37 | - name: Commit files
38 | run: |
39 | git config --local user.email "snakem982@gmail.com"
40 | git config --local user.name "snakem982"
41 | git add -A
42 | git commit -a -m "Updated $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M %Z')" --allow-empty
43 |
44 | - name: Git Push
45 | uses: ad-m/github-push-action@master
46 | with:
47 | github_token: ${{ secrets.GITHUB_TOKEN }}
48 | branch: ${{ github.ref }}
49 |
50 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /test/
2 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/proxypool.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # proxypool
2 |
3 | 
4 | 
5 |
6 | Mihomo/Clash.Meta/Clash 节点池.
7 |
8 | Mihomo/Clash.Meta/Clash node aggregation.
9 |
10 | ##
温馨提示
Friendly Reminder
11 |
12 | 节点链接来自公开在互联网上的信息,不保证财产信息安全和稳定性。不建议长期使用!!!
13 | Nodes come from information published on the Internet,
14 | which does not guarantee the security and stability of property information.
15 | Long-term use is not recommended! ! !
16 | 为什么不安全?请观看大佬讲解
17 |
18 | - https://www.youtube.com/watch?v=vuF6rDLp3pg
19 | - https://www.youtube.com/watch?v=7yTpdsOF8us
20 |
21 | 若要持续、稳定、安全、高速的节点请自建,
22 | 推荐使用Tuic,Hysteria2,Juicity协议套上Tls,任何时候稳定输出,
23 | 下面是免实名免备案的高性价比 **德国、美国** 云服务器推荐:
24 | If you want a continuous, stable, safe, and high-speed node, please build it yourself.
25 | The following is a self-built node cost-effective cloud server recommendation:
26 |
27 | **美国服务器**(支付宝)
28 |
29 | | 序号 | 流量/月 | 网速 | CPU核数 | 运行内存 | 硬盘 | 美元/年 | 查看详情 |
30 | |:--:|:-----:|:-----:|:-----:|:-----:|:-----:|:------:|:------------------------------------------------------------------:|
31 | | 1 | 20T | 1Gbps | 1 | 1 G | 25 GB | $10 | [链接](https://cloud.colocrossing.com/aff.php?aff=821&pid=49 "点击查看") |
32 | | 2 | 2000G | 1Gbps | 1 | 1 G | 20 GB | $10.96 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=912 "点击查看") |
33 | | 3 | 3000G | 1Gbps | 1 | 1 G | 17 GB | $10.98 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=358 "点击查看") |
34 | | 4 | 20T | 1Gbps | 1 | 1 G | 20 GB | $12 | [链接](https://cloud.colocrossing.com/aff.php?aff=821&pid=33 "点击查看") |
35 | | 5 | 2000G | 1Gbps | 1 | 1 G | 24 GB | $11.29 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=903 "点击查看") |
36 | | 6 | 4000G | 1Gbps | 2 | 2 G | 30 GB | $17.66 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=913 "点击查看") |
37 | | 7 | 3500G | 1Gbps | 1 | 2 G | 40 GB | $18.29 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=904 "点击查看") |
38 | | 8 | 20T | 1Gbps | 1 | 2 G | 40 GB | $20 | [链接](https://cloud.colocrossing.com/aff.php?aff=821&pid=34 "点击查看") |
39 | | 9 | 5000G | 1Gbps | 3 | 3.5 G | 60 GB | $29.89 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=914 "点击查看") |
40 | | 10 | 7000G | 1Gbps | 2 | 3.5 G | 65 GB | $32.49 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=905 "点击查看") |
41 |
42 |
43 |
44 | **香港服务器** (需要注册登录后查看)
45 |
46 | | 序号 | 流量/月 | 网速 | CPU核数 | 运行内存 | 硬盘 | 人民币/年 | 查看详情 |
47 | |:--:|:----:|:-------:|:-----:|:----:|:-----:|:-----:|:-----------------------------------------------------:|
48 | | 1 | 600G | 100Mbps | 2 | 2 G | 30 GB | ¥99 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") |
49 | | 2 | 600G | 100Mbps | 1 | 2 G | 30 GB | ¥128 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") |
50 | | 3 | 600G | 100Mbps | 2 | 4 G | 50 GB | ¥188 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") |
51 | | 4 | 600G | 100Mbps | 2 | 4 G | 50 GB | ¥228 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") |
52 | | 5 | 800G | 100Mbps | 4 | 8 G | 90 GB | ¥288 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") |
53 | | 6 | 800G | 100Mbps | 4 | 8 G | 90 GB | ¥358 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") |
54 |
55 | **德国服务器** (PayPal)
56 |
57 | | 序号 | 流量/月 | 网速 | CPU核数 | 运行内存 | 硬盘 | 价格 | 查看详情 |
58 | |:--:|:----:|:-----:|:-----:|:----:|:-----:|:------------:|:-------------------------------------------------------------------:|
59 | | 1 | 20T | 1Gbps | 1 | 1 G | 32 GB | 9.99美元/1年 | [链接](https://portal.massivegrid.com/aff.php?aff=277&pid=896 "点击查看") |
60 | | 2 | 20T | 1Gbps | 1 | 1 G | 10 GB | 10.29美元/1年 | [链接](https://my.dasabo.com/aff.php?aff=51&pid=173 "点击查看") |
61 | | 3 | 20T | 1Gbps | 1 | 1 G | 32 GB | 18.65美元/2年 | [链接](https://portal.massivegrid.com/aff.php?aff=277&pid=896 "点击查看") |
62 | | 4 | 20T | 1Gbps | 1 | 1 G | 32 GB | 23.98美元/4年 | [链接](https://portal.massivegrid.com/aff.php?aff=277&pid=896 "点击查看") |
63 |
64 |
65 | ##
订阅地址或分享链接在如下文件里
The subscription address or sharing link is in the following file
66 |
67 | ### clash.meta/mihomo 订阅地址
68 |
69 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta.yaml
70 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta-2.yaml
71 |
72 | ### v2ray 订阅地址
73 |
74 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/v2ray.txt
75 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/v2ray-2.txt
76 |
77 | ### nodelist.txt
78 |
79 | https://github.com/snakem982/proxypool/blob/main/source/nodelist.txt
80 |
81 | ### proxies.txt
82 |
83 | https://github.com/snakem982/proxypool/blob/main/source/proxies.txt
84 |
85 | ### webfuzz.yaml
86 |
87 | https://github.com/snakem982/proxypool/blob/main/source/webfuzz.yaml
88 |
89 | ### telegram channel hub
90 |
91 | https://github.com/snakem982/proxypool/blob/main/source/tgchannel.json
92 |
93 | ##
免责声明
Disclaimer
94 |
95 | 该项目仅供个人和教育用途。
96 | 使用本项目时请遵守相关法律法规。
97 | 项目所有者对内容的使用不承担任何责任。
98 |
99 | This project is meant for personal and educational uses only.
100 | Please follow relevant laws and regulations when using this project.
101 | Project owner is not responsible or liable in any manner for the use of the content.
102 |
--------------------------------------------------------------------------------
/cdn/FastlyIpRange.txt:
--------------------------------------------------------------------------------
1 | 23.235.32.0/20
2 | 43.249.72.0/22
3 | 103.244.50.0/24
4 | 103.245.222.0/23
5 | 103.245.224.0/24
6 | 104.156.80.0/20
7 | 140.248.64.0/18
8 | 140.248.128.0/17
9 | 146.75.0.0/17
10 | 151.101.0.0/16
11 | 157.52.64.0/18
12 | 167.82.0.0/17
13 | 167.82.128.0/20
14 | 167.82.160.0/20
15 | 167.82.224.0/20
16 | 172.111.64.0/18
17 | 185.31.16.0/22
18 | 199.27.72.0/21
19 | 199.232.0.0/16
--------------------------------------------------------------------------------
/cdn/GcoreIpRange.txt:
--------------------------------------------------------------------------------
1 | 81.253.239.34/32
2 | 80.93.215.7/32
3 | 92.223.107.49/32
4 | 103.178.28.8/32
5 | 93.123.17.151/32
6 | 92.223.124.36/32
7 | 92.223.107.48/32
8 | 195.216.237.199/32
9 | 92.223.120.13/32
10 | 185.194.11.74/32
11 | 79.133.108.28/32
12 | 92.223.107.46/32
13 | 93.123.17.165/32
14 | 92.223.63.29/32
15 | 193.57.89.4/32
16 | 93.123.17.145/32
17 | 92.223.116.220/32
18 | 79.133.108.10/32
19 | 185.101.136.9/32
20 | 5.188.121.182/32
21 | 92.223.116.204/32
22 | 92.223.12.26/32
23 | 92.223.107.59/32
24 | 92.223.92.24/32
25 | 93.123.17.141/32
26 | 92.223.107.51/32
27 | 80.240.113.5/32
28 | 78.111.101.4/32
29 | 202.78.162.5/32
30 | 92.223.124.53/32
31 | 102.130.69.141/32
32 | 92.223.124.30/32
33 | 92.223.124.42/32
34 | 92.223.116.214/32
35 | 80.15.243.3/32
36 | 92.223.107.52/32
37 | 78.111.103.5/32
38 | 79.133.108.8/32
39 | 109.230.114.2/32
40 | 102.67.99.66/32
41 | 92.223.118.37/32
42 | 92.223.114.7/32
43 | 93.123.17.136/32
44 | 95.85.69.7/32
45 | 92.223.123.41/32
46 | 93.123.17.132/32
47 | 92.223.107.50/32
48 | 45.82.101.7/32
49 | 92.223.124.50/32
50 | 92.223.123.32/32
51 | 92.223.118.16/32
52 | 171.229.196.133/32
53 | 139.28.7.4/32
54 | 92.223.118.39/32
55 | 45.82.103.4/32
56 | 92.223.116.208/32
57 | 181.39.11.210/32
58 | 81.253.239.30/32
59 | 5.101.68.8/32
60 | 93.123.17.164/32
61 | 92.223.55.6/32
62 | 5.252.26.8/32
63 | 193.169.251.5/32
64 | 92.223.107.58/32
65 | 93.123.17.180/32
66 | 92.223.124.40/32
67 | 92.223.78.23/32
68 | 92.223.12.17/32
69 | 93.123.17.142/32
70 | 92.223.12.14/32
71 | 91.149.176.70/32
72 | 45.82.100.5/32
73 | 92.223.107.42/32
74 | 5.8.92.4/32
75 | 93.123.17.140/32
76 | 171.234.242.195/32
77 | 185.163.3.4/32
78 | 94.176.183.8/32
79 | 92.223.116.223/32
80 | 92.223.116.222/32
81 | 81.253.239.14/32
82 | 92.223.124.25/32
83 | 79.133.108.14/32
84 | 80.240.124.9/32
85 | 92.223.118.12/32
86 | 93.123.17.191/32
87 | 125.214.171.164/32
88 | 92.223.116.210/32
89 | 92.223.63.21/32
90 | 92.223.124.51/32
91 | 45.82.101.5/32
92 | 92.223.61.23/32
93 | 92.223.118.25/32
94 | 5.188.133.10/32
95 | 92.223.118.40/32
96 | 93.123.11.11/32
97 | 79.133.108.25/32
98 | 37.110.209.228/32
99 | 194.44.246.206/32
100 | 185.158.211.186/32
101 | 92.223.124.48/32
102 | 92.38.142.25/32
103 | 93.123.17.163/32
104 | 92.223.12.13/32
105 | 91.243.87.5/32
106 | 92.223.124.15/32
107 | 92.38.170.7/32
108 | 93.123.17.144/32
109 | 79.133.108.23/32
110 | 92.223.107.56/32
111 | 92.223.123.34/32
112 | 5.188.121.136/32
113 | 80.240.113.8/32
114 | 93.123.17.167/32
115 | 92.223.124.28/32
116 | 80.15.252.33/32
117 | 5.188.121.163/32
118 | 195.216.237.201/32
119 | 92.223.124.52/32
120 | 92.223.116.221/32
121 | 92.223.63.28/32
122 | 80.240.124.11/32
123 | 5.101.219.6/32
124 | 92.223.124.54/32
125 | 93.123.17.160/32
126 | 92.223.118.38/32
127 | 93.123.17.134/32
128 | 79.133.108.6/32
129 | 92.223.76.24/32
130 | 92.223.107.47/32
131 | 80.240.113.7/32
132 | 92.223.124.33/32
133 | 185.101.136.8/32
134 | 170.238.234.217/32
135 | 93.123.17.135/32
136 | 80.240.124.8/32
137 | 92.223.120.15/32
138 | 186.16.19.94/32
139 | 92.223.123.45/32
140 | 92.223.61.25/32
141 | 92.223.124.16/32
142 | 82.213.5.50/32
143 | 92.223.108.16/32
144 | 5.189.207.4/32
145 | 92.223.63.6/32
146 | 79.133.108.24/32
147 | 195.22.198.49/32
148 | 171.229.196.136/32
149 | 185.249.133.4/32
150 | 92.38.170.8/32
151 | 92.223.74.20/32
152 | 80.15.252.1/32
153 | 193.169.251.4/32
154 | 93.123.17.149/32
155 | 93.123.17.162/32
156 | 5.188.126.7/32
157 | 195.14.146.81/32
158 | 81.253.239.2/32
159 | 45.65.8.4/32
160 | 93.123.17.175/32
161 | 92.223.116.200/32
162 | 92.223.123.48/32
163 | 5.188.121.151/32
164 | 45.80.213.7/32
165 | 80.240.113.11/32
166 | 92.223.112.42/32
167 | 92.223.118.19/32
168 | 213.156.151.4/32
169 | 92.223.118.15/32
170 | 92.223.63.24/32
171 | 92.223.124.41/32
172 | 81.253.239.10/32
173 | 185.188.144.8/32
174 | 92.223.63.25/32
175 | 213.156.144.7/32
176 | 5.188.121.133/32
177 | 92.223.124.4/32
178 | 87.120.164.4/32
179 | 92.223.108.6/32
180 | 31.184.207.8/32
181 | 92.223.64.8/32
182 | 103.178.28.12/32
183 | 81.253.239.18/32
184 | 80.93.215.12/32
185 | 92.223.64.12/32
186 | 92.223.74.26/32
187 | 80.15.243.1/32
188 | 92.223.116.203/32
189 | 185.188.144.5/32
190 | 185.105.1.10/32
191 | 1.37.77.98/32
192 | 95.85.92.4/32
193 | 80.240.113.13/32
194 | 80.93.215.4/32
195 | 92.223.116.205/32
196 | 93.123.17.146/32
197 | 80.240.124.5/32
198 | 93.123.17.148/32
199 | 103.178.28.5/32
200 | 92.223.76.25/32
201 | 79.133.108.7/32
202 | 5.188.94.5/32
203 | 80.240.124.10/32
204 | 92.223.12.4/32
205 | 37.17.119.211/32
206 | 92.223.12.6/32
207 | 92.223.124.5/32
208 | 80.15.251.9/32
209 | 93.123.17.155/32
210 | 92.223.123.47/32
211 | 92.223.118.24/32
212 | 93.123.17.166/32
213 | 93.123.17.176/32
214 | 5.8.92.6/32
215 | 92.223.118.17/32
216 | 92.46.108.106/32
217 | 92.223.107.45/32
218 | 92.223.92.23/32
219 | 80.93.221.4/32
220 | 92.223.116.211/32
221 | 92.223.122.185/32
222 | 171.229.196.138/32
223 | 179.0.200.126/32
224 | 92.223.123.51/32
225 | 80.93.215.11/32
226 | 5.188.121.165/32
227 | 80.93.215.9/32
228 | 92.223.124.9/32
229 | 95.85.88.9/32
230 | 5.188.121.161/32
231 | 5.8.43.4/32
232 | 217.76.64.195/32
233 | 92.223.12.16/32
234 | 31.184.207.7/32
235 | 92.223.107.36/32
236 | 45.80.213.4/32
237 | 82.97.205.5/32
238 | 92.223.63.11/32
239 | 80.93.215.6/32
240 | 93.123.17.154/32
241 | 80.15.251.11/32
242 | 92.223.116.216/32
243 | 92.223.92.25/32
244 | 213.252.220.4/32
245 | 103.178.28.7/32
246 | 92.223.123.50/32
247 | 92.223.116.224/32
248 | 171.234.242.198/32
249 | 79.133.108.30/32
250 | 78.111.101.5/32
251 | 5.252.26.11/32
252 | 92.223.107.44/32
253 | 92.223.120.12/32
254 | 103.178.28.6/32
255 | 93.123.17.178/32
256 | 93.123.17.177/32
257 | 213.156.144.5/32
258 | 185.101.136.7/32
259 | 80.240.124.6/32
260 | 92.223.124.44/32
261 | 92.223.78.22/32
262 | 93.123.17.189/32
263 | 193.169.250.4/32
264 | 93.123.17.188/32
265 | 93.123.17.190/32
266 | 93.123.11.12/32
267 | 195.216.237.197/32
268 | 93.123.17.153/32
269 | 92.223.116.213/32
270 | 92.223.74.21/32
271 | 103.178.28.10/32
272 | 213.156.144.4/32
273 | 180.149.90.66/32
274 | 92.223.118.21/32
275 | 80.15.243.13/32
276 | 92.223.118.5/32
277 | 202.78.162.4/32
278 | 92.223.124.29/32
279 | 92.223.110.4/32
280 | 5.188.121.185/32
281 | 93.123.17.192/32
282 | 93.123.17.137/32
283 | 146.185.221.132/32
284 | 92.223.123.40/32
285 | 5.1.107.249/32
286 | 95.85.92.6/32
287 | 92.223.61.21/32
288 | 92.223.55.5/32
289 | 92.223.122.188/32
290 | 79.133.108.29/32
291 | 185.188.144.7/32
292 | 94.128.12.238/32
293 | 92.223.61.24/32
294 | 78.111.103.4/32
295 | 92.223.124.37/32
296 | 92.223.124.24/32
297 | 93.123.11.14/32
298 | 92.38.159.4/32
299 | 5.101.219.5/32
300 | 94.176.183.6/32
301 | 213.156.144.6/32
302 | 81.253.239.26/32
303 | 80.240.124.7/32
304 | 92.223.124.27/32
305 | 5.188.121.135/32
306 | 81.253.239.38/32
307 | 91.243.87.4/32
308 | 95.85.92.7/32
309 | 176.222.187.178/32
310 | 80.240.113.10/32
311 | 92.223.108.5/32
312 | 80.93.215.5/32
313 | 92.223.12.22/32
314 | 80.15.251.1/32
315 | 92.223.112.12/32
316 | 185.215.162.226/32
317 | 92.223.124.31/32
318 | 92.223.92.26/32
319 | 92.223.107.57/32
320 | 92.223.124.34/32
321 | 43.245.140.2/32
322 | 45.80.213.8/32
323 | 92.223.107.53/32
324 | 92.223.12.15/32
325 | 92.223.116.201/32
326 | 92.223.63.22/32
327 | 92.223.55.4/32
328 | 92.38.159.5/32
329 | 5.8.43.5/32
330 | 92.223.12.27/32
331 | 92.38.170.6/32
332 | 109.68.233.242/32
333 | 37.17.119.210/32
334 | 93.123.17.150/32
335 | 92.223.123.36/32
336 | 213.156.151.6/32
337 | 82.148.98.42/32
338 | 80.93.210.4/32
339 | 5.101.222.5/32
340 | 92.223.114.6/32
341 | 92.223.107.54/32
342 | 92.223.12.7/32
343 | 92.223.108.13/32
344 | 37.236.95.2/32
345 | 92.223.124.13/32
346 | 92.223.63.5/32
347 | 87.120.164.7/32
348 | 92.223.122.184/32
349 | 79.133.108.31/32
350 | 92.223.124.22/32
351 | 62.209.27.232/32
352 | 93.123.17.179/32
353 | 5.188.121.178/32
354 | 5.188.121.166/32
355 | 80.93.223.4/32
356 | 200.10.177.54/32
357 | 92.223.108.15/32
358 | 79.133.108.4/32
359 | 179.51.50.82/32
360 | 181.174.80.182/32
361 | 92.223.123.15/32
362 | 5.252.26.6/32
363 | 92.223.63.23/32
364 | 45.82.103.5/32
365 | 202.129.236.162/32
366 | 92.223.124.32/32
367 | 45.82.100.4/32
368 | 92.223.116.209/32
369 | 5.252.26.9/32
370 | 80.15.252.25/32
371 | 92.223.120.10/32
372 | 79.133.108.16/32
373 | 151.248.104.91/32
374 | 5.188.121.181/32
375 | 92.223.118.22/32
376 | 185.244.209.4/32
377 | 92.223.123.20/32
378 | 80.15.251.15/32
379 | 93.123.17.147/32
380 | 45.82.101.9/32
381 | 171.234.242.199/32
382 | 92.223.116.215/32
383 | 92.223.63.7/32
384 | 45.82.103.6/32
385 | 92.223.114.14/32
386 | 92.223.12.23/32
387 | 5.188.126.4/32
388 | 5.188.133.13/32
389 | 92.223.12.9/32
390 | 92.223.63.27/32
391 | 92.223.43.13/32
392 | 92.223.63.10/32
393 | 80.15.250.1/32
394 | 92.223.124.49/32
395 | 95.85.69.6/32
396 | 185.48.136.150/32
397 | 186.2.150.34/32
398 | 92.223.76.20/32
399 | 5.188.121.137/32
400 | 31.184.207.4/32
401 | 92.223.124.17/32
402 | 92.223.63.8/32
403 | 80.15.252.17/32
404 | 193.36.180.7/32
405 | 92.223.12.11/32
406 | 5.252.26.10/32
407 | 92.223.124.10/32
408 | 80.93.215.8/32
409 | 95.85.92.5/32
410 | 94.176.183.11/32
411 | 5.188.121.138/32
412 | 92.38.168.5/32
413 | 93.123.11.13/32
414 | 46.49.10.229/32
415 | 92.223.122.187/32
416 | 92.223.12.20/32
417 | 79.133.108.9/32
418 | 185.101.136.12/32
419 | 5.188.133.11/32
420 | 45.82.101.6/32
421 | 92.223.63.4/32
422 | 202.78.162.6/32
423 | 213.156.156.4/32
424 | 103.178.28.13/32
425 | 92.223.124.45/32
426 | 92.223.107.38/32
427 | 92.223.12.24/32
428 | 5.188.121.162/32
429 | 80.15.251.13/32
430 | 79.133.108.15/32
431 | 94.176.183.7/32
432 | 92.223.107.43/32
433 | 93.123.17.143/32
434 | 150.107.126.4/32
435 | 92.223.12.12/32
436 | 80.240.124.4/32
437 | 93.123.17.156/32
438 | 5.252.26.7/32
439 | 185.188.144.4/32
440 | 92.223.116.212/32
441 | 193.169.250.5/32
442 | 93.123.17.174/32
443 | 5.189.207.5/32
444 | 92.223.123.46/32
445 | 92.38.168.7/32
446 | 80.240.113.12/32
447 | 5.188.121.132/32
448 | 92.223.112.28/32
449 | 92.223.63.26/32
450 | 213.156.156.5/32
451 | 92.223.124.39/32
452 | 45.82.103.7/32
453 | 171.229.196.135/32
454 | 197.215.140.235/32
455 | 5.188.132.5/32
456 | 92.223.12.5/32
457 | 171.234.242.197/32
458 | 92.223.43.14/32
459 | 92.223.116.206/32
460 | 92.223.112.41/32
461 | 92.223.118.20/32
462 | 193.36.180.5/32
463 | 31.184.207.5/32
464 | 45.80.213.5/32
465 | 92.38.142.21/32
466 | 134.0.219.26/32
467 | 93.123.17.133/32
468 | 5.252.26.5/32
469 | 92.223.123.33/32
470 | 92.223.124.12/32
471 | 92.223.68.27/32
472 | 79.133.108.17/32
473 | 92.223.116.207/32
474 | 92.223.118.8/32
475 | 92.223.12.25/32
476 | 5.101.217.4/32
477 | 92.223.123.30/32
478 | 92.223.107.39/32
479 | 89.223.90.4/32
480 | 92.223.124.26/32
481 | 103.211.151.21/32
482 | 92.223.63.9/32
483 | 87.120.164.5/32
484 | 5.188.121.183/32
485 | 5.188.126.6/32
486 | 5.188.126.5/32
487 | 190.95.248.34/32
488 | 92.223.47.4/32
489 | 92.223.124.23/32
490 | 195.216.237.203/32
491 | 92.223.118.7/32
492 | 93.123.17.157/32
493 | 80.15.243.15/32
494 | 5.188.121.191/32
495 | 92.223.107.55/32
496 | 92.38.168.6/32
497 | 92.223.124.38/32
498 | 92.223.107.40/32
499 | 92.38.170.10/32
500 | 171.229.196.137/32
501 | 93.123.17.159/32
502 | 5.188.121.192/32
503 | 130.193.166.2/32
504 | 93.123.38.4/32
505 | 92.223.12.19/32
506 | 93.123.17.158/32
507 | 79.133.108.5/32
508 | 92.223.122.186/32
509 | 92.223.76.23/32
510 | 45.82.101.8/32
511 | 93.123.17.138/32
512 | 185.76.48.122/32
513 | 81.253.239.6/32
514 | 213.156.151.5/32
515 | 92.223.124.6/32
516 | 102.67.99.50/32
517 | 93.123.17.139/32
518 | 92.223.124.35/32
519 | 5.101.68.5/32
520 | 80.240.113.14/32
521 | 197.188.22.102/32
522 | 151.248.104.69/32
523 | 79.133.108.13/32
524 | 92.223.92.22/32
525 | 92.223.118.18/32
526 | 5.101.222.4/32
527 | 94.43.206.202/32
528 | 79.133.108.32/32
529 | 92.223.68.25/32
530 | 92.223.118.4/32
531 | 41.210.189.22/32
532 | 80.240.113.9/32
533 | 197.148.108.106/32
534 | 94.176.183.12/32
535 | 120.28.10.46/32
536 | 31.184.207.6/32
537 | 197.215.140.234/32
538 | 82.97.205.4/32
539 | 45.80.213.6/32
540 | 92.223.68.26/32
541 | 87.120.164.6/32
542 | 197.225.145.26/32
543 | 92.223.118.14/32
544 | 92.223.12.10/32
545 | 91.243.83.5/32
546 | 118.103.136.245/32
547 | 92.223.12.8/32
548 | 5.8.92.5/32
549 | 80.240.113.6/32
550 | 103.178.28.11/32
551 | 92.223.118.10/32
552 | 193.36.180.6/32
553 | 134.0.219.37/32
554 | 185.101.136.13/32
555 | 103.178.28.9/32
556 | 79.133.108.26/32
557 | 95.85.92.8/32
558 | 92.223.124.8/32
559 | 92.223.107.60/32
560 | 80.240.113.4/32
561 | 79.133.108.27/32
562 | 5.188.121.134/32
563 | 92.223.64.4/32
564 | 93.123.17.161/32
565 | 5.188.121.184/32
566 | 92.223.118.23/32
567 | 171.229.196.134/32
568 | 103.178.28.4/32
569 | 92.223.124.43/32
570 | 80.15.252.9/32
571 | 93.123.38.5/32
572 | 92.223.120.14/32
573 | 5.252.26.4/32
574 | 171.229.196.132/32
575 | 80.93.215.10/32
576 | 92.223.12.18/32
577 | 94.176.183.5/32
--------------------------------------------------------------------------------
/cdn/cloudflare/CloudflareIpRange.txt:
--------------------------------------------------------------------------------
1 | 173.245.48.0/20
2 | 103.21.244.0/22
3 | 103.22.200.0/22
4 | 103.31.4.0/22
5 | 141.101.64.0/18
6 | 108.162.192.0/18
7 | 190.93.240.0/20
8 | 188.114.96.0/20
9 | 197.234.240.0/22
10 | 198.41.128.0/17
11 | 162.158.0.0/15
12 | 104.16.0.0/13
13 | 104.24.0.0/14
14 | 172.64.0.0/13
15 | 131.0.72.0/22
--------------------------------------------------------------------------------
/cdn/cloudflare/CloudflarePremiumDomain.txt:
--------------------------------------------------------------------------------
1 | acjp2.cloudflarest.link:2052
2 | acsg.cloudflarest.link:2052
3 | acsg3.cloudflarest.link:2052
4 |
--------------------------------------------------------------------------------
/cdn/cloudflare/CloudflarePremiumIp.txt:
--------------------------------------------------------------------------------
1 | https://stock.hostmonit.com/CloudFlareYes
2 | https://zip.baipiao.eu.org
3 | https://t.me/cf_push
4 |
--------------------------------------------------------------------------------
/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | func init() {
4 |
5 | }
6 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/snakem982/proxypool
2 |
3 | go 1.22
4 |
5 | require (
6 | github.com/ip2location/ip2location-go/v9 v9.7.0
7 | github.com/metacubex/mihomo v1.18.6
8 | github.com/panjf2000/ants/v2 v2.10.0
9 | golang.org/x/net v0.26.0
10 | gopkg.in/yaml.v3 v3.0.1
11 | )
12 |
13 | require (
14 | github.com/3andne/restls-client-go v0.1.6 // indirect
15 | github.com/RyuaNerin/go-krypto v1.2.4 // indirect
16 | github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
17 | github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
18 | github.com/andybalholm/brotli v1.0.6 // indirect
19 | github.com/bahlo/generic-list-go v0.2.0 // indirect
20 | github.com/buger/jsonparser v1.1.1 // indirect
21 | github.com/cilium/ebpf v0.12.3 // indirect
22 | github.com/cloudflare/circl v1.3.7 // indirect
23 | github.com/coreos/go-iptables v0.7.0 // indirect
24 | github.com/dlclark/regexp2 v1.11.0 // indirect
25 | github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
26 | github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
27 | github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
28 | github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
29 | github.com/fsnotify/fsnotify v1.7.0 // indirect
30 | github.com/gaukas/godicttls v0.0.4 // indirect
31 | github.com/go-ole/go-ole v1.3.0 // indirect
32 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
33 | github.com/gobwas/httphead v0.1.0 // indirect
34 | github.com/gobwas/pool v0.2.1 // indirect
35 | github.com/gobwas/ws v1.4.0 // indirect
36 | github.com/gofrs/uuid/v5 v5.2.0 // indirect
37 | github.com/google/btree v1.1.2 // indirect
38 | github.com/google/go-cmp v0.6.0 // indirect
39 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
40 | github.com/hashicorp/yamux v0.1.1 // indirect
41 | github.com/insomniacslk/dhcp v0.0.0-20240529192340-51bc6136a0a6 // indirect
42 | github.com/josharian/native v1.1.0 // indirect
43 | github.com/klauspost/compress v1.17.4 // indirect
44 | github.com/klauspost/cpuid/v2 v2.2.8 // indirect
45 | github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
46 | github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect
47 | github.com/mailru/easyjson v0.7.7 // indirect
48 | github.com/mdlayher/netlink v1.7.2 // indirect
49 | github.com/mdlayher/socket v0.4.1 // indirect
50 | github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
51 | github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec // indirect
52 | github.com/metacubex/quic-go v0.45.1-0.20240610004319-163fee60637e // indirect
53 | github.com/metacubex/randv2 v0.2.0 // indirect
54 | github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 // indirect
55 | github.com/metacubex/sing-shadowsocks v0.2.6 // indirect
56 | github.com/metacubex/sing-shadowsocks2 v0.2.0 // indirect
57 | github.com/metacubex/sing-tun v0.2.7-0.20240627012306-9d1f5fc0b45e // indirect
58 | github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f // indirect
59 | github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a // indirect
60 | github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 // indirect
61 | github.com/metacubex/utls v1.6.6 // indirect
62 | github.com/miekg/dns v1.1.61 // indirect
63 | github.com/mroth/weightedrand/v2 v2.1.0 // indirect
64 | github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect
65 | github.com/onsi/ginkgo/v2 v2.9.5 // indirect
66 | github.com/openacid/low v0.1.21 // indirect
67 | github.com/oschwald/maxminddb-golang v1.12.0 // indirect
68 | github.com/pierrec/lz4/v4 v4.1.14 // indirect
69 | github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
70 | github.com/puzpuzpuz/xsync/v3 v3.2.0 // indirect
71 | github.com/quic-go/qpack v0.4.0 // indirect
72 | github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
73 | github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect
74 | github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
75 | github.com/sagernet/nftables v0.3.0-beta.4 // indirect
76 | github.com/sagernet/sing v0.5.0-alpha.10 // indirect
77 | github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6 // indirect
78 | github.com/sagernet/sing-shadowtls v0.1.4 // indirect
79 | github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
80 | github.com/sagernet/wireguard-go v0.0.0-20231209092712-9a439356a62e // indirect
81 | github.com/samber/lo v1.39.0 // indirect
82 | github.com/shirou/gopsutil/v3 v3.24.5 // indirect
83 | github.com/shoenig/go-m1cpu v0.1.6 // indirect
84 | github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect
85 | github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
86 | github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect
87 | github.com/sirupsen/logrus v1.9.3 // indirect
88 | github.com/tklauser/go-sysconf v0.3.12 // indirect
89 | github.com/tklauser/numcpus v0.6.1 // indirect
90 | github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect
91 | github.com/vishvananda/netns v0.0.4 // indirect
92 | github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
93 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
94 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect
95 | go.uber.org/mock v0.4.0 // indirect
96 | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
97 | golang.org/x/crypto v0.24.0 // indirect
98 | golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect
99 | golang.org/x/mod v0.18.0 // indirect
100 | golang.org/x/sync v0.7.0 // indirect
101 | golang.org/x/sys v0.21.0 // indirect
102 | golang.org/x/text v0.16.0 // indirect
103 | golang.org/x/time v0.5.0 // indirect
104 | golang.org/x/tools v0.22.0 // indirect
105 | google.golang.org/protobuf v1.34.2 // indirect
106 | lukechampine.com/blake3 v1.3.0 // indirect
107 | lukechampine.com/uint128 v1.2.0 // indirect
108 | )
109 |
110 | replace (
111 | github.com/metacubex/mihomo => github.com/snakem982/mihomo v1.11.9-0.20240713031232-2bbde78a2dbf
112 | github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240617013425-3e3bd9dab6a2
113 | )
114 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
2 | github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
3 | github.com/RyuaNerin/elliptic2 v1.0.0/go.mod h1:wWB8fWrJI/6EPJkyV/r1Rj0hxUgrusmqSj8JN6yNf/A=
4 | github.com/RyuaNerin/go-krypto v1.2.4 h1:mXuNdK6M317aPV0llW6Xpjbo4moOlPF7Yxz4tb4b4Go=
5 | github.com/RyuaNerin/go-krypto v1.2.4/go.mod h1:QqCYkoutU3yInyD9INt2PGolVRsc3W4oraQadVGXJ/8=
6 | github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
7 | github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
8 | github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
9 | github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
10 | github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
11 | github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
12 | github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
13 | github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
14 | github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
15 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
16 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
17 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
18 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
19 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
20 | github.com/cilium/ebpf v0.12.3 h1:8ht6F9MquybnY97at+VDZb3eQQr8ev79RueWeVaEcG4=
21 | github.com/cilium/ebpf v0.12.3/go.mod h1:TctK1ivibvI3znr66ljgi4hqOT8EYQjz1KWBfb1UVgM=
22 | github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
23 | github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
24 | github.com/coreos/go-iptables v0.7.0 h1:XWM3V+MPRr5/q51NuWSgU0fqMad64Zyxs8ZUoMsamr8=
25 | github.com/coreos/go-iptables v0.7.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
26 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
27 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
28 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
29 | github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
30 | github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
31 | github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8=
32 | github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I=
33 | github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g=
34 | github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
35 | github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
36 | github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c/go.mod h1:ETASDWf/FmEb6Ysrtd1QhjNedUU/ZQxBCRLh60bQ/UI=
37 | github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 h1:tlDMEdcPRQKBEz5nGDMvswiajqh7k8ogWRlhRwKy5mY=
38 | github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
39 | github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
40 | github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
41 | github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA=
42 | github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
43 | github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
44 | github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
45 | github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
46 | github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
47 | github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
48 | github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
49 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
50 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
51 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
52 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
53 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
54 | github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
55 | github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
56 | github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
57 | github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
58 | github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs=
59 | github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
60 | github.com/gofrs/uuid/v5 v5.2.0 h1:qw1GMx6/y8vhVsx626ImfKMuS5CvJmhIKKtuyvfajMM=
61 | github.com/gofrs/uuid/v5 v5.2.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
62 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
63 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
64 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
65 | github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
66 | github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
67 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
68 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
69 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
70 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
71 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
72 | github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I=
73 | github.com/google/tink/go v1.6.1/go.mod h1:IGW53kTgag+st5yPhKKwJ6u2l+SSp5/v9XF7spovjlY=
74 | github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
75 | github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
76 | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
77 | github.com/insomniacslk/dhcp v0.0.0-20240529192340-51bc6136a0a6 h1:dh8D8FksyMhD64mRMbUhZHWYJfNoNMCxfVq6eexleMw=
78 | github.com/insomniacslk/dhcp v0.0.0-20240529192340-51bc6136a0a6/go.mod h1:KclMyHxX06VrVr0DJmeFSUb1ankt7xTfoOA35pCkoic=
79 | github.com/ip2location/ip2location-go/v9 v9.7.0 h1:ipwl67HOWcrw+6GOChkEXcreRQR37NabqBd2ayYa4Q0=
80 | github.com/ip2location/ip2location-go/v9 v9.7.0/go.mod h1:MPLnsKxwQlvd2lBNcQCsLoyzJLDBFizuO67wXXdzoyI=
81 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
82 | github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
83 | github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
84 | github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
85 | github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
86 | github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
87 | github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
88 | github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
89 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
90 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
91 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
92 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
93 | github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
94 | github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
95 | github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc=
96 | github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
97 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
98 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
99 | github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
100 | github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
101 | github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
102 | github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
103 | github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
104 | github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
105 | github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc=
106 | github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw=
107 | github.com/metacubex/quic-go v0.45.1-0.20240610004319-163fee60637e h1:bLYn3GuRvWDcBDAkIv5kUYIhzHwafDVq635BuybnKqI=
108 | github.com/metacubex/quic-go v0.45.1-0.20240610004319-163fee60637e/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU=
109 | github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
110 | github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
111 | github.com/metacubex/sing v0.0.0-20240617013425-3e3bd9dab6a2 h1:N5tidgg/FRmkgPw/AjRwhLUinKDx/ODCSbvv9xqRoLM=
112 | github.com/metacubex/sing v0.0.0-20240617013425-3e3bd9dab6a2/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
113 | github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew=
114 | github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8=
115 | github.com/metacubex/sing-shadowsocks v0.2.6 h1:6oEB3QcsFYnNiFeoevcXrCwJ3sAablwVSgtE9R3QeFQ=
116 | github.com/metacubex/sing-shadowsocks v0.2.6/go.mod h1:zIkMeSnb8Mbf4hdqhw0pjzkn1d99YJ3JQm/VBg5WMTg=
117 | github.com/metacubex/sing-shadowsocks2 v0.2.0 h1:hqwT/AfI5d5UdPefIzR6onGHJfDXs5zgOM5QSgaM/9A=
118 | github.com/metacubex/sing-shadowsocks2 v0.2.0/go.mod h1:LCKF6j1P94zN8ZS+LXRK1gmYTVGB3squivBSXAFnOg8=
119 | github.com/metacubex/sing-tun v0.2.7-0.20240627012306-9d1f5fc0b45e h1:o+zohxPRo45P35fS9u1zfdBgr+L/7S0ObGU6YjbVBIc=
120 | github.com/metacubex/sing-tun v0.2.7-0.20240627012306-9d1f5fc0b45e/go.mod h1:WwJGbCx7bQcBzuQXiDOJvZH27R0kIjKNNlISIWsL6kM=
121 | github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f h1:QjXrHKbTMBip/C+R79bvbfr42xH1gZl3uFb0RELdZiQ=
122 | github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY=
123 | github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a h1:NpSGclHJUYndUwBmyIpFBSoBVg8PoVX7QQKhYg0DjM0=
124 | github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a/go.mod h1:uY+BYb0UEknLrqvbGcwi9i++KgrKxsurysgI6G1Pveo=
125 | github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 h1:as/aO/fM8nv4W4pOr9EETP6kV/Oaujk3fUNyQSJK61c=
126 | github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66/go.mod h1:c7bVFM9f5+VzeZ/6Kg77T/jrg1Xp8QpqlSHvG/aXVts=
127 | github.com/metacubex/utls v1.6.6 h1:3D12YKHTf2Z41UPhQU2dWerNWJ5TVQD9gKoQ+H+iLC8=
128 | github.com/metacubex/utls v1.6.6/go.mod h1:+WLFUnXjcpdxXCnyX25nggw8C6YonZ8zOK2Zm/oRvdo=
129 | github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
130 | github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
131 | github.com/mroth/weightedrand/v2 v2.1.0 h1:o1ascnB1CIVzsqlfArQQjeMy1U0NcIbBO5rfd5E/OeU=
132 | github.com/mroth/weightedrand/v2 v2.1.0/go.mod h1:f2faGsfOGOwc1p94wzHKKZyTpcJUW7OJ/9U4yfiNAOU=
133 | github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4=
134 | github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs=
135 | github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
136 | github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
137 | github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
138 | github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
139 | github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0=
140 | github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo=
141 | github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0=
142 | github.com/openacid/must v0.1.3/go.mod h1:luPiXCuJlEo3UUFQngVQokV0MPGryeYvtCbQPs3U1+I=
143 | github.com/openacid/testkeys v0.1.6/go.mod h1:MfA7cACzBpbiwekivj8StqX0WIRmqlMsci1c37CA3Do=
144 | github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs=
145 | github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY=
146 | github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8=
147 | github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
148 | github.com/pierrec/lz4/v4 v4.1.14 h1:+fL8AQEZtz/ijeNnpduH0bROTu0O3NZAlPjQxGn8LwE=
149 | github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
150 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
151 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
152 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
153 | github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
154 | github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
155 | github.com/puzpuzpuz/xsync/v3 v3.2.0 h1:9AzuUeF88YC5bK8u2vEG1Fpvu4wgpM1wfPIExfaaDxQ=
156 | github.com/puzpuzpuz/xsync/v3 v3.2.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
157 | github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
158 | github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
159 | github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
160 | github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
161 | github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
162 | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
163 | github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a h1:+NkI2670SQpQWvkkD2QgdTuzQG263YZ+2emfpeyGqW0=
164 | github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a/go.mod h1:63s7jpZqcDAIpj8oI/1v4Izok+npJOHACFCU6+huCkM=
165 | github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
166 | github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
167 | github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
168 | github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
169 | github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6 h1:5bCAkvDDzSMITiHFjolBwpdqYsvycdTu71FsMEFXQ14=
170 | github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ=
171 | github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k=
172 | github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4=
173 | github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
174 | github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
175 | github.com/sagernet/wireguard-go v0.0.0-20231209092712-9a439356a62e h1:iGH0RMv2FzELOFNFQtvsxH7NPmlo7X5JizEK51UCojo=
176 | github.com/sagernet/wireguard-go v0.0.0-20231209092712-9a439356a62e/go.mod h1:YbL4TKHRR6APYQv3U2RGfwLDpPYSyWz6oUlpISBEzBE=
177 | github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA=
178 | github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
179 | github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
180 | github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk=
181 | github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
182 | github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
183 | github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
184 | github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
185 | github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
186 | github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM=
187 | github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk=
188 | github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c/go.mod h1:NV/a66PhhWYVmUMaotlXJ8fIEFB98u+c8l/CQIEFLrU=
189 | github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e h1:ur8uMsPIFG3i4Gi093BQITvwH9znsz2VUZmnmwHvpIo=
190 | github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e5fBW3bpPyo+3uLo513gIUblc03egGjMM0+5GKbzK8=
191 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
192 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
193 | github.com/snakem982/mihomo v1.11.9-0.20240713031232-2bbde78a2dbf h1:kNjx7imNu8expE7vzuf+3EudFhAw/a3Fef1McV12oD8=
194 | github.com/snakem982/mihomo v1.11.9-0.20240713031232-2bbde78a2dbf/go.mod h1:4k6CJ9MoYhuQP40evJUSc3p1uRXASyyS8O+63k3nHVU=
195 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
196 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
197 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
198 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
199 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
200 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
201 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
202 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
203 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
204 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
205 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
206 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
207 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
208 | github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
209 | github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
210 | github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
211 | github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
212 | github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA=
213 | github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
214 | github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
215 | github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
216 | github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
217 | github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
218 | github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
219 | github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
220 | github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
221 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
222 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
223 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo=
224 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ=
225 | go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
226 | go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
227 | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
228 | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
229 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
230 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
231 | golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
232 | golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
233 | golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
234 | golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
235 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
236 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
237 | golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
238 | golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
239 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
240 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
241 | golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
242 | golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
243 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
244 | golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
245 | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
246 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
247 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
248 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
249 | golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
250 | golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
251 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
252 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
253 | golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
254 | golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
255 | golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
256 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
257 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
258 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
259 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
260 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
261 | golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
262 | golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
263 | golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
264 | golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
265 | golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
266 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
267 | golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
268 | golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
269 | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
270 | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
271 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
272 | golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
273 | golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
274 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
275 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
276 | google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
277 | google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
278 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
279 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
280 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
281 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
282 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
283 | lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
284 | lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
285 | lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
286 | lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
287 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "fmt"
4 |
5 | func main() {
6 | fmt.Println("proxypool")
7 | }
8 |
--------------------------------------------------------------------------------
/script/alive.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | while getopts ":x:" opt
4 | do
5 | case $opt in
6 | x)
7 | export http_proxy=$OPTARG
8 | export https_proxy=$http_proxy
9 | echo "使用代理 $https_proxy"
10 | ;;
11 | ?)
12 | echo "未知参数"
13 | exit 1;;
14 | esac
15 | done
16 |
17 | jsonQ() {
18 | json=$(cat)
19 | awk -v json="$json" -v json_original="$json" -v key="$1" '
20 | function strLastChar(s) {
21 | return substr(s, length(s), 1)
22 | }
23 | function startWith(s, c) {
24 | start = substr(s, 1, 1)
25 | return start == c
26 | }
27 | function endWith(s, c) {
28 | return strLastChar(s) == c
29 | }
30 | function innerStr(s) {
31 | # 取出括号/引号内的内容
32 | return substr(s, 2, length(s)-2)
33 | }
34 | function strIndex(s, n) {
35 | # 字符串通过下标取值,索引是从1开始的
36 | return substr(s, n, 1)
37 | }
38 | function trim(s) {
39 | sub("^[ \n]*", "", s);
40 | sub("[ \n]*$", "", s);
41 | return s
42 | }
43 | function findValueByKey(s, k) {
44 | if ("\""k"\"" != substr(s, 1, length(k)+2)) {exit 0}
45 | s = trim(s)
46 | start = 0; stop = 0; layer = 0
47 | for (i = 2 + length(k) + 1; i <= length(s); ++i) {
48 | lastChar = substr(s, i - 1, 1)
49 | currChar = substr(s, i, 1)
50 | if (start <= 0) {
51 | if (lastChar == ":") {
52 | start = currChar == " " ? i + 1: i
53 | if (currChar == "{" || currChar == "[") {
54 | layer = 1
55 | }
56 | }
57 | } else {
58 | if (currChar == "{" || currChar == "[") {
59 | ++layer
60 | }
61 | if (currChar == "}" || currChar == "]") {
62 | --layer
63 | }
64 | if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) {
65 | stop = currChar == "," ? i : i + 1 + layer
66 | break
67 | }
68 | }
69 | }
70 | if (start <= 0 || stop <= 0 || start > length(s) || stop > length(s) || start >= stop) {
71 | exit 0
72 | } else {
73 | return trim(substr(s, start, stop - start))
74 | }
75 | }
76 | function unquote(s) {
77 | if (startWith(s, "\"")) {
78 | s = substr(s, 2, length(s)-1)
79 | }
80 | if (endWith(s, "\"")) {
81 | s = substr(s, 1, length(s)-1)
82 | }
83 | return s
84 | }
85 | BEGIN{
86 | if (match(key, /^\./) == 0) {exit 0;}
87 | sub(/\][ ]*\[/,"].[", key)
88 | split(key, ks, ".")
89 | if (length(ks) == 1) {print json; exit 0}
90 | for (j = 2; j <= length(ks); j++) {
91 | k = ks[j]
92 | if (startWith(k, "[") && endWith(k, "]") == 1) { # [n]
93 | idx = innerStr(k)
94 | currentIdx = -1
95 | # 找匹配对
96 | pairs = ""
97 | json = trim(json)
98 | if (startWith(json, "[") == 0) {
99 | exit 0
100 | }
101 | start = 2
102 | cursor = 2
103 | for (; cursor <= length(json); cursor++) {
104 | current = strIndex(json, cursor)
105 | if (current == " " || current == "\n") {continue}
106 | # 忽略空白
107 | if (current == "[" || current == "{") {
108 | if (length(pairs) == 0) {start = cursor}
109 | pairs = pairs""current
110 | }
111 | if (current == "]" || current == "}") {
112 | if ((strLastChar(pairs) == "[" && current == "]") || (strLastChar(pairs) == "{" && current == "}")) {
113 | pairs = substr(pairs, 1, length(pairs)-1)
114 | # 删掉最后一个字符
115 | if (pairs == "") {
116 | # 匹配到了所有的左括号
117 | currentIdx++
118 | if (currentIdx == idx) {
119 | json = substr(json, start, cursor-start+1)
120 | break
121 | }
122 | }
123 | } else {
124 | pairs = pairs""current
125 | }
126 | }
127 | }
128 | } else {
129 | # 到这里,就只能是{"key": "value"}或{"key":{}}或{"key":[{}]}
130 | pairs = ""
131 | json = trim(json)
132 | if (startWith(json, "[")) {exit 0}
133 | #if (!startWith(json, "\"") || !startWith(json, "{")) {json="\""json}
134 | # 找匹配的键
135 | start = 2
136 | cursor = 2
137 | noMatch = 0
138 | for (; cursor <= length(json); cursor++) {
139 | current = strIndex(json, cursor)
140 | if (current == " " || current == "\n" || current == ",") {continue}
141 | # 忽略空白和逗号
142 | if (substr(json, cursor, length(k)+2) == "\""k"\"") {
143 | json = findValueByKey(substr(json, cursor, length(json)-cursor+1), k)
144 | break
145 | } else {
146 | noMatch = 1
147 | }
148 | if (noMatch) {
149 | pos = match(substr(json, cursor+1, length(json)-cursor), /[^(\\")]"/)
150 | ck = substr(substr(json, cursor+1, length(json)-cursor), 1, pos)
151 | t = findValueByKey(substr(json, cursor, length(json)-cursor+1), ck)
152 | tLen = length(t)
153 | sub(/\\/, "\\\\", t)
154 | pos = match(substr(json, cursor+1, length(json)-cursor), t)
155 | if (pos != 0) {
156 | cursor = cursor + pos + tLen
157 | }
158 | noMatch = 0
159 | continue
160 | }
161 | }
162 | }
163 | }
164 | if (json_original == json) { print;exit 0 }
165 | print unquote(json)
166 | }'
167 | }
168 |
169 | month=2592000
170 | timestamp=$(date +%s)
171 | lastMonth=$(( timestamp-month ))
172 | function isUpdated()
173 | {
174 | t1=`gdate -d "$1" +%s`
175 | if [ $t1 -gt $lastMonth ]
176 | then
177 | return 0
178 | else
179 | return 1
180 | fi
181 | }
182 |
183 | rm -rf result.log
184 | i=1
185 |
186 | data=$(cat ../source/nodelist.txt)
187 | for url in $data; do
188 | if [[ $url == https://raw.githubusercontent.com* ]]; then
189 | i=$[$i+1]
190 | code=$(curl -o /dev/null -k -s -w %{http_code} $url)
191 | if [ $code -ne 404 ]
192 | then
193 | arr=(`echo $url | tr '/' ' '`)
194 | repository=${arr[2]}%2F${arr[3]}
195 | response=$(curl -s https://github.com/search?q=$repository&type=repositories)
196 | response=$(echo "$response" | jsonQ ".payload.results.[0].repo.repository.updated_at")
197 | response=${response: 0: 19}
198 | response=${response/T/' '}
199 | if isUpdated $response ; then
200 | echo $url >> result.log
201 | fi
202 | fi
203 |
204 | ix=`expr $i % 8`
205 | if [ $ix -eq 0 ]
206 | then
207 | echo stop
208 | sleep 120
209 | fi
210 | fi
211 | done
212 |
213 |
214 |
215 |
--------------------------------------------------------------------------------
/script/rebase.sh:
--------------------------------------------------------------------------------
1 | cd ..
2 | # 切换到一个脱离主分支的另外一条全新主分支,不用太在意叫什么,因为后面还会修改分支名称
3 | git checkout --orphan latest_branch
4 | # 暂存所有改动过的文件,内容为当前旧分支的最新版本所有文件
5 | git add -A
6 | #提交更改
7 | git commit -am "rebase"
8 | #删除原始主分支
9 | git branch -D main
10 | #将当前分支重命名为 main
11 | git branch -m main
12 | #最后,强制更新您的存储库
13 | git push -f origin main
14 |
--------------------------------------------------------------------------------
/script/result.log:
--------------------------------------------------------------------------------
1 | https://raw.githubusercontent.com/aiboboxx/clashfree/main/clash.yml
2 | https://raw.githubusercontent.com/anaer/Sub/main/clash.yaml
3 | https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.yml
4 | https://raw.githubusercontent.com/mahdibland/V2RayAggregator/master/sub/sub_merge_yaml.yml
5 | https://raw.githubusercontent.com/mheidari98/.proxy/main/all
6 | https://raw.githubusercontent.com/NiceVPN123/NiceVPN/main/Clash.yaml
7 | https://raw.githubusercontent.com/ts-sf/fly/main/clash
8 | https://raw.githubusercontent.com/PangTouY00/Auto_proxy/main/Long_term_subscription_num
9 | https://raw.githubusercontent.com/zhangkaiitugithub/passcro/main/speednodes.yaml
10 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/hysteria
11 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vmess
12 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vless
13 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/trojan
14 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/shadowsocks
15 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/reality
16 | https://raw.githubusercontent.com/yebekhe/TelegramV2rayCollector/main/sub/base64/mix
17 | https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.yml
18 | https://raw.githubusercontent.com/Vauth/node/main/Main
19 | https://raw.githubusercontent.com/Vauth/node/main/Master
20 | https://raw.githubusercontent.com/WilliamStar007/ClashX-V2Ray-TopFreeProxy/main/combine/clash.config.yaml
21 | https://raw.githubusercontent.com/Epodonios/v2ray-configs/main/All_Configs_base64_Sub.txt
22 | https://raw.githubusercontent.com/lagzian/SS-Collector/main/mix_clash.yaml
23 | https://raw.githubusercontent.com/ALIILAPRO/v2rayNG-Config/main/sub.txt
24 | https://raw.githubusercontent.com/MrMohebi/xray-proxy-grabber-telegram/master/collected-proxies/clash-meta/all.yaml
25 | https://raw.githubusercontent.com/Misaka-blog/chromego_merge/main/sub/merged_proxies_new.yaml
26 |
--------------------------------------------------------------------------------
/script/test.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | data=$(cat proxies.txt)
3 | rm -rf result.log
4 | for url in $data; do
5 | if [[ $url == https://raw.githubusercontent.com* ]]; then
6 | echo "$url" >> result.log
7 | else
8 | code=$(curl --connect-timeout 10 -o /dev/null -k -s -w %{http_code} $url)
9 | if [ "000" != "$code" ]; then
10 | echo "$url" >> result.log
11 | fi
12 | fi
13 | done
14 |
--------------------------------------------------------------------------------
/source/nodelist.txt:
--------------------------------------------------------------------------------
1 | https://raw.githubusercontent.com/aiboboxx/clashfree/main/clash.yml
2 | https://raw.githubusercontent.com/anaer/Sub/main/clash.yaml
3 | https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.yml
4 | https://raw.githubusercontent.com/mahdibland/V2RayAggregator/master/sub/sub_merge_yaml.yml
5 | https://raw.githubusercontent.com/mheidari98/.proxy/main/all
6 | https://raw.githubusercontent.com/NiceVPN123/NiceVPN/main/Clash.yaml
7 | https://raw.githubusercontent.com/ts-sf/fly/main/clash
8 | https://raw.githubusercontent.com/PangTouY00/Auto_proxy/main/Long_term_subscription_num
9 | https://raw.githubusercontent.com/zhangkaiitugithub/passcro/main/speednodes.yaml
10 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/hysteria
11 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vmess
12 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vless
13 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/trojan
14 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/shadowsocks
15 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/reality
16 | https://raw.githubusercontent.com/yebekhe/TelegramV2rayCollector/main/sub/base64/mix
17 | https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.yml
18 | https://raw.githubusercontent.com/Vauth/node/main/Main
19 | https://raw.githubusercontent.com/Vauth/node/main/Master
20 | https://raw.githubusercontent.com/WilliamStar007/ClashX-V2Ray-TopFreeProxy/main/combine/clash.config.yaml
21 | https://raw.githubusercontent.com/Epodonios/v2ray-configs/main/All_Configs_base64_Sub.txt
22 | https://raw.githubusercontent.com/lagzian/SS-Collector/main/mix_clash.yaml
23 | https://raw.githubusercontent.com/ALIILAPRO/v2rayNG-Config/main/sub.txt
24 | https://raw.githubusercontent.com/MrMohebi/xray-proxy-grabber-telegram/master/collected-proxies/clash-meta/all.yaml
25 | https://raw.githubusercontent.com/Misaka-blog/chromego_merge/main/sub/merged_proxies_new.yaml
--------------------------------------------------------------------------------
/source/proxies.txt:
--------------------------------------------------------------------------------
1 | http://141.147.161.50:12580/clash/proxies
2 | http://150.230.195.209:12580/clash/proxies
3 | http://155.248.172.106:12580/clash/proxies
4 | http://174.137.58.32:12580/clash/proxies
5 | http://175.178.182.178:12580/clash/proxies
6 | http://66.42.50.118:12580/clash/proxies
7 | http://104.168.244.47:12580/clash/proxies
8 | http://beetle.lander.work/clash/proxies
9 | https://clashe.eu.org/clash/proxies
10 | https://proxy.crazygeeky.com/clash/proxies
11 | https://proxy.fldhhhhhh.top/clash/proxies
12 | https://proxypool.link/clash/proxies
13 | https://proxypool1999.banyunxiaoxi.icu/clash/proxies
--------------------------------------------------------------------------------
/source/tgchannel.json:
--------------------------------------------------------------------------------
1 | [
2 | "jiedian_share",
3 | "dingyue_center",
4 | "zerobaipiao",
5 | "freeV2rayi",
6 | "aifenxiang2020",
7 | "ShareCentrePro",
8 | "mftizi",
9 | "jiuJieD",
10 | "hkaa0",
11 | "V2ray60",
12 | "FreeV2rays",
13 | "JiedianSsr",
14 | "jiedianF",
15 | "wxdy666",
16 | "Socks5_bott",
17 | "MFJD666",
18 | "freevpnjd",
19 | "xinjichangguancha",
20 | "v2ray_configs_pool"
21 | ]
22 |
--------------------------------------------------------------------------------
/source/v2ray-2.txt:
--------------------------------------------------------------------------------
1 | dm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhTaUlzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpFM05tTm1OVFF0TXpoak55MDBOR1ZoTFdFM1kyVXRPR0k0TjJGbU1qWTVPR0V3SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkpJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1UTmlNR015TXkweVpHSXhMVFF5TmpZdE9XSmxPQzA1TjJOa1kyTXdNalF4T1RnaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTXkweFFpSXNJbUZrWkNJNkltNXZaR2xsTG5saGJtZHRhV1V1YjI1c2FXNWxJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNklqSTVObVE1Tm1OakxUQXhNbVF0TkdNek15MDROVGs0TFdGak9EZGhZakF4TjJKbE5TSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW5Ob2N5NTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNkwrcTVvdWNMVEZFSWl3aVlXUmtJam9pYlhWblpXNHhNUzQyWW01M0xuUnZjQ0lzSW5CdmNuUWlPaUk0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSXpOMkk0Wm1Vd1pTMWtOMk15TFRSaE9ERXRZamt3WlMwNVpHUmpOR0ppTmpaa1ptWWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKa2FXSmhhUzU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhRU0lzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpRMlkySXpabUV0WlRreE1pMDBNelU1TFRnell6UXROMlZpTXpjd01ETmhNRGhpSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVJaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJakk1Tm1RNU5tTmpMVEF4TW1RdE5HTXpNeTA0TlRrNExXRmpPRGRoWWpBeE4ySmxOU0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1pMHhRaUlzSW1Ga1pDSTZJbTExWjJWdU1qSXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSXlPVFprT1Raall5MHdNVEprTFRSak16TXRPRFU1T0MxaFl6ZzNZV0l3TVRkaVpUVWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTVMweFNDSXNJbUZrWkNJNkltTm1MakE1TURJeU55NTRlWG9pTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOR0ZsWmpNMk5EZ3RZMll5WVMwMFpXVTNMV0psTkdRdE1HUmpZVGMyT1RSbFlqY3pJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSeUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJNU1ETTJaV1F5WVMxaE56UXpMVFJtWVdVdE9UWTVOQzFqTXpnelkyTTNOamRtWkdRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4UkNJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTXpkaU9HWmxNR1V0WkRkak1pMDBZVGd4TFdJNU1HVXRPV1JrWXpSaVlqWTJaR1ptSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1VZ2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMFlXVm1NelkwT0MxalpqSmhMVFJsWlRjdFltVTBaQzB3WkdOaE56WTVOR1ZpTnpNaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5DMHhSU0lzSW1Ga1pDSTZJbUpsYzNSalppNTBiM0FpTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laVFkwWVRWbFlqVXRPR0ptT1MwME9EZ3pMVGt6WVRndE1tVXhOR1kxWkRKaVpEQXpJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhTU0lzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRFellqQmpNak10TW1SaU1TMDBNalkyTFRsaVpUZ3RPVGRqWkdOak1ESTBNVGs0SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4U0NJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpSaFpXWXpOalE0TFdObU1tRXROR1ZsTnkxaVpUUmtMVEJrWTJFM05qazBaV0kzTXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkdJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU9ESXpOR1EwWVMxaU1qZ3pMVFJtTnprdE9EWTNaQzA0TnpsaE9UbGpOR1pqWWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFNpSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU1UYzJZMlkxTkMwek9HTTNMVFEwWldFdFlUZGpaUzA0WWpnM1lXWXlOams0WVRBaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVNaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJamRpTXpSa05HSTJMVEU1WkRFdE5ETmxOeTA0WXpZd0xUQTNPR05sTlRBd05UTTRaQ0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRDVGlBeE1IZ3RNVVVpTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSmxOalJoTldWaU5TMDRZbVk1TFRRNE9ETXRPVE5oT0MweVpURTBaalZrTW1Ka01ETWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKb2EySnVMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4U1NJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVeE0ySXdZekl6TFRKa1lqRXROREkyTmkwNVltVTRMVGszWTJSall6QXlOREU1T0NJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4U3lJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRBNE9USXpaREV0TVRZd1ppMDBOVE5sTFdFMU56Z3RObUZqWVRGbVptRTRPVEl5SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTkMweFJ5SXNJbUZrWkNJNkltSmxjM1JqWmk1MGIzQWlMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU9UQXpObVZrTW1FdFlUYzBNeTAwWm1GbExUazJPVFF0WXpNNE0yTmpOelkzWm1Sa0lpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNkwrcTVvdWNMVEZESWl3aVlXUmtJam9pYlhWblpXNHhNUzQyWW01M0xuUnZjQ0lzSW5CdmNuUWlPaUk0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTNZak0wWkRSaU5pMHhPV1F4TFRRelpUY3RPR00yTUMwd056aGpaVFV3TURVek9HUWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKa2FXSmhhUzU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZMK3E1b3VjTFRGSUlpd2lZV1JrSWpvaWJYVm5aVzR4TVM0MlltNTNMblJ2Y0NJc0luQnZjblFpT2lJNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkwWVdWbU16WTBPQzFqWmpKaExUUmxaVGN0WW1VMFpDMHdaR05oTnpZNU5HVmlOek1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSmthV0poYVM1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4U1NJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRFellqQmpNak10TW1SaU1TMDBNalkyTFRsaVpUZ3RPVGRqWkdOak1ESTBNVGs0SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1VZ2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpSaFpXWXpOalE0TFdObU1tRXROR1ZsTnkxaVpUUmtMVEJrWTJFM05qazBaV0kzTXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNUzB4UWlJc0ltRmtaQ0k2SW1ObUxqQTVNREl5Tnk1NGVYb2lMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU1qazJaRGsyWTJNdE1ERXlaQzAwWXpNekxUZzFPVGd0WVdNNE4yRmlNREUzWW1VMUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTXkweFNpSXNJbUZrWkNJNkltNXZaR2xsTG5saGJtZHRhV1V1YjI1c2FXNWxJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNkltWXhOelpqWmpVMExUTTRZemN0TkRSbFlTMWhOMk5sTFRoaU9EZGhaakkyT1RoaE1DSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW5Ob2N5NTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1Va2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVeE0ySXdZekl6TFRKa1lqRXROREkyTmkwNVltVTRMVGszWTJSall6QXlOREU1T0NJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4UVNJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpRMlkySXpabUV0WlRreE1pMDBNelU1TFRnell6UXROMlZpTXpjd01ETmhNRGhpSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4U0NJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkwWVdWbU16WTBPQzFqWmpKaExUUmxaVGN0WW1VMFpDMHdaR05oTnpZNU5HVmlOek1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5DMHhSQ0lzSW1Ga1pDSTZJbUpsYzNSalppNTBiM0FpTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lNemRpT0dabE1HVXRaRGRqTWkwMFlUZ3hMV0k1TUdVdE9XUmtZelJpWWpZMlpHWm1JaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5DMHhTeUlzSW1Ga1pDSTZJbUpsYzNSalppNTBiM0FpTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOVEE0T1RJelpERXRNVFl3WmkwME5UTmxMV0UxTnpndE5tRmpZVEZtWm1FNE9USXlJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVwYXc1WXFnNVoyaFEwWXRNVW9pTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNkltWXhOelpqWmpVMExUTTRZemN0TkRSbFlTMWhOMk5sTFRoaU9EZGhaakkyT1RoaE1DSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW0xbmMyY3lMbnBvYjNWemFTNXNhVzVySWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNkwrcTVvdWNMVEZCSWl3aVlXUmtJam9pYlhWblpXNHhNUzQyWW01M0xuUnZjQ0lzSW5CdmNuUWlPaUk0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1ORFpqWWpObVlTMWxPVEV5TFRRek5Ua3RPRE5qTkMwM1pXSXpOekF3TTJFd09HSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKa2FXSmhhUzU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhTeUlzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRBNE9USXpaREV0TVRZd1ppMDBOVE5sTFdFMU56Z3RObUZqWVRGbVptRTRPVEl5SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4UkNJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUl6TjJJNFptVXdaUzFrTjJNeUxUUmhPREV0WWprd1pTMDVaR1JqTkdKaU5qWmtabVlpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhSU0lzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWlRZMFlUVmxZalV0T0dKbU9TMDBPRGd6TFRrellUZ3RNbVV4TkdZMVpESmlaREF6SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4U3lJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkxTURnNU1qTmtNUzB4TmpCbUxUUTFNMlV0WVRVM09DMDJZV05oTVdabVlUZzVNaklpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1pMHhTaUlzSW1Ga1pDSTZJbTExWjJWdU1qSXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1NVGMyWTJZMU5DMHpPR00zTFRRMFpXRXRZVGRqWlMwNFlqZzNZV1l5TmprNFlUQWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1Vc2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVd09Ea3lNMlF4TFRFMk1HWXRORFV6WlMxaE5UYzRMVFpoWTJFeFptWmhPRGt5TWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UVNJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1ZME5tTmlNMlpoTFdVNU1USXRORE0xT1MwNE0yTTBMVGRsWWpNM01EQXpZVEE0WWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdklPUzZtdW1wck9tQWlpQXdlQzB4UVNJc0ltRmtaQ0k2SWpFNExqRTJOeTR4TnpJdU1URXlJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1ORFpqWWpObVlTMWxPVEV5TFRRek5Ua3RPRE5qTkMwM1pXSXpOekF3TTJFd09HSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKaGQzTXVZVzV6YUM1MGIzQWlMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTkMweFJpSXNJbUZrWkNJNkltSmxjM1JqWmk1MGIzQWlMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaVpqZ3lNelJrTkdFdFlqSTRNeTAwWmpjNUxUZzJOMlF0T0RjNVlUazVZelJtWTJJeUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFFTSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU5EWmpZak5tWVMxbE9URXlMVFF6TlRrdE9ETmpOQzAzWldJek56QXdNMkV3T0dJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVjaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUk1TURNMlpXUXlZUzFoTnpRekxUUm1ZV1V0T1RZNU5DMWpNemd6WTJNM05qZG1aR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdFVJREV3ZUMweFFpSXNJbUZrWkNJNkltSmxkbVZ1ZEM1aWFXeHBZbWxzYVM1MGRpSXNJbkJ2Y25RaU9pSTBORE1pTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU1qazJaRGsyWTJNdE1ERXlaQzAwWXpNekxUZzFPVGd0WVdNNE4yRmlNREUzWW1VMUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYUd0MExuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRDVGlBeE1IZ3RNVW9pTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1NVGMyWTJZMU5DMHpPR00zTFRRMFpXRXRZVGRqWlMwNFlqZzNZV1l5TmprNFlUQWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKb2EySnVMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UXlJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkzWWpNMFpEUmlOaTB4T1dReExUUXpaVGN0T0dNMk1DMHdOemhqWlRVd01EVXpPR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZMK3E1b3VjTFRGS0lpd2lZV1JrSWpvaWJYVm5aVzR4TVM0MlltNTNMblJ2Y0NJc0luQnZjblFpT2lJNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUptTVRjMlkyWTFOQzB6T0dNM0xUUTBaV0V0WVRkalpTMDRZamczWVdZeU5qazRZVEFpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSmthV0poYVM1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkxJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1EZzVNak5rTVMweE5qQm1MVFExTTJVdFlUVTNPQzAyWVdOaE1XWm1ZVGc1TWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTVMweFJpSXNJbUZrWkNJNkltTm1MakE1TURJeU55NTRlWG9pTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laamd5TXpSa05HRXRZakk0TXkwMFpqYzVMVGcyTjJRdE9EYzVZVGs1WXpSbVkySXlJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhTeUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1EZzVNak5rTVMweE5qQm1MVFExTTJVdFlUVTNPQzAyWVdOaE1XWm1ZVGc1TWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4U1NJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkxTVROaU1HTXlNeTB5WkdJeExUUXlOall0T1dKbE9DMDVOMk5rWTJNd01qUXhPVGdpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVwYXc1WXFnNVoyaFEwWXRNVVlpTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNkltWTRNak0wWkRSaExXSXlPRE10TkdZM09TMDROamRrTFRnM09XRTVPV00wWm1OaU1pSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW0xbmMyY3lMbnBvYjNWemFTNXNhVzVySWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFFpSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4U0NJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTkdGbFpqTTJORGd0WTJZeVlTMDBaV1UzTFdKbE5HUXRNR1JqWVRjMk9UUmxZamN6SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4U1NJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRFellqQmpNak10TW1SaU1TMDBNalkyTFRsaVpUZ3RPVGRqWkdOak1ESTBNVGs0SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdklPUzZtdW1wck9tQWlpQXdlQzB4U1NJc0ltRmtaQ0k2SWpFNExqRTJOeTR4TnpJdU1URXlJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTFNVE5pTUdNeU15MHlaR0l4TFRReU5qWXRPV0psT0MwNU4yTmtZMk13TWpReE9UZ2lMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKaGQzTXVZVzV6YUM1MGIzQWlMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1VRWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU5EWmpZak5tWVMxbE9URXlMVFF6TlRrdE9ETmpOQzAzWldJek56QXdNMkV3T0dJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRDVGlBeE1IZ3RNVVlpTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1PREl6TkdRMFlTMWlNamd6TFRSbU56a3RPRFkzWkMwNE56bGhPVGxqTkdaallqSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKb2EySnVMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4UXlJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkzWWpNMFpEUmlOaTB4T1dReExUUXpaVGN0T0dNMk1DMHdOemhqWlRVd01EVXpPR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhRaUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVNaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkzWWpNMFpEUmlOaTB4T1dReExUUXpaVGN0T0dNMk1DMHdOemhqWlRVd01EVXpPR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTWkweFFTSXNJbUZrWkNJNkltMTFaMlZ1TWpJdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU5EWmpZak5tWVMxbE9URXlMVFF6TlRrdE9ETmpOQzAzWldJek56QXdNMkV3T0dJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UnlJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWprd016WmxaREpoTFdFM05ETXROR1poWlMwNU5qazBMV016T0ROall6YzJOMlprWkNJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4UmlJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUptT0RJek5HUTBZUzFpTWpnekxUUm1Oemt0T0RZM1pDMDROemxoT1Rsak5HWmpZaklpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhTaUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU1UYzJZMlkxTkMwek9HTTNMVFEwWldFdFlUZGpaUzA0WWpnM1lXWXlOams0WVRBaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UlNJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUpsTmpSaE5XVmlOUzA0WW1ZNUxUUTRPRE10T1ROaE9DMHlaVEUwWmpWa01tSmtNRE1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhTQ0lzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOR0ZsWmpNMk5EZ3RZMll5WVMwMFpXVTNMV0psTkdRdE1HUmpZVGMyT1RSbFlqY3pJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4U0NJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkwWVdWbU16WTBPQzFqWmpKaExUUmxaVGN0WW1VMFpDMHdaR05oTnpZNU5HVmlOek1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhReUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJM1lqTTBaRFJpTmkweE9XUXhMVFF6WlRjdE9HTTJNQzB3TnpoalpUVXdNRFV6T0dRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4UWlJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTWprMlpEazJZMk10TURFeVpDMDBZek16TFRnMU9UZ3RZV000TjJGaU1ERTNZbVUxSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVRaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUl6TjJJNFptVXdaUzFrTjJNeUxUUmhPREV0WWprd1pTMDVaR1JqTkdKaU5qWmtabVlpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTkMweFF5SXNJbUZrWkNJNkltSmxjM1JqWmk1MGIzQWlMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU4ySXpOR1EwWWpZdE1UbGtNUzAwTTJVM0xUaGpOakF0TURjNFkyVTFNREExTXpoa0lpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1Vc2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1EZzVNak5rTVMweE5qQm1MVFExTTJVdFlUVTNPQzAyWVdOaE1XWm1ZVGc1TWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1pMHhTeUlzSW1Ga1pDSTZJbTExWjJWdU1qSXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTFNRGc1TWpOa01TMHhOakJtTFRRMU0yVXRZVFUzT0MwMllXTmhNV1ptWVRnNU1qSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTVMweFF5SXNJbUZrWkNJNkltTm1MakE1TURJeU55NTRlWG9pTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOMkl6TkdRMFlqWXRNVGxrTVMwME0yVTNMVGhqTmpBdE1EYzRZMlUxTURBMU16aGtJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSQ0lzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJek4ySTRabVV3WlMxa04yTXlMVFJoT0RFdFlqa3daUzA1WkdSak5HSmlOalprWm1ZaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UkNJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUl6TjJJNFptVXdaUzFrTjJNeUxUUmhPREV0WWprd1pTMDVaR1JqTkdKaU5qWmtabVlpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSaUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU9ESXpOR1EwWVMxaU1qZ3pMVFJtTnprdE9EWTNaQzA0TnpsaE9UbGpOR1pqWWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkhJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJNU1ETTJaV1F5WVMxaE56UXpMVFJtWVdVdE9UWTVOQzFqTXpnelkyTTNOamRtWkdRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTXkweFJDSXNJbUZrWkNJNkltNXZaR2xsTG5saGJtZHRhV1V1YjI1c2FXNWxJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNklqTTNZamhtWlRCbExXUTNZekl0TkdFNE1TMWlPVEJsTFRsa1pHTTBZbUkyTm1SbVppSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW5Ob2N5NTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1VVWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1VMk5HRTFaV0kxTFRoaVpqa3RORGc0TXkwNU0yRTRMVEpsTVRSbU5XUXlZbVF3TXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVjaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJamt3TXpabFpESmhMV0UzTkRNdE5HWmhaUzA1TmprMExXTXpPRE5qWXpjMk4yWmtaQ0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhTaUlzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laakUzTm1ObU5UUXRNemhqTnkwME5HVmhMV0UzWTJVdE9HSTROMkZtTWpZNU9HRXdJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkNJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1VSWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSU0lzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbE5qUmhOV1ZpTlMwNFltWTVMVFE0T0RNdE9UTmhPQzB5WlRFMFpqVmtNbUprTURNaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UmlJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUptT0RJek5HUTBZUzFpTWpnekxUUm1Oemt0T0RZM1pDMDROemxoT1Rsak5HWmpZaklpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5TMHhTU0lzSW1Ga1pDSTZJbTExWjJWdU1URXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTFNVE5pTUdNeU15MHlaR0l4TFRReU5qWXRPV0psT0MwNU4yTmtZMk13TWpReE9UZ2lMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFJ5SXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJNU1ETTJaV1F5WVMxaE56UXpMVFJtWVdVdE9UWTVOQzFqTXpnelkyTTNOamRtWkdRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UmlJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1ZNE1qTTBaRFJoTFdJeU9ETXROR1kzT1MwNE5qZGtMVGczT1dFNU9XTTBabU5pTWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UnlJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUk1TURNMlpXUXlZUzFoTnpRekxUUm1ZV1V0T1RZNU5DMWpNemd6WTJNM05qZG1aR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhRU0lzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laalEyWTJJelptRXRaVGt4TWkwME16VTVMVGd6WXpRdE4yVmlNemN3TUROaE1EaGlJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4UlNJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWlRZMFlUVmxZalV0T0dKbU9TMDBPRGd6TFRrellUZ3RNbVV4TkdZMVpESmlaREF6SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdFVJREV3ZUMweFJ5SXNJbUZrWkNJNkltSmxkbVZ1ZEM1aWFXeHBZbWxzYVM1MGRpSXNJbkJ2Y25RaU9pSTBORE1pTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU9UQXpObVZrTW1FdFlUYzBNeTAwWm1GbExUazJPVFF0WXpNNE0yTmpOelkzWm1Sa0lpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYUd0MExuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZMK3E1b3VjTFRGRklpd2lZV1JrSWpvaWJYVm5aVzR4TVM0MlltNTNMblJ2Y0NJc0luQnZjblFpT2lJNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUpsTmpSaE5XVmlOUzA0WW1ZNUxUUTRPRE10T1ROaE9DMHlaVEUwWmpWa01tSmtNRE1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSmthV0poYVM1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVraUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkxTVROaU1HTXlNeTB5WkdJeExUUXlOall0T1dKbE9DMDVOMk5rWTJNd01qUXhPVGdpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFJTSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbE5qUmhOV1ZpTlMwNFltWTVMVFE0T0RNdE9UTmhPQzB5WlRFMFpqVmtNbUprTURNaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNUzB4UkNJc0ltRmtaQ0k2SW1ObUxqQTVNREl5Tnk1NGVYb2lMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU16ZGlPR1psTUdVdFpEZGpNaTAwWVRneExXSTVNR1V0T1dSa1l6UmlZalkyWkdabUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdFVJREV3ZUMweFJpSXNJbUZrWkNJNkltSmxkbVZ1ZEM1aWFXeHBZbWxzYVM1MGRpSXNJbkJ2Y25RaU9pSTBORE1pTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaVpqZ3lNelJrTkdFdFlqSTRNeTAwWmpjNUxUZzJOMlF0T0RjNVlUazVZelJtWTJJeUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYUd0MExuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhSeUlzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pT1RBek5tVmtNbUV0WVRjME15MDBabUZsTFRrMk9UUXRZek00TTJOak56WTNabVJrSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4U3lJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVd09Ea3lNMlF4TFRFMk1HWXRORFV6WlMxaE5UYzRMVFpoWTJFeFptWmhPRGt5TWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4U2lJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpFM05tTm1OVFF0TXpoak55MDBOR1ZoTFdFM1kyVXRPR0k0TjJGbU1qWTVPR0V3SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdklPUzZtdW1wck9tQWlpQXdlQzB4U0NJc0ltRmtaQ0k2SWpFNExqRTJOeTR4TnpJdU1URXlJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTBZV1ZtTXpZME9DMWpaakpoTFRSbFpUY3RZbVUwWkMwd1pHTmhOelk1TkdWaU56TWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKaGQzTXVZVzV6YUM1MGIzQWlMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1VRWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1ZME5tTmlNMlpoTFdVNU1USXRORE0xT1MwNE0yTTBMVGRsWWpNM01EQXpZVEE0WWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UlNJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1VMk5HRTFaV0kxTFRoaVpqa3RORGc0TXkwNU0yRTRMVEpsTVRSbU5XUXlZbVF3TXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVRaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJak0zWWpobVpUQmxMV1EzWXpJdE5HRTRNUzFpT1RCbExUbGtaR00wWW1JMk5tUm1aaUlzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU15MHhReUlzSW1Ga1pDSTZJbTV2WkdsbExubGhibWR0YVdVdWIyNXNhVzVsSWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJamRpTXpSa05HSTJMVEU1WkRFdE5ETmxOeTA0WXpZd0xUQTNPR05sTlRBd05UTTRaQ0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkluTm9jeTU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhReUlzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOMkl6TkdRMFlqWXRNVGxrTVMwME0yVTNMVGhqTmpBdE1EYzRZMlUxTURBMU16aGtJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09Cg==
--------------------------------------------------------------------------------
/source/webfuzz.yaml:
--------------------------------------------------------------------------------
1 | # 20230708
2 | - type: webfuzz
3 | options:
4 | url: https://raw.githubusercontent.com/abshare/abshare.github.io/main/README.md
5 |
6 | - type: webfuzz
7 | options:
8 | url: https://raw.githubusercontent.com/mksshare/mksshare.github.io/main/README.md
9 |
10 | - type: webfuzzsub
11 | options:
12 | url: https://raw.githubusercontent.com/WilliamStar007/ClashX-V2Ray-TopFreeProxy/main/README.md
13 |
14 | - type: webfuzz
15 | options:
16 | url: https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list_raw.txt
17 |
18 | - type: webfuzz
19 | options:
20 | url: https://raw.githubusercontent.com/yaney01/Yaney01/main/README.md
21 |
22 | # 20230729
23 | - type: webfuzz
24 | options:
25 | url: https://raw.githubusercontent.com/HakurouKen/free-node/main/public
26 |
27 | # 20230813
28 | - type: webfuzz
29 | options:
30 | url: https://raw.githubusercontent.com/MrMohebi/xray-proxy-grabber-telegram/master/collected-proxies/row-url/actives.txt
31 |
32 | # 20230909
33 | - type: webfuzz
34 | options:
35 | url: https://raw.githubusercontent.com/shabane/kamaji/master/hub/merged.txt
36 |
37 | # 20231108
38 | - type: webfuzz
39 | options:
40 | url: https://raw.githubusercontent.com/barry-far/V2ray-Configs/main/All_Configs_Sub.txt
41 |
42 | # 20240218
43 | - type: webfuzz
44 | options:
45 | url: https://raw.githubusercontent.com/markbang/chromegopacs/main/hy2pac.txt
46 |
47 | # 20240415
48 | - type: webfuzz
49 | options:
50 | url: https://raw.githubusercontent.com/imohammadkhalili/V2RAY/main/Mkhalili
51 |
--------------------------------------------------------------------------------
/spider/IP2LOCATION-LITE-DB1.BIN:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/snakem982/proxypool/97c56684a953f900b4dcf541a97e905c84b00d68/spider/IP2LOCATION-LITE-DB1.BIN
--------------------------------------------------------------------------------
/spider/clash.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "github.com/metacubex/mihomo/config"
5 | "log"
6 | "sync"
7 | )
8 |
9 | func init() {
10 | Register(CollectClash, NewClashCollect)
11 | }
12 |
13 | type Clash struct {
14 | Url string
15 | }
16 |
17 | func (c *Clash) Get() []map[string]any {
18 | proxies := make([]map[string]any, 0)
19 |
20 | all := GetBytes(c.Url)
21 | if all != nil {
22 | rawCfg, err := config.UnmarshalRawConfig(all)
23 | if err == nil && rawCfg.Proxy != nil {
24 | proxies = rawCfg.Proxy
25 | }
26 | }
27 |
28 | return proxies
29 | }
30 |
31 | func (c *Clash) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) {
32 | defer wg.Done()
33 | nodes := c.Get()
34 | log.Printf("STATISTIC: Clash count=%d url=%s\n", len(nodes), c.Url)
35 | if len(nodes) > 0 {
36 | pc <- nodes
37 | }
38 | }
39 |
40 | func NewClashCollect(getter Getter) Collect {
41 | return &Clash{Url: getter.Url}
42 | }
43 |
--------------------------------------------------------------------------------
/spider/flags.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "code": "AD",
4 | "emoji": "🇦🇩",
5 | "unicode": "U+1F1E6 U+1F1E9",
6 | "name": "Andorra",
7 | "title": "flag for Andorra",
8 | "dialCode": "+376"
9 | },
10 | {
11 | "code": "AE",
12 | "emoji": "🇦🇪",
13 | "unicode": "U+1F1E6 U+1F1EA",
14 | "name": "United Arab Emirates",
15 | "title": "flag for United Arab Emirates",
16 | "dialCode": "+971"
17 | },
18 | {
19 | "code": "AF",
20 | "emoji": "🇦🇫",
21 | "unicode": "U+1F1E6 U+1F1EB",
22 | "name": "Afghanistan",
23 | "title": "flag for Afghanistan",
24 | "dialCode": "+93"
25 | },
26 | {
27 | "code": "AG",
28 | "emoji": "🇦🇬",
29 | "unicode": "U+1F1E6 U+1F1EC",
30 | "name": "Antigua and Barbuda",
31 | "title": "flag for Antigua and Barbuda",
32 | "dialCode": "+1268"
33 | },
34 | {
35 | "code": "AI",
36 | "emoji": "🇦🇮",
37 | "unicode": "U+1F1E6 U+1F1EE",
38 | "name": "Anguilla",
39 | "title": "flag for Anguilla",
40 | "dialCode": "+1 264"
41 | },
42 | {
43 | "code": "AL",
44 | "emoji": "🇦🇱",
45 | "unicode": "U+1F1E6 U+1F1F1",
46 | "name": "Albania",
47 | "title": "flag for Albania",
48 | "dialCode": "+355"
49 | },
50 | {
51 | "code": "AM",
52 | "emoji": "🇦🇲",
53 | "unicode": "U+1F1E6 U+1F1F2",
54 | "name": "Armenia",
55 | "title": "flag for Armenia",
56 | "dialCode": "+374"
57 | },
58 | {
59 | "code": "AO",
60 | "emoji": "🇦🇴",
61 | "unicode": "U+1F1E6 U+1F1F4",
62 | "name": "Angola",
63 | "title": "flag for Angola",
64 | "dialCode": "+244"
65 | },
66 | {
67 | "code": "AQ",
68 | "emoji": "🇦🇶",
69 | "unicode": "U+1F1E6 U+1F1F6",
70 | "name": "Antarctica",
71 | "title": "flag for Antarctica",
72 | "dialCode": null
73 | },
74 | {
75 | "code": "AR",
76 | "emoji": "🇦🇷",
77 | "unicode": "U+1F1E6 U+1F1F7",
78 | "name": "Argentina",
79 | "title": "flag for Argentina",
80 | "dialCode": "+54"
81 | },
82 | {
83 | "code": "AS",
84 | "emoji": "🇦🇸",
85 | "unicode": "U+1F1E6 U+1F1F8",
86 | "name": "American Samoa",
87 | "title": "flag for American Samoa",
88 | "dialCode": "+1 684"
89 | },
90 | {
91 | "code": "AT",
92 | "emoji": "🇦🇹",
93 | "unicode": "U+1F1E6 U+1F1F9",
94 | "name": "Austria",
95 | "title": "flag for Austria",
96 | "dialCode": "+43"
97 | },
98 | {
99 | "code": "AU",
100 | "emoji": "🇦🇺",
101 | "unicode": "U+1F1E6 U+1F1FA",
102 | "name": "Australia",
103 | "title": "flag for Australia",
104 | "dialCode": "+61"
105 | },
106 | {
107 | "code": "AW",
108 | "emoji": "🇦🇼",
109 | "unicode": "U+1F1E6 U+1F1FC",
110 | "name": "Aruba",
111 | "title": "flag for Aruba",
112 | "dialCode": "+297"
113 | },
114 | {
115 | "code": "AX",
116 | "emoji": "🇦🇽",
117 | "unicode": "U+1F1E6 U+1F1FD",
118 | "name": "Åland Islands",
119 | "title": "flag for Åland Islands",
120 | "dialCode": ""
121 | },
122 | {
123 | "code": "AZ",
124 | "emoji": "🇦🇿",
125 | "unicode": "U+1F1E6 U+1F1FF",
126 | "name": "Azerbaijan",
127 | "title": "flag for Azerbaijan",
128 | "dialCode": "+994"
129 | },
130 | {
131 | "code": "BA",
132 | "emoji": "🇧🇦",
133 | "unicode": "U+1F1E7 U+1F1E6",
134 | "name": "Bosnia and Herzegovina",
135 | "title": "flag for Bosnia and Herzegovina",
136 | "dialCode": "+387"
137 | },
138 | {
139 | "code": "BB",
140 | "emoji": "🇧🇧",
141 | "unicode": "U+1F1E7 U+1F1E7",
142 | "name": "Barbados",
143 | "title": "flag for Barbados",
144 | "dialCode": "+1 246"
145 | },
146 | {
147 | "code": "BD",
148 | "emoji": "🇧🇩",
149 | "unicode": "U+1F1E7 U+1F1E9",
150 | "name": "Bangladesh",
151 | "title": "flag for Bangladesh",
152 | "dialCode": "+880"
153 | },
154 | {
155 | "code": "BE",
156 | "emoji": "🇧🇪",
157 | "unicode": "U+1F1E7 U+1F1EA",
158 | "name": "Belgium",
159 | "title": "flag for Belgium",
160 | "dialCode": "+32"
161 | },
162 | {
163 | "code": "BF",
164 | "emoji": "🇧🇫",
165 | "unicode": "U+1F1E7 U+1F1EB",
166 | "name": "Burkina Faso",
167 | "title": "flag for Burkina Faso",
168 | "dialCode": "+226"
169 | },
170 | {
171 | "code": "BG",
172 | "emoji": "🇧🇬",
173 | "unicode": "U+1F1E7 U+1F1EC",
174 | "name": "Bulgaria",
175 | "title": "flag for Bulgaria",
176 | "dialCode": "+359"
177 | },
178 | {
179 | "code": "BH",
180 | "emoji": "🇧🇭",
181 | "unicode": "U+1F1E7 U+1F1ED",
182 | "name": "Bahrain",
183 | "title": "flag for Bahrain",
184 | "dialCode": "+973"
185 | },
186 | {
187 | "code": "BI",
188 | "emoji": "🇧🇮",
189 | "unicode": "U+1F1E7 U+1F1EE",
190 | "name": "Burundi",
191 | "title": "flag for Burundi",
192 | "dialCode": "+257"
193 | },
194 | {
195 | "code": "BJ",
196 | "emoji": "🇧🇯",
197 | "unicode": "U+1F1E7 U+1F1EF",
198 | "name": "Benin",
199 | "title": "flag for Benin",
200 | "dialCode": "+229"
201 | },
202 | {
203 | "code": "BL",
204 | "emoji": "🇧🇱",
205 | "unicode": "U+1F1E7 U+1F1F1",
206 | "name": "Saint Barthélemy",
207 | "title": "flag for Saint Barthélemy",
208 | "dialCode": "+590"
209 | },
210 | {
211 | "code": "BM",
212 | "emoji": "🇧🇲",
213 | "unicode": "U+1F1E7 U+1F1F2",
214 | "name": "Bermuda",
215 | "title": "flag for Bermuda",
216 | "dialCode": "+1 441"
217 | },
218 | {
219 | "code": "BN",
220 | "emoji": "🇧🇳",
221 | "unicode": "U+1F1E7 U+1F1F3",
222 | "name": "Brunei Darussalam",
223 | "title": "flag for Brunei Darussalam",
224 | "dialCode": "+673"
225 | },
226 | {
227 | "code": "BO",
228 | "emoji": "🇧🇴",
229 | "unicode": "U+1F1E7 U+1F1F4",
230 | "name": "Bolivia",
231 | "title": "flag for Bolivia",
232 | "dialCode": "+591"
233 | },
234 | {
235 | "code": "BQ",
236 | "emoji": "🇧🇶",
237 | "unicode": "U+1F1E7 U+1F1F6",
238 | "name": "Bonaire, Sint Eustatius and Saba",
239 | "title": "flag for Bonaire, Sint Eustatius and Saba"
240 | },
241 | {
242 | "code": "BR",
243 | "emoji": "🇧🇷",
244 | "unicode": "U+1F1E7 U+1F1F7",
245 | "name": "Brazil",
246 | "title": "flag for Brazil",
247 | "dialCode": "+55"
248 | },
249 | {
250 | "code": "BS",
251 | "emoji": "🇧🇸",
252 | "unicode": "U+1F1E7 U+1F1F8",
253 | "name": "Bahamas",
254 | "title": "flag for Bahamas",
255 | "dialCode": "+1 242"
256 | },
257 | {
258 | "code": "BT",
259 | "emoji": "🇧🇹",
260 | "unicode": "U+1F1E7 U+1F1F9",
261 | "name": "Bhutan",
262 | "title": "flag for Bhutan",
263 | "dialCode": "+975"
264 | },
265 | {
266 | "code": "BV",
267 | "emoji": "🇧🇻",
268 | "unicode": "U+1F1E7 U+1F1FB",
269 | "name": "Bouvet Island",
270 | "title": "flag for Bouvet Island"
271 | },
272 | {
273 | "code": "BW",
274 | "emoji": "🇧🇼",
275 | "unicode": "U+1F1E7 U+1F1FC",
276 | "name": "Botswana",
277 | "title": "flag for Botswana",
278 | "dialCode": "+267"
279 | },
280 | {
281 | "code": "BY",
282 | "emoji": "🇧🇾",
283 | "unicode": "U+1F1E7 U+1F1FE",
284 | "name": "Belarus",
285 | "title": "flag for Belarus",
286 | "dialCode": "+375"
287 | },
288 | {
289 | "code": "BZ",
290 | "emoji": "🇧🇿",
291 | "unicode": "U+1F1E7 U+1F1FF",
292 | "name": "Belize",
293 | "title": "flag for Belize",
294 | "dialCode": "+501"
295 | },
296 | {
297 | "code": "CA",
298 | "emoji": "🇨🇦",
299 | "unicode": "U+1F1E8 U+1F1E6",
300 | "name": "Canada",
301 | "title": "flag for Canada",
302 | "dialCode": "+1"
303 | },
304 | {
305 | "code": "CC",
306 | "emoji": "🇨🇨",
307 | "unicode": "U+1F1E8 U+1F1E8",
308 | "name": "Cocos (Keeling) Islands",
309 | "title": "flag for Cocos (Keeling) Islands",
310 | "dialCode": "+61"
311 | },
312 | {
313 | "code": "CD",
314 | "emoji": "🇨🇩",
315 | "unicode": "U+1F1E8 U+1F1E9",
316 | "name": "Congo",
317 | "title": "flag for Congo",
318 | "dialCode": "+243"
319 | },
320 | {
321 | "code": "CF",
322 | "emoji": "🇨🇫",
323 | "unicode": "U+1F1E8 U+1F1EB",
324 | "name": "Central African Republic",
325 | "title": "flag for Central African Republic",
326 | "dialCode": "+236"
327 | },
328 | {
329 | "code": "CG",
330 | "emoji": "🇨🇬",
331 | "unicode": "U+1F1E8 U+1F1EC",
332 | "name": "Congo",
333 | "title": "flag for Congo",
334 | "dialCode": "+242"
335 | },
336 | {
337 | "code": "CH",
338 | "emoji": "🇨🇭",
339 | "unicode": "U+1F1E8 U+1F1ED",
340 | "name": "Switzerland",
341 | "title": "flag for Switzerland",
342 | "dialCode": "+41"
343 | },
344 | {
345 | "code": "CI",
346 | "emoji": "🇨🇮",
347 | "unicode": "U+1F1E8 U+1F1EE",
348 | "name": "Côte D'Ivoire",
349 | "title": "flag for Côte D'Ivoire",
350 | "dialCode": "+225"
351 | },
352 | {
353 | "code": "CK",
354 | "emoji": "🇨🇰",
355 | "unicode": "U+1F1E8 U+1F1F0",
356 | "name": "Cook Islands",
357 | "title": "flag for Cook Islands",
358 | "dialCode": "+682"
359 | },
360 | {
361 | "code": "CL",
362 | "emoji": "🇨🇱",
363 | "unicode": "U+1F1E8 U+1F1F1",
364 | "name": "Chile",
365 | "title": "flag for Chile",
366 | "dialCode": "+56"
367 | },
368 | {
369 | "code": "CM",
370 | "emoji": "🇨🇲",
371 | "unicode": "U+1F1E8 U+1F1F2",
372 | "name": "Cameroon",
373 | "title": "flag for Cameroon",
374 | "dialCode": "+237"
375 | },
376 | {
377 | "code": "CN",
378 | "emoji": "🇨🇳",
379 | "unicode": "U+1F1E8 U+1F1F3",
380 | "name": "China",
381 | "title": "flag for China",
382 | "dialCode": "+86"
383 | },
384 | {
385 | "code": "CO",
386 | "emoji": "🇨🇴",
387 | "unicode": "U+1F1E8 U+1F1F4",
388 | "name": "Colombia",
389 | "title": "flag for Colombia",
390 | "dialCode": "+57"
391 | },
392 | {
393 | "code": "CR",
394 | "emoji": "🇨🇷",
395 | "unicode": "U+1F1E8 U+1F1F7",
396 | "name": "Costa Rica",
397 | "title": "flag for Costa Rica",
398 | "dialCode": "+506"
399 | },
400 | {
401 | "code": "CU",
402 | "emoji": "🇨🇺",
403 | "unicode": "U+1F1E8 U+1F1FA",
404 | "name": "Cuba",
405 | "title": "flag for Cuba",
406 | "dialCode": "+53"
407 | },
408 | {
409 | "code": "CV",
410 | "emoji": "🇨🇻",
411 | "unicode": "U+1F1E8 U+1F1FB",
412 | "name": "Cape Verde",
413 | "title": "flag for Cape Verde",
414 | "dialCode": "+238"
415 | },
416 | {
417 | "code": "CW",
418 | "emoji": "🇨🇼",
419 | "unicode": "U+1F1E8 U+1F1FC",
420 | "name": "Curaçao",
421 | "title": "flag for Curaçao"
422 | },
423 | {
424 | "code": "CX",
425 | "emoji": "🇨🇽",
426 | "unicode": "U+1F1E8 U+1F1FD",
427 | "name": "Christmas Island",
428 | "title": "flag for Christmas Island",
429 | "dialCode": "+61"
430 | },
431 | {
432 | "code": "CY",
433 | "emoji": "🇨🇾",
434 | "unicode": "U+1F1E8 U+1F1FE",
435 | "name": "Cyprus",
436 | "title": "flag for Cyprus",
437 | "dialCode": "+537"
438 | },
439 | {
440 | "code": "CZ",
441 | "emoji": "🇨🇿",
442 | "unicode": "U+1F1E8 U+1F1FF",
443 | "name": "Czech Republic",
444 | "title": "flag for Czech Republic",
445 | "dialCode": "+420"
446 | },
447 | {
448 | "code": "DE",
449 | "emoji": "🇩🇪",
450 | "unicode": "U+1F1E9 U+1F1EA",
451 | "name": "Germany",
452 | "title": "flag for Germany",
453 | "dialCode": "+49"
454 | },
455 | {
456 | "code": "DJ",
457 | "emoji": "🇩🇯",
458 | "unicode": "U+1F1E9 U+1F1EF",
459 | "name": "Djibouti",
460 | "title": "flag for Djibouti",
461 | "dialCode": "+253"
462 | },
463 | {
464 | "code": "DK",
465 | "emoji": "🇩🇰",
466 | "unicode": "U+1F1E9 U+1F1F0",
467 | "name": "Denmark",
468 | "title": "flag for Denmark",
469 | "dialCode": "+45"
470 | },
471 | {
472 | "code": "DM",
473 | "emoji": "🇩🇲",
474 | "unicode": "U+1F1E9 U+1F1F2",
475 | "name": "Dominica",
476 | "title": "flag for Dominica",
477 | "dialCode": "+1 767"
478 | },
479 | {
480 | "code": "DO",
481 | "emoji": "🇩🇴",
482 | "unicode": "U+1F1E9 U+1F1F4",
483 | "name": "Dominican Republic",
484 | "title": "flag for Dominican Republic",
485 | "dialCode": "+1 849"
486 | },
487 | {
488 | "code": "DZ",
489 | "emoji": "🇩🇿",
490 | "unicode": "U+1F1E9 U+1F1FF",
491 | "name": "Algeria",
492 | "title": "flag for Algeria",
493 | "dialCode": "+213"
494 | },
495 | {
496 | "code": "EC",
497 | "emoji": "🇪🇨",
498 | "unicode": "U+1F1EA U+1F1E8",
499 | "name": "Ecuador",
500 | "title": "flag for Ecuador",
501 | "dialCode": "+593"
502 | },
503 | {
504 | "code": "EE",
505 | "emoji": "🇪🇪",
506 | "unicode": "U+1F1EA U+1F1EA",
507 | "name": "Estonia",
508 | "title": "flag for Estonia",
509 | "dialCode": "+372"
510 | },
511 | {
512 | "code": "EG",
513 | "emoji": "🇪🇬",
514 | "unicode": "U+1F1EA U+1F1EC",
515 | "name": "Egypt",
516 | "title": "flag for Egypt",
517 | "dialCode": "+20"
518 | },
519 | {
520 | "code": "EH",
521 | "emoji": "🇪🇭",
522 | "unicode": "U+1F1EA U+1F1ED",
523 | "name": "Western Sahara",
524 | "title": "flag for Western Sahara"
525 | },
526 | {
527 | "code": "ER",
528 | "emoji": "🇪🇷",
529 | "unicode": "U+1F1EA U+1F1F7",
530 | "name": "Eritrea",
531 | "title": "flag for Eritrea",
532 | "dialCode": "+291"
533 | },
534 | {
535 | "code": "ES",
536 | "emoji": "🇪🇸",
537 | "unicode": "U+1F1EA U+1F1F8",
538 | "name": "Spain",
539 | "title": "flag for Spain",
540 | "dialCode": "+34"
541 | },
542 | {
543 | "code": "ET",
544 | "emoji": "🇪🇹",
545 | "unicode": "U+1F1EA U+1F1F9",
546 | "name": "Ethiopia",
547 | "title": "flag for Ethiopia",
548 | "dialCode": "+251"
549 | },
550 | {
551 | "code": "EU",
552 | "emoji": "🇪🇺",
553 | "unicode": "U+1F1EA U+1F1FA",
554 | "name": "European Union",
555 | "title": "flag for European Union"
556 | },
557 | {
558 | "code": "FI",
559 | "emoji": "🇫🇮",
560 | "unicode": "U+1F1EB U+1F1EE",
561 | "name": "Finland",
562 | "title": "flag for Finland",
563 | "dialCode": "+358"
564 | },
565 | {
566 | "code": "FJ",
567 | "emoji": "🇫🇯",
568 | "unicode": "U+1F1EB U+1F1EF",
569 | "name": "Fiji",
570 | "title": "flag for Fiji",
571 | "dialCode": "+679"
572 | },
573 | {
574 | "code": "FK",
575 | "emoji": "🇫🇰",
576 | "unicode": "U+1F1EB U+1F1F0",
577 | "name": "Falkland Islands (Malvinas)",
578 | "title": "flag for Falkland Islands (Malvinas)",
579 | "dialCode": "+500"
580 | },
581 | {
582 | "code": "FM",
583 | "emoji": "🇫🇲",
584 | "unicode": "U+1F1EB U+1F1F2",
585 | "name": "Micronesia",
586 | "title": "flag for Micronesia",
587 | "dialCode": "+691"
588 | },
589 | {
590 | "code": "FO",
591 | "emoji": "🇫🇴",
592 | "unicode": "U+1F1EB U+1F1F4",
593 | "name": "Faroe Islands",
594 | "title": "flag for Faroe Islands",
595 | "dialCode": "+298"
596 | },
597 | {
598 | "code": "FR",
599 | "emoji": "🇫🇷",
600 | "unicode": "U+1F1EB U+1F1F7",
601 | "name": "France",
602 | "title": "flag for France",
603 | "dialCode": "+33"
604 | },
605 | {
606 | "code": "GA",
607 | "emoji": "🇬🇦",
608 | "unicode": "U+1F1EC U+1F1E6",
609 | "name": "Gabon",
610 | "title": "flag for Gabon",
611 | "dialCode": "+241"
612 | },
613 | {
614 | "code": "GB",
615 | "emoji": "🇬🇧",
616 | "unicode": "U+1F1EC U+1F1E7",
617 | "name": "United Kingdom",
618 | "title": "flag for United Kingdom",
619 | "dialCode": "+44"
620 | },
621 | {
622 | "code": "GD",
623 | "emoji": "🇬🇩",
624 | "unicode": "U+1F1EC U+1F1E9",
625 | "name": "Grenada",
626 | "title": "flag for Grenada",
627 | "dialCode": "+1 473"
628 | },
629 | {
630 | "code": "GE",
631 | "emoji": "🇬🇪",
632 | "unicode": "U+1F1EC U+1F1EA",
633 | "name": "Georgia",
634 | "title": "flag for Georgia",
635 | "dialCode": "+995"
636 | },
637 | {
638 | "code": "GF",
639 | "emoji": "🇬🇫",
640 | "unicode": "U+1F1EC U+1F1EB",
641 | "name": "French Guiana",
642 | "title": "flag for French Guiana",
643 | "dialCode": "+594"
644 | },
645 | {
646 | "code": "GG",
647 | "emoji": "🇬🇬",
648 | "unicode": "U+1F1EC U+1F1EC",
649 | "name": "Guernsey",
650 | "title": "flag for Guernsey",
651 | "dialCode": "+44"
652 | },
653 | {
654 | "code": "GH",
655 | "emoji": "🇬🇭",
656 | "unicode": "U+1F1EC U+1F1ED",
657 | "name": "Ghana",
658 | "title": "flag for Ghana",
659 | "dialCode": "+233"
660 | },
661 | {
662 | "code": "GI",
663 | "emoji": "🇬🇮",
664 | "unicode": "U+1F1EC U+1F1EE",
665 | "name": "Gibraltar",
666 | "title": "flag for Gibraltar",
667 | "dialCode": "+350"
668 | },
669 | {
670 | "code": "GL",
671 | "emoji": "🇬🇱",
672 | "unicode": "U+1F1EC U+1F1F1",
673 | "name": "Greenland",
674 | "title": "flag for Greenland",
675 | "dialCode": "+299"
676 | },
677 | {
678 | "code": "GM",
679 | "emoji": "🇬🇲",
680 | "unicode": "U+1F1EC U+1F1F2",
681 | "name": "Gambia",
682 | "title": "flag for Gambia",
683 | "dialCode": "+220"
684 | },
685 | {
686 | "code": "GN",
687 | "emoji": "🇬🇳",
688 | "unicode": "U+1F1EC U+1F1F3",
689 | "name": "Guinea",
690 | "title": "flag for Guinea",
691 | "dialCode": "+224"
692 | },
693 | {
694 | "code": "GP",
695 | "emoji": "🇬🇵",
696 | "unicode": "U+1F1EC U+1F1F5",
697 | "name": "Guadeloupe",
698 | "title": "flag for Guadeloupe",
699 | "dialCode": "+590"
700 | },
701 | {
702 | "code": "GQ",
703 | "emoji": "🇬🇶",
704 | "unicode": "U+1F1EC U+1F1F6",
705 | "name": "Equatorial Guinea",
706 | "title": "flag for Equatorial Guinea",
707 | "dialCode": "+240"
708 | },
709 | {
710 | "code": "GR",
711 | "emoji": "🇬🇷",
712 | "unicode": "U+1F1EC U+1F1F7",
713 | "name": "Greece",
714 | "title": "flag for Greece",
715 | "dialCode": "+30"
716 | },
717 | {
718 | "code": "GS",
719 | "emoji": "🇬🇸",
720 | "unicode": "U+1F1EC U+1F1F8",
721 | "name": "South Georgia",
722 | "title": "flag for South Georgia",
723 | "dialCode": "+500"
724 | },
725 | {
726 | "code": "GT",
727 | "emoji": "🇬🇹",
728 | "unicode": "U+1F1EC U+1F1F9",
729 | "name": "Guatemala",
730 | "title": "flag for Guatemala",
731 | "dialCode": "+502"
732 | },
733 | {
734 | "code": "GU",
735 | "emoji": "🇬🇺",
736 | "unicode": "U+1F1EC U+1F1FA",
737 | "name": "Guam",
738 | "title": "flag for Guam",
739 | "dialCode": "+1 671"
740 | },
741 | {
742 | "code": "GW",
743 | "emoji": "🇬🇼",
744 | "unicode": "U+1F1EC U+1F1FC",
745 | "name": "Guinea-Bissau",
746 | "title": "flag for Guinea-Bissau",
747 | "dialCode": "+245"
748 | },
749 | {
750 | "code": "GY",
751 | "emoji": "🇬🇾",
752 | "unicode": "U+1F1EC U+1F1FE",
753 | "name": "Guyana",
754 | "title": "flag for Guyana",
755 | "dialCode": "+595"
756 | },
757 | {
758 | "code": "HK",
759 | "emoji": "🇭🇰",
760 | "unicode": "U+1F1ED U+1F1F0",
761 | "name": "Hong Kong",
762 | "title": "flag for Hong Kong",
763 | "dialCode": "+852"
764 | },
765 | {
766 | "code": "HM",
767 | "emoji": "🇭🇲",
768 | "unicode": "U+1F1ED U+1F1F2",
769 | "name": "Heard Island and Mcdonald Islands",
770 | "title": "flag for Heard Island and Mcdonald Islands"
771 | },
772 | {
773 | "code": "HN",
774 | "emoji": "🇭🇳",
775 | "unicode": "U+1F1ED U+1F1F3",
776 | "name": "Honduras",
777 | "title": "flag for Honduras",
778 | "dialCode": "+504"
779 | },
780 | {
781 | "code": "HR",
782 | "emoji": "🇭🇷",
783 | "unicode": "U+1F1ED U+1F1F7",
784 | "name": "Croatia",
785 | "title": "flag for Croatia",
786 | "dialCode": "+385"
787 | },
788 | {
789 | "code": "HT",
790 | "emoji": "🇭🇹",
791 | "unicode": "U+1F1ED U+1F1F9",
792 | "name": "Haiti",
793 | "title": "flag for Haiti",
794 | "dialCode": "+509"
795 | },
796 | {
797 | "code": "HU",
798 | "emoji": "🇭🇺",
799 | "unicode": "U+1F1ED U+1F1FA",
800 | "name": "Hungary",
801 | "title": "flag for Hungary",
802 | "dialCode": "+36"
803 | },
804 | {
805 | "code": "ID",
806 | "emoji": "🇮🇩",
807 | "unicode": "U+1F1EE U+1F1E9",
808 | "name": "Indonesia",
809 | "title": "flag for Indonesia",
810 | "dialCode": "+62"
811 | },
812 | {
813 | "code": "IE",
814 | "emoji": "🇮🇪",
815 | "unicode": "U+1F1EE U+1F1EA",
816 | "name": "Ireland",
817 | "title": "flag for Ireland",
818 | "dialCode": "+353"
819 | },
820 | {
821 | "code": "IL",
822 | "emoji": "🇮🇱",
823 | "unicode": "U+1F1EE U+1F1F1",
824 | "name": "Israel",
825 | "title": "flag for Israel",
826 | "dialCode": "+972"
827 | },
828 | {
829 | "code": "IM",
830 | "emoji": "🇮🇲",
831 | "unicode": "U+1F1EE U+1F1F2",
832 | "name": "Isle of Man",
833 | "title": "flag for Isle of Man",
834 | "dialCode": "+44"
835 | },
836 | {
837 | "code": "IN",
838 | "emoji": "🇮🇳",
839 | "unicode": "U+1F1EE U+1F1F3",
840 | "name": "India",
841 | "title": "flag for India",
842 | "dialCode": "+91"
843 | },
844 | {
845 | "code": "IO",
846 | "emoji": "🇮🇴",
847 | "unicode": "U+1F1EE U+1F1F4",
848 | "name": "British Indian Ocean Territory",
849 | "title": "flag for British Indian Ocean Territory",
850 | "dialCode": "+246"
851 | },
852 | {
853 | "code": "IQ",
854 | "emoji": "🇮🇶",
855 | "unicode": "U+1F1EE U+1F1F6",
856 | "name": "Iraq",
857 | "title": "flag for Iraq",
858 | "dialCode": "+964"
859 | },
860 | {
861 | "code": "IR",
862 | "emoji": "🇮🇷",
863 | "unicode": "U+1F1EE U+1F1F7",
864 | "name": "Iran",
865 | "title": "flag for Iran",
866 | "dialCode": "+98"
867 | },
868 | {
869 | "code": "IS",
870 | "emoji": "🇮🇸",
871 | "unicode": "U+1F1EE U+1F1F8",
872 | "name": "Iceland",
873 | "title": "flag for Iceland",
874 | "dialCode": "+354"
875 | },
876 | {
877 | "code": "IT",
878 | "emoji": "🇮🇹",
879 | "unicode": "U+1F1EE U+1F1F9",
880 | "name": "Italy",
881 | "title": "flag for Italy",
882 | "dialCode": "+39"
883 | },
884 | {
885 | "code": "JE",
886 | "emoji": "🇯🇪",
887 | "unicode": "U+1F1EF U+1F1EA",
888 | "name": "Jersey",
889 | "title": "flag for Jersey",
890 | "dialCode": "+44"
891 | },
892 | {
893 | "code": "JM",
894 | "emoji": "🇯🇲",
895 | "unicode": "U+1F1EF U+1F1F2",
896 | "name": "Jamaica",
897 | "title": "flag for Jamaica",
898 | "dialCode": "+1 876"
899 | },
900 | {
901 | "code": "JO",
902 | "emoji": "🇯🇴",
903 | "unicode": "U+1F1EF U+1F1F4",
904 | "name": "Jordan",
905 | "title": "flag for Jordan",
906 | "dialCode": "+962"
907 | },
908 | {
909 | "code": "JP",
910 | "emoji": "🇯🇵",
911 | "unicode": "U+1F1EF U+1F1F5",
912 | "name": "Japan",
913 | "title": "flag for Japan",
914 | "dialCode": "+81"
915 | },
916 | {
917 | "code": "KE",
918 | "emoji": "🇰🇪",
919 | "unicode": "U+1F1F0 U+1F1EA",
920 | "name": "Kenya",
921 | "title": "flag for Kenya",
922 | "dialCode": "+254"
923 | },
924 | {
925 | "code": "KG",
926 | "emoji": "🇰🇬",
927 | "unicode": "U+1F1F0 U+1F1EC",
928 | "name": "Kyrgyzstan",
929 | "title": "flag for Kyrgyzstan",
930 | "dialCode": "+996"
931 | },
932 | {
933 | "code": "KH",
934 | "emoji": "🇰🇭",
935 | "unicode": "U+1F1F0 U+1F1ED",
936 | "name": "Cambodia",
937 | "title": "flag for Cambodia",
938 | "dialCode": "+855"
939 | },
940 | {
941 | "code": "KI",
942 | "emoji": "🇰🇮",
943 | "unicode": "U+1F1F0 U+1F1EE",
944 | "name": "Kiribati",
945 | "title": "flag for Kiribati",
946 | "dialCode": "+686"
947 | },
948 | {
949 | "code": "KM",
950 | "emoji": "🇰🇲",
951 | "unicode": "U+1F1F0 U+1F1F2",
952 | "name": "Comoros",
953 | "title": "flag for Comoros",
954 | "dialCode": "+269"
955 | },
956 | {
957 | "code": "KN",
958 | "emoji": "🇰🇳",
959 | "unicode": "U+1F1F0 U+1F1F3",
960 | "name": "Saint Kitts and Nevis",
961 | "title": "flag for Saint Kitts and Nevis",
962 | "dialCode": "+1 869"
963 | },
964 | {
965 | "code": "KP",
966 | "emoji": "🇰🇵",
967 | "unicode": "U+1F1F0 U+1F1F5",
968 | "name": "North Korea",
969 | "title": "flag for North Korea",
970 | "dialCode": "+850"
971 | },
972 | {
973 | "code": "KR",
974 | "emoji": "🇰🇷",
975 | "unicode": "U+1F1F0 U+1F1F7",
976 | "name": "South Korea",
977 | "title": "flag for South Korea",
978 | "dialCode": "+82"
979 | },
980 | {
981 | "code": "KW",
982 | "emoji": "🇰🇼",
983 | "unicode": "U+1F1F0 U+1F1FC",
984 | "name": "Kuwait",
985 | "title": "flag for Kuwait",
986 | "dialCode": "+965"
987 | },
988 | {
989 | "code": "KY",
990 | "emoji": "🇰🇾",
991 | "unicode": "U+1F1F0 U+1F1FE",
992 | "name": "Cayman Islands",
993 | "title": "flag for Cayman Islands",
994 | "dialCode": "+ 345"
995 | },
996 | {
997 | "code": "KZ",
998 | "emoji": "🇰🇿",
999 | "unicode": "U+1F1F0 U+1F1FF",
1000 | "name": "Kazakhstan",
1001 | "title": "flag for Kazakhstan",
1002 | "dialCode": "+7 7"
1003 | },
1004 | {
1005 | "code": "LA",
1006 | "emoji": "🇱🇦",
1007 | "unicode": "U+1F1F1 U+1F1E6",
1008 | "name": "Lao People's Democratic Republic",
1009 | "title": "flag for Lao People's Democratic Republic",
1010 | "dialCode": "+856"
1011 | },
1012 | {
1013 | "code": "LB",
1014 | "emoji": "🇱🇧",
1015 | "unicode": "U+1F1F1 U+1F1E7",
1016 | "name": "Lebanon",
1017 | "title": "flag for Lebanon",
1018 | "dialCode": "+961"
1019 | },
1020 | {
1021 | "code": "LC",
1022 | "emoji": "🇱🇨",
1023 | "unicode": "U+1F1F1 U+1F1E8",
1024 | "name": "Saint Lucia",
1025 | "title": "flag for Saint Lucia",
1026 | "dialCode": "+1 758"
1027 | },
1028 | {
1029 | "code": "LI",
1030 | "emoji": "🇱🇮",
1031 | "unicode": "U+1F1F1 U+1F1EE",
1032 | "name": "Liechtenstein",
1033 | "title": "flag for Liechtenstein",
1034 | "dialCode": "+423"
1035 | },
1036 | {
1037 | "code": "LK",
1038 | "emoji": "🇱🇰",
1039 | "unicode": "U+1F1F1 U+1F1F0",
1040 | "name": "Sri Lanka",
1041 | "title": "flag for Sri Lanka",
1042 | "dialCode": "+94"
1043 | },
1044 | {
1045 | "code": "LR",
1046 | "emoji": "🇱🇷",
1047 | "unicode": "U+1F1F1 U+1F1F7",
1048 | "name": "Liberia",
1049 | "title": "flag for Liberia",
1050 | "dialCode": "+231"
1051 | },
1052 | {
1053 | "code": "LS",
1054 | "emoji": "🇱🇸",
1055 | "unicode": "U+1F1F1 U+1F1F8",
1056 | "name": "Lesotho",
1057 | "title": "flag for Lesotho",
1058 | "dialCode": "+266"
1059 | },
1060 | {
1061 | "code": "LT",
1062 | "emoji": "🇱🇹",
1063 | "unicode": "U+1F1F1 U+1F1F9",
1064 | "name": "Lithuania",
1065 | "title": "flag for Lithuania",
1066 | "dialCode": "+370"
1067 | },
1068 | {
1069 | "code": "LU",
1070 | "emoji": "🇱🇺",
1071 | "unicode": "U+1F1F1 U+1F1FA",
1072 | "name": "Luxembourg",
1073 | "title": "flag for Luxembourg",
1074 | "dialCode": "+352"
1075 | },
1076 | {
1077 | "code": "LV",
1078 | "emoji": "🇱🇻",
1079 | "unicode": "U+1F1F1 U+1F1FB",
1080 | "name": "Latvia",
1081 | "title": "flag for Latvia",
1082 | "dialCode": "+371"
1083 | },
1084 | {
1085 | "code": "LY",
1086 | "emoji": "🇱🇾",
1087 | "unicode": "U+1F1F1 U+1F1FE",
1088 | "name": "Libya",
1089 | "title": "flag for Libya",
1090 | "dialCode": "+218"
1091 | },
1092 | {
1093 | "code": "MA",
1094 | "emoji": "🇲🇦",
1095 | "unicode": "U+1F1F2 U+1F1E6",
1096 | "name": "Morocco",
1097 | "title": "flag for Morocco",
1098 | "dialCode": "+212"
1099 | },
1100 | {
1101 | "code": "MC",
1102 | "emoji": "🇲🇨",
1103 | "unicode": "U+1F1F2 U+1F1E8",
1104 | "name": "Monaco",
1105 | "title": "flag for Monaco",
1106 | "dialCode": "+377"
1107 | },
1108 | {
1109 | "code": "MD",
1110 | "emoji": "🇲🇩",
1111 | "unicode": "U+1F1F2 U+1F1E9",
1112 | "name": "Moldova",
1113 | "title": "flag for Moldova",
1114 | "dialCode": "+373"
1115 | },
1116 | {
1117 | "code": "ME",
1118 | "emoji": "🇲🇪",
1119 | "unicode": "U+1F1F2 U+1F1EA",
1120 | "name": "Montenegro",
1121 | "title": "flag for Montenegro",
1122 | "dialCode": "+382"
1123 | },
1124 | {
1125 | "code": "MF",
1126 | "emoji": "🇲🇫",
1127 | "unicode": "U+1F1F2 U+1F1EB",
1128 | "name": "Saint Martin (French Part)",
1129 | "title": "flag for Saint Martin (French Part)",
1130 | "dialCode": "+590"
1131 | },
1132 | {
1133 | "code": "MG",
1134 | "emoji": "🇲🇬",
1135 | "unicode": "U+1F1F2 U+1F1EC",
1136 | "name": "Madagascar",
1137 | "title": "flag for Madagascar",
1138 | "dialCode": "+261"
1139 | },
1140 | {
1141 | "code": "MH",
1142 | "emoji": "🇲🇭",
1143 | "unicode": "U+1F1F2 U+1F1ED",
1144 | "name": "Marshall Islands",
1145 | "title": "flag for Marshall Islands",
1146 | "dialCode": "+692"
1147 | },
1148 | {
1149 | "code": "MK",
1150 | "emoji": "🇲🇰",
1151 | "unicode": "U+1F1F2 U+1F1F0",
1152 | "name": "Macedonia",
1153 | "title": "flag for Macedonia",
1154 | "dialCode": "+389"
1155 | },
1156 | {
1157 | "code": "ML",
1158 | "emoji": "🇲🇱",
1159 | "unicode": "U+1F1F2 U+1F1F1",
1160 | "name": "Mali",
1161 | "title": "flag for Mali",
1162 | "dialCode": "+223"
1163 | },
1164 | {
1165 | "code": "MM",
1166 | "emoji": "🇲🇲",
1167 | "unicode": "U+1F1F2 U+1F1F2",
1168 | "name": "Myanmar",
1169 | "title": "flag for Myanmar",
1170 | "dialCode": "+95"
1171 | },
1172 | {
1173 | "code": "MN",
1174 | "emoji": "🇲🇳",
1175 | "unicode": "U+1F1F2 U+1F1F3",
1176 | "name": "Mongolia",
1177 | "title": "flag for Mongolia",
1178 | "dialCode": "+976"
1179 | },
1180 | {
1181 | "code": "MO",
1182 | "emoji": "🇲🇴",
1183 | "unicode": "U+1F1F2 U+1F1F4",
1184 | "name": "Macao",
1185 | "title": "flag for Macao",
1186 | "dialCode": "+853"
1187 | },
1188 | {
1189 | "code": "MP",
1190 | "emoji": "🇲🇵",
1191 | "unicode": "U+1F1F2 U+1F1F5",
1192 | "name": "Northern Mariana Islands",
1193 | "title": "flag for Northern Mariana Islands",
1194 | "dialCode": "+1 670"
1195 | },
1196 | {
1197 | "code": "MQ",
1198 | "emoji": "🇲🇶",
1199 | "unicode": "U+1F1F2 U+1F1F6",
1200 | "name": "Martinique",
1201 | "title": "flag for Martinique",
1202 | "dialCode": "+596"
1203 | },
1204 | {
1205 | "code": "MR",
1206 | "emoji": "🇲🇷",
1207 | "unicode": "U+1F1F2 U+1F1F7",
1208 | "name": "Mauritania",
1209 | "title": "flag for Mauritania",
1210 | "dialCode": "+222"
1211 | },
1212 | {
1213 | "code": "MS",
1214 | "emoji": "🇲🇸",
1215 | "unicode": "U+1F1F2 U+1F1F8",
1216 | "name": "Montserrat",
1217 | "title": "flag for Montserrat",
1218 | "dialCode": "+1664"
1219 | },
1220 | {
1221 | "code": "MT",
1222 | "emoji": "🇲🇹",
1223 | "unicode": "U+1F1F2 U+1F1F9",
1224 | "name": "Malta",
1225 | "title": "flag for Malta",
1226 | "dialCode": "+356"
1227 | },
1228 | {
1229 | "code": "MU",
1230 | "emoji": "🇲🇺",
1231 | "unicode": "U+1F1F2 U+1F1FA",
1232 | "name": "Mauritius",
1233 | "title": "flag for Mauritius",
1234 | "dialCode": "+230"
1235 | },
1236 | {
1237 | "code": "MV",
1238 | "emoji": "🇲🇻",
1239 | "unicode": "U+1F1F2 U+1F1FB",
1240 | "name": "Maldives",
1241 | "title": "flag for Maldives",
1242 | "dialCode": "+960"
1243 | },
1244 | {
1245 | "code": "MW",
1246 | "emoji": "🇲🇼",
1247 | "unicode": "U+1F1F2 U+1F1FC",
1248 | "name": "Malawi",
1249 | "title": "flag for Malawi",
1250 | "dialCode": "+265"
1251 | },
1252 | {
1253 | "code": "MX",
1254 | "emoji": "🇲🇽",
1255 | "unicode": "U+1F1F2 U+1F1FD",
1256 | "name": "Mexico",
1257 | "title": "flag for Mexico",
1258 | "dialCode": "+52"
1259 | },
1260 | {
1261 | "code": "MY",
1262 | "emoji": "🇲🇾",
1263 | "unicode": "U+1F1F2 U+1F1FE",
1264 | "name": "Malaysia",
1265 | "title": "flag for Malaysia",
1266 | "dialCode": "+60"
1267 | },
1268 | {
1269 | "code": "MZ",
1270 | "emoji": "🇲🇿",
1271 | "unicode": "U+1F1F2 U+1F1FF",
1272 | "name": "Mozambique",
1273 | "title": "flag for Mozambique",
1274 | "dialCode": "+258"
1275 | },
1276 | {
1277 | "code": "NA",
1278 | "emoji": "🇳🇦",
1279 | "unicode": "U+1F1F3 U+1F1E6",
1280 | "name": "Namibia",
1281 | "title": "flag for Namibia",
1282 | "dialCode": "+264"
1283 | },
1284 | {
1285 | "code": "NC",
1286 | "emoji": "🇳🇨",
1287 | "unicode": "U+1F1F3 U+1F1E8",
1288 | "name": "New Caledonia",
1289 | "title": "flag for New Caledonia",
1290 | "dialCode": "+687"
1291 | },
1292 | {
1293 | "code": "NE",
1294 | "emoji": "🇳🇪",
1295 | "unicode": "U+1F1F3 U+1F1EA",
1296 | "name": "Niger",
1297 | "title": "flag for Niger",
1298 | "dialCode": "+227"
1299 | },
1300 | {
1301 | "code": "NF",
1302 | "emoji": "🇳🇫",
1303 | "unicode": "U+1F1F3 U+1F1EB",
1304 | "name": "Norfolk Island",
1305 | "title": "flag for Norfolk Island",
1306 | "dialCode": "+672"
1307 | },
1308 | {
1309 | "code": "NG",
1310 | "emoji": "🇳🇬",
1311 | "unicode": "U+1F1F3 U+1F1EC",
1312 | "name": "Nigeria",
1313 | "title": "flag for Nigeria",
1314 | "dialCode": "+234"
1315 | },
1316 | {
1317 | "code": "NI",
1318 | "emoji": "🇳🇮",
1319 | "unicode": "U+1F1F3 U+1F1EE",
1320 | "name": "Nicaragua",
1321 | "title": "flag for Nicaragua",
1322 | "dialCode": "+505"
1323 | },
1324 | {
1325 | "code": "NL",
1326 | "emoji": "🇳🇱",
1327 | "unicode": "U+1F1F3 U+1F1F1",
1328 | "name": "Netherlands",
1329 | "title": "flag for Netherlands",
1330 | "dialCode": "+31"
1331 | },
1332 | {
1333 | "code": "NO",
1334 | "emoji": "🇳🇴",
1335 | "unicode": "U+1F1F3 U+1F1F4",
1336 | "name": "Norway",
1337 | "title": "flag for Norway",
1338 | "dialCode": "+47"
1339 | },
1340 | {
1341 | "code": "NP",
1342 | "emoji": "🇳🇵",
1343 | "unicode": "U+1F1F3 U+1F1F5",
1344 | "name": "Nepal",
1345 | "title": "flag for Nepal",
1346 | "dialCode": "+977"
1347 | },
1348 | {
1349 | "code": "NR",
1350 | "emoji": "🇳🇷",
1351 | "unicode": "U+1F1F3 U+1F1F7",
1352 | "name": "Nauru",
1353 | "title": "flag for Nauru",
1354 | "dialCode": "+674"
1355 | },
1356 | {
1357 | "code": "NU",
1358 | "emoji": "🇳🇺",
1359 | "unicode": "U+1F1F3 U+1F1FA",
1360 | "name": "Niue",
1361 | "title": "flag for Niue",
1362 | "dialCode": "+683"
1363 | },
1364 | {
1365 | "code": "NZ",
1366 | "emoji": "🇳🇿",
1367 | "unicode": "U+1F1F3 U+1F1FF",
1368 | "name": "New Zealand",
1369 | "title": "flag for New Zealand",
1370 | "dialCode": "+64"
1371 | },
1372 | {
1373 | "code": "OM",
1374 | "emoji": "🇴🇲",
1375 | "unicode": "U+1F1F4 U+1F1F2",
1376 | "name": "Oman",
1377 | "title": "flag for Oman",
1378 | "dialCode": "+968"
1379 | },
1380 | {
1381 | "code": "PA",
1382 | "emoji": "🇵🇦",
1383 | "unicode": "U+1F1F5 U+1F1E6",
1384 | "name": "Panama",
1385 | "title": "flag for Panama",
1386 | "dialCode": "+507"
1387 | },
1388 | {
1389 | "code": "PE",
1390 | "emoji": "🇵🇪",
1391 | "unicode": "U+1F1F5 U+1F1EA",
1392 | "name": "Peru",
1393 | "title": "flag for Peru",
1394 | "dialCode": "+51"
1395 | },
1396 | {
1397 | "code": "PF",
1398 | "emoji": "🇵🇫",
1399 | "unicode": "U+1F1F5 U+1F1EB",
1400 | "name": "French Polynesia",
1401 | "title": "flag for French Polynesia",
1402 | "dialCode": "+689"
1403 | },
1404 | {
1405 | "code": "PG",
1406 | "emoji": "🇵🇬",
1407 | "unicode": "U+1F1F5 U+1F1EC",
1408 | "name": "Papua New Guinea",
1409 | "title": "flag for Papua New Guinea",
1410 | "dialCode": "+675"
1411 | },
1412 | {
1413 | "code": "PH",
1414 | "emoji": "🇵🇭",
1415 | "unicode": "U+1F1F5 U+1F1ED",
1416 | "name": "Philippines",
1417 | "title": "flag for Philippines",
1418 | "dialCode": "+63"
1419 | },
1420 | {
1421 | "code": "PK",
1422 | "emoji": "🇵🇰",
1423 | "unicode": "U+1F1F5 U+1F1F0",
1424 | "name": "Pakistan",
1425 | "title": "flag for Pakistan",
1426 | "dialCode": "+92"
1427 | },
1428 | {
1429 | "code": "PL",
1430 | "emoji": "🇵🇱",
1431 | "unicode": "U+1F1F5 U+1F1F1",
1432 | "name": "Poland",
1433 | "title": "flag for Poland",
1434 | "dialCode": "+48"
1435 | },
1436 | {
1437 | "code": "PM",
1438 | "emoji": "🇵🇲",
1439 | "unicode": "U+1F1F5 U+1F1F2",
1440 | "name": "Saint Pierre and Miquelon",
1441 | "title": "flag for Saint Pierre and Miquelon",
1442 | "dialCode": "+508"
1443 | },
1444 | {
1445 | "code": "PN",
1446 | "emoji": "🇵🇳",
1447 | "unicode": "U+1F1F5 U+1F1F3",
1448 | "name": "Pitcairn",
1449 | "title": "flag for Pitcairn",
1450 | "dialCode": "+872"
1451 | },
1452 | {
1453 | "code": "PR",
1454 | "emoji": "🇵🇷",
1455 | "unicode": "U+1F1F5 U+1F1F7",
1456 | "name": "Puerto Rico",
1457 | "title": "flag for Puerto Rico",
1458 | "dialCode": "+1 939"
1459 | },
1460 | {
1461 | "code": "PS",
1462 | "emoji": "🇵🇸",
1463 | "unicode": "U+1F1F5 U+1F1F8",
1464 | "name": "Palestinian Territory",
1465 | "title": "flag for Palestinian Territory",
1466 | "dialCode": "+970"
1467 | },
1468 | {
1469 | "code": "PT",
1470 | "emoji": "🇵🇹",
1471 | "unicode": "U+1F1F5 U+1F1F9",
1472 | "name": "Portugal",
1473 | "title": "flag for Portugal",
1474 | "dialCode": "+351"
1475 | },
1476 | {
1477 | "code": "PW",
1478 | "emoji": "🇵🇼",
1479 | "unicode": "U+1F1F5 U+1F1FC",
1480 | "name": "Palau",
1481 | "title": "flag for Palau",
1482 | "dialCode": "+680"
1483 | },
1484 | {
1485 | "code": "PY",
1486 | "emoji": "🇵🇾",
1487 | "unicode": "U+1F1F5 U+1F1FE",
1488 | "name": "Paraguay",
1489 | "title": "flag for Paraguay",
1490 | "dialCode": "+595"
1491 | },
1492 | {
1493 | "code": "QA",
1494 | "emoji": "🇶🇦",
1495 | "unicode": "U+1F1F6 U+1F1E6",
1496 | "name": "Qatar",
1497 | "title": "flag for Qatar",
1498 | "dialCode": "+974"
1499 | },
1500 | {
1501 | "code": "RE",
1502 | "emoji": "🇷🇪",
1503 | "unicode": "U+1F1F7 U+1F1EA",
1504 | "name": "Réunion",
1505 | "title": "flag for Réunion",
1506 | "dialCode": "+262"
1507 | },
1508 | {
1509 | "code": "RO",
1510 | "emoji": "🇷🇴",
1511 | "unicode": "U+1F1F7 U+1F1F4",
1512 | "name": "Romania",
1513 | "title": "flag for Romania",
1514 | "dialCode": "+40"
1515 | },
1516 | {
1517 | "code": "RS",
1518 | "emoji": "🇷🇸",
1519 | "unicode": "U+1F1F7 U+1F1F8",
1520 | "name": "Serbia",
1521 | "title": "flag for Serbia",
1522 | "dialCode": "+381"
1523 | },
1524 | {
1525 | "code": "RU",
1526 | "emoji": "🇷🇺",
1527 | "unicode": "U+1F1F7 U+1F1FA",
1528 | "name": "Russia",
1529 | "title": "flag for Russia",
1530 | "dialCode": "+7"
1531 | },
1532 | {
1533 | "code": "RW",
1534 | "emoji": "🇷🇼",
1535 | "unicode": "U+1F1F7 U+1F1FC",
1536 | "name": "Rwanda",
1537 | "title": "flag for Rwanda",
1538 | "dialCode": "+250"
1539 | },
1540 | {
1541 | "code": "SA",
1542 | "emoji": "🇸🇦",
1543 | "unicode": "U+1F1F8 U+1F1E6",
1544 | "name": "Saudi Arabia",
1545 | "title": "flag for Saudi Arabia",
1546 | "dialCode": "+966"
1547 | },
1548 | {
1549 | "code": "SB",
1550 | "emoji": "🇸🇧",
1551 | "unicode": "U+1F1F8 U+1F1E7",
1552 | "name": "Solomon Islands",
1553 | "title": "flag for Solomon Islands",
1554 | "dialCode": "+677"
1555 | },
1556 | {
1557 | "code": "SC",
1558 | "emoji": "🇸🇨",
1559 | "unicode": "U+1F1F8 U+1F1E8",
1560 | "name": "Seychelles",
1561 | "title": "flag for Seychelles",
1562 | "dialCode": "+248"
1563 | },
1564 | {
1565 | "code": "SD",
1566 | "emoji": "🇸🇩",
1567 | "unicode": "U+1F1F8 U+1F1E9",
1568 | "name": "Sudan",
1569 | "title": "flag for Sudan",
1570 | "dialCode": "+249"
1571 | },
1572 | {
1573 | "code": "SE",
1574 | "emoji": "🇸🇪",
1575 | "unicode": "U+1F1F8 U+1F1EA",
1576 | "name": "Sweden",
1577 | "title": "flag for Sweden",
1578 | "dialCode": "+46"
1579 | },
1580 | {
1581 | "code": "SG",
1582 | "emoji": "🇸🇬",
1583 | "unicode": "U+1F1F8 U+1F1EC",
1584 | "name": "Singapore",
1585 | "title": "flag for Singapore",
1586 | "dialCode": "+65"
1587 | },
1588 | {
1589 | "code": "SH",
1590 | "emoji": "🇸🇭",
1591 | "unicode": "U+1F1F8 U+1F1ED",
1592 | "name": "Saint Helena, Ascension and Tristan Da Cunha",
1593 | "title": "flag for Saint Helena, Ascension and Tristan Da Cunha",
1594 | "dialCode": "+290"
1595 | },
1596 | {
1597 | "code": "SI",
1598 | "emoji": "🇸🇮",
1599 | "unicode": "U+1F1F8 U+1F1EE",
1600 | "name": "Slovenia",
1601 | "title": "flag for Slovenia",
1602 | "dialCode": "+386"
1603 | },
1604 | {
1605 | "code": "SJ",
1606 | "emoji": "🇸🇯",
1607 | "unicode": "U+1F1F8 U+1F1EF",
1608 | "name": "Svalbard and Jan Mayen",
1609 | "title": "flag for Svalbard and Jan Mayen",
1610 | "dialCode": "+47"
1611 | },
1612 | {
1613 | "code": "SK",
1614 | "emoji": "🇸🇰",
1615 | "unicode": "U+1F1F8 U+1F1F0",
1616 | "name": "Slovakia",
1617 | "title": "flag for Slovakia",
1618 | "dialCode": "+421"
1619 | },
1620 | {
1621 | "code": "SL",
1622 | "emoji": "🇸🇱",
1623 | "unicode": "U+1F1F8 U+1F1F1",
1624 | "name": "Sierra Leone",
1625 | "title": "flag for Sierra Leone",
1626 | "dialCode": "+232"
1627 | },
1628 | {
1629 | "code": "SM",
1630 | "emoji": "🇸🇲",
1631 | "unicode": "U+1F1F8 U+1F1F2",
1632 | "name": "San Marino",
1633 | "title": "flag for San Marino",
1634 | "dialCode": "+378"
1635 | },
1636 | {
1637 | "code": "SN",
1638 | "emoji": "🇸🇳",
1639 | "unicode": "U+1F1F8 U+1F1F3",
1640 | "name": "Senegal",
1641 | "title": "flag for Senegal",
1642 | "dialCode": "+221"
1643 | },
1644 | {
1645 | "code": "SO",
1646 | "emoji": "🇸🇴",
1647 | "unicode": "U+1F1F8 U+1F1F4",
1648 | "name": "Somalia",
1649 | "title": "flag for Somalia",
1650 | "dialCode": "+252"
1651 | },
1652 | {
1653 | "code": "SR",
1654 | "emoji": "🇸🇷",
1655 | "unicode": "U+1F1F8 U+1F1F7",
1656 | "name": "Suriname",
1657 | "title": "flag for Suriname",
1658 | "dialCode": "+597"
1659 | },
1660 | {
1661 | "code": "SS",
1662 | "emoji": "🇸🇸",
1663 | "unicode": "U+1F1F8 U+1F1F8",
1664 | "name": "South Sudan",
1665 | "title": "flag for South Sudan"
1666 | },
1667 | {
1668 | "code": "ST",
1669 | "emoji": "🇸🇹",
1670 | "unicode": "U+1F1F8 U+1F1F9",
1671 | "name": "Sao Tome and Principe",
1672 | "title": "flag for Sao Tome and Principe",
1673 | "dialCode": "+239"
1674 | },
1675 | {
1676 | "code": "SV",
1677 | "emoji": "🇸🇻",
1678 | "unicode": "U+1F1F8 U+1F1FB",
1679 | "name": "El Salvador",
1680 | "title": "flag for El Salvador",
1681 | "dialCode": "+503"
1682 | },
1683 | {
1684 | "code": "SX",
1685 | "emoji": "🇸🇽",
1686 | "unicode": "U+1F1F8 U+1F1FD",
1687 | "name": "Sint Maarten (Dutch Part)",
1688 | "title": "flag for Sint Maarten (Dutch Part)"
1689 | },
1690 | {
1691 | "code": "SY",
1692 | "emoji": "🇸🇾",
1693 | "unicode": "U+1F1F8 U+1F1FE",
1694 | "name": "Syrian Arab Republic",
1695 | "title": "flag for Syrian Arab Republic",
1696 | "dialCode": "+963"
1697 | },
1698 | {
1699 | "code": "SZ",
1700 | "emoji": "🇸🇿",
1701 | "unicode": "U+1F1F8 U+1F1FF",
1702 | "name": "Swaziland",
1703 | "title": "flag for Swaziland",
1704 | "dialCode": "+268"
1705 | },
1706 | {
1707 | "code": "TC",
1708 | "emoji": "🇹🇨",
1709 | "unicode": "U+1F1F9 U+1F1E8",
1710 | "name": "Turks and Caicos Islands",
1711 | "title": "flag for Turks and Caicos Islands",
1712 | "dialCode": "+1 649"
1713 | },
1714 | {
1715 | "code": "TD",
1716 | "emoji": "🇹🇩",
1717 | "unicode": "U+1F1F9 U+1F1E9",
1718 | "name": "Chad",
1719 | "title": "flag for Chad",
1720 | "dialCode": "+235"
1721 | },
1722 | {
1723 | "code": "TF",
1724 | "emoji": "🇹🇫",
1725 | "unicode": "U+1F1F9 U+1F1EB",
1726 | "name": "French Southern Territories",
1727 | "title": "flag for French Southern Territories"
1728 | },
1729 | {
1730 | "code": "TG",
1731 | "emoji": "🇹🇬",
1732 | "unicode": "U+1F1F9 U+1F1EC",
1733 | "name": "Togo",
1734 | "title": "flag for Togo",
1735 | "dialCode": "+228"
1736 | },
1737 | {
1738 | "code": "TH",
1739 | "emoji": "🇹🇭",
1740 | "unicode": "U+1F1F9 U+1F1ED",
1741 | "name": "Thailand",
1742 | "title": "flag for Thailand",
1743 | "dialCode": "+66"
1744 | },
1745 | {
1746 | "code": "TJ",
1747 | "emoji": "🇹🇯",
1748 | "unicode": "U+1F1F9 U+1F1EF",
1749 | "name": "Tajikistan",
1750 | "title": "flag for Tajikistan",
1751 | "dialCode": "+992"
1752 | },
1753 | {
1754 | "code": "TK",
1755 | "emoji": "🇹🇰",
1756 | "unicode": "U+1F1F9 U+1F1F0",
1757 | "name": "Tokelau",
1758 | "title": "flag for Tokelau",
1759 | "dialCode": "+690"
1760 | },
1761 | {
1762 | "code": "TL",
1763 | "emoji": "🇹🇱",
1764 | "unicode": "U+1F1F9 U+1F1F1",
1765 | "name": "Timor-Leste",
1766 | "title": "flag for Timor-Leste",
1767 | "dialCode": "+670"
1768 | },
1769 | {
1770 | "code": "TM",
1771 | "emoji": "🇹🇲",
1772 | "unicode": "U+1F1F9 U+1F1F2",
1773 | "name": "Turkmenistan",
1774 | "title": "flag for Turkmenistan",
1775 | "dialCode": "+993"
1776 | },
1777 | {
1778 | "code": "TN",
1779 | "emoji": "🇹🇳",
1780 | "unicode": "U+1F1F9 U+1F1F3",
1781 | "name": "Tunisia",
1782 | "title": "flag for Tunisia",
1783 | "dialCode": "+216"
1784 | },
1785 | {
1786 | "code": "TO",
1787 | "emoji": "🇹🇴",
1788 | "unicode": "U+1F1F9 U+1F1F4",
1789 | "name": "Tonga",
1790 | "title": "flag for Tonga",
1791 | "dialCode": "+676"
1792 | },
1793 | {
1794 | "code": "TR",
1795 | "emoji": "🇹🇷",
1796 | "unicode": "U+1F1F9 U+1F1F7",
1797 | "name": "Turkey",
1798 | "title": "flag for Turkey",
1799 | "dialCode": "+90"
1800 | },
1801 | {
1802 | "code": "TT",
1803 | "emoji": "🇹🇹",
1804 | "unicode": "U+1F1F9 U+1F1F9",
1805 | "name": "Trinidad and Tobago",
1806 | "title": "flag for Trinidad and Tobago",
1807 | "dialCode": "+1 868"
1808 | },
1809 | {
1810 | "code": "TV",
1811 | "emoji": "🇹🇻",
1812 | "unicode": "U+1F1F9 U+1F1FB",
1813 | "name": "Tuvalu",
1814 | "title": "flag for Tuvalu",
1815 | "dialCode": "+688"
1816 | },
1817 | {
1818 | "code": "TW",
1819 | "emoji": "",
1820 | "unicode": "U+1F1F9 U+1F1FC",
1821 | "name": "Taiwan",
1822 | "title": "flag for Taiwan",
1823 | "dialCode": "+886"
1824 | },
1825 | {
1826 | "code": "TZ",
1827 | "emoji": "🇹🇿",
1828 | "unicode": "U+1F1F9 U+1F1FF",
1829 | "name": "Tanzania",
1830 | "title": "flag for Tanzania",
1831 | "dialCode": "+255"
1832 | },
1833 | {
1834 | "code": "UA",
1835 | "emoji": "🇺🇦",
1836 | "unicode": "U+1F1FA U+1F1E6",
1837 | "name": "Ukraine",
1838 | "title": "flag for Ukraine",
1839 | "dialCode": "+380"
1840 | },
1841 | {
1842 | "code": "UG",
1843 | "emoji": "🇺🇬",
1844 | "unicode": "U+1F1FA U+1F1EC",
1845 | "name": "Uganda",
1846 | "title": "flag for Uganda",
1847 | "dialCode": "+256"
1848 | },
1849 | {
1850 | "code": "UM",
1851 | "emoji": "🇺🇲",
1852 | "unicode": "U+1F1FA U+1F1F2",
1853 | "name": "United States Minor Outlying Islands",
1854 | "title": "flag for United States Minor Outlying Islands"
1855 | },
1856 | {
1857 | "code": "US",
1858 | "emoji": "🇺🇸",
1859 | "unicode": "U+1F1FA U+1F1F8",
1860 | "name": "United States",
1861 | "title": "flag for United States",
1862 | "dialCode": "+1"
1863 | },
1864 | {
1865 | "code": "UY",
1866 | "emoji": "🇺🇾",
1867 | "unicode": "U+1F1FA U+1F1FE",
1868 | "name": "Uruguay",
1869 | "title": "flag for Uruguay",
1870 | "dialCode": "+598"
1871 | },
1872 | {
1873 | "code": "UZ",
1874 | "emoji": "🇺🇿",
1875 | "unicode": "U+1F1FA U+1F1FF",
1876 | "name": "Uzbekistan",
1877 | "title": "flag for Uzbekistan",
1878 | "dialCode": "+998"
1879 | },
1880 | {
1881 | "code": "VA",
1882 | "emoji": "🇻🇦",
1883 | "unicode": "U+1F1FB U+1F1E6",
1884 | "name": "Vatican City",
1885 | "title": "flag for Vatican City",
1886 | "dialCode": "+379"
1887 | },
1888 | {
1889 | "code": "VC",
1890 | "emoji": "🇻🇨",
1891 | "unicode": "U+1F1FB U+1F1E8",
1892 | "name": "Saint Vincent and The Grenadines",
1893 | "title": "flag for Saint Vincent and The Grenadines",
1894 | "dialCode": "+1 784"
1895 | },
1896 | {
1897 | "code": "VE",
1898 | "emoji": "🇻🇪",
1899 | "unicode": "U+1F1FB U+1F1EA",
1900 | "name": "Venezuela",
1901 | "title": "flag for Venezuela",
1902 | "dialCode": "+58"
1903 | },
1904 | {
1905 | "code": "VG",
1906 | "emoji": "🇻🇬",
1907 | "unicode": "U+1F1FB U+1F1EC",
1908 | "name": "Virgin Islands, British",
1909 | "title": "flag for Virgin Islands, British",
1910 | "dialCode": "+1 284"
1911 | },
1912 | {
1913 | "code": "VI",
1914 | "emoji": "🇻🇮",
1915 | "unicode": "U+1F1FB U+1F1EE",
1916 | "name": "Virgin Islands, U.S.",
1917 | "title": "flag for Virgin Islands, U.S.",
1918 | "dialCode": "+1 340"
1919 | },
1920 | {
1921 | "code": "VN",
1922 | "emoji": "🇻🇳",
1923 | "unicode": "U+1F1FB U+1F1F3",
1924 | "name": "Viet Nam",
1925 | "title": "flag for Viet Nam",
1926 | "dialCode": "+84"
1927 | },
1928 | {
1929 | "code": "VU",
1930 | "emoji": "🇻🇺",
1931 | "unicode": "U+1F1FB U+1F1FA",
1932 | "name": "Vanuatu",
1933 | "title": "flag for Vanuatu",
1934 | "dialCode": "+678"
1935 | },
1936 | {
1937 | "code": "WF",
1938 | "emoji": "🇼🇫",
1939 | "unicode": "U+1F1FC U+1F1EB",
1940 | "name": "Wallis and Futuna",
1941 | "title": "flag for Wallis and Futuna",
1942 | "dialCode": "+681"
1943 | },
1944 | {
1945 | "code": "WS",
1946 | "emoji": "🇼🇸",
1947 | "unicode": "U+1F1FC U+1F1F8",
1948 | "name": "Samoa",
1949 | "title": "flag for Samoa",
1950 | "dialCode": "+685"
1951 | },
1952 | {
1953 | "code": "XK",
1954 | "emoji": "🇽🇰",
1955 | "unicode": "U+1F1FD U+1F1F0",
1956 | "name": "Kosovo",
1957 | "title": "flag for Kosovo",
1958 | "dialCode": "+383"
1959 | },
1960 | {
1961 | "code": "YE",
1962 | "emoji": "🇾🇪",
1963 | "unicode": "U+1F1FE U+1F1EA",
1964 | "name": "Yemen",
1965 | "title": "flag for Yemen",
1966 | "dialCode": "+967"
1967 | },
1968 | {
1969 | "code": "YT",
1970 | "emoji": "🇾🇹",
1971 | "unicode": "U+1F1FE U+1F1F9",
1972 | "name": "Mayotte",
1973 | "title": "flag for Mayotte",
1974 | "dialCode": "+262"
1975 | },
1976 | {
1977 | "code": "ZA",
1978 | "emoji": "🇿🇦",
1979 | "unicode": "U+1F1FF U+1F1E6",
1980 | "name": "South Africa",
1981 | "title": "flag for South Africa",
1982 | "dialCode": "+27"
1983 | },
1984 | {
1985 | "code": "ZM",
1986 | "emoji": "🇿🇲",
1987 | "unicode": "U+1F1FF U+1F1F2",
1988 | "name": "Zambia",
1989 | "title": "flag for Zambia",
1990 | "dialCode": "+260"
1991 | },
1992 | {
1993 | "code": "ZW",
1994 | "emoji": "🇿🇼",
1995 | "unicode": "U+1F1FF U+1F1FC",
1996 | "name": "Zimbabwe",
1997 | "title": "flag for Zimbabwe",
1998 | "dialCode": "+263"
1999 | },
2000 | {
2001 | "code": "ZZ",
2002 | "emoji": "🏁",
2003 | "unicode": "",
2004 | "name": "Unknown",
2005 | "title": "flag for Unknown",
2006 | "dialCode": ""
2007 | }
2008 | ]
2009 |
--------------------------------------------------------------------------------
/spider/fuzzy.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "github.com/metacubex/mihomo/common/convert"
5 | "github.com/metacubex/mihomo/config"
6 | "log"
7 | "regexp"
8 | "strings"
9 | "sync"
10 | "time"
11 | )
12 |
13 | func init() {
14 | Register(CollectFuzzy, NewFuzzyCollect)
15 | }
16 |
17 | type Fuzzy struct {
18 | Url string
19 | }
20 |
21 | func (c *Fuzzy) Get() []map[string]any {
22 | content := GetBytes(c.Url)
23 | return ComputeFuzzy(content)
24 | }
25 |
26 | func (c *Fuzzy) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) {
27 | defer wg.Done()
28 | nodes := c.Get()
29 | log.Printf("STATISTIC: Fuzzy count=%d url=%s\n", len(nodes), c.Url)
30 | if len(nodes) > 0 {
31 | pc <- nodes
32 | }
33 | }
34 |
35 | func NewFuzzyCollect(getter Getter) Collect {
36 | return &Fuzzy{Url: getter.Url}
37 | }
38 |
39 | type void struct{}
40 |
41 | var nullValue void
42 |
43 | var re = regexp.MustCompile(`proxies|api|token|raw|subscribe|txt|yaml|yml|sub|uuid`)
44 | var not = regexp.MustCompile(`svg|png|mp4|mp3|jpg|jpeg|m3u8|flv|gif|icon|ktv|mov|webcam`)
45 | var urlRe = regexp.MustCompile("(https|http)://[-A-Za-z0-9\u4e00-\u9ea5+&@#/%?=~_!:,.;]+[-A-Za-z0-9\u4e00-\u9ea5+&@#/%=~_]")
46 |
47 | func grepFuzzy(all []byte) map[string]void {
48 | set := make(map[string]void) // New empty set
49 |
50 | subUrls := urlRe.FindAllString(string(all), -1)
51 | for _, url := range subUrls {
52 | if !re.MatchString(url) || not.MatchString(url) {
53 | continue
54 | }
55 | set[url] = nullValue
56 | }
57 |
58 | return set
59 | }
60 |
61 | func ComputeFuzzy(content []byte) []map[string]any {
62 |
63 | proxies := make([]map[string]any, 0)
64 | if content == nil {
65 | return proxies
66 | }
67 |
68 | // 进行订阅抓取
69 | fuzzy := grepFuzzy(content)
70 | pool := NewTimeoutPoolWithDefaults()
71 | pool.WaitCount(len(fuzzy))
72 |
73 | var cFlag = regexp.MustCompile(`proxies|clash|yaml|yml`)
74 | lock := sync.Mutex{}
75 | for temp := range fuzzy {
76 | url := temp
77 | pool.SubmitWithTimeout(func(done chan struct{}) {
78 | defer func() {
79 | // 每个协程内部使用recover捕获可能在调用逻辑中发生的panic
80 | if e := recover(); e != nil {
81 | log.Printf("====抓取错误====%s\n", e)
82 | }
83 | done <- struct{}{}
84 | }()
85 |
86 | getter := Getter{Url: url}
87 | var ok []map[string]any
88 | if cFlag.MatchString(url) {
89 | collect, _ := NewCollect(CollectClash, getter)
90 | ok = collect.Get()
91 | } else if strings.Contains(url, "README.md") {
92 | collect, _ := NewCollect(CollectSharelink, getter)
93 | ok = collect.Get()
94 | } else {
95 | all := GetBytes(url)
96 | if all == nil || len(all) < 16 {
97 | return
98 | }
99 | isGo := true
100 | rawCfg, err := config.UnmarshalRawConfig(all)
101 | if err == nil && rawCfg.Proxy != nil {
102 | ok = rawCfg.Proxy
103 | isGo = false
104 | }
105 | if isGo {
106 | v2ray, err := convert.ConvertsV2Ray(all)
107 | if err == nil && v2ray != nil {
108 | ok = v2ray
109 | isGo = false
110 | }
111 | }
112 | if isGo {
113 | builder := strings.Builder{}
114 | for _, link := range grepShareLink(all) {
115 | builder.WriteString(link + "\n")
116 | }
117 | if builder.Len() > 0 {
118 | all = []byte(builder.String())
119 | v2ray, err := convert.ConvertsV2Ray(all)
120 | if err == nil && v2ray != nil {
121 | ok = v2ray
122 | }
123 | }
124 | }
125 | }
126 |
127 | if ok != nil && len(ok) > 0 {
128 | lock.Lock()
129 | proxies = append(proxies, ok...)
130 | lock.Unlock()
131 | }
132 | }, time.Minute)
133 | }
134 | pool.StartAndWait()
135 |
136 | // 进行分享链接抓取
137 | builder := strings.Builder{}
138 | for _, link := range grepShareLink(content) {
139 | builder.WriteString(link + "\n")
140 | }
141 | if builder.Len() > 0 {
142 | content = []byte(builder.String())
143 | v2ray, err := convert.ConvertsV2Ray(content)
144 | if err != nil && v2ray != nil {
145 | lock.Lock()
146 | proxies = append(proxies, v2ray...)
147 | lock.Unlock()
148 | }
149 | }
150 |
151 | return proxies
152 | }
153 |
--------------------------------------------------------------------------------
/spider/getter.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "errors"
5 | "github.com/snakem982/proxypool/tools"
6 | "golang.org/x/net/html"
7 | "strings"
8 | "sync"
9 | )
10 |
11 | type Getter struct {
12 | Id string `json:"id,omitempty" yaml:"id,omitempty"`
13 | Type string `json:"type" yaml:"type"`
14 | Url string `json:"url" yaml:"url"`
15 | }
16 |
17 | type Collect interface {
18 | Get() []map[string]any
19 | Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup)
20 | }
21 |
22 | type collector func(getter Getter) Collect
23 |
24 | var collectorMap = make(map[string]collector)
25 |
26 | func Register(sourceType string, c collector) {
27 | collectorMap[sourceType] = c
28 | }
29 |
30 | var ErrorCreateNotSupported = errors.New("type not supported")
31 |
32 | func NewCollect(sourceType string, getter Getter) (Collect, error) {
33 | if c, ok := collectorMap[sourceType]; ok {
34 | return c(getter), nil
35 | }
36 |
37 | return nil, ErrorCreateNotSupported
38 | }
39 |
40 | func GetBytes(url string) []byte {
41 | all := tools.ConcurrentHttpGet(url)
42 | if all != nil {
43 | temp := html.UnescapeString(string(all))
44 | temp = strings.Replace(temp, "\"HOST\"", "\"Host\"", -1)
45 | all = []byte(temp)
46 | }
47 |
48 | return all
49 | }
50 |
--------------------------------------------------------------------------------
/spider/mypool.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "github.com/panjf2000/ants/v2"
5 | "sync"
6 | "time"
7 | )
8 |
9 | const (
10 | defaultJobQueueLength = 512 // 默认任务队列长度
11 | )
12 |
13 | type Job func(chan struct{})
14 |
15 | type TimeoutPool struct {
16 | antPool *ants.Pool
17 | wg sync.WaitGroup
18 | }
19 |
20 | // NewTimeoutPoolWithDefaults 初始化一个任务队列长度512
21 | func NewTimeoutPoolWithDefaults() *TimeoutPool {
22 | p, _ := ants.NewPool(defaultJobQueueLength, func(opts *ants.Options) {
23 | opts.PreAlloc = true
24 | })
25 | return &TimeoutPool{p, sync.WaitGroup{}}
26 | }
27 |
28 | // NewTimeoutPool 初始化一个任务队列长度为size
29 | func NewTimeoutPool(size int) *TimeoutPool {
30 | p, _ := ants.NewPool(size, func(opts *ants.Options) {
31 | opts.PreAlloc = true
32 | })
33 | return &TimeoutPool{p, sync.WaitGroup{}}
34 | }
35 |
36 | // SubmitWithTimeout 提交一个任务到协程池
37 | func (p *TimeoutPool) SubmitWithTimeout(job Job, timeout time.Duration) {
38 | _ = p.antPool.Submit(func() {
39 | done := make(chan struct{}, 1)
40 | go job(done)
41 | select {
42 | case <-done:
43 | case <-time.After(timeout):
44 | }
45 | p.wg.Done()
46 | })
47 | }
48 |
49 | // StartAndWait 启动并等待协程池内的运行全部运行结束
50 | func (p *TimeoutPool) StartAndWait() {
51 | p.wg.Wait()
52 | p.antPool.Release()
53 | }
54 |
55 | func (p *TimeoutPool) WaitCount(count int) {
56 | p.wg.Add(count)
57 | }
58 |
--------------------------------------------------------------------------------
/spider/sharelink.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "github.com/metacubex/mihomo/common/convert"
5 | "log"
6 | "regexp"
7 | "strings"
8 | "sync"
9 | )
10 |
11 | func init() {
12 | Register(CollectSharelink, NewShareLinkCollect)
13 | }
14 |
15 | type ShareLink struct {
16 | Url string
17 | }
18 |
19 | func (c *ShareLink) Get() []map[string]any {
20 | proxies := make([]map[string]any, 0)
21 |
22 | all := GetBytes(c.Url)
23 | if all != nil {
24 | builder := strings.Builder{}
25 | for _, link := range grepShareLink(all) {
26 | builder.WriteString(link + "\n")
27 | }
28 | if builder.Len() > 0 {
29 | v2ray, err := convert.ConvertsV2Ray([]byte(builder.String()))
30 | if err == nil && v2ray != nil {
31 | proxies = v2ray
32 | }
33 | }
34 | }
35 |
36 | return proxies
37 | }
38 |
39 | func (c *ShareLink) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) {
40 | defer wg.Done()
41 | nodes := c.Get()
42 | log.Printf("STATISTIC: ShareLink count=%d url=%s\n", len(nodes), c.Url)
43 | if len(nodes) > 0 {
44 | pc <- nodes
45 | }
46 | }
47 |
48 | func NewShareLinkCollect(getter Getter) Collect {
49 | return &ShareLink{Url: getter.Url}
50 | }
51 |
52 | var shareLinkReg = regexp.MustCompile("(vless|vmess|trojan|ss|ssr|tuic|hysteria|hysteria2|hy2|juicity)://([A-Za-z0-9+/_&?=@:%.-])+")
53 |
54 | // grepShareLink
55 | //
56 | // @Description: 抓取分享链接
57 | // @param all
58 | // @return []string
59 | func grepShareLink(all []byte) []string {
60 | return shareLinkReg.FindAllString(string(all), -1)
61 | }
62 |
--------------------------------------------------------------------------------
/spider/spider.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "bytes"
5 | "context"
6 | _ "embed"
7 | "encoding/json"
8 | "fmt"
9 | "github.com/ip2location/ip2location-go/v9"
10 | "github.com/metacubex/mihomo/adapter"
11 | "github.com/metacubex/mihomo/common/utils"
12 | "github.com/metacubex/mihomo/config"
13 | C "github.com/metacubex/mihomo/constant"
14 | "github.com/snakem982/proxypool/tools"
15 | "gopkg.in/yaml.v3"
16 | "log"
17 | "net"
18 | "os"
19 | "path/filepath"
20 | "sort"
21 | "strings"
22 | "sync"
23 | "time"
24 | )
25 |
26 | const (
27 | CollectClash = "clash"
28 | CollectV2ray = "v2ray"
29 | CollectSharelink = "share"
30 | CollectFuzzy = "fuzzy"
31 | )
32 |
33 | //go:embed IP2LOCATION-LITE-DB1.BIN
34 | var fsIp2 []byte
35 |
36 | var db *ip2location.DB
37 |
38 | var emojiMap = make(map[string]string)
39 |
40 | //go:embed flags.json
41 | var fsEmoji []byte
42 |
43 | type dBReader struct {
44 | reader *bytes.Reader
45 | }
46 |
47 | func (d dBReader) Read(p []byte) (n int, err error) {
48 | return d.reader.Read(p)
49 | }
50 |
51 | func (d dBReader) Close() error {
52 | return nil
53 | }
54 |
55 | func (d dBReader) ReadAt(p []byte, off int64) (n int, err error) {
56 | return d.reader.ReadAt(p, off)
57 | }
58 |
59 | func init() {
60 | db, _ = ip2location.OpenDBWithReader(dBReader{reader: bytes.NewReader(fsIp2)})
61 |
62 | type countryEmoji struct {
63 | Code string `json:"code"`
64 | Emoji string `json:"emoji"`
65 | }
66 | var countryEmojiList = make([]countryEmoji, 0)
67 | _ = json.Unmarshal(fsEmoji, &countryEmojiList)
68 | for _, i := range countryEmojiList {
69 | emojiMap[i.Code] = i.Emoji
70 | }
71 | }
72 |
73 | func Crawl() bool {
74 | // 加载默认配置中的节点
75 | defaultBuf, defaultErr := os.ReadFile(filepath.Join(C.Path.HomeDir(), "uploads/0.yaml"))
76 | proxies := make([]map[string]any, 0)
77 | if defaultErr == nil && len(defaultBuf) > 0 {
78 | rawCfg, err := config.UnmarshalRawConfig(defaultBuf)
79 | if err == nil && len(rawCfg.Proxy) > 0 {
80 | proxies = rawCfg.Proxy
81 | log.Printf("load default config proxies success %d\n", len(rawCfg.Proxy))
82 | }
83 | }
84 |
85 | // 获取getters
86 | getters := make([]Getter, 0)
87 | //values := cache.GetList(constant.PrefixGetter)
88 | //if len(values) > 0 {
89 | // for _, value := range values {
90 | // getter := Getter{}
91 | // _ = json.Unmarshal(value, &getter)
92 | // getters = append(getters, getter)
93 | // }
94 | //}
95 |
96 | // 进行抓取
97 | if len(getters) > 0 {
98 | wg := &sync.WaitGroup{}
99 | var pc = make(chan []map[string]any)
100 | for _, g := range getters {
101 | collect, err := NewCollect(g.Type, g)
102 | if err != nil {
103 | continue
104 | }
105 | wg.Add(1)
106 | go collect.Get2ChanWG(pc, wg)
107 | }
108 | go func() {
109 | wg.Wait()
110 | close(pc)
111 | }()
112 | for p := range pc {
113 | if p != nil {
114 | proxies = append(proxies, p...)
115 | }
116 | }
117 | }
118 |
119 | // 去重
120 | maps := Unique(proxies, true)
121 | if len(maps) == 0 {
122 | return false
123 | }
124 |
125 | // 转换
126 | nodes := map2proxies(maps)
127 | if len(nodes) == 0 {
128 | return false
129 | }
130 |
131 | // url测速
132 | keys := urlTest(nodes)
133 | if len(keys) == 0 {
134 | return false
135 | }
136 |
137 | // 国家代码查询
138 | proxies = GetCountryName(keys, maps)
139 |
140 | // 排序添加emoji
141 | SortAddEmoji(proxies)
142 |
143 | if len(proxies) > 255 {
144 | proxies = proxies[0:256]
145 | }
146 |
147 | // 存盘
148 | data := make(map[string]any)
149 | data["proxies"] = proxies
150 | all, _ := yaml.Marshal(data)
151 | filePath := C.Path.HomeDir() + "/uploads/0.yaml"
152 | _ = os.Remove(filePath)
153 | _ = os.WriteFile(filePath, all, 0777)
154 |
155 | return true
156 | }
157 |
158 | func Unique(mappings []map[string]any, needTls bool) (maps map[string]map[string]any) {
159 |
160 | maps = make(map[string]map[string]any)
161 |
162 | for _, mapping := range mappings {
163 | proxyType, existType := mapping["type"].(string)
164 | if !existType {
165 | continue
166 | }
167 |
168 | var (
169 | proxyId string
170 | err error
171 | )
172 | server := mapping["server"]
173 | port := mapping["port"]
174 | password := mapping["password"]
175 | uuid := mapping["uuid"]
176 | switch proxyType {
177 | case "ss":
178 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "ss", server, port, password)
179 | case "ssr":
180 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "ssr", server, port, password)
181 | case "vmess":
182 | if needTls {
183 | tls, existTls := mapping["tls"].(bool)
184 | if !existTls || !tls {
185 | continue
186 | }
187 | }
188 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "vmess", server, port, uuid)
189 | case "vless":
190 | if needTls {
191 | tls, existTls := mapping["tls"].(bool)
192 | if !existTls || !tls {
193 | continue
194 | }
195 | }
196 | flow, existFlow := mapping["flow"].(string)
197 | if existFlow && flow != "" && flow != "xtls-rprx-vision" {
198 | continue
199 | }
200 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "vless", server, port, uuid)
201 | case "trojan":
202 | if needTls {
203 | _, existSni := mapping["sni"].(string)
204 | if !existSni {
205 | continue
206 | }
207 | }
208 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "trojan", server, port, password)
209 | case "hysteria":
210 | authStr, exist := mapping["auth_str"]
211 | if !exist {
212 | authStr = mapping["auth-str"]
213 | }
214 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "hysteria", server, port, authStr)
215 | case "hysteria2":
216 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "hysteria2", server, port, password)
217 | case "wireguard":
218 | authStr := mapping["private-key"]
219 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "wireguard", server, port, authStr)
220 | case "tuic":
221 | proxyId = fmt.Sprintf("%s|%v|%v|%v|%v", "tuic", server, port, uuid, password)
222 | default:
223 | err = fmt.Errorf("unsupport proxy type: %s", proxyType)
224 | }
225 |
226 | if err != nil {
227 | continue
228 | }
229 | temp := mapping
230 | temp["name"] = proxyId
231 | maps[proxyId] = temp
232 | }
233 |
234 | return
235 | }
236 |
237 | func map2proxies(maps map[string]map[string]any) (proxies []C.Proxy) {
238 | pool := NewTimeoutPoolWithDefaults()
239 | pool.WaitCount(len(maps))
240 | mutex := sync.Mutex{}
241 |
242 | proxies = make([]C.Proxy, 0)
243 | for _, m := range maps {
244 | proxy := m
245 | pool.SubmitWithTimeout(func(done chan struct{}) {
246 | defer func() {
247 | if e := recover(); e != nil {
248 | log.Printf("===map2proxies===%s\n", e)
249 | }
250 | done <- struct{}{}
251 | }()
252 | proxyT, err := adapter.ParseProxy(proxy)
253 | if err == nil {
254 | mutex.Lock()
255 | proxies = append(proxies, proxyT)
256 | mutex.Unlock()
257 | }
258 | }, 2*time.Second)
259 | }
260 | pool.StartAndWait()
261 |
262 | return
263 | }
264 |
265 | func urlTest(proxies []C.Proxy) []string {
266 | pool := NewTimeoutPoolWithDefaults()
267 | keys := make([]string, 0)
268 | m := sync.Mutex{}
269 |
270 | expectedStatus, _ := utils.NewUnsignedRanges[uint16]("200/204/301/302")
271 | url := "https://www.gstatic.com/generate_204"
272 |
273 | pool.WaitCount(len(proxies))
274 | for _, p := range proxies {
275 | proxy := p
276 | pool.SubmitWithTimeout(func(done chan struct{}) {
277 | defer func() {
278 | if e := recover(); e != nil {
279 | log.Printf("===urlTest===%s\n", e)
280 | }
281 | done <- struct{}{}
282 | }()
283 |
284 | ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*4500)
285 | defer cancel()
286 | _, err := proxy.URLTest(ctx, url, expectedStatus)
287 | if err == nil {
288 | m.Lock()
289 | keys = append(keys, proxy.Name())
290 | m.Unlock()
291 | }
292 | }, 5*time.Second)
293 | }
294 | pool.StartAndWait()
295 |
296 | return keys
297 | }
298 |
299 | func GetCountryName(keys []string, maps map[string]map[string]any) []map[string]any {
300 |
301 | r := &net.Resolver{
302 | PreferGo: true,
303 | Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
304 | d := net.Dialer{
305 | Timeout: 100 * time.Millisecond,
306 | }
307 | return d.DialContext(ctx, network, "1.1.1.1")
308 | },
309 | }
310 |
311 | proxies := make([]map[string]any, 0)
312 | ipLock := sync.Mutex{}
313 | wg := sync.WaitGroup{}
314 | wg.Add(len(keys))
315 | for _, key := range keys {
316 | m := maps[key]
317 | m["name"] = "ZZ"
318 | go func() {
319 | defer wg.Done()
320 |
321 | ipOrDomain := m["server"].(string)
322 | if tools.CheckStringAlphabet(ipOrDomain) {
323 | ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500)
324 | defer cancel()
325 | iPv4, err := r.LookupIP(ctx, "ip4", ipOrDomain)
326 | if err == nil && iPv4 != nil {
327 | m["name"] = getCountryCode(iPv4[0].String())
328 | }
329 | } else {
330 | m["name"] = getCountryCode(ipOrDomain)
331 | }
332 | ipLock.Lock()
333 | proxies = append(proxies, m)
334 | ipLock.Unlock()
335 | }()
336 | }
337 |
338 | wg.Wait()
339 | return proxies
340 | }
341 |
342 | func getCountryCode(domain string) string {
343 | countryCode := "ZZ"
344 | record, err := db.Get_country_short(domain)
345 | if err != nil || len(record.Country_short) != 2 {
346 | return countryCode
347 | }
348 |
349 | return record.Country_short
350 | }
351 |
352 | func getIndex(at string) int {
353 | switch at {
354 | case "hysteria2":
355 | return 1
356 | case "hysteria":
357 | return 2
358 | case "tuic":
359 | return 3
360 | case "ss":
361 | return 5
362 | case "vless":
363 | return 6
364 | default:
365 | return 10
366 | }
367 | }
368 |
369 | func SortAddEmoji(proxies []map[string]any) {
370 | sort.Slice(proxies, func(i, j int) bool {
371 | iProtocol := proxies[i]["type"].(string)
372 | jProtocol := proxies[j]["type"].(string)
373 |
374 | if getIndex(iProtocol) != getIndex(jProtocol) {
375 | return getIndex(iProtocol) < getIndex(jProtocol)
376 | }
377 |
378 | if proxies[i]["name"].(string) != proxies[j]["name"].(string) {
379 | return proxies[i]["name"].(string) < proxies[j]["name"].(string)
380 | }
381 |
382 | return tools.Reverse(proxies[i]["server"].(string)) < tools.Reverse(proxies[j]["server"].(string))
383 | })
384 |
385 | for i, _ := range proxies {
386 | name := proxies[i]["name"].(string)
387 | name = fmt.Sprintf("%s %s_%+02v", emojiMap[name], name, i+1)
388 | proxies[i]["name"] = strings.TrimSpace(name)
389 | }
390 | }
391 |
392 | func SortAddIndex(proxies []map[string]any) []map[string]any {
393 | // 去重
394 | maps := Unique(proxies, false)
395 | keys := make([]string, 0)
396 | for k := range maps {
397 | keys = append(keys, k)
398 | }
399 | // 国家代码查询
400 | proxies = GetCountryName(keys, maps)
401 | // 排序添加emoji
402 | SortAddEmoji(proxies)
403 |
404 | return proxies
405 | }
406 |
--------------------------------------------------------------------------------
/spider/v2ray.go:
--------------------------------------------------------------------------------
1 | package spider
2 |
3 | import (
4 | "github.com/metacubex/mihomo/common/convert"
5 | "log"
6 | "sync"
7 | )
8 |
9 | func init() {
10 | Register(CollectV2ray, NewV2rayCollect)
11 | }
12 |
13 | type V2ray struct {
14 | Url string
15 | }
16 |
17 | func (c *V2ray) Get() []map[string]any {
18 | proxies := make([]map[string]any, 0)
19 |
20 | all := GetBytes(c.Url)
21 | if all != nil {
22 | v2ray, err := convert.ConvertsV2Ray(all)
23 | if err == nil && v2ray != nil {
24 | proxies = v2ray
25 | }
26 | }
27 |
28 | return proxies
29 | }
30 |
31 | func (c *V2ray) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) {
32 | defer wg.Done()
33 | nodes := c.Get()
34 | log.Printf("STATISTIC: V2ray count=%d url=%s\n", len(nodes), c.Url)
35 | if len(nodes) > 0 {
36 | pc <- nodes
37 | }
38 | }
39 |
40 | func NewV2rayCollect(getter Getter) Collect {
41 | return &V2ray{Url: getter.Url}
42 | }
43 |
--------------------------------------------------------------------------------
/tools/httpclient.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "crypto/tls"
5 | "fmt"
6 | C "github.com/metacubex/mihomo/constant"
7 | "golang.org/x/net/context"
8 | "io"
9 | "log"
10 | "net"
11 | "net/http"
12 | "net/url"
13 | "sync"
14 | "time"
15 | )
16 |
17 | var dialerBaidu = &net.Dialer{
18 | Resolver: &net.Resolver{
19 | PreferGo: true,
20 | Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
21 | d := net.Dialer{
22 | Timeout: time.Duration(5000) * time.Millisecond,
23 | }
24 | return d.DialContext(ctx, "udp", "180.76.76.76:53")
25 | },
26 | },
27 | }
28 |
29 | var dialBaiduContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
30 | return dialerBaidu.DialContext(ctx, network, addr)
31 | }
32 |
33 | // HttpGetByProxy 使用代理访问指定的URL并返回响应数据
34 | func HttpGetByProxy(requestUrl, httpProxyUrl string) ([]byte, error) {
35 | // 拼接代理地址
36 | uri, _ := url.Parse(httpProxyUrl)
37 |
38 | // 创建一个带代理的HTTP客户端
39 | client := http.Client{
40 | Transport: &http.Transport{
41 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
42 | Proxy: http.ProxyURL(uri),
43 | },
44 | Timeout: 20 * time.Second,
45 | }
46 |
47 | // 创建一个GET请求
48 | req, err := http.NewRequest(http.MethodGet, requestUrl, nil)
49 | if err != nil {
50 | log.Printf("HttpGetByProxy http.NewRequest %s %v\n", requestUrl, err)
51 | return nil, err
52 | }
53 | req.Header.Set("Accept-Encoding", "utf-8")
54 | req.Header.Set("Accept", "*/*")
55 | req.Header.Set("User-Agent", C.UA)
56 |
57 | // 发送请求并获取响应
58 | resp, err := client.Do(req)
59 | if err != nil {
60 | log.Printf("HttpGetByProxy client.Do %s %v\n", requestUrl, err)
61 | return nil, err
62 | }
63 | defer func(Body io.ReadCloser) {
64 | err := Body.Close()
65 | if err != nil {
66 | // 处理异常情况
67 | }
68 | }(resp.Body)
69 | // 读取响应数据
70 | data, err := io.ReadAll(resp.Body)
71 | if err != nil {
72 | log.Printf("HttpGetByProxy io.ReadAll %s %v\n", requestUrl, err)
73 | return nil, err
74 | }
75 |
76 | if resp.StatusCode != http.StatusOK {
77 | log.Printf("HttpGetByProxy StatusCode %s %d\n", requestUrl, resp.StatusCode)
78 | return nil, fmt.Errorf("StatusCode %d", resp.StatusCode)
79 | }
80 |
81 | return data, nil
82 | }
83 |
84 | // HttpGet 使用HTTP GET方法请求指定的URL,并返回响应的数据和可能的错误。
85 | func HttpGet(requestUrl string) ([]byte, error) {
86 | timeOut := 15 * time.Second
87 | return HttpGetWithTimeout(requestUrl, timeOut, true)
88 | }
89 |
90 | // HttpGetWithTimeout 使用HTTP GET方法请求指定的URL,并返回响应的数据和可能的错误。
91 | func HttpGetWithTimeout(requestUrl string, outTime time.Duration, needDail bool) ([]byte, error) {
92 | client := http.Client{
93 | Timeout: outTime, // 请求超时时间
94 | }
95 |
96 | if needDail {
97 | client.Transport = &http.Transport{
98 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 安全证书验证关闭
99 | DialContext: dialBaiduContext,
100 | }
101 | }
102 |
103 | req, err := http.NewRequest(http.MethodGet, requestUrl, nil) // 创建一个新的GET请求
104 | if err != nil {
105 | log.Printf("HttpGetWithTimeout http.NewRequest %s %v\n", requestUrl, err)
106 | return nil, err
107 | }
108 | req.Header.Set("Accept-Encoding", "utf-8") // 设置响应内容编码为utf-8
109 | req.Header.Set("Accept", "*/*") // 设置响应内容类型为全部
110 | req.Header.Set("User-Agent", C.UA) // 设置用户代理为C.UA
111 |
112 | resp, err := client.Do(req) // 发送请求并获取响应
113 | if err != nil {
114 | log.Printf("HttpGetWithTimeout client.Do %s %v\n", requestUrl, err)
115 | return nil, err
116 | }
117 | defer func(Body io.ReadCloser) {
118 | err := Body.Close()
119 | if err != nil {
120 | // 处理关闭响应体的错误
121 | }
122 | }(resp.Body)
123 | data, err := io.ReadAll(resp.Body) // 读取响应体的数据
124 | if err != nil {
125 | log.Printf("HttpGetWithTimeout io.ReadAll %s %v\n", requestUrl, err)
126 | return nil, err
127 | }
128 |
129 | if resp.StatusCode != http.StatusOK {
130 | log.Printf("HttpGetWithTimeout StatusCode %s %d\n", requestUrl, resp.StatusCode)
131 | return nil, fmt.Errorf("StatusCode %d", resp.StatusCode)
132 | }
133 |
134 | return data, nil // 返回响应数据和无错误
135 | }
136 |
137 | // ConcurrentHttpGet 并发获取指定URL的HTTP内容
138 | func ConcurrentHttpGet(url string) (all []byte) {
139 | // 开启多线程请求
140 | cLock := sync.Mutex{}
141 | done := make(chan bool, 1)
142 | length := 128
143 | wg := sync.WaitGroup{}
144 | go func() {
145 | wg.Add(1)
146 | defer wg.Done()
147 |
148 | content, err := HttpGetByProxy(url, "")
149 | if err == nil {
150 | cLock.Lock()
151 | if all == nil && len(content) > length {
152 | all = content
153 | }
154 | cLock.Unlock()
155 | done <- true
156 | }
157 | }()
158 | go func() {
159 | wg.Add(1)
160 | defer wg.Done()
161 |
162 | content, err := HttpGet(url)
163 | if err == nil {
164 | cLock.Lock()
165 | if all == nil && len(content) > length {
166 | all = content
167 | }
168 | cLock.Unlock()
169 | done <- true
170 | }
171 | }()
172 |
173 | go func() {
174 | time.Sleep(5 * time.Second)
175 | wg.Wait()
176 | done <- true
177 | }()
178 |
179 | select {
180 | case <-done:
181 | case <-time.After(20 * time.Second):
182 | }
183 |
184 | return
185 | }
186 |
--------------------------------------------------------------------------------
/tools/randstr.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "bytes"
5 | "crypto/rand"
6 | "encoding/binary"
7 | )
8 |
9 | // Bytes generates n random bytes
10 | func Bytes(n int) []byte {
11 | b := make([]byte, n)
12 | _, err := rand.Read(b)
13 | if err != nil {
14 | panic(err)
15 | }
16 | return b
17 | }
18 |
19 | const Base64Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
20 | const Base62Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
21 | const HexChars = "0123456789abcdef"
22 | const DecChars = "0123456789"
23 |
24 | // Base64 generates a random Base64 string with length of n
25 | //
26 | // Example: X02+jDDF/exDoqPg9/aXlzbUCN93GIQ5
27 | func Base64(n int) string { return String(n, Base64Chars) }
28 |
29 | // Base62 generates a random Base62 string with length of n
30 | //
31 | // Example: 1BsNqB61o4ztSqLC6labKGNf4MYy352X
32 | func Base62(n int) string { return String(n, Base62Chars) }
33 |
34 | // Dec generates a random decimal number string with length of n
35 | //
36 | // Example: 37110235710860781655802098192113
37 | func Dec(n int) string { return String(n, DecChars) }
38 |
39 | // Hex generates a random Hexadecimal string with length of n
40 | //
41 | // Example: 67aab2d956bd7cc621af22cfb169cba8
42 | func Hex(n int) string { return String(n, HexChars) }
43 |
44 | // list of default letters that can be used to make a random string when calling String
45 | // function with no letters provided
46 | var defLetters = []rune(Base62Chars)
47 |
48 | // String generates a random string using only letters provided in the letters parameter.
49 | //
50 | // If user omits letters parameter, this function will use Base62Chars instead.
51 | func String(n int, letters ...string) string {
52 | var letterRunes []rune
53 | if len(letters) == 0 {
54 | letterRunes = defLetters
55 | } else {
56 | letterRunes = []rune(letters[0])
57 | }
58 |
59 | var bb bytes.Buffer
60 | bb.Grow(n)
61 | l := uint32(len(letterRunes))
62 | // on each loop, generate one random rune and append to output
63 | for i := 0; i < n; i++ {
64 | bb.WriteRune(letterRunes[binary.BigEndian.Uint32(Bytes(4))%l])
65 | }
66 | return bb.String()
67 | }
68 |
--------------------------------------------------------------------------------
/tools/snowflake.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "sync"
5 | "time"
6 | )
7 |
8 | const (
9 | epoch = int64(1577808000000) // 设置起始时间(时间戳/毫秒):2020-01-01 00:00:00,有效期69年
10 | timestampBits = uint(41) // 时间戳占用位数
11 | datacenteridBits = uint(5) // 数据中心id所占位数
12 | workeridBits = uint(5) // 机器id所占位数
13 | sequenceBits = uint(12) // 序列所占的位数
14 | timestampMax = int64(-1 ^ (-1 << timestampBits)) // 时间戳最大值
15 | sequenceMask = int64(-1 ^ (-1 << sequenceBits)) // 支持的最大序列id数量
16 | workeridShift = sequenceBits // 机器id左移位数
17 | datacenteridShift = sequenceBits + workeridBits // 数据中心id左移位数
18 | timestampShift = sequenceBits + workeridBits + datacenteridBits // 时间戳左移位数
19 | )
20 |
21 | type snowflake struct {
22 | sync.Mutex
23 | timestamp int64
24 | workerid int64
25 | datacenterid int64
26 | sequence int64
27 | }
28 |
29 | var s = &snowflake{
30 | timestamp: 0,
31 | datacenterid: 1,
32 | workerid: 2,
33 | sequence: 0,
34 | }
35 |
36 | func SnowflakeId() int64 {
37 | return s.nextVal()
38 | }
39 |
40 | // nextVal 返回下一个Snowflake ID
41 | func (s *snowflake) nextVal() int64 {
42 | s.Lock()
43 | now := time.Now().UnixNano() / 1000000 // 转毫秒
44 | if s.timestamp == now {
45 | // 当同一时间戳(精度:毫秒)下多次生成id会增加序列号
46 | s.sequence = (s.sequence + 1) & sequenceMask
47 | if s.sequence == 0 {
48 | // 如果当前序列超出12bit长度,则需要等待下一毫秒
49 | // 下一毫秒将使用sequence:0
50 | for now <= s.timestamp {
51 | now = time.Now().UnixNano() / 1000000
52 | }
53 | }
54 | } else {
55 | // 不同时间戳(精度:毫秒)下直接使用序列号:0
56 | s.sequence = 0
57 | }
58 | t := now - epoch
59 | if t > timestampMax {
60 | s.Unlock()
61 | return epoch
62 | }
63 | s.timestamp = now
64 | r := (t)<= "0" && charVariable <= "9" {
47 | return false
48 | }
49 |
50 | return true
51 | }
52 |
53 | // Reverse
54 | //
55 | // @Description: 反转域名字符串
56 | // @param s
57 | // @return string
58 | func Reverse(s string) string {
59 | if !CheckStringAlphabet(s) {
60 | return s
61 | }
62 | r := []rune(s)
63 | for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
64 | r[i], r[j] = r[j], r[i]
65 | }
66 |
67 | return string(r)
68 | }
69 |
70 | // GetFreePort 函数用于获取一个可用的随机端口号,并在函数结束后关闭监听器。
71 | func GetFreePort() (int, error) {
72 | return GetFreeWithPort(0)
73 | }
74 |
75 | // GetFreeWithPort 检测端口是否可用
76 | func GetFreeWithPort(port int) (int, error) {
77 | addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%d", port))
78 | if err != nil {
79 | return 0, err
80 | }
81 |
82 | l, err := net.ListenTCP("tcp", addr)
83 | if err != nil {
84 | return 0, err
85 | }
86 |
87 | defer func(l *net.TCPListener) {
88 | err := l.Close()
89 | if err != nil {
90 |
91 | }
92 | }(l)
93 | return l.Addr().(*net.TCPAddr).Port, nil
94 | }
95 |
--------------------------------------------------------------------------------