<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pokemon Tools - vnGAME</title>
	<atom:link href="https://vngame.tv/chuyen-muc/pokemon-tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://vngame.tv/chuyen-muc/pokemon-tools/</link>
	<description>TẢI GAME MIỄN PHÍ</description>
	<lastBuildDate>Tue, 27 Oct 2026 10:52:33 +0000</lastBuildDate>
	<language>vi</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://vngame.tv/wp-content/uploads/2020/12/favion-2020-70x70.png</url>
	<title>Pokemon Tools - vnGAME</title>
	<link>https://vngame.tv/chuyen-muc/pokemon-tools/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">128554084</site>	<item>
		<title>Tra cứu nơi bắt Pokémon theo từng game</title>
		<link>https://vngame.tv/tra-cuu-noi-bat-pokemon/</link>
					<comments>https://vngame.tv/tra-cuu-noi-bat-pokemon/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Thu, 15 Oct 2026 21:38:10 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[nơi bắt Pokémon]]></category>
		<category><![CDATA[Pokédex]]></category>
		<category><![CDATA[Pokémon]]></category>
		<category><![CDATA[Pokémon locations]]></category>
		<category><![CDATA[Pokémon theo phiên bản]]></category>
		<category><![CDATA[Tra cứu nơi bắt Pokémon theo từng game]]></category>
		<category><![CDATA[tra cứu Pokémon]]></category>
		<category><![CDATA[vị trí Pokémon]]></category>
		<category><![CDATA[vngametv]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=20557</guid>

					<description><![CDATA[<p>Bạn đang tìm một Pokémon nhưng chưa biết bắt ở đâu? Công cụ Tra cứu nơi bắt Pokémon trên vnGame giúp bạn tìm kiếm địa điểm xuất hiện của Pokémon theo từng phiên bản game, từ khu vực sinh sống đến phương thức gặp và điều kiện bắt. Hãy chọn phiên bản Pokémon bạn đang chơi, tìm tên Pokémon cần tra cứu và sử dụng các bộ lọc để thu hẹp kết quả. Bạn cũng có thể theo dõi tiến độ sưu tập và kiểm tra các điều kiện liên quan khi dữ liệu của phiên bản đó có hỗ [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/tra-cuu-noi-bat-pokemon/" data-wpel-link="internal">Tra cứu nơi bắt Pokémon theo từng game</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bạn đang tìm một Pokémon nhưng chưa biết bắt ở đâu? Công cụ <strong>Tra cứu nơi bắt Pokémon</strong> trên vnGame giúp bạn tìm kiếm địa điểm xuất hiện của Pokémon theo từng phiên bản game, từ khu vực sinh sống đến phương thức gặp và điều kiện bắt.</p>



<p class="wp-block-paragraph">Hãy chọn phiên bản Pokémon bạn đang chơi, tìm tên Pokémon cần tra cứu và sử dụng các bộ lọc để thu hẹp kết quả. Bạn cũng có thể theo dõi tiến độ sưu tập và kiểm tra các điều kiện liên quan khi dữ liệu của phiên bản đó có hỗ trợ.</p>



<p class="wp-block-paragraph">Chọn game bên dưới để bắt đầu tra cứu!</p>


    <section id="vngpc-9c19788a-c3bd-47df-9c8d-c5048e9f9f75" class="vngpc-root google-anno-skip" data-vngpc-app data-api-games="https://vngame.tv/wp-json/vngpc/v1/games" data-api-base="https://vngame.tv/wp-json/vngpc/v1/games/" data-initial-game="pokemon-unbound" aria-live="polite">
        <script type="application/json" class="vngpc-initial-data">{"schema_version":1,"game":{"id":"pokemon-unbound","name":"Pokémon Unbound","version":"","region":"Borrius"},"notice_vi":"Khám phá vùng Borrius trong Pokémon Unbound. Chọn khu vực, tiến độ và điều kiện đã mở để xem những Pokémon đã được ghi nhận; nhiệm vụ phụ, khu vực bí mật và một số cuộc gặp đặc biệt có thể cần điều kiện riêng.","milestones":[{"id":"start","label":"Mới bắt đầu tại Frozen Heights","order":0},{"id":"route2","label":"Đã qua Icicle Cave, tới Route 2","order":1},{"id":"dresco","label":"Đã tới Dresco Town","order":2},{"id":"tehl","label":"Đã tới Tehl Town / vùng Route 10","order":3},{"id":"fallshore","label":"Đã tới Fallshore City","order":4},{"id":"postgame","label":"Đã trở thành Champion (hậu game)","order":5}],"flags":[{"id":"old-rod","label":"Có Old Rod"},{"id":"good-rod","label":"Có Good Rod"},{"id":"super-rod","label":"Có Super Rod"},{"id":"surf","label":"Đã có Surf"},{"id":"rock-smash","label":"Đã có Rock Smash"},{"id":"cut","label":"Đã có Cut"},{"id":"gen8-activation","label":"Đã kích hoạt Pokémon Gen 8"}],"locations":[{"id":"unbound-map-1-4","name":"Flower Paradise - khu A","name_vi":"Flower Paradise - khu A"},{"id":"unbound-map-1-5","name":"Flower Paradise - khu B","name_vi":"Flower Paradise - khu B"},{"id":"unbound-map-1-6","name":"Flower Paradise - khu C","name_vi":"Flower Paradise - khu C"},{"id":"unbound-map-1-33","name":"Khu vực chưa xác định (mã 1-33)","name_vi":"Khu vực chưa xác định (mã 1-33)"},{"id":"unbound-map-1-34","name":"Khu vực chưa xác định (mã 1-34)","name_vi":"Khu vực chưa xác định (mã 1-34)"},{"id":"unbound-map-1-35","name":"Rift Cave tầng B1","name_vi":"Rift Cave tầng B1"},{"id":"unbound-map-1-36","name":"Khu vực chưa xác định (mã 1-36)","name_vi":"Khu vực chưa xác định (mã 1-36)"},{"id":"unbound-map-1-46","name":"Cinder Volcano tầng 3 1","name_vi":"Cinder Volcano tầng 3 1"},{"id":"unbound-map-1-48","name":"Khu vực chưa xác định (mã 1-48)","name_vi":"Khu vực chưa xác định (mã 1-48)"},{"id":"unbound-map-1-49","name":"Khu vực chưa xác định (mã 1-49)","name_vi":"Khu vực chưa xác định (mã 1-49)"},{"id":"unbound-map-1-50","name":"Cinder Volcano tầng 4 2","name_vi":"Cinder Volcano tầng 4 2"},{"id":"unbound-map-1-51","name":"Cinder Volcano Shadow tầng B1","name_vi":"Cinder Volcano Shadow tầng B1"},{"id":"unbound-map-1-52","name":"Cinder Volcano Shadow tầng B2","name_vi":"Cinder Volcano Shadow tầng B2"},{"id":"unbound-map-1-53","name":"Cinder Volcano Shadow Storage 1","name_vi":"Cinder Volcano Shadow Storage 1"},{"id":"unbound-map-1-54","name":"Cinder Volcano Shadow Storage 2","name_vi":"Cinder Volcano Shadow Storage 2"},{"id":"unbound-map-1-63","name":"Distortion World 1","name_vi":"Distortion World 1"},{"id":"unbound-map-1-64","name":"Distortion World 2","name_vi":"Distortion World 2"},{"id":"unbound-map-1-65","name":"Distortion World 3","name_vi":"Distortion World 3"},{"id":"unbound-map-1-68","name":"Antisis Sewers North","name_vi":"Antisis Sewers North"},{"id":"unbound-map-1-69","name":"Antisis Sewers South","name_vi":"Antisis Sewers South"},{"id":"unbound-map-1-72","name":"Antisis Sewers Room","name_vi":"Antisis Sewers Room"},{"id":"unbound-map-1-81","name":"Frozen Forest","name_vi":"Frozen Forest"},{"id":"unbound-map-1-83","name":"Tomb Of Borrius tầng 1","name_vi":"Tomb Of Borrius tầng 1"},{"id":"unbound-map-1-84","name":"Khu vực chưa xác định (mã 1-84)","name_vi":"Khu vực chưa xác định (mã 1-84)"},{"id":"unbound-map-1-85","name":"Tomb Of Borrius tầng B3","name_vi":"Tomb Of Borrius tầng B3"},{"id":"unbound-map-1-86","name":"Khu vực chưa xác định (mã 1-86)","name_vi":"Khu vực chưa xác định (mã 1-86)"},{"id":"unbound-map-1-87","name":"Khu vực chưa xác định (mã 1-87)","name_vi":"Khu vực chưa xác định (mã 1-87)"},{"id":"unbound-map-1-88","name":"Khu vực chưa xác định (mã 1-88)","name_vi":"Khu vực chưa xác định (mã 1-88)"},{"id":"unbound-map-1-89","name":"Khu vực chưa xác định (mã 1-89)","name_vi":"Khu vực chưa xác định (mã 1-89)"},{"id":"unbound-map-1-90","name":"Tomb Of Borrius tầng 1 Back","name_vi":"Tomb Of Borrius tầng 1 Back"},{"id":"unbound-map-1-98","name":"Redwood Forest","name_vi":"Redwood Forest"},{"id":"unbound-map-1-99","name":"Vivill Woods","name_vi":"Vivill Woods"},{"id":"unbound-map-1-102","name":"Vivill Warehouse Research Room","name_vi":"Vivill Warehouse Research Room"},{"id":"unbound-map-1-107","name":"Ruins Of Void tầng B3 Alt","name_vi":"Ruins Of Void tầng B3 Alt"},{"id":"unbound-map-1-108","name":"Rov Post Game Aklove","name_vi":"Rov Post Game Aklove"},{"id":"unbound-map-1-109","name":"Ruins Of Void Ext","name_vi":"Ruins Of Void Ext"},{"id":"unbound-map-1-110","name":"Khu vực chưa xác định (mã 1-110)","name_vi":"Khu vực chưa xác định (mã 1-110)"},{"id":"unbound-map-1-111","name":"Khu vực chưa xác định (mã 1-111)","name_vi":"Khu vực chưa xác định (mã 1-111)"},{"id":"unbound-map-1-112","name":"Khu vực chưa xác định (mã 1-112)","name_vi":"Khu vực chưa xác định (mã 1-112)"},{"id":"unbound-map-1-113","name":"Khu vực chưa xác định (mã 1-113)","name_vi":"Khu vực chưa xác định (mã 1-113)"},{"id":"unbound-map-1-114","name":"Ruins Of Void tầng B3","name_vi":"Ruins Of Void tầng B3"},{"id":"unbound-map-1-115","name":"Khu vực chưa xác định (mã 1-115)","name_vi":"Khu vực chưa xác định (mã 1-115)"},{"id":"unbound-map-1-116","name":"Khu vực chưa xác định (mã 1-116)","name_vi":"Khu vực chưa xác định (mã 1-116)"},{"id":"unbound-map-1-117","name":"Khu vực chưa xác định (mã 1-117)","name_vi":"Khu vực chưa xác định (mã 1-117)"},{"id":"unbound-map-1-119","name":"Autl Woods West","name_vi":"Autl Woods West"},{"id":"unbound-map-1-120","name":"Autl Woods East","name_vi":"Autl Woods East"},{"id":"unbound-map-1-121","name":"Lost Tunnel tầng B1","name_vi":"Lost Tunnel tầng B1"},{"id":"unbound-map-2-0","name":"Icy Hole tầng 1","name_vi":"Icy Hole tầng 1"},{"id":"unbound-map-2-14","name":"Icy Hole tầng B1","name_vi":"Icy Hole tầng B1"},{"id":"unbound-map-2-26","name":"Khu vực chưa xác định (mã 2-26)","name_vi":"Khu vực chưa xác định (mã 2-26)"},{"id":"unbound-map-2-27","name":"Khu vực chưa xác định (mã 2-27)","name_vi":"Khu vực chưa xác định (mã 2-27)"},{"id":"unbound-map-2-59","name":"Khu vực chưa xác định (mã 2-59)","name_vi":"Khu vực chưa xác định (mã 2-59)"},{"id":"unbound-map-3-0","name":"Polder Town","name_vi":"Polder Town"},{"id":"unbound-map-3-1","name":"Cootes Bog","name_vi":"Cootes Bog"},{"id":"unbound-map-3-4","name":"Magnolia Fields","name_vi":"Magnolia Fields"},{"id":"unbound-map-3-5","name":"Redwood Village","name_vi":"Redwood Village"},{"id":"unbound-map-3-6","name":"Cube Corp","name_vi":"Cube Corp"},{"id":"unbound-map-3-67","name":"Route 1","name_vi":"Route 1","map_image_url":"https://vngame.tv/wp-content/uploads/2026/09/huong-dan-choi-pokemon-unbound-hoan-chinh-14.jpg","description_vi":"Tuyến đường tuyết đầu tiên, nối Frozen Heights ở phía bắc với Bellin Town ở phía nam. Lối vào Icicle Cave nằm trên tuyến này. Pokémon hoang dã trên tuyến thường được tìm trong cỏ dài.","landmarks_vi":["Phía bắc: Frozen Heights.","Phía nam: Bellin Town.","Có lối vào Icicle Cave.","Một số vật phẩm nằm trên gờ cao hoặc gần hồ; có vật phẩm cần Rock Climb hoặc nhiệm vụ đã mở."],"map_connections":[{"name":"Frozen Heights","direction":"Bắc","position":"top"},{"name":"Icicle Cave","direction":"Lối vào hang","position":"right"},{"name":"Bellin Town","direction":"Nam","position":"bottom"}]},{"id":"unbound-map-3-69","name":"Route 2","name_vi":"Route 2","map_image_url":"https://vngame.tv/wp-content/uploads/2026/09/huong-dan-choi-pokemon-unbound-hoan-chinh-37.jpg","description_vi":"Tuyến đường ở phía bên kia Icicle Cave, dẫn đến Dresco Town. Có lối kết nối đường thủy với Route 15 khi đã có Surf.","landmarks_vi":["Có lối vào Icicle Cave.","Đường đi chính dẫn đến Dresco Town.","Kết nối đường thủy về phía Route 15 cần Surf."],"map_connections":[{"name":"Icicle Cave","direction":"Lối vào hang","position":"top"},{"name":"Dresco Town","direction":"Tây","position":"left"},{"name":"Route 15","direction":"Đường thủy","position":"right","condition":"Cần Surf"}]},{"id":"unbound-map-3-70","name":"Route 3","name_vi":"Route 3","map_image_url":"https://vngame.tv/wp-content/uploads/2026/09/huong-dan-choi-pokemon-unbound-hoan-chinh-56.jpg","description_vi":"Tuyến đường bãi biển ngay phía bắc Dresco Town, còn được gọi là Paradise Road. Đây là lối đi đến Flower Paradise; một số khu vực và người huấn luyện chỉ tiếp cận được khi có Surf.","landmarks_vi":["Phía nam nối với Dresco Town.","Phía bắc dẫn tới Flower Paradise.","Có bãi biển, các đảo nhỏ và Raid Den.","Một số điểm chỉ tiếp cận được khi có Surf."],"map_connections":[{"name":"Flower Paradise","direction":"Bắc","position":"top"},{"name":"Dresco Town","direction":"Nam","position":"bottom"}]},{"id":"unbound-map-3-71","name":"Dresco Town","name_vi":"Dresco Town","map_image_url":"https://vngame.tv/wp-content/uploads/2026/09/huong-dan-choi-pokemon-unbound-hoan-chinh-43.jpg","description_vi":"Thị trấn có Gym hệ Cỏ của Gym Leader Mirskle và nhiều địa điểm phục vụ hành trình. Từ đây có thể đi Route 3, Route 2, hoặc mở thêm các lối khác khi đáp ứng điều kiện.","landmarks_vi":["Dresco Gym: Gym hệ Cỏ.","Có Trainer House và Pokémon Center.","Lối vào KBT Expressway mở sau khi đến Crater Town.","Lối đi về Dehara City qua đường nước cần Surf."],"map_connections":[{"name":"Route 3","direction":"Bắc","position":"top"},{"name":"Route 2 phía tây","direction":"Tây","position":"left"},{"name":"Route 2 phía đông","direction":"Đông","position":"right"},{"name":"KBT Expressway","direction":"Lối vào có điều kiện","position":"top-right","condition":"Mở sau khi đến Crater Town"},{"name":"Dehara City","direction":"Đường phía nam","position":"bottom","condition":"Cần Surf"}]},{"id":"unbound-map-3-72","name":"Route 4","name_vi":"Route 4"},{"id":"unbound-map-3-73","name":"Route 5","name_vi":"Route 5"},{"id":"unbound-map-3-75","name":"Route 6","name_vi":"Route 6"},{"id":"unbound-map-3-76","name":"Route 7","name_vi":"Route 7"},{"id":"unbound-map-3-77","name":"Route 8","name_vi":"Route 8"},{"id":"unbound-map-3-79","name":"Route 9","name_vi":"Route 9"},{"id":"unbound-map-3-80","name":"Tehl Town","name_vi":"Tehl Town"},{"id":"unbound-map-3-81","name":"Route 10","name_vi":"Route 10","description_vi":"Khu vực sông và hồ mang tên Autumn River, nằm phía tây Fallshore City. Tehl Town ở phía tây; phía bắc là Auburn Waterway. Có nội dung nhiệm vụ Terror Granbull và lối vào Cave of Being ở hậu game.","landmarks_vi":["Phía đông nối Fallshore City.","Phía tây nối Tehl Town.","Phía bắc nối Auburn Waterway.","Cave of Being cần Rock Climb và chỉ mở ở hậu game.","Một số điểm thuộc Mission #073: The Terror Granbull."],"map_connections":[{"name":"Auburn Waterway","direction":"Bắc","position":"top"},{"name":"Tehl Town","direction":"Tây","position":"left"},{"name":"Fallshore City","direction":"Đông","position":"right"},{"name":"Cave of Being","direction":"Lối vào có điều kiện","position":"bottom-right","condition":"Cần Rock Climb và hậu game"}]},{"id":"unbound-map-3-82","name":"Auburn Waterway A","name_vi":"Auburn Waterway A"},{"id":"unbound-map-3-83","name":"Auburn Waterway B","name_vi":"Auburn Waterway B"},{"id":"unbound-map-3-84","name":"Fallshore City","name_vi":"Fallshore City"},{"id":"unbound-map-3-85","name":"Route 11","name_vi":"Route 11"},{"id":"unbound-map-3-86","name":"Epidimy Town","name_vi":"Epidimy Town"},{"id":"unbound-map-3-87","name":"Tarmigan Town","name_vi":"Tarmigan Town"},{"id":"unbound-map-3-88","name":"Route 12","name_vi":"Route 12"},{"id":"unbound-map-3-89","name":"Dehara City","name_vi":"Dehara City"},{"id":"unbound-map-3-90","name":"Great Desert A","name_vi":"Great Desert A"},{"id":"unbound-map-3-91","name":"Great Desert B","name_vi":"Great Desert B"},{"id":"unbound-map-3-92","name":"Great Desert C","name_vi":"Great Desert C"},{"id":"unbound-map-3-93","name":"Route 13 A","name_vi":"Route 13 A"},{"id":"unbound-map-3-94","name":"Route 13 B","name_vi":"Route 13 B"},{"id":"unbound-map-3-95","name":"Route 14 A","name_vi":"Route 14 A"},{"id":"unbound-map-3-96","name":"Route 14 B","name_vi":"Route 14 B"},{"id":"unbound-map-3-97","name":"Route 14 C","name_vi":"Route 14 C"},{"id":"unbound-map-3-98","name":"Gurun Town","name_vi":"Gurun Town"},{"id":"unbound-map-3-99","name":"Vivill Town","name_vi":"Vivill Town"},{"id":"unbound-map-3-100","name":"Route 15","name_vi":"Route 15"},{"id":"unbound-map-3-101","name":"Route 16","name_vi":"Route 16"},{"id":"unbound-map-3-102","name":"Antisis City","name_vi":"Antisis City"},{"id":"unbound-map-3-103","name":"Thundercap Mt Ext","name_vi":"Thundercap Mt Ext"},{"id":"unbound-map-3-104","name":"Route 17","name_vi":"Route 17"},{"id":"unbound-map-3-105","name":"Seaport City","name_vi":"Seaport City"},{"id":"unbound-map-3-106","name":"Route 18 A","name_vi":"Route 18 A"},{"id":"unbound-map-3-107","name":"Route 18 B","name_vi":"Route 18 B"},{"id":"unbound-map-6-12","name":"Cinder Volcano Shadow tầng 1","name_vi":"Cinder Volcano Shadow tầng 1"},{"id":"unbound-map-32-0","name":"Khu vực chưa xác định (mã 32-0)","name_vi":"Khu vực chưa xác định (mã 32-0)"},{"id":"unbound-map-32-1","name":"Khu vực chưa xác định (mã 32-1)","name_vi":"Khu vực chưa xác định (mã 32-1)"},{"id":"unbound-map-32-2","name":"Khu vực chưa xác định (mã 32-2)","name_vi":"Khu vực chưa xác định (mã 32-2)"},{"id":"unbound-map-32-5","name":"Khu vực chưa xác định (mã 32-5)","name_vi":"Khu vực chưa xác định (mã 32-5)"},{"id":"unbound-map-32-6","name":"Underwater Route 17","name_vi":"Underwater Route 17"},{"id":"unbound-map-43-0","name":"Icicle Cave tầng 1","name_vi":"Icicle Cave tầng 1"},{"id":"unbound-map-43-1","name":"Icicle Cave tầng B1","name_vi":"Icicle Cave tầng B1"},{"id":"unbound-map-43-2","name":"Icicle Cave tầng B2","name_vi":"Icicle Cave tầng B2"},{"id":"unbound-map-43-3","name":"Icicle Cave tầng B3","name_vi":"Icicle Cave tầng B3"},{"id":"unbound-map-43-4","name":"Icicle Cave tầng B3 Alt","name_vi":"Icicle Cave tầng B3 Alt"},{"id":"unbound-map-43-5","name":"Icicle Cave tầng 1 Back","name_vi":"Icicle Cave tầng 1 Back"},{"id":"unbound-map-43-6","name":"Icicle Cave Clearing","name_vi":"Icicle Cave Clearing"},{"id":"unbound-map-43-7","name":"Icicle Cave tầng B4","name_vi":"Icicle Cave tầng B4"},{"id":"unbound-map-45-1","name":"Grim Woods","name_vi":"Grim Woods"},{"id":"unbound-map-45-3","name":"Cinder Volcano F1","name_vi":"Cinder Volcano F1"},{"id":"unbound-map-45-4","name":"Cinder Volcano tầng 2","name_vi":"Cinder Volcano tầng 2"},{"id":"unbound-map-45-5","name":"Khu vực chưa xác định (mã 45-5)","name_vi":"Khu vực chưa xác định (mã 45-5)"},{"id":"unbound-map-46-0","name":"Khu vực chưa xác định (mã 46-0)","name_vi":"Khu vực chưa xác định (mã 46-0)"},{"id":"unbound-map-46-1","name":"Khu vực chưa xác định (mã 46-1)","name_vi":"Khu vực chưa xác định (mã 46-1)"},{"id":"unbound-map-46-2","name":"Khu vực chưa xác định (mã 46-2)","name_vi":"Khu vực chưa xác định (mã 46-2)"},{"id":"unbound-map-46-3","name":"Khu vực chưa xác định (mã 46-3)","name_vi":"Khu vực chưa xác định (mã 46-3)"},{"id":"unbound-map-46-4","name":"Khu vực chưa xác định (mã 46-4)","name_vi":"Khu vực chưa xác định (mã 46-4)"},{"id":"unbound-map-46-5","name":"Khu vực chưa xác định (mã 46-5)","name_vi":"Khu vực chưa xác định (mã 46-5)"},{"id":"unbound-map-46-6","name":"Khu vực chưa xác định (mã 46-6)","name_vi":"Khu vực chưa xác định (mã 46-6)"},{"id":"unbound-map-46-7","name":"Khu vực chưa xác định (mã 46-7)","name_vi":"Khu vực chưa xác định (mã 46-7)"},{"id":"unbound-map-46-8","name":"Khu vực chưa xác định (mã 46-8)","name_vi":"Khu vực chưa xác định (mã 46-8)"},{"id":"unbound-map-46-9","name":"Khu vực chưa xác định (mã 46-9)","name_vi":"Khu vực chưa xác định (mã 46-9)"},{"id":"unbound-map-46-10","name":"Khu vực chưa xác định (mã 46-10)","name_vi":"Khu vực chưa xác định (mã 46-10)"},{"id":"unbound-map-47-0","name":"Valley Cave A","name_vi":"Valley Cave A"},{"id":"unbound-map-47-1","name":"Valley Cave B","name_vi":"Valley Cave B"},{"id":"unbound-map-47-2","name":"Valley Cave C","name_vi":"Valley Cave C"},{"id":"unbound-map-47-3","name":"Valley Cave D","name_vi":"Valley Cave D"},{"id":"unbound-map-48-1","name":"Frost Mountain tầng 3","name_vi":"Frost Mountain tầng 3"},{"id":"unbound-map-50-0","name":"Frost Mountain tầng 1","name_vi":"Frost Mountain tầng 1"},{"id":"unbound-map-50-1","name":"Frost Mountain tầng 2","name_vi":"Frost Mountain tầng 2"},{"id":"unbound-map-52-0","name":"Cliff Cave tầng 1","name_vi":"Cliff Cave tầng 1"},{"id":"unbound-map-52-1","name":"Cliff Cave tầng 2","name_vi":"Cliff Cave tầng 2"},{"id":"unbound-map-52-2","name":"Cliff Cave tầng 3","name_vi":"Cliff Cave tầng 3"},{"id":"unbound-map-53-1","name":"Thundercap Mt tầng 1","name_vi":"Thundercap Mt tầng 1"},{"id":"unbound-map-53-2","name":"Thundercap Mt tầng 2","name_vi":"Thundercap Mt tầng 2"},{"id":"unbound-map-53-3","name":"Thundercap Mt tầng 3 3","name_vi":"Thundercap Mt tầng 3 3"},{"id":"unbound-map-53-4","name":"Thundercap Mt tầng 3 2","name_vi":"Thundercap Mt tầng 3 2"},{"id":"unbound-map-53-5","name":"Thundercap Mt tầng 3 1","name_vi":"Thundercap Mt tầng 3 1"},{"id":"unbound-map-53-6","name":"Thundercap Mt tầng 3 1 Back","name_vi":"Thundercap Mt tầng 3 1 Back"},{"id":"unbound-map-53-7","name":"Khu vực chưa xác định (mã 53-7)","name_vi":"Khu vực chưa xác định (mã 53-7)"},{"id":"unbound-map-53-8","name":"Khu vực chưa xác định (mã 53-8)","name_vi":"Khu vực chưa xác định (mã 53-8)"},{"id":"unbound-map-53-9","name":"Thundercap Mt tầng 4 2","name_vi":"Thundercap Mt tầng 4 2"},{"id":"unbound-map-53-11","name":"Khu vực chưa xác định (mã 53-11)","name_vi":"Khu vực chưa xác định (mã 53-11)"},{"id":"unbound-map-55-0","name":"Victory Road Cave A","name_vi":"Victory Road Cave A"},{"id":"unbound-map-55-1","name":"Victory Road Cave B","name_vi":"Victory Road Cave B"},{"id":"unbound-map-55-2","name":"Victory Road Volcano","name_vi":"Victory Road Volcano"},{"id":"unbound-map-55-3","name":"Victory Road Cave C","name_vi":"Victory Road Cave C"},{"id":"unbound-map-55-4","name":"Victory Road Grassy","name_vi":"Victory Road Grassy"},{"id":"unbound-map-55-5","name":"Victory Road Cave D","name_vi":"Victory Road Cave D"},{"id":"unbound-map-55-6","name":"Victory Road Mountainside","name_vi":"Victory Road Mountainside"},{"id":"unbound-map-55-7","name":"Victory Road Ice Cave A","name_vi":"Victory Road Ice Cave A"},{"id":"unbound-map-55-8","name":"Victory Road Ice Cave B","name_vi":"Victory Road Ice Cave B"},{"id":"unbound-map-56-0","name":"Crystal Peak Bog Entrance","name_vi":"Crystal Peak Bog Entrance"},{"id":"unbound-map-56-1","name":"Crystal Peak tầng B1 Left","name_vi":"Crystal Peak tầng B1 Left"},{"id":"unbound-map-56-2","name":"Crystal Peak tầng 1 Main Room","name_vi":"Crystal Peak tầng 1 Main Room"},{"id":"unbound-map-56-3","name":"Crystal Peak tầng 1 Left Room","name_vi":"Crystal Peak tầng 1 Left Room"},{"id":"unbound-map-56-4","name":"Khu vực chưa xác định (mã 56-4)","name_vi":"Khu vực chưa xác định (mã 56-4)"},{"id":"unbound-map-56-5","name":"Khu vực chưa xác định (mã 56-5)","name_vi":"Khu vực chưa xác định (mã 56-5)"},{"id":"unbound-map-56-6","name":"Crystal Peak Cube Entrance","name_vi":"Crystal Peak Cube Entrance"},{"id":"unbound-map-56-7","name":"Crystal Peak Cliffside","name_vi":"Crystal Peak Cliffside"},{"id":"unbound-map-56-8","name":"Khu vực chưa xác định (mã 56-8)","name_vi":"Khu vực chưa xác định (mã 56-8)"},{"id":"unbound-map-56-9","name":"Crystal Peak tầng 3","name_vi":"Crystal Peak tầng 3"},{"id":"unbound-map-56-10","name":"Khu vực chưa xác định (mã 56-10)","name_vi":"Khu vực chưa xác định (mã 56-10)"},{"id":"unbound-map-56-11","name":"Crystal Peak tầng 5","name_vi":"Crystal Peak tầng 5"},{"id":"seed-seed-seed-seed-frozen-heights","name":"Frozen Heights","name_vi":"Frozen Heights","map_image_url":"https://vngame.tv/wp-content/uploads/2026/09/huong-dan-choi-pokemon-unbound-hoan-chinh-6.jpg","description_vi":"Thị trấn khởi đầu của hành trình ở Borrius. Lối ra phía nam dẫn đến Route 1; các lối vào KBT Expressway và Shadow Base có điều kiện mở riêng. Articuno là nội dung hậu game tại khu vực này.","landmarks_vi":["Điểm bắt đầu cốt truyện và nhà của người chơi.","Route 1 nằm ở phía nam.","Lối vào KBT Expressway chỉ mở sau khi đến Crater Town.","Lối bí mật vào Shadow Base mở sau Cinder Volcano Depths."],"map_connections":[{"name":"Route 1","direction":"Nam","position":"bottom"},{"name":"KBT Expressway","direction":"Lối vào có điều kiện","position":"left","condition":"Mở sau khi đến Crater Town"},{"name":"Shadow Base","direction":"Lối bí mật","position":"right","condition":"Mở sau Cinder Volcano Depths"}]}],"encounters":[{"id":"ub-2c31710652476ba8","pokemon":"Flabébé (Orange)","location_id":"unbound-map-1-4","method":"Cỏ","time":"Ngày và đêm","rate":"60%","level":"9–12","level_min":9,"level_max":12,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-31b88d83ccbfc9ff","pokemon":"Cutiefly","location_id":"unbound-map-1-4","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"9–12","level_min":9,"level_max":12,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-01386f309991842b","pokemon":"Oricorio (Pom-Pom Form)","location_id":"unbound-map-1-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-18a1666b22d98685","pokemon":"Comfey","location_id":"unbound-map-1-4","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd9d435c29cc30fe","pokemon":"Pansage","location_id":"unbound-map-1-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"10–12","level_min":10,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8b2de7ac7b573a98","pokemon":"Combee","location_id":"unbound-map-1-4","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"10–12","level_min":10,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ee5de53fd823073","pokemon":"Flabébé (Yellow)","location_id":"unbound-map-1-4","method":"Surf","time":"","rate":"60%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8803147cb22891a6","pokemon":"Cutiefly","location_id":"unbound-map-1-4","method":"Surf","time":"","rate":"30%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cf17d58f94a222c0","pokemon":"Oricorio (Pa’u Form)","location_id":"unbound-map-1-4","method":"Surf","time":"","rate":"9%","level":"9–12","level_min":9,"level_max":12,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-868b5f5debefd6fd","pokemon":"Combee","location_id":"unbound-map-1-4","method":"Surf","time":"","rate":"1%","level":"10–12","level_min":10,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7b296c107fd43a60","pokemon":"Flabébé","location_id":"unbound-map-1-5","method":"Cỏ","time":"Ngày và đêm","rate":"60%","level":"9–12","level_min":9,"level_max":12,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-df1fb8dbac530fe4","pokemon":"Cutiefly","location_id":"unbound-map-1-5","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"9–12","level_min":9,"level_max":12,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-341848d9828349a4","pokemon":"Oricorio","location_id":"unbound-map-1-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd4eb885811feba4","pokemon":"Comfey","location_id":"unbound-map-1-5","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ac3e15e976362198","pokemon":"Pansear","location_id":"unbound-map-1-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"10–12","level_min":10,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-786872b00d609f5a","pokemon":"Combee","location_id":"unbound-map-1-5","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"10–12","level_min":10,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9487e44104bc2a29","pokemon":"Flabébé (Blue)","location_id":"unbound-map-1-5","method":"Surf","time":"","rate":"60%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1ec14d7d2a932e28","pokemon":"Cutiefly","location_id":"unbound-map-1-5","method":"Surf","time":"","rate":"30%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-64ab52a32e454b84","pokemon":"Panpour","location_id":"unbound-map-1-5","method":"Surf","time":"","rate":"5%","level":"10–12","level_min":10,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5df1dbee6c01b102","pokemon":"Combee","location_id":"unbound-map-1-5","method":"Surf","time":"","rate":"5%","level":"10–12","level_min":10,"level_max":12,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7425e18f575ff82e","pokemon":"Flabébé (White)","location_id":"unbound-map-1-6","method":"Cỏ","time":"Ngày và đêm","rate":"60%","level":"9–12","level_min":9,"level_max":12,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-54fbeb1709be0269","pokemon":"Cutiefly","location_id":"unbound-map-1-6","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b7197a73294f0fe9","pokemon":"Oricorio (Sensu Form)","location_id":"unbound-map-1-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"10–12","level_min":10,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-989f76b3434fc2dd","pokemon":"Comfey","location_id":"unbound-map-1-6","method":"Cỏ","time":"Ngày và đêm","rate":"9%","level":"9–12","level_min":9,"level_max":12,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5bfc119379d86f45","pokemon":"Combee","location_id":"unbound-map-1-6","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-72b1b21a5850b969","pokemon":"Flabébé (White)","location_id":"unbound-map-1-6","method":"Surf","time":"","rate":"60%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-18f3bba774aa500a","pokemon":"Cutiefly","location_id":"unbound-map-1-6","method":"Surf","time":"","rate":"30%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b53014a919a2a6b5","pokemon":"Oricorio (Sensu Form)","location_id":"unbound-map-1-6","method":"Surf","time":"","rate":"9%","level":"10–12","level_min":10,"level_max":12,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7ed52a357429eef4","pokemon":"Combee","location_id":"unbound-map-1-6","method":"Surf","time":"","rate":"1%","level":"10–12","level_min":10,"level_max":12,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b3ed1ca09d7826a1","pokemon":"Golbat","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c6a4fb8025d6b2f7","pokemon":"Haunter","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d26d847655c5cc9e","pokemon":"Duskull","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4b42b83e563e8e75","pokemon":"Golett","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7c4a03c94408db5d","pokemon":"Bronzor","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-085ea0cb7c076b14","pokemon":"Chimecho","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8d3cda4ae6a182af","pokemon":"Bronzong","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5813d246cff6c1f5","pokemon":"Dusclops","location_id":"unbound-map-1-33","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5fda21e35a9912c0","pokemon":"Golbat","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b3265c89f44284ee","pokemon":"Haunter","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d8cb9c5e692fee74","pokemon":"Duskull","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f51d9047cb95ae52","pokemon":"Golett","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4ae4689bec560ec9","pokemon":"Bronzor","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d025353488f72687","pokemon":"Chimecho","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-361756555948f78c","pokemon":"Bronzong","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4e5441e53053d56c","pokemon":"Dusclops","location_id":"unbound-map-1-34","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3753cf79a789753f","pokemon":"Golbat","location_id":"unbound-map-1-35","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-be4b5193189c630c","pokemon":"Haunter","location_id":"unbound-map-1-35","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c21696d7126dc9db","pokemon":"Dusclops","location_id":"unbound-map-1-35","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"60–65","level_min":60,"level_max":65,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-655b17be38e9c1a5","pokemon":"Golurk","location_id":"unbound-map-1-35","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6eb2864a2ffcda9d","pokemon":"Bronzong","location_id":"unbound-map-1-35","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"60–65","level_min":60,"level_max":65,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4a5847429451deb7","pokemon":"Chimecho","location_id":"unbound-map-1-35","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-29b2574af4f11b4e","pokemon":"Golbat","location_id":"unbound-map-1-36","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-68b894ac6160dae1","pokemon":"Haunter","location_id":"unbound-map-1-36","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7b23d526247deb50","pokemon":"Dusclops","location_id":"unbound-map-1-36","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"60–65","level_min":60,"level_max":65,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b35df70b4fa5ed8c","pokemon":"Golurk","location_id":"unbound-map-1-36","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6e6337adb9725c45","pokemon":"Bronzong","location_id":"unbound-map-1-36","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"60–65","level_min":60,"level_max":65,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-efc972afa00c572a","pokemon":"Chimecho","location_id":"unbound-map-1-36","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ea26db3a6ab2d758","pokemon":"Woobat","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-377fc1cf519f0223","pokemon":"Slugma","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c60fd4510125a2d0","pokemon":"Salandit","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f7163e777aa4209","pokemon":"Numel","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6e97686f6286d627","pokemon":"Geodude","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-edcb678cbeb42bb8","pokemon":"Drilbur","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-85f2bd62cf4ff82c","pokemon":"Torkoal","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-431a0be607efbd99","pokemon":"Magby","location_id":"unbound-map-1-46","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d7b8ad1fc59afab9","pokemon":"Slugma","location_id":"unbound-map-1-46","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e8aef83fe6d2d62e","pokemon":"Magcargo","location_id":"unbound-map-1-46","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-56d2d3b2013bbbd9","pokemon":"Geodude","location_id":"unbound-map-1-46","method":"Rock Smash","time":"","rate":"90%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b73709812d6ea9e9","pokemon":"Graveler","location_id":"unbound-map-1-46","method":"Rock Smash","time":"","rate":"9%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e007da13124d5143","pokemon":"Shuckle","location_id":"unbound-map-1-46","method":"Rock Smash","time":"","rate":"1%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f8a90a16f289119","pokemon":"Woobat","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-def294cd991e8721","pokemon":"Slugma","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-38d9ed3c925b8cd8","pokemon":"Salandit","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7f3c0a727bee1b9c","pokemon":"Numel","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-88a857358b6362f5","pokemon":"Geodude","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-59843e80331a99cd","pokemon":"Drilbur","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-aea42e732a0c5585","pokemon":"Torkoal","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-1a549984c9c2081c","pokemon":"Magby","location_id":"unbound-map-1-48","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ef929a9f291beaac","pokemon":"Woobat","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-eb0c805b976a11a5","pokemon":"Slugma","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-469b9bb357fd3be1","pokemon":"Salandit","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ab113074ab0c10cc","pokemon":"Numel","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5314f88881acf039","pokemon":"Geodude","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b128de047a9175f9","pokemon":"Drilbur","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8a67fcf43c59d1b3","pokemon":"Torkoal","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ad73f57be93a60ca","pokemon":"Magby","location_id":"unbound-map-1-49","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-40d5f47d1ae99a28","pokemon":"Slugma","location_id":"unbound-map-1-49","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-dfc00c95f9bf96af","pokemon":"Magcargo","location_id":"unbound-map-1-49","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9d21e73461c87195","pokemon":"Geodude","location_id":"unbound-map-1-49","method":"Rock Smash","time":"","rate":"90%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8477f360efbc5baa","pokemon":"Graveler","location_id":"unbound-map-1-49","method":"Rock Smash","time":"","rate":"9%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a478c66845edea40","pokemon":"Shuckle","location_id":"unbound-map-1-49","method":"Rock Smash","time":"","rate":"1%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0d3b4549a8743789","pokemon":"Woobat","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cfd1b83da19d9619","pokemon":"Slugma","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f2f155989e357f3","pokemon":"Salandit","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-50037b03fb33e1b9","pokemon":"Numel","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–18","level_min":15,"level_max":18,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5c47b0e43a26c345","pokemon":"Geodude","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–18","level_min":15,"level_max":18,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f69d9671f5d9681c","pokemon":"Drilbur","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–18","level_min":16,"level_max":18,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a61257e3f1b164b2","pokemon":"Torkoal","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"17–18","level_min":17,"level_max":18,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1c09b8b3b247c666","pokemon":"Magby","location_id":"unbound-map-1-50","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"17–18","level_min":17,"level_max":18,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-541a6db7e3f81eee","pokemon":"Woobat","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1b13f83d877efbb7","pokemon":"Slugma","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e8de8da3d7cb70ab","pokemon":"Salandit","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ea06eb129fa7342","pokemon":"Camerupt","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3b82990b349f84c","pokemon":"Graveler","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-136ab97045adc85e","pokemon":"Excadrill","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-04b9e1dc579b93ea","pokemon":"Heatmor","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7ec0da6a89639d4e","pokemon":"Magmar","location_id":"unbound-map-1-51","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2f5ee758e39c035b","pokemon":"Slugma","location_id":"unbound-map-1-51","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-438f59df5c07e7ed","pokemon":"Magcargo","location_id":"unbound-map-1-51","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2cb8a023884f8f36","pokemon":"Woobat","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a38b2eee6249cafc","pokemon":"Slugma","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-499927b7d0db76c2","pokemon":"Salandit","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8d27c931a19de2f7","pokemon":"Camerupt","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6bc20d260aec5f2e","pokemon":"Graveler","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-03cfdbcb7427f30f","pokemon":"Excadrill","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-0c10d6149a543e19","pokemon":"Heatmor","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8e7d112fb2c9457c","pokemon":"Magmar","location_id":"unbound-map-1-52","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-300ca2877ada4286","pokemon":"Slugma","location_id":"unbound-map-1-52","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8d74ebfae8abfc27","pokemon":"Magcargo","location_id":"unbound-map-1-52","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd408e3d010a9534","pokemon":"Geodude","location_id":"unbound-map-1-52","method":"Rock Smash","time":"","rate":"90%","level":"25–35","level_min":25,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ee7a6501d4e1cae","pokemon":"Graveler","location_id":"unbound-map-1-52","method":"Rock Smash","time":"","rate":"9%","level":"30–35","level_min":30,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-dfa875e2c35e907d","pokemon":"Shuckle","location_id":"unbound-map-1-52","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e3f28bd6cfc39535","pokemon":"Woobat","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4efe60f0046e2e9f","pokemon":"Slugma","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a1de003d67a0747","pokemon":"Salandit","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8f284014cfab3f24","pokemon":"Camerupt","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-39576c3fd0b82e58","pokemon":"Graveler","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-05e1f25e3c0c93ef","pokemon":"Excadrill","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9afc68b9d3289dd6","pokemon":"Heatmor","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-84773ea2bf2bcdf1","pokemon":"Magmar","location_id":"unbound-map-1-53","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b0e949894b9d060a","pokemon":"Slugma","location_id":"unbound-map-1-53","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-93677504ae3c1915","pokemon":"Magcargo","location_id":"unbound-map-1-53","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7e9762efeab2b0bb","pokemon":"Geodude","location_id":"unbound-map-1-53","method":"Rock Smash","time":"","rate":"90%","level":"25–35","level_min":25,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-71f7bcbed0fb7977","pokemon":"Graveler","location_id":"unbound-map-1-53","method":"Rock Smash","time":"","rate":"9%","level":"30–35","level_min":30,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5ec3f7f3732735c","pokemon":"Shuckle","location_id":"unbound-map-1-53","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6b2b57355b92388f","pokemon":"Woobat","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-aed4095f758b5456","pokemon":"Slugma","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5a37a6a1b4d08dc","pokemon":"Salandit","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5f5d86664469a063","pokemon":"Camerupt","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f37067f875bdd68","pokemon":"Graveler","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b0fd4b4e08d6fc70","pokemon":"Excadrill","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2cd5601ae9604a37","pokemon":"Heatmor","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-be114c60ca58697f","pokemon":"Magmar","location_id":"unbound-map-1-54","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-75dbc0a0e3582a4d","pokemon":"Slugma","location_id":"unbound-map-1-54","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-92e1baf9c5d2f0f6","pokemon":"Magcargo","location_id":"unbound-map-1-54","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-966df6365d33ef32","pokemon":"Slugma","location_id":"unbound-map-1-54","method":"Rock Smash","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-10934a0fc88bef1d","pokemon":"Magcargo","location_id":"unbound-map-1-54","method":"Rock Smash","time":"","rate":"35%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d79ec18250858484","pokemon":"Graveler","location_id":"unbound-map-1-54","method":"Rock Smash","time":"","rate":"4%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2601a9311137a089","pokemon":"Shuckle","location_id":"unbound-map-1-54","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e7d06bdf3de7af9d","pokemon":"Giratina (Origin Forme)","location_id":"unbound-map-1-63","method":"Cỏ","time":"Ngày và đêm","rate":"100%","level":"0","level_min":0,"level_max":0,"slot_count":12,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb3f2965e417ef08","pokemon":"Giratina (Origin Forme)","location_id":"unbound-map-1-64","method":"Cỏ","time":"Ngày và đêm","rate":"100%","level":"0","level_min":0,"level_max":0,"slot_count":12,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8e45f3cf3f3678e1","pokemon":"Giratina (Origin Forme)","location_id":"unbound-map-1-65","method":"Cỏ","time":"Ngày và đêm","rate":"100%","level":"0","level_min":0,"level_max":0,"slot_count":12,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-210b8a7542a184c7","pokemon":"Grimer","location_id":"unbound-map-1-68","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-afc4cf565b6bef1c","pokemon":"Raticate","location_id":"unbound-map-1-68","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b28f0d9ba3aee9bb","pokemon":"Golbat","location_id":"unbound-map-1-68","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e2111ef88996b5ad","pokemon":"Koffing","location_id":"unbound-map-1-68","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5093ee7f68efe636","pokemon":"Muk","location_id":"unbound-map-1-68","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–48","level_min":47,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8bf537a3858302ed","pokemon":"Weezing","location_id":"unbound-map-1-68","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–48","level_min":47,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e07dafa8159db98e","pokemon":"Grimer","location_id":"unbound-map-1-69","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-74db6c078db33b3a","pokemon":"Raticate","location_id":"unbound-map-1-69","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-202213f62aec5600","pokemon":"Golbat","location_id":"unbound-map-1-69","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2d5dff0d26a9248d","pokemon":"Koffing","location_id":"unbound-map-1-69","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7fd4b8e9653a9e68","pokemon":"Muk","location_id":"unbound-map-1-69","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–48","level_min":47,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-44105ad6ea7f66e6","pokemon":"Weezing","location_id":"unbound-map-1-69","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–48","level_min":47,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e57e2e628550f47c","pokemon":"Grimer","location_id":"unbound-map-1-69","method":"Surf","time":"","rate":"90%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-89b00a627200abaa","pokemon":"Golbat","location_id":"unbound-map-1-69","method":"Surf","time":"","rate":"5%","level":"48","level_min":48,"level_max":48,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8a8fac558503ab25","pokemon":"Muk","location_id":"unbound-map-1-69","method":"Surf","time":"","rate":"5%","level":"48","level_min":48,"level_max":48,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a46c99c2df123ec8","pokemon":"Grimer","location_id":"unbound-map-1-69","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2bd0af5424ecf318","pokemon":"Grimer","location_id":"unbound-map-1-69","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3f5f22caa0e3c3f7","pokemon":"Muk","location_id":"unbound-map-1-69","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f89baa7d071e958d","pokemon":"Grimer","location_id":"unbound-map-1-72","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ebae68bdaba6efa","pokemon":"Raticate","location_id":"unbound-map-1-72","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-702730dacb496f7d","pokemon":"Golbat","location_id":"unbound-map-1-72","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-57ee8f2fc47cff5f","pokemon":"Koffing","location_id":"unbound-map-1-72","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"45–48","level_min":45,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4aa74e0a662f3370","pokemon":"Muk","location_id":"unbound-map-1-72","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–48","level_min":47,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d4d2c947e07580fe","pokemon":"Weezing","location_id":"unbound-map-1-72","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–48","level_min":47,"level_max":48,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-53fc987fbc6ba712","pokemon":"Snover","location_id":"unbound-map-1-81","method":"Cỏ","time":"Ban ngày","rate":"55%","level":"23–26","level_min":23,"level_max":26,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-48f6cf00d1bef6b0","pokemon":"Cubchoo","location_id":"unbound-map-1-81","method":"Cỏ","time":"Ban ngày","rate":"45%","level":"23–26","level_min":23,"level_max":26,"slot_count":8,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-087559efa1e9fb92","pokemon":"Snover","location_id":"unbound-map-1-81","method":"Cỏ","time":"Ban đêm","rate":"45%","level":"23–26","level_min":23,"level_max":26,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-72a2f277e7dc090c","pokemon":"Sneasel","location_id":"unbound-map-1-81","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"23–26","level_min":23,"level_max":26,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3280357da95298cc","pokemon":"Cubchoo","location_id":"unbound-map-1-81","method":"Cỏ","time":"Ban đêm","rate":"40%","level":"23–26","level_min":23,"level_max":26,"slot_count":7,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fec603e5f9f3b919","pokemon":"Unown","location_id":"unbound-map-1-83","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-86bf6a696c744a2c","pokemon":"Sigilyph","location_id":"unbound-map-1-83","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-091677b39bbdaf22","pokemon":"Unown","location_id":"unbound-map-1-84","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9d4f1c84d59ca69e","pokemon":"Sigilyph","location_id":"unbound-map-1-84","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b7d0dbdbf6933666","pokemon":"Graveler","location_id":"unbound-map-1-84","method":"Rock Smash","time":"","rate":"95%","level":"60–65","level_min":60,"level_max":65,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f7acdeeeca23dc2e","pokemon":"Shuckle","location_id":"unbound-map-1-84","method":"Rock Smash","time":"","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5431bbdbe09e69ad","pokemon":"Unown","location_id":"unbound-map-1-85","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fd9573ef2eb85a0a","pokemon":"Sigilyph","location_id":"unbound-map-1-85","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5ece5f8f537ec7ad","pokemon":"Unown","location_id":"unbound-map-1-86","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f9104f600c7066c2","pokemon":"Sigilyph","location_id":"unbound-map-1-86","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b50df3f5320ab3d8","pokemon":"Unown","location_id":"unbound-map-1-87","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-78e965ed6cea22c7","pokemon":"Sigilyph","location_id":"unbound-map-1-87","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-10bc88714dd0a9db","pokemon":"Unown","location_id":"unbound-map-1-88","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-75b04fa0d2f4bf7c","pokemon":"Sigilyph","location_id":"unbound-map-1-88","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0052edb1c4a6eaf5","pokemon":"Unown","location_id":"unbound-map-1-89","method":"Cỏ","time":"Ngày và đêm","rate":"99%","level":"5–65","level_min":5,"level_max":65,"slot_count":11,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-53ddc9cf4837c0e9","pokemon":"Sigilyph","location_id":"unbound-map-1-89","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-afa8e074e829715b","pokemon":"Unown","location_id":"unbound-map-1-90","method":"Cỏ","time":"Ngày và đêm","rate":"100%","level":"5–65","level_min":5,"level_max":65,"slot_count":12,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-521a6222cc6ecd8f","pokemon":"Ledian","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3349e5b52e3e5d45","pokemon":"Vigoroth","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6f6c1611caf1018b","pokemon":"Ursaring","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f89dd278e866e16","pokemon":"Heracross","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6bf73cecf6def422","pokemon":"Komala","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"13%","level":"60–65","level_min":60,"level_max":65,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4e594c4d42952f8b","pokemon":"Passimian","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-add7144e80246494","pokemon":"Oranguru","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a227913d627a2451","pokemon":"Ariados","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"30%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7631001f12aea914","pokemon":"Vigoroth","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"30%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-edf2f8cd55a91fdf","pokemon":"Ursaring","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cc74bbdcb38aecae","pokemon":"Heracross","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cadf29275394436a","pokemon":"Komala","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"13%","level":"60–65","level_min":60,"level_max":65,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7ffe3a170b52fe66","pokemon":"Passimian","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-80ae3b411249777d","pokemon":"Oranguru","location_id":"unbound-map-1-98","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aa3b8ffb75578214","pokemon":"Masquerain","location_id":"unbound-map-1-98","method":"Surf","time":"","rate":"65%","level":"55–65","level_min":55,"level_max":65,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-642e3386c9e13dfb","pokemon":"Golduck","location_id":"unbound-map-1-98","method":"Surf","time":"","rate":"35%","level":"55–65","level_min":55,"level_max":65,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-28a3b33eb36549f9","pokemon":"Pineco","location_id":"unbound-map-1-98","method":"Rock Smash","time":"","rate":"60%","level":"10–30","level_min":10,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b6d91a3bcccc65a1","pokemon":"Aipom","location_id":"unbound-map-1-98","method":"Rock Smash","time":"","rate":"30%","level":"10–30","level_min":10,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1e578fcdacd30049","pokemon":"Heracross","location_id":"unbound-map-1-98","method":"Rock Smash","time":"","rate":"5%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7c0898d95cfaf234","pokemon":"Scyther","location_id":"unbound-map-1-98","method":"Rock Smash","time":"","rate":"4%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7d82d275eb0f9ac0","pokemon":"Pinsir","location_id":"unbound-map-1-98","method":"Rock Smash","time":"","rate":"1%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d71f300b4626760c","pokemon":"Magikarp","location_id":"unbound-map-1-98","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ca4956be4bb92ecb","pokemon":"Psyduck","location_id":"unbound-map-1-98","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5c84bb449403d1ec","pokemon":"Barboach","location_id":"unbound-map-1-98","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-14bc6865a0e04a24","pokemon":"Golduck","location_id":"unbound-map-1-98","method":"Câu cá - Super Rod","time":"","rate":"80%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8ca183e6fcf563f9","pokemon":"Whiscash","location_id":"unbound-map-1-98","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e056930c84dab899","pokemon":"Caterpie","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1ce454154b9ea2d3","pokemon":"Wurmple","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8bf5928a44ad7821","pokemon":"Scatterbug","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5802acb633f77abd","pokemon":"Cottonee","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"38–41","level_min":38,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f0e51e5ca029145c","pokemon":"Swadloon","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-db36bbcc5fc52f75","pokemon":"Petilil","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"38–41","level_min":38,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a09e00fda03995ae","pokemon":"Spewpa","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1ad49251e05f8812","pokemon":"Metapod","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-432ddf1ecc8cd6b6","pokemon":"Silcoon","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-131680ea3982a525","pokemon":"Cascoon","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8473b8a5b46e6556","pokemon":"Weedle","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dc7ac79427fc1f59","pokemon":"Wurmple","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3cf3de012cf063bb","pokemon":"Scatterbug","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c7327ac6e09dc9c2","pokemon":"Cottonee","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"38–41","level_min":38,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-613178055e7609c8","pokemon":"Swadloon","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-098a22cf59a33884","pokemon":"Petilil","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"38–41","level_min":38,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-132974b8f38499e6","pokemon":"Spewpa","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-51347d80c0e5a795","pokemon":"Kakuna","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f90d01a9ecad79ef","pokemon":"Silcoon","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-019f6aef95edc2ce","pokemon":"Cascoon","location_id":"unbound-map-1-99","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b7ed3f80ff1896b8","pokemon":"Surskit","location_id":"unbound-map-1-99","method":"Surf","time":"","rate":"60%","level":"36–41","level_min":36,"level_max":41,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ea5b286b400e6c1","pokemon":"Golduck","location_id":"unbound-map-1-99","method":"Surf","time":"","rate":"30%","level":"36–41","level_min":36,"level_max":41,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fddffa015acb880e","pokemon":"Masquerain","location_id":"unbound-map-1-99","method":"Surf","time":"","rate":"5%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-102b89dc05c2626a","pokemon":"Psyduck","location_id":"unbound-map-1-99","method":"Surf","time":"","rate":"5%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ada486049868975","pokemon":"Magikarp","location_id":"unbound-map-1-99","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9c83a0885325a00c","pokemon":"Psyduck","location_id":"unbound-map-1-99","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e4cd375580e74583","pokemon":"Barboach","location_id":"unbound-map-1-99","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ee68dc899818cb4","pokemon":"Golduck","location_id":"unbound-map-1-99","method":"Câu cá - Super Rod","time":"","rate":"80%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f074310e7c1805c9","pokemon":"Whiscash","location_id":"unbound-map-1-99","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2ddc23de9562ab1e","pokemon":"Tentacool","location_id":"unbound-map-1-102","method":"Surf","time":"","rate":"60%","level":"39–44","level_min":39,"level_max":44,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bf5d849cdf8462b0","pokemon":"Basculin (Red)","location_id":"unbound-map-1-102","method":"Surf","time":"","rate":"30%","level":"39–44","level_min":39,"level_max":44,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-24279e4f16bfe15d","pokemon":"Tentacruel","location_id":"unbound-map-1-102","method":"Surf","time":"","rate":"5%","level":"42–44","level_min":42,"level_max":44,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-067b9e0601656ad4","pokemon":"Seadra","location_id":"unbound-map-1-102","method":"Surf","time":"","rate":"5%","level":"41–44","level_min":41,"level_max":44,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-259a742b9dd04c1b","pokemon":"Magikarp","location_id":"unbound-map-1-102","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-731f4d71d3b29d25","pokemon":"Horsea","location_id":"unbound-map-1-102","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6226209536d98385","pokemon":"Shellder","location_id":"unbound-map-1-102","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a7b7fc05b707baa3","pokemon":"Seadra","location_id":"unbound-map-1-102","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fff0a2e371a585b5","pokemon":"Shellder","location_id":"unbound-map-1-102","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2ec91a477208403a","pokemon":"Gyarados","location_id":"unbound-map-1-102","method":"Câu cá - Super Rod","time":"","rate":"15%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9ac1debd391aa17a","pokemon":"Dhelmise","location_id":"unbound-map-1-102","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8aab54391c987294","pokemon":"Claydol","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4810650d2e3e5c37","pokemon":"Cofagrigus","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"31%","level":"60–65","level_min":60,"level_max":65,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aed62dd3032bebd3","pokemon":"Dusclops","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6deba6ea9be5072f","pokemon":"Sableye","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-912a4c5db17c1a62","pokemon":"Bronzong","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ec950cc7ae092bc","pokemon":"Lunatone","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ff733baf13abe9c0","pokemon":"Solrock","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-136bd05e31eff6b6","pokemon":"Sigilyph","location_id":"unbound-map-1-107","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9b77839c124fb9bc","pokemon":"Claydol","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-b3ae2c777e5eebc5","pokemon":"Cofagrigus","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"31%","level":"60–65","level_min":60,"level_max":65,"slot_count":3,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-0eb01b77360492e5","pokemon":"Dusclops","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad79cf8d274eafd7","pokemon":"Sableye","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-f4318c712096828a","pokemon":"Bronzong","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad8e9a12d4c95daa","pokemon":"Lunatone","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-71fd3edad263bcc7","pokemon":"Solrock","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-cea7ce9b84e8f11c","pokemon":"Sigilyph","location_id":"unbound-map-1-108","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-1605f160f1673a8b","pokemon":"Tentacool","location_id":"unbound-map-1-109","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-453bf0e4cc59b677","pokemon":"Pelipper","location_id":"unbound-map-1-109","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f92f74409890ac8e","pokemon":"Tentacruel","location_id":"unbound-map-1-109","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6275171549e39632","pokemon":"Mantine","location_id":"unbound-map-1-109","method":"Surf","time":"","rate":"4%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-55c1709696c2d000","pokemon":"Golduck","location_id":"unbound-map-1-109","method":"Surf","time":"","rate":"1%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ec1c06882f507bb6","pokemon":"Magikarp","location_id":"unbound-map-1-109","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fbe27250ab6779c5","pokemon":"Horsea","location_id":"unbound-map-1-109","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bc192a7ffc161c56","pokemon":"Shellder","location_id":"unbound-map-1-109","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d4314df87aed7c7a","pokemon":"Seadra","location_id":"unbound-map-1-109","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-44aa0af6550b5cbc","pokemon":"Shellder","location_id":"unbound-map-1-109","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d277c0c95294c140","pokemon":"Gyarados","location_id":"unbound-map-1-109","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a40a4095063c9dfe","pokemon":"Kingdra","location_id":"unbound-map-1-109","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a9c781f43b3beac8","pokemon":"Baltoy","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5e47f5def72eb28f","pokemon":"Yamask","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7560e3a5dbd66654","pokemon":"Duskull","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ecf1b227e7abf4af","pokemon":"Sableye","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-577f09b0056f44f3","pokemon":"Bronzong","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e0306112391b8eec","pokemon":"Dusclops","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-83615ad5be65abda","pokemon":"Lunatone","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-365b4c4646208715","pokemon":"Solrock","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b9a0e27ba2ce888e","pokemon":"Sigilyph","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4df08e5f8308c825","pokemon":"Cofagrigus","location_id":"unbound-map-1-110","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4c30fb97999ce738","pokemon":"Baltoy","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-cee7f7a25b8c8eb5","pokemon":"Yamask","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-750bb99b0b616786","pokemon":"Duskull","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-55bc0c56dae32bf4","pokemon":"Sableye","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-733759b32fdcb401","pokemon":"Bronzong","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c5ce986a121d1d20","pokemon":"Dusclops","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5431f0b5943bff0a","pokemon":"Lunatone","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c094e2e704a2c4ef","pokemon":"Solrock","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-45e966961beef7b3","pokemon":"Sigilyph","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ac5ba73f3a04c779","pokemon":"Cofagrigus","location_id":"unbound-map-1-111","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-fd134d2733733b5e","pokemon":"Geodude","location_id":"unbound-map-1-111","method":"Rock Smash","time":"","rate":"90%","level":"25–35","level_min":25,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-92928d8f3e722a06","pokemon":"Baltoy","location_id":"unbound-map-1-111","method":"Rock Smash","time":"","rate":"10%","level":"25–35","level_min":25,"level_max":35,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-09dfb4a8e0b23f44","pokemon":"Baltoy","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-cd7a51ff3c23c023","pokemon":"Yamask","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-dbe54a5577b094d2","pokemon":"Duskull","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-623077d8dab506f6","pokemon":"Sableye","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-29f682b09a536e13","pokemon":"Bronzong","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-35f17069274095e0","pokemon":"Dusclops","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6114df1bb9550097","pokemon":"Lunatone","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-04cc291a534ecd81","pokemon":"Solrock","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-dca160d8ceaeea2d","pokemon":"Sigilyph","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-fba5e8cd4f3e69cf","pokemon":"Cofagrigus","location_id":"unbound-map-1-112","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-2778b08ba9508e87","pokemon":"Baltoy","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0324045d69fdd38b","pokemon":"Yamask","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-1b76c9dcebb3cbe0","pokemon":"Duskull","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-26e2676e2c75c365","pokemon":"Sableye","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-30d18bd86e01d3e3","pokemon":"Bronzong","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c8cf7e70c6c31aa6","pokemon":"Dusclops","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4db685472462f72c","pokemon":"Lunatone","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-87cbc3f04aca1379","pokemon":"Solrock","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-eee823eefc46a0b5","pokemon":"Sigilyph","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-99a03d4a2674f57f","pokemon":"Cofagrigus","location_id":"unbound-map-1-113","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7fa95f9bbd030f08","pokemon":"Geodude","location_id":"unbound-map-1-113","method":"Rock Smash","time":"","rate":"90%","level":"25–35","level_min":25,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c8eb15b1f33804cb","pokemon":"Baltoy","location_id":"unbound-map-1-113","method":"Rock Smash","time":"","rate":"10%","level":"25–35","level_min":25,"level_max":35,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4379112bdd739f07","pokemon":"Baltoy","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7086d12a664151b6","pokemon":"Yamask","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e7ffeaf3f67cbda1","pokemon":"Duskull","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cc23ebfbfc6ad776","pokemon":"Sableye","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-07ce0c0f2d7aef6e","pokemon":"Bronzong","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3a5e1f5e7818eb77","pokemon":"Dusclops","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ac7ed33dcfbc052","pokemon":"Lunatone","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ace30507ad4d7e10","pokemon":"Solrock","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-eae1164cc4761b53","pokemon":"Sigilyph","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-412048dc9cebba52","pokemon":"Cofagrigus","location_id":"unbound-map-1-114","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e9eb614d56abb5ab","pokemon":"Geodude","location_id":"unbound-map-1-114","method":"Rock Smash","time":"","rate":"90%","level":"25–35","level_min":25,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-577ae7f428556e07","pokemon":"Baltoy","location_id":"unbound-map-1-114","method":"Rock Smash","time":"","rate":"10%","level":"25–35","level_min":25,"level_max":35,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7e4947f1ba580a97","pokemon":"Baltoy","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5b809315ece9106d","pokemon":"Yamask","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-dee7f63da1e9eae4","pokemon":"Duskull","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"34–37","level_min":34,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-073e3729457a87b1","pokemon":"Sableye","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ec91af8cfe86adb3","pokemon":"Bronzong","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5f03473bcc6a38b7","pokemon":"Dusclops","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-14bb68557ff4608a","pokemon":"Lunatone","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-410d7976791eb7fa","pokemon":"Solrock","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-927fef50f858fd93","pokemon":"Sigilyph","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3f36525bee42aef5","pokemon":"Cofagrigus","location_id":"unbound-map-1-115","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"37","level_min":37,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-859fdfaf4281c6f9","pokemon":"Baltoy","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5fd8376828ecc33c","pokemon":"Yamask","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5beda17463d14dc3","pokemon":"Duskull","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e231eff458be7712","pokemon":"Sableye","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-2d2e6a50c9215edf","pokemon":"Bronzong","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c0a08010caed21dd","pokemon":"Dusclops","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-283fcc8f2f2d3ff5","pokemon":"Lunatone","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9b84b0ad3ba54c3c","pokemon":"Solrock","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-140f5af2d8eb9665","pokemon":"Sigilyph","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-99794456c1320172","pokemon":"Cofagrigus","location_id":"unbound-map-1-116","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-466eae3661468925","pokemon":"Baltoy","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7cb3e1f425c1434d","pokemon":"Yamask","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-034ed4adf7e0850f","pokemon":"Duskull","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7f74274ed3ab3d61","pokemon":"Sableye","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6d44748f67743feb","pokemon":"Bronzong","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-adb0c9d03e9f15d4","pokemon":"Dusclops","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9a62061663bbe475","pokemon":"Lunatone","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-32df5d433c3d6a37","pokemon":"Solrock","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-16276d7e1fe0e9e2","pokemon":"Sigilyph","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-2fc1aa951412d06a","pokemon":"Cofagrigus","location_id":"unbound-map-1-117","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"38","level_min":38,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3a4f7b762b0eefe9","pokemon":"Marill","location_id":"unbound-map-1-119","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad91e6812fae8627","pokemon":"Surskit","location_id":"unbound-map-1-119","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c61e98a4c0545dac","pokemon":"Masquerain","location_id":"unbound-map-1-119","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5f63aa069173a083","pokemon":"Azumarill","location_id":"unbound-map-1-119","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-52d8ab7e1c686640","pokemon":"Magikarp","location_id":"unbound-map-1-119","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-523738064b4e03e7","pokemon":"Wishiwashi","location_id":"unbound-map-1-119","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-92f168dc073fdad9","pokemon":"Goldeen","location_id":"unbound-map-1-119","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-48db7a743e7e62a9","pokemon":"Wishiwashi","location_id":"unbound-map-1-119","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3011292a7d41238d","pokemon":"Seaking","location_id":"unbound-map-1-119","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-05b624e961836d18","pokemon":"Gyarados","location_id":"unbound-map-1-119","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-43c6ccd12306576f","pokemon":"Bruxish","location_id":"unbound-map-1-119","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-56e019f6e0d57b24","pokemon":"Spearow","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d075b53e4ae9d4c7","pokemon":"Grubbin","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-44b1f49add1a12e5","pokemon":"Marill","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9e8083e763b71649","pokemon":"Deerling (Autumn)","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-369b54dbfed20de7","pokemon":"Shroomish","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a94d8fc1c5539a2c","pokemon":"Skorupi","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"6%","level":"29–30","level_min":29,"level_max":30,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3ad1ef12790321ad","pokemon":"Audino","location_id":"unbound-map-1-120","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9c731fb4f667f3b0","pokemon":"Marill","location_id":"unbound-map-1-120","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1321b62ee36f04e0","pokemon":"Surskit","location_id":"unbound-map-1-120","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9ffafa774feb4167","pokemon":"Masquerain","location_id":"unbound-map-1-120","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ce21401eb7c95ef1","pokemon":"Azumarill","location_id":"unbound-map-1-120","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aee5012851534691","pokemon":"Magikarp","location_id":"unbound-map-1-120","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e4eb11147d6483e9","pokemon":"Wishiwashi","location_id":"unbound-map-1-120","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-227a4c1580f9ce05","pokemon":"Goldeen","location_id":"unbound-map-1-120","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dbe5d12e57a4faed","pokemon":"Wishiwashi","location_id":"unbound-map-1-120","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c433b434295b9260","pokemon":"Seaking","location_id":"unbound-map-1-120","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2b1b67421c5a46e4","pokemon":"Gyarados","location_id":"unbound-map-1-120","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-65abe82c262116fb","pokemon":"Bruxish","location_id":"unbound-map-1-120","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d710f817f0659cd1","pokemon":"Graveler","location_id":"unbound-map-1-121","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3df9452b21248669","pokemon":"Woobat","location_id":"unbound-map-1-121","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"37–40","level_min":37,"level_max":40,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-67f9d8cdbed6395b","pokemon":"Lairon","location_id":"unbound-map-1-121","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-11ea6d8f2fce3286","pokemon":"Diglett","location_id":"unbound-map-1-121","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7a593ea757252719","pokemon":"Dugtrio","location_id":"unbound-map-1-121","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c53ae0d87f133460","pokemon":"Geodude","location_id":"unbound-map-1-121","method":"Rock Smash","time":"","rate":"90%","level":"25–35","level_min":25,"level_max":35,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a7021fe10891586","pokemon":"Graveler","location_id":"unbound-map-1-121","method":"Rock Smash","time":"","rate":"10%","level":"30–35","level_min":30,"level_max":35,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aeba926c2ac9ebfc","pokemon":"Golbat","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-19a5ed0cdc3497e5","pokemon":"Hariyama","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-01b4271cd6706693","pokemon":"Sealeo","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"47–50","level_min":47,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-87fa9b3f447ac69b","pokemon":"Jynx","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ae0bd0a02a3a80e","pokemon":"Avalugg","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1e18093aca446dfa","pokemon":"Boldore","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c9009c95f966fa80","pokemon":"Piloswine","location_id":"unbound-map-2-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ca7ae6b6243c7871","pokemon":"Dewgong","location_id":"unbound-map-2-0","method":"Surf","time":"","rate":"65%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d269e97f62abcfba","pokemon":"Sealeo","location_id":"unbound-map-2-0","method":"Surf","time":"","rate":"34%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a3c7b14a87db8675","pokemon":"Lapras","location_id":"unbound-map-2-0","method":"Surf","time":"","rate":"1%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3c7057587753ce80","pokemon":"Magikarp","location_id":"unbound-map-2-0","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9caa9d413756736c","pokemon":"Seel","location_id":"unbound-map-2-0","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0e208eb7b5fa116a","pokemon":"Shellder","location_id":"unbound-map-2-0","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-79f1ff76eaae2624","pokemon":"Dewgong","location_id":"unbound-map-2-0","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2b4a74404239fd60","pokemon":"Shellder","location_id":"unbound-map-2-0","method":"Câu cá - Super Rod","time":"","rate":"59%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-82d00a2252d3ee19","pokemon":"Cloyster","location_id":"unbound-map-2-0","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb349170af68d963","pokemon":"Golbat","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-122019db69095890","pokemon":"Hariyama","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4d38e3f72c0dc6e5","pokemon":"Sealeo","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"47–50","level_min":47,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e05d71ca49fb3c59","pokemon":"Jynx","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c1058ee96d1d2a9d","pokemon":"Avalugg","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fc0de2af86ef4e65","pokemon":"Boldore","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4c3d59f78a4e2b13","pokemon":"Piloswine","location_id":"unbound-map-2-14","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6f15215e9edbd257","pokemon":"Tentacool","location_id":"unbound-map-2-26","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-67beb530b8908a24","pokemon":"Pelipper","location_id":"unbound-map-2-26","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5fd813ed4c44d0a5","pokemon":"Tentacruel","location_id":"unbound-map-2-26","method":"Surf","time":"","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-959342fc8f836103","pokemon":"Mantyke","location_id":"unbound-map-2-26","method":"Surf","time":"","rate":"5%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-eb898c4e9c08e5b3","pokemon":"Magikarp","location_id":"unbound-map-2-26","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-36530f480f2d5f87","pokemon":"Remoraid","location_id":"unbound-map-2-26","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-bc3fb2c359832eb5","pokemon":"Corsola","location_id":"unbound-map-2-26","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ce32910f7921d82b","pokemon":"Horsea","location_id":"unbound-map-2-26","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-92e2bf49fb5046d3","pokemon":"Octillery","location_id":"unbound-map-2-26","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5cf8f09eada33e7e","pokemon":"Seadra","location_id":"unbound-map-2-26","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-2efd2d35242d04ff","pokemon":"Corsola","location_id":"unbound-map-2-26","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ada094c755a2f63b","pokemon":"Lapras","location_id":"unbound-map-2-26","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-60f83966747a1942","pokemon":"Tentacool","location_id":"unbound-map-2-27","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3333c907a808243a","pokemon":"Pelipper","location_id":"unbound-map-2-27","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-190984229e695913","pokemon":"Tentacruel","location_id":"unbound-map-2-27","method":"Surf","time":"","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9b1e879ab6bb23da","pokemon":"Basculin (Red)","location_id":"unbound-map-2-27","method":"Surf","time":"","rate":"5%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e5bb114da7190df3","pokemon":"Magikarp","location_id":"unbound-map-2-27","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8faf2e309780f1e3","pokemon":"Corphish","location_id":"unbound-map-2-27","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4e5e9d87f50d3428","pokemon":"Staryu","location_id":"unbound-map-2-27","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-88cf8ae6d1d11585","pokemon":"Crawdaunt","location_id":"unbound-map-2-27","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-94e116c7149c720c","pokemon":"Staryu","location_id":"unbound-map-2-27","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-18f1a8e69ca76323","pokemon":"Gyarados","location_id":"unbound-map-2-27","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6b051345815e0af7","pokemon":"Starmie","location_id":"unbound-map-2-27","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0f9aac9eb00d83be","pokemon":"Graveler","location_id":"unbound-map-2-59","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-1cf921860513f490","pokemon":"Woobat","location_id":"unbound-map-2-59","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"37–40","level_min":37,"level_max":40,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e81a0552873c9e15","pokemon":"Diglett","location_id":"unbound-map-2-59","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"37–40","level_min":37,"level_max":40,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a38c18769e4a543d","pokemon":"Dugtrio","location_id":"unbound-map-2-59","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-bb1f9d0adbc0896f","pokemon":"Palpitoad","location_id":"unbound-map-3-0","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-52a3ea459e67d3d2","pokemon":"Stunfisk","location_id":"unbound-map-3-0","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-17216473856e6d15","pokemon":"Gastrodon East","location_id":"unbound-map-3-0","method":"Surf","time":"","rate":"5%","level":"49–50","level_min":49,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-22e6e9d799ab3bfd","pokemon":"Sliggoo","location_id":"unbound-map-3-0","method":"Surf","time":"","rate":"5%","level":"49–50","level_min":49,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-df0c333dc834c9ac","pokemon":"Magikarp","location_id":"unbound-map-3-0","method":"Câu cá - Old Rod","time":"","rate":"70%","level":"10–15","level_min":10,"level_max":15,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee8210b19687f691","pokemon":"Poliwag","location_id":"unbound-map-3-0","method":"Câu cá - Old Rod","time":"","rate":"30%","level":"10–15","level_min":10,"level_max":15,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ccd902b3d538472c","pokemon":"Barboach","location_id":"unbound-map-3-0","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-40e756dbb1b04813","pokemon":"Poliwhirl","location_id":"unbound-map-3-0","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-75cc07e898a3498d","pokemon":"Poliwhirl","location_id":"unbound-map-3-0","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-23ca1d651c527046","pokemon":"Whiscash","location_id":"unbound-map-3-0","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e525c5bed237cffb","pokemon":"Politoed","location_id":"unbound-map-3-0","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-09758bf269032f76","pokemon":"Croagunk","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"48–52","level_min":48,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aeb19645b10bc189","pokemon":"Quagsire","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"49–52","level_min":49,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-260f7aa5e13e3568","pokemon":"Sliggoo","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"50–52","level_min":50,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-adb17269caa93429","pokemon":"Drapion","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"51–52","level_min":51,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ec52b491f3403f48","pokemon":"Carnivine","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"49–52","level_min":49,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f9de3be876ef12b3","pokemon":"Weepinbell","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"49–52","level_min":49,"level_max":52,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-04d3a321631d479f","pokemon":"Toxicroak","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"52","level_min":52,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cb8b4ba629834292","pokemon":"Croagunk","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"30%","level":"48–52","level_min":48,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f60ddb141d0185f","pokemon":"Quagsire","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"49–52","level_min":49,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-89485353564d02e1","pokemon":"Sliggoo","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"50–52","level_min":50,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-afbe2bb2f4d8867a","pokemon":"Drapion","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"51–52","level_min":51,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-226cf893b80646b4","pokemon":"Carnivine","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"49–52","level_min":49,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2ec9d30c387d7335","pokemon":"Gloom","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"49–52","level_min":49,"level_max":52,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-42070335f2f920ae","pokemon":"Toxicroak","location_id":"unbound-map-3-1","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"52","level_min":52,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a5aaa5440ce7ee9f","pokemon":"Quagsire","location_id":"unbound-map-3-1","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4708cd12b0d9427b","pokemon":"Stunfisk","location_id":"unbound-map-3-1","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a326e03bab89c55c","pokemon":"Gastrodon East","location_id":"unbound-map-3-1","method":"Surf","time":"","rate":"5%","level":"49–50","level_min":49,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-65a9f36917e68ae3","pokemon":"Sliggoo","location_id":"unbound-map-3-1","method":"Surf","time":"","rate":"5%","level":"49–50","level_min":49,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fe644d2f3d71598f","pokemon":"Magikarp","location_id":"unbound-map-3-1","method":"Câu cá - Old Rod","time":"","rate":"70%","level":"10–15","level_min":10,"level_max":15,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4b5a1a27c910e2e9","pokemon":"Poliwag","location_id":"unbound-map-3-1","method":"Câu cá - Old Rod","time":"","rate":"30%","level":"10–15","level_min":10,"level_max":15,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8da739a4384f5685","pokemon":"Barboach","location_id":"unbound-map-3-1","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e09076449bf2bff0","pokemon":"Poliwhirl","location_id":"unbound-map-3-1","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-77314a53af4cfaf5","pokemon":"Poliwhirl","location_id":"unbound-map-3-1","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b677ffebcdf139fb","pokemon":"Whiscash","location_id":"unbound-map-3-1","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b2a252fa3595bdd9","pokemon":"Politoed","location_id":"unbound-map-3-1","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-80e1df98493bf2b0","pokemon":"Tranquill","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-83b8a909b40db4d9","pokemon":"Furfrou","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban ngày","rate":"25%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-3d5389766a8d8f3e","pokemon":"Mudsdale","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-7fc849450262c70d","pokemon":"Gogoat","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-bcd32edbf41df90b","pokemon":"Miltank","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban ngày","rate":"9%","level":"50–53","level_min":50,"level_max":53,"slot_count":3,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-eb92eb9c47a108d8","pokemon":"Tauros","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"50–53","level_min":50,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-da44d6970610c1fa","pokemon":"Noctowl","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-5a450d6a3d686ea3","pokemon":"Furfrou","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"25%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-56788cb3fa6a363a","pokemon":"Tranquill","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-7fec1f0c98ef80ec","pokemon":"Mudsdale","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-d09483bebe652a5d","pokemon":"Gogoat","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-0a0b6a54f4b3555b","pokemon":"Miltank","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"9%","level":"50–53","level_min":50,"level_max":53,"slot_count":3,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-82888f685ca8aace","pokemon":"Tauros","location_id":"unbound-map-3-4","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"50–53","level_min":50,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-6bad9581fbc45cfb","pokemon":"Frillish","location_id":"unbound-map-3-4","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-84f5c2ae7465104c","pokemon":"Pelipper","location_id":"unbound-map-3-4","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-47d93d9a1b8a453a","pokemon":"Jellicent","location_id":"unbound-map-3-4","method":"Surf","time":"","rate":"10%","level":"49–50","level_min":49,"level_max":50,"slot_count":3,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-fd78bd4744276efd","pokemon":"Magikarp","location_id":"unbound-map-3-4","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-b9e2c93eea42fc14","pokemon":"Gyarados","location_id":"unbound-map-3-4","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-072cd069d43de42f","pokemon":"Wailmer","location_id":"unbound-map-3-4","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-8cb361396bac85bd","pokemon":"Gyarados","location_id":"unbound-map-3-4","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-c8a63eed9c9d7405","pokemon":"Wailord","location_id":"unbound-map-3-4","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-914e3fee0ff02e63","pokemon":"Qwilfish","location_id":"unbound-map-3-4","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-121959ac4e8f6bc1","pokemon":"Pineco","location_id":"unbound-map-3-5","method":"Rock Smash","time":"","rate":"60%","level":"10–30","level_min":10,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8b80fe069d5a9d27","pokemon":"Aipom","location_id":"unbound-map-3-5","method":"Rock Smash","time":"","rate":"30%","level":"10–30","level_min":10,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9d856067ffcd0cc0","pokemon":"Heracross","location_id":"unbound-map-3-5","method":"Rock Smash","time":"","rate":"5%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fd7c15df1de3082b","pokemon":"Scyther","location_id":"unbound-map-3-5","method":"Rock Smash","time":"","rate":"4%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8463b43a75fe85e0","pokemon":"Pinsir","location_id":"unbound-map-3-5","method":"Rock Smash","time":"","rate":"1%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad328b33791bda91","pokemon":"Jellicent","location_id":"unbound-map-3-6","method":"Surf","time":"","rate":"60%","level":"55–65","level_min":55,"level_max":65,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-da7fbcfa2617ddb0","pokemon":"Pelipper","location_id":"unbound-map-3-6","method":"Surf","time":"","rate":"30%","level":"55–65","level_min":55,"level_max":65,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d8c9afc2209e095c","pokemon":"Ditto","location_id":"unbound-map-3-6","method":"Surf","time":"","rate":"10%","level":"55–65","level_min":55,"level_max":65,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1268c53e3aac41eb","pokemon":"Magikarp","location_id":"unbound-map-3-6","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0be6e08d88c8fd24","pokemon":"Gyarados","location_id":"unbound-map-3-6","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-088648dcea18e2a5","pokemon":"Wailmer","location_id":"unbound-map-3-6","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f14d7e4427d1565","pokemon":"Gyarados","location_id":"unbound-map-3-6","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-693ff7cc461b18a2","pokemon":"Wailord","location_id":"unbound-map-3-6","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dadef8f94599aff1","pokemon":"Ditto","location_id":"unbound-map-3-6","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f63c3a9153520920","pokemon":"Snorunt","location_id":"unbound-map-3-67","method":"Cỏ","time":"Ngày và đêm","rate":"45%","level":"7–9","level_min":7,"level_max":9,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-b2bc083e4b476d9e","pokemon":"Vanillite","location_id":"unbound-map-3-67","method":"Cỏ","time":"Ngày và đêm","rate":"49%","level":"7–9","level_min":7,"level_max":9,"slot_count":6,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-200c92932c59ae9d","pokemon":"Delibird","location_id":"unbound-map-3-67","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"8–9","level_min":8,"level_max":9,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-e9df1ed84b9d572e","pokemon":"Minior (Shield)","location_id":"unbound-map-3-67","method":"Cỏ","time":"Ngày và đêm","rate":"2%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-ca8412ee49f9cf2b","pokemon":"Pikipek","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"8–11","level_min":8,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-e8db59009de95ea6","pokemon":"Patrat","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"8–11","level_min":8,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-f8bc03c55c923679","pokemon":"Inkay","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"8–11","level_min":8,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-43524ed4512621d7","pokemon":"Minccino","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"8–11","level_min":8,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-39f12d3be1e4c378","pokemon":"Electrike","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"8–11","level_min":8,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-475064a1215b2f42","pokemon":"Azurill","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"8–11","level_min":8,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-4963f3e0151d71ef","pokemon":"Stufful","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"8–11","level_min":8,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-aa698aaab0c2c373","pokemon":"Scraggy","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"9–11","level_min":9,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3def4ffb11fc85c","pokemon":"Riolu","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"9–11","level_min":9,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-097d14e7ccb4d908","pokemon":"Hoothoot","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-54b7a9b4b5d65576","pokemon":"Rattata","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ff05b7ce7b42621","pokemon":"Inkay","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-52bf4a236985d6a6","pokemon":"Minccino","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-913921da94adb50c","pokemon":"Electrike","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-445881d2099de324","pokemon":"Azurill","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-773e4272ebf698b7","pokemon":"Stufful","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"9–11","level_min":9,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-99e1eaa1ddad9bd8","pokemon":"Scraggy","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"10–11","level_min":10,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-762d78e97d4293ae","pokemon":"Riolu","location_id":"unbound-map-3-69","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"10–11","level_min":10,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-29011784e5e87ff9","pokemon":"Tentacool","location_id":"unbound-map-3-69","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-fae56b8e6d19dedb","pokemon":"Pelipper","location_id":"unbound-map-3-69","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-b9ad2f3333c0b863","pokemon":"Tentacruel","location_id":"unbound-map-3-69","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-d77cca659efc79b2","pokemon":"Basculin (Red)","location_id":"unbound-map-3-69","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-d9420c0795cca93e","pokemon":"Binacle","location_id":"unbound-map-3-69","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-2698fdd6d1cf0b43","pokemon":"Krabby","location_id":"unbound-map-3-69","method":"Rock Smash","time":"","rate":"40%","level":"20–30","level_min":20,"level_max":30,"slot_count":4,"slot_total":5,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-946b8edd131e53a0","pokemon":"Magikarp","location_id":"unbound-map-3-69","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-47a6414f0140ce5a","pokemon":"Staryu","location_id":"unbound-map-3-69","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-908c155058530821","pokemon":"Shellder","location_id":"unbound-map-3-69","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-15583cd99fd1240f","pokemon":"Staryu","location_id":"unbound-map-3-69","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-38bd0ced4f02ed7a","pokemon":"Shellder","location_id":"unbound-map-3-69","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-27e0e0129b55d93e","pokemon":"Gyarados","location_id":"unbound-map-3-69","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-705bb4ecc7e20255","pokemon":"Starmie","location_id":"unbound-map-3-69","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"route2","requires":[],"notes_vi":"","verified":true},{"id":"ub-a7e0ad9719162384","pokemon":"Wingull","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f1e77ba34d261e0d","pokemon":"Bidoof","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f5234aa8af2d4be3","pokemon":"Slowpoke","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-aa2820b6fb2acce9","pokemon":"Shellos","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-622828a8ad256254","pokemon":"Cherubi","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2cdb613d81e30431","pokemon":"Dewpider","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-608349997d37172d","pokemon":"Buizel","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a09d5bb15d2fa281","pokemon":"Poliwag","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"10–12","level_min":10,"level_max":12,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9b08d4621a9522c8","pokemon":"Wingull","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-96136a5bafc315e4","pokemon":"Bidoof","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9392a6cee72e775d","pokemon":"Slowpoke","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"9–12","level_min":9,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4fcf127046ffb9f5","pokemon":"Shellos","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8c2bee5c7e9c016c","pokemon":"Surskit","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"9–12","level_min":9,"level_max":12,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5fcaf4c87abe2f4","pokemon":"Buizel","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"9–12","level_min":9,"level_max":12,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a68747b30f47d177","pokemon":"Poliwag","location_id":"unbound-map-3-70","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"10–12","level_min":10,"level_max":12,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-acf1de14996b81b4","pokemon":"Tentacool","location_id":"unbound-map-3-70","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-605094a6cce04999","pokemon":"Pelipper","location_id":"unbound-map-3-70","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a579a7a5b6365c5","pokemon":"Tentacruel","location_id":"unbound-map-3-70","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cf06b6a83bed32dc","pokemon":"Araquanid","location_id":"unbound-map-3-70","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-98e8d2af49f81bae","pokemon":"Magikarp","location_id":"unbound-map-3-70","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-60817915d45f5ba9","pokemon":"Staryu","location_id":"unbound-map-3-70","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-46ba82672f95aabe","pokemon":"Krabby","location_id":"unbound-map-3-70","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7e235d0bc0f7e073","pokemon":"Shellder","location_id":"unbound-map-3-70","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4c804a853529ab8c","pokemon":"Staryu","location_id":"unbound-map-3-70","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9da7d6fc74f9bcd2","pokemon":"Shellder","location_id":"unbound-map-3-70","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-920486b034cff82c","pokemon":"Kingler","location_id":"unbound-map-3-70","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8cac369324839072","pokemon":"Cloyster","location_id":"unbound-map-3-70","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5bb1f050427f022f","pokemon":"Tentacool","location_id":"unbound-map-3-71","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-857e618187256fd4","pokemon":"Pelipper","location_id":"unbound-map-3-71","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5cc18165a81ddf8a","pokemon":"Tentacruel","location_id":"unbound-map-3-71","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e350dd171cf6d235","pokemon":"Basculin (Red)","location_id":"unbound-map-3-71","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ffa03650284689e7","pokemon":"Magikarp","location_id":"unbound-map-3-71","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e4ba28633bdf5bb8","pokemon":"Staryu","location_id":"unbound-map-3-71","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1adb0aaab43ea82d","pokemon":"Shellder","location_id":"unbound-map-3-71","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d4adae90c42ea75a","pokemon":"Staryu","location_id":"unbound-map-3-71","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-449933615a82460a","pokemon":"Shellder","location_id":"unbound-map-3-71","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9a4a7dc9e642aad5","pokemon":"Gyarados","location_id":"unbound-map-3-71","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-754fdbf217c90be4","pokemon":"Starmie","location_id":"unbound-map-3-71","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f76eea4d8a619860","pokemon":"Starly","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"40%","level":"14–17","level_min":14,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-83b8debd4c498f94","pokemon":"Lillipup","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"14–17","level_min":14,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a523de8c9b34a098","pokemon":"Ekans","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"14–17","level_min":14,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-417079fccfa293c4","pokemon":"Numel","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"14–17","level_min":14,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cc8e465f2ab11df6","pokemon":"Budew","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"14–17","level_min":14,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-97fe7651010f4ed7","pokemon":"Mankey","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"14–17","level_min":14,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-dce72cf0e84bd1c1","pokemon":"Ralts","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"14–17","level_min":14,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b8adcc787a9682bc","pokemon":"Hoothoot","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"40%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-0c27c00fc9df3e01","pokemon":"Lillipup","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d1b9bf77e8df71cb","pokemon":"Ekans","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6cf7fb616a473bb1","pokemon":"Numel","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e22acf7b42a89cd0","pokemon":"Budew","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-30088de1bf50a7a1","pokemon":"Mankey","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-68f1f4608fd2fab8","pokemon":"Ralts","location_id":"unbound-map-3-72","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-98b315f0baa9e59c","pokemon":"Tentacool","location_id":"unbound-map-3-72","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-786bf395d66fa3d4","pokemon":"Pelipper","location_id":"unbound-map-3-72","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c891295f576c52a3","pokemon":"Tentacruel","location_id":"unbound-map-3-72","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-394c1bcd00b0355a","pokemon":"Basculin (Red)","location_id":"unbound-map-3-72","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3f5a0a18253df0af","pokemon":"Magikarp","location_id":"unbound-map-3-72","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-26d3de622811cd32","pokemon":"Corphish","location_id":"unbound-map-3-72","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cb3815a9a526a5d5","pokemon":"Staryu","location_id":"unbound-map-3-72","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9f8d664dadac39b6","pokemon":"Crawdaunt","location_id":"unbound-map-3-72","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-701179ecbcef78b8","pokemon":"Staryu","location_id":"unbound-map-3-72","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5ddbd44baad9e986","pokemon":"Gyarados","location_id":"unbound-map-3-72","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ed2a9c7f6fb702d","pokemon":"Starmie","location_id":"unbound-map-3-72","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b68544aadfab1f99","pokemon":"Purrloin","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"15–18","level_min":15,"level_max":18,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c0acdccffd160f17","pokemon":"Taillow","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"15–18","level_min":15,"level_max":18,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-aecd11d5b2c81c61","pokemon":"Nidoran<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2642.png" alt="♂" class="wp-smiley" style="height: 1em; max-height: 1em;" />","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"15–18","level_min":15,"level_max":18,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f2822bf1fc990a30","pokemon":"Nidoran<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2640.png" alt="♀" class="wp-smiley" style="height: 1em; max-height: 1em;" />","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"15–18","level_min":15,"level_max":18,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b4d42d2c9ffba351","pokemon":"Growlithe","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"16–19","level_min":16,"level_max":19,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a8ca473a7ec81bb5","pokemon":"Lickitung","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"16–19","level_min":16,"level_max":19,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3a4cd11c94b034c","pokemon":"Yanma","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"8%","level":"17–19","level_min":17,"level_max":19,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-067f40fc2c8d36df","pokemon":"Ditto","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban ngày","rate":"2%","level":"17–19","level_min":17,"level_max":19,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-fbfd2b294356c1c2","pokemon":"Purrloin","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"30%","level":"15–18","level_min":15,"level_max":18,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-54fa672f2890c620","pokemon":"Murkrow","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"15–19","level_min":15,"level_max":19,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-329e02863be6f64c","pokemon":"Nidoran<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2642.png" alt="♂" class="wp-smiley" style="height: 1em; max-height: 1em;" />","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"15–18","level_min":15,"level_max":18,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ed9975ea2bdf200c","pokemon":"Nidoran<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2640.png" alt="♀" class="wp-smiley" style="height: 1em; max-height: 1em;" />","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"15–18","level_min":15,"level_max":18,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b8c8c30d363c158e","pokemon":"Houndour","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"16–19","level_min":16,"level_max":19,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-76ed77264f175826","pokemon":"Lickitung","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"16–19","level_min":16,"level_max":19,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-efb322634402f817","pokemon":"Venonat","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"8%","level":"17–19","level_min":17,"level_max":19,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a6aef077931c39c","pokemon":"Ditto","location_id":"unbound-map-3-73","method":"Cỏ","time":"Ban đêm","rate":"2%","level":"19","level_min":19,"level_max":19,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2e8848ce70dfb6ce","pokemon":"Tentacool","location_id":"unbound-map-3-73","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f0b87894f3b11ea","pokemon":"Pelipper","location_id":"unbound-map-3-73","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-43d41ac5fd47759a","pokemon":"Tentacruel","location_id":"unbound-map-3-73","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a698a1d74ac14842","pokemon":"Basculin (Red)","location_id":"unbound-map-3-73","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5feab80ee0852a3","pokemon":"Magikarp","location_id":"unbound-map-3-73","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cf2c9c1c2cfc46b3","pokemon":"Corphish","location_id":"unbound-map-3-73","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-17d5f515ff97fbbf","pokemon":"Staryu","location_id":"unbound-map-3-73","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-58485b3cd9dc08fb","pokemon":"Crawdaunt","location_id":"unbound-map-3-73","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c863bfd58276d4e4","pokemon":"Staryu","location_id":"unbound-map-3-73","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6915c3df2bc05d39","pokemon":"Gyarados","location_id":"unbound-map-3-73","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e2c1f4b32997f582","pokemon":"Starmie","location_id":"unbound-map-3-73","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-0b6bf31f75f5eef3","pokemon":"Bunnelby","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"20–22","level_min":20,"level_max":22,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e3a94ce789152dcd","pokemon":"Ledyba","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"20–22","level_min":20,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ea5a952aed3c141f","pokemon":"Shinx","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"20–22","level_min":20,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-52891cf5167953fe","pokemon":"Deerling","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"14%","level":"20–22","level_min":20,"level_max":22,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d0fec25c068ac625","pokemon":"Sunkern","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"24%","level":"20–22","level_min":20,"level_max":22,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-78150393346e251b","pokemon":"Ledian","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"22","level_min":22,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-032804864d415dc8","pokemon":"Luxio","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"22","level_min":22,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a350aed617ff2513","pokemon":"Bunnelby","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"30%","level":"20–22","level_min":20,"level_max":22,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5a6c9980c6400d0e","pokemon":"Spinarak","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"20–22","level_min":20,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-bb84b30e8e285e86","pokemon":"Shinx","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"20–22","level_min":20,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ceeb746a221e4e49","pokemon":"Deerling","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"14%","level":"20–22","level_min":20,"level_max":22,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f12d18300719b64b","pokemon":"Kricketot","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"24%","level":"20–22","level_min":20,"level_max":22,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3894ea05b1b5d24f","pokemon":"Ariados","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"22","level_min":22,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8b9b43efd600f6ae","pokemon":"Luxio","location_id":"unbound-map-3-75","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"22","level_min":22,"level_max":22,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-621542cdb98dabb6","pokemon":"Tentacool","location_id":"unbound-map-3-75","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-29c1f7c05471fbdf","pokemon":"Pelipper","location_id":"unbound-map-3-75","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f007f82a881d6bda","pokemon":"Tentacruel","location_id":"unbound-map-3-75","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2b13d35624d7609a","pokemon":"Mantyke","location_id":"unbound-map-3-75","method":"Surf","time":"","rate":"5%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f9aaababea0eaacd","pokemon":"Magikarp","location_id":"unbound-map-3-75","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b26f24abc1fd5eec","pokemon":"Goldeen","location_id":"unbound-map-3-75","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a06e753603dbb1c0","pokemon":"Remoraid","location_id":"unbound-map-3-75","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-41d886fbdd3179db","pokemon":"Seaking","location_id":"unbound-map-3-75","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b5f1f5b69d52e05a","pokemon":"Octillery","location_id":"unbound-map-3-75","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-0806bc57d5d58c77","pokemon":"Gyarados","location_id":"unbound-map-3-75","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e208fcf2498b326d","pokemon":"Yungoos","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"24%","level":"21–23","level_min":21,"level_max":23,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b6fc4ba3aa5b115d","pokemon":"Doduo","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-92f1859232646efb","pokemon":"Buneary","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"14%","level":"21–23","level_min":21,"level_max":23,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2601c853ff34f32b","pokemon":"Espurr","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-86ca29f51671d3b7","pokemon":"Abra","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5f9df16ab6a34791","pokemon":"Mareep","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9434656cbdb86b4d","pokemon":"Shinx","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4e654578a50727a7","pokemon":"Luxio","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"23","level_min":23,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-67d95c67b4389857","pokemon":"Gumshoos","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"23","level_min":23,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8856ad476c41733f","pokemon":"Rattata A","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"24%","level":"21–23","level_min":21,"level_max":23,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f485b270efde807d","pokemon":"Hoothoot","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-25f723152524d5e0","pokemon":"Buneary","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"14%","level":"21–23","level_min":21,"level_max":23,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-547d04a6e19c511e","pokemon":"Drowzee","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b49490bff5fedf2b","pokemon":"Abra","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b3271626fcb1fbf0","pokemon":"Mareep","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7327e229ff992b55","pokemon":"Shinx","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"21–23","level_min":21,"level_max":23,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-98003888f07f79ea","pokemon":"Luxio","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"23","level_min":23,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8161ea423fe61ebd","pokemon":"Raticate A","location_id":"unbound-map-3-76","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"23","level_min":23,"level_max":23,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9d1a71efd5271221","pokemon":"Tentacool","location_id":"unbound-map-3-76","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ae78965fe6eff4cd","pokemon":"Pelipper","location_id":"unbound-map-3-76","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ccea8b3202e10b26","pokemon":"Tentacruel","location_id":"unbound-map-3-76","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cf7a8d38c233b7a3","pokemon":"Mantyke","location_id":"unbound-map-3-76","method":"Surf","time":"","rate":"5%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7d3727e3130d6b65","pokemon":"Magikarp","location_id":"unbound-map-3-76","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a35e75bff61bf278","pokemon":"Goldeen","location_id":"unbound-map-3-76","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a25c3980dcfb8f44","pokemon":"Remoraid","location_id":"unbound-map-3-76","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5d168d63e8561d10","pokemon":"Seaking","location_id":"unbound-map-3-76","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a382f974ee5c0216","pokemon":"Octillery","location_id":"unbound-map-3-76","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-67b9a7a85b3979e7","pokemon":"Gyarados","location_id":"unbound-map-3-76","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5254ee700b02bb32","pokemon":"Snover","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban ngày","rate":"34%","level":"22–25","level_min":22,"level_max":25,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-948b6c24db1ab60c","pokemon":"Snorunt","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban ngày","rate":"34%","level":"22–25","level_min":22,"level_max":25,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-315ddbd9d91f01e0","pokemon":"Cubchoo","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9153046f74a8b342","pokemon":"Deerling (Winter)","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-31d86cb939a547b0","pokemon":"Flaaffy","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ebbb0c98182782b7","pokemon":"Minior (Shield)","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban ngày","rate":"2%","level":"23–25","level_min":23,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-acd27aaf32100268","pokemon":"Snover","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"24%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e45eb25a68c8a890","pokemon":"Snorunt","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"34%","level":"22–25","level_min":22,"level_max":25,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e109c8a2a2e280f9","pokemon":"Sneasel","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4e082f5a570177dd","pokemon":"Cubchoo","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cc1a8e22053a9abb","pokemon":"Deerling (Winter)","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-37a764c7649d62fe","pokemon":"Flaaffy","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-be2e5852018ceb11","pokemon":"Minior (Shield)","location_id":"unbound-map-3-77","method":"Cỏ","time":"Ban đêm","rate":"2%","level":"23–25","level_min":23,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3a03416a873d16e6","pokemon":"Roggenrola","location_id":"unbound-map-3-77","method":"Rock Smash","time":"","rate":"99%","level":"20–30","level_min":20,"level_max":30,"slot_count":4,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-76cc2454608dfbf2","pokemon":"Minior (Shield)","location_id":"unbound-map-3-77","method":"Rock Smash","time":"","rate":"1%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3b05771ff020fa29","pokemon":"Spearow","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-f6d15b83d383f2da","pokemon":"Grubbin","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-ea723644993dbe3f","pokemon":"Marill","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-3cf330e60620321b","pokemon":"Deerling (Autumn)","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-b8c875802687f008","pokemon":"Shroomish","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-a8fa4e28d2e67e18","pokemon":"Skorupi","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"6%","level":"29–30","level_min":29,"level_max":30,"slot_count":3,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-5349662ac45fd810","pokemon":"Audino","location_id":"unbound-map-3-79","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-45bf1d7557adb3de","pokemon":"Marill","location_id":"unbound-map-3-79","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-71448a27fae222e0","pokemon":"Surskit","location_id":"unbound-map-3-79","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-a16d9e3419265795","pokemon":"Masquerain","location_id":"unbound-map-3-79","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-48ef322437288a04","pokemon":"Azumarill","location_id":"unbound-map-3-79","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-64be9a0749fb2c57","pokemon":"Magikarp","location_id":"unbound-map-3-79","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-fd0333335a8d4520","pokemon":"Wishiwashi","location_id":"unbound-map-3-79","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-b7ec711374168857","pokemon":"Goldeen","location_id":"unbound-map-3-79","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5c35813e7816588","pokemon":"Wishiwashi","location_id":"unbound-map-3-79","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-18ff9df212667d89","pokemon":"Seaking","location_id":"unbound-map-3-79","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-2208e1db8c5e55d1","pokemon":"Gyarados","location_id":"unbound-map-3-79","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-b26997d8ac37df99","pokemon":"Bruxish","location_id":"unbound-map-3-79","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-36763ed9f573378f","pokemon":"Marill","location_id":"unbound-map-3-80","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-a007e815829c8fdf","pokemon":"Psyduck","location_id":"unbound-map-3-80","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-3036585442da2134","pokemon":"Golduck","location_id":"unbound-map-3-80","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-4b1e5afaab79523e","pokemon":"Azumarill","location_id":"unbound-map-3-80","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-bbda46061efd1b45","pokemon":"Magikarp","location_id":"unbound-map-3-80","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-63277c44c1e12d2e","pokemon":"Wishiwashi","location_id":"unbound-map-3-80","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-240d66efd81fccaa","pokemon":"Goldeen","location_id":"unbound-map-3-80","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-e31640c278729426","pokemon":"Wishiwashi","location_id":"unbound-map-3-80","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-97d8d32e1ecea089","pokemon":"Seaking","location_id":"unbound-map-3-80","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-de0320d6d250101a","pokemon":"Gyarados","location_id":"unbound-map-3-80","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-8758340fb3a51e20","pokemon":"Bruxish","location_id":"unbound-map-3-80","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-0193601e508d3776","pokemon":"Lotad","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-9a955a6877f0b0dc","pokemon":"Tympole","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-1fff42666b446579","pokemon":"Marill","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-2443f3d27b81ba64","pokemon":"Linoone","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"14%","level":"27–29","level_min":27,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-ecb99f7a1083381f","pokemon":"Lombre","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"28–29","level_min":28,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-77e906a450962b3d","pokemon":"Palpitoad","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"28–29","level_min":28,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-110b8e64b1d61151","pokemon":"Goomy","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"28–29","level_min":28,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-8d4fc8ef5f742a01","pokemon":"Ditto","location_id":"unbound-map-3-81","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"29","level_min":29,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-3657d3fa12b0f243","pokemon":"Palpitoad","location_id":"unbound-map-3-81","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-6413db562dea664a","pokemon":"Surskit","location_id":"unbound-map-3-81","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-6f9f1b8e50a8aae3","pokemon":"Lombre","location_id":"unbound-map-3-81","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-fe5e3b506629fef8","pokemon":"Masquerain","location_id":"unbound-map-3-81","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-9425e16e05be16bb","pokemon":"Magikarp","location_id":"unbound-map-3-81","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-6af3992d1803de33","pokemon":"Wishiwashi","location_id":"unbound-map-3-81","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-b7ec789f69588e60","pokemon":"Wishiwashi","location_id":"unbound-map-3-81","method":"Câu cá - Super Rod","time":"","rate":"99%","level":"45–50","level_min":45,"level_max":50,"slot_count":4,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-84b075d0f256de6b","pokemon":"Bruxish","location_id":"unbound-map-3-81","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"tehl","requires":[],"notes_vi":"","verified":true},{"id":"ub-590d61f98a847616","pokemon":"Palpitoad","location_id":"unbound-map-3-82","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3f815f24936a51f5","pokemon":"Surskit","location_id":"unbound-map-3-82","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ffda12c17fff3b4","pokemon":"Lombre","location_id":"unbound-map-3-82","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-670a658942c104e9","pokemon":"Masquerain","location_id":"unbound-map-3-82","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-da7bac159ea9f516","pokemon":"Magikarp","location_id":"unbound-map-3-82","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-65e8a4d3968538b3","pokemon":"Wishiwashi","location_id":"unbound-map-3-82","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f8d5c4caead31d0b","pokemon":"Goldeen","location_id":"unbound-map-3-82","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bde4b86d80327753","pokemon":"Wishiwashi","location_id":"unbound-map-3-82","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a15e3f1951964c2a","pokemon":"Seaking","location_id":"unbound-map-3-82","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5eb8ef4e274535d","pokemon":"Gyarados","location_id":"unbound-map-3-82","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-288203e781fae3d1","pokemon":"Bruxish","location_id":"unbound-map-3-82","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f3a4a22edcf46f66","pokemon":"Lotad","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-de9fd4a986ea5133","pokemon":"Tympole","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bd4b87232e00233d","pokemon":"Marill","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aa313d07ee6b6621","pokemon":"Linoone","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"14%","level":"27–29","level_min":27,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-52eebcfb593c79a1","pokemon":"Lombre","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"28–29","level_min":28,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-062b96d670ebcd4a","pokemon":"Palpitoad","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"28–29","level_min":28,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-03bb077c1f17b8f5","pokemon":"Goomy","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"28–29","level_min":28,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee47d04b7ba8ccd4","pokemon":"Ditto","location_id":"unbound-map-3-83","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"29","level_min":29,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f0775599b5fa6135","pokemon":"Palpitoad","location_id":"unbound-map-3-83","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cc23428335a08e13","pokemon":"Surskit","location_id":"unbound-map-3-83","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-18e2b845b8bd2b60","pokemon":"Lombre","location_id":"unbound-map-3-83","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8c44379f7d689094","pokemon":"Masquerain","location_id":"unbound-map-3-83","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-379a755a77d46bd2","pokemon":"Magikarp","location_id":"unbound-map-3-83","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-039539d6f2d42477","pokemon":"Wishiwashi","location_id":"unbound-map-3-83","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-639cd068e3408695","pokemon":"Goldeen","location_id":"unbound-map-3-83","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c4c5ccb360da1f92","pokemon":"Wishiwashi","location_id":"unbound-map-3-83","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-be756f0fd1632111","pokemon":"Seaking","location_id":"unbound-map-3-83","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-67d88629ef6e998c","pokemon":"Gyarados","location_id":"unbound-map-3-83","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-272f0fdbf45b8922","pokemon":"Bruxish","location_id":"unbound-map-3-83","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5506ed18dfa1babc","pokemon":"Tentacool","location_id":"unbound-map-3-84","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-250a2ba6ca45c69f","pokemon":"Pelipper","location_id":"unbound-map-3-84","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f5bc29f620f9dbe7","pokemon":"Tentacruel","location_id":"unbound-map-3-84","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-412beba756b2faca","pokemon":"Pyukumuku","location_id":"unbound-map-3-84","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4fc85eb0f44886b1","pokemon":"Magikarp","location_id":"unbound-map-3-84","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5f4e1296c2fe50f2","pokemon":"Remoraid","location_id":"unbound-map-3-84","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2de0967b0de98ede","pokemon":"Carvanha","location_id":"unbound-map-3-84","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7eac64a7fb94b509","pokemon":"Luvdisc","location_id":"unbound-map-3-84","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d59e6ac323da1f71","pokemon":"Octillery","location_id":"unbound-map-3-84","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-183ac7e5976a6822","pokemon":"Sharpedo","location_id":"unbound-map-3-84","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-06feaef83e9b9edd","pokemon":"Luvdisc","location_id":"unbound-map-3-84","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1ddeb3219a7b753f","pokemon":"Swablu","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban ngày","rate":"25%","level":"26–29","level_min":26,"level_max":29,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-87ff4916ad61641e","pokemon":"Exeggcute","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-9dca004e99f25cd5","pokemon":"Spoink","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0486b5646bd163b1","pokemon":"Gulpin","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"26–29","level_min":26,"level_max":29,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-51aeb02ba9665710","pokemon":"Meditite","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad780e639fd25cc4","pokemon":"Togedemaru","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"27–29","level_min":27,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-72674504a97cc6bd","pokemon":"Noctowl","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban đêm","rate":"25%","level":"26–29","level_min":26,"level_max":29,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5a98c94c6822a125","pokemon":"Exeggcute","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7191d2f63b718b93","pokemon":"Spoink","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-210c4b05249e288d","pokemon":"Gulpin","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"26–29","level_min":26,"level_max":29,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b684ff9e9137697d","pokemon":"Meditite","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-efc16d06682863b9","pokemon":"Togedemaru","location_id":"unbound-map-3-85","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"27–29","level_min":27,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3d5d9e83c12e9ca0","pokemon":"Tentacool","location_id":"unbound-map-3-85","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb3d6547234ccda1","pokemon":"Pelipper","location_id":"unbound-map-3-85","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-6f9a84a6bb89d3a9","pokemon":"Tentacruel","location_id":"unbound-map-3-85","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-dc8605f8f2b4501d","pokemon":"Basculin (Red)","location_id":"unbound-map-3-85","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0598d1eb05c8a9ab","pokemon":"Magikarp","location_id":"unbound-map-3-85","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-9377513063db921b","pokemon":"Barboach","location_id":"unbound-map-3-85","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e056860f8513b656","pokemon":"Luvdisc","location_id":"unbound-map-3-85","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a8fb205bd44ddbce","pokemon":"Remoraid","location_id":"unbound-map-3-85","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d79921f3ed5e3bcc","pokemon":"Whiscash","location_id":"unbound-map-3-85","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a4e989a40004bae0","pokemon":"Octillery","location_id":"unbound-map-3-85","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c9b45a403c30f228","pokemon":"Luvdisc","location_id":"unbound-map-3-85","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-480fae5471154f1e","pokemon":"Finneon","location_id":"unbound-map-3-86","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-309ebfe8fec06459","pokemon":"Psyduck","location_id":"unbound-map-3-86","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee3dbfddd7539a92","pokemon":"Lumineon","location_id":"unbound-map-3-86","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d853d090b0cf1d75","pokemon":"Golduck","location_id":"unbound-map-3-86","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7e8de69d068e6023","pokemon":"Geodude","location_id":"unbound-map-3-86","method":"Rock Smash","time":"","rate":"90%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3d92915030396a4a","pokemon":"Graveler","location_id":"unbound-map-3-86","method":"Rock Smash","time":"","rate":"10%","level":"25–30","level_min":25,"level_max":30,"slot_count":3,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1108c4d9791f1f40","pokemon":"Magikarp","location_id":"unbound-map-3-86","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d8fe1d9bd5bfb22b","pokemon":"Barboach","location_id":"unbound-map-3-86","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0940c04db5a83b94","pokemon":"Luvdisc","location_id":"unbound-map-3-86","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c52f6d90486107b2","pokemon":"Whiscash","location_id":"unbound-map-3-86","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-78bd2a09d096a2fa","pokemon":"Luvdisc","location_id":"unbound-map-3-86","method":"Câu cá - Super Rod","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":4,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d8e301e527a19db6","pokemon":"Poliwhirl","location_id":"unbound-map-3-87","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-528e19c8048ddb4a","pokemon":"Slowpoke","location_id":"unbound-map-3-87","method":"Surf","time":"","rate":"35%","level":"25–40","level_min":25,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee9e0a6aa5600578","pokemon":"Poliwag","location_id":"unbound-map-3-87","method":"Surf","time":"","rate":"4%","level":"25–30","level_min":25,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d646f48a64101cb5","pokemon":"Politoed","location_id":"unbound-map-3-87","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f4ebc5238b60f7d4","pokemon":"Magikarp","location_id":"unbound-map-3-87","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ab5303d6f882cf50","pokemon":"Poliwag","location_id":"unbound-map-3-87","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3ba42cc9df520e69","pokemon":"Psyduck","location_id":"unbound-map-3-87","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f33db682233c122","pokemon":"Poliwhirl","location_id":"unbound-map-3-87","method":"Câu cá - Super Rod","time":"","rate":"80%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2d6457d30deab610","pokemon":"Golduck","location_id":"unbound-map-3-87","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cebd1cf37fba4121","pokemon":"Fletchling","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-26e01222701a1e1e","pokemon":"Rockruff","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"33–36","level_min":33,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-470aa3c15e13e047","pokemon":"Solosis","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"33–36","level_min":33,"level_max":36,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-cf609d53a5995924","pokemon":"Mienfoo","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"33–36","level_min":33,"level_max":36,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-245d11ca75e6f070","pokemon":"Ponyta","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"33–36","level_min":33,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1b543f71ba85a3df","pokemon":"Snubbull","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"33–36","level_min":33,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b06db22ff54ead01","pokemon":"Deerling (Summer)","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"8%","level":"33–36","level_min":33,"level_max":36,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1d77a19984d3c563","pokemon":"Fletchinder","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"33","level_min":33,"level_max":33,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d97c0b836557bacd","pokemon":"Dedenne","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"35–36","level_min":35,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d136006ffd55432d","pokemon":"Hoothoot","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-13c07aed6b8fa8d0","pokemon":"Rockruff","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"33–36","level_min":33,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-105b1a5899cd08b1","pokemon":"Gothita","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"33–36","level_min":33,"level_max":36,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2af33490ab75caea","pokemon":"Mienfoo","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"15%","level":"33–36","level_min":33,"level_max":36,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-50afc45b9ffd9485","pokemon":"Ponyta","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"33–36","level_min":33,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-492a616248fa3832","pokemon":"Snubbull","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"33–36","level_min":33,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef2daf2a5d5be7b1","pokemon":"Deerling (Summer)","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"8%","level":"33–36","level_min":33,"level_max":36,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-bf8d40f8d0a8cc9b","pokemon":"Noctowl","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"34–36","level_min":34,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-012b67bb49634c83","pokemon":"Dedenne","location_id":"unbound-map-3-88","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"35–36","level_min":35,"level_max":36,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-896bfc36c3f71d22","pokemon":"Tentacool","location_id":"unbound-map-3-88","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f7f0bf07b037200f","pokemon":"Pelipper","location_id":"unbound-map-3-88","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-996d0e36193dd333","pokemon":"Tentacruel","location_id":"unbound-map-3-88","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-aa3f9986dffa0118","pokemon":"Mantyke","location_id":"unbound-map-3-88","method":"Surf","time":"","rate":"5%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b471ab960c6905bb","pokemon":"Magikarp","location_id":"unbound-map-3-88","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0e24ae62375a42a6","pokemon":"Carvanha","location_id":"unbound-map-3-88","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4b8ae1f3ccff1480","pokemon":"Wailmer","location_id":"unbound-map-3-88","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-34d53e9169cae06e","pokemon":"Sharpedo","location_id":"unbound-map-3-88","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c061aa6a070ba4b5","pokemon":"Wailord","location_id":"unbound-map-3-88","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3537db595d068038","pokemon":"Gyarados","location_id":"unbound-map-3-88","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1bce914d72c5cc7d","pokemon":"Tentacool","location_id":"unbound-map-3-89","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-fac1909973763552","pokemon":"Pelipper","location_id":"unbound-map-3-89","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4817eb0f412fa78f","pokemon":"Tentacruel","location_id":"unbound-map-3-89","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-bbf7cf82ac315e53","pokemon":"Pyukumuku","location_id":"unbound-map-3-89","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3e01122c0d9ecde7","pokemon":"Magikarp","location_id":"unbound-map-3-89","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef230c0c74c19bf2","pokemon":"Staryu","location_id":"unbound-map-3-89","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"10–15","level_min":10,"level_max":15,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-19075ad063b19c05","pokemon":"Poliwag","location_id":"unbound-map-3-89","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1ca76b5ba9892bed","pokemon":"Staryu","location_id":"unbound-map-3-89","method":"Câu cá - Super Rod","time":"","rate":"59%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0e2b7b411a575745","pokemon":"Poliwhirl","location_id":"unbound-map-3-89","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b185955aa1e95075","pokemon":"Starmie","location_id":"unbound-map-3-89","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-64640eef2e68242b","pokemon":"Sandslash","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-57976078a80806fc","pokemon":"Dwebble","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-90d487f552ebad65","pokemon":"Krokorok","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9af7c4439383d94d","pokemon":"Cacnea","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d128ff6895310f80","pokemon":"Darumaka","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7dad062f1991de8d","pokemon":"Hippowdon","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c747eca5c73764a7","pokemon":"Vibrava","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b7b638d913ee505e","pokemon":"Maractus","location_id":"unbound-map-3-90","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5a09891d685aee3b","pokemon":"Dwebble","location_id":"unbound-map-3-90","method":"Rock Smash","time":"","rate":"60%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b22d2c46f37f9604","pokemon":"Geodude","location_id":"unbound-map-3-90","method":"Rock Smash","time":"","rate":"30%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-015c22b6b2f416fd","pokemon":"Binacle","location_id":"unbound-map-3-90","method":"Rock Smash","time":"","rate":"10%","level":"30–40","level_min":30,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9b8e23ae02538ee1","pokemon":"Sandslash","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-36b6bedd4d337ecb","pokemon":"Dwebble","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-07954a264eae2371","pokemon":"Krokorok","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-760b91c285ca1f67","pokemon":"Cacnea","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad63302bc9ea0bd3","pokemon":"Darumaka","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ebf7862d25ef837","pokemon":"Hippowdon","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8b0fc274dbf122f7","pokemon":"Vibrava","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-747c7233dc3b9db3","pokemon":"Maractus","location_id":"unbound-map-3-91","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a77371ef885c3aef","pokemon":"Dwebble","location_id":"unbound-map-3-91","method":"Rock Smash","time":"","rate":"60%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fd4587fb19766f37","pokemon":"Geodude","location_id":"unbound-map-3-91","method":"Rock Smash","time":"","rate":"30%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-20511421b631fe27","pokemon":"Binacle","location_id":"unbound-map-3-91","method":"Rock Smash","time":"","rate":"10%","level":"30–40","level_min":30,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b2b32da3d3028b8d","pokemon":"Sandslash","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-add55dcdab6cb080","pokemon":"Dwebble","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-41c5fdab40c2e201","pokemon":"Krokorok","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0380fe2c5787c8f4","pokemon":"Cacnea","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4653e998267cdb17","pokemon":"Darumaka","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f101580355e56ca8","pokemon":"Hippowdon","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"36–40","level_min":36,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ca85de8d15f5d6a","pokemon":"Vibrava","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–40","level_min":36,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-236eb6cc088ff7c5","pokemon":"Maractus","location_id":"unbound-map-3-92","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-96ee18a3dd7221f3","pokemon":"Dwebble","location_id":"unbound-map-3-92","method":"Rock Smash","time":"","rate":"60%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-10d879dc427bd44c","pokemon":"Geodude","location_id":"unbound-map-3-92","method":"Rock Smash","time":"","rate":"30%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b8ecdddc38741b7c","pokemon":"Binacle","location_id":"unbound-map-3-92","method":"Rock Smash","time":"","rate":"10%","level":"30–40","level_min":30,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a7574fbff06c2bc7","pokemon":"Tentacool","location_id":"unbound-map-3-93","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e535953cb7190dc8","pokemon":"Pelipper","location_id":"unbound-map-3-93","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-346f39a4ca5e8284","pokemon":"Tentacruel","location_id":"unbound-map-3-93","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2e3f5a8314023bbf","pokemon":"Alomomola","location_id":"unbound-map-3-93","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-786189253fae48b6","pokemon":"Binacle","location_id":"unbound-map-3-93","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e20b71e138b4d020","pokemon":"Geodude","location_id":"unbound-map-3-93","method":"Rock Smash","time":"","rate":"30%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-08c4896274c05a52","pokemon":"Krabby","location_id":"unbound-map-3-93","method":"Rock Smash","time":"","rate":"5%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ae86fc10d26a593a","pokemon":"Corsola","location_id":"unbound-map-3-93","method":"Rock Smash","time":"","rate":"4%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-be513c0002c68d47","pokemon":"Kingler","location_id":"unbound-map-3-93","method":"Rock Smash","time":"","rate":"1%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5aec1166f7944831","pokemon":"Magikarp","location_id":"unbound-map-3-93","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f2ed66b70276f7d0","pokemon":"Skrelp","location_id":"unbound-map-3-93","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4c23434b343cf314","pokemon":"Clauncher","location_id":"unbound-map-3-93","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b04ad70fc2a4553d","pokemon":"Dragalge","location_id":"unbound-map-3-93","method":"Câu cá - Super Rod","time":"","rate":"80%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f3cb66ab214d1325","pokemon":"Clawitzer","location_id":"unbound-map-3-93","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8cbe6010fcf5305e","pokemon":"Tentacool","location_id":"unbound-map-3-94","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3048d280225fa01","pokemon":"Pelipper","location_id":"unbound-map-3-94","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d61433eb0ae9d4b8","pokemon":"Tentacruel","location_id":"unbound-map-3-94","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-28b1dcb1ccbdeb7e","pokemon":"Alomomola","location_id":"unbound-map-3-94","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a015f96d677e6d75","pokemon":"Binacle","location_id":"unbound-map-3-94","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-bea6ee7dea84e313","pokemon":"Geodude","location_id":"unbound-map-3-94","method":"Rock Smash","time":"","rate":"30%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-742bda6a2a0c9fde","pokemon":"Krabby","location_id":"unbound-map-3-94","method":"Rock Smash","time":"","rate":"5%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7dab3f073ba84eff","pokemon":"Corsola","location_id":"unbound-map-3-94","method":"Rock Smash","time":"","rate":"4%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c2696ec1d702f05e","pokemon":"Kingler","location_id":"unbound-map-3-94","method":"Rock Smash","time":"","rate":"1%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-273910e5a5dc8736","pokemon":"Magikarp","location_id":"unbound-map-3-94","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-27da6cbeef0de1bd","pokemon":"Clauncher","location_id":"unbound-map-3-94","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3c1020832cc41de3","pokemon":"Skrelp","location_id":"unbound-map-3-94","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-52546a845e2be8bf","pokemon":"Clawitzer","location_id":"unbound-map-3-94","method":"Câu cá - Super Rod","time":"","rate":"80%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1e726875628699dd","pokemon":"Dragalge","location_id":"unbound-map-3-94","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7ee5bd5c78e6cdc6","pokemon":"Tentacool","location_id":"unbound-map-3-95","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-9613bd336822e04d","pokemon":"Pelipper","location_id":"unbound-map-3-95","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d7c584a26336d507","pokemon":"Tentacruel","location_id":"unbound-map-3-95","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad56b51dda472789","pokemon":"Mantine","location_id":"unbound-map-3-95","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d6674e5318116c46","pokemon":"Binacle","location_id":"unbound-map-3-95","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-9b2b0ed06bc46657","pokemon":"Geodude","location_id":"unbound-map-3-95","method":"Rock Smash","time":"","rate":"30%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7387afb3f39d9a91","pokemon":"Krabby","location_id":"unbound-map-3-95","method":"Rock Smash","time":"","rate":"5%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-9c0ac4e0486e46a0","pokemon":"Corsola","location_id":"unbound-map-3-95","method":"Rock Smash","time":"","rate":"4%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5cf20dbc388e85d7","pokemon":"Kingler","location_id":"unbound-map-3-95","method":"Rock Smash","time":"","rate":"1%","level":"30–35","level_min":30,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8915eacb219a7929","pokemon":"Magikarp","location_id":"unbound-map-3-95","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7da7423f7e5db4e2","pokemon":"Horsea","location_id":"unbound-map-3-95","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-33e8d41d01543717","pokemon":"Shellder","location_id":"unbound-map-3-95","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-18ad5ade309ea346","pokemon":"Carvanha","location_id":"unbound-map-3-95","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1aa232a4693b8ba3","pokemon":"Seadra","location_id":"unbound-map-3-95","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-fcf39c582c621581","pokemon":"Cloyster","location_id":"unbound-map-3-95","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-33edd463c4cdae70","pokemon":"Sharpedo","location_id":"unbound-map-3-95","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c63edded6ec4013d","pokemon":"Pelipper","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1b0e6cec17acde3c","pokemon":"Bibarel","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-78b03d99c95ca4f2","pokemon":"Golduck","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-82a8ce436e74114d","pokemon":"Gastrodon","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-83ab337892f5cf2a","pokemon":"Floatzel","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"14%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-15ab7a1ac58b297d","pokemon":"Slowpoke","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"14%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-944076f968fb68be","pokemon":"Weepinbell","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f22c313b801cf37","pokemon":"Bellsprout","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban ngày","rate":"2%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-61f3840f42fad52a","pokemon":"Pelipper","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-38ec4f3bc6d5ec9b","pokemon":"Bibarel","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-582a0afea4bd78cc","pokemon":"Golduck","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5906d232d541def","pokemon":"Gastrodon","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-97431fca6a3e1470","pokemon":"Floatzel","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"14%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c8a46ef7dea94c49","pokemon":"Slowpoke","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"14%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-188be0e70c56cda2","pokemon":"Gloom","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a54688ea95693521","pokemon":"Oddish","location_id":"unbound-map-3-96","method":"Cỏ","time":"Ban đêm","rate":"2%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d0d545b757151533","pokemon":"Tentacool","location_id":"unbound-map-3-96","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7c02b05adf67c164","pokemon":"Pelipper","location_id":"unbound-map-3-96","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0d100aba65f7bc8c","pokemon":"Tentacruel","location_id":"unbound-map-3-96","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a194d622b5f5ccd4","pokemon":"Mantine","location_id":"unbound-map-3-96","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ac0b5616873d082a","pokemon":"Magikarp","location_id":"unbound-map-3-96","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-88d5c5d34873da13","pokemon":"Horsea","location_id":"unbound-map-3-96","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-582758eb5802cdf1","pokemon":"Shellder","location_id":"unbound-map-3-96","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1a1a1bc462adcb04","pokemon":"Wailmer","location_id":"unbound-map-3-96","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-05f16fe808512732","pokemon":"Seadra","location_id":"unbound-map-3-96","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f0bf503f709a7922","pokemon":"Shellder","location_id":"unbound-map-3-96","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-46157a8c2817d07f","pokemon":"Wailord","location_id":"unbound-map-3-96","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d79302490e0233fa","pokemon":"Pelipper","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-75e934b5a3cc8b16","pokemon":"Bibarel","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e561ff5bf1c9bf4d","pokemon":"Golduck","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d3211627c377e946","pokemon":"Gastrodon","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ec44de6a963a3d47","pokemon":"Floatzel","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"14%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a824af4d3cf0b84","pokemon":"Slowpoke","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"14%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0a16cbf6a28cabdc","pokemon":"Weepinbell","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-fda1327b5aedc4a2","pokemon":"Bellsprout","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban ngày","rate":"2%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4063fb80e4767672","pokemon":"Pelipper","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3c9df4a633f06083","pokemon":"Bibarel","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-32e3c074840c9752","pokemon":"Golduck","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-806f4750e429c806","pokemon":"Gastrodon","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-16cd9ee45a49c381","pokemon":"Floatzel","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"14%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-af9ea68645dc43a0","pokemon":"Slowpoke","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"14%","level":"36–40","level_min":36,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-30d0cf4e22fcd97e","pokemon":"Gloom","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d4ed6089316352e0","pokemon":"Oddish","location_id":"unbound-map-3-97","method":"Cỏ","time":"Ban đêm","rate":"2%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-317b1ce2d8c69654","pokemon":"Tentacool","location_id":"unbound-map-3-97","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-54e7c9f3fa350d70","pokemon":"Pelipper","location_id":"unbound-map-3-97","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d47636c8873c3478","pokemon":"Tentacruel","location_id":"unbound-map-3-97","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f14b2036a48c358d","pokemon":"Mantine","location_id":"unbound-map-3-97","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4903e1c94fb3fc2a","pokemon":"Magikarp","location_id":"unbound-map-3-97","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-6afcc19758499f1c","pokemon":"Shellder","location_id":"unbound-map-3-97","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-71a0ff1edd388ed4","pokemon":"Horsea","location_id":"unbound-map-3-97","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c013d2d242d0d563","pokemon":"Luvdisc","location_id":"unbound-map-3-97","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-318ff538071e704f","pokemon":"Shellder","location_id":"unbound-map-3-97","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7dce249c10674455","pokemon":"Seadra","location_id":"unbound-map-3-97","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f37a887fcb8e0581","pokemon":"Luvdisc","location_id":"unbound-map-3-97","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e002f02ebd3d3c43","pokemon":"Tentacool","location_id":"unbound-map-3-98","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f546e9c21a6ce053","pokemon":"Pelipper","location_id":"unbound-map-3-98","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-556313d43da856fa","pokemon":"Tentacruel","location_id":"unbound-map-3-98","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-08afc60ff72b7665","pokemon":"Mantine","location_id":"unbound-map-3-98","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0f09e5a7cd05d2e0","pokemon":"Magikarp","location_id":"unbound-map-3-98","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-fbeb56bad1653e52","pokemon":"Remoraid","location_id":"unbound-map-3-98","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-22a97e0878a236ac","pokemon":"Corsola","location_id":"unbound-map-3-98","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-bc45d4f0ff4a5be2","pokemon":"Horsea","location_id":"unbound-map-3-98","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1fe720284d1612b2","pokemon":"Octillery","location_id":"unbound-map-3-98","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7b61b80dc9cfea68","pokemon":"Seadra","location_id":"unbound-map-3-98","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e15e1b2097386c40","pokemon":"Corsola","location_id":"unbound-map-3-98","method":"Câu cá - Super Rod","time":"","rate":"15%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-994b959fc03b2bf8","pokemon":"Kingdra","location_id":"unbound-map-3-98","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b8461926b0a8896a","pokemon":"Tentacool","location_id":"unbound-map-3-99","method":"Surf","time":"","rate":"60%","level":"37–42","level_min":37,"level_max":42,"slot_count":1,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-c61ecae192a5d7fb","pokemon":"Pelipper","location_id":"unbound-map-3-99","method":"Surf","time":"","rate":"30%","level":"37–42","level_min":37,"level_max":42,"slot_count":1,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ef31850bb6e41c6","pokemon":"Tentacruel","location_id":"unbound-map-3-99","method":"Surf","time":"","rate":"5%","level":"40–42","level_min":40,"level_max":42,"slot_count":1,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-be829e3aba4a86a7","pokemon":"Basculin (Red)","location_id":"unbound-map-3-99","method":"Surf","time":"","rate":"5%","level":"40–42","level_min":40,"level_max":42,"slot_count":2,"slot_total":5,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-1405f25e07cdd406","pokemon":"Magikarp","location_id":"unbound-map-3-99","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-d4dacc60f1c0f51b","pokemon":"Horsea","location_id":"unbound-map-3-99","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-f91ac46877bc8d8e","pokemon":"Shellder","location_id":"unbound-map-3-99","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-d074f9a29dbeb387","pokemon":"Seadra","location_id":"unbound-map-3-99","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-c227f718e74b3893","pokemon":"Shellder","location_id":"unbound-map-3-99","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-7fe6a31e117c4d51","pokemon":"Gyarados","location_id":"unbound-map-3-99","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-49af24cc83ecbafd","pokemon":"Cloyster","location_id":"unbound-map-3-99","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"postgame","requires":[],"notes_vi":"","verified":true},{"id":"ub-d637b2c01b1a0e8d","pokemon":"Tentacool","location_id":"unbound-map-3-100","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ce0a6e6b1f7c0da1","pokemon":"Pelipper","location_id":"unbound-map-3-100","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e15c9e4d1fd95877","pokemon":"Tentacruel","location_id":"unbound-map-3-100","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ca4465113eacc80a","pokemon":"Basculin (Red)","location_id":"unbound-map-3-100","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5ffc43a3e96b195","pokemon":"Magikarp","location_id":"unbound-map-3-100","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-111df9f92c3a62d9","pokemon":"Horsea","location_id":"unbound-map-3-100","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-21470ac471e34c14","pokemon":"Shellder","location_id":"unbound-map-3-100","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-38fecd50a3068394","pokemon":"Seadra","location_id":"unbound-map-3-100","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-91daf29f369fdece","pokemon":"Shellder","location_id":"unbound-map-3-100","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-12ca15931b15d29d","pokemon":"Gyarados","location_id":"unbound-map-3-100","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1442e5f5ddf93cdb","pokemon":"Cloyster","location_id":"unbound-map-3-100","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7e965d9cd1bb42a2","pokemon":"Tangela","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–47","level_min":45,"level_max":47,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-9d5bc9e5d030a94d","pokemon":"Girafarig","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"45–47","level_min":45,"level_max":47,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d805160673e2cfab","pokemon":"Pancham","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"44–47","level_min":44,"level_max":47,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3f85d40bd7c6b89f","pokemon":"Pawniard","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"45–47","level_min":45,"level_max":47,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-59128756d5e89bc6","pokemon":"Chatot","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"45–47","level_min":45,"level_max":47,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-68662534d3a04ea3","pokemon":"Throh","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"45–47","level_min":45,"level_max":47,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-18be245a08f168d3","pokemon":"Sawk","location_id":"unbound-map-3-101","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"45–47","level_min":45,"level_max":47,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-62eb6b968cf8d42a","pokemon":"Tentacool","location_id":"unbound-map-3-101","method":"Surf","time":"","rate":"60%","level":"42–47","level_min":42,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7cf245230f96771d","pokemon":"Pelipper","location_id":"unbound-map-3-101","method":"Surf","time":"","rate":"30%","level":"42–47","level_min":42,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-32e626196182c044","pokemon":"Tentacruel","location_id":"unbound-map-3-101","method":"Surf","time":"","rate":"5%","level":"45–47","level_min":45,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-14b3408d85871604","pokemon":"Mantyke","location_id":"unbound-map-3-101","method":"Surf","time":"","rate":"5%","level":"44–47","level_min":44,"level_max":47,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-46889d01428dff53","pokemon":"Binacle","location_id":"unbound-map-3-101","method":"Rock Smash","time":"","rate":"60%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-54b43ba5c70185bf","pokemon":"Geodude","location_id":"unbound-map-3-101","method":"Rock Smash","time":"","rate":"30%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-88be2c9c824aca68","pokemon":"Krabby","location_id":"unbound-map-3-101","method":"Rock Smash","time":"","rate":"5%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1702184cb58310c7","pokemon":"Corsola","location_id":"unbound-map-3-101","method":"Rock Smash","time":"","rate":"4%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d366472f77f025ff","pokemon":"Kingler","location_id":"unbound-map-3-101","method":"Rock Smash","time":"","rate":"1%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7c73d8334b7bebae","pokemon":"Magikarp","location_id":"unbound-map-3-101","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5525a3ae433bd0d2","pokemon":"Remoraid","location_id":"unbound-map-3-101","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-deab5926c7aa2959","pokemon":"Corsola","location_id":"unbound-map-3-101","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c765aa4e362f8c82","pokemon":"Horsea","location_id":"unbound-map-3-101","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-cb987609bc533b37","pokemon":"Octillery","location_id":"unbound-map-3-101","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5ac9b385931b62a","pokemon":"Seadra","location_id":"unbound-map-3-101","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-bab1ded403841398","pokemon":"Corsola","location_id":"unbound-map-3-101","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-63d300b0e9502eda","pokemon":"Tentacool","location_id":"unbound-map-3-102","method":"Surf","time":"","rate":"60%","level":"42–47","level_min":42,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4c734b4dc9530006","pokemon":"Pelipper","location_id":"unbound-map-3-102","method":"Surf","time":"","rate":"30%","level":"42–47","level_min":42,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e33cddc774f0c94b","pokemon":"Tentacruel","location_id":"unbound-map-3-102","method":"Surf","time":"","rate":"5%","level":"45–47","level_min":45,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0cc4b9d97c43b67b","pokemon":"Mantyke","location_id":"unbound-map-3-102","method":"Surf","time":"","rate":"5%","level":"44–47","level_min":44,"level_max":47,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-5e9febf10023b0f7","pokemon":"Magikarp","location_id":"unbound-map-3-102","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ab5ffe88e54b519f","pokemon":"Remoraid","location_id":"unbound-map-3-102","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad0838d806872004","pokemon":"Horsea","location_id":"unbound-map-3-102","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0b4044e9da27de78","pokemon":"Octillery","location_id":"unbound-map-3-102","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-949a3bf1ba08f785","pokemon":"Seadra","location_id":"unbound-map-3-102","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ec429fdb657ba910","pokemon":"Gyarados","location_id":"unbound-map-3-102","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-44467cfd2325c05d","pokemon":"Tentacool","location_id":"unbound-map-3-103","method":"Surf","time":"","rate":"60%","level":"42–47","level_min":42,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-50f8a9bdaab1ac3f","pokemon":"Pelipper","location_id":"unbound-map-3-103","method":"Surf","time":"","rate":"30%","level":"42–47","level_min":42,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-56208d346bef25eb","pokemon":"Tentacruel","location_id":"unbound-map-3-103","method":"Surf","time":"","rate":"5%","level":"45–47","level_min":45,"level_max":47,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-37fc7906c04a845f","pokemon":"Mantyke","location_id":"unbound-map-3-103","method":"Surf","time":"","rate":"5%","level":"44–47","level_min":44,"level_max":47,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f94d2cd2624a6492","pokemon":"Binacle","location_id":"unbound-map-3-103","method":"Rock Smash","time":"","rate":"60%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-85c40c48a8274149","pokemon":"Geodude A","location_id":"unbound-map-3-103","method":"Rock Smash","time":"","rate":"30%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f2eef09b106f512a","pokemon":"Krabby","location_id":"unbound-map-3-103","method":"Rock Smash","time":"","rate":"5%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b12ae403183a1069","pokemon":"Corsola","location_id":"unbound-map-3-103","method":"Rock Smash","time":"","rate":"4%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3c4a5a0a9f427013","pokemon":"Kingler","location_id":"unbound-map-3-103","method":"Rock Smash","time":"","rate":"1%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a5f509f354f51709","pokemon":"Magikarp","location_id":"unbound-map-3-103","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1b4fd380236ccfc3","pokemon":"Remoraid","location_id":"unbound-map-3-103","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dabff85ed404cac7","pokemon":"Horsea","location_id":"unbound-map-3-103","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-87a51e05c0790f1f","pokemon":"Octillery","location_id":"unbound-map-3-103","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-797bad357d77dd5d","pokemon":"Seadra","location_id":"unbound-map-3-103","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f14e0f7aeadc0b7f","pokemon":"Gyarados","location_id":"unbound-map-3-103","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d6a41c6f32814753","pokemon":"Skiploom","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1d607b18fd8111e2","pokemon":"Pelipper","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"30%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8f20a18f88237022","pokemon":"Tropius","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-994def5dde7bfe61","pokemon":"Pidgeotto","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"15%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-81c2c0e97f1fa177","pokemon":"Zangoose","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"4%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-828da108d578f988","pokemon":"Seviper","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"4%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-314c0343264daecb","pokemon":"Bagon","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban ngày","rate":"2%","level":"40–45","level_min":40,"level_max":45,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a7b7421b70547f7f","pokemon":"Noctowl","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban đêm","rate":"60%","level":"47–50","level_min":47,"level_max":50,"slot_count":6,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0cfa8c494ae84e0d","pokemon":"Pelipper","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban đêm","rate":"30%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b407af9be6781388","pokemon":"Zangoose","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban đêm","rate":"4%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-80578262485ef311","pokemon":"Seviper","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban đêm","rate":"4%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4b645dfc4618da28","pokemon":"Bagon","location_id":"unbound-map-3-104","method":"Cỏ","time":"Ban đêm","rate":"2%","level":"40–45","level_min":40,"level_max":45,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-07fecc7e89042b29","pokemon":"Tentacool","location_id":"unbound-map-3-104","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-918e9f052f7931d0","pokemon":"Pelipper","location_id":"unbound-map-3-104","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-62c2026d49a9c509","pokemon":"Tentacruel","location_id":"unbound-map-3-104","method":"Surf","time":"","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-888ebf8d2e747ca9","pokemon":"Mantyke","location_id":"unbound-map-3-104","method":"Surf","time":"","rate":"5%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ac262204b1e86d57","pokemon":"Binacle","location_id":"unbound-map-3-104","method":"Rock Smash","time":"","rate":"60%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8869846cf2a48f8b","pokemon":"Geodude","location_id":"unbound-map-3-104","method":"Rock Smash","time":"","rate":"30%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7d08c9b989b017d4","pokemon":"Krabby","location_id":"unbound-map-3-104","method":"Rock Smash","time":"","rate":"5%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d6a08417fa7eb179","pokemon":"Corsola","location_id":"unbound-map-3-104","method":"Rock Smash","time":"","rate":"4%","level":"35–45","level_min":35,"level_max":45,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-68a729bf873e2a5a","pokemon":"Kingler","location_id":"unbound-map-3-104","method":"Rock Smash","time":"","rate":"1%","level":"35–45","level_min":35,"level_max":45,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-d6555cb2b4383fb1","pokemon":"Magikarp","location_id":"unbound-map-3-104","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-59afb8df44ebb972","pokemon":"Remoraid","location_id":"unbound-map-3-104","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1280f90d2b9bab32","pokemon":"Corsola","location_id":"unbound-map-3-104","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b29980bbfd86f949","pokemon":"Horsea","location_id":"unbound-map-3-104","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-78af268ea655b309","pokemon":"Octillery","location_id":"unbound-map-3-104","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c88055a8ae453122","pokemon":"Seadra","location_id":"unbound-map-3-104","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-26971f37b5b9d3d1","pokemon":"Corsola","location_id":"unbound-map-3-104","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-161ea9ffbbe24bfd","pokemon":"Lapras","location_id":"unbound-map-3-104","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ae11fef50331415","pokemon":"Tentacool","location_id":"unbound-map-3-105","method":"Surf","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-020d56bd6b03ab11","pokemon":"Pelipper","location_id":"unbound-map-3-105","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b612d74818708523","pokemon":"Tentacruel","location_id":"unbound-map-3-105","method":"Surf","time":"","rate":"5%","level":"48–50","level_min":48,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c15ec0c39c8660e9","pokemon":"Mantyke","location_id":"unbound-map-3-105","method":"Surf","time":"","rate":"5%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f34774af2b3c5f07","pokemon":"Magikarp","location_id":"unbound-map-3-105","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-77d073bdb4e38f96","pokemon":"Remoraid","location_id":"unbound-map-3-105","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-65abf1442c92b9a4","pokemon":"Corsola","location_id":"unbound-map-3-105","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ce1c3c26a327fcf","pokemon":"Horsea","location_id":"unbound-map-3-105","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c2fcb3ce52a326ac","pokemon":"Octillery","location_id":"unbound-map-3-105","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f8e509760df64dc","pokemon":"Seadra","location_id":"unbound-map-3-105","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ace27557dcbeedae","pokemon":"Corsola","location_id":"unbound-map-3-105","method":"Câu cá - Super Rod","time":"","rate":"19%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-824d1b3af06ef435","pokemon":"Lapras","location_id":"unbound-map-3-105","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-26c24c613954bcb4","pokemon":"Tentacool","location_id":"unbound-map-3-106","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f67e8534ba3f0517","pokemon":"Pelipper","location_id":"unbound-map-3-106","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e42ed18c263e5f2a","pokemon":"Tentacruel","location_id":"unbound-map-3-106","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4e9f5fc7216b7071","pokemon":"Mantine","location_id":"unbound-map-3-106","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd8b392a8b28fb12","pokemon":"Binacle","location_id":"unbound-map-3-106","method":"Rock Smash","time":"","rate":"60%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-8d97b4ce911b0595","pokemon":"Geodude","location_id":"unbound-map-3-106","method":"Rock Smash","time":"","rate":"30%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e1c4bf3b6a8e224d","pokemon":"Krabby","location_id":"unbound-map-3-106","method":"Rock Smash","time":"","rate":"5%","level":"25–35","level_min":25,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2fa9e7587faebb35","pokemon":"Corsola","location_id":"unbound-map-3-106","method":"Rock Smash","time":"","rate":"4%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f45c27fb17c8a743","pokemon":"Kingler","location_id":"unbound-map-3-106","method":"Rock Smash","time":"","rate":"1%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ac568bb3c9062eed","pokemon":"Magikarp","location_id":"unbound-map-3-106","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-12c225e60f067567","pokemon":"Remoraid","location_id":"unbound-map-3-106","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-cbc959e67ef639f3","pokemon":"Corsola","location_id":"unbound-map-3-106","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f92d9ef6d83677f3","pokemon":"Horsea","location_id":"unbound-map-3-106","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c9333317b3a43598","pokemon":"Octillery","location_id":"unbound-map-3-106","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-e61f692f54b85048","pokemon":"Seadra","location_id":"unbound-map-3-106","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-93c25302cb210501","pokemon":"Corsola","location_id":"unbound-map-3-106","method":"Câu cá - Super Rod","time":"","rate":"15%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0695f971c21fb8b6","pokemon":"Kingdra","location_id":"unbound-map-3-106","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b48df6a10d763cea","pokemon":"Farfetch\u0027d","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban ngày","rate":"35%","level":"53–57","level_min":53,"level_max":57,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-558dea6d4537963b","pokemon":"Persian","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban ngày","rate":"35%","level":"50–57","level_min":50,"level_max":57,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ea22dc8c2918522b","pokemon":"Bouffalant","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"53–57","level_min":53,"level_max":57,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-f12f99a5b8d240e1","pokemon":"Sudowoodo","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban ngày","rate":"9%","level":"53–57","level_min":53,"level_max":57,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b682d3fd2b28491f","pokemon":"Happiny","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban ngày","rate":"1%","level":"53–57","level_min":53,"level_max":57,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2d84b4cf2e40e446","pokemon":"Noctowl","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban đêm","rate":"35%","level":"53–57","level_min":53,"level_max":57,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-4eb2ab55c84b958c","pokemon":"Skuntank","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban đêm","rate":"35%","level":"53–57","level_min":53,"level_max":57,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-fcb5cdcf86175bd7","pokemon":"Bouffalant","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"53–57","level_min":53,"level_max":57,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2c254d8857737387","pokemon":"Sudowoodo","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban đêm","rate":"9%","level":"53–57","level_min":53,"level_max":57,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3f833788d148f45","pokemon":"Happiny","location_id":"unbound-map-3-107","method":"Cỏ","time":"Ban đêm","rate":"1%","level":"53–57","level_min":53,"level_max":57,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-66f1632e3ad95589","pokemon":"Tentacool","location_id":"unbound-map-3-107","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-566d9d5f10bf87af","pokemon":"Pelipper","location_id":"unbound-map-3-107","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-a806074c02f6630f","pokemon":"Tentacruel","location_id":"unbound-map-3-107","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-23595135ca5b0d66","pokemon":"Mantine","location_id":"unbound-map-3-107","method":"Surf","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-6cd4d6bbf03a0fed","pokemon":"Magikarp","location_id":"unbound-map-3-107","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-3b2c877eb6df29da","pokemon":"Remoraid","location_id":"unbound-map-3-107","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-37ef7b9a43b9402b","pokemon":"Corsola","location_id":"unbound-map-3-107","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-7c74611a8a26b4d8","pokemon":"Horsea","location_id":"unbound-map-3-107","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee4704059b8a1286","pokemon":"Octillery","location_id":"unbound-map-3-107","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-355d7bf84f82c14b","pokemon":"Seadra","location_id":"unbound-map-3-107","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-b6699e296b15ac2b","pokemon":"Corsola","location_id":"unbound-map-3-107","method":"Câu cá - Super Rod","time":"","rate":"15%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-992a3a3c383a21fa","pokemon":"Gyarados","location_id":"unbound-map-3-107","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-ced6c5eeac01f1d2","pokemon":"Woobat","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef6e534430f5fd63","pokemon":"Slugma","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7c61f4bcfb77a60f","pokemon":"Salandit","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–38","level_min":35,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3259b4d685f466f","pokemon":"Camerupt","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-98ba12f86c2c772b","pokemon":"Graveler","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–38","level_min":35,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1cc48b7f339465f6","pokemon":"Excadrill","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a4a08954d6814c8f","pokemon":"Heatmor","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b330bb37f05f4357","pokemon":"Magmar","location_id":"unbound-map-6-12","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"36–38","level_min":36,"level_max":38,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-11f4a2d28b7977dc","pokemon":"Clamperl","location_id":"unbound-map-32-0","method":"Cỏ","time":"Ngày và đêm","rate":"50%","level":"35–50","level_min":35,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-47494e530ec79d79","pokemon":"Mareanie","location_id":"unbound-map-32-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-751aba30a196cfb2","pokemon":"Toxapex","location_id":"unbound-map-32-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-055e58ae9781757f","pokemon":"Chinchou","location_id":"unbound-map-32-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-43bf880f68210154","pokemon":"Lanturn","location_id":"unbound-map-32-0","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-269ee206b29ddad0","pokemon":"Luvdisc","location_id":"unbound-map-32-0","method":"Cỏ","time":"Ngày và đêm","rate":"6%","level":"35–60","level_min":35,"level_max":60,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-74745e1fbfcedb8d","pokemon":"Clamperl","location_id":"unbound-map-32-1","method":"Cỏ","time":"Ngày và đêm","rate":"50%","level":"35–50","level_min":35,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a3e2f8f07684efe0","pokemon":"Mareanie","location_id":"unbound-map-32-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c8a34c46f9656949","pokemon":"Toxapex","location_id":"unbound-map-32-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b2ef7c8bd8f45152","pokemon":"Chinchou","location_id":"unbound-map-32-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e4bc108c8c974e2c","pokemon":"Lanturn","location_id":"unbound-map-32-1","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-25ad6d2be3829feb","pokemon":"Luvdisc","location_id":"unbound-map-32-1","method":"Cỏ","time":"Ngày và đêm","rate":"6%","level":"35–60","level_min":35,"level_max":60,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0560bb04c553ad51","pokemon":"Clamperl","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"50%","level":"35–50","level_min":35,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-12d0379f653ba53d","pokemon":"Mareanie","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-981f94c5f5a213a1","pokemon":"Toxapex","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-230d1d703074cb5c","pokemon":"Chinchou","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4ff7d8c1ce0b685e","pokemon":"Lanturn","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-68ce073f747799b2","pokemon":"Luvdisc","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"35–60","level_min":35,"level_max":60,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ea5c1e3ad2240bb7","pokemon":"Relicanth","location_id":"unbound-map-32-2","method":"Cỏ","time":"Ngày và đêm","rate":"1%","level":"35–60","level_min":35,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-2749ebce3b13bd3f","pokemon":"Clamperl","location_id":"unbound-map-32-5","method":"Cỏ","time":"Ngày và đêm","rate":"50%","level":"35–50","level_min":35,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-921c51228b1be9ae","pokemon":"Remoraid","location_id":"unbound-map-32-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9c1f5116d4dba64e","pokemon":"Octillery","location_id":"unbound-map-32-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-60ee772a9485e284","pokemon":"Chinchou","location_id":"unbound-map-32-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e22707777052c833","pokemon":"Lanturn","location_id":"unbound-map-32-5","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7594804b8e66bd8c","pokemon":"Corsola","location_id":"unbound-map-32-5","method":"Cỏ","time":"Ngày và đêm","rate":"6%","level":"35–60","level_min":35,"level_max":60,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d53a860052d80337","pokemon":"Clamperl","location_id":"unbound-map-32-6","method":"Cỏ","time":"Ngày và đêm","rate":"50%","level":"35–50","level_min":35,"level_max":50,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0cb344717fdf3aac","pokemon":"Carvanha","location_id":"unbound-map-32-6","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-1b727d8397a40144","pokemon":"Sharpedo","location_id":"unbound-map-32-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-2343054544c2c894","pokemon":"Chinchou","location_id":"unbound-map-32-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–50","level_min":35,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-0375d255945cf3e3","pokemon":"Lanturn","location_id":"unbound-map-32-6","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–60","level_min":40,"level_max":60,"slot_count":1,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-49d6dfd6c6280b1c","pokemon":"Corsola","location_id":"unbound-map-32-6","method":"Cỏ","time":"Ngày và đêm","rate":"6%","level":"35–60","level_min":35,"level_max":60,"slot_count":3,"slot_total":12,"min_progress":"fallshore","requires":[],"notes_vi":"","verified":true},{"id":"ub-c4872e5cbafadde4","pokemon":"Zubat","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"8–10","level_min":8,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-2b8304d2eb8cc46d","pokemon":"Makuhita","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"8–10","level_min":8,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-f0b66d0a66391cd1","pokemon":"Spheal","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"8–10","level_min":8,"level_max":10,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ea4253c8e8cd53a","pokemon":"Smoochum","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"8–10","level_min":8,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-c431ca5534c8e6ef","pokemon":"Bergmite","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-29b9637225d25031","pokemon":"Roggenrola","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-df59c4b8d02e15a1","pokemon":"Swinub","location_id":"unbound-map-43-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-f4fbd666ac6dc666","pokemon":"Zubat","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"8–10","level_min":8,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-9b7a6681daec97a9","pokemon":"Makuhita","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"8–10","level_min":8,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-05a89c5c72673161","pokemon":"Spheal","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"8–10","level_min":8,"level_max":10,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-181ef7ab7ff01e06","pokemon":"Smoochum","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"8–10","level_min":8,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-e7f2d4a52b7cbc98","pokemon":"Bergmite","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-717b1162c1b0f6d5","pokemon":"Roggenrola","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-88991b1a451cae1a","pokemon":"Swinub","location_id":"unbound-map-43-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3d0d051e0fc1d96","pokemon":"Seel","location_id":"unbound-map-43-1","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-ccf95d3b412cc994","pokemon":"Spheal","location_id":"unbound-map-43-1","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-44dd9a1d56938a00","pokemon":"Dewgong","location_id":"unbound-map-43-1","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-fefb0fcf40ca4f19","pokemon":"Sealeo","location_id":"unbound-map-43-1","method":"Surf","time":"","rate":"4%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-c78539ced7ae442b","pokemon":"Lapras","location_id":"unbound-map-43-1","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-2646559d24111267","pokemon":"Roggenrola","location_id":"unbound-map-43-1","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-8400de8e0d08dade","pokemon":"Bergmite","location_id":"unbound-map-43-1","method":"Rock Smash","time":"","rate":"35%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3650f57b99dca5e","pokemon":"Boldore","location_id":"unbound-map-43-1","method":"Rock Smash","time":"","rate":"5%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f70e1b1aa89daa9","pokemon":"Magikarp","location_id":"unbound-map-43-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-897ddc574c3ca4a3","pokemon":"Seel","location_id":"unbound-map-43-1","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-7aef671ee5827562","pokemon":"Shellder","location_id":"unbound-map-43-1","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-1857104e724f56e2","pokemon":"Dewgong","location_id":"unbound-map-43-1","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-90f97fecf353a700","pokemon":"Shellder","location_id":"unbound-map-43-1","method":"Câu cá - Super Rod","time":"","rate":"59%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-356fe1697339978e","pokemon":"Cloyster","location_id":"unbound-map-43-1","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-b559b144fab3afd8","pokemon":"Zubat","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"8–10","level_min":8,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-ccb264d276141c0e","pokemon":"Makuhita","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"8–10","level_min":8,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-06493744b07f35cd","pokemon":"Spheal","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"8–10","level_min":8,"level_max":10,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-0a93552052a232a9","pokemon":"Smoochum","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"8–10","level_min":8,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-85d8ea8f5f1cf5c7","pokemon":"Bergmite","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-a8d3fb074b08d67c","pokemon":"Roggenrola","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-567a791b3b7e65f1","pokemon":"Swinub","location_id":"unbound-map-43-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-37a7ca8b7a29252b","pokemon":"Seel","location_id":"unbound-map-43-2","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-828f93db3b831db5","pokemon":"Spheal","location_id":"unbound-map-43-2","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-b9df298454f6c585","pokemon":"Dewgong","location_id":"unbound-map-43-2","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-c16bcdc383b0320d","pokemon":"Sealeo","location_id":"unbound-map-43-2","method":"Surf","time":"","rate":"4%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd0031fd9610817f","pokemon":"Lapras","location_id":"unbound-map-43-2","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-7d9d55cb951ca5dd","pokemon":"Roggenrola","location_id":"unbound-map-43-2","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-fa5d2f471b63612a","pokemon":"Bergmite","location_id":"unbound-map-43-2","method":"Rock Smash","time":"","rate":"35%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-a104ca288dbd65e3","pokemon":"Boldore","location_id":"unbound-map-43-2","method":"Rock Smash","time":"","rate":"5%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee3f02bdc27b85d6","pokemon":"Magikarp","location_id":"unbound-map-43-2","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-08f003a39ac65f09","pokemon":"Seel","location_id":"unbound-map-43-2","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-e2d465750b7fc9a5","pokemon":"Shellder","location_id":"unbound-map-43-2","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-8c6e2153002ade17","pokemon":"Dewgong","location_id":"unbound-map-43-2","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-f746570bd9b74a7f","pokemon":"Shellder","location_id":"unbound-map-43-2","method":"Câu cá - Super Rod","time":"","rate":"59%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-d820ed4e52f4f5b3","pokemon":"Cloyster","location_id":"unbound-map-43-2","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-58fc0072d637f99a","pokemon":"Zubat","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-8aefe99a21714455","pokemon":"Makuhita","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"9–11","level_min":9,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-a5fb2d887b161a41","pokemon":"Spheal","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"9–11","level_min":9,"level_max":11,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-8477b56b03a65835","pokemon":"Smoochum","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"9–11","level_min":9,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-53469ea6a8c00171","pokemon":"Bergmite","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"10–11","level_min":10,"level_max":11,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-1239d41885d31777","pokemon":"Roggenrola","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"10–11","level_min":10,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-15d5291466c85bc8","pokemon":"Swinub","location_id":"unbound-map-43-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"10–11","level_min":10,"level_max":11,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-46560dcb8a745fe9","pokemon":"Golbat","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-0156726d7413341c","pokemon":"Hariyama","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-54f7b74ddf71e503","pokemon":"Sealeo","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"37–40","level_min":37,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-2599c45022b5d0bb","pokemon":"Jynx","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-251947cd7039f7ca","pokemon":"Avalugg","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-8cf8418c125fd533","pokemon":"Boldore","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-4a7040639e4fc572","pokemon":"Piloswine","location_id":"unbound-map-43-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-bcd66f95e691565b","pokemon":"Boldore","location_id":"unbound-map-43-4","method":"Rock Smash","time":"","rate":"60%","level":"40–50","level_min":40,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-0b483a191854b51b","pokemon":"Avalugg","location_id":"unbound-map-43-4","method":"Rock Smash","time":"","rate":"39%","level":"40–50","level_min":40,"level_max":50,"slot_count":3,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-8892ab90618988e6","pokemon":"Shuckle","location_id":"unbound-map-43-4","method":"Rock Smash","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-896b8dd0851672a6","pokemon":"Zubat","location_id":"unbound-map-43-5","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"8–10","level_min":8,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-393dffe1ad2d8d4e","pokemon":"Roggenrola","location_id":"unbound-map-43-5","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"8–10","level_min":8,"level_max":10,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-e92f7d927ae047e0","pokemon":"Makuhita","location_id":"unbound-map-43-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"8–10","level_min":8,"level_max":10,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-a7eee4efd77167a2","pokemon":"Drilbur","location_id":"unbound-map-43-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-1736488726b4a3f1","pokemon":"Mawile","location_id":"unbound-map-43-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"9–10","level_min":9,"level_max":10,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-ff6d0205504d66fd","pokemon":"Boldore","location_id":"unbound-map-43-5","method":"Rock Smash","time":"","rate":"100%","level":"30–40","level_min":30,"level_max":40,"slot_count":5,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-327762d512b03f0b","pokemon":"Sandshrew A","location_id":"unbound-map-43-6","method":"Cỏ","time":"Ngày và đêm","rate":"100%","level":"8–12","level_min":8,"level_max":12,"slot_count":12,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-854c7c7bc4d66e6f","pokemon":"Golbat","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-baf9155c1f101522","pokemon":"Hariyama","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5327ed532087511","pokemon":"Sealeo","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"37–40","level_min":37,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-491c09c60b55939b","pokemon":"Jynx","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-833b9e4a5325808e","pokemon":"Avalugg","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-46e0717931a3f9fa","pokemon":"Boldore","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-e78a275db245231a","pokemon":"Piloswine","location_id":"unbound-map-43-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-af8ff52e51468ad9","pokemon":"Boldore","location_id":"unbound-map-43-7","method":"Rock Smash","time":"","rate":"60%","level":"30–40","level_min":30,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-f6b4f43747bfc94b","pokemon":"Bergmite","location_id":"unbound-map-43-7","method":"Rock Smash","time":"","rate":"35%","level":"30–40","level_min":30,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-2d5d299bce2c5d90","pokemon":"Avalugg","location_id":"unbound-map-43-7","method":"Rock Smash","time":"","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"start","requires":[],"notes_vi":"","verified":true},{"id":"ub-cebe5e2a0c2e9942","pokemon":"Caterpie","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"12–16","level_min":12,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-00e7b50066c7e123","pokemon":"Seedot","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"20%","level":"13–16","level_min":13,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-55eeee7fb2bada09","pokemon":"Pumpkaboo","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"13–16","level_min":13,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ba91a3eb316c1a64","pokemon":"Pumpkaboo (M)","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"13–16","level_min":13,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5752e8aef3bba935","pokemon":"Pumpkaboo (L)","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"13–16","level_min":13,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cdb33d87bedab51a","pokemon":"Pumpkaboo (Xl)","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"10%","level":"13–16","level_min":13,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a875e0069bfbada8","pokemon":"Gastly","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b8ef6a412e80b13a","pokemon":"Shuppet","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ec97cfb815d99e7","pokemon":"Duskull","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"14–16","level_min":14,"level_max":16,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-191b90f7fe99aa88","pokemon":"Phantump","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban ngày","rate":"5%","level":"14–16","level_min":14,"level_max":16,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5073caee708ad3a7","pokemon":"Weedle","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"13–16","level_min":13,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4806438ce0ffdb6f","pokemon":"Seedot","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"20%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-755bf967f423c647","pokemon":"Pumpkaboo","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-167929ad2d2c6098","pokemon":"Pumpkaboo (M)","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7fee712d5759eeef","pokemon":"Pumpkaboo (L)","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-978e12366003fb75","pokemon":"Pumpkaboo (Xl)","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"10%","level":"14–16","level_min":14,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5e8f745e3d7edce8","pokemon":"Gastly","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"15–16","level_min":15,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-faf9ab460968b00f","pokemon":"Shuppet","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"15–16","level_min":15,"level_max":16,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-346bff9da398e3db","pokemon":"Duskull","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"15–16","level_min":15,"level_max":16,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-64683cb549ae7b70","pokemon":"Phantump","location_id":"unbound-map-45-1","method":"Cỏ","time":"Ban đêm","rate":"5%","level":"15–16","level_min":15,"level_max":16,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-bda412c10e173ceb","pokemon":"Psyduck","location_id":"unbound-map-45-1","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9a12f469ece690ea","pokemon":"Masquerain","location_id":"unbound-map-45-1","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ae169c89d5d750c","pokemon":"Golduck","location_id":"unbound-map-45-1","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c95389b27ad85490","pokemon":"Surskit","location_id":"unbound-map-45-1","method":"Surf","time":"","rate":"5%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-77290563a715d766","pokemon":"Magikarp","location_id":"unbound-map-45-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b4bc5a1722f41a07","pokemon":"Psyduck","location_id":"unbound-map-45-1","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f7ae4ab86226f64","pokemon":"Barboach","location_id":"unbound-map-45-1","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6cc05d740179cdee","pokemon":"Golduck","location_id":"unbound-map-45-1","method":"Câu cá - Super Rod","time":"","rate":"80%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-054101ff87e5c965","pokemon":"Whiscash","location_id":"unbound-map-45-1","method":"Câu cá - Super Rod","time":"","rate":"20%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c00af56efb3c5db7","pokemon":"Woobat","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-eb30f2ee679d2eb9","pokemon":"Slugma","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9ec704f40e3e788f","pokemon":"Salandit","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-90c4515a032f7bd4","pokemon":"Numel","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-90a41ea83155c983","pokemon":"Geodude","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-378f22aa8f7007f0","pokemon":"Drilbur","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b1a2a6dd9e0413ab","pokemon":"Torkoal","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f7c3f683a1f4f168","pokemon":"Magby","location_id":"unbound-map-45-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-371b4f0afa3d2dfd","pokemon":"Slugma","location_id":"unbound-map-45-3","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5008e40d2db3f1b","pokemon":"Magcargo","location_id":"unbound-map-45-3","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-47901f6de8ba6d08","pokemon":"Geodude","location_id":"unbound-map-45-3","method":"Rock Smash","time":"","rate":"90%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b66b68e3c0598510","pokemon":"Graveler","location_id":"unbound-map-45-3","method":"Rock Smash","time":"","rate":"9%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8121d29ae1ec4440","pokemon":"Shuckle","location_id":"unbound-map-45-3","method":"Rock Smash","time":"","rate":"1%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-67d1ed62362d7a63","pokemon":"Woobat","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7ce1ad7823e6dd8b","pokemon":"Slugma","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-bf84ea6ea43cbd24","pokemon":"Salandit","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7594295c87ef1b8b","pokemon":"Numel","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-79687fd8a51841f6","pokemon":"Geodude","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-beb31add114a5e37","pokemon":"Drilbur","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cc10bdd174043783","pokemon":"Torkoal","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-63e917d312d0d5b5","pokemon":"Magby","location_id":"unbound-map-45-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-0eec53d9e14dc447","pokemon":"Slugma","location_id":"unbound-map-45-4","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3d4c9856842f71b7","pokemon":"Magcargo","location_id":"unbound-map-45-4","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f8be6874261cfa26","pokemon":"Geodude","location_id":"unbound-map-45-4","method":"Rock Smash","time":"","rate":"90%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e4afa8f1d0d058d7","pokemon":"Graveler","location_id":"unbound-map-45-4","method":"Rock Smash","time":"","rate":"9%","level":"25–30","level_min":25,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-048ec4a15cf9cd35","pokemon":"Shuckle","location_id":"unbound-map-45-4","method":"Rock Smash","time":"","rate":"1%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-104df124f76b87b3","pokemon":"Woobat","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-93d180a596a299ec","pokemon":"Slugma","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d0932942922326da","pokemon":"Salandit","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"15–17","level_min":15,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-aa23d53131785ed8","pokemon":"Numel","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6d7883c41fd01f8a","pokemon":"Geodude","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15–17","level_min":15,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f64623e7f3d1b912","pokemon":"Drilbur","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b0ccd7015b492430","pokemon":"Torkoal","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5c159b0c43264b9c","pokemon":"Magby","location_id":"unbound-map-45-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"16–17","level_min":16,"level_max":17,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a613391767a176bb","pokemon":"Slugma","location_id":"unbound-map-45-5","method":"Surf","time":"","rate":"95%","level":"35–40","level_min":35,"level_max":40,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0ae89ade2fa68f19","pokemon":"Magcargo","location_id":"unbound-map-45-5","method":"Surf","time":"","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c1dd328ce10061e7","pokemon":"Zubat","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"18–21","level_min":18,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0d3e6a27d81767ff","pokemon":"Woobat","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"18–21","level_min":18,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9918ffa1d77c9a65","pokemon":"Makuhita","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"18–21","level_min":18,"level_max":21,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a1e3d9bbaf787d9f","pokemon":"Aron","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"19–21","level_min":19,"level_max":21,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-714efa55c52b2c55","pokemon":"Nosepass","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"19–21","level_min":19,"level_max":21,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-31c41691be8c75e5","pokemon":"Geodude","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"19–21","level_min":19,"level_max":21,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-28aada648f3c6e9e","pokemon":"Noibat","location_id":"unbound-map-46-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"20–21","level_min":20,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-1e754283dda34f13","pokemon":"Geodude","location_id":"unbound-map-46-0","method":"Rock Smash","time":"","rate":"70%","level":"20–30","level_min":20,"level_max":30,"slot_count":4,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-646b2903bbe5df99","pokemon":"Nosepass","location_id":"unbound-map-46-0","method":"Rock Smash","time":"","rate":"30%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-38b7e1d173945daa","pokemon":"Zubat","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"17–20","level_min":17,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e8950f3fdb88d462","pokemon":"Woobat","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"17–20","level_min":17,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-abcd710f3e4aae37","pokemon":"Makuhita","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"17–20","level_min":17,"level_max":20,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-25ab89f4cdf81fca","pokemon":"Aron","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-cfcdb36aa0b2e68b","pokemon":"Nosepass","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d4c0ee7c93f6f619","pokemon":"Geodude","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-eea743aef2c2e10f","pokemon":"Noibat","location_id":"unbound-map-46-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"19–20","level_min":19,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-16aa36a36d37fe88","pokemon":"Zubat","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"17–20","level_min":17,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c77cb3831096fec8","pokemon":"Woobat","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"17–20","level_min":17,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-fa53e49dc4f31e10","pokemon":"Makuhita","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"17–20","level_min":17,"level_max":20,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-99f4dc68e0340f7a","pokemon":"Aron","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-630d09088f534f62","pokemon":"Nosepass","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-243ae3aa6499043c","pokemon":"Geodude","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d8fc826f35a090b3","pokemon":"Noibat","location_id":"unbound-map-46-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"19–20","level_min":19,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0d75f9b8435fcd27","pokemon":"Zubat","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"17–20","level_min":17,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c3e660a709180ae1","pokemon":"Woobat","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"17–20","level_min":17,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6fe85150d32bc597","pokemon":"Makuhita","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"17–20","level_min":17,"level_max":20,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6b43d9f5b9e0d0f1","pokemon":"Aron","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-60c30ac236fe8769","pokemon":"Nosepass","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9bf5b1f8495fbafd","pokemon":"Geodude","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"18–20","level_min":18,"level_max":20,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-28543bd80b5974cc","pokemon":"Noibat","location_id":"unbound-map-46-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"19–20","level_min":19,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ba15fabe80673d9e","pokemon":"Zubat","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"25–28","level_min":25,"level_max":28,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7edb1a74eb18c66f","pokemon":"Woobat","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"25–28","level_min":25,"level_max":28,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d4c30d0958beb8ba","pokemon":"Makuhita","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"25–28","level_min":25,"level_max":28,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8a91d2c7d15a7d59","pokemon":"Aron","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–28","level_min":26,"level_max":28,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3b9f3ad39717ec37","pokemon":"Nosepass","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–28","level_min":26,"level_max":28,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ae59f0172e2a1cad","pokemon":"Geodude","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–28","level_min":26,"level_max":28,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a2db18f2dd5284d7","pokemon":"Noibat","location_id":"unbound-map-46-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"26–28","level_min":26,"level_max":28,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b05f5e21ec565b21","pokemon":"Geodude","location_id":"unbound-map-46-4","method":"Rock Smash","time":"","rate":"70%","level":"20–30","level_min":20,"level_max":30,"slot_count":4,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-04a774d0f82301a2","pokemon":"Nosepass","location_id":"unbound-map-46-4","method":"Rock Smash","time":"","rate":"30%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ca959b3286f8c65f","pokemon":"Zubat","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"25–28","level_min":25,"level_max":28,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-aac6a614d130f822","pokemon":"Woobat","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"25–28","level_min":25,"level_max":28,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-825ea88c92de3b2a","pokemon":"Makuhita","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"25–28","level_min":25,"level_max":28,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3dd3e94c45728d6a","pokemon":"Aron","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–28","level_min":26,"level_max":28,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-22d762147869bc8c","pokemon":"Nosepass","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–28","level_min":26,"level_max":28,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7c40530c878bcd8b","pokemon":"Geodude","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–28","level_min":26,"level_max":28,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4971710efcb42f32","pokemon":"Noibat","location_id":"unbound-map-46-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"26–28","level_min":26,"level_max":28,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-bc992634b5b69b5f","pokemon":"Golbat","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d7843290691d7b71","pokemon":"Woobat","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"34–37","level_min":34,"level_max":37,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ab9f9d5929c9d048","pokemon":"Hariyama","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"16%","level":"34–37","level_min":34,"level_max":37,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-64e2459986ac9855","pokemon":"Lairon","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-fa1945d8b8400dba","pokemon":"Nosepass","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-24c8ea815fddb078","pokemon":"Graveler","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"35–37","level_min":35,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4b2d08e13a9a5e95","pokemon":"Noibat","location_id":"unbound-map-46-6","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"36–37","level_min":36,"level_max":37,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e1a4291ea5e14aa8","pokemon":"Golbat","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"38–41","level_min":38,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-303fe82c5ecf97a7","pokemon":"Woobat","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"38–41","level_min":38,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6c033993e75b2692","pokemon":"Hariyama","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"16%","level":"38–41","level_min":38,"level_max":41,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b1f942477813a958","pokemon":"Lairon","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-928ef2d706fa0dd4","pokemon":"Nosepass","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-753ce24a3fb384ec","pokemon":"Graveler","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-182c0ad05d86998f","pokemon":"Noibat","location_id":"unbound-map-46-7","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–41","level_min":40,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ff26a6d177506e8d","pokemon":"Golbat","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"38–41","level_min":38,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f35c6205c9fa49cd","pokemon":"Woobat","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"38–41","level_min":38,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-bcc66ca869940e49","pokemon":"Hariyama","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"16%","level":"38–41","level_min":38,"level_max":41,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-2c6349c9942e469e","pokemon":"Lairon","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d99cd489f515419b","pokemon":"Nosepass","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8b0628361ff677b2","pokemon":"Graveler","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-50662b2d21ff68eb","pokemon":"Noibat","location_id":"unbound-map-46-8","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–41","level_min":40,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5c99f0ac488095ab","pokemon":"Golbat","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"38–41","level_min":38,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-96354bb5e5216239","pokemon":"Woobat","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"38–41","level_min":38,"level_max":41,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c41cdd88c26d09ba","pokemon":"Hariyama","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"16%","level":"38–41","level_min":38,"level_max":41,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7d601f3e096a1f2d","pokemon":"Lairon","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9382c84cb56f44b3","pokemon":"Nosepass","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-29a130b4bc76e261","pokemon":"Graveler","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"39–41","level_min":39,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-878b5d055d043e9a","pokemon":"Noibat","location_id":"unbound-map-46-9","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"40–41","level_min":40,"level_max":41,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-bc87ee0998689b60","pokemon":"Geodude","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"46","level_min":46,"level_max":46,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-45df868f3fc3f730","pokemon":"Phanpy","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"15","level_min":15,"level_max":15,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5a58c40baa004e38","pokemon":"Cubone","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"46","level_min":46,"level_max":46,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4d98c82d4b1b2676","pokemon":"Fearow","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4f0ac01549eb4f5b","pokemon":"Marowak","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"52","level_min":52,"level_max":52,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-82b5aca530e0e162","pokemon":"Meowth","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"43","level_min":43,"level_max":43,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-19a6dd23dc7a0bd2","pokemon":"Onix","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"54","level_min":54,"level_max":54,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6f4c4131d2d1dbad","pokemon":"Skarmory","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"30","level_min":30,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-35525e64e8671081","pokemon":"Larvitar","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"15–20","level_min":15,"level_max":20,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f057e10ec11c45e1","pokemon":"Persian","location_id":"unbound-map-46-10","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–52","level_min":49,"level_max":52,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8c39b61effd5bcc5","pokemon":"Woobat","location_id":"unbound-map-47-0","method":"Cỏ","time":"Ngày và đêm","rate":"35%","level":"19–21","level_min":19,"level_max":21,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-104c579a7346554e","pokemon":"Phanpy","location_id":"unbound-map-47-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"19–21","level_min":19,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-97944fbf918df997","pokemon":"Nosepass","location_id":"unbound-map-47-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"19–21","level_min":19,"level_max":21,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e652e1dfe952b66e","pokemon":"Aron","location_id":"unbound-map-47-0","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"19–21","level_min":19,"level_max":21,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-33f6f5a0f3c5ad83","pokemon":"Woobat","location_id":"unbound-map-47-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"19–21","level_min":19,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-ec87d970b92a85b1","pokemon":"Phanpy","location_id":"unbound-map-47-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"19–21","level_min":19,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-800c2256d02b5f86","pokemon":"Nosepass","location_id":"unbound-map-47-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"19–21","level_min":19,"level_max":21,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-df81f471804ea499","pokemon":"Aron","location_id":"unbound-map-47-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"19–21","level_min":19,"level_max":21,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-cfd43dc439718f37","pokemon":"Noibat","location_id":"unbound-map-47-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"20–21","level_min":20,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f6db5ecc6358d75e","pokemon":"Gligar","location_id":"unbound-map-47-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"20–21","level_min":20,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9e1291ef9854877a","pokemon":"Finneon","location_id":"unbound-map-47-1","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-20cb63f1a088c2c9","pokemon":"Woobat","location_id":"unbound-map-47-1","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9fa189c9303381ea","pokemon":"Psyduck","location_id":"unbound-map-47-1","method":"Surf","time":"","rate":"6%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-71f01fda96d3bed6","pokemon":"Golduck","location_id":"unbound-map-47-1","method":"Surf","time":"","rate":"4%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5532c5a3e3d1b83a","pokemon":"Geodude","location_id":"unbound-map-47-1","method":"Rock Smash","time":"","rate":"70%","level":"20–30","level_min":20,"level_max":30,"slot_count":4,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9d19cd1d47bbe7e3","pokemon":"Nosepass","location_id":"unbound-map-47-1","method":"Rock Smash","time":"","rate":"30%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a1153174d5f090e4","pokemon":"Magikarp","location_id":"unbound-map-47-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-e2aad4f5cca83d50","pokemon":"Finneon","location_id":"unbound-map-47-1","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-20d52439e8d127d5","pokemon":"Psyduck","location_id":"unbound-map-47-1","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1d0c3d601ac6900f","pokemon":"Lumineon","location_id":"unbound-map-47-1","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5195529ab728d8f","pokemon":"Golduck","location_id":"unbound-map-47-1","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b9b0b67e2e25b1e9","pokemon":"Gyarados","location_id":"unbound-map-47-1","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-45ff4b89b5861c0b","pokemon":"Woobat","location_id":"unbound-map-47-2","method":"Cỏ","time":"Ngày và đêm","rate":"35%","level":"19–21","level_min":19,"level_max":21,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5d887a716ee58b71","pokemon":"Phanpy","location_id":"unbound-map-47-2","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"19–21","level_min":19,"level_max":21,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b6604d0102f5bef1","pokemon":"Nosepass","location_id":"unbound-map-47-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"19–21","level_min":19,"level_max":21,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8e1c08282e984cdc","pokemon":"Aron","location_id":"unbound-map-47-2","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"19–21","level_min":19,"level_max":21,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8bb2a86bfafce25e","pokemon":"Woobat","location_id":"unbound-map-47-3","method":"Cỏ","time":"Ngày và đêm","rate":"35%","level":"20–22","level_min":20,"level_max":22,"slot_count":4,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8d40c255191a86a6","pokemon":"Phanpy","location_id":"unbound-map-47-3","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"20–22","level_min":20,"level_max":22,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a0ff71e4b4df44d3","pokemon":"Nosepass","location_id":"unbound-map-47-3","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"20–22","level_min":20,"level_max":22,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4c58abc9d35f5277","pokemon":"Aron","location_id":"unbound-map-47-3","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"20–22","level_min":20,"level_max":22,"slot_count":3,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-c8a6be6b298722a0","pokemon":"Roggenrola","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2ab3df3707376975","pokemon":"Woobat","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-eaa044ab39f65b4a","pokemon":"Aron","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8179cf4ddbc13c70","pokemon":"Bronzor","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b9d35cf5342fcf98","pokemon":"Nosepass","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5dd6ec4fc25d5276","pokemon":"Sneasel","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"22–25","level_min":22,"level_max":25,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f649504331e7666b","pokemon":"Onix","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-a8994ebecc7f7f88","pokemon":"Cryogonal","location_id":"unbound-map-48-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"22–25","level_min":22,"level_max":25,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-b2b22cab4aba8a50","pokemon":"Roggenrola","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7af0de813eb23d60","pokemon":"Woobat","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-42728f2bc8738823","pokemon":"Aron","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-14118deccf17fdb3","pokemon":"Bronzor","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6885956faf5c62b3","pokemon":"Nosepass","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-396c9b44ed9c3d0b","pokemon":"Sneasel","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-14cbc8cf69ed682c","pokemon":"Onix","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-985d20de67ffe94f","pokemon":"Cryogonal","location_id":"unbound-map-50-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-56a9f5a5db018d48","pokemon":"Seel","location_id":"unbound-map-50-0","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f6f6632d0c1d5c5f","pokemon":"Spheal","location_id":"unbound-map-50-0","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-75c51c8337bcf885","pokemon":"Dewgong","location_id":"unbound-map-50-0","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3af92d0126334fdf","pokemon":"Sealeo","location_id":"unbound-map-50-0","method":"Surf","time":"","rate":"4%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-d8d4e872c8979c8e","pokemon":"Lapras","location_id":"unbound-map-50-0","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-954423d8ac59bbe1","pokemon":"Magikarp","location_id":"unbound-map-50-0","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6df97e43dafb7feb","pokemon":"Seel","location_id":"unbound-map-50-0","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5515f70703d7e4f6","pokemon":"Shellder","location_id":"unbound-map-50-0","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6024074575c1ec43","pokemon":"Dewgong","location_id":"unbound-map-50-0","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-144fa5f7ec158699","pokemon":"Shellder","location_id":"unbound-map-50-0","method":"Câu cá - Super Rod","time":"","rate":"59%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-bdab37440d6ba8db","pokemon":"Cloyster","location_id":"unbound-map-50-0","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-f4e7fe647632cdb5","pokemon":"Roggenrola","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-bbc38d55c75e51c9","pokemon":"Woobat","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9fd0f36f5b60dba8","pokemon":"Aron","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-2e4e3df3f8e1f90b","pokemon":"Bronzor","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-999633249dd3addc","pokemon":"Nosepass","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-35aaea5a61ad309e","pokemon":"Sneasel","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"21–24","level_min":21,"level_max":24,"slot_count":1,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-997b927fbc34c61b","pokemon":"Onix","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-1610220ecdcdb3a7","pokemon":"Cryogonal","location_id":"unbound-map-50-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"21–24","level_min":21,"level_max":24,"slot_count":2,"slot_total":12,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-49a17ee74087b675","pokemon":"Seel","location_id":"unbound-map-50-1","method":"Surf","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-12df1a654f057094","pokemon":"Spheal","location_id":"unbound-map-50-1","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8333ad7b935aad73","pokemon":"Dewgong","location_id":"unbound-map-50-1","method":"Surf","time":"","rate":"5%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-8aa009b2c99243bc","pokemon":"Sealeo","location_id":"unbound-map-50-1","method":"Surf","time":"","rate":"4%","level":"38–40","level_min":38,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-3c5b75eaa7d29bdc","pokemon":"Lapras","location_id":"unbound-map-50-1","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-5f48e521c9f3c9a4","pokemon":"Magikarp","location_id":"unbound-map-50-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-506ab879eff12f76","pokemon":"Seel","location_id":"unbound-map-50-1","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-9afcce5de95784e3","pokemon":"Shellder","location_id":"unbound-map-50-1","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-4aafbf138002f180","pokemon":"Dewgong","location_id":"unbound-map-50-1","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-006f03e82dcd95f3","pokemon":"Shellder","location_id":"unbound-map-50-1","method":"Câu cá - Super Rod","time":"","rate":"59%","level":"45–50","level_min":45,"level_max":50,"slot_count":3,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-6c6d9efa7754f288","pokemon":"Cloyster","location_id":"unbound-map-50-1","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"dresco","requires":[],"notes_vi":"","verified":true},{"id":"ub-7330a887f83dd60b","pokemon":"Golbat","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ec329e9975941bf6","pokemon":"Geodude A","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c64a827bb932a07f","pokemon":"Machop","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7f8957e037c38259","pokemon":"Onix","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"26–29","level_min":26,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c3fa9616418e19ae","pokemon":"Wooper","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1edf5ea1d73c0005","pokemon":"Misdreavus","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef8ee1e3aadb8569","pokemon":"Quagsire","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cf9ee62e818379b0","pokemon":"Graveler A","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"26–29","level_min":26,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f61580598edc32dd","pokemon":"Machoke","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"28–29","level_min":28,"level_max":29,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f7f3616a81cf8ff3","pokemon":"Steelix","location_id":"unbound-map-52-0","method":"Cỏ","time":"Ngày và đêm","rate":"2%","level":"29","level_min":29,"level_max":29,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef3d16e758269000","pokemon":"Golbat","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-502fcbac2910d079","pokemon":"Geodude A","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f7b26271410c75cd","pokemon":"Machop","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-79305296481af8a9","pokemon":"Onix","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"29–32","level_min":29,"level_max":32,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-eb327784e8349591","pokemon":"Wooper","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6b7d1564e0b61470","pokemon":"Misdreavus","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ab1d8d1fdcc2a55e","pokemon":"Quagsire","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bf5ad3e7fb9a9e9d","pokemon":"Graveler A","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f430da9c94438006","pokemon":"Machoke","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2e43bf1efd2a53e4","pokemon":"Steelix","location_id":"unbound-map-52-1","method":"Cỏ","time":"Ngày và đêm","rate":"2%","level":"32","level_min":32,"level_max":32,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9e8b5f4599cd2f13","pokemon":"Golbat","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ae4f1cb39ad01f4b","pokemon":"Geodude A","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f4bb9efeac169652","pokemon":"Machop","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-31efe22416adf685","pokemon":"Onix","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"29–32","level_min":29,"level_max":32,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-334d77e4b6473c1b","pokemon":"Wooper","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4247a2ea87029714","pokemon":"Misdreavus","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-21fa7433464e3056","pokemon":"Quagsire","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-49fc5fb033e4c972","pokemon":"Graveler A","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-329396157b5716ae","pokemon":"Machoke","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"4%","level":"29–32","level_min":29,"level_max":32,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8714de347c8db1c7","pokemon":"Steelix","location_id":"unbound-map-52-2","method":"Cỏ","time":"Ngày và đêm","rate":"2%","level":"29–32","level_min":29,"level_max":32,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7f0670359804d930","pokemon":"Nosepass","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d81558d5217d2c45","pokemon":"Magnemite","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e2d8ab0e918e926b","pokemon":"Cubone","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-81dd95150bd89a85","pokemon":"Klink","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"27–30","level_min":27,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9ec758a27aa14750","pokemon":"Elekid","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bae6d301c4282a65","pokemon":"Tynamo","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"27–30","level_min":27,"level_max":30,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-166e9f0959e76275","pokemon":"Magneton","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"30","level_min":30,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-def316cbb713e5f8","pokemon":"Electabuzz","location_id":"unbound-map-53-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"30","level_min":30,"level_max":30,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-34352badc4a2d9bc","pokemon":"Stunfisk","location_id":"unbound-map-53-1","method":"Surf","time":"","rate":"64%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad6adea16f665e0e","pokemon":"Chinchou","location_id":"unbound-map-53-1","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-42762421f06a4f56","pokemon":"Tynamo","location_id":"unbound-map-53-1","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7e0c5ae75c8d2124","pokemon":"Lanturn","location_id":"unbound-map-53-1","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e4578581191950fc","pokemon":"Magikarp","location_id":"unbound-map-53-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4d2537f26b197315","pokemon":"Chinchou","location_id":"unbound-map-53-1","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-efa35178074aed33","pokemon":"Lanturn","location_id":"unbound-map-53-1","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-35483c1dfe88f2e0","pokemon":"Nosepass","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb5a884d92eb5b27","pokemon":"Magnemite","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a23d8e77b71571e7","pokemon":"Timburr","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8be78a492a703ed9","pokemon":"Klink","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a793dccca854d088","pokemon":"Elekid","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a1d9b9b922873e1f","pokemon":"Tynamo","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a75069e5465b9ea","pokemon":"Magneton","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5e20f5259118b181","pokemon":"Electabuzz","location_id":"unbound-map-53-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3e68ff40707b2859","pokemon":"Stunfisk","location_id":"unbound-map-53-2","method":"Surf","time":"","rate":"64%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-57e6af3be961e125","pokemon":"Chinchou","location_id":"unbound-map-53-2","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-18326257567d300c","pokemon":"Tynamo","location_id":"unbound-map-53-2","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f77f372df121c5da","pokemon":"Lanturn","location_id":"unbound-map-53-2","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a6fa9b0b1fcebe46","pokemon":"Geodude A","location_id":"unbound-map-53-2","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aa8baf97f5600013","pokemon":"Graveler A","location_id":"unbound-map-53-2","method":"Rock Smash","time":"","rate":"30%","level":"25–30","level_min":25,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-94556f8e9467191f","pokemon":"Nosepass","location_id":"unbound-map-53-2","method":"Rock Smash","time":"","rate":"9%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-46b90a7fdedecbd3","pokemon":"Shuckle","location_id":"unbound-map-53-2","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-697c8884fe1fcd13","pokemon":"Magikarp","location_id":"unbound-map-53-2","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-012c477df1c082db","pokemon":"Chinchou","location_id":"unbound-map-53-2","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-770a37bf6aa2f4fb","pokemon":"Lanturn","location_id":"unbound-map-53-2","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd608b0996439c18","pokemon":"Nosepass","location_id":"unbound-map-53-3","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"47–50","level_min":47,"level_max":50,"slot_count":5,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-464bfcbed4717fae","pokemon":"Magneton","location_id":"unbound-map-53-3","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f349f69d32d6e1ca","pokemon":"Marowak","location_id":"unbound-map-53-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f3dfbc80469871a7","pokemon":"Klang","location_id":"unbound-map-53-3","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"47–50","level_min":47,"level_max":50,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-81aca6da8c0c327f","pokemon":"Electabuzz","location_id":"unbound-map-53-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb45477e0ff714f3","pokemon":"Eelektrik","location_id":"unbound-map-53-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"47–50","level_min":47,"level_max":50,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-89a1c4bfdc76d21b","pokemon":"Stunfisk","location_id":"unbound-map-53-3","method":"Surf","time":"","rate":"64%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-59a0baca7cbab9aa","pokemon":"Lanturn","location_id":"unbound-map-53-3","method":"Surf","time":"","rate":"30%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-28b4e0afa41a9313","pokemon":"Tynamo","location_id":"unbound-map-53-3","method":"Surf","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5915713e0f7edcdb","pokemon":"Eelektrik","location_id":"unbound-map-53-3","method":"Surf","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-78d41971e218fa75","pokemon":"Graveler A","location_id":"unbound-map-53-3","method":"Rock Smash","time":"","rate":"90%","level":"40–50","level_min":40,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f05522f838e4890a","pokemon":"Nosepass","location_id":"unbound-map-53-3","method":"Rock Smash","time":"","rate":"9%","level":"40–50","level_min":40,"level_max":50,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-710a560221717239","pokemon":"Shuckle","location_id":"unbound-map-53-3","method":"Rock Smash","time":"","rate":"1%","level":"50","level_min":50,"level_max":50,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-612697e101d96348","pokemon":"Magikarp","location_id":"unbound-map-53-3","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f816967d5d84e96c","pokemon":"Chinchou","location_id":"unbound-map-53-3","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5a57081cc416c642","pokemon":"Lanturn","location_id":"unbound-map-53-3","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3c91d1ae253889cc","pokemon":"Nosepass","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5863ed6589d9e8cc","pokemon":"Magnemite","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5978ba63ca6c9efc","pokemon":"Cubone","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7b99ee9063f9aeed","pokemon":"Klink","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-46d1109c27c8cc6e","pokemon":"Elekid","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-383c77ba6d255c42","pokemon":"Tynamo","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1fa958b0380c5be7","pokemon":"Magneton","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3270224a41af7dee","pokemon":"Electabuzz","location_id":"unbound-map-53-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dfcf9ca5f8ef5672","pokemon":"Stunfisk","location_id":"unbound-map-53-4","method":"Surf","time":"","rate":"64%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-595a2af28f9c2e51","pokemon":"Chinchou","location_id":"unbound-map-53-4","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c4dbf6ffb86bbc05","pokemon":"Tynamo","location_id":"unbound-map-53-4","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-064342984f4b1e6f","pokemon":"Lanturn","location_id":"unbound-map-53-4","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ade3ae906e491bab","pokemon":"Geodude A","location_id":"unbound-map-53-4","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dbc9d5845b2c4deb","pokemon":"Graveler A","location_id":"unbound-map-53-4","method":"Rock Smash","time":"","rate":"30%","level":"25–30","level_min":25,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d0d408f80e89a75c","pokemon":"Nosepass","location_id":"unbound-map-53-4","method":"Rock Smash","time":"","rate":"9%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-122faed6a0e326bb","pokemon":"Shuckle","location_id":"unbound-map-53-4","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bff1b3be95cc2554","pokemon":"Magikarp","location_id":"unbound-map-53-4","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-20b6a91579cbba68","pokemon":"Chinchou","location_id":"unbound-map-53-4","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5ddcb5c747f461b8","pokemon":"Lanturn","location_id":"unbound-map-53-4","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-20e956300e5a68c7","pokemon":"Nosepass","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-39f9391422884ed7","pokemon":"Magnemite","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5343a6f13956bcdb","pokemon":"Cubone","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0c19cdd04592b3c4","pokemon":"Klink","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-765e0393ca88c3b7","pokemon":"Elekid","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb0df42b92343103","pokemon":"Tynamo","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d793d83f7bbf59ac","pokemon":"Magneton","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-628d2a92e61404a6","pokemon":"Electabuzz","location_id":"unbound-map-53-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f7030e90ae325c5","pokemon":"Stunfisk","location_id":"unbound-map-53-5","method":"Surf","time":"","rate":"64%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-86c824c7a6586b12","pokemon":"Chinchou","location_id":"unbound-map-53-5","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6bbf41a0859f8a1b","pokemon":"Tynamo","location_id":"unbound-map-53-5","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2ab4b1cd611e5ac8","pokemon":"Lanturn","location_id":"unbound-map-53-5","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bbefa23e3bdfbf38","pokemon":"Geodude A","location_id":"unbound-map-53-5","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1c80bbbffbc8985c","pokemon":"Graveler A","location_id":"unbound-map-53-5","method":"Rock Smash","time":"","rate":"30%","level":"25–30","level_min":25,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-965c28eabef042b4","pokemon":"Nosepass","location_id":"unbound-map-53-5","method":"Rock Smash","time":"","rate":"9%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-413e0dc3a19684f9","pokemon":"Shuckle","location_id":"unbound-map-53-5","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0a0c92cbf5a3d7ce","pokemon":"Magikarp","location_id":"unbound-map-53-5","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f7cb9eab8211da75","pokemon":"Chinchou","location_id":"unbound-map-53-5","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a6ad35b884b418ef","pokemon":"Lanturn","location_id":"unbound-map-53-5","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8bf84e40331d405b","pokemon":"Nosepass","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0232f1dd2f5459cc","pokemon":"Magnemite","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3153600afc5afd1f","pokemon":"Cubone","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e1564212e62155af","pokemon":"Klink","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-aaba849a2a5e395a","pokemon":"Elekid","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-49aef094de16a6fe","pokemon":"Tynamo","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d9869b7e014b9bfa","pokemon":"Magneton","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b0bff1e6a39be11c","pokemon":"Electabuzz","location_id":"unbound-map-53-6","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9d832c4e725907ec","pokemon":"Stunfisk","location_id":"unbound-map-53-6","method":"Surf","time":"","rate":"64%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7b43ab48294bfd3c","pokemon":"Chinchou","location_id":"unbound-map-53-6","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cbed8101058ff8fd","pokemon":"Tynamo","location_id":"unbound-map-53-6","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b6fa990d761784e1","pokemon":"Lanturn","location_id":"unbound-map-53-6","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4271859643925793","pokemon":"Magikarp","location_id":"unbound-map-53-6","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-64b16e2bd41df10a","pokemon":"Chinchou","location_id":"unbound-map-53-6","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5aee3082842f69a5","pokemon":"Lanturn","location_id":"unbound-map-53-6","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-de503962534b10cd","pokemon":"Nosepass","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7d81657f14b4d923","pokemon":"Magneton","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c2168d39d0dc70c5","pokemon":"Gurdurr","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"37–40","level_min":37,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-3ead7285e5ea55f3","pokemon":"Klink","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"37–40","level_min":37,"level_max":40,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-04ebccb2bc39a7c1","pokemon":"Electabuzz","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d62b13e4626a936d","pokemon":"Tynamo","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"37–40","level_min":37,"level_max":40,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a8a9db6383908f58","pokemon":"Klang","location_id":"unbound-map-53-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"40","level_min":40,"level_max":40,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-acf2cafe6e1e70e3","pokemon":"Graveler A","location_id":"unbound-map-53-7","method":"Rock Smash","time":"","rate":"60%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-add41ecfdf8edd08","pokemon":"Shuckle","location_id":"unbound-map-53-7","method":"Rock Smash","time":"","rate":"40%","level":"35–40","level_min":35,"level_max":40,"slot_count":4,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4b5edfee89b76535","pokemon":"Nosepass","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8422873710e81ef9","pokemon":"Magnemite","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-5cafaf6e9b157eda","pokemon":"Timburr","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4e23c0e232e3cc8f","pokemon":"Klink","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e6548e4397e83023","pokemon":"Elekid","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-53eac6ae720793a9","pokemon":"Tynamo","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-abd09a1586f7e3f8","pokemon":"Magneton","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a1e5e2ac3d923760","pokemon":"Electabuzz","location_id":"unbound-map-53-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-71329a39b74951af","pokemon":"Nosepass","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e15a0248975254cc","pokemon":"Magnemite","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-91d4d7d7a5e6da41","pokemon":"Timburr","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4f584f688e0ee16b","pokemon":"Klink","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bf0f0eb8ef718e27","pokemon":"Elekid","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-54664af03df3d845","pokemon":"Tynamo","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-92dd052f5040ba81","pokemon":"Magneton","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-44a78e6ef78d8fbc","pokemon":"Electabuzz","location_id":"unbound-map-53-9","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a052aa3bda5577c4","pokemon":"Stunfisk","location_id":"unbound-map-53-9","method":"Surf","time":"","rate":"64%","level":"35–40","level_min":35,"level_max":40,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-47739f92f62fe6e0","pokemon":"Chinchou","location_id":"unbound-map-53-9","method":"Surf","time":"","rate":"30%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-38f9eb95ca87df0b","pokemon":"Tynamo","location_id":"unbound-map-53-9","method":"Surf","time":"","rate":"5%","level":"35–40","level_min":35,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c79d94e3d67524ef","pokemon":"Lanturn","location_id":"unbound-map-53-9","method":"Surf","time":"","rate":"1%","level":"40","level_min":40,"level_max":40,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-408fa329089ad65c","pokemon":"Geodude A","location_id":"unbound-map-53-9","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f5ec5d1c0832bc8c","pokemon":"Graveler A","location_id":"unbound-map-53-9","method":"Rock Smash","time":"","rate":"30%","level":"25–30","level_min":25,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1258a4ad8b09e959","pokemon":"Nosepass","location_id":"unbound-map-53-9","method":"Rock Smash","time":"","rate":"9%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fb0096600eed389d","pokemon":"Shuckle","location_id":"unbound-map-53-9","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-282a314b847a8438","pokemon":"Magikarp","location_id":"unbound-map-53-9","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c659cf61c3a1a44f","pokemon":"Chinchou","location_id":"unbound-map-53-9","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-64cf607a8aa8b70d","pokemon":"Lanturn","location_id":"unbound-map-53-9","method":"Câu cá - Super Rod","time":"","rate":"100%","level":"45–50","level_min":45,"level_max":50,"slot_count":5,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e3d50eac6d0d171d","pokemon":"Nosepass","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-45df76cc57953f2e","pokemon":"Magnemite","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-017a27d1bb93ac5d","pokemon":"Timburr","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6e5095a0493f1c79","pokemon":"Klink","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"31–34","level_min":31,"level_max":34,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-19a97b9ea3056be2","pokemon":"Elekid","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-525e04babcb531cf","pokemon":"Tynamo","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"31–34","level_min":31,"level_max":34,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-f76d3c9654d5708f","pokemon":"Magneton","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-da10fd7e407421d4","pokemon":"Electabuzz","location_id":"unbound-map-53-11","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"34","level_min":34,"level_max":34,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e997d551d42d9c93","pokemon":"Geodude A","location_id":"unbound-map-53-11","method":"Rock Smash","time":"","rate":"60%","level":"20–30","level_min":20,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-230fad5f9ff2149b","pokemon":"Graveler A","location_id":"unbound-map-53-11","method":"Rock Smash","time":"","rate":"30%","level":"25–30","level_min":25,"level_max":30,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-49614747e08302b0","pokemon":"Nosepass","location_id":"unbound-map-53-11","method":"Rock Smash","time":"","rate":"9%","level":"20–30","level_min":20,"level_max":30,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a946263ee26f63bb","pokemon":"Shuckle","location_id":"unbound-map-53-11","method":"Rock Smash","time":"","rate":"1%","level":"35","level_min":35,"level_max":35,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a13394f0e29f1374","pokemon":"Golbat","location_id":"unbound-map-55-0","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-eca93e5d1d31ba6b","pokemon":"Boldore","location_id":"unbound-map-55-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"55–58","level_min":55,"level_max":58,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a24f9d9506faa2f4","pokemon":"Durant","location_id":"unbound-map-55-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"55–58","level_min":55,"level_max":58,"slot_count":7,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b4d95818485690dc","pokemon":"Lumineon","location_id":"unbound-map-55-0","method":"Surf","time":"","rate":"60%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f91cc426b10ebf58","pokemon":"Golbat","location_id":"unbound-map-55-0","method":"Surf","time":"","rate":"30%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-208760753b94f940","pokemon":"Marill","location_id":"unbound-map-55-0","method":"Surf","time":"","rate":"6%","level":"45–55","level_min":45,"level_max":55,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4a2142b7e886f13f","pokemon":"Azumarill","location_id":"unbound-map-55-0","method":"Surf","time":"","rate":"4%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-79b4fd58bdc72fd4","pokemon":"Magikarp","location_id":"unbound-map-55-0","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-96360ed2656c9eeb","pokemon":"Finneon","location_id":"unbound-map-55-0","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f662b187fe22e58","pokemon":"Psyduck","location_id":"unbound-map-55-0","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0bc9e215f122534c","pokemon":"Lumineon","location_id":"unbound-map-55-0","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b04638c52b2b28da","pokemon":"Golduck","location_id":"unbound-map-55-0","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-03a95364c9db95c1","pokemon":"Gyarados","location_id":"unbound-map-55-0","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-540df4ff81aa989c","pokemon":"Woobat","location_id":"unbound-map-55-1","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"54–58","level_min":54,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0ef07fab035b41dd","pokemon":"Graveler","location_id":"unbound-map-55-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"55–58","level_min":55,"level_max":58,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2819df9f0221f43b","pokemon":"Durant","location_id":"unbound-map-55-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"55–58","level_min":55,"level_max":58,"slot_count":7,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-790b9ddb881efb15","pokemon":"Lumineon","location_id":"unbound-map-55-1","method":"Surf","time":"","rate":"60%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ff723892f4216dd9","pokemon":"Woobat","location_id":"unbound-map-55-1","method":"Surf","time":"","rate":"30%","level":"45–55","level_min":45,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6e51fd39aa91bd63","pokemon":"Marill","location_id":"unbound-map-55-1","method":"Surf","time":"","rate":"6%","level":"45–55","level_min":45,"level_max":55,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ba8c938705d2a371","pokemon":"Azumarill","location_id":"unbound-map-55-1","method":"Surf","time":"","rate":"4%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1efb5d10843790ed","pokemon":"Magikarp","location_id":"unbound-map-55-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-032623cde3c392e0","pokemon":"Finneon","location_id":"unbound-map-55-1","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-60e6326605ce7914","pokemon":"Psyduck","location_id":"unbound-map-55-1","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee53d94837e0af09","pokemon":"Lumineon","location_id":"unbound-map-55-1","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ef2ddcc5430919e","pokemon":"Golduck","location_id":"unbound-map-55-1","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f21b4e275e8e6111","pokemon":"Gyarados","location_id":"unbound-map-55-1","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d03a6eaae058f3e4","pokemon":"Woobat","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"54–58","level_min":54,"level_max":58,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-09ca011ca80af7e6","pokemon":"Magcargo","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"55–58","level_min":55,"level_max":58,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dff59c57e7121943","pokemon":"Salazzle","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"55–58","level_min":55,"level_max":58,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6dfe6f0972d7693c","pokemon":"Camerupt","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"15%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9da28e25546873a1","pokemon":"Graveler","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d7d4a4b53be94b79","pokemon":"Excadrill","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"55–58","level_min":55,"level_max":58,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ee62107e563fb253","pokemon":"Heatmor","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-40f8fd048c7e3609","pokemon":"Magmar","location_id":"unbound-map-55-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5af18aae73d00dd9","pokemon":"Magcargo","location_id":"unbound-map-55-2","method":"Surf","time":"","rate":"100%","level":"50–55","level_min":50,"level_max":55,"slot_count":5,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-24889c7505a014ef","pokemon":"Druddigon","location_id":"unbound-map-55-3","method":"Cỏ","time":"Ngày và đêm","rate":"80%","level":"55–58","level_min":55,"level_max":58,"slot_count":6,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1f066efa76498c06","pokemon":"Turtonator","location_id":"unbound-map-55-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d1be31cd70de4ffc","pokemon":"Drampa","location_id":"unbound-map-55-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"55–58","level_min":55,"level_max":58,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0e77fa808f970185","pokemon":"Lumineon","location_id":"unbound-map-55-3","method":"Surf","time":"","rate":"60%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-1ecd60586e5e27ce","pokemon":"Woobat","location_id":"unbound-map-55-3","method":"Surf","time":"","rate":"30%","level":"45–55","level_min":45,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-245c6f202ac5ba3f","pokemon":"Marill","location_id":"unbound-map-55-3","method":"Surf","time":"","rate":"6%","level":"45–55","level_min":45,"level_max":55,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cfd6ddd28a72600c","pokemon":"Azumarill","location_id":"unbound-map-55-3","method":"Surf","time":"","rate":"4%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cff355d44cee6419","pokemon":"Magikarp","location_id":"unbound-map-55-3","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e14eecd06fe0d020","pokemon":"Finneon","location_id":"unbound-map-55-3","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3010246d814e89c7","pokemon":"Psyduck","location_id":"unbound-map-55-3","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a88068da971a70f4","pokemon":"Lumineon","location_id":"unbound-map-55-3","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f174c8454f735e26","pokemon":"Golduck","location_id":"unbound-map-55-3","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8ff970c8a320421b","pokemon":"Gyarados","location_id":"unbound-map-55-3","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cefe457059568051","pokemon":"Heatmor","location_id":"unbound-map-55-4","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"55–58","level_min":55,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-af1261c716b122b0","pokemon":"Roselia","location_id":"unbound-map-55-4","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"54–58","level_min":54,"level_max":58,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-26e398130448a3d8","pokemon":"Chansey","location_id":"unbound-map-55-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"55–58","level_min":55,"level_max":58,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a69c379e6a4dfea2","pokemon":"Lurantis","location_id":"unbound-map-55-4","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"55–58","level_min":55,"level_max":58,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-05b1fef726dbb62c","pokemon":"Jigglypuff","location_id":"unbound-map-55-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"54–58","level_min":54,"level_max":58,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c26272243d3b1249","pokemon":"Floatzel","location_id":"unbound-map-55-4","method":"Surf","time":"","rate":"60%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b5f7a82b5ec8a774","pokemon":"Basculin (Blue)","location_id":"unbound-map-55-4","method":"Surf","time":"","rate":"40%","level":"50–55","level_min":50,"level_max":55,"slot_count":4,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-65922e53a8d19bc8","pokemon":"Magikarp","location_id":"unbound-map-55-4","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-80e0099aa3372ce1","pokemon":"Luvdisc","location_id":"unbound-map-55-4","method":"Câu cá - Good Rod","time":"","rate":"100%","level":"20–25","level_min":20,"level_max":25,"slot_count":3,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-617f1a290cbe91d6","pokemon":"Luvdisc","location_id":"unbound-map-55-4","method":"Câu cá - Super Rod","time":"","rate":"99%","level":"20–50","level_min":20,"level_max":50,"slot_count":4,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b14d5ebc3e6dac49","pokemon":"Bruxish","location_id":"unbound-map-55-4","method":"Câu cá - Super Rod","time":"","rate":"1%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-86966f2497fdd088","pokemon":"Woobat","location_id":"unbound-map-55-5","method":"Cỏ","time":"Ngày và đêm","rate":"40%","level":"55–59","level_min":55,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4907ae2cb9915282","pokemon":"Durant","location_id":"unbound-map-55-5","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"56–59","level_min":56,"level_max":59,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ff74b815c70694a9","pokemon":"Turtonator","location_id":"unbound-map-55-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c5adc727fd8de6ce","pokemon":"Drampa","location_id":"unbound-map-55-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5b67c60e843db8f9","pokemon":"Hakamo-o","location_id":"unbound-map-55-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"56–59","level_min":56,"level_max":59,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f9e649da97f56746","pokemon":"Abomasnow","location_id":"unbound-map-55-6","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-51455d1df1988e40","pokemon":"Glalie","location_id":"unbound-map-55-6","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-66e6dfbd4db6e8a5","pokemon":"Vanillish","location_id":"unbound-map-55-6","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d9a58e3495975cf0","pokemon":"Beartic","location_id":"unbound-map-55-6","method":"Cỏ","time":"Ngày và đêm","rate":"18%","level":"56–59","level_min":56,"level_max":59,"slot_count":4,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8c36acddc36804b4","pokemon":"Minior (Shield)","location_id":"unbound-map-55-6","method":"Cỏ","time":"Ngày và đêm","rate":"2%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-846cab80518eb0fc","pokemon":"Golbat","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef640ff5e89c682b","pokemon":"Hariyama","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cfd349b9e62f5409","pokemon":"Sealeo","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"56–59","level_min":56,"level_max":59,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-63e48ccf35d15fa1","pokemon":"Jynx","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-fe132fc7a6c4c5d4","pokemon":"Avalugg","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-31dcfbb774117163","pokemon":"Glalie","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8e59af1d514886ba","pokemon":"Piloswine","location_id":"unbound-map-55-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-68a2ae782f7fa576","pokemon":"Golbat","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"20%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-daa66b8682835de9","pokemon":"Hariyama","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"25%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c63a77cedac1d35a","pokemon":"Sealeo","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"56–59","level_min":56,"level_max":59,"slot_count":3,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cd7fdb425d74614f","pokemon":"Jynx","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-113643394bc4970b","pokemon":"Avalugg","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"56–59","level_min":56,"level_max":59,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-13aac0840a1c1bf2","pokemon":"Glalie","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-efd07c89c988f5b2","pokemon":"Piloswine","location_id":"unbound-map-55-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"56–59","level_min":56,"level_max":59,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f9e14a0a63ffbd99","pokemon":"Dewgong","location_id":"unbound-map-55-8","method":"Surf","time":"","rate":"65%","level":"50–55","level_min":50,"level_max":55,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0d390c173b862e52","pokemon":"Sealeo","location_id":"unbound-map-55-8","method":"Surf","time":"","rate":"34%","level":"50–55","level_min":50,"level_max":55,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-52ac40df3163dcaa","pokemon":"Lapras","location_id":"unbound-map-55-8","method":"Surf","time":"","rate":"1%","level":"50–55","level_min":50,"level_max":55,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b65819ffa9751408","pokemon":"Magikarp","location_id":"unbound-map-55-8","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6fa1e6aa462ca17f","pokemon":"Seel","location_id":"unbound-map-55-8","method":"Câu cá - Good Rod","time":"","rate":"80%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-733ea52321924059","pokemon":"Shellder","location_id":"unbound-map-55-8","method":"Câu cá - Good Rod","time":"","rate":"20%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a8f646bb127d5ac1","pokemon":"Dewgong","location_id":"unbound-map-55-8","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c23c11446e0215e2","pokemon":"Shellder","location_id":"unbound-map-55-8","method":"Câu cá - Super Rod","time":"","rate":"60%","level":"45–50","level_min":45,"level_max":50,"slot_count":4,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f363d60f53c9e9c2","pokemon":"Loudred","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7a148d4ccb5dffc9","pokemon":"Woobat","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2b06584e09d7c903","pokemon":"Onix","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9069adf78494b1fa","pokemon":"Noibat","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-de6255f7525b697a","pokemon":"Zweilous","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-582a2dfd91dcb5b0","pokemon":"Steelix","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4ea1c47c0ac553c6","pokemon":"Skarmory","location_id":"unbound-map-56-0","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9533ca72b0d3bb6b","pokemon":"Graveler","location_id":"unbound-map-56-0","method":"Rock Smash","time":"","rate":"90%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f7a8002d1f980d91","pokemon":"Onix","location_id":"unbound-map-56-0","method":"Rock Smash","time":"","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0dfe10408362d77f","pokemon":"Loudred","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-850ce187a643d137","pokemon":"Woobat","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-795c564bc072523b","pokemon":"Onix","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-706632e12f2c3353","pokemon":"Noibat","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2493a936a842f7f7","pokemon":"Zweilous","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-19efae0e87a7f885","pokemon":"Steelix","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f31af46dd5e1eab3","pokemon":"Skarmory","location_id":"unbound-map-56-1","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-c6818a8f1ed4b6ff","pokemon":"Gastrodon East","location_id":"unbound-map-56-1","method":"Surf","time":"","rate":"90%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7bcd159d1900e595","pokemon":"Golduck","location_id":"unbound-map-56-1","method":"Surf","time":"","rate":"9%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-719ccdea15d7d757","pokemon":"Dragonair","location_id":"unbound-map-56-1","method":"Surf","time":"","rate":"1%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-18e33ff5f5160e50","pokemon":"Magikarp","location_id":"unbound-map-56-1","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-80b9a11006ce286d","pokemon":"Psyduck","location_id":"unbound-map-56-1","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-68745e152af695ef","pokemon":"Finneon","location_id":"unbound-map-56-1","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-11cbed25733a2180","pokemon":"Golduck","location_id":"unbound-map-56-1","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bdf61ac4162afec0","pokemon":"Lumineon","location_id":"unbound-map-56-1","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5487ec3667cd2c76","pokemon":"Qwilfish","location_id":"unbound-map-56-1","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e54e6bc3b9e25516","pokemon":"Loudred","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9cdca5501fa3d7dc","pokemon":"Woobat","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-007058c900e55d89","pokemon":"Onix","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a1b1fae42e17f2cf","pokemon":"Noibat","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-72119f41e35060a4","pokemon":"Zweilous","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-dd16556e6e6d6827","pokemon":"Steelix","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-061a38416d42a18e","pokemon":"Skarmory","location_id":"unbound-map-56-2","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e3b51b70829b1387","pokemon":"Gastrodon East","location_id":"unbound-map-56-2","method":"Surf","time":"","rate":"90%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e9638a7350486734","pokemon":"Golduck","location_id":"unbound-map-56-2","method":"Surf","time":"","rate":"9%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f6ca3dfc009cf849","pokemon":"Dragonair","location_id":"unbound-map-56-2","method":"Surf","time":"","rate":"1%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7ad76464a999d3a5","pokemon":"Magikarp","location_id":"unbound-map-56-2","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3a8d90bba119182d","pokemon":"Psyduck","location_id":"unbound-map-56-2","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4943ca85aa9ca336","pokemon":"Finneon","location_id":"unbound-map-56-2","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e110c7b0e81dd97f","pokemon":"Golduck","location_id":"unbound-map-56-2","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7a0bc94f8df548a5","pokemon":"Lumineon","location_id":"unbound-map-56-2","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8cba697dc2c6fe84","pokemon":"Qwilfish","location_id":"unbound-map-56-2","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3038d3bb153a1ed0","pokemon":"Loudred","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e64392df86c313ff","pokemon":"Woobat","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-07b17b0d1c6667ac","pokemon":"Onix","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-e0e81606508b25ff","pokemon":"Noibat","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-88fe7e9d45a6d13e","pokemon":"Zweilous","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f5d700d12ab1d6dc","pokemon":"Steelix","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d80cd069190813a9","pokemon":"Skarmory","location_id":"unbound-map-56-3","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-09542f7fb6728456","pokemon":"Gastrodon East","location_id":"unbound-map-56-3","method":"Surf","time":"","rate":"90%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-eb809c7a899c157a","pokemon":"Golduck","location_id":"unbound-map-56-3","method":"Surf","time":"","rate":"9%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2733039b5395002a","pokemon":"Dragonair","location_id":"unbound-map-56-3","method":"Surf","time":"","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8f125b833485906d","pokemon":"Magikarp","location_id":"unbound-map-56-3","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-629088157d643b3f","pokemon":"Psyduck","location_id":"unbound-map-56-3","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-721e61f4c4dcc287","pokemon":"Finneon","location_id":"unbound-map-56-3","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6a53cf91845ab5ca","pokemon":"Golduck","location_id":"unbound-map-56-3","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0e87a77525bfa8e1","pokemon":"Lumineon","location_id":"unbound-map-56-3","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-593ac7a28ebdf9a5","pokemon":"Qwilfish","location_id":"unbound-map-56-3","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ab0d5da49ddb7ce","pokemon":"Loudred","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-bfdc7d20eaff66de","pokemon":"Woobat","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-035f020ed3c02b9e","pokemon":"Onix","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-b1e011cbddeaa825","pokemon":"Noivern","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-527f2ee081ee2e68","pokemon":"Zweilous","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-883bc49874fb33e5","pokemon":"Steelix","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-de11408d356020f1","pokemon":"Skarmory","location_id":"unbound-map-56-4","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9681736e8d1e90f5","pokemon":"Loudred","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-dcd7fb917a2f8b79","pokemon":"Woobat","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-042e39b03262eef0","pokemon":"Onix","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4e452ead5490abea","pokemon":"Noibat","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6be4efd4ac01ef5d","pokemon":"Zweilous","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8f259663787df346","pokemon":"Steelix","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-c898af85b3139570","pokemon":"Skarmory","location_id":"unbound-map-56-5","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-8b8a37ea6613bcec","pokemon":"Loudred","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d17750ebce7b83c7","pokemon":"Woobat","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ea82545248b950f4","pokemon":"Onix","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a27d0a410ec4b0de","pokemon":"Noivern","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-eca47a3783d3c43f","pokemon":"Zweilous","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-7dd838b8f662def4","pokemon":"Steelix","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-daccc185f9cf36a1","pokemon":"Skarmory","location_id":"unbound-map-56-6","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a9b69df3ee470c21","pokemon":"Gastrodon East","location_id":"unbound-map-56-6","method":"Surf","time":"","rate":"90%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0cf8ba952b75f8a6","pokemon":"Golduck","location_id":"unbound-map-56-6","method":"Surf","time":"","rate":"9%","level":"60–65","level_min":60,"level_max":65,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-640581003270809d","pokemon":"Dragonair","location_id":"unbound-map-56-6","method":"Surf","time":"","rate":"1%","level":"60–65","level_min":60,"level_max":65,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f63489208b195a5b","pokemon":"Magikarp","location_id":"unbound-map-56-6","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-100524f7948a60df","pokemon":"Psyduck","location_id":"unbound-map-56-6","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-9639211b85892f1b","pokemon":"Finneon","location_id":"unbound-map-56-6","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-8a6d54b1d93bb788","pokemon":"Golduck","location_id":"unbound-map-56-6","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5b77ac46866b4a64","pokemon":"Lumineon","location_id":"unbound-map-56-6","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-731a4af657c4010a","pokemon":"Qwilfish","location_id":"unbound-map-56-6","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ef07789666fd42f3","pokemon":"Drifblim","location_id":"unbound-map-56-7","method":"Cỏ","time":"Ngày và đêm","rate":"85%","level":"50–53","level_min":50,"level_max":53,"slot_count":7,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-0b5227dc64b7542f","pokemon":"Absol","location_id":"unbound-map-56-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6ee08a3c229124e1","pokemon":"Rufflet","location_id":"unbound-map-56-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f74b5fdf985beeda","pokemon":"Vullaby","location_id":"unbound-map-56-7","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-bfae7002d9c04c26","pokemon":"Loudred","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ab3b4b8a46570d03","pokemon":"Woobat","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6f942981e9d9e50c","pokemon":"Onix","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-64f8f25ebc5f168c","pokemon":"Noibat","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ba8426f9d74e0f2b","pokemon":"Zweilous","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7c5255d2cc1d59db","pokemon":"Steelix","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6f0a31295d5b157a","pokemon":"Skarmory","location_id":"unbound-map-56-8","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-9e4309e33d98d1ca","pokemon":"Loudred","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-a79b63e7ab7d5241","pokemon":"Woobat","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2c291363043bc646","pokemon":"Onix","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-cd91d07411eb5d9f","pokemon":"Noibat","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-2a91da773767fe61","pokemon":"Zweilous","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b95a8554d08b560e","pokemon":"Steelix","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b74830ce1940df68","pokemon":"Skarmory","location_id":"unbound-map-56-9","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–53","level_min":50,"level_max":53,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-418c93ff194ecabf","pokemon":"Gastrodon East","location_id":"unbound-map-56-9","method":"Surf","time":"","rate":"90%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-f3da0490a2c59026","pokemon":"Golduck","location_id":"unbound-map-56-9","method":"Surf","time":"","rate":"9%","level":"49–53","level_min":49,"level_max":53,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d5327cd1956db8cd","pokemon":"Dragonair","location_id":"unbound-map-56-9","method":"Surf","time":"","rate":"1%","level":"49–53","level_min":49,"level_max":53,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-b96686e577dbf90b","pokemon":"Magikarp","location_id":"unbound-map-56-9","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-d3c002681468223f","pokemon":"Psyduck","location_id":"unbound-map-56-9","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-045b789977ce8198","pokemon":"Finneon","location_id":"unbound-map-56-9","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-59f1c72e6bcbfe26","pokemon":"Golduck","location_id":"unbound-map-56-9","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-3f2c66dd3838ef69","pokemon":"Lumineon","location_id":"unbound-map-56-9","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-ad62a7d6f1db8b3c","pokemon":"Qwilfish","location_id":"unbound-map-56-9","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-5eb7b63dbca12efe","pokemon":"Loudred","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-1c76db800a1cb956","pokemon":"Woobat","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–54","level_min":50,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-52bc9c2c03c75561","pokemon":"Onix","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–54","level_min":50,"level_max":54,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-07b18d7b3d70fa71","pokemon":"Noibat","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–54","level_min":50,"level_max":54,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-06db51cba9034ae2","pokemon":"Zweilous","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-24bc942d8dabe9bc","pokemon":"Steelix","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–54","level_min":50,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-7c91d6bedc81bf93","pokemon":"Skarmory","location_id":"unbound-map-56-10","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-0b681be860ce6e3e","pokemon":"Gastrodon East","location_id":"unbound-map-56-10","method":"Surf","time":"","rate":"90%","level":"50–54","level_min":50,"level_max":54,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-ecb1f36fb101e04d","pokemon":"Golduck","location_id":"unbound-map-56-10","method":"Surf","time":"","rate":"9%","level":"50–54","level_min":50,"level_max":54,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-e18da4032fea491a","pokemon":"Dragonair","location_id":"unbound-map-56-10","method":"Surf","time":"","rate":"1%","level":"50–54","level_min":50,"level_max":54,"slot_count":1,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a394c22da431a251","pokemon":"Graveler","location_id":"unbound-map-56-10","method":"Rock Smash","time":"","rate":"90%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-1ef75b7a01bcc322","pokemon":"Onix","location_id":"unbound-map-56-10","method":"Rock Smash","time":"","rate":"10%","level":"50–54","level_min":50,"level_max":54,"slot_count":3,"slot_total":5,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-6562fb2f92dad5e3","pokemon":"Magikarp","location_id":"unbound-map-56-10","method":"Câu cá - Old Rod","time":"","rate":"100%","level":"10–15","level_min":10,"level_max":15,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-695e5bcdbd8b9202","pokemon":"Psyduck","location_id":"unbound-map-56-10","method":"Câu cá - Good Rod","time":"","rate":"60%","level":"20–25","level_min":20,"level_max":25,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-92b40b25b04e2a15","pokemon":"Finneon","location_id":"unbound-map-56-10","method":"Câu cá - Good Rod","time":"","rate":"40%","level":"20–25","level_min":20,"level_max":25,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-a65c74270c917325","pokemon":"Golduck","location_id":"unbound-map-56-10","method":"Câu cá - Super Rod","time":"","rate":"55%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-4a499be57579e718","pokemon":"Lumineon","location_id":"unbound-map-56-10","method":"Câu cá - Super Rod","time":"","rate":"40%","level":"45–50","level_min":45,"level_max":50,"slot_count":1,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-458acaab76e42645","pokemon":"Qwilfish","location_id":"unbound-map-56-10","method":"Câu cá - Super Rod","time":"","rate":"5%","level":"45–50","level_min":45,"level_max":50,"slot_count":2,"slot_total":10,"min_progress":"","requires":[],"notes_vi":"Tên khu vực chưa được xác định; cần kiểm tra thêm trong game.","verified":false},{"id":"ub-d4b9dbd153c3cfa3","pokemon":"Loudred","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4d9eaae4b3893a35","pokemon":"Woobat","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"30%","level":"50–54","level_min":50,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-6d79b0a66e530730","pokemon":"Onix","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–54","level_min":50,"level_max":54,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-4e92cb7a980b056e","pokemon":"Noibat","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"50–54","level_min":50,"level_max":54,"slot_count":1,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-41dc88768ba9ae35","pokemon":"Zweilous","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"10%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-18b77330d34a607a","pokemon":"Steelix","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"50–54","level_min":50,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"ub-99f4b48468561ff5","pokemon":"Skarmory","location_id":"unbound-map-56-11","method":"Cỏ","time":"Ngày và đêm","rate":"5%","level":"51–54","level_min":51,"level_max":54,"slot_count":2,"slot_total":12,"min_progress":"","requires":[],"notes_vi":"","verified":true},{"id":"route2-litleo-gift","pokemon":"Litleo","location_id":"unbound-map-3-69","method":"Quà tặng","time":"—","rate":"—","min_progress":"route2","requires":[],"notes_vi":"Nhận làm quà từ Kindler ở Route 2; đây không phải encounter hoang dã.","verified":true},{"id":"route2-clobbopus-gen8","pokemon":"Clobbopus","location_id":"unbound-map-3-69","method":"Encounter đặc biệt","time":"Cần kích hoạt Gen 8","rate":"—","min_progress":"route2","requires":["gen8-activation"],"notes_vi":"Nguồn ghi yêu cầu kích hoạt Pokémon Gen 8.","verified":true},{"id":"route2-tapu-fini-postgame","pokemon":"Tapu Fini","location_id":"unbound-map-3-69","method":"Portal encounter","time":"Hậu game","rate":"—","min_progress":"postgame","requires":[],"notes_vi":"Gặp tại portal sau khi hoàn thành cốt truyện chính.","verified":true},{"id":"route3-skwovet-gen8","pokemon":"Skwovet","location_id":"unbound-map-3-70","method":"Encounter đặc biệt","time":"Cần kích hoạt Gen 8","rate":"—","min_progress":"dresco","requires":["gen8-activation"],"notes_vi":"Nguồn ghi yêu cầu kích hoạt Pokémon Gen 8.","verified":true},{"id":"route3-chewtle-gen8","pokemon":"Chewtle","location_id":"unbound-map-3-70","method":"Encounter đặc biệt","time":"Cần kích hoạt Gen 8","rate":"—","min_progress":"dresco","requires":["gen8-activation"],"notes_vi":"Nguồn ghi yêu cầu kích hoạt Pokémon Gen 8.","verified":true},{"id":"route3-sandygast-static","pokemon":"Sandygast","location_id":"unbound-map-3-70","method":"Encounter tĩnh","time":"Thứ Hai và Thứ Ba","rate":"—","min_progress":"dresco","requires":[],"notes_vi":"Tương tác với lâu đài cát; lịch xuất hiện được ghi là thứ Hai và thứ Ba.","verified":true},{"id":"dresco-ducklett-trade","pokemon":"Ducklett","location_id":"unbound-map-3-71","method":"Trao đổi trong game","time":"—","rate":"—","min_progress":"dresco","requires":[],"notes_vi":"Đổi với Edmund; cần đưa Alolan Sandshrew tìm được ở Icicle Cave tầng 4. Ducklett nhận được biết chiêu Defog.","verified":true},{"id":"route10-linoone-galarian-gen8","pokemon":"Galarian Linoone","location_id":"unbound-map-3-81","method":"Encounter đặc biệt","time":"Cần kích hoạt Gen 8","rate":"—","min_progress":"tehl","requires":["gen8-activation"],"notes_vi":"Nguồn ghi yêu cầu kích hoạt Pokémon Gen 8.","verified":true},{"id":"route10-obstagoon-gen8","pokemon":"Obstagoon","location_id":"unbound-map-3-81","method":"Encounter đặc biệt","time":"Cần kích hoạt Gen 8","rate":"—","min_progress":"tehl","requires":["gen8-activation"],"notes_vi":"Nguồn ghi yêu cầu kích hoạt Pokémon Gen 8.","verified":true},{"id":"frozen-articuno-postgame","pokemon":"Articuno","location_id":"seed-seed-seed-seed-frozen-heights","method":"Legendary encounter tĩnh","time":"Hậu game","rate":"—","min_progress":"postgame","requires":["cut"],"notes_vi":"Nguồn ghi gặp Articuno ở điểm gần lối KBT Expressway sau khi có Cut và đã vào hậu game.","verified":true}],"data_source":"Structured Unbound encounter table; progress stages estimated by area.","data_updated_at":"2026-11-09 17:48:34","coverage_summary":{"mode":"full-source-table-import","known_locations_included":166,"full_sync_required":false,"note_vi":"Đã nhập bảng encounter có cấu trúc từ nguồn Unbound. Quà, sự kiện phân phối và encounter đặc biệt có thể cần đối chiếu riêng.","total_encounters":1956,"source_url":"https://raw.githubusercontent.com/ydarissep/Unbound-Pokedex/refs/heads/main/src/locations/encounters.json","last_sync":"2026-11-09 17:48:34"},"pokedex":{"status":"partial","label":"Pokédex tùy biến Pokémon Unbound","scope":"custom","source":"Bundled fallback from encounter seed; not a verified complete Pokédex","source_dex_ids":[],"synced_at":"","entries":[{"key":"araquanid","name":"Araquanid"},{"key":"articuno","name":"Articuno"},{"key":"azurill","name":"Azurill"},{"key":"basculin (red/blue)","name":"Basculin (Red/Blue)"},{"key":"bidoof","name":"Bidoof"},{"key":"binacle","name":"Binacle"},{"key":"bruxish","name":"Bruxish"},{"key":"buizel","name":"Buizel"},{"key":"cherubi","name":"Cherubi"},{"key":"chewtle","name":"Chewtle"},{"key":"clobbopus","name":"Clobbopus"},{"key":"cloyster","name":"Cloyster"},{"key":"delibird","name":"Delibird"},{"key":"dewpider","name":"Dewpider"},{"key":"ditto","name":"Ditto"},{"key":"ducklett","name":"Ducklett"},{"key":"electrike","name":"Electrike"},{"key":"galarian linoone","name":"Galarian Linoone"},{"key":"goomy","name":"Goomy"},{"key":"gyarados","name":"Gyarados"},{"key":"hoothoot","name":"Hoothoot"},{"key":"inkay","name":"Inkay"},{"key":"kingler","name":"Kingler"},{"key":"krabby","name":"Krabby"},{"key":"linoone","name":"Linoone"},{"key":"litleo","name":"Litleo"},{"key":"lombre","name":"Lombre"},{"key":"lotad","name":"Lotad"},{"key":"magikarp","name":"Magikarp"},{"key":"marill","name":"Marill"},{"key":"masquerain","name":"Masquerain"},{"key":"minccino","name":"Minccino"},{"key":"minior","name":"Minior"},{"key":"obstagoon","name":"Obstagoon"},{"key":"palpitoad","name":"Palpitoad"},{"key":"patrat","name":"Patrat"},{"key":"pelipper","name":"Pelipper"},{"key":"pikipek","name":"Pikipek"},{"key":"poliwag","name":"Poliwag"},{"key":"poochyena","name":"Poochyena"},{"key":"rattata","name":"Rattata"},{"key":"riolu","name":"Riolu"},{"key":"roggenrola","name":"Roggenrola"},{"key":"sandygast","name":"Sandygast"},{"key":"scraggy","name":"Scraggy"},{"key":"sentret","name":"Sentret"},{"key":"shellder","name":"Shellder"},{"key":"shellos","name":"Shellos"},{"key":"skwovet","name":"Skwovet"},{"key":"slowpoke","name":"Slowpoke"},{"key":"snorunt","name":"Snorunt"},{"key":"starmie","name":"Starmie"},{"key":"staryu","name":"Staryu"},{"key":"stufful","name":"Stufful"},{"key":"surskit","name":"Surskit"},{"key":"tapu fini","name":"Tapu Fini"},{"key":"tentacool","name":"Tentacool"},{"key":"tentacruel","name":"Tentacruel"},{"key":"tympole","name":"Tympole"},{"key":"vanillite","name":"Vanillite"},{"key":"wingull","name":"Wingull"},{"key":"wishiwashi","name":"Wishiwashi"}],"notice_vi":"Pokédex Unbound chưa có danh sách chuẩn hóa riêng trong nguồn PokéAPI. Danh sách tạm chỉ phản ánh Pokémon đã có trong dữ liệu encounter được đóng gói."}}</script>
        <script type="application/json" class="vngpc-games-data">[{"id":"pokemon-red","name":"Pokémon Red","version":"Game Boy","region":"Kanto","encounter_count":788,"location_count":75,"notice_vi":"Tìm Pokémon tại Kanto trong Pokémon Red theo tuyến đường, hang động và phương thức gặp. Một số loài xuất hiện khác Pokémon Blue; chọn khu vực và tiến độ để lọc kết quả. Pokémon khởi đầu được chọn tại phòng thí nghiệm, còn một số cuộc gặp đặc biệt có điều kiện riêng."},{"id":"pokemon-blue","name":"Pokémon Blue","version":"Game Boy","region":"Kanto","encounter_count":788,"location_count":75,"notice_vi":"Tìm Pokémon tại Kanto trong Pokémon Blue theo tuyến đường, hang động và phương thức gặp. Một số loài xuất hiện khác Pokémon Red; chọn khu vực và tiến độ để lọc kết quả. Pokémon khởi đầu được chọn tại phòng thí nghiệm, còn một số cuộc gặp đặc biệt có điều kiện riêng."},{"id":"pokemon-yellow","name":"Pokémon Yellow","version":"Game Boy","region":"Kanto","encounter_count":286,"location_count":54,"notice_vi":"Tìm Pokémon ở Kanto trong Pokémon Yellow, từ các tuyến đường đến hang động và mặt nước. Chọn khu vực, tiến độ và điều kiện đã mở để lọc kết quả; Pokémon được tặng, trao đổi hoặc xuất hiện qua sự kiện có thể cần tra cứu riêng."},{"id":"pokemon-firered","name":"Pokémon FireRed","version":"Game Boy Advance","region":"Kanto","encounter_count":1007,"location_count":124,"notice_vi":"Tìm Pokémon tại Kanto trong Pokémon FireRed theo tuyến đường, hang động và mặt nước. Dùng bộ lọc tiến độ và vật phẩm để thu hẹp nơi gặp; quà tặng, trao đổi, Pokémon cố định và một số khu vực sau game có thể cần tra cứu riêng."},{"id":"pokemon-leafgreen","name":"Pokémon LeafGreen","version":"Game Boy Advance","region":"Kanto","encounter_count":1009,"location_count":124,"notice_vi":"Tìm Pokémon tại Kanto trong Pokémon LeafGreen theo tuyến đường, hang động và mặt nước. Một số loài xuất hiện khác Pokémon FireRed; dùng bộ lọc khu vực và tiến độ để thu hẹp kết quả. Quà tặng, trao đổi và Pokémon đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-lets-go-pikachu","name":"Pokémon Let’s Go, Pikachu!","version":"Nintendo Switch","region":"Kanto","encounter_count":494,"location_count":49,"notice_vi":"Tra cứu Pokémon tại Kanto trong Pokémon Let’s Go, Pikachu! theo tuyến đường, hang động, mặt nước và cuộc gặp đặc biệt. Bản này có các loài riêng so với Let’s Go, Eevee!; một số Pokémon hiếm còn phụ thuộc Catch Combo, Lure hoặc điều kiện trong game."},{"id":"pokemon-lets-go-eevee","name":"Pokémon Let’s Go, Eevee!","version":"Nintendo Switch","region":"Kanto","encounter_count":495,"location_count":49,"notice_vi":"Tra cứu Pokémon tại Kanto trong Pokémon Let’s Go, Eevee! theo tuyến đường, hang động, mặt nước và cuộc gặp đặc biệt. Bản này có các loài riêng so với Let’s Go, Pikachu!; một số Pokémon hiếm còn phụ thuộc Catch Combo, Lure hoặc điều kiện trong game."},{"id":"pokemon-gold","name":"Pokémon Gold","version":"Game Boy Color","region":"Johto (Kanto mở sau Liên Minh)","encounter_count":2107,"location_count":124,"notice_vi":"Khám phá Johto trong Pokémon Gold, sau đó mở Kanto khi hoàn thành Liên Minh. Lọc Pokémon theo khu vực, phương thức gặp và thời điểm trong ngày; một số loài xuất hiện khác Pokémon Silver hoặc chỉ gặp khi có điều kiện riêng."},{"id":"pokemon-silver","name":"Pokémon Silver","version":"Game Boy Color","region":"Johto (Kanto mở sau Liên Minh)","encounter_count":2079,"location_count":124,"notice_vi":"Khám phá Johto trong Pokémon Silver, sau đó mở Kanto khi hoàn thành Liên Minh. Lọc Pokémon theo khu vực, phương thức gặp và thời điểm trong ngày; một số loài xuất hiện khác Pokémon Gold hoặc chỉ gặp khi có điều kiện riêng."},{"id":"pokemon-crystal","name":"Pokémon Crystal","version":"Game Boy Color","region":"Johto (Kanto mở sau Liên Minh)","encounter_count":1186,"location_count":112,"notice_vi":"Khám phá Johto và Kanto trong Pokémon Crystal. Lọc Pokémon theo khu vực, cỏ, hang động, mặt nước, câu cá hoặc các cách gặp đặc biệt như Headbutt khi có ghi nhận. Một số quà tặng, trao đổi và sự kiện có thể nằm ngoài danh sách này."},{"id":"pokemon-ruby","name":"Pokémon Ruby","version":"Game Boy Advance","region":"Hoenn","encounter_count":737,"location_count":97,"notice_vi":"Tìm Pokémon ở Hoenn trong Pokémon Ruby, từ các tuyến đường và hang động đến biển và khu vực lặn. Chọn tiến độ cùng vật phẩm đã có để thu hẹp kết quả; quà tặng, trao đổi và Pokémon sự kiện có thể cần tra cứu riêng."},{"id":"pokemon-sapphire","name":"Pokémon Sapphire","version":"Game Boy Advance","region":"Hoenn","encounter_count":738,"location_count":97,"notice_vi":"Tìm Pokémon ở Hoenn trong Pokémon Sapphire, với một số loài xuất hiện khác Pokémon Ruby. Lọc theo tuyến đường, hang động, mặt nước và tiến độ hiện tại; quà tặng, trao đổi hoặc Pokémon sự kiện có thể cần tra cứu riêng."},{"id":"pokemon-emerald","name":"Pokémon Emerald","version":"Game Boy Advance","region":"Hoenn","encounter_count":813,"location_count":116,"notice_vi":"Khám phá Hoenn trong Pokémon Emerald qua các tuyến đường, hang động, biển và điểm lặn. Chọn khu vực, tiến độ và điều kiện đã mở để tìm loài phù hợp; một số Pokémon đặc biệt phụ thuộc sự kiện hoặc cách gặp riêng."},{"id":"pokemon-diamond","name":"Pokémon Diamond","version":"Nintendo DS","region":"Sinnoh","encounter_count":89,"location_count":8,"notice_vi":"Tìm Pokémon ở Sinnoh trong Pokémon Diamond theo tuyến đường, hang động, mặt nước và cách gặp được ghi nhận. Chọn tiến độ, khu vực và điều kiện bạn đã có để lọc kết quả; một số quà tặng, trao đổi hoặc sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-pearl","name":"Pokémon Pearl","version":"Nintendo DS","region":"Sinnoh","encounter_count":89,"location_count":8,"notice_vi":"Tìm Pokémon ở Sinnoh trong Pokémon Pearl; một số loài xuất hiện khác Pokémon Diamond. Lọc theo tuyến đường, hang động, mặt nước và tiến độ hiện tại. Pokémon nhận qua quà tặng, trao đổi hoặc sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-platinum","name":"Pokémon Platinum","version":"Nintendo DS","region":"Sinnoh","encounter_count":2487,"location_count":183,"notice_vi":"Khám phá Sinnoh trong Pokémon Platinum, gồm các tuyến đường, hang động, mặt nước và những cuộc gặp phụ thuộc điều kiện khi có ghi nhận. Một số Pokémon có thể thay đổi theo thời gian, đàn Pokémon xuất hiện hoặc Poké Radar; quà và sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-brilliant-diamond","name":"Pokémon Brilliant Diamond","version":"Nintendo Switch","region":"Sinnoh","encounter_count":27,"location_count":80,"notice_vi":"Tra cứu Pokémon trong Sinnoh ở Pokémon Brilliant Diamond theo tuyến đường, hang động, Grand Underground, mặt nước và câu cá. Bản này có các loài khác Shining Pearl ở một số khu vực; Poké Radar, đàn Pokémon, quà và các cuộc gặp huyền thoại có điều kiện riêng."},{"id":"pokemon-shining-pearl","name":"Pokémon Shining Pearl","version":"Nintendo Switch","region":"Sinnoh","encounter_count":27,"location_count":80,"notice_vi":"Tra cứu Pokémon trong Sinnoh ở Pokémon Shining Pearl theo tuyến đường, hang động, Grand Underground, mặt nước và câu cá. Bản này có các loài khác Brilliant Diamond ở một số khu vực; Poké Radar, đàn Pokémon, quà và các cuộc gặp huyền thoại có điều kiện riêng."},{"id":"pokemon-heartgold","name":"Pokémon HeartGold","version":"Nintendo DS","region":"Johto (Kanto mở sau Liên Minh)","encounter_count":77,"location_count":50,"notice_vi":"Khám phá Johto và Kanto trong Pokémon HeartGold. Lọc nơi gặp theo khu vực, tiến độ và phương thức như cỏ, hang động, mặt nước hoặc câu cá; một số loài phụ thuộc thời gian, roaming hay cách gặp đặc biệt. Quà và Pokémon phân phối riêng có thể không nằm trong danh sách hoang dã."},{"id":"pokemon-soulsilver","name":"Pokémon SoulSilver","version":"Nintendo DS","region":"Johto (Kanto mở sau Liên Minh)","encounter_count":77,"location_count":50,"notice_vi":"Khám phá Johto và Kanto trong Pokémon SoulSilver. Lọc nơi gặp theo khu vực, tiến độ và phương thức như cỏ, hang động, mặt nước hoặc câu cá; một số loài phụ thuộc thời gian, roaming hay cách gặp đặc biệt. Quà và Pokémon phân phối riêng có thể không nằm trong danh sách hoang dã."},{"id":"pokemon-black","name":"Pokémon Black","version":"Nintendo DS","region":"Unova","encounter_count":43,"location_count":50,"notice_vi":"Tìm Pokémon tại Unova trong Pokémon Black qua các tuyến đường, cỏ, hang động, mặt nước và điểm câu cá. Chọn khu vực cùng tiến độ hiện tại để thu hẹp kết quả; một số loài khác với Pokémon White, còn quà và sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-white","name":"Pokémon White","version":"Nintendo DS","region":"Unova","encounter_count":43,"location_count":51,"notice_vi":"Tìm Pokémon tại Unova trong Pokémon White qua các tuyến đường, cỏ, hang động, mặt nước và điểm câu cá. Chọn khu vực cùng tiến độ hiện tại để thu hẹp kết quả; một số loài khác với Pokémon Black, còn quà và sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-black-2","name":"Pokémon Black 2","version":"Nintendo DS","region":"Unova","encounter_count":33,"location_count":67,"notice_vi":"Khám phá Unova trong Pokémon Black 2 với các khu vực và cuộc gặp riêng của phần tiếp theo. Lọc theo tuyến đường, cỏ tối, mặt nước, câu cá hoặc Hidden Grotto khi có ghi nhận; quà, sự kiện và một số cuộc gặp phụ thuộc điều kiện có thể cần tra cứu riêng."},{"id":"pokemon-white-2","name":"Pokémon White 2","version":"Nintendo DS","region":"Unova","encounter_count":33,"location_count":67,"notice_vi":"Khám phá Unova trong Pokémon White 2 với các khu vực và cuộc gặp riêng của phần tiếp theo. Lọc theo tuyến đường, cỏ tối, mặt nước, câu cá hoặc Hidden Grotto khi có ghi nhận; quà, sự kiện và một số cuộc gặp phụ thuộc điều kiện có thể cần tra cứu riêng."},{"id":"pokemon-x","name":"Pokémon X","version":"Nintendo 3DS","region":"Kalos","encounter_count":53,"location_count":17,"notice_vi":"Tìm Pokémon tại Kalos trong Pokémon X qua các tuyến đường, hang động, bãi cỏ và mặt nước. Dùng bộ lọc khu vực, tiến độ và điều kiện đã mở để tìm loài cần bắt; một số loài khác Pokémon Y hoặc chỉ có thể nhận qua quà và trao đổi."},{"id":"pokemon-y","name":"Pokémon Y","version":"Nintendo 3DS","region":"Kalos","encounter_count":53,"location_count":17,"notice_vi":"Tìm Pokémon tại Kalos trong Pokémon Y qua các tuyến đường, hang động, bãi cỏ và mặt nước. Dùng bộ lọc khu vực, tiến độ và điều kiện đã mở để tìm loài cần bắt; một số loài khác Pokémon X hoặc chỉ có thể nhận qua quà và trao đổi."},{"id":"pokemon-omega-ruby","name":"Pokémon Omega Ruby","version":"Nintendo 3DS","region":"Hoenn","encounter_count":33,"location_count":20,"notice_vi":"Khám phá Hoenn trong Pokémon Omega Ruby, từ các tuyến đường và hang động đến biển, khu vực lặn và những nơi chỉ mở sau khi tiến triển cốt truyện. Lọc theo khu vực và tiến độ; quà tặng, Pokémon tĩnh và sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-alpha-sapphire","name":"Pokémon Alpha Sapphire","version":"Nintendo 3DS","region":"Hoenn","encounter_count":33,"location_count":20,"notice_vi":"Khám phá Hoenn trong Pokémon Alpha Sapphire, từ các tuyến đường và hang động đến biển, khu vực lặn và những nơi chỉ mở sau khi tiến triển cốt truyện. Lọc theo khu vực và tiến độ; một số loài khác Omega Ruby, còn quà và sự kiện đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-sun","name":"Pokémon Sun","version":"Nintendo 3DS","region":"Alola","encounter_count":20,"location_count":63,"notice_vi":"Khám phá các đảo Alola trong Pokémon Sun. Chọn khu vực và tiến độ để tìm Pokémon ở bãi cỏ, hang động, mặt nước hoặc điểm câu cá; một số cuộc gặp có thể phụ thuộc thời gian, cách gọi hỗ trợ hoặc điều kiện đặc biệt."},{"id":"pokemon-moon","name":"Pokémon Moon","version":"Nintendo 3DS","region":"Alola","encounter_count":20,"location_count":63,"notice_vi":"Khám phá các đảo Alola trong Pokémon Moon. Chọn khu vực và tiến độ để tìm Pokémon ở bãi cỏ, hang động, mặt nước hoặc điểm câu cá; một số loài xuất hiện khác Pokémon Sun và một số cuộc gặp phụ thuộc thời gian hoặc điều kiện đặc biệt."},{"id":"pokemon-ultra-sun","name":"Pokémon Ultra Sun","version":"Nintendo 3DS","region":"Alola","encounter_count":23,"location_count":66,"notice_vi":"Khám phá Alola trong Pokémon Ultra Sun với các khu vực và Pokémon đặc biệt của phiên bản Ultra. Lọc theo khu vực, tiến độ và phương thức gặp; Ultra Beasts, Ultra Wormhole và một số Pokémon quà tặng có điều kiện riêng."},{"id":"pokemon-ultra-moon","name":"Pokémon Ultra Moon","version":"Nintendo 3DS","region":"Alola","encounter_count":23,"location_count":66,"notice_vi":"Khám phá Alola trong Pokémon Ultra Moon với các khu vực và Pokémon đặc biệt của phiên bản Ultra. Lọc theo khu vực, tiến độ và phương thức gặp; một số loài khác Ultra Sun, còn Ultra Beasts, Ultra Wormhole và quà tặng có điều kiện riêng."},{"id":"pokemon-sword","name":"Pokémon Sword","version":"Nintendo Switch","region":"Galar","encounter_count":17,"location_count":88,"notice_vi":"Khám phá Galar trong Pokémon Sword, cùng các vùng mở rộng Isle of Armor và Crown Tundra khi có trong dữ liệu. Thời tiết và khu vực có thể ảnh hưởng Pokémon xuất hiện; Max Raid, quà sự kiện và một số cuộc gặp đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-shield","name":"Pokémon Shield","version":"Nintendo Switch","region":"Galar","encounter_count":17,"location_count":88,"notice_vi":"Khám phá Galar trong Pokémon Shield, cùng các vùng mở rộng Isle of Armor và Crown Tundra khi có trong dữ liệu. Thời tiết và khu vực có thể ảnh hưởng Pokémon xuất hiện; Max Raid, quà sự kiện và một số cuộc gặp đặc biệt có thể cần tra cứu riêng."},{"id":"pokemon-legends-arceus","name":"Pokémon Legends: Arceus","version":"Nintendo Switch","region":"Hisui","encounter_count":584,"location_count":26,"notice_vi":"Khám phá Hisui trong Pokémon Legends: Arceus: tra cứu Pokémon theo 5 vùng hoang dã, biến dạng không-thời gian, Alpha cố định và các cuộc gặp theo nhiệm vụ. Cấp độ, thời tiết, thời điểm hoặc điều kiện chỉ hiển thị khi có nguồn xác nhận."},{"id":"pokemon-legends-za","name":"Pokémon Legends: Z-A","version":"Nintendo Switch / Nintendo Switch 2","region":"Kalos — Lumiose City","encounter_count":437,"location_count":32,"notice_vi":"Tra cứu Pokémon trong Lumiose City theo 20 Wild Zones, điểm xuất hiện trong thành phố, Alpha, quà tặng, nhiệm vụ và DLC Mega Dimension. Pokémon hoang dã được phân biệt với loài nhận qua tiến hóa hoặc nhiệm vụ; cấp độ và điều kiện chỉ hiển thị khi nguồn xác nhận."},{"id":"pokemon-scarlet","name":"Pokémon Scarlet","version":"Nintendo Switch","region":"Paldea / Kitakami / Blueberry Academy","encounter_count":30,"location_count":71,"notice_vi":"Khám phá Paldea trong Pokémon Scarlet và các vùng DLC Kitakami, Blueberry Academy khi có trong dữ liệu. Lọc theo khu vực và tiến độ để tìm Pokémon; Tera Raid, mass outbreak, thay đổi theo thời gian và sự kiện có thể chưa được thể hiện đầy đủ."},{"id":"pokemon-violet","name":"Pokémon Violet","version":"Nintendo Switch","region":"Paldea / Kitakami / Blueberry Academy","encounter_count":30,"location_count":71,"notice_vi":"Khám phá Paldea trong Pokémon Violet và các vùng DLC Kitakami, Blueberry Academy khi có trong dữ liệu. Lọc theo khu vực và tiến độ để tìm Pokémon; Tera Raid, mass outbreak, thay đổi theo thời gian và sự kiện có thể chưa được thể hiện đầy đủ."},{"id":"pokemon-unbound","name":"Pokémon Unbound","version":"","region":"Borrius","encounter_count":1956,"location_count":166,"notice_vi":"Khám phá vùng Borrius trong Pokémon Unbound. Chọn khu vực, tiến độ và điều kiện đã mở để xem những Pokémon đã được ghi nhận; nhiệm vụ phụ, khu vực bí mật và một số cuộc gặp đặc biệt có thể cần điều kiện riêng."}]</script>
        <div class="vngpc-loading"><span class="vngpc-spinner" aria-hidden="true"></span> Đang tải dữ liệu Pokémon…</div>
        <noscript>Công cụ cần bật JavaScript để lọc dữ liệu Pokémon.</noscript>
    </section>
        <details class="vngpc-seo-directory google-anno-skip" aria-labelledby="vngpc-seo-directory-title">
      <summary class="vngpc-seo-directory-toggle">
        <span class="vngpc-seo-directory-icon" aria-hidden="true">⌖</span>
        <span class="vngpc-seo-directory-heading"><strong id="vngpc-seo-directory-title">Hướng dẫn tra cứu Pokémon theo game và khu vực</strong><small>Chọn phiên bản, sau đó mở từng khu vực để xem Pokémon và cách gặp.</small></span>
        <span class="vngpc-seo-directory-action"><span class="vngpc-dir-closed">Hiện danh sách</span><span class="vngpc-dir-open">Ẩn danh sách</span><span class="vngpc-dir-chevron" aria-hidden="true"></span></span>
      </summary>
      <div class="vngpc-seo-directory-content">
        <p>Chọn phiên bản để xem dữ liệu encounter hiện có, sau đó mở từng khu vực để đối chiếu Pokémon, phương thức gặp và điều kiện được ghi nhận. Một số trang đang tiếp tục được hoàn thiện dữ liệu.</p>
        <div class="vngpc-seo-directory-grid"><a href="https://vngame.tv/huong-dan-pokemon/alpha-sapphire/" class="local-link" data-wpel-link="internal"><strong>Pokémon Alpha Sapphire</strong><span>33 encounter · 20 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/black/" class="local-link" data-wpel-link="internal"><strong>Pokémon Black</strong><span>43 encounter · 21 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/black-2/" class="local-link" data-wpel-link="internal"><strong>Pokémon Black 2</strong><span>33 encounter · 21 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/blue/" class="local-link" data-wpel-link="internal"><strong>Pokémon Blue</strong><span>788 encounter · 74 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/brilliant-diamond/" class="local-link" data-wpel-link="internal"><strong>Pokémon Brilliant Diamond</strong><span>27 encounter · 15 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/diamond/" class="local-link" data-wpel-link="internal"><strong>Pokémon Diamond</strong><span>89 encounter · 8 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/emerald/" class="local-link" data-wpel-link="internal"><strong>Pokémon Emerald</strong><span>813 encounter · 116 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/firered/" class="local-link" data-wpel-link="internal"><strong>Pokémon FireRed</strong><span>1.007 encounter · 124 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/gold/" class="local-link" data-wpel-link="internal"><strong>Pokémon Gold</strong><span>2.107 encounter · 124 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/heartgold/" class="local-link" data-wpel-link="internal"><strong>Pokémon HeartGold</strong><span>77 encounter · 32 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/leafgreen/" class="local-link" data-wpel-link="internal"><strong>Pokémon LeafGreen</strong><span>1.009 encounter · 124 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/legends-arceus/" class="local-link" data-wpel-link="internal"><strong>Pokémon Legends: Arceus</strong><span>584 encounter · 25 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/legends-za/" class="local-link" data-wpel-link="internal"><strong>Pokémon Legends: Z-A</strong><span>437 encounter · 32 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/lets-go-eevee/" class="local-link" data-wpel-link="internal"><strong>Pokémon Let’s Go, Eevee!</strong><span>495 encounter · 49 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/lets-go-pikachu/" class="local-link" data-wpel-link="internal"><strong>Pokémon Let’s Go, Pikachu!</strong><span>494 encounter · 49 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/omega-ruby/" class="local-link" data-wpel-link="internal"><strong>Pokémon Omega Ruby</strong><span>33 encounter · 20 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/pearl/" class="local-link" data-wpel-link="internal"><strong>Pokémon Pearl</strong><span>89 encounter · 8 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/platinum/" class="local-link" data-wpel-link="internal"><strong>Pokémon Platinum</strong><span>2.487 encounter · 183 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/red/" class="local-link" data-wpel-link="internal"><strong>Pokémon Red</strong><span>788 encounter · 74 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/ruby/" class="local-link" data-wpel-link="internal"><strong>Pokémon Ruby</strong><span>737 encounter · 97 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/sapphire/" class="local-link" data-wpel-link="internal"><strong>Pokémon Sapphire</strong><span>738 encounter · 97 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/scarlet/" class="local-link" data-wpel-link="internal"><strong>Pokémon Scarlet</strong><span>30 encounter · 19 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/shining-pearl/" class="local-link" data-wpel-link="internal"><strong>Pokémon Shining Pearl</strong><span>27 encounter · 15 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/silver/" class="local-link" data-wpel-link="internal"><strong>Pokémon Silver</strong><span>2.079 encounter · 124 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/soulsilver/" class="local-link" data-wpel-link="internal"><strong>Pokémon SoulSilver</strong><span>77 encounter · 32 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/unbound/" class="local-link" data-wpel-link="internal"><strong>Pokémon Unbound</strong><span>1.956 encounter · 166 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/violet/" class="local-link" data-wpel-link="internal"><strong>Pokémon Violet</strong><span>30 encounter · 19 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/white/" class="local-link" data-wpel-link="internal"><strong>Pokémon White</strong><span>43 encounter · 21 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/white-2/" class="local-link" data-wpel-link="internal"><strong>Pokémon White 2</strong><span>33 encounter · 21 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/x/" class="local-link" data-wpel-link="internal"><strong>Pokémon X</strong><span>53 encounter · 17 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/y/" class="local-link" data-wpel-link="internal"><strong>Pokémon Y</strong><span>53 encounter · 17 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/yellow/" class="local-link" data-wpel-link="internal"><strong>Pokémon Yellow</strong><span>286 encounter · 54 khu vực có dữ liệu</span></a><a href="https://vngame.tv/huong-dan-pokemon/crystal/" class="local-link" data-wpel-link="internal"><strong>Pokémon Crystal</strong><span>1.186 encounter · 103 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a><a href="https://vngame.tv/huong-dan-pokemon/moon/" class="local-link" data-wpel-link="internal"><strong>Pokémon Moon</strong><span>20 encounter · 16 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a><a href="https://vngame.tv/huong-dan-pokemon/shield/" class="local-link" data-wpel-link="internal"><strong>Pokémon Shield</strong><span>17 encounter · 13 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a><a href="https://vngame.tv/huong-dan-pokemon/sun/" class="local-link" data-wpel-link="internal"><strong>Pokémon Sun</strong><span>20 encounter · 18 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a><a href="https://vngame.tv/huong-dan-pokemon/sword/" class="local-link" data-wpel-link="internal"><strong>Pokémon Sword</strong><span>17 encounter · 13 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a><a href="https://vngame.tv/huong-dan-pokemon/ultra-moon/" class="local-link" data-wpel-link="internal"><strong>Pokémon Ultra Moon</strong><span>23 encounter · 16 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a><a href="https://vngame.tv/huong-dan-pokemon/ultra-sun/" class="local-link" data-wpel-link="internal"><strong>Pokémon Ultra Sun</strong><span>23 encounter · 17 khu vực có dữ liệu</span><em>Đang bổ sung dữ liệu</em></a></div>
      </div>
    </details>
    
<p>Bài viết <a href="https://vngame.tv/tra-cuu-noi-bat-pokemon/" data-wpel-link="internal">Tra cứu nơi bắt Pokémon theo từng game</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/tra-cuu-noi-bat-pokemon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">20557</post-id>	</item>
		<item>
		<title>Pokémon Millionaire: Game Đố Vui Pokémon Online Từ Dễ Đến Khó</title>
		<link>https://vngame.tv/pokemon-millionaire-game-do-vui-pokemon-online/</link>
					<comments>https://vngame.tv/pokemon-millionaire-game-do-vui-pokemon-online/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 22:56:33 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Game đố vui Pokémon]]></category>
		<category><![CDATA[PokeHub Guide]]></category>
		<category><![CDATA[Pokémon Millionaire]]></category>
		<category><![CDATA[Quiz Pokémon online]]></category>
		<category><![CDATA[Thử thách Pokémon]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=20541</guid>

					<description><![CDATA[<p>Bạn tự tin mình hiểu rõ thế giới Pokémon, từ các Pokémon quen thuộc, hệ nguyên tố, tiến hóa cho đến những kiến thức chuyên sâu trong các phiên bản game chính? Pokémon Millionaire trên vnGame.tv là trò chơi đố vui dành cho những ai muốn thử thách kiến thức Pokémon theo phong cách gameshow hỏi đáp. Thay vì chỉ trả lời những câu hỏi đơn giản, bạn sẽ lần lượt vượt qua 15 câu hỏi với độ khó tăng dần. Mỗi câu có bốn phương án lựa chọn, thời gian trả lời giới hạn và các quyền trợ giúp [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/pokemon-millionaire-game-do-vui-pokemon-online/" data-wpel-link="internal">Pokémon Millionaire: Game Đố Vui Pokémon Online Từ Dễ Đến Khó</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bạn tự tin mình hiểu rõ thế giới Pokémon, từ các Pokémon quen thuộc, hệ nguyên tố, tiến hóa cho đến những kiến thức chuyên sâu trong các phiên bản game chính? <strong>Pokémon Millionaire trên vnGame.tv</strong> là trò chơi đố vui dành cho những ai muốn thử thách kiến thức Pokémon theo phong cách gameshow hỏi đáp.</p>



<p class="wp-block-paragraph">Thay vì chỉ trả lời những câu hỏi đơn giản, bạn sẽ lần lượt vượt qua 15 câu hỏi với độ khó tăng dần. Mỗi câu có bốn phương án lựa chọn, thời gian trả lời giới hạn và các quyền trợ giúp có thể thay đổi cục diện. Càng tiến xa, thử thách càng khó và mục tiêu đạt 1.000.000 XP càng trở nên hấp dẫn.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Pokémon Millionaire Là Gì?</mark></h3>



<p class="wp-block-paragraph">Pokémon Millionaire là game đố vui kiến thức Pokémon được phát triển theo phong cách gameshow hỏi đáp. Người chơi bắt đầu từ những câu hỏi cơ bản, sau đó tiến dần đến các câu hỏi đòi hỏi hiểu biết sâu hơn về thế giới Pokémon.</p>



<p class="wp-block-paragraph">Nội dung tập trung vào các dòng game Pokémon chính, bao gồm những thế hệ quen thuộc, Pokémon, hệ, tiến hóa, nhân vật, vùng đất, cốt truyện và cơ chế chiến đấu. Trò chơi không tập trung vào Pokémon TCG Pocket hay các trò chơi spin-off.</p>



<p class="wp-block-paragraph">Mục tiêu là vượt qua 15 câu hỏi liên tiếp để chinh phục mốc điểm cao nhất. Tuy nhiên, chỉ cần một câu trả lời sai, lượt chơi có thể kết thúc. Vì vậy, bạn cần cân nhắc kỹ trước mỗi lựa chọn và sử dụng quyền trợ giúp đúng thời điểm.</p>


<div id="vngame-pokemon-millionaire">
  <header class="pm-head">
    <div class="pm-brand"><div class="pm-logo">P</div><div><strong>vnGame.tv</strong><small>POKÉMON MILLIONAIRE</small></div></div>
    <span class="pm-beta">● COMMUNITY QUIZ</span>
  </header>
  <section class="pm-hero"><div><div class="pm-eyebrow">NGÂN HÀNG 1.000 CÂU · 15 CẤP ĐỘ · 4 ĐÁP ÁN</div><h2>Pokémon <span>Millionaire</span></h2><p>Chinh phục 15 câu hỏi Pokémon main series từ dễ đến chuyên gia. Trả lời sai để biết đáp án, lưu câu cần ôn và thử sức với bảng xếp hạng cộng đồng.</p></div><div class="pm-coin" aria-hidden="true"></div></section>
  <div class="pm-stats" aria-live="polite"><div class="pm-stat"><span>ĐIỂM LƯỢT NÀY</span><strong data-pm-current-score>0</strong></div><div class="pm-stat"><span>KỶ LỤC CÁ NHÂN</span><strong data-pm-best>0</strong></div><div class="pm-stat"><span>LƯỢT DAILY HÔM NAY</span><strong data-pm-attempts>0</strong></div></div>
  <nav class="pm-nav" aria-label="Pokémon Millionaire menu"><button type="button" class="pm-tab active" data-pm-tab="play"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3ae.png" alt="🎮" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Chơi game</button><button type="button" class="pm-tab" data-pm-tab="leaderboard"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Bảng xếp hạng</button><button type="button" class="pm-tab" data-pm-tab="review"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ôn câu sai</button><button type="button" class="pm-tab" data-pm-tab="profile"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f464.png" alt="👤" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Hồ sơ</button></nav>
  <main class="pm-main">
    <div class="pm-message warn" data-pm-config hidden aria-live="polite"></div>
    <section class="pm-pane" data-pm-pane="play">
      <div class="pm-section-head"><div><div class="pm-cap">CHOOSE YOUR MODE</div><h3>Chọn chế độ chơi</h3></div><span class="pm-pill">15 câu hỏi mỗi lượt</span></div>
      <div class="pm-daily-lifeline-picker" data-pm-daily-lifeline-picker></div>
      <div class="pm-startgrid">
        <button type="button" class="pm-mode" data-pm-start="daily"><span class="pm-mode-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><strong>Daily Challenge</strong><span>Tối đa 3 lượt thi chính thức mỗi ngày. Mỗi lượt có một bộ đề riêng; bảng xếp hạng lấy kết quả tốt nhất của bạn.</span></button>
        <button type="button" class="pm-mode" data-pm-start="practice"><span class="pm-mode-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><strong>Chế độ luyện tập</strong><span>Luyện không giới hạn với câu hỏi thay đổi. Điểm luyện tập không được lưu; câu sai vẫn lưu để ôn.</span></button>
      </div>
      <div class="pm-note" style="margin-top:14px">Daily: tối đa 3 lượt/ngày; mỗi lượt dùng một bộ câu hỏi luân phiên riêng; bảng xếp hạng lấy điểm cao nhất trong ngày. Mốc an toàn ở câu 5 (20.000 điểm) và câu 10 (200.000 điểm). Luyện tập không lưu điểm, chỉ lưu lịch sử câu sai để ôn lại. Lưu ý: việc chặn copy chỉ hạn chế thao tác trên trình duyệt, không chặn được ảnh chụp màn hình hoặc AI trên thiết bị khác.</div>
      <div data-pm-game-area hidden></div>
    </section>
    <section class="pm-pane" data-pm-pane="leaderboard" hidden><div class="pm-section-head"><div><div class="pm-cap">GLOBAL RANKINGS</div><h3>Bảng xếp hạng</h3></div><button type="button" class="pm-btn-secondary" data-pm-refresh-rank>↻ Làm mới</button></div><div class="pm-rankfilters"><button type="button" class="pm-rankfilter active" data-pm-period="daily">Hôm nay</button><button type="button" class="pm-rankfilter" data-pm-period="weekly">Tuần này</button><button type="button" class="pm-rankfilter" data-pm-period="record">Kỷ lục</button></div><div class="pm-ranking"><div class="pm-rankhead"><span>HẠNG</span><span>NGƯỜI CHƠI</span><span style="text-align:right">ĐIỂM</span></div><div data-pm-ranking><div class="pm-empty">Đang tải bảng xếp hạng…</div></div></div><p class="pm-note">Daily: điểm lượt chính thức trong ngày. Tuần: tổng 5 kết quả tốt nhất trong 7 ngày. Kỷ lục: điểm Daily cao nhất. Chỉ lượt do máy chủ chấm mới được ghi nhận.</p></section>
    <section class="pm-pane" data-pm-pane="review" hidden><div class="pm-section-head"><div><div class="pm-cap">LEARN FROM MISTAKES</div><h3>Ôn câu đã sai</h3></div><button type="button" class="pm-btn-secondary" data-pm-refresh-review>↻ Làm mới</button></div><div class="pm-box"><div class="pm-note">Câu trả lời sai ở các lượt thi được lưu vào hồ sơ của bạn. Xem đáp án đúng và phần giải thích để nhớ lâu hơn.</div></div><div class="pm-ranking" data-pm-review-list><div class="pm-empty">Đang tải lịch sử câu hỏi…</div></div></section>
    <section class="pm-pane" data-pm-pane="profile" hidden><div class="pm-section-head"><div><div class="pm-cap">TRAINER PROFILE</div><h3>Hồ sơ người chơi</h3></div></div><div class="pm-box"><label class="pm-label" for="pm-nickname">Nickname (3–18 ký tự)</label><div class="pm-row"><div class="pm-grow"><input id="pm-nickname" class="pm-input" data-pm-nickname maxlength="18" autocomplete="nickname" placeholder="Ví dụ: PokeMaster"></div><button type="button" class="pm-btn" data-pm-save-name>Lưu nickname</button></div><div class="pm-message" data-pm-name-msg hidden></div><p class="pm-note">Nickname được công khai trên bảng xếp hạng. Không nhập email, mật khẩu hoặc thông tin cá nhân.</p></div><div class="pm-profilemetrics"><div class="pm-metric"><span>Lượt Daily đã chơi</span><strong data-pm-profile-attempts>0</strong></div><div class="pm-metric"><span>Kỷ lục Daily</span><strong data-pm-profile-best>0</strong></div><div class="pm-metric"><span>Tổng điểm Daily</span><strong data-pm-profile-total>0</strong></div></div></section>
  </main>
  <footer class="pm-footer"><span>VNGAME.TV · POKÉMON MILLIONAIRE</span><span>Fan-made quiz · Không liên kết chính thức với Nintendo / Pokémon</span></footer>

  </div>




<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Cách Chơi Pokémon Millionaire</mark></h3>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">1. Chọn chế độ chơi</mark></h4>



<p class="wp-block-paragraph">Pokémon Millionaire có hai chế độ chính:</p>



<ul class="wp-block-list">
<li><strong>Daily Challenge:</strong> Tham gia thử thách chính thức để cạnh tranh điểm số với những người chơi khác. Chế độ này có giới hạn lượt chơi mỗi ngày và kết quả hợp lệ được dùng cho bảng xếp hạng.</li>



<li><strong>Luyện tập:</strong> Thử sức với các câu hỏi luân phiên để mở rộng kiến thức, làm quen với các cấp độ khó và ôn lại những câu từng trả lời sai.</li>
</ul>



<p class="wp-block-paragraph">Nếu muốn cạnh tranh thứ hạng, hãy tham gia Daily Challenge. Nếu muốn học thêm kiến thức và cải thiện khả năng trả lời, chế độ luyện tập là lựa chọn phù hợp.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">2. Trả lời 15 câu hỏi từ dễ đến khó</mark></h4>



<p class="wp-block-paragraph">Mỗi lượt chơi có 15 câu hỏi. Bạn cần chọn một trong bốn đáp án A, B, C hoặc D. Các câu hỏi được phân cấp để người chơi bắt đầu từ kiến thức phổ thông trước khi gặp những thử thách khó hơn.</p>



<p class="wp-block-paragraph">Câu hỏi có thể liên quan đến tên Pokémon, hệ, tiến hóa, vùng đất, nhân vật, Ability, chiêu thức và những cơ chế trong các phiên bản game chính.</p>



<p class="wp-block-paragraph">Mỗi câu có 20 giây để trả lời. Nếu hết thời gian mà chưa gửi đáp án hợp lệ, lượt chơi sẽ được xử lý theo luật của trò chơi. Vì vậy, hãy đọc kỹ câu hỏi, loại trừ các phương án sai và quyết định trước khi đồng hồ về 0.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">3. Chinh phục thang điểm</mark></h4>



<p class="wp-block-paragraph">Mỗi câu hỏi tương ứng với một mốc điểm. Câu càng khó, phần thưởng càng cao. Hai mốc an toàn giúp bạn bảo toàn một phần điểm khi đã tiến đủ xa.</p>



<p class="wp-block-paragraph">Đạt mốc cao không chỉ đòi hỏi vốn kiến thức tốt mà còn cần khả năng kiểm soát thời gian và sử dụng quyền trợ giúp hợp lý.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">5 Quyền Trợ Giúp Trong Pokémon Millionaire</mark></h3>



<p class="wp-block-paragraph">Năm quyền trợ giúp là một phần quan trọng của Pokémon Millionaire. Mỗi quyền mang lại một lợi thế khác nhau, nhưng bạn cần lựa chọn thời điểm sử dụng thay vì dựa hoàn toàn vào chúng.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">1. 50:50 – Loại Hai Đáp Án</mark></h4>



<p class="wp-block-paragraph">Hệ thống loại hai phương án sai, để lại hai lựa chọn. Đây là quyền trợ giúp hữu ích khi bạn không chắc chắn về kiến thức được hỏi.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">2. Gợi Ý Pokédex</mark></h4>



<p class="wp-block-paragraph">Nhận một gợi ý liên quan đến Pokémon hoặc chủ đề của câu hỏi. Gợi ý giúp bạn suy luận tốt hơn nhưng không đơn giản tiết lộ đáp án.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">3. Thêm 10 Giây</mark></h4>



<p class="wp-block-paragraph">Gia hạn thời gian cho câu hỏi hiện tại. Hãy dành quyền này cho những câu khó cần thêm thời gian suy nghĩ.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">4. Đổi Câu Hỏi</mark></h4>



<p class="wp-block-paragraph">Thay câu hỏi hiện tại bằng một câu khác cùng cấp độ. Quyền trợ giúp này phù hợp khi bạn gặp chủ đề mình ít biết, nhưng câu mới vẫn có thể khó tương đương câu ban đầu.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">5. Lá Chắn Sai Một Lần</mark></h4>



<p class="wp-block-paragraph">Lá chắn cho phép bạn tiếp tục thử thách sau một câu trả lời sai theo luật của trò chơi. Đây là quyền trợ giúp đáng cân nhắc khi bạn đang tiến gần các mốc điểm cao.</p>



<p class="wp-block-paragraph">Mỗi quyền trợ giúp chỉ sử dụng được một lần trong một lượt chơi. Trong Daily Challenge, người chơi lựa chọn ba quyền trong năm quyền trước khi bắt đầu; chế độ luyện tập cho phép sử dụng cả năm.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Bảng Xếp Hạng Pokémon Millionaire</mark></h3>



<p class="wp-block-paragraph">Pokémon Millionaire không chỉ là trò chơi trả lời câu hỏi một mình. Bạn còn có thể so sánh thành tích với cộng đồng người chơi trên vnGame.tv.</p>



<p class="wp-block-paragraph">Bảng xếp hạng được tổ chức theo các nhóm thành tích như:</p>



<ul class="wp-block-list">
<li><strong>Hôm nay:</strong> Theo dõi kết quả Daily Challenge trong ngày.</li>



<li><strong>Tuần này:</strong> Tổng hợp những kết quả tốt nhất trong tuần.</li>



<li><strong>Kỷ lục:</strong> Ghi nhận thành tích cao nhất của người chơi.</li>
</ul>



<p class="wp-block-paragraph">Kết quả thi đấu được lưu và xử lý qua hệ thống Supabase để phục vụ việc tính điểm và xếp hạng. Chỉ những lượt chơi hợp lệ mới được ghi nhận vào bảng xếp hạng chính thức.</p>



<p class="wp-block-paragraph">Nếu muốn cải thiện thứ hạng, bạn nên tập trung vào độ chính xác, ghi nhớ những kiến thức đã học và sử dụng quyền trợ giúp một cách chiến lược.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Thua Một Câu Không Có Nghĩa Là Bạn Không Biết Pokémon</mark></h3>



<p class="wp-block-paragraph">Một điểm đáng chú ý của Pokémon Millionaire là khả năng học hỏi sau mỗi lần chơi.</p>



<p class="wp-block-paragraph">Khi trả lời sai, bạn có thể xem đáp án chính xác và phần giải thích của câu hỏi. Những câu đã trả lời sai còn có thể xuất hiện trong mục ôn tập, giúp bạn nhận ra phần kiến thức còn thiếu và tránh lặp lại lỗi tương tự trong những lần tiếp theo.</p>



<p class="wp-block-paragraph">Ngân hàng câu hỏi được tổ chức theo nhiều cấp độ và chủ đề để tạo sự đa dạng giữa các lượt chơi. Tuy nhiên, những câu hỏi liên quan đến cơ chế cụ thể cần được đối chiếu với phiên bản game tương ứng để bảo đảm tính chính xác.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Mẹo Đạt Điểm Cao Trong Pokémon Millionaire</mark></h3>



<p class="wp-block-paragraph"><strong>Đọc hết bốn phương án trước khi chọn.</strong> Đôi khi bạn có thể loại trừ những lựa chọn không phù hợp ngay cả khi chưa biết đáp án chính xác.</p>



<p class="wp-block-paragraph"><strong>Đừng sử dụng trợ giúp quá sớm.</strong> Với câu hỏi dễ, hãy dựa vào kiến thức của mình. Giữ các quyền trợ giúp cho cấp độ cao hơn có thể giúp bạn tiến xa hơn.</p>



<p class="wp-block-paragraph"><strong>Quản lý 20 giây hợp lý.</strong> Đừng dành quá nhiều thời gian cho một phương án. Hãy xác định chủ đề, loại trừ đáp án sai và quyết định trước khi hết giờ.</p>



<p class="wp-block-paragraph"><strong>Ôn lại câu đã sai.</strong> Đây là cách hữu ích để cải thiện kiến thức Pokémon thay vì chỉ cố đạt điểm cao trong một lượt.</p>



<p class="wp-block-paragraph"><strong>Phân biệt kiến thức giữa các thế hệ.</strong> Một số cơ chế có thể thay đổi theo phiên bản. Khi câu hỏi đề cập đến một game cụ thể, hãy dựa vào đúng phiên bản đó thay vì áp dụng quy tắc của game khác.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Câu Hỏi Thường Gặp</mark></h3>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Pokémon Millionaire có miễn phí không?</mark></h4>



<p class="wp-block-paragraph">Pokémon Millionaire được cung cấp như một trò chơi đố vui miễn phí trên vnGame.tv. Các chế độ và giới hạn lượt chơi được áp dụng theo quy tắc của trò chơi.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Pokémon Millionaire có bao nhiêu câu hỏi?</mark></h4>



<p class="wp-block-paragraph">Ngân hàng câu hỏi được xây dựng để luân phiên qua nhiều chủ đề và cấp độ khác nhau. Số lượng câu có thể được mở rộng và cập nhật theo thời gian nhằm giảm việc gặp lại nội dung quá thường xuyên.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Có thể chơi lại sau khi trả lời sai không?</mark></h4>



<p class="wp-block-paragraph">Bạn có thể sử dụng chế độ luyện tập để tiếp tục thử sức với các câu hỏi khác và ôn lại kiến thức. Daily Challenge có giới hạn lượt chơi theo ngày.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Pokémon Millionaire có phải game Pokémon chính thức không?</mark></h4>



<p class="wp-block-paragraph">Không. Pokémon Millionaire là trò chơi đố vui do vnGame.tv phát triển dành cho người hâm mộ. Trò chơi không phải sản phẩm chính thức và không được Nintendo, The Pokémon Company hoặc Game Freak xác nhận hay tài trợ.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Chơi Pokémon Millionaire Trên vnGame.tv</mark></h4>



<p class="wp-block-paragraph">Bạn đã sẵn sàng kiểm tra kiến thức Pokémon của mình chưa? Hãy bắt đầu từ những câu hỏi đầu tiên, sử dụng các quyền trợ giúp đúng lúc và thử sức với những cấp độ khó hơn.</p>



<p class="wp-block-paragraph">Mục tiêu là chinh phục 15 câu hỏi, đạt thành tích cao và ghi tên mình lên bảng xếp hạng Pokémon Millionaire. Ngay cả khi chưa đạt điểm tối đa, mỗi câu hỏi cũng là một cơ hội để bạn hiểu thêm về thế giới Pokémon.</p>



<p class="wp-block-paragraph"><strong>Bắt đầu chơi Pokémon Millionaire ngay trên vnGame.tv và xem bạn có thể tiến xa đến đâu!</strong></p>



<p class="wp-block-paragraph"><em>Pokémon Millionaire là trò chơi do người hâm mộ thực hiện. Pokémon và các nhãn hiệu liên quan thuộc về chủ sở hữu tương ứng.</em></p>
<p>Bài viết <a href="https://vngame.tv/pokemon-millionaire-game-do-vui-pokemon-online/" data-wpel-link="internal">Pokémon Millionaire: Game Đố Vui Pokémon Online Từ Dễ Đến Khó</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/pokemon-millionaire-game-do-vui-pokemon-online/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">20541</post-id>	</item>
		<item>
		<title>Mở Pack Pokémon TCG Miễn Phí – Pokémon TCG Pack Opening Simulator</title>
		<link>https://vngame.tv/trai-nghiem-mo-the-pokemon-tcg-mien-phi/</link>
					<comments>https://vngame.tv/trai-nghiem-mo-the-pokemon-tcg-mien-phi/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Tue, 15 Sep 2026 21:42:16 +0000</pubDate>
				<category><![CDATA[Mở Pack TCG Miễn Phí]]></category>
		<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Hướng dẫn Pokémon TCG]]></category>
		<category><![CDATA[Mở thẻ Pokémon TCG]]></category>
		<category><![CDATA[Mở thẻ Pokémon TCG miễn phí]]></category>
		<category><![CDATA[Pokemon TCG]]></category>
		<category><![CDATA[Pokémon TCG miễn phí]]></category>
		<category><![CDATA[Pokémon TCG Pocket]]></category>
		<category><![CDATA[vngame]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=19159</guid>

					<description><![CDATA[<p>Bạn muốn trải nghiệm cảm giác xé pack Pokémon TCG nhưng không muốn phải mua booster pack thật? Với Pokémon TCG Pack Opening Simulator, bạn có thể mở pack Pokémon online hoàn toàn miễn phí, xem những lá bài mình nhận được và thử vận may với nhiều lựa chọn pack khác nhau. Không cần mua thẻ thật, không cần chuẩn bị bộ sưu tập và có thể bắt đầu ngay trên trình duyệt. Hãy chọn expansion, chọn số lượng pack muốn mở và xem liệu bạn có thể pull được những lá bài hiếm hay không. 📚 Bộ sưu [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/trai-nghiem-mo-the-pokemon-tcg-mien-phi/" data-wpel-link="internal">Mở Pack Pokémon TCG Miễn Phí – Pokémon TCG Pack Opening Simulator</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bạn muốn trải nghiệm cảm giác <strong>xé pack Pokémon TCG</strong> nhưng không muốn phải mua booster pack thật? Với <strong>Pokémon TCG Pack Opening Simulator</strong>, bạn có thể mở pack Pokémon online hoàn toàn miễn phí, xem những lá bài mình nhận được và thử vận may với nhiều lựa chọn pack khác nhau.</p>



<p class="wp-block-paragraph">Không cần mua thẻ thật, không cần chuẩn bị bộ sưu tập và có thể bắt đầu ngay trên trình duyệt. Hãy chọn expansion, chọn số lượng pack muốn mở và xem liệu bạn có thể pull được những lá bài hiếm hay không.</p>



<!-- ============================================================
     PokeHub Pack Opening — bản nhúng (Tiếng Việt, v30 · JSON BACKUP/RESTORE)
     Dán TOÀN BỘ khối này vào block "Custom HTML" của WordPress.
     Không có thẻ <html>/<head>/<body> nên sẽ không phá layout trang.

     Mới trong v30:
         - Nhập JSON để khôi phục bộ sưu tập đã xuất; cảnh báo trước khi xóa và đồng bộ lại số liệu cá nhân trên BXH.
         - Thông báo rõ việc xóa bộ sưu tập không xóa dữ liệu của người chơi khác hay lịch sử mở pack đã ghi trên máy chủ.

      Mới trong v26:
       - Bỏ nút Mở pack khỏi thanh menu chính.
       - Đưa Chấm PSA ra thanh menu chính; Chase Card, Cửa hàng, Thử thách
         và Daily Hub tiếp tục nằm trong menu Hoạt động.

     Mới trong v23:
       - TRAINER NICKNAME: hỏi nickname trước khi bắt đầu; tên được lưu riêng trên trình duyệt
         để dùng cho thành tích Global Leaderboard.
       - GLOBAL LEADERBOARD: nút BXH nằm ngay cạnh Bộ sưu tập; khi có Firebase Realtime Database
         config, bảng xếp hạng theo tổng số pack mở được cập nhật realtime giữa nhiều người.
         Nếu chưa cấu hình, widget không lỗi — BXH chỉ báo trạng thái chưa kết nối.

     Mới trong v13:
       - UI TIẾN ĐỘ GỌN: màn hình mở gói chỉ còn một thanh tiến độ nhỏ dạng
         "94/188 lá · 50%", tránh chiếm chỗ của kết quả rút. Chi tiết bộ sưu tập
         và danh sách lá còn thiếu được chuyển vào modal "Bộ sưu tập".
       - BỘ SƯU TẬP CHI TIẾT: hiển thị tiến độ các bộ đã sưu tầm, và với bộ đang
         mở có danh sách đầy đủ các lá còn thiếu để bấm xem chi tiết.
       - NHÃN MỚI / TRÙNG vẫn giữ nguyên ngay khi lật lá, không phát sinh request API mới.

      Mới trong v12:
     Mang từ v11:
       - TỈ LỆ RÚT THEO TẦNG ĐỘ HIẾM: trước đây mỗi ID thẻ trong một bộ
         có xác suất bị rút bằng nhau, khiến một lá Crown Rare dễ trúng
         ngang một lá Common. Giờ khi chọn bộ, widget tải danh sách toàn
         bộ chuỗi độ hiếm mà TCGdex từng dùng (endpoint /rarities, tải
         một lần), xếp chúng vào 7 tầng 0–6, rồi với riêng bộ đang chọn,
         lọc /cards?set.id=...&rarity=eq:A|B|C cho từng tầng (tối đa 7
         request, chạy song song, không chặn nút mở gói). Kết quả là mỗi
         tầng có sẵn danh sách ID thật thuộc bộ đó; lúc rút bài, hệ thống
         chọn tầng theo trọng số giảm dần ~3 lần mỗi bậc rồi mới chọn đều
         trong tầng đó — mô phỏng cảm giác "hiếm hơn thì khó trúng hơn"
         gần với thực tế hơn nhiều. Nếu API không lọc được cho bộ nào đó
         (ví dụ bộ quá cũ/lạ), widget tự phát hiện và âm thầm quay lại
         kiểu rút đều như bản cũ — không bao giờ làm hỏng việc mở gói.

     Mang từ v10:
       - LƯU BỘ SƯU TẬP + THỐNG KÊ ROI: mọi lá bài mở ra được lưu vào
         localStorage của chính máy người xem (không cần server). Nút
         "Bộ sưu tập" mở bảng thống kê: số gói đã mở, tổng chi, tổng giá
         trị thu được, ROI %, số lá độc nhất, phân bổ độ hiếm, danh sách
         lá bài sắp theo giá. Có thể đổi giá 1 gói (mặc định $4.49),
         xuất JSON, hoặc xóa sạch dữ liệu.
       - CHIA SẺ ẢNH LÊN MXH: nút "Chia sẻ ảnh" vẽ một ảnh 1200x630 bằng
         canvas (tiêu đề, 5 lá đẹp nhất, các số liệu) rồi gọi Web Share
         API trên điện thoại; máy tính sẽ tải ảnh PNG về để đăng lên Facebook/X/Instagram.
         Nếu CDN ảnh thẻ chặn CORS, ảnh vẫn được tạo nhưng thay hình thẻ bằng tên thẻ
         (không bao giờ hỏng trắng).
       - MỞ CẢ HỘP: hàng chip 1 / 3 / 5 / 10 gói. Chế độ hộp tải thẻ song song
         (6 request cùng lúc) kèm thanh tiến trình, rồi hiện bảng tổng kết hộp:
         chi phí, giá trị, lời/lỗ, ROI, phân bổ độ hiếm và 12 lá đáng giá nhất
         (bấm vào để xem chi tiết).
     Mới trong v20:
       - Footer nhận diện/bản quyền vnGame.tv xuất hiện ở cả cuối danh sách bộ và cuối khu vực Mở pack, dùng chung số bộ đếm động.
       - Footer dùng font hệ thống có fallback tiếng Việt ổn định.
     Mới trong v24:
       - Xem chi tiết mọi pack: toàn bộ card, ảnh, tìm kiếm/bộ lọc và lá nổi bật/chase.
       - Bấm card để xem chi tiết; đóng card sẽ quay lại checklist của pack.
       - V8: phục hồi bộ xử lý Tủ trưng bày trong phsrc (để nút hoạt động), đồng thời sửa tắt công khai dùng UPDATE thay cho UPSERT.
     ============================================================ -->

<div id="pokehub-app">
  <div class="ph-flash" id="ph-flash"></div>
  <canvas class="ph-confetti" id="ph-confetti" aria-hidden="true"></canvas>
  <div class="ph-toast" id="ph-toast" role="status" aria-live="polite"></div>

  <div class="ph-wrap">
    <div class="ph-tools" aria-label="Menu công cụ PokeHub">
      <button class="ph-tool" id="ph-col-btn" type="button">
        <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Bộ sưu tập
        <span class="ph-col-count" id="ph-col-count" hidden=""></span>
      </button>
      <button class="ph-tool ph-leaderboard-tool" id="ph-leaderboard-btn" type="button" title="Bảng xếp hạng realtime">
        <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> BXH
        <span class="ph-lb-status" id="ph-leaderboard-live" title="Đang khởi tạo script BXH Supabase…">Đang khởi tạo…</span>
      </button>
      <button class="ph-tool ph-profile-tool" id="ph-profile-btn" type="button" title="Mở hồ sơ và tủ trưng bày Trainer">
        <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f464.png" alt="👤" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Tủ trưng bày
      </button>
      <button class="ph-tool ph-psa-tool" id="ph-psa-btn" type="button" title="Chấm PSA mô phỏng cho thẻ đã sưu tầm">
        <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f48e.png" alt="💎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Chấm PSA
        <span class="ph-psa-badge" id="ph-psa-badge" hidden="">0</span>
      </button>
      <div class="ph-activity" id="ph-activity">
        <button class="ph-tool ph-activity-toggle" id="ph-activity-toggle" type="button" aria-expanded="false" aria-controls="ph-activity-menu" aria-haspopup="menu">
          <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Hoạt động <span class="ph-activity-chevron" aria-hidden="true">▾</span>
        </button>
        <div class="ph-activity-menu" id="ph-activity-menu" role="menu" aria-label="Các hoạt động" hidden="">
          <button class="ph-tool ph-chase-tool" id="ph-chase-btn" type="button" role="menuitem" title="Theo dõi các lá bài mục tiêu">
            <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Chase Card
            <span class="ph-col-count" id="ph-chase-count" hidden=""></span>
          </button>
          <button class="ph-tool" id="ph-shop-btn" type="button" role="menuitem">
            <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f381.png" alt="🎁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Cửa hàng
            <span class="ph-col-count" id="ph-shop-points-badge" hidden=""></span>
          </button>
          <button class="ph-tool" id="ph-challenge-btn" type="button" role="menuitem">
            <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Thử thách
            <span class="ph-col-count ph-challenge-count" id="ph-challenge-count" hidden=""></span>
          </button>
          <button class="ph-tool" id="ph-daily-btn" type="button" role="menuitem" title="Daily Mission, Streak và Daily Bonus Pack">
            <span aria-hidden="true"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c5.png" alt="📅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> Daily Hub
            <span class="ph-col-count" id="ph-daily-badge">0/3</span>
          </button>
        </div>
      </div>
      <button class="ph-tool ph-mute" id="ph-mute-btn" type="button" aria-label="Bật/tắt âm thanh" title="Bật/tắt âm thanh"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50a.png" alt="🔊" class="wp-smiley" style="height: 1em; max-height: 1em;" /></button>
    </div>

    <h1 class="ph-title">vnGame.tv Mở Gói Bài<span class="ph-dot" aria-hidden="true"></span></h1>
    <p class="ph-tagline">Chọn một bộ thẻ, xé lớp foil, và xem hôm nay bạn may mắn đến đâu — dữ liệu thẻ và giá thị trường lấy trực tiếp từ TCGdex.</p>

    <!-- màn hình 1: chọn bộ thẻ -->
    <div class="ph-screen ph-active" id="ph-screen-pick">
      <div class="ph-set-search" id="ph-set-search">
        <div class="ph-set-search-field">
          <span class="ph-set-search-icon" aria-hidden="true">⌕</span>
          <input id="ph-set-search-input" type="search" autocomplete="off" spellcheck="false" aria-label="Tìm bộ thẻ Pokémon" placeholder="Tìm tên pack / bộ thẻ… Ví dụ: Mega Evolution">
          <button id="ph-set-search-clear" class="ph-set-search-clear" type="button" aria-label="Xóa tìm kiếm" hidden="">×</button>
        </div>
        <div class="ph-set-search-meta" id="ph-set-search-meta" aria-live="polite">Nhập tên bộ thẻ để lọc nhanh.</div>
        <div class="ph-set-search-suggestions" id="ph-set-search-suggestions" role="listbox" aria-label="Bộ thẻ phù hợp" hidden=""></div>
      </div>
      <div id="ph-status">Đang tải danh sách bộ thẻ…</div>
      <div class="ph-exp-grid" id="ph-exp-grid"></div>

      <!-- nhận diện / bản quyền vnGame.tv -->
      <div class="ph-brand-footer" aria-label="Thông tin vnGame.tv">
        <div class="ph-brand-footer-main">vnGame.tv <span aria-hidden="true">·</span> Nơi mỗi pack là một cuộc phiêu lưu — săn hit hiếm, hoàn thiện collection và ghi tên trên BXH!</div>
        <div class="ph-brand-footer-meta">
          <span class="ph-brand-set-count">Đang kiểm tra danh sách bộ…</span>
          <span aria-hidden="true">·</span>
          <span>© 2026 vnGame.tv · All rights reserved.</span>
        </div>
      </div>
    </div>

    <!-- màn hình 2: mở gói -->
    <div class="ph-screen" id="ph-screen-open">
      <button class="ph-back" id="ph-back-btn">← Chọn bộ thẻ khác</button>

      <div class="ph-mini-progress" id="ph-set-progress" hidden="" aria-live="polite">
        <div class="ph-mini-progress-top">
          <div class="ph-mini-progress-left">
            <span class="ph-mini-progress-kicker">SƯU TẬP</span>
            <span class="ph-mini-progress-title" id="ph-set-progress-title">—</span>
            <span class="ph-mini-progress-meta" id="ph-set-progress-meta">0/0 lá</span>
          </div>
          <span class="ph-mini-progress-pct" id="ph-set-progress-pct">0%</span>
        </div>
        <div class="ph-mini-progress-track" aria-hidden="true">
          <span class="ph-mini-progress-bar" id="ph-set-progress-bar"></span>
        </div>
      </div>

      <div class="ph-stage" id="ph-stage">
        <div class="ph-pack" id="ph-pack" role="button" tabindex="0" aria-label="Mở gói bài">
          <div class="ph-pack-label" id="ph-pack-label">Genetic Apex</div>
        </div>
        <div class="ph-hint" id="ph-hint">Chạm vào gói bài để mở</div>
        <div class="ph-box-row" id="ph-box-row" hidden="">
          <span class="ph-box-lbl">Mở nhiều gói một lần:</span>
          <button class="ph-chip" type="button" data-packs="1">1 gói</button>
          <button class="ph-chip" type="button" data-packs="3">3 gói</button>
          <button class="ph-chip" type="button" data-packs="5">5 gói</button>
          <button class="ph-chip ph-chip-hot" type="button" data-packs="10">Cả hộp · 10 gói</button>
        </div>
        <div class="ph-err" id="ph-open-err" hidden=""></div>
      </div>

      <div class="ph-progress-panel" id="ph-progress" hidden="">
        <div class="ph-progress-text" id="ph-progress-text">Đang mở hộp…</div>
        <div class="ph-progress-track"><div class="ph-progress-bar" id="ph-progress-bar"></div></div>
        <div class="ph-progress-sub">Đang lấy dữ liệu và giá của từng lá bài từ TCGdex…</div>
      </div>

      <div class="ph-reveal" id="ph-reveal">
        <div class="ph-pull-heading">Kết quả rút bài</div>
        <div class="ph-card-row" id="ph-card-row"></div>
        <div class="ph-banner" id="ph-banner"></div>
        <div class="ph-luck" id="ph-luck" hidden="">Điểm may mắn <b id="ph-luck-score">—</b>/100</div>
        <div class="ph-total" id="ph-total" hidden="">Tổng giá trị gói bài: <b id="ph-total-val">—</b></div>
        <div class="ph-quip" id="ph-quip"></div>
        <div class="ph-saved" id="ph-saved"></div>
        <div class="ph-actions">
          <button class="ph-btn ph-primary" id="ph-again-btn">Mở gói khác</button>
          <button class="ph-btn" id="ph-share-btn">Chia sẻ ảnh</button>
          <button class="ph-btn" id="ph-change-btn">Đổi bộ thẻ</button>
        </div>
      </div>

      <div class="ph-reveal" id="ph-box-result">
        <div id="ph-box-body"></div>
        <div class="ph-actions">
          <button class="ph-btn ph-primary" id="ph-box-again">Mở hộp nữa</button>
          <button class="ph-btn" id="ph-box-share">Chia sẻ ảnh</button>
          <button class="ph-btn" id="ph-box-change">Đổi bộ thẻ</button>
        </div>
      </div>

      <!-- nhận diện / bản quyền vnGame.tv ở cuối khu vực mở pack -->
      <div class="ph-brand-footer" aria-label="Thông tin vnGame.tv">
        <div class="ph-brand-footer-main">vnGame.tv <span aria-hidden="true">·</span> Nơi mỗi pack là một cuộc phiêu lưu — săn hit hiếm, hoàn thiện collection và ghi tên trên BXH!</div>
        <div class="ph-brand-footer-meta">
          <span class="ph-brand-set-count">Đang kiểm tra danh sách bộ…</span>
          <span aria-hidden="true">·</span>
          <span>© 2026 vnGame.tv · All rights reserved.</span>
        </div>
      </div>

    </div>
  </div>

  <!-- modal chi tiết lá bài -->
  <div class="ph-modal" id="ph-modal" hidden="">
    <div class="ph-modal-backdrop" id="ph-modal-backdrop"></div>
    <div class="ph-modal-card" role="dialog" aria-modal="true" aria-label="Chi tiết lá bài">
      <button class="ph-modal-close" id="ph-modal-close" type="button" aria-label="Đóng">✕</button>
      <div class="ph-modal-body" id="ph-modal-body"></div>
    </div>
  </div>

  <!-- modal bộ sưu tập + ROI -->
  <div class="ph-modal" id="ph-col-modal" hidden="">
    <div class="ph-modal-backdrop" id="ph-col-backdrop"></div>
    <div class="ph-modal-card ph-modal-wide" role="dialog" aria-modal="true" aria-label="Bộ sưu tập">
      <button class="ph-modal-close" id="ph-col-close" type="button" aria-label="Đóng">✕</button>
      <div class="ph-modal-title" style="margin-bottom:14px;">Bộ sưu tập &amp; ROI</div>
      <div class="ph-modal-body" id="ph-col-body"></div>
    </div>
  </div>

  <!-- modal thử thách -->
  <div class="ph-modal" id="ph-challenge-modal" hidden="">
    <div class="ph-modal-backdrop" id="ph-challenge-backdrop"></div>
    <div class="ph-modal-card ph-modal-wide" role="dialog" aria-modal="true" aria-label="Thử thách">
      <button class="ph-modal-close" id="ph-challenge-close" type="button" aria-label="Đóng">✕</button>
      <div class="ph-modal-title" style="margin-bottom:6px;">Thử thách</div>
      <div class="ph-col-note" style="margin-bottom:14px;">Hoàn thành nhiệm vụ bằng cách mở pack và sưu tầm card. Tiến độ lưu trên chính trình duyệt này.</div>
      <div class="ph-modal-body" id="ph-challenge-body"></div>
    </div>
  </div>

  <!-- modal cửa hàng đổi thưởng -->
  <div class="ph-modal" id="ph-shop-modal" hidden="">
    <div class="ph-modal-backdrop" id="ph-shop-backdrop"></div>
    <div class="ph-modal-card ph-modal-wide" role="dialog" aria-modal="true" aria-label="Cửa hàng đổi thưởng">
      <button class="ph-modal-close" id="ph-shop-close" type="button" aria-label="Đóng">✕</button>
      <div class="ph-modal-title" style="margin-bottom:6px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f381.png" alt="🎁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Cửa hàng đổi thưởng</div>
      <div class="ph-col-note" style="margin-bottom:14px;">Dùng <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> điểm thưởng để đổi vật phẩm. Điểm không mất khi nhiệm vụ 30 phút được làm mới.</div>
      <div class="ph-modal-body" id="ph-shop-body"></div>
    </div>
  </div>


  <!-- modal bảng xếp hạng realtime -->
  <div class="ph-modal" id="ph-leaderboard-modal" hidden="">
    <div class="ph-modal-backdrop" id="ph-leaderboard-backdrop"></div>
    <div class="ph-modal-card ph-modal-wide" role="dialog" aria-modal="true" aria-label="Bảng xếp hạng realtime">
      <button class="ph-modal-close" id="ph-leaderboard-close" type="button" aria-label="Đóng">✕</button>
      <div class="ph-modal-title" style="margin-bottom:12px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sảnh Vinh Danh Trainer</div>
      <div class="ph-col-note" style="margin-bottom:14px;">Xếp hạng theo tổng giá trị bộ sưu tập. Gói mở chỉ là chỉ số phụ; dữ liệu cập nhật realtime giữa những người đang dùng widget.</div>
      <div class="ph-modal-body" id="ph-leaderboard-body"></div>
    </div>
  </div>

  <!-- modal Chase Card: mục tiêu săn thẻ và tiến độ theo bộ -->
  <div class="ph-modal" id="ph-chase-modal" hidden="">
    <div class="ph-modal-backdrop" id="ph-chase-backdrop"></div>
    <div class="ph-modal-card ph-modal-wide" role="dialog" aria-modal="true" aria-label="Chase Card - Săn thẻ mục tiêu">
      <button class="ph-modal-close" id="ph-chase-close" type="button" aria-label="Đóng">✕</button>
      <div class="ph-modal-title ph-chase-modal-title" style="margin-bottom:6px;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Chase Card · Săn thẻ mục tiêu</div>
      <div class="ph-col-note" style="margin-bottom:14px;">Đánh dấu lá muốn săn ngay trong Chi tiết pack: bấm “Xem chi tiết pack”, chọn lá bài, rồi chọn “Đặt làm Chase Card”. Tiến độ được theo dõi trên trình duyệt này.</div>
      <div class="ph-modal-body" id="ph-chase-body"></div>
    </div>
  </div>

  <!-- modal nhập nickname -->
  <div class="ph-modal ph-welcome-modal" id="ph-welcome-modal" hidden="">
    <div class="ph-modal-backdrop"></div>
    <div class="ph-welcome-card" role="dialog" aria-modal="true" aria-label="Chọn nickname trainer">
      <div class="ph-welcome-icon" aria-hidden="true"><span>◉</span></div>
      <div class="ph-welcome-title">WELCOME, TRAINER!</div>
      <div class="ph-welcome-sub">Chọn nickname của bạn trước khi bắt đầu.<br>Nickname này sẽ được dùng để lưu thành tích<br>trên Global Leaderboard.</div>
      <input id="ph-trainer-name" class="ph-welcome-input" type="text" maxlength="18" autocomplete="nickname" placeholder="Ví dụ: AshVN" aria-label="Nickname trainer">
      <div class="ph-welcome-error" id="ph-welcome-error" role="alert"></div>
      <button id="ph-welcome-start" class="ph-welcome-start" type="button"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Bắt đầu chơi</button>
    </div>
  </div>
</div>

<style>
/* mọi thứ được giới hạn trong #pokehub-app nên sẽ không đụng tới CSS của theme */
#pokehub-app{
  overflow-anchor:none;
  --ph-void:#0a0b16;
  --ph-panel:#12142a;
  --ph-panel-2:#181b38;
  --ph-line:#2a2e55;
  --ph-text:#f2f1fb;
  --ph-dim:#9497c4;
  --ph-gold:#ffd35c;
  --ph-c1:#4a7fff;
  --ph-c2:#6be8c0;
  --ph-t2:#6be8c0;
  --ph-t3:#4a7fff;
  --ph-t4:#c96bff;
  --ph-t5:#ff8fd0;
  --ph-t6:#ffd35c;

  background:
    radial-gradient(1200px 700px at 15% -10%, #1c1f45 0%, transparent 60%),
    radial-gradient(1000px 700px at 110% 10%, #24123f 0%, transparent 55%),
    var(--ph-void);
  color:var(--ph-text);
  font-family:'Inter',system-ui,-apple-system,'Segoe UI',sans-serif;
  padding:26px 18px 56px;
  border-radius:16px;
  position:relative;
  overflow:hidden;
  line-height:1.5;
}
#pokehub-app *,#pokehub-app *::before,#pokehub-app *::after{box-sizing:border-box;}
#pokehub-app p,#pokehub-app h1,#pokehub-app div{margin:0;}
#pokehub-app .ph-wrap,
#pokehub-app .ph-tagline,
#pokehub-app .ph-err{margin-left:auto;margin-right:auto;}

#pokehub-app .ph-wrap{max-width:920px;margin:0 auto;position:relative;}

.ph-tools{display:flex;justify-content:flex-end;gap:8px;margin-bottom:10px;flex-wrap:wrap;}
.ph-tool{
  background:var(--ph-panel);border:1px solid var(--ph-line);color:var(--ph-text);
  border-radius:10px;height:38px;padding:0 13px;cursor:pointer;font:inherit;font-size:13px;
  display:flex;align-items:center;gap:7px;transition:border-color .15s ease;
}
.ph-tool:hover{border-color:var(--ph-gold);}
.ph-mute{width:38px;padding:0;justify-content:center;font-size:16px;}
.ph-mute.ph-muted{opacity:.5;}
.ph-col-count{
  background:var(--ph-gold);color:#0a0b16;border-radius:20px;padding:1px 7px;
  font-size:11px;font-weight:700;font-variant-numeric:tabular-nums;
}
.ph-col-count[hidden]{display:none;}

.ph-title{
  font-family:'Space Grotesk',system-ui,sans-serif;
  font-weight:700;
  font-size:clamp(26px,4.5vw,40px);
  letter-spacing:-.01em;
  text-align:center;
  color:var(--ph-text);
  margin:0;
}
.ph-dot{
  display:inline-block;width:0.2em;height:0.2em;margin-left:3px;border-radius:50%;
  background:var(--ph-gold);vertical-align:baseline;position:relative;top:-0.06em;
}
#pokehub-app .ph-tagline{
  text-align:center;color:var(--ph-dim);
  margin:12px auto 36px;font-size:15px;
  max-width:54ch;
  text-wrap:balance;
  text-wrap:pretty;
  padding:0 8px;
}
@supports (text-wrap:balance){ #pokehub-app .ph-tagline{ text-wrap:balance; } }

.ph-screen{display:none;}
.ph-screen.ph-active{display:block;}

#ph-status{text-align:center;color:var(--ph-dim);padding:40px 0;font-size:14px;}
#ph-status button{
  display:inline-block;margin:14px 6px 0;background:var(--ph-panel);color:var(--ph-text);
  border:1px solid var(--ph-line);border-radius:8px;padding:8px 16px;cursor:pointer;font:inherit;font-size:13px;
}
#ph-status button:hover{border-color:var(--ph-gold);}
#ph-status .ph-status-row{display:block;margin-top:10px;}
#ph-status .ph-progress{font-size:12px;color:var(--ph-dim);opacity:.8;display:block;margin-top:6px;}

.ph-exp-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;max-height:640px;overflow-y:auto;padding-right:4px;}
.ph-exp-card{
  min-width:0;min-height:230px;background:var(--ph-panel);border:1px solid var(--ph-line);border-radius:14px;
  padding:0;cursor:pointer;overflow:hidden;text-align:left;color:inherit;font:inherit;
  transition:transform .18s ease,border-color .18s ease;
}
.ph-exp-card:hover{transform:translateY(-4px);border-color:var(--ph-gold);}
.ph-exp-card:focus-visible{outline:2px solid var(--ph-gold);outline-offset:2px;}
@media (max-width:760px){
  .ph-exp-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;}
}
@media (max-width:480px){
  .ph-exp-grid{grid-template-columns:1fr;}
}
.ph-art{
  height:120px;position:relative;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(150deg,var(--c1) 0%,var(--c2) 100%);
  clip-path:polygon(0 0,100% 0,100% 86%,50% 100%,0 86%);
  padding:14px 20px;
}
.ph-art::before{
  content:'';position:absolute;inset:0;z-index:1;mix-blend-mode:overlay;pointer-events:none;
  background:repeating-linear-gradient(115deg,rgba(255,255,255,.16) 0 2px,transparent 2px 14px);
}
.ph-art .ph-art-bg{
  position:absolute;inset:0;width:100%;height:100%;z-index:0;display:block;object-fit:cover;object-position:center 38%;
}
.ph-art .ph-art-glyph{
  font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:30px;color:rgba(10,11,22,.55);
  position:relative;z-index:2;transition:opacity .15s ease;
}
.ph-art .ph-art-glyph-hidden{opacity:0;}
.ph-art .ph-art-logo{
  position:relative;z-index:3;max-width:100%;max-height:100%;object-fit:contain;
  filter:drop-shadow(0 3px 10px rgba(10,11,22,.45));
}
.ph-meta{padding:12px 14px 16px;display:block;}
.ph-meta .ph-name{font-weight:600;font-size:14.5px;line-height:1.3;}
.ph-meta .ph-series{color:var(--ph-dim);font-size:11px;margin-top:2px;text-transform:uppercase;letter-spacing:.04em;}
.ph-meta .ph-count{color:var(--ph-dim);font-size:12px;margin-top:4px;}

.ph-exp-progress{display:block;visibility:visible;margin-top:8px;padding-top:0;}
.ph-exp-progress-meta{display:block;color:var(--ph-dim);font-size:10.5px;font-weight:600;margin-bottom:5px;font-variant-numeric:tabular-nums;line-height:1.2;}
.ph-exp-progress-track{display:block;width:100%;height:5px;background:#0d1020;border:1px solid var(--ph-line);border-radius:99px;overflow:hidden;}
.ph-exp-progress-fill{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));border-radius:inherit;transition:width .25s ease;}

.ph-mini-progress{
  margin:0 auto 10px;max-width:920px;padding:8px 12px 9px;
  background:rgba(18,20,42,.78);border:1px solid var(--ph-line);border-radius:10px;
}
.ph-mini-progress-top{display:flex;align-items:center;justify-content:space-between;gap:12px;}
.ph-mini-progress-left{display:flex;align-items:baseline;gap:8px;min-width:0;flex-wrap:wrap;}
.ph-mini-progress-kicker{font-size:9px;letter-spacing:.13em;color:var(--ph-dim);font-weight:700;}
.ph-mini-progress-title{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:42vw;}
.ph-mini-progress-meta{font-size:11px;color:var(--ph-dim);white-space:nowrap;}
.ph-mini-progress-pct{font-family:'Space Grotesk',sans-serif;font-size:16px;font-weight:700;color:var(--ph-gold);font-variant-numeric:tabular-nums;white-space:nowrap;}
.ph-mini-progress-track{height:4px;margin-top:6px;background:#0d1020;border-radius:99px;overflow:hidden;}
.ph-mini-progress-bar{display:block;height:100%;width:0;border-radius:inherit;background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));transition:width .35s ease;}
.ph-missing-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(76px,1fr));gap:8px;
  max-height:360px;overflow:auto;padding:2px;
}
.ph-missing-card{
  appearance:none;border:1px solid var(--ph-line);background:var(--ph-panel);
  border-radius:9px;padding:0 0 6px;color:var(--ph-text);cursor:pointer;text-align:left;min-width:0;
  transition:transform .15s ease,border-color .15s ease;
}
.ph-missing-card:hover{transform:translateY(-2px);border-color:var(--ph-gold);}
.ph-missing-img{display:flex;align-items:center;justify-content:center;aspect-ratio:245/337;background:var(--ph-panel-2);border-radius:8px 8px 0 0;overflow:hidden;color:var(--ph-dim);font-size:9px;text-align:center;padding:4px;}
.ph-missing-img img{width:100%;height:100%;object-fit:cover;display:block;}
.ph-missing-name{display:block;font-size:9.5px;color:var(--ph-dim);padding:5px 6px 0;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ph-missing-empty{
  display:flex;align-items:center;justify-content:center;gap:8px;padding:18px 10px;
  color:var(--ph-t2);background:rgba(107,232,192,.06);border:1px solid rgba(107,232,192,.18);border-radius:10px;
  font-size:12px;
}
.ph-collection-set-detail{
  margin-top:14px;padding-top:16px;border-top:1px solid var(--ph-line);
}
.ph-collection-set-detail-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;margin-bottom:10px;}
.ph-collection-set-detail-title{font-family:'Space Grotesk',sans-serif;font-size:17px;font-weight:700;}
.ph-collection-set-detail-meta{font-size:11.5px;color:var(--ph-dim);margin-top:2px;}
.ph-collection-set-detail-pct{font-family:'Space Grotesk',sans-serif;font-size:20px;font-weight:700;color:var(--ph-gold);}
.ph-collection-set-detail-track{height:7px;background:#0d1020;border:1px solid var(--ph-line);border-radius:99px;overflow:hidden;margin-bottom:12px;}
.ph-collection-set-detail-fill{height:100%;width:0;background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));border-radius:inherit;}
.ph-collection-missing-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:8px;}
.ph-collection-missing-count{font-size:12.5px;font-weight:700;}
.ph-collection-missing-note{font-size:11px;color:var(--ph-dim);}
.ph-set-overview{margin-top:0;}
.ph-set-overview-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;max-height:330px;overflow:auto;padding-right:2px;}
.ph-set-overview-item{background:var(--ph-panel-2);border:1px solid var(--ph-line);border-radius:10px;padding:10px 11px;}
.ph-set-overview-top{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.ph-set-overview-name{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ph-set-overview-pct{font-family:'Space Grotesk',sans-serif;font-size:13px;font-weight:700;color:var(--ph-gold);}
.ph-set-overview-meta{font-size:10.5px;color:var(--ph-dim);margin:3px 0 6px;}
.ph-current-chip{display:inline-block;margin-top:6px;padding:2px 7px;border-radius:99px;background:rgba(255,211,92,.1);border:1px solid rgba(255,211,92,.25);color:var(--ph-gold);font-size:9px;font-weight:700;}


.ph-novelty-badge{
  position:absolute;top:6px;left:6px;z-index:5;min-width:30px;height:22px;padding:0 7px;
  display:flex;align-items:center;justify-content:center;border-radius:7px;
  font-family:'Space Grotesk',sans-serif;font-size:10px;font-weight:800;letter-spacing:.02em;
  box-shadow:0 6px 16px rgba(0,0,0,.45);backdrop-filter:blur(5px);
  pointer-events:none;
}
.ph-new{background:rgba(107,232,192,.95);color:#08110f;border:1px solid rgba(255,255,255,.35);}
.ph-duplicate{background:rgba(255,211,92,.95);color:#171204;border:1px solid rgba(255,255,255,.35);}
.ph-shop-new-badge{left:auto;right:6px;top:6px;}


.ph-back{
  background:none;border:none;color:var(--ph-dim);cursor:pointer;font:inherit;font-size:13px;
  padding:0;margin-bottom:18px;
}
.ph-back:hover{color:var(--ph-text);}

.ph-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:420px;}
.ph-pack{
  width:180px;height:250px;border-radius:14px;position:relative;cursor:pointer;
  background:linear-gradient(150deg,var(--ph-c1) 0%,var(--ph-c2) 100%);
  box-shadow:0 20px 50px -10px rgba(0,0,0,.6);
  display:flex;align-items:center;justify-content:center;
  transition:transform .2s ease;animation:ph-float 3.2s ease-in-out infinite;
}
.ph-pack::before{
  content:'';position:absolute;inset:0;border-radius:14px;mix-blend-mode:overlay;
  background:repeating-linear-gradient(115deg,rgba(255,255,255,.18) 0 2px,transparent 2px 16px);
}
.ph-pack::after{content:'';position:absolute;left:0;right:0;top:38%;height:2px;background:rgba(10,11,22,.35);}
.ph-pack-label{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:15px;color:rgba(10,11,22,.75);text-align:center;padding:0 18px;z-index:1;}
.ph-pack:hover{transform:scale(1.03);}
.ph-pack.ph-ripping{animation:ph-rip .55s ease forwards;}
.ph-pack.ph-busy{cursor:progress;opacity:.75;}
@keyframes ph-float{0%,100%{transform:translateY(0);}50%{transform:translateY(-8px);}}
@keyframes ph-rip{
  0%{transform:scale(1);}
  35%{transform:scale(1.08) rotate(-2deg);}
  70%{transform:scale(1.25) rotate(2deg);filter:brightness(2);}
  100%{transform:scale(1.6);opacity:0;filter:brightness(3);}
}
.ph-hint{margin-top:22px;color:var(--ph-dim);font-size:13px;}

.ph-box-row{
  display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap;
  margin-top:18px;
}
.ph-box-row[hidden]{display:none;}
.ph-box-lbl{color:var(--ph-dim);font-size:12.5px;}
.ph-chip{
  background:var(--ph-panel);border:1px solid var(--ph-line);color:var(--ph-text);
  border-radius:20px;padding:7px 14px;font:inherit;font-size:12.5px;cursor:pointer;
  transition:border-color .15s ease,transform .15s ease;
}
.ph-chip:hover{border-color:var(--ph-gold);transform:translateY(-2px);}
.ph-chip-hot{border-color:rgba(255,211,92,.5);color:var(--ph-gold);font-weight:600;}

.ph-progress-panel{padding:60px 10px;text-align:center;}
.ph-progress-panel[hidden]{display:none;}
.ph-progress-text{font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:16px;}
.ph-progress-track{
  max-width:420px;margin:16px auto 0;height:8px;border-radius:99px;
  background:var(--ph-panel-2);border:1px solid var(--ph-line);overflow:hidden;
}
.ph-progress-bar{height:100%;width:0;background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));transition:width .2s ease;}
.ph-progress-sub{color:var(--ph-dim);font-size:12.5px;margin-top:12px;}

.ph-flash{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none !important;z-index:5;}
.ph-flash.ph-go{animation:ph-flash .5s ease forwards;}
@keyframes ph-flash{0%{opacity:0;}15%{opacity:.9;}100%{opacity:0;}}

.ph-confetti{position:absolute;inset:0;width:100%;height:100%;pointer-events:none !important;z-index:6;}

.ph-toast{
  position:absolute;left:50%;bottom:18px;transform:translate(-50%,14px);
  background:#1c1f45;border:1px solid var(--ph-line);color:var(--ph-text);
  padding:10px 16px;border-radius:10px;font-size:13px;max-width:min(92%,480px);
  text-align:center;opacity:0;pointer-events:none;z-index:20;
  transition:opacity .2s ease,transform .2s ease;box-shadow:0 14px 40px -12px rgba(0,0,0,.8);
}
.ph-toast.ph-show{opacity:1;transform:translate(-50%,0);}

.ph-reveal{display:none;}
.ph-reveal.ph-active{display:block;}
.ph-reveal.ph-extract-source{position:relative;}
.ph-reveal.ph-extract-source::before{
  content:'';position:absolute;left:50%;top:34px;width:82px;height:116px;transform:translateX(-50%);
  border-radius:10px 10px 8px 8px;pointer-events:none;opacity:.92;z-index:0;
  background:linear-gradient(145deg,var(--ph-c1),var(--ph-c2));
  border:1px solid rgba(255,255,255,.16);
  box-shadow:0 14px 28px rgba(0,0,0,.34),0 0 24px rgba(74,127,255,.16);
  clip-path:polygon(0 0,100% 0,88% 7%,100% 14%,88% 21%,100% 28%,88% 35%,100% 42%,88% 49%,100% 56%,88% 63%,100% 70%,88% 77%,100% 84%,88% 91%,100% 100%,0 100%,12% 91%,0 84%,12% 77%,0 70%,12% 63%,0 56%,12% 49%,0 42%,12% 35%,0 28%,12% 21%,0 14%,12% 7%);
}
.ph-reveal.ph-extract-source .ph-pull-heading,.ph-reveal.ph-extract-source .ph-card-row{position:relative;z-index:1;}
.ph-reveal.ph-extract-source .ph-pull-heading{z-index:2;}
.ph-pull-heading{text-align:center;font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:14px;color:var(--ph-dim);margin-bottom:18px;}
.ph-card-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;perspective:1000px;position:relative;}
@media (max-width:640px){.ph-card-row{gap:6px;}}
.ph-slot{aspect-ratio:245/337;position:relative;cursor:pointer;}
.ph-inner{position:relative;width:100%;height:100%;transform-style:preserve-3d;transition:transform .6s cubic-bezier(.2,.8,.2,1);}
.ph-card-col{min-width:0;perspective:1000px;}
.ph-card-col.ph-extracting{
  opacity:0;
  transform:translateY(-92px) scale(.72) rotate(-4deg);
  animation:ph-card-extract .58s cubic-bezier(.2,.8,.2,1) forwards;
  animation-delay:var(--ph-extract-delay,0ms);
  position:relative;z-index:2;transform-origin:50% 100%;
}
@keyframes ph-card-extract{
  0%{opacity:0;transform:translateY(-92px) scale(.72) rotate(-4deg);}
  32%{opacity:1;transform:translateY(-38px) scale(.86) rotate(2deg);}
  62%{opacity:1;transform:translateY(7px) scale(1.03) rotate(-.8deg);}
  82%{opacity:1;transform:translateY(-2px) scale(.995) rotate(.25deg);}
  100%{opacity:1;transform:translateY(0) scale(1) rotate(0);}
}
.ph-slot.ph-tremble{animation:ph-tremble .22s ease-in-out 0s 3;}
.ph-slot.ph-tremble-strong{animation:ph-tremble-strong .24s ease-in-out 0s 4;}
.ph-slot.ph-last-anticipation{animation:ph-tremble-strong .24s ease-in-out 0s 3,ph-last-pulse .9s ease-in-out;}
@keyframes ph-tremble{
  0%,100%{transform:translateX(0) rotate(0);}
  25%{transform:translateX(-2px) rotate(-.6deg);}
  50%{transform:translateX(2px) rotate(.6deg);}
  75%{transform:translateX(-1px) rotate(-.35deg);}
}
@keyframes ph-tremble-strong{
  0%,100%{transform:translateX(0) rotate(0) scale(1);}
  20%{transform:translateX(-3px) rotate(-1deg) scale(1.008);}
  40%{transform:translateX(3px) rotate(1deg) scale(1.012);}
  60%{transform:translateX(-3px) rotate(-1deg) scale(1.008);}
  80%{transform:translateX(2px) rotate(.8deg) scale(1.01);}
}
@keyframes ph-last-pulse{0%,100%{filter:none;}45%{filter:brightness(1.2);}65%{filter:brightness(.95);}}
.ph-slot.ph-chase-6{animation:ph-chase-6 1.18s cubic-bezier(.22,.8,.24,1) both;}
@keyframes ph-chase-6{
  0%{transform:translateX(0) rotate(0) scale(1);filter:brightness(1);}
  17%{transform:translateX(-3px) rotate(-1deg) scale(1.01);filter:brightness(1.22);}
  28%{transform:translateX(0) rotate(0) scale(1);filter:brightness(1);}
  47%{transform:translateX(4px) rotate(1.1deg) scale(1.018);filter:brightness(1.32);}
  58%{transform:translateX(0) rotate(0) scale(1);filter:brightness(1.02);}
  74%{transform:translateX(-5px) rotate(-1.3deg) scale(1.03);filter:brightness(1.52);}
  82%{transform:translateX(0) rotate(0) scale(1.01);filter:brightness(1.12);}
  100%{transform:translateX(0) rotate(0) scale(1);filter:brightness(1);}
}
@media (prefers-reduced-motion:reduce){
  .ph-card-col.ph-extracting{animation:none;opacity:1;transform:none;}
  .ph-slot.ph-tremble,.ph-slot.ph-tremble-strong,.ph-slot.ph-last-anticipation,.ph-slot.ph-chase-6{animation:none;}
}
.ph-slot.ph-flipped .ph-inner{transform:rotateY(180deg);}
.ph-face{position:absolute;inset:0;border-radius:8px;backface-visibility:hidden;overflow:hidden;display:flex;align-items:center;justify-content:center;}
.ph-back-face{
  background:radial-gradient(circle at 50% 40%,#262a52 0%,#14162c 70%);
  border:1px solid var(--ph-line);color:var(--ph-dim);
  font-family:'Space Grotesk',sans-serif;font-size:26px;
}
.ph-front-face{transform:rotateY(180deg);background:var(--ph-panel-2);border:1px solid var(--ph-line);}
.ph-front-face img{width:100%;height:100%;object-fit:cover;display:block;}
.ph-image-fallback{font-size:11px;color:var(--ph-dim);padding:8px;text-align:center;line-height:1.3;}
.ph-slot[data-tier="2"] .ph-front-face{box-shadow:0 0 0 2px var(--ph-t2),0 0 18px -2px var(--ph-t2);}
.ph-slot[data-tier="3"] .ph-front-face{box-shadow:0 0 0 2px var(--ph-t3),0 0 22px -2px var(--ph-t3);}
.ph-slot[data-tier="4"] .ph-front-face{box-shadow:0 0 0 2px var(--ph-t4),0 0 26px 0 var(--ph-t4);}
.ph-slot[data-tier="5"] .ph-front-face{box-shadow:0 0 0 3px var(--ph-t5),0 0 32px 2px var(--ph-t5);}
.ph-slot[data-tier="6"] .ph-front-face{box-shadow:0 0 0 3px var(--ph-t6),0 0 44px 4px var(--ph-t6);}
.ph-slot[data-tier="4"].ph-flipped,.ph-slot[data-tier="5"].ph-flipped,.ph-slot[data-tier="6"].ph-flipped{z-index:2;}
.ph-slot[data-tier="4"].ph-flipped .ph-front-face::before,
.ph-slot[data-tier="5"].ph-flipped .ph-front-face::before,
.ph-slot[data-tier="6"].ph-flipped .ph-front-face::before{
  content:'';position:absolute;inset:0;mix-blend-mode:overlay;
  background:linear-gradient(115deg,transparent 40%,rgba(255,255,255,.55) 50%,transparent 60%);
  background-size:250% 250%;animation:ph-shine 1.8s ease-in-out infinite;
}
@keyframes ph-shine{0%{background-position:-40% -40%;}100%{background-position:140% 140%;}}
.ph-card-label{text-align:center;font-size:11.5px;color:var(--ph-dim);margin-top:8px;min-height:30px;line-height:1.4;}
.ph-card-price{color:var(--ph-gold);font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap;}
.ph-card-price.ph-card-noprice{color:var(--ph-dim);font-weight:400;}

.ph-banner{
  text-align:center;margin:30px 0 6px;min-height:34px;
  font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:20px;
  opacity:0;transform:translateY(6px);transition:opacity .4s ease,transform .4s ease;
}
.ph-banner.ph-show{opacity:1;transform:translateY(0);}
.ph-banner.ph-rare{color:var(--ph-t3);}
.ph-banner.ph-star{color:var(--ph-t4);}
.ph-banner.ph-shiny{color:var(--ph-t5);}
.ph-banner.ph-crown{color:var(--ph-gold);text-shadow:0 0 18px rgba(255,211,92,.6);}

.ph-luck{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--ph-dim);font-size:14px;margin-top:10px;}
.ph-luck b{color:var(--ph-text);font-family:'Space Grotesk',sans-serif;font-size:16px;font-variant-numeric:tabular-nums;}
.ph-total{text-align:center;color:var(--ph-dim);font-size:14px;margin-top:6px;}
.ph-total b{color:var(--ph-gold);font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:16px;font-variant-numeric:tabular-nums;}
.ph-saved{text-align:center;color:var(--ph-dim);font-size:12.5px;margin-top:8px;}

.ph-quip{
  text-align:center;font-size:14px;font-weight:500;margin-top:12px;min-height:20px;
  opacity:0;transform:translateY(4px);transition:opacity .4s ease,transform .4s ease;
}
.ph-quip.ph-show{opacity:1;transform:translateY(0);}
.ph-quip-bad{color:var(--ph-dim);}
.ph-quip-meh{color:var(--ph-text);opacity:.8;}
.ph-quip-good{color:var(--ph-t5);}
.ph-quip-great{color:var(--ph-t5);text-shadow:0 0 16px rgba(255,143,208,.45);}

.ph-actions{display:flex;gap:12px;justify-content:center;margin-top:30px;flex-wrap:wrap;}
.ph-btn{
  font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:14px;
  padding:12px 22px;border-radius:10px;border:1px solid var(--ph-line);
  background:var(--ph-panel);color:var(--ph-text);cursor:pointer;
  transition:border-color .15s ease,transform .15s ease;
}
.ph-btn:hover{transform:translateY(-2px);border-color:var(--ph-gold);}
.ph-btn.ph-small{padding:8px 14px;font-size:12.5px;}
.ph-btn.ph-danger{color:#ff9a9a;}
.ph-primary{background:linear-gradient(120deg,var(--ph-c1),var(--ph-c2));border:none;color:#0a0b16;}
#pokehub-app .ph-err{text-align:center;color:#ff9a9a;font-size:13px;margin:14px auto 0;max-width:46ch;}

/* ---------- nhận diện / bản quyền vnGame.tv ---------- */
#pokehub-app .ph-brand-footer{
  width:100%;
  max-width:920px;
  margin:26px auto 0;
  padding:15px 16px 13px;
  text-align:center;
  border-top:1px solid rgba(148,151,196,.18);
  background:linear-gradient(180deg,rgba(18,20,42,.30),rgba(18,20,42,.10));
  border-radius:0 0 12px 12px;
  color:var(--ph-dim);
  font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
}
#pokehub-app .ph-brand-footer-main{
  color:var(--ph-text);
  font-size:12.5px;
  line-height:1.55;
  font-weight:600;
  text-wrap:balance;
}
#pokehub-app .ph-brand-footer-main span,
#pokehub-app .ph-brand-footer-meta span[aria-hidden="true"]{
  color:var(--ph-gold);
}
#pokehub-app .ph-brand-footer-meta{
  display:flex;
  justify-content:center;
  align-items:center;
  gap:8px;
  flex-wrap:wrap;
  margin-top:6px;
  color:var(--ph-dim);
  font-size:10.5px;
  line-height:1.45;
  letter-spacing:.01em;
}
#pokehub-app .ph-brand-footer-meta span:last-child{
  color:rgba(242,241,251,.62);
}
@media (max-width:520px){
  #pokehub-app .ph-brand-footer{
    margin-top:22px;
    padding:13px 12px 12px;
  }
  #pokehub-app .ph-brand-footer-main{
    font-size:11.5px;
  }
  #pokehub-app .ph-brand-footer-meta{
    font-size:10px;
    gap:6px;
  }
}

/* bảng ROI của hộp: chỉ hiện sau khi lật hết 5 lá tinh hoa */
.ph-box-stats{
  opacity:0;transform:translateY(10px);pointer-events:none;
  transition:opacity .5s ease,transform .5s ease;
  margin-top:8px;padding-top:4px;
}
.ph-box-stats.ph-show{opacity:1;transform:translateY(0);pointer-events:auto;}

/* ---------- thống kê / bộ sưu tập ---------- */
.ph-stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:14px;}
.ph-stat{background:var(--ph-panel-2);border:1px solid var(--ph-line);border-radius:12px;padding:12px 14px;}
.ph-stat-v{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:20px;font-variant-numeric:tabular-nums;}
.ph-stat-l{color:var(--ph-dim);font-size:11.5px;margin-top:2px;}
.ph-stat.ph-pos .ph-stat-v{color:var(--ph-t2);}
.ph-stat.ph-neg .ph-stat-v{color:#ff9a9a;}
.ph-col-note{color:var(--ph-dim);font-size:12.5px;margin-bottom:12px;}
.ph-col-ctl{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:6px;}
.ph-col-ctl label{color:var(--ph-dim);font-size:12.5px;display:flex;align-items:center;gap:8px;}
.ph-col-ctl input{
  width:92px;background:var(--ph-panel-2);border:1px solid var(--ph-line);color:var(--ph-text);
  border-radius:8px;padding:7px 9px;font:inherit;font-size:13px;
}

.ph-bar-row{display:flex;align-items:center;gap:10px;margin-bottom:6px;font-size:12.5px;}
.ph-bar-l{color:var(--ph-dim);flex:0 0 118px;}
.ph-bar-w{flex:1;height:8px;background:var(--ph-panel-2);border-radius:99px;overflow:hidden;}
.ph-bar-f{display:block;height:100%;background:var(--ph-dim);}
.ph-bar-f[data-tier="2"]{background:var(--ph-t2);}
.ph-bar-f[data-tier="3"]{background:var(--ph-t3);}
.ph-bar-f[data-tier="4"]{background:var(--ph-t4);}
.ph-bar-f[data-tier="5"]{background:var(--ph-t5);}
.ph-bar-f[data-tier="6"]{background:var(--ph-t6);}
.ph-bar-n{flex:0 0 42px;text-align:right;color:var(--ph-text);font-variant-numeric:tabular-nums;}

.ph-thumb-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:12px;}
.ph-thumb.ph-clickable{cursor:pointer;}
.ph-thumb-img{
  aspect-ratio:245/337;border-radius:8px;overflow:hidden;background:var(--ph-panel-2);
  position:relative;
  border:1px solid var(--ph-line);display:flex;align-items:center;justify-content:center;
  font-size:11px;color:var(--ph-dim);text-align:center;padding:6px;
}
.ph-thumb-img img{width:100%;height:100%;object-fit:cover;display:block;}
.ph-thumb-img[data-tier="4"]{box-shadow:0 0 0 2px var(--ph-t4);}
.ph-thumb-img[data-tier="5"]{box-shadow:0 0 0 2px var(--ph-t5);}
.ph-thumb-img[data-tier="6"]{box-shadow:0 0 0 2px var(--ph-t6);}
.ph-thumb-name{font-size:11.5px;margin-top:6px;line-height:1.35;}
.ph-thumb-price{font-size:12px;color:var(--ph-gold);font-weight:600;font-variant-numeric:tabular-nums;}
.ph-thumb-price.ph-card-noprice{color:var(--ph-dim);font-weight:400;font-size:11px;}

.ph-set-overview-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:9px;}
.ph-set-overview-item{background:var(--ph-panel-2);border:1px solid var(--ph-line);border-radius:10px;padding:11px 12px;position:relative;}
.ph-set-overview-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;}
.ph-set-overview-name{font-size:12.5px;font-weight:600;line-height:1.3;}
.ph-set-overview-pct{font-family:'Space Grotesk',sans-serif;font-size:13px;font-weight:700;color:var(--ph-gold);white-space:nowrap;}
.ph-set-overview-meta{color:var(--ph-dim);font-size:10.5px;margin:4px 0 7px;}
.ph-current-chip{position:absolute;right:10px;bottom:9px;font-size:9px;padding:2px 6px;border-radius:99px;background:rgba(255,211,92,.12);color:var(--ph-gold);border:1px solid rgba(255,211,92,.25);}

/* ---------- thử thách ---------- */
.ph-challenge-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:10px;}
.ph-challenge-item{background:var(--ph-panel-2);border:1px solid var(--ph-line);border-radius:12px;padding:13px 14px;position:relative;overflow:hidden;}
.ph-challenge-item.ph-done{border-color:rgba(107,232,192,.45);box-shadow:0 0 0 1px rgba(107,232,192,.08) inset;}
.ph-challenge-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;}
.ph-challenge-name{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:14px;line-height:1.3;}
.ph-challenge-desc{font-size:11.5px;color:var(--ph-dim);margin-top:4px;line-height:1.45;}
.ph-challenge-status{flex:none;font-size:10px;font-weight:800;padding:3px 7px;border-radius:99px;background:rgba(255,211,92,.10);border:1px solid rgba(255,211,92,.25);color:var(--ph-gold);}
.ph-challenge-done{background:rgba(107,232,192,.10);border-color:rgba(107,232,192,.28);color:var(--ph-t2);}
.ph-challenge-progress{display:flex;align-items:center;gap:8px;margin-top:11px;}
.ph-challenge-track{flex:1;height:7px;background:#0d1020;border:1px solid var(--ph-line);border-radius:99px;overflow:hidden;}
.ph-challenge-fill{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));border-radius:inherit;transition:width .3s ease;}
.ph-challenge-meta{flex:0 0 auto;font-size:10.5px;color:var(--ph-text);font-variant-numeric:tabular-nums;}
.ph-challenge-foot{margin-top:8px;font-size:10.5px;color:var(--ph-dim);}
.ph-challenge-hero{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px;}
.ph-challenge-hero .ph-stat{padding:10px 11px;}
@media (max-width:560px){.ph-challenge-hero{grid-template-columns:1fr;}}

/* ---------- modal ---------- */
.ph-modal{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:20px;}
.ph-modal[hidden]{display:none;}
.ph-modal-backdrop{position:absolute;inset:0;background:rgba(6,7,16,.72);backdrop-filter:blur(2px);}
.ph-modal-card{
  position:relative;z-index:1;width:100%;max-width:640px;max-height:88vh;overflow-y:auto;
  background:var(--ph-panel);border:1px solid var(--ph-line);border-radius:16px;
  padding:26px 24px;box-shadow:0 30px 80px -20px rgba(0,0,0,.7);
  animation:ph-modal-in .22s cubic-bezier(.2,.8,.2,1);
  color:var(--ph-text);font-family:'Inter',system-ui,sans-serif;
}
.ph-modal-wide{max-width:860px;}
@keyframes ph-modal-in{from{opacity:0;transform:translateY(10px) scale(.98);}to{opacity:1;transform:translateY(0) scale(1);}}
.ph-modal-close{
  position:absolute;top:14px;right:14px;width:32px;height:32px;border-radius:9px;
  background:var(--ph-panel-2);border:1px solid var(--ph-line);color:var(--ph-text);
  cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center;
  transition:border-color .15s ease;z-index:2;
}
.ph-modal-close:hover{border-color:var(--ph-gold);}
.ph-modal-head{display:flex;gap:22px;align-items:flex-start;}
.ph-modal-imgwrap{flex:0 0 180px;width:180px;aspect-ratio:245/337;border-radius:10px;overflow:hidden;background:var(--ph-panel-2);border:1px solid var(--ph-line);display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--ph-dim);text-align:center;padding:8px;}
.ph-modal-imgwrap img{width:100%;height:100%;object-fit:cover;display:block;}
.ph-modal-info{flex:1;min-width:0;}
.ph-modal-title{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:20px;line-height:1.25;}
.ph-modal-sub{color:var(--ph-dim);font-size:12.5px;margin-top:4px;text-transform:uppercase;letter-spacing:.03em;}
.ph-modal-price{color:var(--ph-gold);font-weight:700;font-size:17px;margin-top:12px;font-variant-numeric:tabular-nums;}
.ph-modal-price.ph-card-noprice{color:var(--ph-dim);font-weight:500;font-size:13px;}
.ph-modal-rows{margin-top:14px;display:flex;flex-direction:column;gap:6px;}
.ph-modal-row{display:flex;gap:10px;font-size:13px;justify-content:space-between;}
.ph-modal-k{color:var(--ph-dim);}
.ph-modal-v{color:var(--ph-text);text-align:right;}
.ph-modal-section{margin-top:20px;padding-top:16px;border-top:1px solid var(--ph-line);}
.ph-modal-section-title{font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:13px;color:var(--ph-dim);text-transform:uppercase;letter-spacing:.04em;margin-bottom:10px;}
.ph-modal-attack + .ph-modal-attack{margin-top:10px;}
.ph-modal-attack-line{font-size:14px;font-weight:600;}
.ph-modal-attack-effect{font-size:13px;color:var(--ph-dim);margin-top:2px;line-height:1.5;}
.ph-modal-flavor{font-size:13.5px;color:var(--ph-dim);line-height:1.6;}
@media (max-width:520px){
  .ph-mini-progress-title{max-width:52vw;}
  .ph-mini-progress-left{gap:6px;}
  .ph-mini-progress-meta{font-size:10.5px;}
  .ph-mini-progress-pct{font-size:15px;}
  .ph-missing-grid{grid-template-columns:repeat(auto-fill,minmax(68px,1fr));max-height:300px;}
  .ph-modal-head{flex-direction:column;align-items:center;text-align:center;}
  .ph-modal-imgwrap{flex:0 0 auto;width:150px;}
  .ph-modal-row{justify-content:center;gap:6px;}
  .ph-modal-rows{align-items:center;}
}

@media (prefers-reduced-motion:reduce){
  #pokehub-app *{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;}
  .ph-confetti{display:none;}
  .ph-modal-card{animation:none;}
}

/* ============================================================
   ADD-ON: giao diện thưởng + đếm ngược nhiệm vụ 30 phút + cửa hàng đổi thưởng + sửa scroll mở pack
   ============================================================ */
.ph-challenge-refresh{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-bottom:12px;padding:11px 13px;border-radius:11px;
  background:linear-gradient(90deg,rgba(74,127,255,.10),rgba(107,232,192,.08));
  border:1px solid rgba(107,232,192,.20);color:var(--ph-text);
  font-size:12px;font-weight:600;
}
.ph-challenge-refresh b{
  color:var(--ph-gold);font-family:'Space Grotesk',sans-serif;
  font-size:15px;font-variant-numeric:tabular-nums;white-space:nowrap;
}
.ph-challenge-cycle-note{
  color:var(--ph-dim);font-size:11px;margin:-6px 0 12px;
  text-align:center;
}
.ph-challenge-reward{
  color:var(--ph-gold);font-weight:700;
}
.ph-challenge-complete-time{
  color:var(--ph-t2);font-size:10px;
}
.ph-challenge-item.ph-done .ph-challenge-reward{
  text-shadow:0 0 10px rgba(255,211,92,.22);
}
@media (max-width:560px){
  .ph-challenge-refresh{align-items:flex-start;flex-direction:column;gap:5px;}
}



/* ---------- cửa hàng đổi thưởng ---------- */
.ph-shop-section{margin-top:18px;padding-top:16px;border-top:1px solid var(--ph-line);}
.ph-shop-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px;}
.ph-shop-head .ph-modal-section-title{margin-bottom:0;}
.ph-shop-points{font-family:'Space Grotesk',sans-serif;color:var(--ph-gold);font-weight:800;font-size:15px;white-space:nowrap;}
.ph-shop-note{color:var(--ph-dim);font-size:11.5px;line-height:1.45;margin-bottom:10px;}
.ph-shop-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:9px;}
.ph-shop-item{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--ph-panel-2);border:1px solid var(--ph-line);border-radius:11px;padding:11px 12px;}
.ph-shop-main{min-width:0;flex:1;}
.ph-shop-name{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:13px;line-height:1.3;}
.ph-shop-desc{color:var(--ph-dim);font-size:10.5px;line-height:1.4;margin-top:3px;}
.ph-shop-stock{color:var(--ph-t2);font-size:10px;font-weight:700;margin-top:5px;}
.ph-shop-side{display:flex;flex-direction:column;align-items:flex-end;gap:5px;flex:none;}
.ph-shop-price{color:var(--ph-gold);font-size:11px;font-weight:800;white-space:nowrap;}
.ph-shop-buy{white-space:nowrap;min-width:54px;}
.ph-shop-inventory-title{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:12px;margin:14px 0 7px;}
.ph-shop-inventory{display:flex;flex-wrap:wrap;gap:7px;}
.ph-shop-inventory span{background:rgba(255,211,92,.07);border:1px solid rgba(255,211,92,.18);color:var(--ph-text);border-radius:999px;padding:4px 8px;font-size:10.5px;}
@media (max-width:560px){.ph-shop-item{align-items:flex-start;}.ph-shop-side{min-width:72px;}.ph-shop-grid{grid-template-columns:1fr;}}

/* ---------- cửa hàng bên ngoài ---------- */
.ph-shop-outside-balance{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-bottom:12px;padding:12px 14px;border-radius:11px;
  background:linear-gradient(90deg,rgba(255,211,92,.10),rgba(107,232,192,.08));
  border:1px solid rgba(255,211,92,.22);
}
.ph-shop-outside-balance b{
  color:var(--ph-gold);font-family:'Space Grotesk',sans-serif;font-size:18px;font-variant-numeric:tabular-nums;
}


/* ---------- patch: modal mobile + toast trên modal ---------- */
#pokehub-app .ph-toast{
  position:fixed;
  left:50%;
  bottom:18px;
  z-index:2001;
  pointer-events:none;
}

#pokehub-app .ph-modal-card{
  display:flex;
  flex-direction:column;
  overflow:hidden;
  min-height:0;
}

#pokehub-app .ph-modal-body{
  min-height:0;
  overflow-y:auto;
  -webkit-overflow-scrolling:touch;
  padding-right:2px;
}

@media (max-width:560px){
  #pokehub-app .ph-modal{
    align-items:flex-start;
    padding:10px;
  }
  #pokehub-app .ph-modal-card{
    width:100%;
    max-width:none;
    max-height:calc(100dvh - 20px);
    padding:54px 14px 14px;
    border-radius:14px;
  }
  #pokehub-app .ph-modal-close{
    position:absolute;
    top:10px;
    right:10px;
    width:36px;
    height:36px;
    z-index:10;
  }
  #pokehub-app .ph-modal-body{
    max-height:none;
    overflow-y:auto;
  }
}


/* ---------- patch cuối: modal thoát khỏi overflow của widget + nút X luôn nổi ---------- */
#pokehub-app:has(.ph-modal:not([hidden])){
  overflow:visible !important;
}
#pokehub-app .ph-modal{
  position:fixed !important;
  inset:0 !important;
  z-index:2147483000 !important;
  overflow:visible !important;
}
#pokehub-app .ph-modal-card{
  position:relative !important;
  z-index:2147483001 !important;
}
#pokehub-app .ph-modal-close{
  position:absolute !important;
  top:auto !important;
  right:auto !important;
  left:50% !important;
  bottom:10px !important;
  transform:translateX(-50%) !important;
  width:42px !important;
  height:42px !important;
  z-index:2147483647 !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  pointer-events:auto !important;
  opacity:1 !important;
  visibility:visible !important;
}
@media (max-width:560px){
  #pokehub-app .ph-modal-card{
    width:calc(100vw - 20px) !important;
    max-width:none !important;
    max-height:calc(100dvh - 20px) !important;
    margin-top:10px !important;
    margin-bottom:10px !important;
    padding-bottom:68px !important;
  }
  #pokehub-app .ph-modal-body{
    max-height:calc(100dvh - 120px) !important;
    overflow-y:auto !important;
  }
}
/* ---------- patch: nút X trên PC ---------- */
@media (min-width:561px){
  #pokehub-app .ph-modal-close{
    top:14px !important;
    right:14px !important;
    left:auto !important;
    bottom:auto !important;
    transform:none !important;
    width:36px !important;
    height:36px !important;
    z-index:2147483647 !important;
    display:flex !important;
    align-items:center !important;
    justify-content:center !important;
    pointer-events:auto !important;
    opacity:1 !important;
    visibility:visible !important;
  }
}

/* ---------- patch: giãn khoảng cách phần kết quả hộp cho dễ đọc ---------- */
#pokehub-app #ph-box-result .ph-box-stats .ph-btn.ph-small{
  margin-top:14px !important;
  margin-bottom:18px;
}
#pokehub-app #ph-box-result .ph-box-stats .ph-quip{
  margin-top:14px;
  line-height:1.55;
}
#pokehub-app #ph-box-result > .ph-actions{
  margin-top:24px;
}

/* ---------- patch: khóa AdSense trong widget để không phá layout ---------- */
#pokehub-app .adsbygoogle,
#pokehub-app ins.adsbygoogle,
#pokehub-app .google-auto-placed,
#pokehub-app [id^="google_ads_iframe_"],
#pokehub-app iframe[src*="googleads"],
#pokehub-app iframe[src*="doubleclick"]{
  display:none !important;
  width:0 !important;
  height:0 !important;
  min-height:0 !important;
  max-height:0 !important;
  margin:0 !important;
  padding:0 !important;
  border:0 !important;
  overflow:hidden !important;
}




/* ---------- Pokémon Trainer Hall of Fame leaderboard ---------- */
#pokehub-app .ph-leaderboard-tool{min-width:84px;}
#pokehub-app .ph-lb-status{font-size:9px;font-weight:800;letter-spacing:.02em;color:var(--ph-dim);padding:2px 6px;border-radius:999px;border:1px solid var(--ph-line);background:rgba(148,151,196,.06);white-space:nowrap;}
#pokehub-app .ph-lb-online{color:#8dffc4;border-color:rgba(107,232,192,.38);background:rgba(107,232,192,.09);}
#pokehub-app .ph-lb-note{font-size:11px;color:#aaa58f;line-height:1.5;margin:0 0 12px;text-align:center;}
#pokehub-app .ph-lb-rules{margin:0 0 12px;padding:9px 11px;border:1px solid rgba(255,211,92,.2);background:rgba(255,211,92,.045);border-radius:10px;color:#c6bd9f;font-size:10.5px;line-height:1.5;text-align:center;}
#pokehub-app .ph-lb-rules b{color:#ffe69b;}
#pokehub-app .ph-lb-masthead{position:relative;isolation:isolate;overflow:hidden;margin:2px 0 12px;padding:18px 20px 16px;border:1px solid #b98d32;border-radius:15px;background:radial-gradient(ellipse at 85% 0%,rgba(255,202,69,.19),transparent 45%),linear-gradient(135deg,#17150e 0%,#080a11 60%,#17130a 100%);box-shadow:0 0 26px rgba(255,190,48,.08),inset 0 0 22px rgba(255,211,92,.035);}
#pokehub-app .ph-lb-masthead:before{content:"";position:absolute;inset:0;z-index:-1;opacity:.26;pointer-events:none;background:repeating-linear-gradient(132deg,rgba(255,225,143,.14) 0 1px,transparent 1px 7px);}
#pokehub-app .ph-lb-masthead-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;}
#pokehub-app .ph-lb-kicker{font-size:9px;font-weight:900;letter-spacing:.17em;text-transform:uppercase;color:#e4bd5c;line-height:1.4;}
#pokehub-app .ph-lb-total-label{margin-top:8px;color:#d4c99f;font-size:10px;letter-spacing:.035em;text-transform:uppercase;}
#pokehub-app .ph-lb-total-value{margin-top:1px;color:#ffe274;font-family:'Space Grotesk',system-ui,sans-serif;font-weight:900;font-size:clamp(25px,5vw,37px);line-height:1.18;letter-spacing:-.035em;text-shadow:0 0 21px rgba(255,207,73,.22);font-variant-numeric:tabular-nums;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-total-meta{margin-top:6px;color:#c0b58f;font-size:10.5px;}
#pokehub-app .ph-lb-live-pill{flex:none;display:inline-flex;align-items:center;gap:5px;padding:5px 8px;border:1px solid rgba(255,211,92,.38);border-radius:6px;background:rgba(255,211,92,.08);color:#ffdf83;font-size:9px;font-weight:900;letter-spacing:.06em;white-space:nowrap;}
#pokehub-app .ph-lb-live-pill.ph-is-live{border-color:rgba(107,232,192,.36);background:rgba(107,232,192,.08);color:#8dffc4;}
#pokehub-app .ph-lb-selfline{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 17px;padding:10px 12px;border:1px solid rgba(255,211,92,.18);border-radius:10px;background:linear-gradient(100deg,rgba(255,211,92,.07),rgba(12,14,22,.8));}
#pokehub-app .ph-lb-selfinfo{min-width:0;color:#d7d0b5;font-size:11px;line-height:1.5;}
#pokehub-app .ph-lb-selfinfo strong{color:#ffe274;font-weight:900;}
#pokehub-app .ph-lb-self-sub{display:block;color:#9e9b89;font-size:10px;margin-top:2px;}
#pokehub-app .ph-lb-best-pull{display:flex;align-items:center;gap:12px;margin:0 0 18px;padding:12px;border:1px solid rgba(255,211,92,.32);border-radius:12px;background:radial-gradient(ellipse at 0 0,rgba(255,211,92,.09),transparent 56%),linear-gradient(105deg,rgba(255,211,92,.035),rgba(12,14,22,.94));}
#pokehub-app .ph-lb-best-pull-art{flex:0 0 62px;width:62px;height:86px;overflow:hidden;border:1px solid rgba(255,211,92,.42);border-radius:7px;background:#171923;display:flex;align-items:center;justify-content:center;color:#aaa58f;font-size:10px;text-align:center;}
#pokehub-app .ph-lb-best-pull-art img{display:block;width:100%;height:100%;object-fit:contain;}
#pokehub-app .ph-lb-best-pull-main{min-width:0;flex:1;}
#pokehub-app .ph-lb-best-pull-kicker{color:#e7c45d;font-size:9px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;}
#pokehub-app .ph-lb-best-pull-name{margin-top:4px;color:#fff2bd;font-size:13px;font-weight:900;line-height:1.35;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-best-pull-meta{margin-top:4px;color:#aaa693;font-size:10px;line-height:1.45;}
#pokehub-app .ph-lb-best-pull-price{margin-top:5px;color:#8dffc4;font-family:'Space Grotesk',system-ui,sans-serif;font-size:17px;font-weight:900;font-variant-numeric:tabular-nums;}
#pokehub-app .ph-lb-best-pull-note{margin-top:4px;color:#8e8a7d;font-size:9px;line-height:1.4;}
#pokehub-app .ph-lb-podium-best{margin-top:4px;color:#ffdf83;font-size:8px;font-weight:800;line-height:1.35;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-best-badge{display:inline-flex;padding:1px 5px;border:1px solid rgba(255,211,92,.28);border-radius:4px;background:rgba(255,211,92,.07);color:#ffdf83;}
#pokehub-app .ph-lb-actions{display:flex;justify-content:flex-end;gap:7px;flex-wrap:wrap;margin:0 0 17px;}
#pokehub-app .ph-lb-btn{display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:7px 10px;border:1px solid rgba(255,211,92,.26);border-radius:8px;background:#12130f;color:#f5e8bd;cursor:pointer;font:inherit;font-size:10.5px;font-weight:700;transition:background .15s ease,border-color .15s ease,transform .15s ease;}
#pokehub-app .ph-lb-btn:hover{border-color:#ffd35c;background:rgba(255,211,92,.09);transform:translateY(-1px);}
#pokehub-app .ph-lb-section-head{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;margin:0 0 10px;}
#pokehub-app .ph-lb-section-title{color:#fff0bd;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;}
#pokehub-app .ph-lb-section-sub{color:#9c9987;font-size:10px;text-align:right;}
#pokehub-app .ph-lb-podium{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;align-items:end;margin:0 0 22px;}
#pokehub-app .ph-lb-podium-card{position:relative;isolation:isolate;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-width:0;min-height:190px;overflow:hidden;padding:15px 8px 0;border:1px solid rgba(190,194,202,.4);border-radius:12px 12px 7px 7px;background:radial-gradient(ellipse at 50% 0%,rgba(214,220,230,.1),transparent 64%),linear-gradient(180deg,#191b20 0%,#0d0f14 100%);text-align:center;}
#pokehub-app .ph-lb-podium-card:before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:linear-gradient(145deg,rgba(255,255,255,.045),transparent 45%);}
#pokehub-app .ph-lb-rank-1{min-height:225px;border-color:#e7bd43;background:radial-gradient(ellipse at 50% 0%,rgba(255,210,74,.2),transparent 65%),linear-gradient(180deg,#211b0d 0%,#0d0d0b 100%);box-shadow:0 0 22px rgba(255,197,47,.1);}
#pokehub-app .ph-lb-rank-2{border-color:rgba(200,210,221,.55);}
#pokehub-app .ph-lb-rank-3{border-color:rgba(203,132,79,.62);background:radial-gradient(ellipse at 50% 0%,rgba(203,132,79,.12),transparent 65%),linear-gradient(180deg,#1c1511 0%,#0d0e12 100%);}
#pokehub-app .ph-lb-crown{margin:-5px 0 2px;font-size:23px;line-height:1.1;filter:drop-shadow(0 0 8px rgba(255,211,92,.4));}
#pokehub-app .ph-lb-avatar{flex:none;display:flex;align-items:center;justify-content:center;width:42px;height:42px;margin:3px auto 7px;border:2px solid #c3c7d0;border-radius:50%;background:linear-gradient(145deg,#535866,#1d2028);color:#fff;font-family:'Space Grotesk',system-ui,sans-serif;font-size:14px;font-weight:900;box-shadow:0 3px 12px rgba(0,0,0,.35);}
#pokehub-app .ph-lb-avatar{position:relative;overflow:hidden;}
#pokehub-app .ph-lb-avatar img{display:block;width:100%;height:100%;padding:3px;object-fit:contain;object-position:center;filter:drop-shadow(0 2px 2px rgba(0,0,0,.28));}
#pokehub-app .ph-lb-list-avatar img{padding:1px;}
#pokehub-app .ph-lb-best-pull-art{padding:3px;}
#pokehub-app .ph-lb-best-pull-art img{object-fit:contain;background:rgba(0,0,0,.16);}
#pokehub-app .ph-lb-best-pull-art.ph-lb-image-missing{font-size:25px;color:#ffe274;background:radial-gradient(circle,rgba(255,211,92,.12),#171923 72%);}

#pokehub-app .ph-lb-rank-1 .ph-lb-avatar{width:49px;height:49px;border-color:#ffe17b;background:linear-gradient(145deg,#93701d,#35270b);color:#fff1b1;box-shadow:0 0 17px rgba(255,211,92,.18);}
#pokehub-app .ph-lb-rank-3 .ph-lb-avatar{border-color:#cb895c;background:linear-gradient(145deg,#8b4e2b,#332016);}
#pokehub-app .ph-lb-rank-tag{display:inline-flex;align-items:center;justify-content:center;margin:0 auto 5px;padding:3px 7px;border:1px solid rgba(255,211,92,.4);border-radius:5px;background:rgba(255,211,92,.1);color:#ffe274;font-size:8px;font-weight:900;letter-spacing:.08em;}
#pokehub-app .ph-lb-rank-2 .ph-lb-rank-tag{border-color:rgba(205,215,225,.36);background:rgba(205,215,225,.08);color:#e0e5ed;}
#pokehub-app .ph-lb-rank-3 .ph-lb-rank-tag{border-color:rgba(203,137,92,.4);background:rgba(203,137,92,.1);color:#e5a77b;}
#pokehub-app .ph-lb-podium-name{width:100%;color:#f5f2e7;font-size:12px;font-weight:800;line-height:1.3;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-podium-you{display:inline-block;margin-left:3px;color:#91ffd0;font-size:8px;}
#pokehub-app .ph-lb-podium-value{max-width:100%;margin-top:6px;color:#82ffc0;font-family:'Space Grotesk',system-ui,sans-serif;font-size:15px;font-weight:900;line-height:1.2;overflow-wrap:anywhere;font-variant-numeric:tabular-nums;}
#pokehub-app .ph-lb-rank-1 .ph-lb-podium-value{color:#ffe274;font-size:17px;text-shadow:0 0 12px rgba(255,211,92,.17);}
#pokehub-app .ph-lb-podium-meta{margin-top:4px;color:#aaa693;font-size:9px;line-height:1.4;}
#pokehub-app .ph-lb-podium-base{display:flex;align-items:center;justify-content:center;width:calc(100% + 16px);height:34px;margin-top:11px;border-top:1px solid rgba(255,255,255,.2);background:linear-gradient(180deg,#b8bec6,#737c8a);color:#272b32;font-family:'Space Grotesk',system-ui,sans-serif;font-size:23px;font-weight:900;text-shadow:0 1px rgba(255,255,255,.32);}
#pokehub-app .ph-lb-rank-1 .ph-lb-podium-base{height:52px;background:linear-gradient(180deg,#ffe56a,#bd8c06 75%,#916400);color:#493600;border-top-color:#fff0a3;}
#pokehub-app .ph-lb-rank-3 .ph-lb-podium-base{height:27px;background:linear-gradient(180deg,#dba276,#985c35 80%,#6c3b23);color:#432817;}
#pokehub-app .ph-lb-list{display:flex;flex-direction:column;gap:7px;}
#pokehub-app .ph-lb-list-row{display:grid;grid-template-columns:30px 34px minmax(0,1fr) minmax(76px,auto);align-items:center;gap:9px;min-width:0;padding:9px 11px;border:1px solid rgba(255,211,92,.18);border-radius:10px;background:linear-gradient(100deg,rgba(255,211,92,.035),rgba(14,16,23,.96) 30%);transition:border-color .15s ease,background .15s ease;}
#pokehub-app .ph-lb-list-row:hover{border-color:rgba(255,211,92,.46);background:linear-gradient(100deg,rgba(255,211,92,.07),rgba(14,16,23,.98) 32%);}
#pokehub-app .ph-lb-list-row.ph-lb-me{border-color:rgba(107,232,192,.45);background:linear-gradient(100deg,rgba(107,232,192,.09),rgba(14,16,23,.98) 35%);}
#pokehub-app .ph-lb-list-rank{color:#e7dba9;text-align:center;font-family:'Space Grotesk',system-ui,sans-serif;font-size:12px;font-weight:900;font-variant-numeric:tabular-nums;}
#pokehub-app .ph-lb-list-avatar{width:32px;height:32px;margin:0;border-width:1px;font-size:11px;background:linear-gradient(145deg,#3e4f49,#18231f);border-color:#5c9c85;color:#bfffe0;}
#pokehub-app .ph-lb-list-main{min-width:0;}
#pokehub-app .ph-lb-list-name{color:#f2f0e7;font-size:11.5px;font-weight:800;line-height:1.3;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-you{display:inline-block;margin-left:4px;padding:1px 4px;border-radius:4px;background:rgba(107,232,192,.12);color:#83f8c1;font-size:8px;font-weight:900;vertical-align:1px;}
#pokehub-app .ph-lb-list-meta{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-top:3px;color:#9e9b8d;font-size:9px;line-height:1.35;}
#pokehub-app .ph-lb-mini-badge{display:inline-flex;padding:1px 5px;border:1px solid rgba(255,211,92,.25);border-radius:4px;background:rgba(255,211,92,.06);color:#e9d38d;}
#pokehub-app .ph-lb-mini-badge.ph-lb-roi-up{border-color:rgba(107,232,192,.25);background:rgba(107,232,192,.06);color:#8dffc4;}
#pokehub-app .ph-lb-mini-badge.ph-lb-roi-down{border-color:rgba(255,154,154,.25);background:rgba(255,154,154,.06);color:#ffaaaa;}
#pokehub-app .ph-lb-track{height:4px;max-width:100%;margin-top:6px;border-radius:99px;background:#272a2d;overflow:hidden;}
#pokehub-app .ph-lb-track-fill{display:block;height:100%;width:0;border-radius:inherit;background:linear-gradient(90deg,#43d89a,#c8ff84);box-shadow:0 0 7px rgba(107,232,192,.16);}
#pokehub-app .ph-lb-list-value{min-width:0;text-align:right;color:#83ffc1;font-family:'Space Grotesk',system-ui,sans-serif;font-size:13px;font-weight:900;line-height:1.2;white-space:nowrap;font-variant-numeric:tabular-nums;}
#pokehub-app .ph-lb-list-value small{display:block;margin-top:4px;color:#9b998c;font-family:inherit;font-size:8px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;}
#pokehub-app .ph-lb-empty{padding:24px 14px;border:1px dashed rgba(255,211,92,.28);border-radius:10px;color:#bdb7a0;text-align:center;font-size:12px;line-height:1.6;background:rgba(255,211,92,.025);}
#pokehub-app .ph-lb-foot{margin-top:12px;color:#989584;font-size:10px;line-height:1.5;text-align:center;}
#ph-leaderboard-modal .ph-modal-title{padding-right:35px;color:#ffe274;font-family:'Space Grotesk',system-ui,sans-serif;font-size:19px;font-weight:900;letter-spacing:.015em;}
#ph-leaderboard-modal .ph-modal-card{border-color:rgba(255,211,92,.32);background:radial-gradient(ellipse at 100% 0%,rgba(255,211,92,.07),transparent 42%),#101116;}
@media(max-width:620px){
  #pokehub-app .ph-lb-masthead{padding:15px 14px 13px;}
  #pokehub-app .ph-lb-podium{gap:5px;}
  #pokehub-app .ph-lb-podium-card{min-height:184px;padding:12px 4px 0;}
  #pokehub-app .ph-lb-rank-1{min-height:210px;}
  #pokehub-app .ph-lb-podium-name{font-size:10.5px;}
  #pokehub-app .ph-lb-podium-value{font-size:12px;}
  #pokehub-app .ph-lb-rank-1 .ph-lb-podium-value{font-size:13px;}
  #pokehub-app .ph-lb-podium-meta{font-size:8px;}
  #pokehub-app .ph-lb-podium-base{height:27px;font-size:19px;}
  #pokehub-app .ph-lb-rank-1 .ph-lb-podium-base{height:41px;}
  #pokehub-app .ph-lb-rank-3 .ph-lb-podium-base{height:23px;}
  #pokehub-app .ph-lb-list-row{grid-template-columns:24px 29px minmax(0,1fr) minmax(65px,auto);gap:6px;padding:8px 7px;}
  #pokehub-app .ph-lb-list-avatar{width:28px;height:28px;font-size:10px;}
  #pokehub-app .ph-lb-list-name{font-size:10.5px;}
  #pokehub-app .ph-lb-list-meta{font-size:8px;gap:4px;}
  #pokehub-app .ph-lb-list-value{font-size:11px;}
  #pokehub-app .ph-lb-list-value small{font-size:7px;}
  #ph-leaderboard-modal .ph-modal-card{padding:22px 12px 16px;}
  #ph-leaderboard-modal .ph-modal-title{font-size:16px;}
}
@media(max-width:380px){
  #pokehub-app .ph-lb-podium{grid-template-columns:repeat(3,minmax(0,1fr));gap:3px;}
  #pokehub-app .ph-lb-podium-card{padding-left:2px;padding-right:2px;}
  #pokehub-app .ph-lb-podium-name{font-size:9px;}
  #pokehub-app .ph-lb-list-row{grid-template-columns:21px 25px minmax(0,1fr) 61px;gap:5px;padding:7px 5px;}
  #pokehub-app .ph-lb-list-avatar{width:24px;height:24px;font-size:9px;}
  #pokehub-app .ph-lb-list-value{font-size:10px;}
}

.ph-welcome-modal{align-items:center;justify-content:center;padding:14px;}
.ph-welcome-card{position:relative;z-index:1;width:min(100%,390px);padding:30px 24px 26px;border-radius:18px;background:var(--ph-panel);border:1px solid var(--ph-line);box-shadow:0 30px 80px -20px rgba(0,0,0,.82);text-align:center;color:var(--ph-text);animation:ph-modal-in .22s cubic-bezier(.2,.8,.2,1);}
.ph-welcome-icon{width:44px;height:44px;margin:0 auto 13px;border-radius:8px;display:flex;align-items:center;justify-content:center;border:2px solid #ff4f9c;background:linear-gradient(145deg,#ff4f9c,#ff7dc0);box-shadow:0 0 18px rgba(255,79,156,.22);}
.ph-welcome-icon span{width:20px;height:20px;border-radius:50%;background:#fff;color:#ff4f9c;font-size:15px;line-height:20px;font-weight:900;}
.ph-welcome-title{font-family:'Space Grotesk',system-ui,sans-serif;font-weight:800;font-size:26px;line-height:1.15;letter-spacing:.01em;}
.ph-welcome-sub{color:var(--ph-dim);font-size:12.5px;line-height:1.6;margin:10px 0 16px;}
.ph-welcome-input{display:block;width:100%;height:38px;padding:0 12px;border-radius:10px;background:#0e1020;color:var(--ph-text);border:1px solid var(--ph-gold);outline:none;font:inherit;font-size:13px;text-align:left;}
.ph-welcome-input:focus{box-shadow:0 0 0 2px rgba(255,211,92,.14);}
.ph-welcome-error{min-height:18px;color:#ff9a9a;font-size:11px;margin-top:6px;}
.ph-welcome-start{width:100%;height:44px;border:0;border-radius:10px;cursor:pointer;font:inherit;font-weight:800;font-size:14px;color:#0a0b16;background:linear-gradient(120deg,var(--ph-c1),var(--ph-c2));transition:transform .15s ease,filter .15s ease;}
.ph-welcome-start:hover{transform:translateY(-1px);filter:brightness(1.04);}
@media (max-width:560px){.ph-lb-hero{grid-template-columns:1fr;}.ph-welcome-card{padding:26px 18px 22px;}.ph-welcome-title{font-size:22px;}}



/* ============================================================
   ADD-ON CSS: Daily Hub
   ============================================================ */
/* ============================================================
     PokeHub Daily Hub Add-on v1
     Chỉ thêm giao diện + logic Daily, không sửa code gốc.
     ============================================================ */
  #ph-daily-btn{
    position:relative;
  }
  .ph-daily-badge{
    background:var(--ph-gold);
    color:#0a0b16;
    border-radius:20px;
    padding:1px 7px;
    font-size:11px;
    font-weight:800;
    font-variant-numeric:tabular-nums;
  }
  .ph-daily-badge.ph-daily-hot{
    background:linear-gradient(120deg,var(--ph-gold),#fff1a8);
    box-shadow:0 0 14px rgba(255,211,92,.25);
  }
  .ph-daily-wrap{
    display:flex;
    flex-direction:column;
    gap:14px;
  }
  .ph-daily-hero{
    display:grid;
    grid-template-columns:1.15fr .85fr;
    gap:10px;
  }
  .ph-daily-card{
    background:var(--ph-panel-2);
    border:1px solid var(--ph-line);
    border-radius:13px;
    padding:14px;
  }
  .ph-daily-kicker{
    color:var(--ph-dim);
    font-size:10px;
    font-weight:800;
    letter-spacing:.12em;
    text-transform:uppercase;
  }
  .ph-daily-title{
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-size:19px;
    font-weight:800;
    line-height:1.2;
    margin-top:4px;
  }
  .ph-daily-sub{
    color:var(--ph-dim);
    font-size:11.5px;
    margin-top:4px;
    line-height:1.45;
  }
  .ph-daily-streak{
    display:flex;
    align-items:flex-end;
    justify-content:space-between;
    gap:10px;
  }
  .ph-daily-streak-num{
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-size:30px;
    font-weight:800;
    line-height:1;
    color:var(--ph-gold);
  }
  .ph-daily-streak-label{
    color:var(--ph-text);
    font-size:12px;
    font-weight:700;
    margin-top:4px;
  }
  .ph-daily-streak-bar{
    height:7px;
    border-radius:99px;
    overflow:hidden;
    background:#0d1020;
    border:1px solid var(--ph-line);
    margin-top:11px;
  }
  .ph-daily-streak-fill{
    height:100%;
    width:0;
    background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));
    border-radius:inherit;
    transition:width .3s ease;
  }
  .ph-daily-reset{
    color:var(--ph-dim);
    font-size:10.5px;
    margin-top:7px;
    font-variant-numeric:tabular-nums;
  }
  .ph-daily-pack{
    position:relative;
    overflow:hidden;
    background:
      radial-gradient(260px 120px at 0% 0%,rgba(74,127,255,.15),transparent 65%),
      radial-gradient(220px 120px at 100% 100%,rgba(107,232,192,.11),transparent 70%),
      var(--ph-panel-2);
    border:1px solid rgba(255,211,92,.28);
  }
  .ph-daily-pack::after{
    content:'';
    position:absolute;
    inset:auto -30px -55px auto;
    width:140px;
    height:140px;
    border-radius:50%;
    background:rgba(255,211,92,.06);
    pointer-events:none;
  }
  .ph-daily-pack-top{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:12px;
  }
  .ph-daily-pack-name{
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-size:17px;
    font-weight:800;
  }
  .ph-daily-pack-status{
    font-size:10.5px;
    font-weight:800;
    padding:4px 8px;
    border-radius:99px;
    color:var(--ph-gold);
    background:rgba(255,211,92,.09);
    border:1px solid rgba(255,211,92,.22);
  }
  .ph-daily-pack-status.ph-claimed{
    color:var(--ph-t2);
    background:rgba(107,232,192,.08);
    border-color:rgba(107,232,192,.20);
  }
  .ph-daily-pack-desc{
    color:var(--ph-dim);
    font-size:11.5px;
    line-height:1.5;
    margin-top:5px;
  }
  .ph-daily-pack-action{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:12px;
    margin-top:13px;
  }
  .ph-daily-pack-countdown{
    color:var(--ph-dim);
    font-size:10.5px;
    font-variant-numeric:tabular-nums;
  }
  .ph-daily-pack-btn{
    min-width:164px;
    border:none;
    border-radius:10px;
    padding:10px 14px;
    background:linear-gradient(120deg,var(--ph-c1),var(--ph-c2));
    color:#0a0b16;
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-size:12.5px;
    font-weight:800;
    cursor:pointer;
    transition:transform .15s ease,filter .15s ease,opacity .15s ease;
  }
  .ph-daily-pack-btn:hover{transform:translateY(-2px);filter:brightness(1.05);}
  .ph-daily-pack-btn:disabled{opacity:.48;cursor:not-allowed;transform:none;filter:none;}
  .ph-daily-mission-head{
    display:flex;
    align-items:flex-end;
    justify-content:space-between;
    gap:10px;
    margin-bottom:9px;
  }
  .ph-daily-mission-title{
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-size:16px;
    font-weight:800;
  }
  .ph-daily-mission-meta{
    color:var(--ph-dim);
    font-size:10.5px;
  }
  .ph-daily-mission-list{
    display:grid;
    grid-template-columns:repeat(3,minmax(0,1fr));
    gap:9px;
  }
  .ph-daily-mission{
    background:var(--ph-panel-2);
    border:1px solid var(--ph-line);
    border-radius:11px;
    padding:12px;
  }
  .ph-daily-mission.ph-done{
    border-color:rgba(107,232,192,.35);
    box-shadow:0 0 0 1px rgba(107,232,192,.06) inset;
  }
  .ph-daily-mission-top{
    display:flex;
    align-items:flex-start;
    justify-content:space-between;
    gap:8px;
  }
  .ph-daily-mission-name{
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-weight:750;
    font-size:12.5px;
    line-height:1.35;
  }
  .ph-daily-mission-reward{
    color:var(--ph-gold);
    font-size:10px;
    font-weight:800;
    white-space:nowrap;
  }
  .ph-daily-mission-desc{
    color:var(--ph-dim);
    font-size:10.5px;
    line-height:1.45;
    margin-top:4px;
    min-height:31px;
  }
  .ph-daily-mission-progress{
    display:flex;
    align-items:center;
    gap:7px;
    margin-top:10px;
  }
  .ph-daily-mission-track{
    flex:1;
    height:6px;
    background:#0d1020;
    border:1px solid var(--ph-line);
    border-radius:99px;
    overflow:hidden;
  }
  .ph-daily-mission-fill{
    display:block;
    height:100%;
    width:0;
    background:linear-gradient(90deg,var(--ph-c1),var(--ph-c2));
    border-radius:inherit;
    transition:width .25s ease;
  }
  .ph-daily-mission.ph-done .ph-daily-mission-fill{
    background:var(--ph-t2);
  }
  .ph-daily-mission-value{
    flex:0 0 auto;
    color:var(--ph-text);
    font-size:10px;
    font-variant-numeric:tabular-nums;
  }
  .ph-daily-mission-status{
    color:var(--ph-dim);
    font-size:10px;
    margin-top:7px;
  }
  .ph-daily-mission.ph-done .ph-daily-mission-status{
    color:var(--ph-t2);
    font-weight:700;
  }
  .ph-daily-bottom{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:12px;
    flex-wrap:wrap;
  }
  .ph-daily-points{
    color:var(--ph-dim);
    font-size:11px;
  }
  .ph-daily-points b{
    color:var(--ph-gold);
    font-family:'Space Grotesk',system-ui,sans-serif;
    font-size:15px;
  }
  .ph-daily-note{
    color:var(--ph-dim);
    font-size:10.5px;
    line-height:1.45;
    text-align:right;
  }
  .ph-daily-alert{
    padding:9px 11px;
    border-radius:10px;
    background:rgba(255,211,92,.07);
    border:1px solid rgba(255,211,92,.18);
    color:var(--ph-gold);
    font-size:11px;
    line-height:1.45;
  }
  .ph-daily-alert.ph-ok{
    background:rgba(107,232,192,.07);
    border-color:rgba(107,232,192,.18);
    color:var(--ph-t2);
  }
  @media (max-width:700px){
    .ph-daily-hero{grid-template-columns:1fr;}
    .ph-daily-mission-list{grid-template-columns:1fr;}
    .ph-daily-pack-action{align-items:stretch;flex-direction:column;}
    .ph-daily-pack-btn{width:100%;}
    .ph-daily-note{text-align:left;}
  }

/* ==================== PACK DETAIL / CHASE CARD BROWSER ==================== */
#pokehub-app .ph-exp-card{
  display:flex;flex-direction:column;align-items:stretch;min-height:0;cursor:default;
}
#pokehub-app .ph-exp-card:hover{transform:translateY(-3px);}
#pokehub-app .ph-exp-main{
  display:flex;flex:1 1 auto;flex-direction:column;width:100%;min-width:0;min-height:0;
  padding:0;margin:0;border:0;border-radius:0;background:transparent;color:inherit;
  font:inherit;text-align:left;cursor:pointer;
}
#pokehub-app .ph-exp-main:focus-visible{outline:2px solid var(--ph-gold);outline-offset:-3px;}
#pokehub-app .ph-pack-detail-btn{
  display:flex;align-items:center;justify-content:center;gap:7px;width:calc(100% - 20px);
  margin:0 10px 10px;padding:8px 9px;border:1px solid rgba(255,211,92,.38);
  border-radius:8px;background:rgba(255,211,92,.07);color:var(--ph-gold);
  font-family:inherit;font-size:11.5px;font-weight:600;line-height:1.25;cursor:pointer;transition:background .15s ease,border-color .15s ease,transform .15s ease;
}
#pokehub-app .ph-pack-detail-btn:hover{background:rgba(255,211,92,.14);border-color:var(--ph-gold);transform:translateY(-1px);}
#pokehub-app .ph-pack-detail-btn:focus-visible{outline:2px solid var(--ph-gold);outline-offset:2px;}
#pokehub-app .ph-pack-detail-dialog{max-width:1040px !important;}
#pokehub-app .ph-pack-detail-body{color:var(--ph-text);padding-bottom:60px;}
#pokehub-app .ph-pack-detail-heading{margin:0 0 15px;padding-right:38px;}
#pokehub-app .ph-pack-detail-eyebrow{font-size:9px;font-weight:800;letter-spacing:.16em;color:var(--ph-gold);margin-bottom:5px;}
#pokehub-app .ph-pack-detail-title{font-family:'Space Grotesk',system-ui,sans-serif;font-size:clamp(20px,3vw,28px);font-weight:800;line-height:1.2;color:var(--ph-text);}
#pokehub-app .ph-pack-detail-subtitle{font-size:12px;color:var(--ph-dim);margin-top:7px;line-height:1.5;}
#pokehub-app .ph-pack-detail-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin-bottom:22px;}
#pokehub-app .ph-pack-detail-stat{display:flex;flex-direction:column;gap:3px;min-width:0;padding:12px;border:1px solid var(--ph-line);border-radius:10px;background:var(--ph-panel-2);}
#pokehub-app .ph-pack-detail-stat b{font-family:'Space Grotesk',system-ui,sans-serif;font-size:20px;line-height:1.2;color:var(--ph-gold);font-variant-numeric:tabular-nums;}
#pokehub-app .ph-pack-detail-stat span{font-size:10.5px;line-height:1.3;color:var(--ph-dim);}
#pokehub-app .ph-pack-detail-section{margin-top:18px;}
#pokehub-app .ph-pack-detail-section-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:11px;}
#pokehub-app .ph-pack-detail-section-title{font-family:'Space Grotesk',system-ui,sans-serif;font-size:16px;font-weight:800;line-height:1.3;color:var(--ph-text);}
#pokehub-app .ph-pack-detail-section-note{font-size:11px;line-height:1.45;color:var(--ph-dim);margin-top:4px;}
#pokehub-app .ph-pack-detail-count{flex:none;font-size:10.5px;color:var(--ph-gold);border:1px solid rgba(255,211,92,.22);background:rgba(255,211,92,.06);border-radius:99px;padding:4px 8px;white-space:nowrap;}
#pokehub-app .ph-pack-detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:10px;}
#pokehub-app .ph-pack-detail-feature-grid{grid-template-columns:repeat(auto-fill,minmax(122px,1fr));}
#pokehub-app .ph-pack-detail-tile{position:relative;display:flex;flex-direction:column;align-items:stretch;min-width:0;padding:0 0 9px;overflow:hidden;border:1px solid var(--ph-line);border-radius:10px;background:var(--ph-panel-2);color:var(--ph-text);font:inherit;text-align:left;cursor:pointer;transition:transform .16s ease,border-color .16s ease,box-shadow .16s ease;}
#pokehub-app .ph-pack-detail-tile:hover{transform:translateY(-3px);border-color:var(--ph-gold);box-shadow:0 8px 22px rgba(0,0,0,.22);}
#pokehub-app .ph-pack-detail-tile:focus-visible{outline:2px solid var(--ph-gold);outline-offset:2px;}
#pokehub-app .ph-pack-detail-tile[data-tier="3"]{border-color:rgba(74,127,255,.6);}
#pokehub-app .ph-pack-detail-tile[data-tier="4"]{border-color:rgba(201,107,255,.72);}
#pokehub-app .ph-pack-detail-tile[data-tier="5"]{border-color:rgba(255,143,208,.8);}
#pokehub-app .ph-pack-detail-tile[data-tier="6"]{border-color:rgba(255,211,92,.95);box-shadow:0 0 14px rgba(255,211,92,.08);}
#pokehub-app .ph-pack-detail-thumb{position:relative;display:flex;align-items:center;justify-content:center;aspect-ratio:245/337;overflow:hidden;background:#0d1020;color:var(--ph-dim);font-size:10px;text-align:center;padding:5px;border-radius:9px 9px 0 0;}
#pokehub-app .ph-pack-detail-thumb img{display:block;width:100%;height:100%;object-fit:cover;}
#pokehub-app .ph-pack-detail-number{font-size:9.5px;color:var(--ph-dim);padding:7px 8px 0;line-height:1.2;}
#pokehub-app .ph-pack-detail-name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:30px;padding:4px 8px 0;font-size:11px;font-weight:700;line-height:1.3;overflow-wrap:anywhere;}
#pokehub-app .ph-pack-detail-rarity{display:block;margin:7px 8px 0;padding:4px 6px;border-radius:5px;background:rgba(148,151,196,.09);color:var(--ph-dim);font-size:9px;line-height:1.25;overflow-wrap:anywhere;}
#pokehub-app .ph-pack-detail-tile[data-tier="3"] .ph-pack-detail-rarity{color:#8aafff;background:rgba(74,127,255,.10);}
#pokehub-app .ph-pack-detail-tile[data-tier="4"] .ph-pack-detail-rarity{color:#dba4ff;background:rgba(201,107,255,.10);}
#pokehub-app .ph-pack-detail-tile[data-tier="5"] .ph-pack-detail-rarity{color:#ffaad9;background:rgba(255,143,208,.10);}
#pokehub-app .ph-pack-detail-tile[data-tier="6"] .ph-pack-detail-rarity{color:var(--ph-gold);background:rgba(255,211,92,.10);}
#pokehub-app .ph-pack-detail-controls{display:flex;gap:9px;align-items:center;margin-bottom:10px;}
#pokehub-app .ph-pack-detail-search,#pokehub-app .ph-pack-detail-filter{min-width:0;min-height:40px;padding:9px 11px;border:1px solid var(--ph-line);border-radius:9px;background:var(--ph-panel-2);color:var(--ph-text);font:inherit;font-size:12px;}
#pokehub-app .ph-pack-detail-search{flex:1;}
#pokehub-app .ph-pack-detail-filter{flex:0 0 220px;max-width:46%;}
#pokehub-app .ph-pack-detail-search::placeholder{color:var(--ph-dim);}
#pokehub-app .ph-pack-detail-all-wrap{max-height:48vh;overflow:auto;padding:2px 3px 12px 2px;overscroll-behavior:contain;}
#pokehub-app .ph-pack-detail-empty{padding:17px 12px;border:1px dashed var(--ph-line);border-radius:10px;color:var(--ph-dim);background:rgba(18,20,42,.55);font-size:12px;line-height:1.55;}
#pokehub-app .ph-pack-detail-loading,#pokehub-app .ph-pack-detail-error{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:10px;padding:30px 12px;}
#pokehub-app .ph-pack-detail-loading-icon{font-size:30px;}
#pokehub-app .ph-pack-detail-spinner{width:30px;height:30px;border:3px solid var(--ph-line);border-top-color:var(--ph-gold);border-radius:50%;animation:ph-pack-detail-spin .8s linear infinite;margin-top:8px;}
@keyframes ph-pack-detail-spin{to{transform:rotate(360deg);}}
#pokehub-app .ph-pack-detail-error p{font-size:12px;color:var(--ph-dim);max-width:46ch;line-height:1.55;}
#pokehub-app .ph-pack-detail-retry{padding:9px 15px;border:1px solid rgba(255,211,92,.45);border-radius:8px;background:rgba(255,211,92,.08);color:var(--ph-gold);font-family:inherit;font-size:12px;font-weight:600;cursor:pointer;}
@media(max-width:620px){
  #pokehub-app .ph-pack-detail-stats{gap:6px;}
  #pokehub-app .ph-pack-detail-stat{padding:9px 8px;}
  #pokehub-app .ph-pack-detail-stat b{font-size:17px;}
  #pokehub-app .ph-pack-detail-stat span{font-size:9px;}
  #pokehub-app .ph-pack-detail-grid{grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:7px;}
  #pokehub-app .ph-pack-detail-feature-grid{grid-template-columns:repeat(auto-fill,minmax(95px,1fr));}
  #pokehub-app .ph-pack-detail-controls{flex-direction:column;align-items:stretch;}
  #pokehub-app .ph-pack-detail-filter{flex:1 1 auto;max-width:none;width:100%;}
  #pokehub-app .ph-pack-detail-all-wrap{max-height:52vh;}
  #pokehub-app .ph-pack-detail-section-head{align-items:flex-start;}
}
@media(prefers-reduced-motion:reduce){#pokehub-app .ph-pack-detail-spinner{animation:none;}}

</style>

<style id="ph-pack-set-search-css">
#pokehub-app .ph-set-search{position:relative;z-index:12;max-width:720px;margin:0 auto 18px;}
#pokehub-app .ph-set-search-field{display:flex;align-items:center;gap:10px;min-height:48px;padding:0 12px;border:1px solid rgba(116,155,218,.35);border-radius:12px;background:linear-gradient(135deg,rgba(18,26,43,.97),rgba(10,15,27,.97));box-shadow:inset 0 1px 0 rgba(255,255,255,.04),0 8px 25px rgba(0,0,0,.14);transition:border-color .16s ease,box-shadow .16s ease;}
#pokehub-app .ph-set-search-field:focus-within{border-color:#ffd35c;box-shadow:0 0 0 3px rgba(255,211,92,.09),0 8px 25px rgba(0,0,0,.18);}
#pokehub-app .ph-set-search-icon{flex:0 0 auto;color:#ffd35c;font-size:28px;line-height:1;transform:rotate(-20deg);}
#pokehub-app #ph-set-search-input{display:block;min-width:0;flex:1;width:100%;padding:12px 0;border:0;outline:0;background:transparent!important;box-shadow:none!important;color:#f2f1fb!important;font:inherit;font-size:14px;}
#pokehub-app #ph-set-search-input::placeholder{color:#898eaa;opacity:1;}
#pokehub-app #ph-set-search-input::-webkit-search-cancel-button{-webkit-appearance:none;}
#pokehub-app .ph-set-search-clear{flex:0 0 28px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.13);border-radius:8px;background:rgba(255,255,255,.05);color:#d7d9e7;font-size:20px;line-height:1;cursor:pointer;}
#pokehub-app .ph-set-search-clear[hidden]{display:none!important;}
#pokehub-app .ph-set-search-meta{margin:7px 3px 0;color:#858aaa;font-size:11px;line-height:1.4;}
#pokehub-app .ph-set-search-suggestions{position:absolute;left:0;right:0;top:calc(100% - 1px);max-height:280px;overflow:auto;padding:6px;border:1px solid rgba(255,211,92,.28);border-radius:0 0 12px 12px;background:#101321;box-shadow:0 18px 36px rgba(0,0,0,.44);z-index:30;}
#pokehub-app .ph-set-search-suggestions[hidden]{display:none!important;}
#pokehub-app .ph-set-search-suggestion{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:10px 11px;border:0;border-radius:8px;background:transparent;color:#f3f2fc;text-align:left;font:inherit;font-size:12px;cursor:pointer;}
#pokehub-app .ph-set-search-suggestion:hover,#pokehub-app .ph-set-search-suggestion:focus-visible{outline:0;background:rgba(255,211,92,.10);color:#ffe274;}
#pokehub-app .ph-set-search-suggestion small{flex:0 0 auto;color:#8a8eaa;font-size:10px;}
#pokehub-app .ph-set-search-no-result{padding:12px;color:#a7a9c2;font-size:12px;}
#pokehub-app .ph-exp-card[hidden]{display:none!important;}
#pokehub-app .ph-exp-card.ph-set-search-highlight{border-color:#ffd35c!important;box-shadow:0 0 0 2px rgba(255,211,92,.16),0 8px 26px rgba(0,0,0,.22);}
@media(max-width:520px){#pokehub-app .ph-set-search{margin-bottom:14px;}#pokehub-app .ph-set-search-field{min-height:44px;padding:0 10px;}#pokehub-app #ph-set-search-input{font-size:13px;}#pokehub-app .ph-set-search-meta{font-size:10px;}}
</style>

<style id="ph-mega-hit-jackpot-v9-css">
#pokehub-app .ph-lb-feed-summary{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin:0 0 10px;padding:8px 10px;border:1px solid rgba(255,211,92,.20);border-radius:8px;background:linear-gradient(90deg,rgba(255,211,92,.065),rgba(255,211,92,.018));color:#d9cfaa;font-size:9px;font-weight:900;letter-spacing:.045em;line-height:1.45;}
#pokehub-app .ph-lb-feed-item.ph-lb-feed-jackpot{border-color:rgba(255,176,68,.68);background:linear-gradient(110deg,rgba(255,177,62,.095),rgba(255,211,92,.025) 55%,rgba(255,255,255,.018));box-shadow:inset 0 0 0 1px rgba(255,211,92,.06),0 0 19px rgba(255,166,49,.075);animation:ph-jackpot-border-glow 3.2s ease-in-out infinite;}
#pokehub-app .ph-lb-feed-item.ph-lb-feed-jackpot .ph-lb-feed-card-art{position:relative;border-color:rgba(255,211,92,.8);box-shadow:0 0 16px rgba(255,174,52,.18);}
#pokehub-app .ph-lb-feed-jackpot-ribbon{position:absolute;left:3px;right:3px;top:3px;z-index:4;display:flex;justify-content:center;align-items:center;padding:4px 2px;border:1px solid rgba(255,255,255,.38);border-radius:4px;background:linear-gradient(105deg,#9e4a0e,#ffd35c 52%,#b46a13);color:#1a1003;font-size:7px;font-weight:1000;letter-spacing:.04em;text-align:center;text-shadow:0 1px 0 rgba(255,255,255,.28);box-shadow:0 2px 8px rgba(0,0,0,.36);}
#pokehub-app .ph-lb-feed-price-jackpot{color:#ffd35c;text-shadow:0 0 10px rgba(255,211,92,.18);font-size:12px;}
#pokehub-app .ph-lb-feed-jackpot-caption{margin-left:auto;padding:3px 5px;border-radius:4px;background:rgba(255,181,67,.12);border:1px solid rgba(255,181,67,.32);color:#ffd17c;font-size:7px;font-weight:1000;letter-spacing:.04em;white-space:nowrap;}
@keyframes ph-jackpot-border-glow{0%,100%{box-shadow:inset 0 0 0 1px rgba(255,211,92,.045),0 0 8px rgba(255,166,49,.035);}50%{box-shadow:inset 0 0 0 1px rgba(255,211,92,.12),0 0 18px rgba(255,166,49,.11);}}
@media(prefers-reduced-motion:reduce){#pokehub-app .ph-lb-feed-item.ph-lb-feed-jackpot{animation:none;}}
@media(max-width:520px){#pokehub-app .ph-lb-feed-summary{font-size:8px;padding:7px 8px;}#pokehub-app .ph-lb-feed-jackpot-ribbon{font-size:6px;}}
</style>

<script>
/* Set before the packed legacy widget runs: this version uses Supabase, not Firebase. */
window.__pokehubSupabaseLeaderboardActive = true;
</script>
<script type="text/plain" id="phsrc">KGZ1bmN0aW9uKCl7CiAgInVzZSBzdHJpY3QiOwogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bva2VodWItYXBwJyk7CiAgaWYgKCFyb290IHx8IHJvb3QuZGF0YXNldC5ib290ZWQpIHJldHVybjsKICByb290LmRhdGFzZXQuYm9vdGVkID0gJzEnOwoKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbihlKXsKICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BoLXN0YXR1cycpOwogICAgaWYgKHMgJiYgIXMuZGF0YXNldC5waEVycm9yU2hvd24pewogICAgICBzLmRhdGFzZXQucGhFcnJvclNob3duID0gJzEnOwogICAgICBzLmhpZGRlbiA9IGZhbHNlOwogICAgICBzLnRleHRDb250ZW50ID0gJ0zhu5dpIHThuq1wIGzhu4duaCBj4bunYSB3aWRnZXQ6ICcgKyAoZS5tZXNzYWdlIHx8ICdraMO0bmcgcsO1IGzhu5dpJykgKyAnLiBIw6N5IG3hu58gY29uc29sZSBj4bunYSB0csOsbmggZHV54buHdCDEkeG7gyB4ZW0gY2hpIHRp4bq/dC4nOwogICAgfQogIH0pOwoKICB2YXIgQVBJID0gImh0dHBzOi8vYXBpLnRjZ2RleC5uZXQvdjIvZW4iOwogIHZhciBRVUFMSVRZID0gImhpZ2gud2VicCI7CiAgdmFyIFNFUklFU19JRFMgPSBbIm1lIiwgInRjZ3AiLCAic3YiLCAiYmFzZSIsICJneW0iLCAibmVvIiwgImVjYXJkIiwgImV4IiwgImRwIiwgInBsIiwgImhnc3MiLCAiYnciLCAieHkiLCAic20iLCAic3dzaCJdOwogIHZhciBTRVJJRVNfUFJJT1JJVFkgPSBbIm1lIiwgInN2IiwgInRjZ3AiLCAic3dzaCIsICJzbSIsICJ4eSIsICJidyIsICJoZ3NzIiwgInBsIiwgImRwIiwgImV4IiwgImVjYXJkIiwgIm5lbyIsICJneW0iLCAiYmFzZSJdOwogIC8vIMavdSB0acOqbiBwYWNrIMSRYW5nIG7Ds25nIC8gbeG7m2kgdHLDqm4gxJHhuqd1LCBuaMawbmcgY2jhu4kgZMO5bmcgY8OhYyBi4buZIGPDsyBk4buvIGxp4buHdQogIC8vIHbDoCDhuqNuaCDhu5VuIMSR4buLbmggdHJvbmcgVENHZGV4LiBNRVAgQmxhY2sgU3RhciBQcm9tb3MgYuG7iyBsb+G6oWkga2jhu49pIGRhbmggc8OhY2gKICAvLyB2w6wgYXNzZXQgbG9nbyBraMO0bmcgY8OzIHRyw6puIFRDR2RleC4gNCBwYWNrIC8gaMOgbmcgduG6q24gZ2nhu68gbmd1ecOqbi4KICB2YXIgRElTUExBWV9TRVRfT1JERVIgPSBbCiAgICAiMzB0aCBDZWxlYnJhdGlvbiIsCiAgICAiUG9rw6ltb24gR08iLAogICAgIlBoYW50YXNtYWwgRmxhbWVzIiwKICAgICJQaXRjaCBCbGFjayIsCiAgICAiQ2hhb3MgUmlzaW5nIiwKICAgICJNZWdhIEV2b2x1dGlvbiIsCiAgICAiQXNjZW5kZWQgSGVyb2VzIiwKICAgICJXaGl0ZSBGbGFyZSIsCiAgICAiQmxhY2sgQm9sdCIKICBdOwogIHZhciBGRUFUVVJFRF9TRVRfSURTID0gWyJtNmEiLCAibWUwNSIsICJzd3NoMTAiLCAic3YxMXciLCAic3YxMWIiXTsgLy8gUGl0Y2ggQmxhY2ssIFBva8OpbW9uIEdPLCBXaGl0ZSBGbGFyZSwgQmxhY2sgQm9sdAogIHZhciBFVVJfVVNEID0gMS4wODsKICB2YXIgREVGQVVMVF9QQUNLX1BSSUNFID0gNC40OTsKCiAgLy8gLS0tLS0tLS0tLSBUw4pOIFRSQUlORVIgKyBCWEggUkVBTFRJTUUgLS0tLS0tLS0tLQogIC8vIETDoW4gRmlyZWJhc2UgUmVhbHRpbWUgRGF0YWJhc2UgY29uZmlnIGPhu6dhIGLhuqFuIHbDoG8gxJHDonkgxJHhu4MgYuG6rXQgQlhIIGdp4buvYSBOSEnhu4BVIE5Hxq/hu5xJLgogIC8vIMSQ4buDIHRy4buRbmcgdGjDrCBwYWNrIHbhuqtuIGNo4bqheSBiw6xuaCB0aMaw4budbmc7IEJYSCBjaOG7iSBoaeG7h24gdHLhuqFuZyB0aMOhaSBjaMawYSBj4bqldSBow6xuaC4KICB2YXIgUEhfTEVBREVSQk9BUkRfQ09ORklHID0gewogICAgYXBpS2V5OiAnJywKICAgIGF1dGhEb21haW46ICcnLAogICAgZGF0YWJhc2VVUkw6ICcnLAogICAgcHJvamVjdElkOiAnJywKICAgIGFwcElkOiAnJwogIH07CiAgdmFyIFBIX1RSQUlORVJfS0VZID0gJ3Bva2VodWIudHJhaW5lci5uYW1lLnYxJzsKICB2YXIgUEhfTEJfVUlEX0tFWSA9ICdwb2tlaHViLmxlYWRlcmJvYXJkLnVpZC52MSc7CiAgdmFyIFBIX0xCX1BBVEggPSAncG9rZWh1YkxlYWRlcmJvYXJkL3YxL3BsYXllcnMnOwogIHZhciBwaExiID0gewogICAgZmlyZWJhc2VBcHA6bnVsbCwgZGI6bnVsbCwgcGxheWVyc1JlZjpudWxsLCBjb25uZWN0ZWRSZWY6bnVsbCwKICAgIGNvbm5lY3RlZDpmYWxzZSwgcmVhZHk6ZmFsc2UsIGxvYWRpbmc6ZmFsc2UsIHVuc3ViOm51bGwsIHVpZDpudWxsLAogICAgX3NuYXBzaG90Om51bGwsIF9zZGtQcm9taXNlOm51bGwKICB9OwoKICBmdW5jdGlvbiBzZXJpZXNQcmlvcml0eVJhbmsoc2VyaWVzSWQpewogICAgdmFyIGlkeCA9IFNFUklFU19QUklPUklUWS5pbmRleE9mKHNlcmllc0lkKTsKICAgIHJldHVybiBpZHggPT09IC0xID8gU0VSSUVTX1BSSU9SSVRZLmxlbmd0aCA6IGlkeDsKICB9CgogIHZhciBQQUxFVFRFUyA9IFsKICAgIFsiI2ZmNmI0YSIsIiM0YTdmZmYiXSxbIiM2YmU4YzAiLCIjYjc5Y2ZmIl0sWyIjNmM4Y2ZmIiwiI2ZmN2ZjNCJdLFsiI2ZmYjg0YSIsIiNmZjZiYjAiXSwKICAgIFsiIzRhZDBmZiIsIiM4ZGZmNmIiXSxbIiNjOTZiZmYiLCIjZmY5YTRhIl0sWyIjNGFmZmIwIiwiIzRhN2ZmZiJdLFsiI2ZmNGE3YSIsIiNmZmQzNWMiXQogIF07CiAgZnVuY3Rpb24gcGFsZXR0ZUZvcihpZCl7CiAgICB2YXIgaCA9IDA7CiAgICBmb3IgKHZhciBpPTA7aTxpZC5sZW5ndGg7aSsrKSBoID0gKGgqMzEgKyBpZC5jaGFyQ29kZUF0KGkpKSA+Pj4gMDsKICAgIHJldHVybiBQQUxFVFRFU1toICUgUEFMRVRURVMubGVuZ3RoXTsKICB9CgogIC8vIFRDR2RleCBoaeG7h24ga2jDtG5nIGPDsyBhc3NldCBsb2dvIGNobyBNRVAgQmxhY2sgU3RhciBQcm9tb3MuIETDuW5nIGxvZ28gU1ZHCiAgLy8gbuG7mWkgdHV54bq/biBsw6BtIGZhbGxiYWNrIMSR4buDIGNhcmQgduG6q24gY8OzIGjDrG5oIG5o4bqtbiBkaeG7h24gdGhheSB2w6wgY2jhu4kgaGnhu4duIGNo4buvIE0uCiAgdmFyIEZBTExCQUNLX1NFVF9MT0dPUyA9IHsKICAgIC8vIExvZ28gMzB0aCBDZWxlYnJhdGlvbiAoUE5HIHRyb25nIHN14buRdCkg4oCUIGTDuW5nIHRy4buxYyB0aeG6v3AgdOG7qyBCdWxiYWdhcmRlbiBBcmNoaXZlcwogICAgLy8gdsOsIGFzc2V0IGxvZ28gY+G7p2EgVENHZGV4IGtow7RuZyBwaOG6o2kgbMO6YyBuw6BvIGPFqW5nIGPDsyBVUkwgY8O0bmcga2hhaSDhu5VuIMSR4buLbmguCiAgICBtNmE6ICdodHRwczovL2FyY2hpdmVzLmJ1bGJhZ2FyZGVuLm5ldC9tZWRpYS91cGxvYWQvZC9kOS8zMHRoX0NlbGVicmF0aW9uX0xvZ29fRU4ucG5nJywKICAgIG1lcDogJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PVVURi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQoCiAgICAgICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUyMCAxODBcIj4nICsKICAgICAgJzxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD1cImdcIiB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjFcIiB5Mj1cIjFcIj48c3RvcCBzdG9wLWNvbG9yPVwiI2ZmOGE2NVwiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiM3ZDdjZmZcIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+JyArCiAgICAgICc8cmVjdCB4PVwiOFwiIHk9XCI4XCIgd2lkdGg9XCI1MDRcIiBoZWlnaHQ9XCIxNjRcIiByeD1cIjM4XCIgZmlsbD1cInVybCgjZylcIiBzdHJva2U9XCIjMTExMzI2XCIgc3Ryb2tlLXdpZHRoPVwiMTZcIi8+JyArCiAgICAgICc8dGV4dCB4PVwiMjYwXCIgeT1cIjExM1wiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZm9udC1mYW1pbHk9XCJBcmlhbCwgc2Fucy1zZXJpZlwiIGZvbnQtc2l6ZT1cIjgyXCIgZm9udC13ZWlnaHQ9XCI5MDBcIiBmb250LXN0eWxlPVwiaXRhbGljXCIgZmlsbD1cIiNmZmZcIiBzdHJva2U9XCIjMTExMzI2XCIgc3Ryb2tlLXdpZHRoPVwiMTRcIiBwYWludC1vcmRlcj1cInN0cm9rZVwiPk1FUDwvdGV4dD4nICsKICAgICAgJzwvc3ZnPicKICAgICkKICB9OwoKICAvLyDhuqJuaCBu4buBbiAvIOG6o25oIGLDrGEgcmnDqm5nIGNobyAzMHRoIENlbGVicmF0aW9uLgogIC8vIETDuW5nIGtleSB2aXN1YWwgY2jDrW5oIHRo4bupYzsgbmjhuq1uIGRp4buHbiB0aGVvIGPhuqMgSUQgbOG6q24gdMOqbiDEkeG7gyBraMO0bmcgcGjhu6UgdGh14buZYwogIC8vIHZp4buHYyBBUEkvc2VyaWVzIHRy4bqjIHbhu4EgYmnhur9uIHRo4buDIElEIG7DoG8gY2hvIHNldCBt4bubaS4KICB2YXIgVEhJUlRJRVRIX0JHID0gJ2h0dHBzOi8vd3d3LjMwdGgucG9rZW1vbi1jYXJkLmNvbS9pbWFnZXMvbTZhL202YV9rdl8xZTI2YzgwMi53ZWJwP3Y9MjAyNjEwMDQnOwogIHZhciBGQUxMQkFDS19TRVRfQkFDS0dST1VORFMgPSB7CiAgICBtNmE6IFRISVJUSUVUSF9CRwogIH07CgogIGZ1bmN0aW9uIGlzMzB0aENlbGVicmF0aW9uU2V0KHNldCl7CiAgICBpZiAoIXNldCkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGlkID0gU3RyaW5nKHNldC5pZCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICB2YXIgbmFtZSA9IFN0cmluZyhzZXQubmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gaWQgPT09ICdtNmEnIHx8IG5hbWUgPT09ICczMHRoIGNlbGVicmF0aW9uJyB8fCBuYW1lLmluZGV4T2YoJzMwdGggY2VsZWJyYXRpb24nKSAhPT0gLTE7CiAgfQoKICBmdW5jdGlvbiBzZXRMb2dvVXJsKHNldCl7CiAgICBpZiAoIXNldCkgcmV0dXJuICcnOwogICAgLy8gS2V5IHZpc3VhbCDEkcOjIGPDsyBz4bq1biBsb2dvIDMwdGg7IGtow7RuZyBjaOG7k25nIHRow6ptIGxvZ28gbmdvw6BpLgogICAgaWYgKGlzMzB0aENlbGVicmF0aW9uU2V0KHNldCkpIHJldHVybiAnJzsKICAgIGlmIChGQUxMQkFDS19TRVRfTE9HT1NbU3RyaW5nKHNldC5pZCB8fCAnJykudG9Mb3dlckNhc2UoKV0pewogICAgICByZXR1cm4gRkFMTEJBQ0tfU0VUX0xPR09TW1N0cmluZyhzZXQuaWQgfHwgJycpLnRvTG93ZXJDYXNlKCldOwogICAgfQogICAgaWYgKHNldC5sb2dvKSByZXR1cm4gc2V0LmxvZ28gKyAnLndlYnAnOwogICAgcmV0dXJuICcnOwogIH0KCiAgZnVuY3Rpb24gc2V0QmFja2dyb3VuZFVybChzZXQpewogICAgaWYgKCFzZXQpIHJldHVybiAnJzsKICAgIGlmIChpczMwdGhDZWxlYnJhdGlvblNldChzZXQpKSByZXR1cm4gVEhJUlRJRVRIX0JHOwogICAgdmFyIGlkID0gU3RyaW5nKHNldC5pZCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoRkFMTEJBQ0tfU0VUX0JBQ0tHUk9VTkRTW2lkXSkgcmV0dXJuIEZBTExCQUNLX1NFVF9CQUNLR1JPVU5EU1tpZF07CiAgICByZXR1cm4gJyc7CiAgfQoKICBmdW5jdGlvbiBzZXRQYWNrQXJ0VXJsKHNldCwgZnVsbFNldCl7CiAgICBpZiAoIXNldCAmJiAhZnVsbFNldCkgcmV0dXJuICcnOwogICAgdmFyIHMgPSBmdWxsU2V0IHx8IHNldCB8fCB7fTsKICAgIGlmIChpczMwdGhDZWxlYnJhdGlvblNldChzKSB8fCBpczMwdGhDZWxlYnJhdGlvblNldChzZXQpKSByZXR1cm4gVEhJUlRJRVRIX0JHOwogICAgdmFyIGNhcmRzID0gQXJyYXkuaXNBcnJheShzLmNhcmRzKSA/IHMuY2FyZHMgOiBbXTsKICAgIGZvciAodmFyIGk9MDtpPGNhcmRzLmxlbmd0aDtpKyspewogICAgICBpZiAoY2FyZHNbaV0gJiYgY2FyZHNbaV0uaW1hZ2UpIHJldHVybiBjYXJkc1tpXS5pbWFnZSArICcvJyArIFFVQUxJVFk7CiAgICB9CiAgICBpZiAocy5sb2dvKSByZXR1cm4gU3RyaW5nKHMubG9nbykucmVwbGFjZSgvXC53ZWJwJC9pLCcnKSArICcud2VicCc7CiAgICBpZiAoc2V0ICYmIHNldC5sb2dvKSByZXR1cm4gU3RyaW5nKHNldC5sb2dvKS5yZXBsYWNlKC9cLndlYnAkL2ksJycpICsgJy53ZWJwJzsKICAgIHJldHVybiBzZXRCYWNrZ3JvdW5kVXJsKHMpIHx8ICcnOwogIH0KCiAgZnVuY3Rpb24gc2V0UGFja0xvZ29Vcmwoc2V0LCBmdWxsU2V0KXsKICAgIHZhciBzID0gZnVsbFNldCB8fCBzZXQgfHwge307CiAgICBpZiAoaXMzMHRoQ2VsZWJyYXRpb25TZXQocykgfHwgaXMzMHRoQ2VsZWJyYXRpb25TZXQoc2V0KSkgcmV0dXJuICcnOwogICAgdmFyIGlkID0gU3RyaW5nKHMuaWQgfHwgKHNldCAmJiBzZXQuaWQpIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgaWYgKEZBTExCQUNLX1NFVF9MT0dPU1tpZF0pIHJldHVybiBGQUxMQkFDS19TRVRfTE9HT1NbaWRdOwogICAgaWYgKHMubG9nbykgcmV0dXJuIFN0cmluZyhzLmxvZ28pLnJlcGxhY2UoL1wud2VicCQvaSwnJykgKyAnLndlYnAnOwogICAgaWYgKHNldCAmJiBzZXQubG9nbykgcmV0dXJuIFN0cmluZyhzZXQubG9nbykucmVwbGFjZSgvXC53ZWJwJC9pLCcnKSArICcud2VicCc7CiAgICByZXR1cm4gJyc7CiAgfQoKICBmdW5jdGlvbiBlbnN1cmVQYWNrVmlzdWFsKCl7CiAgICBpZiAoIWVscy5wYWNrKSByZXR1cm47CiAgICBpZiAoZWxzLnBhY2tBcnQgJiYgZWxzLnBhY2tBcnQucGFyZW50Tm9kZT09PWVscy5wYWNrKSByZXR1cm47CgogICAgdmFyIGFydD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgIGFydC5jbGFzc05hbWU9J3BoLXBhY2stYXJ0JzsKICAgIGFydC5hbHQ9Jyc7CiAgICBhcnQuZGVjb2Rpbmc9J2FzeW5jJzsKICAgIGFydC5sb2FkaW5nPSdlYWdlcic7CiAgICBhcnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTsKCiAgICB2YXIgc2hhZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc2hhZGUuY2xhc3NOYW1lPSdwaC1wYWNrLWFydC1zaGFkZSc7CiAgICBzaGFkZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywndHJ1ZScpOwoKICAgIHZhciBsb2dvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgbG9nby5jbGFzc05hbWU9J3BoLXBhY2stbG9nbyc7CiAgICBsb2dvLmFsdD0nJzsKICAgIGxvZ28uZGVjb2Rpbmc9J2FzeW5jJzsKICAgIGxvZ28uc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTsKCiAgICB2YXIgc2VhbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzZWFsLmNsYXNzTmFtZT0ncGgtcGFjay1zZWFsJzsKICAgIHNlYWwuaW5uZXJIVE1MPSc8c3Bhbj5QT0vDiU1PTiBUQ0c8L3NwYW4+PGI+Qk9PU1RFUiBQQUNLPC9iPic7CiAgICBzZWFsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCd0cnVlJyk7CgogICAgdmFyIHNlcmllcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzZXJpZXMuY2xhc3NOYW1lPSdwaC1wYWNrLXNlcmllcyc7CiAgICBzZXJpZXMudGV4dENvbnRlbnQ9J1RSQURJTkcgQ0FSRCBHQU1FJzsKICAgIHNlcmllcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywndHJ1ZScpOwoKICAgIHZhciBzaGluZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBzaGluZS5jbGFzc05hbWU9J3BoLXBhY2stc2hpbmUnOwogICAgc2hpbmUuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsJ3RydWUnKTsKCiAgICBlbHMucGFjay5pbnNlcnRCZWZvcmUoYXJ0LCBlbHMucGFjay5maXJzdENoaWxkKTsKICAgIGVscy5wYWNrLmFwcGVuZENoaWxkKHNoYWRlKTsKICAgIGVscy5wYWNrLmFwcGVuZENoaWxkKGxvZ28pOwogICAgZWxzLnBhY2suYXBwZW5kQ2hpbGQoc2VhbCk7CiAgICBlbHMucGFjay5hcHBlbmRDaGlsZChzZXJpZXMpOwogICAgZWxzLnBhY2suYXBwZW5kQ2hpbGQoc2hpbmUpOwogICAgZWxzLnBhY2tBcnQ9YXJ0OyBlbHMucGFja0xvZ289bG9nbzsgZWxzLnBhY2tTZWFsPXNlYWw7IGVscy5wYWNrU2VyaWVzPXNlcmllczsKICB9CgogIGZ1bmN0aW9uIGFwcGx5UGFja1Zpc3VhbChzZXQsIGZ1bGxTZXQpewogICAgZW5zdXJlUGFja1Zpc3VhbCgpOwogICAgaWYgKCFlbHMucGFjaykgcmV0dXJuOwogICAgdmFyIGFydFVybD1zZXRQYWNrQXJ0VXJsKHNldCwgZnVsbFNldCk7CiAgICB2YXIgbG9nb1VybD1zZXRQYWNrTG9nb1VybChzZXQsIGZ1bGxTZXQpOwogICAgdmFyIG5hbWU9KGZ1bGxTZXQgJiYgZnVsbFNldC5uYW1lKSB8fCAoc2V0ICYmIHNldC5uYW1lKSB8fCAnUG9rw6ltb24gVENHJzsKICAgIHZhciBpczMwPWlzMzB0aENlbGVicmF0aW9uU2V0KGZ1bGxTZXQgfHwgc2V0KTsKCiAgICBlbHMucGFjay5kYXRhc2V0LnBhY2tTZXQ9U3RyaW5nKChmdWxsU2V0ICYmIGZ1bGxTZXQuaWQpIHx8IChzZXQgJiYgc2V0LmlkKSB8fCAnJyk7CiAgICBlbHMucGFjay5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1waC1wYWNrLWFjY2VudCcsIGlzMzAgPyAnI2ZmZDY1YScgOiAncmdiYSg5MCwxOTAsMjU1LC45NSknKTsKICAgIGVscy5wYWNrTGFiZWwudGV4dENvbnRlbnQ9bmFtZTsKICAgIGVscy5wYWNrU2VyaWVzLnRleHRDb250ZW50PWlzMzAgPyAnMzBUSCBBTk5JVkVSU0FSWSDigKIgQk9PU1RFUiBQQUNLJyA6ICdUUkFESU5HIENBUkQgR0FNRSDigKIgQk9PU1RFUiBQQUNLJzsKCiAgICBlbHMucGFja0FydC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpOwogICAgZWxzLnBhY2tBcnQuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgICBpZiAoYXJ0VXJsKXsKICAgICAgZWxzLnBhY2tBcnQuc3JjPWFydFVybDsKICAgICAgZWxzLnBhY2tBcnQuc3R5bGUuZGlzcGxheT0nYmxvY2snOwogICAgICBlbHMucGFja0FydC5vbmVycm9yPWZ1bmN0aW9uKCl7CiAgICAgICAgaWYgKGVscy5wYWNrQXJ0KSBlbHMucGFja0FydC5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgfTsKICAgIH0KCiAgICBlbHMucGFja0xvZ28ucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsKICAgIGVscy5wYWNrTG9nby5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgIGlmIChsb2dvVXJsICYmICFpczMwKXsKICAgICAgZWxzLnBhY2tMb2dvLnNyYz1sb2dvVXJsOwogICAgICBlbHMucGFja0xvZ28uc3R5bGUuZGlzcGxheT0nYmxvY2snOwogICAgICBlbHMucGFja0xvZ28ub25lcnJvcj1mdW5jdGlvbigpeyBpZiAoZWxzLnBhY2tMb2dvKSBlbHMucGFja0xvZ28uc3R5bGUuZGlzcGxheT0nbm9uZSc7IH07CiAgICB9CgogICAgZWxzLnBhY2suY2xhc3NMaXN0LnRvZ2dsZSgncGgtcGFjay1oYXMtYXJ0JywgISFhcnRVcmwpOwogICAgZWxzLnBhY2suY2xhc3NMaXN0LnRvZ2dsZSgncGgtcGFjay1pcy0zMHRoJywgaXMzMCk7CiAgfQoKCiAgLy8gLS0tLS0tLS0tLSB04buJIGzhu4cgcsO6dCB0aGVvIHThuqduZyDEkeG7mSBoaeG6v20gLS0tLS0tLS0tLQogIC8vIFRy4buNbmcgc+G7kSBUxq/GoE5HIMSQ4buQSSBjaG8gbeG7l2kgdOG6p25nICgwID0gdGjGsOG7nW5nIC4uIDYgPSBjaGFzZSkuIMSQw6J5IGNo4buJIGzDoAogIC8vIHjhuqVwIHjhu4kgdGhlbyBj4bqjbSBnacOhYyB0aOG7sWMgdOG6vyBt4bufIGfDs2kgKG3hu5dpIHThuqduZyBoaeG6v20gaMahbiB04bqnbmcgdHLGsOG7m2MKICAvLyBjaOG7q25nIDIuNeKAkzMuNSBs4bqnbiksIEtIw5RORyBwaOG6o2kgdOG7iSBs4buHIGluIOG6pW4gY2jDrW5oIHRo4bupYyBj4bunYSBQb2vDqW1vbiBUQ0cKICAvLyAoc+G7kSDEkcOzIGtow7RuZyBjw7RuZyBraGFpIHbDoCBraMOhYyBuaGF1IHRoZW8gdOG7q25nIGLhu5kpLiBN4bulYyB0acOqdSBsw6AgxJHhu4MKICAvLyBt4buZdCBsw6EgYuG6rWMgNiBraMO0bmcgY8OybiBjw7MgY8ahIGjhu5lpIHRyw7puZyBuZ2FuZyBi4bqxbmcgbeG7mXQgbMOhIGLhuq1jIDAgY2jhu4kKICAvLyB2w6wgY+G6oyBoYWkgxJHhu4F1IGzDoCAibeG7mXQgSUQgdGjhursiIOKAlCB24bqlbiDEkeG7gSBj4bunYSBi4bqjbiBjxakuCiAgdmFyIFRJRVJfV0VJR0hUUyA9IFsxMDAsIDQyLCAxNCwgNC4yLCAxLjMsIDAuNDIsIDAuMTRdOwogIHZhciBSQVJJVFlfVElFUl9HUk9VUFMgPSBudWxsOyAgIC8vIFsgW2NodeG7l2kgxJHhu5kgaGnhur9tIHThuqduZyAwXSwgW3ThuqduZyAxXSwgLi4uIF0KICB2YXIgcmFyaXR5VGF4b25vbXlQcm9taXNlID0gbnVsbDsKCiAgdmFyIHN0YXRlID0geyBjdXJyZW50Om51bGwsIHBvb2w6W10sIHRpZXJQb29sczpudWxsLCBjYWNoZTpuZXcgTWFwKCksIG9wZW5pbmc6ZmFsc2UsIG11dGVkOmZhbHNlLCBsYXN0UmVzdWx0Om51bGwsIGV4cGFuc2lvbnM6W10sIG9wZW5TY3JvbGxZOm51bGwgfTsKICB2YXIgcGFja0RldGFpbENhY2hlID0gbmV3IE1hcCgpOwogIHZhciBwYWNrRGV0YWlsUHJpY2VDYWNoZSA9IG5ldyBNYXAoKTsKICB2YXIgcGFja0RldGFpbFByaWNlUmVxdWVzdHMgPSBuZXcgTWFwKCk7CiAgdmFyIHBhY2tEZXRhaWxQcmljZU9ic2VydmVyID0gbnVsbDsKICB2YXIgcGFja0RldGFpbE1vZGFsID0gbnVsbCwgcGFja0RldGFpbE1vZGFsQm9keSA9IG51bGwsIHBhY2tEZXRhaWxBY3RpdmUgPSBudWxsOwogIHZhciBwYWNrRGV0YWlsUmV0dXJuID0gZmFsc2UsIHBhY2tEZXRhaWxSZXF1ZXN0VG9rZW4gPSAwOwogIHZhciAkID0gZnVuY3Rpb24oaWQpeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9OwogIHZhciBlbHMgPSB7CiAgICBzdGF0dXM6JCgncGgtc3RhdHVzJyksIGdyaWQ6JCgncGgtZXhwLWdyaWQnKSwKICAgIHBpY2s6JCgncGgtc2NyZWVuLXBpY2snKSwgb3BlbjokKCdwaC1zY3JlZW4tb3BlbicpLAogICAgYmFjazokKCdwaC1iYWNrLWJ0bicpLCBwYWNrOiQoJ3BoLXBhY2snKSwgcGFja0xhYmVsOiQoJ3BoLXBhY2stbGFiZWwnKSwKICAgIHBhY2tBcnQ6bnVsbCwgcGFja0xvZ286bnVsbCwgcGFja1NlYWw6bnVsbCwgcGFja1NlcmllczpudWxsLAogICAgaGludDokKCdwaC1oaW50JyksIGVycjokKCdwaC1vcGVuLWVycicpLCBzdGFnZTokKCdwaC1zdGFnZScpLAogICAgYm94Um93OiQoJ3BoLWJveC1yb3cnKSwKICAgIHByb2dyZXNzOiQoJ3BoLXByb2dyZXNzJyksIHByb2dyZXNzQmFyOiQoJ3BoLXByb2dyZXNzLWJhcicpLCBwcm9ncmVzc1RleHQ6JCgncGgtcHJvZ3Jlc3MtdGV4dCcpLAogICAgcmV2ZWFsOiQoJ3BoLXJldmVhbCcpLCByb3c6JCgncGgtY2FyZC1yb3cnKSwgYmFubmVyOiQoJ3BoLWJhbm5lcicpLAogICAgbHVjazokKCdwaC1sdWNrJyksIGx1Y2tTY29yZTokKCdwaC1sdWNrLXNjb3JlJyksCiAgICB0b3RhbDokKCdwaC10b3RhbCcpLCB0b3RhbFZhbDokKCdwaC10b3RhbC12YWwnKSwgcXVpcDokKCdwaC1xdWlwJyksCiAgICBzYXZlZDokKCdwaC1zYXZlZCcpLAogICAgY29uZmV0dGk6JCgncGgtY29uZmV0dGknKSwKICAgIG1vZGFsOiQoJ3BoLW1vZGFsJyksIG1vZGFsQmFja2Ryb3A6JCgncGgtbW9kYWwtYmFja2Ryb3AnKSwKICAgIG1vZGFsQ2xvc2U6JCgncGgtbW9kYWwtY2xvc2UnKSwgbW9kYWxCb2R5OiQoJ3BoLW1vZGFsLWJvZHknKSwKICAgIGFnYWluOiQoJ3BoLWFnYWluLWJ0bicpLCBjaGFuZ2U6JCgncGgtY2hhbmdlLWJ0bicpLCBmbGFzaDokKCdwaC1mbGFzaCcpLAogICAgc2hhcmU6JCgncGgtc2hhcmUtYnRuJyksCiAgICBtdXRlOiQoJ3BoLW11dGUtYnRuJyksIGNvbEJ0bjokKCdwaC1jb2wtYnRuJyksIGNvbENvdW50OiQoJ3BoLWNvbC1jb3VudCcpLAogICAgY2hhc2VCdG46JCgncGgtY2hhc2UtYnRuJyksIGNoYXNlQ291bnQ6JCgncGgtY2hhc2UtY291bnQnKSwKICAgIGNoYXNlTW9kYWw6JCgncGgtY2hhc2UtbW9kYWwnKSwgY2hhc2VCYWNrZHJvcDokKCdwaC1jaGFzZS1iYWNrZHJvcCcpLAogICAgY2hhc2VDbG9zZTokKCdwaC1jaGFzZS1jbG9zZScpLCBjaGFzZUJvZHk6JCgncGgtY2hhc2UtYm9keScpLAogICAgY29sTW9kYWw6JCgncGgtY29sLW1vZGFsJyksIGNvbEJhY2tkcm9wOiQoJ3BoLWNvbC1iYWNrZHJvcCcpLAogICAgY29sQ2xvc2U6JCgncGgtY29sLWNsb3NlJyksIGNvbEJvZHk6JCgncGgtY29sLWJvZHknKSwKICAgIGNoYWxsZW5nZUJ0bjokKCdwaC1jaGFsbGVuZ2UtYnRuJyksIGNoYWxsZW5nZUNvdW50OiQoJ3BoLWNoYWxsZW5nZS1jb3VudCcpLAogICAgY2hhbGxlbmdlTW9kYWw6JCgncGgtY2hhbGxlbmdlLW1vZGFsJyksIGNoYWxsZW5nZUJhY2tkcm9wOiQoJ3BoLWNoYWxsZW5nZS1iYWNrZHJvcCcpLAogICAgY2hhbGxlbmdlQ2xvc2U6JCgncGgtY2hhbGxlbmdlLWNsb3NlJyksIGNoYWxsZW5nZUJvZHk6JCgncGgtY2hhbGxlbmdlLWJvZHknKSwKICAgIHNob3BCdG46JCgncGgtc2hvcC1idG4nKSwgc2hvcFBvaW50c0JhZGdlOiQoJ3BoLXNob3AtcG9pbnRzLWJhZGdlJyksCiAgICBzaG9wTW9kYWw6JCgncGgtc2hvcC1tb2RhbCcpLCBzaG9wQmFja2Ryb3A6JCgncGgtc2hvcC1iYWNrZHJvcCcpLAogICAgc2hvcENsb3NlOiQoJ3BoLXNob3AtY2xvc2UnKSwgc2hvcEJvZHk6JCgncGgtc2hvcC1ib2R5JyksCiAgICBzZXRQcm9ncmVzczokKCdwaC1zZXQtcHJvZ3Jlc3MnKSwgc2V0UHJvZ3Jlc3NUaXRsZTokKCdwaC1zZXQtcHJvZ3Jlc3MtdGl0bGUnKSwKICAgIHNldFByb2dyZXNzTWV0YTokKCdwaC1zZXQtcHJvZ3Jlc3MtbWV0YScpLCBzZXRQcm9ncmVzc0JhcjokKCdwaC1zZXQtcHJvZ3Jlc3MtYmFyJyksCiAgICBzZXRQcm9ncmVzc1BjdDokKCdwaC1zZXQtcHJvZ3Jlc3MtcGN0JyksCiAgICBib3g6JCgncGgtYm94LXJlc3VsdCcpLCBib3hCb2R5OiQoJ3BoLWJveC1ib2R5JyksCiAgICBib3hTaGFyZTokKCdwaC1ib3gtc2hhcmUnKSwgYm94QWdhaW46JCgncGgtYm94LWFnYWluJyksIGJveENoYW5nZTokKCdwaC1ib3gtY2hhbmdlJyksCiAgICB0b2FzdDokKCdwaC10b2FzdCcpLAogICAgd2VsY29tZU1vZGFsOiQoJ3BoLXdlbGNvbWUtbW9kYWwnKSwgd2VsY29tZUlucHV0OiQoJ3BoLXRyYWluZXItbmFtZScpLAogICAgd2VsY29tZVN0YXJ0OiQoJ3BoLXdlbGNvbWUtc3RhcnQnKSwgd2VsY29tZUVycm9yOiQoJ3BoLXdlbGNvbWUtZXJyb3InKSwKICAgIGxiQnRuOiQoJ3BoLWxlYWRlcmJvYXJkLWJ0bicpLCBsYkxpdmU6JCgncGgtbGVhZGVyYm9hcmQtbGl2ZScpLAogICAgbGJNb2RhbDokKCdwaC1sZWFkZXJib2FyZC1tb2RhbCcpLCBsYkJhY2tkcm9wOiQoJ3BoLWxlYWRlcmJvYXJkLWJhY2tkcm9wJyksCiAgICBsYkNsb3NlOiQoJ3BoLWxlYWRlcmJvYXJkLWNsb3NlJyksIGxiQm9keTokKCdwaC1sZWFkZXJib2FyZC1ib2R5JykKICB9OwoKICAvLyAtLS0tLS0tLS0tIHRvYXN0IC0tLS0tLS0tLS0KICB2YXIgdG9hc3RUaW1lciA9IDA7CiAgZnVuY3Rpb24gdG9hc3QobXNnKXsKICAgIGVscy50b2FzdC50ZXh0Q29udGVudCA9IG1zZzsKICAgIGVscy50b2FzdC5jbGFzc0xpc3QuYWRkKCdwaC1zaG93Jyk7CiAgICBjbGVhclRpbWVvdXQodG9hc3RUaW1lcik7CiAgICB0b2FzdFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpeyBlbHMudG9hc3QuY2xhc3NMaXN0LnJlbW92ZSgncGgtc2hvdycpOyB9LCAzMjAwKTsKICB9CgogIC8vIC0tLS0tLS0tLS0gVFJBSU5FUiBOQU1FICsgR0xPQkFMIExFQURFUkJPQVJEIC0tLS0tLS0tLS0KICBmdW5jdGlvbiBwaExvYWRUcmFpbmVyTmFtZSgpewogICAgdmFyIG5hbWUgPSAnJzsKICAgIHRyeSB7IG5hbWUgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUEhfVFJBSU5FUl9LRVkpIHx8ICcnOyB9IGNhdGNoKGUpe30KICAgIHJldHVybiBTdHJpbmcobmFtZSkudHJpbSgpOwogIH0KCiAgZnVuY3Rpb24gcGhTYWZlVHJhaW5lck5hbWUobmFtZSl7CiAgICB2YXIgcyA9IFN0cmluZyhuYW1lID09IG51bGwgPyAnJyA6IG5hbWUpLnJlcGxhY2UoL1s8Pl0vZywnJykucmVwbGFjZSgvXHMrL2csJyAnKS50cmltKCk7CiAgICBpZiAocy5sZW5ndGggPiAxOCkgcyA9IHMuc2xpY2UoMCwxOCkudHJpbSgpOwogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiBwaFNhdmVUcmFpbmVyTmFtZShuYW1lKXsKICAgIHZhciBzID0gcGhTYWZlVHJhaW5lck5hbWUobmFtZSk7CiAgICBpZiAoIXMgfHwgcy5sZW5ndGggPCAyKSByZXR1cm4gZmFsc2U7CiAgICB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oUEhfVFJBSU5FUl9LRVksIHMpOyB9IGNhdGNoKGUpeyByZXR1cm4gZmFsc2U7IH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gcGhHZXRMYlVpZCgpewogICAgaWYgKHBoTGIudWlkKSByZXR1cm4gcGhMYi51aWQ7CiAgICB2YXIgdWlkID0gJyc7CiAgICB0cnkgeyB1aWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUEhfTEJfVUlEX0tFWSkgfHwgJyc7IH0gY2F0Y2goZSl7fQogICAgaWYgKCF1aWQpewogICAgICBpZiAod2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHVpZCA9IHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpOwogICAgICBlbHNlIHVpZCA9ICdwXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSArICdfJyArIERhdGUubm93KCkudG9TdHJpbmcoMzYpOwogICAgICB0cnkgeyB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oUEhfTEJfVUlEX0tFWSwgdWlkKTsgfSBjYXRjaChlKXt9CiAgICB9CiAgICBwaExiLnVpZCA9IHVpZDsKICAgIHJldHVybiB1aWQ7CiAgfQoKICBmdW5jdGlvbiBwaExiSXNDb25maWd1cmVkKCl7CiAgICByZXR1cm4gISEoUEhfTEVBREVSQk9BUkRfQ09ORklHICYmIFBIX0xFQURFUkJPQVJEX0NPTkZJRy5kYXRhYmFzZVVSTCAmJgogICAgICBTdHJpbmcoUEhfTEVBREVSQk9BUkRfQ09ORklHLmRhdGFiYXNlVVJMKS5pbmRleE9mKCdodHRwJykgPT09IDAgJiYKICAgICAgU3RyaW5nKFBIX0xFQURFUkJPQVJEX0NPTkZJRy5kYXRhYmFzZVVSTCkuaW5kZXhPZignWU9VUl8nKSA9PT0gLTEpOwogIH0KCiAgZnVuY3Rpb24gcGhMYlN0YXR1c1RleHQoKXsKICAgIGlmICghcGhMYklzQ29uZmlndXJlZCgpKSByZXR1cm4gJ0NoxrBhIGPhuqV1IGjDrG5oJzsKICAgIGlmIChwaExiLmxvYWRpbmcgJiYgIXBoTGIucmVhZHkpIHJldHVybiAnxJBhbmcga+G6v3QgbuG7kWnigKYnOwogICAgaWYgKHBoTGIuY29ubmVjdGVkKSByZXR1cm4gJ+KXjyBMSVZFJzsKICAgIGlmIChwaExiLnJlYWR5KSByZXR1cm4gJ03huqV0IGvhur90IG7hu5FpIMK3IHRo4butIGzhuqFpJzsKICAgIHJldHVybiAnxJBhbmcga+G6v3QgbuG7kWnigKYnOwogIH0KCiAgZnVuY3Rpb24gcGhMYlVwZGF0ZUxpdmVCYWRnZSgpewogICAgLy8gU3VwYWJhc2UgaXMgdGhlIGFjdGl2ZSBsZWFkZXJib2FyZCBiYWNrZW5kIGluIHRoZSBjdXJyZW50IGVtYmVkLgogICAgLy8gRG8gbm90IGxldCB0aGUgbGVnYWN5IEZpcmViYXNlIHBsYWNlaG9sZGVyIG92ZXJ3cml0ZSBpdHMgY29ubmVjdGlvbiBzdGF0ZS4KICAgIGlmICh3aW5kb3cuX19wb2tlaHViU3VwYWJhc2VMZWFkZXJib2FyZEFjdGl2ZSkgcmV0dXJuOwogICAgaWYgKCFlbHMubGJMaXZlKSByZXR1cm47CiAgICBlbHMubGJMaXZlLnRleHRDb250ZW50ID0gcGhMYlN0YXR1c1RleHQoKTsKICAgIGVscy5sYkxpdmUuY2xhc3NOYW1lID0gJ3BoLWxiLXN0YXR1cycgKyAocGhMYi5jb25uZWN0ZWQgPyAnIHBoLWxiLW9ubGluZScgOiAnJyk7CiAgICBlbHMubGJMaXZlLnRpdGxlID0gcGhMYlN0YXR1c1RleHQoKTsKICB9CgogIGZ1bmN0aW9uIHBoTGJTY3JpcHQoc3JjKXsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7CiAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgIHMuc3JjID0gc3JjOyBzLmFzeW5jID0gdHJ1ZTsKICAgICAgcy5vbmxvYWQgPSByZXNvbHZlOwogICAgICBzLm9uZXJyb3IgPSBmdW5jdGlvbigpeyByZWplY3QobmV3IEVycm9yKCdLaMO0bmcgdOG6o2kgxJHGsOG7o2MgdGjGsCB2aeG7h24gcmVhbHRpbWUnKSk7IH07CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHBoTGJFbnN1cmVGaXJlYmFzZSgpewogICAgaWYgKCFwaExiSXNDb25maWd1cmVkKCkpIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0NoxrBhIGPhuqV1IGjDrG5oIEZpcmViYXNlIFJlYWx0aW1lIERhdGFiYXNlJykpOwogICAgaWYgKHdpbmRvdy5maXJlYmFzZSAmJiB3aW5kb3cuZmlyZWJhc2UuZGF0YWJhc2UpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGlmIChwaExiLl9zZGtQcm9taXNlKSByZXR1cm4gcGhMYi5fc2RrUHJvbWlzZTsKICAgIHBoTGIubG9hZGluZyA9IHRydWU7CiAgICBwaExiVXBkYXRlTGl2ZUJhZGdlKCk7CiAgICBwaExiLl9zZGtQcm9taXNlID0gcGhMYlNjcmlwdCgnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vZmlyZWJhc2Vqcy84LjEwLjEvZmlyZWJhc2UtYXBwLmpzJykKICAgICAgLnRoZW4oZnVuY3Rpb24oKXsgcmV0dXJuIHBoTGJTY3JpcHQoJ2h0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2ZpcmViYXNlanMvOC4xMC4xL2ZpcmViYXNlLWRhdGFiYXNlLmpzJyk7IH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uKCl7IHBoTGIubG9hZGluZyA9IGZhbHNlOyB9KQogICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKXsgcGhMYi5sb2FkaW5nID0gZmFsc2U7IHRocm93IGVycjsgfSk7CiAgICByZXR1cm4gcGhMYi5fc2RrUHJvbWlzZTsKICB9CgogIGZ1bmN0aW9uIHBoTGJJbml0KCl7CiAgICBpZiAod2luZG93Ll9fcG9rZWh1YlN1cGFiYXNlTGVhZGVyYm9hcmRBY3RpdmUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgaWYgKCFwaExiSXNDb25maWd1cmVkKCkpewogICAgICBwaExiVXBkYXRlTGl2ZUJhZGdlKCk7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpOwogICAgfQogICAgcmV0dXJuIHBoTGJFbnN1cmVGaXJlYmFzZSgpLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgaWYgKCF3aW5kb3cuZmlyZWJhc2UgfHwgIXdpbmRvdy5maXJlYmFzZS5kYXRhYmFzZSkgdGhyb3cgbmV3IEVycm9yKCdGaXJlYmFzZSBjaMawYSBz4bq1biBzw6BuZycpOwogICAgICBpZiAoIXBoTGIuZmlyZWJhc2VBcHApewogICAgICAgIHZhciBhcHBzID0gd2luZG93LmZpcmViYXNlLmFwcHMgfHwgW107CiAgICAgICAgaWYgKGFwcHMubGVuZ3RoKSBwaExiLmZpcmViYXNlQXBwID0gYXBwc1swXTsKICAgICAgICBlbHNlIHBoTGIuZmlyZWJhc2VBcHAgPSB3aW5kb3cuZmlyZWJhc2UuaW5pdGlhbGl6ZUFwcChQSF9MRUFERVJCT0FSRF9DT05GSUcpOwogICAgICB9CiAgICAgIGlmICghcGhMYi5kYikgcGhMYi5kYiA9IHBoTGIuZmlyZWJhc2VBcHAuZGF0YWJhc2UoKTsKICAgICAgaWYgKCFwaExiLnBsYXllcnNSZWYpIHBoTGIucGxheWVyc1JlZiA9IHBoTGIuZGIucmVmKFBIX0xCX1BBVEgpOwogICAgICBpZiAoIXBoTGIuY29ubmVjdGVkUmVmKXsKICAgICAgICBwaExiLmNvbm5lY3RlZFJlZiA9IHBoTGIuZGIucmVmKCcuaW5mby9jb25uZWN0ZWQnKTsKICAgICAgICBwaExiLmNvbm5lY3RlZFJlZi5vbigndmFsdWUnLCBmdW5jdGlvbihzbmFwKXsKICAgICAgICAgIHBoTGIuY29ubmVjdGVkID0gc25hcC52YWwoKSA9PT0gdHJ1ZTsKICAgICAgICAgIHBoTGJVcGRhdGVMaXZlQmFkZ2UoKTsKICAgICAgICAgIGlmIChlbHMubGJNb2RhbCAmJiAhZWxzLmxiTW9kYWwuaGlkZGVuKSBwaFJlbmRlckxlYWRlcmJvYXJkKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcGhMYi5yZWFkeSA9IHRydWU7CiAgICAgIHBoTGJVcGRhdGVMaXZlQmFkZ2UoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KS5jYXRjaChmdW5jdGlvbigpewogICAgICBwaExiLnJlYWR5ID0gZmFsc2U7CiAgICAgIHBoTGJVcGRhdGVMaXZlQmFkZ2UoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwaExiQ3VycmVudFNuYXBzaG90KCl7CiAgICB2YXIgZCA9IGxvYWREQigpLCBzID0gY29sbGVjdGlvblN0YXRzKCk7CiAgICB2YXIgYmVzdFRpZXIgPSAwLCBiZXN0VmFsdWUgPSAwOwogICAgT2JqZWN0LmtleXMoZC5jYXJkcyB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbihrKXsKICAgICAgdmFyIGUgPSBkLmNhcmRzW2tdOwogICAgICBiZXN0VGllciA9IE1hdGgubWF4KGJlc3RUaWVyLCBOdW1iZXIoZS50aWVyKSB8fCAwKTsKICAgICAgaWYgKHR5cGVvZiBlLnByaWNlID09PSAnbnVtYmVyJykgYmVzdFZhbHVlID0gTWF0aC5tYXgoYmVzdFZhbHVlLCBlLnByaWNlKTsKICAgIH0pOwogICAgcmV0dXJuIHsKICAgICAgbmFtZTogcGhMb2FkVHJhaW5lck5hbWUoKSB8fCAnVHJhaW5lcicsCiAgICAgIHBhY2tzOiBOdW1iZXIocy5wYWNrcykgfHwgMCwKICAgICAgY2FyZHM6IE51bWJlcihzLmNhcmRzKSB8fCAwLAogICAgICB1bmlxdWU6IE51bWJlcihzLnVuaXF1ZSkgfHwgMCwKICAgICAgYmVzdFRpZXI6IGJlc3RUaWVyLAogICAgICBiZXN0VmFsdWU6IE51bWJlcihiZXN0VmFsdWUudG9GaXhlZCgyKSksCiAgICAgIHVwZGF0ZWRBdDogd2luZG93LmZpcmViYXNlICYmIHdpbmRvdy5maXJlYmFzZS5kYXRhYmFzZSAmJiB3aW5kb3cuZmlyZWJhc2UuZGF0YWJhc2UuU2VydmVyVmFsdWUKICAgICAgICA/IHdpbmRvdy5maXJlYmFzZS5kYXRhYmFzZS5TZXJ2ZXJWYWx1ZS5USU1FU1RBTVAgOiBEYXRlLm5vdygpCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcGhMYlN5bmNTdGF0cygpewogICAgLy8gU3VwYWJhc2UgaXMgdGhlIGFjdGl2ZSBiYWNrZW5kOyBuZXZlciB3cml0ZSBkdXBsaWNhdGUvZW1wdHkgRmlyZWJhc2UgcmVjb3Jkcy4KICAgIGlmICh3aW5kb3cuX19wb2tlaHViU3VwYWJhc2VMZWFkZXJib2FyZEFjdGl2ZSkgcmV0dXJuOwogICAgaWYgKCFwaExiSXNDb25maWd1cmVkKCkgfHwgIXBoTGIucGxheWVyc1JlZikgcmV0dXJuOwogICAgdmFyIG5hbWUgPSBwaExvYWRUcmFpbmVyTmFtZSgpOwogICAgaWYgKCFuYW1lKSByZXR1cm47CiAgICB2YXIgdWlkID0gcGhHZXRMYlVpZCgpOwogICAgdmFyIGRhdGEgPSBwaExiQ3VycmVudFNuYXBzaG90KCk7CiAgICBkYXRhLnVpZCA9IHVpZDsKICAgIHBoTGIucGxheWVyc1JlZi5jaGlsZCh1aWQpLnNldChkYXRhKS5jYXRjaChmdW5jdGlvbigpe30pOwogIH0KCiAgZnVuY3Rpb24gcGhMYlN0YXJ0TGlzdGVuZXIoKXsKICAgIGlmICghcGhMYi5wbGF5ZXJzUmVmIHx8IHBoTGIudW5zdWIpIHJldHVybjsKICAgIHBoTGIudW5zdWIgPSBmdW5jdGlvbigpe307CiAgICBwaExiLnBsYXllcnNSZWYub24oJ3ZhbHVlJywgZnVuY3Rpb24oc25hcHNob3QpewogICAgICBwaExiLl9zbmFwc2hvdCA9IHNuYXBzaG90OwogICAgICBpZiAoZWxzLmxiTW9kYWwgJiYgIWVscy5sYk1vZGFsLmhpZGRlbikgcGhSZW5kZXJMZWFkZXJib2FyZCgpOwogICAgfSwgZnVuY3Rpb24oKXsKICAgICAgcGhMYi5fc25hcHNob3QgPSBudWxsOwogICAgICBpZiAoZWxzLmxiTW9kYWwgJiYgIWVscy5sYk1vZGFsLmhpZGRlbikgcGhSZW5kZXJMZWFkZXJib2FyZCgpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwaExiQm9vdCgpewogICAgLy8gVGhlIGxlZ2FjeSBGaXJlYmFzZSBjb25maWcgaXMgaW50ZW50aW9uYWxseSBibGFuazsgU3VwYWJhc2Ugb3ducyB0aGUgQlhILgogICAgaWYgKHdpbmRvdy5fX3Bva2VodWJTdXBhYmFzZUxlYWRlcmJvYXJkQWN0aXZlKSByZXR1cm47CiAgICBpZiAoIXBoTGJJc0NvbmZpZ3VyZWQoKSl7CiAgICAgIHBoTGJVcGRhdGVMaXZlQmFkZ2UoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgcGhMYkluaXQoKS50aGVuKGZ1bmN0aW9uKG9rKXsKICAgICAgaWYgKCFvaykgcmV0dXJuOwogICAgICBwaExiU3RhcnRMaXN0ZW5lcigpOwogICAgICBpZiAocGhMb2FkVHJhaW5lck5hbWUoKSkgcGhMYlN5bmNTdGF0cygpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBwaExlYWRlcmJvYXJkUm93cygpewogICAgdmFyIG91dCA9IFtdLCBzbmFwID0gcGhMYi5fc25hcHNob3Q7CiAgICBpZiAoc25hcCAmJiBzbmFwLmZvckVhY2gpewogICAgICBzbmFwLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpewogICAgICAgIHZhciB2ID0gY2hpbGQudmFsKCkgfHwge307CiAgICAgICAgaWYgKCF2Lm5hbWUpIHJldHVybjsKICAgICAgICBvdXQucHVzaCh7CiAgICAgICAgICB1aWQ6IGNoaWxkLmtleSwKICAgICAgICAgIG5hbWU6IFN0cmluZyh2Lm5hbWUpLnNsaWNlKDAsMTgpLAogICAgICAgICAgcGFja3M6IE51bWJlcih2LnBhY2tzKXx8MCwKICAgICAgICAgIGNhcmRzOiBOdW1iZXIodi5jYXJkcyl8fDAsCiAgICAgICAgICB1bmlxdWU6IE51bWJlcih2LnVuaXF1ZSl8fDAsCiAgICAgICAgICBiZXN0VGllcjogTnVtYmVyKHYuYmVzdFRpZXIpfHwwLAogICAgICAgICAgYmVzdFZhbHVlOiBOdW1iZXIodi5iZXN0VmFsdWUpfHwwLAogICAgICAgICAgdXBkYXRlZEF0OiBOdW1iZXIodi51cGRhdGVkQXQpfHwwCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgb3V0LnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgaWYgKGIucGFja3MgIT09IGEucGFja3MpIHJldHVybiBiLnBhY2tzIC0gYS5wYWNrczsKICAgICAgaWYgKGIuYmVzdFRpZXIgIT09IGEuYmVzdFRpZXIpIHJldHVybiBiLmJlc3RUaWVyIC0gYS5iZXN0VGllcjsKICAgICAgaWYgKGIuYmVzdFZhbHVlICE9PSBhLmJlc3RWYWx1ZSkgcmV0dXJuIGIuYmVzdFZhbHVlIC0gYS5iZXN0VmFsdWU7CiAgICAgIGlmIChiLnVuaXF1ZSAhPT0gYS51bmlxdWUpIHJldHVybiBiLnVuaXF1ZSAtIGEudW5pcXVlOwogICAgICByZXR1cm4gYi51cGRhdGVkQXQgLSBhLnVwZGF0ZWRBdDsKICAgIH0pOwogICAgcmV0dXJuIG91dDsKICB9CgogIGZ1bmN0aW9uIHBoUmVuZGVyTGVhZGVyYm9hcmQoKXsKICAgIC8vIFN1cGFiYXNlIG93bnMgdGhlIHJlZGVzaWduZWQgbGVhZGVyYm9hcmQgVUkgaW4gdGhpcyBidWlsZC4KICAgIGlmICh3aW5kb3cuX19wb2tlaHViU3VwYWJhc2VMZWFkZXJib2FyZEFjdGl2ZSkgcmV0dXJuOwogICAgaWYgKCFlbHMubGJCb2R5KSByZXR1cm47CiAgICBlbHMubGJCb2R5LnRleHRDb250ZW50ID0gJyc7CiAgICB2YXIgbm90ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgbm90ZS5jbGFzc05hbWUgPSAncGgtbGItbm90ZSc7CiAgICBub3RlLnRleHRDb250ZW50ID0gcGhMYklzQ29uZmlndXJlZCgpCiAgICAgID8gJ/Cfj4YgWOG6v3AgaOG6oW5nIHRoZW8gdOG7lW5nIHPhu5EgZ8OzaSDEkcOjIG3hu58gwrcgJyArIHBoTGJTdGF0dXNUZXh0KCkKICAgICAgOiAn8J+PhiBCWEggxJHDoyBz4bq1biBnaWFvIGRp4buHbiBuaMawbmcgY2jGsGEga+G6v3QgbuG7kWkgcmVhbHRpbWUuIETDoW4gRmlyZWJhc2UgY29uZmlnIHbDoG8gY29kZSDEkeG7gyBi4bqtdCBuaGnhu4F1IG5nxrDhu51pLic7CiAgICBlbHMubGJCb2R5LmFwcGVuZENoaWxkKG5vdGUpOwoKICAgIHZhciBjdXJyZW50TmFtZSA9IHBoTG9hZFRyYWluZXJOYW1lKCkgfHwgJ1RyYWluZXInOwogICAgdmFyIHJvd3MgPSBwaExlYWRlcmJvYXJkUm93cygpOwogICAgdmFyIG15VWlkID0gcGhHZXRMYlVpZCgpLCBteSA9IG51bGwsIG15UmFuayA9ICfigJQnOwogICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHIsaSl7IGlmIChyLnVpZCA9PT0gbXlVaWQpeyBteT1yOyBteVJhbms9U3RyaW5nKGkrMSk7IH0gfSk7CgogICAgdmFyIGhlcm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaGVyby5jbGFzc05hbWU9J3BoLWxiLWhlcm8nOwogICAgaGVyby5hcHBlbmRDaGlsZChzdGF0Qm94KCdI4bqhbmcgaGnhu4duIHThuqFpJywgbXlSYW5rKSk7CiAgICBoZXJvLmFwcGVuZENoaWxkKHN0YXRCb3goJ0fDs2kgxJHDoyBt4bufJywgbXkgPyBTdHJpbmcobXkucGFja3MpIDogU3RyaW5nKGNvbGxlY3Rpb25TdGF0cygpLnBhY2tzKSkpOwogICAgaGVyby5hcHBlbmRDaGlsZChzdGF0Qm94KCdUcmFpbmVyJywgY3VycmVudE5hbWUpKTsKICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQoaGVybyk7CgogICAgdmFyIGFjdGlvbnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGFjdGlvbnMuY2xhc3NOYW1lPSdwaC1sYi1hY3Rpb25zJzsKICAgIHZhciByZW5hbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IHJlbmFtZS50eXBlPSdidXR0b24nOyByZW5hbWUuY2xhc3NOYW1lPSdwaC1idG4gcGgtc21hbGwnOyByZW5hbWUudGV4dENvbnRlbnQ9J+Kcj++4jyDEkOG7lWkgdMOqbic7CiAgICByZW5hbWUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7IHBoTGJDbG9zZSgpOyBwaFNob3dXZWxjb21lKHRydWUpOyB9KTsKICAgIGFjdGlvbnMuYXBwZW5kQ2hpbGQocmVuYW1lKTsgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChhY3Rpb25zKTsKCiAgICBpZiAoIXJvd3MubGVuZ3RoKXsKICAgICAgdmFyIGVtcHR5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBlbXB0eS5jbGFzc05hbWU9J3BoLWNvbC1ub3RlJzsKICAgICAgZW1wdHkudGV4dENvbnRlbnQ9cGhMYklzQ29uZmlndXJlZCgpID8gJ0NoxrBhIGPDsyB0cmFpbmVyIG7DoG8gdHLDqm4gQlhILiBN4bufIHBhY2sgxJHhuqd1IHRpw6puIMSR4buDIGzDqm4gYuG6o25nIScgOiAnQ2jGsGEgY8OzIGThu68gbGnhu4d1IHJlYWx0aW1lIMSR4buDIGhp4buDbiB0aOG7iy4nOwogICAgICBlbHMubGJCb2R5LmFwcGVuZENoaWxkKGVtcHR5KTsgcmV0dXJuOwogICAgfQoKICAgIHZhciB0YWJsZVdyYXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHRhYmxlV3JhcC5jbGFzc05hbWU9J3BoLWxiLXRhYmxlLXdyYXAnOwogICAgdmFyIHRhYmxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7IHRhYmxlLmNsYXNzTmFtZT0ncGgtbGItdGFibGUnOwogICAgdmFyIHRoZWFkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoZWFkJyksIHRyaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogICAgWycjJywnVHJhaW5lcicsJ0fDs2knLCdMw6EnLCdCZXN0J10uZm9yRWFjaChmdW5jdGlvbih0KXsgdmFyIHRoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7IHRoLnRleHRDb250ZW50PXQ7IHRyaC5hcHBlbmRDaGlsZCh0aCk7IH0pOwogICAgdGhlYWQuYXBwZW5kQ2hpbGQodHJoKTsgdGFibGUuYXBwZW5kQ2hpbGQodGhlYWQpOwogICAgdmFyIHRib2R5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7CiAgICByb3dzLnNsaWNlKDAsMjApLmZvckVhY2goZnVuY3Rpb24ocixpKXsKICAgICAgdmFyIHRyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7IGlmIChyLnVpZD09PW15VWlkKSB0ci5jbGFzc05hbWU9J3BoLWxiLW1lJzsKICAgICAgdmFyIHRkUmFuaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOyB0ZFJhbmsudGV4dENvbnRlbnQ9U3RyaW5nKGkrMSk7CiAgICAgIHZhciB0ZE5hbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsgdGROYW1lLnRleHRDb250ZW50PXIubmFtZSsoci51aWQ9PT1teVVpZD8nIMK3IELhuqFuJzonJyk7CiAgICAgIHZhciB0ZFA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsgdGRQLnRleHRDb250ZW50PVN0cmluZyhyLnBhY2tzKTsKICAgICAgdmFyIHRkQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOyB0ZEMudGV4dENvbnRlbnQ9U3RyaW5nKHIuY2FyZHMpOwogICAgICB2YXIgdGRCZXN0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7IHRkQmVzdC50ZXh0Q29udGVudD10aWVyTGFiZWxUZXh0KHIuYmVzdFRpZXIpKyhyLmJlc3RWYWx1ZT4wPycgwrcgJyttb25leShyLmJlc3RWYWx1ZSk6JycpOwogICAgICB0ci5hcHBlbmRDaGlsZCh0ZFJhbmspOyB0ci5hcHBlbmRDaGlsZCh0ZE5hbWUpOyB0ci5hcHBlbmRDaGlsZCh0ZFApOyB0ci5hcHBlbmRDaGlsZCh0ZEMpOyB0ci5hcHBlbmRDaGlsZCh0ZEJlc3QpOwogICAgICB0Ym9keS5hcHBlbmRDaGlsZCh0cik7CiAgICB9KTsKICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTsgdGFibGVXcmFwLmFwcGVuZENoaWxkKHRhYmxlKTsgZWxzLmxiQm9keS5hcHBlbmRDaGlsZCh0YWJsZVdyYXApOwoKICAgIHZhciBmb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBmb290LmNsYXNzTmFtZT0ncGgtY29sLW5vdGUnOwogICAgZm9vdC50ZXh0Q29udGVudD1yb3dzLmxlbmd0aD4yMCA/ICfEkGFuZyBoaeG7h24gdG9wIDIwIMK3IEPDsyAnK3Jvd3MubGVuZ3RoKycgdHJhaW5lciB0csOqbiBCWEguJyA6ICdD4bqtcCBuaOG6rXQgdOG7sSDEkeG7mW5nIGtoaSBjw7MgbmfGsOG7nWkgbeG7nyBwYWNrLic7CiAgICBlbHMubGJCb2R5LmFwcGVuZENoaWxkKGZvb3QpOwogIH0KCiAgZnVuY3Rpb24gcGhMYk9wZW4oKXsKICAgIC8vIFN1cGFiYXNlIGFkZC1vbiBub3JtYWxseSBpbnRlcmNlcHRzIHRoaXMgYnV0dG9uIGluIGNhcHR1cmUgcGhhc2UuIElmIHRoYXQKICAgIC8vIHNjcmlwdCBmYWlsZWQgdG8gaW5pdGlhbGl6ZSwga2VlcCB0aGUgYnV0dG9uIHVzYWJsZSBhbmQgc2hvdyBhIHJlYWwgZGlhZ25vc2lzLgogICAgaWYgKHdpbmRvdy5fX3Bva2VodWJTdXBhYmFzZUxlYWRlcmJvYXJkQWN0aXZlKSB7CiAgICAgIGlmICh3aW5kb3cuX19wb2tlaHViU3VwYWJhc2VBZGRvblJlYWR5KSByZXR1cm47CiAgICAgIGlmICghcGhMb2FkVHJhaW5lck5hbWUoKSl7IHBoU2hvd1dlbGNvbWUoZmFsc2UpOyByZXR1cm47IH0KICAgICAgaWYgKGVscy5sYkJvZHkpIHsKICAgICAgICBlbHMubGJCb2R5LnRleHRDb250ZW50ID0gJ0LhuqNuZyB44bq/cCBo4bqhbmcgU3VwYWJhc2UgY2jGsGEga2jhu59pIHThuqFvIMSRxrDhu6NjLiBUcuG6oW5nIHRow6FpOiAnICsKICAgICAgICAgIFN0cmluZygoZWxzLmxiTGl2ZSAmJiAoZWxzLmxiTGl2ZS50aXRsZSB8fCBlbHMubGJMaXZlLnRleHRDb250ZW50KSkgfHwgJ2NoxrBhIHLDtScpICsKICAgICAgICAgICcuIEjDo3kgdOG6o2kgbOG6oWkgdHJhbmcgc2F1IGtoaSB4w7NhIGNhY2hlOyBu4bq/dSB24bqrbiBs4buXaSwga2nhu4NtIHRyYSBDb25zb2xlIGPhu6dhIHRyw6xuaCBkdXnhu4d0Lic7CiAgICAgIH0KICAgICAgaWYgKGVscy5sYk1vZGFsKSBlbHMubGJNb2RhbC5oaWRkZW4gPSBmYWxzZTsKICAgICAgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghcGhMb2FkVHJhaW5lck5hbWUoKSl7IHBoU2hvd1dlbGNvbWUoZmFsc2UpOyByZXR1cm47IH0KICAgIHBoUmVuZGVyTGVhZGVyYm9hcmQoKTsKICAgIGVscy5sYk1vZGFsLmhpZGRlbj1mYWxzZTsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKHRydWUpOwogICAgcGhMYkJvb3QoKTsKICB9CgogIGZ1bmN0aW9uIHBoTGJDbG9zZSgpewogICAgaWYgKCFlbHMubGJNb2RhbCkgcmV0dXJuOwogICAgZWxzLmxiTW9kYWwuaGlkZGVuPXRydWU7IGVscy5sYkJvZHkudGV4dENvbnRlbnQ9Jyc7IHNldE1vZGFsVmlld3BvcnRPcGVuKGZhbHNlKTsKICB9CgogIGZ1bmN0aW9uIHBoU2hvd1dlbGNvbWUoZm9yY2VFZGl0KXsKICAgIGlmICghZWxzLndlbGNvbWVNb2RhbCkgcmV0dXJuOwogICAgdmFyIHNhdmVkPXBoTG9hZFRyYWluZXJOYW1lKCk7CiAgICBlbHMud2VsY29tZUlucHV0LnZhbHVlPXNhdmVkfHwnJzsKICAgIGVscy53ZWxjb21lRXJyb3IudGV4dENvbnRlbnQ9Jyc7CiAgICBlbHMud2VsY29tZVN0YXJ0LnRleHRDb250ZW50PShzYXZlZHx8Zm9yY2VFZGl0KT8n8J+SviBMxrB1IHTDqm4nOifwn5qAIELhuq90IMSR4bqndSBjaMahaSc7CiAgICBlbHMud2VsY29tZU1vZGFsLmhpZGRlbj1mYWxzZTsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKHRydWUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpeyBlbHMud2VsY29tZUlucHV0LmZvY3VzKCk7IGVscy53ZWxjb21lSW5wdXQuc2VsZWN0KCk7IH0sNDApOwogIH0KCiAgZnVuY3Rpb24gcGhTdWJtaXRXZWxjb21lKCl7CiAgICB2YXIgbmFtZT1waFNhZmVUcmFpbmVyTmFtZShlbHMud2VsY29tZUlucHV0LnZhbHVlKTsKICAgIGlmICghbmFtZSB8fCBuYW1lLmxlbmd0aDwyKXsgZWxzLndlbGNvbWVFcnJvci50ZXh0Q29udGVudD0nTmlja25hbWUgdOG7kWkgdGhp4buDdSAyIGvDvSB04buxLic7IGVscy53ZWxjb21lSW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CiAgICBpZiAoIXBoU2F2ZVRyYWluZXJOYW1lKG5hbWUpKXsgZWxzLndlbGNvbWVFcnJvci50ZXh0Q29udGVudD0nS2jDtG5nIHRo4buDIGzGsHUgbmlja25hbWUgdHLDqm4gdHLDrG5oIGR1eeG7h3QgbsOgeS4nOyByZXR1cm47IH0KICAgIHBoTGJCb290KCk7CiAgICBlbHMud2VsY29tZU1vZGFsLmhpZGRlbj10cnVlOyBlbHMud2VsY29tZUVycm9yLnRleHRDb250ZW50PScnOyBzZXRNb2RhbFZpZXdwb3J0T3BlbihmYWxzZSk7CiAgICB0b2FzdCgn8J+RiyBDaMOgbyAnK25hbWUrJyEgU+G6tW4gc8OgbmcgbeG7nyBwYWNrIHLhu5NpLicpOwogIH0KCiAgZnVuY3Rpb24gcGhTZXR1cFRyYWluZXJBbmRMZWFkZXJib2FyZCgpewogICAgaWYgKGVscy53ZWxjb21lU3RhcnQpIGVscy53ZWxjb21lU3RhcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHBoU3VibWl0V2VsY29tZSk7CiAgICBpZiAoZWxzLndlbGNvbWVJbnB1dCkgZWxzLndlbGNvbWVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsgaWYoZS5rZXk9PT0nRW50ZXInKXtlLnByZXZlbnREZWZhdWx0KCk7cGhTdWJtaXRXZWxjb21lKCk7fSB9KTsKICAgIGlmIChlbHMubGJCdG4pIGVscy5sYkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycscGhMYk9wZW4pOwogICAgaWYgKGVscy5sYkNsb3NlKSBlbHMubGJDbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycscGhMYkNsb3NlKTsKICAgIGlmIChlbHMubGJCYWNrZHJvcCkgZWxzLmxiQmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHBoTGJDbG9zZSk7CiAgICBpZiAoIXBoTG9hZFRyYWluZXJOYW1lKCkpIHBoU2hvd1dlbGNvbWUoZmFsc2UpOyBlbHNlIHBoTGJCb290KCk7CiAgICBwaExiVXBkYXRlTGl2ZUJhZGdlKCk7CiAgfQoKICAvLyAtLS0tLS0tLS0tIHNvdW5kIGVuZ2luZSAtLS0tLS0tLS0tCiAgdmFyIGF1ZGlvQ3R4ID0gbnVsbDsKICBmdW5jdGlvbiBlbnN1cmVBdWRpbygpewogICAgaWYgKHN0YXRlLm11dGVkKSByZXR1cm4gbnVsbDsKICAgIGlmICghYXVkaW9DdHgpewogICAgICB2YXIgQ3R4ID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OwogICAgICBpZiAoIUN0eCkgcmV0dXJuIG51bGw7CiAgICAgIGF1ZGlvQ3R4ID0gbmV3IEN0eCgpOwogICAgfQogICAgaWYgKGF1ZGlvQ3R4LnN0YXRlID09PSAnc3VzcGVuZGVkJykgYXVkaW9DdHgucmVzdW1lKCk7CiAgICByZXR1cm4gYXVkaW9DdHg7CiAgfQoKICBmdW5jdGlvbiB0b25lKGN0eCwgd2hlbiwgZnJlcSwgZHVyLCBvcHRzKXsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIG9zYyA9IGN0eC5jcmVhdGVPc2NpbGxhdG9yKCk7CiAgICB2YXIgZ2FpbiA9IGN0eC5jcmVhdGVHYWluKCk7CiAgICBvc2MudHlwZSA9IG9wdHMudHlwZSB8fCAnc2luZSc7CiAgICBvc2MuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKGZyZXEsIHdoZW4pOwogICAgaWYgKG9wdHMuc2xpZGVUbykgb3NjLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKG9wdHMuc2xpZGVUbywgd2hlbiArIGR1cik7CiAgICB2YXIgcGVhayA9IG9wdHMuZ2FpbiAhPSBudWxsID8gb3B0cy5nYWluIDogMC4xNjsKICAgIGdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjAwMDEsIHdoZW4pOwogICAgZ2Fpbi5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUocGVhaywgd2hlbiArIE1hdGgubWluKDAuMDIsIGR1ciowLjMpKTsKICAgIGdhaW4uZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKDAuMDAwMSwgd2hlbiArIGR1cik7CiAgICBvc2MuY29ubmVjdChnYWluKS5jb25uZWN0KGN0eC5kZXN0aW5hdGlvbik7CiAgICBvc2Muc3RhcnQod2hlbik7CiAgICBvc2Muc3RvcCh3aGVuICsgZHVyICsgMC4wMik7CiAgfQoKICBmdW5jdGlvbiBwbGF5UmlwKCl7CiAgICB2YXIgY3R4ID0gZW5zdXJlQXVkaW8oKTsKICAgIGlmICghY3R4KSByZXR1cm47CiAgICB2YXIgZHVyID0gMC41OwogICAgdmFyIGJ1ZmZlclNpemUgPSBNYXRoLmZsb29yKGN0eC5zYW1wbGVSYXRlICogZHVyKTsKICAgIHZhciBidWZmZXIgPSBjdHguY3JlYXRlQnVmZmVyKDEsIGJ1ZmZlclNpemUsIGN0eC5zYW1wbGVSYXRlKTsKICAgIHZhciBkYXRhID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJTaXplOyBpKyspIGRhdGFbaV0gPSAoTWF0aC5yYW5kb20oKSoyIC0gMSkgKiAoMSAtIGkvYnVmZmVyU2l6ZSk7CiAgICB2YXIgbm9pc2UgPSBjdHguY3JlYXRlQnVmZmVyU291cmNlKCk7CiAgICBub2lzZS5idWZmZXIgPSBidWZmZXI7CiAgICB2YXIgZmlsdGVyID0gY3R4LmNyZWF0ZUJpcXVhZEZpbHRlcigpOwogICAgZmlsdGVyLnR5cGUgPSAnYmFuZHBhc3MnOwogICAgZmlsdGVyLlEudmFsdWUgPSAwLjc7CiAgICB2YXIgbm93ID0gY3R4LmN1cnJlbnRUaW1lOwogICAgZmlsdGVyLmZyZXF1ZW5jeS5zZXRWYWx1ZUF0VGltZSg3MDAsIG5vdyk7CiAgICBmaWx0ZXIuZnJlcXVlbmN5LmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoNDIwMCwgbm93ICsgZHVyKTsKICAgIHZhciBnYWluID0gY3R4LmNyZWF0ZUdhaW4oKTsKICAgIGdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLjM1LCBub3cpOwogICAgZ2Fpbi5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoMC4wMDEsIG5vdyArIGR1cik7CiAgICBub2lzZS5jb25uZWN0KGZpbHRlcikuY29ubmVjdChnYWluKS5jb25uZWN0KGN0eC5kZXN0aW5hdGlvbik7CiAgICBub2lzZS5zdGFydChub3cpOwogICAgbm9pc2Uuc3RvcChub3cgKyBkdXIpOwogICAgdG9uZShjdHgsIG5vdyArIGR1ciowLjg1LCAyMjAsIDAuMTIsIHt0eXBlOid0cmlhbmdsZScsIGdhaW46MC4xOCwgc2xpZGVUbzo5MH0pOwogIH0KCiAgdmFyIFNDQUxFID0gWzUyMy4yNSwgNTg3LjMzLCA2NTkuMjUsIDc4My45OSwgODgwLjAwLCAxMDQ2LjUwXTsKICBmdW5jdGlvbiBwbGF5RmxpcCh0aWVyKXsKICAgIHZhciBjdHggPSBlbnN1cmVBdWRpbygpOwogICAgaWYgKCFjdHgpIHJldHVybjsKICAgIHZhciBub3cgPSBjdHguY3VycmVudFRpbWU7CiAgICBpZiAodGllciA8PSAxKXsKICAgICAgdG9uZShjdHgsIG5vdywgNDQwLCAwLjEyLCB7dHlwZTonc2luZScsIGdhaW46MC4xMn0pOwogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgbm90ZXMgPSBNYXRoLm1pbigyICsgdGllciwgU0NBTEUubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm90ZXM7IGkrKyl7CiAgICAgIHRvbmUoY3R4LCBub3cgKyBpKjAuMDQ1LCBTQ0FMRVtpICUgU0NBTEUubGVuZ3RoXSAqICgxICsgdGllciowLjAyKSwgMC4yMiwgewogICAgICAgIHR5cGU6IHRpZXIgPj0gNSA/ICd0cmlhbmdsZScgOiAnc2luZScsCiAgICAgICAgZ2FpbjogMC4xMCArIHRpZXIqMC4wMgogICAgICB9KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBsYXlGYW5mYXJlKCl7CiAgICB2YXIgY3R4ID0gZW5zdXJlQXVkaW8oKTsKICAgIGlmICghY3R4KSByZXR1cm47CiAgICB2YXIgbm93ID0gY3R4LmN1cnJlbnRUaW1lOwogICAgdmFyIGNob3JkID0gWzUyMy4yNSwgNjU5LjI1LCA3ODMuOTksIDEwNDYuNTBdOwogICAgY2hvcmQuZm9yRWFjaChmdW5jdGlvbihmLCBpKXsKICAgICAgdG9uZShjdHgsIG5vdyArIGkqMC4wMiwgZiwgMC45LCB7dHlwZTonc2F3dG9vdGgnLCBnYWluOjAuMDd9KTsKICAgICAgdG9uZShjdHgsIG5vdyArIGkqMC4wMiwgZi8yLCAwLjksIHt0eXBlOidzaW5lJywgZ2FpbjowLjEwfSk7CiAgICB9KTsKICAgIFsxMTc0LjY2LCAxMzE4LjUxLCAxNTY3Ljk4XS5mb3JFYWNoKGZ1bmN0aW9uKGYsIGkpewogICAgICB0b25lKGN0eCwgbm93ICsgMC4zNSArIGkqMC4xMiwgZiwgMC4zNSwge3R5cGU6J3RyaWFuZ2xlJywgZ2FpbjowLjEyfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZU11dGVCdG4oKXsKICAgIGVscy5tdXRlLnRleHRDb250ZW50ID0gc3RhdGUubXV0ZWQgPyAnXHVEODNEXHVERDA3JyA6ICdcdUQ4M0RcdUREMEEnOwogICAgZWxzLm11dGUuY2xhc3NMaXN0LnRvZ2dsZSgncGgtbXV0ZWQnLCBzdGF0ZS5tdXRlZCk7CiAgfQogIGVscy5tdXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgIHN0YXRlLm11dGVkID0gIXN0YXRlLm11dGVkOwogICAgdXBkYXRlTXV0ZUJ0bigpOwogIH0pOwogIHVwZGF0ZU11dGVCdG4oKTsKCiAgLy8gLS0tLS0tLS0tLSBkYXRhIGxvYWRpbmcgLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGdldEpTT04odXJsLCB0aW1lb3V0TXMpewogICAgdmFyIGN0cmwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICB2YXIgdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgY3RybC5hYm9ydCgpOyB9LCB0aW1lb3V0TXMgfHwgOTAwMCk7CiAgICByZXR1cm4gZmV0Y2godXJsLCB7c2lnbmFsOmN0cmwuc2lnbmFsfSkKICAgICAgLnRoZW4oZnVuY3Rpb24ocil7CiAgICAgICAgaWYgKCFyLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0hUVFAgJyArIHIuc3RhdHVzKTsKICAgICAgICByZXR1cm4gci5qc29uKCk7CiAgICAgIH0pCiAgICAgIC5maW5hbGx5KGZ1bmN0aW9uKCl7IGNsZWFyVGltZW91dCh0KTsgfSk7CiAgfQoKICBmdW5jdGlvbiBzZXRBY2NlbnQoYzEsYzIpewogICAgcm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1waC1jMScsIGMxKTsKICAgIHJvb3Quc3R5bGUuc2V0UHJvcGVydHkoJy0tcGgtYzInLCBjMik7CiAgfQoKICBmdW5jdGlvbiByYXJpdHlUaWVyKHN0cil7CiAgICB2YXIgciA9IChzdHIgfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoci5pbmRleE9mKCdjcm93bicpID4gLTEpICAgICAgICAgcmV0dXJuIHt0aWVyOjYsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdzcGVjaWFsIGFydCcpID4gLTEpICAgcmV0dXJuIHt0aWVyOjYsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdoeXBlcicpID4gLTEpICAgICAgICAgcmV0dXJuIHt0aWVyOjYsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdyYWluYm93JykgPiAtMSkgICAgICAgcmV0dXJuIHt0aWVyOjYsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdzZWNyZXQnKSA+IC0xKSAgICAgICAgcmV0dXJuIHt0aWVyOjYsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdnb2xkJykgPiAtMSkgICAgICAgICAgcmV0dXJuIHt0aWVyOjYsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdkb3VibGUgc2hpbnknKSA+IC0xKSAgcmV0dXJuIHt0aWVyOjUsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCd0aHJlZSBzdGFyJykgPiAtMSkgICAgcmV0dXJuIHt0aWVyOjUsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdpbGx1c3RyYXRpb24nKSA+IC0xKSAgcmV0dXJuIHt0aWVyOjUsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdzaGlueScpID4gLTEpICAgICAgICAgcmV0dXJuIHt0aWVyOjQsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdzdGFyJykgPiAtMSkgICAgICAgICAgcmV0dXJuIHt0aWVyOjQsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdmdWxsIGFydCcpID4gLTEpICAgICAgcmV0dXJuIHt0aWVyOjQsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdleCcpID4gLTEgJiYgci5pbmRleE9mKCdyYXJlJykgPiAtMSkgcmV0dXJuIHt0aWVyOjQsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdmb3VyIGRpYW1vbmQnKSA+IC0xKSAgcmV0dXJuIHt0aWVyOjMsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdkb3VibGUgcmFyZScpID4gLTEpICAgcmV0dXJuIHt0aWVyOjMsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCd1bHRyYScpID4gLTEpICAgICAgICAgcmV0dXJuIHt0aWVyOjMsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCd0aHJlZSBkaWFtb25kJykgPiAtMSkgcmV0dXJuIHt0aWVyOjIsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdob2xvJykgPiAtMSkgICAgICAgICAgcmV0dXJuIHt0aWVyOjIsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCd0d28gZGlhbW9uZCcpID4gLTEpICAgcmV0dXJuIHt0aWVyOjEsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdhbWF6aW5nJykgPiAtMSkgICAgICAgcmV0dXJuIHt0aWVyOjMsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdwcm9tbycpID4gLTEpICAgICAgICAgcmV0dXJuIHt0aWVyOjIsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdyYXJlJykgPiAtMSkgICAgICAgICAgcmV0dXJuIHt0aWVyOjIsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCdvbmUgZGlhbW9uZCcpID4gLTEpICAgcmV0dXJuIHt0aWVyOjAsIGxhYmVsOnN0cn07CiAgICBpZiAoci5pbmRleE9mKCd1bmNvbW1vbicpID4gLTEpICAgICAgcmV0dXJuIHt0aWVyOjEsIGxhYmVsOnN0cn07CiAgICByZXR1cm4ge3RpZXI6MCwgbGFiZWw6IHN0ciB8fCAnQ29tbW9uJ307CiAgfQoKICAvLyBU4bqjaSBt4buZdCBs4bqnbiBkYW5oIHPDoWNoIE3hu4xJIGNodeG7l2kgxJHhu5kgaGnhur9tIG3DoCBUQ0dkZXggdOG7q25nIGTDuW5nIChlbmRwb2ludAogIC8vIC9yYXJpdGllcyksIHLhu5NpIHjhur9wIHThu6tuZyBjaHXhu5dpIHbDoG8gdOG6p25nIDAtNiBi4bqxbmcgY2jDrW5oIHJhcml0eVRpZXIoKS4KICAvLyBOaOG7nSB24bqteSBwaOG6p24gbOG7jWMgdGhlbyBi4buZIOG7nyBkxrDhu5tpIGtow7RuZyBj4bqnbiBsaeG7h3Qga8OqIHRheSB04burbmcgY2h14buXaSBjaG8KICAvLyB04burbmcgdGjhu51pIGvhu7MgKEJhc2UsIFhZLCBTd29yZCAmIFNoaWVsZCwgUG9ja2V0IFRDR+KApikuCiAgZnVuY3Rpb24gbG9hZFJhcml0eVRheG9ub215KCl7CiAgICBpZiAocmFyaXR5VGF4b25vbXlQcm9taXNlKSByZXR1cm4gcmFyaXR5VGF4b25vbXlQcm9taXNlOwogICAgcmFyaXR5VGF4b25vbXlQcm9taXNlID0gZ2V0SlNPTihBUEkgKyAnL3Jhcml0aWVzJywgMTAwMDApLnRoZW4oZnVuY3Rpb24oZGF0YSl7CiAgICAgIHZhciBsaXN0ID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEKICAgICAgICA6IChkYXRhICYmIEFycmF5LmlzQXJyYXkoZGF0YS5yYXJpdGllcykpID8gZGF0YS5yYXJpdGllcwogICAgICAgIDogKGRhdGEgJiYgQXJyYXkuaXNBcnJheShkYXRhLmRhdGEpKSA/IGRhdGEuZGF0YQogICAgICAgIDogW107CiAgICAgIHZhciBncm91cHMgPSBbW10sW10sW10sW10sW10sW10sW11dOwogICAgICB2YXIgc2VlbiA9IHt9OwogICAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24oc3RyKXsKICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc2VlbltzdHJdKSByZXR1cm47CiAgICAgICAgc2VlbltzdHJdID0gdHJ1ZTsKICAgICAgICBncm91cHNbcmFyaXR5VGllcihzdHIpLnRpZXJdLnB1c2goc3RyKTsKICAgICAgfSk7CiAgICAgIFJBUklUWV9USUVSX0dST1VQUyA9IGdyb3VwczsKICAgICAgcmV0dXJuIGdyb3VwczsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgIFJBUklUWV9USUVSX0dST1VQUyA9IG51bGw7CiAgICAgIHJldHVybiBudWxsOwogICAgfSk7CiAgICByZXR1cm4gcmFyaXR5VGF4b25vbXlQcm9taXNlOwogIH0KCiAgLy8gVuG7m2kgYuG7mSB0aOG6uyDEkWFuZyBjaOG7jW4sIGThu7FuZyAiaOG7mXAiIGNo4bupYSBjw6FjIGzDoSDEkMODIMSRxrDhu6NjIGfhuq9uIHPhurVuIHThuqduZyDEkeG7mQogIC8vIGhp4bq/bSB0aOG6rXQgKDAtNikgYuG6sW5nIGPDoWNoIGzhu41jIC9jYXJkcz9zZXQuaWQ9Li4uJnJhcml0eT1lcTpBfEJ8QyBjaG8KICAvLyB04burbmcgdOG6p25nIOKAlCBt4buXaSB04bqnbmcgY2jhu4kgdOG7kW4gMSByZXF1ZXN0LCBraMO0bmcgY+G6p24gdOG6o2kgdOG7q25nIGzDoSBt4buZdC4KICAvLyBO4bq/dSBBUEkga2jDtG5nIHRy4bqjIHbhu4Ega+G6v3QgcXXhuqMgxJHDoW5nIHRpbiAodsOtIGThu6UgYuG7mSBxdcOhIGPFqS9s4bqhIGtoaeG6v24gbOG7jWMKICAvLyBraMO0bmcga2jhu5twKSwgaMOgbSB04buxIGLhu48gcXVhIHbDoCB0b8OgbiBi4buZIGjhu4cgdGjhu5FuZyBxdWF5IGzhuqFpIGtp4buDdSByw7p0IMSR4buBdQogIC8vIG5oxrAgdHLGsOG7m2Mg4oCUIGtow7RuZyBiYW8gZ2nhu50gbMOgbSBo4buPbmcgdmnhu4djIG3hu58gZ8OzaS4KICBmdW5jdGlvbiBidWlsZFRpZXJQb29scyhzZXRJZCwgdG90YWxJZHMpewogICAgbG9hZFJhcml0eVRheG9ub215KCkudGhlbihmdW5jdGlvbihncm91cHMpewogICAgICBpZiAoIWdyb3VwcykgcmV0dXJuOwogICAgICB2YXIgdGllcnMgPSBbXSwgam9icyA9IFtdOwogICAgICBmb3IgKHZhciB0ID0gMDsgdCA8PSA2OyB0KyspewogICAgICAgIGlmIChncm91cHNbdF0gJiYgZ3JvdXBzW3RdLmxlbmd0aCl7CiAgICAgICAgICB2YXIgdmFsdWUgPSAnZXE6JyArIGdyb3Vwc1t0XS5tYXAoZnVuY3Rpb24ocyl7IHJldHVybiBlbmNvZGVVUklDb21wb25lbnQocyk7IH0pLmpvaW4oJ3wnKTsKICAgICAgICAgIHZhciB1cmwgPSBBUEkgKyAnL2NhcmRzP3NldC5pZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNldElkKSArICcmcmFyaXR5PScgKyB2YWx1ZTsKICAgICAgICAgIHRpZXJzLnB1c2godCk7CiAgICAgICAgICBqb2JzLnB1c2goZ2V0SlNPTih1cmwsIDEwMDAwKS5jYXRjaChmdW5jdGlvbigpeyByZXR1cm4gW107IH0pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFqb2JzLmxlbmd0aCkgcmV0dXJuOwogICAgICBQcm9taXNlLmFsbChqb2JzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpewogICAgICAgIC8vIGLhu5kgxJHDoyBi4buLIMSR4buVaSB0cm9uZyBsw7pjIMSRYW5nIHThuqNpIHRow6wgYuG7jyBr4bq/dCBxdeG6oyBuw6B5LCBraOG7j2kgZ2hpIG5o4bqnbQogICAgICAgIGlmICghc3RhdGUuY3VycmVudCB8fCBzdGF0ZS5jdXJyZW50LmlkICE9PSBzZXRJZCkgcmV0dXJuOwogICAgICAgIHZhciBwb29scyA9IFtbXSxbXSxbXSxbXSxbXSxbXSxbXV07CiAgICAgICAgdmFyIG1hdGNoZWQgPSB7fTsKICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24oYXJyLCBpZHgpewogICAgICAgICAgdmFyIHQgPSB0aWVyc1tpZHhdOwogICAgICAgICAgKGFyciB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihjKXsKICAgICAgICAgICAgaWYgKCFjIHx8ICFjLmlkIHx8IG1hdGNoZWRbYy5pZF0pIHJldHVybjsKICAgICAgICAgICAgbWF0Y2hlZFtjLmlkXSA9IHRydWU7CiAgICAgICAgICAgIHBvb2xzW3RdLnB1c2goeyBpZDpjLmlkLCBuYW1lOmMubmFtZSwgaW1hZ2U6Yy5pbWFnZSB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHZhciBoaWdoZXJUaWVyQ291bnQgPSAwOwogICAgICAgIGZvciAodmFyIHQyID0gMTsgdDIgPD0gNjsgdDIrKykgaGlnaGVyVGllckNvdW50ICs9IHBvb2xzW3QyXS5sZW5ndGg7CiAgICAgICAgaWYgKCFoaWdoZXJUaWVyQ291bnQpewogICAgICAgICAgLy8gS2jDtG5nIGzhu41jIMSRxrDhu6NjIGfDrCDhu58gdOG6p25nID4wIGNobyBi4buZIG7DoHkgLT4ga2jDtG5nIMSR4bunIHRpbiBj4bqteSwKICAgICAgICAgIC8vIGdp4buvIG5ndXnDqm4ga2nhu4N1IHLDunQgxJHhu4F1IGPFqSB0aGF5IHbDrCBkw7luZyBk4buvIGxp4buHdSBu4butYSB24budaS4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgKHRvdGFsSWRzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGlkKXsKICAgICAgICAgIGlmICghbWF0Y2hlZFtpZF0pIHBvb2xzWzBdLnB1c2goeyBpZDppZCB9KTsKICAgICAgICB9KTsKICAgICAgICBzdGF0ZS50aWVyUG9vbHMgPSBwb29sczsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKXt9KTsKICAgIH0pOwogIH0KCiAgLy8gUsO6dCBt4buZdCBJRCB0aOG6uyB0aGVvIHRy4buNbmcgc+G7kSB04bqnbmcgxJHhu5kgaGnhur9tIG7hur91IMSRw6MgY8OzIGThu68gbGnhu4d1OyBu4bq/dQogIC8vIGNoxrBhIGPDsyAoxJFhbmcgdOG6o2ksIGhv4bq3YyBBUEkga2jDtG5nIGjhu5cgdHLhu6MgY2hvIGLhu5kgbsOgeSkgdGjDrCByw7p0IMSR4buBdQogIC8vIHRyb25nIHRvw6BuIGLhu5kgcG9vbCBuaMawIGPDoWNoIGPFqSDigJQgbHXDtG4gY8OzIG3hu5l0IGzhu7FhIGNo4buNbiBo4bujcCBs4buHIMSR4buDIHRy4bqjIHbhu4EuCiAgZnVuY3Rpb24gcGlja0NhcmRJZChib29zdCl7CiAgICB2YXIgdHAgPSBzdGF0ZS50aWVyUG9vbHM7CiAgICBpZiAodHApewogICAgICB2YXIgYXZhaWwgPSBbXSwgdG90YWwgPSAwOwogICAgICBmb3IgKHZhciB0ID0gMDsgdCA8PSA2OyB0KyspewogICAgICAgIGlmICh0cFt0XSAmJiB0cFt0XS5sZW5ndGgpewogICAgICAgICAgdmFyIHdlaWdodCA9IFRJRVJfV0VJR0hUU1t0XTsKICAgICAgICAgIGlmIChib29zdCAmJiBib29zdC5sdWNreSAmJiB0ID49IDMpIHdlaWdodCAqPSAzOwogICAgICAgICAgaWYgKGJvb3N0ICYmIGJvb3N0LnJhcmUgJiYgdCA+PSAzKSB3ZWlnaHQgKj0gMjsKICAgICAgICAgIGF2YWlsLnB1c2goeyB0OnQsIHc6d2VpZ2h0IH0pOwogICAgICAgICAgdG90YWwgKz0gd2VpZ2h0OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYXZhaWwubGVuZ3RoKXsKICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiB0b3RhbCwgYWNjID0gMCwgY2hvc2VuID0gYXZhaWxbYXZhaWwubGVuZ3RoIC0gMV0udDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF2YWlsLmxlbmd0aDsgaSsrKXsKICAgICAgICAgIGFjYyArPSBhdmFpbFtpXS53OwogICAgICAgICAgaWYgKHIgPD0gYWNjKXsgY2hvc2VuID0gYXZhaWxbaV0udDsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgdmFyIGJ1Y2tldCA9IHRwW2Nob3Nlbl07CiAgICAgICAgcmV0dXJuIGJ1Y2tldFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBidWNrZXQubGVuZ3RoKV0uaWQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwaWNrUmFuZG9tKHN0YXRlLnBvb2wpLmlkOwogIH0KCiAgZnVuY3Rpb24gcGlja0d1YXJhbnRlZWRIaWdoSWQoKXsKICAgIHZhciB0cCA9IHN0YXRlLnRpZXJQb29sczsKICAgIGlmICh0cCl7CiAgICAgIHZhciBjaG9pY2VzID0gW107CiAgICAgIGZvciAodmFyIHQgPSA0OyB0IDw9IDY7IHQrKykgaWYgKHRwW3RdICYmIHRwW3RdLmxlbmd0aCkgY2hvaWNlcyA9IGNob2ljZXMuY29uY2F0KHRwW3RdKTsKICAgICAgaWYgKGNob2ljZXMubGVuZ3RoKSByZXR1cm4gcGlja1JhbmRvbShjaG9pY2VzKS5pZDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gcHJpY2VVU0QoY2FyZCwgc2V0T3JEZXRhaWwpewogICAgaWYgKCFjYXJkIHx8IHR5cGVvZiBjYXJkICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7CgogICAgLy8gSU1QT1JUQU5UOiBmb3IgMzB0aCBDZWxlYnJhdGlvbiAoTTZhKSwgdXNlIGl0cyBleHBsaWNpdCBVU0QgbWFya2V0CiAgICAvLyBzbmFwc2hvdCBmaXJzdC4gU29tZSBjYXJkLWxpc3QgcmVzcG9uc2VzIG9taXQgY2FyZC5zZXQsIHNvIGNhbGxlcnMgY2FuCiAgICAvLyBwYXNzIHRoZSBzZWxlY3RlZCBzZXQvZGV0YWlsIHRvIHRoaXMgZnVuY3Rpb24gdG8gaWRlbnRpZnkgTTZhIHJlbGlhYmx5LgogICAgdmFyIHByaWNlQ29udGV4dCA9IHNldE9yRGV0YWlsIHx8IGNhcmQuc2V0IHx8IG51bGw7CiAgICB2YXIgbTZhU25hcHNob3RQcmljZSA9IG02YVVTRFByaWNlKGNhcmQsIHByaWNlQ29udGV4dCk7CiAgICBpZiAobTZhU25hcHNob3RQcmljZSAhPT0gbnVsbCkgcmV0dXJuIG02YVNuYXBzaG90UHJpY2U7CgogICAgdHJ5IHsgY2FyZC5fcGhNYXJrZXRQcmljZVNvdXJjZSA9ICdUQ0dkZXgnOyB9IGNhdGNoKGUpIHt9CgogICAgLyogVENHZGV4IHByaWNpbmcgY2FuIGxpdmUgb24gdGhlIGNhcmQgaXRzZWxmLCB1bmRlciBgcHJpY2VzYCBvbiBzb21lCiAgICAgICByZXNwb25zZXMsIG9yIGluc2lkZSB2YXJpYW50c19kZXRhaWxlZC4gUmVhZCBhbGwgc3VwcG9ydGVkIHNoYXBlcy4gKi8KICAgIHZhciBzb3VyY2VzID0gW107CiAgICBmdW5jdGlvbiBhZGRTb3VyY2UodmFsdWUpewogICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHNvdXJjZXMucHVzaCh2YWx1ZSk7CiAgICB9CiAgICBhZGRTb3VyY2UoY2FyZC5wcmljaW5nKTsKICAgIGFkZFNvdXJjZShjYXJkLnByaWNlcyk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXJkLnZhcmlhbnRzX2RldGFpbGVkKSl7CiAgICAgIGNhcmQudmFyaWFudHNfZGV0YWlsZWQuZm9yRWFjaChmdW5jdGlvbih2YXJpYW50KXsKICAgICAgICBpZiAoIXZhcmlhbnQgfHwgdHlwZW9mIHZhcmlhbnQgIT09ICdvYmplY3QnKSByZXR1cm47CiAgICAgICAgYWRkU291cmNlKHZhcmlhbnQucHJpY2luZyk7CiAgICAgICAgYWRkU291cmNlKHZhcmlhbnQucHJpY2VzKTsKICAgICAgICBpZiAodmFyaWFudC50Y2dwbGF5ZXIgfHwgdmFyaWFudC5jYXJkbWFya2V0IHx8IHZhcmlhbnRbJ2ViYXktZnInXSB8fCB2YXJpYW50LmViYXlGcil7CiAgICAgICAgICBhZGRTb3VyY2UodmFyaWFudCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3NpdGl2ZU51bWJlcih2YWx1ZSl7CiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7CiAgICAgIHZhciBuID0gTnVtYmVyKHZhbHVlKTsKICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSAmJiBuID4gMCA/IG4gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gZmlyc3RQb3NpdGl2ZShvYmplY3QsIGtleXMpewogICAgICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7CiAgICAgICAgdmFyIG4gPSBwb3NpdGl2ZU51bWJlcihvYmplY3Rba2V5c1tpXV0pOwogICAgICAgIGlmIChuICE9PSBudWxsKSByZXR1cm4gbjsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUY2dwbGF5ZXIocHJvdmlkZXIpewogICAgICBpZiAoIXByb3ZpZGVyIHx8IHR5cGVvZiBwcm92aWRlciAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsOwogICAgICB2YXIgYmVzdCA9IGZpcnN0UG9zaXRpdmUocHJvdmlkZXIsIFsnbWFya2V0UHJpY2UnLCdtaWRQcmljZScsJ2xvd1ByaWNlJywnbWFya2V0JywnbWlkJywnbG93J10pOwogICAgICBPYmplY3Qua2V5cyhwcm92aWRlcikuZm9yRWFjaChmdW5jdGlvbihrZXkpewogICAgICAgIHZhciB2YXJpYW50ID0gcHJvdmlkZXJba2V5XTsKICAgICAgICBpZiAoIXZhcmlhbnQgfHwgdHlwZW9mIHZhcmlhbnQgIT09ICdvYmplY3QnKSByZXR1cm47CiAgICAgICAgdmFyIG4gPSBmaXJzdFBvc2l0aXZlKHZhcmlhbnQsIFsnbWFya2V0UHJpY2UnLCdtaWRQcmljZScsJ2xvd1ByaWNlJywnbWFya2V0JywnbWlkJywnbG93J10pOwogICAgICAgIGlmIChuICE9PSBudWxsICYmIChiZXN0ID09PSBudWxsIHx8IG4gPiBiZXN0KSkgYmVzdCA9IG47CiAgICAgIH0pOwogICAgICByZXR1cm4gYmVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRFdXJvUHJvdmlkZXIocHJvdmlkZXIsIGtleXMpewogICAgICBpZiAoIXByb3ZpZGVyIHx8IHR5cGVvZiBwcm92aWRlciAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsOwogICAgICB2YXIgbiA9IGZpcnN0UG9zaXRpdmUocHJvdmlkZXIsIGtleXMpOwogICAgICBpZiAobiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgIHZhciB1bml0ID0gU3RyaW5nKHByb3ZpZGVyLnVuaXQgfHwgJ0VVUicpLnRvVXBwZXJDYXNlKCk7CiAgICAgIHJldHVybiB1bml0ID09PSAnVVNEJyA/IG4gOiBuICogRVVSX1VTRDsKICAgIH0KCiAgICAvKiBQcmVmZXIgZGlyZWN0IFVTRCBUQ0dwbGF5ZXIgbWFya2V0IHByaWNlcyBpZiBwcmVzZW50LiAqLwogICAgdmFyIGJlc3RVU0QgPSBudWxsOwogICAgc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZSl7CiAgICAgIHZhciBuID0gcmVhZFRjZ3BsYXllcihzb3VyY2UudGNncGxheWVyKTsKICAgICAgaWYgKG4gIT09IG51bGwgJiYgKGJlc3RVU0QgPT09IG51bGwgfHwgbiA+IGJlc3RVU0QpKSBiZXN0VVNEID0gbjsKICAgIH0pOwogICAgaWYgKGJlc3RVU0QgIT09IG51bGwpIHJldHVybiBiZXN0VVNEOwoKICAgIC8qIENhcmRtYXJrZXQncyBFVVIgdHJlbmQvYXZlcmFnZXMgYXJlIHRoZSBwcmltYXJ5IFRDR2RleCBmYWxsYmFjay4gKi8KICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKyl7CiAgICAgIHZhciBjbSA9IHNvdXJjZXNbc10uY2FyZG1hcmtldDsKICAgICAgdmFyIGNtUHJpY2UgPSByZWFkRXVyb1Byb3ZpZGVyKGNtLCBbJ3RyZW5kJywnYXZnJywnYXZnNycsJ2F2ZzMwJywnYXZnMScsJ2xvdycsJ2F2Zy1ob2xvJywndHJlbmQtaG9sbycsJ2F2ZzctaG9sbycsJ2F2ZzMwLWhvbG8nLCdsb3ctaG9sbyddKTsKICAgICAgaWYgKGNtUHJpY2UgIT09IG51bGwpIHJldHVybiBjbVByaWNlOwogICAgfQoKICAgIC8qIFRDR2RleCBhbHNvIGRvY3VtZW50cyBlQmF5IEZyYW5jZSBhcyBhIGZhbGxiYWNrIGZvciBjYXJkcyB3aXRoCiAgICAgICBsaW1pdGVkIG1hcmtldHBsYWNlIGNvdmVyYWdlOyBpdCB3YXMgbm90IHJlYWQgYnkgdGhlIHByZXZpb3VzIGNvZGUuICovCiAgICBmb3IgKHZhciBlID0gMDsgZSA8IHNvdXJjZXMubGVuZ3RoOyBlKyspewogICAgICB2YXIgZWJheSA9IHNvdXJjZXNbZV1bJ2ViYXktZnInXSB8fCBzb3VyY2VzW2VdLmViYXlGciB8fCBzb3VyY2VzW2VdLmViYXk7CiAgICAgIHZhciBlYmF5UHJpY2UgPSByZWFkRXVyb1Byb3ZpZGVyKGViYXksIFsnYXZnNycsJ2F2ZzI4JywnYXZnMScsJ2F2ZycsJ3RyZW5kJywnbG93J10pOwogICAgICBpZiAoZWJheVByaWNlICE9PSBudWxsKSByZXR1cm4gZWJheVByaWNlOwogICAgfQogICAgdmFyIHNuYXBzaG90VVNEID0gbTZhVVNEUHJpY2UoY2FyZCk7CiAgICBpZiAoc25hcHNob3RVU0QgIT09IG51bGwpewogICAgICBpZiAoY2FyZC5fcGhNYXJrZXRQcmljZVNvdXJjZSAhPT0gJ1ByaWNlQ2hhcnRpbmcgZUJheS1kZXJpdmVkIHNuYXBzaG90Jyl7CiAgICAgICAgdHJ5IHsgY2FyZC5fcGhNYXJrZXRQcmljZVNvdXJjZSA9ICdTcGFya2wgVVNEIHNuYXBzaG90JzsgfSBjYXRjaChlKSB7fQogICAgICB9CiAgICAgIHJldHVybiBzbmFwc2hvdFVTRDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLyogR2nDoSB0aGFtIGto4bqjbyB0aOG7iyB0csaw4budbmcgTmjhuq10IGNobyAzMHRoIENlbGVicmF0aW9uIChNNmEpLgogICAgIE5ndeG7k24gUG9rZWNhTmF2aTogaHR0cHM6Ly93d3cucG9rZWNhbmF2aS5qcC9zZXRzL002YQogICAgIE5ndeG7k24gxJFhbmcgY8O0bmcgYuG7kSBnacOhIGNobyA2NS8xNjUgbMOhOyDEkcOieSBsw6Agc25hcHNob3QgdOG7qyB0cmFuZyBuZ3Xhu5NuLAogICAgIGtow7RuZyBwaOG6o2kgZmVlZCByZWFsdGltZS4gS2jDtG5nIHThu7Egc3V5IMSRb8OhbiBnacOhIGNobyBjw6FjIGzDoSBjw7JuIHRoaeG6v3UuICovCiAgdmFyIE02QV9KUFlfUFJJQ0VfU09VUkNFID0gJ2h0dHBzOi8vd3d3LnBva2VjYW5hdmkuanAvc2V0cy9NNmEnOwogIHZhciBNNkFfSlBZX1BSSUNFX1NOQVBTSE9UID0gJzIwMjYtMTAtMjUnOwogIHZhciBNNkFfSlBZX1BSSUNFUyA9IHsKICAgICcwMDInOjExMDAwLCAnMDAzJzoxNDgzMywgJzAwOCc6MzY5LCAnMDE2JzoxNDgzMywgJzAxNyc6MzY5LAogICAgJzAxOCc6MTEwMCwgJzAxOSc6MTM1MTAsICcwMjAnOjMxMDAsICcwMjEnOjI1MDAwLCAnMDIyJzoyNTAwMCwKICAgICcwMjMnOjM2OSwgJzAyNCc6MjIwMDAsICcwMjUnOjIzMDAsICcwMjYnOjQwMDAsICcwMjcnOjM2MDAsCiAgICAnMDI4JzoyMzAwLCAnMDI5Jzo0MDAwLCAnMDMwJzoxMTAwLCAnMDMxJzoxMTYxMSwgJzAzMic6MjMwMCwKICAgICcwMzMnOjExMDAsICcwMzQnOjMwMCwgJzAzNSc6MzYwMCwgJzAzNic6MzY5OSwgJzAzNyc6MzgzMDAsCiAgICAnMDM4JzozNzAwLCAnMDQwJzoxMTYxMSwgJzA0MSc6MjUwMDAsICcwNDInOjI1MDAwLCAnMDQzJzoyMjAwMCwKICAgICcwNDQnOjIyMDAwLCAnMDQ1JzoyNDk5LCAnMDQ2JzoyNTAwMCwgJzA0Nyc6MjMwMCwgJzA0OCc6MjMwMCwKICAgICcwNzYnOjMzNTAwLCAnMTA0JzoxMDAwLCAnMTA1JzoxMDAwLCAnMTA2JzoxMDAwLCAnMTEwJzoyMjAwMCwKICAgICcxMjQnOjkwMCwgJzEyNSc6MTYwMCwgJzEyNic6MjIwMDAsICcxMjcnOjIzMDAsICcxMjgnOjYzMDAsCiAgICAnMTI5Jzo0NDk5LCAnMTMwJzoyMjAwMCwgJzEzMSc6MjIwMDAsICcxMzInOjEwNTAwLCAnMTMzJzoxODAwLAogICAgJzEzNSc6MzM1MDAsICcxMzYnOjY3MDAsICcxMzcnOjMzMDAsICcxMzgnOjMzNTAwLCAnMTM5JzozMzUwMCwKICAgICcxNDInOjIyMDAwLCAnMTQ1JzoyNTAwMCwgJzE1MCc6MjIwMDAsICcxNTQnOjIyMDAwLCAnMTU3JzoxMTYxMSwKICAgICcxNTgnOjI1MDAwLCAnMTYwJzoyNDk5LCAnMTYzJzoyMjAwMCwgJzE2NCc6MTAyMCwgJzE2NSc6NDAwMAogIH07CgogIGZ1bmN0aW9uIG1vbmV5SlBZKG4pewogICAgdmFyIHZhbHVlID0gTWF0aC5yb3VuZChOdW1iZXIobikpOwogICAgdHJ5IHsgcmV0dXJuICfCpScgKyB2YWx1ZS50b0xvY2FsZVN0cmluZygnamEtSlAnKTsgfQogICAgY2F0Y2goZSl7IHJldHVybiAnwqUnICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLCcpOyB9CiAgfQoKICBmdW5jdGlvbiBpc002YVByaWNlVGFyZ2V0KGNhcmQsIHNldE9yRGV0YWlsKXsKICAgIHZhciBpdGVtSWQgPSBTdHJpbmcoY2FyZCAmJiBjYXJkLmlkIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHZhciBzZXQgPSB0eXBlb2Ygc2V0T3JEZXRhaWwgPT09ICdzdHJpbmcnID8ge2lkOnNldE9yRGV0YWlsfQogICAgICA6IChzZXRPckRldGFpbCAmJiBzZXRPckRldGFpbC5zZXQgPyBzZXRPckRldGFpbC5zZXQgOiAoc2V0T3JEZXRhaWwgfHwge30pKTsKICAgIHZhciBzZXRJZCA9IFN0cmluZyhzZXQgJiYgc2V0LmlkIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHZhciBzZXROYW1lID0gU3RyaW5nKHNldCAmJiBzZXQubmFtZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gc2V0SWQgPT09ICdtNmEnIHx8IGl0ZW1JZC5pbmRleE9mKCdtNmEtJykgPT09IDAgfHwKICAgICAgc2V0TmFtZSA9PT0gJzMwdGggY2VsZWJyYXRpb24nIHx8IHNldE5hbWUuaW5kZXhPZignMzB0aCBjZWxlYnJhdGlvbicpICE9PSAtMTsKICB9CgogIGZ1bmN0aW9uIGphcGFuZXNlMzB0aFByaWNlKGNhcmQsIHNldE9yRGV0YWlsKXsKICAgIGlmICghaXNNNmFQcmljZVRhcmdldChjYXJkLCBzZXRPckRldGFpbCkpIHJldHVybiBudWxsOwogICAgdmFyIGxvY2FsSWQgPSBjYXJkICYmIGNhcmQubG9jYWxJZCAhPSBudWxsID8gU3RyaW5nKGNhcmQubG9jYWxJZCkgOiAnJzsKICAgIGlmICghbG9jYWxJZCl7CiAgICAgIHZhciBtYXRjaCA9IFN0cmluZyhjYXJkICYmIGNhcmQuaWQgfHwgJycpLm1hdGNoKC9tNmEtKFxcZCspL2kpOwogICAgICBpZiAobWF0Y2gpIGxvY2FsSWQgPSBtYXRjaFsxXTsKICAgIH0KICAgIGxvY2FsSWQgPSBsb2NhbElkLnJlcGxhY2UoL1teMC05XS9nLCAnJyk7CiAgICBpZiAoIWxvY2FsSWQpIHJldHVybiBudWxsOwogICAgd2hpbGUgKGxvY2FsSWQubGVuZ3RoIDwgMykgbG9jYWxJZCA9ICcwJyArIGxvY2FsSWQ7CiAgICB2YXIgcHJpY2UgPSBNNkFfSlBZX1BSSUNFU1tsb2NhbElkXTsKICAgIHJldHVybiB0eXBlb2YgcHJpY2UgPT09ICdudW1iZXInICYmIHByaWNlID4gMCA/IHByaWNlIDogbnVsbDsKICB9CgogIC8qIFVTRCBtYXJrZXQgc25hcHNob3QgZm9yIE1FR0EgRXhwYW5zaW9uIDMwdGggQ2VsZWJyYXRpb24gKE02YSkuCiAgICAgU291cmNlOiBTcGFya2wgcHVibGljIGNoZWNrbGlzdCwgdXNpbmcgVENHcGxheWVyIFVTIG1hcmtldCBwcmljZXMgYW5kIENhcmRtYXJrZXQgY29udmVydGVkIHdoZXJlIFRDR3BsYXllciBoYXMgbm8gcHJpY2UuCiAgICAgVXBkYXRlZCAyMDI2LTEwLTIzLiAxNzMgcHJpY2UgdmFsdWVzIGZyb20gU3BhcmtsOyB0aGUgdGhyZWUgTWV3IFJHQiB2YXJpYW50cyB1c2Ugc2VwYXJhdGUgUHJpY2VDaGFydGluZyBlc3RpbWF0ZXMgZnJvbSBjb21wbGV0ZWQtc2FsZSBoaXN0b3J5IGNoZWNrZWQgMjAyNi0xMC0yNS4KICAgICBTb3VyY2UgVVJMOiBodHRwczovL3NwYXJrbC5nZy9wb2tlbW9uL2phcGFuZXNlL21lZ2EtZXhwYW5zaW9uLTMwdGgtY2VsZWJyYXRpb24vICovCiAgdmFyIE02QV9VU0RfUFJJQ0VfU09VUkNFID0gJ2h0dHBzOi8vc3BhcmtsLmdnL3Bva2Vtb24vamFwYW5lc2UvbWVnYS1leHBhbnNpb24tMzB0aC1jZWxlYnJhdGlvbi8nOwogIHZhciBNNkFfVVNEX1BSSUNFX1NOQVBTSE9UID0gJzIwMjYtMTAtMjMnOwogIHZhciBNNkFfVVNEX1BSSUNFUyA9IHsKICAgICcwMDEnOjAuMzAsICcwMDInOjAuNTMsICcwMDMnOjAuNTAsICcwMDQnOjAuMzUsICcwMDUnOjAuNDEsICcwMDYnOjAuMzQsICcwMDcnOjAuNDcsICcwMDgnOjAuMzcsCiAgICAnMDA5JzowLjMzLCAnMDEwJzoxLjAzLCAnMDExJzowLjQ4LCAnMDEyJzowLjQzLCAnMDEzJzowLjQ0LCAnMDE0JzowLjI2LCAnMDE1JzowLjQxLCAnMDE2JzowLjg3LAogICAgJzAxNyc6MC45MSwgJzAxOCc6MC42NywgJzAxOSc6MS4wMCwgJzAyMCc6MS4zMywgJzAyMSc6MS4wMywgJzAyMic6Mi4xMiwgJzAyMyc6MC45MywgJzAyNCc6MS4yMSwKICAgICcwMjUnOjEuMTIsICcwMjYnOjIuMTUsICcwMjcnOjEuMDAsICcwMjgnOjEuMDUsICcwMjknOjAuODIsICcwMzAnOjEuMTcsICcwMzEnOjEuMDMsICcwMzInOjEuNDUsCiAgICAnMDMzJzoxLjQ4LCAnMDM0Jzo0LjAyLCAnMDM1JzoxLjExLCAnMDM2JzoxLjA1LCAnMDM3JzoxLjI0LCAnMDM4JzoxLjM3LCAnMDM5JzoxLjAyLCAnMDQwJzoyLjI5LAogICAgJzA0MSc6MS44NCwgJzA0Mic6MS43NiwgJzA0Myc6MS41NSwgJzA0NCc6MS4wMSwgJzA0NSc6MS41NiwgJzA0Nic6MS4yMCwgJzA0Nyc6MS45NywgJzA0OCc6Mi4wNiwKICAgICcwNDknOjAuMzMsICcwNTAnOjAuNTEsICcwNTEnOjAuNDQsICcwNTInOjAuNTgsICcwNTMnOjAuMzksICcwNTQnOjAuNTksICcwNTUnOjEuMDcsICcwNTYnOjEuMjQsCiAgICAnMDU3JzoxLjQ1LCAnMDU4JzowLjcwLCAnMDU5JzoxLjExLCAnMDYwJzowLjI3LCAnMDYxJzoxLjg2LCAnMDYyJzowLjU3LCAnMDYzJzowLjQ2LCAnMDY0JzowLjU2LAogICAgJzA2NSc6MC40NywgJzA2Nic6MC41MiwgJzA2Nyc6MC4yOSwgJzA2OCc6MC40NSwgJzA2OSc6MC43NywgJzA3MCc6MC40NiwgJzA3MSc6MC44MiwgJzA3Mic6MC41MywKICAgICcwNzMnOjAuNDIsICcwNzQnOjAuNDYsICcwNzUnOjAuNzAsICcwNzYnOjEuOTksICcwNzcnOjEuMzgsICcwNzgnOjAuMzEsICcwNzknOjAuMzgsICcwODAnOjAuNTMsCiAgICAnMDgxJzowLjU0LCAnMDgyJzowLjM4LCAnMDgzJzowLjM0LCAnMDg0JzowLjUxLCAnMDg1JzowLjcwLCAnMDg2JzowLjY2LCAnMDg3JzowLjU3LCAnMDg4JzowLjI5LAogICAgJzA4OSc6MC4yNCwgJzA5MCc6MC4yOCwgJzA5MSc6MC4yNSwgJzA5Mic6MC41OSwgJzA5Myc6MC41OSwgJzA5NCc6MC42NCwgJzA5NSc6MC45OCwgJzA5Nic6MC4zOCwKICAgICcwOTcnOjAuNzQsICcwOTgnOjAuNjIsICcwOTknOjAuNjEsICcxMDAnOjAuNzEsICcxMDEnOjAuMzUsICcxMDInOjAuMzYsICcxMDMnOjAuMzIsICcxMDQnOjIuMTMsCiAgICAnMTA1Jzo0LjUxLCAnMTA2Jzo0LjE1LCAnMTA3Jzo0LjQ1LCAnMTA4Jzo2Ljk0LCAnMTA5JzoyLjY0LCAnMTEwJzozLjM4LCAnMTExJzozLjk0LCAnMTEyJzoyLjM0LAogICAgJzExMyc6My43NCwgJzExNCc6My4yNiwgJzExNSc6NC45OSwgJzExNic6MS43NSwgJzExNyc6NC43OCwgJzExOCc6MS43NiwgJzExOSc6MS41NywgJzEyMCc6NS43MywKICAgICcxMjEnOjguMTAsICcxMjInOjQuMTksICcxMjMnOjcuMzcsICcxMjQnOjEzLjM2LCAnMTI1JzoxOS45MiwgJzEyNic6NjMuNjYsICcxMjcnOjY4LjU3LCAnMTI4JzozOC4xNSwKICAgICcxMjknOjcxLjE2LCAnMTMwJzozMS4xMCwgJzEzMSc6NDAuNjEsICcxMzInOjM5LjgyLCAnMTMzJzo5LjYyLCAnMTM0Jzo0MC45NCwgJzEzNSc6ODIuMDAsICcxMzYnOjYzLjk2LAogICAgJzEzNyc6MTk4LjY1LCAnMTM4JzoxMi4xNSwgJzEzOSc6MTEuMTgsICcxNDAnOjE3LjAzLCAnMTQxJzoyOS4wMywgJzE0Mic6MTg5LjAyLCAnMTQzJzo5LjQyLCAnMTQ0JzozOC45MiwKICAgICcxNDUnOjEyLjgxLCAnMTQ2JzoxNy45MiwgJzE0Nyc6MTEuMzksICcxNDgnOjkuMzYsICcxNDknOjE3LjEyLCAnMTUwJzo1OC4wNiwgJzE1MSc6MTEuOTgsICcxNTInOjEzLjkyLAogICAgJzE1Myc6MjYuMTcsICcxNTQnOjM1LjIzLCAnMTU1Jzo2LjExLCAnMTU2Jzo4Ljk0LCAnMTU3Jzo3LjMzLCAnMTU4Jzo2LjA0LCAnMTU5Jzo4LjA3LCAnMTYwJzo0Ni41NCwKICAgICcxNjEnOjYuNDUsICcxNjInOjkuMzAsICcxNjMnOjMwLjY3LCAnMTY0Jzo4LjgwLCAnMTY1Jzo4Mi45NiwgJ2Rhcic6MC4yNiwgJ2ZpZyc6MC4yNiwgJ2Zpcic6MC4yOCwKICAgICdncmEnOjAuMjQsICdsaWcnOjAuMjcsICdtZXQnOjAuMjgsICdwc3knOjAuMjgsICd3YXQnOjAuMjUKICB9OwoKICAvKiBNZXcgUkdCIHZhcmlhbnRzIGhhdmUgbm8gcHVibGljIFRDR3BsYXllci9DYXJkbWFya2V0IG1hcmtldCB2YWx1ZXMgaW4gU3BhcmtsLgogICAgIFByaWNlQ2hhcnRpbmcncyBlc3RpbWF0ZXMgYXJlIGJhc2VkIG9uIGNvbXBsZXRlZCBzYWxlcy9oaXN0b3J5IChpbmNsdWRpbmcgZUJheSBzb2xkIGxpc3RpbmdzKSwgbm90IHVuc29sZCBhc2tpbmcgcHJpY2VzLgogICAgIFNuYXBzaG90IGNoZWNrZWQgMjAyNi0xMC0yNS4gKi8KICB2YXIgTTZBX1JHQl9VU0RfUFJJQ0VfU05BUFNIT1QgPSAnMjAyNi0xMC0yNSc7CiAgdmFyIE02QV9SR0JfVVNEX1BSSUNFX1NPVVJDRVMgPSB7CiAgICAnYic6J2h0dHBzOi8vd3d3LnByaWNlY2hhcnRpbmcuY29tL2NvbnNvbGUvcG9rZW1vbi1qYXBhbmVzZS0zMHRoLWNlbGVicmF0aW9uP3ZpZXc9Z3JpZCcsCiAgICAnZyc6J2h0dHBzOi8vd3d3LnByaWNlY2hhcnRpbmcuY29tL2NvbnNvbGUvcG9rZW1vbi1qYXBhbmVzZS0zMHRoLWNlbGVicmF0aW9uP3ZpZXc9Z3JpZCcsCiAgICAncic6J2h0dHBzOi8vd3d3LnByaWNlY2hhcnRpbmcuY29tL2NvbnNvbGUvcG9rZW1vbi1qYXBhbmVzZS0zMHRoLWNlbGVicmF0aW9uP3ZpZXc9Z3JpZCcKICB9OwogIHZhciBNNkFfUkdCX1VTRF9QUklDRVMgPSB7J2InOjMzNjYuMzAsICdnJzoyNjQ2Ljk5LCAncic6MzczOS4wNH07CgogIGZ1bmN0aW9uIG02YVVTRFByaWNlKGNhcmQsIHNldE9yRGV0YWlsKXsKICAgIGlmICghaXNNNmFQcmljZVRhcmdldChjYXJkLCBzZXRPckRldGFpbCB8fCAoY2FyZCAmJiBjYXJkLnNldCkpKSByZXR1cm4gbnVsbDsKCiAgICB2YXIgcmF3TG9jYWxJZCA9IGNhcmQgJiYgY2FyZC5sb2NhbElkICE9IG51bGwgPyBTdHJpbmcoY2FyZC5sb2NhbElkKS50cmltKCkudG9Mb3dlckNhc2UoKSA6ICcnOwogICAgdmFyIGNhcmRJZCA9IFN0cmluZyhjYXJkICYmIGNhcmQuaWQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgaWYgKCFyYXdMb2NhbElkKXsKICAgICAgdmFyIG1hdGNoID0gY2FyZElkLm1hdGNoKC9tNmEtKFteL10rKS9pKTsKICAgICAgaWYgKG1hdGNoKSByYXdMb2NhbElkID0gbWF0Y2hbMV07CiAgICB9CiAgICByYXdMb2NhbElkID0gcmF3TG9jYWxJZC5yZXBsYWNlKC9eIy8sICcnKS5yZXBsYWNlKC9ccysvZywgJycpOwoKICAgIC8vIFRoZSB0aHJlZSBzcGVjaWFsIE1ldyBSR0IgZW50cmllcyB1c2UgQi9SR0IsIEcvUkdCIGFuZCBSL1JHQiBhcwogICAgLy8gbG9jYWwgSURzIG9uIHNvbWUgc291cmNlcywgYW5kIGIvZy9yIG9uIG90aGVycy4KICAgIHZhciByZ2JLZXkgPSAnJzsKICAgIHZhciByZ2JNYXRjaCA9IHJhd0xvY2FsSWQubWF0Y2goL14oW2Jncl0pKD86XC8/cmdiKT8kL2kpOwogICAgaWYgKCFyZ2JNYXRjaCkgcmdiTWF0Y2ggPSBjYXJkSWQubWF0Y2goLyg/Om02YVstX10pKD86bWV3Wy1fXSk/KFtiZ3JdKSg/OlwvP3JnYik/JC9pKTsKICAgIGlmIChyZ2JNYXRjaCkgcmdiS2V5ID0gU3RyaW5nKHJnYk1hdGNoWzFdKS50b0xvd2VyQ2FzZSgpOwoKICAgIHZhciBsb2NhbElkID0gcmF3TG9jYWxJZDsKICAgIGlmIChyZ2JLZXkpIHsKICAgICAgbG9jYWxJZCA9IHJnYktleTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEFjY2VwdCBsb2NhbCBJRHMgcmV0dXJuZWQgYXMgMSwgMDAxLCBvciAwMDEvMTAzLgogICAgICB2YXIgbnVtZXJpY01hdGNoID0gcmF3TG9jYWxJZC5tYXRjaCgvXihcZCspLyk7CiAgICAgIGlmICghbnVtZXJpY01hdGNoKSBudW1lcmljTWF0Y2ggPSBjYXJkSWQubWF0Y2goL202YVstX10oXGQrKS9pKTsKICAgICAgaWYgKG51bWVyaWNNYXRjaCl7CiAgICAgICAgbG9jYWxJZCA9IFN0cmluZyhwYXJzZUludChudW1lcmljTWF0Y2hbMV0sIDEwKSk7CiAgICAgICAgd2hpbGUgKGxvY2FsSWQubGVuZ3RoIDwgMykgbG9jYWxJZCA9ICcwJyArIGxvY2FsSWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUHJlc2VydmUgdGhlIGFiYnJldmlhdGVkIGVuZXJneSBJRHM6IGRhciwgZmlnLCBmaXIsIGdyYSwgbGlnLCBtZXQsIHBzeSwgd2F0LgogICAgICAgIGxvY2FsSWQgPSByYXdMb2NhbElkLnJlcGxhY2UoL1teYS16XS9nLCAnJyk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgcmdiUHJpY2UgPSBNNkFfUkdCX1VTRF9QUklDRVNbbG9jYWxJZF07CiAgICBpZiAodHlwZW9mIHJnYlByaWNlID09PSAnbnVtYmVyJyAmJiByZ2JQcmljZSA+IDApewogICAgICB0cnkgewogICAgICAgIGNhcmQuX3BoTWFya2V0UHJpY2VTb3VyY2UgPSAnUHJpY2VDaGFydGluZyBlQmF5LWRlcml2ZWQgc25hcHNob3QnOwogICAgICAgIGNhcmQuX3BoTWFya2V0UHJpY2VTb3VyY2VVUkwgPSBNNkFfUkdCX1VTRF9QUklDRV9TT1VSQ0VTW2xvY2FsSWRdIHx8IE02QV9SR0JfVVNEX1BSSUNFX1NPVVJDRTsKICAgICAgfSBjYXRjaChlKSB7fQogICAgICByZXR1cm4gcmdiUHJpY2U7CiAgICB9CiAgICB2YXIgcHJpY2UgPSBNNkFfVVNEX1BSSUNFU1tsb2NhbElkXTsKICAgIGlmICh0eXBlb2YgcHJpY2UgPT09ICdudW1iZXInICYmIHByaWNlID4gMCl7CiAgICAgIHRyeSB7IGNhcmQuX3BoTWFya2V0UHJpY2VTb3VyY2UgPSAnU3BhcmtsIFVTRCBzbmFwc2hvdCc7IH0gY2F0Y2goZSkge30KICAgICAgcmV0dXJuIHByaWNlOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBtb25leShuKXsgcmV0dXJuICckJyArIG4udG9GaXhlZCgyKTsgfQogIGZ1bmN0aW9uIHBjdChuKXsgcmV0dXJuIChuID49IDAgPyAnKycgOiAnJykgKyBuLnRvRml4ZWQoMCkgKyAnJSc7IH0KCiAgLy8gLS0tLS0tLS0tLSBMxq9VIELhu5ggU8avVSBU4bqsUCAobG9jYWxTdG9yYWdlKSAtLS0tLS0tLS0tCiAgdmFyIExTX0tFWSA9ICdwb2tlaHViLmNvbGxlY3Rpb24udjInOwogIHZhciBkYiA9IG51bGw7CiAgZnVuY3Rpb24gbG9hZERCKCl7CiAgICBpZiAoZGIpIHJldHVybiBkYjsKICAgIHZhciByYXcgPSBudWxsOwogICAgdHJ5IHsgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWSk7IH0gY2F0Y2goZSl7fQogICAgaWYgKHJhdyl7IHRyeSB7IGRiID0gSlNPTi5wYXJzZShyYXcpOyB9IGNhdGNoKGUpeyBkYiA9IG51bGw7IH0gfQogICAgaWYgKCFkYiB8fCB0eXBlb2YgZGIgIT09ICdvYmplY3QnKSBkYiA9IHt9OwogICAgaWYgKCFkYi5jYXJkcyB8fCB0eXBlb2YgZGIuY2FyZHMgIT09ICdvYmplY3QnKSBkYi5jYXJkcyA9IHt9OwogICAgaWYgKCFkYi5jaGFsbGVuZ2VzIHx8IHR5cGVvZiBkYi5jaGFsbGVuZ2VzICE9PSAnb2JqZWN0JykgZGIuY2hhbGxlbmdlcyA9IHt9OwogICAgaWYgKHR5cGVvZiBkYi5wYWNrcyAhPT0gJ251bWJlcicpIGRiLnBhY2tzID0gMDsKICAgIGlmICh0eXBlb2YgZGIuc3BlbnQgIT09ICdudW1iZXInKSBkYi5zcGVudCA9IDA7CiAgICBpZiAodHlwZW9mIGRiLnBhY2tQcmljZSAhPT0gJ251bWJlcicpIGRiLnBhY2tQcmljZSA9IERFRkFVTFRfUEFDS19QUklDRTsKICAgIGlmICh0eXBlb2YgZGIuYmVzdEx1Y2sgIT09ICdudW1iZXInKSBkYi5iZXN0THVjayA9IDA7CiAgICByZXR1cm4gZGI7CiAgfQogIGZ1bmN0aW9uIHNhdmVEQigpewogICAgdHJ5IHsgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWSwgSlNPTi5zdHJpbmdpZnkoZGIpKTsgcmV0dXJuIHRydWU7IH0KICAgIGNhdGNoKGUpeyByZXR1cm4gZmFsc2U7IH0KICB9CgogIC8vIE5vcm1hbGl6ZSBhbiBleHBvcnRlZCBQb2tlSHViIGNvbGxlY3Rpb24gSlNPTiBiZWZvcmUgcmVwbGFjaW5nIGxvY2FsIGRhdGEuCiAgZnVuY3Rpb24gbm9ybWFsaXplSW1wb3J0ZWRDb2xsZWN0aW9uKHJhdyl7CiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJhdykpIHRocm93IG5ldyBFcnJvcignRmlsZSBKU09OIGtow7RuZyDEkcO6bmcgxJHhu4tuaCBk4bqhbmcuJyk7CiAgICB2YXIgc291cmNlID0gcmF3LmNvbGxlY3Rpb24gJiYgdHlwZW9mIHJhdy5jb2xsZWN0aW9uID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyYXcuY29sbGVjdGlvbikgPyByYXcuY29sbGVjdGlvbiA6IHJhdzsKICAgIGlmICghc291cmNlLmNhcmRzIHx8IHR5cGVvZiBzb3VyY2UuY2FyZHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc291cmNlLmNhcmRzKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTT04gbsOgeSBraMO0bmcgY8OzIGThu68gbGnhu4d1IGLhu5kgc8awdSB04bqtcCBo4bujcCBs4buHLiBIw6N5IGNo4buNbiBmaWxlIGRvIG7DunQg4oCcWHXhuqV0IEpTT07igJ0gdOG6oW8gcmEuJyk7CiAgICB9CiAgICB2YXIgY2FyZHMgPSB7fTsKICAgIE9iamVjdC5rZXlzKHNvdXJjZS5jYXJkcykuc2xpY2UoMCw1MDAwMCkuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgIGlmICghaWQgfHwgaWQgPT09ICdfX3Byb3RvX18nIHx8IGlkID09PSAncHJvdG90eXBlJyB8fCBpZCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuOwogICAgICB2YXIgY2FyZCA9IHNvdXJjZS5jYXJkc1tpZF07CiAgICAgIGlmIChjYXJkICYmIHR5cGVvZiBjYXJkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjYXJkKSkgY2FyZHNbaWRdID0gY2FyZDsKICAgIH0pOwogICAgdmFyIGNoYWxsZW5nZXMgPSBzb3VyY2UuY2hhbGxlbmdlcyAmJiB0eXBlb2Ygc291cmNlLmNoYWxsZW5nZXMgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHNvdXJjZS5jaGFsbGVuZ2VzKSA/IHNvdXJjZS5jaGFsbGVuZ2VzIDoge307CiAgICB2YXIgcGFja3MgPSBOdW1iZXIoc291cmNlLnBhY2tzKTsKICAgIHZhciBzcGVudCA9IE51bWJlcihzb3VyY2Uuc3BlbnQpOwogICAgdmFyIHBhY2tQcmljZSA9IE51bWJlcihzb3VyY2UucGFja1ByaWNlKTsKICAgIHZhciBiZXN0THVjayA9IE51bWJlcihzb3VyY2UuYmVzdEx1Y2spOwogICAgcmV0dXJuIHsKICAgICAgY2FyZHM6Y2FyZHMsCiAgICAgIGNoYWxsZW5nZXM6Y2hhbGxlbmdlcywKICAgICAgcGFja3M6TnVtYmVyLmlzRmluaXRlKHBhY2tzKSAmJiBwYWNrcyA+PSAwID8gTWF0aC5mbG9vcihwYWNrcykgOiAwLAogICAgICBzcGVudDpOdW1iZXIuaXNGaW5pdGUoc3BlbnQpICYmIHNwZW50ID49IDAgPyBzcGVudCA6IDAsCiAgICAgIHBhY2tQcmljZTpOdW1iZXIuaXNGaW5pdGUocGFja1ByaWNlKSAmJiBwYWNrUHJpY2UgPj0gMCA/IHBhY2tQcmljZSA6IERFRkFVTFRfUEFDS19QUklDRSwKICAgICAgYmVzdEx1Y2s6TnVtYmVyLmlzRmluaXRlKGJlc3RMdWNrKSAmJiBiZXN0THVjayA+PSAwID8gTWF0aC5taW4oMTAwLGJlc3RMdWNrKSA6IDAKICAgIH07CiAgfQoKICBmdW5jdGlvbiBub3RpZnlDb2xsZWN0aW9uQ2hhbmdlZChzb3VyY2UpewogICAgdHJ5ewogICAgICB2YXIgZXZlbnQ7CiAgICAgIHRyeSB7IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdwb2tlaHViOmNvbGxlY3Rpb24tY2hhbmdlZCcsIHtkZXRhaWw6e3NvdXJjZTpzb3VyY2UgfHwgJ3VwZGF0ZSd9fSk7IH0KICAgICAgY2F0Y2goZSl7IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7IGV2ZW50LmluaXRDdXN0b21FdmVudCgncG9rZWh1Yjpjb2xsZWN0aW9uLWNoYW5nZWQnLCB0cnVlLCBmYWxzZSwge3NvdXJjZTpzb3VyY2UgfHwgJ3VwZGF0ZSd9KTsgfQogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB9Y2F0Y2goZSl7fQogICAgdHJ5IHsgcGhMYlN5bmNTdGF0cygpOyB9IGNhdGNoKGUpe30KICB9CgogIC8vIC0tLS0tLS0tLS0gQ0hBU0UgQ0FSRDogbG9jYWwgdGFyZ2V0cywgcGVyLXNldCBwcm9ncmVzcyBhbmQgaGl0IGNlbGVicmF0aW9uIC0tLS0tLS0tLS0KICB2YXIgQ0hBU0VfVEFSR0VUU19LRVkgPSAncG9rZWh1Yi5jaGFzZS50YXJnZXRzLnYxJzsKICBmdW5jdGlvbiBsb2FkQ2hhc2VUYXJnZXRzKCl7CiAgICB0cnl7CiAgICAgIHZhciB2YWx1ZSA9IEpTT04ucGFyc2Uod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKENIQVNFX1RBUkdFVFNfS0VZKSB8fCAnW10nKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdOwogICAgICByZXR1cm4gdmFsdWUuZmlsdGVyKGZ1bmN0aW9uKHQpeyByZXR1cm4gdCAmJiB0LmlkOyB9KS5zbGljZSgwLDIwMCk7CiAgICB9Y2F0Y2goZSl7IHJldHVybiBbXTsgfQogIH0KICBmdW5jdGlvbiBzYXZlQ2hhc2VUYXJnZXRzKHRhcmdldHMpewogICAgdHJ5ewogICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oQ0hBU0VfVEFSR0VUU19LRVksIEpTT04uc3RyaW5naWZ5KCh0YXJnZXRzIHx8IFtdKS5zbGljZSgwLDIwMCkpKTsKICAgICAgdXBkYXRlQ2hhc2VCYWRnZSgpOwogICAgICBpZiAoZWxzLmNoYXNlTW9kYWwgJiYgIWVscy5jaGFzZU1vZGFsLmhpZGRlbikgcmVuZGVyQ2hhc2VNb2RhbCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH1jYXRjaChlKXsgdG9hc3QoJ0tow7RuZyBsxrB1IMSRxrDhu6NjIENoYXNlIENhcmQuIEPDsyB0aOG7gyB0csOsbmggZHV54buHdCDEkcOjIGjhur90IGR1bmcgbMaw4bujbmcgbMawdSB0cuG7ry4nKTsgcmV0dXJuIGZhbHNlOyB9CiAgfQogIGZ1bmN0aW9uIGZpbmRDaGFzZVRhcmdldChjYXJkSWQpewogICAgY2FyZElkID0gU3RyaW5nKGNhcmRJZCB8fCAnJyk7CiAgICByZXR1cm4gbG9hZENoYXNlVGFyZ2V0cygpLmZpbmQoZnVuY3Rpb24odCl7IHJldHVybiBTdHJpbmcodC5pZCkgPT09IGNhcmRJZDsgfSkgfHwgbnVsbDsKICB9CiAgZnVuY3Rpb24gY2hhc2VJbWFnZVVybChiYXNlLCBxdWFsaXR5KXsKICAgIHZhciB1cmwgPSBTdHJpbmcoYmFzZSB8fCAnJykudHJpbSgpOwogICAgaWYgKCF1cmwpIHJldHVybiAnJzsKICAgIGlmICgvXC8oPzpoaWdofGxvdylcLndlYnAoPzpbPyNdLiopPyQvaS50ZXN0KHVybCkpIHJldHVybiB1cmwucmVwbGFjZSgvXC8oPzpoaWdofGxvdylcLndlYnAoPzpbPyNdLiopPyQvaSwgJy8nICsgKHF1YWxpdHkgfHwgJ2xvdy53ZWJwJykpOwogICAgaWYgKC9cLig/OnBuZ3xqcGU/Z3x3ZWJwfGdpZikoPzpbPyNdLiopPyQvaS50ZXN0KHVybCkpIHJldHVybiB1cmw7CiAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1wvJC8sICcnKSArICcvJyArIChxdWFsaXR5IHx8ICdsb3cud2VicCcpOwogIH0KICBmdW5jdGlvbiBtYWtlQ2hhc2VUYXJnZXQoY2FyZCwgaW5mbywgdXNkKXsKICAgIGNhcmQgPSBjYXJkIHx8IHt9OwogICAgdmFyIHNldE9iaiA9IGNhcmQuc2V0ICYmIHR5cGVvZiBjYXJkLnNldCA9PT0gJ29iamVjdCcgPyBjYXJkLnNldCA6IHt9OwogICAgdmFyIHNldElkID0gU3RyaW5nKHNldE9iai5pZCB8fCBjYXJkLnNldElkIHx8IChzdGF0ZS5jdXJyZW50ICYmIHN0YXRlLmN1cnJlbnQuaWQpIHx8ICcnKTsKICAgIHZhciBzZXROYW1lID0gU3RyaW5nKHNldE9iai5uYW1lIHx8IGNhcmQuc2V0TmFtZSB8fCAodHlwZW9mIGNhcmQuc2V0ID09PSAnc3RyaW5nJyA/IGNhcmQuc2V0IDogJycpIHx8IChzdGF0ZS5jdXJyZW50ICYmIHN0YXRlLmN1cnJlbnQubmFtZSkgfHwgJ0Lhu5kgdGjhursgY2jGsGEgeMOhYyDEkeG7i25oJyk7CiAgICB2YXIgcCA9IHVzZCAhPSBudWxsICYmIGlzRmluaXRlKE51bWJlcih1c2QpKSA/IE51bWJlcih1c2QpIDogcHJpY2VVU0QoY2FyZCwgc2V0SWQgfHwgc3RhdGUuY3VycmVudCk7CiAgICB2YXIgdGllckluZm8gPSBpbmZvIHx8IChjYXJkLnJhcml0eSA/IHJhcml0eVRpZXIoY2FyZC5yYXJpdHkpIDoge30pOwogICAgcmV0dXJuIHsKICAgICAgaWQ6U3RyaW5nKGNhcmQuaWQgfHwgJycpLCBuYW1lOlN0cmluZyhjYXJkLm5hbWUgfHwgY2FyZC5pZCB8fCAnTMOhIGLDoGkgUG9rw6ltb24nKSwKICAgICAgaW1hZ2U6U3RyaW5nKGNhcmQuaW1hZ2UgfHwgY2FyZC5pbWcgfHwgJycpLCBzZXRJZDpzZXRJZCwgc2V0TmFtZTpzZXROYW1lLAogICAgICByYXJpdHk6U3RyaW5nKGNhcmQucmFyaXR5IHx8ICcnKSwgdGllcjpOdW1iZXIodGllckluZm8udGllciAhPSBudWxsID8gdGllckluZm8udGllciA6IGNhcmQudGllcikgfHwgMCwKICAgICAgcHJpY2U6cCAhPSBudWxsICYmIGlzRmluaXRlKE51bWJlcihwKSkgJiYgTnVtYmVyKHApID4gMCA/IE51bWJlcihOdW1iZXIocCkudG9GaXhlZCgyKSkgOiBudWxsLAogICAgICBhZGRlZEF0OkRhdGUubm93KCkKICAgIH07CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZUNoYXNlQmFkZ2UoKXsKICAgIGlmICghZWxzLmNoYXNlQ291bnQpIHJldHVybjsKICAgIHZhciBuID0gbG9hZENoYXNlVGFyZ2V0cygpLmxlbmd0aDsKICAgIGVscy5jaGFzZUNvdW50LnRleHRDb250ZW50ID0gU3RyaW5nKG4pOwogICAgZWxzLmNoYXNlQ291bnQuaGlkZGVuID0gbiA8IDE7CiAgfQogIGZ1bmN0aW9uIGFkZENoYXNlVGFyZ2V0KHRhcmdldCl7CiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmlkKSB7IHRvYXN0KCdLaMO0bmcgeMOhYyDEkeG7i25oIMSRxrDhu6NjIElEIGzDoSBiw6BpIMSR4buDIHRoZW8gZMO1aS4nKTsgcmV0dXJuIGZhbHNlOyB9CiAgICB2YXIgdGFyZ2V0cyA9IGxvYWRDaGFzZVRhcmdldHMoKTsKICAgIGlmICh0YXJnZXRzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiBTdHJpbmcodC5pZCkgPT09IFN0cmluZyh0YXJnZXQuaWQpOyB9KSl7CiAgICAgIHRvYXN0KCfwn46vIEzDoSBuw6B5IMSRw6MgbuG6sW0gdHJvbmcgQ2hhc2UgQ2FyZCBj4bunYSBi4bqhbi4nKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGFyZ2V0cy51bnNoaWZ0KHRhcmdldCk7CiAgICBpZiAoIXNhdmVDaGFzZVRhcmdldHModGFyZ2V0cykpIHJldHVybiBmYWxzZTsKICAgIHRvYXN0KCfwn46vIMSQw6MgdGjDqm0gJyArIHRhcmdldC5uYW1lICsgJyB2w6BvIENoYXNlIENhcmQhJyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gcmVtb3ZlQ2hhc2VUYXJnZXQoY2FyZElkKXsKICAgIHZhciB0YXJnZXRzID0gbG9hZENoYXNlVGFyZ2V0cygpLmZpbHRlcihmdW5jdGlvbih0KXsgcmV0dXJuIFN0cmluZyh0LmlkKSAhPT0gU3RyaW5nKGNhcmRJZCk7IH0pOwogICAgc2F2ZUNoYXNlVGFyZ2V0cyh0YXJnZXRzKTsKICB9CiAgZnVuY3Rpb24gY2hhc2VTaGFyZVRleHQoaGl0KXsKICAgIHZhciB0ZXh0ID0gJ/Cfjq8gQ0hBU0UgQ0FSRCBISVQgdHLDqm4gdm5HYW1lLnR2ISBNw6xuaCB24burYSBt4bufIMSRxrDhu6NjICcgKyBoaXQubmFtZTsKICAgIGlmIChoaXQucHJpY2UpIHRleHQgKz0gJyDigJQgZ2nDoSB0aGFtIGto4bqjbyAnICsgbW9uZXkoaGl0LnByaWNlKTsKICAgIGlmIChoaXQuc2V0TmFtZSkgdGV4dCArPSAnICgnICsgaGl0LnNldE5hbWUgKyAnKSc7CiAgICByZXR1cm4gdGV4dCArICcuIEPDuW5nIHPEg24gbMOhIG3hu6VjIHRpw6p1IG5ow6khJzsKICB9CiAgZnVuY3Rpb24gc2hhcmVDaGFzZUhpdChoaXQpewogICAgdmFyIHRleHQgPSBjaGFzZVNoYXJlVGV4dChoaXQpOwogICAgaWYgKG5hdmlnYXRvci5zaGFyZSl7CiAgICAgIG5hdmlnYXRvci5zaGFyZSh7dGl0bGU6J0NoYXNlIENhcmQgSGl0IScsIHRleHQ6dGV4dCwgdXJsOndpbmRvdy5sb2NhdGlvbi5ocmVmfSkuY2F0Y2goZnVuY3Rpb24oKXt9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpewogICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKGZ1bmN0aW9uKCl7IHRvYXN0KCfEkMOjIHNhbyBjaMOpcCB0aMOgbmggdMOtY2ggQ2hhc2UgQ2FyZCDEkeG7gyBjaGlhIHPhurshJyk7IH0pLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgICAgd2luZG93LnByb21wdCgnU2FvIGNow6lwIHRow6BuaCB0w61jaCBDaGFzZSBDYXJkOicsIHRleHQpOwogICAgICB9KTsKICAgIH1lbHNlewogICAgICB3aW5kb3cucHJvbXB0KCdTYW8gY2jDqXAgdGjDoG5oIHTDrWNoIENoYXNlIENhcmQ6JywgdGV4dCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNob3dDaGFzZUhpdE5vdGlmaWNhdGlvbihoaXRzKXsKICAgIGlmICghaGl0cyB8fCAhaGl0cy5sZW5ndGggfHwgIWRvY3VtZW50LmJvZHkpIHJldHVybjsKICAgIGhpdHMuc29ydChmdW5jdGlvbihhLGIpeyByZXR1cm4gKE51bWJlcihiLnByaWNlKXx8MCkgLSAoTnVtYmVyKGEucHJpY2UpfHwwKTsgfSk7CiAgICB2YXIgaGl0ID0gaGl0c1swXTsKICAgIHZhciBvbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGgtY2hhc2UtaGl0LXRvYXN0Jyk7CiAgICBpZiAob2xkICYmIG9sZC5wYXJlbnROb2RlKSBvbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGQpOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbm9kZS5pZCA9ICdwaC1jaGFzZS1oaXQtdG9hc3QnOyBub2RlLnNldEF0dHJpYnV0ZSgncm9sZScsJ3N0YXR1cycpOyBub2RlLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywncG9saXRlJyk7CiAgICB2YXIgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGhlYWRlci5jbGFzc05hbWUgPSAncGgtY2hhc2UtaGl0LXRpdGxlJzsgaGVhZGVyLnRleHRDb250ZW50ID0gJ/Cfjq8gQ0hBU0UgQ0FSRCBISVQhJzsgbm9kZS5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbmFtZS5jbGFzc05hbWUgPSAncGgtY2hhc2UtaGl0LW5hbWUnOyBuYW1lLnRleHRDb250ZW50ID0gaGl0Lm5hbWUgKyAoaGl0LnByaWNlID8gJyDCtyAnICsgbW9uZXkoaGl0LnByaWNlKSA6ICcnKTsgbm9kZS5hcHBlbmRDaGlsZChuYW1lKTsKICAgIHZhciBkZXRhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZGV0YWlsLmNsYXNzTmFtZSA9ICdwaC1jaGFzZS1oaXQtZGVzYyc7IGRldGFpbC50ZXh0Q29udGVudCA9IChoaXQuc2V0TmFtZSA/IGhpdC5zZXROYW1lICsgJyDCtyAnIDogJycpICsgJ0LhuqFuIHbhu6thIG3hu58gdHLDum5nIGzDoSBiw6BpIG3hu6VjIHRpw6p1IScgKyAoaGl0cy5sZW5ndGggPiAxID8gJyBDw7luZyBsxrDhu6N0IGPDsm4gdHLDum5nICcgKyAoaGl0cy5sZW5ndGggLSAxKSArICcgbeG7pWMgdGnDqnUga2jDoWMuJyA6ICcnKTsgbm9kZS5hcHBlbmRDaGlsZChkZXRhaWwpOwogICAgdmFyIGFjdGlvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgYWN0aW9ucy5jbGFzc05hbWUgPSAncGgtY2hhc2UtaGl0LWFjdGlvbnMnOwogICAgdmFyIHNoYXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IHNoYXJlLnR5cGUgPSAnYnV0dG9uJzsgc2hhcmUuY2xhc3NOYW1lID0gJ3BoLWNoYXNlLWhpdC1zaGFyZSc7IHNoYXJlLnRleHRDb250ZW50ID0gJ+KGlyBDaGlhIHPhursgdGjDoG5oIHTDrWNoJzsgc2hhcmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpeyBzaGFyZUNoYXNlSGl0KGhpdCk7IH0pOwogICAgdmFyIGNsb3NlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IGNsb3NlLnR5cGUgPSAnYnV0dG9uJzsgY2xvc2UuY2xhc3NOYW1lID0gJ3BoLWNoYXNlLWhpdC1jbG9zZSc7IGNsb3NlLnRleHRDb250ZW50ID0gJ8SQw7NuZyc7IGNsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsgaWYobm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7IH0pOwogICAgYWN0aW9ucy5hcHBlbmRDaGlsZChzaGFyZSk7IGFjdGlvbnMuYXBwZW5kQ2hpbGQoY2xvc2UpOyBub2RlLmFwcGVuZENoaWxkKGFjdGlvbnMpOyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vZGUpOwogICAgY2xlYXJUaW1lb3V0KG5vZGUuX3BoVGltZXIpOyBub2RlLl9waFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpeyBpZihub2RlLnBhcmVudE5vZGUpIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsgfSwgMTUwMDApOwogIH0KICBmdW5jdGlvbiBoYW5kbGVDaGFzZVB1bGwoY2FyZHMpewogICAgdmFyIHRhcmdldHMgPSBsb2FkQ2hhc2VUYXJnZXRzKCk7CiAgICBpZiAoIXRhcmdldHMubGVuZ3RoIHx8ICFBcnJheS5pc0FycmF5KGNhcmRzKSB8fCAhY2FyZHMubGVuZ3RoKSByZXR1cm47CiAgICB2YXIgbG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRhcmdldHMuZm9yRWFjaChmdW5jdGlvbih0KXsgbG9va3VwW1N0cmluZyh0LmlkKV0gPSB0OyB9KTsKICAgIHZhciBoaXRzID0gW10sIHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY2FyZHMuZm9yRWFjaChmdW5jdGlvbihjYXJkKXsKICAgICAgaWYgKCFjYXJkIHx8ICFjYXJkLmlkKSByZXR1cm47CiAgICAgIHZhciBpZCA9IFN0cmluZyhjYXJkLmlkKSwgdGFyZ2V0ID0gbG9va3VwW2lkXTsKICAgICAgaWYgKCF0YXJnZXQgfHwgc2VlbltpZF0pIHJldHVybjsKICAgICAgc2VlbltpZF0gPSB0cnVlOwogICAgICB2YXIgcHJpY2UgPSBwcmljZVVTRChjYXJkLCAoY2FyZC5zZXQgJiYgY2FyZC5zZXQuaWQpIHx8IChzdGF0ZS5jdXJyZW50ICYmIHN0YXRlLmN1cnJlbnQuaWQpKTsKICAgICAgdmFyIG93bmVkID0gbG9hZERCKCkuY2FyZHMgJiYgbG9hZERCKCkuY2FyZHNbaWRdOwogICAgICBoaXRzLnB1c2goe2lkOmlkLG5hbWU6U3RyaW5nKGNhcmQubmFtZSB8fCB0YXJnZXQubmFtZSksaW1hZ2U6U3RyaW5nKGNhcmQuaW1hZ2UgfHwgdGFyZ2V0LmltYWdlIHx8ICcnKSxzZXROYW1lOlN0cmluZygoY2FyZC5zZXQgJiYgY2FyZC5zZXQubmFtZSkgfHwgdGFyZ2V0LnNldE5hbWUgfHwgJycpLHByaWNlOnByaWNlICE9IG51bGwgJiYgTnVtYmVyKHByaWNlKSA+IDAgPyBOdW1iZXIocHJpY2UpIDogKG93bmVkICYmIE51bWJlcihvd25lZC5wcmljZSkgPiAwID8gTnVtYmVyKG93bmVkLnByaWNlKSA6IHRhcmdldC5wcmljZSl9KTsKICAgIH0pOwogICAgaWYgKGhpdHMubGVuZ3RoKSBzaG93Q2hhc2VIaXROb3RpZmljYXRpb24oaGl0cyk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlckNoYXNlTW9kYWwoKXsKICAgIGlmICghZWxzLmNoYXNlQm9keSkgcmV0dXJuOwogICAgdmFyIGJvZHkgPSBlbHMuY2hhc2VCb2R5OyBib2R5LnRleHRDb250ZW50ID0gJyc7CiAgICB2YXIgdGFyZ2V0cyA9IGxvYWRDaGFzZVRhcmdldHMoKTsKICAgIHZhciBvd25lZENhcmRzID0gbG9hZERCKCkuY2FyZHMgfHwge307CiAgICB2YXIgb3duZWQgPSB0YXJnZXRzLmZpbHRlcihmdW5jdGlvbih0KXsgcmV0dXJuICEhb3duZWRDYXJkc1t0LmlkXTsgfSkubGVuZ3RoOwogICAgdmFyIG1pc3NpbmcgPSB0YXJnZXRzLmxlbmd0aCAtIG93bmVkOwogICAgdmFyIHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgc3VtbWFyeS5jbGFzc05hbWUgPSAncGgtY2hhc2Utc3VtbWFyeSc7CiAgICBbW1N0cmluZyh0YXJnZXRzLmxlbmd0aCksJ03hu6VjIHRpw6p1J10sW1N0cmluZyhvd25lZCksJ8SQw6Mgc+G7nyBo4buvdSddLFtTdHJpbmcobWlzc2luZyksJ0PDsm4gcGjhuqNpIHPEg24nXV0uZm9yRWFjaChmdW5jdGlvbihwYWlyKXsKICAgICAgdmFyIGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBib3guY2xhc3NOYW1lID0gJ3BoLXN0YXQnOwogICAgICB2YXIgdmFsdWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgdmFsdWUuY2xhc3NOYW1lID0gJ3BoLXN0YXQtdic7IHZhbHVlLnRleHRDb250ZW50ID0gcGFpclswXTsKICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGxhYmVsLmNsYXNzTmFtZSA9ICdwaC1zdGF0LWwnOyBsYWJlbC50ZXh0Q29udGVudCA9IHBhaXJbMV07CiAgICAgIGJveC5hcHBlbmRDaGlsZCh2YWx1ZSk7IGJveC5hcHBlbmRDaGlsZChsYWJlbCk7IHN1bW1hcnkuYXBwZW5kQ2hpbGQoYm94KTsKICAgIH0pOwogICAgYm9keS5hcHBlbmRDaGlsZChzdW1tYXJ5KTsKCiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKXsKICAgICAgdmFyIGVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGVtcHR5LmNsYXNzTmFtZSA9ICdwaC1jaGFzZS1lbXB0eSc7CiAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gJ0LhuqFuIGNoxrBhIGPDsyBt4bulYyB0acOqdSBuw6BvLiBWw6BvIG3DoG4gaMOsbmggY2jhu41uIHBhY2sg4oaSIOKAnFhlbSBjaGkgdGnhur90IHBhY2vigJ0g4oaSIGLhuqVtIHbDoG8gbeG7mXQgbMOhIGLDoGkg4oaSIGNo4buNbiDigJzwn46vIMSQ4bq3dCBsw6BtIENoYXNlIENhcmTigJ0uIE5o4buvbmcgbMOhIMSRw6MgY8OzIHPhur0gxJHGsOG7o2MgxJHDoW5oIGThuqV1IHThu7EgxJHhu5luZy4nOwogICAgICBib2R5LmFwcGVuZENoaWxkKGVtcHR5KTsgcmV0dXJuOwogICAgfQoKICAgIHZhciBncm91cHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgICB2YXIga2V5ID0gU3RyaW5nKHQuc2V0SWQgfHwgdC5zZXROYW1lIHx8ICd1bmtub3duJyk7CiAgICAgIGlmICghZ3JvdXBzW2tleV0pIGdyb3Vwc1trZXldID0ge25hbWU6dC5zZXROYW1lIHx8ICdC4buZIHRo4bq7IGNoxrBhIHjDoWMgxJHhu4tuaCcsIHRvdGFsOjAsIG93bmVkOjB9OwogICAgICBncm91cHNba2V5XS50b3RhbCsrOwogICAgICBpZiAob3duZWRDYXJkc1t0LmlkXSkgZ3JvdXBzW2tleV0ub3duZWQrKzsKICAgIH0pOwogICAgdmFyIGdyb3VwV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBncm91cFdyYXAuY2xhc3NOYW1lID0gJ3BoLWNoYXNlLXNldC1wcm9ncmVzcy1saXN0JzsKICAgIE9iamVjdC5rZXlzKGdyb3Vwcykuc29ydChmdW5jdGlvbihhLGIpeyByZXR1cm4gZ3JvdXBzW2FdLm5hbWUubG9jYWxlQ29tcGFyZShncm91cHNbYl0ubmFtZSk7IH0pLmZvckVhY2goZnVuY3Rpb24oa2V5KXsKICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzW2tleV07IHZhciBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGl0ZW0uY2xhc3NOYW1lID0gJ3BoLWNoYXNlLXNldC1wcm9ncmVzcyc7CiAgICAgIHZhciB0b3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgdG9wLmNsYXNzTmFtZSA9ICdwaC1jaGFzZS1zZXQtcHJvZ3Jlc3MtdG9wJzsKICAgICAgdmFyIHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyB0aXRsZS5jbGFzc05hbWUgPSAncGgtY2hhc2Utc2V0LW5hbWUnOyB0aXRsZS50ZXh0Q29udGVudCA9IGdyb3VwLm5hbWU7CiAgICAgIHZhciBjb3VudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgY291bnQuY2xhc3NOYW1lID0gJ3BoLWNoYXNlLXNldC1jb3VudCc7IGNvdW50LnRleHRDb250ZW50ID0gZ3JvdXAub3duZWQgKyAnLycgKyBncm91cC50b3RhbCArICcgbeG7pWMgdGnDqnUnOwogICAgICB0b3AuYXBwZW5kQ2hpbGQodGl0bGUpOyB0b3AuYXBwZW5kQ2hpbGQoY291bnQpOyBpdGVtLmFwcGVuZENoaWxkKHRvcCk7CiAgICAgIHZhciB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyB0cmFjay5jbGFzc05hbWUgPSAncGgtY2hhc2Utc2V0LXRyYWNrJzsgdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IGZpbGwuY2xhc3NOYW1lID0gJ3BoLWNoYXNlLXNldC1maWxsJzsKICAgICAgZmlsbC5zdHlsZS53aWR0aCA9IChncm91cC50b3RhbCA/IE1hdGgucm91bmQoZ3JvdXAub3duZWQgLyBncm91cC50b3RhbCAqIDEwMCkgOiAwKSArICclJzsgdHJhY2suYXBwZW5kQ2hpbGQoZmlsbCk7IGl0ZW0uYXBwZW5kQ2hpbGQodHJhY2spOyBncm91cFdyYXAuYXBwZW5kQ2hpbGQoaXRlbSk7CiAgICB9KTsKICAgIGJvZHkuYXBwZW5kQ2hpbGQoZ3JvdXBXcmFwKTsKCiAgICB2YXIgc2VhcmNoV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBzZWFyY2hXcmFwLmNsYXNzTmFtZSA9ICdwaC1jaGFzZS1zZWFyY2gtd3JhcCc7CiAgICB2YXIgc2VhcmNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsgc2VhcmNoLnR5cGU9J3NlYXJjaCc7IHNlYXJjaC5jbGFzc05hbWU9J3BoLWNoYXNlLXNlYXJjaCc7IHNlYXJjaC5wbGFjZWhvbGRlcj0nVMOsbSBsw6EgbeG7pWMgdGnDqnUgaG/hurdjIHTDqm4gYuG7meKApic7IHNlYXJjaC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdUw6xtIENoYXNlIENhcmQnKTsKICAgIHNlYXJjaFdyYXAuYXBwZW5kQ2hpbGQoc2VhcmNoKTsgYm9keS5hcHBlbmRDaGlsZChzZWFyY2hXcmFwKTsKICAgIHZhciBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGxpc3QuY2xhc3NOYW1lID0gJ3BoLWNoYXNlLWxpc3QnOwogICAgdGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgICB2YXIgY2FyZE93bmVkID0gISFvd25lZENhcmRzW3QuaWRdOwogICAgICB2YXIgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FydGljbGUnKTsgaXRlbS5jbGFzc05hbWUgPSAncGgtY2hhc2UtaXRlbScgKyAoY2FyZE93bmVkID8gJyBwaC1jaGFzZS1vd25lZCcgOiAnJyk7CiAgICAgIGl0ZW0uZGF0YXNldC5zZWFyY2ggPSAoU3RyaW5nKHQubmFtZXx8JycpICsgJyAnICsgU3RyaW5nKHQuc2V0TmFtZXx8JycpICsgJyAnICsgU3RyaW5nKHQuaWR8fCcnKSkudG9Mb2NhbGVMb3dlckNhc2UoKTsKICAgICAgdmFyIGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBhcnQuY2xhc3NOYW1lPSdwaC1jaGFzZS1hcnQnOwogICAgICB2YXIgaW1nVXJsID0gY2hhc2VJbWFnZVVybCh0LmltYWdlLCdsb3cud2VicCcpOwogICAgICBpZiAoaW1nVXJsKXsgdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOyBpbWcuc3JjPWltZ1VybDsgaW1nLmFsdD10Lm5hbWUgfHwgJyc7IGltZy5sb2FkaW5nPSdsYXp5JzsgaW1nLm9uZXJyb3I9ZnVuY3Rpb24oKXsgaW1nLnJlbW92ZSgpOyBhcnQudGV4dENvbnRlbnQ9J/CfjrQnOyB9OyBhcnQuYXBwZW5kQ2hpbGQoaW1nKTsgfQogICAgICBlbHNlIGFydC50ZXh0Q29udGVudD0n8J+OtCc7CiAgICAgIHZhciBtYWluID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IG1haW4uY2xhc3NOYW1lPSdwaC1jaGFzZS1pdGVtLW1haW4nOwogICAgICB2YXIgbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBuYW1lLmNsYXNzTmFtZT0ncGgtY2hhc2UtaXRlbS1uYW1lJzsgbmFtZS50ZXh0Q29udGVudD10Lm5hbWUgfHwgdC5pZDsKICAgICAgdmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbWV0YS5jbGFzc05hbWU9J3BoLWNoYXNlLWl0ZW0tbWV0YSc7IG1ldGEudGV4dENvbnRlbnQ9KHQuc2V0TmFtZSB8fCAnQuG7mSBjaMawYSB4w6FjIMSR4buLbmgnKSArICh0LnJhcml0eSA/ICcgwrcgJyArIHQucmFyaXR5IDogJycpOwogICAgICB2YXIgcHJpY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgcHJpY2UuY2xhc3NOYW1lPSdwaC1jaGFzZS1pdGVtLXByaWNlJzsgcHJpY2UudGV4dENvbnRlbnQ9dC5wcmljZSA/IG1vbmV5KHQucHJpY2UpIDogJ0NoxrBhIGPDsyBnacOhIHRoYW0ga2jhuqNvJzsKICAgICAgdmFyIHN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgc3RhdHVzLmNsYXNzTmFtZT0ncGgtY2hhc2Utc3RhdHVzICcgKyAoY2FyZE93bmVkID8gJ3BoLWNoYXNlLXN0YXR1cy1vd25lZCcgOiAncGgtY2hhc2Utc3RhdHVzLW1pc3NpbmcnKTsgc3RhdHVzLnRleHRDb250ZW50PWNhcmRPd25lZCA/ICfinJMgxJDDgyBDw5MnIDogJ+KXjiDEkEFORyBTxIJOJzsKICAgICAgbWFpbi5hcHBlbmRDaGlsZChuYW1lKTsgbWFpbi5hcHBlbmRDaGlsZChtZXRhKTsgbWFpbi5hcHBlbmRDaGlsZChwcmljZSk7IG1haW4uYXBwZW5kQ2hpbGQoc3RhdHVzKTsKICAgICAgdmFyIHJlbW92ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyByZW1vdmUudHlwZT0nYnV0dG9uJzsgcmVtb3ZlLmNsYXNzTmFtZT0ncGgtY2hhc2UtcmVtb3ZlJzsgcmVtb3ZlLnRleHRDb250ZW50PSdC4buPIG3hu6VjIHRpw6p1JzsgcmVtb3ZlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpeyByZW1vdmVDaGFzZVRhcmdldCh0LmlkKTsgdG9hc3QoJ8SQw6MgYuG7jyAnICsgKHQubmFtZSB8fCAnbMOhIGLDoGknKSArICcga2jhu49pIENoYXNlIENhcmQuJyk7IH0pOwogICAgICBpdGVtLmFwcGVuZENoaWxkKGFydCk7IGl0ZW0uYXBwZW5kQ2hpbGQobWFpbik7IGl0ZW0uYXBwZW5kQ2hpbGQocmVtb3ZlKTsgbGlzdC5hcHBlbmRDaGlsZChpdGVtKTsKICAgIH0pOwogICAgc2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxmdW5jdGlvbigpewogICAgICB2YXIgcSA9IFN0cmluZyhzZWFyY2gudmFsdWUgfHwgJycpLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW8yALc2vXS9nLCcnKS5yZXBsYWNlKC/EkS9nLCdkJykucmVwbGFjZSgvxJAvZywnRCcpLnRvTG93ZXJDYXNlKCkudHJpbSgpOwogICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGxpc3QuY2hpbGRyZW4sZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgdmFyIHRleHQgPSBTdHJpbmcoaXRlbS5kYXRhc2V0LnNlYXJjaCB8fCAnJykubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bzIAtza9dL2csJycpLnJlcGxhY2UoL8SRL2csJ2QnKS5yZXBsYWNlKC/EkC9nLCdEJykudG9Mb3dlckNhc2UoKTsKICAgICAgICBpdGVtLmhpZGRlbiA9ICEhcSAmJiB0ZXh0LmluZGV4T2YocSkgPCAwOwogICAgICB9KTsKICAgIH0pOwogICAgYm9keS5hcHBlbmRDaGlsZChsaXN0KTsKICAgIHZhciBub3RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IG5vdGUuY2xhc3NOYW1lPSdwaC1jaGFzZS1ub3RlJzsgbm90ZS50ZXh0Q29udGVudD0nQ2hhc2UgQ2FyZCDEkcaw4bujYyBsxrB1IHRyw6puIHRyw6xuaCBkdXnhu4d0IGhp4buHbiB04bqhaS4gS2hpIG3hu58gdHLDum5nIG3hu5l0IGzDoSDEkcOjIMSRw6FuaCBk4bqldSwgdG9vbCBz4bq9IGhp4buHbiBs4budaSBjaMO6YyBt4burbmcgdsOgIG7DunQgY2hpYSBz4bq7Lic7IGJvZHkuYXBwZW5kQ2hpbGQobm90ZSk7CiAgfQogIGZ1bmN0aW9uIG9wZW5DaGFzZU1vZGFsKCl7IHJlbmRlckNoYXNlTW9kYWwoKTsgaWYgKGVscy5jaGFzZU1vZGFsKSBlbHMuY2hhc2VNb2RhbC5oaWRkZW4gPSBmYWxzZTsgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7IH0KICBmdW5jdGlvbiBjbG9zZUNoYXNlTW9kYWwoKXsgaWYgKGVscy5jaGFzZU1vZGFsKSBlbHMuY2hhc2VNb2RhbC5oaWRkZW4gPSB0cnVlOyBpZiAoZWxzLmNoYXNlQm9keSkgZWxzLmNoYXNlQm9keS50ZXh0Q29udGVudCA9ICcnOyBzZXRNb2RhbFZpZXdwb3J0T3BlbihmYWxzZSk7IH0KICBpZiAoZWxzLmNoYXNlQnRuKSBlbHMuY2hhc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuQ2hhc2VNb2RhbCk7CiAgaWYgKGVscy5jaGFzZUNsb3NlKSBlbHMuY2hhc2VDbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQ2hhc2VNb2RhbCk7CiAgaWYgKGVscy5jaGFzZUJhY2tkcm9wKSBlbHMuY2hhc2VCYWNrZHJvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQ2hhc2VNb2RhbCk7CiAgdXBkYXRlQ2hhc2VCYWRnZSgpOwoKICBmdW5jdGlvbiByZWNvcmRQYWNrcyhjYXJkcywgcGFja3MpewogICAgdmFyIGQgPSBsb2FkREIoKTsKICAgIGQucGFja3MgKz0gcGFja3M7CiAgICBkLnNwZW50ICs9IHBhY2tzICogZC5wYWNrUHJpY2U7CiAgICBjYXJkcy5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICBpZiAoIWMgfHwgIWMuaWQpIHJldHVybjsKICAgICAgdmFyIHVzZCA9IHByaWNlVVNEKGMsIChjLnNldCAmJiBjLnNldC5pZCkgfHwgKHN0YXRlLmN1cnJlbnQgJiYgc3RhdGUuY3VycmVudC5pZCkpOwogICAgICB2YXIgZSA9IGQuY2FyZHNbYy5pZF07CiAgICAgIHZhciBzZXRJZCA9IChjLnNldCAmJiBjLnNldC5pZCkgfHwgKHN0YXRlLmN1cnJlbnQgJiYgc3RhdGUuY3VycmVudC5pZCkgfHwgJyc7CiAgICAgIHZhciBzZXROYW1lID0gKGMuc2V0ICYmIGMuc2V0Lm5hbWUpIHx8IChzdGF0ZS5jdXJyZW50ICYmIHN0YXRlLmN1cnJlbnQubmFtZSkgfHwgJyc7CiAgICAgIHZhciBsb2NhbElkID0gYy5sb2NhbElkICE9IG51bGwgPyBTdHJpbmcoYy5sb2NhbElkKSA6ICcnOwoKICAgICAgaWYgKGUpewogICAgICAgIGUubisrOwogICAgICAgIGlmICh1c2QgIT0gbnVsbCkgZS5wcmljZSA9IHVzZDsKICAgICAgICBpZiAoc2V0SWQgJiYgIWUuc2V0SWQpIGUuc2V0SWQgPSBzZXRJZDsKICAgICAgICBpZiAoc2V0TmFtZSAmJiAhZS5zZXQpIGUuc2V0ID0gc2V0TmFtZTsKICAgICAgICBpZiAobG9jYWxJZCAmJiAhZS5sb2NhbElkKSBlLmxvY2FsSWQgPSBsb2NhbElkOwogICAgICAgIGlmIChjLmltYWdlICYmICFlLmltZykgZS5pbWcgPSBjLmltYWdlOwogICAgICAgIGlmIChjLnJhcml0eSAmJiAhZS5yYXJpdHkpIGUucmFyaXR5ID0gYy5yYXJpdHk7CiAgICAgICAgaWYgKGUudGllciA9PSBudWxsKSBlLnRpZXIgPSByYXJpdHlUaWVyKGMucmFyaXR5KS50aWVyOwogICAgICB9IGVsc2UgewogICAgICAgIGQuY2FyZHNbYy5pZF0gPSB7CiAgICAgICAgICBpZDogYy5pZCwgbmFtZTogYy5uYW1lIHx8ICcnLCBpbWc6IGMuaW1hZ2UgfHwgJycsCiAgICAgICAgICByYXJpdHk6IGMucmFyaXR5IHx8ICcnLCB0aWVyOiByYXJpdHlUaWVyKGMucmFyaXR5KS50aWVyLAogICAgICAgICAgcHJpY2U6IHVzZCwgbjogMSwgc2V0OiBzZXROYW1lLCBzZXRJZDogc2V0SWQsIGxvY2FsSWQ6IGxvY2FsSWQsCiAgICAgICAgICB0OiBEYXRlLm5vdygpCiAgICAgICAgfTsKICAgICAgfQogICAgfSk7CiAgICBzYXZlREIoKTsKICAgIHVwZGF0ZUNoYXNlQmFkZ2UoKTsKICAgIGlmIChlbHMuY2hhc2VNb2RhbCAmJiAhZWxzLmNoYXNlTW9kYWwuaGlkZGVuKSByZW5kZXJDaGFzZU1vZGFsKCk7CiAgICB0cnkgeyBoYW5kbGVDaGFzZVB1bGwoY2FyZHMpOyB9IGNhdGNoKGNoYXNlUHVsbEVycm9yKSB7IGNvbnNvbGUud2FybignW0NoYXNlIENhcmRdIEtow7RuZyB44butIGzDvSDEkcaw4bujYyBsxrDhu6N0IHPEg246JywgY2hhc2VQdWxsRXJyb3IpOyB9CiAgICAvKiBFbWl0IHBhY2sgcmVzdWx0IG1ldGFkYXRhIGZvciB0aGUgb3B0aW9uYWwgY29tbXVuaXR5IExpdmUgUHVsbCBGZWVkIGFkZC1vbi4gKi8KICAgIHRyeSB7CiAgICAgIHZhciBwaEZlZWRDYXJkcyA9IGNhcmRzLm1hcChmdW5jdGlvbihjKXsKICAgICAgICB2YXIgcGhTZXRJZCA9IChjICYmIGMuc2V0ICYmIGMuc2V0LmlkKSB8fCAoc3RhdGUuY3VycmVudCAmJiBzdGF0ZS5jdXJyZW50LmlkKSB8fCAnJzsKICAgICAgICB2YXIgcGhTZXROYW1lID0gKGMgJiYgYy5zZXQgJiYgYy5zZXQubmFtZSkgfHwgKHN0YXRlLmN1cnJlbnQgJiYgc3RhdGUuY3VycmVudC5uYW1lKSB8fCAnJzsKICAgICAgICB2YXIgcGhSYXJpdHkgPSByYXJpdHlUaWVyKGMgJiYgYy5yYXJpdHkpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpZDogU3RyaW5nKChjICYmIGMuaWQpIHx8ICcnKSwKICAgICAgICAgIG5hbWU6IFN0cmluZygoYyAmJiBjLm5hbWUpIHx8ICcnKSwKICAgICAgICAgIGltYWdlOiBTdHJpbmcoKGMgJiYgYy5pbWFnZSkgfHwgJycpLAogICAgICAgICAgcmFyaXR5OiBTdHJpbmcoKGMgJiYgYy5yYXJpdHkpIHx8ICcnKSwKICAgICAgICAgIHRpZXI6IE51bWJlcihwaFJhcml0eS50aWVyKSB8fCAwLAogICAgICAgICAgdGllckxhYmVsOiBTdHJpbmcocGhSYXJpdHkubGFiZWwgfHwgJycpLAogICAgICAgICAgcHJpY2U6IHByaWNlVVNEKGMsIHBoU2V0SWQpLAogICAgICAgICAgc2V0OiBTdHJpbmcocGhTZXROYW1lIHx8ICcnKQogICAgICAgIH07CiAgICAgIH0pOwogICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3Bva2VodWI6cGFja3MtcmVjb3JkZWQnLCB7CiAgICAgICAgZGV0YWlsOiB7IHBhY2tzOiBOdW1iZXIocGFja3MpIHx8IDEsIHBhY2tQcmljZTogTnVtYmVyKGQucGFja1ByaWNlKSB8fCBERUZBVUxUX1BBQ0tfUFJJQ0UsIHNldElkOiBTdHJpbmcoKHN0YXRlLmN1cnJlbnQgJiYgc3RhdGUuY3VycmVudC5pZCkgfHwgKGNhcmRzWzBdICYmIGNhcmRzWzBdLnNldCAmJiBjYXJkc1swXS5zZXQuaWQpIHx8ICcnKSwgc2V0TmFtZTogU3RyaW5nKChzdGF0ZS5jdXJyZW50ICYmIHN0YXRlLmN1cnJlbnQubmFtZSkgfHwgKGNhcmRzWzBdICYmIGNhcmRzWzBdLnNldCAmJiBjYXJkc1swXS5zZXQubmFtZSkgfHwgJycpLCBjYXJkczogcGhGZWVkQ2FyZHMgfQogICAgICB9KSk7CiAgICB9IGNhdGNoIChwaEZlZWRFdmVudEVycm9yKSB7fQogICAgcGhMYlN5bmNTdGF0cygpOwogICAgdXBkYXRlQ29sQmFkZ2UoKTsKICAgIHVwZGF0ZUN1cnJlbnRTZXRQcm9ncmVzcygpOwogICAgaWYgKHN0YXRlLmV4cGFuc2lvbnMgJiYgc3RhdGUuZXhwYW5zaW9ucy5sZW5ndGgpewogICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVscy5ncmlkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5waC1leHAtY2FyZCcpLCBmdW5jdGlvbihjYXJkRWwpewogICAgICAgIHZhciBpZCA9IGNhcmRFbC5kYXRhc2V0LnNldElkOwogICAgICAgIGlmICghaWQpIHJldHVybjsKICAgICAgICB2YXIgZm91bmQgPSBzdGF0ZS5leHBhbnNpb25zLmZpbmQoZnVuY3Rpb24oeCl7IHJldHVybiB4LnNldCAmJiBTdHJpbmcoeC5zZXQuaWQpID09PSBTdHJpbmcoaWQpOyB9KTsKICAgICAgICBpZiAoZm91bmQpIHVwZGF0ZUV4cGFuc2lvblByb2dyZXNzQ2FyZChjYXJkRWwsIGZvdW5kLnNldCk7CiAgICAgIH0pOwogICAgfQogICAgdXBkYXRlQ2hhbGxlbmdlQmFkZ2UoKTsKICB9CgogIGZ1bmN0aW9uIGVudHJ5QmVsb25nc1RvU2V0KGUsIHNldCl7CiAgICBpZiAoIWUgfHwgIXNldCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGUuc2V0SWQgJiYgU3RyaW5nKGUuc2V0SWQpID09PSBTdHJpbmcoc2V0LmlkKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gISEoZS5zZXQgJiYgc2V0Lm5hbWUgJiYgZS5zZXQgPT09IHNldC5uYW1lKTsKICB9CgogIGZ1bmN0aW9uIHNldFByb2dyZXNzRGF0YShzZXQsIHBvb2wpewogICAgdmFyIGQgPSBsb2FkREIoKSwgb3duZWQgPSB7fSwgZW50cmllcyA9IFtdOwogICAgT2JqZWN0LmtleXMoZC5jYXJkcykuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgIHZhciBlID0gZC5jYXJkc1tpZF07CiAgICAgIGlmIChlbnRyeUJlbG9uZ3NUb1NldChlLCBzZXQpKXsKICAgICAgICBvd25lZFtpZF0gPSBlOwogICAgICAgIGVudHJpZXMucHVzaChlKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHRvdGFsID0gTnVtYmVyKHNldCAmJiBzZXQuY2FyZENvdW50ICYmIHNldC5jYXJkQ291bnQudG90YWwpIHx8IChwb29sID8gcG9vbC5sZW5ndGggOiAwKTsKICAgIHZhciB1bmlxdWUgPSBPYmplY3Qua2V5cyhvd25lZCkubGVuZ3RoOwogICAgdmFyIHBjdERvbmUgPSB0b3RhbCA+IDAgPyBNYXRoLnJvdW5kKHVuaXF1ZSAvIHRvdGFsICogMTAwKSA6IDA7CgogICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgIGlmIChBcnJheS5pc0FycmF5KHBvb2wpICYmIHBvb2wubGVuZ3RoKXsKICAgICAgcG9vbC5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICAgIGlmIChjICYmIGMuaWQgJiYgIW93bmVkW2MuaWRdKSBtaXNzaW5nLnB1c2goYyk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHt0b3RhbDp0b3RhbCwgdW5pcXVlOnVuaXF1ZSwgcGN0OnBjdERvbmUsIG1pc3Npbmc6bWlzc2luZywgZW50cmllczplbnRyaWVzfTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUV4cGFuc2lvblByb2dyZXNzQ2FyZChjYXJkRWwsIHNldCl7CiAgICBpZiAoIWNhcmRFbCB8fCAhc2V0KSByZXR1cm47CiAgICB2YXIgZCA9IHNldFByb2dyZXNzRGF0YShzZXQpOwogICAgdmFyIHByb2cgPSBjYXJkRWwucXVlcnlTZWxlY3RvcignLnBoLWV4cC1wcm9ncmVzcycpOwogICAgdmFyIGZpbGwgPSBjYXJkRWwucXVlcnlTZWxlY3RvcignLnBoLWV4cC1wcm9ncmVzcy1maWxsJyk7CiAgICB2YXIgbWV0YSA9IGNhcmRFbC5xdWVyeVNlbGVjdG9yKCcucGgtZXhwLXByb2dyZXNzLW1ldGEnKTsKICAgIGlmICghcHJvZyB8fCAhZmlsbCB8fCAhbWV0YSkgcmV0dXJuOwogICAgcHJvZy5oaWRkZW4gPSBmYWxzZTsKICAgIHByb2cuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBmaWxsLnN0eWxlLndpZHRoID0gTWF0aC5taW4oMTAwLCBkLnBjdCkgKyAnJSc7CiAgICBtZXRhLnRleHRDb250ZW50ID0gZC51bmlxdWUgKyAnLycgKyBkLnRvdGFsICsgJyBsw6EgwrcgJyArIGQucGN0ICsgJyUnOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlQ3VycmVudFNldFByb2dyZXNzKCl7CiAgICBpZiAoIWVscy5zZXRQcm9ncmVzcyB8fCAhc3RhdGUuY3VycmVudCkgcmV0dXJuOwogICAgdmFyIGQgPSBzZXRQcm9ncmVzc0RhdGEoc3RhdGUuY3VycmVudCwgc3RhdGUucG9vbCk7CiAgICBlbHMuc2V0UHJvZ3Jlc3MuaGlkZGVuID0gZmFsc2U7CiAgICBlbHMuc2V0UHJvZ3Jlc3NUaXRsZS50ZXh0Q29udGVudCA9IHN0YXRlLmN1cnJlbnQubmFtZSB8fCAnQuG7mSB0aOG6uyBoaeG7h24gdOG6oWknOwogICAgZWxzLnNldFByb2dyZXNzTWV0YS50ZXh0Q29udGVudCA9IGQudW5pcXVlICsgJy8nICsgZC50b3RhbCArICcgbMOhJzsKICAgIGVscy5zZXRQcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9IE1hdGgubWluKDEwMCwgZC5wY3QpICsgJyUnOwogICAgZWxzLnNldFByb2dyZXNzUGN0LnRleHRDb250ZW50ID0gZC5wY3QgKyAnJSc7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJDdXJyZW50U2V0TWlzc2luZ0luQ29sbGVjdGlvbigpewogICAgaWYgKCFzdGF0ZS5jdXJyZW50IHx8ICFzdGF0ZS5wb29sIHx8ICFzdGF0ZS5wb29sLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICB2YXIgZCA9IHNldFByb2dyZXNzRGF0YShzdGF0ZS5jdXJyZW50LCBzdGF0ZS5wb29sKTsKICAgIHZhciB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB3cmFwLmNsYXNzTmFtZSA9ICdwaC1jb2xsZWN0aW9uLXNldC1kZXRhaWwnOwoKICAgIHZhciBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBoZWFkLmNsYXNzTmFtZSA9ICdwaC1jb2xsZWN0aW9uLXNldC1kZXRhaWwtaGVhZCc7CiAgICB2YXIgbGVmdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdmFyIHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB0aXRsZS5jbGFzc05hbWUgPSAncGgtY29sbGVjdGlvbi1zZXQtZGV0YWlsLXRpdGxlJzsKICAgIHRpdGxlLnRleHRDb250ZW50ID0gc3RhdGUuY3VycmVudC5uYW1lIHx8ICdC4buZIMSRYW5nIG3hu58nOwogICAgdmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG1ldGEuY2xhc3NOYW1lID0gJ3BoLWNvbGxlY3Rpb24tc2V0LWRldGFpbC1tZXRhJzsKICAgIG1ldGEudGV4dENvbnRlbnQgPSBkLnVuaXF1ZSArICcvJyArIGQudG90YWwgKyAnIGzDoSDEkcOjIGPDsyc7CiAgICBsZWZ0LmFwcGVuZENoaWxkKHRpdGxlKTsKICAgIGxlZnQuYXBwZW5kQ2hpbGQobWV0YSk7CiAgICB2YXIgcGN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHBjdEVsLmNsYXNzTmFtZSA9ICdwaC1jb2xsZWN0aW9uLXNldC1kZXRhaWwtcGN0JzsKICAgIHBjdEVsLnRleHRDb250ZW50ID0gZC5wY3QgKyAnJSc7CiAgICBoZWFkLmFwcGVuZENoaWxkKGxlZnQpOwogICAgaGVhZC5hcHBlbmRDaGlsZChwY3RFbCk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGhlYWQpOwoKICAgIHZhciB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdHJhY2suY2xhc3NOYW1lID0gJ3BoLWNvbGxlY3Rpb24tc2V0LWRldGFpbC10cmFjayc7CiAgICB2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZmlsbC5jbGFzc05hbWUgPSAncGgtY29sbGVjdGlvbi1zZXQtZGV0YWlsLWZpbGwnOwogICAgZmlsbC5zdHlsZS53aWR0aCA9IE1hdGgubWluKDEwMCwgZC5wY3QpICsgJyUnOwogICAgdHJhY2suYXBwZW5kQ2hpbGQoZmlsbCk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHRyYWNrKTsKCiAgICB2YXIgbWggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG1oLmNsYXNzTmFtZSA9ICdwaC1jb2xsZWN0aW9uLW1pc3NpbmctaGVhZCc7CiAgICB2YXIgbWMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBtYy5jbGFzc05hbWUgPSAncGgtY29sbGVjdGlvbi1taXNzaW5nLWNvdW50JzsKICAgIG1jLnRleHRDb250ZW50ID0gZC5taXNzaW5nLmxlbmd0aCA/ICdDw7JuIHRoaeG6v3UgJyArIGQubWlzc2luZy5sZW5ndGggKyAnIGzDoScgOiAnxJDDoyBob8OgbiB0aGnhu4duIDEwMCUnOwogICAgdmFyIG1uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgbW4uY2xhc3NOYW1lID0gJ3BoLWNvbGxlY3Rpb24tbWlzc2luZy1ub3RlJzsKICAgIG1uLnRleHRDb250ZW50ID0gJ0LhuqVtIHbDoG8gbMOhIMSR4buDIHhlbSBjaGkgdGnhur90JzsKICAgIG1oLmFwcGVuZENoaWxkKG1jKTsKICAgIG1oLmFwcGVuZENoaWxkKG1uKTsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobWgpOwoKICAgIGlmICghZC5taXNzaW5nLmxlbmd0aCl7CiAgICAgIHZhciBkb25lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGRvbmUuY2xhc3NOYW1lID0gJ3BoLW1pc3NpbmctZW1wdHknOwogICAgICBkb25lLmlubmVySFRNTCA9ICc8c3Bhbj7inJM8L3NwYW4+IELhuqFuIMSRw6Mgc8awdSB04bqnbSDEkeG7pyB0b8OgbiBi4buZIGzDoSB0cm9uZyBi4buZIG7DoHkuJzsKICAgICAgd3JhcC5hcHBlbmRDaGlsZChkb25lKTsKICAgICAgcmV0dXJuIHdyYXA7CiAgICB9CgogICAgdmFyIGdyaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGdyaWQuY2xhc3NOYW1lID0gJ3BoLW1pc3NpbmctZ3JpZCc7CiAgICBkLm1pc3NpbmcuZm9yRWFjaChmdW5jdGlvbihjKXsKICAgICAgdmFyIGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgaXRlbS50eXBlID0gJ2J1dHRvbic7CiAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3BoLW1pc3NpbmctY2FyZCc7CiAgICAgIGl0ZW0udGl0bGUgPSAnQ2jGsGEgY8OzIMK3ICcgKyAoYy5uYW1lIHx8ICcnKTsKICAgICAgdmFyIGltZ1dyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIGltZ1dyYXAuY2xhc3NOYW1lID0gJ3BoLW1pc3NpbmctaW1nJzsKICAgICAgaWYgKGMuaW1hZ2UpewogICAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICBpbWcubG9hZGluZyA9ICdsYXp5JzsKICAgICAgICBpbWcuYWx0ID0gYy5uYW1lIHx8ICcnOwogICAgICAgIGltZy5zcmMgPSBjLmltYWdlICsgJy8nICsgUVVBTElUWTsKICAgICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uKCl7IGltZy5yZW1vdmUoKTsgaW1nV3JhcC50ZXh0Q29udGVudCA9IGMubmFtZSB8fCAnPyc7IH07CiAgICAgICAgaW1nV3JhcC5hcHBlbmRDaGlsZChpbWcpOwogICAgICB9IGVsc2UgaW1nV3JhcC50ZXh0Q29udGVudCA9IGMubmFtZSB8fCAnPyc7CiAgICAgIHZhciB0eHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIHR4dC5jbGFzc05hbWUgPSAncGgtbWlzc2luZy1uYW1lJzsKICAgICAgdHh0LnRleHRDb250ZW50ID0gW2MubG9jYWxJZCB8fCAnJywgYy5uYW1lIHx8ICdDaMawYSByw7UgdMOqbiddLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoaW1nV3JhcCk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQodHh0KTsKICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgb3BlbkNhcmRNb2RhbChjLCByYXJpdHlUaWVyKGMucmFyaXR5KSwgcHJpY2VVU0QoYywgc3RhdGUuY3VycmVudCkpOwogICAgICB9KTsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChpdGVtKTsKICAgIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChncmlkKTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gbm92ZWx0eUxhYmVsKGNhcmQsIGJlZm9yZURCKXsKICAgIHZhciBkID0gYmVmb3JlREIgfHwgbG9hZERCKCk7CiAgICB2YXIgZSA9IGQuY2FyZHNbY2FyZCAmJiBjYXJkLmlkXTsKICAgIGlmICghZSkgcmV0dXJuIHt0ZXh0OidN4bubaSEnLCBjbHM6J3BoLW5ldyd9OwogICAgcmV0dXJuIHt0ZXh0OifDlycgKyAoKE51bWJlcihlLm4pIHx8IDApICsgMSksIGNsczoncGgtZHVwbGljYXRlJ307CiAgfQoKICBmdW5jdGlvbiBhZGROb3ZlbHR5QmFkZ2UoZnJvbnQsIG5vdmVsdHkpewogICAgaWYgKCFmcm9udCB8fCAhbm92ZWx0eSkgcmV0dXJuOwogICAgdmFyIGJhZGdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgYmFkZ2UuY2xhc3NOYW1lID0gJ3BoLW5vdmVsdHktYmFkZ2UgJyArIG5vdmVsdHkuY2xzOwogICAgYmFkZ2UudGV4dENvbnRlbnQgPSBub3ZlbHR5LnRleHQ7CiAgICBmcm9udC5hcHBlbmRDaGlsZChiYWRnZSk7CiAgfQoKICBmdW5jdGlvbiBjb2xsZWN0aW9uU3RhdHMoKXsKICAgIHZhciBkID0gbG9hZERCKCksIGlkcyA9IE9iamVjdC5rZXlzKGQuY2FyZHMpOwogICAgdmFyIHZhbCA9IDAsIGNudCA9IDAsIHByaWNlZCA9IDAsIGJlc3QgPSBudWxsLCB0aWVycyA9IFswLDAsMCwwLDAsMCwwXTsKICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGspewogICAgICB2YXIgZSA9IGQuY2FyZHNba107CiAgICAgIGNudCArPSBlLm47CiAgICAgIHRpZXJzW01hdGgubWF4KDAsIE1hdGgubWluKDYsIGUudGllciB8fCAwKSldICs9IGUubjsKICAgICAgaWYgKHR5cGVvZiBlLnByaWNlID09PSAnbnVtYmVyJyl7CiAgICAgICAgdmFsICs9IGUucHJpY2UgKiBlLm47CiAgICAgICAgcHJpY2VkICs9IGUubjsKICAgICAgICBpZiAoIWJlc3QgfHwgZS5wcmljZSA+IGJlc3QucHJpY2UpIGJlc3QgPSBlOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHVuaXF1ZTogaWRzLmxlbmd0aCwgY2FyZHM6IGNudCwgdmFsdWU6IHZhbCwgcHJpY2VkOiBwcmljZWQsCiAgICAgIHNwZW50OiBkLnNwZW50LCBwYWNrczogZC5wYWNrcywgcGFja1ByaWNlOiBkLnBhY2tQcmljZSwKICAgICAgcm9pOiBkLnNwZW50ID4gMCA/ICh2YWwgLSBkLnNwZW50KSAvIGQuc3BlbnQgKiAxMDAgOiBudWxsLAogICAgICBiZXN0OiBiZXN0LCB0aWVyczogdGllcnMKICAgIH07CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDb2xCYWRnZSgpewogICAgdmFyIHMgPSBjb2xsZWN0aW9uU3RhdHMoKTsKICAgIGVscy5jb2xDb3VudC50ZXh0Q29udGVudCA9IHMuY2FyZHMgPyBTdHJpbmcocy5jYXJkcykgOiAnJzsKICAgIGVscy5jb2xDb3VudC5oaWRkZW4gPSAhcy5jYXJkczsKICB9CgogIHZhciBUSUVSX05BTUVTID0gWydUaMaw4budbmcnLCdVbmNvbW1vbicsJ0hp4bq/bScsJ1VsdHJhJywnRnVsbCBBcnQgLyBTdGFyJywnxJDhurdjIGJp4buHdCcsJ0NoYXNlJ107CiAgZnVuY3Rpb24gdGllckxhYmVsVGV4dCh0aWVyKXsgcmV0dXJuIFRJRVJfTkFNRVNbTWF0aC5tYXgoMCwgTWF0aC5taW4oNiwgdGllcikpXTsgfQoKICBmdW5jdGlvbiBzdGF0Qm94KGxhYmVsLCB2YWx1ZSwgY2xzKXsKICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBiLmNsYXNzTmFtZSA9ICdwaC1zdGF0JyArIChjbHMgPyAnICcgKyBjbHMgOiAnJyk7CiAgICB2YXIgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyB2LmNsYXNzTmFtZSA9ICdwaC1zdGF0LXYnOyB2LnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB2YXIgbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBsLmNsYXNzTmFtZSA9ICdwaC1zdGF0LWwnOyBsLnRleHRDb250ZW50ID0gbGFiZWw7CiAgICBiLmFwcGVuZENoaWxkKHYpOyBiLmFwcGVuZENoaWxkKGwpOwogICAgcmV0dXJuIGI7CiAgfQoKICBmdW5jdGlvbiByb2lDbGFzcyhyb2kpewogICAgaWYgKHJvaSA9PSBudWxsKSByZXR1cm4gJyc7CiAgICByZXR1cm4gcm9pID49IDAgPyAncGgtcG9zJyA6ICdwaC1uZWcnOwogIH0KCiAgZnVuY3Rpb24gY2FyZFRodW1iKGVudHJ5LCBvbkNsaWNrKXsKICAgIHZhciBjb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbC5jbGFzc05hbWUgPSAncGgtdGh1bWInOwogICAgdmFyIGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYm94LmNsYXNzTmFtZSA9ICdwaC10aHVtYi1pbWcnOwogICAgYm94LmRhdGFzZXQudGllciA9IFN0cmluZyhlbnRyeS50aWVyIHx8IDApOwogICAgaWYgKGVudHJ5LmltZyl7CiAgICAgIHZhciBpbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICBpbS5sb2FkaW5nID0gJ2xhenknOwogICAgICBpbS5hbHQgPSBlbnRyeS5uYW1lIHx8ICcnOwogICAgICBpbS5zcmMgPSBlbnRyeS5pbWcgKyAnLycgKyBRVUFMSVRZOwogICAgICBpbS5vbmVycm9yID0gZnVuY3Rpb24oKXsgYm94LnRleHRDb250ZW50ID0gZW50cnkubmFtZSB8fCAnPyc7IH07CiAgICAgIGJveC5hcHBlbmRDaGlsZChpbSk7CiAgICB9IGVsc2UgewogICAgICBib3gudGV4dENvbnRlbnQgPSBlbnRyeS5uYW1lIHx8ICc/JzsKICAgIH0KICAgIGlmIChlbnRyeS5uZXdGcm9tU2hvcCl7CiAgICAgIHZhciBzaG9wTmV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICBzaG9wTmV3LmNsYXNzTmFtZSA9ICdwaC1ub3ZlbHR5LWJhZGdlIHBoLW5ldyBwaC1zaG9wLW5ldy1iYWRnZSc7CiAgICAgIHNob3BOZXcudGV4dENvbnRlbnQgPSAnTeG7m2knOwogICAgICBib3guYXBwZW5kQ2hpbGQoc2hvcE5ldyk7CiAgICB9CiAgICB2YXIgbm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG5tLmNsYXNzTmFtZSA9ICdwaC10aHVtYi1uYW1lJzsKICAgIG5tLnRleHRDb250ZW50ID0gKGVudHJ5Lm5hbWUgfHwgJycpICsgKGVudHJ5Lm4gPiAxID8gJyBcdTAwZDcnICsgZW50cnkubiA6ICcnKTsKICAgIHZhciBwciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcHIuY2xhc3NOYW1lID0gJ3BoLXRodW1iLXByaWNlJyArICh0eXBlb2YgZW50cnkucHJpY2UgPT09ICdudW1iZXInID8gJycgOiAnIHBoLWNhcmQtbm9wcmljZScpOwogICAgcHIudGV4dENvbnRlbnQgPSB0eXBlb2YgZW50cnkucHJpY2UgPT09ICdudW1iZXInID8gbW9uZXkoZW50cnkucHJpY2UpIDogJ2NoxrBhIGPDsyBnacOhJzsKICAgIGNvbC5hcHBlbmRDaGlsZChib3gpOyBjb2wuYXBwZW5kQ2hpbGQobm0pOyBjb2wuYXBwZW5kQ2hpbGQocHIpOwogICAgaWYgKG9uQ2xpY2spewogICAgICBjb2wuY2xhc3NMaXN0LmFkZCgncGgtY2xpY2thYmxlJyk7CiAgICAgIGNvbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spOwogICAgfQogICAgcmV0dXJuIGNvbDsKICB9CgoKICBmdW5jdGlvbiByZW5kZXJTZXRQcm9ncmVzc092ZXJ2aWV3KCl7CiAgICBpZiAoIXN0YXRlLmV4cGFuc2lvbnMgfHwgIXN0YXRlLmV4cGFuc2lvbnMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB3cmFwLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uIHBoLXNldC1vdmVydmlldyc7CgogICAgdmFyIHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB0aXRsZS5jbGFzc05hbWUgPSAncGgtbW9kYWwtc2VjdGlvbi10aXRsZSc7CiAgICB0aXRsZS50ZXh0Q29udGVudCA9ICdUaeG6v24gxJHhu5kgdOG7q25nIGLhu5knOwogICAgd3JhcC5hcHBlbmRDaGlsZCh0aXRsZSk7CgogICAgdmFyIGFjdGl2ZSA9IHN0YXRlLmV4cGFuc2lvbnMuZmlsdGVyKGZ1bmN0aW9uKGVudHJ5KXsKICAgICAgdmFyIGQgPSBzZXRQcm9ncmVzc0RhdGEoZW50cnkuc2V0KTsKICAgICAgcmV0dXJuIGQudW5pcXVlID4gMCB8fCAoc3RhdGUuY3VycmVudCAmJiBTdHJpbmcoc3RhdGUuY3VycmVudC5pZCkgPT09IFN0cmluZyhlbnRyeS5zZXQuaWQpKTsKICAgIH0pOwogICAgaWYgKCFhY3RpdmUubGVuZ3RoKSByZXR1cm4gbnVsbDsKCiAgICB2YXIgbm90ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgbm90ZS5jbGFzc05hbWUgPSAncGgtY29sLW5vdGUnOwogICAgbm90ZS50ZXh0Q29udGVudCA9ICdDaOG7iSBoaeG7h24gY8OhYyBi4buZIGLhuqFuIMSRw6MgbeG7nyBob+G6t2MgxJFhbmcgbeG7nzsgYuG7mSBjaMawYSBjaOG6oW0gdOG7m2kgduG6q24gY2jGsGEgY2hp4bq/bSBjaOG7lyB0cm9uZyBkYW5oIHPDoWNoLic7CiAgICB3cmFwLmFwcGVuZENoaWxkKG5vdGUpOwoKICAgIHZhciBncmlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBncmlkLmNsYXNzTmFtZSA9ICdwaC1zZXQtb3ZlcnZpZXctZ3JpZCc7CgogICAgYWN0aXZlLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgdmFyIGRhID0gc2V0UHJvZ3Jlc3NEYXRhKGEuc2V0KSwgZGJiID0gc2V0UHJvZ3Jlc3NEYXRhKGIuc2V0KTsKICAgICAgaWYgKGRiYi5wY3QgIT09IGRhLnBjdCkgcmV0dXJuIGRiYi5wY3QgLSBkYS5wY3Q7CiAgICAgIHJldHVybiAoYS5zZXQubmFtZSB8fCAnJykubG9jYWxlQ29tcGFyZShiLnNldC5uYW1lIHx8ICcnKTsKICAgIH0pLmZvckVhY2goZnVuY3Rpb24oZW50cnkpewogICAgICB2YXIgcyA9IGVudHJ5LnNldDsKICAgICAgdmFyIGQgPSBzZXRQcm9ncmVzc0RhdGEocyk7CiAgICAgIHZhciBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3BoLXNldC1vdmVydmlldy1pdGVtJzsKCiAgICAgIHZhciB0b3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgdG9wLmNsYXNzTmFtZSA9ICdwaC1zZXQtb3ZlcnZpZXctdG9wJzsKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgbmFtZS5jbGFzc05hbWUgPSAncGgtc2V0LW92ZXJ2aWV3LW5hbWUnOwogICAgICBuYW1lLnRleHRDb250ZW50ID0gcy5uYW1lIHx8ICdC4buZIGtow7RuZyB0w6puJzsKICAgICAgdmFyIHBjdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHBjdEVsLmNsYXNzTmFtZSA9ICdwaC1zZXQtb3ZlcnZpZXctcGN0JzsKICAgICAgcGN0RWwudGV4dENvbnRlbnQgPSBkLnBjdCArICclJzsKICAgICAgdG9wLmFwcGVuZENoaWxkKG5hbWUpOwogICAgICB0b3AuYXBwZW5kQ2hpbGQocGN0RWwpOwoKICAgICAgdmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgbWV0YS5jbGFzc05hbWUgPSAncGgtc2V0LW92ZXJ2aWV3LW1ldGEnOwogICAgICBtZXRhLnRleHRDb250ZW50ID0gZC51bmlxdWUgKyAnLycgKyBkLnRvdGFsICsgJyBsw6EgwrcgJyArIChkLm1pc3NpbmcubGVuZ3RoID8gJ3RoaeG6v3UgJyArIGQubWlzc2luZy5sZW5ndGggOiAnxJHhu6cgYuG7mScpOwoKICAgICAgdmFyIHRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHRyYWNrLmNsYXNzTmFtZSA9ICdwaC1leHAtcHJvZ3Jlc3MtdHJhY2snOwogICAgICB2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgZmlsbC5jbGFzc05hbWUgPSAncGgtZXhwLXByb2dyZXNzLWZpbGwnOwogICAgICBmaWxsLnN0eWxlLndpZHRoID0gTWF0aC5taW4oMTAwLCBkLnBjdCkgKyAnJSc7CiAgICAgIHRyYWNrLmFwcGVuZENoaWxkKGZpbGwpOwoKICAgICAgaXRlbS5hcHBlbmRDaGlsZCh0b3ApOwogICAgICBpdGVtLmFwcGVuZENoaWxkKG1ldGEpOwogICAgICBpdGVtLmFwcGVuZENoaWxkKHRyYWNrKTsKCiAgICAgIGlmIChzdGF0ZS5jdXJyZW50ICYmIFN0cmluZyhzdGF0ZS5jdXJyZW50LmlkKSA9PT0gU3RyaW5nKHMuaWQpKXsKICAgICAgICB2YXIgY3VycmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBjdXJyZW50LmNsYXNzTmFtZSA9ICdwaC1jdXJyZW50LWNoaXAnOwogICAgICAgIGN1cnJlbnQudGV4dENvbnRlbnQgPSAnxJBhbmcgbeG7nyc7CiAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChjdXJyZW50KTsKICAgICAgfQogICAgICBncmlkLmFwcGVuZENoaWxkKGl0ZW0pOwogICAgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKGdyaWQpOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJDb2xsZWN0aW9uKCl7CiAgICB2YXIgcyA9IGNvbGxlY3Rpb25TdGF0cygpOwogICAgdmFyIGQgPSBsb2FkREIoKTsKICAgIGVscy5jb2xCb2R5LnRleHRDb250ZW50ID0gJyc7CgogICAgdmFyIG92ZXJ2aWV3QmxvY2sgPSByZW5kZXJTZXRQcm9ncmVzc092ZXJ2aWV3KCk7CiAgICBpZiAob3ZlcnZpZXdCbG9jaykgZWxzLmNvbEJvZHkuYXBwZW5kQ2hpbGQob3ZlcnZpZXdCbG9jayk7CgogICAgdmFyIGN1cnJlbnRTZXREZXRhaWwgPSByZW5kZXJDdXJyZW50U2V0TWlzc2luZ0luQ29sbGVjdGlvbigpOwogICAgaWYgKGN1cnJlbnRTZXREZXRhaWwpIGVscy5jb2xCb2R5LmFwcGVuZENoaWxkKGN1cnJlbnRTZXREZXRhaWwpOwoKICAgIHZhciBzdGF0cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc3RhdHMuY2xhc3NOYW1lID0gJ3BoLXN0YXQtZ3JpZCc7CiAgICBzdGF0cy5hcHBlbmRDaGlsZChzdGF0Qm94KCdHw7NpIMSRw6MgbeG7nycsIFN0cmluZyhzLnBhY2tzKSkpOwogICAgc3RhdHMuYXBwZW5kQ2hpbGQoc3RhdEJveCgnxJDDoyBjaGknLCBtb25leShzLnNwZW50KSkpOwogICAgc3RhdHMuYXBwZW5kQ2hpbGQoc3RhdEJveCgnR2nDoSB0cuG7iyB0aHUgxJHGsOG7o2MnLCBtb25leShzLnZhbHVlKSkpOwogICAgc3RhdHMuYXBwZW5kQ2hpbGQoc3RhdEJveCgnUk9JJywgcy5yb2kgPT0gbnVsbCA/ICfigJQnIDogcGN0KHMucm9pKSwgcm9pQ2xhc3Mocy5yb2kpKSk7CiAgICBzdGF0cy5hcHBlbmRDaGlsZChzdGF0Qm94KCdMw6EgxJHhu5ljIG5o4bqldCcsIFN0cmluZyhzLnVuaXF1ZSkpKTsKICAgIHN0YXRzLmFwcGVuZENoaWxkKHN0YXRCb3goJ1Thu5VuZyBz4buRIGzDoScsIFN0cmluZyhzLmNhcmRzKSkpOwogICAgZWxzLmNvbEJvZHkuYXBwZW5kQ2hpbGQoc3RhdHMpOwoKICAgIHZhciBub3RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBub3RlLmNsYXNzTmFtZSA9ICdwaC1jb2wtbm90ZSc7CiAgICBub3RlLnRleHRDb250ZW50ID0gcy5wcmljZWQgPCBzLmNhcmRzCiAgICAgID8gJ0PDsyAnICsgKHMuY2FyZHMgLSBzLnByaWNlZCkgKyAnIGzDoSBjaMawYSBjw7MgZOG7ryBsaeG7h3UgZ2nDoSBuw6puIGtow7RuZyDEkcaw4bujYyB0w61uaCB2w6BvIHThu5VuZyBnacOhIHRy4buLLicKICAgICAgOiAnR2nDoSBs4bqleSB04burIFRDR2RleCAoxrB1IHRpw6puIFRDR3BsYXllciB0aGVvIFVTRCkuJzsKICAgIGVscy5jb2xCb2R5LmFwcGVuZENoaWxkKG5vdGUpOwoKICAgIHZhciBiYWNrdXBOb3RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBiYWNrdXBOb3RlLmNsYXNzTmFtZSA9ICdwaC1jb2wtbm90ZSc7CiAgICBiYWNrdXBOb3RlLnN0eWxlLmNzc1RleHQgPSAncGFkZGluZzoxMHB4IDEycHg7bWFyZ2luOjEwcHggMCAxMnB4O2JvcmRlcjoxcHggc29saWQgcmdiYSgyNTUsMjExLDkyLC4zMik7Ym9yZGVyLXJhZGl1czoxMHB4O2JhY2tncm91bmQ6cmdiYSgyNTUsMjExLDkyLC4wNyk7Y29sb3I6I2ZmZTdhMDtsaW5lLWhlaWdodDoxLjU1Oyc7CiAgICBiYWNrdXBOb3RlLnRleHRDb250ZW50ID0gJ+KaoO+4jyBTYW8gbMawdSB0csaw4bubYyBraGkgeMOzYTogdGhhbyB0w6FjIG7DoHkgeMOzYSBi4buZIHPGsHUgdOG6rXAgdsOgIFJPSSB0csOqbiB0aGnhur90IGLhu4suIFRo4buRbmcga8OqIGPDoSBuaMOibiBj4bunYSBi4bqhbiB0csOqbiBCWEggY8OzIHRo4buDIMSRxrDhu6NjIGPhuq1wIG5o4bqtdCB0aGVvIGLhu5kgc8awdSB04bqtcCB0cuG7kW5nLiBIw6N5IFh14bqldCBKU09OIMSR4buDIGzGsHUgYuG6o24gc2FvLCBy4buTaSBkw7luZyBOaOG6rXAgSlNPTiDEkeG7gyBraMO0aSBwaOG7pWMuIEzhu4tjaCBz4butIGzGsOG7o3QgbeG7nyBwYWNrIHRyw6puIEJYSCB2w6AgZOG7ryBsaeG7h3UgY+G7p2EgbmfGsOG7nWkgY2jGoWkga2jDoWMga2jDtG5nIGLhu4sgeMOzYSBi4bufaSBuw7p0IG7DoHkuJzsKICAgIGVscy5jb2xCb2R5LmFwcGVuZENoaWxkKGJhY2t1cE5vdGUpOwoKICAgIC8vIGdpw6EgbeG7l2kgZ8OzaQogICAgdmFyIGN0bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgY3RsLmNsYXNzTmFtZSA9ICdwaC1jb2wtY3RsJzsKICAgIHZhciBsYWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpOwogICAgbGFiLnRleHRDb250ZW50ID0gJ0dpw6EgMSBnw7NpIChVU0QpJzsKICAgIHZhciBpbnAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgaW5wLnR5cGUgPSAnbnVtYmVyJzsgaW5wLm1pbiA9ICcwJzsgaW5wLnN0ZXAgPSAnMC4wMSc7CiAgICBpbnAudmFsdWUgPSBTdHJpbmcoZC5wYWNrUHJpY2UpOwogICAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCl7CiAgICAgIHZhciB2ID0gcGFyc2VGbG9hdChpbnAudmFsdWUpOwogICAgICBpZiAoaXNOYU4odikgfHwgdiA8IDApIHJldHVybjsKICAgICAgZC5wYWNrUHJpY2UgPSB2OyBzYXZlREIoKTsKICAgICAgdG9hc3QoJ8SQw6MgxJHhurd0IGdpw6EgZ8OzaTogJyArIG1vbmV5KHYpICsgJyAow6FwIGThu6VuZyBjaG8gY8OhYyBnw7NpIG3hu58gc2F1KScpOwogICAgICByZW5kZXJDb2xsZWN0aW9uKCk7CiAgICB9KTsKICAgIGxhYi5hcHBlbmRDaGlsZChpbnApOwogICAgY3RsLmFwcGVuZENoaWxkKGxhYik7CgogICAgdmFyIGV4cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgZXhwLnR5cGUgPSAnYnV0dG9uJzsgZXhwLmNsYXNzTmFtZSA9ICdwaC1idG4gcGgtc21hbGwnOwogICAgZXhwLnRleHRDb250ZW50ID0gJ1h14bqldCBKU09OJzsKICAgIGV4cC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGQsIG51bGwsIDIpXSwge3R5cGU6J2FwcGxpY2F0aW9uL2pzb24nfSk7CiAgICAgIGRvd25sb2FkQmxvYihibG9iLCAncG9rZWh1Yi1iby1zdXUtdGFwLmpzb24nKTsKICAgIH0pOwogICAgY3RsLmFwcGVuZENoaWxkKGV4cCk7CgogICAgdmFyIGltcG9ydElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICAgIGltcG9ydElucHV0LnR5cGUgPSAnZmlsZSc7CiAgICBpbXBvcnRJbnB1dC5hY2NlcHQgPSAnLmpzb24sYXBwbGljYXRpb24vanNvbic7CiAgICBpbXBvcnRJbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdDaOG7jW4gZmlsZSBKU09OIGLhu5kgc8awdSB04bqtcCDEkeG7gyBuaOG6rXAnKTsKICAgIGltcG9ydElucHV0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICBpbXBvcnRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpewogICAgICB2YXIgZmlsZSA9IGltcG9ydElucHV0LmZpbGVzICYmIGltcG9ydElucHV0LmZpbGVzWzBdOwogICAgICBpZiAoIWZpbGUpIHJldHVybjsKICAgICAgaWYgKGZpbGUuc2l6ZSA+IDI1ICogMTAyNCAqIDEwMjQpewogICAgICAgIHRvYXN0KCdGaWxlIEpTT04gcXXDoSBs4bubbiAoZ2nhu5tpIGjhuqFuIDI1IE1CKS4nKTsKICAgICAgICBpbXBvcnRJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpeyB0b2FzdCgnS2jDtG5nIMSR4buNYyDEkcaw4bujYyBmaWxlIEpTT04uIEjDo3kgdGjhu60gY2jhu41uIGzhuqFpIGZpbGUuJyk7IGltcG9ydElucHV0LnZhbHVlID0gJyc7IH07CiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpewogICAgICAgIHZhciBpbXBvcnRlZDsKICAgICAgICB0cnkgeyBpbXBvcnRlZCA9IG5vcm1hbGl6ZUltcG9ydGVkQ29sbGVjdGlvbihKU09OLnBhcnNlKFN0cmluZyhyZWFkZXIucmVzdWx0IHx8ICcnKSkpOyB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgIHRvYXN0KChlcnIgJiYgZXJyLm1lc3NhZ2UpID8gZXJyLm1lc3NhZ2UgOiAnRmlsZSBKU09OIGtow7RuZyBo4bujcCBs4buHLicpOwogICAgICAgICAgaW1wb3J0SW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG9rID0gd2luZG93LmNvbmZpcm0oJ05o4bqtcCBKU09OIHPhur0gVEhBWSBUSOG6viBi4buZIHPGsHUgdOG6rXAgaGnhu4duIHThuqFpIHRyw6puIHRoaeG6v3QgYuG7iyBuw6B5LiBO4bq/dSBtdeG7kW4gZ2nhu68gZOG7ryBsaeG7h3UgaGnhu4duIHThuqFpLCBow6N5IFh14bqldCBKU09OIHRyxrDhu5tjLiBUaeG6v3AgdOG7pWMgbmjhuq1wIHbDoCDEkeG7k25nIGLhu5kgbOG6oWkgdGjhu5FuZyBrw6ogY8OhIG5ow6JuIHRyw6puIEJYSD8nKTsKICAgICAgICBpZiAoIW9rKXsgaW1wb3J0SW5wdXQudmFsdWUgPSAnJzsgcmV0dXJuOyB9CiAgICAgICAgdmFyIHByZXZpb3VzID0gZGI7CiAgICAgICAgZGIgPSBpbXBvcnRlZDsKICAgICAgICBpZiAoIXNhdmVEQigpKXsKICAgICAgICAgIGRiID0gcHJldmlvdXM7CiAgICAgICAgICB0b2FzdCgnS2jDtG5nIGzGsHUgxJHGsOG7o2MgYuG7mSBzxrB1IHThuq1wLiBIw6N5IGtp4buDbSB0cmEgZHVuZyBsxrDhu6NuZyBsxrB1IHRy4buvIGPhu6dhIHRyw6xuaCBkdXnhu4d0LicpOwogICAgICAgICAgaW1wb3J0SW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29sbGVjdGlvbkNoYW5nZWQoJ2ltcG9ydCcpOwogICAgICAgIHVwZGF0ZUNvbEJhZGdlKCk7CiAgICAgICAgcmVuZGVyQ29sbGVjdGlvbigpOwogICAgICAgIHRvYXN0KCfEkMOjIG5o4bqtcCBKU09OIHbDoCBraMO0aSBwaOG7pWMgJyArIE9iamVjdC5rZXlzKGRiLmNhcmRzIHx8IHt9KS5sZW5ndGggKyAnIGxv4bqhaSB0aOG6uy4nKTsKICAgICAgICBpbXBvcnRJbnB1dC52YWx1ZSA9ICcnOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTsKICAgIH0pOwogICAgY3RsLmFwcGVuZENoaWxkKGltcG9ydElucHV0KTsKCiAgICB2YXIgaW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICBpbXAudHlwZSA9ICdidXR0b24nOyBpbXAuY2xhc3NOYW1lID0gJ3BoLWJ0biBwaC1zbWFsbCc7CiAgICBpbXAudGV4dENvbnRlbnQgPSAnTmjhuq1wIEpTT04nOwogICAgaW1wLnRpdGxlID0gJ0tow7RpIHBo4bulYyBi4buZIHPGsHUgdOG6rXAgdOG7qyBmaWxlIEpTT04gxJHDoyB4deG6pXQgdHLGsOG7m2MgxJHDsyc7CiAgICBpbXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpeyBpbXBvcnRJbnB1dC5jbGljaygpOyB9KTsKICAgIGN0bC5hcHBlbmRDaGlsZChpbXApOwoKICAgIHZhciBjbHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGNsci50eXBlID0gJ2J1dHRvbic7IGNsci5jbGFzc05hbWUgPSAncGgtYnRuIHBoLXNtYWxsIHBoLWRhbmdlcic7CiAgICBjbHIudGV4dENvbnRlbnQgPSAnWMOzYSBi4buZIHPGsHUgdOG6rXAnOwogICAgY2xyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgaWYgKCF3aW5kb3cuY29uZmlybSgnQ+G6ok5IIELDgU86IFRoYW8gdMOhYyBuw6B5IHjDs2EgdG/DoG4gYuG7mSB0aOG6uyB2w6Agc+G7kSBsaeG7h3UgUk9JIGPhu6dhIGLhu5kgc8awdSB04bqtcCB0csOqbiB0aGnhur90IGLhu4suIFRo4buRbmcga8OqIGPDoSBuaMOibiBj4bunYSBi4bqhbiB0csOqbiBCWEggY8OzIHRo4buDIMSRxrDhu6NjIGPhuq1wIG5o4bqtdCB24buBIDAuIEjDo3kgYuG6pW0g4oCcWHXhuqV0IEpTT07igJ0gxJHhu4Mgc2FvIGzGsHUgdHLGsOG7m2MuIELhuqFuIHbhuqtuIG114buRbiB4w7NhPycpKSByZXR1cm47CiAgICAgIGRiID0geyBjYXJkczp7fSwgY2hhbGxlbmdlczp7fSwgcGFja3M6MCwgc3BlbnQ6MCwgcGFja1ByaWNlOmQucGFja1ByaWNlLCBiZXN0THVjazowIH07CiAgICAgIGlmICghc2F2ZURCKCkpewogICAgICAgIHRvYXN0KCdLaMO0bmcgbMawdSDEkcaw4bujYyB0aGF5IMSR4buVaS4gSMOjeSBraeG7g20gdHJhIGR1bmcgbMaw4bujbmcgbMawdSB0cuG7ryBj4bunYSB0csOsbmggZHV54buHdC4nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbm90aWZ5Q29sbGVjdGlvbkNoYW5nZWQoJ2NsZWFyJyk7CiAgICAgIHVwZGF0ZUNvbEJhZGdlKCk7CiAgICAgIHJlbmRlckNvbGxlY3Rpb24oKTsKICAgICAgdG9hc3QoJ8SQw6MgeMOzYSBi4buZIHPGsHUgdOG6rXAuIE7hur91IMSRw6MgeHXhuqV0IEpTT04sIGLhuqFuIGPDsyB0aOG7gyBuaOG6rXAgbOG6oWkgxJHhu4Mga2jDtGkgcGjhu6VjLicpOwogICAgfSk7CiAgICBjdGwuYXBwZW5kQ2hpbGQoY2xyKTsKICAgIGVscy5jb2xCb2R5LmFwcGVuZENoaWxkKGN0bCk7CgogICAgaWYgKCFzLmNhcmRzKXsKICAgICAgdmFyIGVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGVtcHR5LmNsYXNzTmFtZSA9ICdwaC1jb2wtbm90ZSc7CiAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gJ0NoxrBhIGPDsyBsw6EgbsOgby4gTeG7nyBt4buZdCBnw7NpIGLDoGkgdsOgIG3hu41pIHRo4bupIHPhur0gdOG7sSDEkeG7mW5nIMSRxrDhu6NjIGzGsHUgbOG6oWkgdHLDqm4gY2jDrW5oIG3DoXkgYuG6oW4uJzsKICAgICAgZWxzLmNvbEJvZHkuYXBwZW5kQ2hpbGQoZW1wdHkpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gcGhhbiBibyBkbyBoaWVtCiAgICB2YXIgYnJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBicmsuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXNlY3Rpb24nOwogICAgdmFyIGJya1QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGJya1QuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXNlY3Rpb24tdGl0bGUnOwogICAgYnJrVC50ZXh0Q29udGVudCA9ICdQaMOibiBi4buVIMSR4buZIGhp4bq/bSc7CiAgICBicmsuYXBwZW5kQ2hpbGQoYnJrVCk7CiAgICB2YXIgbWF4VCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIHMudGllcnMpIHx8IDE7CiAgICBmb3IgKHZhciB0ID0gNjsgdCA+PSAwOyB0LS0pewogICAgICBpZiAoIXMudGllcnNbdF0pIGNvbnRpbnVlOwogICAgICB2YXIgcm93YiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICByb3diLmNsYXNzTmFtZSA9ICdwaC1iYXItcm93JzsKICAgICAgdmFyIGJsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBibC5jbGFzc05hbWUgPSAncGgtYmFyLWwnOyBibC50ZXh0Q29udGVudCA9IHRpZXJMYWJlbFRleHQodCk7CiAgICAgIHZhciBidyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgYncuY2xhc3NOYW1lID0gJ3BoLWJhci13JzsKICAgICAgdmFyIGJmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBiZi5jbGFzc05hbWUgPSAncGgtYmFyLWYnOyBiZi5kYXRhc2V0LnRpZXIgPSBTdHJpbmcodCk7CiAgICAgIGJmLnN0eWxlLndpZHRoID0gTWF0aC5tYXgoNCwgcy50aWVyc1t0XSAvIG1heFQgKiAxMDApICsgJyUnOwogICAgICBidy5hcHBlbmRDaGlsZChiZik7CiAgICAgIHZhciBibiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgYm4uY2xhc3NOYW1lID0gJ3BoLWJhci1uJzsgYm4udGV4dENvbnRlbnQgPSBTdHJpbmcocy50aWVyc1t0XSk7CiAgICAgIHJvd2IuYXBwZW5kQ2hpbGQoYmwpOyByb3diLmFwcGVuZENoaWxkKGJ3KTsgcm93Yi5hcHBlbmRDaGlsZChibik7CiAgICAgIGJyay5hcHBlbmRDaGlsZChyb3diKTsKICAgIH0KICAgIGVscy5jb2xCb2R5LmFwcGVuZENoaWxkKGJyayk7CgogICAgLy8gZGFuaCBzYWNoIGxhIGJhaQogICAgdmFyIGxpc3RXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBsaXN0V3JhcC5jbGFzc05hbWUgPSAncGgtbW9kYWwtc2VjdGlvbic7CiAgICB2YXIgbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGx0LmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uLXRpdGxlJzsKICAgIGx0LnRleHRDb250ZW50ID0gJ0zDoSBiw6BpIMSRw6Mgc8awdSB04bqnbSAoZ2nDoSBjYW8gbmjhuqV0IHRyxrDhu5tjKSc7CiAgICBsaXN0V3JhcC5hcHBlbmRDaGlsZChsdCk7CiAgICB2YXIgZ3JpZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZ3JpZC5jbGFzc05hbWUgPSAncGgtdGh1bWItZ3JpZCc7CiAgICB2YXIgZW50cmllcyA9IE9iamVjdC5rZXlzKGQuY2FyZHMpLm1hcChmdW5jdGlvbihrKXsgcmV0dXJuIGQuY2FyZHNba107IH0pLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgdmFyIHBhID0gdHlwZW9mIGEucHJpY2UgPT09ICdudW1iZXInID8gYS5wcmljZSA6IC0xOwogICAgICB2YXIgcGIgPSB0eXBlb2YgYi5wcmljZSA9PT0gJ251bWJlcicgPyBiLnByaWNlIDogLTE7CiAgICAgIGlmIChwYiAhPT0gcGEpIHJldHVybiBwYiAtIHBhOwogICAgICByZXR1cm4gKGIudGllcnx8MCkgLSAoYS50aWVyfHwwKTsKICAgIH0pOwogICAgZW50cmllcy5zbGljZSgwLCAzMDApLmZvckVhY2goZnVuY3Rpb24oZSl7CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoY2FyZFRodW1iKGUsIGZ1bmN0aW9uKCl7IG9wZW5TdG9yZWRDYXJkKGUpOyB9KSk7CiAgICB9KTsKICAgIGxpc3RXcmFwLmFwcGVuZENoaWxkKGdyaWQpOwogICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMzAwKXsKICAgICAgdmFyIG1vcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgbW9yZS5jbGFzc05hbWUgPSAncGgtY29sLW5vdGUnOwogICAgICBtb3JlLnRleHRDb250ZW50ID0gJ8SQYW5nIGhp4buHbiAzMDAvJyArIGVudHJpZXMubGVuZ3RoICsgJyBsw6EgxJHhuqd1IHRpw6puLic7CiAgICAgIGxpc3RXcmFwLmFwcGVuZENoaWxkKG1vcmUpOwogICAgfQogICAgZWxzLmNvbEJvZHkuYXBwZW5kQ2hpbGQobGlzdFdyYXApOwoKICAgIHZhciBzaGFyZUNvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc2hhcmVDb2wuY2xhc3NOYW1lID0gJ3BoLWFjdGlvbnMnOwogICAgdmFyIHNiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICBzYi50eXBlID0gJ2J1dHRvbic7IHNiLmNsYXNzTmFtZSA9ICdwaC1idG4gcGgtcHJpbWFyeSc7CiAgICBzYi50ZXh0Q29udGVudCA9ICdDaGlhIHPhursg4bqjbmggYuG7mSBzxrB1IHThuq1wJzsKICAgIHNiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgdmFyIHRvcCA9IGVudHJpZXMuc2xpY2UoMCw1KS5tYXAoZnVuY3Rpb24oZSl7CiAgICAgICAgcmV0dXJuIHsgbmFtZTplLm5hbWUsIGltYWdlOmUuaW1nLCB0aWVyOmUudGllcnx8MCwgcHJpY2U6ZS5wcmljZSB9OwogICAgICB9KTsKICAgICAgbWFrZUFuZFNoYXJlKHsKICAgICAgICB0aXRsZTogJ0Lhu5kgc8awdSB04bqtcCBQb2tlSHViJywKICAgICAgICBzdWI6IHMucGFja3MgKyAnIGfDs2kgxJHDoyBt4bufIFx1MDBiNyAnICsgcy51bmlxdWUgKyAnIGzDoSDEkeG7mWMgbmjhuqV0JywKICAgICAgICBjYXJkczogdG9wLAogICAgICAgIHN0YXRzOiBbCiAgICAgICAgICBbJ8SQw6MgY2hpJywgbW9uZXkocy5zcGVudCldLAogICAgICAgICAgWydHacOhIHRy4buLJywgbW9uZXkocy52YWx1ZSldLAogICAgICAgICAgWydST0knLCBzLnJvaSA9PSBudWxsID8gJ+KAlCcgOiBwY3Qocy5yb2kpXSwKICAgICAgICAgIFsnU+G7kSBsw6EnLCBTdHJpbmcocy5jYXJkcyldCiAgICAgICAgXSwKICAgICAgICB0ZXh0OiAnQuG7mSBzxrB1IHThuq1wIFBva2VIdWIgY+G7p2EgdMO0aTogJyArIHMucGFja3MgKyAnIGfDs2ksIGdpw6EgdHLhu4sgJyArIG1vbmV5KHMudmFsdWUpICsgJywgUk9JICcgKyAocy5yb2kgPT0gbnVsbCA/ICfigJQnIDogcGN0KHMucm9pKSkgKyAnLicKICAgICAgfSk7CiAgICB9KTsKICAgIHNoYXJlQ29sLmFwcGVuZENoaWxkKHNiKTsKICAgIGVscy5jb2xCb2R5LmFwcGVuZENoaWxkKHNoYXJlQ29sKTsKICB9CgogIC8vIC0tLS0tLS0tLS0gVEjhu6wgVEjDgUNIIC0tLS0tLS0tLS0KICAvLyBDaOG7iSBkw7luZyBk4buvIGxp4buHdSDEkcOjIGPDsyB0cm9uZyBjb2xsZWN0aW9uOyBraMO0bmcgZ+G7jWkgQVBJIG3hu5tpLgogIHZhciBDSEFMTEVOR0VTID0gWwogICAgeyBpZDonZmlyc3QtcGFjaycsIGljb246J/CfjrQnLCBuYW1lOidN4bufIGfDs2kgxJHhuqd1IHRpw6puJywgZGVzYzonTeG7nyDDrXQgbmjhuqV0IDEgZ8OzaSBiw6BpLicsIGdvYWw6MSwgdmFsdWU6ZnVuY3Rpb24ocyl7IHJldHVybiBzLnBhY2tzOyB9LCBmbXQ6ZnVuY3Rpb24odixnKXsgcmV0dXJuIE1hdGgubWluKHYsZykgKyAnLycgKyBnOyB9IH0sCiAgICB7IGlkOidjb2xsZWN0b3ItNScsIGljb246J/Cfk5onLCBuYW1lOidOaMOgIHPGsHUgdOG6p20nLCBkZXNjOidTxrB1IHThuqdtIDUgbMOhIMSR4buZYyBuaOG6pXQuJywgZ29hbDo1LCB2YWx1ZTpmdW5jdGlvbihzKXsgcmV0dXJuIHMudW5pcXVlOyB9LCBmbXQ6ZnVuY3Rpb24odixnKXsgcmV0dXJuIE1hdGgubWluKHYsZykgKyAnLycgKyBnOyB9IH0sCiAgICB7IGlkOidjb2xsZWN0b3ItMjAnLCBpY29uOifwn5eC77iPJywgbmFtZTonQuG7mSBzxrB1IHThuq1wIG3hu58gcuG7mW5nJywgZGVzYzonU8awdSB04bqnbSAyMCBsw6EgxJHhu5ljIG5o4bqldC4nLCBnb2FsOjIwLCB2YWx1ZTpmdW5jdGlvbihzKXsgcmV0dXJuIHMudW5pcXVlOyB9LCBmbXQ6ZnVuY3Rpb24odixnKXsgcmV0dXJuIE1hdGgubWluKHYsZykgKyAnLycgKyBnOyB9IH0sCiAgICB7IGlkOidyYXJlLXB1bGwnLCBpY29uOifinKgnLCBuYW1lOidTxINuIGzDoSBoaeG6v20nLCBkZXNjOidQdWxsIMOtdCBuaOG6pXQgMSBsw6EgdOG7qyB0aWVyIFVsdHJhIHRy4bufIGzDqm4uJywgZ29hbDoxLCB2YWx1ZTpmdW5jdGlvbihzKXsgcmV0dXJuIHMuaGlnaFRpZXI7IH0sIGZtdDpmdW5jdGlvbih2LGcpeyByZXR1cm4gTWF0aC5taW4odixnKSArICcvJyArIGc7IH0gfSwKICAgIHsgaWQ6J2NoYXNlLXB1bGwnLCBpY29uOifwn5GRJywgbmFtZTonQ2hhc2UgSHVudGVyJywgZGVzYzonUHVsbCDDrXQgbmjhuqV0IDEgbMOhIENoYXNlLicsIGdvYWw6MSwgdmFsdWU6ZnVuY3Rpb24ocyl7IHJldHVybiBzLmNoYXNlOyB9LCBmbXQ6ZnVuY3Rpb24odixnKXsgcmV0dXJuIE1hdGgubWluKHYsZykgKyAnLycgKyBnOyB9IH0sCiAgICB7IGlkOid0ZW4tcGFja3MnLCBpY29uOifwn5OmJywgbmFtZTonTeG7nyAxMCBnw7NpJywgZGVzYzonTeG7nyB04buVbmcgY+G7mW5nIDEwIGfDs2kgYsOgaS4nLCBnb2FsOjEwLCB2YWx1ZTpmdW5jdGlvbihzKXsgcmV0dXJuIHMucGFja3M7IH0sIGZtdDpmdW5jdGlvbih2LGcpeyByZXR1cm4gTWF0aC5taW4odixnKSArICcvJyArIGc7IH0gfSwKICAgIHsgaWQ6J2h1bmRyZWQtY2FyZHMnLCBpY29uOifwn5KvJywgbmFtZTonMTAwIGzDoScsIGRlc2M6J1B1bGwgdOG7lW5nIGPhu5luZyAxMDAgbMOhIGLDoGkuJywgZ29hbDoxMDAsIHZhbHVlOmZ1bmN0aW9uKHMpeyByZXR1cm4gcy5jYXJkczsgfSwgZm10OmZ1bmN0aW9uKHYsZyl7IHJldHVybiBNYXRoLm1pbih2LGcpICsgJy8nICsgZzsgfSB9CiAgXTsKCiAgZnVuY3Rpb24gY2hhbGxlbmdlU3RhdHMoKXsKICAgIHZhciBzID0gY29sbGVjdGlvblN0YXRzKCksIGQgPSBsb2FkREIoKSwgaGlnaFRpZXIgPSAwLCB0aWVyNCA9IDAsIHRpZXI1ID0gMCwgY2hhc2UgPSAwOwogICAgT2JqZWN0LmtleXMoZC5jYXJkcykuZm9yRWFjaChmdW5jdGlvbihrKXsKICAgICAgdmFyIGUgPSBkLmNhcmRzW2tdLCB0ID0gTnVtYmVyKGUudGllcikgfHwgMCwgbiA9IE51bWJlcihlLm4pIHx8IDA7CiAgICAgIGlmICh0ID49IDMpIGhpZ2hUaWVyICs9IG47CiAgICAgIGlmICh0ID49IDQpIHRpZXI0ICs9IG47CiAgICAgIGlmICh0ID49IDUpIHRpZXI1ICs9IG47CiAgICAgIGlmICh0ID49IDYpIGNoYXNlICs9IG47CiAgICB9KTsKICAgIHMuaGlnaFRpZXIgPSBoaWdoVGllcjsgcy50aWVyNCA9IHRpZXI0OyBzLnRpZXI1ID0gdGllcjU7IHMuY2hhc2UgPSBjaGFzZTsKICAgIHJldHVybiBzOwogIH0KCiAgZnVuY3Rpb24gY2hhbGxlbmdlQ29tcGxldGVkKGRlZiwgcyl7IHJldHVybiBkZWYudmFsdWUocykgPj0gZGVmLmdvYWw7IH0KCiAgZnVuY3Rpb24gdXBkYXRlQ2hhbGxlbmdlQmFkZ2UoKXsKICAgIGlmICghZWxzLmNoYWxsZW5nZUNvdW50IHx8ICFlbHMuY2hhbGxlbmdlQnRuKSByZXR1cm47CiAgICB2YXIgcyA9IGNoYWxsZW5nZVN0YXRzKCksIGQgPSBsb2FkREIoKSwgZG9uZSA9IDA7CiAgICBDSEFMTEVOR0VTLmZvckVhY2goZnVuY3Rpb24oZGVmKXsKICAgICAgaWYgKGNoYWxsZW5nZUNvbXBsZXRlZChkZWYsIHMpKXsKICAgICAgICBkb25lKys7CiAgICAgICAgaWYgKCFkLmNoYWxsZW5nZXNbZGVmLmlkXSkgZC5jaGFsbGVuZ2VzW2RlZi5pZF0gPSBEYXRlLm5vdygpOwogICAgICB9CiAgICB9KTsKICAgIHNhdmVEQigpOwogICAgZWxzLmNoYWxsZW5nZUNvdW50LnRleHRDb250ZW50ID0gZG9uZSArICcvJyArIENIQUxMRU5HRVMubGVuZ3RoOwogICAgZWxzLmNoYWxsZW5nZUNvdW50LmhpZGRlbiA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gY2hhbGxlbmdlQ2FyZChkZWYsIHMsIGQpewogICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoMCwgTnVtYmVyKGRlZi52YWx1ZShzKSkgfHwgMCksIGRvbmUgPSBjaGFsbGVuZ2VDb21wbGV0ZWQoZGVmLCBzKTsKICAgIHZhciBwZXJjZW50ID0gZGVmLmdvYWwgPiAwID8gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKHZhbHVlIC8gZGVmLmdvYWwgKiAxMDApKSA6IDEwMDsKICAgIHZhciBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGl0ZW0uY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1pdGVtJyArIChkb25lID8gJyBwaC1kb25lJyA6ICcnKTsKICAgIHZhciBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGhlYWQuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1oZWFkJzsKICAgIHZhciBsZWZ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB2YXIgbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBuYW1lLmNsYXNzTmFtZSA9ICdwaC1jaGFsbGVuZ2UtbmFtZSc7IG5hbWUudGV4dENvbnRlbnQgPSBkZWYuaWNvbiArICcgJyArIGRlZi5uYW1lOwogICAgdmFyIGRlc2MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZGVzYy5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLWRlc2MnOyBkZXNjLnRleHRDb250ZW50ID0gZGVmLmRlc2M7CiAgICBsZWZ0LmFwcGVuZENoaWxkKG5hbWUpOyBsZWZ0LmFwcGVuZENoaWxkKGRlc2MpOwogICAgdmFyIGJhZGdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBiYWRnZS5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLXN0YXR1cycgKyAoZG9uZSA/ICcgcGgtY2hhbGxlbmdlLWRvbmUnIDogJycpOyBiYWRnZS50ZXh0Q29udGVudCA9IGRvbmUgPyAn4pyTIEhvw6BuIHRow6BuaCcgOiAnxJBhbmcgbMOgbSc7CiAgICBoZWFkLmFwcGVuZENoaWxkKGxlZnQpOyBoZWFkLmFwcGVuZENoaWxkKGJhZGdlKTsgaXRlbS5hcHBlbmRDaGlsZChoZWFkKTsKICAgIHZhciBwcm9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHByb2cuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1wcm9ncmVzcyc7CiAgICB2YXIgdHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IHRyYWNrLmNsYXNzTmFtZSA9ICdwaC1jaGFsbGVuZ2UtdHJhY2snOwogICAgdmFyIGZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IGZpbGwuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1maWxsJzsgZmlsbC5zdHlsZS53aWR0aCA9IHBlcmNlbnQgKyAnJSc7IHRyYWNrLmFwcGVuZENoaWxkKGZpbGwpOwogICAgdmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IG1ldGEuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1tZXRhJzsgbWV0YS50ZXh0Q29udGVudCA9IGRlZi5mbXQodmFsdWUsIGRlZi5nb2FsKTsKICAgIHByb2cuYXBwZW5kQ2hpbGQodHJhY2spOyBwcm9nLmFwcGVuZENoaWxkKG1ldGEpOyBpdGVtLmFwcGVuZENoaWxkKHByb2cpOwogICAgdmFyIGZvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZm9vdC5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLWZvb3QnOwogICAgaWYgKGRvbmUpewogICAgICB2YXIgd2hlbiA9IGQuY2hhbGxlbmdlc1tkZWYuaWRdID8gbmV3IERhdGUoZC5jaGFsbGVuZ2VzW2RlZi5pZF0pIDogbnVsbDsKICAgICAgZm9vdC50ZXh0Q29udGVudCA9IHdoZW4gPyAnSG/DoG4gdGjDoG5oIG5nw6B5ICcgKyB3aGVuLnRvTG9jYWxlRGF0ZVN0cmluZygndmktVk4nKSA6ICfEkMOjIGhvw6BuIHRow6BuaCc7CiAgICB9IGVsc2UgZm9vdC50ZXh0Q29udGVudCA9ICdUaeG6v24gxJHhu5k6ICcgKyBwZXJjZW50ICsgJyUnOwogICAgaXRlbS5hcHBlbmRDaGlsZChmb290KTsKICAgIHJldHVybiBpdGVtOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyQ2hhbGxlbmdlcygpewogICAgaWYgKCFlbHMuY2hhbGxlbmdlQm9keSkgcmV0dXJuOwogICAgdmFyIHMgPSBjaGFsbGVuZ2VTdGF0cygpLCBkID0gbG9hZERCKCk7CiAgICBlbHMuY2hhbGxlbmdlQm9keS50ZXh0Q29udGVudCA9ICcnOwogICAgdmFyIGRvbmUgPSBDSEFMTEVOR0VTLmZpbHRlcihmdW5jdGlvbihkZWYpeyByZXR1cm4gY2hhbGxlbmdlQ29tcGxldGVkKGRlZiwgcyk7IH0pLmxlbmd0aDsKICAgIHZhciBoZXJvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGhlcm8uY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1oZXJvJzsKICAgIGhlcm8uYXBwZW5kQ2hpbGQoc3RhdEJveCgnxJDDoyBob8OgbiB0aMOgbmgnLCBkb25lICsgJy81JykpOwogICAgaGVyby5hcHBlbmRDaGlsZChzdGF0Qm94KCdHw7NpIMSRw6MgbeG7nycsIFN0cmluZyhzLnBhY2tzKSkpOwogICAgaGVyby5hcHBlbmRDaGlsZChzdGF0Qm94KCdMw6EgxJHhu5ljIG5o4bqldCcsIFN0cmluZyhzLnVuaXF1ZSkpKTsKICAgIGVscy5jaGFsbGVuZ2VCb2R5LmFwcGVuZENoaWxkKGhlcm8pOwogICAgdmFyIGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbGlzdC5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLWxpc3QnOwogICAgQ0hBTExFTkdFUy5mb3JFYWNoKGZ1bmN0aW9uKGRlZil7IGxpc3QuYXBwZW5kQ2hpbGQoY2hhbGxlbmdlQ2FyZChkZWYsIHMsIGQpKTsgfSk7CiAgICBlbHMuY2hhbGxlbmdlQm9keS5hcHBlbmRDaGlsZChsaXN0KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5DaGFsbGVuZ2VNb2RhbCgpeyByZW5kZXJDaGFsbGVuZ2VzKCk7IGVscy5jaGFsbGVuZ2VNb2RhbC5oaWRkZW4gPSBmYWxzZTsgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7IH0KICBmdW5jdGlvbiBjbG9zZUNoYWxsZW5nZU1vZGFsKCl7IGVscy5jaGFsbGVuZ2VNb2RhbC5oaWRkZW4gPSB0cnVlOyBlbHMuY2hhbGxlbmdlQm9keS50ZXh0Q29udGVudCA9ICcnOyBzZXRNb2RhbFZpZXdwb3J0T3BlbihmYWxzZSk7IH0KICBlbHMuY2hhbGxlbmdlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkNoYWxsZW5nZU1vZGFsKTsKICBlbHMuY2hhbGxlbmdlQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUNoYWxsZW5nZU1vZGFsKTsKICBlbHMuY2hhbGxlbmdlQmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUNoYWxsZW5nZU1vZGFsKTsKCiAgZnVuY3Rpb24gbWFya1N0b3JlZENhcmRTZWVuKGUpewogICAgaWYgKCFlIHx8ICFlLmlkIHx8ICFlLm5ld0Zyb21TaG9wKSByZXR1cm47CiAgICB2YXIgZCA9IGxvYWREQigpOwogICAgaWYgKGQuY2FyZHMgJiYgZC5jYXJkc1tlLmlkXSAmJiBkLmNhcmRzW2UuaWRdLm5ld0Zyb21TaG9wKXsKICAgICAgZC5jYXJkc1tlLmlkXS5uZXdGcm9tU2hvcCA9IGZhbHNlOwogICAgICBkZWxldGUgZC5jYXJkc1tlLmlkXS5sYXN0U2hvcFJlZGVlbWVkQXQ7CiAgICAgIHNhdmVEQigpOwogICAgICBlLm5ld0Zyb21TaG9wID0gZmFsc2U7CiAgICAgIHVwZGF0ZUNvbEJhZGdlKCk7CiAgICAgIGlmIChlbHMuY29sTW9kYWwgJiYgIWVscy5jb2xNb2RhbC5oaWRkZW4pIHJlbmRlckNvbGxlY3Rpb24oKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG9wZW5TdG9yZWRDYXJkKGUpewogICAgLy8gWGVtIHRo4bq7ID0gxJHDoyDEkeG7jWMgdGjDtG5nIGLDoW8gTeG7m2kuCiAgICBtYXJrU3RvcmVkQ2FyZFNlZW4oZSk7CiAgICAvLyBM4bqleSBk4buvIGxp4buHdSDEkeG6p3kgxJHhu6cgbuG6v3UgY8OzIHRyb25nIGNhY2hlLCBu4bq/dSBraMO0bmcgdGjDrCBk4buxbmcgdOG7qyBk4buvIGxp4buHdSDEkcOjIGzGsHUuCiAgICB2YXIgY2FjaGVkID0gc3RhdGUuY2FjaGUuZ2V0KGUuaWQpOwogICAgaWYgKGNhY2hlZCl7IG9wZW5DYXJkTW9kYWwoY2FjaGVkLCByYXJpdHlUaWVyKGNhY2hlZC5yYXJpdHkpLCBwcmljZVVTRChjYWNoZWQpKTsgcmV0dXJuOyB9CiAgICBnZXRKU09OKEFQSSArICcvY2FyZHMvJyArIGUuaWQpLnRoZW4oZnVuY3Rpb24oYyl7CiAgICAgIHN0YXRlLmNhY2hlLnNldChlLmlkLCBjKTsKICAgICAgb3BlbkNhcmRNb2RhbChjLCByYXJpdHlUaWVyKGMucmFyaXR5KSwgcHJpY2VVU0QoYykpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsKICAgICAgb3BlbkNhcmRNb2RhbCh7IGlkOmUuaWQsIG5hbWU6ZS5uYW1lLCBpbWFnZTplLmltZywgcmFyaXR5OmUucmFyaXR5LCB0aWVyOmUudGllciwKICAgICAgICAgIHNldDp7aWQ6ZS5zZXRJZCB8fCAnJywgbmFtZTplLnNldCB8fCAnJ30sIGxvY2FsSWQ6ZS5sb2NhbElkIHx8ICcnIH0sCiAgICAgICAgeyB0aWVyOiBlLnRpZXJ8fDAsIGxhYmVsOiBlLnJhcml0eSB8fCB0aWVyTGFiZWxUZXh0KGUudGllcnx8MCkgfSwKICAgICAgICB0eXBlb2YgZS5wcmljZSA9PT0gJ251bWJlcicgPyBlLnByaWNlIDogbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG9wZW5Db2xNb2RhbCgpewogICAgcmVuZGVyQ29sbGVjdGlvbigpOwogICAgZWxzLmNvbE1vZGFsLmhpZGRlbiA9IGZhbHNlOwogICAgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7CiAgfQogIGZ1bmN0aW9uIGNsb3NlQ29sTW9kYWwoKXsKICAgIGVscy5jb2xNb2RhbC5oaWRkZW4gPSB0cnVlOwogICAgZWxzLmNvbEJvZHkudGV4dENvbnRlbnQgPSAnJzsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKGZhbHNlKTsKICB9CiAgZWxzLmNvbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Db2xNb2RhbCk7CiAgZWxzLmNvbENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VDb2xNb2RhbCk7CiAgZWxzLmNvbEJhY2tkcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VDb2xNb2RhbCk7CgogIC8vIC0tLS0tLS0tLS0gQ0hJQSBT4bq6IOG6ok5IIC0tLS0tLS0tLS0KICBmdW5jdGlvbiBkb3dubG9hZEJsb2IoYmxvYiwgbmFtZSl7CiAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gdXJsOyBhLmRvd25sb2FkID0gbmFtZTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgYS5yZW1vdmUoKTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOyB9LCA0MDAwKTsKICB9CgogIGZ1bmN0aW9uIGxvYWRJbWdDT1JTKHNyYyl7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzKXsKICAgICAgdmFyIGltID0gbmV3IEltYWdlKCk7CiAgICAgIGltLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7CiAgICAgIGltLm9ubG9hZCA9IGZ1bmN0aW9uKCl7IHJlcyhpbSk7IH07CiAgICAgIGltLm9uZXJyb3IgPSBmdW5jdGlvbigpeyByZXMobnVsbCk7IH07CiAgICAgIGltLnNyYyA9IHNyYzsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcm91bmRSZWN0KGcsIHgsIHksIHcsIGgsIHIpewogICAgZy5iZWdpblBhdGgoKTsKICAgIGcubW92ZVRvKHgrciwgeSk7CiAgICBnLmxpbmVUbyh4K3ctciwgeSk7IGcucXVhZHJhdGljQ3VydmVUbyh4K3csIHksIHgrdywgeStyKTsKICAgIGcubGluZVRvKHgrdywgeStoLXIpOyBnLnF1YWRyYXRpY0N1cnZlVG8oeCt3LCB5K2gsIHgrdy1yLCB5K2gpOwogICAgZy5saW5lVG8oeCtyLCB5K2gpOyBnLnF1YWRyYXRpY0N1cnZlVG8oeCwgeStoLCB4LCB5K2gtcik7CiAgICBnLmxpbmVUbyh4LCB5K3IpOyBnLnF1YWRyYXRpY0N1cnZlVG8oeCwgeSwgeCtyLCB5KTsKICAgIGcuY2xvc2VQYXRoKCk7CiAgfQoKICB2YXIgVElFUl9DT0xPUlMgPSBbJyMzYTNmNmInLCcjNmJlOGMwJywnIzZiZThjMCcsJyM0YTdmZmYnLCcjYzk2YmZmJywnI2ZmOGZkMCcsJyNmZmQzNWMnXTsKCiAgZnVuY3Rpb24gZml0VGV4dChnLCB0ZXh0LCBtYXgpewogICAgdmFyIHQgPSB0ZXh0IHx8ICcnOwogICAgd2hpbGUgKHQubGVuZ3RoID4gNCAmJiBnLm1lYXN1cmVUZXh0KHQpLndpZHRoID4gbWF4KSB0ID0gdC5zbGljZSgwLCAtMik7CiAgICByZXR1cm4gdCA9PT0gdGV4dCA/IHQgOiB0ICsgJ+KApic7CiAgfQoKICBmdW5jdGlvbiBidWlsZFNoYXJlQ2FudmFzKG9wdHMsIG5vSW1hZ2VzKXsKICAgIHZhciBXID0gMTIwMCwgSCA9IDYzMDsKICAgIHZhciBjdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgY3Yud2lkdGggPSBXOyBjdi5oZWlnaHQgPSBIOwogICAgdmFyIGcgPSBjdi5nZXRDb250ZXh0KCcyZCcpOwoKICAgIHZhciBiZyA9IGcuY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgVywgSCk7CiAgICBiZy5hZGRDb2xvclN0b3AoMCwgJyMxMjE0MmEnKTsKICAgIGJnLmFkZENvbG9yU3RvcCgwLjUsICcjMGEwYjE2Jyk7CiAgICBiZy5hZGRDb2xvclN0b3AoMSwgJyMxYjEwMzgnKTsKICAgIGcuZmlsbFN0eWxlID0gYmc7IGcuZmlsbFJlY3QoMCwgMCwgVywgSCk7CiAgICBnLmZpbGxTdHlsZSA9ICdyZ2JhKDI1NSwyNTUsMjU1LC4wMzUpJzsKICAgIGZvciAodmFyIGkgPSAtSDsgaSA8IFc7IGkgKz0gMjYpIHsgZy5zYXZlKCk7IGcudHJhbnNsYXRlKGksIDApOyBnLnJvdGF0ZSgwLjI1KTsgZy5maWxsUmVjdCgwLCAtMjAwLCA4LCBIKjIpOyBnLnJlc3RvcmUoKTsgfQoKICAgIGcuZmlsbFN0eWxlID0gJyNmMmYxZmInOwogICAgZy5mb250ID0gJzcwMCA0NnB4ICJTcGFjZSBHcm90ZXNrIiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmJzsKICAgIGcuZmlsbFRleHQoZml0VGV4dChnLCBvcHRzLnRpdGxlLCA5MDApLCA2MCwgODYpOwogICAgZy5maWxsU3R5bGUgPSAnIzk0OTdjNCc7CiAgICBnLmZvbnQgPSAnNDAwIDI0cHggSW50ZXIsIHN5c3RlbS11aSwgc2Fucy1zZXJpZic7CiAgICBnLmZpbGxUZXh0KGZpdFRleHQoZywgb3B0cy5zdWIgfHwgJycsIDk1MCksIDYwLCAxMjYpOwogICAgZy5maWxsU3R5bGUgPSAnI2ZmZDM1Yyc7CiAgICBnLmJlZ2luUGF0aCgpOyBnLmFyYyhXIC0gNzAsIDc0LCAxMCwgMCwgTWF0aC5QSSoyKTsgZy5maWxsKCk7CgogICAgdmFyIGNhcmRzID0gKG9wdHMuY2FyZHMgfHwgW10pLnNsaWNlKDAsIDUpOwogICAgdmFyIHNsb3RXID0gMTc4LCBzbG90SCA9IDI0NSwgZ2FwID0gMjI7CiAgICB2YXIgdG90YWxXID0gY2FyZHMubGVuZ3RoICogc2xvdFcgKyBNYXRoLm1heCgwLCBjYXJkcy5sZW5ndGggLSAxKSAqIGdhcDsKICAgIHZhciB4MCA9IChXIC0gdG90YWxXKSAvIDIsIHkwID0gMTkwOwoKICAgIHJldHVybiBQcm9taXNlLmFsbChjYXJkcy5tYXAoZnVuY3Rpb24oYyl7CiAgICAgIHJldHVybiAobm9JbWFnZXMgfHwgIWMuaW1hZ2UpID8gUHJvbWlzZS5yZXNvbHZlKG51bGwpIDogbG9hZEltZ0NPUlMoYy5pbWFnZSArICcvJyArIFFVQUxJVFkpOwogICAgfSkpLnRoZW4oZnVuY3Rpb24oaW1ncyl7CiAgICAgIGNhcmRzLmZvckVhY2goZnVuY3Rpb24oYywgaWR4KXsKICAgICAgICB2YXIgeCA9IHgwICsgaWR4ICogKHNsb3RXICsgZ2FwKTsKICAgICAgICB2YXIgY29sID0gVElFUl9DT0xPUlNbTWF0aC5tYXgoMCwgTWF0aC5taW4oNiwgYy50aWVyIHx8IDApKV07CiAgICAgICAgZy5zYXZlKCk7CiAgICAgICAgZy5zaGFkb3dDb2xvciA9IGNvbDsgZy5zaGFkb3dCbHVyID0gKGMudGllciB8fCAwKSA+PSA0ID8gMjYgOiA4OwogICAgICAgIHJvdW5kUmVjdChnLCB4LCB5MCwgc2xvdFcsIHNsb3RILCAxMik7CiAgICAgICAgZy5maWxsU3R5bGUgPSAnIzE4MWIzOCc7IGcuZmlsbCgpOwogICAgICAgIGcucmVzdG9yZSgpOwogICAgICAgIHZhciBpbSA9IGltZ3NbaWR4XTsKICAgICAgICBpZiAoaW0pewogICAgICAgICAgZy5zYXZlKCk7CiAgICAgICAgICByb3VuZFJlY3QoZywgeCArIDMsIHkwICsgMywgc2xvdFcgLSA2LCBzbG90SCAtIDYsIDEwKTsKICAgICAgICAgIGcuY2xpcCgpOwogICAgICAgICAgZy5kcmF3SW1hZ2UoaW0sIHggKyAzLCB5MCArIDMsIHNsb3RXIC0gNiwgc2xvdEggLSA2KTsKICAgICAgICAgIGcucmVzdG9yZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnLmZpbGxTdHlsZSA9ICcjOTQ5N2M0JzsKICAgICAgICAgIGcuZm9udCA9ICc2MDAgMTVweCBJbnRlciwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmJzsKICAgICAgICAgIHZhciBubSA9IGZpdFRleHQoZywgYy5uYW1lIHx8ICc/Jywgc2xvdFcgLSAyNCk7CiAgICAgICAgICBnLmZpbGxUZXh0KG5tLCB4ICsgMTIsIHkwICsgc2xvdEgvMik7CiAgICAgICAgfQogICAgICAgIGcuc3Ryb2tlU3R5bGUgPSBjb2w7IGcubGluZVdpZHRoID0gKGMudGllciB8fCAwKSA+PSA0ID8gMyA6IDEuNTsKICAgICAgICByb3VuZFJlY3QoZywgeCwgeTAsIHNsb3RXLCBzbG90SCwgMTIpOyBnLnN0cm9rZSgpOwoKICAgICAgICBnLmZpbGxTdHlsZSA9IHR5cGVvZiBjLnByaWNlID09PSAnbnVtYmVyJyA/ICcjZmZkMzVjJyA6ICcjNmY3MmEwJzsKICAgICAgICBnLmZvbnQgPSAnNzAwIDE3cHggIlNwYWNlIEdyb3Rlc2siLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYnOwogICAgICAgIHZhciBwdCA9IHR5cGVvZiBjLnByaWNlID09PSAnbnVtYmVyJyA/IG1vbmV5KGMucHJpY2UpIDogJ+KAlCc7CiAgICAgICAgZy5maWxsVGV4dChwdCwgeCArIDIsIHkwICsgc2xvdEggKyAyNik7CiAgICAgICAgZy5maWxsU3R5bGUgPSAnIzk0OTdjNCc7CiAgICAgICAgZy5mb250ID0gJzQwMCAxM3B4IEludGVyLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYnOwogICAgICAgIGcuZmlsbFRleHQoZml0VGV4dChnLCBjLm5hbWUgfHwgJycsIHNsb3RXIC0gNCksIHggKyAyLCB5MCArIHNsb3RIICsgNDYpOwogICAgICB9KTsKCiAgICAgIHZhciBzdGF0cyA9IG9wdHMuc3RhdHMgfHwgW107CiAgICAgIHZhciBzeSA9IDUyMCwgc3cgPSAyNjAsIHN4ID0gNjA7CiAgICAgIHN0YXRzLnNsaWNlKDAsIDQpLmZvckVhY2goZnVuY3Rpb24oc3QsIGlkeCl7CiAgICAgICAgdmFyIHggPSBzeCArIGlkeCAqIHN3OwogICAgICAgIGcuZmlsbFN0eWxlID0gJ3JnYmEoMjU1LDI1NSwyNTUsLjA1KSc7CiAgICAgICAgcm91bmRSZWN0KGcsIHgsIHN5LCBzdyAtIDIyLCA3NCwgMTIpOyBnLmZpbGwoKTsKICAgICAgICBnLmZpbGxTdHlsZSA9IHN0WzJdID09PSAnbmVnJyA/ICcjZmY5YTlhJyA6IChzdFsyXSA9PT0gJ3BvcycgPyAnIzZiZThjMCcgOiAnI2YyZjFmYicpOwogICAgICAgIGcuZm9udCA9ICc3MDAgMjhweCAiU3BhY2UgR3JvdGVzayIsIHN5c3RlbS11aSwgc2Fucy1zZXJpZic7CiAgICAgICAgZy5maWxsVGV4dChmaXRUZXh0KGcsIHN0WzFdLCBzdyAtIDQ2KSwgeCArIDE2LCBzeSArIDM4KTsKICAgICAgICBnLmZpbGxTdHlsZSA9ICcjOTQ5N2M0JzsKICAgICAgICBnLmZvbnQgPSAnNDAwIDE0cHggSW50ZXIsIHN5c3RlbS11aSwgc2Fucy1zZXJpZic7CiAgICAgICAgZy5maWxsVGV4dChmaXRUZXh0KGcsIHN0WzBdLCBzdyAtIDQ2KSwgeCArIDE2LCBzeSArIDYwKTsKICAgICAgfSk7CgogICAgICBnLmZpbGxTdHlsZSA9ICcjNmY3MmEwJzsKICAgICAgZy5mb250ID0gJzUwMCAxNXB4IEludGVyLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWYnOwogICAgICBnLmZpbGxUZXh0KCdQb2tlSHViIFx1MDBiNyBk4buvIGxp4buHdSAmIGdpw6EgdOG7qyBUQ0dkZXgnLCA2MCwgNjEyKTsKICAgICAgcmV0dXJuIGN2OwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBleHBvcnRDYW52YXMoY3YsIHRleHQsIG9uRmFpbCl7CiAgICB2YXIgb2sgPSB0cnVlOwogICAgdHJ5IHsKICAgICAgY3YudG9CbG9iKGZ1bmN0aW9uKGJsb2IpewogICAgICAgIGlmICghYmxvYil7IGlmIChvbkZhaWwpIG9uRmFpbCgpOyByZXR1cm47IH0KICAgICAgICB2YXIgbmFtZSA9ICdwb2tlaHViLScgKyBEYXRlLm5vdygpICsgJy5wbmcnOwogICAgICAgIHZhciBmaWxlID0gbnVsbDsKICAgICAgICB0cnkgeyBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBuYW1lLCB7dHlwZTonaW1hZ2UvcG5nJ30pOyB9IGNhdGNoKGUpe30KICAgICAgICBpZiAoZmlsZSAmJiBuYXZpZ2F0b3IuY2FuU2hhcmUgJiYgbmF2aWdhdG9yLnNoYXJlICYmIG5hdmlnYXRvci5jYW5TaGFyZSh7ZmlsZXM6W2ZpbGVdfSkpewogICAgICAgICAgbmF2aWdhdG9yLnNoYXJlKHsgZmlsZXM6W2ZpbGVdLCB0ZXh0OnRleHQgfHwgJycsIHRpdGxlOidQb2tlSHViJyB9KQogICAgICAgICAgICAudGhlbihmdW5jdGlvbigpeyB0b2FzdCgnxJDDoyBt4bufIGLhuqNuZyBjaGlhIHPhursnKTsgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKCl7IGRvd25sb2FkQmxvYihibG9iLCBuYW1lKTsgdG9hc3QoJ8SQw6MgdOG6o2kg4bqjbmggduG7gSBtw6F5Jyk7IH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkb3dubG9hZEJsb2IoYmxvYiwgbmFtZSk7CiAgICAgICAgICB0b2FzdCgnxJDDoyB04bqjaSDhuqNuaCB24buBIG3DoXkg4oCUIMSRxINuZyBsw6puIEZhY2Vib29rL1gvSW5zdGFncmFtIGzDoCB4b25nJyk7CiAgICAgICAgfQogICAgICB9LCAnaW1hZ2UvcG5nJyk7CiAgICB9IGNhdGNoKGUpewogICAgICBvayA9IGZhbHNlOwogICAgICBpZiAob25GYWlsKSBvbkZhaWwoKTsKICAgIH0KICAgIHJldHVybiBvazsKICB9CgogIGZ1bmN0aW9uIG1ha2VBbmRTaGFyZShvcHRzKXsKICAgIHRvYXN0KCfEkGFuZyB04bqhbyDhuqNuaOKApicpOwogICAgYnVpbGRTaGFyZUNhbnZhcyhvcHRzLCBmYWxzZSkudGhlbihmdW5jdGlvbihjdil7CiAgICAgIGV4cG9ydENhbnZhcyhjdiwgb3B0cy50ZXh0LCBmdW5jdGlvbigpewogICAgICAgIC8vIGFuaCB0aGUgYmkgY2hhbiBDT1JTIC0+IHZlIGxhaSBraG9uZyBjbyBhbmggdGhlCiAgICAgICAgYnVpbGRTaGFyZUNhbnZhcyhvcHRzLCB0cnVlKS50aGVuKGZ1bmN0aW9uKGN2Mil7CiAgICAgICAgICBleHBvcnRDYW52YXMoY3YyLCBvcHRzLnRleHQsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHRvYXN0KCdUcsOsbmggZHV54buHdCBraMO0bmcgY2hvIHBow6lwIHh14bqldCDhuqNuaCDhu58gdHJhbmcgbsOgeS4nKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgLy8gLS0tLS0tLS0tLSBwaMOhbyBob2EgLyBjb25mZXR0aSAtLS0tLS0tLS0tCiAgdmFyIHJlZHVjZU1vdGlvbiA9IHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7CiAgdmFyIGNvbmYgPSB7IGN0eDpudWxsLCBwYXJ0czpbXSwgcmFmOjAsIHc6MCwgaDowLCBkcHI6MSB9OwogIHZhciBDT05GX0NPTE9SUyA9IFsnI2ZmZDM1YycsJyNmZjhmZDAnLCcjYzk2YmZmJywnIzRhN2ZmZicsJyM2YmU4YzAnLCcjZmZmZmZmJ107CgogIGZ1bmN0aW9uIGNvbmZTaXplKCl7CiAgICB2YXIgciA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBjb25mLmRwciA9IE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsIDIpOwogICAgY29uZi53ID0gci53aWR0aDsgY29uZi5oID0gci5oZWlnaHQ7CiAgICBlbHMuY29uZmV0dGkud2lkdGggPSBNYXRoLnJvdW5kKGNvbmYudyAqIGNvbmYuZHByKTsKICAgIGVscy5jb25mZXR0aS5oZWlnaHQgPSBNYXRoLnJvdW5kKGNvbmYuaCAqIGNvbmYuZHByKTsKICAgIGNvbmYuY3R4LnNldFRyYW5zZm9ybShjb25mLmRwciwgMCwgMCwgY29uZi5kcHIsIDAsIDApOwogIH0KCiAgZnVuY3Rpb24gY29uZlJlYWR5KCl7CiAgICBpZiAoIWVscy5jb25mZXR0aSB8fCByZWR1Y2VNb3Rpb24pIHJldHVybiBmYWxzZTsKICAgIGlmICghY29uZi5jdHgpewogICAgICBjb25mLmN0eCA9IGVscy5jb25mZXR0aS5nZXRDb250ZXh0KCcyZCcpOwogICAgICBpZiAoIWNvbmYuY3R4KSByZXR1cm4gZmFsc2U7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbigpeyBpZiAoY29uZi5jdHgpIGNvbmZTaXplKCk7IH0pOwogICAgfQogICAgY29uZlNpemUoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gY29uZlRpY2soKXsKICAgIHZhciBjdHggPSBjb25mLmN0eDsKICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY29uZi53LCBjb25mLmgpOwogICAgdmFyIGFsaXZlID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZi5wYXJ0cy5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciBwID0gY29uZi5wYXJ0c1tpXTsKICAgICAgaWYgKHAuZGVhZCkgY29udGludWU7CiAgICAgIHAudnkgKz0gMC4yNjsKICAgICAgcC52eCAqPSAwLjk5OyBwLnZ5ICo9IDAuOTk7CiAgICAgIHAueCArPSBwLnZ4OyBwLnkgKz0gcC52eTsKICAgICAgcC5yb3QgKz0gcC52cjsKICAgICAgcC5saWZlIC09IDE7CiAgICAgIGlmIChwLnkgPiBjb25mLmggKyAzMCB8fCBwLmxpZmUgPD0gMCl7IHAuZGVhZCA9IHRydWU7IGNvbnRpbnVlOyB9CiAgICAgIGFsaXZlKys7CiAgICAgIGN0eC5zYXZlKCk7CiAgICAgIGN0eC50cmFuc2xhdGUocC54LCBwLnkpOwogICAgICBjdHgucm90YXRlKHAucm90KTsKICAgICAgY3R4Lmdsb2JhbEFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcC5saWZlIC8gNDApKTsKICAgICAgY3R4LmZpbGxTdHlsZSA9IHAuY29sb3I7CiAgICAgIGN0eC5maWxsUmVjdCgtcC53IC8gMiwgLXAuaCAvIDIsIHAudywgcC5oICogKDAuNCArIDAuNiAqIE1hdGguYWJzKE1hdGguY29zKHAucm90KSkpKTsKICAgICAgY3R4LnJlc3RvcmUoKTsKICAgIH0KICAgIGlmIChhbGl2ZSl7CiAgICAgIGNvbmYucmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNvbmZUaWNrKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbmYucGFydHMgPSBbXTsKICAgICAgY29uZi5yYWYgPSAwOwogICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNvbmYudywgY29uZi5oKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbmZCdXJzdCh4LCB5LCBjb3VudCwgcG93ZXIpewogICAgaWYgKCFjb25mUmVhZHkoKSkgcmV0dXJuOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKXsKICAgICAgdmFyIGFuZyA9IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMjsKICAgICAgdmFyIHNwZCA9ICgwLjQgKyBNYXRoLnJhbmRvbSgpKSAqIHBvd2VyOwogICAgICBjb25mLnBhcnRzLnB1c2goewogICAgICAgIHg6IHgsIHk6IHksCiAgICAgICAgdng6IE1hdGguY29zKGFuZykgKiBzcGQsCiAgICAgICAgdnk6IE1hdGguc2luKGFuZykgKiBzcGQgLSBwb3dlciAqIDAuNDUsCiAgICAgICAgcm90OiBNYXRoLnJhbmRvbSgpICogTWF0aC5QSSwKICAgICAgICB2cjogKE1hdGgucmFuZG9tKCkgLSAwLjUpICogMC4zLAogICAgICAgIHc6IDUgKyBNYXRoLnJhbmRvbSgpICogNSwKICAgICAgICBoOiA4ICsgTWF0aC5yYW5kb20oKSAqIDcsCiAgICAgICAgY29sb3I6IENPTkZfQ09MT1JTWyhNYXRoLnJhbmRvbSgpICogQ09ORl9DT0xPUlMubGVuZ3RoKSB8IDBdLAogICAgICAgIGxpZmU6IDkwICsgTWF0aC5yYW5kb20oKSAqIDYwCiAgICAgIH0pOwogICAgfQogICAgaWYgKGNvbmYucGFydHMubGVuZ3RoID4gNDIwKSBjb25mLnBhcnRzLnNwbGljZSgwLCBjb25mLnBhcnRzLmxlbmd0aCAtIDQyMCk7CiAgICBpZiAoIWNvbmYucmFmKSBjb25mLnJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjb25mVGljayk7CiAgfQoKICBmdW5jdGlvbiBjb25mQ2VsZWJyYXRlKGJpZyl7CiAgICBpZiAoIWNvbmZSZWFkeSgpKSByZXR1cm47CiAgICB2YXIgbiA9IGJpZyA/IDkwIDogNTUsIHAgPSBiaWcgPyAxMyA6IDEwOwogICAgY29uZkJ1cnN0KGNvbmYudyAqIDAuMTIsIGNvbmYuaCAqIDAuOTIsIG4sIHApOwogICAgY29uZkJ1cnN0KGNvbmYudyAqIDAuODgsIGNvbmYuaCAqIDAuOTIsIG4sIHApOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpeyBjb25mQnVyc3QoY29uZi53ICogMC41LCBjb25mLmggKiAwLjg1LCBuLCBwKTsgfSwgMjIwKTsKICAgIGlmIChiaWcpIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgY29uZkJ1cnN0KGNvbmYudyAqIDAuMywgY29uZi5oICogMC45LCBuLCBwKTsKICAgICAgY29uZkJ1cnN0KGNvbmYudyAqIDAuNywgY29uZi5oICogMC45LCBuLCBwKTsKICAgIH0sIDQ2MCk7CiAgfQoKICBmdW5jdGlvbiBjb25mQXRFbGVtZW50KGVsLCB0aWVyKXsKICAgIGlmICghY29uZlJlYWR5KCkpIHJldHVybjsKICAgIHZhciByID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHJyID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGNvbmZCdXJzdChyLmxlZnQgLSByci5sZWZ0ICsgci53aWR0aCAvIDIsIHIudG9wIC0gcnIudG9wICsgci5oZWlnaHQgLyAyLAogICAgICAgICAgICAgIHRpZXIgPj0gNiA/IDYwIDogMzYsIHRpZXIgPj0gNiA/IDExIDogOCk7CiAgfQoKICBmdW5jdGlvbiBjbGVhckNvbmZldHRpKCl7CiAgICBpZiAoY29uZi5yYWYpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGNvbmYucmFmKTsKICAgIGNvbmYucmFmID0gMDsgY29uZi5wYXJ0cyA9IFtdOwogICAgaWYgKGNvbmYuY3R4KSBjb25mLmN0eC5jbGVhclJlY3QoMCwgMCwgY29uZi53LCBjb25mLmgpOwogIH0KCiAgLy8gLS0tLS0tLS0tLSBjaGkgdGnhur90IGzDoSBiw6BpIChtb2RhbCkgLS0tLS0tLS0tLQogIHZhciBtb2RhbE9wZW4gPSBmYWxzZTsKICB2YXIgbGFzdEZvY3VzZWQgPSBudWxsOwoKICBmdW5jdGlvbiBzZXRNb2RhbFZpZXdwb3J0T3BlbigpewogICAgLy8gS2jDtG5nIGtow7NhIHJvb3Qga2hpIGPDsm4gbW9kYWwga2jDoWMgxJFhbmcgbeG7nyAodsOtIGThu6UgQuG7mSBzxrB1IHThuq1wIG7hurFtIGTGsOG7m2kgQ2hpIHRp4bq/dCB0aOG6uykuCiAgICAvLyBLaeG7g20gdHJhIHRy4bqhbmcgdGjDoWkgaGlkZGVuIHRo4buxYyB04bq/IHRoYXkgdsOsIGThu7FhIHbDoG8gdGhhbSBz4buRIG9wZW4gY+G7p2EgbW9kYWwgduG7q2EgdGhhbyB0w6FjLgogICAgdmFyIGFueU9wZW5Nb2RhbCA9IHJvb3QucXVlcnlTZWxlY3RvcignLnBoLW1vZGFsOm5vdChbaGlkZGVuXSknKTsKICAgIHJvb3Quc3R5bGUub3ZlcmZsb3cgPSBhbnlPcGVuTW9kYWwgPyAndmlzaWJsZScgOiAnaGlkZGVuJzsKICB9CgogIGZ1bmN0aW9uIGNsb3NlQ2FyZE1vZGFsKCl7CiAgICBpZiAoIW1vZGFsT3BlbikgcmV0dXJuOwogICAgbW9kYWxPcGVuID0gZmFsc2U7CiAgICBlbHMubW9kYWwuaGlkZGVuID0gdHJ1ZTsKICAgIHZhciByZXR1cm5Ub1BhY2sgPSBwYWNrRGV0YWlsUmV0dXJuOwogICAgcGFja0RldGFpbFJldHVybiA9IGZhbHNlOwogICAgaWYgKHJldHVyblRvUGFjayAmJiBwYWNrRGV0YWlsTW9kYWwpIHBhY2tEZXRhaWxNb2RhbC5oaWRkZW4gPSBmYWxzZTsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKGZhbHNlKTsKICAgIGVscy5tb2RhbEJvZHkudGV4dENvbnRlbnQgPSAnJzsKICAgIGlmIChsYXN0Rm9jdXNlZCAmJiBsYXN0Rm9jdXNlZC5mb2N1cykgbGFzdEZvY3VzZWQuZm9jdXMoKTsKICB9CgogIGZ1bmN0aW9uIG1ldGFSb3cobGFiZWwsIHZhbHVlKXsKICAgIHZhciByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHJvdy5jbGFzc05hbWUgPSAncGgtbW9kYWwtcm93JzsKICAgIHZhciBrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBrLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1rJzsgay50ZXh0Q29udGVudCA9IGxhYmVsOwogICAgdmFyIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IHYuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXYnOyB2LnRleHRDb250ZW50ID0gdmFsdWU7CiAgICByb3cuYXBwZW5kQ2hpbGQoayk7IHJvdy5hcHBlbmRDaGlsZCh2KTsKICAgIHJldHVybiByb3c7CiAgfQoKICBmdW5jdGlvbiBvcGVuQ2FyZE1vZGFsKGNhcmQsIGluZm8sIHVzZCwgbWFya2V0RmFsbGJhY2spewogICAgbGFzdEZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKHBhY2tEZXRhaWxNb2RhbCAmJiAhcGFja0RldGFpbE1vZGFsLmhpZGRlbil7CiAgICAgIHBhY2tEZXRhaWxSZXR1cm4gPSB0cnVlOwogICAgICBwYWNrRGV0YWlsTW9kYWwuaGlkZGVuID0gdHJ1ZTsKICAgIH0KICAgIGVscy5tb2RhbEJvZHkudGV4dENvbnRlbnQgPSAnJzsKCiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgaGVhZC5jbGFzc05hbWUgPSAncGgtbW9kYWwtaGVhZCc7CgogICAgdmFyIGltZ1dyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGltZ1dyYXAuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWltZ3dyYXAnOwogICAgaWYgKGNhcmQuaW1hZ2UpewogICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgIGltZy5hbHQgPSBjYXJkLm5hbWUgfHwgJyc7CiAgICAgIGltZy5zcmMgPSBjYXJkLmltYWdlICsgJy8nICsgUVVBTElUWTsKICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbigpeyBpbWdXcmFwLnRleHRDb250ZW50ID0gY2FyZC5uYW1lIHx8ICc/JzsgfTsKICAgICAgaW1nV3JhcC5hcHBlbmRDaGlsZChpbWcpOwogICAgfSBlbHNlIGltZ1dyYXAudGV4dENvbnRlbnQgPSBjYXJkLm5hbWUgfHwgJz8nOwoKICAgIHZhciBpbmZvMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgaW5mbzEuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWluZm8nOwoKICAgIHZhciB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdGl0bGUuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXRpdGxlJzsKICAgIHRpdGxlLnRleHRDb250ZW50ID0gY2FyZC5uYW1lIHx8ICdLaMO0bmcgcsO1IHTDqm4nOwogICAgaW5mbzEuYXBwZW5kQ2hpbGQodGl0bGUpOwoKICAgIHZhciBzdWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHN1Yi5jbGFzc05hbWUgPSAncGgtbW9kYWwtc3ViJzsKICAgIHZhciBzZXROYW1lID0gY2FyZC5zZXQgJiYgY2FyZC5zZXQubmFtZSA/IGNhcmQuc2V0Lm5hbWUgOiAoc3RhdGUuY3VycmVudCAmJiBzdGF0ZS5jdXJyZW50Lm5hbWUpIHx8ICcnOwogICAgdmFyIG51bSA9IGNhcmQubG9jYWxJZCAhPSBudWxsCiAgICAgID8gKGNhcmQubG9jYWxJZCArIChjYXJkLnNldCAmJiBjYXJkLnNldC5jYXJkQ291bnQgJiYgY2FyZC5zZXQuY2FyZENvdW50LnRvdGFsID8gJy8nICsgY2FyZC5zZXQuY2FyZENvdW50LnRvdGFsIDogJycpKQogICAgICA6ICcnOwogICAgc3ViLnRleHRDb250ZW50ID0gW3NldE5hbWUsIG51bV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyBcdTAwYjcgJyk7CiAgICBpbmZvMS5hcHBlbmRDaGlsZChzdWIpOwoKICAgIHZhciBwcmljZUxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHZhciBmYWxsYmFja0pQWSA9IG1hcmtldEZhbGxiYWNrICYmIG1hcmtldEZhbGxiYWNrLmN1cnJlbmN5ID09PSAnSlBZJyAmJiBOdW1iZXIobWFya2V0RmFsbGJhY2sudmFsdWUpID4gMAogICAgICA/IE51bWJlcihtYXJrZXRGYWxsYmFjay52YWx1ZSkgOiBudWxsOwogICAgdmFyIGhhc1VTRCA9IHVzZCAhPSBudWxsICYmIGlzRmluaXRlKHVzZCkgJiYgTnVtYmVyKHVzZCkgPiAwOwogICAgdmFyIGhhc01vZGFsUHJpY2UgPSBoYXNVU0QgfHwgZmFsbGJhY2tKUFkgIT0gbnVsbDsKICAgIHByaWNlTGluZS5jbGFzc05hbWUgPSAncGgtbW9kYWwtcHJpY2UnICsgKCFoYXNNb2RhbFByaWNlID8gJyBwaC1jYXJkLW5vcHJpY2UnIDogJycpOwogICAgcHJpY2VMaW5lLnRleHRDb250ZW50ID0gaGFzVVNEID8gbW9uZXkodXNkKSA6IChmYWxsYmFja0pQWSAhPSBudWxsID8gbW9uZXlKUFkoZmFsbGJhY2tKUFkpIDogJ0NoxrBhIGPDsyBnacOhIHRo4buLIHRyxrDhu51uZycpOwogICAgaWYgKGhhc1VTRCAmJiBjYXJkICYmIGNhcmQuX3BoTWFya2V0UHJpY2VTb3VyY2UgPT09ICdQcmljZUNoYXJ0aW5nIGVCYXktZGVyaXZlZCBzbmFwc2hvdCcpIHsKICAgICAgcHJpY2VMaW5lLnRpdGxlID0gJ0dpw6EgxrDhu5tjIHTDrW5oIFVTRCB04burIFByaWNlQ2hhcnRpbmcgZOG7sWEgdHLDqm4gbOG7i2NoIHPhu60gZ2lhbyBk4buLY2ggxJHDoyBob8OgbiB04bqldCAoYmFvIGfhu5NtIGVCYXkpOyBraeG7g20gdHJhICcgKyBNNkFfUkdCX1VTRF9QUklDRV9TTkFQU0hPVCArICcgwrcgJyArIChjYXJkLl9waE1hcmtldFByaWNlU291cmNlVVJMIHx8IE02QV9VU0RfUFJJQ0VfU09VUkNFKTsKICAgIH0gZWxzZSBpZiAoaGFzVVNEICYmIGNhcmQgJiYgY2FyZC5fcGhNYXJrZXRQcmljZVNvdXJjZSA9PT0gJ1NwYXJrbCBVU0Qgc25hcHNob3QnKSB7CiAgICAgIHByaWNlTGluZS50aXRsZSA9ICdHacOhIHRoYW0ga2jhuqNvIFVTRCB04burIFRDR3BsYXllci9DYXJkbWFya2V0OyBuZ3Xhu5NuIFNwYXJrbCwgc25hcHNob3QgJyArIE02QV9VU0RfUFJJQ0VfU05BUFNIT1Q7CiAgICB9IGVsc2UgaWYgKGhhc1VTRCkgewogICAgICBwcmljZUxpbmUudGl0bGUgPSAnR2nDoSB0aGFtIGto4bqjbyBVU0QgdOG7qyBUQ0dkZXgnOwogICAgfSBlbHNlIGlmIChmYWxsYmFja0pQWSAhPSBudWxsKSB7CiAgICAgIHByaWNlTGluZS50aXRsZSA9ICdHacOhIHRoYW0ga2jhuqNvIHRo4buLIHRyxrDhu51uZyBOaOG6rXQgQuG6o24gKEpQWSksIG5ndeG7k24gUG9rZWNhTmF2aTsgc25hcHNob3QgJyArIE02QV9KUFlfUFJJQ0VfU05BUFNIT1Q7CiAgICB9CiAgICBpbmZvMS5hcHBlbmRDaGlsZChwcmljZUxpbmUpOwoKICAgIHZhciByb3dzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByb3dzLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1yb3dzJzsKICAgIHJvd3MuYXBwZW5kQ2hpbGQobWV0YVJvdygnxJDhu5kgaGnhur9tJywgKGluZm8ubGFiZWwgfHwgdGllckxhYmVsVGV4dChpbmZvLnRpZXIpKSArICcgKGLhuq1jICcgKyBpbmZvLnRpZXIgKyAnLzYpJykpOwogICAgaWYgKGNhcmQuY2F0ZWdvcnkpIHJvd3MuYXBwZW5kQ2hpbGQobWV0YVJvdygnTG/huqFpJywgY2FyZC5jYXRlZ29yeSkpOwogICAgaWYgKGNhcmQuaHApIHJvd3MuYXBwZW5kQ2hpbGQobWV0YVJvdygnSFAnLCBTdHJpbmcoY2FyZC5ocCkpKTsKICAgIGlmIChBcnJheS5pc0FycmF5KGNhcmQudHlwZXMpICYmIGNhcmQudHlwZXMubGVuZ3RoKSByb3dzLmFwcGVuZENoaWxkKG1ldGFSb3coJ0jhu4cnLCBjYXJkLnR5cGVzLmpvaW4oJywgJykpKTsKICAgIGlmIChjYXJkLmV2b2x2ZUZyb20pIHJvd3MuYXBwZW5kQ2hpbGQobWV0YVJvdygnVGnhur9uIGjDs2EgdOG7qycsIGNhcmQuZXZvbHZlRnJvbSkpOwogICAgaWYgKGNhcmQuaWxsdXN0cmF0b3IpIHJvd3MuYXBwZW5kQ2hpbGQobWV0YVJvdygnSOG7jWEgc8SpJywgY2FyZC5pbGx1c3RyYXRvcikpOwogICAgaWYgKGNhcmQucmV0cmVhdCAhPSBudWxsKSByb3dzLmFwcGVuZENoaWxkKG1ldGFSb3coJ1Bow60gcsO6dCBsdWknLCBTdHJpbmcoY2FyZC5yZXRyZWF0KSkpOwogICAgaW5mbzEuYXBwZW5kQ2hpbGQocm93cyk7CgogICAgaGVhZC5hcHBlbmRDaGlsZChpbWdXcmFwKTsgaGVhZC5hcHBlbmRDaGlsZChpbmZvMSk7CiAgICBlbHMubW9kYWxCb2R5LmFwcGVuZENoaWxkKGhlYWQpOwoKICAgIGlmIChBcnJheS5pc0FycmF5KGNhcmQuYXR0YWNrcykgJiYgY2FyZC5hdHRhY2tzLmxlbmd0aCl7CiAgICAgIHZhciBhdGtXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGF0a1dyYXAuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXNlY3Rpb24nOwogICAgICB2YXIgYXRrVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgYXRrVGl0bGUuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXNlY3Rpb24tdGl0bGUnOwogICAgICBhdGtUaXRsZS50ZXh0Q29udGVudCA9ICdDaGnDqnUgdGjhu6ljJzsKICAgICAgYXRrV3JhcC5hcHBlbmRDaGlsZChhdGtUaXRsZSk7CiAgICAgIGNhcmQuYXR0YWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGEpewogICAgICAgIHZhciBhdGsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBhdGsuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWF0dGFjayc7CiAgICAgICAgdmFyIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBsaW5lLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1hdHRhY2stbGluZSc7CiAgICAgICAgdmFyIGNvc3QgPSBBcnJheS5pc0FycmF5KGEuY29zdCkgJiYgYS5jb3N0Lmxlbmd0aCA/ICdbJyArIGEuY29zdC5qb2luKCcsICcpICsgJ10gJyA6ICcnOwogICAgICAgIGxpbmUudGV4dENvbnRlbnQgPSBjb3N0ICsgKGEubmFtZSB8fCAnJykgKyAoYS5kYW1hZ2UgPyAnIFx1MjAxNCAnICsgYS5kYW1hZ2UgOiAnJyk7CiAgICAgICAgYXRrLmFwcGVuZENoaWxkKGxpbmUpOwogICAgICAgIGlmIChhLmVmZmVjdCl7CiAgICAgICAgICB2YXIgZWZmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICBlZmYuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWF0dGFjay1lZmZlY3QnOwogICAgICAgICAgZWZmLnRleHRDb250ZW50ID0gYS5lZmZlY3Q7CiAgICAgICAgICBhdGsuYXBwZW5kQ2hpbGQoZWZmKTsKICAgICAgICB9CiAgICAgICAgYXRrV3JhcC5hcHBlbmRDaGlsZChhdGspOwogICAgICB9KTsKICAgICAgZWxzLm1vZGFsQm9keS5hcHBlbmRDaGlsZChhdGtXcmFwKTsKICAgIH0KCiAgICBpZiAoY2FyZC5lZmZlY3QpewogICAgICB2YXIgZWZmV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBlZmZXcmFwLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uJzsKICAgICAgdmFyIGVmZlRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGVmZlRpdGxlLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uLXRpdGxlJzsKICAgICAgZWZmVGl0bGUudGV4dENvbnRlbnQgPSAnSGnhu4d1IOG7qW5nJzsKICAgICAgZWZmV3JhcC5hcHBlbmRDaGlsZChlZmZUaXRsZSk7CiAgICAgIHZhciBlZmZUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGVmZlRleHQuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWZsYXZvcic7CiAgICAgIGVmZlRleHQudGV4dENvbnRlbnQgPSBjYXJkLmVmZmVjdDsKICAgICAgZWZmV3JhcC5hcHBlbmRDaGlsZChlZmZUZXh0KTsKICAgICAgZWxzLm1vZGFsQm9keS5hcHBlbmRDaGlsZChlZmZXcmFwKTsKICAgIH0KCiAgICBpZiAoQXJyYXkuaXNBcnJheShjYXJkLndlYWtuZXNzZXMpICYmIGNhcmQud2Vha25lc3Nlcy5sZW5ndGgpewogICAgICB2YXIgd1RleHQgPSBjYXJkLndlYWtuZXNzZXMubWFwKGZ1bmN0aW9uKHcpeyByZXR1cm4gdy50eXBlICsgKHcudmFsdWUgPyAnICcgKyB3LnZhbHVlIDogJycpOyB9KS5qb2luKCcsICcpOwogICAgICBlbHMubW9kYWxCb2R5LmFwcGVuZENoaWxkKG1ldGFSb3coJ8SQaeG7g20geeG6v3UnLCB3VGV4dCkpOwogICAgfQoKICAgIGlmIChjYXJkLmRlc2NyaXB0aW9uKXsKICAgICAgdmFyIGZsYXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZmxhdi5jbGFzc05hbWUgPSAncGgtbW9kYWwtc2VjdGlvbic7CiAgICAgIHZhciBmbGF2VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZmxhdlRpdGxlLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uLXRpdGxlJzsKICAgICAgZmxhdlRpdGxlLnRleHRDb250ZW50ID0gJ03DtCB04bqjJzsKICAgICAgZmxhdi5hcHBlbmRDaGlsZChmbGF2VGl0bGUpOwogICAgICB2YXIgZmxhdlRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgZmxhdlRleHQuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWZsYXZvcic7CiAgICAgIGZsYXZUZXh0LnRleHRDb250ZW50ID0gY2FyZC5kZXNjcmlwdGlvbjsKICAgICAgZmxhdi5hcHBlbmRDaGlsZChmbGF2VGV4dCk7CiAgICAgIGVscy5tb2RhbEJvZHkuYXBwZW5kQ2hpbGQoZmxhdik7CiAgICB9CgogICAgLy8gQ2hhc2UgQ2FyZCBwaWNrZXIgYXBwZWFycyBpbiBldmVyeSBmdWxsIGNhcmQtZGV0YWlsIG1vZGFsLCBpbmNsdWRpbmcgc3RvcmVkIGNhcmRzLgogICAgdmFyIGNoYXNlQWN0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgY2hhc2VBY3Rpb25zLmNsYXNzTmFtZSA9ICdwaC1jaGFzZS1jYXJkLWFjdGlvbnMnOwogICAgdmFyIGNoYXNlVGFyZ2V0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICBjaGFzZVRhcmdldEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7CiAgICBjaGFzZVRhcmdldEJ1dHRvbi5jbGFzc05hbWUgPSAncGgtYnRuIHBoLXByaW1hcnkgcGgtY2hhc2UtY2FyZC1hZGQnOwogICAgdmFyIGNoYXNlVmlld0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgY2hhc2VWaWV3QnV0dG9uLnR5cGUgPSAnYnV0dG9uJzsKICAgIGNoYXNlVmlld0J1dHRvbi5jbGFzc05hbWUgPSAncGgtYnRuIHBoLWNoYXNlLWNhcmQtdmlldyc7CiAgICBjaGFzZVZpZXdCdXR0b24udGV4dENvbnRlbnQgPSAn8J+OryBN4bulYyB0acOqdSBj4bunYSB0w7RpJzsKICAgIGNoYXNlVmlld0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7IGNsb3NlQ2FyZE1vZGFsKCk7IG9wZW5DaGFzZU1vZGFsKCk7IH0pOwogICAgZnVuY3Rpb24gdXBkYXRlQ2FyZENoYXNlQnV0dG9uKCl7CiAgICAgIHZhciBleGlzdGluZ0NoYXNlID0gZmluZENoYXNlVGFyZ2V0KGNhcmQuaWQpOwogICAgICBjaGFzZVRhcmdldEJ1dHRvbi50ZXh0Q29udGVudCA9IGV4aXN0aW5nQ2hhc2UgPyAn4pyTIMSQw6MgxJHhurd0IGzDoG0gQ2hhc2UgQ2FyZCcgOiAn8J+OryDEkOG6t3QgbMOgbSBDaGFzZSBDYXJkJzsKICAgICAgY2hhc2VUYXJnZXRCdXR0b24uZGlzYWJsZWQgPSAhIWV4aXN0aW5nQ2hhc2U7CiAgICAgIGNoYXNlVGFyZ2V0QnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoJ3BoLWNoYXNlLWlzLXNldCcsICEhZXhpc3RpbmdDaGFzZSk7CiAgICB9CiAgICBjaGFzZVRhcmdldEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgIHZhciB0YXJnZXQgPSBtYWtlQ2hhc2VUYXJnZXQoY2FyZCwgaW5mbywgdXNkKTsKICAgICAgaWYgKGFkZENoYXNlVGFyZ2V0KHRhcmdldCkpIHVwZGF0ZUNhcmRDaGFzZUJ1dHRvbigpOwogICAgfSk7CiAgICB1cGRhdGVDYXJkQ2hhc2VCdXR0b24oKTsKICAgIGNoYXNlQWN0aW9ucy5hcHBlbmRDaGlsZChjaGFzZVRhcmdldEJ1dHRvbik7CiAgICBjaGFzZUFjdGlvbnMuYXBwZW5kQ2hpbGQoY2hhc2VWaWV3QnV0dG9uKTsKICAgIGVscy5tb2RhbEJvZHkuYXBwZW5kQ2hpbGQoY2hhc2VBY3Rpb25zKTsKCiAgICBtb2RhbE9wZW4gPSB0cnVlOwogICAgZWxzLm1vZGFsLmhpZGRlbiA9IGZhbHNlOwogICAgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7CiAgICBlbHMubW9kYWxDbG9zZS5mb2N1cygpOwogIH0KCiAgZWxzLm1vZGFsQmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUNhcmRNb2RhbCk7CiAgZWxzLm1vZGFsQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZUNhcmRNb2RhbCk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpewogICAgaWYgKGUua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuOwogICAgaWYgKGVscy53ZWxjb21lTW9kYWwgJiYgIWVscy53ZWxjb21lTW9kYWwuaGlkZGVuKSByZXR1cm47CiAgICBpZiAobW9kYWxPcGVuKXsgY2xvc2VDYXJkTW9kYWwoKTsgcmV0dXJuOyB9CiAgICBpZiAocGFja0RldGFpbE1vZGFsICYmICFwYWNrRGV0YWlsTW9kYWwuaGlkZGVuKXsgY2xvc2VQYWNrRGV0YWlsc01vZGFsKCk7IHJldHVybjsgfQogICAgaWYgKGVscy5sYk1vZGFsICYmICFlbHMubGJNb2RhbC5oaWRkZW4peyBwaExiQ2xvc2UoKTsgcmV0dXJuOyB9CiAgICBpZiAoZWxzLmNoYXNlTW9kYWwgJiYgIWVscy5jaGFzZU1vZGFsLmhpZGRlbil7IGNsb3NlQ2hhc2VNb2RhbCgpOyByZXR1cm47IH0KICAgIGlmIChlbHMuY29sTW9kYWwgJiYgIWVscy5jb2xNb2RhbC5oaWRkZW4peyBjbG9zZUNvbE1vZGFsKCk7IHJldHVybjsgfQogICAgaWYgKGVscy5jaGFsbGVuZ2VNb2RhbCAmJiAhZWxzLmNoYWxsZW5nZU1vZGFsLmhpZGRlbil7CiAgICAgIGlmICh0eXBlb2YgcGhDaGFsbGVuZ2VDbG9zZUVuaGFuY2VkID09PSAnZnVuY3Rpb24nKSBwaENoYWxsZW5nZUNsb3NlRW5oYW5jZWQoKTsKICAgICAgZWxzZSBjbG9zZUNoYWxsZW5nZU1vZGFsKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlbHMuc2hvcE1vZGFsICYmICFlbHMuc2hvcE1vZGFsLmhpZGRlbil7CiAgICAgIGlmICh0eXBlb2YgcGhTaG9wQ2xvc2VFeHRlcm5hbCA9PT0gJ2Z1bmN0aW9uJykgcGhTaG9wQ2xvc2VFeHRlcm5hbCgpOwogICAgICByZXR1cm47CiAgICB9CiAgfSk7CgogIC8vIC0tLS0tLS0tLS0gZGlhZ25vc3RpY3MgLS0tLS0tLS0tLQogIHZhciBkaWFnID0geyBjaGVja2VkOjAsIG9rOjAsIGZhaWxlZDowLCB0b3RhbDpTRVJJRVNfSURTLmxlbmd0aCwgcmVuZGVyZWRBbnk6ZmFsc2UsIHNhZmV0eUZpcmVkOmZhbHNlIH07CgogIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1c0xpbmUoKXsKICAgIGlmIChkaWFnLnJlbmRlcmVkQW55KSB7IGVscy5zdGF0dXMuaGlkZGVuID0gdHJ1ZTsgcmV0dXJuOyB9CiAgICBlbHMuc3RhdHVzLmhpZGRlbiA9IGZhbHNlOwogICAgdmFyIGxpbmUgPSAnxJBhbmcgdOG6o2kgZGFuaCBzw6FjaCBi4buZIHRo4bq74oCmICjEkcOjIGtp4buDbSB0cmEgJyArIGRpYWcuY2hlY2tlZCArICcvJyArIGRpYWcudG90YWwgKyAnIG5ndeG7k24sICcgKyBkaWFnLm9rICsgJyB0aMOgbmggY8O0bmcsICcgKyBkaWFnLmZhaWxlZCArICcgbOG7l2kpJzsKICAgIGVscy5zdGF0dXMuaW5uZXJIVE1MID0gJyc7CiAgICB2YXIgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcC50ZXh0Q29udGVudCA9IGxpbmU7CiAgICBlbHMuc3RhdHVzLmFwcGVuZENoaWxkKHApOwogICAgdmFyIHByb2dyZXNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBwcm9ncmVzcy5jbGFzc05hbWUgPSAncGgtcHJvZ3Jlc3MnOwogICAgcHJvZ3Jlc3MudGV4dENvbnRlbnQgPSBkaWFnLmZhaWxlZCA+IDAKICAgICAgPyAnTeG7mXQgc+G7kSBuZ3Xhu5NuIGtow7RuZyBwaOG6o24gaOG7k2kg4oCUIG7hur91IGRhbmggc8OhY2ggbsOgeSB24bqrbiB0cuG7kW5nIHNhdSB2w6BpIGdpw6J5LCBjw7MgdGjhu4Mga+G6v3QgbuG7kWkgY+G7p2EgYuG6oW4gxJFhbmcgY2jhurduIGFwaS50Y2dkZXgubmV0LicKICAgICAgOiAnxJBhbmcga+G6v3QgbuG7kWkgdOG7m2kgYXBpLnRjZ2RleC5uZXTigKYnOwogICAgZWxzLnN0YXR1cy5hcHBlbmRDaGlsZChwcm9ncmVzcyk7CiAgICBlbHMuc3RhdHVzLmFwcGVuZENoaWxkKG1ha2VUZXN0TGluaygpKTsKICB9CgogIGZ1bmN0aW9uIG1ha2VUZXN0TGluaygpewogICAgdmFyIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcm93LmNsYXNzTmFtZSA9ICdwaC1zdGF0dXMtcm93JzsKICAgIHZhciBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7CiAgICBidG4udGV4dENvbnRlbnQgPSAnS2nhu4NtIHRyYSBr4bq/dCBu4buRaSBBUEkgXHUyMTk3JzsKICAgIGJ0bi5vbmNsaWNrID0gZnVuY3Rpb24oKXsKICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vYXBpLnRjZ2RleC5uZXQvdjIvZW4vc2VyaWVzL2Jhc2UnLCAnX2JsYW5rJywgJ25vb3BlbmVyJyk7CiAgICB9OwogICAgcm93LmFwcGVuZENoaWxkKGJ0bik7CiAgICByZXR1cm4gcm93OwogIH0KCiAgZnVuY3Rpb24gc2hvd0hhcmRGYWlsdXJlKCl7CiAgICBlbHMuc3RhdHVzLmhpZGRlbiA9IGZhbHNlOwogICAgZWxzLnN0YXR1cy5pbm5lckhUTUwgPSAnJzsKICAgIHZhciBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBwLnRleHRDb250ZW50ID0gJ0tow7RuZyB0aOG7gyB04bqjaSDEkcaw4bujYyBi4buZIHRo4bq7IG7DoG8uIFRvw6BuIGLhu5kgJyArIGRpYWcudG90YWwgKyAnIG5ndeG7k24gxJHhu4F1IGzhu5dpIGhv4bq3YyBxdcOhIHRo4budaSBnaWFuIGNo4budLic7CiAgICBlbHMuc3RhdHVzLmFwcGVuZENoaWxkKHApOwogICAgdmFyIHAyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBwMi5jbGFzc05hbWUgPSAncGgtcHJvZ3Jlc3MnOwogICAgcDIudGV4dENvbnRlbnQgPSAnSMOjeSBi4bqlbSAiS2nhu4NtIHRyYSBr4bq/dCBu4buRaSBBUEkiIGLDqm4gZMaw4bubaS4gTuG6v3UgbGnDqm4ga+G6v3QgxJHDsyBjxaluZyBraMO0bmcgdOG6o2kgxJHGsOG7o2MgZOG7ryBsaeG7h3UgSlNPTiB0cm9uZyB0YWIgbeG7m2ksIHRow6wgbeG6oW5nLCB0xrDhu51uZyBs4butYSwgaG/hurdjIG3hu5l0IGPDoGkgxJHhurd0IGLhuqNvIG3huq10L0NETiB0csOqbiB0cmFuZyBuw6B5IMSRYW5nIGNo4bq3biBhcGkudGNnZGV4Lm5ldC4nOwogICAgZWxzLnN0YXR1cy5hcHBlbmRDaGlsZChwMik7CiAgICB2YXIgcm93ID0gbWFrZVRlc3RMaW5rKCk7CiAgICByb3cuc3R5bGUubWFyZ2luVG9wID0gJzEwcHgnOwogICAgdmFyIHJldHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICByZXRyeS50eXBlID0gJ2J1dHRvbic7CiAgICByZXRyeS50ZXh0Q29udGVudCA9ICdUaOG7rSBs4bqhaSc7CiAgICByZXRyeS5vbmNsaWNrID0gbG9hZEV4cGFuc2lvbnM7CiAgICByb3cuYXBwZW5kQ2hpbGQocmV0cnkpOwogICAgZWxzLnN0YXR1cy5hcHBlbmRDaGlsZChyb3cpOwogIH0KCiAgZnVuY3Rpb24gbG9hZEV4cGFuc2lvbnMoKXsKICAgIGRpYWcgPSB7IGNoZWNrZWQ6MCwgb2s6MCwgZmFpbGVkOjAsIHRvdGFsOlNFUklFU19JRFMubGVuZ3RoLCByZW5kZXJlZEFueTpmYWxzZSwgc2FmZXR5RmlyZWQ6ZmFsc2UgfTsKICAgIGVscy5ncmlkLnRleHRDb250ZW50ID0gJyc7CiAgICB1cGRhdGVTdGF0dXNMaW5lKCk7CgogICAgdmFyIHNlZW4gPSBuZXcgTWFwKCk7CgogICAgZnVuY3Rpb24gcmVuZGVyU29ydGVkKCl7CiAgICAgIGlmICghc2Vlbi5zaXplKSByZXR1cm47CiAgICAgIGRpYWcucmVuZGVyZWRBbnkgPSB0cnVlOwogICAgICB2YXIgc29ydGVkID0gQXJyYXkuZnJvbShzZWVuLnZhbHVlcygpKS5zb3J0KGZ1bmN0aW9uKGEsIGIpewogICAgICAgIHZhciBuYSA9IERJU1BMQVlfU0VUX09SREVSLmluZGV4T2YoU3RyaW5nKGEuc2V0Lm5hbWUgfHwgJycpKTsKICAgICAgICB2YXIgbmIgPSBESVNQTEFZX1NFVF9PUkRFUi5pbmRleE9mKFN0cmluZyhiLnNldC5uYW1lIHx8ICcnKSk7CiAgICAgICAgaWYgKG5hICE9PSAtMSB8fCBuYiAhPT0gLTEpewogICAgICAgICAgaWYgKG5hID09PSAtMSkgcmV0dXJuIDE7CiAgICAgICAgICBpZiAobmIgPT09IC0xKSByZXR1cm4gLTE7CiAgICAgICAgICBpZiAobmEgIT09IG5iKSByZXR1cm4gbmEgLSBuYjsKICAgICAgICB9CiAgICAgICAgdmFyIHJhID0gc2VyaWVzUHJpb3JpdHlSYW5rKGEuc2VyaWVzSWQpLCByYiA9IHNlcmllc1ByaW9yaXR5UmFuayhiLnNlcmllc0lkKTsKICAgICAgICBpZiAocmEgIT09IHJiKSByZXR1cm4gcmEgLSByYjsKICAgICAgICB2YXIgZGEgPSBhLnNldC5yZWxlYXNlRGF0ZSB8fCAnJywgZGIgPSBiLnNldC5yZWxlYXNlRGF0ZSB8fCAnJzsKICAgICAgICBpZiAoZGEgIT09IGRiKSByZXR1cm4gZGIubG9jYWxlQ29tcGFyZShkYSk7CiAgICAgICAgcmV0dXJuIFN0cmluZyhhLnNldC5uYW1lIHx8ICcnKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLnNldC5uYW1lIHx8ICcnKSk7CiAgICAgIH0pOwogICAgICByZW5kZXJFeHBhbnNpb25zKHNvcnRlZCk7CiAgICB9CgogICAgdmFyIHNhZmV0eVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICBkaWFnLnNhZmV0eUZpcmVkID0gdHJ1ZTsKICAgICAgaWYgKCFkaWFnLnJlbmRlcmVkQW55KSBzaG93SGFyZEZhaWx1cmUoKTsKICAgIH0sIDE1MDAwKTsKCiAgICB2YXIgcmVxdWVzdHMgPSBTRVJJRVNfSURTLm1hcChmdW5jdGlvbihpZCl7CiAgICAgIHJldHVybiBnZXRKU09OKEFQSSArICcvc2VyaWVzLycgKyBpZCkudGhlbihmdW5jdGlvbihkYXRhKXsKICAgICAgICBkaWFnLmNoZWNrZWQrKzsgZGlhZy5vaysrOwogICAgICAgIGlmIChkYXRhICYmIGRhdGEuc2V0cyl7CiAgICAgICAgICBkYXRhLnNldHMuZm9yRWFjaChmdW5jdGlvbihzKXsKICAgICAgICAgICAgdmFyIHRvdGFsID0gKHMuY2FyZENvdW50ICYmIHMuY2FyZENvdW50LnRvdGFsKSB8fCAwOwogICAgICAgICAgICBpZiAodG90YWwgPCAyMCkgcmV0dXJuOwogICAgICAgICAgICBpZiAoIXNlZW4uaGFzKHMuaWQpKSBzZWVuLnNldChzLmlkLCB7IHNldDogcywgc2VyaWVzOiBkYXRhLm5hbWUgfHwgZGF0YS5pZCwgc2VyaWVzSWQ6IGlkIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWVuLnNpemUpIHJlbmRlclNvcnRlZCgpOwogICAgICAgIGVsc2UgdXBkYXRlU3RhdHVzTGluZSgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbigpewogICAgICAgIGRpYWcuY2hlY2tlZCsrOyBkaWFnLmZhaWxlZCsrOwogICAgICAgIGlmICghZGlhZy5yZW5kZXJlZEFueSkgdXBkYXRlU3RhdHVzTGluZSgpOwogICAgICB9KTsKICAgIH0pOwoKICAgIC8vIE3hu5l0IHPhu5Egc2V0IG3hu5tpIHh14bqldCBoaeG7h24gdHLDqm4gVENHZGV4IHRyxrDhu5tjIGtoaSB0aOG7qSB04buxIC9zZXJpZXMgxJHGsOG7o2MgY+G6rXAgbmjhuq10LgogICAgLy8gVOG6o2kgdHLhu7FjIHRp4bq/cCBjw6FjIHNldCBu4buVaSBi4bqtdCDEkcOjIHjDoWMgbmjhuq1uOyBu4bq/dSBBUEkgY2jGsGEgY8OzIHRow6wgYuG7jyBxdWEgYW4gdG/DoG4uCiAgICB2YXIgZmVhdHVyZWRSZXF1ZXN0cyA9IEZFQVRVUkVEX1NFVF9JRFMubWFwKGZ1bmN0aW9uKGlkKXsKICAgICAgcmV0dXJuIGdldEpTT04oQVBJICsgJy9zZXRzLycgKyBpZCwgMTAwMDApLnRoZW4oZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmlkKSByZXR1cm47CiAgICAgICAgdmFyIHRvdGFsID0gKGRhdGEuY2FyZENvdW50ICYmIGRhdGEuY2FyZENvdW50LnRvdGFsKSB8fCAwOwogICAgICAgIGlmICh0b3RhbCA8IDIwKSByZXR1cm47CiAgICAgICAgaWYgKCFzZWVuLmhhcyhkYXRhLmlkKSl7CiAgICAgICAgICB2YXIgc2VyaWUgPSBkYXRhLnNlcmllIHx8IHt9OwogICAgICAgICAgc2Vlbi5zZXQoZGF0YS5pZCwgewogICAgICAgICAgICBzZXQ6IGRhdGEsCiAgICAgICAgICAgIHNlcmllczogc2VyaWUubmFtZSB8fCBzZXJpZS5pZCB8fCAnTWVnYSBFdm9sdXRpb24nLAogICAgICAgICAgICBzZXJpZXNJZDogc2VyaWUuaWQgfHwgJ21lJwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJlbmRlclNvcnRlZCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbigpeyAvKiBBUEkgY2jGsGEgY8OzIHNldCBuw6B5IHRow6wga2jDtG5nIGzDoG0gaOG7j25nIGRhbmggc8OhY2ggKi8gfSk7CiAgICB9KTsKCiAgICBQcm9taXNlLmFsbChyZXF1ZXN0cy5jb25jYXQoZmVhdHVyZWRSZXF1ZXN0cykpLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgY2xlYXJUaW1lb3V0KHNhZmV0eVRpbWVyKTsKICAgICAgaWYgKCFzZWVuLnNpemUgJiYgIWRpYWcuc2FmZXR5RmlyZWQpIHNob3dIYXJkRmFpbHVyZSgpOwogICAgfSk7CiAgfQoKICAvLyAtLS0tLS0tLS0tIENISSBUSeG6vlQgUEFDSzogVE/DgE4gQuG7mCBDQVJEICsgQ8OBQyBMw4EgTuG7lEkgQuG6rFQgLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGVuc3VyZVBhY2tEZXRhaWxNb2RhbCgpewogICAgaWYgKHBhY2tEZXRhaWxNb2RhbCAmJiBwYWNrRGV0YWlsTW9kYWwuaXNDb25uZWN0ZWQpIHJldHVybiBwYWNrRGV0YWlsTW9kYWw7CiAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG1vZGFsLmNsYXNzTmFtZSA9ICdwaC1tb2RhbCBwaC1wYWNrLWRldGFpbC1tb2RhbCc7CiAgICBtb2RhbC5oaWRkZW4gPSB0cnVlOwogICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0NoaSB0aeG6v3QgcGFjaycpOwoKICAgIHZhciBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYmFja2Ryb3AuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWJhY2tkcm9wJzsKICAgIGJhY2tkcm9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VQYWNrRGV0YWlsc01vZGFsKTsKCiAgICB2YXIgZGlhbG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkaWFsb2cuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLWNhcmQgcGgtbW9kYWwtd2lkZSBwaC1wYWNrLWRldGFpbC1kaWFsb2cnOwogICAgZGlhbG9nLnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTsKICAgIGRpYWxvZy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCAndHJ1ZScpOwogICAgZGlhbG9nLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdEYW5oIHPDoWNoIHRo4bq7IHRyb25nIHBhY2snKTsKCiAgICB2YXIgY2xvc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGNsb3NlLnR5cGUgPSAnYnV0dG9uJzsKICAgIGNsb3NlLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1jbG9zZSc7CiAgICBjbG9zZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnxJDDs25nIGNoaSB0aeG6v3QgcGFjaycpOwogICAgY2xvc2UudGV4dENvbnRlbnQgPSAn4pyVJzsKICAgIGNsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VQYWNrRGV0YWlsc01vZGFsKTsKCiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYm9keS5jbGFzc05hbWUgPSAncGgtcGFjay1kZXRhaWwtYm9keSc7CiAgICBkaWFsb2cuYXBwZW5kQ2hpbGQoY2xvc2UpOwogICAgZGlhbG9nLmFwcGVuZENoaWxkKGJvZHkpOwogICAgbW9kYWwuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApOwogICAgbW9kYWwuYXBwZW5kQ2hpbGQoZGlhbG9nKTsKICAgIHJvb3QuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAgcGFja0RldGFpbE1vZGFsID0gbW9kYWw7CiAgICBwYWNrRGV0YWlsTW9kYWxCb2R5ID0gYm9keTsKICAgIHJldHVybiBtb2RhbDsKICB9CgogIGZ1bmN0aW9uIGNsb3NlUGFja0RldGFpbHNNb2RhbCgpewogICAgaWYgKCFwYWNrRGV0YWlsTW9kYWwgfHwgcGFja0RldGFpbE1vZGFsLmhpZGRlbikgcmV0dXJuOwogICAgcGFja0RldGFpbFJlcXVlc3RUb2tlbisrOwogICAgcGFja0RldGFpbE1vZGFsLmhpZGRlbiA9IHRydWU7CiAgICBzZXRNb2RhbFZpZXdwb3J0T3BlbihmYWxzZSk7CiAgfQoKICBmdW5jdGlvbiBwYWNrRGV0YWlsVGllcihjYXJkLCBkZXRhaWwpewogICAgdmFyIG1hcHBlZCA9IGRldGFpbCAmJiBkZXRhaWwudGllck1hcCAmJiBjYXJkICYmIGRldGFpbC50aWVyTWFwW2NhcmQuaWRdOwogICAgaWYgKG1hcHBlZCkgcmV0dXJuIG1hcHBlZDsKICAgIGlmIChjYXJkICYmIGNhcmQucmFyaXR5KSByZXR1cm4gcmFyaXR5VGllcihjYXJkLnJhcml0eSk7CiAgICByZXR1cm4geyB0aWVyOjAsIGxhYmVsOidDaMawYSB4w6FjIMSR4buLbmggxJHhu5kgaGnhur9tJyB9OwogIH0KCiAgZnVuY3Rpb24gbG9hZFBhY2tUaWVyTWFwKHNldElkLCBjYXJkcyl7CiAgICB2YXIgZGlyZWN0TWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIChjYXJkcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihjYXJkKXsKICAgICAgaWYgKGNhcmQgJiYgY2FyZC5pZCAmJiBjYXJkLnJhcml0eSkgZGlyZWN0TWFwW2NhcmQuaWRdID0gcmFyaXR5VGllcihjYXJkLnJhcml0eSk7CiAgICB9KTsKICAgIHJldHVybiBsb2FkUmFyaXR5VGF4b25vbXkoKS50aGVuKGZ1bmN0aW9uKGdyb3Vwcyl7CiAgICAgIGlmICghZ3JvdXBzKSByZXR1cm4gZGlyZWN0TWFwOwogICAgICB2YXIgdGllcnMgPSBbXSwgam9icyA9IFtdOwogICAgICBmb3IgKHZhciB0ID0gMDsgdCA8PSA2OyB0KyspewogICAgICAgIGlmICghZ3JvdXBzW3RdIHx8ICFncm91cHNbdF0ubGVuZ3RoKSBjb250aW51ZTsKICAgICAgICB2YXIgdmFsdWUgPSAnZXE6JyArIGdyb3Vwc1t0XS5tYXAoZnVuY3Rpb24ocil7IHJldHVybiBlbmNvZGVVUklDb21wb25lbnQocik7IH0pLmpvaW4oJ3wnKTsKICAgICAgICB2YXIgdXJsID0gQVBJICsgJy9jYXJkcz9zZXQuaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChzZXRJZCkgKyAnJnJhcml0eT0nICsgdmFsdWU7CiAgICAgICAgdGllcnMucHVzaCh0KTsKICAgICAgICBqb2JzLnB1c2goZ2V0SlNPTih1cmwsIDEwMDAwKS50aGVuKGZ1bmN0aW9uKGRhdGEpeyByZXR1cm4gZGF0YTsgfSkuY2F0Y2goZnVuY3Rpb24oKXsgcmV0dXJuIFtdOyB9KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGpvYnMpLnRoZW4oZnVuY3Rpb24ocmVzdWx0cyl7CiAgICAgICAgdmFyIGFsbG93ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpLCB0aWVyTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAoY2FyZHMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24oY2FyZCl7IGlmIChjYXJkICYmIGNhcmQuaWQpIGFsbG93ZWRbY2FyZC5pZF0gPSB0cnVlOyB9KTsKICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24oYXJyLCBpZHgpewogICAgICAgICAgdmFyIHRpZXIgPSB0aWVyc1tpZHhdOwogICAgICAgICAgKEFycmF5LmlzQXJyYXkoYXJyKSA/IGFyciA6IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICAgICAgICBpZiAoIWMgfHwgIWMuaWQgfHwgIWFsbG93ZWRbYy5pZF0gfHwgdGllck1hcFtjLmlkXSkgcmV0dXJuOwogICAgICAgICAgICB0aWVyTWFwW2MuaWRdID0geyB0aWVyOnRpZXIsIGxhYmVsOihjLnJhcml0eSB8fCB0aWVyTGFiZWxUZXh0KHRpZXIpKSB9OwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmtleXMoZGlyZWN0TWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGlkKXsgaWYgKCF0aWVyTWFwW2lkXSkgdGllck1hcFtpZF0gPSBkaXJlY3RNYXBbaWRdOyB9KTsKICAgICAgICByZXR1cm4gdGllck1hcDsKICAgICAgfSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbigpeyByZXR1cm4gZGlyZWN0TWFwOyB9KTsKICB9CgogIGZ1bmN0aW9uIHBhY2tEZXRhaWxFbGVtZW50KHRhZywgY2xzLCB2YWx1ZSl7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoY2xzKSBlbC5jbGFzc05hbWUgPSBjbHM7CiAgICBpZiAodmFsdWUgIT0gbnVsbCkgZWwudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgIHJldHVybiBlbDsKICB9CgogIGZ1bmN0aW9uIHBhY2tEZXRhaWxUaWVyTGFiZWwoaW5mbyl7CiAgICBpZiAoIWluZm8pIHJldHVybiAnQ2jGsGEgcsO1JzsKICAgIGlmIChpbmZvLmxhYmVsICYmIGluZm8ubGFiZWwgIT09ICdDaMawYSB4w6FjIMSR4buLbmggxJHhu5kgaGnhur9tJyAmJiAhL15UaMaw4budbmckfF5VbmNvbW1vbiR8Xkhp4bq/bSR8XlVsdHJhJHxeRnVsbCBBcnQgXC8gU3RhciR8XsSQ4bq3YyBiaeG7h3QkfF5DaGFzZSQvLnRlc3QoaW5mby5sYWJlbCkpIHJldHVybiBpbmZvLmxhYmVsOwogICAgcmV0dXJuIHRpZXJMYWJlbFRleHQoaW5mby50aWVyIHx8IDApOwogIH0KCiAgZnVuY3Rpb24gZW5zdXJlUGFja0RldGFpbFByaWNlT2JzZXJ2ZXIoKXsKICAgIGlmIChwYWNrRGV0YWlsUHJpY2VPYnNlcnZlciB8fCAhd2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyIHx8ICFwYWNrRGV0YWlsTW9kYWxCb2R5KSByZXR1cm47CiAgICBwYWNrRGV0YWlsUHJpY2VPYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKXsKICAgICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KXsKICAgICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSByZXR1cm47CiAgICAgICAgdmFyIHRpbGUgPSBlbnRyeS50YXJnZXQ7CiAgICAgICAgcGFja0RldGFpbFByaWNlT2JzZXJ2ZXIudW5vYnNlcnZlKHRpbGUpOwogICAgICAgIGlmICh0aWxlICYmIHRpbGUuX3BoUHJpY2VDYXJkKXsKICAgICAgICAgIGxvYWRQYWNrRGV0YWlsQ2FyZFByaWNlKHRpbGUuX3BoUHJpY2VDYXJkLCB0aWxlLmRhdGFzZXQucGFja0lkIHx8ICcnKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwgeyByb290OnBhY2tEZXRhaWxNb2RhbEJvZHksIHJvb3RNYXJnaW46JzIyMHB4IDBweCcsIHRocmVzaG9sZDowIH0pOwogIH0KCiAgZnVuY3Rpb24gcGFja0RldGFpbFRpbGVQcmljZU51bWJlcih0aWxlKXsKICAgIGlmICghdGlsZSB8fCAhdGlsZS5kYXRhc2V0IHx8IHRpbGUuZGF0YXNldC5wcmljZSA9PSBudWxsIHx8IHRpbGUuZGF0YXNldC5wcmljZSA9PT0gJycpIHJldHVybiBudWxsOwogICAgdmFyIG4gPSBOdW1iZXIodGlsZS5kYXRhc2V0LnByaWNlKTsKICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgJiYgbiA+IDAgPyBuIDogbnVsbDsKICB9CgogIC8vIFNvcnQgZWFjaCBwYWNrJ3MgZmVhdHVyZWQtY2FyZCByb3cgYnkgbnVtZXJpYyBtYXJrZXQgcHJpY2UsIGhpZ2hlc3QgZmlyc3QuCiAgLy8gQ2FyZHMgd2l0aG91dCBhIHVzYWJsZSBwcmljZSBzdGF5IGF0IHRoZSBib3R0b207IHJhcml0eSBhbmQgY2FyZCBudW1iZXIgYXJlIHRpZS1icmVha2Vycy4KICBmdW5jdGlvbiBzb3J0UGFja0RldGFpbEZlYXR1cmVkR3JpZChwYWNrSWQpewogICAgaWYgKCFwYWNrRGV0YWlsTW9kYWxCb2R5IHx8ICFwYWNrRGV0YWlsQWN0aXZlKSByZXR1cm47CiAgICBpZiAocGFja0lkICYmIFN0cmluZyhwYWNrRGV0YWlsQWN0aXZlLmlkKSAhPT0gU3RyaW5nKHBhY2tJZCkpIHJldHVybjsKICAgIHZhciBncmlkcyA9IHBhY2tEZXRhaWxNb2RhbEJvZHkucXVlcnlTZWxlY3RvckFsbCgnLnBoLXBhY2stZGV0YWlsLWZlYXR1cmUtZ3JpZCcpOwogICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChncmlkcywgZnVuY3Rpb24oZ3JpZCl7CiAgICAgIHZhciB0aWxlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGdyaWQucXVlcnlTZWxlY3RvckFsbCgnLnBoLXBhY2stZGV0YWlsLXRpbGUnKSk7CiAgICAgIHRpbGVzLnNvcnQoZnVuY3Rpb24oYSwgYil7CiAgICAgICAgdmFyIGFwID0gcGFja0RldGFpbFRpbGVQcmljZU51bWJlcihhKSwgYnAgPSBwYWNrRGV0YWlsVGlsZVByaWNlTnVtYmVyKGIpOwogICAgICAgIGlmIChhcCAhPT0gbnVsbCAmJiBicCA9PT0gbnVsbCkgcmV0dXJuIC0xOwogICAgICAgIGlmIChhcCA9PT0gbnVsbCAmJiBicCAhPT0gbnVsbCkgcmV0dXJuIDE7CiAgICAgICAgaWYgKGFwICE9PSBudWxsICYmIGJwICE9PSBudWxsICYmIGFwICE9PSBicCkgcmV0dXJuIGJwIC0gYXA7CiAgICAgICAgdmFyIGF0ID0gTnVtYmVyKGEuZGF0YXNldC50aWVyKSB8fCAwLCBidCA9IE51bWJlcihiLmRhdGFzZXQudGllcikgfHwgMDsKICAgICAgICBpZiAoYXQgIT09IGJ0KSByZXR1cm4gYnQgLSBhdDsKICAgICAgICByZXR1cm4gU3RyaW5nKGEuZGF0YXNldC5sb2NhbElkIHx8IGEuZGF0YXNldC5jYXJkSWQgfHwgJycpLmxvY2FsZUNvbXBhcmUoCiAgICAgICAgICBTdHJpbmcoYi5kYXRhc2V0LmxvY2FsSWQgfHwgYi5kYXRhc2V0LmNhcmRJZCB8fCAnJyksIHVuZGVmaW5lZCwKICAgICAgICAgIHtudW1lcmljOnRydWUsIHNlbnNpdGl2aXR5OidiYXNlJ30KICAgICAgICApOwogICAgICB9KTsKICAgICAgdGlsZXMuZm9yRWFjaChmdW5jdGlvbih0aWxlKXsgZ3JpZC5hcHBlbmRDaGlsZCh0aWxlKTsgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVBhY2tEZXRhaWxQcmljZVRpbGVzKGNhcmRJZCwgcGFja0lkLCB2YWx1ZSwgZmFpbGVkLCBjdXJyZW5jeSwgc291cmNlKXsKICAgIGlmICghcGFja0RldGFpbE1vZGFsQm9keSB8fCAhcGFja0RldGFpbEFjdGl2ZSB8fCBTdHJpbmcocGFja0RldGFpbEFjdGl2ZS5pZCkgIT09IFN0cmluZyhwYWNrSWQpKSByZXR1cm47CiAgICB2YXIgdGlsZXMgPSBwYWNrRGV0YWlsTW9kYWxCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waC1wYWNrLWRldGFpbC10aWxlJyk7CiAgICB2YXIgaGFzUHJpY2UgPSB2YWx1ZSAhPSBudWxsICYmIGlzRmluaXRlKHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpID4gMDsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGlsZXMsIGZ1bmN0aW9uKHRpbGUpewogICAgICBpZiAoU3RyaW5nKHRpbGUuZGF0YXNldC5jYXJkSWQgfHwgJycpICE9PSBTdHJpbmcoY2FyZElkKSB8fCBTdHJpbmcodGlsZS5kYXRhc2V0LnBhY2tJZCB8fCAnJykgIT09IFN0cmluZyhwYWNrSWQpKSByZXR1cm47CiAgICAgIHZhciBwcmljZUVsID0gdGlsZS5xdWVyeVNlbGVjdG9yKCcucGgtcGFjay1kZXRhaWwtcHJpY2UnKTsKICAgICAgaWYgKCFwcmljZUVsKSByZXR1cm47CiAgICAgIHRpbGUuZGF0YXNldC5wcmljZSA9IGhhc1ByaWNlID8gU3RyaW5nKE51bWJlcih2YWx1ZSkpIDogJyc7CiAgICAgIHByaWNlRWwudGV4dENvbnRlbnQgPSBoYXNQcmljZSA/IChjdXJyZW5jeSA9PT0gJ0pQWScgPyBtb25leUpQWSh2YWx1ZSkgOiBtb25leSh2YWx1ZSkpIDogKGZhaWxlZCA/ICdDaMawYSB04bqjaSDEkcaw4bujYyBnacOhJyA6ICdDaMawYSBjw7MgZ2nDoScpOwogICAgICBwcmljZUVsLmNsYXNzTGlzdC50b2dnbGUoJ3BoLWNhcmQtbm9wcmljZScsICFoYXNQcmljZSk7CiAgICAgIHByaWNlRWwuY2xhc3NMaXN0LnRvZ2dsZSgncGgtcHJpY2UtbG9hZGluZycsIGZhbHNlKTsKICAgICAgcHJpY2VFbC50aXRsZSA9IGhhc1ByaWNlCiAgICAgICAgPyAoY3VycmVuY3kgPT09ICdKUFknCiAgICAgICAgICA/ICdHacOhIHRoYW0ga2jhuqNvIHRo4buLIHRyxrDhu51uZyBOaOG6rXQgQuG6o24gKEpQWSksIG5ndeG7k24gUG9rZWNhTmF2aTsgc25hcHNob3QgJyArIE02QV9KUFlfUFJJQ0VfU05BUFNIT1QKICAgICAgICAgIDogKHNvdXJjZSA9PT0gJ1ByaWNlQ2hhcnRpbmcnCiAgICAgICAgICAgID8gJ0dpw6EgxrDhu5tjIHTDrW5oIFVTRCB04burIFByaWNlQ2hhcnRpbmcgZOG7sWEgdHLDqm4gbOG7i2NoIHPhu60gZ2lhbyBk4buLY2ggxJHDoyBob8OgbiB04bqldCAoYmFvIGfhu5NtIGVCYXkpOyBraeG7g20gdHJhICcgKyBNNkFfUkdCX1VTRF9QUklDRV9TTkFQU0hPVCArICcgwrcgJyArIChjYXJkLl9waE1hcmtldFByaWNlU291cmNlVVJMIHx8IE02QV9VU0RfUFJJQ0VfU09VUkNFKQogICAgICAgICAgICA6IChzb3VyY2UgPT09ICdTcGFya2wnCiAgICAgICAgICAgICAgPyAnR2nDoSB0aGFtIGto4bqjbyBVU0QgdOG7qyBUQ0dwbGF5ZXIvQ2FyZG1hcmtldDsgbmd14buTbiBTcGFya2wsIHNuYXBzaG90ICcgKyBNNkFfVVNEX1BSSUNFX1NOQVBTSE9UCiAgICAgICAgICAgICAgOiAnR2nDoSB0aGFtIGto4bqjbyBi4bqxbmcgVVNEJyArIChzb3VyY2UgPyAnIMK3IFRDR2RleC8nICsgc291cmNlIDogJycpKSkpCiAgICAgICAgOiAnQ2jGsGEgdMOsbSB0aOG6pXkgZ2nDoSDEkcaw4bujYyBjw7RuZyBi4buRIHThu6sgbmd14buTbiDEkcOjIGtp4buDbSB0cmEnOwogICAgICBpZiAoaGFzUHJpY2UpIHByaWNlRWwuZGF0YXNldC5jdXJyZW5jeSA9IGN1cnJlbmN5IHx8ICdVU0QnOwogICAgICBlbHNlIGRlbGV0ZSBwcmljZUVsLmRhdGFzZXQuY3VycmVuY3k7CiAgICB9KTsKICAgIHNvcnRQYWNrRGV0YWlsRmVhdHVyZWRHcmlkKHBhY2tJZCk7CiAgfQoKICBmdW5jdGlvbiBsb2FkUmVnaW9uYWxUY2dEZXhQcmljZShjYXJkSWQsIGluZGV4KXsKICAgIHZhciBsb2NhbGVzID0gWydkZScsICdmciddOwogICAgaW5kZXggPSBpbmRleCB8fCAwOwogICAgaWYgKGluZGV4ID49IGxvY2FsZXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgdmFyIHVybCA9ICdodHRwczovL2FwaS50Y2dkZXgubmV0L3YyLycgKyBsb2NhbGVzW2luZGV4XSArICcvY2FyZHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChjYXJkSWQpOwogICAgcmV0dXJuIGdldEpTT04odXJsLCA4NTAwKS50aGVuKGZ1bmN0aW9uKHJlZ2lvbmFsQ2FyZCl7CiAgICAgIHZhciB2YWx1ZSA9IHByaWNlVVNEKHJlZ2lvbmFsQ2FyZCk7CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKXsKICAgICAgICByZXR1cm4geyB2YWx1ZTp2YWx1ZSwgY3VycmVuY3k6J1VTRCcsIGxvY2FsZTpsb2NhbGVzW2luZGV4XSwgY2FyZDpyZWdpb25hbENhcmQgfTsKICAgICAgfQogICAgICByZXR1cm4gbG9hZFJlZ2lvbmFsVGNnRGV4UHJpY2UoY2FyZElkLCBpbmRleCArIDEpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsKICAgICAgcmV0dXJuIGxvYWRSZWdpb25hbFRjZ0RleFByaWNlKGNhcmRJZCwgaW5kZXggKyAxKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gbG9hZFBhY2tEZXRhaWxDYXJkUHJpY2UoY2FyZCwgcGFja0lkKXsKICAgIGlmICghY2FyZCB8fCAhY2FyZC5pZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIHZhciBpZCA9IFN0cmluZyhjYXJkLmlkKTsKCiAgICB2YXIgZXhpc3RpbmdQcmljZSA9IHByaWNlVVNEKGNhcmQsIHBhY2tJZCk7CiAgICBpZiAoZXhpc3RpbmdQcmljZSAhPSBudWxsKXsKICAgICAgcGFja0RldGFpbFByaWNlQ2FjaGUuc2V0KGlkLCBleGlzdGluZ1ByaWNlKTsKICAgICAgdmFyIHNvdXJjZSA9IGNhcmQuX3BoTWFya2V0UHJpY2VTb3VyY2UgPT09ICdQcmljZUNoYXJ0aW5nIGVCYXktZGVyaXZlZCBzbmFwc2hvdCcgPyAnUHJpY2VDaGFydGluZycKICAgICAgICA6IChjYXJkLl9waE1hcmtldFByaWNlU291cmNlID09PSAnU3BhcmtsIFVTRCBzbmFwc2hvdCcgPyAnU3BhcmtsJyA6ICcnKTsKICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgZXhpc3RpbmdQcmljZSwgZmFsc2UsICdVU0QnLCBzb3VyY2UpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGV4aXN0aW5nUHJpY2UpOwogICAgfQoKICAgIC8vIE02YSB1c2VzIFVTRCByZWZlcmVuY2VzIG9ubHkuIElmIG5laXRoZXIgdGhlIFVTRCBzbmFwc2hvdCBub3IgVENHZGV4CiAgICAvLyBwcm92aWRlcyBhIHByaWNlLCBrZWVwIHRoZSB2YWx1ZSB1bmF2YWlsYWJsZSByYXRoZXIgdGhhbiBzaG93aW5nIEpQWS4KCiAgICBpZiAocGFja0RldGFpbFByaWNlQ2FjaGUuaGFzKGlkKSl7CiAgICAgIHZhciBjYWNoZWRQcmljZSA9IHBhY2tEZXRhaWxQcmljZUNhY2hlLmdldChpZCk7CiAgICAgIHVwZGF0ZVBhY2tEZXRhaWxQcmljZVRpbGVzKGlkLCBwYWNrSWQsIGNhY2hlZFByaWNlLCBmYWxzZSwgJ1VTRCcpOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNhY2hlZFByaWNlKTsKICAgIH0KICAgIGlmIChwYWNrRGV0YWlsUHJpY2VSZXF1ZXN0cy5oYXMoaWQpKXsKICAgICAgcmV0dXJuIHBhY2tEZXRhaWxQcmljZVJlcXVlc3RzLmdldChpZCkudGhlbihmdW5jdGlvbihyZXN1bHQpewogICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpewogICAgICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgcmVzdWx0LnZhbHVlLCBmYWxzZSwgcmVzdWx0LmN1cnJlbmN5IHx8ICdVU0QnLCByZXN1bHQuc291cmNlIHx8IHJlc3VsdC5sb2NhbGUgfHwgJycpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgcmVzdWx0LCBmYWxzZSwgJ1VTRCcpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciByZXF1ZXN0ID0gZnVsbENhcmQoY2FyZC5pZCkudGhlbihmdW5jdGlvbihmdWxsKXsKICAgICAgZnVsbCA9IGZ1bGwgfHwgY2FyZDsKICAgICAgaWYgKGZ1bGwgJiYgZnVsbC5wcmljaW5nKSBjYXJkLnByaWNpbmcgPSBmdWxsLnByaWNpbmc7CiAgICAgIGlmIChmdWxsICYmIGZ1bGwucHJpY2VzKSBjYXJkLnByaWNlcyA9IGZ1bGwucHJpY2VzOwogICAgICBpZiAoZnVsbCAmJiBmdWxsLnZhcmlhbnRzX2RldGFpbGVkKSBjYXJkLnZhcmlhbnRzX2RldGFpbGVkID0gZnVsbC52YXJpYW50c19kZXRhaWxlZDsKICAgICAgdmFyIHZhbHVlID0gcHJpY2VVU0QoZnVsbCwgcGFja0lkKTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gcHJpY2VVU0QoY2FyZCwgcGFja0lkKTsKICAgICAgaWYgKHZhbHVlICE9IG51bGwpewogICAgICAgIHBhY2tEZXRhaWxQcmljZUNhY2hlLnNldChpZCwgdmFsdWUpOwogICAgICAgIHZhciBlZmZlY3RpdmVTb3VyY2UgPSBmdWxsICYmIGZ1bGwuX3BoTWFya2V0UHJpY2VTb3VyY2UgPyBmdWxsLl9waE1hcmtldFByaWNlU291cmNlIDogY2FyZC5fcGhNYXJrZXRQcmljZVNvdXJjZTsKICAgICAgICB2YXIgZmFsbGJhY2tTb3VyY2UgPSBlZmZlY3RpdmVTb3VyY2UgPT09ICdQcmljZUNoYXJ0aW5nIGVCYXktZGVyaXZlZCBzbmFwc2hvdCcgPyAnUHJpY2VDaGFydGluZycKICAgICAgICAgIDogKGVmZmVjdGl2ZVNvdXJjZSA9PT0gJ1NwYXJrbCBVU0Qgc25hcHNob3QnID8gJ1NwYXJrbCcgOiAnJyk7CiAgICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgdmFsdWUsIGZhbHNlLCAnVVNEJywgZmFsbGJhY2tTb3VyY2UpOwogICAgICAgIHJldHVybiB7dmFsdWU6dmFsdWUsIGN1cnJlbmN5OidVU0QnLCBzb3VyY2U6ZmFsbGJhY2tTb3VyY2V9OwogICAgICB9CgogICAgICBpZiAoU3RyaW5nKHBhY2tJZCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ202YScpewogICAgICAgIHJldHVybiBsb2FkUmVnaW9uYWxUY2dEZXhQcmljZShjYXJkLmlkLCAwKS50aGVuKGZ1bmN0aW9uKHJlZ2lvbmFsKXsKICAgICAgICAgIGlmIChyZWdpb25hbCAmJiByZWdpb25hbC52YWx1ZSAhPSBudWxsKXsKICAgICAgICAgICAgaWYgKHJlZ2lvbmFsLmNhcmQgJiYgcmVnaW9uYWwuY2FyZC5wcmljaW5nKSBjYXJkLnByaWNpbmcgPSByZWdpb25hbC5jYXJkLnByaWNpbmc7CiAgICAgICAgICAgIGlmIChyZWdpb25hbC5jYXJkICYmIHJlZ2lvbmFsLmNhcmQucHJpY2VzKSBjYXJkLnByaWNlcyA9IHJlZ2lvbmFsLmNhcmQucHJpY2VzOwogICAgICAgICAgICBwYWNrRGV0YWlsUHJpY2VDYWNoZS5zZXQoaWQsIHJlZ2lvbmFsLnZhbHVlKTsKICAgICAgICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgcmVnaW9uYWwudmFsdWUsIGZhbHNlLCAnVVNEJywgcmVnaW9uYWwubG9jYWxlKTsKICAgICAgICAgICAgcmV0dXJuIHJlZ2lvbmFsOwogICAgICAgICAgfQogICAgICAgICAgLy8gVVNELW9ubHkgcG9saWN5IGZvciBNNmE6IG5ldmVyIGZhbGwgYmFjayB0byBKUFkgcHJpY2VzLgogICAgICAgICAgcGFja0RldGFpbFByaWNlQ2FjaGUuc2V0KGlkLCBudWxsKTsKICAgICAgICAgIHVwZGF0ZVBhY2tEZXRhaWxQcmljZVRpbGVzKGlkLCBwYWNrSWQsIG51bGwsIGZhbHNlLCAnVVNEJyk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgcGFja0RldGFpbFByaWNlQ2FjaGUuc2V0KGlkLCBudWxsKTsKICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgbnVsbCwgZmFsc2UsICdVU0QnKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KS5jYXRjaChmdW5jdGlvbigpewogICAgICAvLyBEbyBub3QgY2FjaGUgbmV0d29yayBlcnJvcnMgYXMgYSBwZXJtYW5lbnQgYWJzZW5jZSBvZiBtYXJrZXQgZGF0YS4KICAgICAgdXBkYXRlUGFja0RldGFpbFByaWNlVGlsZXMoaWQsIHBhY2tJZCwgbnVsbCwgdHJ1ZSwgJ1VTRCcpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24oKXsKICAgICAgcGFja0RldGFpbFByaWNlUmVxdWVzdHMuZGVsZXRlKGlkKTsKICAgIH0pOwogICAgcGFja0RldGFpbFByaWNlUmVxdWVzdHMuc2V0KGlkLCByZXF1ZXN0KTsKICAgIHJldHVybiByZXF1ZXN0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KXsgcmV0dXJuIHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyA/IHJlc3VsdC52YWx1ZSA6IHJlc3VsdDsgfSk7CiAgfQoKICBmdW5jdGlvbiBwcmVsb2FkUGFja0RldGFpbEZlYXR1cmVkUHJpY2VzKGNhcmRzLCBkZXRhaWwsIHJlcXVlc3RUb2tlbil7CiAgICB2YXIgcGFja0lkID0gU3RyaW5nKGRldGFpbCAmJiBkZXRhaWwuc2V0ICYmIGRldGFpbC5zZXQuaWQgfHwgJycpOwogICAgdmFyIHBlbmRpbmcgPSBbXTsKICAgIChjYXJkcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihjYXJkKXsKICAgICAgaWYgKCFjYXJkIHx8ICFjYXJkLmlkKSByZXR1cm47CiAgICAgIHZhciBpZCA9IFN0cmluZyhjYXJkLmlkKTsKICAgICAgdmFyIGRpcmVjdFByaWNlID0gcHJpY2VVU0QoY2FyZCwgZGV0YWlsKTsKICAgICAgaWYgKGRpcmVjdFByaWNlICE9IG51bGwpewogICAgICAgIHBhY2tEZXRhaWxQcmljZUNhY2hlLnNldChpZCwgZGlyZWN0UHJpY2UpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBBIGNhY2hlZCBudWxsIG1lYW5zIHRoaXMgY2FyZCB3YXMgYWxyZWFkeSBjaGVja2VkIGFuZCBoYXMgbm8gcHVibGlzaGVkIHByaWNlLgogICAgICBpZiAoIXBhY2tEZXRhaWxQcmljZUNhY2hlLmhhcyhpZCkpIHBlbmRpbmcucHVzaChjYXJkKTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHNldE5vdGUobWVzc2FnZSl7CiAgICAgIGlmICghcGFja0RldGFpbE1vZGFsQm9keSB8fCAhcGFja0RldGFpbEFjdGl2ZSB8fCBTdHJpbmcocGFja0RldGFpbEFjdGl2ZS5pZCkgIT09IHBhY2tJZCkgcmV0dXJuOwogICAgICB2YXIgZmVhdHVyZUdyaWQgPSBwYWNrRGV0YWlsTW9kYWxCb2R5LnF1ZXJ5U2VsZWN0b3IoJy5waC1wYWNrLWRldGFpbC1mZWF0dXJlLWdyaWQnKTsKICAgICAgdmFyIHNlY3Rpb24gPSBmZWF0dXJlR3JpZCAmJiBmZWF0dXJlR3JpZC5jbG9zZXN0ID8gZmVhdHVyZUdyaWQuY2xvc2VzdCgnLnBoLXBhY2stZGV0YWlsLXNlY3Rpb24nKSA6IG51bGw7CiAgICAgIHZhciBub3RlID0gc2VjdGlvbiAmJiBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJy5waC1wYWNrLWRldGFpbC1zZWN0aW9uLW5vdGUnKTsKICAgICAgaWYgKG5vdGUpIG5vdGUudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgfQoKICAgIHNvcnRQYWNrRGV0YWlsRmVhdHVyZWRHcmlkKHBhY2tJZCk7CiAgICBpZiAoIXBlbmRpbmcubGVuZ3RoKXsKICAgICAgc2V0Tm90ZSgnU+G6r3AgeOG6v3AgdGhlbyBnacOhIHRo4buLIHRyxrDhu51uZyBjYW8gbmjhuqV0IOKGkiB0aOG6pXAgbmjhuqV0LiBMw6EgY2jGsGEgY8OzIGThu68gbGnhu4d1IGdpw6EgbuG6sW0gY3Xhu5FpIGRhbmggc8OhY2guJyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgY3Vyc29yID0gMCwgYWN0aXZlID0gMCwgY29tcGxldGVkID0gMDsKICAgIHZhciBjb25jdXJyZW5jeSA9IDQ7CiAgICBzZXROb3RlKCfEkGFuZyBraeG7g20gdHJhIGdpw6EgxJHhu4Mgc+G6r3AgeOG6v3AgdOG7qyBjYW8geHXhu5FuZyB0aOG6pXDigKYgKDAvJyArIHBlbmRpbmcubGVuZ3RoICsgJykuIEzDoSBjaMawYSBjw7MgZ2nDoSBz4bq9IG7hurFtIGN14buRaS4nKTsKCiAgICBmdW5jdGlvbiBwdW1wKCl7CiAgICAgIGlmIChyZXF1ZXN0VG9rZW4gIT09IHBhY2tEZXRhaWxSZXF1ZXN0VG9rZW4gfHwgIXBhY2tEZXRhaWxNb2RhbCB8fCBwYWNrRGV0YWlsTW9kYWwuaGlkZGVuKSByZXR1cm47CiAgICAgIHdoaWxlIChhY3RpdmUgPCBjb25jdXJyZW5jeSAmJiBjdXJzb3IgPCBwZW5kaW5nLmxlbmd0aCl7CiAgICAgICAgKGZ1bmN0aW9uKGNhcmQpewogICAgICAgICAgYWN0aXZlKys7CiAgICAgICAgICBsb2FkUGFja0RldGFpbENhcmRQcmljZShjYXJkLCBwYWNrSWQpLnRoZW4oZnVuY3Rpb24oKXt9LCBmdW5jdGlvbigpe30pLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgICAgICAgYWN0aXZlLS07CiAgICAgICAgICAgIGNvbXBsZXRlZCsrOwogICAgICAgICAgICBpZiAocmVxdWVzdFRva2VuID09PSBwYWNrRGV0YWlsUmVxdWVzdFRva2VuICYmIHBhY2tEZXRhaWxNb2RhbCAmJiAhcGFja0RldGFpbE1vZGFsLmhpZGRlbil7CiAgICAgICAgICAgICAgc29ydFBhY2tEZXRhaWxGZWF0dXJlZEdyaWQocGFja0lkKTsKICAgICAgICAgICAgICBzZXROb3RlKCfEkGFuZyBraeG7g20gdHJhIGdpw6EgxJHhu4Mgc+G6r3AgeOG6v3AgdOG7qyBjYW8geHXhu5FuZyB0aOG6pXDigKYgKCcgKyBjb21wbGV0ZWQgKyAnLycgKyBwZW5kaW5nLmxlbmd0aCArICcpLiBMw6EgY2jGsGEgY8OzIGdpw6Egc+G6vSBu4bqxbSBjdeG7kWkuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVtcCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfSkocGVuZGluZ1tjdXJzb3IrK10pOwogICAgICB9CiAgICAgIGlmIChjdXJzb3IgPj0gcGVuZGluZy5sZW5ndGggJiYgYWN0aXZlID09PSAwICYmIHJlcXVlc3RUb2tlbiA9PT0gcGFja0RldGFpbFJlcXVlc3RUb2tlbiAmJiBwYWNrRGV0YWlsTW9kYWwgJiYgIXBhY2tEZXRhaWxNb2RhbC5oaWRkZW4pewogICAgICAgIHNvcnRQYWNrRGV0YWlsRmVhdHVyZWRHcmlkKHBhY2tJZCk7CiAgICAgICAgc2V0Tm90ZSgnxJDDoyBraeG7g20gdHJhIGdpw6EuIEdpw6EgY2FvIG5o4bqldCB44bq/cCB0csaw4bubYzsgdGjhursgY2jGsGEgY8OzIGThu68gbGnhu4d1IGdpw6EgbuG6sW0gY3Xhu5FpIGRhbmggc8OhY2guJyk7CiAgICAgIH0KICAgIH0KICAgIHB1bXAoKTsKICB9CgogIGZ1bmN0aW9uIG1ha2VQYWNrRGV0YWlsVGlsZShjYXJkLCBkZXRhaWwsIHJlcXVlc3RUb2tlbil7CiAgICB2YXIgaW5mbyA9IHBhY2tEZXRhaWxUaWVyKGNhcmQsIGRldGFpbCk7CiAgICB2YXIgdGllciA9IE51bWJlcihpbmZvLnRpZXIpIHx8IDA7CiAgICB2YXIgdGlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgdGlsZS50eXBlID0gJ2J1dHRvbic7CiAgICB0aWxlLmNsYXNzTmFtZSA9ICdwaC1wYWNrLWRldGFpbC10aWxlJyArICh0aWVyID49IDMgPyAnIHBoLXBhY2stZGV0YWlsLXRpbGUtZmVhdHVyZWQnIDogJycpOwogICAgdGlsZS5kYXRhc2V0LnRpZXIgPSBTdHJpbmcodGllcik7CiAgICB0aWxlLmRhdGFzZXQuY2FyZElkID0gU3RyaW5nKGNhcmQuaWQgfHwgJycpOwogICAgdGlsZS5kYXRhc2V0LmxvY2FsSWQgPSBTdHJpbmcoY2FyZC5sb2NhbElkID09IG51bGwgPyAnJyA6IGNhcmQubG9jYWxJZCk7CiAgICB0aWxlLmRhdGFzZXQucGFja0lkID0gU3RyaW5nKChkZXRhaWwgJiYgZGV0YWlsLnNldCAmJiBkZXRhaWwuc2V0LmlkKSB8fCAnJyk7CiAgICB0aWxlLl9waFByaWNlQ2FyZCA9IGNhcmQ7CiAgICB0aWxlLnRpdGxlID0gKGNhcmQubmFtZSB8fCAnVGjhursgYsOgaScpICsgJyDCtyAnICsgcGFja0RldGFpbFRpZXJMYWJlbChpbmZvKSArICcgwrcgQuG6pW0gxJHhu4MgeGVtIGNoaSB0aeG6v3QnOwoKICAgIHZhciBpbWFnZVdyYXAgPSBwYWNrRGV0YWlsRWxlbWVudCgnc3BhbicsICdwaC1wYWNrLWRldGFpbC10aHVtYicpOwogICAgaWYgKGNhcmQuaW1hZ2UpewogICAgICB2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgaW1hZ2UuYWx0ID0gY2FyZC5uYW1lIHx8ICcnOwogICAgICBpbWFnZS5sb2FkaW5nID0gJ2xhenknOwogICAgICBpbWFnZS5kZWNvZGluZyA9ICdhc3luYyc7CiAgICAgIGltYWdlLnNyYyA9IGNhcmQuaW1hZ2UgKyAnLycgKyBRVUFMSVRZOwogICAgICBpbWFnZS5vbmVycm9yID0gZnVuY3Rpb24oKXsgaW1hZ2VXcmFwLnRleHRDb250ZW50ID0gJ0NoxrBhIGPDsyDhuqNuaCc7IH07CiAgICAgIGltYWdlV3JhcC5hcHBlbmRDaGlsZChpbWFnZSk7CiAgICB9ZWxzZXsKICAgICAgaW1hZ2VXcmFwLnRleHRDb250ZW50ID0gJ0NoxrBhIGPDsyDhuqNuaCc7CiAgICB9CiAgICB2YXIgbnVtYmVyID0gcGFja0RldGFpbEVsZW1lbnQoJ3NwYW4nLCAncGgtcGFjay1kZXRhaWwtbnVtYmVyJywgY2FyZC5sb2NhbElkICE9IG51bGwgPyAnIycgKyBjYXJkLmxvY2FsSWQgOiAnJyk7CiAgICB2YXIgbmFtZSA9IHBhY2tEZXRhaWxFbGVtZW50KCdzcGFuJywgJ3BoLXBhY2stZGV0YWlsLW5hbWUnLCBjYXJkLm5hbWUgfHwgJ0tow7RuZyByw7UgdMOqbicpOwogICAgdmFyIHJhcml0eSA9IHBhY2tEZXRhaWxFbGVtZW50KCdzcGFuJywgJ3BoLXBhY2stZGV0YWlsLXJhcml0eScsIHBhY2tEZXRhaWxUaWVyTGFiZWwoaW5mbykpOwogICAgdmFyIGNhcmRJZCA9IFN0cmluZyhjYXJkLmlkIHx8ICcnKTsKICAgIHZhciBrbm93blByaWNlID0gcHJpY2VVU0QoY2FyZCwgZGV0YWlsKTsKICAgIGlmIChrbm93blByaWNlICE9IG51bGwpIHBhY2tEZXRhaWxQcmljZUNhY2hlLnNldChjYXJkSWQsIGtub3duUHJpY2UpOwogICAgdmFyIGNhY2hlZFByaWNlRXhpc3RzID0ga25vd25QcmljZSA9PSBudWxsICYmIHBhY2tEZXRhaWxQcmljZUNhY2hlLmhhcyhjYXJkSWQpOwogICAgdmFyIGNhY2hlZFByaWNlID0gY2FjaGVkUHJpY2VFeGlzdHMgPyBwYWNrRGV0YWlsUHJpY2VDYWNoZS5nZXQoY2FyZElkKSA6IG51bGw7CiAgICB2YXIgaW5pdGlhbFNvcnRhYmxlUHJpY2UgPSBrbm93blByaWNlICE9IG51bGwgPyBrbm93blByaWNlIDogY2FjaGVkUHJpY2U7CiAgICB0aWxlLmRhdGFzZXQucHJpY2UgPSBpbml0aWFsU29ydGFibGVQcmljZSAhPSBudWxsICYmIE51bWJlcihpbml0aWFsU29ydGFibGVQcmljZSkgPiAwID8gU3RyaW5nKE51bWJlcihpbml0aWFsU29ydGFibGVQcmljZSkpIDogJyc7CiAgICB2YXIgaGFzSW5pdGlhbFByaWNlID0ga25vd25QcmljZSAhPSBudWxsIHx8IGNhY2hlZFByaWNlICE9IG51bGw7CiAgICB2YXIgaW5pdGlhbFByaWNlID0ga25vd25QcmljZSAhPSBudWxsID8gbW9uZXkoa25vd25QcmljZSkKICAgICAgOiAoY2FjaGVkUHJpY2VFeGlzdHMgPyAoY2FjaGVkUHJpY2UgIT0gbnVsbCA/IG1vbmV5KGNhY2hlZFByaWNlKSA6ICdDaMawYSBjw7MgZ2nDoSBVU0QnKSA6ICfEkGFuZyBs4bqleSBnacOhIFVTROKApicpOwogICAgdmFyIHByaWNlQ2xhc3MgPSAncGgtcGFjay1kZXRhaWwtcHJpY2UnICsgKGhhc0luaXRpYWxQcmljZSA/ICcnIDogKGNhY2hlZFByaWNlRXhpc3RzID8gJyBwaC1jYXJkLW5vcHJpY2UnIDogJyBwaC1wcmljZS1sb2FkaW5nJykpOwogICAgdmFyIHByaWNlID0gcGFja0RldGFpbEVsZW1lbnQoJ3NwYW4nLCBwcmljZUNsYXNzLCBpbml0aWFsUHJpY2UpOwogICAgaWYgKGtub3duUHJpY2UgIT0gbnVsbCl7CiAgICAgIHByaWNlLnRpdGxlID0gY2FyZC5fcGhNYXJrZXRQcmljZVNvdXJjZSA9PT0gJ1ByaWNlQ2hhcnRpbmcgZUJheS1kZXJpdmVkIHNuYXBzaG90JwogICAgICAgID8gJ0dpw6EgxrDhu5tjIHTDrW5oIFVTRCB04burIFByaWNlQ2hhcnRpbmcgZOG7sWEgdHLDqm4gbOG7i2NoIHPhu60gZ2lhbyBk4buLY2ggxJHDoyBob8OgbiB04bqldCAoYmFvIGfhu5NtIGVCYXkpOyBraeG7g20gdHJhICcgKyBNNkFfUkdCX1VTRF9QUklDRV9TTkFQU0hPVAogICAgICAgIDogKGNhcmQuX3BoTWFya2V0UHJpY2VTb3VyY2UgPT09ICdTcGFya2wgVVNEIHNuYXBzaG90JwogICAgICAgICAgPyAnR2nDoSB0aGFtIGto4bqjbyBVU0QgdOG7qyBUQ0dwbGF5ZXIvQ2FyZG1hcmtldDsgbmd14buTbiBTcGFya2wsIHNuYXBzaG90ICcgKyBNNkFfVVNEX1BSSUNFX1NOQVBTSE9UCiAgICAgICAgICA6ICdHacOhIHRoYW0ga2jhuqNvIGLhurFuZyBVU0QgdOG7qyBUQ0dkZXgnKTsKICAgICAgcHJpY2UuZGF0YXNldC5jdXJyZW5jeSA9ICdVU0QnOwogICAgfSBlbHNlIHsKICAgICAgcHJpY2UudGl0bGUgPSBjYWNoZWRQcmljZSAhPSBudWxsID8gJ0dpw6EgdGhhbSBraOG6o28gYuG6sW5nIFVTRCcgOiAoY2FjaGVkUHJpY2VFeGlzdHMgPyAnQ2jGsGEgdMOsbSB0aOG6pXkgZ2nDoSBVU0QgxJHGsOG7o2MgY8O0bmcgYuG7kScgOiAnR2nDoSBVU0Qgc+G6vSDEkcaw4bujYyB04bqjaSBraGkgdGjhursg4bufIGfhuqduIHbDuW5nIG5ow6xuIHRo4bqleScpOwogICAgICBpZiAoY2FjaGVkUHJpY2UgIT0gbnVsbCkgcHJpY2UuZGF0YXNldC5jdXJyZW5jeSA9ICdVU0QnOwogICAgfQogICAgdGlsZS5hcHBlbmRDaGlsZChpbWFnZVdyYXApOwogICAgdGlsZS5hcHBlbmRDaGlsZChudW1iZXIpOwogICAgdGlsZS5hcHBlbmRDaGlsZChuYW1lKTsKICAgIHRpbGUuYXBwZW5kQ2hpbGQocmFyaXR5KTsKICAgIHRpbGUuYXBwZW5kQ2hpbGQocHJpY2UpOwoKICAgIC8vIEThu68gbGnhu4d1IFVTRCBzbmFwc2hvdCBj4bunYSBNNmEgaGnhu4NuIHRo4buLIG5nYXk7IGPDoWMgbMOhIGNoxrBhIGPDsyBnacOhIHPhur0gdOG6o2kgVENHZGV4IHRoZW8gbmh1IGPhuqd1LgogICAgaWYgKGtub3duUHJpY2UgPT0gbnVsbCAmJiAhY2FjaGVkUHJpY2VFeGlzdHMpewogICAgICBlbnN1cmVQYWNrRGV0YWlsUHJpY2VPYnNlcnZlcigpOwogICAgICBpZiAocGFja0RldGFpbFByaWNlT2JzZXJ2ZXIpIHBhY2tEZXRhaWxQcmljZU9ic2VydmVyLm9ic2VydmUodGlsZSk7CiAgICAgIGVsc2UgbG9hZFBhY2tEZXRhaWxDYXJkUHJpY2UoY2FyZCwgdGlsZS5kYXRhc2V0LnBhY2tJZCk7CiAgICB9CiAgICB0aWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsgb3BlblBhY2tEZXRhaWxDYXJkKGNhcmQsIGRldGFpbCwgcmVxdWVzdFRva2VuKTsgfSk7CiAgICByZXR1cm4gdGlsZTsKICB9CgogIGZ1bmN0aW9uIG9wZW5QYWNrRGV0YWlsQ2FyZChjYXJkLCBkZXRhaWwsIHJlcXVlc3RUb2tlbil7CiAgICBpZiAoIWNhcmQgfHwgIWNhcmQuaWQpIHJldHVybjsKICAgIGlmICghcGFja0RldGFpbE1vZGFsIHx8IHBhY2tEZXRhaWxNb2RhbC5oaWRkZW4gfHwgcmVxdWVzdFRva2VuICE9PSBwYWNrRGV0YWlsUmVxdWVzdFRva2VuKSByZXR1cm47CiAgICBmdWxsQ2FyZChjYXJkLmlkKS50aGVuKGZ1bmN0aW9uKGZ1bGwpewogICAgICAvLyBO4bq/dSBuZ8aw4budaSBjaMahaSDEkcOjIMSRw7NuZyBob+G6t2MgxJHhu5VpIHBhY2sgdHJvbmcgbMO6YyByZXF1ZXN0LCBraMO0bmcgbeG7nyBtb2RhbCBi4bqldCBuZ+G7nS4KICAgICAgaWYgKCFwYWNrRGV0YWlsTW9kYWwgfHwgcGFja0RldGFpbE1vZGFsLmhpZGRlbiB8fCByZXF1ZXN0VG9rZW4gIT09IHBhY2tEZXRhaWxSZXF1ZXN0VG9rZW4pIHJldHVybjsKICAgICAgZnVsbCA9IGZ1bGwgfHwgY2FyZDsKICAgICAgdmFyIHNldEluZm8gPSBkZXRhaWwgJiYgZGV0YWlsLnNldCA/IGRldGFpbC5zZXQgOiB7fTsKICAgICAgZnVsbC5zZXQgPSBPYmplY3QuYXNzaWduKHt9LCBmdWxsLnNldCB8fCB7fSwgewogICAgICAgIGlkOiAoZnVsbC5zZXQgJiYgZnVsbC5zZXQuaWQpIHx8IHNldEluZm8uaWQgfHwgJycsCiAgICAgICAgbmFtZTogKGZ1bGwuc2V0ICYmIGZ1bGwuc2V0Lm5hbWUpIHx8IHNldEluZm8ubmFtZSB8fCAnJywKICAgICAgICBjYXJkQ291bnQ6IChmdWxsLnNldCAmJiBmdWxsLnNldC5jYXJkQ291bnQpIHx8IHNldEluZm8uY2FyZENvdW50IHx8IHt9CiAgICAgIH0pOwogICAgICB2YXIgaW5mbyA9IGZ1bGwucmFyaXR5ID8gcmFyaXR5VGllcihmdWxsLnJhcml0eSkgOiBwYWNrRGV0YWlsVGllcihjYXJkLCBkZXRhaWwpOwogICAgICB2YXIgdXNkUHJpY2UgPSBwcmljZVVTRChmdWxsLCBkZXRhaWwpOwogICAgICB2YXIgbWFya2V0RmFsbGJhY2sgPSAoZnVsbC5fcGhNYXJrZXRQcmljZVNvdXJjZSA9PT0gJ1NwYXJrbCBVU0Qgc25hcHNob3QnIHx8IGZ1bGwuX3BoTWFya2V0UHJpY2VTb3VyY2UgPT09ICdQcmljZUNoYXJ0aW5nIGVCYXktZGVyaXZlZCBzbmFwc2hvdCcpICYmIHVzZFByaWNlICE9IG51bGwKICAgICAgICA/IHtjdXJyZW5jeTonVVNEJywgdmFsdWU6dXNkUHJpY2UsIHNvdXJjZTpmdWxsLl9waE1hcmtldFByaWNlU291cmNlID09PSAnUHJpY2VDaGFydGluZyBlQmF5LWRlcml2ZWQgc25hcHNob3QnID8gTTZBX1JHQl9VU0RfUFJJQ0VfU09VUkNFIDogTTZBX1VTRF9QUklDRV9TT1VSQ0V9CiAgICAgICAgOiBudWxsOwogICAgICBwYWNrRGV0YWlsUmV0dXJuID0gdHJ1ZTsKICAgICAgcGFja0RldGFpbE1vZGFsLmhpZGRlbiA9IHRydWU7CiAgICAgIG9wZW5DYXJkTW9kYWwoZnVsbCwgaW5mbywgdXNkUHJpY2UsIG1hcmtldEZhbGxiYWNrKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmIChyZXF1ZXN0VG9rZW4gPT09IHBhY2tEZXRhaWxSZXF1ZXN0VG9rZW4gJiYgcGFja0RldGFpbE1vZGFsICYmICFwYWNrRGV0YWlsTW9kYWwuaGlkZGVuKXsKICAgICAgICB0b2FzdCgnS2jDtG5nIHThuqNpIMSRxrDhu6NjIGNoaSB0aeG6v3QgbMOhIGLDoGkuIEjDo3kgdGjhu60gYuG6pW0gbOG6oWkuJyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyUGFja0RldGFpbEdyaWQoZ3JpZCwgY2FyZHMsIGRldGFpbCwgcmVxdWVzdFRva2VuLCBxdWVyeSwgZmlsdGVyKXsKICAgIGdyaWQudGV4dENvbnRlbnQgPSAnJzsKICAgIHZhciBxID0gU3RyaW5nKHF1ZXJ5IHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHZhciBzaG93biA9IChjYXJkcyB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uKGNhcmQpewogICAgICB2YXIgaW5mbyA9IHBhY2tEZXRhaWxUaWVyKGNhcmQsIGRldGFpbCksIHRpZXIgPSBOdW1iZXIoaW5mby50aWVyKSB8fCAwOwogICAgICBpZiAoZmlsdGVyID09PSAnZmVhdHVyZWQnICYmIHRpZXIgPCAzKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChmaWx0ZXIgPT09ICdmdWxsYXJ0JyAmJiB0aWVyIDwgNCkgcmV0dXJuIGZhbHNlOwogICAgICBpZiAoZmlsdGVyID09PSAnY2hhc2UnICYmIHRpZXIgPCA1KSByZXR1cm4gZmFsc2U7CiAgICAgIGlmICghcSkgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiAoU3RyaW5nKGNhcmQubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmRleE9mKHEpICE9PSAtMSB8fCBTdHJpbmcoY2FyZC5sb2NhbElkIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocSkgIT09IC0xKTsKICAgIH0pOwogICAgdmFyIHNlY3Rpb24gPSBncmlkLmNsb3Nlc3QgPyBncmlkLmNsb3Nlc3QoJy5waC1wYWNrLWRldGFpbC1hbGwtc2VjdGlvbicpIDogKGdyaWQucGFyZW50Tm9kZSAmJiBncmlkLnBhcmVudE5vZGUucGFyZW50Tm9kZSk7CiAgICB2YXIgY291bnQgPSBzZWN0aW9uICYmIHNlY3Rpb24ucXVlcnlTZWxlY3RvcignLnBoLXBhY2stZGV0YWlsLXJlc3VsdHMtY291bnQnKTsKICAgIGlmIChjb3VudCkgY291bnQudGV4dENvbnRlbnQgPSAnSGnhu4NuIHRo4buLICcgKyBzaG93bi5sZW5ndGggKyAnLycgKyAoY2FyZHMgfHwgW10pLmxlbmd0aCArICcgbMOhJzsKICAgIGlmICghc2hvd24ubGVuZ3RoKXsKICAgICAgZ3JpZC5hcHBlbmRDaGlsZChwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLWVtcHR5JywgJ0tow7RuZyB0w6xtIHRo4bqleSBsw6EgYsOgaSBwaMO5IGjhu6NwIHbhu5tpIGLhu5kgbOG7jWMgbsOgeS4nKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNob3duLmZvckVhY2goZnVuY3Rpb24oY2FyZCl7IGdyaWQuYXBwZW5kQ2hpbGQobWFrZVBhY2tEZXRhaWxUaWxlKGNhcmQsIGRldGFpbCwgcmVxdWVzdFRva2VuKSk7IH0pOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyUGFja0RldGFpbHMoZGV0YWlsLCByZXF1ZXN0VG9rZW4pewogICAgaWYgKCFwYWNrRGV0YWlsTW9kYWwgfHwgcGFja0RldGFpbE1vZGFsLmhpZGRlbiB8fCByZXF1ZXN0VG9rZW4gIT09IHBhY2tEZXRhaWxSZXF1ZXN0VG9rZW4pIHJldHVybjsKICAgIHZhciBib2R5ID0gcGFja0RldGFpbE1vZGFsQm9keTsKICAgIGJvZHkudGV4dENvbnRlbnQgPSAnJzsKICAgIHZhciBzZXQgPSBkZXRhaWwuc2V0IHx8IHt9OwogICAgdmFyIGNhcmRzID0gQXJyYXkuaXNBcnJheShkZXRhaWwuY2FyZHMpID8gZGV0YWlsLmNhcmRzIDogW107CiAgICB2YXIgdGllcnMgPSBkZXRhaWwudGllck1hcCB8fCB7fTsKICAgIHZhciBmZWF0dXJlZCA9IGNhcmRzLmZpbHRlcihmdW5jdGlvbihjYXJkKXsgcmV0dXJuIChOdW1iZXIocGFja0RldGFpbFRpZXIoY2FyZCwgZGV0YWlsKS50aWVyKSB8fCAwKSA+PSAzOyB9KTsKICAgIGZlYXR1cmVkLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgdmFyIHRhID0gTnVtYmVyKHBhY2tEZXRhaWxUaWVyKGEsIGRldGFpbCkudGllcikgfHwgMDsKICAgICAgdmFyIHRiID0gTnVtYmVyKHBhY2tEZXRhaWxUaWVyKGIsIGRldGFpbCkudGllcikgfHwgMDsKICAgICAgaWYgKHRhICE9PSB0YikgcmV0dXJuIHRiIC0gdGE7CiAgICAgIHJldHVybiBTdHJpbmcoYS5sb2NhbElkIHx8ICcnKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLmxvY2FsSWQgfHwgJycpLCB1bmRlZmluZWQsIHtudW1lcmljOnRydWUsIHNlbnNpdGl2aXR5OidiYXNlJ30pOwogICAgfSk7CiAgICB2YXIgY2hhc2VDb3VudCA9IGNhcmRzLmZpbHRlcihmdW5jdGlvbihjYXJkKXsgcmV0dXJuIChOdW1iZXIocGFja0RldGFpbFRpZXIoY2FyZCwgZGV0YWlsKS50aWVyKSB8fCAwKSA+PSA1OyB9KS5sZW5ndGg7CgogICAgdmFyIGhlYWRpbmcgPSBwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLWhlYWRpbmcnKTsKICAgIGhlYWRpbmcuYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC1leWVicm93JywgJ1BBQ0sgR1VJREUgwrcgQ0FSRCBDSEVDS0xJU1QnKSk7CiAgICBoZWFkaW5nLmFwcGVuZENoaWxkKHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtdGl0bGUnLCAoc2V0Lm5hbWUgfHwgJ1BhY2snKSArICcg4oCUIENoaSB0aeG6v3QgcGFjaycpKTsKICAgIHZhciBzdWJUZXh0ID0gW3NldC5zZXJpZSAmJiAoc2V0LnNlcmllLm5hbWUgfHwgc2V0LnNlcmllLmlkKSwgKHNldC5jYXJkQ291bnQgJiYgc2V0LmNhcmRDb3VudC50b3RhbCA/IHNldC5jYXJkQ291bnQudG90YWwgKyAnIGzDoSB0cm9uZyBi4buZJyA6IGNhcmRzLmxlbmd0aCArICcgbMOhIHRyb25nIGLhu5knKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKTsKICAgIGlmIChTdHJpbmcoc2V0LmlkIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnbTZhJyl7CiAgICAgIHN1YlRleHQgKz0gJyDCtyBHacOhIHRoYW0ga2jhuqNvIFVTRDogxrB1IHRpw6puIHNuYXBzaG90IFNwYXJrbC9UQ0dwbGF5ZXItQ2FyZG1hcmtldCB2w6AgUHJpY2VDaGFydGluZyBjaG8gTWV3IFJHQjsga2jDtG5nIGhp4buDbiB0aOG7iyBnacOhIEpQWSc7CiAgICB9CiAgICBoZWFkaW5nLmFwcGVuZENoaWxkKHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtc3VidGl0bGUnLCBzdWJUZXh0IHx8ICdEYW5oIHPDoWNoIGNhcmQgdsOgIGPDoWMgbMOhIG7hu5VpIGLhuq10JykpOwogICAgYm9keS5hcHBlbmRDaGlsZChoZWFkaW5nKTsKCiAgICB2YXIgc3RhdHMgPSBwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLXN0YXRzJyk7CiAgICBbCiAgICAgIHt2YWx1ZTpTdHJpbmcoY2FyZHMubGVuZ3RoKSwgbGFiZWw6J1Thu5VuZyBz4buRIGzDoSd9LAogICAgICB7dmFsdWU6U3RyaW5nKGZlYXR1cmVkLmxlbmd0aCksIGxhYmVsOidMw6EgbuG7lWkgYuG6rXQgwrcgYuG6rWMgMysnfSwKICAgICAge3ZhbHVlOlN0cmluZyhjaGFzZUNvdW50KSwgbGFiZWw6J0NoYXNlIGNhcmRzIMK3IGLhuq1jIDUrJ30KICAgIF0uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgdmFyIGJveCA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtc3RhdCcpOwogICAgICBib3guYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2InLCAnJywgaXRlbS52YWx1ZSkpOwogICAgICBib3guYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ3NwYW4nLCAnJywgaXRlbS5sYWJlbCkpOwogICAgICBzdGF0cy5hcHBlbmRDaGlsZChib3gpOwogICAgfSk7CiAgICBib2R5LmFwcGVuZENoaWxkKHN0YXRzKTsKCiAgICB2YXIgZmVhdHVyZWRTZWN0aW9uID0gcGFja0RldGFpbEVsZW1lbnQoJ3NlY3Rpb24nLCAncGgtcGFjay1kZXRhaWwtc2VjdGlvbicpOwogICAgdmFyIGZlYXR1cmVkSGVhZCA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtc2VjdGlvbi1oZWFkJyk7CiAgICB2YXIgZmVhdHVyZWRUaXRsZXMgPSBwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJycpOwogICAgZmVhdHVyZWRUaXRsZXMuYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC1zZWN0aW9uLXRpdGxlJywgJ+KtkCBDw6FjIGzDoSBu4buVaSBi4bqtdCDEkeG7gyBzxINuJykpOwogICAgZmVhdHVyZWRUaXRsZXMuYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC1zZWN0aW9uLW5vdGUnLCAnxJBhbmcgc+G6r3AgeOG6v3AgbMOhIG7hu5VpIGLhuq10IHRoZW8gZ2nDoSB0aOG7iyB0csaw4budbmcgY2FvIG5o4bqldCDihpIgdGjhuqVwIG5o4bqldDsgY8OhYyBsw6EgY2jGsGEgY8OzIGdpw6Egc+G6vSBu4bqxbSBjdeG7kWkgZGFuaCBzw6FjaC4nKSk7CiAgICBmZWF0dXJlZEhlYWQuYXBwZW5kQ2hpbGQoZmVhdHVyZWRUaXRsZXMpOwogICAgZmVhdHVyZWRIZWFkLmFwcGVuZENoaWxkKHBhY2tEZXRhaWxFbGVtZW50KCdzcGFuJywgJ3BoLXBhY2stZGV0YWlsLWNvdW50JywgZmVhdHVyZWQubGVuZ3RoICsgJyBsw6EnKSk7CiAgICBmZWF0dXJlZFNlY3Rpb24uYXBwZW5kQ2hpbGQoZmVhdHVyZWRIZWFkKTsKICAgIGlmIChmZWF0dXJlZC5sZW5ndGgpewogICAgICB2YXIgZmVhdHVyZUdyaWQgPSBwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLWdyaWQgcGgtcGFjay1kZXRhaWwtZmVhdHVyZS1ncmlkJyk7CiAgICAgIGZlYXR1cmVkLmZvckVhY2goZnVuY3Rpb24oY2FyZCl7IGZlYXR1cmVHcmlkLmFwcGVuZENoaWxkKG1ha2VQYWNrRGV0YWlsVGlsZShjYXJkLCBkZXRhaWwsIHJlcXVlc3RUb2tlbikpOyB9KTsKICAgICAgZmVhdHVyZWRTZWN0aW9uLmFwcGVuZENoaWxkKGZlYXR1cmVHcmlkKTsKICAgIH1lbHNlewogICAgICB2YXIgbm9GZWF0dXJlZCA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtZW1wdHknLCAnQVBJIGNoxrBhIHRy4bqjIHbhu4EgxJHhu6cgZOG7ryBsaeG7h3UgxJHhu5kgaGnhur9tIMSR4buDIHjDoWMgxJHhu4tuaCBsw6EgbuG7lWkgYuG6rXQgY2hvIGLhu5kgbsOgeS4gRGFuaCBzw6FjaCB04bqldCBj4bqjIGNhcmQgYsOqbiBkxrDhu5tpIHbhuqtuIGTDuW5nIMSRxrDhu6NjLicpOwogICAgICBmZWF0dXJlZFNlY3Rpb24uYXBwZW5kQ2hpbGQobm9GZWF0dXJlZCk7CiAgICB9CiAgICBib2R5LmFwcGVuZENoaWxkKGZlYXR1cmVkU2VjdGlvbik7CgogICAgdmFyIGFsbFNlY3Rpb24gPSBwYWNrRGV0YWlsRWxlbWVudCgnc2VjdGlvbicsICdwaC1wYWNrLWRldGFpbC1zZWN0aW9uIHBoLXBhY2stZGV0YWlsLWFsbC1zZWN0aW9uJyk7CiAgICB2YXIgYWxsSGVhZCA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtc2VjdGlvbi1oZWFkJyk7CiAgICB2YXIgYWxsVGl0bGVzID0gcGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICcnKTsKICAgIGFsbFRpdGxlcy5hcHBlbmRDaGlsZChwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLXNlY3Rpb24tdGl0bGUnLCAn8J+Xgu+4jyBU4bqldCBj4bqjIHRo4bq7IHRyb25nIHBhY2snKSk7CiAgICBhbGxUaXRsZXMuYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC1zZWN0aW9uLW5vdGUnLCAnR2nDoSBVU0QgaGnhu4NuIHRo4buLIHRyw6puIHThu6tuZyB0aOG6uyBraGkgZOG7ryBsaeG7h3UgY8OzIHPhurVuLiBHacOhIGPDsyB0aOG7gyB0aGnhur91IHbhu5tpIG3hu5l0IHPhu5EgbMOhIGhv4bq3YyBi4buZIGPFqS4nKSk7CiAgICBhbGxIZWFkLmFwcGVuZENoaWxkKGFsbFRpdGxlcyk7CiAgICB2YXIgcmVzdWx0Q291bnQgPSBwYWNrRGV0YWlsRWxlbWVudCgnc3BhbicsICdwaC1wYWNrLWRldGFpbC1jb3VudCBwaC1wYWNrLWRldGFpbC1yZXN1bHRzLWNvdW50JywgJycpOwogICAgYWxsSGVhZC5hcHBlbmRDaGlsZChyZXN1bHRDb3VudCk7CiAgICBhbGxTZWN0aW9uLmFwcGVuZENoaWxkKGFsbEhlYWQpOwoKICAgIHZhciBjb250cm9scyA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtY29udHJvbHMnKTsKICAgIHZhciBzZWFyY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgc2VhcmNoLnR5cGUgPSAnc2VhcmNoJzsKICAgIHNlYXJjaC5jbGFzc05hbWUgPSAncGgtcGFjay1kZXRhaWwtc2VhcmNoJzsKICAgIHNlYXJjaC5wbGFjZWhvbGRlciA9ICfwn5SOIFTDrG0gdMOqbiBjYXJkIGhv4bq3YyBz4buRIHRo4bq74oCmJzsKICAgIHNlYXJjaC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVMOsbSB0aOG6uyB0cm9uZyBwYWNrJyk7CiAgICB2YXIgZmlsdGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7CiAgICBmaWx0ZXIuY2xhc3NOYW1lID0gJ3BoLXBhY2stZGV0YWlsLWZpbHRlcic7CiAgICBmaWx0ZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0zhu41jIHRoZW8gxJHhu5kgaGnhur9tJyk7CiAgICBbCiAgICAgIHt2YWx1ZTonYWxsJywgbGFiZWw6J1ThuqV0IGPhuqMgY8OhYyBsw6EnfSwKICAgICAge3ZhbHVlOidmZWF0dXJlZCcsIGxhYmVsOidMw6EgbuG7lWkgYuG6rXQgwrcgYuG6rWMgMysnfSwKICAgICAge3ZhbHVlOidmdWxsYXJ0JywgbGFiZWw6J0Z1bGwgQXJ0IHRy4bufIGzDqm4gwrcgYuG6rWMgNCsnfSwKICAgICAge3ZhbHVlOidjaGFzZScsIGxhYmVsOidDaGFzZSBjYXJkcyDCtyBi4bqtYyA1Kyd9CiAgICBdLmZvckVhY2goZnVuY3Rpb24ob3B0KXsKICAgICAgdmFyIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOyBvcHRpb24udmFsdWUgPSBvcHQudmFsdWU7IG9wdGlvbi50ZXh0Q29udGVudCA9IG9wdC5sYWJlbDsgZmlsdGVyLmFwcGVuZENoaWxkKG9wdGlvbik7CiAgICB9KTsKICAgIGNvbnRyb2xzLmFwcGVuZENoaWxkKHNlYXJjaCk7IGNvbnRyb2xzLmFwcGVuZENoaWxkKGZpbHRlcik7CiAgICBhbGxTZWN0aW9uLmFwcGVuZENoaWxkKGNvbnRyb2xzKTsKICAgIHZhciBhbGxHcmlkV3JhcCA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtYWxsLXdyYXAnKTsKICAgIHZhciBhbGxHcmlkID0gcGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC1ncmlkIHBoLXBhY2stZGV0YWlsLWFsbC1ncmlkJyk7CiAgICBhbGxHcmlkV3JhcC5hcHBlbmRDaGlsZChhbGxHcmlkKTsKICAgIGFsbFNlY3Rpb24uYXBwZW5kQ2hpbGQoYWxsR3JpZFdyYXApOwogICAgYm9keS5hcHBlbmRDaGlsZChhbGxTZWN0aW9uKTsKCiAgICBmdW5jdGlvbiB1cGRhdGVHcmlkKCl7IHJlbmRlclBhY2tEZXRhaWxHcmlkKGFsbEdyaWQsIGNhcmRzLCBkZXRhaWwsIHJlcXVlc3RUb2tlbiwgc2VhcmNoLnZhbHVlLCBmaWx0ZXIudmFsdWUpOyB9CiAgICBzZWFyY2guYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB1cGRhdGVHcmlkKTsKICAgIGZpbHRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVHcmlkKTsKICAgIHVwZGF0ZUdyaWQoKTsKICAgIHNvcnRQYWNrRGV0YWlsRmVhdHVyZWRHcmlkKHNldC5pZCk7CiAgICBwcmVsb2FkUGFja0RldGFpbEZlYXR1cmVkUHJpY2VzKGZlYXR1cmVkLCBkZXRhaWwsIHJlcXVlc3RUb2tlbik7CiAgfQoKICBmdW5jdGlvbiBvcGVuUGFja0RldGFpbHMoc2V0LCBzZXJpZXNOYW1lKXsKICAgIHZhciBtb2RhbCA9IGVuc3VyZVBhY2tEZXRhaWxNb2RhbCgpOwogICAgdmFyIGlkID0gc2V0ICYmIHNldC5pZDsKICAgIGlmICghaWQpeyB0b2FzdCgnS2jDtG5nIHjDoWMgxJHhu4tuaCDEkcaw4bujYyBJRCBj4bunYSBwYWNrIG7DoHkuJyk7IHJldHVybjsgfQogICAgdmFyIHRva2VuID0gKytwYWNrRGV0YWlsUmVxdWVzdFRva2VuOwogICAgcGFja0RldGFpbEFjdGl2ZSA9IHsgaWQ6U3RyaW5nKGlkKSwgc2V0OnNldCwgc2VyaWVzTmFtZTpzZXJpZXNOYW1lIHx8ICcnIH07CiAgICBwYWNrRGV0YWlsTW9kYWxCb2R5LnRleHRDb250ZW50ID0gJyc7CiAgICBtb2RhbC5oaWRkZW4gPSBmYWxzZTsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKHRydWUpOwogICAgdmFyIGxvYWRpbmcgPSBwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLWxvYWRpbmcnKTsKICAgIGxvYWRpbmcuYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC1sb2FkaW5nLWljb24nLCAn8J+OtCcpKTsKICAgIGxvYWRpbmcuYXBwZW5kQ2hpbGQocGFja0RldGFpbEVsZW1lbnQoJ2RpdicsICdwaC1wYWNrLWRldGFpbC10aXRsZScsIChzZXQubmFtZSB8fCAnUGFjaycpICsgJyDigJQgQ2hpIHRp4bq/dCBwYWNrJykpOwogICAgbG9hZGluZy5hcHBlbmRDaGlsZChwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLXN1YnRpdGxlJywgJ8SQYW5nIHThuqNpIGRhbmggc8OhY2ggdOG6pXQgY+G6oyBjYXJkIHbDoCB4w6FjIMSR4buLbmggY8OhYyBsw6EgbuG7lWkgYuG6rXTigKYnKSk7CiAgICB2YXIgc3BpbiA9IHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtc3Bpbm5lcicpOwogICAgbG9hZGluZy5hcHBlbmRDaGlsZChzcGluKTsKICAgIHBhY2tEZXRhaWxNb2RhbEJvZHkuYXBwZW5kQ2hpbGQobG9hZGluZyk7CgogICAgaWYgKHBhY2tEZXRhaWxDYWNoZS5oYXMoU3RyaW5nKGlkKSkpewogICAgICB2YXIgY2FjaGVkID0gcGFja0RldGFpbENhY2hlLmdldChTdHJpbmcoaWQpKTsKICAgICAgaWYgKHNlcmllc05hbWUgJiYgIWNhY2hlZC5zZXQuc2VyaWUpIGNhY2hlZC5zZXQuc2VyaWUgPSB7bmFtZTpzZXJpZXNOYW1lfTsKICAgICAgcmVuZGVyUGFja0RldGFpbHMoY2FjaGVkLCB0b2tlbik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBnZXRKU09OKEFQSSArICcvc2V0cy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgMTIwMDApLnRoZW4oZnVuY3Rpb24oZGF0YSl7CiAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5pZCkgdGhyb3cgbmV3IEVycm9yKCdBUEkga2jDtG5nIHRy4bqjIHbhu4EgdGjDtG5nIHRpbiBi4buZIHRo4bq7Jyk7CiAgICAgIHZhciBjYXJkcyA9IEFycmF5LmlzQXJyYXkoZGF0YS5jYXJkcykgPyBkYXRhLmNhcmRzLmZpbHRlcihmdW5jdGlvbihjKXsgcmV0dXJuIGMgJiYgYy5pZDsgfSkgOiBbXTsKICAgICAgaWYgKCFjYXJkcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQuG7mSBuw6B5IGNoxrBhIGPDsyBkYW5oIHPDoWNoIGNhcmQgdHLDqm4gVENHZGV4Jyk7CiAgICAgIGlmICghZGF0YS5zZXJpZSAmJiBzZXJpZXNOYW1lKSBkYXRhLnNlcmllID0ge25hbWU6c2VyaWVzTmFtZX07CiAgICAgIHJldHVybiBsb2FkUGFja1RpZXJNYXAoZGF0YS5pZCwgY2FyZHMpLnRoZW4oZnVuY3Rpb24odGllck1hcCl7CiAgICAgICAgcmV0dXJuIHsgc2V0OmRhdGEsIGNhcmRzOmNhcmRzLCB0aWVyTWFwOnRpZXJNYXAgfHwge30gfTsKICAgICAgfSk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKGRldGFpbCl7CiAgICAgIGlmICh0b2tlbiAhPT0gcGFja0RldGFpbFJlcXVlc3RUb2tlbiB8fCAhcGFja0RldGFpbE1vZGFsIHx8IHBhY2tEZXRhaWxNb2RhbC5oaWRkZW4pIHJldHVybjsKICAgICAgcGFja0RldGFpbENhY2hlLnNldChTdHJpbmcoaWQpLCBkZXRhaWwpOwogICAgICByZW5kZXJQYWNrRGV0YWlscyhkZXRhaWwsIHRva2VuKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIGlmICh0b2tlbiAhPT0gcGFja0RldGFpbFJlcXVlc3RUb2tlbiB8fCAhcGFja0RldGFpbE1vZGFsIHx8IHBhY2tEZXRhaWxNb2RhbC5oaWRkZW4pIHJldHVybjsKICAgICAgcGFja0RldGFpbE1vZGFsQm9keS50ZXh0Q29udGVudCA9ICcnOwogICAgICB2YXIgZXJyb3IgPSBwYWNrRGV0YWlsRWxlbWVudCgnZGl2JywgJ3BoLXBhY2stZGV0YWlsLWVycm9yJyk7CiAgICAgIGVycm9yLmFwcGVuZENoaWxkKHBhY2tEZXRhaWxFbGVtZW50KCdkaXYnLCAncGgtcGFjay1kZXRhaWwtdGl0bGUnLCAnQ2jGsGEgdOG6o2kgxJHGsOG7o2MgY2hpIHRp4bq/dCBwYWNrJykpOwogICAgICBlcnJvci5hcHBlbmRDaGlsZChwYWNrRGV0YWlsRWxlbWVudCgncCcsICcnLCAoZXJyICYmIGVyci5tZXNzYWdlID8gZXJyLm1lc3NhZ2UgOiAnTOG7l2kga+G6v3QgbuG7kWkgQVBJJykgKyAnLicpKTsKICAgICAgdmFyIHJldHJ5ID0gcGFja0RldGFpbEVsZW1lbnQoJ2J1dHRvbicsICdwaC1wYWNrLWRldGFpbC1yZXRyeScsICdUaOG7rSB04bqjaSBs4bqhaScpOwogICAgICByZXRyeS50eXBlID0gJ2J1dHRvbic7CiAgICAgIHJldHJ5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsgb3BlblBhY2tEZXRhaWxzKHNldCwgc2VyaWVzTmFtZSk7IH0pOwogICAgICBlcnJvci5hcHBlbmRDaGlsZChyZXRyeSk7CiAgICAgIHBhY2tEZXRhaWxNb2RhbEJvZHkuYXBwZW5kQ2hpbGQoZXJyb3IpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJFeHBhbnNpb25zKGVudHJpZXMpewogICAgc3RhdGUuZXhwYW5zaW9ucyA9IGVudHJpZXMgfHwgW107CiAgICBlbHMuc3RhdHVzLmhpZGRlbiA9IHRydWU7CiAgICBlbHMuZ3JpZC50ZXh0Q29udGVudCA9ICcnOwogICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KXsKICAgICAgdmFyIHMgPSBlbnRyeS5zZXQ7CiAgICAgIHZhciBwYWlyID0gcGFsZXR0ZUZvcihzLmlkKSwgYzEgPSBwYWlyWzBdLCBjMiA9IHBhaXJbMV07CiAgICAgIHZhciBjYXJkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGNhcmQuY2xhc3NOYW1lID0gJ3BoLWV4cC1jYXJkJzsKICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZ3JvdXAnKTsKICAgICAgY2FyZC5kYXRhc2V0LnNldElkID0gU3RyaW5nKHMuaWQpOwogICAgICB2YXIgbWFpbkJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICBtYWluQnV0dG9uLnR5cGUgPSAnYnV0dG9uJzsKICAgICAgbWFpbkJ1dHRvbi5jbGFzc05hbWUgPSAncGgtZXhwLW1haW4nOwogICAgICBtYWluQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDaOG7jW4gYuG7mSAnICsgKHMubmFtZSB8fCAnJykgKyAnIMSR4buDIG3hu58gcGFjaycpOwoKICAgICAgdmFyIGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBhcnQuY2xhc3NOYW1lID0gJ3BoLWFydCc7CiAgICAgIGFydC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jMScsIGMxKTsKICAgICAgYXJ0LnN0eWxlLnNldFByb3BlcnR5KCctLWMyJywgYzIpOwoKICAgICAgdmFyIGJnU3JjID0gKHR5cGVvZiBzZXRCYWNrZ3JvdW5kVXJsID09PSAnZnVuY3Rpb24nKSA/IHNldEJhY2tncm91bmRVcmwocykgOiAnJzsKICAgICAgdmFyIGJnSW1nID0gbnVsbDsKCiAgICAgIHZhciBnbHlwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgZ2x5cGguY2xhc3NOYW1lID0gJ3BoLWFydC1nbHlwaCc7CiAgICAgIGdseXBoLnRleHRDb250ZW50ID0gKHMubmFtZSB8fCAnPycpLnNsaWNlKDAsMSk7CgogICAgICBpZiAoYmdTcmMpewogICAgICAgIC8vIETDuW5nIGPhuqMgPGltZz4gdGjhuq10IGzhuqtuIGJhY2tncm91bmQgQ1NTIMSR4buDIOG6o25oIGNo4bqvYyBjaOG6r24gxJHGsOG7o2MgcmVuZGVyLgogICAgICAgIGFydC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAnbGluZWFyLWdyYWRpZW50KDE4MGRlZyxyZ2JhKDgsMTAsMjQsLjA4KSAwJSxyZ2JhKDgsMTAsMjQsLjM0KSAxMDAlKSx1cmwoIicgKyBiZ1NyYyArICciKSc7CiAgICAgICAgYXJ0LnN0eWxlLmJhY2tncm91bmRTaXplID0gJ2NvdmVyJzsKICAgICAgICBhcnQuc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gJ2NlbnRlciAzOCUnOwogICAgICAgIGFydC5zdHlsZS5iYWNrZ3JvdW5kUmVwZWF0ID0gJ25vLXJlcGVhdCc7CgogICAgICAgIGJnSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgYmdJbWcuY2xhc3NOYW1lID0gJ3BoLWFydC1iZyc7CiAgICAgICAgYmdJbWcuYWx0ID0gJyc7CiAgICAgICAgYmdJbWcuZGVjb2RpbmcgPSAnYXN5bmMnOwogICAgICAgIGJnSW1nLmxvYWRpbmcgPSAnZWFnZXInOwogICAgICAgIGJnSW1nLnNyYyA9IGJnU3JjOwogICAgICAgIGJnSW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCl7IGdseXBoLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH07CiAgICAgICAgYmdJbWcub25lcnJvciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBpZiAoYmdJbWcucGFyZW50Tm9kZSkgYmdJbWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiZ0ltZyk7CiAgICAgICAgICBhcnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ2xpbmVhci1ncmFkaWVudCgxNTBkZWcsdmFyKC0tYzEpIDAlLHZhcigtLWMyKSAxMDAlKSc7CiAgICAgICAgICBnbHlwaC5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgfTsKICAgICAgICBhcnQuYXBwZW5kQ2hpbGQoYmdJbWcpOwogICAgICB9CgogICAgICBhcnQuYXBwZW5kQ2hpbGQoZ2x5cGgpOwoKICAgICAgdmFyIGxvZ29TcmMgPSBzZXRMb2dvVXJsKHMpOwogICAgICBpZiAobG9nb1NyYyl7CiAgICAgICAgdmFyIGxvZ28gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICBsb2dvLmNsYXNzTmFtZSA9ICdwaC1hcnQtbG9nbyc7CiAgICAgICAgbG9nby5sb2FkaW5nID0gJ2xhenknOwogICAgICAgIGxvZ28uYWx0ID0gcy5uYW1lIHx8ICcnOwogICAgICAgIGxvZ28uc3JjID0gbG9nb1NyYzsKICAgICAgICBsb2dvLm9ubG9hZCA9IGZ1bmN0aW9uKCl7IGdseXBoLmNsYXNzTGlzdC5hZGQoJ3BoLWFydC1nbHlwaC1oaWRkZW4nKTsgfTsKICAgICAgICBsb2dvLm9uZXJyb3IgPSBmdW5jdGlvbigpewogICAgICAgICAgaWYgKGxvZ28ucGFyZW50Tm9kZSkgbG9nby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGxvZ28pOwogICAgICAgIH07CiAgICAgICAgYXJ0LmFwcGVuZENoaWxkKGxvZ28pOwogICAgICB9CgogICAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBtZXRhLmNsYXNzTmFtZSA9ICdwaC1tZXRhJzsKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgbmFtZS5jbGFzc05hbWUgPSAncGgtbmFtZSc7CiAgICAgIG5hbWUudGV4dENvbnRlbnQgPSBzLm5hbWU7CiAgICAgIHZhciBzZXJpZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgc2VyaWVzLmNsYXNzTmFtZSA9ICdwaC1zZXJpZXMnOwogICAgICBzZXJpZXMudGV4dENvbnRlbnQgPSBlbnRyeS5zZXJpZXMgfHwgJyc7CiAgICAgIHZhciBjb3VudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBjb3VudC5jbGFzc05hbWUgPSAncGgtY291bnQnOwogICAgICBjb3VudC50ZXh0Q29udGVudCA9ICgocy5jYXJkQ291bnQgJiYgcy5jYXJkQ291bnQudG90YWwpIHx8ICc/JykgKyAnIGzDoSBiw6BpJzsKICAgICAgbWV0YS5hcHBlbmRDaGlsZChuYW1lKTsgbWV0YS5hcHBlbmRDaGlsZChzZXJpZXMpOyBtZXRhLmFwcGVuZENoaWxkKGNvdW50KTsKCiAgICAgIHZhciBwcm9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHByb2cuY2xhc3NOYW1lID0gJ3BoLWV4cC1wcm9ncmVzcyc7CiAgICAgIHZhciBwcm9nTWV0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBwcm9nTWV0YS5jbGFzc05hbWUgPSAncGgtZXhwLXByb2dyZXNzLW1ldGEnOwogICAgICB2YXIgaW5pdGlhbFRvdGFsID0gTnVtYmVyKHMgJiYgcy5jYXJkQ291bnQgJiYgcy5jYXJkQ291bnQudG90YWwpIHx8IDA7CiAgICAgIHByb2dNZXRhLnRleHRDb250ZW50ID0gJzAvJyArIGluaXRpYWxUb3RhbCArICcgbMOhIMK3IDAlJzsKICAgICAgdmFyIHByb2dUcmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgcHJvZ1RyYWNrLmNsYXNzTmFtZSA9ICdwaC1leHAtcHJvZ3Jlc3MtdHJhY2snOwogICAgICB2YXIgcHJvZ0ZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIHByb2dGaWxsLmNsYXNzTmFtZSA9ICdwaC1leHAtcHJvZ3Jlc3MtZmlsbCc7CiAgICAgIHByb2dUcmFjay5hcHBlbmRDaGlsZChwcm9nRmlsbCk7CiAgICAgIHByb2cuYXBwZW5kQ2hpbGQocHJvZ01ldGEpOwogICAgICBwcm9nLmFwcGVuZENoaWxkKHByb2dUcmFjayk7CiAgICAgIG1ldGEuYXBwZW5kQ2hpbGQocHJvZyk7CgogICAgICBtYWluQnV0dG9uLmFwcGVuZENoaWxkKGFydCk7IG1haW5CdXR0b24uYXBwZW5kQ2hpbGQobWV0YSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQobWFpbkJ1dHRvbik7CgogICAgICB2YXIgZGV0YWlsQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgIGRldGFpbEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7CiAgICAgIGRldGFpbEJ1dHRvbi5jbGFzc05hbWUgPSAncGgtcGFjay1kZXRhaWwtYnRuJzsKICAgICAgZGV0YWlsQnV0dG9uLmlubmVySFRNTCA9ICc8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+8J+UjTwvc3Bhbj48c3Bhbj5YZW0gY2hpIHRp4bq/dCBwYWNrPC9zcGFuPic7CiAgICAgIGRldGFpbEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnWGVtIHThuqV0IGPhuqMgdGjhursgdsOgIGPDoWMgbMOhIG7hu5VpIGLhuq10IHRyb25nIGLhu5kgJyArIChzLm5hbWUgfHwgJycpKTsKICAgICAgZGV0YWlsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgZnVuY3Rpb24oZSl7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IH0pOwogICAgICBkZXRhaWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpeyBlLnN0b3BQcm9wYWdhdGlvbigpOyB9KTsKICAgICAgZGV0YWlsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgb3BlblBhY2tEZXRhaWxzKHMsIGVudHJ5LnNlcmllcyk7CiAgICAgIH0pOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGRldGFpbEJ1dHRvbik7CgogICAgICB1cGRhdGVFeHBhbnNpb25Qcm9ncmVzc0NhcmQoY2FyZCwgcyk7CiAgICAgIG1haW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpeyBzZWxlY3RFeHBhbnNpb24ocywgYzEsIGMyKTsgfSk7CiAgICAgIGVscy5ncmlkLmFwcGVuZENoaWxkKGNhcmQpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3RFeHBhbnNpb24oc2V0LCBjMSwgYzIpewogICAgc3RhdGUuY3VycmVudCA9IHNldDsKICAgIHN0YXRlLnBvb2wgPSBbXTsKICAgIHN0YXRlLnRpZXJQb29scyA9IG51bGw7CiAgICBzdGF0ZS5jYWNoZS5jbGVhcigpOwogICAgc2V0QWNjZW50KGMxLCBjMik7CiAgICBhcHBseVBhY2tWaXN1YWwoc2V0LCBudWxsKTsKICAgIGVscy5waWNrLmNsYXNzTGlzdC5yZW1vdmUoJ3BoLWFjdGl2ZScpOwogICAgZWxzLm9wZW4uY2xhc3NMaXN0LmFkZCgncGgtYWN0aXZlJyk7CiAgICBzdGF0ZS5vcGVuU2Nyb2xsWSA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQod2luZG93LnBhZ2VZT2Zmc2V0IHx8IHdpbmRvdy5zY3JvbGxZIHx8IDApKTsKICAgIHJlc2V0U3RhZ2UoKTsKICAgIGVscy5lcnIuaGlkZGVuID0gdHJ1ZTsKICAgIGVscy5wYWNrLmNsYXNzTGlzdC5hZGQoJ3BoLWJ1c3knKTsKICAgIGVscy5ib3hSb3cuaGlkZGVuID0gdHJ1ZTsKICAgIGVscy5oaW50LnRleHRDb250ZW50ID0gJ8SQYW5nIHThuqNpIHRo4bq7IGLDoGkgY2hvIGLhu5kgbsOgeeKApic7CgogICAgZ2V0SlNPTihBUEkgKyAnL3NldHMvJyArIHNldC5pZCkudGhlbihmdW5jdGlvbihkYXRhKXsKICAgICAgLy8gTeG7mXQgc+G7kSBi4buZIHByb21vIGPhu6dhIFRDR2RleCAoxJFp4buDbiBow6xuaCBNRVApIGPDsyBjYXJkLmltYWdlID0gbnVsbCBkw7kKICAgICAgLy8gY2FyZCBJRCAvIGThu68gbGnhu4d1IGzDoSB24bqrbiB04buTbiB04bqhaS4gS2jDtG5nIMSRxrDhu6NjIGTDuW5nIGltYWdlIGzDoG0gxJFp4buBdSBraeG7h24KICAgICAgLy8gxJHhu4MgcXV54bq/dCDEkeG7i25oIGLhu5kgY8OzIG3hu58gxJHGsOG7o2MgaGF5IGtow7RuZy4g4bqibmggc+G6vSBmYWxsYmFjayBzYW5nIHTDqm4gbMOhIGtoaQogICAgICAvLyBDRE4gY2jGsGEgY8OzIHNjYW4uCiAgICAgIHN0YXRlLnBvb2wgPSBBcnJheS5pc0FycmF5KGRhdGEuY2FyZHMpID8gZGF0YS5jYXJkcy5maWx0ZXIoZnVuY3Rpb24oYyl7IHJldHVybiBjICYmIGMuaWQ7IH0pIDogW107CiAgICAgIGlmICghc3RhdGUucG9vbC5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQVBJIGtow7RuZyB0cuG6oyB24buBIGzDoSBiw6BpIGNobyBi4buZIG7DoHknKTsKICAgICAgYXBwbHlQYWNrVmlzdWFsKHNldCwgZGF0YSk7CiAgICAgIGVscy5wYWNrLmNsYXNzTGlzdC5yZW1vdmUoJ3BoLWJ1c3knKTsKICAgICAgZWxzLmhpbnQudGV4dENvbnRlbnQgPSAnQ2jhuqFtIHbDoG8gZ8OzaSBiw6BpIMSR4buDIG3hu58nOwogICAgICBlbHMuYm94Um93LmhpZGRlbiA9IGZhbHNlOwogICAgICB1cGRhdGVDdXJyZW50U2V0UHJvZ3Jlc3MoKTsKICAgICAgLy8gROG7sW5nIHThu4kgbOG7hyByw7p0IHRoZW8gxJHhu5kgaGnhur9tIGNobyBi4buZIG7DoHkg4bufIG7hu4FuIOKAlCBraMO0bmcgY2jhurduIG7DunQgbeG7nwogICAgICAvLyBnw7NpOiBu4bq/dSBjaMawYSB4b25nIGhv4bq3YyB0aOG6pXQgYuG6oWksIG3hu58gZ8OzaSB24bqrbiBkw7luZyBraeG7g3UgcsO6dCDEkeG7gXUgY8WpLgogICAgICBidWlsZFRpZXJQb29scyhzZXQuaWQsIHN0YXRlLnBvb2wubWFwKGZ1bmN0aW9uKGMpeyByZXR1cm4gYy5pZDsgfSkpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXsKICAgICAgZWxzLnBhY2suY2xhc3NMaXN0LnJlbW92ZSgncGgtYnVzeScpOwogICAgICBlbHMuaGludC50ZXh0Q29udGVudCA9ICcnOwogICAgICBlbHMuZXJyLnRleHRDb250ZW50ID0gJ0tow7RuZyB0aOG7gyB04bqjaSB0aOG6uyBiw6BpIGNobyBi4buZIG7DoHkgKCcgKyBlcnIubWVzc2FnZSArICcpLiBIw6N5IGNo4buNbiBi4buZIGtow6FjIGhv4bq3YyB04bqjaSBs4bqhaSB0cmFuZy4nOwogICAgICBlbHMuZXJyLmhpZGRlbiA9IGZhbHNlOwogICAgfSk7CiAgfQoKICBlbHMuYmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICBlbHMub3Blbi5jbGFzc0xpc3QucmVtb3ZlKCdwaC1hY3RpdmUnKTsKICAgIGVscy5waWNrLmNsYXNzTGlzdC5hZGQoJ3BoLWFjdGl2ZScpOwogIH0pOwogIGVscy5jaGFuZ2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpeyBlbHMuYmFjay5jbGljaygpOyB9KTsKICBlbHMuYm94Q2hhbmdlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsgZWxzLmJhY2suY2xpY2soKTsgfSk7CgogIC8vIEdp4buvIHbhu4sgdHLDrSB0aGFvIHTDoWMg4buVbiDEkeG7i25oIHRyw6puIFBDOiBzYXUga2hpIGvhur90IHF14bqjIDMvNS8xMCBnw7NpIGTDoGkgxJHGsOG7o2Mg4bqpbiwKICAvLyB0cmFuZyBjw7MgdGjhu4MgY28gbOG6oWkgdsOgIGJyb3dzZXIgdOG7sSBhbmNob3IgdsOgbyBt4buZdCB24buLIHRyw60ga2jDoWMuIEx1w7RuIMSRxrBhIHbDuW5nIHBhY2sKICAvLyB24buBIMSRw7puZyBt4buZdCBt4buRYyBj4buRIMSR4buLbmggxJHhu4MgbsO6dCAiTeG7nyBnw7NpIiBsdcO0biBu4bqxbSDhu58gY8O5bmcga2h1IHbhu7FjIG3DoG4gaMOsbmguCiAgZnVuY3Rpb24gc2Nyb2xsVG9PcGVuQW5jaG9yKGJlaGF2aW9yKXsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpewogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsKICAgICAgICBpZiAoIWVscy5zdGFnZSB8fCBlbHMub3Blbi5jbGFzc0xpc3QuY29udGFpbnMoJ3BoLWFjdGl2ZScpID09PSBmYWxzZSkgcmV0dXJuOwogICAgICAgIHZhciB0b3A7CiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShOdW1iZXIoc3RhdGUub3BlblNjcm9sbFkpKSkgdG9wID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChOdW1iZXIoc3RhdGUub3BlblNjcm9sbFkpKSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgcmVjdCA9IGVscy5zdGFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIHRvcCA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQod2luZG93LnBhZ2VZT2Zmc2V0ICsgcmVjdC50b3AgLSAyOCkpOwogICAgICAgIH0KICAgICAgICB0cnl7IHdpbmRvdy5zY3JvbGxUbyh7dG9wOnRvcCwgYmVoYXZpb3I6YmVoYXZpb3IgfHwgJ2F1dG8nfSk7IH0KICAgICAgICBjYXRjaChlKXsgd2luZG93LnNjcm9sbFRvKDAsIHRvcCk7IH0KICAgICAgfSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0U3RhZ2UoKXsKICAgIHN0YXRlLm9wZW5pbmcgPSBmYWxzZTsKICAgIGVscy5zdGFnZS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgZWxzLnByb2dyZXNzLmhpZGRlbiA9IHRydWU7CiAgICBlbHMuYm94LmNsYXNzTGlzdC5yZW1vdmUoJ3BoLWFjdGl2ZScpOwogICAgZWxzLnJldmVhbC5jbGFzc0xpc3QucmVtb3ZlKCdwaC1hY3RpdmUnLCdwaC1leHRyYWN0LXNvdXJjZScpOwogICAgZWxzLnBhY2suY2xhc3NMaXN0LnJlbW92ZSgncGgtcmlwcGluZycpOwogICAgZWxzLmhpbnQudGV4dENvbnRlbnQgPSAnQ2jhuqFtIHbDoG8gZ8OzaSBiw6BpIMSR4buDIG3hu58nOwogICAgZWxzLmJveFJvdy5oaWRkZW4gPSAhc3RhdGUucG9vbC5sZW5ndGg7CiAgICBlbHMuYmFubmVyLmNsYXNzTmFtZSA9ICdwaC1iYW5uZXInOwogICAgZWxzLmJhbm5lci50ZXh0Q29udGVudCA9ICcnOwogICAgZWxzLmx1Y2suaGlkZGVuID0gdHJ1ZTsKICAgIGVscy50b3RhbC5oaWRkZW4gPSB0cnVlOwogICAgZWxzLnNhdmVkLnRleHRDb250ZW50ID0gJyc7CiAgICBlbHMucXVpcC50ZXh0Q29udGVudCA9ICcnOwogICAgZWxzLnF1aXAuY2xhc3NOYW1lID0gJ3BoLXF1aXAnOwogICAgZWxzLnJvdy50ZXh0Q29udGVudCA9ICcnOwogICAgY2xlYXJDb25mZXR0aSgpOwogICAgY2xvc2VDYXJkTW9kYWwoKTsKICAgIHVwZGF0ZUN1cnJlbnRTZXRQcm9ncmVzcygpOwogICAgc2Nyb2xsVG9PcGVuQW5jaG9yKCdhdXRvJyk7CiAgfQoKICBmdW5jdGlvbiBwaWNrUmFuZG9tKGEpeyByZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXTsgfQoKICBmdW5jdGlvbiBmdWxsQ2FyZChpZCl7CiAgICBpZiAoc3RhdGUuY2FjaGUuaGFzKGlkKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdGF0ZS5jYWNoZS5nZXQoaWQpKTsKICAgIHJldHVybiBnZXRKU09OKEFQSSArICcvY2FyZHMvJyArIGlkKS50aGVuKGZ1bmN0aW9uKGMpewogICAgICBzdGF0ZS5jYWNoZS5zZXQoaWQsIGMpOwogICAgICByZXR1cm4gYzsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcGhTaG9wTG9hZChkKXsKICAgIGlmICghZC5jaGFsbGVuZ2VJbnZlbnRvcnkgfHwgdHlwZW9mIGQuY2hhbGxlbmdlSW52ZW50b3J5ICE9PSAnb2JqZWN0JykgZC5jaGFsbGVuZ2VJbnZlbnRvcnkgPSB7fTsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKE51bWJlcihkLmNoYWxsZW5nZUludmVudG9yeS5sdWNreSkpKSBkLmNoYWxsZW5nZUludmVudG9yeS5sdWNreSA9IDA7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShOdW1iZXIoZC5jaGFsbGVuZ2VJbnZlbnRvcnkucmFyZSkpKSBkLmNoYWxsZW5nZUludmVudG9yeS5yYXJlID0gMDsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKE51bWJlcihkLmNoYWxsZW5nZUludmVudG9yeS5jcm93bikpKSBkLmNoYWxsZW5nZUludmVudG9yeS5jcm93biA9IDA7CiAgICByZXR1cm4gZC5jaGFsbGVuZ2VJbnZlbnRvcnk7CiAgfQoKICBmdW5jdGlvbiBwaFNob3BUYWtlQm9vc3QoKXsKICAgIHZhciBkID0gbG9hZERCKCksIGludiA9IHBoU2hvcExvYWQoZCk7CiAgICB2YXIgYm9vc3QgPSB7IGx1Y2t5OmZhbHNlLCByYXJlOmZhbHNlLCBjcm93bjpmYWxzZSB9OwogICAgaWYgKGludi5jcm93biA+IDApeyBpbnYuY3Jvd24tLTsgYm9vc3QuY3Jvd24gPSB0cnVlOyB9CiAgICBpZiAoaW52LnJhcmUgPiAwKXsgaW52LnJhcmUtLTsgYm9vc3QucmFyZSA9IHRydWU7IH0KICAgIGlmIChpbnYubHVja3kgPiAwKXsgaW52Lmx1Y2t5LS07IGJvb3N0Lmx1Y2t5ID0gdHJ1ZTsgfQogICAgc2F2ZURCKCk7CiAgICByZXR1cm4gYm9vc3Q7CiAgfQoKICBmdW5jdGlvbiBwaFNob3BSZWZ1bmRCb29zdChib29zdCl7CiAgICBpZiAoIWJvb3N0KSByZXR1cm47CiAgICB2YXIgZCA9IGxvYWREQigpLCBpbnYgPSBwaFNob3BMb2FkKGQpOwogICAgaWYgKGJvb3N0Lmx1Y2t5KSBpbnYubHVja3krKzsKICAgIGlmIChib29zdC5yYXJlKSBpbnYucmFyZSsrOwogICAgaWYgKGJvb3N0LmNyb3duKSBpbnYuY3Jvd24rKzsKICAgIHNhdmVEQigpOwogIH0KCiAgZnVuY3Rpb24gcmVjb3JkU2hvcENhcmQoY2FyZCl7CiAgICBpZiAoIWNhcmQgfHwgIWNhcmQuaWQpIHJldHVybiBmYWxzZTsKICAgIHZhciBkID0gbG9hZERCKCk7CiAgICB2YXIgdXNkID0gcHJpY2VVU0QoY2FyZCk7CiAgICB2YXIgZSA9IGQuY2FyZHNbY2FyZC5pZF07CiAgICB2YXIgc2V0SWQgPSAoY2FyZC5zZXQgJiYgY2FyZC5zZXQuaWQpIHx8IChzdGF0ZS5jdXJyZW50ICYmIHN0YXRlLmN1cnJlbnQuaWQpIHx8ICcnOwogICAgdmFyIHNldE5hbWUgPSAoY2FyZC5zZXQgJiYgY2FyZC5zZXQubmFtZSkgfHwgKHN0YXRlLmN1cnJlbnQgJiYgc3RhdGUuY3VycmVudC5uYW1lKSB8fCAnJzsKICAgIHZhciBsb2NhbElkID0gY2FyZC5sb2NhbElkICE9IG51bGwgPyBTdHJpbmcoY2FyZC5sb2NhbElkKSA6ICcnOwoKICAgIGlmIChlKXsKICAgICAgZS5uID0gTWF0aC5tYXgoMCwgTnVtYmVyKGUubikgfHwgMCkgKyAxOwogICAgICBpZiAodXNkICE9IG51bGwpIGUucHJpY2UgPSB1c2Q7CiAgICAgIGlmIChzZXRJZCAmJiAhZS5zZXRJZCkgZS5zZXRJZCA9IHNldElkOwogICAgICBpZiAoc2V0TmFtZSAmJiAhZS5zZXQpIGUuc2V0ID0gc2V0TmFtZTsKICAgICAgaWYgKGxvY2FsSWQgJiYgIWUubG9jYWxJZCkgZS5sb2NhbElkID0gbG9jYWxJZDsKICAgICAgaWYgKGNhcmQuaW1hZ2UgJiYgIWUuaW1nKSBlLmltZyA9IGNhcmQuaW1hZ2U7CiAgICAgIGlmIChjYXJkLnJhcml0eSAmJiAhZS5yYXJpdHkpIGUucmFyaXR5ID0gY2FyZC5yYXJpdHk7CiAgICAgIGlmIChlLnRpZXIgPT0gbnVsbCkgZS50aWVyID0gcmFyaXR5VGllcihjYXJkLnJhcml0eSkudGllcjsKICAgICAgZS5uZXdGcm9tU2hvcCA9IHRydWU7CiAgICAgIGUubGFzdFNob3BSZWRlZW1lZEF0ID0gRGF0ZS5ub3coKTsKICAgIH0gZWxzZSB7CiAgICAgIGQuY2FyZHNbY2FyZC5pZF0gPSB7CiAgICAgICAgaWQ6IGNhcmQuaWQsCiAgICAgICAgbmFtZTogY2FyZC5uYW1lIHx8ICcnLAogICAgICAgIGltZzogY2FyZC5pbWFnZSB8fCAnJywKICAgICAgICByYXJpdHk6IGNhcmQucmFyaXR5IHx8ICcnLAogICAgICAgIHRpZXI6IHJhcml0eVRpZXIoY2FyZC5yYXJpdHkpLnRpZXIsCiAgICAgICAgcHJpY2U6IHVzZCwKICAgICAgICBuOiAxLAogICAgICAgIHNldDogc2V0TmFtZSwKICAgICAgICBzZXRJZDogc2V0SWQsCiAgICAgICAgbG9jYWxJZDogbG9jYWxJZCwKICAgICAgICB0OiBEYXRlLm5vdygpLAogICAgICAgIG5ld0Zyb21TaG9wOiB0cnVlLAogICAgICAgIGxhc3RTaG9wUmVkZWVtZWRBdDogRGF0ZS5ub3coKQogICAgICB9OwogICAgfQoKICAgIHNhdmVEQigpOwogICAgdXBkYXRlQ29sQmFkZ2UoKTsKICAgIHVwZGF0ZUN1cnJlbnRTZXRQcm9ncmVzcygpOwogICAgaWYgKHN0YXRlLmV4cGFuc2lvbnMgJiYgc3RhdGUuZXhwYW5zaW9ucy5sZW5ndGgpewogICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVscy5ncmlkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5waC1leHAtY2FyZCcpLCBmdW5jdGlvbihjYXJkRWwpewogICAgICAgIHZhciBpZCA9IGNhcmRFbC5kYXRhc2V0LnNldElkOwogICAgICAgIGlmICghaWQpIHJldHVybjsKICAgICAgICB2YXIgZm91bmQgPSBzdGF0ZS5leHBhbnNpb25zLmZpbmQoZnVuY3Rpb24oeCl7IHJldHVybiB4LnNldCAmJiBTdHJpbmcoeC5zZXQuaWQpID09PSBTdHJpbmcoaWQpOyB9KTsKICAgICAgICBpZiAoZm91bmQpIHVwZGF0ZUV4cGFuc2lvblByb2dyZXNzQ2FyZChjYXJkRWwsIGZvdW5kLnNldCk7CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBwaFNob3BCdXlDYXJkKGNvc3QsIGxhYmVsKXsKICAgIHZhciBkID0gbG9hZERCKCk7CiAgICBwaFNob3BMb2FkKGQpOwogICAgdmFyIHBvaW50cyA9IE1hdGgubWF4KDAsIE51bWJlcihkLmNoYWxsZW5nZVBvaW50cykgfHwgMCk7CiAgICBpZiAocG9pbnRzIDwgY29zdCl7CiAgICAgIHRvYXN0KCfirZAgS2jDtG5nIMSR4bunIMSRaeG7g20gxJHhu4MgxJHhu5VpICcgKyBsYWJlbCArICcuJyk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghc3RhdGUucG9vbCB8fCAhc3RhdGUucG9vbC5sZW5ndGgpewogICAgICB0b2FzdCgn4pqg77iPIEjDo3kgY2jhu41uIG3hu5l0IGLhu5kgdGjhursgdHLGsOG7m2Mga2hpIMSR4buVaSB0aOG6uy4nKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBjYXJkSWQ7CiAgICB0cnl7CiAgICAgIGNhcmRJZCA9IHBpY2tDYXJkSWQoe30pOwogICAgfWNhdGNoKGUpewogICAgICB0b2FzdCgn4pqg77iPIENoxrBhIHRo4buDIGNo4buNbiB0aOG6uyDEkeG7gyDEkeG7lWkuIFZ1aSBsw7JuZyB0aOG7rSBs4bqhaS4nKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiBmdWxsQ2FyZChjYXJkSWQpLnRoZW4oZnVuY3Rpb24oY2FyZCl7CiAgICAgIGlmICghY2FyZCB8fCAhY2FyZC5pZCkgdGhyb3cgbmV3IEVycm9yKCdLaMO0bmcgbOG6pXkgxJHGsOG7o2MgZOG7ryBsaeG7h3UgbMOhIGLDoGknKTsKICAgICAgdmFyIGxhdGVzdCA9IGxvYWREQigpOwogICAgICB2YXIgbGF0ZXN0UG9pbnRzID0gTWF0aC5tYXgoMCwgTnVtYmVyKGxhdGVzdC5jaGFsbGVuZ2VQb2ludHMpIHx8IDApOwogICAgICBwaFNob3BMb2FkKGxhdGVzdCk7CiAgICAgIGlmIChsYXRlc3RQb2ludHMgPCBjb3N0KXsKICAgICAgICB0b2FzdCgn4q2QIEtow7RuZyDEkeG7pyDEkWnhu4NtIMSR4buDIMSR4buVaSAnICsgbGFiZWwgKyAnLicpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBsYXRlc3QuY2hhbGxlbmdlUG9pbnRzID0gbGF0ZXN0UG9pbnRzIC0gY29zdDsKICAgICAgc2F2ZURCKCk7CiAgICAgIHJlY29yZFNob3BDYXJkKGNhcmQpOwogICAgICB1cGRhdGVDaGFsbGVuZ2VCYWRnZSgpOwogICAgICB1cGRhdGVTaG9wQmFkZ2UoKTsKICAgICAgaWYgKGVscy5zaG9wTW9kYWwgJiYgIWVscy5zaG9wTW9kYWwuaGlkZGVuKSByZW5kZXJFeHRlcm5hbFNob3AoKTsKICAgICAgaWYgKGVscy5jb2xNb2RhbCAmJiAhZWxzLmNvbE1vZGFsLmhpZGRlbikgcmVuZGVyQ29sbGVjdGlvbigpOwogICAgICB0b2FzdCgn8J+OtCDEkMOjIMSR4buVaSAnICsgKGNhcmQubmFtZSB8fCBsYWJlbCkgKyAnLiBUaOG6uyDEkcOjIHbDoG8gQuG7mSBzxrB1IHThuq1wIHbDoCDEkcaw4bujYyDEkcOhbmggZOG6pXUgTeG7m2kuJyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKXsKICAgICAgdG9hc3QoJ+KaoO+4jyDEkOG7lWkgdGjhursgdGjhuqV0IGLhuqFpLiDEkGnhu4NtIGPhu6dhIGLhuqFuIGtow7RuZyBi4buLIHRy4burLicpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHBoU2hvcEJ1eShrZXksIGNvc3QsIGxhYmVsKXsKICAgIHZhciBkID0gbG9hZERCKCk7CiAgICBwaFNob3BMb2FkKGQpOwogICAgdmFyIHBvaW50cyA9IE1hdGgubWF4KDAsIE51bWJlcihkLmNoYWxsZW5nZVBvaW50cykgfHwgMCk7CiAgICBpZiAocG9pbnRzIDwgY29zdCl7IHRvYXN0KCfirZAgS2jDtG5nIMSR4bunIMSRaeG7g20gxJHhu4MgxJHhu5VpICcgKyBsYWJlbCArICcuJyk7IHJldHVybiBmYWxzZTsgfQogICAgZC5jaGFsbGVuZ2VQb2ludHMgPSBwb2ludHMgLSBjb3N0OwogICAgZC5jaGFsbGVuZ2VJbnZlbnRvcnlba2V5XSsrOwogICAgc2F2ZURCKCk7CiAgICB0b2FzdCgn8J+OgSDEkMOjIMSR4buVaSAnICsgbGFiZWwgKyAnIHbDoCB0aMOqbSB2w6BvIEtobyEnKTsKICAgIHJlbmRlckNoYWxsZW5nZXMoKTsKICAgIHVwZGF0ZVNob3BCYWRnZSgpOwogICAgaWYgKGVscy5zaG9wTW9kYWwgJiYgIWVscy5zaG9wTW9kYWwuaGlkZGVuKSByZW5kZXJFeHRlcm5hbFNob3AoKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gZHJhd09uZShib29zdCl7IHJldHVybiBmdWxsQ2FyZChwaWNrQ2FyZElkKGJvb3N0KSk7IH0KCiAgLy8gLS0tLS0tLS0tLSBt4bufIDEgZ8OzaSAtLS0tLS0tLS0tCiAgZnVuY3Rpb24gb3BlblBhY2soKXsKICAgIGlmIChzdGF0ZS5vcGVuaW5nIHx8ICFzdGF0ZS5wb29sLmxlbmd0aCkgcmV0dXJuOwogICAgc3RhdGUub3BlbmluZyA9IHRydWU7CiAgICBzdGF0ZS5vcGVuU2Nyb2xsWSA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQod2luZG93LnBhZ2VZT2Zmc2V0IHx8IHdpbmRvdy5zY3JvbGxZIHx8IDApKTsKICAgIHZhciBzaG9wQm9vc3QgPSBwaFNob3BUYWtlQm9vc3QoKTsKICAgIGVuc3VyZUF1ZGlvKCk7CiAgICBlbHMuZXJyLmhpZGRlbiA9IHRydWU7CiAgICBlbHMuaGludC50ZXh0Q29udGVudCA9ICcnOwogICAgZWxzLmJveFJvdy5oaWRkZW4gPSB0cnVlOwogICAgZWxzLnBhY2suY2xhc3NMaXN0LmFkZCgncGgtcmlwcGluZycpOwogICAgZWxzLmZsYXNoLmNsYXNzTGlzdC5yZW1vdmUoJ3BoLWdvJyk7CiAgICB2b2lkIGVscy5mbGFzaC5vZmZzZXRXaWR0aDsKICAgIGVscy5mbGFzaC5jbGFzc0xpc3QuYWRkKCdwaC1nbycpOwogICAgcGxheVJpcCgpOwoKICAgIHZhciBqb2JzID0gW107CiAgICB2YXIgZ3VhcmFudGVlZCA9IHNob3BCb29zdC5jcm93biA/IHBpY2tHdWFyYW50ZWVkSGlnaElkKCkgOiBudWxsOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjsgaSsrKSBqb2JzLnB1c2goZnVsbENhcmQoaSA9PT0gMCAmJiBndWFyYW50ZWVkID8gZ3VhcmFudGVlZCA6IHBpY2tDYXJkSWQoc2hvcEJvb3N0KSkpOwoKICAgIFByb21pc2UuYWxsKGpvYnMpLnRoZW4oZnVuY3Rpb24oYWxsKXsKICAgICAgdmFyIGNhcmRzID0gYWxsLnNsaWNlKDAsNSk7CiAgICAgIHZhciBleHRyYXMgPSBhbGwuc2xpY2UoNSk7CiAgICAgIHZhciBsYXN0ID0gY2FyZHNbNF07CiAgICAgIGV4dHJhcy5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICAgIGlmIChyYXJpdHlUaWVyKGMucmFyaXR5KS50aWVyID4gcmFyaXR5VGllcihsYXN0LnJhcml0eSkudGllcikgbGFzdCA9IGM7CiAgICAgIH0pOwogICAgICBjYXJkc1s0XSA9IGxhc3Q7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICBlbHMuc3RhZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICByZW5kZXJSZXZlYWwoY2FyZHMpOwogICAgICAgIHNjcm9sbFRvT3BlbkFuY2hvcignYXV0bycpOwogICAgICB9LCA0ODApOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXsKICAgICAgcGhTaG9wUmVmdW5kQm9vc3Qoc2hvcEJvb3N0KTsKICAgICAgc3RhdGUub3BlbmluZyA9IGZhbHNlOwogICAgICBlbHMucGFjay5jbGFzc0xpc3QucmVtb3ZlKCdwaC1yaXBwaW5nJyk7CiAgICAgIGVscy5oaW50LnRleHRDb250ZW50ID0gJ0No4bqhbSB2w6BvIGfDs2kgYsOgaSDEkeG7gyBt4bufJzsKICAgICAgZWxzLmJveFJvdy5oaWRkZW4gPSBmYWxzZTsKICAgICAgZWxzLmVyci50ZXh0Q29udGVudCA9ICdN4bufIGfDs2kgYsOgaSB0aOG6pXQgYuG6oWkgKCcgKyBlcnIubWVzc2FnZSArICcpLiBWdWkgbMOybmcgdGjhu60gbOG6oWkuJzsKICAgICAgZWxzLmVyci5oaWRkZW4gPSBmYWxzZTsKICAgIH0pOwogIH0KCiAgZWxzLnBhY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuUGFjayk7CiAgZWxzLnBhY2suYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpewogICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnICcpeyBlLnByZXZlbnREZWZhdWx0KCk7IG9wZW5QYWNrKCk7IH0KICB9KTsKCiAgZnVuY3Rpb24gcmVuZGVyUmV2ZWFsKGNhcmRzKXsKICAgIGVscy5yZXZlYWwuY2xhc3NMaXN0LmFkZCgncGgtYWN0aXZlJywncGgtZXh0cmFjdC1zb3VyY2UnKTsKICAgIGVscy5yb3cudGV4dENvbnRlbnQgPSAnJzsKICAgIGVscy5iYW5uZXIuY2xhc3NOYW1lID0gJ3BoLWJhbm5lcic7CiAgICBlbHMuYmFubmVyLnRleHRDb250ZW50ID0gJyc7CiAgICBlbHMubHVjay5oaWRkZW4gPSB0cnVlOwogICAgZWxzLnRvdGFsLmhpZGRlbiA9IHRydWU7CiAgICBlbHMucXVpcC50ZXh0Q29udGVudCA9ICcnOwogICAgZWxzLnF1aXAuY2xhc3NOYW1lID0gJ3BoLXF1aXAnOwogICAgZWxzLnNhdmVkLnRleHRDb250ZW50ID0gJyc7CiAgICBjbGVhckNvbmZldHRpKCk7CgogICAgdmFyIGJlZm9yZURCID0gbG9hZERCKCk7CiAgICB2YXIgbm92ZWx0eUJ5SWQgPSB7fTsKICAgIGNhcmRzLmZvckVhY2goZnVuY3Rpb24oY2FyZCl7CiAgICAgIGlmICghY2FyZCB8fCAhY2FyZC5pZCB8fCBub3ZlbHR5QnlJZFtjYXJkLmlkXSkgcmV0dXJuOwogICAgICBub3ZlbHR5QnlJZFtjYXJkLmlkXSA9IG5vdmVsdHlMYWJlbChjYXJkLCBiZWZvcmVEQik7CiAgICB9KTsKCiAgICB2YXIgbWF4VGllciA9IDA7CgogICAgY2FyZHMuZm9yRWFjaChmdW5jdGlvbihjYXJkLCBpKXsKICAgICAgdmFyIGluZm8gPSByYXJpdHlUaWVyKGNhcmQucmFyaXR5KTsKICAgICAgaWYgKGluZm8udGllciA+IG1heFRpZXIpIG1heFRpZXIgPSBpbmZvLnRpZXI7CgogICAgICB2YXIgY29sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGNvbC5jbGFzc05hbWUgPSAncGgtY2FyZC1jb2wgcGgtZXh0cmFjdGluZyc7CiAgICAgIGNvbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1waC1leHRyYWN0LWRlbGF5JywgKGkgKiA5NSkgKyAnbXMnKTsKICAgICAgdmFyIHNsb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgc2xvdC5jbGFzc05hbWUgPSAncGgtc2xvdCc7CiAgICAgIHNsb3QuZGF0YXNldC50aWVyID0gU3RyaW5nKGluZm8udGllcik7CgogICAgICB2YXIgaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaW5uZXIuY2xhc3NOYW1lID0gJ3BoLWlubmVyJzsKICAgICAgdmFyIGJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgYmFjay5jbGFzc05hbWUgPSAncGgtZmFjZSBwaC1iYWNrLWZhY2UnOyBiYWNrLnRleHRDb250ZW50ID0gJz8nOwogICAgICB2YXIgZnJvbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZnJvbnQuY2xhc3NOYW1lID0gJ3BoLWZhY2UgcGgtZnJvbnQtZmFjZSc7CiAgICAgIGlmIChjYXJkLmltYWdlKXsKICAgICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgaW1nLmxvYWRpbmcgPSAnbGF6eSc7CiAgICAgICAgaW1nLmFsdCA9IGNhcmQubmFtZSB8fCAnJzsKICAgICAgICBpbWcuc3JjID0gY2FyZC5pbWFnZSArICcvJyArIFFVQUxJVFk7CiAgICAgICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbigpewogICAgICAgICAgaW1nLnJlbW92ZSgpOwogICAgICAgICAgaWYgKCFmcm9udC5xdWVyeVNlbGVjdG9yKCcucGgtaW1hZ2UtZmFsbGJhY2snKSl7CiAgICAgICAgICAgIHZhciBmYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgZmIuY2xhc3NOYW1lID0gJ3BoLWltYWdlLWZhbGxiYWNrJzsKICAgICAgICAgICAgZmIudGV4dENvbnRlbnQgPSBjYXJkLm5hbWUgfHwgJz8nOwogICAgICAgICAgICBmcm9udC5hcHBlbmRDaGlsZChmYik7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmcm9udC5hcHBlbmRDaGlsZChpbWcpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBmYjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgZmIwLmNsYXNzTmFtZSA9ICdwaC1pbWFnZS1mYWxsYmFjayc7CiAgICAgICAgZmIwLnRleHRDb250ZW50ID0gY2FyZC5uYW1lIHx8ICc/JzsKICAgICAgICBmcm9udC5hcHBlbmRDaGlsZChmYjApOwogICAgICB9CiAgICAgIGlubmVyLmFwcGVuZENoaWxkKGJhY2spOyBpbm5lci5hcHBlbmRDaGlsZChmcm9udCk7CiAgICAgIHNsb3QuYXBwZW5kQ2hpbGQoaW5uZXIpOwoKICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdwaC1jYXJkLWxhYmVsJzsKCiAgICAgIGNvbC5hcHBlbmRDaGlsZChzbG90KTsgY29sLmFwcGVuZENoaWxkKGxhYmVsKTsKICAgICAgZWxzLnJvdy5hcHBlbmRDaGlsZChjb2wpOwoKICAgICAgdmFyIHVzZCA9IHByaWNlVVNEKGNhcmQsIHN0YXRlLmN1cnJlbnQpOwogICAgICB2YXIgcmV2ZWFsU3RhcnRlZCA9IGZhbHNlOwogICAgICB2YXIgaXNMYXN0ID0gaSA9PT0gY2FyZHMubGVuZ3RoIC0gMTsKCiAgICAgIGZ1bmN0aW9uIHJldmVhbCgpewogICAgICAgIGlmIChzbG90LmNsYXNzTGlzdC5jb250YWlucygncGgtZmxpcHBlZCcpKXsKICAgICAgICAgIG9wZW5DYXJkTW9kYWwoY2FyZCwgaW5mbywgdXNkKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHJldmVhbFN0YXJ0ZWQpIHJldHVybjsKICAgICAgICByZXZlYWxTdGFydGVkID0gdHJ1ZTsKICAgICAgICBwaFByZXBhcmVSZXZlYWwoc2xvdCwgaW5mby50aWVyLCBpc0xhc3QpOwogICAgICAgIHZhciBkZWxheSA9IHBoUmV2ZWFsRGVsYXkoaW5mby50aWVyLCBpc0xhc3QpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgIHBoQ2xlYXJSZXZlYWxGeChzbG90KTsKICAgICAgICAgIHNsb3QuY2xhc3NMaXN0LmFkZCgncGgtZmxpcHBlZCcpOwogICAgICAgICAgc2xvdC50aXRsZSA9ICdC4bqlbSDEkeG7gyB4ZW0gY2hpIHRp4bq/dCBsw6EgYsOgaSc7CiAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICB2YXIgbm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgbm0udGV4dENvbnRlbnQgPSBjYXJkLm5hbWUgKyAnIFx1MDBiNyAnICsgaW5mby5sYWJlbCArICcgXHUwMGI3ICc7CiAgICAgICAgdmFyIHByID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIHByLmNsYXNzTmFtZSA9IHVzZCAhPSBudWxsID8gJ3BoLWNhcmQtcHJpY2UnIDogJ3BoLWNhcmQtcHJpY2UgcGgtY2FyZC1ub3ByaWNlJzsKICAgICAgICBwci50ZXh0Q29udGVudCA9IHVzZCAhPSBudWxsID8gbW9uZXkodXNkKSA6ICdcdTIwMTQnOwogICAgICAgIGxhYmVsLmFwcGVuZENoaWxkKG5tKTsgbGFiZWwuYXBwZW5kQ2hpbGQocHIpOwogICAgICAgIHBsYXlGbGlwKGluZm8udGllcik7CiAgICAgICAgICBhZGROb3ZlbHR5QmFkZ2UoZnJvbnQsIG5vdmVsdHlCeUlkW2NhcmQuaWRdKTsKICAgICAgICAgIGlmIChpbmZvLnRpZXIgPj0gNSl7CiAgICAgICAgICAgIGVscy5mbGFzaC5jbGFzc0xpc3QucmVtb3ZlKCdwaC1nbycpOwogICAgICAgICAgICB2b2lkIGVscy5mbGFzaC5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgZWxzLmZsYXNoLmNsYXNzTGlzdC5hZGQoJ3BoLWdvJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW5mby50aWVyID49IDQpIGNvbmZBdEVsZW1lbnQoc2xvdCwgaW5mby50aWVyKTsKICAgICAgICB9LCBkZWxheSk7CiAgICAgIH0KCiAgICAgIHNsb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXZlYWwpOwogICAgICBzZXRUaW1lb3V0KHJldmVhbCwgMzUwICsgaSAqIDI2MCk7CiAgICB9KTsKCiAgICAvLyBsdXUgdmFvIGJvIHN1dSB0YXAgbmdheSBraGkgbW8KICAgIHJlY29yZFBhY2tzKGNhcmRzLCAxKTsKICAgIHN0YXRlLmxhc3RSZXN1bHQgPSB7IGNhcmRzOiBjYXJkcywgcGFja3M6IDEgfTsKCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgIGVscy5yZXZlYWwuY2xhc3NMaXN0LnJlbW92ZSgncGgtZXh0cmFjdC1zb3VyY2UnKTsKICAgICAgc2hvd0Jhbm5lcihtYXhUaWVyLCBjYXJkcyk7CiAgICB9LCAzNTAgKyBjYXJkcy5sZW5ndGggKiAyNjAgKyAzMDApOwogIH0KCiAgZnVuY3Rpb24gc3VtVGllcnMoY2FyZHMpewogICAgcmV0dXJuIGNhcmRzLnJlZHVjZShmdW5jdGlvbihzLGMpeyByZXR1cm4gcyArIHJhcml0eVRpZXIoYy5yYXJpdHkpLnRpZXI7IH0sIDApOwogIH0KCiAgZnVuY3Rpb24gcGFja1ZhbHVlKGNhcmRzKXsKICAgIHZhciBwcmljZWQgPSAwLCB0b3RhbCA9IDA7CiAgICBjYXJkcy5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICB2YXIgdiA9IHByaWNlVVNEKGMsIHN0YXRlLmN1cnJlbnQpOwogICAgICBpZiAodiAhPSBudWxsKXsgdG90YWwgKz0gdjsgcHJpY2VkKys7IH0KICAgIH0pOwogICAgcmV0dXJuIHsgdG90YWw6IHRvdGFsLCBwcmljZWQ6IHByaWNlZCB9OwogIH0KCiAgZnVuY3Rpb24gc2hvd0Jhbm5lcihtYXhUaWVyLCBjYXJkcyl7CiAgICB2YXIgdGV4dCA9ICcnLCBjbHMgPSAnJzsKICAgIGlmIChtYXhUaWVyID49IDYpeyB0ZXh0ID0gJ1Ro4bq7IGNoYXNlISBD4buxYyBwaOG6qW0hJzsgY2xzID0gJ3BoLWNyb3duJzsgcGxheUZhbmZhcmUoKTsgfQogICAgZWxzZSBpZiAobWF4VGllciA9PT0gNSl7IHRleHQgPSAnUsO6dCDEkcaw4bujYyB0aOG6uyBtaW5oIGjhu41hIMSR4bq3YyBiaeG7h3QhJzsgY2xzID0gJ3BoLXNoaW55JzsgfQogICAgZWxzZSBpZiAobWF4VGllciA9PT0gNCl7IHRleHQgPSAnUsO6dCDEkcaw4bujYyB0aOG6uyBTdGFyISc7IGNscyA9ICdwaC1zdGFyJzsgfQogICAgZWxzZSBpZiAobWF4VGllciA9PT0gMyl7IHRleHQgPSAnUsO6dCDEkcaw4bujYyB0aOG6uyBoaeG6v20hJzsgY2xzID0gJ3BoLXJhcmUnOyB9CgogICAgaWYgKHRleHQpewogICAgICBlbHMuYmFubmVyLnRleHRDb250ZW50ID0gdGV4dDsKICAgICAgZWxzLmJhbm5lci5jbGFzc05hbWUgPSAncGgtYmFubmVyICcgKyBjbHM7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyBlbHMuYmFubmVyLmNsYXNzTGlzdC5hZGQoJ3BoLXNob3cnKTsgfSk7CiAgICB9CgogICAgdmFyIHB2ID0gcGFja1ZhbHVlKGNhcmRzKTsKICAgIHZhciB0b3RhbFVTRCA9IHB2LnRvdGFsLCBwcmljZWQgPSBwdi5wcmljZWQ7CgogICAgdmFyIHJhcml0eVBhcnQgPSBNYXRoLm1pbigxMDAsIHN1bVRpZXJzKGNhcmRzKSAvIChjYXJkcy5sZW5ndGggKiA2KSAqIDEwMCArIChtYXhUaWVyID49IDYgPyAyMCA6IDApKTsKICAgIHZhciB2YWx1ZVBhcnQgPSBwcmljZWQgPyBNYXRoLm1pbigxMDAsIE1hdGgubG9nMTAoMSArIHRvdGFsVVNEKSAvIE1hdGgubG9nMTAoMTAxKSAqIDEwMCkgOiBudWxsOwogICAgdmFyIGx1Y2sgPSB2YWx1ZVBhcnQgPT0gbnVsbAogICAgICA/IE1hdGgucm91bmQocmFyaXR5UGFydCkKICAgICAgOiBNYXRoLnJvdW5kKHJhcml0eVBhcnQgKiAwLjU1ICsgdmFsdWVQYXJ0ICogMC40NSk7CiAgICBsdWNrID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBsdWNrKSk7CgogICAgdmFyIGQgPSBsb2FkREIoKTsKICAgIGlmIChsdWNrID4gKE51bWJlcihkLmJlc3RMdWNrKSB8fCAwKSl7CiAgICAgIGQuYmVzdEx1Y2sgPSBsdWNrOwogICAgICBzYXZlREIoKTsKICAgIH0KCiAgICBlbHMubHVja1Njb3JlLnRleHRDb250ZW50ID0gbHVjazsKICAgIGVscy5sdWNrLmhpZGRlbiA9IGZhbHNlOwogICAgaWYgKHByaWNlZCl7CiAgICAgIGVscy50b3RhbFZhbC50ZXh0Q29udGVudCA9IG1vbmV5KHRvdGFsVVNEKSArIChwcmljZWQgPCBjYXJkcy5sZW5ndGggPyAnICgnICsgcHJpY2VkICsgJy8nICsgY2FyZHMubGVuZ3RoICsgJyBsw6EgY8OzIGdpw6EpJyA6ICcnKTsKICAgICAgZWxzLnRvdGFsLmhpZGRlbiA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgZWxzLnRvdGFsLmhpZGRlbiA9IHRydWU7CiAgICB9CgogICAgdmFyIGRpZmYgPSB0b3RhbFVTRCAtIGQucGFja1ByaWNlOwogICAgZWxzLnNhdmVkLnRleHRDb250ZW50ID0gJ8SQw6MgbMawdSB2w6BvIGLhu5kgc8awdSB04bqtcCBcdTAwYjcgZ8OzaSBuw6B5ICcgKwogICAgICAocHJpY2VkID8gKGRpZmYgPj0gMCA/ICds4budaSAnICsgbW9uZXkoZGlmZikgOiAnbOG7lyAnICsgbW9uZXkoLWRpZmYpKSArICcgc28gduG7m2kgZ2nDoSBnw7NpICcgKyBtb25leShkLnBhY2tQcmljZSkgOiAnY2jGsGEgxJHhu6cgZOG7ryBsaeG7h3UgZ2nDoSDEkeG7gyB0w61uaCBs4budaS9s4buXJyk7CgogICAgc2hvd1F1aXAobHVjaywgbWF4VGllciwgdG90YWxVU0QsIHByaWNlZCk7CgogICAgaWYgKG1heFRpZXIgPj0gNikgY29uZkNlbGVicmF0ZSh0cnVlKTsKICAgIGVsc2UgaWYgKG1heFRpZXIgPj0gNCkgY29uZkNlbGVicmF0ZShmYWxzZSk7CiAgfQoKICB2YXIgUVVJUFMgPSB7CiAgICBiYWQ6IFsnSMO0bSBuYXkgxJFlbiBxdcOhLCBt4bufIHRp4bq/cCDEkWnigKYnLAogICAgICAgICAgJ1Rvw6BuIHRo4bq7IHRoxrDhu51uZywgZ+G7oSBn4bqhYyB0aMOqbSBt4buZdCBnw7NpIG7hu69hIHRow7RpIScsCiAgICAgICAgICAnR8OzaSBuw6B5IG5o4bq5IHTDumkgdGjhuq104oCmIHRo4butIHbhuq1uIGzhuqduIG7hu69hIG7DoG8uJ10sCiAgICBtZWg6IFsnVOG6oW0g4buVbiwgY2jGsGEgY8OzIGfDrCDEkeG7gyBraG9lIGPhuqMuJywKICAgICAgICAgICdDaMawYSBiw7luZyBu4buVLCBuaMawbmcgY8Wpbmcga2jDtG5nIGzhu5cuJywKICAgICAgICAgICdN4buZdCBnw7NpIGLDrG5oIHRoxrDhu51uZyBcdTIwMTQgbeG7nyB0aMOqbSB4ZW0gc2FvLiddLAogICAgZ29vZDogWydLaMO0bmcgdOG7hyBjaMO6dCBuw6BvLCB0aHUgaG/huqFjaCBraMOhIHThu5F0IScsCiAgICAgICAgICAgJ0fDs2kgbsOgeSBuZ29uIMSR4bqleSwgZ2nhu68gcGhvbmcgxJHhu5kgbmjDqSEnLAogICAgICAgICAgICdDw7MgaMOgbmcgcuG7k2kgXHUyMDE0IHRheSBi4bqhbiDEkWFuZyB0aMahbSDEkcOzLiddLAogICAgZ3JlYXQ6IFsnTWF5IG3huq9uIGPhu7FjIMSR4buJbmgsIHPhu5EgYuG6oW4gxJFhbmcgxJHhu48gcuG7sWMhJywKICAgICAgICAgICAgJ1F1w6EgbMOjaSEgSMO0bSBuYXkgbsOqbiBtdWEgdsOpIHPhu5EuJywKICAgICAgICAgICAgJ0fDs2kgxJHhu4luaCBuw7NjIFx1MjAxNCBjaOG7pXAgbcOgbiBow6xuaCBraG9lIG5nYXkgxJFpISddCiAgfTsKICBmdW5jdGlvbiBwaWNrUXVpcChsaXN0KXsgcmV0dXJuIGxpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGlzdC5sZW5ndGgpXTsgfQoKICBmdW5jdGlvbiBzaG93UXVpcChsdWNrLCBtYXhUaWVyLCB0b3RhbFVTRCwgcHJpY2VkKXsKICAgIHZhciBiYW5kLCBjbHM7CiAgICBpZiAobWF4VGllciA+PSA2IHx8IGx1Y2sgPj0gNzAgfHwgKHByaWNlZCAmJiB0b3RhbFVTRCA+PSAyNSkpeyBiYW5kID0gUVVJUFMuZ3JlYXQ7IGNscyA9ICdwaC1xdWlwLWdyZWF0JzsgfQogICAgZWxzZSBpZiAobWF4VGllciA+PSA0IHx8IGx1Y2sgPj0gNDUgfHwgKHByaWNlZCAmJiB0b3RhbFVTRCA+PSA4KSl7IGJhbmQgPSBRVUlQUy5nb29kOyBjbHMgPSAncGgtcXVpcC1nb29kJzsgfQogICAgZWxzZSBpZiAobHVjayA+PSAyMil7IGJhbmQgPSBRVUlQUy5tZWg7IGNscyA9ICdwaC1xdWlwLW1laCc7IH0KICAgIGVsc2UgeyBiYW5kID0gUVVJUFMuYmFkOyBjbHMgPSAncGgtcXVpcC1iYWQnOyB9CiAgICBlbHMucXVpcC50ZXh0Q29udGVudCA9IHBpY2tRdWlwKGJhbmQpOwogICAgZWxzLnF1aXAuY2xhc3NOYW1lID0gJ3BoLXF1aXAgJyArIGNsczsKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyBlbHMucXVpcC5jbGFzc0xpc3QuYWRkKCdwaC1zaG93Jyk7IH0pOwogIH0KCiAgZWxzLmFnYWluLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRTdGFnZSk7CiAgZWxzLmJveEFnYWluLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRTdGFnZSk7CgogIC8vIGNoaWEgc2UgYW5oIGtldCBxdWEgMSBnb2kKICBlbHMuc2hhcmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpewogICAgdmFyIHIgPSBzdGF0ZS5sYXN0UmVzdWx0OwogICAgaWYgKCFyKSByZXR1cm47CiAgICB2YXIgY2FyZHMgPSByLmNhcmRzLm1hcChmdW5jdGlvbihjKXsKICAgICAgcmV0dXJuIHsgbmFtZTpjLm5hbWUsIGltYWdlOmMuaW1hZ2UsIHRpZXI6cmFyaXR5VGllcihjLnJhcml0eSkudGllciwgcHJpY2U6cHJpY2VVU0QoYywgc3RhdGUuY3VycmVudCkgfTsKICAgIH0pOwogICAgdmFyIHB2ID0gcGFja1ZhbHVlKHIuY2FyZHMpOwogICAgdmFyIGQgPSBsb2FkREIoKTsKICAgIHZhciBkaWZmID0gcHYudG90YWwgLSBkLnBhY2tQcmljZSAqIHIucGFja3M7CiAgICBtYWtlQW5kU2hhcmUoewogICAgICB0aXRsZTogJ03hu58gZ8OzaSAnICsgKHN0YXRlLmN1cnJlbnQgPyBzdGF0ZS5jdXJyZW50Lm5hbWUgOiAnJyksCiAgICAgIHN1Yjogci5wYWNrcyArICcgZ8OzaSBcdTAwYjcgxJFp4buDbSBtYXkgbeG6r24gJyArIGVscy5sdWNrU2NvcmUudGV4dENvbnRlbnQgKyAnLzEwMCcsCiAgICAgIGNhcmRzOiBjYXJkcywKICAgICAgc3RhdHM6IFsKICAgICAgICBbJ0dpw6EgdHLhu4sgZ8OzaScsIG1vbmV5KHB2LnRvdGFsKV0sCiAgICAgICAgWydHacOhIGfDs2knLCBtb25leShkLnBhY2tQcmljZSAqIHIucGFja3MpXSwKICAgICAgICBbJ0zhu51pL2zhu5cnLCAoZGlmZiA+PSAwID8gJysnIDogJy0nKSArIG1vbmV5KE1hdGguYWJzKGRpZmYpKSwgZGlmZiA+PSAwID8gJ3BvcycgOiAnbmVnJ10sCiAgICAgICAgWydNYXkgbeG6r24nLCBlbHMubHVja1Njb3JlLnRleHRDb250ZW50ICsgJy8xMDAnXQogICAgICBdLAogICAgICB0ZXh0OiAnTcOsbmggduG7q2EgbeG7nyBnw7NpICcgKyAoc3RhdGUuY3VycmVudCA/IHN0YXRlLmN1cnJlbnQubmFtZSA6ICcnKSArICcgdHLDqm4gUG9rZUh1YiwgZ2nDoSB0cuG7iyAnICsgbW9uZXkocHYudG90YWwpICsgJyEnCiAgICB9KTsKICB9KTsKCiAgLy8gLS0tLS0tLS0tLSBN4bueIEPhuqIgSOG7mFAgLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHNob3dQcm9ncmVzcyhkb25lLCB0b3RhbCwgcGFja3NEb25lLCBwYWNrcyl7CiAgICBlbHMucHJvZ3Jlc3MuaGlkZGVuID0gZmFsc2U7CiAgICBlbHMuc3RhZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHZhciBwID0gdG90YWwgPyBNYXRoLnJvdW5kKGRvbmUgLyB0b3RhbCAqIDEwMCkgOiAwOwogICAgZWxzLnByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gcCArICclJzsKICAgIGVscy5wcm9ncmVzc1RleHQudGV4dENvbnRlbnQgPSAnxJBhbmcgbeG7nyBo4buZcOKApiAnICsgcGFja3NEb25lICsgJy8nICsgcGFja3MgKyAnIGfDs2kgKCcgKyBwICsgJyUpJzsKICB9CgogIGZ1bmN0aW9uIGZldGNoTWFueShpZHMsIG9uUHJvZyl7CiAgICB2YXIgb3V0ID0gbmV3IEFycmF5KGlkcy5sZW5ndGgpLCBpID0gMCwgYWN0aXZlID0gMCwgZG9uZSA9IDAsIExJTUlUID0gNjsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKXsKICAgICAgZnVuY3Rpb24gcHVtcCgpewogICAgICAgIHdoaWxlIChhY3RpdmUgPCBMSU1JVCAmJiBpIDwgaWRzLmxlbmd0aCl7CiAgICAgICAgICAoZnVuY3Rpb24oaWR4KXsKICAgICAgICAgICAgYWN0aXZlKys7IGkrKzsKICAgICAgICAgICAgZnVsbENhcmQoaWRzW2lkeF0pLnRoZW4oZnVuY3Rpb24oYyl7IG91dFtpZHhdID0gYzsgfSwgZnVuY3Rpb24oKXsgb3V0W2lkeF0gPSBudWxsOyB9KQogICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBhY3RpdmUtLTsgZG9uZSsrOwogICAgICAgICAgICAgICAgaWYgKG9uUHJvZykgb25Qcm9nKGRvbmUpOwogICAgICAgICAgICAgICAgaWYgKGRvbmUgPT09IGlkcy5sZW5ndGgpIHJlc29sdmUob3V0KTsKICAgICAgICAgICAgICAgIGVsc2UgcHVtcCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkoaSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaWRzLmxlbmd0aCkgcmVzb2x2ZShvdXQpOyBlbHNlIHB1bXAoKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gb3BlbkJveChwYWNrcyl7CiAgICBpZiAoc3RhdGUub3BlbmluZyB8fCAhc3RhdGUucG9vbC5sZW5ndGgpIHJldHVybjsKICAgIHN0YXRlLm9wZW5pbmcgPSB0cnVlOwogICAgc3RhdGUub3BlblNjcm9sbFkgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHdpbmRvdy5wYWdlWU9mZnNldCB8fCB3aW5kb3cuc2Nyb2xsWSB8fCAwKSk7CiAgICB2YXIgc2hvcEJvb3N0ID0gcGhTaG9wVGFrZUJvb3N0KCk7CiAgICBlbnN1cmVBdWRpbygpOwogICAgcGxheVJpcCgpOwogICAgZWxzLmVyci5oaWRkZW4gPSB0cnVlOwogICAgZWxzLmJveFJvdy5oaWRkZW4gPSB0cnVlOwogICAgZWxzLnJldmVhbC5jbGFzc0xpc3QucmVtb3ZlKCdwaC1hY3RpdmUnKTsKICAgIGVscy5ib3guY2xhc3NMaXN0LnJlbW92ZSgncGgtYWN0aXZlJyk7CiAgICBjbGVhckNvbmZldHRpKCk7CgogICAgdmFyIHBlciA9IDY7IC8vIDUgbMOhICsgMSBsw6EgZOG7sSBwaMOybmcgY2hvIMO0IGN14buRaQogICAgdmFyIGlkcyA9IFtdOwogICAgdmFyIGd1YXJhbnRlZWQgPSBzaG9wQm9vc3QuY3Jvd24gPyBwaWNrR3VhcmFudGVlZEhpZ2hJZCgpIDogbnVsbDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFja3MgKiBwZXI7IGkrKykgaWRzLnB1c2goaSA9PT0gMCAmJiBndWFyYW50ZWVkID8gZ3VhcmFudGVlZCA6IHBpY2tDYXJkSWQoc2hvcEJvb3N0KSk7CiAgICBzaG93UHJvZ3Jlc3MoMCwgaWRzLmxlbmd0aCwgMCwgcGFja3MpOwoKICAgIGZldGNoTWFueShpZHMsIGZ1bmN0aW9uKGRvbmUpewogICAgICBzaG93UHJvZ3Jlc3MoZG9uZSwgaWRzLmxlbmd0aCwgTWF0aC5taW4ocGFja3MsIE1hdGguZmxvb3IoZG9uZSAvIHBlcikpLCBwYWNrcyk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKGFsbCl7CiAgICAgIHZhciBjYXJkcyA9IGFsbC5maWx0ZXIoQm9vbGVhbik7CiAgICAgIGlmICghY2FyZHMubGVuZ3RoKXsKICAgICAgICBwaFNob3BSZWZ1bmRCb29zdChzaG9wQm9vc3QpOwogICAgICAgIHN0YXRlLm9wZW5pbmcgPSBmYWxzZTsKICAgICAgICBlbHMucHJvZ3Jlc3MuaGlkZGVuID0gdHJ1ZTsKICAgICAgICBlbHMuc3RhZ2Uuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICBlbHMuYm94Um93LmhpZGRlbiA9IGZhbHNlOwogICAgICAgIGVscy5lcnIudGV4dENvbnRlbnQgPSAnS2jDtG5nIHThuqNpIMSRxrDhu6NjIGzDoSBiw6BpIG7DoG8gY2hvIGjhu5lwIG7DoHkuIFRo4butIGzhuqFpIGhv4bq3YyBjaOG7jW4gYuG7mSBraMOhYy4nOwogICAgICAgIGVscy5lcnIuaGlkZGVuID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBwYWNrc0FyciA9IFtdLCBrID0gMDsKICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwYWNrcyAmJiBrIDwgY2FyZHMubGVuZ3RoOyBwKyspewogICAgICAgIHZhciBzbG90cyA9IFtdOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNSAmJiBrIDwgY2FyZHMubGVuZ3RoOyBqKyspeyBzbG90cy5wdXNoKGNhcmRzW2tdKTsgaysrOyB9CiAgICAgICAgdmFyIHJlc2VydmUgPSBjYXJkc1trXTsgaysrOwogICAgICAgIGlmIChyZXNlcnZlICYmIHNsb3RzLmxlbmd0aCAmJgogICAgICAgICAgICByYXJpdHlUaWVyKHJlc2VydmUucmFyaXR5KS50aWVyID4gcmFyaXR5VGllcihzbG90c1tzbG90cy5sZW5ndGgtMV0ucmFyaXR5KS50aWVyKXsKICAgICAgICAgIHNsb3RzW3Nsb3RzLmxlbmd0aC0xXSA9IHJlc2VydmU7CiAgICAgICAgfQogICAgICAgIGlmIChzbG90cy5sZW5ndGgpIHBhY2tzQXJyLnB1c2goc2xvdHMpOwogICAgICB9CiAgICAgIGZpbmlzaEJveChwYWNrc0Fycik7CiAgICAgIHNjcm9sbFRvT3BlbkFuY2hvcignYXV0bycpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKXsKICAgICAgcGhTaG9wUmVmdW5kQm9vc3Qoc2hvcEJvb3N0KTsKICAgICAgc3RhdGUub3BlbmluZyA9IGZhbHNlOwogICAgICBlbHMucHJvZ3Jlc3MuaGlkZGVuID0gdHJ1ZTsKICAgICAgZWxzLnN0YWdlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgIGVscy5ib3hSb3cuaGlkZGVuID0gZmFsc2U7CiAgICAgIGVscy5lcnIudGV4dENvbnRlbnQgPSAnTeG7nyBo4buZcCB0aOG6pXQgYuG6oWkgKCcgKyBlcnIubWVzc2FnZSArICcpLiBWdWkgbMOybmcgdGjhu60gbOG6oWkuJzsKICAgICAgZWxzLmVyci5oaWRkZW4gPSBmYWxzZTsKICAgICAgc2Nyb2xsVG9PcGVuQW5jaG9yKCdhdXRvJyk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHBoUmV2ZWFsRGVsYXkodGllciwgaXNMYXN0KXsKICAgIHZhciBiYXNlID0gdGllciA+PSA2ID8gMTE4MCA6IHRpZXIgPj0gNSA/IDcyMCA6IHRpZXIgPj0gNCA/IDU2MCA6IHRpZXIgPj0gMyA/IDQwMCA6IHRpZXIgPj0gMiA/IDI2MCA6IDA7CiAgICBpZiAoaXNMYXN0KSBiYXNlICs9IHRpZXIgPj0gNCA/IDI2MCA6IDE2MDsKICAgIHJldHVybiBiYXNlOwogIH0KCiAgZnVuY3Rpb24gcGhQcmVwYXJlUmV2ZWFsKHNsb3QsIHRpZXIsIGlzTGFzdCl7CiAgICBpZiAoaXNMYXN0KSBzbG90LmNsYXNzTGlzdC5hZGQoJ3BoLWxhc3QtYW50aWNpcGF0aW9uJyk7CiAgICBpZiAodGllciA+PSA2KXsgc2xvdC5jbGFzc0xpc3QuYWRkKCdwaC1jaGFzZS02Jyk7IH0KICAgIGVsc2UgaWYgKHRpZXIgPj0gNSl7IHNsb3QuY2xhc3NMaXN0LmFkZCgncGgtdHJlbWJsZS1zdHJvbmcnKTsgfQogICAgZWxzZSBpZiAodGllciA+PSAyKXsgc2xvdC5jbGFzc0xpc3QuYWRkKCdwaC10cmVtYmxlJyk7IH0KICB9CgogIGZ1bmN0aW9uIHBoQ2xlYXJSZXZlYWxGeChzbG90KXsKICAgIHNsb3QuY2xhc3NMaXN0LnJlbW92ZSgncGgtdHJlbWJsZScsJ3BoLXRyZW1ibGUtc3Ryb25nJywncGgtbGFzdC1hbnRpY2lwYXRpb24nLCdwaC1jaGFzZS02Jyk7CiAgfQoKICAvLyBM4bqtdCBt4buZdCBsw6EgdGhlbyBraeG7g3UgZ8OzaSBiw6BpIChkw7luZyBjaG8gbcOgbiAidGluaCBob2EgY+G6oyBo4buZcCIpLgogIGZ1bmN0aW9uIGJ1aWxkU2xvdChjYXJkLCBpbmZvLCB1c2QsIHRhcmdldFJvdywgbm92ZWx0eSl7CiAgICB2YXIgY29sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB2YXIgc2xvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc2xvdC5jbGFzc05hbWUgPSAncGgtc2xvdCc7CiAgICBzbG90LmRhdGFzZXQudGllciA9IFN0cmluZyhpbmZvLnRpZXIpOwoKICAgIHZhciBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBpbm5lci5jbGFzc05hbWUgPSAncGgtaW5uZXInOwogICAgdmFyIGJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgYmFjay5jbGFzc05hbWUgPSAncGgtZmFjZSBwaC1iYWNrLWZhY2UnOyBiYWNrLnRleHRDb250ZW50ID0gJz8nOwogICAgdmFyIGZyb250ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGZyb250LmNsYXNzTmFtZSA9ICdwaC1mYWNlIHBoLWZyb250LWZhY2UnOwogICAgaWYgKGNhcmQuaW1hZ2UpewogICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgIGltZy5sb2FkaW5nID0gJ2xhenknOwogICAgICBpbWcuYWx0ID0gY2FyZC5uYW1lIHx8ICcnOwogICAgICBpbWcuc3JjID0gY2FyZC5pbWFnZSArICcvJyArIFFVQUxJVFk7CiAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24oKXsgaW1nLnJlbW92ZSgpOyBpZiAoIWZyb250LnF1ZXJ5U2VsZWN0b3IoJy5waC1pbWFnZS1mYWxsYmFjaycpKSB7IHZhciBmYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgZmIuY2xhc3NOYW1lPSdwaC1pbWFnZS1mYWxsYmFjayc7IGZiLnRleHRDb250ZW50ID0gY2FyZC5uYW1lIHx8ICc/JzsgZnJvbnQuYXBwZW5kQ2hpbGQoZmIpOyB9IH07CiAgICAgIGZyb250LmFwcGVuZENoaWxkKGltZyk7CiAgICB9IGVsc2UgZnJvbnQudGV4dENvbnRlbnQgPSBjYXJkLm5hbWUgfHwgJz8nOwogICAgaW5uZXIuYXBwZW5kQ2hpbGQoYmFjayk7IGlubmVyLmFwcGVuZENoaWxkKGZyb250KTsKICAgIHNsb3QuYXBwZW5kQ2hpbGQoaW5uZXIpOwoKICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgbGFiZWwuY2xhc3NOYW1lID0gJ3BoLWNhcmQtbGFiZWwnOwoKICAgIGNvbC5jbGFzc05hbWUgPSAncGgtY2FyZC1jb2wgcGgtZXh0cmFjdGluZyc7CiAgICBjb2wuYXBwZW5kQ2hpbGQoc2xvdCk7IGNvbC5hcHBlbmRDaGlsZChsYWJlbCk7CiAgICB0YXJnZXRSb3cuYXBwZW5kQ2hpbGQoY29sKTsKICAgIGNvbC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1waC1leHRyYWN0LWRlbGF5JywgKCh0YXJnZXRSb3cuY2hpbGRyZW4ubGVuZ3RoIC0gMSkgKiA5NSkgKyAnbXMnKTsKCiAgICB2YXIgcmV2ZWFsU3RhcnRlZCA9IGZhbHNlOwogICAgdmFyIHJldmVhbEluZGV4ID0gdGFyZ2V0Um93LmNoaWxkcmVuLmxlbmd0aCAtIDE7CgogICAgZnVuY3Rpb24gcmV2ZWFsKCl7CiAgICAgIGlmIChzbG90LmNsYXNzTGlzdC5jb250YWlucygncGgtZmxpcHBlZCcpKXsKICAgICAgICBvcGVuQ2FyZE1vZGFsKGNhcmQsIGluZm8sIHVzZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChyZXZlYWxTdGFydGVkKSByZXR1cm47CiAgICAgIHJldmVhbFN0YXJ0ZWQgPSB0cnVlOwogICAgICB2YXIgaXNMYXN0ID0gcmV2ZWFsSW5kZXggPT09IHRhcmdldFJvdy5jaGlsZHJlbi5sZW5ndGggLSAxOwogICAgICBwaFByZXBhcmVSZXZlYWwoc2xvdCwgaW5mby50aWVyLCBpc0xhc3QpOwogICAgICB2YXIgZGVsYXkgPSBwaFJldmVhbERlbGF5KGluZm8udGllciwgaXNMYXN0KTsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgIHBoQ2xlYXJSZXZlYWxGeChzbG90KTsKICAgICAgICBzbG90LmNsYXNzTGlzdC5hZGQoJ3BoLWZsaXBwZWQnKTsKICAgICAgICBzbG90LnRpdGxlID0gJ0LhuqVtIMSR4buDIHhlbSBjaGkgdGnhur90IGzDoSBiw6BpJzsKICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSAnJzsKICAgICAgdmFyIG5tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICBubS50ZXh0Q29udGVudCA9IChjYXJkLm5hbWUgfHwgJycpICsgJyBcdTAwYjcgJyArIChpbmZvLmxhYmVsIHx8IHRpZXJMYWJlbFRleHQoaW5mby50aWVyKSkgKyAnIFx1MDBiNyAnOwogICAgICB2YXIgcHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgIHByLmNsYXNzTmFtZSA9IHVzZCAhPSBudWxsID8gJ3BoLWNhcmQtcHJpY2UnIDogJ3BoLWNhcmQtcHJpY2UgcGgtY2FyZC1ub3ByaWNlJzsKICAgICAgcHIudGV4dENvbnRlbnQgPSB1c2QgIT0gbnVsbCA/IG1vbmV5KHVzZCkgOiAnXHUyMDE0JzsKICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQobm0pOyBsYWJlbC5hcHBlbmRDaGlsZChwcik7CiAgICAgIHBsYXlGbGlwKGluZm8udGllcik7CiAgICAgIGFkZE5vdmVsdHlCYWRnZShmcm9udCwgbm92ZWx0eSk7CiAgICAgICAgaWYgKGluZm8udGllciA+PSA1KXsKICAgICAgICAgIGVscy5mbGFzaC5jbGFzc0xpc3QucmVtb3ZlKCdwaC1nbycpOwogICAgICAgICAgdm9pZCBlbHMuZmxhc2gub2Zmc2V0V2lkdGg7CiAgICAgICAgICBlbHMuZmxhc2guY2xhc3NMaXN0LmFkZCgncGgtZ28nKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZm8udGllciA+PSA0KSBjb25mQXRFbGVtZW50KHNsb3QsIGluZm8udGllcik7CiAgICAgIH0sIGRlbGF5KTsKICAgIH0KCiAgICBzbG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmV2ZWFsKTsKICAgIHJldHVybiByZXZlYWw7CiAgfQoKICBmdW5jdGlvbiBmaW5pc2hCb3gocGFja3NBcnIpewogICAgZWxzLnByb2dyZXNzLmhpZGRlbiA9IHRydWU7CiAgICB2YXIgZmxhdCA9IFtdOwogICAgcGFja3NBcnIuZm9yRWFjaChmdW5jdGlvbihwKXsgZmxhdCA9IGZsYXQuY29uY2F0KHApOyB9KTsKCiAgICB2YXIgYmVmb3JlREIgPSBsb2FkREIoKTsKICAgIHZhciBub3ZlbHR5QnlJZCA9IHt9OwogICAgZmxhdC5mb3JFYWNoKGZ1bmN0aW9uKGNhcmQpewogICAgICBpZiAoIWNhcmQgfHwgIWNhcmQuaWQgfHwgbm92ZWx0eUJ5SWRbY2FyZC5pZF0pIHJldHVybjsKICAgICAgbm92ZWx0eUJ5SWRbY2FyZC5pZF0gPSBub3ZlbHR5TGFiZWwoY2FyZCwgYmVmb3JlREIpOwogICAgfSk7CgogICAgcmVjb3JkUGFja3MoZmxhdCwgcGFja3NBcnIubGVuZ3RoKTsKICAgIHN0YXRlLmxhc3RSZXN1bHQgPSB7IGNhcmRzOiBmbGF0LCBwYWNrczogcGFja3NBcnIubGVuZ3RoIH07CgogICAgdmFyIGQgPSBsb2FkREIoKTsKICAgIHZhciBwdiA9IHBhY2tWYWx1ZShmbGF0KTsKICAgIHZhciBzcGVudCA9IGQucGFja1ByaWNlICogcGFja3NBcnIubGVuZ3RoOwogICAgdmFyIHJvaSA9IHNwZW50ID4gMCA/IChwdi50b3RhbCAtIHNwZW50KSAvIHNwZW50ICogMTAwIDogbnVsbDsKICAgIHZhciBtYXhUaWVyID0gMCwgdGllcnMgPSBbMCwwLDAsMCwwLDAsMF07CiAgICBmbGF0LmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICAgIHZhciB0ID0gcmFyaXR5VGllcihjLnJhcml0eSkudGllcjsKICAgICAgdGllcnNbdF0rKzsKICAgICAgaWYgKHQgPiBtYXhUaWVyKSBtYXhUaWVyID0gdDsKICAgIH0pOwoKICAgIHZhciBzb3J0ZWQgPSBmbGF0LnNsaWNlKCkuc29ydChmdW5jdGlvbihhLGIpewogICAgICB2YXIgcGEgPSBwcmljZVVTRChhLCBzdGF0ZS5jdXJyZW50KSwgcGIgPSBwcmljZVVTRChiLCBzdGF0ZS5jdXJyZW50KTsKICAgICAgcGEgPSBwYSA9PSBudWxsID8gLTEgOiBwYTsgcGIgPSBwYiA9PSBudWxsID8gLTEgOiBwYjsKICAgICAgaWYgKHBiICE9PSBwYSkgcmV0dXJuIHBiIC0gcGE7CiAgICAgIHJldHVybiByYXJpdHlUaWVyKGIucmFyaXR5KS50aWVyIC0gcmFyaXR5VGllcihhLnJhcml0eSkudGllcjsKICAgIH0pOwogICAgdmFyIGhlcm8gPSBzb3J0ZWQuc2xpY2UoMCwgNSk7CgogICAgZWxzLmJveEJvZHkudGV4dENvbnRlbnQgPSAnJzsKCiAgICAvLyAtLS0tLSBtw6BuICJnw7NpIHRpbmggaG9hIjogNSBsw6EgxJHDoW5nIGdpw6EgbmjhuqV0IGPhu6dhIGPhuqMgaOG7mXAgLS0tLS0KICAgIHZhciBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBoLmNsYXNzTmFtZSA9ICdwaC1wdWxsLWhlYWRpbmcnOwogICAgaC50ZXh0Q29udGVudCA9ICdUaW5oIGhvYSBj4bqjIGjhu5lwIFx1MDBiNyAnICsgcGFja3NBcnIubGVuZ3RoICsgJyBnw7NpIFx1MDBiNyAnICsgZmxhdC5sZW5ndGggKyAnIGzDoSc7CiAgICBlbHMuYm94Qm9keS5hcHBlbmRDaGlsZChoKTsKCiAgICB2YXIgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICByb3cuY2xhc3NOYW1lID0gJ3BoLWNhcmQtcm93JzsKICAgIGVscy5ib3hCb2R5LmFwcGVuZENoaWxkKHJvdyk7CgogICAgdmFyIGJhbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYmFubmVyLmNsYXNzTmFtZSA9ICdwaC1iYW5uZXInOwogICAgZWxzLmJveEJvZHkuYXBwZW5kQ2hpbGQoYmFubmVyKTsKCiAgICAvLyAtLS0tLSBi4bqjbmcgUk9JLCBoaeG7h24gc2F1IGtoaSBs4bqtdCB4b25nIC0tLS0tCiAgICB2YXIgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgd3JhcC5jbGFzc05hbWUgPSAncGgtYm94LXN0YXRzJzsKCiAgICB2YXIgc3RhdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHN0YXRzLmNsYXNzTmFtZSA9ICdwaC1zdGF0LWdyaWQnOwogICAgc3RhdHMuYXBwZW5kQ2hpbGQoc3RhdEJveCgnQ2hpIHBow60gaOG7mXAnLCBtb25leShzcGVudCkpKTsKICAgIHN0YXRzLmFwcGVuZENoaWxkKHN0YXRCb3goJ0dpw6EgdHLhu4sgdGh1IMSRxrDhu6NjJywgbW9uZXkocHYudG90YWwpKSk7CiAgICBzdGF0cy5hcHBlbmRDaGlsZChzdGF0Qm94KCdM4budaS9s4buXJywgKHB2LnRvdGFsIC0gc3BlbnQgPj0gMCA/ICcrJyA6ICctJykgKyBtb25leShNYXRoLmFicyhwdi50b3RhbCAtIHNwZW50KSksIHB2LnRvdGFsIC0gc3BlbnQgPj0gMCA/ICdwaC1wb3MnIDogJ3BoLW5lZycpKTsKICAgIHN0YXRzLmFwcGVuZENoaWxkKHN0YXRCb3goJ1JPSScsIHJvaSA9PSBudWxsID8gJ+KAlCcgOiBwY3Qocm9pKSwgcm9pQ2xhc3Mocm9pKSkpOwogICAgd3JhcC5hcHBlbmRDaGlsZChzdGF0cyk7CgogICAgdmFyIG5vdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG5vdGUuY2xhc3NOYW1lID0gJ3BoLWNvbC1ub3RlJzsKICAgIG5vdGUudGV4dENvbnRlbnQgPSBwdi5wcmljZWQgPCBmbGF0Lmxlbmd0aAogICAgICA/IHB2LnByaWNlZCArICcvJyArIGZsYXQubGVuZ3RoICsgJyBsw6EgY8OzIGThu68gbGnhu4d1IGdpw6EuIFRvw6BuIGLhu5kgc+G7kSBsw6EgxJHDoyDEkcaw4bujYyBsxrB1IHbDoG8gYuG7mSBzxrB1IHThuq1wLicKICAgICAgOiAnVG/DoG4gYuG7mSBz4buRIGzDoSDEkcOjIMSRxrDhu6NjIGzGsHUgdsOgbyBi4buZIHPGsHUgdOG6rXAuJzsKICAgIHdyYXAuYXBwZW5kQ2hpbGQobm90ZSk7CgogICAgdmFyIGJyayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYnJrLmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uJzsKICAgIHZhciBicmtUID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBicmtULmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uLXRpdGxlJzsKICAgIGJya1QudGV4dENvbnRlbnQgPSAnUGjDom4gYuG7lSDEkeG7mSBoaeG6v20nOwogICAgYnJrLmFwcGVuZENoaWxkKGJya1QpOwogICAgdmFyIG1heE4gPSBNYXRoLm1heC5hcHBseShudWxsLCB0aWVycykgfHwgMTsKICAgIGZvciAodmFyIHQgPSA2OyB0ID49IDA7IHQtLSl7CiAgICAgIGlmICghdGllcnNbdF0pIGNvbnRpbnVlOwogICAgICB2YXIgcm93YiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICByb3diLmNsYXNzTmFtZSA9ICdwaC1iYXItcm93JzsKICAgICAgdmFyIGJsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBibC5jbGFzc05hbWUgPSAncGgtYmFyLWwnOyBibC50ZXh0Q29udGVudCA9IHRpZXJMYWJlbFRleHQodCk7CiAgICAgIHZhciBidyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgYncuY2xhc3NOYW1lID0gJ3BoLWJhci13JzsKICAgICAgdmFyIGJmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBiZi5jbGFzc05hbWUgPSAncGgtYmFyLWYnOyBiZi5kYXRhc2V0LnRpZXIgPSBTdHJpbmcodCk7CiAgICAgIGJmLnN0eWxlLndpZHRoID0gTWF0aC5tYXgoNCwgdGllcnNbdF0gLyBtYXhOICogMTAwKSArICclJzsKICAgICAgYncuYXBwZW5kQ2hpbGQoYmYpOwogICAgICB2YXIgYm4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IGJuLmNsYXNzTmFtZSA9ICdwaC1iYXItbic7IGJuLnRleHRDb250ZW50ID0gU3RyaW5nKHRpZXJzW3RdKTsKICAgICAgcm93Yi5hcHBlbmRDaGlsZChibCk7IHJvd2IuYXBwZW5kQ2hpbGQoYncpOyByb3diLmFwcGVuZENoaWxkKGJuKTsKICAgICAgYnJrLmFwcGVuZENoaWxkKHJvd2IpOwogICAgfQogICAgd3JhcC5hcHBlbmRDaGlsZChicmspOwoKICAgIHZhciByZXN0ID0gc29ydGVkLnNsaWNlKDUsIDE3KTsKICAgIGlmIChyZXN0Lmxlbmd0aCl7CiAgICAgIHZhciBtb3JlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgIG1vcmVCdG4udHlwZSA9ICdidXR0b24nOwogICAgICBtb3JlQnRuLmNsYXNzTmFtZSA9ICdwaC1idG4gcGgtc21hbGwnOwogICAgICBtb3JlQnRuLnRleHRDb250ZW50ID0gJ1hlbSBjw6FjIGzDoSDEkcOhbmcgZ2nDoSB0aeG6v3AgdGhlbyc7CiAgICAgIG1vcmVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7CiAgICAgIG1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIG1vcmVCdG4uc3R5bGUubWFyZ2luID0gJzE0cHggYXV0byAwJzsKCiAgICAgIHZhciB0b3BXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHRvcFdyYXAuY2xhc3NOYW1lID0gJ3BoLW1vZGFsLXNlY3Rpb24nOwogICAgICB0b3BXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICB2YXIgdG9wVCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICB0b3BULmNsYXNzTmFtZSA9ICdwaC1tb2RhbC1zZWN0aW9uLXRpdGxlJzsKICAgICAgdG9wVC50ZXh0Q29udGVudCA9ICdDw6FjIGzDoSDEkcOhbmcgZ2nDoSB0aeG6v3AgdGhlbyc7CiAgICAgIHRvcFdyYXAuYXBwZW5kQ2hpbGQodG9wVCk7CgogICAgICB2YXIgZ3JpZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICBncmlkLmNsYXNzTmFtZSA9ICdwaC10aHVtYi1ncmlkJzsKICAgICAgcmVzdC5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICAgIHZhciBpbmZvID0gcmFyaXR5VGllcihjLnJhcml0eSk7CiAgICAgICAgdmFyIHVzZCA9IHByaWNlVVNEKGMpOwogICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoY2FyZFRodW1iKAogICAgICAgICAgeyBuYW1lOmMubmFtZSwgaW1nOmMuaW1hZ2UsIHRpZXI6aW5mby50aWVyLCBwcmljZTp1c2QsIG46MSB9LAogICAgICAgICAgZnVuY3Rpb24oKXsgb3BlbkNhcmRNb2RhbChjLCBpbmZvLCB1c2QpOyB9CiAgICAgICAgKSk7CiAgICAgIH0pOwogICAgICB0b3BXcmFwLmFwcGVuZENoaWxkKGdyaWQpOwoKICAgICAgbW9yZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCl7CiAgICAgICAgdmFyIHNob3cgPSB0b3BXcmFwLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJzsKICAgICAgICB0b3BXcmFwLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gJycgOiAnbm9uZSc7CiAgICAgICAgbW9yZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBzaG93ID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgICAgbW9yZUJ0bi50ZXh0Q29udGVudCA9IHNob3cgPyAn4bqobiBjw6FjIGzDoSDEkcOhbmcgZ2nDoSB0aeG6v3AgdGhlbycgOiAnWGVtIGPDoWMgbMOhIMSRw6FuZyBnacOhIHRp4bq/cCB0aGVvJzsKICAgICAgfSk7CgogICAgICB3cmFwLmFwcGVuZENoaWxkKG1vcmVCdG4pOwogICAgICB3cmFwLmFwcGVuZENoaWxkKHRvcFdyYXApOwogICAgfQoKICAgIHZhciBsdWNrID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKAogICAgICBzdW1UaWVycyhmbGF0KSAvIChmbGF0Lmxlbmd0aCAqIDYpICogMTAwICogMC41NSArCiAgICAgIChwdi5wcmljZWQgPyBNYXRoLm1pbigxMDAsIE1hdGgubG9nMTAoMSArIHB2LnRvdGFsIC8gTWF0aC5tYXgoMSwgcGFja3NBcnIubGVuZ3RoKSkgLyBNYXRoLmxvZzEwKDEwMSkgKiAxMDApIDogMCkgKiAwLjQ1CiAgICApKSk7CiAgICB2YXIgYmFuZCwgY2xzOwogICAgaWYgKHJvaSAhPSBudWxsICYmIHJvaSA+PSA0MCl7IGJhbmQgPSBRVUlQUy5ncmVhdDsgY2xzID0gJ3BoLXF1aXAtZ3JlYXQnOyB9CiAgICBlbHNlIGlmIChyb2kgIT0gbnVsbCAmJiByb2kgPj0gMCl7IGJhbmQgPSBRVUlQUy5nb29kOyBjbHMgPSAncGgtcXVpcC1nb29kJzsgfQogICAgZWxzZSBpZiAocm9pICE9IG51bGwgJiYgcm9pID49IC0zNSl7IGJhbmQgPSBRVUlQUy5tZWg7IGNscyA9ICdwaC1xdWlwLW1laCc7IH0KICAgIGVsc2UgeyBiYW5kID0gUVVJUFMuYmFkOyBjbHMgPSAncGgtcXVpcC1iYWQnOyB9CiAgICB2YXIgcXVpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcXVpcC5jbGFzc05hbWUgPSAncGgtcXVpcCBwaC1zaG93ICcgKyBjbHM7CiAgICBxdWlwLnRleHRDb250ZW50ID0gcGlja1F1aXAoYmFuZCkgKyAnICjEkWnhu4NtIG1heSBt4bqvbiB0cnVuZyBiw6xuaCAnICsgbHVjayArICcvMTAwKSc7CiAgICB3cmFwLmFwcGVuZENoaWxkKHF1aXApOwoKICAgIGVscy5ib3hCb2R5LmFwcGVuZENoaWxkKHdyYXApOwogICAgZWxzLmJveC5jbGFzc0xpc3QuYWRkKCdwaC1hY3RpdmUnKTsKCiAgICAvLyAtLS0tLSBs4bqtdCBs4bqnbiBsxrDhu6N0LCBjaOG6rW0gaMahbiAxIGfDs2kgdGjGsOG7nW5nIMSR4buDIGPDsyBjYW8gdHLDoG8gLS0tLS0KICAgIHZhciByZXZlYWxzID0gaGVyby5tYXAoZnVuY3Rpb24oYyl7CiAgICAgIHJldHVybiBidWlsZFNsb3QoYywgcmFyaXR5VGllcihjLnJhcml0eSksIHByaWNlVVNEKGMsIHN0YXRlLmN1cnJlbnQpLCByb3csIG5vdmVsdHlCeUlkW2MuaWRdKTsKICAgIH0pOwogICAgcmV2ZWFscy5mb3JFYWNoKGZ1bmN0aW9uKGZuLCBpKXsgc2V0VGltZW91dChmbiwgNTAwICsgaSAqIDQyMCk7IH0pOwoKICAgIHZhciBlbmRBdCA9IDUwMCArIHJldmVhbHMubGVuZ3RoICogNDIwICsgMzIwOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICB2YXIgdGV4dCA9ICcnLCBiY2xzID0gJyc7CiAgICAgIGlmIChtYXhUaWVyID49IDYpeyB0ZXh0ID0gJ1Ro4bq7IGNoYXNlIHRyb25nIGjhu5lwISBD4buxYyBwaOG6qW0hJzsgYmNscyA9ICdwaC1jcm93bic7IHBsYXlGYW5mYXJlKCk7IGNvbmZDZWxlYnJhdGUodHJ1ZSk7IH0KICAgICAgZWxzZSBpZiAobWF4VGllciA9PT0gNSl7IHRleHQgPSAnSOG7mXAgbsOgeSBjw7MgdGjhursgbWluaCBo4buNYSDEkeG6t2MgYmnhu4d0ISc7IGJjbHMgPSAncGgtc2hpbnknOyBjb25mQ2VsZWJyYXRlKGZhbHNlKTsgfQogICAgICBlbHNlIGlmIChtYXhUaWVyID09PSA0KXsgdGV4dCA9ICdI4buZcCBuw6B5IGPDsyB0aOG6uyBTdGFyISc7IGJjbHMgPSAncGgtc3Rhcic7IGNvbmZDZWxlYnJhdGUoZmFsc2UpOyB9CiAgICAgIGVsc2UgaWYgKG1heFRpZXIgPT09IDMpeyB0ZXh0ID0gJ0jhu5lwIG7DoHkgY8OzIHRo4bq7IGhp4bq/bSEnOyBiY2xzID0gJ3BoLXJhcmUnOyB9CiAgICAgIGlmICh0ZXh0KXsKICAgICAgICBiYW5uZXIudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgIGJhbm5lci5jbGFzc05hbWUgPSAncGgtYmFubmVyICcgKyBiY2xzOwogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyBiYW5uZXIuY2xhc3NMaXN0LmFkZCgncGgtc2hvdycpOyB9KTsKICAgICAgfQogICAgICB3cmFwLmNsYXNzTGlzdC5hZGQoJ3BoLXNob3cnKTsKICAgICAgc3RhdGUub3BlbmluZyA9IGZhbHNlOwogICAgfSwgZW5kQXQpOwoKICAgIGVscy5ib3hTaGFyZS5vbmNsaWNrID0gZnVuY3Rpb24oKXsKICAgICAgdmFyIGNhcmRzID0gaGVyby5tYXAoZnVuY3Rpb24oYyl7CiAgICAgICAgcmV0dXJuIHsgbmFtZTpjLm5hbWUsIGltYWdlOmMuaW1hZ2UsIHRpZXI6cmFyaXR5VGllcihjLnJhcml0eSkudGllciwgcHJpY2U6cHJpY2VVU0QoYykgfTsKICAgICAgfSk7CiAgICAgIG1ha2VBbmRTaGFyZSh7CiAgICAgICAgdGl0bGU6ICdN4bufIGjhu5lwICcgKyAoc3RhdGUuY3VycmVudCA/IHN0YXRlLmN1cnJlbnQubmFtZSA6ICcnKSwKICAgICAgICBzdWI6IHBhY2tzQXJyLmxlbmd0aCArICcgZ8OzaSBcdTAwYjcgJyArIGZsYXQubGVuZ3RoICsgJyBsw6EgXHUwMGI3IFJPSSAnICsgKHJvaSA9PSBudWxsID8gJ+KAlCcgOiBwY3Qocm9pKSksCiAgICAgICAgY2FyZHM6IGNhcmRzLAogICAgICAgIHN0YXRzOiBbCiAgICAgICAgICBbJ0NoaSBwaMOtJywgbW9uZXkoc3BlbnQpXSwKICAgICAgICAgIFsnR2nDoSB0cuG7iycsIG1vbmV5KHB2LnRvdGFsKV0sCiAgICAgICAgICBbJ0zhu51pL2zhu5cnLCAocHYudG90YWwgLSBzcGVudCA+PSAwID8gJysnIDogJy0nKSArIG1vbmV5KE1hdGguYWJzKHB2LnRvdGFsIC0gc3BlbnQpKSwgcHYudG90YWwgLSBzcGVudCA+PSAwID8gJ3BvcycgOiAnbmVnJ10sCiAgICAgICAgICBbJ1JPSScsIHJvaSA9PSBudWxsID8gJ+KAlCcgOiBwY3Qocm9pKV0KICAgICAgICBdLAogICAgICAgIHRleHQ6ICdNw6xuaCB24burYSBt4bufICcgKyBwYWNrc0Fyci5sZW5ndGggKyAnIGfDs2kgJyArIChzdGF0ZS5jdXJyZW50ID8gc3RhdGUuY3VycmVudC5uYW1lIDogJycpICsgJyB0csOqbiBQb2tlSHViOiBjaGkgJyArIG1vbmV5KHNwZW50KSArICcsIHRodSB24buBICcgKyBtb25leShwdi50b3RhbCkgKyAnIChST0kgJyArIChyb2kgPT0gbnVsbCA/ICfigJQnIDogcGN0KHJvaSkpICsgJykuJwogICAgICB9KTsKICAgIH07CiAgfQoKICAvLyBjaGlwIGNob24gc28gZ29pCiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbHMuYm94Um93LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBhY2tzXScpLCBmdW5jdGlvbihidG4pewogICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgdmFyIG4gPSBwYXJzZUludChidG4uZGF0YXNldC5wYWNrcywgMTApIHx8IDE7CiAgICAgIGlmIChuID09PSAxKSBvcGVuUGFjaygpOyBlbHNlIG9wZW5Cb3gobik7CiAgICAgIHNjcm9sbFRvT3BlbkFuY2hvcignYXV0bycpOwogICAgfSk7CiAgfSk7CgogIHVwZGF0ZUNvbEJhZGdlKCk7CgoKICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBBREQtT046IFRI4busIFRIw4FDSCBOw4JORyBDQU8gKyBUSMav4bueTkcgTOG7mk4gKyBMw4BNIE3hu5pJIDMwIFBIw5pUCiAgICAgQ2jhu4kgYuG7lSBzdW5nIGxvZ2ljLCBnaeG7ryBuZ3V5w6puIGjhu4cgdGjhu5FuZyBjxakuCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgdmFyIHBoQ2hhbGxlbmdlUmVmcmVzaFRpbWVyID0gbnVsbDsKICB2YXIgUEhfQ0hBTExFTkdFX0NZQ0xFX01TID0gMzAgKiA2MCAqIDEwMDA7CiAgdmFyIFBIX0FDVElWRV9DSEFMTEVOR0VfQ09VTlQgPSA2OwoKICBmdW5jdGlvbiBwaENoYWxsZW5nZUN5Y2xlS2V5KG5vdyl7CiAgICAvLyBDaHUga+G7syBsw6Agcm9sbGluZyAzMCBwaMO6dCwgYuG6r3QgxJHhuqd1IHThu6sgbOG6p24gxJHhuqd1IGjhu4cgdGjhu5FuZyB04bqhbyBjaHUga+G7syBjaG8gbmfGsOG7nWkgZMO5bmcuCiAgICB2YXIgZCA9IGxvYWREQigpOwogICAgdmFyIHN0YXJ0ID0gTnVtYmVyKGQuY2hhbGxlbmdlQ3ljbGVTdGFydGVkQXQpIHx8IDA7CiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gMDsKICAgIHJldHVybiBNYXRoLmZsb29yKHN0YXJ0IC8gUEhfQ0hBTExFTkdFX0NZQ0xFX01TKTsKICB9CgogIGZ1bmN0aW9uIHBoQ2hhbGxlbmdlQ3VycmVudEN5Y2xlRW5kc0F0KG5vdyl7CiAgICB2YXIgZCA9IGxvYWREQigpOwogICAgdmFyIHN0YXJ0ID0gTnVtYmVyKGQuY2hhbGxlbmdlQ3ljbGVTdGFydGVkQXQpIHx8IDA7CiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gKG5vdyB8fCBEYXRlLm5vdygpKSArIFBIX0NIQUxMRU5HRV9DWUNMRV9NUzsKICAgIHJldHVybiBzdGFydCArIFBIX0NIQUxMRU5HRV9DWUNMRV9NUzsKICB9CgogIGZ1bmN0aW9uIHBoQ2hhbGxlbmdlU25hcHNob3Qocyl7CiAgICByZXR1cm4gewogICAgICBwYWNrczogTnVtYmVyKHMucGFja3MpIHx8IDAsCiAgICAgIHVuaXF1ZTogTnVtYmVyKHMudW5pcXVlKSB8fCAwLAogICAgICBjYXJkczogTnVtYmVyKHMuY2FyZHMpIHx8IDAsCiAgICAgIGhpZ2hUaWVyOiBOdW1iZXIocy5oaWdoVGllcikgfHwgMCwKICAgICAgdGllcjQ6IE51bWJlcihzLnRpZXI0KSB8fCAwLAogICAgICB0aWVyNTogTnVtYmVyKHMudGllcjUpIHx8IDAsCiAgICAgIGNoYXNlOiBOdW1iZXIocy5jaGFzZSkgfHwgMCwKICAgICAgdmFsdWU6IE51bWJlcihzLnZhbHVlKSB8fCAwCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcGhDaGFsbGVuZ2VFbnN1cmVDeWNsZSgpewogICAgdmFyIGQgPSBsb2FkREIoKTsKICAgIHZhciBub3cgPSBEYXRlLm5vdygpOwogICAgdmFyIHN0YXJ0ID0gTnVtYmVyKGQuY2hhbGxlbmdlQ3ljbGVTdGFydGVkQXQpIHx8IDA7CiAgICB2YXIgZXhwaXJlZCA9ICFzdGFydCB8fCAobm93IC0gc3RhcnQgPj0gUEhfQ0hBTExFTkdFX0NZQ0xFX01TKTsKICAgIHZhciBjdXJyZW50ID0gY2hhbGxlbmdlU3RhdHMoKTsKICAgIGlmIChleHBpcmVkIHx8ICFkLmNoYWxsZW5nZUJhc2VsaW5lKXsKICAgICAgZC5jaGFsbGVuZ2VDeWNsZVN0YXJ0ZWRBdCA9IG5vdzsKICAgICAgZC5jaGFsbGVuZ2VDeWNsZSA9IG5vdzsKICAgICAgZC5jaGFsbGVuZ2VCYXNlbGluZSA9IHBoQ2hhbGxlbmdlU25hcHNob3QoY3VycmVudCk7CiAgICAgIGQuY2hhbGxlbmdlQ2xhaW1zID0ge307CiAgICAgIHBoQ2hhbGxlbmdlUGlja0FjdGl2ZShkKTsKICAgICAgc2F2ZURCKCk7CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZC5jaGFsbGVuZ2VBY3RpdmVJZHMpIHx8IGQuY2hhbGxlbmdlQWN0aXZlSWRzLmxlbmd0aCAhPT0gUEhfQUNUSVZFX0NIQUxMRU5HRV9DT1VOVCl7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGQuY2hhbGxlbmdlQWN0aXZlSWRzKSAmJiBkLmNoYWxsZW5nZUFjdGl2ZUlkcy5sZW5ndGggPiBQSF9BQ1RJVkVfQ0hBTExFTkdFX0NPVU5UKSBkLmNoYWxsZW5nZUFjdGl2ZUlkcyA9IFtdOwogICAgICBwaENoYWxsZW5nZVBpY2tBY3RpdmUoZCk7CiAgICAgIGQuY2hhbGxlbmdlQ2xhaW1zID0ge307CiAgICAgIHNhdmVEQigpOwogICAgfQogICAgaWYgKCFkLmNoYWxsZW5nZUNsYWltcyB8fCB0eXBlb2YgZC5jaGFsbGVuZ2VDbGFpbXMgIT09ICdvYmplY3QnKSBkLmNoYWxsZW5nZUNsYWltcyA9IHt9OwogICAgaWYgKCFkLmNoYWxsZW5nZUJhc2VsaW5lIHx8IHR5cGVvZiBkLmNoYWxsZW5nZUJhc2VsaW5lICE9PSAnb2JqZWN0Jyl7CiAgICAgIGQuY2hhbGxlbmdlQmFzZWxpbmUgPSBwaENoYWxsZW5nZVNuYXBzaG90KGN1cnJlbnQpOwogICAgICBzYXZlREIoKTsKICAgIH0KICAgIGlmICghTnVtYmVyLmlzRmluaXRlKE51bWJlcihkLmNoYWxsZW5nZVBvaW50cykpKSBkLmNoYWxsZW5nZVBvaW50cyA9IDA7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShOdW1iZXIoZC5jaGFsbGVuZ2VSZXdhcmRzVG90YWwpKSkgZC5jaGFsbGVuZ2VSZXdhcmRzVG90YWwgPSAwOwogICAgcGhTaG9wTG9hZChkKTsKICAgIHJldHVybiBkOwogIH0KCiAgZnVuY3Rpb24gcGhDaGFsbGVuZ2VDeWNsZVN0YXRzKCl7CiAgICB2YXIgZCA9IHBoQ2hhbGxlbmdlRW5zdXJlQ3ljbGUoKTsKICAgIHZhciBub3cgPSBjaGFsbGVuZ2VTdGF0cygpOwogICAgdmFyIGIgPSBkLmNoYWxsZW5nZUJhc2VsaW5lIHx8IHt9OwogICAgcmV0dXJuIHsKICAgICAgcGFja3M6IE1hdGgubWF4KDAsIChOdW1iZXIobm93LnBhY2tzKXx8MCkgLSAoTnVtYmVyKGIucGFja3MpfHwwKSksCiAgICAgIHVuaXF1ZTogTWF0aC5tYXgoMCwgKE51bWJlcihub3cudW5pcXVlKXx8MCkgLSAoTnVtYmVyKGIudW5pcXVlKXx8MCkpLAogICAgICBjYXJkczogTWF0aC5tYXgoMCwgKE51bWJlcihub3cuY2FyZHMpfHwwKSAtIChOdW1iZXIoYi5jYXJkcyl8fDApKSwKICAgICAgaGlnaFRpZXI6IE1hdGgubWF4KDAsIChOdW1iZXIobm93LmhpZ2hUaWVyKXx8MCkgLSAoTnVtYmVyKGIuaGlnaFRpZXIpfHwwKSksCiAgICAgIHRpZXI0OiBNYXRoLm1heCgwLCAoTnVtYmVyKG5vdy50aWVyNCl8fDApIC0gKE51bWJlcihiLnRpZXI0KXx8MCkpLAogICAgICB0aWVyNTogTWF0aC5tYXgoMCwgKE51bWJlcihub3cudGllcjUpfHwwKSAtIChOdW1iZXIoYi50aWVyNSl8fDApKSwKICAgICAgY2hhc2U6IE1hdGgubWF4KDAsIChOdW1iZXIobm93LmNoYXNlKXx8MCkgLSAoTnVtYmVyKGIuY2hhc2UpfHwwKSksCiAgICAgIHZhbHVlOiBNYXRoLm1heCgwLCAoTnVtYmVyKG5vdy52YWx1ZSl8fDApIC0gKE51bWJlcihiLnZhbHVlKXx8MCkpCiAgICB9OwogIH0KCiAgLyogTmhp4buBdSBuaGnhu4dtIHbhu6UgaMahbiB2w6Aga2jDsyBoxqFuOyBt4buXaSBuaGnhu4dtIHbhu6UgY8OzIHRoxrDhu59uZyDEkWnhu4NtIGzhu5tuLiAqLwogIENIQUxMRU5HRVMgPSBbCiAgICB7IGlkOidjeWNsZS01LXBhY2tzJywgaWNvbjon8J+TpicsIG5hbWU6J0to4bufaSDEkeG7mW5nIHThu5FjIMSR4buZIGNhbycsIGRlc2M6J03hu58gNSBnw7NpIHRyb25nIGNodSBr4buzIDMwIHBow7p0LicsIGdvYWw6NSwgcmV3YXJkOjUwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMucGFja3M7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAogICAgeyBpZDonY3ljbGUtMTUtcGFja3MnLCBpY29uOifwn5qAJywgbmFtZTonQ8OgeSAxNSBnw7NpJywgZGVzYzonTeG7nyAxNSBnw7NpIHRyb25nIG3hu5l0IGNodSBr4buzLicsIGdvYWw6MTUsIHJld2FyZDoxNTAwLCB2YWx1ZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5wYWNrczt9LCBmbXQ6ZnVuY3Rpb24odixnKXtyZXR1cm4gTWF0aC5taW4odixnKSsnLycrZzt9IH0sCiAgICB7IGlkOidjeWNsZS0zMC1wYWNrcycsIGljb246J/CflKUnLCBuYW1lOidNYXJhdGhvbiAzMCBnw7NpJywgZGVzYzonTeG7nyAzMCBnw7NpIHRyb25nIGNodSBr4buzIDMwIHBow7p0LicsIGdvYWw6MzAsIHJld2FyZDo0MDAwLCB2YWx1ZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5wYWNrczt9LCBmbXQ6ZnVuY3Rpb24odixnKXtyZXR1cm4gTWF0aC5taW4odixnKSsnLycrZzt9IH0sCiAgICB7IGlkOidjeWNsZS01MC1wYWNrcycsIGljb246J/Cfj4YnLCBuYW1lOidC4bqtYyB0aOG6p3kgbeG7nyBwYWNrJywgZGVzYzonTeG7nyA1MCBnw7NpIHRyxrDhu5tjIGtoaSBjaHUga+G7syBr4bq/dCB0aMO6Yy4nLCBnb2FsOjUwLCByZXdhcmQ6ODAwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMucGFja3M7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAoKICAgIHsgaWQ6J2N5Y2xlLTIwLXVuaXF1ZScsIGljb246J/Cfk5onLCBuYW1lOidTxrB1IHThuqdtIDIwIGzDoSBt4bubaScsIGRlc2M6J05o4bqtbiAyMCBsw6EgxJHhu5ljIG5o4bqldCB0cm9uZyBjaHUga+G7sy4nLCBnb2FsOjIwLCByZXdhcmQ6MTIwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMudW5pcXVlO30sIGZtdDpmdW5jdGlvbih2LGcpe3JldHVybiBNYXRoLm1pbih2LGcpKycvJytnO30gfSwKICAgIHsgaWQ6J2N5Y2xlLTUwLXVuaXF1ZScsIGljb246J/Cfl4PvuI8nLCBuYW1lOidLaG8gYsOhdSA1MCBsw6EgbeG7m2knLCBkZXNjOidOaOG6rW4gNTAgbMOhIMSR4buZYyBuaOG6pXQgdHJvbmcgY2h1IGvhu7MuJywgZ29hbDo1MCwgcmV3YXJkOjM1MDAsIHZhbHVlOmZ1bmN0aW9uKHMpe3JldHVybiBzLnVuaXF1ZTt9LCBmbXQ6ZnVuY3Rpb24odixnKXtyZXR1cm4gTWF0aC5taW4odixnKSsnLycrZzt9IH0sCiAgICB7IGlkOidjeWNsZS0xMDAtdW5pcXVlJywgaWNvbjon8J+SjicsIG5hbWU6J0Lhu5kgc8awdSB04bqtcCBraOG7lW5nIGzhu5MnLCBkZXNjOidOaOG6rW4gMTAwIGzDoSDEkeG7mWMgbmjhuqV0IHRyb25nIGNodSBr4buzLicsIGdvYWw6MTAwLCByZXdhcmQ6OTAwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMudW5pcXVlO30sIGZtdDpmdW5jdGlvbih2LGcpe3JldHVybiBNYXRoLm1pbih2LGcpKycvJytnO30gfSwKCiAgICB7IGlkOidjeWNsZS01LWhpZ2gnLCBpY29uOifinKgnLCBuYW1lOidTxINuIFVsdHJhIGxpw6puIHThu6VjJywgZGVzYzonUHVsbCA1IGzDoSB04burIFVsdHJhIHRy4bufIGzDqm4gdHJvbmcgY2h1IGvhu7MuJywgZ29hbDo1LCByZXdhcmQ6MTgwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMuaGlnaFRpZXI7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAogICAgeyBpZDonY3ljbGUtMTUtaGlnaCcsIGljb246J/CfjKAnLCBuYW1lOidUaOG7oyBzxINuIGPhu7FjIGhp4bq/bScsIGRlc2M6J1B1bGwgMTUgbMOhIHThu6sgVWx0cmEgdHLhu58gbMOqbiB0cm9uZyBjaHUga+G7sy4nLCBnb2FsOjE1LCByZXdhcmQ6NTAwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMuaGlnaFRpZXI7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAogICAgeyBpZDonY3ljbGUtMi1jaGFzZScsIGljb246J/CfkZEnLCBuYW1lOidEb3VibGUgQ2hhc2UgSHVudGVyJywgZGVzYzonUHVsbCAyIGzDoSBDaGFzZSB0cm9uZyBjw7luZyBjaHUga+G7sy4nLCBnb2FsOjIsIHJld2FyZDo3MDAwLCB2YWx1ZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5jaGFzZTt9LCBmbXQ6ZnVuY3Rpb24odixnKXtyZXR1cm4gTWF0aC5taW4odixnKSsnLycrZzt9IH0sCgogICAgeyBpZDonY3ljbGUtMTAwLWNhcmRzJywgaWNvbjon8J+SrycsIG5hbWU6J0LDo28gdGjhursnLCBkZXNjOidQdWxsIDEwMCBsw6EgdHJvbmcgY2h1IGvhu7MgMzAgcGjDunQuJywgZ29hbDoxMDAsIHJld2FyZDoxNTAwLCB2YWx1ZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5jYXJkczt9LCBmbXQ6ZnVuY3Rpb24odixnKXtyZXR1cm4gTWF0aC5taW4odixnKSsnLycrZzt9IH0sCiAgICB7IGlkOidjeWNsZS0yNTAtY2FyZHMnLCBpY29uOifimqEnLCBuYW1lOidD4buXIG3DoXkgbeG7nyBwYWNrJywgZGVzYzonUHVsbCAyNTAgbMOhIHRyb25nIG3hu5l0IGNodSBr4buzLicsIGdvYWw6MjUwLCByZXdhcmQ6NDUwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMuY2FyZHM7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAogICAgeyBpZDonY3ljbGUtNTAwLWNhcmRzJywgaWNvbjon8J+RuScsIG5hbWU6J1F1w6FpIHbhuq10IHPGsHUgdOG6p20nLCBkZXNjOidQdWxsIDUwMCBsw6EgdHJvbmcgbeG7mXQgY2h1IGvhu7MuJywgZ29hbDo1MDAsIHJld2FyZDoxMDAwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMuY2FyZHM7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAoKICAgIHsgaWQ6J2N5Y2xlLXZhbHVlLTI1JywgaWNvbjon8J+SsCcsIG5hbWU6J0dpw6EgdHLhu4sgcGFjayBiw7luZyBu4buVJywgZGVzYzonVGh1IHbhu4Egw610IG5o4bqldCAkMjUgZ2nDoSB0cuG7iyB0aOG6uyB0cm9uZyBjaHUga+G7sy4nLCBnb2FsOjI1LCByZXdhcmQ6MTgwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMudmFsdWU7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuICckJytNYXRoLm1pbih2LGcpLnRvRml4ZWQoMikrJyAvICQnK2c7fSB9LAogICAgeyBpZDonY3ljbGUtdmFsdWUtNzUnLCBpY29uOifwn5KwJywgbmFtZTonS2hvIGLDoXUgJDc1JywgZGVzYzonVGh1IHbhu4Egw610IG5o4bqldCAkNzUgZ2nDoSB0cuG7iyB0aOG6uyB0cm9uZyBjaHUga+G7sy4nLCBnb2FsOjc1LCByZXdhcmQ6NTUwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMudmFsdWU7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuICckJytNYXRoLm1pbih2LGcpLnRvRml4ZWQoMikrJyAvICQnK2c7fSB9LAogICAgeyBpZDonY3ljbGUtdmFsdWUtMTUwJywgaWNvbjon8J+SsCcsIG5hbWU6J0phY2twb3QgJDE1MCcsIGRlc2M6J1RodSB24buBIMOtdCBuaOG6pXQgJDE1MCBnacOhIHRy4buLIHRo4bq7IHRyb25nIGNodSBr4buzLicsIGdvYWw6MTUwLCByZXdhcmQ6MTIwMDAsIHZhbHVlOmZ1bmN0aW9uKHMpe3JldHVybiBzLnZhbHVlO30sIGZtdDpmdW5jdGlvbih2LGcpe3JldHVybiAnJCcrTWF0aC5taW4odixnKS50b0ZpeGVkKDIpKycgLyAkJytnO30gfSwKCiAgICB7IGlkOidjeWNsZS0zLXRpZXI0JywgaWNvbjon8J+MnycsIG5hbWU6J0JhIHBow6F0IHNpw6p1IGhp4bq/bScsIGRlc2M6J1B1bGwgMyBsw6EgVGllciA0IHRy4bufIGzDqm4gdHJvbmcgY2h1IGvhu7MuJywgZ29hbDozLCByZXdhcmQ6MzAwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMudGllcjQ7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAogICAgeyBpZDonY3ljbGUtMi10aWVyNScsIGljb246J/CfkpwnLCBuYW1lOidIYWkgbMOhIGh1eeG7gW4gdGhv4bqhaScsIGRlc2M6J1B1bGwgMiBsw6EgVGllciA1IHRy4bufIGzDqm4gdHJvbmcgY2h1IGvhu7MuJywgZ29hbDoyLCByZXdhcmQ6NTAwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMudGllcjU7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9LAogICAgeyBpZDonY3ljbGUtMTAtdGllcjQnLCBpY29uOifwn5KlJywgbmFtZTonQ8ahbiBiw6NvIFRpZXIgNCcsIGRlc2M6J1B1bGwgMTAgbMOhIFRpZXIgNCB0cuG7nyBsw6puIHRyb25nIGNodSBr4buzLicsIGdvYWw6MTAsIHJld2FyZDo3NTAwLCB2YWx1ZTpmdW5jdGlvbihzKXtyZXR1cm4gcy50aWVyNDt9LCBmbXQ6ZnVuY3Rpb24odixnKXtyZXR1cm4gTWF0aC5taW4odixnKSsnLycrZzt9IH0sCiAgICB7IGlkOidjeWNsZS0xLWNoYXNlJywgaWNvbjon8J+DjycsIG5hbWU6J1PEg24gQ2hhc2UnLCBkZXNjOidQdWxsIMOtdCBuaOG6pXQgMSBsw6EgQ2hhc2UgdHJvbmcgY2h1IGvhu7MuJywgZ29hbDoxLCByZXdhcmQ6MzUwMCwgdmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHMuY2hhc2U7fSwgZm10OmZ1bmN0aW9uKHYsZyl7cmV0dXJuIE1hdGgubWluKHYsZykrJy8nK2c7fSB9CiAgXTsKICBjaGFsbGVuZ2VTdGF0cyA9IGZ1bmN0aW9uKCl7CiAgICB2YXIgcyA9IGNvbGxlY3Rpb25TdGF0cygpLCBkID0gbG9hZERCKCksIGhpZ2hUaWVyID0gMCwgY2hhc2UgPSAwOwogICAgT2JqZWN0LmtleXMoZC5jYXJkcyB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbihrKXsKICAgICAgdmFyIGUgPSBkLmNhcmRzW2tdLCB0ID0gTnVtYmVyKGUudGllcikgfHwgMCwgbiA9IE51bWJlcihlLm4pIHx8IDA7CiAgICAgIGlmICh0ID49IDMpIGhpZ2hUaWVyICs9IG47CiAgICAgIGlmICh0ID49IDYpIGNoYXNlICs9IG47CiAgICB9KTsKICAgIHMuaGlnaFRpZXIgPSBoaWdoVGllcjsKICAgIHMuY2hhc2UgPSBjaGFzZTsKICAgIHJldHVybiBzOwogIH07CgogIGZ1bmN0aW9uIHBoQ2hhbGxlbmdlUmV3YXJkVGV4dChuKXsKICAgIHJldHVybiAnKycgKyBOdW1iZXIobiB8fCAwKS50b0xvY2FsZVN0cmluZygndmktVk4nKSArICcg4q2QJzsKICB9CgogIGZ1bmN0aW9uIHBoQ2hhbGxlbmdlRm9ybWF0TW9uZXkodil7CiAgICByZXR1cm4gJyQnICsgTnVtYmVyKHYgfHwgMCkudG9GaXhlZCgyKTsKICB9CgogIGZ1bmN0aW9uIHBoQ2hhbGxlbmdlR2V0QWN0aXZlRGVmcyhkKXsKICAgIHZhciBpZHMgPSBBcnJheS5pc0FycmF5KGQuY2hhbGxlbmdlQWN0aXZlSWRzKSA/IGQuY2hhbGxlbmdlQWN0aXZlSWRzIDogW107CiAgICB2YXIgYnlJZCA9IHt9OwogICAgQ0hBTExFTkdFUy5mb3JFYWNoKGZ1bmN0aW9uKGRlZil7IGJ5SWRbZGVmLmlkXSA9IGRlZjsgfSk7CiAgICByZXR1cm4gaWRzLm1hcChmdW5jdGlvbihpZCl7IHJldHVybiBieUlkW2lkXTsgfSkuZmlsdGVyKEJvb2xlYW4pLnNsaWNlKDAsUEhfQUNUSVZFX0NIQUxMRU5HRV9DT1VOVCk7CiAgfQoKICBmdW5jdGlvbiBwaENoYWxsZW5nZVBpY2tBY3RpdmUoZCl7CiAgICB2YXIgcHJldmlvdXMgPSBBcnJheS5pc0FycmF5KGQuY2hhbGxlbmdlQWN0aXZlSWRzKSA/IGQuY2hhbGxlbmdlQWN0aXZlSWRzLnNsaWNlKCkgOiBbXTsKICAgIHZhciBwaWNrZWQgPSBbXTsKCiAgICAvLyBDaOG7jW4gMSBuaGnhu4dtIHbhu6UgdOG7qyBt4buXaSBuaMOzbSDEkeG7gyA2IMO0IGPDsyDEkeG7mSDEkWEgZOG6oW5nOiBt4bufIHBhY2ssIHPGsHUgdOG6p20sCiAgICAvLyBVbHRyYS9DaGFzZSwgc+G7kSBsw6EsIGdpw6EgdHLhu4sgdsOgIFRpZXIgNC81LgogICAgdmFyIGdyb3VwcyA9IFsKICAgICAgL15jeWNsZS1cZCstcGFja3MkLywKICAgICAgL15jeWNsZS1cZCstdW5pcXVlJC8sCiAgICAgIC9eKGN5Y2xlLVxkKy1oaWdofGN5Y2xlLVxkKy1jaGFzZSkkLywKICAgICAgL15jeWNsZS1cZCstY2FyZHMkLywKICAgICAgL15jeWNsZS12YWx1ZS0vLAogICAgICAvXihjeWNsZS1cZCstdGllcjR8Y3ljbGUtXGQrLXRpZXI1KSQvCiAgICBdOwoKICAgIGdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKHJlKXsKICAgICAgdmFyIGNhbmRpZGF0ZXMgPSBDSEFMTEVOR0VTLmZpbHRlcihmdW5jdGlvbihkZWYpewogICAgICAgIHJldHVybiByZS50ZXN0KGRlZi5pZCkgJiYgcHJldmlvdXMuaW5kZXhPZihkZWYuaWQpID09PSAtMSAmJiBwaWNrZWQuZXZlcnkoZnVuY3Rpb24oeCl7IHJldHVybiB4LmlkICE9PSBkZWYuaWQ7IH0pOwogICAgICB9KTsKICAgICAgaWYgKCFjYW5kaWRhdGVzLmxlbmd0aCl7CiAgICAgICAgY2FuZGlkYXRlcyA9IENIQUxMRU5HRVMuZmlsdGVyKGZ1bmN0aW9uKGRlZil7CiAgICAgICAgICByZXR1cm4gcmUudGVzdChkZWYuaWQpICYmIHBpY2tlZC5ldmVyeShmdW5jdGlvbih4KXsgcmV0dXJuIHguaWQgIT09IGRlZi5pZDsgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoKXsKICAgICAgICBwaWNrZWQucHVzaChjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKV0pOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBO4bq/dSBkYW5oIHPDoWNoIG5oaeG7h20gduG7pSBzYXUgbsOgeSB0aGF5IMSR4buVaSwgduG6q24gbHXDtG4gxJHhu6cgNiDDtC4KICAgIHZhciBmYWxsYmFjayA9IENIQUxMRU5HRVMuZmlsdGVyKGZ1bmN0aW9uKGRlZil7CiAgICAgIHJldHVybiBwaWNrZWQuZXZlcnkoZnVuY3Rpb24oeCl7IHJldHVybiB4LmlkICE9PSBkZWYuaWQ7IH0pOwogICAgfSk7CiAgICB3aGlsZSAoZmFsbGJhY2subGVuZ3RoICYmIHBpY2tlZC5sZW5ndGggPCBQSF9BQ1RJVkVfQ0hBTExFTkdFX0NPVU5UKXsKICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmYWxsYmFjay5sZW5ndGgpOwogICAgICBwaWNrZWQucHVzaChmYWxsYmFjay5zcGxpY2UoaiwxKVswXSk7CiAgICB9CgogICAgZC5jaGFsbGVuZ2VQcmV2aW91c0lkcyA9IHByZXZpb3VzOwogICAgZC5jaGFsbGVuZ2VBY3RpdmVJZHMgPSBwaWNrZWQubWFwKGZ1bmN0aW9uKGRlZil7IHJldHVybiBkZWYuaWQ7IH0pLnNsaWNlKDAsIFBIX0FDVElWRV9DSEFMTEVOR0VfQ09VTlQpOwogIH0KCiAgZnVuY3Rpb24gcGhDaGFsbGVuZ2VTeW5jUmV3YXJkcygpewogICAgdmFyIGQgPSBwaENoYWxsZW5nZUVuc3VyZUN5Y2xlKCk7CiAgICB2YXIgcyA9IHBoQ2hhbGxlbmdlQ3ljbGVTdGF0cygpOwogICAgdmFyIGVhcm5lZE5vdyA9IDA7CiAgICBwaENoYWxsZW5nZUdldEFjdGl2ZURlZnMoZCkuZm9yRWFjaChmdW5jdGlvbihkZWYpewogICAgICB2YXIgZG9uZSA9IGNoYWxsZW5nZUNvbXBsZXRlZChkZWYsIHMpOwogICAgICBpZiAoZG9uZSAmJiAhZC5jaGFsbGVuZ2VDbGFpbXNbZGVmLmlkXSl7CiAgICAgICAgZC5jaGFsbGVuZ2VDbGFpbXNbZGVmLmlkXSA9IERhdGUubm93KCk7CiAgICAgICAgZC5jaGFsbGVuZ2VzW2RlZi5pZF0gPSBEYXRlLm5vdygpOwogICAgICAgIHZhciByZXdhcmQgPSBNYXRoLm1heCgwLCBOdW1iZXIoZGVmLnJld2FyZCkgfHwgMCk7CiAgICAgICAgZC5jaGFsbGVuZ2VQb2ludHMgKz0gcmV3YXJkOwogICAgICAgIGQuY2hhbGxlbmdlUmV3YXJkc1RvdGFsICs9IHJld2FyZDsKICAgICAgICBlYXJuZWROb3cgKz0gcmV3YXJkOwogICAgICB9CiAgICB9KTsKICAgIGlmIChlYXJuZWROb3cgPiAwKXsKICAgICAgc2F2ZURCKCk7CiAgICAgIGlmIChlbHMudG9hc3QpIHRvYXN0KCfwn46JIEhvw6BuIHRow6BuaCBuaGnhu4dtIHbhu6UhICsnICsgZWFybmVkTm93LnRvTG9jYWxlU3RyaW5nKCd2aS1WTicpICsgJyDirZAgxJFp4buDbSB0aMaw4bufbmcnKTsKICAgIH0gZWxzZSB7CiAgICAgIHNhdmVEQigpOwogICAgfQogICAgcmV0dXJuIGQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGFsbGVuZ2VCYWRnZSgpewogICAgaWYgKCFlbHMuY2hhbGxlbmdlQ291bnQgfHwgIWVscy5jaGFsbGVuZ2VCdG4pIHJldHVybjsKICAgIHZhciBkID0gcGhDaGFsbGVuZ2VTeW5jUmV3YXJkcygpOwogICAgdmFyIHMgPSBwaENoYWxsZW5nZUN5Y2xlU3RhdHMoKSwgZG9uZSA9IDA7CiAgICBwaENoYWxsZW5nZUdldEFjdGl2ZURlZnMoZCkuZm9yRWFjaChmdW5jdGlvbihkZWYpewogICAgICBpZiAoY2hhbGxlbmdlQ29tcGxldGVkKGRlZiwgcykpIGRvbmUrKzsKICAgIH0pOwogICAgZWxzLmNoYWxsZW5nZUNvdW50LnRleHRDb250ZW50ID0gZG9uZSArICcvJyArIFBIX0FDVElWRV9DSEFMTEVOR0VfQ09VTlQ7CiAgICBlbHMuY2hhbGxlbmdlQ291bnQuaGlkZGVuID0gZmFsc2U7CiAgICBpZiAoZWxzLmNoYWxsZW5nZUJ0bikgZWxzLmNoYWxsZW5nZUJ0bi50aXRsZSA9ICdOaGnhu4dtIHbhu6UgbeG7m2kgc2F1ICcgKyBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKHBoQ2hhbGxlbmdlQ3VycmVudEN5Y2xlRW5kc0F0KCkgLSBEYXRlLm5vdygpKS8xMDAwKSkgKyAnIGdpw6J5JzsKICAgIHVwZGF0ZVNob3BCYWRnZSgpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU2hvcEJhZGdlKCl7CiAgICBpZiAoIWVscy5zaG9wUG9pbnRzQmFkZ2UgfHwgIWVscy5zaG9wQnRuKSByZXR1cm47CiAgICB2YXIgZCA9IGxvYWREQigpOwogICAgdmFyIHB0cyA9IE1hdGgubWF4KDAsIE51bWJlcihkLmNoYWxsZW5nZVBvaW50cykgfHwgMCk7CiAgICBlbHMuc2hvcFBvaW50c0JhZGdlLnRleHRDb250ZW50ID0gcHRzLnRvTG9jYWxlU3RyaW5nKCd2aS1WTicpOwogICAgZWxzLnNob3BQb2ludHNCYWRnZS5oaWRkZW4gPSBmYWxzZTsKICAgIGVscy5zaG9wQnRuLnRpdGxlID0gJ0LhuqFuIGPDsyAnICsgcHRzLnRvTG9jYWxlU3RyaW5nKCd2aS1WTicpICsgJyDirZAgxJFp4buDbSB0aMaw4bufbmcnOwogIH0KCiAgZnVuY3Rpb24gcGhDaGFsbGVuZ2VDb3VudGRvd25UZXh0KCl7CiAgICB2YXIgbGVmdCA9IE1hdGgubWF4KDAsIHBoQ2hhbGxlbmdlQ3VycmVudEN5Y2xlRW5kc0F0KCkgLSBEYXRlLm5vdygpKTsKICAgIHZhciB0b3RhbFNlYyA9IE1hdGguZmxvb3IobGVmdCAvIDEwMDApOwogICAgdmFyIG1pbiA9IE1hdGguZmxvb3IodG90YWxTZWMgLyA2MCk7CiAgICB2YXIgc2VjID0gdG90YWxTZWMgJSA2MDsKICAgIHJldHVybiBTdHJpbmcobWluKS5wYWRTdGFydCgyLCcwJykgKyAnOicgKyBTdHJpbmcoc2VjKS5wYWRTdGFydCgyLCcwJyk7CiAgfQoKICBmdW5jdGlvbiBwaENoYWxsZW5nZVN0YXJ0Q291bnRkb3duKCl7CiAgICBpZiAocGhDaGFsbGVuZ2VSZWZyZXNoVGltZXIpIGNsZWFySW50ZXJ2YWwocGhDaGFsbGVuZ2VSZWZyZXNoVGltZXIpOwogICAgcGhDaGFsbGVuZ2VSZWZyZXNoVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaC1jaGFsbGVuZ2UtY291bnRkb3duJyk7CiAgICAgIGlmIChub2RlKSBub2RlLnRleHRDb250ZW50ID0gcGhDaGFsbGVuZ2VDb3VudGRvd25UZXh0KCk7CiAgICAgIHZhciBlbmQgPSBwaENoYWxsZW5nZUN1cnJlbnRDeWNsZUVuZHNBdCgpOwogICAgICBpZiAoRGF0ZS5ub3coKSA+PSBlbmQpewogICAgICAgIHBoQ2hhbGxlbmdlRW5zdXJlQ3ljbGUoKTsKICAgICAgICB1cGRhdGVDaGFsbGVuZ2VCYWRnZSgpOwogICAgICAgIGlmIChlbHMuY2hhbGxlbmdlTW9kYWwgJiYgIWVscy5jaGFsbGVuZ2VNb2RhbC5oaWRkZW4pIHJlbmRlckNoYWxsZW5nZXMoKTsKICAgICAgfQogICAgfSwgMTAwMCk7CiAgfQoKICBmdW5jdGlvbiBwaENoYWxsZW5nZVN0b3BDb3VudGRvd24oKXsKICAgIGlmIChwaENoYWxsZW5nZVJlZnJlc2hUaW1lcil7CiAgICAgIGNsZWFySW50ZXJ2YWwocGhDaGFsbGVuZ2VSZWZyZXNoVGltZXIpOwogICAgICBwaENoYWxsZW5nZVJlZnJlc2hUaW1lciA9IG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjaGFsbGVuZ2VDYXJkKGRlZiwgcywgZCl7CiAgICB2YXIgdmFsdWUgPSBNYXRoLm1heCgwLCBOdW1iZXIoZGVmLnZhbHVlKHMpKSB8fCAwKTsKICAgIHZhciBkb25lID0gY2hhbGxlbmdlQ29tcGxldGVkKGRlZiwgcyk7CiAgICB2YXIgcGVyY2VudCA9IGRlZi5nb2FsID4gMCA/IE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCh2YWx1ZSAvIGRlZi5nb2FsICogMTAwKSkgOiAxMDA7CgogICAgdmFyIGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1pdGVtJyArIChkb25lID8gJyBwaC1kb25lJyA6ICcnKTsKCiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBoZWFkLmNsYXNzTmFtZSA9ICdwaC1jaGFsbGVuZ2UtaGVhZCc7CiAgICB2YXIgbGVmdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbmFtZS5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLW5hbWUnOyBuYW1lLnRleHRDb250ZW50ID0gZGVmLmljb24gKyAnICcgKyBkZWYubmFtZTsKICAgIHZhciBkZXNjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGRlc2MuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1kZXNjJzsgZGVzYy50ZXh0Q29udGVudCA9IGRlZi5kZXNjOwogICAgbGVmdC5hcHBlbmRDaGlsZChuYW1lKTsgbGVmdC5hcHBlbmRDaGlsZChkZXNjKTsKCiAgICB2YXIgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICBiYWRnZS5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLXN0YXR1cycgKyAoZG9uZSA/ICcgcGgtY2hhbGxlbmdlLWRvbmUnIDogJycpOwogICAgYmFkZ2UudGV4dENvbnRlbnQgPSBkb25lID8gJ+KckyBIb8OgbiB0aMOgbmgnIDogJ8SQYW5nIGzDoG0nOwogICAgaGVhZC5hcHBlbmRDaGlsZChsZWZ0KTsgaGVhZC5hcHBlbmRDaGlsZChiYWRnZSk7IGl0ZW0uYXBwZW5kQ2hpbGQoaGVhZCk7CgogICAgdmFyIHByb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgcHJvZy5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLXByb2dyZXNzJzsKICAgIHZhciB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgdHJhY2suY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS10cmFjayc7CiAgICB2YXIgZmlsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgZmlsbC5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLWZpbGwnOwogICAgZmlsbC5zdHlsZS53aWR0aCA9IHBlcmNlbnQgKyAnJSc7IHRyYWNrLmFwcGVuZENoaWxkKGZpbGwpOwogICAgdmFyIG1ldGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IG1ldGEuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1tZXRhJzsgbWV0YS50ZXh0Q29udGVudCA9IGRlZi5mbXQodmFsdWUsIGRlZi5nb2FsKTsKICAgIHByb2cuYXBwZW5kQ2hpbGQodHJhY2spOyBwcm9nLmFwcGVuZENoaWxkKG1ldGEpOyBpdGVtLmFwcGVuZENoaWxkKHByb2cpOwoKICAgIHZhciBmb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGZvb3QuY2xhc3NOYW1lID0gJ3BoLWNoYWxsZW5nZS1mb290JzsKICAgIHZhciByZXdhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IHJld2FyZC5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLXJld2FyZCc7CiAgICByZXdhcmQudGV4dENvbnRlbnQgPSAn8J+OgSBUaMaw4bufbmc6ICcgKyBwaENoYWxsZW5nZVJld2FyZFRleHQoZGVmLnJld2FyZCk7CiAgICBmb290LmFwcGVuZENoaWxkKHJld2FyZCk7CgogICAgaWYgKGRvbmUpewogICAgICB2YXIgd2hlbiA9IGQuY2hhbGxlbmdlQ2xhaW1zICYmIGQuY2hhbGxlbmdlQ2xhaW1zW2RlZi5pZF0gPyBuZXcgRGF0ZShkLmNoYWxsZW5nZUNsYWltc1tkZWYuaWRdKSA6IG51bGw7CiAgICAgIHZhciBzdGF0dXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IHN0YXR1cy5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLWNvbXBsZXRlLXRpbWUnOwogICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSB3aGVuID8gJyDCtyBOaOG6rW4gbMO6YyAnICsgd2hlbi50b0xvY2FsZVRpbWVTdHJpbmcoJ3ZpLVZOJywge2hvdXI6JzItZGlnaXQnLCBtaW51dGU6JzItZGlnaXQnfSkgOiAnJzsKICAgICAgZm9vdC5hcHBlbmRDaGlsZChzdGF0dXMpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHByb2dyZXNzVHh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBwcm9ncmVzc1R4dC50ZXh0Q29udGVudCA9ICcgwrcgVGnhur9uIMSR4buZOiAnICsgcGVyY2VudCArICclJzsKICAgICAgZm9vdC5hcHBlbmRDaGlsZChwcm9ncmVzc1R4dCk7CiAgICB9CiAgICBpdGVtLmFwcGVuZENoaWxkKGZvb3QpOwoKICAgIHJldHVybiBpdGVtOwogIH0KCiAgZnVuY3Rpb24gcGhTaG9wSXRlbShpY29uLCBuYW1lLCBkZXNjLCBrZXksIGNvc3QpewogICAgdmFyIGQgPSBsb2FkREIoKSwgaW52ID0gcGhTaG9wTG9hZChkKTsKICAgIHZhciBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGl0ZW0uY2xhc3NOYW1lID0gJ3BoLXNob3AtaXRlbSc7CiAgICB2YXIgbWFpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBtYWluLmNsYXNzTmFtZSA9ICdwaC1zaG9wLW1haW4nOwogICAgdmFyIHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHRpdGxlLmNsYXNzTmFtZSA9ICdwaC1zaG9wLW5hbWUnOyB0aXRsZS50ZXh0Q29udGVudCA9IGljb24gKyAnICcgKyBuYW1lOwogICAgdmFyIHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgdGV4dC5jbGFzc05hbWUgPSAncGgtc2hvcC1kZXNjJzsgdGV4dC50ZXh0Q29udGVudCA9IGRlc2M7CiAgICB2YXIgc3RvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgc3RvY2suY2xhc3NOYW1lID0gJ3BoLXNob3Atc3RvY2snOyBzdG9jay50ZXh0Q29udGVudCA9ICdUcm9uZyBraG86ICcgKyBOdW1iZXIoaW52W2tleV0gfHwgMCk7CiAgICBtYWluLmFwcGVuZENoaWxkKHRpdGxlKTsgbWFpbi5hcHBlbmRDaGlsZCh0ZXh0KTsgbWFpbi5hcHBlbmRDaGlsZChzdG9jayk7CiAgICB2YXIgc2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBzaWRlLmNsYXNzTmFtZSA9ICdwaC1zaG9wLXNpZGUnOwogICAgdmFyIHByaWNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHByaWNlLmNsYXNzTmFtZSA9ICdwaC1zaG9wLXByaWNlJzsgcHJpY2UudGV4dENvbnRlbnQgPSBOdW1iZXIoY29zdCkudG9Mb2NhbGVTdHJpbmcoJ3ZpLVZOJykgKyAnIOKtkCc7CiAgICB2YXIgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IGJ0bi50eXBlID0gJ2J1dHRvbic7IGJ0bi5jbGFzc05hbWUgPSAncGgtYnRuIHBoLXNtYWxsIHBoLXNob3AtYnV5JzsgYnRuLnRleHRDb250ZW50ID0gJ8SQ4buVaSc7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpeyBwaFNob3BCdXkoa2V5LCBjb3N0LCBuYW1lKTsgfSk7CiAgICBzaWRlLmFwcGVuZENoaWxkKHByaWNlKTsgc2lkZS5hcHBlbmRDaGlsZChidG4pOwogICAgaXRlbS5hcHBlbmRDaGlsZChtYWluKTsgaXRlbS5hcHBlbmRDaGlsZChzaWRlKTsKICAgIHJldHVybiBpdGVtOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyU2hvcChkKXsKICAgIHZhciBzZWMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgc2VjLmNsYXNzTmFtZSA9ICdwaC1zaG9wLXNlY3Rpb24nOwogICAgdmFyIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaGVhZC5jbGFzc05hbWUgPSAncGgtc2hvcC1oZWFkJzsKICAgIHZhciB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyB0aXRsZS5jbGFzc05hbWUgPSAncGgtbW9kYWwtc2VjdGlvbi10aXRsZSc7IHRpdGxlLnRleHRDb250ZW50ID0gJ/CfjoEgQ+G7rWEgaMOgbmcgxJHhu5VpIHRoxrDhu59uZyc7CiAgICB2YXIgcHRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBwdHMuY2xhc3NOYW1lID0gJ3BoLXNob3AtcG9pbnRzJzsgcHRzLnRleHRDb250ZW50ID0gTnVtYmVyKGQuY2hhbGxlbmdlUG9pbnRzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCd2aS1WTicpICsgJyDirZAnOwogICAgaGVhZC5hcHBlbmRDaGlsZCh0aXRsZSk7IGhlYWQuYXBwZW5kQ2hpbGQocHRzKTsgc2VjLmFwcGVuZENoaWxkKGhlYWQpOwogICAgdmFyIG5vdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbm90ZS5jbGFzc05hbWUgPSAncGgtc2hvcC1ub3RlJzsgbm90ZS50ZXh0Q29udGVudCA9ICfEkOG7lWkg4q2QIGzhuqV5IHbhuq10IHBo4bqpbS4gVuG6rXQgcGjhuqltIHRyb25nIEtobyBz4bq9IHThu7EgxJHhu5luZyDEkcaw4bujYyBkw7luZyBjaG8gaMOgbmggxJHhu5luZyBt4bufIHBhY2sgdGnhur9wIHRoZW8uJzsgc2VjLmFwcGVuZENoaWxkKG5vdGUpOwogICAgdmFyIGdyaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZ3JpZC5jbGFzc05hbWUgPSAncGgtc2hvcC1ncmlkJzsKICAgIGdyaWQuYXBwZW5kQ2hpbGQocGhTaG9wSXRlbSgn8J+On++4jycsJ0x1Y2t5IFRpY2tldCcsJ1TEg25nIHgzIHRy4buNbmcgc+G7kSBjw6FjIHRpZXIgMysgY2hvIGzhuqduIG3hu58gcGFjayB0aeG6v3AgdGhlby4nLCdsdWNreScsMTAwMCkpOwogICAgZ3JpZC5hcHBlbmRDaGlsZChwaFNob3BJdGVtKCfwn5KOJywnUmFyZSBCb29zdGVyJywnVMSDbmcgeDIgdHLhu41uZyBz4buRIGPDoWMgdGllciAzKyBjaG8gbOG6p24gbeG7nyBwYWNrIHRp4bq/cCB0aGVvLicsJ3JhcmUnLDMwMDApKTsKICAgIGdyaWQuYXBwZW5kQ2hpbGQocGhTaG9wSXRlbSgn8J+RkScsJ0Nyb3duIFRpY2tldCcsJ0Phu5EgZ+G6r25nIGLhuqNvIMSR4bqjbSAxIGzDoSBUaWVyIDQrIHRyb25nIGzhuqduIG3hu58gcGFjayB0aeG6v3AgdGhlby4nLCdjcm93bicsODAwMCkpOwoKICAgIHZhciBjYXJkSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjYXJkSXRlbS5jbGFzc05hbWUgPSAncGgtc2hvcC1pdGVtJzsKICAgIHZhciBjYXJkTWFpbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjYXJkTWFpbi5jbGFzc05hbWUgPSAncGgtc2hvcC1tYWluJzsKICAgIHZhciBjYXJkVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgY2FyZFRpdGxlLmNsYXNzTmFtZSA9ICdwaC1zaG9wLW5hbWUnOyBjYXJkVGl0bGUudGV4dENvbnRlbnQgPSAn8J+OtCDEkOG7lWkgMSBsw6EgYsOgaSc7CiAgICB2YXIgY2FyZERlc2MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgY2FyZERlc2MuY2xhc3NOYW1lID0gJ3BoLXNob3AtZGVzYyc7IGNhcmREZXNjLnRleHRDb250ZW50ID0gJ8SQ4buVaSDirZAgxJHhu4Mgbmjhuq1uIG5n4bqrdSBuaGnDqm4gMSBsw6EgdHJvbmcgYuG7mSB0aOG6uyDEkWFuZyBjaOG7jW4uIEzDoSBuaOG6rW4gxJHGsOG7o2Mgc+G6vSB2w6BvIELhu5kgc8awdSB04bqtcC4nOwogICAgdmFyIGNhcmRTdG9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjYXJkU3RvY2suY2xhc3NOYW1lID0gJ3BoLXNob3Atc3RvY2snOyBjYXJkU3RvY2sudGV4dENvbnRlbnQgPSAnTmjhuq1uIHRy4buxYyB0aeG6v3Agwrcga2jDtG5nIHF1YSBLaG8nOwogICAgY2FyZE1haW4uYXBwZW5kQ2hpbGQoY2FyZFRpdGxlKTsgY2FyZE1haW4uYXBwZW5kQ2hpbGQoY2FyZERlc2MpOyBjYXJkTWFpbi5hcHBlbmRDaGlsZChjYXJkU3RvY2spOwoKICAgIHZhciBjYXJkU2lkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjYXJkU2lkZS5jbGFzc05hbWUgPSAncGgtc2hvcC1zaWRlJzsKICAgIHZhciBjYXJkUHJpY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgY2FyZFByaWNlLmNsYXNzTmFtZSA9ICdwaC1zaG9wLXByaWNlJzsgY2FyZFByaWNlLnRleHRDb250ZW50ID0gJzMwMDAg4q2QJzsKICAgIHZhciBjYXJkQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IGNhcmRCdG4udHlwZSA9ICdidXR0b24nOyBjYXJkQnRuLmNsYXNzTmFtZSA9ICdwaC1idG4gcGgtc21hbGwgcGgtc2hvcC1idXknOyBjYXJkQnRuLnRleHRDb250ZW50ID0gJ8SQ4buVaSc7CiAgICBjYXJkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgY2FyZEJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgIHZhciByZXN1bHQgPSBwaFNob3BCdXlDYXJkKDMwMDAsICcxIGzDoSBiw6BpJyk7CiAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKXsKICAgICAgICByZXN1bHQudGhlbihmdW5jdGlvbigpeyBjYXJkQnRuLmRpc2FibGVkID0gZmFsc2U7IH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNhcmRCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgfQogICAgfSk7CiAgICBjYXJkU2lkZS5hcHBlbmRDaGlsZChjYXJkUHJpY2UpOyBjYXJkU2lkZS5hcHBlbmRDaGlsZChjYXJkQnRuKTsKICAgIGNhcmRJdGVtLmFwcGVuZENoaWxkKGNhcmRNYWluKTsgY2FyZEl0ZW0uYXBwZW5kQ2hpbGQoY2FyZFNpZGUpOwogICAgZ3JpZC5hcHBlbmRDaGlsZChjYXJkSXRlbSk7CiAgICBzZWMuYXBwZW5kQ2hpbGQoZ3JpZCk7CiAgICB2YXIgaW52VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaW52VGl0bGUuY2xhc3NOYW1lID0gJ3BoLXNob3AtaW52ZW50b3J5LXRpdGxlJzsgaW52VGl0bGUudGV4dENvbnRlbnQgPSAn8J+TpiBLaG8gduG6rXQgcGjhuqltJzsgc2VjLmFwcGVuZENoaWxkKGludlRpdGxlKTsKICAgIHZhciBpbnYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaW52LmNsYXNzTmFtZSA9ICdwaC1zaG9wLWludmVudG9yeSc7CiAgICB2YXIgaW52ZW50b3J5ID0gcGhTaG9wTG9hZChkKTsKICAgIGludi5pbm5lckhUTUwgPSAnPHNwYW4+8J+On++4jyBMdWNreSBUaWNrZXQgw5cgJyArIE51bWJlcihpbnZlbnRvcnkubHVja3l8fDApICsgJzwvc3Bhbj48c3Bhbj7wn5KOIFJhcmUgQm9vc3RlciDDlyAnICsgTnVtYmVyKGludmVudG9yeS5yYXJlfHwwKSArICc8L3NwYW4+PHNwYW4+8J+RkSBDcm93biBUaWNrZXQgw5cgJyArIE51bWJlcihpbnZlbnRvcnkuY3Jvd258fDApICsgJzwvc3Bhbj4nOwogICAgc2VjLmFwcGVuZENoaWxkKGludik7CiAgICByZXR1cm4gc2VjOwogIH0KCiAgcmVuZGVyQ2hhbGxlbmdlcyA9IGZ1bmN0aW9uKCl7CiAgICBpZiAoIWVscy5jaGFsbGVuZ2VCb2R5KSByZXR1cm47CiAgICB2YXIgZCA9IHBoQ2hhbGxlbmdlU3luY1Jld2FyZHMoKTsKICAgIHZhciBzID0gcGhDaGFsbGVuZ2VDeWNsZVN0YXRzKCk7CiAgICB2YXIgYWN0aXZlID0gcGhDaGFsbGVuZ2VHZXRBY3RpdmVEZWZzKGQpOwogICAgZWxzLmNoYWxsZW5nZUJvZHkudGV4dENvbnRlbnQgPSAnJzsKCiAgICB2YXIgcmVmcmVzaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcmVmcmVzaC5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLXJlZnJlc2gnOwogICAgcmVmcmVzaC5pbm5lckhUTUwgPSAnPHNwYW4+8J+UhCBOaGnhu4dtIHbhu6UgdOG7sSBsw6BtIG3hu5tpIG3hu5dpIDMwIHBow7p0PC9zcGFuPjxiIGlkPSJwaC1jaGFsbGVuZ2UtY291bnRkb3duIj4nICsgcGhDaGFsbGVuZ2VDb3VudGRvd25UZXh0KCkgKyAnPC9iPic7CiAgICBlbHMuY2hhbGxlbmdlQm9keS5hcHBlbmRDaGlsZChyZWZyZXNoKTsKCiAgICB2YXIgaGVybyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBoZXJvLmNsYXNzTmFtZSA9ICdwaC1jaGFsbGVuZ2UtaGVybyc7CiAgICBoZXJvLmFwcGVuZENoaWxkKHN0YXRCb3goJ0fDs2kgxJHDoyBt4bufJywgU3RyaW5nKHMucGFja3MpKSk7CiAgICBoZXJvLmFwcGVuZENoaWxkKHN0YXRCb3goJ0zDoSDEkeG7mWMgbmjhuqV0JywgU3RyaW5nKHMudW5pcXVlKSkpOwogICAgaGVyby5hcHBlbmRDaGlsZChzdGF0Qm94KCfirZAgxJBp4buDbSB0aMaw4bufbmcnLCBOdW1iZXIoZC5jaGFsbGVuZ2VQb2ludHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoJ3ZpLVZOJykpKTsKICAgIGVscy5jaGFsbGVuZ2VCb2R5LmFwcGVuZENoaWxkKGhlcm8pOwoKICAgIHZhciBub3RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBub3RlLmNsYXNzTmFtZSA9ICdwaC1jaGFsbGVuZ2UtY3ljbGUtbm90ZSc7CiAgICBub3RlLnRleHRDb250ZW50ID0gJ0NodSBr4buzIGhp4buHbiB04bqhaTogJyArIG5ldyBEYXRlKE51bWJlcihkLmNoYWxsZW5nZUN5Y2xlU3RhcnRlZEF0IHx8IERhdGUubm93KCkpKS50b0xvY2FsZVRpbWVTdHJpbmcoJ3ZpLVZOJywge2hvdXI6JzItZGlnaXQnLCBtaW51dGU6JzItZGlnaXQnfSkgKyAnIOKGkiAnICsgbmV3IERhdGUocGhDaGFsbGVuZ2VDdXJyZW50Q3ljbGVFbmRzQXQoKSkudG9Mb2NhbGVUaW1lU3RyaW5nKCd2aS1WTicsIHtob3VyOicyLWRpZ2l0JywgbWludXRlOicyLWRpZ2l0J30pOwogICAgZWxzLmNoYWxsZW5nZUJvZHkuYXBwZW5kQ2hpbGQobm90ZSk7CgogICAgdmFyIGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgbGlzdC5jbGFzc05hbWUgPSAncGgtY2hhbGxlbmdlLWxpc3QnOwogICAgYWN0aXZlLmZvckVhY2goZnVuY3Rpb24oZGVmKXsgbGlzdC5hcHBlbmRDaGlsZChjaGFsbGVuZ2VDYXJkKGRlZiwgcywgZCkpOyB9KTsKICAgIGVscy5jaGFsbGVuZ2VCb2R5LmFwcGVuZENoaWxkKGxpc3QpOwoKICAgIHBoQ2hhbGxlbmdlU3RhcnRDb3VudGRvd24oKTsKICB9OwoKICBmdW5jdGlvbiBwaENoYWxsZW5nZU9wZW5FbmhhbmNlZCgpewogICAgcmVuZGVyQ2hhbGxlbmdlcygpOwogICAgZWxzLmNoYWxsZW5nZU1vZGFsLmhpZGRlbiA9IGZhbHNlOwogICAgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7CiAgICBwaENoYWxsZW5nZVN0YXJ0Q291bnRkb3duKCk7CiAgfQoKICBmdW5jdGlvbiBwaENoYWxsZW5nZUNsb3NlRW5oYW5jZWQoKXsKICAgIGVscy5jaGFsbGVuZ2VNb2RhbC5oaWRkZW4gPSB0cnVlOwogICAgZWxzLmNoYWxsZW5nZUJvZHkudGV4dENvbnRlbnQgPSAnJzsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKGZhbHNlKTsKICAgIHBoQ2hhbGxlbmdlU3RvcENvdW50ZG93bigpOwogIH0KCiAgZnVuY3Rpb24gcmVuZGVyRXh0ZXJuYWxTaG9wKCl7CiAgICBpZiAoIWVscy5zaG9wQm9keSkgcmV0dXJuOwogICAgdmFyIGQgPSBwaENoYWxsZW5nZVN5bmNSZXdhcmRzKCk7CiAgICBlbHMuc2hvcEJvZHkudGV4dENvbnRlbnQgPSAnJzsKCiAgICB2YXIgYmFsYW5jZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYmFsYW5jZS5jbGFzc05hbWUgPSAncGgtc2hvcC1vdXRzaWRlLWJhbGFuY2UnOwogICAgYmFsYW5jZS5pbm5lckhUTUwgPSAnPHNwYW4+4q2QIMSQaeG7g20gdGjGsOG7n25nIGhp4buHbiBjw7M8L3NwYW4+PGI+JyArIE51bWJlcihkLmNoYWxsZW5nZVBvaW50cyB8fCAwKS50b0xvY2FsZVN0cmluZygndmktVk4nKSArICc8L2I+JzsKICAgIGVscy5zaG9wQm9keS5hcHBlbmRDaGlsZChiYWxhbmNlKTsKICAgIGVscy5zaG9wQm9keS5hcHBlbmRDaGlsZChyZW5kZXJTaG9wKGQpKTsKICB9CgogIGZ1bmN0aW9uIHBoU2hvcE9wZW5FeHRlcm5hbCgpewogICAgcmVuZGVyRXh0ZXJuYWxTaG9wKCk7CiAgICBlbHMuc2hvcE1vZGFsLmhpZGRlbiA9IGZhbHNlOwogICAgc2V0TW9kYWxWaWV3cG9ydE9wZW4odHJ1ZSk7CiAgfQoKICBmdW5jdGlvbiBwaFNob3BDbG9zZUV4dGVybmFsKCl7CiAgICBlbHMuc2hvcE1vZGFsLmhpZGRlbiA9IHRydWU7CiAgICBlbHMuc2hvcEJvZHkudGV4dENvbnRlbnQgPSAnJzsKICAgIHNldE1vZGFsVmlld3BvcnRPcGVuKGZhbHNlKTsKICB9CgogIGVscy5jaGFsbGVuZ2VCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuQ2hhbGxlbmdlTW9kYWwpOwogIGVscy5jaGFsbGVuZ2VDbG9zZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQ2hhbGxlbmdlTW9kYWwpOwogIGVscy5jaGFsbGVuZ2VCYWNrZHJvcC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQ2hhbGxlbmdlTW9kYWwpOwogIGVscy5jaGFsbGVuZ2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwaENoYWxsZW5nZU9wZW5FbmhhbmNlZCk7CiAgZWxzLmNoYWxsZW5nZUNsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcGhDaGFsbGVuZ2VDbG9zZUVuaGFuY2VkKTsKICBlbHMuY2hhbGxlbmdlQmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwaENoYWxsZW5nZUNsb3NlRW5oYW5jZWQpOwoKICBlbHMuc2hvcEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHBoU2hvcE9wZW5FeHRlcm5hbCk7CiAgZWxzLnNob3BDbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHBoU2hvcENsb3NlRXh0ZXJuYWwpOwogIGVscy5zaG9wQmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwaFNob3BDbG9zZUV4dGVybmFsKTsKCiAgLyogS2jhu59pIHThuqFvIGNodSBr4buzIG5nYXkga2hpIHdpZGdldCBjaOG6oXk7IGtow7RuZyBsw6BtIHRoYXkgxJHhu5VpIGThu68gbGnhu4d1IGNvbGxlY3Rpb24gY8WpLiAqLwogIHBoQ2hhbGxlbmdlRW5zdXJlQ3ljbGUoKTsKICBwaENoYWxsZW5nZVN5bmNSZXdhcmRzKCk7CgogIHVwZGF0ZUNoYWxsZW5nZUJhZGdlKCk7CiAgdXBkYXRlU2hvcEJhZGdlKCk7CiAgcGhTZXR1cFRyYWluZXJBbmRMZWFkZXJib2FyZCgpOwogIGVuc3VyZVBhY2tWaXN1YWwoKTsKICBsb2FkRXhwYW5zaW9ucygpOwp9KSgpOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEFERC1PTjogRGFpbHkgTWlzc2lvbiArIDctRGF5IFN0cmVhayArIERhaWx5IEJvbnVzIFBhY2sKICAgQXBwZW5kZWQgYWZ0ZXIgdGhlIG9yaWdpbmFsIGNvZGU7IG9yaWdpbmFsIGZ1bmN0aW9ucyByZW1haW4gdW50b3VjaGVkLgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKGZ1bmN0aW9uKCl7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBQb2tlSHViIERhaWx5IEh1YiBBZGQtb24gdjEKICAgICAtIEtow7RuZyB0aGF5IMSR4buVaSBow6BtIGfhu5FjLgogICAgIC0gRMO5bmcgbG9jYWxTdG9yYWdlIGtleSByacOqbmc6IHBva2VodWIuZGFpbHkudjEKICAgICAtIFRoZW8gZMO1aSBob+G6oXQgxJHhu5luZyBwYWNrIHF1YSBEQiArIERPTSBoaeG7h24gY8OzLgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKICB2YXIgREFJTFlfS0VZID0gJ3Bva2VodWIuZGFpbHkudjEnOwogIHZhciBCQVNFX0RCX0tFWSA9ICdwb2tlaHViLmNvbGxlY3Rpb24udjInOwogIHZhciBkYWlseVRpbWVyID0gbnVsbDsKICB2YXIgYWN0aXZpdHlUaW1lciA9IG51bGw7CiAgdmFyIGFjdGl2aXR5T2JzZXJ2ZXIgPSBudWxsOwogIHZhciBkYWlseUJ1c3kgPSBmYWxzZTsKCiAgdmFyIE1JU1NJT05fUE9PTCA9IHsKICAgIHBhY2tzOiB7CiAgICAgIGlkOidkYWlseS1wYWNrcycsCiAgICAgIGljb246J/CfjrQnLAogICAgICBuYW1lOidN4bufIDMgcGFjaycsCiAgICAgIGRlc2M6J03hu58gw610IG5o4bqldCAzIGfDs2kgdHJvbmcgaMO0bSBuYXkuJywKICAgICAgZ29hbDozLAogICAgICByZXdhcmQ6MTAwLAogICAgICB0eXBlOidwYWNrcycKICAgIH0sCiAgICByYXJlOiB7CiAgICAgIGlkOidkYWlseS1yYXJlJywKICAgICAgaWNvbjon4q2QJywKICAgICAgbmFtZTonUHVsbCAxIFJhcmUrJywKICAgICAgZGVzYzonUsO6dCDDrXQgbmjhuqV0IDEgbMOhIFJhcmUgaG/hurdjIGhp4bq/bSBoxqFuLicsCiAgICAgIGdvYWw6MSwKICAgICAgcmV3YXJkOjEwMCwKICAgICAgdHlwZToncmFyZScKICAgIH0sCiAgICB2YWx1ZTogewogICAgICBpZDonZGFpbHktdmFsdWUnLAogICAgICBpY29uOifwn5KwJywKICAgICAgbmFtZTonQ2jhuqFtICQxMCBnacOhIHRy4buLJywKICAgICAgZGVzYzonVOG7lW5nIGdpw6EgdHLhu4sgY2FyZCBow7RtIG5heSDEkeG6oXQgw610IG5o4bqldCAkMTAuJywKICAgICAgZ29hbDoxMCwKICAgICAgcmV3YXJkOjEyNSwKICAgICAgdHlwZTondmFsdWUnCiAgICB9LAogICAgbHVjazogewogICAgICBpZDonZGFpbHktbHVjaycsCiAgICAgIGljb246J/CflKUnLAogICAgICBuYW1lOidMdWNrIFNjb3JlIOKJpSA3MCcsCiAgICAgIGRlc2M6J8SQ4bqhdCBMdWNrIFNjb3JlIHThu6sgNzAgdHLhu58gbMOqbiDhu58gbeG7mXQgbMaw4bujdCBt4bufLicsCiAgICAgIGdvYWw6MSwKICAgICAgcmV3YXJkOjEyNSwKICAgICAgdHlwZTonbHVjaycKICAgIH0sCiAgICBpcjogewogICAgICBpZDonZGFpbHktaXInLAogICAgICBpY29uOifwn5KOJywKICAgICAgbmFtZTonU8SDbiBJUiAvIFNJUicsCiAgICAgIGRlc2M6J1LDunQgw610IG5o4bqldCAxIGzDoSBJbGx1c3RyYXRpb24gUmFyZSAvIFNwZWNpYWwgQXJ0LicsCiAgICAgIGdvYWw6MSwKICAgICAgcmV3YXJkOjE1MCwKICAgICAgdHlwZTonaXInCiAgICB9LAogICAgdW5pcXVlOiB7CiAgICAgIGlkOidkYWlseS11bmlxdWUnLAogICAgICBpY29uOifwn5OaJywKICAgICAgbmFtZTonVGjDqm0gNSBjYXJkIG3hu5tpJywKICAgICAgZGVzYzonQuG7lSBzdW5nIDUgbMOhIGNoxrBhIHThu6tuZyBjw7MgdsOgbyBC4buZIHPGsHUgdOG6rXAgaMO0bSBuYXkuJywKICAgICAgZ29hbDo1LAogICAgICByZXdhcmQ6MTI1LAogICAgICB0eXBlOid1bmlxdWUnCiAgICB9CiAgfTsKCiAgdmFyIFFVQUxJVFlfSURTID0gWydyYXJlJywnbHVjaycsJ2lyJ107CiAgdmFyIEdSSU5EX0lEUyA9IFsndmFsdWUnLCd1bmlxdWUnXTsKCiAgZnVuY3Rpb24gYnlJZChpZCl7IHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IH0KCiAgZnVuY3Rpb24gcmVhZERCKCl7CiAgICB2YXIgcmF3ID0gbnVsbCwgZCA9IHt9OwogICAgdHJ5IHsgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKEJBU0VfREJfS0VZKTsgfSBjYXRjaChlKXt9CiAgICBpZiAocmF3KXsKICAgICAgdHJ5IHsgZCA9IEpTT04ucGFyc2UocmF3KSB8fCB7fTsgfSBjYXRjaChlKXsgZCA9IHt9OyB9CiAgICB9CiAgICBpZiAoIWQgfHwgdHlwZW9mIGQgIT09ICdvYmplY3QnKSBkID0ge307CiAgICBpZiAoIWQuY2FyZHMgfHwgdHlwZW9mIGQuY2FyZHMgIT09ICdvYmplY3QnKSBkLmNhcmRzID0ge307CiAgICBpZiAodHlwZW9mIGQucGFja3MgIT09ICdudW1iZXInKSBkLnBhY2tzID0gTnVtYmVyKGQucGFja3MpIHx8IDA7CiAgICBpZiAodHlwZW9mIGQuc3BlbnQgIT09ICdudW1iZXInKSBkLnNwZW50ID0gTnVtYmVyKGQuc3BlbnQpIHx8IDA7CiAgICBpZiAodHlwZW9mIGQucGFja1ByaWNlICE9PSAnbnVtYmVyJykgZC5wYWNrUHJpY2UgPSBOdW1iZXIoZC5wYWNrUHJpY2UpIHx8IDQuNDk7CiAgICByZXR1cm4gZDsKICB9CgogIGZ1bmN0aW9uIHdyaXRlREIoZCl7CiAgICB0cnkgewogICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oQkFTRV9EQl9LRVksIEpTT04uc3RyaW5naWZ5KGQpKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoKGUpeyByZXR1cm4gZmFsc2U7IH0KICB9CgogIGZ1bmN0aW9uIHVuaXF1ZUNvdW50KGQpewogICAgcmV0dXJuIE9iamVjdC5rZXlzKChkICYmIGQuY2FyZHMpIHx8IHt9KS5sZW5ndGg7CiAgfQoKICBmdW5jdGlvbiBkYXRlS2V5KGRhdGUpewogICAgdmFyIGQgPSBkYXRlIHx8IG5ldyBEYXRlKCk7CiAgICB2YXIgeSA9IGQuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBtID0gU3RyaW5nKGQuZ2V0TW9udGgoKSsxKS5wYWRTdGFydCgyLCcwJyk7CiAgICB2YXIgZGF5ID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCcwJyk7CiAgICByZXR1cm4geSArICctJyArIG0gKyAnLScgKyBkYXk7CiAgfQoKICBmdW5jdGlvbiBwcmV2aW91c0RhdGVLZXkoKXsKICAgIHZhciBkID0gbmV3IERhdGUoKTsKICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSAtIDEpOwogICAgcmV0dXJuIGRhdGVLZXkoZCk7CiAgfQoKICBmdW5jdGlvbiB0b21vcnJvd01pZG5pZ2h0KCl7CiAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CiAgICBkLnNldEhvdXJzKDI0LDAsMCwwKTsKICAgIHJldHVybiBkLmdldFRpbWUoKTsKICB9CgogIGZ1bmN0aW9uIHJlYWREYWlseSgpewogICAgdmFyIHJhdyA9IG51bGwsIGQgPSB7fTsKICAgIHRyeSB7IHJhdyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShEQUlMWV9LRVkpOyB9IGNhdGNoKGUpe30KICAgIGlmIChyYXcpewogICAgICB0cnkgeyBkID0gSlNPTi5wYXJzZShyYXcpIHx8IHt9OyB9IGNhdGNoKGUpeyBkID0ge307IH0KICAgIH0KICAgIGlmICghZCB8fCB0eXBlb2YgZCAhPT0gJ29iamVjdCcpIGQgPSB7fTsKICAgIHJldHVybiBkOwogIH0KCiAgZnVuY3Rpb24gd3JpdGVEYWlseShkKXsKICAgIHRyeSB7CiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShEQUlMWV9LRVksIEpTT04uc3RyaW5naWZ5KGQpKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoKGUpeyByZXR1cm4gZmFsc2U7IH0KICB9CgogIGZ1bmN0aW9uIHNlZWRlZE51bWJlcihzZWVkKXsKICAgIHZhciBoID0gMjE2NjEzNjI2MTsKICAgIGZvciAodmFyIGk9MDsgaTxzZWVkLmxlbmd0aDsgaSsrKXsKICAgICAgaCBePSBzZWVkLmNoYXJDb2RlQXQoaSk7CiAgICAgIGggKz0gKGggPDwgMSkgKyAoaCA8PCA0KSArIChoIDw8IDcpICsgKGggPDwgOCkgKyAoaCA8PCAyNCk7CiAgICB9CiAgICByZXR1cm4gKGggPj4+IDApIC8gNDI5NDk2NzI5NjsKICB9CgogIGZ1bmN0aW9uIHBpY2tNaXNzaW9uKHNlZWQsIHBvb2wsIGV4Y2x1ZGVkKXsKICAgIHZhciBjYW5kaWRhdGVzID0gcG9vbC5maWx0ZXIoZnVuY3Rpb24oaWQpeyByZXR1cm4gZXhjbHVkZWQuaW5kZXhPZihpZCkgPT09IC0xOyB9KTsKICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgdmFyIG4gPSBNYXRoLmZsb29yKHNlZWRlZE51bWJlcihzZWVkICsgJzonICsgZXhjbHVkZWQuam9pbignLCcpKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKTsKICAgIHJldHVybiBjYW5kaWRhdGVzW01hdGgubWluKGNhbmRpZGF0ZXMubGVuZ3RoIC0gMSxuKV07CiAgfQoKICBmdW5jdGlvbiBidWlsZE1pc3Npb25zKGRheSl7CiAgICB2YXIgc2VsZWN0ZWQgPSBbJ3BhY2tzJ107CiAgICB2YXIgcXVhbGl0eSA9IHBpY2tNaXNzaW9uKGRheSArICc6cXVhbGl0eScsIFFVQUxJVFlfSURTLCBzZWxlY3RlZCk7CiAgICBpZiAocXVhbGl0eSkgc2VsZWN0ZWQucHVzaChxdWFsaXR5KTsKICAgIHZhciBncmluZCA9IHBpY2tNaXNzaW9uKGRheSArICc6Z3JpbmQnLCBHUklORF9JRFMsIHNlbGVjdGVkKTsKICAgIGlmIChncmluZCkgc2VsZWN0ZWQucHVzaChncmluZCk7CgogICAgdmFyIGZhbGxiYWNrID0gT2JqZWN0LmtleXMoTUlTU0lPTl9QT09MKTsKICAgIHdoaWxlIChzZWxlY3RlZC5sZW5ndGggPCAzKXsKICAgICAgdmFyIG5leHQgPSBwaWNrTWlzc2lvbihkYXkgKyAnOmZhbGxiYWNrOicgKyBzZWxlY3RlZC5sZW5ndGgsIGZhbGxiYWNrLCBzZWxlY3RlZCk7CiAgICAgIGlmICghbmV4dCkgYnJlYWs7CiAgICAgIHNlbGVjdGVkLnB1c2gobmV4dCk7CiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQuc2xpY2UoMCwzKTsKICB9CgogIGZ1bmN0aW9uIG1pc3Npb25EZWYoaWQpewogICAgcmV0dXJuIE1JU1NJT05fUE9PTFtpZF0gfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZURhaWx5KCl7CiAgICB2YXIgZCA9IHJlYWREYWlseSgpOwogICAgdmFyIHRvZGF5ID0gZGF0ZUtleSgpOwogICAgaWYgKGQuZGF0ZSAhPT0gdG9kYXkpewogICAgICB2YXIgYmFzZSA9IHJlYWREQigpOwogICAgICB2YXIgd2FzWWVzdGVyZGF5ID0gZC5kYXRlID09PSBwcmV2aW91c0RhdGVLZXkoKTsKICAgICAgdmFyIHN0cmVhayA9IHdhc1llc3RlcmRheSA/IE1hdGgubWF4KDAsIE51bWJlcihkLnN0cmVhaykgfHwgMCkgKyAxIDogMTsKCiAgICAgIGQgPSB7CiAgICAgICAgdmVyc2lvbjoxLAogICAgICAgIGRhdGU6dG9kYXksCiAgICAgICAgc3RyZWFrOnN0cmVhaywKICAgICAgICBiYXNlUGFja3M6TnVtYmVyKGJhc2UucGFja3MpfHwwLAogICAgICAgIGJhc2VVbmlxdWU6dW5pcXVlQ291bnQoYmFzZSksCiAgICAgICAgZGFpbHlQYWNrczowLAogICAgICAgIGRhaWx5UmFyZTowLAogICAgICAgIGRhaWx5SVI6MCwKICAgICAgICBkYWlseVZhbHVlOjAsCiAgICAgICAgZGFpbHlMdWNrSGl0OmZhbHNlLAogICAgICAgIG1pc3Npb25zOmJ1aWxkTWlzc2lvbnModG9kYXkpLAogICAgICAgIGNsYWltczp7fSwKICAgICAgICBhbGxCb251c0NsYWltZWQ6ZmFsc2UsCiAgICAgICAgZnJlZVBhY2tzQ2xhaW1lZDowLAogICAgICAgIHN0cmVha0JvbnVzQ2xhaW1lZDpmYWxzZSwKICAgICAgICBsYXN0UHJvY2Vzc2VkUGFja3M6TnVtYmVyKGJhc2UucGFja3MpfHwwCiAgICAgIH07CiAgICAgIHdyaXRlRGFpbHkoZCk7CiAgICB9CgogICAgaWYgKCFBcnJheS5pc0FycmF5KGQubWlzc2lvbnMpIHx8IGQubWlzc2lvbnMubGVuZ3RoICE9PSAzKXsKICAgICAgZC5taXNzaW9ucyA9IGJ1aWxkTWlzc2lvbnModG9kYXkpOwogICAgfQogICAgaWYgKCFkLmNsYWltcyB8fCB0eXBlb2YgZC5jbGFpbXMgIT09ICdvYmplY3QnKSBkLmNsYWltcyA9IHt9OwogICAgaWYgKHR5cGVvZiBkLmRhaWx5UGFja3MgIT09ICdudW1iZXInKSBkLmRhaWx5UGFja3MgPSBOdW1iZXIoZC5kYWlseVBhY2tzKXx8MDsKICAgIGlmICh0eXBlb2YgZC5kYWlseVJhcmUgIT09ICdudW1iZXInKSBkLmRhaWx5UmFyZSA9IE51bWJlcihkLmRhaWx5UmFyZSl8fDA7CiAgICBpZiAodHlwZW9mIGQuZGFpbHlJUiAhPT0gJ251bWJlcicpIGQuZGFpbHlJUiA9IE51bWJlcihkLmRhaWx5SVIpfHwwOwogICAgaWYgKHR5cGVvZiBkLmRhaWx5VmFsdWUgIT09ICdudW1iZXInKSBkLmRhaWx5VmFsdWUgPSBOdW1iZXIoZC5kYWlseVZhbHVlKXx8MDsKICAgIGlmICh0eXBlb2YgZC5kYWlseUx1Y2tIaXQgIT09ICdib29sZWFuJykgZC5kYWlseUx1Y2tIaXQgPSAhIWQuZGFpbHlMdWNrSGl0OwogICAgaWYgKHR5cGVvZiBkLmZyZWVQYWNrc0NsYWltZWQgIT09ICdudW1iZXInKSBkLmZyZWVQYWNrc0NsYWltZWQgPSBOdW1iZXIoZC5mcmVlUGFja3NDbGFpbWVkKXx8MDsKICAgIGlmICh0eXBlb2YgZC5zdHJlYWtCb251c0NsYWltZWQgIT09ICdib29sZWFuJykgZC5zdHJlYWtCb251c0NsYWltZWQgPSAhIWQuc3RyZWFrQm9udXNDbGFpbWVkOwogICAgaWYgKHR5cGVvZiBkLmxhc3RQcm9jZXNzZWRQYWNrcyAhPT0gJ251bWJlcicpIGQubGFzdFByb2Nlc3NlZFBhY2tzID0gTnVtYmVyKHJlYWREQigpLnBhY2tzKXx8MDsKICAgIHdyaXRlRGFpbHkoZCk7CiAgICByZXR1cm4gZDsKICB9CgogIGZ1bmN0aW9uIHN0cmVha1Jld2FyZFBhY2tzKHN0cmVhayl7CiAgICByZXR1cm4gTnVtYmVyKHN0cmVhaykgPiAwICYmIE51bWJlcihzdHJlYWspICUgNyA9PT0gMCA/IDIgOiAxOwogIH0KCiAgZnVuY3Rpb24gcHJvZ3Jlc3NGb3IoZGVmLCBkKXsKICAgIGlmICghZGVmKSByZXR1cm4gMDsKICAgIGlmIChkZWYudHlwZSA9PT0gJ3BhY2tzJykgcmV0dXJuIE51bWJlcihkLmRhaWx5UGFja3MpfHwwOwogICAgaWYgKGRlZi50eXBlID09PSAncmFyZScpIHJldHVybiBOdW1iZXIoZC5kYWlseVJhcmUpfHwwOwogICAgaWYgKGRlZi50eXBlID09PSAndmFsdWUnKSByZXR1cm4gTnVtYmVyKGQuZGFpbHlWYWx1ZSl8fDA7CiAgICBpZiAoZGVmLnR5cGUgPT09ICdsdWNrJykgcmV0dXJuIGQuZGFpbHlMdWNrSGl0ID8gMSA6IDA7CiAgICBpZiAoZGVmLnR5cGUgPT09ICdpcicpIHJldHVybiBOdW1iZXIoZC5kYWlseUlSKXx8MDsKICAgIGlmIChkZWYudHlwZSA9PT0gJ3VuaXF1ZScpewogICAgICB2YXIgYmFzZSA9IE51bWJlcihkLmJhc2VVbmlxdWUpfHwwLCBjdXJyZW50ID0gdW5pcXVlQ291bnQocmVhZERCKCkpOwogICAgICByZXR1cm4gTWF0aC5tYXgoMCwgY3VycmVudCAtIGJhc2UpOwogICAgfQogICAgcmV0dXJuIDA7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRNaXNzaW9uVmFsdWUoZGVmLCB2YWx1ZSl7CiAgICBpZiAoIWRlZikgcmV0dXJuICcwJzsKICAgIGlmIChkZWYudHlwZSA9PT0gJ3ZhbHVlJyl7CiAgICAgIHJldHVybiAnJCcgKyBNYXRoLm1pbihOdW1iZXIodmFsdWUpfHwwLCBkZWYuZ29hbCkudG9GaXhlZCgyKSArICcgLyAkJyArIGRlZi5nb2FsOwogICAgfQogICAgaWYgKGRlZi50eXBlID09PSAnbHVjaycpewogICAgICByZXR1cm4gdmFsdWUgPj0gMSA/ICc3MCsg4pyTJyA6ICcwLzEnOwogICAgfQogICAgcmV0dXJuIE1hdGgubWluKE51bWJlcih2YWx1ZSl8fDAsIGRlZi5nb2FsKSArICcvJyArIGRlZi5nb2FsOwogIH0KCiAgZnVuY3Rpb24gbWlzc2lvbkRvbmUoZGVmLCBkKXsKICAgIHJldHVybiBwcm9ncmVzc0ZvcihkZWYsZCkgPj0gZGVmLmdvYWw7CiAgfQoKICBmdW5jdGlvbiBhZGRQb2ludHMoYW1vdW50KXsKICAgIHZhciBkID0gcmVhZERCKCk7CiAgICB2YXIgcHRzID0gTWF0aC5tYXgoMCwgTnVtYmVyKGQuY2hhbGxlbmdlUG9pbnRzKXx8MCk7CiAgICBkLmNoYWxsZW5nZVBvaW50cyA9IHB0cyArIE1hdGgubWF4KDAsIE51bWJlcihhbW91bnQpfHwwKTsKICAgIHdyaXRlREIoZCk7CiAgfQoKICBmdW5jdGlvbiBjdXJyZW50UG9pbnRzKCl7CiAgICB2YXIgZCA9IHJlYWREQigpOwogICAgcmV0dXJuIE1hdGgubWF4KDAsIE51bWJlcihkLmNoYWxsZW5nZVBvaW50cyl8fDApOwogIH0KCiAgZnVuY3Rpb24gc3luY1Nob3BCYWRnZSgpewogICAgdmFyIGJhZGdlID0gYnlJZCgncGgtc2hvcC1wb2ludHMtYmFkZ2UnKTsKICAgIHZhciBidG4gPSBieUlkKCdwaC1zaG9wLWJ0bicpOwogICAgaWYgKCFiYWRnZSkgcmV0dXJuOwogICAgdmFyIHB0cyA9IGN1cnJlbnRQb2ludHMoKTsKICAgIGJhZGdlLnRleHRDb250ZW50ID0gcHRzLnRvTG9jYWxlU3RyaW5nKCd2aS1WTicpOwogICAgYmFkZ2UuaGlkZGVuID0gZmFsc2U7CiAgICBpZiAoYnRuKSBidG4udGl0bGUgPSAnQuG6oW4gY8OzICcgKyBwdHMudG9Mb2NhbGVTdHJpbmcoJ3ZpLVZOJykgKyAnIOKtkCDEkWnhu4NtIHRoxrDhu59uZyc7CiAgfQoKICBmdW5jdGlvbiBjbGFpbUNvbXBsZXRlZE1pc3Npb25zKCl7CiAgICB2YXIgZCA9IGVuc3VyZURhaWx5KCk7CiAgICB2YXIgZWFybmVkID0gMDsKICAgIGQubWlzc2lvbnMuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgIHZhciBkZWYgPSBtaXNzaW9uRGVmKGlkKTsKICAgICAgaWYgKCFkZWYpIHJldHVybjsKICAgICAgaWYgKG1pc3Npb25Eb25lKGRlZixkKSAmJiAhZC5jbGFpbXNbaWRdKXsKICAgICAgICBkLmNsYWltc1tpZF0gPSBEYXRlLm5vdygpOwogICAgICAgIGVhcm5lZCArPSBOdW1iZXIoZGVmLnJld2FyZCl8fDA7CiAgICAgIH0KICAgIH0pOwoKICAgIGlmIChlYXJuZWQgPiAwKXsKICAgICAgdmFyIGRiID0gcmVhZERCKCk7CiAgICAgIGRiLmNoYWxsZW5nZVBvaW50cyA9IE1hdGgubWF4KDAsIE51bWJlcihkYi5jaGFsbGVuZ2VQb2ludHMpfHwwKSArIGVhcm5lZDsKICAgICAgd3JpdGVEQihkYik7CiAgICB9CgogICAgdmFyIGFsbERvbmUgPSBkLm1pc3Npb25zLmV2ZXJ5KGZ1bmN0aW9uKGlkKXsKICAgICAgdmFyIGRlZiA9IG1pc3Npb25EZWYoaWQpOwogICAgICByZXR1cm4gZGVmICYmIG1pc3Npb25Eb25lKGRlZixkKTsKICAgIH0pOwoKICAgIGlmIChhbGxEb25lICYmICFkLmFsbEJvbnVzQ2xhaW1lZCl7CiAgICAgIHZhciBkYjIgPSByZWFkREIoKTsKICAgICAgZGIyLmNoYWxsZW5nZVBvaW50cyA9IE1hdGgubWF4KDAsIE51bWJlcihkYjIuY2hhbGxlbmdlUG9pbnRzKXx8MCkgKyAyNTA7CiAgICAgIHdyaXRlREIoZGIyKTsKICAgICAgZC5hbGxCb251c0NsYWltZWQgPSB0cnVlOwogICAgICBlYXJuZWQgKz0gMjUwOwogICAgfQoKICAgIGlmIChlYXJuZWQgPiAwKSB3cml0ZURhaWx5KGQpOwogICAgc3luY1Nob3BCYWRnZSgpOwogICAgcmV0dXJuIGVhcm5lZDsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUZyZWVQYWNrQ29zdCgpewogICAgdmFyIGQgPSByZWFkREIoKTsKICAgIHZhciBwcmljZSA9IE1hdGgubWF4KDAsIE51bWJlcihkLnBhY2tQcmljZSl8fDApOwogICAgZC5zcGVudCA9IE1hdGgubWF4KDAsIE51bWJlcihkLnNwZW50KXx8MCkgLSBwcmljZTsKICAgIHdyaXRlREIoZCk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZU1vbmV5KHRleHQpewogICAgdmFyIG0gPSBTdHJpbmcodGV4dCB8fCAnJykubWF0Y2goL1wkKFswLTldKyg/OlwuWzAtOV0rKT8pLyk7CiAgICByZXR1cm4gbSA/IChwYXJzZUZsb2F0KG1bMV0pIHx8IDApIDogMDsKICB9CgogIGZ1bmN0aW9uIHBhcnNlSW50VGV4dCh0ZXh0KXsKICAgIHZhciBtID0gU3RyaW5nKHRleHQgfHwgJycpLm1hdGNoKC8oXGQrKS8pOwogICAgcmV0dXJuIG0gPyBwYXJzZUludChtWzFdLDEwKSA6IDA7CiAgfQoKICBmdW5jdGlvbiBpbnNwZWN0U2luZ2xlKCl7CiAgICB2YXIgcmV2ZWFsID0gYnlJZCgncGgtcmV2ZWFsJyk7CiAgICBpZiAoIXJldmVhbCB8fCAhcmV2ZWFsLmNsYXNzTGlzdC5jb250YWlucygncGgtYWN0aXZlJykpIHJldHVybiBudWxsOwoKICAgIHZhciBzbG90cyA9IHJldmVhbC5xdWVyeVNlbGVjdG9yQWxsKCcucGgtc2xvdFtkYXRhLXRpZXJdJyk7CiAgICBpZiAoc2xvdHMubGVuZ3RoIDwgNSkgcmV0dXJuIG51bGw7CgogICAgdmFyIHJhcmUgPSAwLCBpciA9IDA7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNsb3RzLCBmdW5jdGlvbihzbG90KXsKICAgICAgdmFyIHQgPSBOdW1iZXIoc2xvdC5kYXRhc2V0LnRpZXIpfHwwOwogICAgICBpZiAodCA+PSAyKSByYXJlKys7CiAgICAgIGlmICh0ID49IDUpIGlyKys7CiAgICB9KTsKCiAgICB2YXIgbHVja05vZGUgPSBieUlkKCdwaC1sdWNrLXNjb3JlJyk7CiAgICB2YXIgbHVjayA9IGx1Y2tOb2RlID8gcGFyc2VJbnQobHVja05vZGUudGV4dENvbnRlbnQsMTApIDogMDsKCiAgICB2YXIgdG90YWxOb2RlID0gYnlJZCgncGgtdG90YWwtdmFsJyk7CiAgICB2YXIgdmFsdWUgPSB0b3RhbE5vZGUgJiYgIWJ5SWQoJ3BoLXRvdGFsJykuaGlkZGVuID8gcGFyc2VNb25leSh0b3RhbE5vZGUudGV4dENvbnRlbnQpIDogMDsKCiAgICAvKiBzaG93QmFubmVyIGNo4bqheSBzYXUgcmV2ZWFsOyBjaOG7nSB04bubaSBraGkgTHVjay90b3RhbCBjw7MgZOG7ryBsaeG7h3UgbMOgIOG7lW4uICovCiAgICBpZiAoIWx1Y2tOb2RlIHx8ICFsdWNrTm9kZS50ZXh0Q29udGVudCB8fCBzbG90cy5sZW5ndGggPCA1KSByZXR1cm4gbnVsbDsKCiAgICByZXR1cm4geyBwYWNrczoxLCByYXJlOnJhcmUsIGlyOmlyLCB2YWx1ZTp2YWx1ZSwgbHVjazpsdWNrLCByZWFkeTp0cnVlIH07CiAgfQoKICBmdW5jdGlvbiBpbnNwZWN0Qm94KCl7CiAgICB2YXIgcmVzdWx0ID0gYnlJZCgncGgtYm94LXJlc3VsdCcpOwogICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5jbGFzc0xpc3QuY29udGFpbnMoJ3BoLWFjdGl2ZScpKSByZXR1cm4gbnVsbDsKCiAgICB2YXIgcm93cyA9IHJlc3VsdC5xdWVyeVNlbGVjdG9yQWxsKCcucGgtYmFyLXJvdycpOwogICAgaWYgKCFyb3dzLmxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgdmFyIHJhcmUgPSAwLCBpciA9IDA7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHJvd3MsIGZ1bmN0aW9uKHJvdyl7CiAgICAgIHZhciBmaWxsID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5waC1iYXItZltkYXRhLXRpZXJdJyk7CiAgICAgIHZhciBjb3VudCA9IHJvdy5xdWVyeVNlbGVjdG9yKCcucGgtYmFyLW4nKTsKICAgICAgaWYgKCFmaWxsIHx8ICFjb3VudCkgcmV0dXJuOwogICAgICB2YXIgdGllciA9IE51bWJlcihmaWxsLmRhdGFzZXQudGllcil8fDA7CiAgICAgIHZhciBuID0gcGFyc2VJbnRUZXh0KGNvdW50LnRleHRDb250ZW50KTsKICAgICAgaWYgKHRpZXIgPj0gMikgcmFyZSArPSBuOwogICAgICBpZiAodGllciA+PSA1KSBpciArPSBuOwogICAgfSk7CgogICAgdmFyIHZhbHVlID0gMDsKICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocmVzdWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waC1zdGF0JyksIGZ1bmN0aW9uKHN0YXQpewogICAgICB2YXIgbGFiZWwgPSBzdGF0LnF1ZXJ5U2VsZWN0b3IoJy5waC1zdGF0LWwnKTsKICAgICAgdmFyIHZhbCA9IHN0YXQucXVlcnlTZWxlY3RvcignLnBoLXN0YXQtdicpOwogICAgICBpZiAobGFiZWwgJiYgdmFsICYmIGxhYmVsLnRleHRDb250ZW50LnRyaW0oKSA9PT0gJ0dpw6EgdHLhu4sgdGh1IMSRxrDhu6NjJyl7CiAgICAgICAgdmFsdWUgPSBwYXJzZU1vbmV5KHZhbC50ZXh0Q29udGVudCk7CiAgICAgIH0KICAgIH0pOwoKICAgIHZhciB0ZXh0ID0gcmVzdWx0LnRleHRDb250ZW50IHx8ICcnOwogICAgdmFyIGxtID0gdGV4dC5tYXRjaCgvxJFp4buDbSBtYXkgbeG6r24gdHJ1bmcgYsOsbmhccysoXGQrKS9pKTsKICAgIHZhciBsdWNrID0gbG0gPyBwYXJzZUludChsbVsxXSwxMCkgOiAwOwoKICAgIHJldHVybiB7IHBhY2tzOjAsIHJhcmU6cmFyZSwgaXI6aXIsIHZhbHVlOnZhbHVlLCBsdWNrOmx1Y2ssIHJlYWR5OnRydWUgfTsKICB9CgogIGZ1bmN0aW9uIGluc3BlY3RMYXRlc3RSZXN1bHQoKXsKICAgIHZhciBib3ggPSBpbnNwZWN0Qm94KCk7CiAgICBpZiAoYm94KSByZXR1cm4gYm94OwogICAgcmV0dXJuIGluc3BlY3RTaW5nbGUoKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZURhaWx5TWV0cmljcyhhY3Rpdml0eSl7CiAgICBpZiAoIWFjdGl2aXR5IHx8ICFhY3Rpdml0eS5yZWFkeSkgcmV0dXJuOwogICAgdmFyIGQgPSBlbnN1cmVEYWlseSgpOwogICAgdmFyIGN1cnJlbnREQiA9IHJlYWREQigpOwogICAgdmFyIGN1cnJlbnRQYWNrcyA9IE51bWJlcihjdXJyZW50REIucGFja3MpfHwwOwogICAgdmFyIGRlbHRhUGFja3MgPSBNYXRoLm1heCgwLCBjdXJyZW50UGFja3MgLSAoTnVtYmVyKGQubGFzdFByb2Nlc3NlZFBhY2tzKXx8MCkpOwoKICAgIGlmICghZGVsdGFQYWNrcykgcmV0dXJuIGZhbHNlOwoKICAgIGQuZGFpbHlQYWNrcyArPSBkZWx0YVBhY2tzOwogICAgZC5kYWlseVJhcmUgKz0gTnVtYmVyKGFjdGl2aXR5LnJhcmUpfHwwOwogICAgZC5kYWlseUlSICs9IE51bWJlcihhY3Rpdml0eS5pcil8fDA7CiAgICBkLmRhaWx5VmFsdWUgKz0gTnVtYmVyKGFjdGl2aXR5LnZhbHVlKXx8MDsKICAgIGlmICgoTnVtYmVyKGFjdGl2aXR5Lmx1Y2spfHwwKSA+PSA3MCkgZC5kYWlseUx1Y2tIaXQgPSB0cnVlOwogICAgZC5sYXN0UHJvY2Vzc2VkUGFja3MgPSBjdXJyZW50UGFja3M7CiAgICB3cml0ZURhaWx5KGQpOwoKICAgIHZhciBlYXJuZWQgPSBjbGFpbUNvbXBsZXRlZE1pc3Npb25zKCk7CiAgICByZW5kZXJEYWlseSgpOwogICAgaWYgKGVhcm5lZCA+IDApIHNob3dEYWlseU1lc3NhZ2UoJ/CfjokgTmhp4buHbSB24bulIGhvw6BuIHRow6BuaCEgKycgKyBlYXJuZWQudG9Mb2NhbGVTdHJpbmcoJ3ZpLVZOJykgKyAnIOKtkCDEkWnhu4NtIHRoxrDhu59uZycsIHRydWUpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBzY2hlZHVsZUFjdGl2aXR5Q2hlY2soKXsKICAgIGlmIChhY3Rpdml0eVRpbWVyKSBjbGVhclRpbWVvdXQoYWN0aXZpdHlUaW1lcik7CgogICAgdmFyIHRyaWVzID0gMDsKICAgIGZ1bmN0aW9uIGF0dGVtcHQoKXsKICAgICAgdHJpZXMrKzsKICAgICAgdmFyIG9rID0gdXBkYXRlRGFpbHlNZXRyaWNzKGluc3BlY3RMYXRlc3RSZXN1bHQoKSk7CiAgICAgIGlmICghb2sgJiYgdHJpZXMgPCAxMil7CiAgICAgICAgYWN0aXZpdHlUaW1lciA9IHNldFRpbWVvdXQoYXR0ZW1wdCwgNjUwKTsKICAgICAgfQogICAgfQogICAgYWN0aXZpdHlUaW1lciA9IHNldFRpbWVvdXQoYXR0ZW1wdCwgOTAwKTsKICB9CgogIGZ1bmN0aW9uIG9ic2VydmVQYWNrQWN0aXZpdHkoKXsKICAgIHZhciBvcGVuU2NyZWVuID0gYnlJZCgncGgtc2NyZWVuLW9wZW4nKTsKICAgIGlmICghb3BlblNjcmVlbiB8fCB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjsKCiAgICBhY3Rpdml0eU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgICAgdmFyIGRiID0gcmVhZERCKCksIGQgPSBlbnN1cmVEYWlseSgpOwogICAgICBpZiAoKE51bWJlcihkYi5wYWNrcyl8fDApID4gKE51bWJlcihkLmxhc3RQcm9jZXNzZWRQYWNrcyl8fDApKXsKICAgICAgICBzY2hlZHVsZUFjdGl2aXR5Q2hlY2soKTsKICAgICAgfQogICAgfSk7CgogICAgYWN0aXZpdHlPYnNlcnZlci5vYnNlcnZlKG9wZW5TY3JlZW4sIHtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWUsYXR0cmlidXRlczp0cnVlfSk7CiAgfQoKICBmdW5jdGlvbiBjb3VudGRvd25UZXh0KCl7CiAgICB2YXIgbGVmdCA9IE1hdGgubWF4KDAsIHRvbW9ycm93TWlkbmlnaHQoKSAtIERhdGUubm93KCkpOwogICAgdmFyIHNlYyA9IE1hdGguZmxvb3IobGVmdC8xMDAwKTsKICAgIHZhciBoID0gTWF0aC5mbG9vcihzZWMvMzYwMCk7CiAgICB2YXIgbSA9IE1hdGguZmxvb3IoKHNlYyUzNjAwKS82MCk7CiAgICB2YXIgcyA9IHNlYyU2MDsKICAgIHJldHVybiBTdHJpbmcoaCkucGFkU3RhcnQoMiwnMCcpICsgJzonICsgU3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKSArICc6JyArIFN0cmluZyhzKS5wYWRTdGFydCgyLCcwJyk7CiAgfQoKICBmdW5jdGlvbiBkYWlseUJ1dHRvbigpewogICAgdmFyIGV4aXN0aW5nID0gYnlJZCgncGgtZGFpbHktYnRuJyk7CiAgICBpZiAoZXhpc3RpbmcpewogICAgICBleGlzdGluZy5vbmNsaWNrID0gb3BlbkRhaWx5OwogICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICB9CgogICAgdmFyIHRvb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Bva2VodWItYXBwIC5waC10b29scycpOwogICAgaWYgKCF0b29scykgcmV0dXJuIG51bGw7CgogICAgdmFyIGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgYnRuLmNsYXNzTmFtZSA9ICdwaC10b29sJzsKICAgIGJ0bi5pZCA9ICdwaC1kYWlseS1idG4nOwogICAgYnRuLnR5cGUgPSAnYnV0dG9uJzsKICAgIGJ0bi50aXRsZSA9ICdEYWlseSBNaXNzaW9uLCBTdHJlYWsgdsOgIERhaWx5IEJvbnVzIFBhY2snOwogICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+8J+Orzwvc3Bhbj4gRGFpbHkgPHNwYW4gY2xhc3M9InBoLWRhaWx5LWJhZGdlIiBpZD0icGgtZGFpbHktYmFkZ2UiPjAvMzwvc3Bhbj4nOwogICAgdG9vbHMuaW5zZXJ0QmVmb3JlKGJ0biwgYnlJZCgncGgtbXV0ZS1idG4nKSB8fCBudWxsKTsKICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5EYWlseSk7CiAgICByZXR1cm4gYnRuOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTW9kYWwoKXsKICAgIGlmIChieUlkKCdwaC1kYWlseS1tb2RhbCcpKSByZXR1cm47CgogICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtb2RhbC5jbGFzc05hbWUgPSAncGgtbW9kYWwnOwogICAgbW9kYWwuaWQgPSAncGgtZGFpbHktbW9kYWwnOwogICAgbW9kYWwuaGlkZGVuID0gdHJ1ZTsKICAgIG1vZGFsLmlubmVySFRNTCA9CiAgICAgICc8ZGl2IGNsYXNzPSJwaC1tb2RhbC1iYWNrZHJvcCIgaWQ9InBoLWRhaWx5LWJhY2tkcm9wIj48L2Rpdj4nICsKICAgICAgJzxkaXYgY2xhc3M9InBoLW1vZGFsLWNhcmQgcGgtbW9kYWwtd2lkZSIgcm9sZT0iZGlhbG9nIiBhcmlhLW1vZGFsPSJ0cnVlIiBhcmlhLWxhYmVsPSJEYWlseSBIdWIiPicgKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJwaC1tb2RhbC1jbG9zZSIgaWQ9InBoLWRhaWx5LWNsb3NlIiB0eXBlPSJidXR0b24iIGFyaWEtbGFiZWw9IsSQw7NuZyI+4pyVPC9idXR0b24+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBoLW1vZGFsLXRpdGxlIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMnB4OyI+8J+OryBEYWlseSBIdWI8L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGgtbW9kYWwtYm9keSIgaWQ9InBoLWRhaWx5LWJvZHkiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JzsKCiAgICB2YXIgYXBwID0gYnlJZCgncG9rZWh1Yi1hcHAnKTsKICAgIGlmIChhcHApIGFwcC5hcHBlbmRDaGlsZChtb2RhbCk7CgogICAgYnlJZCgncGgtZGFpbHktY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlRGFpbHkpOwogICAgYnlJZCgncGgtZGFpbHktYmFja2Ryb3AnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlRGFpbHkpOwogIH0KCiAgZnVuY3Rpb24gc2hvd0RhaWx5TWVzc2FnZShtc2csIG9rKXsKICAgIHZhciBub2RlID0gYnlJZCgncGgtZGFpbHktYWxlcnQnKTsKICAgIGlmICghbm9kZSkgcmV0dXJuOwogICAgbm9kZS50ZXh0Q29udGVudCA9IG1zZzsKICAgIG5vZGUuY2xhc3NOYW1lID0gJ3BoLWRhaWx5LWFsZXJ0JyArIChvayA/ICcgcGgtb2snIDogJycpOwogICAgbm9kZS5oaWRkZW4gPSBmYWxzZTsKICAgIGNsZWFyVGltZW91dChub2RlLl90aW1lcik7CiAgICBub2RlLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgbm9kZS5oaWRkZW4gPSB0cnVlOwogICAgfSwgNDIwMCk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJEYWlseSgpewogICAgdmFyIGQgPSBlbnN1cmVEYWlseSgpOwogICAgdmFyIGJvZHkgPSBieUlkKCdwaC1kYWlseS1ib2R5Jyk7CiAgICB2YXIgYmFkZ2UgPSBieUlkKCdwaC1kYWlseS1iYWRnZScpOwogICAgaWYgKCFib2R5KSByZXR1cm47CgogICAgdmFyIGRvbmUgPSAwOwogICAgZC5taXNzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGlkKXsKICAgICAgaWYgKG1pc3Npb25Eb25lKG1pc3Npb25EZWYoaWQpLCBkKSkgZG9uZSsrOwogICAgfSk7CgogICAgaWYgKGJhZGdlKXsKICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBkb25lICsgJy8zJzsKICAgICAgYmFkZ2UuY2xhc3NOYW1lID0gJ3BoLWRhaWx5LWJhZGdlJyArICgoZG9uZSA9PT0gMyB8fCBkLnN0cmVhayAlIDcgPT09IDApID8gJyBwaC1kYWlseS1ob3QnIDogJycpOwogICAgfQoKICAgIHZhciByZXdhcmRQYWNrcyA9IHN0cmVha1Jld2FyZFBhY2tzKGQuc3RyZWFrKTsKICAgIHZhciBjYW5DbGFpbSA9IGQuZnJlZVBhY2tzQ2xhaW1lZCA8IHJld2FyZFBhY2tzOwoKICAgIHZhciBoZXJvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBoZXJvLmNsYXNzTmFtZSA9ICdwaC1kYWlseS1oZXJvJzsKCiAgICB2YXIgc3RyZWFrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBzdHJlYWsuY2xhc3NOYW1lID0gJ3BoLWRhaWx5LWNhcmQnOwogICAgc3RyZWFrLmlubmVySFRNTCA9CiAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1raWNrZXIiPlNUUkVBSzwvZGl2PicgKwogICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktc3RyZWFrIj4nICsKICAgICAgICAnPGRpdj4nICsKICAgICAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1zdHJlYWstbnVtIj7wn5SlICcgKyBOdW1iZXIoZC5zdHJlYWt8fDEpICsgJzwvZGl2PicgKwogICAgICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LXN0cmVhay1sYWJlbCI+bmfDoHkgbGnDqm4gdGnhur9wPC9kaXY+JyArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1ub3RlIj4nICsKICAgICAgICAgIChkLnN0cmVhayAlIDcgPT09IDAgPyAn8J+UpSBEQVkgNyBCT05VUyEnIDogJ03hu5FjIHRoxrDhu59uZyBr4bq/IHRp4bq/cDogRGF5ICcgKyAoTWF0aC5mbG9vcigoTnVtYmVyKGQuc3RyZWFrKXx8MSkvNykqNyArIDcpKSArCiAgICAgICAgJzwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1zdHJlYWstYmFyIj48c3BhbiBjbGFzcz0icGgtZGFpbHktc3RyZWFrLWZpbGwiIHN0eWxlPSJ3aWR0aDonICsKICAgICAgICAoZC5zdHJlYWsgJSA3ID09PSAwID8gMTAwIDogKChkLnN0cmVhayAlIDcpIC8gNyAqIDEwMCkpICsKICAgICAgJyUiPjwvc3Bhbj48L2Rpdj4nICsKICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LXJlc2V0Ij5EYWlseSByZXNldCBzYXUgPHNwYW4gaWQ9InBoLWRhaWx5LWNvdW50ZG93biI+LS06LS06LS08L3NwYW4+PC9kaXY+JzsKCiAgICB2YXIgcGFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcGFjay5jbGFzc05hbWUgPSAncGgtZGFpbHktY2FyZCBwaC1kYWlseS1wYWNrJzsKICAgIHBhY2suaW5uZXJIVE1MID0KICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LXBhY2stdG9wIj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktcGFjay1uYW1lIj7wn46BIERhaWx5IEJvbnVzIFBhY2s8L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktcGFjay1zdGF0dXMgJyArIChjYW5DbGFpbSA/ICcnIDogJ3BoLWNsYWltZWQnKSArICciPicgKwogICAgICAgICAgKGNhbkNsYWltID8gKCdSRUFEWSDCtyAnICsgcmV3YXJkUGFja3MgKyAnIFBBQ0snICsgKHJld2FyZFBhY2tzID4gMSA/ICdTJyA6ICcnKSkgOiAnQ0xBSU1FRCcpICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICc8L2Rpdj4nICsKICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LXBhY2stZGVzYyI+JyArCiAgICAgICAgKGQuc3RyZWFrICUgNyA9PT0gMAogICAgICAgICAgPyAn8J+UpSA3LWRheSBzdHJlYWshIEjDtG0gbmF5IG5o4bqtbiA8Yj4yIEZyZWUgUGFja3M8L2I+ICsgYm9udXMgxJFp4buDbS4nCiAgICAgICAgICA6ICdN4buXaSBuZ8OgeSBuaOG6rW4gMSBGcmVlIFBhY2suIFBhY2sgxJHGsOG7o2MgbeG7nyBi4bqxbmcgYuG7mSB0aOG6uyBoaeG7h24gdOG6oWkgdsOgIGtow7RuZyB0w61uaCBjaGkgcGjDrSBST0kuJykgKwogICAgICAnPC9kaXY+JyArCiAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1wYWNrLWFjdGlvbiI+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LXBhY2stY291bnRkb3duIj5OZXh0IGRhaWx5IHBhY2sgwrcgPHNwYW4gaWQ9InBoLWRhaWx5LXBhY2stY291bnRkb3duIj4tLTotLTotLTwvc3Bhbj48L2Rpdj4nICsKICAgICAgICAnPGJ1dHRvbiBjbGFzcz0icGgtZGFpbHktcGFjay1idG4iIGlkPSJwaC1kYWlseS1wYWNrLWJ0biIgdHlwZT0iYnV0dG9uIj4nICsKICAgICAgICAgIChjYW5DbGFpbSA/ICgn8J+OgSBN4bufICcgKyByZXdhcmRQYWNrcyArICcgRnJlZSBQYWNrJyArIChyZXdhcmRQYWNrcyA+IDEgPyAncycgOiAnJykpIDogJ+KckyDEkMOjIG5o4bqtbiBow7RtIG5heScpICsKICAgICAgICAnPC9idXR0b24+JyArCiAgICAgICc8L2Rpdj4nOwoKICAgIGhlcm8uYXBwZW5kQ2hpbGQoc3RyZWFrKTsKICAgIGhlcm8uYXBwZW5kQ2hpbGQocGFjayk7CiAgICBib2R5LnRleHRDb250ZW50ID0gJyc7CiAgICBib2R5LmFwcGVuZENoaWxkKGhlcm8pOwoKICAgIHZhciBhbGVydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYWxlcnQuY2xhc3NOYW1lID0gJ3BoLWRhaWx5LWFsZXJ0JzsKICAgIGFsZXJ0LmlkID0gJ3BoLWRhaWx5LWFsZXJ0JzsKICAgIGFsZXJ0LmhpZGRlbiA9IHRydWU7CiAgICBib2R5LmFwcGVuZENoaWxkKGFsZXJ0KTsKCiAgICB2YXIgbWlzc2lvbnNXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgaGVhZC5jbGFzc05hbWUgPSAncGgtZGFpbHktbWlzc2lvbi1oZWFkJzsKICAgIGhlYWQuaW5uZXJIVE1MID0KICAgICAgJzxkaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LWtpY2tlciI+VE9EQVk8L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktbWlzc2lvbi10aXRsZSI+8J+OryAzIERhaWx5IE1pc3Npb25zPC9kaXY+JyArCiAgICAgICc8L2Rpdj4nICsKICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LW1pc3Npb24tbWV0YSI+JyArIGRvbmUgKyAnLzMgaG/DoG4gdGjDoG5oPC9kaXY+JzsKICAgIG1pc3Npb25zV3JhcC5hcHBlbmRDaGlsZChoZWFkKTsKCiAgICB2YXIgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgbGlzdC5jbGFzc05hbWUgPSAncGgtZGFpbHktbWlzc2lvbi1saXN0JzsKCiAgICBkLm1pc3Npb25zLmZvckVhY2goZnVuY3Rpb24oaWQpewogICAgICB2YXIgZGVmID0gbWlzc2lvbkRlZihpZCk7CiAgICAgIGlmICghZGVmKSByZXR1cm47CgogICAgICB2YXIgdmFsdWUgPSBwcm9ncmVzc0ZvcihkZWYsZCk7CiAgICAgIHZhciBjb21wbGV0ZWQgPSBtaXNzaW9uRG9uZShkZWYsZCk7CiAgICAgIHZhciBwY3QgPSBkZWYuZ29hbCA+IDAgPyBNYXRoLm1pbigxMDAsIE1hdGgucm91bmQodmFsdWUgLyBkZWYuZ29hbCAqIDEwMCkpIDogMTAwOwoKICAgICAgdmFyIGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgaXRlbS5jbGFzc05hbWUgPSAncGgtZGFpbHktbWlzc2lvbicgKyAoY29tcGxldGVkID8gJyBwaC1kb25lJyA6ICcnKTsKICAgICAgaXRlbS5pbm5lckhUTUwgPQogICAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1taXNzaW9uLXRvcCI+JyArCiAgICAgICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktbWlzc2lvbi1uYW1lIj4nICsgZGVmLmljb24gKyAnICcgKyBkZWYubmFtZSArICc8L2Rpdj4nICsKICAgICAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1taXNzaW9uLXJld2FyZCI+KycgKyBkZWYucmV3YXJkLnRvTG9jYWxlU3RyaW5nKCd2aS1WTicpICsgJyDirZA8L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBoLWRhaWx5LW1pc3Npb24tZGVzYyI+JyArIGRlZi5kZXNjICsgJzwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1taXNzaW9uLXByb2dyZXNzIj4nICsKICAgICAgICAgICc8ZGl2IGNsYXNzPSJwaC1kYWlseS1taXNzaW9uLXRyYWNrIj48c3BhbiBjbGFzcz0icGgtZGFpbHktbWlzc2lvbi1maWxsIiBzdHlsZT0id2lkdGg6JyArIHBjdCArICclIj48L3NwYW4+PC9kaXY+JyArCiAgICAgICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktbWlzc2lvbi12YWx1ZSI+JyArIGZvcm1hdE1pc3Npb25WYWx1ZShkZWYsdmFsdWUpICsgJzwvZGl2PicgKwogICAgICAgICc8L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0icGgtZGFpbHktbWlzc2lvbi1zdGF0dXMiPicgKwogICAgICAgICAgKGNvbXBsZXRlZCA/ICfinJMgSG/DoG4gdGjDoG5oJyA6ICfEkGFuZyBsw6BtJykgKwogICAgICAgICAgKGQuY2xhaW1zW2lkXSA/ICcgwrcgxJDDoyBuaOG6rW4gdGjGsOG7n25nJyA6ICcnKSArCiAgICAgICAgJzwvZGl2Pic7CgogICAgICBsaXN0LmFwcGVuZENoaWxkKGl0ZW0pOwogICAgfSk7CgogICAgbWlzc2lvbnNXcmFwLmFwcGVuZENoaWxkKGxpc3QpOwogICAgYm9keS5hcHBlbmRDaGlsZChtaXNzaW9uc1dyYXApOwoKICAgIHZhciBib3R0b20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGJvdHRvbS5jbGFzc05hbWUgPSAncGgtZGFpbHktYm90dG9tJzsKCiAgICB2YXIgcG9pbnRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBwb2ludHMuY2xhc3NOYW1lID0gJ3BoLWRhaWx5LXBvaW50cyc7CiAgICBwb2ludHMuaW5uZXJIVE1MID0gJ+KtkCDEkGnhu4NtIGhp4buHbiBjw7M6IDxiPicgKyBjdXJyZW50UG9pbnRzKCkudG9Mb2NhbGVTdHJpbmcoJ3ZpLVZOJykgKyAnPC9iPic7CgogICAgdmFyIG5vdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIG5vdGUuY2xhc3NOYW1lID0gJ3BoLWRhaWx5LW5vdGUnOwogICAgbm90ZS5pbm5lckhUTUwgPQogICAgICAoZG9uZSA9PT0gMwogICAgICAgID8gJ/CfjokgSG/DoG4gdGjDoG5oIGPhuqMgMyDihpIgPGI+KzI1MCDirZAgYm9udXM8L2I+LicKICAgICAgICA6ICdIb8OgbiB0aMOgbmggY+G6oyAzIG5oaeG7h20gduG7pSDEkeG7gyBuaOG6rW4gdGjDqm0gPGI+MjUwIOKtkDwvYj4uJyk7CgogICAgYm90dG9tLmFwcGVuZENoaWxkKHBvaW50cyk7CiAgICBib3R0b20uYXBwZW5kQ2hpbGQobm90ZSk7CiAgICBib2R5LmFwcGVuZENoaWxkKGJvdHRvbSk7CgogICAgdXBkYXRlQ291bnRkb3duTm9kZXMoKTsKCiAgICB2YXIgcGFja0J0biA9IGJ5SWQoJ3BoLWRhaWx5LXBhY2stYnRuJyk7CiAgICBpZiAocGFja0J0bil7CiAgICAgIHBhY2tCdG4uZGlzYWJsZWQgPSAhY2FuQ2xhaW0gfHwgZGFpbHlCdXN5OwogICAgICBwYWNrQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xhaW1EYWlseVBhY2tzKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUNvdW50ZG93bk5vZGVzKCl7CiAgICB2YXIgdCA9IGNvdW50ZG93blRleHQoKTsKICAgIHZhciBhID0gYnlJZCgncGgtZGFpbHktY291bnRkb3duJyk7CiAgICB2YXIgYiA9IGJ5SWQoJ3BoLWRhaWx5LXBhY2stY291bnRkb3duJyk7CiAgICBpZiAoYSkgYS50ZXh0Q29udGVudCA9IHQ7CiAgICBpZiAoYikgYi50ZXh0Q29udGVudCA9IHQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVEYWlseVRpbWVyKCl7CiAgICB2YXIgZCA9IGVuc3VyZURhaWx5KCk7CiAgICB2YXIgdG9kYXkgPSBkYXRlS2V5KCk7CiAgICBpZiAoZC5kYXRlICE9PSB0b2RheSl7CiAgICAgIGVuc3VyZURhaWx5KCk7CiAgICAgIHJlbmRlckRhaWx5KCk7CiAgICB9CiAgICB1cGRhdGVDb3VudGRvd25Ob2RlcygpOwogICAgZGFpbHlUaW1lciA9IHNldFRpbWVvdXQodXBkYXRlRGFpbHlUaW1lciwgMTAwMCk7CiAgfQoKICBmdW5jdGlvbiBjYW5PcGVuQ3VycmVudFBhY2soKXsKICAgIHZhciBzY3JlZW4gPSBieUlkKCdwaC1zY3JlZW4tb3BlbicpOwogICAgdmFyIHBhY2sgPSBieUlkKCdwaC1wYWNrJyk7CiAgICBpZiAoIXNjcmVlbiB8fCAhcGFjayB8fCAhc2NyZWVuLmNsYXNzTGlzdC5jb250YWlucygncGgtYWN0aXZlJykpIHJldHVybiBmYWxzZTsKICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhY2spOwogICAgcmV0dXJuIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBzdHlsZS52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJyAmJiAhcGFjay5jbGFzc0xpc3QuY29udGFpbnMoJ3BoLWJ1c3knKTsKICB9CgogIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKXsgc2V0VGltZW91dChyZXNvbHZlLG1zKTsgfSk7CiAgfQoKICBmdW5jdGlvbiB3YWl0Rm9yKGZuLCB0aW1lb3V0LCBpbnRlcnZhbCl7CiAgICB0aW1lb3V0ID0gTnVtYmVyKHRpbWVvdXQpfHwxNTAwMDsKICAgIGludGVydmFsID0gTnVtYmVyKGludGVydmFsKXx8MjUwOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgdmFyIHN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICBmdW5jdGlvbiB0aWNrKCl7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChmbigpKSByZXR1cm4gcmVzb2x2ZSh0cnVlKTsKICAgICAgICB9IGNhdGNoKGUpe30KICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPj0gdGltZW91dCkgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ3RpbWVvdXQnKSk7CiAgICAgICAgc2V0VGltZW91dCh0aWNrLCBpbnRlcnZhbCk7CiAgICAgIH0KICAgICAgdGljaygpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBvcGVuT25lRGFpbHlQYWNrKCl7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3QpewogICAgICBpZiAoIWNhbk9wZW5DdXJyZW50UGFjaygpKSByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignbm8tcGFjaycpKTsKICAgICAgdmFyIGJlZm9yZSA9IE51bWJlcihyZWFkREIoKS5wYWNrcyl8fDA7CiAgICAgIHZhciBwYWNrID0gYnlJZCgncGgtcGFjaycpOwogICAgICBwYWNrLmNsaWNrKCk7CgogICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCl7CiAgICAgICAgcmV0dXJuIChOdW1iZXIocmVhZERCKCkucGFja3MpfHwwKSA+IGJlZm9yZTsKICAgICAgfSwgMTYwMDAsIDI1MCkudGhlbihmdW5jdGlvbigpewogICAgICAgIC8qIMSQ4bujaSByZXZlYWwvc2hvd0Jhbm5lciBob8OgbiB04bqldCB0csaw4bubYyBraGkgcmVzZXQgxJHhu4MgZ8OzaSB0aOG7qSAyIGtow7RuZyBjaOG7k25nIGFuaW1hdGlvbi4gKi8KICAgICAgICByZXR1cm4gc2xlZXAoMzIwMCk7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgICByZW1vdmVGcmVlUGFja0Nvc3QoKTsKICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTsKICAgICAgfSkuY2F0Y2gocmVqZWN0KTsKICAgIH0pOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gY2xhaW1EYWlseVBhY2tzKCl7CiAgICBpZiAoZGFpbHlCdXN5KSByZXR1cm47CiAgICB2YXIgZCA9IGVuc3VyZURhaWx5KCk7CiAgICB2YXIgcmV3YXJkUGFja3MgPSBzdHJlYWtSZXdhcmRQYWNrcyhkLnN0cmVhayk7CgogICAgaWYgKGQuZnJlZVBhY2tzQ2xhaW1lZCA+PSByZXdhcmRQYWNrcyl7CiAgICAgIHJlbmRlckRhaWx5KCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoIWNhbk9wZW5DdXJyZW50UGFjaygpKXsKICAgICAgc2hvd0RhaWx5TWVzc2FnZSgn4pqg77iPIEjDo3kgY2jhu41uIG3hu5l0IGLhu5kgdGjhursgdHLGsOG7m2MsIHLhu5NpIG3hu58gRGFpbHkgQm9udXMgUGFjay4nLCBmYWxzZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBkYWlseUJ1c3kgPSB0cnVlOwogICAgcmVuZGVyRGFpbHkoKTsKCiAgICB2YXIgb3BlbmVkID0gMDsKICAgIHRyeSB7CiAgICAgIHdoaWxlIChvcGVuZWQgPCByZXdhcmRQYWNrcyl7CiAgICAgICAgaWYgKCFjYW5PcGVuQ3VycmVudFBhY2soKSl7CiAgICAgICAgICAvKiBTYXUgbMaw4bujdCB0csaw4bubYywgYuG6pW0gIk3hu58gZ8OzaSBraMOhYyIgxJHhu4MgdHLhu58gbOG6oWkgbcOgbiBwYWNrLiAqLwogICAgICAgICAgdmFyIGFnYWluID0gYnlJZCgncGgtYWdhaW4tYnRuJyk7CiAgICAgICAgICBpZiAoYWdhaW4pIGFnYWluLmNsaWNrKCk7CiAgICAgICAgICBhd2FpdCB3YWl0Rm9yKGNhbk9wZW5DdXJyZW50UGFjaywgNzAwMCwgMjAwKTsKICAgICAgICAgIGF3YWl0IHNsZWVwKDI1MCk7CiAgICAgICAgfQoKICAgICAgICBhd2FpdCBvcGVuT25lRGFpbHlQYWNrKCk7CiAgICAgICAgb3BlbmVkKys7CiAgICAgICAgZCA9IGVuc3VyZURhaWx5KCk7CiAgICAgICAgZC5mcmVlUGFja3NDbGFpbWVkID0gb3BlbmVkOwogICAgICAgIGlmIChvcGVuZWQgPT09IHJld2FyZFBhY2tzICYmIGQuc3RyZWFrICUgNyA9PT0gMCAmJiAhZC5zdHJlYWtCb251c0NsYWltZWQpewogICAgICAgICAgdmFyIGRiID0gcmVhZERCKCk7CiAgICAgICAgICBkYi5jaGFsbGVuZ2VQb2ludHMgPSBNYXRoLm1heCgwLCBOdW1iZXIoZGIuY2hhbGxlbmdlUG9pbnRzKXx8MCkgKyA1MDA7CiAgICAgICAgICB3cml0ZURCKGRiKTsKICAgICAgICAgIGQuc3RyZWFrQm9udXNDbGFpbWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgd3JpdGVEYWlseShkKTsKICAgICAgICBhd2FpdCBzbGVlcCg1MDApOwogICAgICB9CgogICAgICBjbGFpbUNvbXBsZXRlZE1pc3Npb25zKCk7CiAgICAgIHJlbmRlckRhaWx5KCk7CiAgICAgIHNob3dEYWlseU1lc3NhZ2UoCiAgICAgICAgcmV3YXJkUGFja3MgPiAxCiAgICAgICAgICA/ICfwn5SlIERheSA3IEJvbnVzISDEkMOjIG3hu58gxJHhu6cgMiBGcmVlIFBhY2tzIHbDoCBuaOG6rW4gKzUwMCDirZAuJwogICAgICAgICAgOiAn8J+OgSBEYWlseSBCb251cyBQYWNrIMSRw6Mgbmjhuq1uLiBI4bq5biBn4bq3cCBs4bqhaSBuZ8OgeSBtYWkhJywKICAgICAgICB0cnVlCiAgICAgICk7CiAgICB9IGNhdGNoKGVycil7CiAgICAgIGQgPSBlbnN1cmVEYWlseSgpOwogICAgICBkLmZyZWVQYWNrc0NsYWltZWQgPSBvcGVuZWQ7CiAgICAgIHdyaXRlRGFpbHkoZCk7CiAgICAgIHJlbmRlckRhaWx5KCk7CgogICAgICBpZiAoZXJyICYmIGVyci5tZXNzYWdlID09PSAnbm8tcGFjaycpewogICAgICAgIHNob3dEYWlseU1lc3NhZ2UoJ+KaoO+4jyBIw6N5IGNo4buNbiBt4buZdCBi4buZIHRo4bq7IHRyxrDhu5tjIGtoaSBuaOG6rW4gRGFpbHkgUGFjay4nLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2hvd0RhaWx5TWVzc2FnZSgn4pqg77iPIERhaWx5IFBhY2sgY2jGsGEgaG/DoG4gdOG6pXQuIEtow7RuZyB0w61uaCBsxrDhu6N0IGNoxrBhIG3hu58gdGjDoG5oIGPDtG5nLicsIGZhbHNlKTsKICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgZGFpbHlCdXN5ID0gZmFsc2U7CiAgICAgIHJlbmRlckRhaWx5KCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvcGVuRGFpbHkoKXsKICAgIGNyZWF0ZU1vZGFsKCk7CiAgICB2YXIgbW9kYWwgPSBieUlkKCdwaC1kYWlseS1tb2RhbCcpOwogICAgaWYgKCFtb2RhbCkgcmV0dXJuOwogICAgZW5zdXJlRGFpbHkoKTsKICAgIGNsYWltQ29tcGxldGVkTWlzc2lvbnMoKTsKICAgIHJlbmRlckRhaWx5KCk7CiAgICBtb2RhbC5oaWRkZW4gPSBmYWxzZTsKICAgIHZhciBjbG9zZSA9IGJ5SWQoJ3BoLWRhaWx5LWNsb3NlJyk7CiAgICBpZiAoY2xvc2UpIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgY2xvc2UuZm9jdXMoKTsgfSwgNDApOwogIH0KCiAgZnVuY3Rpb24gY2xvc2VEYWlseSgpewogICAgdmFyIG1vZGFsID0gYnlJZCgncGgtZGFpbHktbW9kYWwnKTsKICAgIGlmIChtb2RhbCkgbW9kYWwuaGlkZGVuID0gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGluaXQoKXsKICAgIGVuc3VyZURhaWx5KCk7CiAgICBkYWlseUJ1dHRvbigpOwogICAgY3JlYXRlTW9kYWwoKTsKICAgIGNsYWltQ29tcGxldGVkTWlzc2lvbnMoKTsKICAgIHJlbmRlckRhaWx5KCk7CiAgICBvYnNlcnZlUGFja0FjdGl2aXR5KCk7CgogICAgaWYgKGRhaWx5VGltZXIpIGNsZWFyVGltZW91dChkYWlseVRpbWVyKTsKICAgIHVwZGF0ZURhaWx5VGltZXIoKTsKCiAgICAvKiBUaGVvIGTDtWkgY+G6oyB0csaw4budbmcgaOG7o3AgRE9NIGtow7RuZyBtdXRhdGlvbiDEkcO6bmcgbMO6YyBuaMawbmcgREIgxJHDoyB0xINuZy4gKi8KICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCl7CiAgICAgIHZhciBkID0gZW5zdXJlRGFpbHkoKTsKICAgICAgdmFyIGJhc2VQYWNrcyA9IE51bWJlcihkLmxhc3RQcm9jZXNzZWRQYWNrcyl8fDA7CiAgICAgIHZhciBjdXJyZW50UGFja3MgPSBOdW1iZXIocmVhZERCKCkucGFja3MpfHwwOwogICAgICBpZiAoY3VycmVudFBhY2tzID4gYmFzZVBhY2tzKSBzY2hlZHVsZUFjdGl2aXR5Q2hlY2soKTsKICAgIH0sIDEwMDApOwoKICAgIC8qIE7hur91IG5nxrDhu51pIGTDuW5nIG3hu58gRGFpbHkgc2F1IGtoaSBt4bufIHBhY2ssIGPhuq1wIG5o4bqtdCBuZ2F5IFVJLiAqLwogICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgaWYgKGJ5SWQoJ3BoLWRhaWx5LW1vZGFsJykgJiYgIWJ5SWQoJ3BoLWRhaWx5LW1vZGFsJykuaGlkZGVuKSByZW5kZXJEYWlseSgpOwogICAgICBzeW5jU2hvcEJhZGdlKCk7CiAgICB9LCAyNTAwKTsKICB9CgogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpOwogIH0gZWxzZSB7CiAgICBpbml0KCk7CiAgfQoKfSkoKTsKCi8qID09PT09IFY5OiBNRUdBIEhJVCBMSVZFICQ2MCssIEpBQ0tQT1QgJDIwMCssIHJlY2VudCBoaXQgaGlzdG9yeSArIDUtaXRlbSBwYWdpbmcgPT09PT0gKi8KKGZ1bmN0aW9uKCl7CiAgInVzZSBzdHJpY3QiOwoKICAvLyBTZWxlY3QgU3VwYWJhc2UgYXMgdGhlIHNvbGUgb3duZXIgb2YgdGhlIHZpc2libGUgQlhIIHN0YXR1cy4gVGhlIGxlZ2FjeQogIC8vIGVtYmVkZGVkIEZpcmViYXNlIGNvZGUgaGFzIG5vIGNvbmZpZyBhbmQgbXVzdCBub3QgcmVzZXQgdGhpcyBsYWJlbC4KICB3aW5kb3cuX19wb2tlaHViU3VwYWJhc2VMZWFkZXJib2FyZEFjdGl2ZSA9IHRydWU7CgogIHZhciBTVVBBQkFTRV9VUkwgPSAiaHR0cHM6Ly9nb3BrdXV4bmhvcGNnemh2eHBiaS5zdXBhYmFzZS5jbyI7CiAgdmFyIFNVUEFCQVNFX1BVQkxJU0hBQkxFX0tFWSA9ICJzYl9wdWJsaXNoYWJsZV9PbmVRVU9KYU1IUVczT3o4eU9KY2RRX1lDQkc2R3RSIjsKICB2YXIgU1VQQUJBU0VfVEFCTEUgPSAibGVhZGVyYm9hcmQiOwogIHZhciBQVUxMX0ZFRURfVEFCTEUgPSAicHVsbF9mZWVkIjsKICB2YXIgQUNUSVZJVFlfVEFCTEUgPSAibGVhZGVyYm9hcmRfYWN0aXZpdHkiOwogIHZhciBQU0FfVEFCTEUgPSAicHNhX2dyYWRlcyI7CgogIHZhciBhcHAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicG9rZWh1Yi1hcHAiKTsKICBpZiAoIWFwcCkgcmV0dXJuOwoKICB2YXIgZWxzID0gewogICAgbGJCdG46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwaC1sZWFkZXJib2FyZC1idG4iKSwKICAgIGxiTGl2ZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBoLWxlYWRlcmJvYXJkLWxpdmUiKSwKICAgIGxiTW9kYWw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwaC1sZWFkZXJib2FyZC1tb2RhbCIpLAogICAgbGJCYWNrZHJvcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBoLWxlYWRlcmJvYXJkLWJhY2tkcm9wIiksCiAgICBsYkNsb3NlOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGgtbGVhZGVyYm9hcmQtY2xvc2UiKSwKICAgIGxiQm9keTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBoLWxlYWRlcmJvYXJkLWJvZHkiKSwKICAgIHdlbGNvbWVNb2RhbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBoLXdlbGNvbWUtbW9kYWwiKSwKICAgIHdlbGNvbWVJbnB1dDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBoLXRyYWluZXItbmFtZSIpCiAgfTsKCiAgdmFyIGNsaWVudCA9IG51bGw7CiAgdmFyIGNoYW5uZWwgPSBudWxsOwogIHZhciByb3dzQ2FjaGUgPSBbXTsKICB2YXIgbGFzdEZpbmdlcnByaW50ID0gIiI7CiAgdmFyIHN5bmNpbmcgPSBmYWxzZTsKICB2YXIgc3RhcnRlZCA9IGZhbHNlOwogIHZhciBsYXN0U3luY0Vycm9yID0gIiI7CiAgdmFyIHB1bGxGZWVkQ2FjaGUgPSBbXTsKICB2YXIgcHVsbEZlZWRWaXNpYmxlQ291bnQgPSA1OwogIHZhciBwdWxsRmVlZFJlYWR5ID0gZmFsc2U7CiAgdmFyIHB1bGxGZWVkRXJyb3IgPSAiIjsKICB2YXIgcGVuZGluZ1B1bGxFbnRyaWVzID0gW107CiAgdmFyIHBlbmRpbmdBY3Rpdml0eUVudHJpZXMgPSBbXTsKICB2YXIgYWN0aXZpdHlSb3dzQ2FjaGUgPSBbXTsKICB2YXIgYWN0aXZpdHlUYWJsZVJlYWR5ID0gZmFsc2U7CiAgdmFyIGFjdGl2aXR5RXJyb3IgPSAiIjsKICB2YXIgYWN0aXZpdHlUcnVuY2F0ZWQgPSBmYWxzZTsKICB2YXIgcHNhUm93c0NhY2hlID0gW107CiAgdmFyIHBzYVRhYmxlUmVhZHkgPSBmYWxzZTsKICB2YXIgcHNhRXJyb3IgPSAiIjsKICB2YXIgcHNhVHJ1bmNhdGVkID0gZmFsc2U7CiAgdmFyIHBlbmRpbmdQU0FHcmFkZUVudHJpZXMgPSBbXTsKICB2YXIgcHNhSW5zZXJ0QnVzeSA9IGZhbHNlOwogIHZhciBsYlBlcmlvZCA9ICJhbGwiOyAvLyBOZ8OgeSAvIHR14bqnbiAvIHRvw6BuIGLhu5kgbOG7i2NoIHPhu60uCiAgdmFyIGxiVmlldyA9ICJ2YWx1ZSI7IC8vIHZhbHVlID0gSOG7mWkgUGjDuiDDlG5nOyB1bmx1Y2t5ID0gSOG7mWkgQ29uIE7hu6M7IHBzYSA9IEjhu5lpIFBTQS4KCiAgZnVuY3Rpb24gc2V0U3RhdHVzKHRleHQsIG9ubGluZSl7CiAgICBpZiAoIWVscy5sYkxpdmUpIHJldHVybjsKICAgIGVscy5sYkxpdmUudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgZWxzLmxiTGl2ZS5jbGFzc05hbWUgPSAicGgtbGItc3RhdHVzIiArIChvbmxpbmUgPyAiIHBoLWxiLW9ubGluZSIgOiAiIik7CiAgICBlbHMubGJMaXZlLnRpdGxlID0gdGV4dDsKICB9CgogIGZ1bmN0aW9uIHNob3dTeW5jRXJyb3IoKXsKICAgIGlmICghbGFzdFN5bmNFcnJvcikgcmV0dXJuOwogICAgc2V0U3RhdHVzKCJM4buXaSBnaGkgQlhIIiwgZmFsc2UpOwogICAgaWYgKGVscy5sYkxpdmUpIGVscy5sYkxpdmUudGl0bGUgPSAiS2jDtG5nIGdoaSDEkcaw4bujYyBwdWJsaWMubGVhZGVyYm9hcmQ6ICIgKyBsYXN0U3luY0Vycm9yOwogIH0KCiAgZnVuY3Rpb24gdHJhaW5lck5hbWUoKXsKICAgIHRyeSB7CiAgICAgIHJldHVybiBTdHJpbmcobG9jYWxTdG9yYWdlLmdldEl0ZW0oInBva2VodWIudHJhaW5lci5uYW1lLnYxIikgfHwgIiIpCiAgICAgICAgLnJlcGxhY2UoL1s8Pl0vZywgIiIpCiAgICAgICAgLnJlcGxhY2UoL1xzKy9nLCAiICIpCiAgICAgICAgLnRyaW0oKQogICAgICAgIC5zbGljZSgwLCAxOCk7CiAgICB9IGNhdGNoKGUpeyByZXR1cm4gIiI7IH0KICB9CgogIGZ1bmN0aW9uIHRyYWluZXJVaWQoKXsKICAgIHZhciBrZXkgPSAicG9rZWh1Yi5sZWFkZXJib2FyZC51aWQudjEiOwogICAgdmFyIHVpZCA9ICIiOwogICAgdHJ5IHsgdWlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCAiIjsgfSBjYXRjaChlKSB7fQogICAgaWYgKCF1aWQpIHsKICAgICAgaWYgKHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7CiAgICAgICAgdWlkID0gd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdWlkID0gInBfIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpICsgIl8iICsgRGF0ZS5ub3coKS50b1N0cmluZygzNik7CiAgICAgIH0KICAgICAgdHJ5IHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB1aWQpOyB9IGNhdGNoKGUpIHt9CiAgICB9CiAgICByZXR1cm4gdWlkOwogIH0KCiAgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb24oKXsKICAgIHZhciBlbXB0eSA9IHsKICAgICAgcGFja3M6MCwgY2FyZHM6MCwgdW5pcXVlX2NhcmRzOjAsCiAgICAgIHRvdGFsX3ZhbHVlOjAsIHNwZW50OjAsIHJvaV9wY3Q6MCwKICAgICAgc2V0c19jb2xsZWN0ZWQ6MCwgcmFyZV9wbHVzOjAsIGNoYXNlX2NhcmRzOjAsCiAgICAgIGJlc3RfdGllcjowLCBiZXN0X3ZhbHVlOjAsIGJlc3RfY2FyZF9uYW1lOiIiLCBiZXN0X2NhcmRfaWQ6IiIsIGJlc3RfY2FyZF9zZXQ6IiIsIGJlc3RfY2FyZF9yYXJpdHk6IiIsIGJlc3RfbHVjazowCiAgICB9OwoKICAgIHRyeSB7CiAgICAgIHZhciByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicG9rZWh1Yi5jb2xsZWN0aW9uLnYyIik7CiAgICAgIGlmICghcmF3KSByZXR1cm4gZW1wdHk7CgogICAgICB2YXIgZGIgPSBKU09OLnBhcnNlKHJhdyk7CiAgICAgIGlmICghZGIgfHwgdHlwZW9mIGRiICE9PSAib2JqZWN0IikgcmV0dXJuIGVtcHR5OwoKICAgICAgdmFyIGNhcmRzID0gZGIuY2FyZHMgJiYgdHlwZW9mIGRiLmNhcmRzID09PSAib2JqZWN0IiA/IGRiLmNhcmRzIDoge307CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY2FyZHMpOwogICAgICB2YXIgdG90YWxDYXJkcyA9IDA7CiAgICAgIHZhciB0b3RhbFZhbHVlID0gMDsKICAgICAgdmFyIGJlc3RUaWVyID0gMDsKICAgICAgdmFyIGJlc3RWYWx1ZSA9IDA7CiAgICAgIHZhciBiZXN0Q2FyZCA9IG51bGw7CiAgICAgIHZhciByYXJlUGx1cyA9IDA7CiAgICAgIHZhciBjaGFzZUNhcmRzID0gMDsKICAgICAgdmFyIHNldHMgPSB7fTsKCiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgICAgdmFyIGUgPSBjYXJkc1tpZF0gfHwge307CiAgICAgICAgdmFyIG4gPSBOdW1iZXIoZS5uKSB8fCAwOwogICAgICAgIHZhciB0aWVyID0gTnVtYmVyKGUudGllcikgfHwgMDsKICAgICAgICB2YXIgcHJpY2UgPSBOdW1iZXIoZS5wcmljZSk7CgogICAgICAgIHRvdGFsQ2FyZHMgKz0gbjsKICAgICAgICBiZXN0VGllciA9IE1hdGgubWF4KGJlc3RUaWVyLCB0aWVyKTsKCiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShwcmljZSkgJiYgcHJpY2UgPiAwKXsKICAgICAgICAgIHRvdGFsVmFsdWUgKz0gcHJpY2UgKiBuOwogICAgICAgICAgaWYgKHByaWNlID4gYmVzdFZhbHVlKXsKICAgICAgICAgICAgYmVzdFZhbHVlID0gcHJpY2U7CiAgICAgICAgICAgIGJlc3RDYXJkID0gewogICAgICAgICAgICAgIGlkOlN0cmluZyhlLmlkIHx8IGlkKSwgbmFtZTpTdHJpbmcoZS5uYW1lIHx8IGUuaWQgfHwgaWQpLAogICAgICAgICAgICAgIHNldDpTdHJpbmcoZS5zZXQgfHwgJycpLCByYXJpdHk6U3RyaW5nKGUucmFyaXR5IHx8ICcnKSwgdGllcjp0aWVyCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aWVyID49IDIpIHJhcmVQbHVzICs9IG47CiAgICAgICAgaWYgKHRpZXIgPj0gNCkgY2hhc2VDYXJkcyArPSBuOwoKICAgICAgICB2YXIgc2lkID0gZS5zZXRJZCA/IFN0cmluZyhlLnNldElkKSA6ICIiOwogICAgICAgIGlmIChzaWQpIHNldHNbc2lkXSA9IHRydWU7CiAgICAgIH0pOwoKICAgICAgdmFyIHBhY2tzID0gTnVtYmVyKGRiLnBhY2tzKSB8fCAwOwogICAgICB2YXIgc3BlbnQgPSBOdW1iZXIoZGIuc3BlbnQpIHx8IDA7CiAgICAgIHZhciByb2kgPSBzcGVudCA+IDAgPyAoKHRvdGFsVmFsdWUgLSBzcGVudCkgLyBzcGVudCkgKiAxMDAgOiAwOwoKICAgICAgcmV0dXJuIHsKICAgICAgICBwYWNrczpwYWNrcywKICAgICAgICBjYXJkczp0b3RhbENhcmRzLAogICAgICAgIHVuaXF1ZV9jYXJkczprZXlzLmxlbmd0aCwKICAgICAgICB0b3RhbF92YWx1ZTpOdW1iZXIodG90YWxWYWx1ZS50b0ZpeGVkKDIpKSwKICAgICAgICBzcGVudDpOdW1iZXIoc3BlbnQudG9GaXhlZCgyKSksCiAgICAgICAgcm9pX3BjdDpOdW1iZXIocm9pLnRvRml4ZWQoMikpLAogICAgICAgIHNldHNfY29sbGVjdGVkOk9iamVjdC5rZXlzKHNldHMpLmxlbmd0aCwKICAgICAgICByYXJlX3BsdXM6cmFyZVBsdXMsCiAgICAgICAgY2hhc2VfY2FyZHM6Y2hhc2VDYXJkcywKICAgICAgICBiZXN0X3RpZXI6YmVzdFRpZXIsCiAgICAgICAgYmVzdF92YWx1ZTpOdW1iZXIoYmVzdFZhbHVlLnRvRml4ZWQoMikpLAogICAgICAgIGJlc3RfY2FyZF9uYW1lOmJlc3RDYXJkID8gYmVzdENhcmQubmFtZSA6ICIiLAogICAgICAgIGJlc3RfY2FyZF9pZDpiZXN0Q2FyZCA/IGJlc3RDYXJkLmlkIDogIiIsCiAgICAgICAgYmVzdF9jYXJkX3NldDpiZXN0Q2FyZCA/IGJlc3RDYXJkLnNldCA6ICIiLAogICAgICAgIGJlc3RfY2FyZF9yYXJpdHk6YmVzdENhcmQgPyBiZXN0Q2FyZC5yYXJpdHkgOiAiIiwKICAgICAgICBiZXN0X2x1Y2s6TWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBOdW1iZXIoZGIuYmVzdEx1Y2spIHx8IDApKQogICAgICB9OwogICAgfSBjYXRjaChlKXsKICAgICAgcmV0dXJuIGVtcHR5OwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3VycmVudFJvdygpewogICAgdmFyIGMgPSByZWFkQ29sbGVjdGlvbigpOwogICAgcmV0dXJuIHsKICAgICAgdWlkOnRyYWluZXJVaWQoKSwKICAgICAgbmFtZTp0cmFpbmVyTmFtZSgpIHx8ICJUcmFpbmVyIiwKICAgICAgcGFja3M6Yy5wYWNrcywKICAgICAgY2FyZHM6Yy5jYXJkcywKICAgICAgdW5pcXVlX2NhcmRzOmMudW5pcXVlX2NhcmRzLAogICAgICB0b3RhbF92YWx1ZTpjLnRvdGFsX3ZhbHVlLAogICAgICBzcGVudDpjLnNwZW50LAogICAgICByb2lfcGN0OmMucm9pX3BjdCwKICAgICAgc2V0c19jb2xsZWN0ZWQ6Yy5zZXRzX2NvbGxlY3RlZCwKICAgICAgcmFyZV9wbHVzOmMucmFyZV9wbHVzLAogICAgICBjaGFzZV9jYXJkczpjLmNoYXNlX2NhcmRzLAogICAgICBiZXN0X3RpZXI6Yy5iZXN0X3RpZXIsCiAgICAgIGJlc3RfdmFsdWU6Yy5iZXN0X3ZhbHVlLAogICAgICBiZXN0X2NhcmRfbmFtZTpjLmJlc3RfY2FyZF9uYW1lLAogICAgICBiZXN0X2NhcmRfaWQ6Yy5iZXN0X2NhcmRfaWQsCiAgICAgIGJlc3RfY2FyZF9zZXQ6Yy5iZXN0X2NhcmRfc2V0LAogICAgICBiZXN0X2NhcmRfcmFyaXR5OmMuYmVzdF9jYXJkX3Jhcml0eSwKICAgICAgYmVzdF9sdWNrOmMuYmVzdF9sdWNrLAogICAgICB1cGRhdGVkX2F0Om5ldyBEYXRlKCkudG9JU09TdHJpbmcoKQogICAgfTsKICB9CgogIGZ1bmN0aW9uIHJvd0ZpbmdlcnByaW50KHJvdyl7CiAgICByZXR1cm4gWwogICAgICByb3cudWlkLHJvdy5uYW1lLHJvdy5wYWNrcyxyb3cuY2FyZHMscm93LnVuaXF1ZV9jYXJkcywKICAgICAgcm93LnRvdGFsX3ZhbHVlLHJvdy5zcGVudCxyb3cucm9pX3BjdCxyb3cuc2V0c19jb2xsZWN0ZWQsCiAgICAgIHJvdy5yYXJlX3BsdXMscm93LmNoYXNlX2NhcmRzLHJvdy5iZXN0X3RpZXIscm93LmJlc3RfdmFsdWUsCiAgICAgIHJvdy5iZXN0X2NhcmRfbmFtZSxyb3cuYmVzdF9jYXJkX2lkLHJvdy5iZXN0X2NhcmRfc2V0LHJvdy5iZXN0X2NhcmRfcmFyaXR5LAogICAgICByb3cuYmVzdF9sdWNrCiAgICBdLmpvaW4oInwiKTsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbGl6ZVJvdyhyb3cpewogICAgcm93ID0gcm93IHx8IHt9OwoKICAgIHZhciBiZXN0VmFsdWUgPSBOdW1iZXIoCiAgICAgIHJvdy5iZXN0X3ZhbHVlICE9IG51bGwgPyByb3cuYmVzdF92YWx1ZSA6CiAgICAgIChyb3cuYmVzdFZhbHVlICE9IG51bGwgPyByb3cuYmVzdFZhbHVlIDogcm93LnZhbHVlKQogICAgKSB8fCAwOwoKICAgIHZhciB0b3RhbFZhbHVlID0gTnVtYmVyKAogICAgICByb3cudG90YWxfdmFsdWUgIT0gbnVsbCA/IHJvdy50b3RhbF92YWx1ZSA6CiAgICAgIChyb3cudG90YWxWYWx1ZSAhPSBudWxsID8gcm93LnRvdGFsVmFsdWUgOiAwKQogICAgKSB8fCAwOwoKICAgIHJldHVybiB7CiAgICAgIHVpZDpTdHJpbmcocm93LnVpZCB8fCByb3cuaWQgfHwgIiIpLAogICAgICBuYW1lOlN0cmluZyhyb3cubmFtZSB8fCByb3cudHJhaW5lciB8fCAiVHJhaW5lciIpLnNsaWNlKDAsMTgpLAogICAgICBwYWNrczpOdW1iZXIocm93LnBhY2tzKXx8MCwKICAgICAgY2FyZHM6TnVtYmVyKHJvdy5jYXJkcyl8fDAsCiAgICAgIHVuaXF1ZTpOdW1iZXIoCiAgICAgICAgcm93LnVuaXF1ZV9jYXJkcyAhPSBudWxsID8gcm93LnVuaXF1ZV9jYXJkcyA6CiAgICAgICAgKHJvdy51bmlxdWUgIT0gbnVsbCA/IHJvdy51bmlxdWUgOiByb3cudW5pcXVlQ2FyZHMpCiAgICAgICl8fDAsCiAgICAgIHRvdGFsVmFsdWU6dG90YWxWYWx1ZSwKICAgICAgc3BlbnQ6TnVtYmVyKHJvdy5zcGVudCl8fDAsCiAgICAgIHJvaVBjdDpOdW1iZXIoCiAgICAgICAgcm93LnJvaV9wY3QgIT0gbnVsbCA/IHJvdy5yb2lfcGN0IDoKICAgICAgICAocm93LnJvaVBjdCAhPSBudWxsID8gcm93LnJvaVBjdCA6IDApCiAgICAgICl8fDAsCiAgICAgIHNldHNDb2xsZWN0ZWQ6TnVtYmVyKAogICAgICAgIHJvdy5zZXRzX2NvbGxlY3RlZCAhPSBudWxsID8gcm93LnNldHNfY29sbGVjdGVkIDoKICAgICAgICAocm93LnNldHNDb2xsZWN0ZWQgIT0gbnVsbCA/IHJvdy5zZXRzQ29sbGVjdGVkIDogcm93LnNldHMpCiAgICAgICl8fDAsCiAgICAgIHJhcmVQbHVzOk51bWJlcigKICAgICAgICByb3cucmFyZV9wbHVzICE9IG51bGwgPyByb3cucmFyZV9wbHVzIDoKICAgICAgICAocm93LnJhcmVQbHVzICE9IG51bGwgPyByb3cucmFyZVBsdXMgOiAwKQogICAgICApfHwwLAogICAgICBjaGFzZUNhcmRzOk51bWJlcigKICAgICAgICByb3cuY2hhc2VfY2FyZHMgIT0gbnVsbCA/IHJvdy5jaGFzZV9jYXJkcyA6CiAgICAgICAgKHJvdy5jaGFzZUNhcmRzICE9IG51bGwgPyByb3cuY2hhc2VDYXJkcyA6IDApCiAgICAgICl8fDAsCiAgICAgIGJlc3RUaWVyOk51bWJlcigKICAgICAgICByb3cuYmVzdF90aWVyICE9IG51bGwgPyByb3cuYmVzdF90aWVyIDoKICAgICAgICAocm93LmJlc3RUaWVyICE9IG51bGwgPyByb3cuYmVzdFRpZXIgOiByb3cudGllcikKICAgICAgKXx8MCwKICAgICAgYmVzdFZhbHVlOmJlc3RWYWx1ZSwKICAgICAgYmVzdENhcmROYW1lOlN0cmluZyhyb3cuYmVzdF9jYXJkX25hbWUgfHwgcm93LmJlc3RDYXJkTmFtZSB8fCAiIiksCiAgICAgIGJlc3RDYXJkSWQ6U3RyaW5nKHJvdy5iZXN0X2NhcmRfaWQgfHwgcm93LmJlc3RDYXJkSWQgfHwgIiIpLAogICAgICBiZXN0Q2FyZFNldDpTdHJpbmcocm93LmJlc3RfY2FyZF9zZXQgfHwgcm93LmJlc3RDYXJkU2V0IHx8ICIiKSwKICAgICAgYmVzdENhcmRSYXJpdHk6U3RyaW5nKHJvdy5iZXN0X2NhcmRfcmFyaXR5IHx8IHJvdy5iZXN0Q2FyZFJhcml0eSB8fCAiIiksCiAgICAgIGJlc3RMdWNrOk51bWJlcigKICAgICAgICByb3cuYmVzdF9sdWNrICE9IG51bGwgPyByb3cuYmVzdF9sdWNrIDoKICAgICAgICAocm93LmJlc3RMdWNrICE9IG51bGwgPyByb3cuYmVzdEx1Y2sgOiAwKQogICAgICApfHwwLAogICAgICB1cGRhdGVkQXQ6cm93LnVwZGF0ZWRfYXQgfHwgcm93LnVwZGF0ZWRBdCB8fCAwCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gc29ydFJvd3Mocm93cyl7CiAgICByZXR1cm4gcm93cy5tYXAobm9ybWFsaXplUm93KS5maWx0ZXIoZnVuY3Rpb24ocil7IHJldHVybiAhIXIudWlkOyB9KS5zb3J0KGZ1bmN0aW9uKGEsYil7CiAgICAgIGlmIChNYXRoLmFicyhiLnRvdGFsVmFsdWUgLSBhLnRvdGFsVmFsdWUpID4gMC4wMSkgcmV0dXJuIGIudG90YWxWYWx1ZSAtIGEudG90YWxWYWx1ZTsKICAgICAgaWYgKE1hdGguYWJzKGIucm9pUGN0IC0gYS5yb2lQY3QpID4gMC4wMSkgcmV0dXJuIGIucm9pUGN0IC0gYS5yb2lQY3Q7CiAgICAgIGlmIChiLnVuaXF1ZSAhPT0gYS51bmlxdWUpIHJldHVybiBiLnVuaXF1ZSAtIGEudW5pcXVlOwogICAgICBpZiAoYi5zZXRzQ29sbGVjdGVkICE9PSBhLnNldHNDb2xsZWN0ZWQpIHJldHVybiBiLnNldHNDb2xsZWN0ZWQgLSBhLnNldHNDb2xsZWN0ZWQ7CiAgICAgIGlmIChiLmNoYXNlQ2FyZHMgIT09IGEuY2hhc2VDYXJkcykgcmV0dXJuIGIuY2hhc2VDYXJkcyAtIGEuY2hhc2VDYXJkczsKICAgICAgaWYgKGIucmFyZVBsdXMgIT09IGEucmFyZVBsdXMpIHJldHVybiBiLnJhcmVQbHVzIC0gYS5yYXJlUGx1czsKICAgICAgaWYgKGIuYmVzdFRpZXIgIT09IGEuYmVzdFRpZXIpIHJldHVybiBiLmJlc3RUaWVyIC0gYS5iZXN0VGllcjsKICAgICAgaWYgKGIuYmVzdEx1Y2sgIT09IGEuYmVzdEx1Y2spIHJldHVybiBiLmJlc3RMdWNrIC0gYS5iZXN0THVjazsKICAgICAgaWYgKE1hdGguYWJzKGIuYmVzdFZhbHVlIC0gYS5iZXN0VmFsdWUpID4gMC4wMSkgcmV0dXJuIGIuYmVzdFZhbHVlIC0gYS5iZXN0VmFsdWU7CiAgICAgIGlmIChhLnBhY2tzICE9PSBiLnBhY2tzKSByZXR1cm4gYS5wYWNrcyAtIGIucGFja3M7CiAgICAgIHJldHVybiBTdHJpbmcoYS51cGRhdGVkQXQpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIudXBkYXRlZEF0KSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHRpZXJMYWJlbCh0aWVyKXsKICAgIHZhciBsYWJlbHMgPSB7CiAgICAgIDA6IkNvbW1vbiIsMToiVW5jb21tb24iLDI6IlJhcmUiLDM6IkRvdWJsZSBSYXJlIiwKICAgICAgNDoiVWx0cmEgUmFyZSIsNToiU3BlY2lhbCIsNjoiQ3Jvd24gUmFyZSIKICAgIH07CiAgICByZXR1cm4gbGFiZWxzW3RpZXJdIHx8ICLigJQiOwogIH0KCiAgZnVuY3Rpb24gbW9uZXkodmFsdWUpeyByZXR1cm4gIiQiICsgTnVtYmVyKHZhbHVlIHx8IDApLnRvRml4ZWQoMik7IH0KCiAgZnVuY3Rpb24gYWN0aXZpdHlQZXJpb2RTdGFydChwZXJpb2QpewogICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7CiAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCksIDAsIDAsIDAsIDApOwogICAgaWYgKHBlcmlvZCA9PT0gIndlZWsiKXsKICAgICAgLy8gQ2FsZW5kYXIgd2VlayBzdGFydHMgb24gTW9uZGF5IGluIHRoZSB2aXNpdG9yJ3MgbG9jYWwgdGltZXpvbmUuCiAgICAgIHZhciBkYXlzU2luY2VNb25kYXkgPSAoc3RhcnQuZ2V0RGF5KCkgKyA2KSAlIDc7CiAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gZGF5c1NpbmNlTW9uZGF5KTsKICAgIH0KICAgIHJldHVybiBzdGFydDsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdExvY2FsRGF0ZShkYXRlKXsKICAgIHRyeSB7IHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgidmktVk4iLCB7ZGF5OiIyLWRpZ2l0IiwgbW9udGg6IjItZGlnaXQiLCB5ZWFyOiJudW1lcmljIn0pLmZvcm1hdChkYXRlKTsgfQogICAgY2F0Y2goZSl7IHJldHVybiBkYXRlLmdldERhdGUoKSArICIvIiArIChkYXRlLmdldE1vbnRoKCkrMSkgKyAiLyIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7IH0KICB9CgogIGZ1bmN0aW9uIGFjdGl2aXR5UGVyaW9kUmFuZ2VMYWJlbChwZXJpb2QpewogICAgdmFyIHN0YXJ0ID0gYWN0aXZpdHlQZXJpb2RTdGFydChwZXJpb2QpOwogICAgaWYgKHBlcmlvZCA9PT0gImRheSIpIHJldHVybiAiSMO0bSBuYXkgwrcgdOG7qyAwMDowMCDCtyAiICsgZm9ybWF0TG9jYWxEYXRlKHN0YXJ0KTsKICAgIGlmIChwZXJpb2QgPT09ICJ3ZWVrIikgcmV0dXJuICJUdeG6p24gdOG7qyB0aOG7qSBIYWkgwrcgIiArIGZvcm1hdExvY2FsRGF0ZShzdGFydCk7CiAgICByZXR1cm4gIlRvw6BuIGLhu5kgbOG7i2NoIHPhu60gaG/huqF0IMSR4buZbmcgxJHDoyBnaGkgbmjhuq1uIjsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGxvYWRQZXJpb2RBY3Rpdml0eShwZXJpb2QpewogICAgaWYgKCFjbGllbnQpIHRocm93IG5ldyBFcnJvcigiU3VwYWJhc2UgY2jGsGEga+G6v3QgbuG7kWkuIik7CiAgICB2YXIgc3RhcnRJc28gPSAocGVyaW9kID09PSAiYWxsIiA/IG5ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKSA6IGFjdGl2aXR5UGVyaW9kU3RhcnQocGVyaW9kKSkudG9JU09TdHJpbmcoKTsKICAgIHZhciBnYXRoZXJlZCA9IFtdOwogICAgdmFyIHBhZ2VTaXplID0gMTAwMDsKICAgIHZhciBtYXhSb3dzID0gNTAwMDsKICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IG1heFJvd3M7IG9mZnNldCArPSBwYWdlU2l6ZSl7CiAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQuZnJvbShBQ1RJVklUWV9UQUJMRSkKICAgICAgICAuc2VsZWN0KCJpZCx1aWQsdHJhaW5lcl9uYW1lLHBhY2tfY291bnQscGFja19wcmljZSxjYXJkX2NvdW50LGNhcmRfdmFsdWVfdG90YWwsc2V0X2lkLHNldF9uYW1lLGNyZWF0ZWRfYXQiKQogICAgICAgIC5ndGUoImNyZWF0ZWRfYXQiLCBzdGFydElzbykKICAgICAgICAub3JkZXIoImNyZWF0ZWRfYXQiLCB7YXNjZW5kaW5nOmZhbHNlfSkKICAgICAgICAucmFuZ2Uob2Zmc2V0LCBvZmZzZXQgKyBwYWdlU2l6ZSAtIDEpOwogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQuZXJyb3I7CiAgICAgIHZhciBwYWdlID0gQXJyYXkuaXNBcnJheShyZXN1bHQuZGF0YSkgPyByZXN1bHQuZGF0YSA6IFtdOwogICAgICBnYXRoZXJlZCA9IGdhdGhlcmVkLmNvbmNhdChwYWdlKTsKICAgICAgaWYgKHBhZ2UubGVuZ3RoIDwgcGFnZVNpemUpIGJyZWFrOwogICAgfQogICAgYWN0aXZpdHlSb3dzQ2FjaGUgPSBnYXRoZXJlZDsKICAgIGFjdGl2aXR5VGFibGVSZWFkeSA9IHRydWU7CiAgICBhY3Rpdml0eUVycm9yID0gIiI7CiAgICBhY3Rpdml0eVRydW5jYXRlZCA9IGdhdGhlcmVkLmxlbmd0aCA+PSBtYXhSb3dzOwogICAgcmV0dXJuIGdhdGhlcmVkOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRBY3Rpdml0eUxlYWRlcmJvYXJkUm93cygpewogICAgdmFyIGdyb3VwZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgYWN0aXZpdHlSb3dzQ2FjaGUuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7CiAgICAgIGlmICghZW50cnkpIHJldHVybjsKICAgICAgdmFyIHVpZCA9IFN0cmluZyhlbnRyeS51aWQgfHwgIiIpLnRyaW0oKTsKICAgICAgaWYgKCF1aWQpIHJldHVybjsKICAgICAgdmFyIHJvdyA9IGdyb3VwZWRbdWlkXTsKICAgICAgaWYgKCFyb3cpewogICAgICAgIHZhciBleGlzdGluZyA9IHJvd3NDYWNoZS5maW5kKGZ1bmN0aW9uKGNhbmRpZGF0ZSl7IHJldHVybiBTdHJpbmcoY2FuZGlkYXRlLnVpZCB8fCAiIikgPT09IHVpZDsgfSk7CiAgICAgICAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVSb3coZXhpc3RpbmcgfHwge3VpZDp1aWQsIG5hbWU6ZW50cnkudHJhaW5lcl9uYW1lIHx8ICJUcmFpbmVyIn0pOwogICAgICAgIHJvdyA9IGdyb3VwZWRbdWlkXSA9IE9iamVjdC5hc3NpZ24oe30sIG5vcm1hbGl6ZWQsIHsKICAgICAgICAgIHVpZDp1aWQsCiAgICAgICAgICBuYW1lOlN0cmluZyhlbnRyeS50cmFpbmVyX25hbWUgfHwgbm9ybWFsaXplZC5uYW1lIHx8ICJUcmFpbmVyIikuc2xpY2UoMCwxOCksCiAgICAgICAgICB0b3RhbFZhbHVlOjAsCiAgICAgICAgICBzcGVudDowLAogICAgICAgICAgbG9zczowLAogICAgICAgICAgcm9pUGN0OjAsCiAgICAgICAgICBwYWNrczowLAogICAgICAgICAgY2FyZHM6MCwKICAgICAgICAgIGFjdGl2aXR5RXZlbnRzOjAsCiAgICAgICAgICBwZXJpb2RVcGRhdGVkQXQ6ZW50cnkuY3JlYXRlZF9hdCB8fCAiIgogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJvdy50b3RhbFZhbHVlICs9IE1hdGgubWF4KDAsIE51bWJlcihlbnRyeS5jYXJkX3ZhbHVlX3RvdGFsKSB8fCAwKTsKICAgICAgdmFyIGV2ZW50UGFja3MgPSBNYXRoLm1heCgwLCBOdW1iZXIoZW50cnkucGFja19jb3VudCkgfHwgMCk7CiAgICAgIHZhciBldmVudFBhY2tQcmljZSA9IE51bWJlcihlbnRyeS5wYWNrX3ByaWNlKTsKICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZXZlbnRQYWNrUHJpY2UpIHx8IGV2ZW50UGFja1ByaWNlIDw9IDApIGV2ZW50UGFja1ByaWNlID0gNC40OTsKICAgICAgcm93LnNwZW50ICs9IGV2ZW50UGFja3MgKiBldmVudFBhY2tQcmljZTsKICAgICAgcm93LnBhY2tzICs9IGV2ZW50UGFja3M7CiAgICAgIHJvdy5jYXJkcyArPSBNYXRoLm1heCgwLCBOdW1iZXIoZW50cnkuY2FyZF9jb3VudCkgfHwgMCk7CiAgICAgIHJvdy5hY3Rpdml0eUV2ZW50cyArPSAxOwogICAgICBpZiAoZW50cnkuY3JlYXRlZF9hdCAmJiAoIXJvdy5wZXJpb2RVcGRhdGVkQXQgfHwgU3RyaW5nKGVudHJ5LmNyZWF0ZWRfYXQpID4gU3RyaW5nKHJvdy5wZXJpb2RVcGRhdGVkQXQpKSkgcm93LnBlcmlvZFVwZGF0ZWRBdCA9IGVudHJ5LmNyZWF0ZWRfYXQ7CiAgICAgIGlmIChlbnRyeS50cmFpbmVyX25hbWUpIHJvdy5uYW1lID0gU3RyaW5nKGVudHJ5LnRyYWluZXJfbmFtZSkuc2xpY2UoMCwxOCk7CiAgICB9KTsKICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cGVkKS5tYXAoZnVuY3Rpb24odWlkKXsKICAgICAgdmFyIHJvdyA9IGdyb3VwZWRbdWlkXTsKICAgICAgcm93LnRvdGFsVmFsdWUgPSBOdW1iZXIocm93LnRvdGFsVmFsdWUudG9GaXhlZCgyKSk7CiAgICAgIHJvdy5zcGVudCA9IE51bWJlcihyb3cuc3BlbnQudG9GaXhlZCgyKSk7CiAgICAgIHJvdy5sb3NzID0gTnVtYmVyKE1hdGgubWF4KDAsIHJvdy5zcGVudCAtIHJvdy50b3RhbFZhbHVlKS50b0ZpeGVkKDIpKTsKICAgICAgcm93LnJvaVBjdCA9IHJvdy5zcGVudCA+IDAgPyBOdW1iZXIoKCgocm93LnRvdGFsVmFsdWUgLSByb3cuc3BlbnQpIC8gcm93LnNwZW50KSAqIDEwMCkudG9GaXhlZCgyKSkgOiAwOwogICAgICByb3cucGVyaW9kVmFsdWUgPSByb3cudG90YWxWYWx1ZTsKICAgICAgcm93LnVwZGF0ZWRBdCA9IHJvdy5wZXJpb2RVcGRhdGVkQXQgfHwgcm93LnVwZGF0ZWRBdDsKICAgICAgcmV0dXJuIHJvdzsKICAgIH0pLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgaWYgKE1hdGguYWJzKGIudG90YWxWYWx1ZSAtIGEudG90YWxWYWx1ZSkgPiAwLjAxKSByZXR1cm4gYi50b3RhbFZhbHVlIC0gYS50b3RhbFZhbHVlOwogICAgICBpZiAoYi5wYWNrcyAhPT0gYS5wYWNrcykgcmV0dXJuIGIucGFja3MgLSBhLnBhY2tzOwogICAgICBpZiAoYi5jYXJkcyAhPT0gYS5jYXJkcykgcmV0dXJuIGIuY2FyZHMgLSBhLmNhcmRzOwogICAgICByZXR1cm4gU3RyaW5nKGEubmFtZSkubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5uYW1lKSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlY29yZExlYWRlcmJvYXJkQWN0aXZpdHkoZGV0YWlsKXsKICAgIGRldGFpbCA9IGRldGFpbCB8fCB7fTsKICAgIHZhciBjYXJkcyA9IEFycmF5LmlzQXJyYXkoZGV0YWlsLmNhcmRzKSA/IGRldGFpbC5jYXJkcyA6IFtdOwogICAgdmFyIHBhY2tDb3VudCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDEwLCBNYXRoLmZsb29yKE51bWJlcihkZXRhaWwucGFja3MpIHx8IDEpKSk7CiAgICBpZiAoIWNhcmRzLmxlbmd0aCAmJiAhcGFja0NvdW50KSByZXR1cm47CiAgICB2YXIgdmFsdWUgPSBjYXJkcy5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBjYXJkKXsKICAgICAgdmFyIHByaWNlID0gY2FyZCAmJiBjYXJkLnByaWNlICE9IG51bGwgPyBOdW1iZXIoY2FyZC5wcmljZSkgOiAwOwogICAgICByZXR1cm4gc3VtICsgKE51bWJlci5pc0Zpbml0ZShwcmljZSkgJiYgcHJpY2UgPiAwID8gcHJpY2UgOiAwKTsKICAgIH0sIDApOwogICAgdmFyIHBhY2tQcmljZSA9IE51bWJlcihkZXRhaWwucGFja1ByaWNlKTsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBhY2tQcmljZSkgfHwgcGFja1ByaWNlIDw9IDApIHBhY2tQcmljZSA9IDQuNDk7CiAgICBwYWNrUHJpY2UgPSBNYXRoLm1pbigxMDAwLCBNYXRoLm1heCgwLjAxLCBwYWNrUHJpY2UpKTsKICAgIHZhciBlbnRyeSA9IHsKICAgICAgdWlkOnRyYWluZXJVaWQoKSwKICAgICAgdHJhaW5lcl9uYW1lOih0cmFpbmVyTmFtZSgpIHx8ICJUcmFpbmVyIikuc2xpY2UoMCwxOCksCiAgICAgIHBhY2tfY291bnQ6cGFja0NvdW50LAogICAgICBwYWNrX3ByaWNlOk51bWJlcihwYWNrUHJpY2UudG9GaXhlZCgyKSksCiAgICAgIGNhcmRfY291bnQ6Y2FyZHMubGVuZ3RoLAogICAgICBjYXJkX3ZhbHVlX3RvdGFsOk51bWJlcih2YWx1ZS50b0ZpeGVkKDIpKSwKICAgICAgc2V0X2lkOlN0cmluZyhkZXRhaWwuc2V0SWQgfHwgKGNhcmRzWzBdICYmIGNhcmRzWzBdLnNldElkKSB8fCAiIikuc2xpY2UoMCw4MCkgfHwgbnVsbCwKICAgICAgc2V0X25hbWU6U3RyaW5nKGRldGFpbC5zZXROYW1lIHx8IChjYXJkc1swXSAmJiBjYXJkc1swXS5zZXQpIHx8ICIiKS5zbGljZSgwLDE2MCkgfHwgbnVsbAogICAgfTsKICAgIGlmICghY2xpZW50KXsKICAgICAgcGVuZGluZ0FjdGl2aXR5RW50cmllcyA9IHBlbmRpbmdBY3Rpdml0eUVudHJpZXMuY29uY2F0KFtlbnRyeV0pLnNsaWNlKC0xMDApOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWFjdGl2aXR5VGFibGVSZWFkeSl7CiAgICAgIC8vIFRoZSBTUUwgbWlncmF0aW9uIG1heSBub3QgaGF2ZSBiZWVuIHJ1biB5ZXQ7IGRvIG5vdCBsZXQgYWN0aXZpdHkgdHJhY2tpbmcgYnJlYWsgcGFjayBvcGVuaW5nLgogICAgICBjb25zb2xlLndhcm4oIltCWEggTmfDoHkvVHXhuqduXSBDaMawYSBnaGkgxJHGsOG7o2MgbMaw4bujdCBt4bufLiBIw6N5IGNo4bqheSBTUUwgbWlncmF0aW9uIGxlYWRlcmJvYXJkX2FjdGl2aXR5LiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjbGllbnQuZnJvbShBQ1RJVklUWV9UQUJMRSkuaW5zZXJ0KGVudHJ5KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC5lcnJvcjsKICAgICAgaWYgKGVscy5sYk1vZGFsICYmICFlbHMubGJNb2RhbC5oaWRkZW4gJiYgbGJQZXJpb2QgIT09ICJhbGwiKSByZWZyZXNoTGVhZGVyYm9hcmQoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIGFjdGl2aXR5RXJyb3IgPSBTdHJpbmcoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciB8fCAiS2jDtG5nIHLDtSBs4buXaSIpOwogICAgICBhY3Rpdml0eVRhYmxlUmVhZHkgPSBmYWxzZTsKICAgICAgY29uc29sZS53YXJuKCJbQlhIIE5nw6B5L1R14bqnbl0gS2jDtG5nIGdoaSDEkcaw4bujYyBsZWFkZXJib2FyZF9hY3Rpdml0eToiLCBlcnIpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBmbHVzaFBlbmRpbmdBY3Rpdml0eUVudHJpZXMoKXsKICAgIGlmICghY2xpZW50IHx8ICFhY3Rpdml0eVRhYmxlUmVhZHkgfHwgIXBlbmRpbmdBY3Rpdml0eUVudHJpZXMubGVuZ3RoKSByZXR1cm47CiAgICB2YXIgYmF0Y2ggPSBwZW5kaW5nQWN0aXZpdHlFbnRyaWVzLnNsaWNlKC0xMDApOwogICAgcGVuZGluZ0FjdGl2aXR5RW50cmllcyA9IFtdOwogICAgY2xpZW50LmZyb20oQUNUSVZJVFlfVEFCTEUpLmluc2VydChiYXRjaCkudGhlbihmdW5jdGlvbihyZXN1bHQpewogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQuZXJyb3I7CiAgICAgIGlmIChlbHMubGJNb2RhbCAmJiAhZWxzLmxiTW9kYWwuaGlkZGVuICYmIGxiUGVyaW9kICE9PSAiYWxsIikgcmVmcmVzaExlYWRlcmJvYXJkKCk7CiAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpewogICAgICBhY3Rpdml0eUVycm9yID0gU3RyaW5nKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIgfHwgIktow7RuZyByw7UgbOG7l2kiKTsKICAgICAgY29uc29sZS53YXJuKCJbQlhIIE5nw6B5L1R14bqnbl0gS2jDtG5nIMSR4bqpeSDEkcaw4bujYyBsxrDhu6N0IG3hu58gxJFhbmcgY2jhu506IiwgZXJyKTsKICAgIH0pOwogIH0KCgogIHZhciBQU0FfVVBMT0FERURfSURTX0tFWSA9ICJwb2tlaHViLnBzYS5zeW5jZWRfaWRzLnYxIjsKICBmdW5jdGlvbiByZWFkVXBsb2FkZWRQU0FJZHMoKXsKICAgIHRyeXsKICAgICAgdmFyIHZhbHVlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShQU0FfVVBMT0FERURfSURTX0tFWSkgfHwgIltdIik7CiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChTdHJpbmcpIDogW107CiAgICB9Y2F0Y2goZSl7IHJldHVybiBbXTsgfQogIH0KICBmdW5jdGlvbiBtYXJrUFNBSWRzVXBsb2FkZWQoaWRzKXsKICAgIHZhciBleGlzdGluZyA9IHJlYWRVcGxvYWRlZFBTQUlkcygpOwogICAgdmFyIHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZXhpc3RpbmcuY29uY2F0KGlkcy5tYXAoU3RyaW5nKSkuZm9yRWFjaChmdW5jdGlvbihpZCl7IGlmKGlkKSBzZWVuW2lkXSA9IHRydWU7IH0pOwogICAgdHJ5eyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShQU0FfVVBMT0FERURfSURTX0tFWSwgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc2Vlbikuc2xpY2UoLTMwMDApKSk7IH1jYXRjaChlKXt9CiAgfQogIGZ1bmN0aW9uIG5vcm1hbGl6ZVBTQUdyYWRlRW50cnkoZW50cnkpewogICAgZW50cnkgPSBlbnRyeSB8fCB7fTsKICAgIHZhciBncmFkZUlkID0gU3RyaW5nKGVudHJ5LmdyYWRlSWQgfHwgZW50cnkuZ3JhZGVfaWQgfHwgIiIpLnRyaW0oKS5zbGljZSgwLDEyMCk7CiAgICB2YXIgZ3JhZGUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigxMCwgTWF0aC5mbG9vcihOdW1iZXIoZW50cnkuZ3JhZGUpIHx8IDEpKSk7CiAgICBpZiAoIWdyYWRlSWQpIHJldHVybiBudWxsOwogICAgdmFyIHByaWNlID0gTnVtYmVyKGVudHJ5LnByaWNlICE9IG51bGwgPyBlbnRyeS5wcmljZSA6IGVudHJ5LmNhcmRfcHJpY2UpOwogICAgcmV0dXJuIHsKICAgICAgZ3JhZGVfaWQ6Z3JhZGVJZCwKICAgICAgdWlkOnRyYWluZXJVaWQoKSwKICAgICAgdHJhaW5lcl9uYW1lOih0cmFpbmVyTmFtZSgpIHx8ICJUcmFpbmVyIikuc2xpY2UoMCwxOCksCiAgICAgIGNhcmRfaWQ6U3RyaW5nKGVudHJ5LmNhcmRJZCB8fCBlbnRyeS5jYXJkX2lkIHx8ICJ1bmtub3duIikuc2xpY2UoMCwxMjApLAogICAgICBjYXJkX25hbWU6U3RyaW5nKGVudHJ5Lm5hbWUgfHwgZW50cnkuY2FyZF9uYW1lIHx8ICJQb2vDqW1vbiBjYXJkIikuc2xpY2UoMCwxNjApLAogICAgICBzZXRfbmFtZTpTdHJpbmcoZW50cnkuc2V0IHx8IGVudHJ5LnNldF9uYW1lIHx8ICIiKS5zbGljZSgwLDE2MCksCiAgICAgIHJhcml0eTpTdHJpbmcoZW50cnkucmFyaXR5IHx8ICIiKS5zbGljZSgwLDEwMCksCiAgICAgIGdyYWRlOmdyYWRlLAogICAgICBjYXJkX3ByaWNlOihOdW1iZXIuaXNGaW5pdGUocHJpY2UpICYmIHByaWNlID4gMCkgPyBOdW1iZXIoTWF0aC5taW4ocHJpY2UsMTAwMDAwMDApLnRvRml4ZWQoMikpIDogbnVsbAogICAgfTsKICB9CiAgZnVuY3Rpb24gcXVldWVQU0FHcmFkZShlbnRyeSl7CiAgICB2YXIgcm93ID0gbm9ybWFsaXplUFNBR3JhZGVFbnRyeShlbnRyeSk7CiAgICBpZiAoIXJvdykgcmV0dXJuOwogICAgdmFyIHVwbG9hZGVkID0gcmVhZFVwbG9hZGVkUFNBSWRzKCk7CiAgICBpZiAodXBsb2FkZWQuaW5kZXhPZihyb3cuZ3JhZGVfaWQpICE9PSAtMSkgcmV0dXJuOwogICAgaWYgKCFwZW5kaW5nUFNBR3JhZGVFbnRyaWVzLnNvbWUoZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtLmdyYWRlX2lkID09PSByb3cuZ3JhZGVfaWQ7IH0pKXsKICAgICAgcGVuZGluZ1BTQUdyYWRlRW50cmllcy5wdXNoKHJvdyk7CiAgICAgIHBlbmRpbmdQU0FHcmFkZUVudHJpZXMgPSBwZW5kaW5nUFNBR3JhZGVFbnRyaWVzLnNsaWNlKC0zMDAwKTsKICAgIH0KICAgIGlmIChjbGllbnQgJiYgcHNhVGFibGVSZWFkeSkgZmx1c2hQZW5kaW5nUFNBR3JhZGVzKCk7CiAgfQogIHdpbmRvdy5fX3Bva2VodWJSZWNvcmRQU0FHcmFkZSA9IHF1ZXVlUFNBR3JhZGU7CiAgd2luZG93Ll9fcG9rZWh1YlJlY29yZFBTQUdyYWRlcyA9IGZ1bmN0aW9uKGVudHJpZXMpewogICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm47CiAgICBlbnRyaWVzLmZvckVhY2gocXVldWVQU0FHcmFkZSk7CiAgfTsKCiAgYXN5bmMgZnVuY3Rpb24gZmx1c2hQZW5kaW5nUFNBR3JhZGVzKCl7CiAgICBpZiAoIWNsaWVudCB8fCAhcHNhVGFibGVSZWFkeSB8fCBwc2FJbnNlcnRCdXN5IHx8ICFwZW5kaW5nUFNBR3JhZGVFbnRyaWVzLmxlbmd0aCkgcmV0dXJuOwogICAgcHNhSW5zZXJ0QnVzeSA9IHRydWU7CiAgICB2YXIgYmF0Y2ggPSBwZW5kaW5nUFNBR3JhZGVFbnRyaWVzLnNwbGljZSgwLDEwMCk7CiAgICB0cnl7CiAgICAgIHZhciBpZHMgPSBiYXRjaC5tYXAoZnVuY3Rpb24ocm93KXsgcmV0dXJuIHJvdy5ncmFkZV9pZDsgfSk7CiAgICAgIC8qIEluc2VydCB3aXRob3V0IGR1cGxpY2F0ZXMgc28gZXhpc3RpbmcgbG9jYWwgZ3JhZGVzIGNhbiBzYWZlbHkgc3luYyBvbiBsYXRlciB2aXNpdHMuICovCiAgICAgIHZhciBpbnNlcnRSZXN1bHQgPSBhd2FpdCBjbGllbnQuZnJvbShQU0FfVEFCTEUpLnVwc2VydChiYXRjaCwge29uQ29uZmxpY3Q6ImdyYWRlX2lkIiwgaWdub3JlRHVwbGljYXRlczp0cnVlfSk7CiAgICAgIGlmIChpbnNlcnRSZXN1bHQuZXJyb3IpIHRocm93IGluc2VydFJlc3VsdC5lcnJvcjsKICAgICAgbWFya1BTQUlkc1VwbG9hZGVkKGlkcyk7CiAgICAgIHBzYUVycm9yID0gIiI7CiAgICAgIGlmIChlbHMubGJNb2RhbCAmJiAhZWxzLmxiTW9kYWwuaGlkZGVuICYmIGxiVmlldyA9PT0gInBzYSIpIHJlZnJlc2hMZWFkZXJib2FyZCgpOwogICAgfWNhdGNoKGVycil7CiAgICAgIHBzYUVycm9yID0gU3RyaW5nKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIgfHwgIktow7RuZyB0aOG7gyDEkeG7k25nIGLhu5kgxJFp4buDbSBQU0EiKTsKICAgICAgcGVuZGluZ1BTQUdyYWRlRW50cmllcyA9IGJhdGNoLmNvbmNhdChwZW5kaW5nUFNBR3JhZGVFbnRyaWVzKS5zbGljZSgtMzAwMCk7CiAgICAgIGNvbnNvbGUud2FybigiW0jhu5lpIFBTQV0gQ2jGsGEgxJHhu5NuZyBi4buZIMSRxrDhu6NjIGThu68gbGnhu4d1LiBLaeG7g20gdHJhIGLhuqNuZyBwdWJsaWMucHNhX2dyYWRlcyB2w6AgU1FMIMSRaSBrw6htOiIsIGVycik7CiAgICB9ZmluYWxseXsKICAgICAgcHNhSW5zZXJ0QnVzeSA9IGZhbHNlOwogICAgICBpZiAocGVuZGluZ1BTQUdyYWRlRW50cmllcy5sZW5ndGggJiYgY2xpZW50ICYmIHBzYVRhYmxlUmVhZHkgJiYgIXBzYUVycm9yKXsKICAgICAgICBzZXRUaW1lb3V0KGZsdXNoUGVuZGluZ1BTQUdyYWRlcywgMCk7CiAgICAgIH0KICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIGxvYWRQU0FHcmFkZXMocGVyaW9kKXsKICAgIGlmICghY2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoIlN1cGFiYXNlIGNoxrBhIGvhur90IG7hu5FpLiIpOwogICAgdmFyIHN0YXJ0SXNvID0gKHBlcmlvZCA9PT0gImFsbCIgPyBuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIikgOiBhY3Rpdml0eVBlcmlvZFN0YXJ0KHBlcmlvZCkpLnRvSVNPU3RyaW5nKCk7CiAgICB2YXIgZ2F0aGVyZWQgPSBbXTsKICAgIHZhciBwYWdlU2l6ZSA9IDEwMDA7CiAgICB2YXIgbWF4Um93cyA9IDUwMDA7CiAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBtYXhSb3dzOyBvZmZzZXQgKz0gcGFnZVNpemUpewogICAgICB2YXIgcXVlcnkgPSBjbGllbnQuZnJvbShQU0FfVEFCTEUpCiAgICAgICAgLnNlbGVjdCgiZ3JhZGVfaWQsdWlkLHRyYWluZXJfbmFtZSxjYXJkX2lkLGNhcmRfbmFtZSxzZXRfbmFtZSxyYXJpdHksZ3JhZGUsY2FyZF9wcmljZSxjcmVhdGVkX2F0IikKICAgICAgICAuZ3RlKCJjcmVhdGVkX2F0Iiwgc3RhcnRJc28pCiAgICAgICAgLm9yZGVyKCJjcmVhdGVkX2F0Iiwge2FzY2VuZGluZzpmYWxzZX0pCiAgICAgICAgLnJhbmdlKG9mZnNldCwgb2Zmc2V0ICsgcGFnZVNpemUgLSAxKTsKICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5OwogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQuZXJyb3I7CiAgICAgIHZhciBwYWdlID0gQXJyYXkuaXNBcnJheShyZXN1bHQuZGF0YSkgPyByZXN1bHQuZGF0YSA6IFtdOwogICAgICBnYXRoZXJlZCA9IGdhdGhlcmVkLmNvbmNhdChwYWdlKTsKICAgICAgaWYgKHBhZ2UubGVuZ3RoIDwgcGFnZVNpemUpIGJyZWFrOwogICAgfQogICAgcHNhUm93c0NhY2hlID0gZ2F0aGVyZWQ7CiAgICBwc2FUYWJsZVJlYWR5ID0gdHJ1ZTsKICAgIHBzYUVycm9yID0gIiI7CiAgICBwc2FUcnVuY2F0ZWQgPSBnYXRoZXJlZC5sZW5ndGggPj0gbWF4Um93czsKICAgIHJldHVybiBnYXRoZXJlZDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUFNBTGVhZGVyYm9hcmRSb3dzKCl7CiAgICB2YXIgZ3JvdXBlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBwc2FSb3dzQ2FjaGUuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7CiAgICAgIGlmICghZW50cnkpIHJldHVybjsKICAgICAgdmFyIHVpZCA9IFN0cmluZyhlbnRyeS51aWQgfHwgIiIpLnRyaW0oKTsKICAgICAgaWYgKCF1aWQpIHJldHVybjsKICAgICAgdmFyIHJvdyA9IGdyb3VwZWRbdWlkXTsKICAgICAgaWYgKCFyb3cpewogICAgICAgIHJvdyA9IGdyb3VwZWRbdWlkXSA9IHsKICAgICAgICAgIHVpZDp1aWQsCiAgICAgICAgICBuYW1lOlN0cmluZyhlbnRyeS50cmFpbmVyX25hbWUgfHwgIlRyYWluZXIiKS5zbGljZSgwLDE4KSwKICAgICAgICAgIHBhY2tzOjAsY2FyZHM6MCx1bmlxdWU6MCx0b3RhbFZhbHVlOjAsc3BlbnQ6MCxyb2lQY3Q6MCwKICAgICAgICAgIHNldHNDb2xsZWN0ZWQ6MCxyYXJlUGx1czowLGNoYXNlQ2FyZHM6MCxiZXN0VGllcjowLGJlc3RWYWx1ZTowLAogICAgICAgICAgYmVzdENhcmROYW1lOiIiLGJlc3RDYXJkSWQ6IiIsYmVzdENhcmRTZXQ6IiIsYmVzdENhcmRSYXJpdHk6IiIsYmVzdEx1Y2s6MCwKICAgICAgICAgIHBzYUdyYWRlczowLHBzYTEwQ291bnQ6MCxwc2E5UGx1c0NvdW50OjAscHNhR3JhZGVUb3RhbDowLHBzYVNjb3JlOjAsCiAgICAgICAgICBwc2FBdmdHcmFkZTowLHBzYUJlc3RHcmFkZTowLHBzYUJlc3RDYXJkTmFtZToiIix1cGRhdGVkQXQ6ZW50cnkuY3JlYXRlZF9hdCB8fCAiIgogICAgICAgIH07CiAgICAgIH0KICAgICAgdmFyIGdyYWRlID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMTAsIE1hdGguZmxvb3IoTnVtYmVyKGVudHJ5LmdyYWRlKSB8fCAxKSkpOwogICAgICByb3cucHNhR3JhZGVzICs9IDE7CiAgICAgIHJvdy5wc2FHcmFkZVRvdGFsICs9IGdyYWRlOwogICAgICByb3cucHNhU2NvcmUgKz0gZ3JhZGUgKiBncmFkZTsKICAgICAgaWYgKGdyYWRlID09PSAxMCkgcm93LnBzYTEwQ291bnQgKz0gMTsKICAgICAgaWYgKGdyYWRlID49IDkpIHJvdy5wc2E5UGx1c0NvdW50ICs9IDE7CiAgICAgIGlmIChncmFkZSA+IHJvdy5wc2FCZXN0R3JhZGUpewogICAgICAgIHJvdy5wc2FCZXN0R3JhZGUgPSBncmFkZTsKICAgICAgICByb3cucHNhQmVzdENhcmROYW1lID0gU3RyaW5nKGVudHJ5LmNhcmRfbmFtZSB8fCAiUG9rw6ltb24gY2FyZCIpOwogICAgICB9CiAgICAgIGlmIChlbnRyeS5jcmVhdGVkX2F0ICYmICghcm93LnVwZGF0ZWRBdCB8fCBTdHJpbmcoZW50cnkuY3JlYXRlZF9hdCkgPiBTdHJpbmcocm93LnVwZGF0ZWRBdCkpKSByb3cudXBkYXRlZEF0ID0gZW50cnkuY3JlYXRlZF9hdDsKICAgICAgaWYgKGVudHJ5LnRyYWluZXJfbmFtZSkgcm93Lm5hbWUgPSBTdHJpbmcoZW50cnkudHJhaW5lcl9uYW1lKS5zbGljZSgwLDE4KTsKICAgIH0pOwogICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwZWQpLm1hcChmdW5jdGlvbih1aWQpewogICAgICB2YXIgcm93ID0gZ3JvdXBlZFt1aWRdOwogICAgICByb3cuY2FyZHMgPSByb3cucHNhR3JhZGVzOwogICAgICByb3cudW5pcXVlID0gcm93LnBzYUdyYWRlczsKICAgICAgcm93LnBzYUF2Z0dyYWRlID0gcm93LnBzYUdyYWRlcyA/IE51bWJlcigocm93LnBzYUdyYWRlVG90YWwgLyByb3cucHNhR3JhZGVzKS50b0ZpeGVkKDIpKSA6IDA7CiAgICAgIHJvdy50b3RhbFZhbHVlID0gcm93LnBzYVNjb3JlOwogICAgICByZXR1cm4gcm93OwogICAgfSkuc29ydChmdW5jdGlvbihhLGIpewogICAgICBpZiAoYi5wc2ExMENvdW50ICE9PSBhLnBzYTEwQ291bnQpIHJldHVybiBiLnBzYTEwQ291bnQgLSBhLnBzYTEwQ291bnQ7CiAgICAgIGlmIChiLnBzYTlQbHVzQ291bnQgIT09IGEucHNhOVBsdXNDb3VudCkgcmV0dXJuIGIucHNhOVBsdXNDb3VudCAtIGEucHNhOVBsdXNDb3VudDsKICAgICAgaWYgKGIucHNhR3JhZGVzICE9PSBhLnBzYUdyYWRlcykgcmV0dXJuIGIucHNhR3JhZGVzIC0gYS5wc2FHcmFkZXM7CiAgICAgIGlmIChNYXRoLmFicyhiLnBzYUF2Z0dyYWRlIC0gYS5wc2FBdmdHcmFkZSkgPiAwLjAxKSByZXR1cm4gYi5wc2FBdmdHcmFkZSAtIGEucHNhQXZnR3JhZGU7CiAgICAgIHJldHVybiBTdHJpbmcoYS5uYW1lKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiLm5hbWUpKTsKICAgIH0pOwogIH0KCiAgLyogVHJhaW5lciBiYWRnZXMgYXJlIGRlcml2ZWQgZnJvbSBleGlzdGluZyBzdGF0czsgbm8gc2NoZW1hIGNoYW5nZSBpcyBuZWVkZWQuICovCiAgZnVuY3Rpb24gdHJhaW5lckJhZGdlcyhyb3cpewogICAgcm93ID0gcm93IHx8IHt9OwogICAgdmFyIGJhZGdlcyA9IFtdOwogICAgaWYgKChOdW1iZXIocm93LmJlc3RUaWVyKSB8fCAwKSA+PSA2KSBiYWRnZXMucHVzaCh7aWNvbjoi8J+RkSIsIGxhYmVsOiJDcm93biBIdW50ZXIiLCBjbHM6InBoLWJhZGdlLWNyb3duIn0pOwogICAgaWYgKChOdW1iZXIocm93LmNoYXNlQ2FyZHMpIHx8IDApID49IDEwKSBiYWRnZXMucHVzaCh7aWNvbjoi4pyoIiwgbGFiZWw6IlJhcmUgSHVudGVyIiwgY2xzOiJwaC1iYWRnZS1yYXJlIn0pOwogICAgaWYgKChOdW1iZXIocm93LnNldHNDb2xsZWN0ZWQpIHx8IDApID49IDUpIGJhZGdlcy5wdXNoKHtpY29uOiLwn5OaIiwgbGFiZWw6IlNldCBNYXN0ZXIiLCBjbHM6InBoLWJhZGdlLXNldCJ9KTsKICAgIGlmICgoTnVtYmVyKHJvdy51bmlxdWUpIHx8IDApID49IDEwMCkgYmFkZ2VzLnB1c2goe2ljb246IvCfko4iLCBsYWJlbDoiTWFzdGVyIENvbGxlY3RvciIsIGNsczoicGgtYmFkZ2UtbWFzdGVyIn0pOwogICAgaWYgKChOdW1iZXIocm93LnBhY2tzKSB8fCAwKSA+PSAxMDApIGJhZGdlcy5wdXNoKHtpY29uOiLwn46SIiwgbGFiZWw6IlBhY2sgSHVudGVyIiwgY2xzOiJwaC1iYWRnZS1wYWNrIn0pOwogICAgaWYgKChOdW1iZXIocm93LmJlc3RUaWVyKSB8fCAwKSA+PSA1ICYmICFiYWRnZXMuc29tZShmdW5jdGlvbihiKXsgcmV0dXJuIGIubGFiZWwgPT09ICJDcm93biBIdW50ZXIiOyB9KSkgYmFkZ2VzLnB1c2goe2ljb246IvCfjJ8iLCBsYWJlbDoiU2hpbnkgSHVudGVyIiwgY2xzOiJwaC1iYWRnZS1zaGlueSJ9KTsKICAgIGlmICghYmFkZ2VzLmxlbmd0aCAmJiAoTnVtYmVyKHJvdy5wYWNrcykgfHwgMCkgPj0gMTApIGJhZGdlcy5wdXNoKHtpY29uOiLimqEiLCBsYWJlbDoiVHJhaW5lciBQcm8iLCBjbHM6InBoLWJhZGdlLXBybyJ9KTsKICAgIGlmICghYmFkZ2VzLmxlbmd0aCkgYmFkZ2VzLnB1c2goe2ljb246IvCfjLEiLCBsYWJlbDoiUm9va2llIiwgY2xzOiJwaC1iYWRnZS1yb29raWUifSk7CiAgICByZXR1cm4gYmFkZ2VzLnNsaWNlKDAsIDIpOwogIH0KCiAgZnVuY3Rpb24gbWFrZVRyYWluZXJCYWRnZXMocm93LCBjb21wYWN0KXsKICAgIHZhciB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB3cmFwLmNsYXNzTmFtZSA9ICJwaC1sYi10cmFpbmVyLWJhZGdlcyIgKyAoY29tcGFjdCA/ICIgcGgtbGItdHJhaW5lci1iYWRnZXMtY29tcGFjdCIgOiAiIik7CiAgICB0cmFpbmVyQmFkZ2VzKHJvdykuZm9yRWFjaChmdW5jdGlvbihiYWRnZSl7CiAgICAgIHZhciBwaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICBwaWxsLmNsYXNzTmFtZSA9ICJwaC1sYi10cmFpbmVyLWJhZGdlICIgKyBiYWRnZS5jbHM7CiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSBiYWRnZS5pY29uICsgIiAiICsgYmFkZ2UubGFiZWw7CiAgICAgIHBpbGwudGl0bGUgPSAiSHV5IGhp4buHdSBUcmFpbmVyOiAiICsgYmFkZ2UubGFiZWw7CiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQocGlsbCk7CiAgICB9KTsKICAgIHJldHVybiB3cmFwOwogIH0KCiAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lKHZhbHVlKXsKICAgIHZhciBzdGFtcCA9IHZhbHVlID8gbmV3IERhdGUodmFsdWUpLmdldFRpbWUoKSA6IDA7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzdGFtcCkgfHwgc3RhbXAgPD0gMCkgcmV0dXJuICJ24burYSB4b25nIjsKICAgIHZhciBzZWMgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gc3RhbXApIC8gMTAwMCkpOwogICAgaWYgKHNlYyA8IDEwKSByZXR1cm4gInbhu6thIHhvbmciOwogICAgaWYgKHNlYyA8IDYwKSByZXR1cm4gc2VjICsgIiBnacOieSB0csaw4bubYyI7CiAgICB2YXIgbWluID0gTWF0aC5mbG9vcihzZWMgLyA2MCk7CiAgICBpZiAobWluIDwgNjApIHJldHVybiBtaW4gKyAiIHBow7p0IHRyxrDhu5tjIjsKICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IobWluIC8gNjApOwogICAgaWYgKGhvdXJzIDwgMjQpIHJldHVybiBob3VycyArICIgZ2nhu50gdHLGsOG7m2MiOwogICAgcmV0dXJuIE1hdGguZmxvb3IoaG91cnMgLyAyNCkgKyAiIG5nw6B5IHRyxrDhu5tjIjsKICB9CgogIGZ1bmN0aW9uIHNpZ25lZFBjdCh2YWx1ZSl7CiAgICB2YXIgbiA9IE51bWJlcih2YWx1ZSB8fCAwKTsKICAgIHJldHVybiAobiA+PSAwID8gIisiIDogIiIpICsgbi50b0ZpeGVkKDEpICsgIiUiOwogIH0KCiAgZnVuY3Rpb24gc3RhdEJveChsYWJlbCwgdmFsdWUpewogICAgdmFyIGJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGJveC5jbGFzc05hbWU9InBoLXN0YXQiOwogICAgdmFyIHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB2LmNsYXNzTmFtZT0icGgtc3RhdC12IjsKICAgIHYudGV4dENvbnRlbnQ9dmFsdWU7CiAgICB2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIGwuY2xhc3NOYW1lPSJwaC1zdGF0LWwiOwogICAgbC50ZXh0Q29udGVudD1sYWJlbDsKICAgIGJveC5hcHBlbmRDaGlsZCh2KTsgYm94LmFwcGVuZENoaWxkKGwpOwogICAgcmV0dXJuIGJveDsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGxvYWRSb3dzKCl7CiAgICBpZiAoIWNsaWVudCkgdGhyb3cgbmV3IEVycm9yKCJTdXBhYmFzZSBjaMawYSBraOG7n2kgdOG6oW8geG9uZy4gSMOjeSB0aOG7rSBs4bqhaSBzYXUgdsOgaSBnacOieSBob+G6t2MgdOG6o2kgbOG6oWkgdHJhbmcuIik7CiAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmZyb20oU1VQQUJBU0VfVEFCTEUpLnNlbGVjdCgiKiIpOwogICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LmVycm9yOwogICAgcm93c0NhY2hlID0gc29ydFJvd3MocmVzdWx0LmRhdGEgfHwgW10pOwogICAgcmV0dXJuIHJvd3NDYWNoZTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hQdWxsRmVlZCgpewogICAgaWYgKCFjbGllbnQpIHJldHVybiBmYWxzZTsKICAgIHRyeXsKICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5mcm9tKFBVTExfRkVFRF9UQUJMRSkKICAgICAgICAuc2VsZWN0KCJpZCx1aWQsdHJhaW5lcl9uYW1lLGNhcmRfaWQsY2FyZF9uYW1lLHNldF9uYW1lLHJhcml0eSx0aWVyLHByaWNlX3VzZCxpbWFnZV9iYXNlLGNyZWF0ZWRfYXQiKQogICAgICAgIC5ndGUoInByaWNlX3VzZCIsIDYwKQogICAgICAgIC5vcmRlcigiY3JlYXRlZF9hdCIsIHthc2NlbmRpbmc6ZmFsc2V9KQogICAgICAgIC5saW1pdCgxMDApOwogICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQuZXJyb3I7CiAgICAgIC8qIERlZmVuc2l2ZSBjbGllbnQtc2lkZSBmaWx0ZXIgYWxzbyBleGNsdWRlcyBsZWdhY3kgcm93cyB0aGF0IHdlcmUgc2F2ZWQgYmVmb3JlIHRoZSAkNjAgcnVsZS4gKi8KICAgICAgcHVsbEZlZWRDYWNoZSA9IChBcnJheS5pc0FycmF5KHJlc3VsdC5kYXRhKSA/IHJlc3VsdC5kYXRhIDogW10pLmZpbHRlcihmdW5jdGlvbihyb3cpewogICAgICAgIHZhciBwcmljZSA9IE51bWJlcihyb3cgJiYgcm93LnByaWNlX3VzZCk7CiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwcmljZSkgJiYgcHJpY2UgPj0gNjA7CiAgICAgIH0pOwogICAgICBwdWxsRmVlZFJlYWR5ID0gdHJ1ZTsKICAgICAgcHVsbEZlZWRFcnJvciA9ICIiOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH1jYXRjaChlcnIpewogICAgICBwdWxsRmVlZENhY2hlID0gW107CiAgICAgIHB1bGxGZWVkUmVhZHkgPSBmYWxzZTsKICAgICAgcHVsbEZlZWRFcnJvciA9IFN0cmluZyhlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyIHx8ICIiKTsKICAgICAgY29uc29sZS53YXJuKCJbTGl2ZSBQdWxsIEZlZWRdIENoxrBhIMSR4buNYyDEkcaw4bujYyBi4bqjbmcgcHVsbF9mZWVkLiBIw6N5IGNo4bqheSBTUUwgxJFpIGvDqG0gdHJvbmcgU3VwYWJhc2U6IiwgZXJyKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gd3JpdGVQdWxsRmVlZChlbnRyaWVzKXsKICAgIGlmICghZW50cmllcyB8fCAhZW50cmllcy5sZW5ndGgpIHJldHVybjsKICAgIGlmICghY2xpZW50KXsKICAgICAgcGVuZGluZ1B1bGxFbnRyaWVzID0gcGVuZGluZ1B1bGxFbnRyaWVzLmNvbmNhdChlbnRyaWVzKS5zbGljZSgtMTApOwogICAgICByZXR1cm47CiAgICB9CiAgICBjbGllbnQuZnJvbShQVUxMX0ZFRURfVEFCTEUpLmluc2VydChlbnRyaWVzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC5lcnJvcjsKICAgICAgcmVmcmVzaFB1bGxGZWVkKCkudGhlbihmdW5jdGlvbigpewogICAgICAgIGlmIChlbHMubGJNb2RhbCAmJiAhZWxzLmxiTW9kYWwuaGlkZGVuKSByZW5kZXJMZWFkZXJib2FyZCgpOwogICAgICB9KTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycil7CiAgICAgIGNvbnNvbGUud2FybigiW0xpdmUgUHVsbCBGZWVkXSBLaMO0bmcgZ2hpIMSRxrDhu6NjIHB1bGxfZmVlZC4gS2nhu4NtIHRyYSBi4bqjbmcvUkxTIHbDoCBjaOG6oXkgU1FMIMSRaSBrw6htOiIsIGVycik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGZsdXNoUGVuZGluZ1B1bGxFbnRyaWVzKCl7CiAgICBpZiAoIWNsaWVudCB8fCAhcGVuZGluZ1B1bGxFbnRyaWVzLmxlbmd0aCkgcmV0dXJuOwogICAgdmFyIGJhdGNoID0gcGVuZGluZ1B1bGxFbnRyaWVzLnNsaWNlKC0xMCk7CiAgICBwZW5kaW5nUHVsbEVudHJpZXMgPSBbXTsKICAgIHdyaXRlUHVsbEZlZWQoYmF0Y2gpOwogIH0KCiAgZnVuY3Rpb24gaGFuZGxlUGFja1JlY29yZGVkKGV2ZW50KXsKICAgIHZhciBkZXRhaWwgPSBldmVudCAmJiBldmVudC5kZXRhaWwgfHwge307CiAgICB2YXIgY2FyZHMgPSBBcnJheS5pc0FycmF5KGRldGFpbC5jYXJkcykgPyBkZXRhaWwuY2FyZHMgOiBbXTsKICAgIC8vIFN0b3JlIHRoZSB2YWx1ZSBvZiBhbGwgY2FyZHMgZnJvbSB0aGlzIG9wZW5pbmcgZm9yIGRhaWx5L3dlZWtseSByYW5raW5nLgogICAgcmVjb3JkTGVhZGVyYm9hcmRBY3Rpdml0eShkZXRhaWwpOwogICAgdmFyIGJ5Q2FyZCA9IHt9OwogICAgY2FyZHMuZm9yRWFjaChmdW5jdGlvbihjYXJkKXsKICAgICAgaWYgKCFjYXJkIHx8ICFjYXJkLmlkKSByZXR1cm47CiAgICAgIHZhciB0aWVyID0gTnVtYmVyKGNhcmQudGllcikgfHwgMDsKICAgICAgdmFyIHByaWNlID0gY2FyZC5wcmljZSA9PSBudWxsID8gbnVsbCA6IE51bWJlcihjYXJkLnByaWNlKTsKICAgICAgLyogTGl2ZSBmZWVkIHJ1bGU6IG9ubHkgc2hvdyBjYXJkcyB3aXRoIGEgbWFya2V0IGVzdGltYXRlIG9mIGF0IGxlYXN0IFVTJDYwLCByZWdhcmRsZXNzIG9mIHJhcml0eS4gKi8KICAgICAgaWYgKCEoTnVtYmVyLmlzRmluaXRlKHByaWNlKSAmJiBwcmljZSA+PSA2MCkpIHJldHVybjsKICAgICAgdmFyIGtleSA9IFN0cmluZyhjYXJkLmlkKTsKICAgICAgdmFyIG5leHQgPSB7CiAgICAgICAgdWlkOiB0cmFpbmVyVWlkKCksCiAgICAgICAgdHJhaW5lcl9uYW1lOiB0cmFpbmVyTmFtZSgpIHx8ICJUcmFpbmVyIiwKICAgICAgICBjYXJkX2lkOiBrZXkuc2xpY2UoMCwxMDApLAogICAgICAgIGNhcmRfbmFtZTogU3RyaW5nKGNhcmQubmFtZSB8fCBrZXkpLnNsaWNlKDAsMTIwKSwKICAgICAgICBzZXRfbmFtZTogU3RyaW5nKGNhcmQuc2V0IHx8ICIiKS5zbGljZSgwLDEyMCkgfHwgbnVsbCwKICAgICAgICByYXJpdHk6IFN0cmluZyhjYXJkLnJhcml0eSB8fCAiIikuc2xpY2UoMCw4MCkgfHwgbnVsbCwKICAgICAgICB0aWVyOiBNYXRoLm1heCgwLCBNYXRoLm1pbig2LCB0aWVyKSksCiAgICAgICAgcHJpY2VfdXNkOiBOdW1iZXIuaXNGaW5pdGUocHJpY2UpICYmIHByaWNlID49IDAgPyBOdW1iZXIocHJpY2UudG9GaXhlZCgyKSkgOiBudWxsLAogICAgICAgIGltYWdlX2Jhc2U6IC9eaHR0cHM6XC9cL2Fzc2V0c1wudGNnZGV4XC5uZXRcLy9pLnRlc3QoU3RyaW5nKGNhcmQuaW1hZ2UgfHwgIiIpKSA/IFN0cmluZyhjYXJkLmltYWdlKS5zbGljZSgwLDUwMCkgOiBudWxsCiAgICAgIH07CiAgICAgIGlmICghYnlDYXJkW2tleV0gfHwgbmV4dC50aWVyID4gYnlDYXJkW2tleV0udGllciB8fCAobmV4dC50aWVyID09PSBieUNhcmRba2V5XS50aWVyICYmIChuZXh0LnByaWNlX3VzZCB8fCAwKSA+IChieUNhcmRba2V5XS5wcmljZV91c2QgfHwgMCkpKSBieUNhcmRba2V5XSA9IG5leHQ7CiAgICB9KTsKICAgIHZhciBlbnRyaWVzID0gT2JqZWN0LmtleXMoYnlDYXJkKS5tYXAoZnVuY3Rpb24oayl7IHJldHVybiBieUNhcmRba107IH0pOwogICAgZW50cmllcy5zb3J0KGZ1bmN0aW9uKGEsYil7CiAgICAgIGlmIChiLnRpZXIgIT09IGEudGllcikgcmV0dXJuIGIudGllciAtIGEudGllcjsKICAgICAgcmV0dXJuIChOdW1iZXIoYi5wcmljZV91c2QpfHwwKSAtIChOdW1iZXIoYS5wcmljZV91c2QpfHwwKTsKICAgIH0pOwogICAgd3JpdGVQdWxsRmVlZChlbnRyaWVzLnNsaWNlKDAsNSkpOwogIH0KCiAgYXN5bmMgZnVuY3Rpb24gc3luY01lKGZvcmNlKXsKICAgIGlmICghY2xpZW50IHx8IHN5bmNpbmcpIHJldHVybjsKICAgIHZhciBuYW1lPXRyYWluZXJOYW1lKCk7CiAgICBpZiAoIW5hbWUpIHJldHVybjsKCiAgICB2YXIgcm93PWN1cnJlbnRSb3coKTsKICAgIHZhciBmcD1yb3dGaW5nZXJwcmludChyb3cpOwogICAgaWYgKCFmb3JjZSAmJiBmcD09PWxhc3RGaW5nZXJwcmludCkgcmV0dXJuOwoKICAgIHN5bmNpbmc9dHJ1ZTsKICAgIHRyeXsKICAgICAgdmFyIHJlc3VsdD1hd2FpdCBjbGllbnQuZnJvbShTVVBBQkFTRV9UQUJMRSkudXBzZXJ0KHJvdyx7b25Db25mbGljdDoidWlkIn0pOwogICAgICBpZiAocmVzdWx0LmVycm9yKXsKICAgICAgICBsYXN0U3luY0Vycm9yID0gU3RyaW5nKHJlc3VsdC5lcnJvci5tZXNzYWdlIHx8IHJlc3VsdC5lcnJvcik7CiAgICAgICAgY29uc29sZS5lcnJvcigiW0JYSF0gS2jDtG5nIGdoaSDEkcaw4bujYyBsZWFkZXJib2FyZDoiLHJlc3VsdC5lcnJvcik7CiAgICAgICAgc2hvd1N5bmNFcnJvcigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsYXN0RmluZ2VycHJpbnQ9ZnA7CiAgICAgIGxhc3RTeW5jRXJyb3IgPSAiIjsKICAgICAgc2V0U3RhdHVzKCLil48gTElWRSIsdHJ1ZSk7CiAgICB9Y2F0Y2goZXJyKXsKICAgICAgbGFzdFN5bmNFcnJvciA9IFN0cmluZyhlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyIHx8ICJM4buXaSBraMO0bmcgeMOhYyDEkeG7i25oIik7CiAgICAgIGNvbnNvbGUuZXJyb3IoIltCWEhdIFN5bmMgZXJyb3I6IixlcnIpOwogICAgICBzaG93U3luY0Vycm9yKCk7CiAgICB9ZmluYWxseXsKICAgICAgc3luY2luZz1mYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbmRlckxlYWRlcmJvYXJkKCl7CiAgICBpZiAoIWVscy5sYkJvZHkpIHJldHVybjsKICAgIGVscy5sYkJvZHkudGV4dENvbnRlbnQgPSAiIjsKCiAgICBpZiAobGFzdFN5bmNFcnJvcil7CiAgICAgIHZhciBzeW5jV2FybmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICBzeW5jV2FybmluZy5zdHlsZS5jc3NUZXh0ID0gIm1hcmdpbjowIDAgMTJweDtwYWRkaW5nOjEwcHggMTJweDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDEzMCwxMzAsLjU1KTtib3JkZXItcmFkaXVzOjEwcHg7YmFja2dyb3VuZDpyZ2JhKDI1NSw5MCw5MCwuMDkpO2NvbG9yOiNmZmMyYzI7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS41O292ZXJmbG93LXdyYXA6YW55d2hlcmUiOwogICAgICBzeW5jV2FybmluZy50ZXh0Q29udGVudCA9ICLEkMOjIMSR4buNYyDEkcaw4bujYyBCWEggbmjGsG5nIGNoxrBhIGzGsHUgxJHGsOG7o2MgdGjDoG5oIHTDrWNoIGzDqm4gU3VwYWJhc2U6ICIgKyBsYXN0U3luY0Vycm9yICsgIi4gTuG6v3UgdGhp4bq/dSBj4buZdCwgY2jhuqF5IGZpbGUgU1FMIG1pZ3JhdGlvbiBsZWFkZXJib2FyZCDEkWkga8OobTsgbuG6v3UgYsOhbyBxdXnhu4FuIHRydXkgY+G6rXAsIGPhuqduIGtp4buDbSB0cmEgR1JBTlQvUkxTIGPhu6dhIHB1YmxpYy5sZWFkZXJib2FyZC4iOwogICAgICBlbHMubGJCb2R5LmFwcGVuZENoaWxkKHN5bmNXYXJuaW5nKTsKICAgIH0KCiAgICB2YXIgY3VycmVudE5hbWUgPSB0cmFpbmVyTmFtZSgpIHx8ICJUcmFpbmVyIjsKICAgIHZhciByb3dzID0gbGJWaWV3ID09PSAicHNhIgogICAgICA/IGJ1aWxkUFNBTGVhZGVyYm9hcmRSb3dzKCkKICAgICAgOiAoKGxiUGVyaW9kID09PSAiYWxsIiAmJiBsYlZpZXcgPT09ICJ2YWx1ZSIpID8gcm93c0NhY2hlLnNsaWNlKCkgOiBidWlsZEFjdGl2aXR5TGVhZGVyYm9hcmRSb3dzKCkpOwogICAgaWYgKGxiVmlldyA9PT0gInVubHVja3kiKXsKICAgICAgcm93cyA9IHJvd3MuZmlsdGVyKGZ1bmN0aW9uKHJvdyl7CiAgICAgICAgcm93Lmxvc3MgPSBOdW1iZXIoTWF0aC5tYXgoMCwgKE51bWJlcihyb3cuc3BlbnQpfHwwKSAtIChOdW1iZXIocm93LnRvdGFsVmFsdWUpfHwwKSkudG9GaXhlZCgyKSk7CiAgICAgICAgcm93LnJvaVBjdCA9IE51bWJlcihyb3cucm9pUGN0KXx8MDsKICAgICAgICByZXR1cm4gKE51bWJlcihyb3cucGFja3MpfHwwKSA+PSAxMCAmJiAoTnVtYmVyKHJvdy5zcGVudCl8fDApID4gMCAmJiByb3cucm9pUGN0IDwgMCAmJiByb3cubG9zcyA+IDA7CiAgICAgIH0pLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgICBpZiAoTWF0aC5hYnMoKE51bWJlcihhLnJvaVBjdCl8fDApIC0gKE51bWJlcihiLnJvaVBjdCl8fDApKSA+IDAuMDEpIHJldHVybiAoTnVtYmVyKGEucm9pUGN0KXx8MCkgLSAoTnVtYmVyKGIucm9pUGN0KXx8MCk7CiAgICAgICAgaWYgKE1hdGguYWJzKChOdW1iZXIoYi5sb3NzKXx8MCkgLSAoTnVtYmVyKGEubG9zcyl8fDApKSA+IDAuMDEpIHJldHVybiAoTnVtYmVyKGIubG9zcyl8fDApIC0gKE51bWJlcihhLmxvc3MpfHwwKTsKICAgICAgICByZXR1cm4gKE51bWJlcihiLnBhY2tzKXx8MCkgLSAoTnVtYmVyKGEucGFja3MpfHwwKTsKICAgICAgfSk7CiAgICB9CiAgICB2YXIgbXlVaWQgPSB0cmFpbmVyVWlkKCk7CiAgICB2YXIgbXkgPSBudWxsOwogICAgdmFyIG15UmFuayA9ICLigJQiOwogICAgdmFyIGxvY2FsID0gcmVhZENvbGxlY3Rpb24oKTsKICAgIHZhciB0b3RhbEFsbCA9IGxiVmlldyA9PT0gInBzYSIKICAgICAgPyByb3dzLnJlZHVjZShmdW5jdGlvbihzdW0sIHJvdyl7IHJldHVybiBzdW0gKyAoTnVtYmVyKHJvdy5wc2FHcmFkZXMpIHx8IDApOyB9LCAwKQogICAgICA6IChsYlZpZXcgPT09ICJ1bmx1Y2t5IgogICAgICAgID8gcm93cy5yZWR1Y2UoZnVuY3Rpb24oc3VtLCByb3cpeyByZXR1cm4gc3VtICsgKE51bWJlcihyb3cubG9zcykgfHwgMCk7IH0sIDApCiAgICAgICAgOiByb3dzLnJlZHVjZShmdW5jdGlvbihzdW0sIHJvdyl7IHJldHVybiBzdW0gKyAoTnVtYmVyKHJvdy50b3RhbFZhbHVlKSB8fCAwKTsgfSwgMCkpOwogICAgdmFyIG1heFZhbHVlID0gcm93cy5sZW5ndGggPyBNYXRoLm1heC5hcHBseShudWxsLCByb3dzLm1hcChmdW5jdGlvbihyb3cpewogICAgICBpZiAobGJWaWV3ID09PSAicHNhIikgcmV0dXJuIE51bWJlcihyb3cucHNhU2NvcmUpIHx8IDA7CiAgICAgIHJldHVybiBsYlZpZXcgPT09ICJ1bmx1Y2t5IiA/IE1hdGguYWJzKE1hdGgubWluKDAsIE51bWJlcihyb3cucm9pUGN0KXx8MCkpIDogTWF0aC5tYXgoMCwgTnVtYmVyKHJvdy50b3RhbFZhbHVlKXx8MCk7CiAgICB9KSkgOiAwOwoKICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3csIGluZGV4KXsKICAgICAgaWYgKHJvdy51aWQgPT09IG15VWlkKXsgbXkgPSByb3c7IG15UmFuayA9IFN0cmluZyhpbmRleCArIDEpOyB9CiAgICB9KTsKCiAgICBmdW5jdGlvbiBtYWtlRWwodGFnLCBjbGFzc05hbWUsIHZhbHVlKXsKICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgIGlmIChjbGFzc05hbWUpIG5vZGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkgbm9kZS50ZXh0Q29udGVudCA9IFN0cmluZyh2YWx1ZSk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogICAgLyogQXZhdGFyIFRyYWluZXI6IGNo4buNbiBQb2vDqW1vbiBtaW5oIGjhu41hIGPhu5EgxJHhu4tuaCB0aGVvIG5pY2tuYW1lLCBraMO0bmcgY+G6p24gdGjDqm0gY+G7mXQgZGF0YWJhc2UuICovCiAgICBmdW5jdGlvbiBhdmF0YXJQb2tlbW9uSWQobmFtZSl7CiAgICAgIHZhciBwb29sID0gWzI1LCA2LCAxNTAsIDEzMywgOTQsIDI0OSwgMzg0LCA0NDgsIDQ0NSwgMywgOSwgMTQ0LCAxNDUsIDE0NiwgMTk3LCA3MDAsIDI4MiwgNDg3LCAxNTEsIDY1LCAxNDksIDU5LCAxOTYsIDE5NywgMjQ1LCAyNTgsIDMzMCwgMzUwLCA0MjksIDQ0NSwgNDQ4LCA0NzksIDQ4MywgNDg3LCA2MzUsIDY1OCwgNzAwLCA3NzgsIDc3OF07CiAgICAgIC8qIExv4bqhaSBi4buPIGdpw6EgdHLhu4sga2jDtG5nIHBo4bqjaSBz4buRIMSR4buDIGdp4buvIGFuIHRvw6BuIG7hur91IGNo4buJbmggZGFuaCBzw6FjaCBzYXUgbsOgeS4gKi8KICAgICAgcG9vbCA9IHBvb2wuZmlsdGVyKGZ1bmN0aW9uKGlkKXsgcmV0dXJuIHR5cGVvZiBpZCA9PT0gIm51bWJlciIgJiYgTnVtYmVyLmlzRmluaXRlKGlkKSAmJiBpZCA+IDA7IH0pOwogICAgICB2YXIgc3RyID0gU3RyaW5nKG5hbWUgfHwgIlRyYWluZXIiKTsKICAgICAgdmFyIGhhc2ggPSAwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgaGFzaCA9IChoYXNoICogMzEgKyBzdHIuY2hhckNvZGVBdChpKSkgPj4+IDA7CiAgICAgIHJldHVybiBwb29sW2hhc2ggJSBwb29sLmxlbmd0aF0gfHwgMjU7CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlQXZhdGFyKG5hbWUsIGNsYXNzTmFtZSl7CiAgICAgIHZhciBub2RlID0gbWFrZUVsKCJkaXYiLCBjbGFzc05hbWUgfHwgInBoLWxiLWF2YXRhciIpOwogICAgICBub2RlLnRpdGxlID0gIlBva8OpbW9uIMSR4bqhaSBkaeG7h24gY+G7p2EgVHJhaW5lciAiICsgU3RyaW5nKG5hbWUgfHwgIlRyYWluZXIiKTsKICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCBub2RlLnRpdGxlKTsKICAgICAgdmFyIHBva2Vtb25JZCA9IGF2YXRhclBva2Vtb25JZChuYW1lKTsKICAgICAgdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOwogICAgICBpbWcuYWx0ID0gIiI7CiAgICAgIGltZy5sb2FkaW5nID0gImxhenkiOwogICAgICBpbWcuZGVjb2RpbmcgPSAiYXN5bmMiOwogICAgICBpbWcuc3JjID0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Qb2tlQVBJL3Nwcml0ZXMvbWFzdGVyL3Nwcml0ZXMvcG9rZW1vbi9vdGhlci9vZmZpY2lhbC1hcnR3b3JrLyIgKyBwb2tlbW9uSWQgKyAiLnBuZyI7CiAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24oKXsKICAgICAgICAvKiBGYWxsYmFjayBzYW5nIHNwcml0ZSBjxqEgYuG6o247IG7hur91IENETiBraMO0bmcgdOG6o2kgxJHGsOG7o2MgdGjDrCBkw7luZyBiaeG7g3UgdMaw4bujbmcgUG9rw6kgQmFsbC4gKi8KICAgICAgICBpZiAoaW1nLmRhdGFzZXQuZmFsbGJhY2sgIT09ICIxIil7CiAgICAgICAgICBpbWcuZGF0YXNldC5mYWxsYmFjayA9ICIxIjsKICAgICAgICAgIGltZy5zcmMgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1Bva2VBUEkvc3ByaXRlcy9tYXN0ZXIvc3ByaXRlcy9wb2tlbW9uLyIgKyBwb2tlbW9uSWQgKyAiLnBuZyI7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGltZy5yZW1vdmUoKTsKICAgICAgICBub2RlLnRleHRDb250ZW50ID0gIvCflLQiOwogICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgicGgtbGItYXZhdGFyLWZhbGxiYWNrIik7CiAgICAgIH07CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoaW1nKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICBmdW5jdGlvbiBjYXJkSW1hZ2VVcmwoYmFzZSwgcXVhbGl0eSl7CiAgICAgIHZhciB1cmwgPSBTdHJpbmcoYmFzZSB8fCAiIikudHJpbSgpLnJlcGxhY2UoL1wvKyQvLCAiIik7CiAgICAgIGlmICghdXJsKSByZXR1cm4gIiI7CiAgICAgIGlmICgvXC4oPzpwbmd8anBlP2d8d2VicHxnaWYpKD86Wz8jXS4qKT8kL2kudGVzdCh1cmwpKSByZXR1cm4gdXJsOwogICAgICByZXR1cm4gdXJsICsgIi8iICsgKHF1YWxpdHkgfHwgImhpZ2gud2VicCIpOwogICAgfQogICAgLyogTOG6pXkgbMOhIGPDsyBnacOhIGNhbyBuaOG6pXQgdOG7qyBjb2xsZWN0aW9uIMSRYW5nIGzGsHUgdHLDqm4gdHLDrG5oIGR1eeG7h3QgbsOgeS4KICAgICAgIEtow7RuZyB0aMOqbSBj4buZdCB2w6BvIFN1cGFiYXNlIG7Dqm4ga2jDtG5nIGzDoG0gdGhheSDEkeG7lWkgc2NoZW1hL2RhdGFiYXNlIGhp4buHbiB04bqhaS4gKi8KICAgIGZ1bmN0aW9uIHJlYWRMb2NhbEJlc3RDYXJkKCl7CiAgICAgIHRyeXsKICAgICAgICB2YXIgcmF3ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwb2tlaHViLmNvbGxlY3Rpb24udjIiKTsKICAgICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIGRiID0gSlNPTi5wYXJzZShyYXcpOwogICAgICAgIHZhciBjYXJkcyA9IGRiICYmIGRiLmNhcmRzICYmIHR5cGVvZiBkYi5jYXJkcyA9PT0gIm9iamVjdCIgPyBkYi5jYXJkcyA6IHt9OwogICAgICAgIHZhciBiZXN0ID0gbnVsbDsKICAgICAgICBPYmplY3Qua2V5cyhjYXJkcykuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgICAgICB2YXIgY2FyZCA9IGNhcmRzW2lkXSB8fCB7fTsKICAgICAgICAgIHZhciBwcmljZSA9IE51bWJlcihjYXJkLnByaWNlKTsKICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHByaWNlKSB8fCBwcmljZSA8PSAwKSByZXR1cm47CiAgICAgICAgICBpZiAoIWJlc3QgfHwgcHJpY2UgPiBiZXN0LnByaWNlKXsKICAgICAgICAgICAgYmVzdCA9IHsKICAgICAgICAgICAgICBpZDpTdHJpbmcoY2FyZC5pZCB8fCBpZCksCiAgICAgICAgICAgICAgbmFtZTpTdHJpbmcoY2FyZC5uYW1lIHx8IGNhcmQuaWQgfHwgaWQpLAogICAgICAgICAgICAgIGltZzpTdHJpbmcoY2FyZC5pbWcgfHwgIiIpLAogICAgICAgICAgICAgIHJhcml0eTpTdHJpbmcoY2FyZC5yYXJpdHkgfHwgIiIpLAogICAgICAgICAgICAgIHRpZXI6TnVtYmVyKGNhcmQudGllcikgfHwgMCwKICAgICAgICAgICAgICBwcmljZTpwcmljZSwKICAgICAgICAgICAgICBzZXQ6U3RyaW5nKGNhcmQuc2V0IHx8ICIiKQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBiZXN0OwogICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcmVuZGVyUHVsbEZlZWRTZWN0aW9uKCl7CiAgICAgIHZhciBzZWN0aW9uID0gbWFrZUVsKCJzZWN0aW9uIiwgInBoLWxiLWZlZWQiKTsKICAgICAgdmFyIGhlYWQgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1zZWN0aW9uLWhlYWQiKTsKICAgICAgdmFyIHRpdGxlID0gbWFrZUVsKCJkaXYiLCAicGgtbGItc2VjdGlvbi10aXRsZSIsICLwn4+GIE1FR0EgSElUIExJVkUiKTsKICAgICAgdmFyIHN1YiA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLXNlY3Rpb24tc3ViIiwgIkzhu4tjaCBz4butIGhpdCBj4buZbmcgxJHhu5NuZyDCtyBNZWdhIEhpdCB04burICQ2MCDCtyBKQUNLUE9UIHThu6sgJDIwMCIpOwogICAgICBoZWFkLmFwcGVuZENoaWxkKHRpdGxlKTsKICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdWIpOwogICAgICB2YXIgc3RhdHVzID0gbWFrZUVsKCJzcGFuIiwgInBoLWxiLWZlZWQtc3RhdHVzIiArIChwdWxsRmVlZFJlYWR5ID8gIiBwaC1mZWVkLWxpdmUiIDogIiIpLCBwdWxsRmVlZFJlYWR5ID8gIuKXjyBMSVZFIiA6IChwdWxsRmVlZEVycm9yID8gIkzhu5ZJIEvhur5UIE7hu5BJIiA6ICJDSMavQSBL4bq+VCBO4buQSSIpKTsKICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdGF0dXMpOwogICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKGhlYWQpOwoKICAgICAgaWYgKCFwdWxsRmVlZFJlYWR5KXsKICAgICAgICB2YXIgaGVscFRleHQgPSBwdWxsRmVlZEVycm9yCiAgICAgICAgICA/ICJM4buXaSBi4bqjbmcgcHVibGljLnB1bGxfZmVlZDogIiArIHB1bGxGZWVkRXJyb3IgKyAiLiBDaOG6oXkgZmlsZSB2bmdhbWUtcG9rZW1vbi1saXZlLXB1bGwtZmVlZC1maXguc3FsIHRyb25nIFN1cGFiYXNlIOKGkiBTUUwgRWRpdG9yLiBO4bq/dSBs4buXaSB24bqrbiBjw7JuLCBraeG7g20gdHJhIHF1eeG7gW4gU0VMRUNUL0lOU0VSVCB2w6AgUmVhbHRpbWUgY+G7p2EgYuG6o25nIG7DoHkuIgogICAgICAgICAgOiAiQ2jGsGEgxJHhu41jIMSRxrDhu6NjIHB1YmxpYy5wdWxsX2ZlZWQuIENo4bqheSBmaWxlIHZuZ2FtZS1wb2tlbW9uLWxpdmUtcHVsbC1mZWVkLWZpeC5zcWwgdHJvbmcgU3VwYWJhc2Ug4oaSIFNRTCBFZGl0b3IuIjsKICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLWZlZWQtZW1wdHkiLCBoZWxwVGV4dCkpOwogICAgICAgIHJldHVybiBzZWN0aW9uOwogICAgICB9CiAgICAgIHZhciBlbGlnaWJsZVB1bGxzID0gcHVsbEZlZWRDYWNoZS5maWx0ZXIoZnVuY3Rpb24ocHVsbCl7CiAgICAgICAgdmFyIHByaWNlID0gTnVtYmVyKHB1bGwgJiYgcHVsbC5wcmljZV91c2QpOwogICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHJpY2UpICYmIHByaWNlID49IDYwOwogICAgICB9KTsKICAgICAgdmFyIGphY2twb3RDb3VudCA9IGVsaWdpYmxlUHVsbHMuZmlsdGVyKGZ1bmN0aW9uKHB1bGwpeyByZXR1cm4gTnVtYmVyKHB1bGwucHJpY2VfdXNkKSA+PSAyMDA7IH0pLmxlbmd0aDsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1mZWVkLXN1bW1hcnkiLCAiSElUIEhJU1RPUlkgwrcgIiArIGVsaWdpYmxlUHVsbHMubGVuZ3RoICsgIiBoaXQgZ+G6p24gxJHDonkgwrcgIiArIGphY2twb3RDb3VudCArICIgSkFDS1BPVCAo4omlJDIwMCkiKSk7CiAgICAgIGlmICghZWxpZ2libGVQdWxscy5sZW5ndGgpewogICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItZmVlZC1lbXB0eSIsICJDaMawYSBjw7MgaGl0IG3hu5tpIHThu6sgJDYwIHRy4bufIGzDqm4uIEzhu4tjaCBz4butIHPhur0gdOG7sSB4deG6pXQgaGnhu4duIGtoaSBj4buZbmcgxJHhu5NuZyBt4bufIMSRxrDhu6NjIGzDoSDEkeG7pyBuZ8aw4buhbmcuIikpOwogICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItZmVlZC1jYXB0aW9uIiwgIk1FR0EgSElUIExJVkUgY2jhu4kgZ2hpIG5o4bqtbiBnacOhIHRoYW0ga2jhuqNvIHThu6sgJDYwLiBMw6EgdOG7qyAkMjAwIMSRxrDhu6NjIGfhuq9uIG5ow6NuIEpBQ0tQT1QuIikpOwogICAgICAgIHJldHVybiBzZWN0aW9uOwogICAgICB9CgogICAgICB2YXIgbGlzdCA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWZlZWQtbGlzdCIpOwogICAgICB2YXIgdmlzaWJsZVB1bGxzID0gZWxpZ2libGVQdWxscy5zbGljZSgwLCBNYXRoLm1heCg1LCBwdWxsRmVlZFZpc2libGVDb3VudCkpOwogICAgICB2aXNpYmxlUHVsbHMuZm9yRWFjaChmdW5jdGlvbihwdWxsKXsKICAgICAgICB2YXIgaXNKYWNrcG90ID0gTnVtYmVyKHB1bGwgJiYgcHVsbC5wcmljZV91c2QpID49IDIwMDsKICAgICAgICB2YXIgaXRlbSA9IG1ha2VFbCgiYXJ0aWNsZSIsICJwaC1sYi1mZWVkLWl0ZW0iICsgKGlzSmFja3BvdCA/ICIgcGgtbGItZmVlZC1qYWNrcG90IiA6ICIiKSk7CiAgICAgICAgdmFyIGFydCA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWZlZWQtY2FyZC1hcnQiKTsKICAgICAgICBpZiAocHVsbC5pbWFnZV9iYXNlKXsKICAgICAgICAgIHZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOwogICAgICAgICAgdmFyIGltYWdlQmFzZSA9IFN0cmluZyhwdWxsLmltYWdlX2Jhc2UgfHwgIiIpOwogICAgICAgICAgdmFyIHRyaWVkTG93ID0gZmFsc2U7CiAgICAgICAgICBpbWFnZS5zcmMgPSBjYXJkSW1hZ2VVcmwoaW1hZ2VCYXNlLCAiaGlnaC53ZWJwIik7CiAgICAgICAgICBpbWFnZS5hbHQgPSBTdHJpbmcocHVsbC5jYXJkX25hbWUgfHwgIlBva8OpbW9uIFRDRyBjYXJkIik7CiAgICAgICAgICBpbWFnZS5sb2FkaW5nID0gImxhenkiOwogICAgICAgICAgaW1hZ2UuZGVjb2RpbmcgPSAiYXN5bmMiOwogICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmICghdHJpZWRMb3cgJiYgL15odHRwczpcL1wvYXNzZXRzXC50Y2dkZXhcLm5ldFwvL2kudGVzdChpbWFnZUJhc2UpKXsKICAgICAgICAgICAgICB0cmllZExvdyA9IHRydWU7CiAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gY2FyZEltYWdlVXJsKGltYWdlQmFzZSwgImxvdy53ZWJwIik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGltYWdlLnJlbW92ZSgpOwogICAgICAgICAgICBhcnQudGV4dENvbnRlbnQgPSAi8J+OtCI7CiAgICAgICAgICAgIGFydC5jbGFzc0xpc3QuYWRkKCJwaC1sYi1mZWVkLWFydC1mYWxsYmFjayIpOwogICAgICAgICAgfTsKICAgICAgICAgIGFydC5hcHBlbmRDaGlsZChpbWFnZSk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICBhcnQudGV4dENvbnRlbnQgPSAi8J+OtCI7CiAgICAgICAgICBhcnQuY2xhc3NMaXN0LmFkZCgicGgtbGItZmVlZC1hcnQtZmFsbGJhY2siKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzSmFja3BvdCl7CiAgICAgICAgICB2YXIgamFja3BvdFJpYmJvbiA9IG1ha2VFbCgic3BhbiIsICJwaC1sYi1mZWVkLWphY2twb3QtcmliYm9uIiwgIvCflKUgSkFDS1BPVCIpOwogICAgICAgICAgamFja3BvdFJpYmJvbi5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCAiTMOhIGLDoGkgdHLhu4sgZ2nDoSB04burIDIwMCBVU0Q6IEphY2twb3QiKTsKICAgICAgICAgIGFydC5hcHBlbmRDaGlsZChqYWNrcG90UmliYm9uKTsKICAgICAgICB9CiAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChhcnQpOwoKICAgICAgICB2YXIgY29weSA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWZlZWQtY29weSIpOwogICAgICAgIHZhciB0cmFpbmVyTGluZSA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWZlZWQtdHJhaW5lcmxpbmUiKTsKICAgICAgICB0cmFpbmVyTGluZS5hcHBlbmRDaGlsZChtYWtlQXZhdGFyKHB1bGwudHJhaW5lcl9uYW1lIHx8ICJUcmFpbmVyIiwgInBoLWxiLWF2YXRhciBwaC1sYi1mZWVkLWF2YXRhciIpKTsKICAgICAgICB2YXIgb3duZXIgPSByb3dzQ2FjaGUuZmluZChmdW5jdGlvbihyb3cpeyByZXR1cm4gcm93LnVpZCA9PT0gU3RyaW5nKHB1bGwudWlkIHx8ICIiKTsgfSkgfHwgewogICAgICAgICAgdWlkOlN0cmluZyhwdWxsLnVpZCB8fCAiIiksIG5hbWU6U3RyaW5nKHB1bGwudHJhaW5lcl9uYW1lIHx8ICJUcmFpbmVyIiksIHBhY2tzOjAsIHVuaXF1ZTowLAogICAgICAgICAgYmVzdFRpZXI6TnVtYmVyKHB1bGwudGllcil8fDAsIGJlc3RWYWx1ZTpOdW1iZXIocHVsbC5wcmljZV91c2QpfHwwLCBjaGFzZUNhcmRzOjAsIHNldHNDb2xsZWN0ZWQ6MAogICAgICAgIH07CiAgICAgICAgdmFyIHRyYWluZXJUZXh0ID0gbWFrZUVsKCJkaXYiLCAicGgtbGItZmVlZC10cmFpbmVydGV4dCIpOwogICAgICAgIHZhciBmZWVkVHJhaW5lck5hbWUgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1mZWVkLW5hbWUgcGgtbGItcHJvZmlsZS1saW5rIiwgU3RyaW5nKHB1bGwudHJhaW5lcl9uYW1lIHx8ICJUcmFpbmVyIikpOwogICAgICAgIGZlZWRUcmFpbmVyTmFtZS5kYXRhc2V0LnBoUHJvZmlsZVVpZCA9IFN0cmluZyhwdWxsLnVpZCB8fCAiIik7CiAgICAgICAgZmVlZFRyYWluZXJOYW1lLmRhdGFzZXQucGhQcm9maWxlTmFtZSA9IFN0cmluZyhwdWxsLnRyYWluZXJfbmFtZSB8fCAiVHJhaW5lciIpOwogICAgICAgIGZlZWRUcmFpbmVyTmFtZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCAiYnV0dG9uIik7IGZlZWRUcmFpbmVyTmFtZS50YWJJbmRleCA9IDA7CiAgICAgICAgZmVlZFRyYWluZXJOYW1lLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJYZW0gdOG7pyB0csawbmcgYsOgeSBj4bunYSAiICsgU3RyaW5nKHB1bGwudHJhaW5lcl9uYW1lIHx8ICJUcmFpbmVyIikpOwogICAgICAgIGZlZWRUcmFpbmVyTmFtZS50aXRsZSA9ICJC4bqlbSDEkeG7gyB4ZW0gdOG7pyB0csawbmcgYsOgeSBUcmFpbmVyIjsKICAgICAgICB0cmFpbmVyVGV4dC5hcHBlbmRDaGlsZChmZWVkVHJhaW5lck5hbWUpOwogICAgICAgIHRyYWluZXJUZXh0LmFwcGVuZENoaWxkKG1ha2VUcmFpbmVyQmFkZ2VzKG93bmVyLCB0cnVlKSk7CiAgICAgICAgdHJhaW5lckxpbmUuYXBwZW5kQ2hpbGQodHJhaW5lclRleHQpOwogICAgICAgIGNvcHkuYXBwZW5kQ2hpbGQodHJhaW5lckxpbmUpOwoKICAgICAgICB2YXIgcHVsbGVkID0gbWFrZUVsKCJkaXYiLCAicGgtbGItZmVlZC1wdWxsZWQiKTsKICAgICAgICBwdWxsZWQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoInbhu6thIG3hu58gxJHGsOG7o2MgIikpOwogICAgICAgIHB1bGxlZC5hcHBlbmRDaGlsZChtYWtlRWwoInN0cm9uZyIsICJwaC1sYi1mZWVkLWNhcmQtbmFtZSIsIFN0cmluZyhwdWxsLmNhcmRfbmFtZSB8fCAiUG9rw6ltb24gY2FyZCIpKSk7CiAgICAgICAgY29weS5hcHBlbmRDaGlsZChwdWxsZWQpOwoKICAgICAgICB2YXIgbWV0YWRhdGEgPSBbXTsKICAgICAgICBpZiAocHVsbC5yYXJpdHkpIG1ldGFkYXRhLnB1c2goU3RyaW5nKHB1bGwucmFyaXR5KSk7CiAgICAgICAgZWxzZSBtZXRhZGF0YS5wdXNoKHRpZXJMYWJlbChOdW1iZXIocHVsbC50aWVyKXx8MCkpOwogICAgICAgIGlmIChwdWxsLnNldF9uYW1lKSBtZXRhZGF0YS5wdXNoKFN0cmluZyhwdWxsLnNldF9uYW1lKSk7CiAgICAgICAgY29weS5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1mZWVkLW1ldGEiLCBtZXRhZGF0YS5qb2luKCIgwrcgIikpKTsKICAgICAgICB2YXIgZm9vdCA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWZlZWQtZm9vdCIpOwogICAgICAgIGZvb3QuYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLWZlZWQtcHJpY2UiICsgKGlzSmFja3BvdCA/ICIgcGgtbGItZmVlZC1wcmljZS1qYWNrcG90IiA6ICIiKSwgcHVsbC5wcmljZV91c2QgIT0gbnVsbCA/IG1vbmV5KHB1bGwucHJpY2VfdXNkKSA6ICJDaMawYSBjw7MgZ2nDoSIpKTsKICAgICAgICBpZiAoaXNKYWNrcG90KSBmb290LmFwcGVuZENoaWxkKG1ha2VFbCgic3BhbiIsICJwaC1sYi1mZWVkLWphY2twb3QtY2FwdGlvbiIsICJKQUNLUE9UIEhJVCIpKTsKICAgICAgICBmb290LmFwcGVuZENoaWxkKG1ha2VFbCgic3BhbiIsICJwaC1sYi1mZWVkLXRpbWUiLCByZWxhdGl2ZVRpbWUocHVsbC5jcmVhdGVkX2F0KSkpOwogICAgICAgIGNvcHkuYXBwZW5kQ2hpbGQoZm9vdCk7CiAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChjb3B5KTsKICAgICAgICBsaXN0LmFwcGVuZENoaWxkKGl0ZW0pOwogICAgICB9KTsKICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChsaXN0KTsKICAgICAgaWYgKGVsaWdpYmxlUHVsbHMubGVuZ3RoID4gNSAmJiB2aXNpYmxlUHVsbHMubGVuZ3RoID09PSBlbGlnaWJsZVB1bGxzLmxlbmd0aCl7CiAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1mZWVkLWFsbC1zaG93biIsICLEkMOjIGhp4buDbiB0aOG7iyB04bqldCBj4bqjICIgKyBlbGlnaWJsZVB1bGxzLmxlbmd0aCArICIgbMOhIMSR4bqhdCBuZ8aw4buhbmcgJDYwIHRy4bufIGzDqm4uIikpOwogICAgICB9CgogICAgICBpZiAoZWxpZ2libGVQdWxscy5sZW5ndGggPiA1KXsKICAgICAgICB2YXIgbW9yZVdyYXAgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1mZWVkLW1vcmUtd3JhcCIpOwogICAgICAgIGlmICh2aXNpYmxlUHVsbHMubGVuZ3RoIDwgZWxpZ2libGVQdWxscy5sZW5ndGgpewogICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGVsaWdpYmxlUHVsbHMubGVuZ3RoIC0gdmlzaWJsZVB1bGxzLmxlbmd0aDsKICAgICAgICAgIHZhciBtb3JlQnV0dG9uID0gbWFrZUVsKCJidXR0b24iLCAicGgtbGItZmVlZC1tb3JlIiwgIlhlbSB0aMOqbSAiICsgTWF0aC5taW4oNSwgcmVtYWluaW5nKSArICIgbMOhIMK3ICIgKyB2aXNpYmxlUHVsbHMubGVuZ3RoICsgIi8iICsgZWxpZ2libGVQdWxscy5sZW5ndGgpOwogICAgICAgICAgbW9yZUJ1dHRvbi50eXBlID0gImJ1dHRvbiI7CiAgICAgICAgICBtb3JlQnV0dG9uLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJYZW0gdGjDqm0gY8OhYyBsw6EgaGl0Iik7CiAgICAgICAgICBtb3JlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgcHVsbEZlZWRWaXNpYmxlQ291bnQgPSBNYXRoLm1pbih2aXNpYmxlUHVsbHMubGVuZ3RoICsgNSwgZWxpZ2libGVQdWxscy5sZW5ndGgpOwogICAgICAgICAgICB2YXIgbW9kYWxDYXJkID0gZWxzLmxiTW9kYWwgPyBlbHMubGJNb2RhbC5xdWVyeVNlbGVjdG9yKCIucGgtbW9kYWwtY2FyZCIpIDogbnVsbDsKICAgICAgICAgICAgdmFyIHNhdmVkU2Nyb2xsID0gbW9kYWxDYXJkID8gbW9kYWxDYXJkLnNjcm9sbFRvcCA6IDA7CiAgICAgICAgICAgIHJlbmRlckxlYWRlcmJvYXJkKCk7CiAgICAgICAgICAgIHZhciByZWZyZXNoZWRNb2RhbENhcmQgPSBlbHMubGJNb2RhbCA/IGVscy5sYk1vZGFsLnF1ZXJ5U2VsZWN0b3IoIi5waC1tb2RhbC1jYXJkIikgOiBudWxsOwogICAgICAgICAgICBpZiAocmVmcmVzaGVkTW9kYWxDYXJkKSByZWZyZXNoZWRNb2RhbENhcmQuc2Nyb2xsVG9wID0gc2F2ZWRTY3JvbGw7CiAgICAgICAgICB9KTsKICAgICAgICAgIG1vcmVXcmFwLmFwcGVuZENoaWxkKG1vcmVCdXR0b24pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHZpc2libGVQdWxscy5sZW5ndGggPiA1KXsKICAgICAgICAgIHZhciBjb2xsYXBzZUJ1dHRvbiA9IG1ha2VFbCgiYnV0dG9uIiwgInBoLWxiLWZlZWQtbW9yZSBwaC1sYi1mZWVkLWNvbGxhcHNlIiwgIuG6qG4gYuG7m3QgwrcgSGnhu4duIDUgbMOhIMSR4bqndSIpOwogICAgICAgICAgY29sbGFwc2VCdXR0b24udHlwZSA9ICJidXR0b24iOwogICAgICAgICAgY29sbGFwc2VCdXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIlRodSBn4buNbiBMaXZlIFB1bGwgduG7gSA1IGzDoSIpOwogICAgICAgICAgY29sbGFwc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewogICAgICAgICAgICBwdWxsRmVlZFZpc2libGVDb3VudCA9IDU7CiAgICAgICAgICAgIHZhciBtb2RhbENhcmQgPSBlbHMubGJNb2RhbCA/IGVscy5sYk1vZGFsLnF1ZXJ5U2VsZWN0b3IoIi5waC1tb2RhbC1jYXJkIikgOiBudWxsOwogICAgICAgICAgICB2YXIgc2F2ZWRTY3JvbGwgPSBtb2RhbENhcmQgPyBtb2RhbENhcmQuc2Nyb2xsVG9wIDogMDsKICAgICAgICAgICAgcmVuZGVyTGVhZGVyYm9hcmQoKTsKICAgICAgICAgICAgdmFyIHJlZnJlc2hlZE1vZGFsQ2FyZCA9IGVscy5sYk1vZGFsID8gZWxzLmxiTW9kYWwucXVlcnlTZWxlY3RvcigiLnBoLW1vZGFsLWNhcmQiKSA6IG51bGw7CiAgICAgICAgICAgIGlmIChyZWZyZXNoZWRNb2RhbENhcmQpewogICAgICAgICAgICAgIHJlZnJlc2hlZE1vZGFsQ2FyZC5zY3JvbGxUb3AgPSBzYXZlZFNjcm9sbDsKICAgICAgICAgICAgICB2YXIgcmVmcmVzaGVkRmVlZCA9IHJlZnJlc2hlZE1vZGFsQ2FyZC5xdWVyeVNlbGVjdG9yKCIucGgtbGItZmVlZCIpOwogICAgICAgICAgICAgIGlmIChyZWZyZXNoZWRGZWVkICYmIHJlZnJlc2hlZEZlZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIDwgcmVmcmVzaGVkTW9kYWxDYXJkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCl7CiAgICAgICAgICAgICAgICByZWZyZXNoZWRGZWVkLnNjcm9sbEludG9WaWV3KHtibG9jazoic3RhcnQiLGJlaGF2aW9yOiJzbW9vdGgifSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIG1vcmVXcmFwLmFwcGVuZENoaWxkKGNvbGxhcHNlQnV0dG9uKTsKICAgICAgICB9CiAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtb3JlV3JhcCk7CiAgICAgIH0KICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1mZWVkLWNhcHRpb24iLCAiTOG7i2NoIHPhu60gZ+G6p24gxJHDonkgc+G6r3AgdGhlbyB0aOG7nWkgZ2lhbiBt4bubaSBuaOG6pXQ7IGNo4buJIGhp4buHbiBsw6EgY8OzIGdpw6EgdGhhbSBraOG6o28gdOG7qyAkNjAgdHLhu58gbMOqbi4gTeG6t2MgxJHhu4tuaCA1IGzDoTsgWGVtIHRow6ptIMSR4buDIG3hu58gdOG7q25nIDUgbMOhIHbDoCDhuqhuIGLhu5t0IMSR4buDIHRodSBn4buNbiB24buBIDUgbMOhIMSR4bqndS4gVOG7qyAkMjAwIMSRxrDhu6NjIGfhuq9uIEpBQ0tQT1QuIEdpw6EgdGjhu4sgdHLGsOG7nW5nIGPDsyB0aOG7gyB0aGF5IMSR4buVaSwga2jDtG5nIHBo4bqjaSBnacOhIGLDoW4gxJHGsOG7o2MgxJHhuqNtIGLhuqNvLiIpKTsKICAgICAgcmV0dXJuIHNlY3Rpb247CiAgICB9CgogICAgZnVuY3Rpb24gc2hvcnRNb25leSh2YWx1ZSl7CiAgICAgIHZhciBuID0gTnVtYmVyKHZhbHVlKSB8fCAwOwogICAgICBpZiAobiA+PSAxMDAwMDAwKSByZXR1cm4gIiQiICsgKG4gLyAxMDAwMDAwKS50b0ZpeGVkKG4gPj0gMTAwMDAwMDAgPyAxIDogMikucmVwbGFjZSgvXC4wJC8sICIiKSArICJNIjsKICAgICAgaWYgKG4gPj0gMTAwMDApIHJldHVybiAiJCIgKyAobiAvIDEwMDApLnRvRml4ZWQobiA+PSAxMDAwMDAgPyAwIDogMSkucmVwbGFjZSgvXC4wJC8sICIiKSArICJLIjsKICAgICAgcmV0dXJuIG1vbmV5KG4pOwogICAgfQoKICAgIC8qIEJhIGvhu7MgeOG6v3AgaOG6oW5nOyBnaeG7ryBuZ3V5w6puIHRoZW1lIHbDoG5nL8SRZW4gdsOgIGLhu5EgY+G7pWMgQlhIIGhp4buHbiB04bqhaS4gKi8KICAgIHZhciBwZXJpb2RUYWJzID0gbWFrZUVsKCJkaXYiLCAicGgtbGItcGVyaW9kLXRhYnMiKTsKICAgIHBlcmlvZFRhYnMuc2V0QXR0cmlidXRlKCJyb2xlIiwgInRhYmxpc3QiKTsKICAgIHBlcmlvZFRhYnMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIkvhu7MgYuG6o25nIHjhur9wIGjhuqFuZyIpOwogICAgWwogICAgICB7aWQ6ImRheSIsIGxhYmVsOiLimIAgTmfDoHkifSwKICAgICAge2lkOiJ3ZWVrIiwgbGFiZWw6IuKWoyBUdeG6p24ifSwKICAgICAge2lkOiJhbGwiLCBsYWJlbDoi8J+PhiBU4buVbmcifQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKG9wdGlvbil7CiAgICAgIHZhciBidXR0b24gPSBtYWtlRWwoImJ1dHRvbiIsICJwaC1sYi1wZXJpb2QtdGFiIiArIChsYlBlcmlvZCA9PT0gb3B0aW9uLmlkID8gIiBwaC1pcy1hY3RpdmUiIDogIiIpLCBvcHRpb24ubGFiZWwpOwogICAgICBidXR0b24udHlwZSA9ICJidXR0b24iOwogICAgICBidXR0b24uc2V0QXR0cmlidXRlKCJyb2xlIiwgInRhYiIpOwogICAgICBidXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwgbGJQZXJpb2QgPT09IG9wdGlvbi5pZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewogICAgICAgIGlmIChsYlBlcmlvZCA9PT0gb3B0aW9uLmlkKSByZXR1cm47CiAgICAgICAgbGJQZXJpb2QgPSBvcHRpb24uaWQ7CiAgICAgICAgcmVmcmVzaExlYWRlcmJvYXJkKCk7CiAgICAgIH0pOwogICAgICBwZXJpb2RUYWJzLmFwcGVuZENoaWxkKGJ1dHRvbik7CiAgICB9KTsKICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQocGVyaW9kVGFicyk7CgogICAgdmFyIHZpZXdUYWJzID0gbWFrZUVsKCJkaXYiLCAicGgtbGItdmlldy10YWJzIik7CiAgICB2aWV3VGFicy5zZXRBdHRyaWJ1dGUoInJvbGUiLCAidGFibGlzdCIpOwogICAgdmlld1RhYnMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIktp4buDdSBi4bqjbmcgeOG6v3AgaOG6oW5nIik7CiAgICBbCiAgICAgIHtpZDoidmFsdWUiLCBsYWJlbDoi8J+RkSBI4buZaSBQaMO6IMOUbmcifSwKICAgICAge2lkOiJ1bmx1Y2t5IiwgbGFiZWw6IvCfkrggSOG7mWkgQ29uIE7hu6MifSwKICAgICAge2lkOiJwc2EiLCBsYWJlbDoi8J+SjiBI4buZaSBQU0EifQogICAgXS5mb3JFYWNoKGZ1bmN0aW9uKG9wdGlvbil7CiAgICAgIHZhciBidXR0b24gPSBtYWtlRWwoImJ1dHRvbiIsICJwaC1sYi12aWV3LXRhYiIgKyAobGJWaWV3ID09PSBvcHRpb24uaWQgPyAiIHBoLWlzLWFjdGl2ZSIgOiAiIiksIG9wdGlvbi5sYWJlbCk7CiAgICAgIGJ1dHRvbi50eXBlID0gImJ1dHRvbiI7CiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoInJvbGUiLCAidGFiIik7CiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCBsYlZpZXcgPT09IG9wdGlvbi5pZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpewogICAgICAgIGlmIChsYlZpZXcgPT09IG9wdGlvbi5pZCkgcmV0dXJuOwogICAgICAgIGxiVmlldyA9IG9wdGlvbi5pZDsKICAgICAgICByZWZyZXNoTGVhZGVyYm9hcmQoKTsKICAgICAgfSk7CiAgICAgIHZpZXdUYWJzLmFwcGVuZENoaWxkKGJ1dHRvbik7CiAgICB9KTsKICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQodmlld1RhYnMpOwoKICAgIHZhciBuZWVkc0FjdGl2aXR5ID0gbGJWaWV3ID09PSAidW5sdWNreSIgfHwgKGxiVmlldyA9PT0gInZhbHVlIiAmJiBsYlBlcmlvZCAhPT0gImFsbCIpOwogICAgaWYgKGxiUGVyaW9kICE9PSAiYWxsIiB8fCBsYlZpZXcgPT09ICJ1bmx1Y2t5IiB8fCBsYlZpZXcgPT09ICJwc2EiKXsKICAgICAgdmFyIHBlcmlvZE5vdGUgPSBsYlZpZXcgPT09ICJ1bmx1Y2t5IgogICAgICAgID8gIkjhu5lpIENvbiBO4bujIHjhur9wIHRoZW8gUk9JIG3DtCBwaOG7j25nIHRo4bqlcCBuaOG6pXQgwrcgdOG7kWkgdGhp4buDdSAxMCBwYWNrIHbDoCBwaOG6o2kgxJFhbmcgbOG7lyDCtyAiICsgYWN0aXZpdHlQZXJpb2RSYW5nZUxhYmVsKGxiUGVyaW9kKQogICAgICAgIDogKGxiVmlldyA9PT0gInBzYSIKICAgICAgICAgID8gIsSQaeG7g20gY2jhuqVtIGzDoCBtw7QgcGjhu49uZyB0cm9uZyBQb2tlSHViLCBraMO0bmcgcGjhuqNpIMSRaeG7g20gUFNBIHRo4bqtdC4gWOG6v3AgdGhlbyBz4buRIFBTQSAxMCDihpIgUFNBIDkrIOKGkiB04buVbmcgc+G7kSB0aOG6uyDEkcOjIGNo4bqlbSDCtyAiICsgYWN0aXZpdHlQZXJpb2RSYW5nZUxhYmVsKGxiUGVyaW9kKQogICAgICAgICAgOiBhY3Rpdml0eVBlcmlvZFJhbmdlTGFiZWwobGJQZXJpb2QpICsgIiDCtyBHacOhIHRy4buLIGPhu5luZyB04burIGPDoWMgbMOhIG3hu58gdHJvbmcga+G7sy4gTMaw4bujdCBt4bufIHRyxrDhu5tjIGtoaSBi4bqtdCB0w61uaCBuxINuZyBraMO0bmcgdGjhu4Mga2jDtGkgcGjhu6VjLiIpOwogICAgICBlbHMubGJCb2R5LmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLXBlcmlvZC1ub3RlIiwgcGVyaW9kTm90ZSkpOwogICAgICB2YXIgdmlld0Vycm9yID0gbGJWaWV3ID09PSAicHNhIiA/IHBzYUVycm9yIDogKG5lZWRzQWN0aXZpdHkgPyBhY3Rpdml0eUVycm9yIDogIiIpOwogICAgICBpZiAodmlld0Vycm9yKXsKICAgICAgICB2YXIgYWN0aXZpdHlXYXJuaW5nID0gbWFrZUVsKCJkaXYiLCAicGgtbGItcGVyaW9kLWVycm9yIik7CiAgICAgICAgYWN0aXZpdHlXYXJuaW5nLmFwcGVuZENoaWxkKG1ha2VFbCgic3Ryb25nIiwgIiIsIGxiVmlldyA9PT0gInBzYSIgPyAiQlhIIFBTQSBjaMawYSDEkcaw4bujYyBr4bq/dCBu4buRaS4iIDogIkJYSCBob+G6oXQgxJHhu5luZyBjaMawYSDEkcaw4bujYyBr4bq/dCBu4buRaS4iKSk7CiAgICAgICAgYWN0aXZpdHlXYXJuaW5nLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgIiIsIGxiVmlldyA9PT0gInBzYSIKICAgICAgICAgID8gIkNo4bqheSBmaWxlIFBva2VIdWJfTGVhZGVyYm9hcmRfUFNBX1N1cGFiYXNlX1NRTC5zcWwgYuG6o24gbeG7m2kgdHJvbmcgU3VwYWJhc2Ug4oaSIFNRTCBFZGl0b3IgxJHhu4MgdOG6oW8gYuG6o25nIHBzYV9ncmFkZXMgdsOgIGPhuqVwIHF1eeG7gW4gcmVhbHRpbWUuIMSQaeG7g20gUFNBIHRyw6puIG3DoXkgduG6q24gxJHGsOG7o2MgbMawdSBj4bulYyBi4buZLiIKICAgICAgICAgIDogIkNo4bqheSBs4bqhaSBmaWxlIFNRTCBQb2tlSHViX0xlYWRlcmJvYXJkX1BTQV9TdXBhYmFzZV9TUUwuc3FsIHRyb25nIFN1cGFiYXNlIOKGkiBTUUwgRWRpdG9yIMSR4buDIGLhuq10IEJYSCBOZ8OgeS9UdeG6p24vSOG7mWkgQ29uIE7hu6MuIEjhu5lpIFBow7ogw5RuZyB24bqrbiBkw7luZyBi4bqjbmcgbGVhZGVyYm9hcmQgaGnhu4duIHThuqFpLiIpKTsKICAgICAgICBhY3Rpdml0eVdhcm5pbmcuYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItcGVyaW9kLWVycm9yLWRldGFpbCIsIHZpZXdFcnJvcikpOwogICAgICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQoYWN0aXZpdHlXYXJuaW5nKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGlmICgoYWN0aXZpdHlUcnVuY2F0ZWQgJiYgbmVlZHNBY3Rpdml0eSkgfHwgKHBzYVRydW5jYXRlZCAmJiBsYlZpZXcgPT09ICJwc2EiKSl7CiAgICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItcGVyaW9kLW5vdGUiLCAixJBhbmcgaGnhu4NuIHRo4buLIGThu68gbGnhu4d1IGfhuqduIMSRw6J5IG5o4bqldCAoxJHDoyBjaOG6oW0gZ2nhu5tpIGjhuqFuIHRydXkgduG6pW4gNS4wMDAgZMOybmcpLiIpKTsKICAgIH0KCiAgICAvKiBU4buVbmcgcXVhbiB2w6BuZyBraW0gKi8KICAgIHZhciBtYXN0aGVhZCA9IG1ha2VFbCgic2VjdGlvbiIsICJwaC1sYi1tYXN0aGVhZCIpOwogICAgdmFyIG1hc3RUb3AgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1tYXN0aGVhZC10b3AiKTsKICAgIHZhciBtYXN0Q29weSA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLW1hc3RoZWFkLWNvcHkiKTsKICAgIHZhciBraWNrZXJUZXh0ID0gbGJWaWV3ID09PSAicHNhIiA/ICJWTkdBTUUgwrcgSOG7mEkgUFNBIiA6IChsYlZpZXcgPT09ICJ1bmx1Y2t5IiA/ICJWTkdBTUUgwrcgSOG7mEkgQ09OIE7hu6IiIDogIlZOR0FNRSDCtyBI4buYSSBQSMOaIMOUTkciKTsKICAgIG1hc3RDb3B5LmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLWtpY2tlciIsIGtpY2tlclRleHQpKTsKICAgIHZhciB0b3RhbExhYmVsID0gbGJWaWV3ID09PSAicHNhIgogICAgICA/ICJU4buVbmcgc+G7kSB0aOG6uyBQU0EgbcO0IHBo4buPbmcgxJHDoyBjaOG6pW0gdHJvbmcga+G7syIKICAgICAgOiAobGJWaWV3ID09PSAidW5sdWNreSIKICAgICAgICA/ICJUcmFpbmVyIMSRYW5nIGzhu5cgbcO0IHBo4buPbmcgwrcgUk9JIMOibSDCtyB04buRaSB0aGnhu4N1IDEwIHBhY2siCiAgICAgICAgOiAobGJQZXJpb2QgPT09ICJkYXkiID8gIlThu5VuZyBnacOhIHRy4buLIGNhcmQgbeG7nyB0cm9uZyBuZ8OgeSIgOiAobGJQZXJpb2QgPT09ICJ3ZWVrIiA/ICJU4buVbmcgZ2nDoSB0cuG7iyBjYXJkIG3hu58gdHJvbmcgdHXhuqduIiA6ICJU4buVbmcgZ2nDoSB0cuG7iyBi4buZIHPGsHUgdOG6rXAgdHLDqm4gQlhIIikpKTsKICAgIHZhciB0b3RhbE1ldGEgPSBsYlZpZXcgPT09ICJwc2EiCiAgICAgID8gcm93cy5sZW5ndGggKyAiIHRyYWluZXIgwrcgxq91IHRpw6puIFBTQSAxMCwgcuG7k2kgUFNBIDkrIHbDoCB04buVbmcgdGjhursiCiAgICAgIDogKGxiVmlldyA9PT0gInVubHVja3kiCiAgICAgICAgPyByb3dzLmxlbmd0aCArICIgdHJhaW5lciDEkeG7pyDEkWnhu4F1IGtp4buHbiDCtyB44bq/cCB0aGVvIFJPSSB0aOG6pXAgbmjhuqV0IMK3ICIgKyBhY3Rpdml0eVBlcmlvZFJhbmdlTGFiZWwobGJQZXJpb2QpCiAgICAgICAgOiAobGJQZXJpb2QgPT09ICJhbGwiCiAgICAgICAgICA/IHJvd3MubGVuZ3RoICsgIiB0cmFpbmVyIMK3IEThu68gbGnhu4d1IGLhu5kgc8awdSB04bqtcCBj4buZbmcgZ+G7mXAiCiAgICAgICAgICA6IHJvd3MubGVuZ3RoICsgIiB0cmFpbmVyIMK3ICIgKyBhY3Rpdml0eVBlcmlvZFJhbmdlTGFiZWwobGJQZXJpb2QpICsgIiDCtyBHacOhIHRo4buLIHRyxrDhu51uZyDEkcOjIGdoaSBuaOG6rW4iKSk7CiAgICBtYXN0Q29weS5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi10b3RhbC1sYWJlbCIsIHRvdGFsTGFiZWwpKTsKICAgIG1hc3RDb3B5LmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLXRvdGFsLXZhbHVlIiwgbGJWaWV3ID09PSAicHNhIiA/IFN0cmluZyh0b3RhbEFsbCkgOiAobGJWaWV3ID09PSAidW5sdWNreSIgPyBTdHJpbmcocm93cy5sZW5ndGgpIDogbW9uZXkodG90YWxBbGwpKSkpOwogICAgbWFzdENvcHkuYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItdG90YWwtbWV0YSIsIHRvdGFsTWV0YSkpOwogICAgdmFyIGxpdmVDb25uZWN0ZWQgPSAhIShjbGllbnQgJiYgZWxzLmxiTGl2ZSAmJiBlbHMubGJMaXZlLmNsYXNzTGlzdC5jb250YWlucygicGgtbGItb25saW5lIikpOwogICAgdmFyIGxpdmVQaWxsID0gbWFrZUVsKCJzcGFuIiwgInBoLWxiLWxpdmUtcGlsbCIgKyAobGl2ZUNvbm5lY3RlZCA/ICIgcGgtaXMtbGl2ZSIgOiAiIiksIGxpdmVDb25uZWN0ZWQgPyAi4pePIFJFQUxUSU1FIiA6ICLil4sgxJBBTkcgS+G6vlQgTuG7kEkiKTsKICAgIG1hc3RUb3AuYXBwZW5kQ2hpbGQobWFzdENvcHkpOwogICAgbWFzdFRvcC5hcHBlbmRDaGlsZChsaXZlUGlsbCk7CiAgICBtYXN0aGVhZC5hcHBlbmRDaGlsZChtYXN0VG9wKTsKICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQobWFzdGhlYWQpOwoKICAgIC8qIFRow6BuaCB0w61jaCBjw6EgbmjDom4gduG6q24gaGnhu4NuIHRo4buLIGvhu4MgY+G6oyBraGkgY2jGsGEgbOG7jXQgVG9wIDIwICovCiAgICB2YXIgc2VsZkxpbmUgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1zZWxmbGluZSIpOwogICAgdmFyIHNlbGZJbmZvID0gbWFrZUVsKCJkaXYiLCAicGgtbGItc2VsZmluZm8iKTsKICAgIHZhciBzZWxmU3Ryb25nID0gbWFrZUVsKCJzdHJvbmciLCAiIiwgIlRSQUlORVIgQ+G7pkEgQuG6oE4gwrcgSOG6oE5HICMiICsgbXlSYW5rKTsKICAgIHNlbGZJbmZvLmFwcGVuZENoaWxkKG1ha2VFbCgic3Ryb25nIiwgIiIsIChsYlZpZXcgPT09ICJ1bmx1Y2t5IiAmJiAhbXkpID8gIlRSQUlORVIgQ+G7pkEgQuG6oE4gwrcgQ0jGr0EgxJDhu6YgxJBJ4buAVSBLSeG7hk4iIDogKChsYlZpZXcgPT09ICJwc2EiICYmICFteSkgPyAiVFJBSU5FUiBD4bumQSBC4bqgTiDCtyBDSMavQSBDw5MgxJBJ4buCTSBQU0EiIDogIlRSQUlORVIgQ+G7pkEgQuG6oE4gwrcgSOG6oE5HICMiICsgbXlSYW5rKSkpOwogICAgaWYgKGxiVmlldyA9PT0gInBzYSIpewogICAgICBpZiAobXkpewogICAgICAgIHNlbGZJbmZvLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgIMK3ICBQU0EgMTA6ICIgKyBteS5wc2ExMENvdW50ICsgIiDCtyBQU0EgOSs6ICIgKyBteS5wc2E5UGx1c0NvdW50KSk7CiAgICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLXNlbGYtc3ViIiwgbXkucHNhR3JhZGVzICsgIiB0aOG6uyDEkcOjIGNo4bqlbSDCtyB0cnVuZyBiw6xuaCAiICsgbXkucHNhQXZnR3JhZGUudG9GaXhlZCgxKSArICIvMTAgdHJvbmcga+G7syIpKTsKICAgICAgfWVsc2V7CiAgICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAgwrcgIENoxrBhIGPDsyDEkWnhu4NtIFBTQSBtw7QgcGjhu49uZyDEkcaw4bujYyDEkeG7k25nIGLhu5kgdHJvbmcga+G7syBuw6B5LiIpKTsKICAgICAgICBzZWxmSW5mby5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItc2VsZi1zdWIiLCAiSMOjeSBjaOG6pW0gbeG7mXQgdGjhursgdHJvbmcgUFNBIEdyYWRpbmcgTGFiIMSR4buDIGLhuq90IMSR4bqndS4iKSk7CiAgICAgIH0KICAgIH1lbHNlIGlmIChsYlZpZXcgPT09ICJ1bmx1Y2t5Iil7CiAgICAgIGlmIChteSl7CiAgICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAgwrcgIFJPSSAiICsgc2lnbmVkUGN0KG15LnJvaVBjdCkgKyAiIMK3ICBM4buXIG3DtCBwaOG7j25nICIgKyBtb25leShteS5sb3NzKSkpOwogICAgICAgIHNlbGZJbmZvLmFwcGVuZENoaWxkKG1ha2VFbCgic3BhbiIsICJwaC1sYi1zZWxmLXN1YiIsIChteS5wYWNrcyB8fCAwKSArICIgcGFjayDCtyAiICsgKG15LmNhcmRzIHx8IDApICsgIiBjYXJkIHRyb25nIGvhu7MgbsOgeSIpKTsKICAgICAgfWVsc2V7CiAgICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAgwrcgIEPhuqduIG3hu58gw610IG5o4bqldCAxMCBwYWNrIHbDoCBjw7MgUk9JIMOibSDEkeG7gyB2w6BvIEJYSC4iKSk7CiAgICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLXNlbGYtc3ViIiwgKGxvY2FsLnBhY2tzIHx8IDApICsgIiBwYWNrIMSRw6MgbeG7nyDCtyBST0kgaGnhu4duIHThuqFpICIgKyBzaWduZWRQY3QobG9jYWwucm9pX3BjdCkpKTsKICAgICAgfQogICAgfWVsc2UgaWYgKGxiUGVyaW9kID09PSAiYWxsIil7CiAgICAgIHNlbGZJbmZvLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgIMK3ICBDb2xsZWN0aW9uICIgKyBtb25leShteSA/IG15LnRvdGFsVmFsdWUgOiBsb2NhbC50b3RhbF92YWx1ZSkgKyAiICDCtyAgUk9JICIgKyBzaWduZWRQY3QobXkgPyBteS5yb2lQY3QgOiBsb2NhbC5yb2lfcGN0KSkpOwogICAgICBzZWxmSW5mby5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItc2VsZi1zdWIiLCAobXkgPyAobXkucGFja3MgfHwgMCkgOiAobG9jYWwucGFja3MgfHwgMCkpICsgIiBwYWNrIMSRw6MgbeG7nyDCtyAiICsgKG15ID8gKG15LnVuaXF1ZSB8fCAwKSA6IChsb2NhbC51bmlxdWVfY2FyZHMgfHwgMCkpICsgIiBjYXJkIMSR4buZYyBuaOG6pXQiKSk7CiAgICB9ZWxzZXsKICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAgwrcgIEdpw6EgdHLhu4sga+G7syAiICsgbW9uZXkobXkgPyBteS50b3RhbFZhbHVlIDogMCkpKTsKICAgICAgc2VsZkluZm8uYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLXNlbGYtc3ViIiwgKG15ID8gKG15LnBhY2tzIHx8IDApIDogMCkgKyAiIHBhY2sgwrcgIiArIChteSA/IChteS5jYXJkcyB8fCAwKSA6IDApICsgIiBjYXJkIHRyb25nIGvhu7MgbsOgeSIpKTsKICAgIH0KICAgIHZhciBzZWxmQWN0aW9ucyA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWFjdGlvbnMiKTsKICAgIHNlbGZBY3Rpb25zLnN0eWxlLm1hcmdpbiA9ICIwIjsKICAgIHZhciByZW5hbWUgPSBtYWtlRWwoImJ1dHRvbiIsICJwaC1sYi1idG4iLCAi4pyPIMSQ4buVaSB0w6puIik7CiAgICByZW5hbWUudHlwZSA9ICJidXR0b24iOwogICAgcmVuYW1lLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsKICAgICAgaWYgKGVscy5sYk1vZGFsKSBlbHMubGJNb2RhbC5oaWRkZW4gPSB0cnVlOwogICAgICBpZiAoZWxzLndlbGNvbWVNb2RhbCl7CiAgICAgICAgZWxzLndlbGNvbWVNb2RhbC5oaWRkZW4gPSBmYWxzZTsKICAgICAgICBpZiAoZWxzLndlbGNvbWVJbnB1dCl7CiAgICAgICAgICBlbHMud2VsY29tZUlucHV0LnZhbHVlID0gY3VycmVudE5hbWU7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7IGVscy53ZWxjb21lSW5wdXQuZm9jdXMoKTsgZWxzLndlbGNvbWVJbnB1dC5zZWxlY3QoKTsgfSwgNDApOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICB2YXIgcmVmcmVzaCA9IG1ha2VFbCgiYnV0dG9uIiwgInBoLWxiLWJ0biIsICLihrsgTMOgbSBt4bubaSIpOwogICAgcmVmcmVzaC50eXBlID0gImJ1dHRvbiI7CiAgICByZWZyZXNoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsgcmVmcmVzaExlYWRlcmJvYXJkKCk7IH0pOwogICAgc2VsZkFjdGlvbnMuYXBwZW5kQ2hpbGQocmVuYW1lKTsKICAgIHNlbGZBY3Rpb25zLmFwcGVuZENoaWxkKHJlZnJlc2gpOwogICAgc2VsZkxpbmUuYXBwZW5kQ2hpbGQoc2VsZkluZm8pOwogICAgc2VsZkxpbmUuYXBwZW5kQ2hpbGQoc2VsZkFjdGlvbnMpOwogICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChzZWxmTGluZSk7CgogICAgLyogVGjhursgZ2nDoSBjYW8gbmjhuqV0IG3DoCBjaMOtbmggVHJhaW5lciBuw6B5IMSRw6MgbeG7nzogY8OzIHTDqm4sIOG6o25oIHbDoCBnacOhIGPhu6UgdGjhu4MuICovCiAgICB2YXIgYmVzdExvY2FsQ2FyZCA9IHJlYWRMb2NhbEJlc3RDYXJkKCk7CiAgICB2YXIgYmVzdFB1bGxQYW5lbCA9IG1ha2VFbCgic2VjdGlvbiIsICJwaC1sYi1iZXN0LXB1bGwiKTsKICAgIHZhciBiZXN0UHVsbEFydCA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWJlc3QtcHVsbC1hcnQiKTsKICAgIGlmIChiZXN0TG9jYWxDYXJkICYmIGJlc3RMb2NhbENhcmQuaW1nKXsKICAgICAgdmFyIGJlc3RQdWxsSW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CiAgICAgIHZhciBiZXN0SW1hZ2VCYXNlID0gYmVzdExvY2FsQ2FyZC5pbWc7CiAgICAgIHZhciB0cmllZExvd1F1YWxpdHkgPSBmYWxzZTsKICAgICAgYmVzdFB1bGxJbWcuc3JjID0gY2FyZEltYWdlVXJsKGJlc3RJbWFnZUJhc2UsICJoaWdoLndlYnAiKTsKICAgICAgYmVzdFB1bGxJbWcuYWx0ID0gYmVzdExvY2FsQ2FyZC5uYW1lIHx8ICJMw6EgUG9rw6ltb24gY8OzIGdpw6EgY2FvIG5o4bqldCI7CiAgICAgIGJlc3RQdWxsSW1nLmxvYWRpbmcgPSAibGF6eSI7CiAgICAgIGJlc3RQdWxsSW1nLmRlY29kaW5nID0gImFzeW5jIjsKICAgICAgYmVzdFB1bGxJbWcuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbigpewogICAgICAgIGlmICghdHJpZWRMb3dRdWFsaXR5ICYmIGJlc3RJbWFnZUJhc2UgJiYgIS9cLig/OnBuZ3xqcGU/Z3x3ZWJwfGdpZikoPzpbPyNdLiopPyQvaS50ZXN0KFN0cmluZyhiZXN0SW1hZ2VCYXNlKSkpewogICAgICAgICAgdHJpZWRMb3dRdWFsaXR5ID0gdHJ1ZTsKICAgICAgICAgIGJlc3RQdWxsSW1nLnNyYyA9IGNhcmRJbWFnZVVybChiZXN0SW1hZ2VCYXNlLCAibG93LndlYnAiKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYmVzdFB1bGxJbWcucmVtb3ZlKCk7CiAgICAgICAgYmVzdFB1bGxBcnQuY2xhc3NMaXN0LmFkZCgicGgtbGItaW1hZ2UtbWlzc2luZyIpOwogICAgICAgIGJlc3RQdWxsQXJ0LnRleHRDb250ZW50ID0gIvCfjrQiOwogICAgICAgIGJlc3RQdWxsQXJ0LnRpdGxlID0gIuG6om5oIHRo4bq7IGhp4buHbiBraMO0bmcgdOG6o2kgxJHGsOG7o2MiOwogICAgICB9KTsKICAgICAgYmVzdFB1bGxBcnQuYXBwZW5kQ2hpbGQoYmVzdFB1bGxJbWcpOwogICAgfWVsc2V7CiAgICAgIGJlc3RQdWxsQXJ0LmNsYXNzTGlzdC5hZGQoInBoLWxiLWltYWdlLW1pc3NpbmciKTsKICAgICAgYmVzdFB1bGxBcnQudGV4dENvbnRlbnQgPSBiZXN0TG9jYWxDYXJkID8gIvCfjrQiIDogIuKAlCI7CiAgICB9CiAgICBiZXN0UHVsbFBhbmVsLmFwcGVuZENoaWxkKGJlc3RQdWxsQXJ0KTsKICAgIHZhciBiZXN0UHVsbE1haW4gPSBtYWtlRWwoImRpdiIsICJwaC1sYi1iZXN0LXB1bGwtbWFpbiIpOwogICAgYmVzdFB1bGxNYWluLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLWJlc3QtcHVsbC1raWNrZXIiLCAi8J+SjiBMw6EgY8OzIGdpw6EgY2FvIG5o4bqldCBj4bunYSBi4bqhbiIpKTsKICAgIGlmIChiZXN0TG9jYWxDYXJkKXsKICAgICAgYmVzdFB1bGxNYWluLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLWJlc3QtcHVsbC1uYW1lIiwgYmVzdExvY2FsQ2FyZC5uYW1lKSk7CiAgICAgIHZhciBiZXN0TWV0YVBhcnRzID0gW107CiAgICAgIGlmIChiZXN0TG9jYWxDYXJkLnNldCkgYmVzdE1ldGFQYXJ0cy5wdXNoKGJlc3RMb2NhbENhcmQuc2V0KTsKICAgICAgaWYgKGJlc3RMb2NhbENhcmQucmFyaXR5KSBiZXN0TWV0YVBhcnRzLnB1c2goYmVzdExvY2FsQ2FyZC5yYXJpdHkpOwogICAgICBlbHNlIGJlc3RNZXRhUGFydHMucHVzaCh0aWVyTGFiZWwoYmVzdExvY2FsQ2FyZC50aWVyKSk7CiAgICAgIGJlc3RNZXRhUGFydHMucHVzaCgiSUQgIiArIGJlc3RMb2NhbENhcmQuaWQpOwogICAgICBiZXN0UHVsbE1haW4uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItYmVzdC1wdWxsLW1ldGEiLCBiZXN0TWV0YVBhcnRzLmpvaW4oIiDCtyAiKSkpOwogICAgICBiZXN0UHVsbE1haW4uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItYmVzdC1wdWxsLXByaWNlIiwgbW9uZXkoYmVzdExvY2FsQ2FyZC5wcmljZSkpKTsKICAgICAgYmVzdFB1bGxNYWluLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLWJlc3QtcHVsbC1ub3RlIiwgIkzhuqV5IHThu6sgYuG7mSBzxrB1IHThuq1wIMSRw6MgbMawdSB0csOqbiB0csOsbmggZHV54buHdCBuw6B5OyBnacOhIHRy4buLIGzDoCBk4buvIGxp4buHdSBnacOhIGNhcmQgxJHDoyBnaGkgbmjhuq1uLiIpKTsKICAgIH1lbHNlewogICAgICBiZXN0UHVsbE1haW4uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItYmVzdC1wdWxsLW5hbWUiLCAiQ2jGsGEgY8OzIGzDoSBuw6BvIGPDsyBk4buvIGxp4buHdSBnacOhIikpOwogICAgICBiZXN0UHVsbE1haW4uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItYmVzdC1wdWxsLW1ldGEiLCAiTeG7nyBwYWNrIHbDoCBsxrB1IGNhcmQgdsOgbyBC4buZIHPGsHUgdOG6rXAgxJHhu4MgZ2hpIG5o4bqtbiBsw6EgZ2nDoSB0cuG7iyBjYW8gbmjhuqV0LiIpKTsKICAgIH0KICAgIGJlc3RQdWxsUGFuZWwuYXBwZW5kQ2hpbGQoYmVzdFB1bGxNYWluKTsKICAgIGlmIChsYlZpZXcgIT09ICJwc2EiKXsKICAgICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChiZXN0UHVsbFBhbmVsKTsKICAgICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChyZW5kZXJQdWxsRmVlZFNlY3Rpb24oKSk7CiAgICB9CgogICAgaWYgKCFyb3dzLmxlbmd0aCl7CiAgICAgIHZhciBlbXB0eVRleHQgPSBsYlZpZXcgPT09ICJwc2EiCiAgICAgICAgPyAiQ2jGsGEgY8OzIMSRaeG7g20gUFNBIG7DoG8gxJHGsOG7o2MgxJHhu5NuZyBi4buZIGzDqm4gQlhIIHRyb25nIGvhu7MgbsOgeS4gQ2jhuqVtIG3hu5l0IHRo4bq7IHRyb25nIFBTQSBHcmFkaW5nIExhYiDEkeG7gyBi4bqvdCDEkeG6p3U7IGThu68gbGnhu4d1IGPFqSB0csOqbiB0aGnhur90IGLhu4sgc+G6vSDEkcaw4bujYyDEkeG7k25nIGLhu5kga2hpIGLhuqNuZyBQU0EgxJHDoyBz4bq1biBzw6BuZy4iCiAgICAgICAgOiAobGJWaWV3ID09PSAidW5sdWNreSIKICAgICAgICAgID8gIkNoxrBhIGPDsyBUcmFpbmVyIMSR4bunIMSRaeG7gXUga2nhu4duLiBD4bqnbiDDrXQgbmjhuqV0IDEwIHBhY2sgdHJvbmcga+G7syB2w6AgUk9JIMOibTsgbeG7nyBwYWNrIG3hu5tpIHPhur0gYuG6r3QgxJHhuqd1IGdoaSBuaOG6rW4gdGjDoG5oIHTDrWNoIHThu6sgdGjhu51pIMSRaeG7g20gbsOgeS4iCiAgICAgICAgICA6IChsYlBlcmlvZCA9PT0gImFsbCIKICAgICAgICAgICAgPyAiQ2jGsGEgY8OzIFRyYWluZXIgbsOgbyB0csOqbiBCWEguIE3hu58gcGFjayDEkeG6p3UgdGnDqm4gxJHhu4MgbMawdSB0aMOgbmggdMOtY2ggdsOgIHh14bqldCBoaeG7h24gdOG6oWkgU+G6o25oIFZpbmggRGFuaCEiCiAgICAgICAgICAgIDogIkNoxrBhIGPDsyBsxrDhu6N0IG3hu58gcGFjayDEkcaw4bujYyBnaGkgbmjhuq1uIHRyb25nIGvhu7MgbsOgeS4gTeG7nyBwYWNrIMSR4buDIGLhuq90IMSR4bqndSBj4bqhbmggdHJhbmggQlhIISIpKTsKICAgICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1lbXB0eSIsIGVtcHR5VGV4dCkpOwogICAgICB2YXIgZW1wdHlGb290ID0gbGJWaWV3ID09PSAicHNhIgogICAgICAgID8gIkjhu5lpIFBTQSBsw6AgdGjDoG5oIHTDrWNoIGNo4bqlbSDEkWnhu4NtIG3DtCBwaOG7j25nLCBraMO0bmcgcGjhuqNpIMSRaeG7g20gUFNBIHRo4bqtdC4gWOG6v3AgdGhlbyBz4buRIFBTQSAxMCDihpIgUFNBIDkrIOKGkiB04buVbmcgdGjhursgxJHDoyBjaOG6pW0uIgogICAgICAgIDogKGxiVmlldyA9PT0gInVubHVja3kiCiAgICAgICAgICA/ICJI4buZaSBDb24gTuG7oyBsw6AgY2jhu4kgc+G7kSBtw7QgcGjhu49uZywga2jDtG5nIHBo4bqjaSB0aeG7gW4gdGjhuq10LiBY4bq/cCB0aGVvIFJPSSB0aOG6pXAgbmjhuqV0OyBkw7luZyB04buVbmcgbOG7lyBtw7QgcGjhu49uZyDEkeG7gyBwaMOhIGjDsmEuIgogICAgICAgICAgOiAobGJQZXJpb2QgPT09ICJhbGwiID8gIkjhu5lpIFBow7ogw5RuZyB44bq/cCB0aGVvIHThu5VuZyBnacOhIHRy4buLIGNvbGxlY3Rpb247IG7hur91IGLhurFuZyBuaGF1IHPhur0geMOpdCBST0ksIHPhu5EgY2FyZCDEkeG7mWMgbmjhuqV0IHbDoCB0aMOgbmggdMOtY2ggc8awdSB04bqtcC4iIDogIkJYSCB44bq/cCB0aGVvIHThu5VuZyBnacOhIHRy4buLIGNhcmQgxJHDoyBuaOG6rW4gdHJvbmcga+G7szsgbuG6v3UgYuG6sW5nIG5oYXUgc+G6vSB4w6l0IHPhu5EgcGFjayBy4buTaSBz4buRIGNhcmQgxJHDoyBt4bufLiIpKTsKICAgICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1mb290IiwgZW1wdHlGb290KSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBC4bulYyBUb3AgMzogaOG6oW5nIE5ow6wgLSBOaOG6pXQgLSBCYSDEkeG7gyBOaMOgIHbDtCDEkeG7i2NoIG7hurFtIGNow61uaCBnaeG7r2EgKi8KICAgIHZhciBwb2RpdW1IZWFkID0gbWFrZUVsKCJkaXYiLCAicGgtbGItc2VjdGlvbi1oZWFkIik7CiAgICBwb2RpdW1IZWFkLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLXNlY3Rpb24tdGl0bGUiLCBsYlZpZXcgPT09ICJwc2EiID8gIvCfko4gVHJhaW5lciBQU0EgbuG7lWkgYuG6rXQiIDogKGxiVmlldyA9PT0gInVubHVja3kiID8gIvCfkrggSOG7mWkgQ29uIE7hu6MiIDogIvCfkZEgSOG7mWkgUGjDuiDDlG5nIikpKTsKICAgIHBvZGl1bUhlYWQuYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItc2VjdGlvbi1zdWIiLCBsYlZpZXcgPT09ICJwc2EiID8gIk5oaeG7gXUgUFNBIDEwIG5o4bqldCDCtyBzYXUgxJHDsyBQU0EgOSsgdsOgIHThu5VuZyB0aOG6uyIgOiAobGJWaWV3ID09PSAidW5sdWNreSIgPyAiUk9JIHRo4bqlcCBuaOG6pXQgdHJvbmcga+G7syIgOiAiMyB24buLIHRyw60gZOG6q24gxJHhuqd1IikpKTsKICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQocG9kaXVtSGVhZCk7CgogICAgdmFyIHBvZGl1bSA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLXBvZGl1bSIpOwogICAgdmFyIHBvZGl1bUVudHJpZXMgPSBbCiAgICAgIHsgcm93OiByb3dzWzFdLCByYW5rOiAyLCBjbGFzc05hbWU6ICJwaC1sYi1yYW5rLTIiLCB0YWc6ICJSVU5ORVItVVAiIH0sCiAgICAgIHsgcm93OiByb3dzWzBdLCByYW5rOiAxLCBjbGFzc05hbWU6ICJwaC1sYi1yYW5rLTEiLCB0YWc6ICJDSEFNUElPTiIgfSwKICAgICAgeyByb3c6IHJvd3NbMl0sIHJhbms6IDMsIGNsYXNzTmFtZTogInBoLWxiLXJhbmstMyIsIHRhZzogIlRISVJEIFBMQUNFIiB9CiAgICBdOwogICAgcG9kaXVtRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KXsKICAgICAgdmFyIHJvdyA9IGVudHJ5LnJvdzsKICAgICAgaWYgKCFyb3cpIHJldHVybjsKICAgICAgdmFyIGNhcmQgPSBtYWtlRWwoImFydGljbGUiLCAicGgtbGItcG9kaXVtLWNhcmQgIiArIGVudHJ5LmNsYXNzTmFtZSk7CiAgICAgIGlmIChlbnRyeS5yYW5rID09PSAxKSBjYXJkLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLWNyb3duIiwgIvCfkZEiKSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQobWFrZUF2YXRhcihyb3cubmFtZSwgInBoLWxiLWF2YXRhciIpKTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1yYW5rLXRhZyIsIGVudHJ5LnRhZykpOwogICAgICB2YXIgbmFtZUxpbmUgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1wb2RpdW0tbmFtZSBwaC1sYi1wcm9maWxlLWxpbmsiLCByb3cubmFtZSk7CiAgICAgIG5hbWVMaW5lLmRhdGFzZXQucGhQcm9maWxlVWlkID0gU3RyaW5nKHJvdy51aWQgfHwgIiIpOwogICAgICBuYW1lTGluZS5kYXRhc2V0LnBoUHJvZmlsZU5hbWUgPSBTdHJpbmcocm93Lm5hbWUgfHwgIlRyYWluZXIiKTsKICAgICAgbmFtZUxpbmUuc2V0QXR0cmlidXRlKCJyb2xlIiwgImJ1dHRvbiIpOyBuYW1lTGluZS50YWJJbmRleCA9IDA7CiAgICAgIG5hbWVMaW5lLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJYZW0gdOG7pyB0csawbmcgYsOgeSBj4bunYSAiICsgU3RyaW5nKHJvdy5uYW1lIHx8ICJUcmFpbmVyIikpOwogICAgICBuYW1lTGluZS50aXRsZSA9ICJC4bqlbSDEkeG7gyB4ZW0gdOG7pyB0csawbmcgYsOgeSBUcmFpbmVyIjsKICAgICAgaWYgKHJvdy51aWQgPT09IG15VWlkKSBuYW1lTGluZS5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItcG9kaXVtLXlvdSIsICLCtyBC4bqgTiIpKTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChuYW1lTGluZSk7CiAgICAgIGNhcmQuYXBwZW5kQ2hpbGQobWFrZVRyYWluZXJCYWRnZXMocm93LCBmYWxzZSkpOwogICAgICB2YXIgcG9kaXVtVmFsdWVUZXh0ID0gbGJWaWV3ID09PSAicHNhIgogICAgICAgID8gKHJvdy5wc2ExMENvdW50ICsgIiDDlyBQU0EgMTAiKQogICAgICAgIDogKGxiVmlldyA9PT0gInVubHVja3kiID8gIuKIkiIgKyBtb25leShyb3cubG9zcykgOiBtb25leShyb3cudG90YWxWYWx1ZSkpOwogICAgICBjYXJkLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLXBvZGl1bS12YWx1ZSIgKyAobGJWaWV3ID09PSAidW5sdWNreSIgPyAiIHBoLWxiLXVubHVja3ktdmFsdWUiIDogIiIpLCBwb2RpdW1WYWx1ZVRleHQpKTsKICAgICAgdmFyIHBvZGl1bU1ldGFUZXh0ID0gbGJWaWV3ID09PSAicHNhIgogICAgICAgID8gcm93LnBzYUdyYWRlcyArICIgdGjhursgwrcgVEIgIiArIHJvdy5wc2FBdmdHcmFkZS50b0ZpeGVkKDEpICsgIi8xMCDCtyBQU0EgOSs6ICIgKyByb3cucHNhOVBsdXNDb3VudAogICAgICAgIDogKGxiVmlldyA9PT0gInVubHVja3kiCiAgICAgICAgICA/IChyb3cucGFja3MgfHwgMCkgKyAiIHBhY2sgwrcgUk9JICIgKyBzaWduZWRQY3Qocm93LnJvaVBjdCkKICAgICAgICAgIDogKHJvdy5wYWNrcyB8fCAwKSArICIgcGFjayIgKyAobGJQZXJpb2QgPT09ICJhbGwiID8gIiDCtyAiICsgKHJvdy51bmlxdWUgfHwgMCkgKyAiIHVuaXF1ZSBjYXJkIiA6ICIgwrcgIiArIChyb3cuY2FyZHMgfHwgMCkgKyAiIGNhcmQgdHJvbmcga+G7syIpKTsKICAgICAgY2FyZC5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1wb2RpdW0tbWV0YSIsIHBvZGl1bU1ldGFUZXh0KSk7CiAgICAgIGlmIChsYlZpZXcgIT09ICJwc2EiKSBjYXJkLmFwcGVuZENoaWxkKG1ha2VFbCgiZGl2IiwgInBoLWxiLXBvZGl1bS1iZXN0Iiwgcm93LmJlc3RWYWx1ZSA+IDAgPyAiQkVTVCBQVUxMIMK3ICIgKyAocm93LmJlc3RDYXJkTmFtZSA/IHJvdy5iZXN0Q2FyZE5hbWUgKyAiIMK3ICIgOiB0aWVyTGFiZWwocm93LmJlc3RUaWVyKSArICIgwrcgIikgKyBtb25leShyb3cuYmVzdFZhbHVlKSA6ICJCRVNUIFBVTEwgwrcgQ2jGsGEgY8OzIGdpw6EiKSk7CiAgICAgIHZhciBiYXNlID0gbWFrZUVsKCJkaXYiLCAicGgtbGItcG9kaXVtLWJhc2UiLCBTdHJpbmcoZW50cnkucmFuaykpOwogICAgICBiYXNlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsICJI4bqhbmcgIiArIGVudHJ5LnJhbmspOwogICAgICBjYXJkLmFwcGVuZENoaWxkKGJhc2UpOwogICAgICBwb2RpdW0uYXBwZW5kQ2hpbGQoY2FyZCk7CiAgICB9KTsKICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQocG9kaXVtKTsKCiAgICAvKiBDw6FjIHbhu4sgdHLDrSB0aeG6v3AgdGhlbzogdOG7q25nIGTDsm5nIGfhu41uLCBjw7MgdGhhbmggdGnhur9uIHRyw6xuaCB0aGVvIGdpw6EgdHLhu4sgY29sbGVjdGlvbiAqLwogICAgdmFyIGxpc3RIZWFkID0gbWFrZUVsKCJkaXYiLCAicGgtbGItc2VjdGlvbi1oZWFkIik7CiAgICBsaXN0SGVhZC5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1zZWN0aW9uLXRpdGxlIiwgIkLhuqNuZyB44bq/cCBo4bqhbmciKSk7CiAgICBsaXN0SGVhZC5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1zZWN0aW9uLXN1YiIsICJUb3AgIiArIE1hdGgubWluKHJvd3MubGVuZ3RoLCAyMCkgKyAiIC8gIiArIHJvd3MubGVuZ3RoICsgIiB0cmFpbmVyIikpOwogICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChsaXN0SGVhZCk7CgogICAgdmFyIGxpc3QgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1saXN0Iik7CiAgICByb3dzLnNsaWNlKDMsIDIwKS5mb3JFYWNoKGZ1bmN0aW9uKHJvdywgb2Zmc2V0KXsKICAgICAgdmFyIHJhbmsgPSBvZmZzZXQgKyA0OwogICAgICB2YXIgaXRlbSA9IG1ha2VFbCgiYXJ0aWNsZSIsICJwaC1sYi1saXN0LXJvdyIgKyAocm93LnVpZCA9PT0gbXlVaWQgPyAiIHBoLWxiLW1lIiA6ICIiKSk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQobWFrZUVsKCJkaXYiLCAicGgtbGItbGlzdC1yYW5rIiwgIiMiICsgcmFuaykpOwogICAgICBpdGVtLmFwcGVuZENoaWxkKG1ha2VBdmF0YXIocm93Lm5hbWUsICJwaC1sYi1hdmF0YXIgcGgtbGItbGlzdC1hdmF0YXIiKSk7CgogICAgICB2YXIgbWFpbiA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWxpc3QtbWFpbiIpOwogICAgICB2YXIgbmFtZUxpbmUgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1saXN0LW5hbWUgcGgtbGItcHJvZmlsZS1saW5rIiwgcm93Lm5hbWUpOwogICAgICBuYW1lTGluZS5kYXRhc2V0LnBoUHJvZmlsZVVpZCA9IFN0cmluZyhyb3cudWlkIHx8ICIiKTsKICAgICAgbmFtZUxpbmUuZGF0YXNldC5waFByb2ZpbGVOYW1lID0gU3RyaW5nKHJvdy5uYW1lIHx8ICJUcmFpbmVyIik7CiAgICAgIG5hbWVMaW5lLnNldEF0dHJpYnV0ZSgicm9sZSIsICJidXR0b24iKTsgbmFtZUxpbmUudGFiSW5kZXggPSAwOwogICAgICBuYW1lTGluZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCAiWGVtIHThu6cgdHLGsG5nIGLDoHkgY+G7p2EgIiArIFN0cmluZyhyb3cubmFtZSB8fCAiVHJhaW5lciIpKTsKICAgICAgbmFtZUxpbmUudGl0bGUgPSAiQuG6pW0gxJHhu4MgeGVtIHThu6cgdHLGsG5nIGLDoHkgVHJhaW5lciI7CiAgICAgIGlmIChyb3cudWlkID09PSBteVVpZCkgbmFtZUxpbmUuYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLXlvdSIsICJC4bqgTiIpKTsKICAgICAgbWFpbi5hcHBlbmRDaGlsZChuYW1lTGluZSk7CiAgICAgIG1haW4uYXBwZW5kQ2hpbGQobWFrZVRyYWluZXJCYWRnZXMocm93LCB0cnVlKSk7CgogICAgICB2YXIgbWV0YSA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLWxpc3QtbWV0YSIpOwogICAgICBpZiAobGJWaWV3ID09PSAicHNhIil7CiAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItbWluaS1iYWRnZSIsICJQU0EgMTAgwrcgIiArIHJvdy5wc2ExMENvdW50KSk7CiAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItbWluaS1iYWRnZSIsICJQU0EgOSsgwrcgIiArIHJvdy5wc2E5UGx1c0NvdW50KSk7CiAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItbWluaS1iYWRnZSIsICJUQiAiICsgcm93LnBzYUF2Z0dyYWRlLnRvRml4ZWQoMSkgKyAiLzEwIikpOwogICAgICB9ZWxzZSBpZiAobGJWaWV3ID09PSAidW5sdWNreSIpewogICAgICAgIG1ldGEuYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLW1pbmktYmFkZ2UiLCAocm93LnBhY2tzIHx8IDApICsgIiBwYWNrIikpOwogICAgICAgIG1ldGEuYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLW1pbmktYmFkZ2UgcGgtbGItcm9pLWRvd24iLCAiUk9JICIgKyBzaWduZWRQY3Qocm93LnJvaVBjdCkpKTsKICAgICAgICBtZXRhLmFwcGVuZENoaWxkKG1ha2VFbCgic3BhbiIsICJwaC1sYi1taW5pLWJhZGdlIiwgKHJvdy5jYXJkcyB8fCAwKSArICIgY2FyZCIpKTsKICAgICAgfWVsc2UgaWYgKGxiUGVyaW9kID09PSAiYWxsIil7CiAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItbWluaS1iYWRnZSIsIChyb3cudW5pcXVlIHx8IDApICsgIiB1bmlxdWUiKSk7CiAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChtYWtlRWwoInNwYW4iLCAicGgtbGItbWluaS1iYWRnZSAiICsgKHJvdy5yb2lQY3QgPj0gMCA/ICJwaC1sYi1yb2ktdXAiIDogInBoLWxiLXJvaS1kb3duIiksICJST0kgIiArIHNpZ25lZFBjdChyb3cucm9pUGN0KSkpOwogICAgICAgIG1ldGEuYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLWJlc3QtYmFkZ2UgcGgtbGItYmVzdC1jYXJkLWlubGluZSIsIHJvdy5iZXN0VmFsdWUgPiAwID8gKHJvdy5iZXN0Q2FyZE5hbWUgPyByb3cuYmVzdENhcmROYW1lICsgIiDCtyAiIDogIkJlc3QgIiArIHRpZXJMYWJlbChyb3cuYmVzdFRpZXIpICsgIiDCtyAiKSArIG1vbmV5KHJvdy5iZXN0VmFsdWUpIDogIkJlc3QgcHVsbCDigJQiKSk7CiAgICAgIH1lbHNlewogICAgICAgIG1ldGEuYXBwZW5kQ2hpbGQobWFrZUVsKCJzcGFuIiwgInBoLWxiLW1pbmktYmFkZ2UiLCAocm93LmNhcmRzIHx8IDApICsgIiBjYXJkIHRyb25nIGvhu7MiKSk7CiAgICAgIH0KICAgICAgbWFpbi5hcHBlbmRDaGlsZChtZXRhKTsKCiAgICAgIHZhciB0cmFjayA9IG1ha2VFbCgiZGl2IiwgInBoLWxiLXRyYWNrIik7CiAgICAgIHZhciBmaWxsID0gbWFrZUVsKCJzcGFuIiwgInBoLWxiLXRyYWNrLWZpbGwiKTsKICAgICAgdmFyIHNjb3JlRm9yQmFyID0gbGJWaWV3ID09PSAicHNhIiA/IChOdW1iZXIocm93LnBzYVNjb3JlKXx8MCkgOiAobGJWaWV3ID09PSAidW5sdWNreSIgPyBNYXRoLmFicyhNYXRoLm1pbigwLCBOdW1iZXIocm93LnJvaVBjdCl8fDApKSA6IChOdW1iZXIocm93LnRvdGFsVmFsdWUpfHwwKSk7CiAgICAgIGZpbGwuc3R5bGUud2lkdGggPSAobWF4VmFsdWUgPiAwID8gTWF0aC5tYXgoMiwgTWF0aC5taW4oMTAwLCAoc2NvcmVGb3JCYXIgLyBtYXhWYWx1ZSkgKiAxMDApKSA6IDApICsgIiUiOwogICAgICB0cmFjay5hcHBlbmRDaGlsZChmaWxsKTsKICAgICAgbWFpbi5hcHBlbmRDaGlsZCh0cmFjayk7CiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQobWFpbik7CgogICAgICB2YXIgZGlzcGxheVZhbHVlID0gbGJWaWV3ID09PSAicHNhIgogICAgICAgID8gKHJvdy5wc2ExMENvdW50ICsgIiDDlyBQU0EgMTAiKQogICAgICAgIDogKGxiVmlldyA9PT0gInVubHVja3kiID8gIuKIkiIgKyBtb25leShyb3cubG9zcykgOiBtb25leShyb3cudG90YWxWYWx1ZSkpOwogICAgICB2YXIgdmFsdWUgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1saXN0LXZhbHVlIiArIChsYlZpZXcgPT09ICJ1bmx1Y2t5IiA/ICIgcGgtbGItdW5sdWNreS12YWx1ZSIgOiAiIiksIGRpc3BsYXlWYWx1ZSk7CiAgICAgIHZhbHVlLmFwcGVuZENoaWxkKG1ha2VFbCgic21hbGwiLCAiIiwgbGJWaWV3ID09PSAicHNhIiA/IChyb3cucHNhR3JhZGVzICsgIiB0aOG6uyDEkcOjIGNo4bqlbSIpIDogKGxiVmlldyA9PT0gInVubHVja3kiID8gIkzhu5cgbcO0IHBo4buPbmciIDogKGxiUGVyaW9kID09PSAiYWxsIiA/ICJDb2xsZWN0aW9uIiA6IChsYlBlcmlvZCA9PT0gImRheSIgPyAiTmfDoHkiIDogIlR14bqnbiIpKSkpKTsKICAgICAgaXRlbS5hcHBlbmRDaGlsZCh2YWx1ZSk7CiAgICAgIGxpc3QuYXBwZW5kQ2hpbGQoaXRlbSk7CiAgICB9KTsKICAgIGlmIChyb3dzLmxlbmd0aCA8PSAzKXsKICAgICAgbGlzdC5hcHBlbmRDaGlsZChtYWtlRWwoImRpdiIsICJwaC1sYi1lbXB0eSIsICJIaeG7h24gY2jGsGEgY8OzIHRow6ptIFRyYWluZXIg4bufIGPDoWMgduG7iyB0csOtIHRp4bq/cCB0aGVvLiBN4bufIHBhY2sgxJHhu4MgY+G6oW5oIHRyYW5oIHRo4bupIGjhuqFuZyBuaMOpISIpKTsKICAgIH0KICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQobGlzdCk7CgogICAgdmFyIGZvb3QgPSBtYWtlRWwoImRpdiIsICJwaC1sYi1mb290IiwgbGJWaWV3ID09PSAicHNhIgogICAgICA/ICJSZWFsdGltZSDCtyBQU0EgbMOgIMSRaeG7g20gbcO0IHBo4buPbmcgdHJvbmcgUG9rZUh1Yiwga2jDtG5nIHBo4bqjaSBjaOG7qW5nIG5o4bqtbiBQU0EgdGjhuq10LiBY4bq/cCB0aGVvIHPhu5EgUFNBIDEwIOKGkiBQU0EgOSsg4oaSIHThu5VuZyB0aOG6uyDEkcOjIGNo4bqlbSDihpIgxJFp4buDbSB0cnVuZyBiw6xuaC4gVOG7kWkgxJFhIDIwIFRyYWluZXIuIgogICAgICA6IChsYlZpZXcgPT09ICJ1bmx1Y2t5IgogICAgICAgID8gIlJlYWx0aW1lIMK3IEjhu5lpIENvbiBO4bujIGzDoCBjaOG7iSBz4buRIG3DtCBwaOG7j25nLCBraMO0bmcgcGjhuqNpIHRp4buBbiB0aOG6rXQuIFjhur9wIHRoZW8gUk9JIHRo4bqlcCBuaOG6pXQgdHJvbmcga+G7szsgY2jhu4kgbmfGsOG7nWkgxJHDoyBt4bufIOKJpTEwIHBhY2sgdsOgIMSRYW5nIGzhu5cgbeG7m2kgxJHGsOG7o2MgeOG6v3AgaOG6oW5nLiIKICAgICAgICA6IChsYlBlcmlvZCA9PT0gImFsbCIKICAgICAgICAgID8gIlJlYWx0aW1lIMK3IEjhu5lpIFBow7ogw5RuZyB44bq/cCB0aGVvIHThu5VuZyBnacOhIHRy4buLIGNvbGxlY3Rpb24g4oaSIFJPSSDihpIgY2FyZCDEkeG7mWMgbmjhuqV0IOKGkiBzZXRzIOKGkiBjaGFzZSBjYXJkcy4gxJBhbmcgaGnhu4NuIHRo4buLIHThu5FpIMSRYSAyMCBUcmFpbmVyLiIKICAgICAgICAgIDogIlJlYWx0aW1lIMK3IFjhur9wIGjhuqFuZyB0aGVvIHThu5VuZyBnacOhIHRy4buLIGNhcmQgxJHDoyBuaOG6rW4gdHJvbmcga+G7syDihpIgc+G7kSBwYWNrIOKGkiBz4buRIGNhcmQuIEhp4buDbiB0aOG7iyB04buRaSDEkWEgMjAgVHJhaW5lci4iKSkpOwogICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChmb290KTsKICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hMZWFkZXJib2FyZCgpewogICAgdHJ5ewogICAgICBhd2FpdCBsb2FkUm93cygpOwogICAgICB2YXIgbmVlZHNBY3Rpdml0eSA9IGxiVmlldyA9PT0gInVubHVja3kiIHx8IChsYlZpZXcgPT09ICJ2YWx1ZSIgJiYgbGJQZXJpb2QgIT09ICJhbGwiKTsKICAgICAgaWYgKG5lZWRzQWN0aXZpdHkpewogICAgICAgIHRyeXsKICAgICAgICAgIGF3YWl0IGxvYWRQZXJpb2RBY3Rpdml0eShsYlBlcmlvZCk7CiAgICAgICAgfWNhdGNoKGFjdGl2aXR5TG9hZEVycil7CiAgICAgICAgICBhY3Rpdml0eVJvd3NDYWNoZSA9IFtdOwogICAgICAgICAgYWN0aXZpdHlUYWJsZVJlYWR5ID0gZmFsc2U7CiAgICAgICAgICBhY3Rpdml0eUVycm9yID0gU3RyaW5nKGFjdGl2aXR5TG9hZEVyciAmJiBhY3Rpdml0eUxvYWRFcnIubWVzc2FnZSB8fCBhY3Rpdml0eUxvYWRFcnIgfHwgIktow7RuZyDEkeG7jWMgxJHGsOG7o2MgcHVibGljLmxlYWRlcmJvYXJkX2FjdGl2aXR5Iik7CiAgICAgICAgICBjb25zb2xlLndhcm4oIltCWEggTmfDoHkvVHXhuqduXSBLaMO0bmcgxJHhu41jIMSRxrDhu6NjIGxlYWRlcmJvYXJkX2FjdGl2aXR5OiIsIGFjdGl2aXR5TG9hZEVycik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsYlZpZXcgPT09ICJwc2EiKXsKICAgICAgICB0cnl7CiAgICAgICAgICBhd2FpdCBsb2FkUFNBR3JhZGVzKGxiUGVyaW9kKTsKICAgICAgICAgIGlmIChwc2FUYWJsZVJlYWR5KSBmbHVzaFBlbmRpbmdQU0FHcmFkZXMoKTsKICAgICAgICB9Y2F0Y2gocHNhTG9hZEVycil7CiAgICAgICAgICBwc2FSb3dzQ2FjaGUgPSBbXTsKICAgICAgICAgIHBzYVRhYmxlUmVhZHkgPSBmYWxzZTsKICAgICAgICAgIHBzYUVycm9yID0gU3RyaW5nKHBzYUxvYWRFcnIgJiYgcHNhTG9hZEVyci5tZXNzYWdlIHx8IHBzYUxvYWRFcnIgfHwgIktow7RuZyDEkeG7jWMgxJHGsOG7o2MgcHVibGljLnBzYV9ncmFkZXMiKTsKICAgICAgICAgIGNvbnNvbGUud2FybigiW0jhu5lpIFBTQV0gS2jDtG5nIMSR4buNYyDEkcaw4bujYyBwc2FfZ3JhZGVzOiIsIHBzYUxvYWRFcnIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobGFzdFN5bmNFcnJvcikgc2hvd1N5bmNFcnJvcigpOwogICAgICBlbHNlIHNldFN0YXR1cygi4pePIExJVkUiLHRydWUpOwogICAgICBhd2FpdCByZWZyZXNoUHVsbEZlZWQoKTsKICAgICAgcmVuZGVyTGVhZGVyYm9hcmQoKTsKICAgIH1jYXRjaChlcnIpewogICAgICBjb25zb2xlLmVycm9yKCJbQlhIXSBLaMO0bmcgxJHhu41jIMSRxrDhu6NjIGxlYWRlcmJvYXJkOiIsZXJyKTsKICAgICAgbGFzdFN5bmNFcnJvciA9IFN0cmluZyhlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyIHx8ICJM4buXaSBraMO0bmcgeMOhYyDEkeG7i25oIik7CiAgICAgIHNldFN0YXR1cygiTOG7l2kgxJHhu41jIEJYSCIsZmFsc2UpOwogICAgICBpZiAoZWxzLmxiTGl2ZSkgZWxzLmxiTGl2ZS50aXRsZSA9ICJLaMO0bmcgxJHhu41jIMSRxrDhu6NjIHB1YmxpYy5sZWFkZXJib2FyZDogIiArIGxhc3RTeW5jRXJyb3I7CiAgICAgIGlmIChlbHMubGJCb2R5KXsKICAgICAgICBlbHMubGJCb2R5LnRleHRDb250ZW50PSJLaMO0bmcgxJHhu41jIMSRxrDhu6NjIGLhuqNuZyB44bq/cCBo4bqhbmcuIENoaSB0aeG6v3QgbOG7l2k6ICIgKyBTdHJpbmcoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciB8fCAiS2jDtG5nIHLDtSBs4buXaSIpICsgIi4gS2nhu4NtIHRyYSBwdWJsaWMubGVhZGVyYm9hcmQsIEFQSSBrZXkgdsOgIHF1eeG7gW4gU0VMRUNUIHRyb25nIFN1cGFiYXNlLiI7CiAgICAgICAgdmFyIHJldHJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgICAgcmV0cnkudHlwZSA9ICJidXR0b24iOwogICAgICAgIHJldHJ5LmNsYXNzTmFtZSA9ICJwaC1idG4gcGgtc21hbGwiOwogICAgICAgIHJldHJ5LnRleHRDb250ZW50ID0gIuKGuyBUaOG7rSBr4bq/dCBu4buRaSBs4bqhaSI7CiAgICAgICAgcmV0cnkuc3R5bGUubWFyZ2luVG9wID0gIjEycHgiOwogICAgICAgIHJldHJ5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsgcmVmcmVzaExlYWRlcmJvYXJkKCk7IH0pOwogICAgICAgIGVscy5sYkJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7CiAgICAgICAgZWxzLmxiQm9keS5hcHBlbmRDaGlsZChyZXRyeSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIG9wZW5MZWFkZXJib2FyZChlKXsKICAgIGlmIChlKXsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgfQoKICAgIGlmICghdHJhaW5lck5hbWUoKSl7CiAgICAgIGlmIChlbHMud2VsY29tZU1vZGFsKSBlbHMud2VsY29tZU1vZGFsLmhpZGRlbj1mYWxzZTsKICAgICAgaWYgKGVscy53ZWxjb21lSW5wdXQpewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgZWxzLndlbGNvbWVJbnB1dC5mb2N1cygpOyB9LDQwKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgcHVsbEZlZWRWaXNpYmxlQ291bnQgPSA1OwogICAgaWYgKGVscy5sYk1vZGFsKSBlbHMubGJNb2RhbC5oaWRkZW49ZmFsc2U7CiAgICByZWZyZXNoTGVhZGVyYm9hcmQoKTsKICAgIHN5bmNNZSh0cnVlKTsKICB9CgogIGZ1bmN0aW9uIGVuc3VyZVN1cGFiYXNlU0RLKCl7CiAgICBpZiAod2luZG93LnN1cGFiYXNlICYmIHR5cGVvZiB3aW5kb3cuc3VwYWJhc2UuY3JlYXRlQ2xpZW50ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIH0KICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICB2YXIgZXhpc3RpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbZGF0YS1waC1zdXBhYmFzZS1zZGs9IjEiXScpOwogICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuZ2V0QXR0cmlidXRlKCJkYXRhLXBoLXN1cGFiYXNlLWZhaWxlZCIpID09PSAiMSIpIHsKICAgICAgICBleGlzdGluZy5wYXJlbnROb2RlICYmIGV4aXN0aW5nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZXhpc3RpbmcpOwogICAgICAgIGV4aXN0aW5nID0gbnVsbDsKICAgICAgfQogICAgICB2YXIgc2NyaXB0ID0gZXhpc3RpbmcgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgIHZhciBzZXR0bGVkID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIGZpbmlzaCgpewogICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47CiAgICAgICAgc2V0dGxlZCA9IHRydWU7CiAgICAgICAgaWYgKHdpbmRvdy5zdXBhYmFzZSAmJiB0eXBlb2Ygd2luZG93LnN1cGFiYXNlLmNyZWF0ZUNsaWVudCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgiZGF0YS1waC1zdXBhYmFzZS1sb2FkZWQiLCAiMSIpOwogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCJkYXRhLXBoLXN1cGFiYXNlLWZhaWxlZCIsICIxIik7CiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCJLaMO0bmcgdOG6o2kgxJHGsOG7o2Mgc3VwYWJhc2UtanMgdOG7qyBDRE47IGtp4buDbSB0cmEgY2jhurduIHNjcmlwdCBob+G6t2MgbeG6oW5nLiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBmaW5pc2gsIHtvbmNlOnRydWV9KTsKICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oKXsKICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOwogICAgICAgIHNldHRsZWQgPSB0cnVlOwogICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoImRhdGEtcGgtc3VwYWJhc2UtZmFpbGVkIiwgIjEiKTsKICAgICAgICByZWplY3QobmV3IEVycm9yKCJLaMO0bmcgdOG6o2kgxJHGsOG7o2Mgc3VwYWJhc2UtanMgdOG7qyBDRE47IGtp4buDbSB0cmEgY2jhurduIHNjcmlwdCBob+G6t2MgbeG6oW5nLiIpKTsKICAgICAgfSwge29uY2U6dHJ1ZX0pOwogICAgICBpZiAoIWV4aXN0aW5nKXsKICAgICAgICBzY3JpcHQuc3JjID0gImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHN1cGFiYXNlL3N1cGFiYXNlLWpzQDIiOwogICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7CiAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgiZGF0YS1waC1zdXBhYmFzZS1zZGsiLCAiMSIpOwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgICAgfSBlbHNlIGlmICh3aW5kb3cuc3VwYWJhc2UgJiYgdHlwZW9mIHdpbmRvdy5zdXBhYmFzZS5jcmVhdGVDbGllbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBmaW5pc2goKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBzdGFydCgpewogICAgaWYgKHN0YXJ0ZWQpIHJldHVybjsKICAgIHN0YXJ0ZWQ9dHJ1ZTsKICAgIHNldFN0YXR1cygixJBhbmcga+G6v3QgbuG7kWnigKYiLGZhbHNlKTsKCiAgICB0cnl7CiAgICAgIGF3YWl0IGVuc3VyZVN1cGFiYXNlU0RLKCk7CiAgICAgIGlmICghd2luZG93LnN1cGFiYXNlIHx8ICF3aW5kb3cuc3VwYWJhc2UuY3JlYXRlQ2xpZW50KXsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIsSQw6MgdOG6o2kgdGjGsCB2aeG7h24gbmjGsG5nIGtow7RuZyB0w6xtIHRo4bqleSBzdXBhYmFzZS5jcmVhdGVDbGllbnQiKTsKICAgICAgfQoKICAgICAgY2xpZW50PXdpbmRvdy5zdXBhYmFzZS5jcmVhdGVDbGllbnQoU1VQQUJBU0VfVVJMLFNVUEFCQVNFX1BVQkxJU0hBQkxFX0tFWSk7CgogICAgICAvKiBLaeG7g20gdHJhIGPDtG5nIGtoYWkgaGFpIGLhuqNuZyByacOqbmcgxJHhu4MgYmnhur90IGzhu5dpIG7hurFtIOG7nyBCWEggaGF5IGLhuqNuZyBmZWVkLiAqLwogICAgICB2YXIgbGJQcm9iZSA9IGF3YWl0IGNsaWVudC5mcm9tKFNVUEFCQVNFX1RBQkxFKS5zZWxlY3QoInVpZCIpLmxpbWl0KDEpOwogICAgICBpZiAobGJQcm9iZS5lcnJvcikgdGhyb3cgbmV3IEVycm9yKCJLaMO0bmcgdHJ1eSBj4bqtcCDEkcaw4bujYyBwdWJsaWMubGVhZGVyYm9hcmQ6ICIgKyBsYlByb2JlLmVycm9yLm1lc3NhZ2UpOwoKICAgICAgdmFyIGZlZWRQcm9iZSA9IGF3YWl0IGNsaWVudC5mcm9tKFBVTExfRkVFRF9UQUJMRSkuc2VsZWN0KCJpZCIpLmxpbWl0KDEpOwogICAgICBpZiAoZmVlZFByb2JlLmVycm9yKXsKICAgICAgICBwdWxsRmVlZFJlYWR5ID0gZmFsc2U7CiAgICAgICAgcHVsbEZlZWRFcnJvciA9IFN0cmluZyhmZWVkUHJvYmUuZXJyb3IubWVzc2FnZSB8fCBmZWVkUHJvYmUuZXJyb3IpOwogICAgICAgIGNvbnNvbGUud2FybigiW0xpdmUgUHVsbCBGZWVkXSBwdWJsaWMucHVsbF9mZWVkIGNoxrBhIHPhurVuIHPDoG5nOiIsIGZlZWRQcm9iZS5lcnJvcik7CiAgICAgIH1lbHNlewogICAgICAgIHB1bGxGZWVkUmVhZHkgPSB0cnVlOwogICAgICAgIHB1bGxGZWVkRXJyb3IgPSAiIjsKICAgICAgfQoKICAgICAgdmFyIGFjdGl2aXR5UHJvYmUgPSBhd2FpdCBjbGllbnQuZnJvbShBQ1RJVklUWV9UQUJMRSkuc2VsZWN0KCJpZCIpLmxpbWl0KDEpOwogICAgICBpZiAoYWN0aXZpdHlQcm9iZS5lcnJvcil7CiAgICAgICAgYWN0aXZpdHlUYWJsZVJlYWR5ID0gZmFsc2U7CiAgICAgICAgYWN0aXZpdHlFcnJvciA9IFN0cmluZyhhY3Rpdml0eVByb2JlLmVycm9yLm1lc3NhZ2UgfHwgYWN0aXZpdHlQcm9iZS5lcnJvcik7CiAgICAgICAgY29uc29sZS53YXJuKCJbQlhIIE5nw6B5L1R14bqnbl0gcHVibGljLmxlYWRlcmJvYXJkX2FjdGl2aXR5IGNoxrBhIHPhurVuIHPDoG5nLiBDaOG6oXkgZmlsZSBTUUwgxJFpIGvDqG06IiwgYWN0aXZpdHlQcm9iZS5lcnJvcik7CiAgICAgIH1lbHNlewogICAgICAgIGFjdGl2aXR5VGFibGVSZWFkeSA9IHRydWU7CiAgICAgICAgYWN0aXZpdHlFcnJvciA9ICIiOwogICAgICB9CgogICAgICB2YXIgcHNhUHJvYmUgPSBhd2FpdCBjbGllbnQuZnJvbShQU0FfVEFCTEUpLnNlbGVjdCgiZ3JhZGVfaWQiKS5saW1pdCgxKTsKICAgICAgaWYgKHBzYVByb2JlLmVycm9yKXsKICAgICAgICBwc2FUYWJsZVJlYWR5ID0gZmFsc2U7CiAgICAgICAgcHNhRXJyb3IgPSBTdHJpbmcocHNhUHJvYmUuZXJyb3IubWVzc2FnZSB8fCBwc2FQcm9iZS5lcnJvcik7CiAgICAgICAgY29uc29sZS53YXJuKCJbSOG7mWkgUFNBXSBwdWJsaWMucHNhX2dyYWRlcyBjaMawYSBz4bq1biBzw6BuZy4gQ2jhuqF5IFNRTCBtaWdyYXRpb24gbeG7m2k6IiwgcHNhUHJvYmUuZXJyb3IpOwogICAgICB9ZWxzZXsKICAgICAgICBwc2FUYWJsZVJlYWR5ID0gdHJ1ZTsKICAgICAgICBwc2FFcnJvciA9ICIiOwogICAgICB9CgogICAgICBmbHVzaFBlbmRpbmdQdWxsRW50cmllcygpOwogICAgICBmbHVzaFBlbmRpbmdBY3Rpdml0eUVudHJpZXMoKTsKICAgICAgZmx1c2hQZW5kaW5nUFNBR3JhZGVzKCk7CiAgICAgIGF3YWl0IHN5bmNNZSh0cnVlKTsKICAgICAgYXdhaXQgcmVmcmVzaExlYWRlcmJvYXJkKCk7CgogICAgICBjaGFubmVsPWNsaWVudAogICAgICAgIC5jaGFubmVsKCJwaC1sZWFkZXJib2FyZC1yZWFsdGltZSIpCiAgICAgICAgLm9uKCJwb3N0Z3Jlc19jaGFuZ2VzIix7CiAgICAgICAgICBldmVudDoiKiIsCiAgICAgICAgICBzY2hlbWE6InB1YmxpYyIsCiAgICAgICAgICB0YWJsZTpTVVBBQkFTRV9UQUJMRQogICAgICAgIH0sZnVuY3Rpb24oKXsKICAgICAgICAgIHJlZnJlc2hMZWFkZXJib2FyZCgpOwogICAgICAgIH0pCiAgICAgICAgLm9uKCJwb3N0Z3Jlc19jaGFuZ2VzIix7CiAgICAgICAgICBldmVudDoiSU5TRVJUIiwKICAgICAgICAgIHNjaGVtYToicHVibGljIiwKICAgICAgICAgIHRhYmxlOlBVTExfRkVFRF9UQUJMRQogICAgICAgIH0sZnVuY3Rpb24oKXsKICAgICAgICAgIHJlZnJlc2hQdWxsRmVlZCgpLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYgKGVscy5sYk1vZGFsICYmICFlbHMubGJNb2RhbC5oaWRkZW4pIHJlbmRlckxlYWRlcmJvYXJkKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9KQogICAgICAgIC5vbigicG9zdGdyZXNfY2hhbmdlcyIsewogICAgICAgICAgZXZlbnQ6IklOU0VSVCIsCiAgICAgICAgICBzY2hlbWE6InB1YmxpYyIsCiAgICAgICAgICB0YWJsZTpBQ1RJVklUWV9UQUJMRQogICAgICAgIH0sZnVuY3Rpb24oKXsKICAgICAgICAgIGlmIChlbHMubGJNb2RhbCAmJiAhZWxzLmxiTW9kYWwuaGlkZGVuICYmIChsYlZpZXcgPT09ICJ1bmx1Y2t5IiB8fCAobGJWaWV3ID09PSAidmFsdWUiICYmIGxiUGVyaW9kICE9PSAiYWxsIikpKSByZWZyZXNoTGVhZGVyYm9hcmQoKTsKICAgICAgICB9KQogICAgICAgIC5vbigicG9zdGdyZXNfY2hhbmdlcyIsewogICAgICAgICAgZXZlbnQ6IioiLAogICAgICAgICAgc2NoZW1hOiJwdWJsaWMiLAogICAgICAgICAgdGFibGU6UFNBX1RBQkxFCiAgICAgICAgfSxmdW5jdGlvbigpewogICAgICAgICAgaWYgKGVscy5sYk1vZGFsICYmICFlbHMubGJNb2RhbC5oaWRkZW4gJiYgbGJWaWV3ID09PSAicHNhIikgcmVmcmVzaExlYWRlcmJvYXJkKCk7CiAgICAgICAgfSkKICAgICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uKHN0YXR1cyl7CiAgICAgICAgICBpZiAoc3RhdHVzPT09IlNVQlNDUklCRUQiKXsKICAgICAgICAgICAgaWYgKGxhc3RTeW5jRXJyb3IpIHNob3dTeW5jRXJyb3IoKTsKICAgICAgICAgICAgZWxzZSBzZXRTdGF0dXMoIuKXjyBMSVZFIix0cnVlKTsKICAgICAgICAgIH1lbHNlIGlmKHN0YXR1cz09PSJDSEFOTkVMX0VSUk9SIiB8fCBzdGF0dXM9PT0iVElNRURfT1VUIil7CiAgICAgICAgICAgIHNldFN0YXR1cygiTeG6pXQga+G6v3QgbuG7kWkiLGZhbHNlKTsKICAgICAgICAgICAgaWYgKGVscy5sYkxpdmUpIGVscy5sYkxpdmUudGl0bGUgPSAiU3VwYWJhc2UgUmVhbHRpbWU6ICIgKyBzdGF0dXM7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICAgIHN5bmNNZShmYWxzZSk7CiAgICAgICAgaWYgKHBlbmRpbmdQU0FHcmFkZUVudHJpZXMubGVuZ3RoICYmIHBzYVRhYmxlUmVhZHkgJiYgIXBzYUVycm9yKSBmbHVzaFBlbmRpbmdQU0FHcmFkZXMoKTsKICAgICAgfSwxNTAwKTsKCiAgICB9Y2F0Y2goZXJyKXsKICAgICAgdmFyIG1lc3NhZ2UgPSBTdHJpbmcoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciB8fCAiS2jDtG5nIHLDtSBs4buXaSIpOwogICAgICBjb25zb2xlLmVycm9yKCJbQlhIXSBJbml0IGVycm9yOiIsZXJyKTsKICAgICAgc2V0U3RhdHVzKG1lc3NhZ2UuaW5kZXhPZigic3VwYWJhc2UtanMiKSA+PSAwID8gIkzhu5dpIFNESyIgOiAiTOG7l2kga+G6v3QgbuG7kWkiLGZhbHNlKTsKICAgICAgaWYgKGVscy5sYkxpdmUpIGVscy5sYkxpdmUudGl0bGUgPSBtZXNzYWdlOwogICAgICBwdWxsRmVlZFJlYWR5ID0gZmFsc2U7CiAgICAgIHB1bGxGZWVkRXJyb3IgPSBtZXNzYWdlOwogICAgICBpZiAoZWxzLmxiQm9keSAmJiAhZWxzLmxiTW9kYWw/LmhpZGRlbil7CiAgICAgICAgZWxzLmxiQm9keS50ZXh0Q29udGVudCA9ICJLaMO0bmcga2jhu59pIHThuqFvIMSRxrDhu6NjIGvhur90IG7hu5FpIFN1cGFiYXNlOiAiICsgbWVzc2FnZTsKICAgICAgfQogICAgfQogIH0KCiAgLyogR0nhu64gTkdVWcOKTiBDxqAgQ0jhur4gQ0xJQ0sgxJBBTkcgQ0jhuqBZIFThu5BUIEPhu6ZBIEZJTEUgTsOAWSAqLwogIGlmIChlbHMubGJCdG4pewogICAgZWxzLmxiQnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixvcGVuTGVhZGVyYm9hcmQsdHJ1ZSk7CiAgfQogIHdpbmRvdy5fX3Bva2VodWJTdXBhYmFzZUFkZG9uUmVhZHkgPSB0cnVlOwoKICBpZiAoZWxzLndlbGNvbWVJbnB1dCl7CiAgICBlbHMud2VsY29tZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsZnVuY3Rpb24oKXsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpeyBzeW5jTWUodHJ1ZSk7IH0sMzAwKTsKICAgIH0pOwogIH0KCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBva2VodWI6cGFja3MtcmVjb3JkZWQiLCBoYW5kbGVQYWNrUmVjb3JkZWQpOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2tlaHViOmNvbGxlY3Rpb24tY2hhbmdlZCIsIGZ1bmN0aW9uKCl7CiAgICB2YXIgYXR0ZW1wdHMgPSAwOwogICAgZnVuY3Rpb24gcmVzeW5jKCl7CiAgICAgIGlmIChjbGllbnQgJiYgIXN5bmNpbmcpeyBzeW5jTWUodHJ1ZSk7IHJldHVybjsgfQogICAgICBpZiAoKythdHRlbXB0cyA8IDIwKSB3aW5kb3cuc2V0VGltZW91dChyZXN5bmMsIDI1MCk7CiAgICB9CiAgICB3aW5kb3cuc2V0VGltZW91dChyZXN5bmMsIDApOwogIH0pOwoKICAvLyBTdGFydCBhZnRlciB0aGUgb3JpZ2luYWwgd2lkZ2V0J3MgRE9NQ29udGVudExvYWRlZCBpbml0aWFsaXplci4gT3RoZXJ3aXNlCiAgLy8gdGhlIG9sZCBGaXJlYmFzZSBwbGFjZWhvbGRlciBjYW4gcnVuIGxhdGVyIGFuZCBvdmVyd3JpdGUgU3VwYWJhc2Ugc3RhdHVzLgogIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGluZyIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBzdGFydCwgeyBvbmNlOiB0cnVlIH0pOwogIH0gZWxzZSB7CiAgICBzdGFydCgpOwogIH0KCn0pKCk7CgovKiA9PT09PSBMaXZlIHNldC1uYW1lIHNlYXJjaCArIGNsaWNrLXRvLWZpbHRlciBhdXRvY29tcGxldGUgPT09PT0gKi8KKGZ1bmN0aW9uKCl7CiAgInVzZSBzdHJpY3QiOwogIHZhciBhcHAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicG9rZWh1Yi1hcHAiKTsKICB2YXIgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwaC1leHAtZ3JpZCIpOwogIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwaC1zZXQtc2VhcmNoLWlucHV0Iik7CiAgdmFyIGNsZWFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBoLXNldC1zZWFyY2gtY2xlYXIiKTsKICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwaC1zZXQtc2VhcmNoLW1ldGEiKTsKICB2YXIgc3VnZ2VzdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGgtc2V0LXNlYXJjaC1zdWdnZXN0aW9ucyIpOwogIGlmICghYXBwIHx8ICFncmlkIHx8ICFpbnB1dCB8fCAhY2xlYXIgfHwgIW1ldGEgfHwgIXN1Z2dlc3Rpb25zKSByZXR1cm47CgogIHZhciBzZWxlY3RlZExhYmVsID0gIiI7CiAgdmFyIGRlYm91bmNlUmVuZGVyID0gZmFsc2U7CiAgdmFyIHN1cHByZXNzRm9jdXNTdWdnZXN0aW9ucyA9IGZhbHNlOwogIGZ1bmN0aW9uIG5vcm1hbGl6ZSh2YWx1ZSl7CiAgICByZXR1cm4gU3RyaW5nKHZhbHVlIHx8ICIiKQogICAgICAubm9ybWFsaXplKCJORkQiKQogICAgICAucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csICIiKQogICAgICAucmVwbGFjZSgvxJEvZywgImQiKS5yZXBsYWNlKC/EkC9nLCAiRCIpCiAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgidmkiKQogICAgICAucmVwbGFjZSgvXHMrL2csICIgIikudHJpbSgpOwogIH0KICBmdW5jdGlvbiBnZXRDYXJkcygpewogICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGdyaWQucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlID4gLnBoLWV4cC1jYXJkIikpOwogIH0KICBmdW5jdGlvbiBsYWJlbEZvcihjYXJkKXsKICAgIHZhciBuYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCIucGgtbmFtZSIpOwogICAgcmV0dXJuIG5hbWUgPyBuYW1lLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpIDogIkLhu5kgdGjhursgUG9rw6ltb24iOwogIH0KICBmdW5jdGlvbiBzZXJpZXNGb3IoY2FyZCl7CiAgICB2YXIgc2VyaWVzID0gY2FyZC5xdWVyeVNlbGVjdG9yKCIucGgtc2VyaWVzIik7CiAgICByZXR1cm4gc2VyaWVzID8gc2VyaWVzLnRleHRDb250ZW50LnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpIDogIiI7CiAgfQogIGZ1bmN0aW9uIGhpZGVTdWdnZXN0aW9ucygpewogICAgc3VnZ2VzdGlvbnMuaGlkZGVuID0gdHJ1ZTsKICAgIHN1Z2dlc3Rpb25zLnRleHRDb250ZW50ID0gIiI7CiAgfQogIGZ1bmN0aW9uIHJlbmRlclN1Z2dlc3Rpb25zKG1hdGNoZXMsIHF1ZXJ5KXsKICAgIHN1Z2dlc3Rpb25zLnRleHRDb250ZW50ID0gIiI7CiAgICBpZiAoIXF1ZXJ5KXsgc3VnZ2VzdGlvbnMuaGlkZGVuID0gdHJ1ZTsgcmV0dXJuOyB9CiAgICBpZiAoIW1hdGNoZXMubGVuZ3RoKXsKICAgICAgdmFyIGVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGVtcHR5LmNsYXNzTmFtZSA9ICJwaC1zZXQtc2VhcmNoLW5vLXJlc3VsdCI7CiAgICAgIGVtcHR5LnRleHRDb250ZW50ID0gIktow7RuZyB0w6xtIHRo4bqleSBi4buZIHRo4bq7IHBow7kgaOG7o3AuIFRo4butIHTDqm4gbmfhuq9uIGjGoW4gbmjDqS4iOwogICAgICBzdWdnZXN0aW9ucy5hcHBlbmRDaGlsZChlbXB0eSk7CiAgICAgIHN1Z2dlc3Rpb25zLmhpZGRlbiA9IGZhbHNlOwogICAgICByZXR1cm47CiAgICB9CiAgICBtYXRjaGVzLnNsaWNlKDAsOCkuZm9yRWFjaChmdW5jdGlvbihjYXJkKXsKICAgICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICBidXR0b24udHlwZSA9ICJidXR0b24iOwogICAgICBidXR0b24uY2xhc3NOYW1lID0gInBoLXNldC1zZWFyY2gtc3VnZ2VzdGlvbiI7CiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoInJvbGUiLCJvcHRpb24iKTsKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgIG5hbWUudGV4dENvbnRlbnQgPSBsYWJlbEZvcihjYXJkKTsKICAgICAgdmFyIHNlcmllcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNtYWxsIik7CiAgICAgIHNlcmllcy50ZXh0Q29udGVudCA9IHNlcmllc0ZvcihjYXJkKSB8fCBjYXJkLmRhdGFzZXQuc2V0SWQgfHwgIlBva8OpbW9uIFRDRyI7CiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChuYW1lKTsgYnV0dG9uLmFwcGVuZENoaWxkKHNlcmllcyk7CiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXsKICAgICAgICBpbnB1dC52YWx1ZSA9IGxhYmVsRm9yKGNhcmQpOwogICAgICAgIHNlbGVjdGVkTGFiZWwgPSBsYWJlbEZvcihjYXJkKTsKICAgICAgICBhcHBseUZpbHRlcih0cnVlKTsKICAgICAgICBoaWRlU3VnZ2VzdGlvbnMoKTsKICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaW5wdXQpewogICAgICAgICAgc3VwcHJlc3NGb2N1c1N1Z2dlc3Rpb25zID0gdHJ1ZTsKICAgICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgc3VnZ2VzdGlvbnMuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgIH0pOwogICAgc3VnZ2VzdGlvbnMuaGlkZGVuID0gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIGFwcGx5RmlsdGVyKHNjcm9sbFRvTWF0Y2gpewogICAgdmFyIGNhcmRzID0gZ2V0Q2FyZHMoKTsKICAgIHZhciBxdWVyeSA9IG5vcm1hbGl6ZShpbnB1dC52YWx1ZSk7CiAgICB2YXIgbWF0Y2hpbmcgPSBbXTsKICAgIHZhciBmaXJzdCA9IG51bGw7CiAgICBjYXJkcy5mb3JFYWNoKGZ1bmN0aW9uKGNhcmQpewogICAgICB2YXIgbmFtZSA9IGxhYmVsRm9yKGNhcmQpOwogICAgICB2YXIgdGV4dCA9IG5vcm1hbGl6ZShuYW1lICsgIiAiICsgc2VyaWVzRm9yKGNhcmQpICsgIiAiICsgKGNhcmQuZGF0YXNldC5zZXRJZCB8fCAiIikpOwogICAgICB2YXIgaXNNYXRjaCA9ICFxdWVyeSB8fCB0ZXh0LmluZGV4T2YocXVlcnkpICE9PSAtMTsKICAgICAgY2FyZC5oaWRkZW4gPSAhaXNNYXRjaDsKICAgICAgY2FyZC5jbGFzc0xpc3QucmVtb3ZlKCJwaC1zZXQtc2VhcmNoLWhpZ2hsaWdodCIpOwogICAgICBpZiAoaXNNYXRjaCl7IG1hdGNoaW5nLnB1c2goY2FyZCk7IGlmICghZmlyc3QpIGZpcnN0ID0gY2FyZDsgfQogICAgfSk7CiAgICBjbGVhci5oaWRkZW4gPSAhaW5wdXQudmFsdWU7CiAgICBpZiAoIXF1ZXJ5KXsKICAgICAgbWV0YS50ZXh0Q29udGVudCA9IGNhcmRzLmxlbmd0aCA/IChjYXJkcy5sZW5ndGggKyAiIGLhu5kgxJFhbmcga2jhuqMgZOG7pW5nIMK3IE5o4bqtcCB0w6puIGhv4bq3YyBjaOG7jW4gZ+G7o2kgw70gxJHhu4MgbOG7jWMgbmhhbmguIikgOiAixJBhbmcgdOG6o2kgZGFuaCBzw6FjaCBi4buZIHRo4bq74oCmIjsKICAgICAgaGlkZVN1Z2dlc3Rpb25zKCk7CiAgICAgIHNlbGVjdGVkTGFiZWwgPSAiIjsKICAgICAgcmV0dXJuOwogICAgfQogICAgbWV0YS50ZXh0Q29udGVudCA9IG1hdGNoaW5nLmxlbmd0aCArICIvIiArIGNhcmRzLmxlbmd0aCArICIgYuG7mSBwaMO5IGjhu6NwIHbhu5tpIOKAnCIgKyBpbnB1dC52YWx1ZS50cmltKCkgKyAi4oCdLiBC4bqlbSB0w6puIGLDqm4gZMaw4bubaSDEkeG7gyBs4buNYyDEkcO6bmcgYuG7mSDEkcOzLiI7CiAgICByZW5kZXJTdWdnZXN0aW9ucyhtYXRjaGluZywgcXVlcnkpOwogICAgaWYgKHNjcm9sbFRvTWF0Y2ggJiYgZmlyc3QpewogICAgICBmaXJzdC5jbGFzc0xpc3QuYWRkKCJwaC1zZXQtc2VhcmNoLWhpZ2hsaWdodCIpOwogICAgICBncmlkLnNjcm9sbFRvcCA9IDA7CiAgICAgIGZpcnN0LnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjoic21vb3RoIixibG9jazoibmVhcmVzdCJ9KTsKICAgIH0KICB9CiAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLGZ1bmN0aW9uKCl7IHNlbGVjdGVkTGFiZWwgPSAiIjsgYXBwbHlGaWx0ZXIoZmFsc2UpOyB9KTsKICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsZnVuY3Rpb24oKXsKICAgIGlmIChzdXBwcmVzc0ZvY3VzU3VnZ2VzdGlvbnMpeyBzdXBwcmVzc0ZvY3VzU3VnZ2VzdGlvbnMgPSBmYWxzZTsgcmV0dXJuOyB9CiAgICBpZiAobm9ybWFsaXplKGlucHV0LnZhbHVlKSkgYXBwbHlGaWx0ZXIoZmFsc2UpOwogIH0pOwogIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGV2ZW50KXsKICAgIGlmIChldmVudC5rZXkgPT09ICJFc2NhcGUiKXsgaGlkZVN1Z2dlc3Rpb25zKCk7IHJldHVybjsgfQogICAgaWYgKGV2ZW50LmtleSA9PT0gIkVudGVyIil7CiAgICAgIHZhciBmaXJzdEJ1dHRvbiA9IHN1Z2dlc3Rpb25zLnF1ZXJ5U2VsZWN0b3IoIi5waC1zZXQtc2VhcmNoLXN1Z2dlc3Rpb24iKTsKICAgICAgaWYgKGZpcnN0QnV0dG9uICYmICFzdWdnZXN0aW9ucy5oaWRkZW4peyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBmaXJzdEJ1dHRvbi5jbGljaygpOyB9CiAgICB9CiAgfSk7CiAgY2xlYXIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7CiAgICBpbnB1dC52YWx1ZSA9ICIiOyBzZWxlY3RlZExhYmVsID0gIiI7IGFwcGx5RmlsdGVyKGZhbHNlKTsgaGlkZVN1Z2dlc3Rpb25zKCk7IGlucHV0LmZvY3VzKCk7CiAgfSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGV2ZW50KXsKICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QgfHwgIWV2ZW50LnRhcmdldC5jbG9zZXN0KCIjcGgtc2V0LXNlYXJjaCIpKSBoaWRlU3VnZ2VzdGlvbnMoKTsKICB9KTsKICBpZiAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIpewogICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgICAgaWYgKGRlYm91bmNlUmVuZGVyKSByZXR1cm47CiAgICAgIGRlYm91bmNlUmVuZGVyID0gdHJ1ZTsKICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpeyBkZWJvdW5jZVJlbmRlciA9IGZhbHNlOyBhcHBseUZpbHRlcihmYWxzZSk7IH0pOwogICAgfSkub2JzZXJ2ZShncmlkLHtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWV9KTsKICB9CiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIil7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpeyBhcHBseUZpbHRlcihmYWxzZSk7IH0se29uY2U6dHJ1ZX0pOwogIH0gZWxzZSB7CiAgICBhcHBseUZpbHRlcihmYWxzZSk7CiAgfQp9KSgpOwoKLyogUFNBIGdyYWRpbmcgYWRkb24gbWlncmF0ZWQgaW50byB0aGUgV29yZFByZXNzLXNhZmUgY29yZSBsb2FkZXIgKi8KKGZ1bmN0aW9uKCl7CiAgInVzZSBzdHJpY3QiOwogIGlmKHdpbmRvdy5fX3BoUHNhR3JhZGluZ0FkZG9uVjEpIHJldHVybjsKICB3aW5kb3cuX19waFBzYUdyYWRpbmdBZGRvblYxID0gdHJ1ZTsKICB2YXIgS0VZID0gInBva2VodWIucHNhLmNvbGxlY3Rpb24udjEiOwogIHZhciBDT0xMRUNUSU9OX0tFWSA9ICJwb2tlaHViLmNvbGxlY3Rpb24udjIiOwogIHZhciBhY3RpdmVUYWIgPSAidW5ncmFkZWQiOwogIHZhciByb290LCBidXR0b24sIGJhZGdlLCBtb2RhbCwgYm9keTsKICB2YXIgbGFzdFJlc3VsdCA9IG51bGw7CiAgdmFyIGdyYWRlVGltZXIgPSBudWxsOwoKICBmdW5jdGlvbiByZWFkSlNPTihrZXksIGZhbGxiYWNrKXsKICAgIHRyeXsgdmFyIHJhdz13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHJhdyA/IEpTT04ucGFyc2UocmF3KSA6IGZhbGxiYWNrOyB9CiAgICBjYXRjaChlKXsgcmV0dXJuIGZhbGxiYWNrOyB9CiAgfQogIGZ1bmN0aW9uIHJlYWRHcmFkZWQoKXsKICAgIHZhciB2YWx1ZT1yZWFkSlNPTihLRVksW10pOwogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKGZ1bmN0aW9uKHgpeyByZXR1cm4geCAmJiB4LmNhcmRJZCAmJiBOdW1iZXIoeC5ncmFkZSk+PTEgJiYgTnVtYmVyKHguZ3JhZGUpPD0xMDsgfSkgOiBbXTsKICB9CiAgZnVuY3Rpb24gcmVhZENhcmRzKCl7CiAgICB2YXIgZGI9cmVhZEpTT04oQ09MTEVDVElPTl9LRVkse30pOwogICAgdmFyIGNhcmRzPWRiICYmIGRiLmNhcmRzICYmIHR5cGVvZiBkYi5jYXJkcz09PSJvYmplY3QiID8gZGIuY2FyZHMgOiB7fTsKICAgIHJldHVybiBPYmplY3Qua2V5cyhjYXJkcykubWFwKGZ1bmN0aW9uKGlkKXsKICAgICAgdmFyIGM9Y2FyZHNbaWRdfHx7fTsKICAgICAgcmV0dXJuIHtpZDpTdHJpbmcoYy5pZHx8aWQpLG5hbWU6U3RyaW5nKGMubmFtZXx8aWQpLGltZzpTdHJpbmcoYy5pbWd8fCIiKSxzZXQ6U3RyaW5nKGMuc2V0fHwiIikscmFyaXR5OlN0cmluZyhjLnJhcml0eXx8IiIpLHRpZXI6TnVtYmVyKGMudGllcil8fDAscHJpY2U6KE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYy5wcmljZSkpICYmIE51bWJlcihjLnByaWNlKT4wKSA/IE51bWJlcihjLnByaWNlKSA6IG51bGwsY291bnQ6TWF0aC5tYXgoMCxNYXRoLmZsb29yKE51bWJlcihjLm4pfHwwKSl9OwogICAgfSkuZmlsdGVyKGZ1bmN0aW9uKGMpeyByZXR1cm4gYy5jb3VudD4wOyB9KS5zb3J0KGZ1bmN0aW9uKGEsYil7IHJldHVybiAoTnVtYmVyKGIucHJpY2UpfHwwKS0oTnVtYmVyKGEucHJpY2UpfHwwKTsgfSk7CiAgfQogIGZ1bmN0aW9uIGNvdW50QmFkZ2UoKXsKICAgIGlmKCFiYWRnZSkgcmV0dXJuOwogICAgdmFyIG49cmVhZEdyYWRlZCgpLmxlbmd0aDsKICAgIGJhZGdlLnRleHRDb250ZW50PVN0cmluZyhuKTsKICAgIGJhZGdlLmhpZGRlbj0hbjsKICB9CiAgZnVuY3Rpb24gbWFrZSh0YWcsY2xzLHRleHQpewogICAgdmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYoY2xzKSBuLmNsYXNzTmFtZT1jbHM7CiAgICBpZih0ZXh0IT09dW5kZWZpbmVkICYmIHRleHQhPT1udWxsKSBuLnRleHRDb250ZW50PVN0cmluZyh0ZXh0KTsKICAgIHJldHVybiBuOwogIH0KICBmdW5jdGlvbiBtb25leSh2KXsgcmV0dXJuICIkIisoTnVtYmVyKHYpfHwwKS50b0ZpeGVkKDIpOyB9CiAgZnVuY3Rpb24gbm9ybWFsaXplSW1hZ2UodSl7CiAgICB1PVN0cmluZyh1fHwiIikudHJpbSgpOwogICAgaWYoIXUpIHJldHVybiAiIjsKICAgIGlmKC9cLihwbmd8anBlP2d8d2VicHxnaWYpKFs/I10uKik/JC9pLnRlc3QodSkpIHJldHVybiB1OwogICAgcmV0dXJuIHUucmVwbGFjZSgvXC8rJC8sJycpKyIvaGlnaC53ZWJwIjsKICB9CiAgZnVuY3Rpb24gZ3JhZGVMYWJlbChnKXsKICAgIGlmKGc9PT0xMCkgcmV0dXJuICJHRU0gTUlOVCI7CiAgICBpZihnPT09OSkgcmV0dXJuICJNSU5UIjsKICAgIGlmKGc9PT04KSByZXR1cm4gIk5N4oCTTVQiOwogICAgaWYoZz09PTcpIHJldHVybiAiTkVBUiBNSU5UIjsKICAgIGlmKGc9PT02KSByZXR1cm4gIkVYQ0VMTEVOVCI7CiAgICBpZihnPT09NSkgcmV0dXJuICJFWENFTExFTlTigJNHT09EIjsKICAgIGlmKGc9PT00KSByZXR1cm4gIlZFUlkgR09PRCI7CiAgICBpZihnPT09MykgcmV0dXJuICJHT09EIjsKICAgIGlmKGc9PT0yKSByZXR1cm4gIlBPT1IiOwogICAgcmV0dXJuICJBVVRIRU5USUMgLyBMT1cgR1JBREUiOwogIH0KICBmdW5jdGlvbiByb2xsR3JhZGUoKXsKICAgIHZhciByPU1hdGgucmFuZG9tKCk7CiAgICBpZihyPDAuMDgpIHJldHVybiAxMDsKICAgIGlmKHI8MC4zMCkgcmV0dXJuIDk7CiAgICBpZihyPDAuNTUpIHJldHVybiA4OwogICAgaWYocjwwLjczKSByZXR1cm4gNzsKICAgIGlmKHI8MC44NSkgcmV0dXJuIDY7CiAgICBpZihyPDAuOTIpIHJldHVybiA1OwogICAgaWYocjwwLjk2KSByZXR1cm4gNDsKICAgIGlmKHI8MC45OCkgcmV0dXJuIDM7CiAgICBpZihyPDAuOTk1KSByZXR1cm4gMjsKICAgIHJldHVybiAxOwogIH0KICBmdW5jdGlvbiBnZXRSZW1haW5pbmcoY2FyZCwgZ3JhZGVkKXsKICAgIHZhciBkb25lPWdyYWRlZC5maWx0ZXIoZnVuY3Rpb24oeCl7IHJldHVybiBTdHJpbmcoeC5jYXJkSWQpPT09U3RyaW5nKGNhcmQuaWQpOyB9KS5sZW5ndGg7CiAgICByZXR1cm4gTWF0aC5tYXgoMCxjYXJkLmNvdW50LWRvbmUpOwogIH0KICBmdW5jdGlvbiBhZGRJbWFnZShib3gsIHNyYywgYWx0KXsKICAgIGlmKCFzcmMpeyBib3gudGV4dENvbnRlbnQ9IvCfjrQiOyBib3guc3R5bGUuY29sb3I9IiNmZmQzNWMiOyBib3guc3R5bGUuZm9udFNpemU9IjI0cHgiOyByZXR1cm47IH0KICAgIHZhciBpbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CiAgICBpbWcubG9hZGluZz0ibGF6eSI7IGltZy5kZWNvZGluZz0iYXN5bmMiOyBpbWcuYWx0PWFsdHx8IlBva2Vtb24gY2FyZCI7IGltZy5zcmM9bm9ybWFsaXplSW1hZ2Uoc3JjKTsKICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXsgaW1nLnJlbW92ZSgpOyBib3gudGV4dENvbnRlbnQ9IvCfjrQiOyBib3guc3R5bGUuY29sb3I9IiNmZmQzNWMiOyBib3guc3R5bGUuZm9udFNpemU9IjI0cHgiOyB9KTsKICAgIGJveC5hcHBlbmRDaGlsZChpbWcpOwogIH0KICBmdW5jdGlvbiByZW5kZXJTbGFiKGVudHJ5KXsKICAgIHZhciBzbGFiPW1ha2UoImFydGljbGUiLCJwaC1wc2Etc2xhYiIpOwogICAgdmFyIHRvcD1tYWtlKCJkaXYiLCJwaC1wc2Etc2xhYi10b3AiKTsKICAgIHRvcC5hcHBlbmRDaGlsZChtYWtlKCJzcGFuIiwiIiwiUFNBIMK3IFNJTVVMQVRFRCIpKTsKICAgIHRvcC5hcHBlbmRDaGlsZChtYWtlKCJzcGFuIiwicGgtcHNhLXNsYWItZ3JhZGUiLCJHUkFERSAiK2VudHJ5LmdyYWRlKSk7CiAgICBzbGFiLmFwcGVuZENoaWxkKHRvcCk7CiAgICB2YXIgaW1hZ2U9bWFrZSgiZGl2IiwicGgtcHNhLXNsYWItaW1nIik7IGFkZEltYWdlKGltYWdlLGVudHJ5LmltZyxlbnRyeS5uYW1lKTsgc2xhYi5hcHBlbmRDaGlsZChpbWFnZSk7CiAgICB2YXIgY29weT1tYWtlKCJkaXYiLCJwaC1wc2Etc2xhYi1jb3B5Iik7CiAgICBjb3B5LmFwcGVuZENoaWxkKG1ha2UoImRpdiIsInBoLXBzYS1zbGFiLW5hbWUiLGVudHJ5Lm5hbWUpKTsKICAgIGNvcHkuYXBwZW5kQ2hpbGQobWFrZSgiZGl2IiwicGgtcHNhLWdyYWRlLWJpZyIsIlBTQSAiK2VudHJ5LmdyYWRlKSk7CiAgICBjb3B5LmFwcGVuZENoaWxkKG1ha2UoImRpdiIsInBoLXBzYS1ncmFkZS1sYWJlbCIsZ3JhZGVMYWJlbChlbnRyeS5ncmFkZSkpKTsKICAgIGNvcHkuYXBwZW5kQ2hpbGQobWFrZSgiZGl2IiwicGgtcHNhLWRhdGUiLChlbnRyeS5zZXQ/ZW50cnkuc2V0KyIgwrcgIjoiIikrKGVudHJ5LnJhcml0eXx8IlBva2Vtb24gY2FyZCIpKyJcbkdpw6EgdGhhbSBraOG6o28gdGjhursgY2jGsGEgY2jhuqVtOiAiKyhlbnRyeS5wcmljZSE9bnVsbD9tb25leShlbnRyeS5wcmljZSk6ImNoxrBhIGPDsyBnacOhIikrIlxuIituZXcgRGF0ZShlbnRyeS5ncmFkZWRBdCkudG9Mb2NhbGVTdHJpbmcoInZpLVZOIikpKTsKICAgIHNsYWIuYXBwZW5kQ2hpbGQoY29weSk7CiAgICByZXR1cm4gc2xhYjsKICB9CiAgZnVuY3Rpb24gcmVuZGVyKCl7CiAgICBpZighYm9keSkgcmV0dXJuOwogICAgYm9keS50ZXh0Q29udGVudD0iIjsKICAgIHZhciBncmFkZWQ9cmVhZEdyYWRlZCgpOwogICAgdmFyIGNhcmRzPXJlYWRDYXJkcygpOwogICAgdmFyIHRhYnM9bWFrZSgiZGl2IiwicGgtcHNhLXRhYnMiKTsKICAgIFt7aWQ6InVuZ3JhZGVkIixsYWJlbDoi8J+DjyBDaMawYSBjaOG6pW0ifSx7aWQ6ImdyYWRlZCIsbGFiZWw6IvCfko4gxJDDoyBjaOG6pW0gKCIrZ3JhZGVkLmxlbmd0aCsiKSJ9XS5mb3JFYWNoKGZ1bmN0aW9uKG9wdCl7CiAgICAgIHZhciBiPW1ha2UoImJ1dHRvbiIsInBoLXBzYS10YWIiKyhhY3RpdmVUYWI9PT1vcHQuaWQ/IiBwaC1pcy1hY3RpdmUiOiIiKSxvcHQubGFiZWwpOyBiLnR5cGU9ImJ1dHRvbiI7CiAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7YWN0aXZlVGFiPW9wdC5pZDtsYXN0UmVzdWx0PW51bGw7cmVuZGVyKCk7fSk7IHRhYnMuYXBwZW5kQ2hpbGQoYik7CiAgICB9KTsKICAgIGJvZHkuYXBwZW5kQ2hpbGQodGFicyk7CiAgICBib2R5LmFwcGVuZENoaWxkKG1ha2UoImRpdiIsInBoLXBzYS1ub3RlIiwiUFNBIGNo4bqlbSDEkWnhu4NtIOG7nyDEkcOieSBsw6AgbcO0IHBo4buPbmcgdHJvbmcgUG9rZUh1Yiwga2jDtG5nIHBo4bqjaSDEkWnhu4NtIFBTQSB0aOG6rXQuIE3hu5dpIGzhuqduIGNo4bqlbSBs4bqleSBt4buZdCBi4bqjbiBzYW8gdHJvbmcgYuG7mSBzxrB1IHThuq1wOyDEkWnhu4NtIHbDoCB0aOG6uyDEkcOjIGNo4bqlbSDEkcaw4bujYyBsxrB1IHRyw6puIHRyw6xuaCBkdXnhu4d0IGhp4buHbiB04bqhaS4gR2nDoSB0aOG7iyB0csaw4budbmcgYsOqbiBkxrDhu5tpIGzDoCBnacOhIHRoYW0ga2jhuqNvIGPhu6dhIHRo4bq7IGNoxrBhIGNo4bqlbSwga2jDtG5nIHThu7EgdMSDbmcgdGhlbyDEkWnhu4NtLiIpKTsKICAgIGlmKGxhc3RSZXN1bHQgJiYgYWN0aXZlVGFiPT09InVuZ3JhZGVkIil7CiAgICAgIHZhciByZXN1bHQ9bWFrZSgiZGl2IiwicGgtcHNhLXJlc3VsdCIpOwogICAgICByZXN1bHQudGV4dENvbnRlbnQ9IuKchSBIb8OgbiB04bqldCBraeG7g20gxJHhu4tuaCBtw7QgcGjhu49uZzogIitsYXN0UmVzdWx0Lm5hbWUrIiDEkeG6oXQgUFNBICIrbGFzdFJlc3VsdC5ncmFkZSsiIMK3ICIrZ3JhZGVMYWJlbChsYXN0UmVzdWx0LmdyYWRlKSsiLiI7CiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQocmVzdWx0KTsKICAgICAgYm9keS5hcHBlbmRDaGlsZChyZW5kZXJTbGFiKGxhc3RSZXN1bHQpKTsKICAgIH0KICAgIGlmKGFjdGl2ZVRhYj09PSJ1bmdyYWRlZCIpewogICAgICB2YXIgYXZhaWxhYmxlPWNhcmRzLm1hcChmdW5jdGlvbihjKXsgcmV0dXJuIHtjYXJkOmMscmVtYWluaW5nOmdldFJlbWFpbmluZyhjLGdyYWRlZCl9OyB9KS5maWx0ZXIoZnVuY3Rpb24oeCl7cmV0dXJuIHgucmVtYWluaW5nPjA7fSk7CiAgICAgIGlmKCFhdmFpbGFibGUubGVuZ3RoKXsKICAgICAgICBib2R5LmFwcGVuZENoaWxkKG1ha2UoImRpdiIsInBoLXBzYS1lbXB0eSIsY2FyZHMubGVuZ3RoPyJC4bqhbiDEkcOjIGNo4bqlbSBo4bq/dCBz4buRIGLhuqNuIHNhbyDEkWFuZyBjw7MuIE3hu58gdGjDqm0gcGFjayDEkeG7gyBuaOG6rW4gYuG6o24gc2FvIG3hu5tpLCBy4buTaSBxdWF5IGzhuqFpIMSRw6J5LiI6IkLhu5kgc8awdSB04bqtcCDEkWFuZyB0cuG7kW5nLiBIw6N5IG3hu58gcGFjayB2w6AgbMawdSB0aOG6uyB0csaw4bubYyBraGkgZ+G7rWkgY2jhuqVtIFBTQS4iKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBncmlkPW1ha2UoImRpdiIsInBoLXBzYS1ncmlkIik7CiAgICAgIGF2YWlsYWJsZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewogICAgICAgIHZhciBjPWl0ZW0uY2FyZCwgY2FyZD1tYWtlKCJhcnRpY2xlIiwicGgtcHNhLWNhcmQiKSwgaW1hZ2U9bWFrZSgiZGl2IiwicGgtcHNhLWNhcmQtaW1nIik7CiAgICAgICAgYWRkSW1hZ2UoaW1hZ2UsYy5pbWcsYy5uYW1lKTsgY2FyZC5hcHBlbmRDaGlsZChpbWFnZSk7CiAgICAgICAgY2FyZC5hcHBlbmRDaGlsZChtYWtlKCJkaXYiLCJwaC1wc2EtY2FyZC1uYW1lIixjLm5hbWUpKTsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKG1ha2UoImRpdiIsInBoLXBzYS1jYXJkLW1ldGEiLFtjLnNldCxjLnJhcml0eV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiDCtyAiKXx8IlBva2Vtb24gY2FyZCIpKTsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKG1ha2UoImRpdiIsInBoLXBzYS1jYXJkLXByaWNlIixjLnByaWNlIT1udWxsPyJHacOhIHRoYW0ga2jhuqNvOiAiK21vbmV5KGMucHJpY2UpOiJDaMawYSBjw7MgZ2nDoSB0aGFtIGto4bqjbyIpKTsKICAgICAgICB2YXIgc3VibWl0PW1ha2UoImJ1dHRvbiIsInBoLXBzYS1zdWJtaXQiLCLwn5SNIENo4bqlbSBQU0EgwrcgbcO0IHBo4buPbmciKTsgc3VibWl0LnR5cGU9ImJ1dHRvbiI7CiAgICAgICAgc3VibWl0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpewogICAgICAgICAgaWYoc3VibWl0LmRpc2FibGVkKSByZXR1cm47CiAgICAgICAgICBzdWJtaXQuZGlzYWJsZWQ9dHJ1ZTtzdWJtaXQudGV4dENvbnRlbnQ9IsSQYW5nIGtp4buDbSDEkeG7i25o4oCmIjsKICAgICAgICAgIGlmKGdyYWRlVGltZXIpIGNsZWFyVGltZW91dChncmFkZVRpbWVyKTsKICAgICAgICAgIGdyYWRlVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgZnJlc2hDYXJkcz1yZWFkQ2FyZHMoKS5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4LmlkPT09Yy5pZDt9KTsKICAgICAgICAgICAgdmFyIGZyZXNoR3JhZGVkPXJlYWRHcmFkZWQoKTsKICAgICAgICAgICAgaWYoIWZyZXNoQ2FyZHMgfHwgZ2V0UmVtYWluaW5nKGZyZXNoQ2FyZHMsZnJlc2hHcmFkZWQpPD0wKXtyZW5kZXIoKTtyZXR1cm47fQogICAgICAgICAgICB2YXIgZz1yb2xsR3JhZGUoKTsKICAgICAgICAgICAgdmFyIGVudHJ5PXtncmFkZUlkOiJwc2FfIitEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSsiXyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiw4KSxjYXJkSWQ6Yy5pZCxuYW1lOmMubmFtZSxpbWc6Yy5pbWcsc2V0OmMuc2V0LHJhcml0eTpjLnJhcml0eSx0aWVyOmMudGllcixwcmljZTpjLnByaWNlLGdyYWRlOmcsZ3JhZGVMYWJlbDpncmFkZUxhYmVsKGcpLGdyYWRlZEF0Om5ldyBEYXRlKCkudG9JU09TdHJpbmcoKX07CiAgICAgICAgICAgIGZyZXNoR3JhZGVkLnVuc2hpZnQoZW50cnkpOwogICAgICAgICAgICB0cnl7bG9jYWxTdG9yYWdlLnNldEl0ZW0oS0VZLEpTT04uc3RyaW5naWZ5KGZyZXNoR3JhZGVkLnNsaWNlKDAsMTAwMCkpKTt9Y2F0Y2goZSl7fQogICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5fX3Bva2VodWJSZWNvcmRQU0FHcmFkZSA9PT0gImZ1bmN0aW9uIikgd2luZG93Ll9fcG9rZWh1YlJlY29yZFBTQUdyYWRlKGVudHJ5KTsKICAgICAgICAgICAgbGFzdFJlc3VsdD1lbnRyeTthY3RpdmVUYWI9ImdyYWRlZCI7Y291bnRCYWRnZSgpO3JlbmRlcigpOwogICAgICAgICAgfSwxMDAwK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo3MDApKTsKICAgICAgICB9KTsKICAgICAgICBjYXJkLmFwcGVuZENoaWxkKHN1Ym1pdCk7CiAgICAgICAgY2FyZC5hcHBlbmRDaGlsZChtYWtlKCJkaXYiLCJwaC1wc2EtcXR5IiwiQ8OybiAiK2l0ZW0ucmVtYWluaW5nKyIgYuG6o24gc2FvIGNoxrBhIGNo4bqlbSIpKTsKICAgICAgICBncmlkLmFwcGVuZENoaWxkKGNhcmQpOwogICAgICB9KTsKICAgICAgYm9keS5hcHBlbmRDaGlsZChncmlkKTsKICAgIH1lbHNlewogICAgICBpZighZ3JhZGVkLmxlbmd0aCl7Ym9keS5hcHBlbmRDaGlsZChtYWtlKCJkaXYiLCJwaC1wc2EtZW1wdHkiLCJDaMawYSBjw7MgdGjhursgUFNBIG3DtCBwaOG7j25nIG7DoG8uIENodXnhu4NuIHNhbmcg4oCcQ2jGsGEgY2jhuqVt4oCdIMSR4buDIGLhuq90IMSR4bqndS4iKSk7cmV0dXJuO30KICAgICAgdmFyIGdyYWRlZEdyaWQ9bWFrZSgiZGl2IiwicGgtcHNhLWdyaWQiKTsKICAgICAgZ3JhZGVkLmZvckVhY2goZnVuY3Rpb24oZW50cnkpe3ZhciB3cmFwPW1ha2UoImRpdiIsInBoLXBzYS1ncmFkZWQtaXRlbSIpO3dyYXAuYXBwZW5kQ2hpbGQocmVuZGVyU2xhYihlbnRyeSkpO2dyYWRlZEdyaWQuYXBwZW5kQ2hpbGQod3JhcCk7fSk7CiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZ3JhZGVkR3JpZCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9wZW4oKXthY3RpdmVUYWI9InVuZ3JhZGVkIjtsYXN0UmVzdWx0PW51bGw7cmVuZGVyKCk7bW9kYWwuaGlkZGVuPWZhbHNlO30KICBmdW5jdGlvbiBjbG9zZSgpe21vZGFsLmhpZGRlbj10cnVlO2lmKGdyYWRlVGltZXIpe2NsZWFyVGltZW91dChncmFkZVRpbWVyKTtncmFkZVRpbWVyPW51bGw7fX0KICBmdW5jdGlvbiBib290KCl7CiAgICByb290PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwb2tlaHViLWFwcCIpOwogICAgaWYoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgIGJ1dHRvbj1yb290LnF1ZXJ5U2VsZWN0b3IoIiNwaC1wc2EtYnRuIik7CiAgICB2YXIgb2xkQnRuPXJvb3QucXVlcnlTZWxlY3RvcigiI3BoLWNvbC1idG4iKTsKICAgIGlmKCFidXR0b24pewogICAgICBpZighb2xkQnRuKSByZXR1cm4gZmFsc2U7CiAgICAgIGJ1dHRvbj1tYWtlKCJidXR0b24iLCJwaC10b29sIHBoLXBzYS10b29sIik7YnV0dG9uLmlkPSJwaC1wc2EtYnRuIjtidXR0b24udHlwZT0iYnV0dG9uIjtidXR0b24udGl0bGU9IkNo4bqlbSBQU0EgbcO0IHBo4buPbmcgY2hvIHRo4bq7IMSRw6Mgc8awdSB04bqnbSI7CiAgICAgIGJ1dHRvbi5hcHBlbmRDaGlsZChtYWtlKCJzcGFuIiwiIiwi8J+SjiIpKTtidXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiBDaOG6pW0gUFNBICIpKTsKICAgICAgb2xkQnRuLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLGJ1dHRvbik7CiAgICB9CiAgICBiYWRnZT1idXR0b24ucXVlcnlTZWxlY3RvcigiI3BoLXBzYS1iYWRnZSIpfHxidXR0b24ucXVlcnlTZWxlY3RvcigiLnBoLXBzYS1iYWRnZSIpOwogICAgaWYoIWJhZGdlKXtiYWRnZT1tYWtlKCJzcGFuIiwicGgtcHNhLWJhZGdlIiwiMCIpO2JhZGdlLmlkPSJwaC1wc2EtYmFkZ2UiO2JhZGdlLmhpZGRlbj10cnVlO2J1dHRvbi5hcHBlbmRDaGlsZChiYWRnZSk7fQogICAgaWYoYnV0dG9uLmRhdGFzZXQucGhQc2FCb3VuZD09PSIxIikgeyBjb3VudEJhZGdlKCk7IHJldHVybiB0cnVlOyB9CiAgICBidXR0b24uZGF0YXNldC5waFBzYUJvdW5kPSIxIjsKICAgIG1vZGFsPXJvb3QucXVlcnlTZWxlY3RvcigiI3BoLXBzYS1tb2RhbCIpOwogICAgaWYoIW1vZGFsKXsKICAgICAgbW9kYWw9bWFrZSgiZGl2IiwicGgtbW9kYWwiKTttb2RhbC5pZD0icGgtcHNhLW1vZGFsIjttb2RhbC5oaWRkZW49dHJ1ZTsKICAgICAgdmFyIGJhY2tkcm9wPW1ha2UoImRpdiIsInBoLW1vZGFsLWJhY2tkcm9wIik7YmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGNsb3NlKTttb2RhbC5hcHBlbmRDaGlsZChiYWNrZHJvcCk7CiAgICAgIHZhciBwYW5lbD1tYWtlKCJkaXYiLCJwaC1tb2RhbC1jYXJkIHBoLW1vZGFsLXdpZGUiKTtwYW5lbC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJkaWFsb2ciKTtwYW5lbC5zZXRBdHRyaWJ1dGUoImFyaWEtbW9kYWwiLCJ0cnVlIik7cGFuZWwuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiUFNBIGdyYWRpbmcgbcO0IHBo4buPbmciKTsKICAgICAgdmFyIGNsb3NlQnRuPW1ha2UoImJ1dHRvbiIsInBoLW1vZGFsLWNsb3NlIiwi4pyVIik7Y2xvc2VCdG4udHlwZT0iYnV0dG9uIjtjbG9zZUJ0bi5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCLEkMOzbmciKTtjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsY2xvc2UpO3BhbmVsLmFwcGVuZENoaWxkKGNsb3NlQnRuKTsKICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQobWFrZSgiZGl2IiwicGgtbW9kYWwtdGl0bGUiLCLwn5KOIFBTQSBHUkFESU5HIExBQiIpKTsKICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQobWFrZSgiZGl2IiwicGgtY29sLW5vdGUiLCJUcnVuZyB0w6JtIGNo4bqlbSDEkWnhu4NtIHRo4bq7IG3DtCBwaOG7j25nIMK3IFBva2VIdWIgLyB2bkdhbWUudHYiKSk7CiAgICAgIGJvZHk9bWFrZSgiZGl2IiwicGgtbW9kYWwtYm9keSIpO3BhbmVsLmFwcGVuZENoaWxkKGJvZHkpO21vZGFsLmFwcGVuZENoaWxkKHBhbmVsKTtyb290LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgIH0gZWxzZSB7CiAgICAgIGJvZHk9bW9kYWwucXVlcnlTZWxlY3RvcigiLnBoLW1vZGFsLWJvZHkiKTsKICAgIH0KICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsb3Blbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtpZihlLmtleT09PSJFc2NhcGUiJiZtb2RhbCYmIW1vZGFsLmhpZGRlbiljbG9zZSgpO30pOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLGZ1bmN0aW9uKGUpe2lmKGUua2V5PT09S0VZfHxlLmtleT09PUNPTExFQ1RJT05fS0VZKXtjb3VudEJhZGdlKCk7aWYobW9kYWwmJiFtb2RhbC5oaWRkZW4pcmVuZGVyKCk7fX0pOwogICAgY291bnRCYWRnZSgpOwogICAgaWYgKHR5cGVvZiB3aW5kb3cuX19wb2tlaHViUmVjb3JkUFNBR3JhZGUgPT09ICJmdW5jdGlvbiIpewogICAgICByZWFkR3JhZGVkKCkuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7IHdpbmRvdy5fX3Bva2VodWJSZWNvcmRQU0FHcmFkZShlbnRyeSk7IH0pOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmKCFib290KCkpewogICAgdmFyIHRyaWVzPTA7dmFyIHRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7dHJpZXMrKztpZihib290KCl8fHRyaWVzPjQwKWNsZWFySW50ZXJ2YWwodGltZXIpO30sMjUwKTsKICB9Cn0pKCk7CgovKiBQb2tlSHViIFRyYWluZXIgU2hvd2Nhc2UgcHJvZmlsZSBmZWF0dXJlIChidW5kbGVkIGludG8gdGhlIGNvcmUgYm9vdHN0cmFwKSAqLwooZnVuY3Rpb24oKXsKICAidXNlIHN0cmljdCI7CiAgLyogdjMgZGVsaWJlcmF0ZWx5IHVzZXMgYSBmcmVzaCBndWFyZCBzbyBhIGNhY2hlZCB2MiBhZGRvbiBjYW5ub3QgYmxvY2sgY2xpY2sgZml4ZXMuICovCiAgaWYod2luZG93Ll9fcGhUcmFpbmVyUHJvZmlsZUFkZG9uVjkpIHJldHVybjsKICB3aW5kb3cuX19waFRyYWluZXJQcm9maWxlQWRkb25WOT10cnVlOwogIHZhciBTVVBBQkFTRV9VUkw9Imh0dHBzOi8vZ29wa3V1eG5ob3BjZ3podnhwYmkuc3VwYWJhc2UuY28iOwogIHZhciBTVVBBQkFTRV9LRVk9InNiX3B1Ymxpc2hhYmxlX09uZVFVT0phTUhRVzNPejh5T0pjZFFfWUNCRzZHdFIiOwogIHZhciBQUk9GSUxFX1RBQkxFPSJ0cmFpbmVyX3Byb2ZpbGVzIiwgQUNUSVZJVFlfVEFCTEU9ImxlYWRlcmJvYXJkX2FjdGl2aXR5IjsKICB2YXIgVUlEX0tFWT0icG9rZWh1Yi5sZWFkZXJib2FyZC51aWQudjEiLCBOQU1FX0tFWT0icG9rZWh1Yi50cmFpbmVyLm5hbWUudjEiOwogIHZhciBQVUJMSUNfS0VZPSJwb2tlaHViLnRyYWluZXIucHJvZmlsZS5wdWJsaWMudjEiLCBDT0xMRUNUSU9OX0tFWT0icG9rZWh1Yi5jb2xsZWN0aW9uLnYyIiwgUFNBX0tFWT0icG9rZWh1Yi5wc2EuY29sbGVjdGlvbi52MSI7CiAgdmFyIGFwcCwgYnV0dG9uLCBtb2RhbCwgYm9keSwgdGl0bGUsIHByb2ZpbGVDbGllbnQ9bnVsbCwgY3VycmVudFVpZD0iIiwgY3VycmVudE5hbWU9IlRyYWluZXIiLCBhY3RpdmVUYWI9InNob3djYXNlIiwgbGFzdEFjdGl2aXR5PVtdLCBzdGF0dXNUZXh0PSIiLCBzdGF0dXNFcnJvcj1mYWxzZSwgbG9hZGluZz1mYWxzZTsKICB2YXIgYm91bmRQU0E9ZmFsc2U7CiAgZnVuY3Rpb24gZWwodGFnLGNscyx0ZXh0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7aWYoY2xzKW4uY2xhc3NOYW1lPWNscztpZih0ZXh0IT09dW5kZWZpbmVkJiZ0ZXh0IT09bnVsbCluLnRleHRDb250ZW50PVN0cmluZyh0ZXh0KTtyZXR1cm4gbjt9CiAgZnVuY3Rpb24gZ2V0TFMoa2V5LGZhbGxiYWNrKXt0cnl7dmFyIHY9bG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtyZXR1cm4gdj09bnVsbD9mYWxsYmFjazp2O31jYXRjaChlKXtyZXR1cm4gZmFsbGJhY2s7fX0KICBmdW5jdGlvbiBzZXRMUyhrZXksdmFsdWUpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksdmFsdWUpO3JldHVybiB0cnVlO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fX0KICBmdW5jdGlvbiB1aWQoKXtyZXR1cm4gU3RyaW5nKGdldExTKFVJRF9LRVksIiIpfHwiIikudHJpbSgpO30KICBmdW5jdGlvbiBuYW1lKCl7cmV0dXJuIFN0cmluZyhnZXRMUyhOQU1FX0tFWSwiVHJhaW5lciIpfHwiVHJhaW5lciIpLnJlcGxhY2UoL1s8Pl0vZywiIikucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCkuc2xpY2UoMCwxOCl8fCJUcmFpbmVyIjt9CiAgZnVuY3Rpb24gaXNQdWJsaWMoKXtyZXR1cm4gZ2V0TFMoUFVCTElDX0tFWSwiMCIpPT09IjEiO30KICBmdW5jdGlvbiByZWFkSlNPTihrZXksZmFsbGJhY2spe3RyeXtyZXR1cm4gSlNPTi5wYXJzZShnZXRMUyhrZXksSlNPTi5zdHJpbmdpZnkoZmFsbGJhY2spKSk7fWNhdGNoKGUpe3JldHVybiBmYWxsYmFjazt9fQogIGZ1bmN0aW9uIG1vbmV5KHYpe3JldHVybiAiJCIrKE51bWJlcih2KXx8MCkudG9Mb2NhbGVTdHJpbmcoImVuLVVTIix7bWluaW11bUZyYWN0aW9uRGlnaXRzOjIsbWF4aW11bUZyYWN0aW9uRGlnaXRzOjJ9KTt9CiAgZnVuY3Rpb24gbm9ybWFsaXplSW1nKHZhbHVlKXt2YXIgdT1TdHJpbmcodmFsdWV8fCIiKS50cmltKCk7aWYoIS9eaHR0cHM6XC9cLy9pLnRlc3QodSkpcmV0dXJuICIiO2lmKCEvXC4oW2EtejAtOV0rKShbPyNdLiopPyQvaS50ZXN0KHUpKXU9dS5yZXBsYWNlKC9cLyskLywnJykrIi9oaWdoLndlYnAiO3JldHVybiB1O30KICBmdW5jdGlvbiBzYWZlSW1nU3JjKHUpe3U9bm9ybWFsaXplSW1nKHUpO3JldHVybiAvXmh0dHBzOlwvXC9hc3NldHNcLnRjZ2RleFwubmV0XC8vaS50ZXN0KHUpfHwvXmh0dHBzOlwvXC9yYXdcLmdpdGh1YnVzZXJjb250ZW50XC5jb21cLy9pLnRlc3QodSk/dToiIjt9CiAgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KCl7CiAgICBpZihwcm9maWxlQ2xpZW50KXJldHVybiBQcm9taXNlLnJlc29sdmUocHJvZmlsZUNsaWVudCk7CiAgICBpZih3aW5kb3cuc3VwYWJhc2UmJnR5cGVvZiB3aW5kb3cuc3VwYWJhc2UuY3JlYXRlQ2xpZW50PT09ImZ1bmN0aW9uIil7CiAgICAgIHByb2ZpbGVDbGllbnQ9d2luZG93LnN1cGFiYXNlLmNyZWF0ZUNsaWVudChTVVBBQkFTRV9VUkwsU1VQQUJBU0VfS0VZLHthdXRoOntwZXJzaXN0U2Vzc2lvbjpmYWxzZSxhdXRvUmVmcmVzaFRva2VuOmZhbHNlLGRldGVjdFNlc3Npb25JblVybDpmYWxzZX19KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2ZpbGVDbGllbnQpOwogICAgfQogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXsKICAgICAgdmFyIGV4aXN0aW5nPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtkYXRhLXBoLXN1cGFiYXNlLXNkaz0iMSJdJyk7CiAgICAgIGlmKGV4aXN0aW5nJiZleGlzdGluZy5nZXRBdHRyaWJ1dGUoImRhdGEtcGgtc3VwYWJhc2UtZmFpbGVkIik9PT0iMSIpe2V4aXN0aW5nLnJlbW92ZSgpO2V4aXN0aW5nPW51bGw7fQogICAgICB2YXIgc2NyaXB0PWV4aXN0aW5nfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkb25lPWZhbHNlOwogICAgICBmdW5jdGlvbiBmaW5pc2goKXtpZihkb25lKXJldHVybjtkb25lPXRydWU7aWYod2luZG93LnN1cGFiYXNlJiZ0eXBlb2Ygd2luZG93LnN1cGFiYXNlLmNyZWF0ZUNsaWVudD09PSJmdW5jdGlvbiIpe3Byb2ZpbGVDbGllbnQ9d2luZG93LnN1cGFiYXNlLmNyZWF0ZUNsaWVudChTVVBBQkFTRV9VUkwsU1VQQUJBU0VfS0VZLHthdXRoOntwZXJzaXN0U2Vzc2lvbjpmYWxzZSxhdXRvUmVmcmVzaFRva2VuOmZhbHNlLGRldGVjdFNlc3Npb25JblVybDpmYWxzZX19KTtyZXNvbHZlKHByb2ZpbGVDbGllbnQpO31lbHNlIHJlamVjdChuZXcgRXJyb3IoIktow7RuZyB04bqjaSDEkcaw4bujYyBTdXBhYmFzZSBTREsuIikpO30KICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZpbmlzaCx7b25jZTp0cnVlfSk7c2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2lmKGRvbmUpcmV0dXJuO2RvbmU9dHJ1ZTtyZWplY3QobmV3IEVycm9yKCJLaMO0bmcgdOG6o2kgxJHGsOG7o2MgdGjGsCB2aeG7h24gU3VwYWJhc2UuIEtp4buDbSB0cmEgbeG6oW5nIGhv4bq3YyBjYWNoZS4iKSk7fSx7b25jZTp0cnVlfSk7CiAgICAgIGlmKCFleGlzdGluZyl7c2NyaXB0LnNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3VwYWJhc2Uvc3VwYWJhc2UtanNAMiI7c2NyaXB0LmFzeW5jPXRydWU7c2NyaXB0LnNldEF0dHJpYnV0ZSgiZGF0YS1waC1zdXBhYmFzZS1zZGsiLCIxIik7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO31lbHNlIGlmKHdpbmRvdy5zdXBhYmFzZSYmd2luZG93LnN1cGFiYXNlLmNyZWF0ZUNsaWVudClmaW5pc2goKTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBsb2NhbFNuYXBzaG90KCl7CiAgICB2YXIgZGI9cmVhZEpTT04oQ09MTEVDVElPTl9LRVkse30pLCBjYXJkc01hcD1kYiYmZGIuY2FyZHMmJnR5cGVvZiBkYi5jYXJkcz09PSJvYmplY3QiP2RiLmNhcmRzOnt9LCBjYXJkcz1bXSwgc2V0TWFwPU9iamVjdC5jcmVhdGUobnVsbCksIHRvdGFsQ2FyZHM9MCx0b3RhbFZhbHVlPTA7CiAgICBPYmplY3Qua2V5cyhjYXJkc01hcCkuZm9yRWFjaChmdW5jdGlvbihpZCl7dmFyIGM9Y2FyZHNNYXBbaWRdfHx7fSxuPU1hdGgubWF4KDAsTWF0aC5mbG9vcihOdW1iZXIoYy5uKXx8MCkpLHByaWNlPU51bWJlcihjLnByaWNlKTtpZighbilyZXR1cm47dmFyIHNldE5hbWU9U3RyaW5nKGMuc2V0fHwiIikuc2xpY2UoMCwxMjApLHNldElkPVN0cmluZyhjLnNldElkfHwiIikuc2xpY2UoMCw4MCksa2V5PXNldElkfHxzZXROYW1lfHwidW5rbm93biI7aWYoc2V0TmFtZXx8c2V0SWQpe2lmKCFzZXRNYXBba2V5XSlzZXRNYXBba2V5XT17aWQ6a2V5LG5hbWU6c2V0TmFtZXx8c2V0SWQsdW5pcXVlOjAsY2FyZHM6MCx2YWx1ZTowfTtzZXRNYXBba2V5XS51bmlxdWUrKztzZXRNYXBba2V5XS5jYXJkcys9bjt9aWYoTnVtYmVyLmlzRmluaXRlKHByaWNlKSYmcHJpY2U+MCl0b3RhbFZhbHVlKz1wcmljZSpuO3RvdGFsQ2FyZHMrPW47Y2FyZHMucHVzaCh7aWQ6U3RyaW5nKGMuaWR8fGlkKS5zbGljZSgwLDEyMCksbmFtZTpTdHJpbmcoYy5uYW1lfHxpZCkuc2xpY2UoMCwxNjApLGltZzpTdHJpbmcoYy5pbWd8fCIiKS5zbGljZSgwLDUwMCksc2V0OnNldE5hbWUsc2V0SWQ6c2V0SWQscmFyaXR5OlN0cmluZyhjLnJhcml0eXx8IiIpLnNsaWNlKDAsMTAwKSx0aWVyOk51bWJlcihjLnRpZXIpfHwwLHByaWNlOk51bWJlci5pc0Zpbml0ZShwcmljZSkmJnByaWNlPjA/TnVtYmVyKHByaWNlLnRvRml4ZWQoMikpOm51bGwsY291bnQ6bix0Ok51bWJlcihjLnQpfHwwfSk7fSk7CiAgICBjYXJkcy5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIChOdW1iZXIoYi5wcmljZSl8fDApLShOdW1iZXIoYS5wcmljZSl8fDApfHxiLmNvdW50LWEuY291bnQ7fSk7CiAgICB2YXIgZ3JhZGVkPXJlYWRKU09OKFBTQV9LRVksW10pO2lmKCFBcnJheS5pc0FycmF5KGdyYWRlZCkpZ3JhZGVkPVtdOwogICAgZ3JhZGVkPWdyYWRlZC5maWx0ZXIoZnVuY3Rpb24oZyl7cmV0dXJuIGcmJmcuY2FyZElkJiZOdW1iZXIoZy5ncmFkZSk+PTEmJk51bWJlcihnLmdyYWRlKTw9MTA7fSkubWFwKGZ1bmN0aW9uKGcpe3JldHVybiB7Z3JhZGVJZDpTdHJpbmcoZy5ncmFkZUlkfHwiIikuc2xpY2UoMCwxMjApLGNhcmRJZDpTdHJpbmcoZy5jYXJkSWR8fCIiKS5zbGljZSgwLDEyMCksbmFtZTpTdHJpbmcoZy5uYW1lfHxnLmNhcmRJZHx8IlBva8OpbW9uIGNhcmQiKS5zbGljZSgwLDE2MCksaW1nOlN0cmluZyhnLmltZ3x8IiIpLnNsaWNlKDAsNTAwKSxzZXQ6U3RyaW5nKGcuc2V0fHwiIikuc2xpY2UoMCwxMjApLHJhcml0eTpTdHJpbmcoZy5yYXJpdHl8fCIiKS5zbGljZSgwLDEwMCksZ3JhZGU6TWF0aC5tYXgoMSxNYXRoLm1pbigxMCxNYXRoLmZsb29yKE51bWJlcihnLmdyYWRlKXx8MSkpKSxwcmljZTpOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKGcucHJpY2UpKSYmTnVtYmVyKGcucHJpY2UpPjA/TnVtYmVyKE51bWJlcihnLnByaWNlKS50b0ZpeGVkKDIpKTpudWxsLGdyYWRlZEF0OlN0cmluZyhnLmdyYWRlZEF0fHwiIil9O30pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5ncmFkZS1hLmdyYWRlfHxTdHJpbmcoYi5ncmFkZWRBdCkubG9jYWxlQ29tcGFyZShTdHJpbmcoYS5ncmFkZWRBdCkpO30pOwogICAgdmFyIHNldHM9T2JqZWN0LmtleXMoc2V0TWFwKS5tYXAoZnVuY3Rpb24oayl7cmV0dXJuIHNldE1hcFtrXTt9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuY2FyZHMtYS5jYXJkczt9KTsKICAgIHZhciBwYWNrcz1NYXRoLm1heCgwLE51bWJlcihkYi5wYWNrcyl8fDApLHNwZW50PU1hdGgubWF4KDAsTnVtYmVyKGRiLnNwZW50KXx8MCkscm9pPXNwZW50PygodG90YWxWYWx1ZS1zcGVudCkvc3BlbnQpKjEwMDowOwogICAgcmV0dXJuIHtwYWNrczpwYWNrcyxjYXJkczp0b3RhbENhcmRzLHVuaXF1ZV9jYXJkczpjYXJkcy5sZW5ndGgsc2V0c19jb2xsZWN0ZWQ6c2V0cy5sZW5ndGgsdG90YWxfdmFsdWU6TnVtYmVyKHRvdGFsVmFsdWUudG9GaXhlZCgyKSksc3BlbnQ6TnVtYmVyKHNwZW50LnRvRml4ZWQoMikpLHJvaV9wY3Q6TnVtYmVyKHJvaS50b0ZpeGVkKDIpKSxjYXJkc19saXN0OmNhcmRzLnNsaWNlKDAsODApLGdyYWRlZDpncmFkZWQuc2xpY2UoMCwxMjApLHNldHM6c2V0cy5zbGljZSgwLDQwKSxwc2ExMDpncmFkZWQuZmlsdGVyKGZ1bmN0aW9uKGcpe3JldHVybiBnLmdyYWRlPT09MTA7fSkubGVuZ3RoLHBzYTlwbHVzOmdyYWRlZC5maWx0ZXIoZnVuY3Rpb24oZyl7cmV0dXJuIGcuZ3JhZGU+PTk7fSkubGVuZ3RofTsKICB9CiAgZnVuY3Rpb24gbWFrZU1vZGFsKCl7CiAgICBtb2RhbD1hcHAucXVlcnlTZWxlY3RvcigiI3BoLXRyYWluZXItcHJvZmlsZS1tb2RhbCIpOwogICAgaWYobW9kYWwpe2JvZHk9bW9kYWwucXVlcnlTZWxlY3RvcigiLnBoLW1vZGFsLWJvZHkiKTt0aXRsZT1tb2RhbC5xdWVyeVNlbGVjdG9yKCIucGgtbW9kYWwtdGl0bGUiKTtyZXR1cm47fQogICAgbW9kYWw9ZWwoImRpdiIsInBoLW1vZGFsIik7bW9kYWwuaWQ9InBoLXRyYWluZXItcHJvZmlsZS1tb2RhbCI7bW9kYWwuaGlkZGVuPXRydWU7CiAgICB2YXIgYmFja2Ryb3A9ZWwoImRpdiIsInBoLW1vZGFsLWJhY2tkcm9wIik7YmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGNsb3NlUHJvZmlsZSk7bW9kYWwuYXBwZW5kQ2hpbGQoYmFja2Ryb3ApOwogICAgdmFyIHBhbmVsPWVsKCJkaXYiLCJwaC1tb2RhbC1jYXJkIHBoLW1vZGFsLXdpZGUiKTtwYW5lbC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJkaWFsb2ciKTtwYW5lbC5zZXRBdHRyaWJ1dGUoImFyaWEtbW9kYWwiLCJ0cnVlIik7cGFuZWwuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiVOG7pyB0csawbmcgYsOgeSBUcmFpbmVyIik7CiAgICB2YXIgY2xvc2U9ZWwoImJ1dHRvbiIsInBoLW1vZGFsLWNsb3NlIiwi4pyVIik7Y2xvc2UudHlwZT0iYnV0dG9uIjtjbG9zZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCLEkMOzbmcgdOG7pyB0csawbmcgYsOgeSIpO2Nsb3NlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjbG9zZVByb2ZpbGUpO3BhbmVsLmFwcGVuZENoaWxkKGNsb3NlKTsKICAgIHRpdGxlPWVsKCJkaXYiLCJwaC1tb2RhbC10aXRsZSIsIvCfkaQgVOG7piBUUsavTkcgQsOAWSBUUkFJTkVSIik7cGFuZWwuYXBwZW5kQ2hpbGQodGl0bGUpOwogICAgcGFuZWwuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLWNvbC1ub3RlIiwiSOG7kyBzxqEgc8awdSB04bqtcCBjw7RuZyBraGFpIGPhu6dhIGPhu5luZyDEkeG7k25nIHZuR2FtZS50diDCtyDEkGnhu4NtIFBTQSBsw6AgbcO0IHBo4buPbmcgdHJvbmcgUG9rZUh1Yi4iKSk7CiAgICBib2R5PWVsKCJkaXYiLCJwaC1tb2RhbC1ib2R5Iik7cGFuZWwuYXBwZW5kQ2hpbGQoYm9keSk7bW9kYWwuYXBwZW5kQ2hpbGQocGFuZWwpO2FwcC5hcHBlbmRDaGlsZChtb2RhbCk7CiAgfQogIGZ1bmN0aW9uIHNob3dNZXNzYWdlKHBhcmVudCx0ZXh0LGVycm9yKXt2YXIgbj1lbCgiZGl2IiwicGgtcHJvZmlsZS1tZXNzYWdlIisoZXJyb3I/IiBwaC1lcnJvciI6IiIpLHRleHQpO3BhcmVudC5hcHBlbmRDaGlsZChuKTtyZXR1cm4gbjt9CiAgZnVuY3Rpb24gYWRkU2FmZUltYWdlKHBhcmVudCxzcmMsYWx0KXt2YXIgc2FmZT1zYWZlSW1nU3JjKHNyYyk7aWYoIXNhZmUpe3BhcmVudC50ZXh0Q29udGVudD0i8J+OtCI7cmV0dXJuO312YXIgaW1nPWVsKCJpbWciKTtpbWcuc3JjPXNhZmU7aW1nLmFsdD1hbHR8fCJQb2vDqW1vbiBjYXJkIjtpbWcubG9hZGluZz0ibGF6eSI7aW1nLmRlY29kaW5nPSJhc3luYyI7aW1nLm9uZXJyb3I9ZnVuY3Rpb24oKXtpbWcucmVtb3ZlKCk7cGFyZW50LnRleHRDb250ZW50PSLwn460Ijt9O3BhcmVudC5hcHBlbmRDaGlsZChpbWcpO30KICBmdW5jdGlvbiBvcGVuUHJvZmlsZSh0YXJnZXRVaWQsdGFyZ2V0TmFtZSl7CiAgICBjdXJyZW50VWlkPVN0cmluZyh0YXJnZXRVaWR8fHVpZCgpKTtjdXJyZW50TmFtZT1TdHJpbmcodGFyZ2V0TmFtZXx8bmFtZSgpKS5zbGljZSgwLDgwKXx8IlRyYWluZXIiO2FjdGl2ZVRhYj0ic2hvd2Nhc2UiO3N0YXR1c1RleHQ9IiI7c3RhdHVzRXJyb3I9ZmFsc2U7CiAgICBpZighbW9kYWwpbWFrZU1vZGFsKCk7dGl0bGUudGV4dENvbnRlbnQ9Y3VycmVudFVpZD09PXVpZCgpPyLwn5GkIFThu6YgVFLGr05HIELDgFkgQ+G7pkEgQuG6oE4iOiLwn5GkIFThu6YgVFLGr05HIELDgFkgVFJBSU5FUiI7Ym9keS50ZXh0Q29udGVudD0iIjtzaG93TWVzc2FnZShib2R5LCLEkGFuZyB04bqjaSBo4buTIHPGoSBUcmFpbmVy4oCmIixmYWxzZSk7bW9kYWwuaGlkZGVuPWZhbHNlOwogICAgaWYoY3VycmVudFVpZD09PXVpZCgpKXtvcGVuT3duUHJvZmlsZSgpO3JldHVybjt9ZWxzZSBsb2FkUHVibGljUHJvZmlsZShjdXJyZW50VWlkLGN1cnJlbnROYW1lKTsKICB9CiAgZnVuY3Rpb24gY2xvc2VQcm9maWxlKCl7aWYobW9kYWwpbW9kYWwuaGlkZGVuPXRydWU7fQogIGZ1bmN0aW9uIGFkZFN0YXQoZ3JpZCx2YWx1ZSxsYWJlbCl7dmFyIGJveD1lbCgiZGl2IiwicGgtcHJvZmlsZS1zdGF0Iik7Ym94LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLXN0YXQtdiIsdmFsdWUpKTtib3guYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtc3RhdC1sIixsYWJlbCkpO2dyaWQuYXBwZW5kQ2hpbGQoYm94KTt9CiAgZnVuY3Rpb24gcmVuZGVyUHJvZmlsZURhdGEoZGF0YSxvd25lck5hbWUsb3duZXJVaWQsYWN0aXZpdHksb3duKXsKICAgIGlmKCFib2R5KXJldHVybjtib2R5LnRleHRDb250ZW50PSIiO2RhdGE9ZGF0YXx8e307dmFyIHN1bW1hcnk9ZGF0YS5zdW1tYXJ5fHx7fTt2YXIgY2FyZHM9QXJyYXkuaXNBcnJheShkYXRhLmNhcmRzKT9kYXRhLmNhcmRzOltdO3ZhciBncmFkZWQ9QXJyYXkuaXNBcnJheShkYXRhLmdyYWRlZCk/ZGF0YS5ncmFkZWQ6W107dmFyIHNldHM9QXJyYXkuaXNBcnJheShkYXRhLnNldHMpP2RhdGEuc2V0czpbXTsKICAgIHZhciBpbnRybz1lbCgiZGl2IiwicGgtcHJvZmlsZS1pbnRybyIpLGF2YXRhcj1lbCgiZGl2IiwicGgtcHJvZmlsZS1hdmF0YXIiKTthdmF0YXIudGV4dENvbnRlbnQ9IuKXiSI7aW50cm8uYXBwZW5kQ2hpbGQoYXZhdGFyKTt2YXIgY29weT1lbCgiZGl2IiwiIik7Y29weS5hcHBlbmRDaGlsZChlbCgiZGl2IiwicGgtcHJvZmlsZS1uaWNrIixvd25lck5hbWV8fGRhdGEudHJhaW5lcl9uYW1lfHwiVHJhaW5lciIpKTtjb3B5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLXN1YiIsIlZOR0FNRS5UViDCtyBUUkFJTkVSIENPTExFQ1RJT04gwrcgIisob3duPyJI4buTIHPGoSBj4bunYSBi4bqhbiI6Ikjhu5Mgc8ahIGPDtG5nIGtoYWkiKSkpO2NvcHkuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtc3ViIiwiVUlEIHLDunQgZ+G7jW46ICIrU3RyaW5nKG93bmVyVWlkfHwiIikuc2xpY2UoMCw4KSsi4oCmIikpO2ludHJvLmFwcGVuZENoaWxkKGNvcHkpO2JvZHkuYXBwZW5kQ2hpbGQoaW50cm8pOwogICAgdmFyIHN0YXRzPWVsKCJkaXYiLCJwaC1wcm9maWxlLXN0YXRzIik7YWRkU3RhdChzdGF0cyxOdW1iZXIoc3VtbWFyeS5wYWNrcyl8fDAsIlBhY2sgxJHDoyBt4bufIik7YWRkU3RhdChzdGF0cyxOdW1iZXIoc3VtbWFyeS51bmlxdWVfY2FyZHMpfHwwLCJDYXJkIMSR4buZYyBuaOG6pXQiKTthZGRTdGF0KHN0YXRzLE51bWJlcihzdW1tYXJ5LnBzYTEwKXx8MCwiUFNBIDEwIik7YWRkU3RhdChzdGF0cyxOdW1iZXIoc3VtbWFyeS5zZXRzX2NvbGxlY3RlZCl8fHNldHMubGVuZ3RoLCJTZXQgxJHDoyBzxrB1IHThuq1wIik7Ym9keS5hcHBlbmRDaGlsZChzdGF0cyk7CiAgICBpZihvd24pe3ZhciBjb250cm9scz1lbCgiZGl2IiwicGgtcHJvZmlsZS1jb250cm9scyIpLGxhYmVsPWVsKCJsYWJlbCIsInBoLXByb2ZpbGUtcHJpdmFjeSIpLGNoZWNrPWVsKCJpbnB1dCIpO2NoZWNrLnR5cGU9ImNoZWNrYm94IjtjaGVjay5jaGVja2VkPWlzUHVibGljKCk7bGFiZWwuYXBwZW5kQ2hpbGQoY2hlY2spO2xhYmVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgQ8O0bmcga2hhaSBo4buTIHPGoSBuw6B5IGNobyBuZ8aw4budaSBi4bqlbSB2w6BvIG5pY2tuYW1lIGPhu6dhIGLhuqFuIHRyw6puIEJYSCIpKTtjb250cm9scy5hcHBlbmRDaGlsZChsYWJlbCk7dmFyIHB1Ymxpc2g9ZWwoImJ1dHRvbiIsInBoLWJ0biBwaC1wcmltYXJ5IHBoLXNtYWxsIiwi4oa7IEPhuq1wIG5o4bqtdCB04bunIHRyxrBuZyBiw6B5Iik7cHVibGlzaC50eXBlPSJidXR0b24iO3B1Ymxpc2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYoIWNoZWNrLmNoZWNrZWQpe3Nob3dNZXNzYWdlKGJvZHksIkjDo3kgYuG6rXQgY8O0bmcga2hhaSB0csaw4bubYyBraGkgxJHhu5NuZyBi4buZIHThu6cgdHLGsG5nIGLDoHkuIix0cnVlKTtyZXR1cm47fXNldExTKFBVQkxJQ19LRVksIjEiKTtwdWJsaXNoLmRpc2FibGVkPXRydWU7cHVibGlzaC50ZXh0Q29udGVudD0ixJBhbmcgxJHhu5NuZyBi4buZ4oCmIjtwdWJsaXNoUHJvZmlsZSgpLnRoZW4oZnVuY3Rpb24oKXtwdWJsaXNoLmRpc2FibGVkPWZhbHNlO3B1Ymxpc2gudGV4dENvbnRlbnQ9IuKGuyBD4bqtcCBuaOG6rXQgdOG7pyB0csawbmcgYsOgeSI7c3RhdHVzVGV4dD0iVOG7pyB0csawbmcgYsOgeSDEkcOjIMSRxrDhu6NjIMSR4buTbmcgYuG7mS4iO3JlbmRlck93blByb2ZpbGUoKTt9KS5jYXRjaChmdW5jdGlvbihlcnIpe3B1Ymxpc2guZGlzYWJsZWQ9ZmFsc2U7cHVibGlzaC50ZXh0Q29udGVudD0i4oa7IEPhuq1wIG5o4bqtdCB04bunIHRyxrBuZyBiw6B5IjtzdGF0dXNUZXh0PSJLaMO0bmcgxJHhu5NuZyBi4buZIMSRxrDhu6NjOiAiK1N0cmluZyhlcnIubWVzc2FnZXx8ZXJyKTtzdGF0dXNFcnJvcj10cnVlO3JlbmRlck93blByb2ZpbGUoKTt9KTt9KTtjb250cm9scy5hcHBlbmRDaGlsZChwdWJsaXNoKTtib2R5LmFwcGVuZENoaWxkKGNvbnRyb2xzKTtjaGVjay5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7aWYoY2hlY2suY2hlY2tlZCl7c2V0TFMoUFVCTElDX0tFWSwiMSIpO3N0YXR1c1RleHQ9IsSQYW5nIGLhuq10IGPDtG5nIGtoYWkgdsOgIMSR4buTbmcgYuG7mSBo4buTIHPGoeKApiI7c3RhdHVzRXJyb3I9ZmFsc2U7cHVibGlzaFByb2ZpbGUoKS50aGVuKGZ1bmN0aW9uKCl7c3RhdHVzVGV4dD0iSOG7kyBzxqEgxJHDoyBjw7RuZyBraGFpLiI7c3RhdHVzRXJyb3I9ZmFsc2U7cmVuZGVyT3duUHJvZmlsZSgpO30pLmNhdGNoKGZ1bmN0aW9uKGVycil7c2V0TFMoUFVCTElDX0tFWSwiMCIpO3N0YXR1c1RleHQ9IkNoxrBhIGLhuq10IMSRxrDhu6NjIGPDtG5nIGtoYWk6ICIrU3RyaW5nKGVyci5tZXNzYWdlfHxlcnIpO3N0YXR1c0Vycm9yPXRydWU7cmVuZGVyT3duUHJvZmlsZSgpO30pO31lbHNle3NldExTKFBVQkxJQ19LRVksIjAiKTtzdGF0dXNUZXh0PSLEkGFuZyB04bqvdCBjw7RuZyBraGFp4oCmIjtzdGF0dXNFcnJvcj1mYWxzZTt1bnB1Ymxpc2hQcm9maWxlKCkudGhlbihmdW5jdGlvbigpe3N0YXR1c1RleHQ9IsSQw6MgdOG6r3QgY8O0bmcga2hhaS4gTmfGsOG7nWkga2jDoWMga2jDtG5nIGPDsm4geGVtIMSRxrDhu6NjIGjhu5Mgc8ahIG7DoHkuIjtyZW5kZXJPd25Qcm9maWxlKCk7fSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtzdGF0dXNUZXh0PSLEkMOjIHThuq90IHRyw6puIHRyw6xuaCBkdXnhu4d0LCBuaMawbmcgY2jGsGEgY+G6rXAgbmjhuq10IMSRxrDhu6NjIG3DoXkgY2jhu6c6ICIrU3RyaW5nKGVyci5tZXNzYWdlfHxlcnIpO3N0YXR1c0Vycm9yPXRydWU7cmVuZGVyT3duUHJvZmlsZSgpO30pO319KTt9CiAgICBpZihzdGF0dXNUZXh0KXNob3dNZXNzYWdlKGJvZHksc3RhdHVzVGV4dCxzdGF0dXNFcnJvcik7CiAgICB2YXIgdGFicz1lbCgiZGl2IiwicGgtcHJvZmlsZS10YWJzIik7W3tpZDoic2hvd2Nhc2UiLGxhYmVsOiLinKggVOG7pyBjYXJkIn0se2lkOiJwc2EiLGxhYmVsOiLwn5KOIELhu5kgc8awdSB04bqtcCBQU0EifSx7aWQ6InNldHMiLGxhYmVsOiLwn5OmIELhu5kvc2V0IMSRw6MgbeG7nyJ9LHtpZDoic3RhdHMiLGxhYmVsOiLwn5OKIFRow6BuaCB0w61jaCJ9XS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBiPWVsKCJidXR0b24iLCJwaC1wcm9maWxlLXRhYiIrKGFjdGl2ZVRhYj09PW8uaWQ/IiBwaC1pcy1hY3RpdmUiOiIiKSxvLmxhYmVsKTtiLnR5cGU9ImJ1dHRvbiI7Yi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXthY3RpdmVUYWI9by5pZDtyZW5kZXJQcm9maWxlRGF0YShkYXRhLG93bmVyTmFtZSxvd25lclVpZCxhY3Rpdml0eSxvd24pO30pO3RhYnMuYXBwZW5kQ2hpbGQoYik7fSk7Ym9keS5hcHBlbmRDaGlsZCh0YWJzKTsKICAgIGlmKGFjdGl2ZVRhYj09PSJzaG93Y2FzZSIpewogICAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLXN1YmhlYWQiLCLinKggQ2FyZCBu4buVaSBi4bqtdCB0cm9uZyB04bunIHRyxrBuZyBiw6B5IikpO3ZhciBncmlkPWVsKCJkaXYiLCJwaC1wcm9maWxlLWNhcmQtZ3JpZCIpO2NhcmRzLnNsaWNlKDAsMjQpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGNhcmQ9ZWwoImFydGljbGUiLCJwaC1wcm9maWxlLWNhcmQiKSxhcnQ9ZWwoImRpdiIsInBoLXByb2ZpbGUtY2FyZC1hcnQiKTthZGRTYWZlSW1hZ2UoYXJ0LGMuaW1nLGMubmFtZSk7Y2FyZC5hcHBlbmRDaGlsZChhcnQpO2NhcmQuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtY2FyZC1uYW1lIixjLm5hbWUpKTtjYXJkLmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLWNhcmQtbWV0YSIsW2Muc2V0LGMucmFyaXR5LCJ4IisoTnVtYmVyKGMuY291bnQpfHwxKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiDCtyAiKSkpO2NhcmQuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtY2FyZC1tZXRhIixjLnByaWNlIT1udWxsPyJHacOhIHRoYW0ga2jhuqNvICIrbW9uZXkoYy5wcmljZSk6IkNoxrBhIGPDsyBnacOhIHRoYW0ga2jhuqNvIikpO2dyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7fSk7aWYoIWNhcmRzLmxlbmd0aClib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLWVtcHR5IiwiVOG7pyBjYXJkIGNoxrBhIGPDsyBk4buvIGxp4buHdSBjw7RuZyBraGFpLiBDaOG7pyBUcmFpbmVyIGPhuqduIG3hu58gcGFjayB2w6AgYuG6rXQgY8O0bmcga2hhaSBo4buTIHPGoS4iKSk7ZWxzZSBib2R5LmFwcGVuZENoaWxkKGdyaWQpOwogICAgfWVsc2UgaWYoYWN0aXZlVGFiPT09InBzYSIpewogICAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLXN1YmhlYWQiLCLwn5KOIFBTQSBHcmFkaW5nIExhYiDCtyDEkGnhu4NtIG3DtCBwaOG7j25nIikpO3ZhciBncmlkUD1lbCgiZGl2IiwicGgtcHJvZmlsZS1jYXJkLWdyaWQiKTtncmFkZWQuc2xpY2UoMCwzNikuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgY2FyZD1lbCgiYXJ0aWNsZSIsInBoLXByb2ZpbGUtY2FyZCIpLGFydD1lbCgiZGl2IiwicGgtcHJvZmlsZS1jYXJkLWFydCIpO2FkZFNhZmVJbWFnZShhcnQsYy5pbWcsYy5uYW1lKTtjYXJkLmFwcGVuZENoaWxkKGFydCk7Y2FyZC5hcHBlbmRDaGlsZChlbCgiZGl2IiwicGgtcHJvZmlsZS1jYXJkLW5hbWUiLGMubmFtZSkpO2NhcmQuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtY2FyZC1tZXRhIixbYy5zZXQsYy5yYXJpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCIgwrcgIil8fCJQb2vDqW1vbiBUQ0ciKSk7Y2FyZC5hcHBlbmRDaGlsZChlbCgic3BhbiIsInBoLXByb2ZpbGUtZ3JhZGUiLCJQU0EgIitjLmdyYWRlKyhOdW1iZXIoYy5ncmFkZSk9PT0xMD8iIMK3IEdFTSBNSU5UIjoiIikpKTtncmlkUC5hcHBlbmRDaGlsZChjYXJkKTt9KTtpZighZ3JhZGVkLmxlbmd0aClib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLWVtcHR5IiwiVHJhaW5lciBjaMawYSBjw7MgdGjhursgUFNBIG3DtCBwaOG7j25nIGPDtG5nIGtoYWkuIikpO2Vsc2UgYm9keS5hcHBlbmRDaGlsZChncmlkUCk7CiAgICB9ZWxzZSBpZihhY3RpdmVUYWI9PT0ic2V0cyIpewogICAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLXN1YmhlYWQiLCLwn5OmIEzhu4tjaCBz4butIG3hu58gcGFjayB2w6Agc2V0IHPGsHUgdOG6rXAiKSk7dmFyIGhpc3Q9ZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeSIpOyhBcnJheS5pc0FycmF5KGFjdGl2aXR5KT9hY3Rpdml0eTpbXSkuc2xpY2UoMCwzMCkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcm93PWVsKCJkaXYiLCJwaC1wcm9maWxlLWhpc3Rvcnktcm93IiksbGVmdD1lbCgiZGl2IiwiIik7bGVmdC5hcHBlbmRDaGlsZChlbCgiZGl2IiwicGgtcHJvZmlsZS1oaXN0b3J5LXRpdGxlIixTdHJpbmcoYS5zZXRfbmFtZXx8IkLhu5kgcGFjayAobMaw4bujdCBt4bufIGPFqSkiKSkpO2xlZnQuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeS1tZXRhIixuZXcgRGF0ZShhLmNyZWF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCJ2aS1WTiIpKyIgwrcgIisoTnVtYmVyKGEucGFja19jb3VudCl8fDEpKyIgcGFjayDCtyAiKyhOdW1iZXIoYS5jYXJkX2NvdW50KXx8MCkrIiBjYXJkIikpO3Jvdy5hcHBlbmRDaGlsZChsZWZ0KTtyb3cuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeS12YWx1ZSIsbW9uZXkoTnVtYmVyKGEuY2FyZF92YWx1ZV90b3RhbCl8fDApKSk7aGlzdC5hcHBlbmRDaGlsZChyb3cpO30pO2lmKGhpc3QuY2hpbGRyZW4ubGVuZ3RoKWJvZHkuYXBwZW5kQ2hpbGQoaGlzdCk7ZWxzZSBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLWVtcHR5IiwiQ2jGsGEgY8OzIGzhu4tjaCBz4butIHRoZW8gdOG7q25nIHNldC4gU2F1IGtoaSBjaOG6oXkgU1FMIG3hu5tpLCBsxrDhu6N0IG3hu58gcGFjayB0aeG6v3AgdGhlbyBz4bq9IGLhuq90IMSR4bqndSDEkcaw4bujYyBnaGkgdGhlbyBi4buZLiIpKTtib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLXN1YmhlYWQiLCJC4buZIHRo4bq7IMSRw6Mgc8awdSB04bqtcCIpKTt2YXIgc2V0c0dyaWQ9ZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeSIpO3NldHMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgcm93PWVsKCJkaXYiLCJwaC1wcm9maWxlLWhpc3Rvcnktcm93IiksbGVmdD1lbCgiZGl2IiwiIik7bGVmdC5hcHBlbmRDaGlsZChlbCgiZGl2IiwicGgtcHJvZmlsZS1oaXN0b3J5LXRpdGxlIixzLm5hbWV8fHMuaWR8fCJQb2vDqW1vbiBUQ0cgc2V0IikpO2xlZnQuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeS1tZXRhIiwoTnVtYmVyKHMudW5pcXVlKXx8MCkrIiBjYXJkIMSR4buZYyBuaOG6pXQgdHJvbmcgc2V0IikpO3Jvdy5hcHBlbmRDaGlsZChsZWZ0KTtyb3cuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeS12YWx1ZSIsKE51bWJlcihzLmNhcmRzKXx8MCkrIiBsw6EiKSk7c2V0c0dyaWQuYXBwZW5kQ2hpbGQocm93KTt9KTtpZihzZXRzR3JpZC5jaGlsZHJlbi5sZW5ndGgpYm9keS5hcHBlbmRDaGlsZChzZXRzR3JpZCk7CiAgICB9ZWxzZXsKICAgICAgdmFyIGRldGFpbHM9ZWwoImRpdiIsInBoLXByb2ZpbGUtaGlzdG9yeSIpO1tbIlThu5VuZyBnacOhIHRy4buLIGNvbGxlY3Rpb24iLG1vbmV5KHN1bW1hcnkudG90YWxfdmFsdWUpXSwgWyJDaGkgcGjDrSBtw7QgcGjhu49uZyIsbW9uZXkoc3VtbWFyeS5zcGVudCldLCBbIlJPSSBtw7QgcGjhu49uZyIsKE51bWJlcihzdW1tYXJ5LnJvaV9wY3QpfHwwKS50b0ZpeGVkKDEpKyIlIl0sWyJDYXJkIGPDsyBi4bqjbiBzYW8iLE51bWJlcihzdW1tYXJ5LmNhcmRzKXx8MF0sWyJQU0EgOSB0cuG7nyBsw6puIixOdW1iZXIoc3VtbWFyeS5wc2E5cGx1cyl8fDBdLFsiU+G7kSB0aOG6uyDEkcOjIGNo4bqlbSIsZ3JhZGVkLmxlbmd0aF1dLmZvckVhY2goZnVuY3Rpb24ocCl7dmFyIHJvdz1lbCgiZGl2IiwicGgtcHJvZmlsZS1oaXN0b3J5LXJvdyIpO3Jvdy5hcHBlbmRDaGlsZChlbCgiZGl2IiwicGgtcHJvZmlsZS1oaXN0b3J5LXRpdGxlIixwWzBdKSk7cm93LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLWhpc3RvcnktdmFsdWUiLHBbMV0pKTtkZXRhaWxzLmFwcGVuZENoaWxkKHJvdyk7fSk7Ym9keS5hcHBlbmRDaGlsZChkZXRhaWxzKTsKICAgIH0KICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoImRpdiIsInBoLXByb2ZpbGUtZm9vdCIsIkdpw6EgdGjhursgbMOgIGdpw6EgdGhhbSBraOG6o28gdHJvbmcgc2ltdWxhdG9yLCBraMO0bmcgcGjhuqNpIGdpw6EgYsOhbiDEkcaw4bujYyDEkeG6o20gYuG6o28uIFBTQSB0cm9uZyBQb2tlSHViIGzDoCBtw7QgcGjhu49uZywga2jDtG5nIHBo4bqjaSBjaOG7qW5nIG5o4bqtbiBQU0EgdGjhuq10LiBDaOG7iSBuaOG7r25nIFRyYWluZXIgxJHDoyBi4bqtdCBjw7RuZyBraGFpIG3hu5tpIHh14bqldCBoaeG7h24gdHLDqm4gaOG7kyBzxqEgY+G7mW5nIMSR4buTbmcuIikpOwogIH0KICBmdW5jdGlvbiBidWlsZFBheWxvYWQoKXt2YXIgbG9jYWw9bG9jYWxTbmFwc2hvdCgpO3JldHVybiB7dmVyc2lvbjoxLHRyYWluZXJfbmFtZTpuYW1lKCkscHVibGlzaGVkX2F0Om5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxzdW1tYXJ5OntwYWNrczpsb2NhbC5wYWNrcyxjYXJkczpsb2NhbC5jYXJkcyx1bmlxdWVfY2FyZHM6bG9jYWwudW5pcXVlX2NhcmRzLHNldHNfY29sbGVjdGVkOmxvY2FsLnNldHNfY29sbGVjdGVkLHRvdGFsX3ZhbHVlOmxvY2FsLnRvdGFsX3ZhbHVlLHNwZW50OmxvY2FsLnNwZW50LHJvaV9wY3Q6bG9jYWwucm9pX3BjdCxwc2ExMDpsb2NhbC5wc2ExMCxwc2E5cGx1czpsb2NhbC5wc2E5cGx1c30sY2FyZHM6bG9jYWwuY2FyZHNfbGlzdCxncmFkZWQ6bG9jYWwuZ3JhZGVkLHNldHM6bG9jYWwuc2V0c307fQogIGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hQcm9maWxlKCl7CiAgICB2YXIgaWQ9dWlkKCk7aWYoIWlkKXRocm93IG5ldyBFcnJvcigiQ2jGsGEgY8OzIFVJRCBUcmFpbmVyLiBIw6N5IHThuqFvIG5pY2tuYW1lIHLhu5NpIHRo4butIGzhuqFpLiIpO3ZhciBjPWF3YWl0IGNyZWF0ZUNsaWVudCgpO3ZhciBkYXRhPWJ1aWxkUGF5bG9hZCgpOwogICAgdmFyIHJlc3VsdD1hd2FpdCBjLmZyb20oUFJPRklMRV9UQUJMRSkudXBzZXJ0KHt1aWQ6aWQsdHJhaW5lcl9uYW1lOm5hbWUoKSxpc19wdWJsaWM6dHJ1ZSxwcm9maWxlX2RhdGE6ZGF0YSxwYWNrczpOdW1iZXIoZGF0YS5zdW1tYXJ5LnBhY2tzKXx8MCxjYXJkczpOdW1iZXIoZGF0YS5zdW1tYXJ5LmNhcmRzKXx8MCx1bmlxdWVfY2FyZHM6TnVtYmVyKGRhdGEuc3VtbWFyeS51bmlxdWVfY2FyZHMpfHwwLHNldHNfY29sbGVjdGVkOk51bWJlcihkYXRhLnN1bW1hcnkuc2V0c19jb2xsZWN0ZWQpfHwwLHRvdGFsX3ZhbHVlOk51bWJlcihkYXRhLnN1bW1hcnkudG90YWxfdmFsdWUpfHwwLHVwZGF0ZWRfYXQ6bmV3IERhdGUoKS50b0lTT1N0cmluZygpfSx7b25Db25mbGljdDoidWlkIn0pOwogICAgaWYocmVzdWx0LmVycm9yKXRocm93IHJlc3VsdC5lcnJvcjtyZXR1cm4gdHJ1ZTsKICB9CiAgYXN5bmMgZnVuY3Rpb24gdW5wdWJsaXNoUHJvZmlsZSgpe3ZhciBpZD11aWQoKTtpZighaWQpdGhyb3cgbmV3IEVycm9yKCJLaMO0bmcgdMOsbSB0aOG6pXkgVUlEIFRyYWluZXIgdHLDqm4gdHLDrG5oIGR1eeG7h3QuIik7dmFyIGM9YXdhaXQgY3JlYXRlQ2xpZW50KCk7LyogVjggcmVwYWlyOiBkbyBub3QgVVBTRVJUIHdoZW4gdHVybmluZyBwcml2YWN5IG9mZjsgcHJlc2VydmUgdGhlIHNhdmVkIHNuYXBzaG90IGFuZCB1cGRhdGUgb25seSBpdHMgdmlzaWJpbGl0eS4gKi92YXIgcmVzdWx0PWF3YWl0IGMuZnJvbShQUk9GSUxFX1RBQkxFKS51cGRhdGUoe2lzX3B1YmxpYzpmYWxzZSx1cGRhdGVkX2F0Om5ldyBEYXRlKCkudG9JU09TdHJpbmcoKX0pLmVxKCJ1aWQiLGlkKTtpZihyZXN1bHQuZXJyb3IpdGhyb3cgcmVzdWx0LmVycm9yO30KICBhc3luYyBmdW5jdGlvbiBsb2FkQWN0aXZpdHlGb3JVaWQodGFyZ2V0VWlkKXsKICAgIHZhciBjPWF3YWl0IGNyZWF0ZUNsaWVudCgpOwogICAgdmFyIHJlc3VsdD1hd2FpdCBjLmZyb20oQUNUSVZJVFlfVEFCTEUpLnNlbGVjdCgiaWQsdWlkLHRyYWluZXJfbmFtZSxwYWNrX2NvdW50LHBhY2tfcHJpY2UsY2FyZF9jb3VudCxjYXJkX3ZhbHVlX3RvdGFsLHNldF9pZCxzZXRfbmFtZSxjcmVhdGVkX2F0IikuZXEoInVpZCIsdGFyZ2V0VWlkKS5vcmRlcigiY3JlYXRlZF9hdCIse2FzY2VuZGluZzpmYWxzZX0pLmxpbWl0KDMwKTsKICAgIGlmKHJlc3VsdC5lcnJvcil0aHJvdyByZXN1bHQuZXJyb3I7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXN1bHQuZGF0YSk/cmVzdWx0LmRhdGE6W107CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGxvYWRQdWJsaWNQcm9maWxlKHRhcmdldFVpZCx0YXJnZXROYW1lKXsKICAgIHRyeXt2YXIgYz1hd2FpdCBjcmVhdGVDbGllbnQoKTt2YXIgcmVzPWF3YWl0IGMuZnJvbShQUk9GSUxFX1RBQkxFKS5zZWxlY3QoInVpZCx0cmFpbmVyX25hbWUsaXNfcHVibGljLHByb2ZpbGVfZGF0YSxwYWNrcyxjYXJkcyx1bmlxdWVfY2FyZHMsc2V0c19jb2xsZWN0ZWQsdG90YWxfdmFsdWUsdXBkYXRlZF9hdCIpLmVxKCJ1aWQiLHRhcmdldFVpZCkuZXEoImlzX3B1YmxpYyIsdHJ1ZSkubWF5YmVTaW5nbGUoKTtpZihyZXMuZXJyb3IpdGhyb3cgcmVzLmVycm9yO2lmKCFyZXMuZGF0YXx8cmVzLmRhdGEuaXNfcHVibGljIT09dHJ1ZSl7Ym9keS50ZXh0Q29udGVudD0iIjtib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCJwaC1wcm9maWxlLWVtcHR5Iiwi8J+UkiBUcmFpbmVyIG7DoHkgY2jGsGEgYuG6rXQgaOG7kyBzxqEgY8O0bmcga2hhaS4gSMOjeSBxdWF5IGzhuqFpIEJYSCB2w6AgY2jhu41uIG3hu5l0IG5nxrDhu51pIGNoxqFpIGtow6FjLiIpKTtyZXR1cm47fQogICAgICB2YXIgZGF0YT1yZXMuZGF0YS5wcm9maWxlX2RhdGEmJnR5cGVvZiByZXMuZGF0YS5wcm9maWxlX2RhdGE9PT0ib2JqZWN0Ij9yZXMuZGF0YS5wcm9maWxlX2RhdGE6e307aWYoIWRhdGEuc3VtbWFyeSlkYXRhLnN1bW1hcnk9e307ZGF0YS5zdW1tYXJ5LnBhY2tzPU51bWJlcihkYXRhLnN1bW1hcnkucGFja3MhPW51bGw/ZGF0YS5zdW1tYXJ5LnBhY2tzOnJlcy5kYXRhLnBhY2tzKXx8MDtkYXRhLnN1bW1hcnkuY2FyZHM9TnVtYmVyKGRhdGEuc3VtbWFyeS5jYXJkcyE9bnVsbD9kYXRhLnN1bW1hcnkuY2FyZHM6cmVzLmRhdGEuY2FyZHMpfHwwO2RhdGEuc3VtbWFyeS51bmlxdWVfY2FyZHM9TnVtYmVyKGRhdGEuc3VtbWFyeS51bmlxdWVfY2FyZHMhPW51bGw/ZGF0YS5zdW1tYXJ5LnVuaXF1ZV9jYXJkczpyZXMuZGF0YS51bmlxdWVfY2FyZHMpfHwwO2RhdGEuc3VtbWFyeS5zZXRzX2NvbGxlY3RlZD1OdW1iZXIoZGF0YS5zdW1tYXJ5LnNldHNfY29sbGVjdGVkIT1udWxsP2RhdGEuc3VtbWFyeS5zZXRzX2NvbGxlY3RlZDpyZXMuZGF0YS5zZXRzX2NvbGxlY3RlZCl8fDA7ZGF0YS5zdW1tYXJ5LnRvdGFsX3ZhbHVlPU51bWJlcihkYXRhLnN1bW1hcnkudG90YWxfdmFsdWUhPW51bGw/ZGF0YS5zdW1tYXJ5LnRvdGFsX3ZhbHVlOnJlcy5kYXRhLnRvdGFsX3ZhbHVlKXx8MDsKICAgICAgdmFyIGFjdGl2aXR5PVtdO3RyeXthY3Rpdml0eT1hd2FpdCBsb2FkQWN0aXZpdHlGb3JVaWQodGFyZ2V0VWlkKTt9Y2F0Y2goZSl7Y29uc29sZS53YXJuKCJbVHJhaW5lciBQcm9maWxlXSBLaMO0bmcgdOG6o2kgxJHGsOG7o2MgbOG7i2NoIHPhu60gcGFjayB0aGVvIHNldDoiLGUpO30KICAgICAgcmVuZGVyUHJvZmlsZURhdGEoZGF0YSxyZXMuZGF0YS50cmFpbmVyX25hbWV8fHRhcmdldE5hbWUsdGFyZ2V0VWlkLGFjdGl2aXR5LGZhbHNlKTsKICAgIH1jYXRjaChlcnIpe2JvZHkudGV4dENvbnRlbnQ9IiI7c2hvd01lc3NhZ2UoYm9keSwiS2jDtG5nIHThuqNpIMSRxrDhu6NjIGjhu5Mgc8ahOiAiK1N0cmluZyhlcnImJmVyci5tZXNzYWdlfHxlcnIpKyIuIEjDo3kga2nhu4NtIHRyYSBTUUwgdHJhaW5lcl9wcm9maWxlcyB2w6AgcXV54buBbiBTdXBhYmFzZS4iLHRydWUpO30KICB9CiAgZnVuY3Rpb24gcmVuZGVyT3duUHJvZmlsZSgpe3ZhciBkYXRhPWJ1aWxkUGF5bG9hZCgpO3JlbmRlclByb2ZpbGVEYXRhKGRhdGEsbmFtZSgpLHVpZCgpLGxhc3RBY3Rpdml0eSx0cnVlKTt9CiAgYXN5bmMgZnVuY3Rpb24gb3Blbk93blByb2ZpbGUoKXtjdXJyZW50VWlkPXVpZCgpO2N1cnJlbnROYW1lPW5hbWUoKTthY3RpdmVUYWI9InNob3djYXNlIjtzdGF0dXNUZXh0PSIiO3N0YXR1c0Vycm9yPWZhbHNlO2xhc3RBY3Rpdml0eT1bXTtpZighbW9kYWwpbWFrZU1vZGFsKCk7dGl0bGUudGV4dENvbnRlbnQ9IvCfkaQgVOG7piBUUsavTkcgQsOAWSBD4bumQSBC4bqgTiI7Ym9keS50ZXh0Q29udGVudD0iIjttb2RhbC5oaWRkZW49ZmFsc2U7cmVuZGVyT3duUHJvZmlsZSgpO2xvYWRBY3Rpdml0eUZvclVpZChjdXJyZW50VWlkKS50aGVuKGZ1bmN0aW9uKHJvd3Mpe2xhc3RBY3Rpdml0eT1yb3dzO2lmKG1vZGFsJiYhbW9kYWwuaGlkZGVuJiZjdXJyZW50VWlkPT09dWlkKCkpcmVuZGVyT3duUHJvZmlsZSgpO30pLmNhdGNoKGZ1bmN0aW9uKGVycil7Y29uc29sZS53YXJuKCJbVHJhaW5lciBQcm9maWxlXSBLaMO0bmcgdOG6o2kgxJHGsOG7o2MgbOG7i2NoIHPhu60gcGFjayBj4bunYSBi4bqhbjoiLGVycik7fSk7aWYoaXNQdWJsaWMoKSl7dHJ5e2F3YWl0IHB1Ymxpc2hQcm9maWxlKCk7c3RhdHVzVGV4dD0iSOG7kyBzxqEgxJFhbmcgY8O0bmcga2hhaSDCtyDEkcOjIMSR4buTbmcgYuG7mSBn4bqnbiBuaOG6pXQuIjtzdGF0dXNFcnJvcj1mYWxzZTtyZW5kZXJPd25Qcm9maWxlKCk7fWNhdGNoKGVycil7c3RhdHVzVGV4dD0iSOG7kyBzxqEgYuG6rXQgY8O0bmcga2hhaSB0csOqbiB0aGnhur90IGLhu4sgbmjGsG5nIGNoxrBhIMSR4buTbmcgYuG7mSDEkcaw4bujYyBtw6F5IGNo4bunOiAiK1N0cmluZyhlcnIubWVzc2FnZXx8ZXJyKTtzdGF0dXNFcnJvcj10cnVlO3JlbmRlck93blByb2ZpbGUoKTt9fX0KICBmdW5jdGlvbiBhZGRCdXR0b24oKXsKICAgIGlmKCFhcHApcmV0dXJuIGZhbHNlOwogICAgdmFyIHRvb2xzPWFwcC5xdWVyeVNlbGVjdG9yKCIucGgtdG9vbHMiKTsKICAgIGlmKCF0b29scylyZXR1cm4gZmFsc2U7CiAgICBidXR0b249YXBwLnF1ZXJ5U2VsZWN0b3IoIiNwaC1wcm9maWxlLWJ0biIpOwogICAgaWYoIWJ1dHRvbil7CiAgICAgIGJ1dHRvbj1lbCgiYnV0dG9uIiwicGgtdG9vbCBwaC1wcm9maWxlLXRvb2wiKTtidXR0b24uaWQ9InBoLXByb2ZpbGUtYnRuIjtidXR0b24udHlwZT0iYnV0dG9uIjsKICAgICAgYnV0dG9uLnRpdGxlPSJN4bufIGjhu5Mgc8ahIHbDoCB04bunIHRyxrBuZyBiw6B5IFRyYWluZXIiOwogICAgICBidXR0b24uYXBwZW5kQ2hpbGQoZWwoInNwYW4iLCIiLCLwn5GkIikpO2J1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIFThu6cgdHLGsG5nIGLDoHkiKSk7CiAgICAgIHZhciBwc2E9dG9vbHMucXVlcnlTZWxlY3RvcigiI3BoLXBzYS1idG4iKSxjb2w9dG9vbHMucXVlcnlTZWxlY3RvcigiI3BoLWNvbC1idG4iKTsKICAgICAgaWYocHNhKXBzYS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixidXR0b24pO2Vsc2UgaWYoY29sKWNvbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixidXR0b24pO2Vsc2UgdG9vbHMuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgIH0KICAgIC8qIFY5OiBvcGVuIG9uIHBvaW50ZXJkb3duIGFzIHdlbGwgYXMgY2xpY2suIFRoZSBvbGQgY2FwdHVyZSBsaXN0ZW5lciBtYXkgc3dhbGxvdyBjbGljayBldmVudHMKICAgICAgIGluIHNvbWUgV29yZFByZXNzL0NlcmlzIGxheW91dHMuIFBvaW50ZXJkb3duIGZpcmVzIGZpcnN0LCBzbyB0aGUgVUkgc3RpbGwgb3BlbnMuICovCiAgICBpZihidXR0b24uZGF0YXNldC5waFByb2ZpbGVQb2ludGVyQm91bmRWOSE9PSIxIil7CiAgICAgIGJ1dHRvbi5kYXRhc2V0LnBoUHJvZmlsZVBvaW50ZXJCb3VuZFY5PSIxIjsKICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixmdW5jdGlvbihldmVudCl7CiAgICAgICAgaWYoZXZlbnQuYnV0dG9uIT09dW5kZWZpbmVkICYmIGV2ZW50LmJ1dHRvbiE9PTApcmV0dXJuOwogICAgICAgIHZhciBvd25lcj1idXR0b24uY2xvc2VzdD9idXR0b24uY2xvc2VzdCgiI3Bva2VodWItYXBwIik6bnVsbDsKICAgICAgICBpZihvd25lcilhcHA9b3duZXI7CiAgICAgICAgYnV0dG9uLmRhdGFzZXQucGhQcm9maWxlUG9pbnRlclN0YW1wPVN0cmluZyhEYXRlLm5vdygpKTsKICAgICAgICBoYW5kbGVPd25Qcm9maWxlUmVxdWVzdChldmVudCk7CiAgICAgIH0se2NhcHR1cmU6dHJ1ZSxwYXNzaXZlOmZhbHNlfSk7CiAgICB9CiAgICAvKiBDbGljayBoYW5kbGluZyBsaXZlcyBvbiBkb2N1bWVudCBjYXB0dXJlIGJlbG93OyBXb3JkUHJlc3MvdGhlbWUgaGFuZGxlcnMgY2Fubm90IHN3YWxsb3cgaXQuICovCiAgICBidXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLWhhc3BvcHVwIiwiZGlhbG9nIik7CiAgICBidXR0b24uc2V0QXR0cmlidXRlKCJhcmlhLWNvbnRyb2xzIiwicGgtdHJhaW5lci1wcm9maWxlLW1vZGFsIik7CiAgICBidXR0b24uc3R5bGUucG9pbnRlckV2ZW50cz0iYXV0byI7CiAgICBidXR0b24uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjsKICAgIGJ1dHRvbi5zdHlsZS56SW5kZXg9IjUwMSI7CiAgICBidXR0b24uc3R5bGUudG91Y2hBY3Rpb249Im1hbmlwdWxhdGlvbiI7CiAgICBidXR0b24uc2V0QXR0cmlidXRlKCJkYXRhLXBoLXByb2ZpbGUtYm91bmQiLCIxIik7CiAgICAvKiBEaXJlY3QgaGFuZGxlciBpcyB0aGUgZmFsbGJhY2sgaWYgYSB0aGVtZS9wbHVnaW4gaW50ZXJmZXJlcyB3aXRoIGRlbGVnYXRlZCBjbGljay4gKi8KICAgIGlmKGJ1dHRvbi5kYXRhc2V0LnBoUHJvZmlsZURpcmVjdEJvdW5kIT09IjEiKXsKICAgICAgYnV0dG9uLmRhdGFzZXQucGhQcm9maWxlRGlyZWN0Qm91bmQ9IjEiOwogICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICB2YXIgb3duZXI9YnV0dG9uLmNsb3Nlc3Q/YnV0dG9uLmNsb3Nlc3QoIiNwb2tlaHViLWFwcCIpOm51bGw7CiAgICAgICAgaWYob3duZXIpYXBwPW93bmVyOwogICAgICAgIGhhbmRsZU93blByb2ZpbGVSZXF1ZXN0KGV2ZW50KTsKICAgICAgfSxmYWxzZSk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gaGFuZGxlTGVhZGVyYm9hcmRDbGljayhldmVudCl7CiAgICB2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldCYmZXZlbnQudGFyZ2V0LmNsb3Nlc3Q/ZXZlbnQudGFyZ2V0LmNsb3Nlc3QoIi5waC1sYi1wcm9maWxlLWxpbmtbZGF0YS1waC1wcm9maWxlLXVpZF0iKTpudWxsOwogICAgaWYoIXRhcmdldHx8IWFwcC5jb250YWlucyh0YXJnZXQpKXJldHVybjsKICAgIHZhciBpZD1TdHJpbmcodGFyZ2V0LmRhdGFzZXQucGhQcm9maWxlVWlkfHwiIik7aWYoIWlkKXJldHVybjsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7dHJ5e29wZW5Qcm9maWxlKGlkLHRhcmdldC5kYXRhc2V0LnBoUHJvZmlsZU5hbWV8fHRhcmdldC50ZXh0Q29udGVudHx8IlRyYWluZXIiKTt9Y2F0Y2goZXJyKXtzaG93UHJvZmlsZU9wZW5FcnJvcihlcnIpO30KICB9CiAgZnVuY3Rpb24gc3luY1B1YmxpY1Byb2ZpbGUoKXtpZighaXNQdWJsaWMoKXx8IXVpZCgpKXJldHVybjtwdWJsaXNoUHJvZmlsZSgpLnRoZW4oZnVuY3Rpb24oKXtpZihtb2RhbCYmIW1vZGFsLmhpZGRlbiYmY3VycmVudFVpZD09PXVpZCgpKXtzdGF0dXNUZXh0PSJU4bunIHRyxrBuZyBiw6B5IMSRw6MgdOG7sSDEkeG7k25nIGLhu5kuIjtzdGF0dXNFcnJvcj1mYWxzZTtyZW5kZXJPd25Qcm9maWxlKCk7fX0pLmNhdGNoKGZ1bmN0aW9uKGVycil7Y29uc29sZS53YXJuKCJbVHJhaW5lciBQcm9maWxlXSBLaMO0bmcgxJHhu5NuZyBi4buZIMSRxrDhu6NjIHThu6cgdHLGsG5nIGLDoHk6IixlcnIpO2lmKG1vZGFsJiYhbW9kYWwuaGlkZGVuJiZjdXJyZW50VWlkPT09dWlkKCkpe3N0YXR1c1RleHQ9IkNoxrBhIMSR4buTbmcgYuG7mSDEkcaw4bujYyB04bunIHRyxrBuZyBiw6B5OiAiK1N0cmluZyhlcnIubWVzc2FnZXx8ZXJyKTtzdGF0dXNFcnJvcj10cnVlO3JlbmRlck93blByb2ZpbGUoKTt9fSk7fQogIGZ1bmN0aW9uIGhvb2tQU0EoKXsKICAgIGlmKHR5cGVvZiB3aW5kb3cuX19wb2tlaHViUmVjb3JkUFNBR3JhZGUhPT0iZnVuY3Rpb24iKXJldHVybiBmYWxzZTsKICAgIGlmKHdpbmRvdy5fX3Bva2VodWJSZWNvcmRQU0FHcmFkZS5fX3BoVHJhaW5lclByb2ZpbGVIb29rKXtib3VuZFBTQT10cnVlO3JldHVybiB0cnVlO30KICAgIGlmKGJvdW5kUFNBKXJldHVybiB0cnVlOwogICAgdmFyIG9yaWdpbmFsPXdpbmRvdy5fX3Bva2VodWJSZWNvcmRQU0FHcmFkZTsKICAgIHZhciB3cmFwcGVkPWZ1bmN0aW9uKGVudHJ5KXt2YXIgcmVzdWx0PW9yaWdpbmFsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtzZXRUaW1lb3V0KHN5bmNQdWJsaWNQcm9maWxlLDUwMCk7cmV0dXJuIHJlc3VsdDt9OwogICAgd3JhcHBlZC5fX3BoVHJhaW5lclByb2ZpbGVIb29rPXRydWU7d2luZG93Ll9fcG9rZWh1YlJlY29yZFBTQUdyYWRlPXdyYXBwZWQ7Ym91bmRQU0E9dHJ1ZTtyZXR1cm4gdHJ1ZTsKICB9CiAgLyogVGhlIHBhY2tlZCB3aWRnZXQgc3RhcnRzIGJlZm9yZSBzb21lIGFkZC1vbiBzY3JpcHRzLiBSZXRyeSBQU0EgYmluZGluZyBhZnRlciB0aGV5IGluaXRpYWxpc2UuICovCiAgdmFyIHBzYUhvb2tBdHRlbXB0cz0wOwogIHZhciBwc2FIb29rUmV0cnk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtwc2FIb29rQXR0ZW1wdHMrKztpZihob29rUFNBKCl8fHBzYUhvb2tBdHRlbXB0cz49MTIwKWNsZWFySW50ZXJ2YWwocHNhSG9va1JldHJ5KTt9LDI1MCk7CiAgZnVuY3Rpb24gYm9vdCgpewogICAgYXBwPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJwb2tlaHViLWFwcCIpOwogICAgaWYoIWFwcClyZXR1cm4gZmFsc2U7CiAgICAvKiBEbyBub3QgcmVwb3J0IGEgc3VjY2Vzc2Z1bCBib290IHVudGlsIHRoZSB0b29sYmFyIGV4aXN0cyBhbmQgdGhlIGJ1dHRvbiBpcyBib3VuZC4gKi8KICAgIGlmKCFhZGRCdXR0b24oKSlyZXR1cm4gZmFsc2U7CiAgICBtYWtlTW9kYWwoKTsKICAgIGlmKGFwcC5kYXRhc2V0LnBoUHJvZmlsZURlbGVnYXRlZCE9PSIxIil7CiAgICAgIGFwcC5kYXRhc2V0LnBoUHJvZmlsZURlbGVnYXRlZD0iMSI7CiAgICAgIC8qIExpc3RlbiBhdCBhcHAgbGV2ZWwgYmVjYXVzZSB0aGUgbGVhZGVyYm9hcmQgYm9keSBpcyBkeW5hbWljYWxseSByZS1yZW5kZXJlZC4gKi8KICAgICAgYXBwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixoYW5kbGVMZWFkZXJib2FyZENsaWNrLHRydWUpOwogICAgICBhcHAuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoKGUua2V5PT09IkVudGVyInx8ZS5rZXk9PT0iICIpJiZlLnRhcmdldCYmZS50YXJnZXQuY2xhc3NMaXN0JiZlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInBoLWxiLXByb2ZpbGUtbGluayIpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtoYW5kbGVMZWFkZXJib2FyZENsaWNrKGUpOwogICAgICAgIH0KICAgICAgfSx0cnVlKTsKICAgIH0KICAgIGhvb2tQU0EoKTsKICAgIHJldHVybiB0cnVlOwogIH0KICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9rZWh1YjpwYWNrcy1yZWNvcmRlZCIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHN5bmNQdWJsaWNQcm9maWxlLDgwMCk7fSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBva2VodWI6Y29sbGVjdGlvbi1jaGFuZ2VkIixmdW5jdGlvbigpe3NldFRpbWVvdXQoc3luY1B1YmxpY1Byb2ZpbGUsNDAwKTt9KTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsZnVuY3Rpb24oZSl7aWYoZS5rZXk9PT1DT0xMRUNUSU9OX0tFWXx8ZS5rZXk9PT1QU0FfS0VZfHxlLmtleT09PU5BTUVfS0VZKXtpZihpc1B1YmxpYygpKXNldFRpbWVvdXQoc3luY1B1YmxpY1Byb2ZpbGUsNDAwKTt9fSk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7aWYoZS5rZXk9PT0iRXNjYXBlIiYmbW9kYWwmJiFtb2RhbC5oaWRkZW4pY2xvc2VQcm9maWxlKCk7fSk7CiAgZnVuY3Rpb24gc2hvd1Byb2ZpbGVPcGVuRXJyb3IoZXJyKXsKICAgIHRyeXsKICAgICAgaWYoIWFwcClhcHA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBva2VodWItYXBwIik7CiAgICAgIGlmKCFhcHApcmV0dXJuOwogICAgICBpZighbW9kYWwpbWFrZU1vZGFsKCk7CiAgICAgIGlmKHRpdGxlKXRpdGxlLnRleHRDb250ZW50PSLimqAgS0jDlE5HIE3hu54gxJDGr+G7okMgVOG7piBUUsavTkcgQsOAWSI7CiAgICAgIGlmKGJvZHkpe2JvZHkudGV4dENvbnRlbnQ9IiI7c2hvd01lc3NhZ2UoYm9keSwiQ8OzIGzhu5dpIGtoaSBt4bufIGjhu5Mgc8ahIFRyYWluZXI6ICIrU3RyaW5nKGVyciYmZXJyLm1lc3NhZ2V8fGVycnx8Iktow7RuZyByw7UgbOG7l2kiKSx0cnVlKTt9CiAgICAgIGlmKG1vZGFsKW1vZGFsLmhpZGRlbj1mYWxzZTsKICAgICAgY29uc29sZS5lcnJvcigiW1RyYWluZXIgUHJvZmlsZV0gS2jDtG5nIG3hu58gxJHGsOG7o2MgaOG7kyBzxqE6IixlcnIpOwogICAgfWNhdGNoKHJlbmRlckVycm9yKXtjb25zb2xlLmVycm9yKCJbVHJhaW5lciBQcm9maWxlXSBLaMO0bmcgdGjhu4MgaGnhu4NuIHRo4buLIGzhu5dpIGjhu5Mgc8ahOiIscmVuZGVyRXJyb3IpO30KICB9CiAgZnVuY3Rpb24gaGFuZGxlT3duUHJvZmlsZVJlcXVlc3QoZXZlbnQpewogICAgaWYoZXZlbnQpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7aWYoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKWV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO30KICAgIGlmKCF1aWQoKSl7CiAgICAgIHZhciB3ZWxjb21lPWFwcCYmYXBwLnF1ZXJ5U2VsZWN0b3IoIiNwaC13ZWxjb21lLW1vZGFsIik7CiAgICAgIGlmKHdlbGNvbWUpe3dlbGNvbWUuaGlkZGVuPWZhbHNlO3dlbGNvbWUuc3R5bGUuZGlzcGxheT0iZmxleCI7dmFyIGlucD13ZWxjb21lLnF1ZXJ5U2VsZWN0b3IoIiNwaC10cmFpbmVyLW5hbWUiKTtpZihpbnApe3RyeXtpbnAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6dHJ1ZX0pO31jYXRjaChlKXtpbnAuZm9jdXMoKTt9fXJldHVybjt9CiAgICB9CiAgICB0cnl7UHJvbWlzZS5yZXNvbHZlKG9wZW5Pd25Qcm9maWxlKCkpLmNhdGNoKHNob3dQcm9maWxlT3BlbkVycm9yKTt9Y2F0Y2goZXJyKXtzaG93UHJvZmlsZU9wZW5FcnJvcihlcnIpO30KICB9CiAgZnVuY3Rpb24gaGFuZGxlRG9jdW1lbnRQcm9maWxlQ2xpY2tzKGV2ZW50KXsKICAgIHZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0JiZldmVudC50YXJnZXQuY2xvc2VzdD9ldmVudC50YXJnZXQuY2xvc2VzdCgiI3BoLXByb2ZpbGUtYnRuIik6bnVsbDsKICAgIGlmKHRhcmdldCl7CiAgICAgIHZhciBwb2ludGVyU3RhbXA9TnVtYmVyKHRhcmdldC5kYXRhc2V0LnBoUHJvZmlsZVBvaW50ZXJTdGFtcHx8MCk7CiAgICAgIGlmKHBvaW50ZXJTdGFtcCAmJiBEYXRlLm5vdygpLXBvaW50ZXJTdGFtcDwxNTAwKXsKICAgICAgICBkZWxldGUgdGFyZ2V0LmRhdGFzZXQucGhQcm9maWxlUG9pbnRlclN0YW1wOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7aWYoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKWV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgdGFyZ2V0Um9vdD10YXJnZXQuY2xvc2VzdD90YXJnZXQuY2xvc2VzdCgiI3Bva2VodWItYXBwIik6bnVsbDsKICAgICAgaWYodGFyZ2V0Um9vdCl7YXBwPXRhcmdldFJvb3Q7aGFuZGxlT3duUHJvZmlsZVJlcXVlc3QoZXZlbnQpO3JldHVybjt9CiAgICB9CiAgICB2YXIgcGxheWVyPWV2ZW50LnRhcmdldCYmZXZlbnQudGFyZ2V0LmNsb3Nlc3Q/ZXZlbnQudGFyZ2V0LmNsb3Nlc3QoIi5waC1sYi1wcm9maWxlLWxpbmtbZGF0YS1waC1wcm9maWxlLXVpZF0iKTpudWxsOwogICAgaWYocGxheWVyKXsKICAgICAgdmFyIHBsYXllclJvb3Q9cGxheWVyLmNsb3Nlc3Q/cGxheWVyLmNsb3Nlc3QoIiNwb2tlaHViLWFwcCIpOm51bGw7CiAgICAgIGlmKHBsYXllclJvb3QpYXBwPXBsYXllclJvb3Q7CiAgICAgIGlmKCFhcHB8fCFhcHAuY29udGFpbnMocGxheWVyKSlyZXR1cm47CiAgICAgIHZhciB0YXJnZXRVaWQ9U3RyaW5nKHBsYXllci5kYXRhc2V0LnBoUHJvZmlsZVVpZHx8IiIpLnRyaW0oKTsKICAgICAgaWYoIXRhcmdldFVpZCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtpZihldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7cmV0dXJuO30KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtpZihldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgIHRyeXtvcGVuUHJvZmlsZSh0YXJnZXRVaWQscGxheWVyLmRhdGFzZXQucGhQcm9maWxlTmFtZXx8cGxheWVyLnRleHRDb250ZW50fHwiVHJhaW5lciIpO31jYXRjaChlcnIpe3Nob3dQcm9maWxlT3BlbkVycm9yKGVycik7fQogICAgfQogIH0KICAvKiBDYXB0dXJlIGF0IGRvY3VtZW50IGxldmVsOiB3b3JrcyBmb3Igc3RhdGljIGNvbnRyb2xzIGFuZCBkeW5hbWljYWxseS1yZW5kZXJlZCBsZWFkZXJib2FyZCByb3dzLiAqLwogIGlmKCF3aW5kb3cuX19waFRyYWluZXJQcm9maWxlRG9jdW1lbnRDbGlja1Y5KXsKICAgIHdpbmRvdy5fX3BoVHJhaW5lclByb2ZpbGVEb2N1bWVudENsaWNrVjk9dHJ1ZTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixoYW5kbGVEb2N1bWVudFByb2ZpbGVDbGlja3MsdHJ1ZSk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihldmVudCl7CiAgICAgIGlmKChldmVudC5rZXk9PT0iRW50ZXIifHxldmVudC5rZXk9PT0iICIpJiZldmVudC50YXJnZXQmJmV2ZW50LnRhcmdldC5jbG9zZXN0KXsKICAgICAgICB2YXIgcGxheWVyPWV2ZW50LnRhcmdldC5jbG9zZXN0KCIucGgtbGItcHJvZmlsZS1saW5rW2RhdGEtcGgtcHJvZmlsZS11aWRdIik7CiAgICAgICAgaWYocGxheWVyKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2hhbmRsZURvY3VtZW50UHJvZmlsZUNsaWNrcyhldmVudCk7fQogICAgICB9CiAgICB9LHRydWUpOwogIH0KICBmdW5jdGlvbiBzdGFydEJvb3RPYnNlcnZlcigpewogICAgaWYoYm9vdCgpKXJldHVybjsKICAgIGlmKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpewogICAgICB2YXIgb2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtpZihib290KCkpb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO30pOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx7Y2hpbGRMaXN0OnRydWUsc3VidHJlZTp0cnVlfSk7CiAgICAgIC8qIEF2b2lkIGxlYXZpbmcgYW4gb2JzZXJ2ZXIgYXR0YWNoZWQgZm9yZXZlciBpZiB0aGlzIHdpZGdldCBpcyByZW1vdmVkIGZyb20gdGhlIHBhZ2UuICovCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsZnVuY3Rpb24oKXtvYnNlcnZlci5kaXNjb25uZWN0KCk7fSx7b25jZTp0cnVlfSk7CiAgICB9ZWxzZXsKICAgICAgdmFyIHRyaWVzPTAsdD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RyaWVzKys7aWYoYm9vdCgpfHx0cmllcz4yNDApY2xlYXJJbnRlcnZhbCh0KTt9LDI1MCk7CiAgICB9CiAgfQogIGlmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0ibG9hZGluZyIpZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsc3RhcnRCb290T2JzZXJ2ZXIse29uY2U6dHJ1ZX0pOwogIHN0YXJ0Qm9vdE9ic2VydmVyKCk7Cn0pKCk7Cg==</script>
<script>eval(decodeURIComponent(escape(atob(document.currentScript.previousElementSibling.textContent))))</script>

<!-- ============================================================
     ADD-ON: SUPABASE GLOBAL LEADERBOARD
     Không sửa code gốc phía trên.
     Bảng Supabase mặc định: public.leaderboard
     Cột dùng:
       uid text/uuid UNIQUE PRIMARY KEY
       name text
       packs integer
       cards integer
       unique_cards integer
       best_tier integer
       best_value numeric
       updated_at timestamptz
     ============================================================ -->



<style id="ph-live-pull-feed-css">
#pokehub-app .ph-lb-trainer-badges{display:flex;flex-wrap:wrap;gap:4px;margin:5px 0 7px;align-items:center;}
#pokehub-app .ph-lb-trainer-badges-compact{gap:3px;margin:3px 0 4px;}
#pokehub-app .ph-lb-trainer-badge{display:inline-flex;align-items:center;gap:3px;padding:3px 6px;border-radius:999px;border:1px solid rgba(255,211,92,.28);background:rgba(255,211,92,.075);color:#f4df9e;font-size:9px;line-height:1.15;font-weight:800;letter-spacing:.01em;white-space:nowrap;}
#pokehub-app .ph-lb-trainer-badges-compact .ph-lb-trainer-badge{font-size:8px;padding:2px 5px;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-crown{border-color:rgba(255,211,92,.5);background:linear-gradient(100deg,rgba(255,211,92,.18),rgba(255,211,92,.06));color:#ffe274;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-rare{border-color:rgba(255,143,208,.3);background:rgba(255,143,208,.08);color:#ffafe0;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-set{border-color:rgba(107,232,192,.3);background:rgba(107,232,192,.07);color:#9ff8d3;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-master{border-color:rgba(150,178,255,.35);background:rgba(100,139,255,.09);color:#b5c8ff;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-pack{border-color:rgba(255,184,116,.3);background:rgba(255,184,116,.08);color:#ffd0a3;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-shiny{border-color:rgba(201,107,255,.36);background:rgba(201,107,255,.09);color:#e4b3ff;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-pro{border-color:rgba(107,232,192,.26);color:#a3f6d5;}
#pokehub-app .ph-lb-trainer-badge.ph-badge-rookie{border-color:rgba(160,165,177,.24);background:rgba(160,165,177,.05);color:#c1c3cc;}
#pokehub-app .ph-lb-feed{margin:14px 0 18px;padding:14px;border:1px solid rgba(255,211,92,.24);border-radius:13px;background:radial-gradient(ellipse at 0% 0%,rgba(255,211,92,.07),transparent 52%),rgba(8,10,15,.62);}
#pokehub-app .ph-lb-feed .ph-lb-section-head{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-bottom:10px;}
#pokehub-app .ph-lb-feed .ph-lb-section-title{font-size:14px;}
#pokehub-app .ph-lb-feed-status{margin-left:auto;display:inline-flex;align-items:center;border:1px solid rgba(255,211,92,.24);border-radius:999px;padding:4px 7px;color:#b8ac7a;font-size:8px;font-weight:900;letter-spacing:.06em;white-space:nowrap;}
#pokehub-app .ph-lb-feed-status.ph-feed-live{border-color:rgba(107,232,192,.35);background:rgba(107,232,192,.07);color:#8ef6c2;}
#pokehub-app .ph-lb-feed-list{display:flex;flex-direction:column;gap:8px;}
#pokehub-app .ph-lb-feed-item{display:grid;grid-template-columns:64px minmax(0,1fr);gap:10px;align-items:center;min-width:0;padding:9px;border:1px solid rgba(255,255,255,.065);border-radius:10px;background:rgba(255,255,255,.018);}
#pokehub-app .ph-lb-feed-card-art{width:64px;aspect-ratio:245/337;display:flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid rgba(255,211,92,.24);border-radius:7px;background:#171923;color:#b8a968;font-size:21px;}
#pokehub-app .ph-lb-feed-card-art img{display:block;width:100%;height:100%;object-fit:cover;}
#pokehub-app .ph-lb-feed-card-art.ph-lb-feed-art-fallback{background:linear-gradient(145deg,#262318,#11131b);}
#pokehub-app .ph-lb-feed-copy{min-width:0;}
#pokehub-app .ph-lb-feed-trainerline{display:flex;align-items:center;gap:7px;min-width:0;}
#pokehub-app .ph-lb-feed-avatar{width:27px;height:27px;flex:0 0 27px;margin:0;border-width:1px;}
#pokehub-app .ph-lb-feed-trainertext{min-width:0;}
#pokehub-app .ph-lb-feed-name{color:#f3e7bd;font-size:11px;font-weight:900;line-height:1.3;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-feed-trainertext .ph-lb-trainer-badges{margin:2px 0 0;}
#pokehub-app .ph-lb-feed-pulled{margin-top:5px;color:#b9b6a8;font-size:10px;line-height:1.45;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-feed-card-name{color:#fff0b6;font-size:11px;font-weight:900;}
#pokehub-app .ph-lb-feed-meta{margin-top:3px;color:#8f918e;font-size:9px;line-height:1.4;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-feed-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;}
#pokehub-app .ph-lb-feed-price{color:#83ffc1;font-size:11px;font-weight:900;font-variant-numeric:tabular-nums;}
#pokehub-app .ph-lb-feed-time{color:#88877f;font-size:8px;white-space:nowrap;}
#pokehub-app .ph-lb-feed-empty{padding:13px 11px;border:1px dashed rgba(255,211,92,.2);border-radius:9px;background:rgba(255,211,92,.025);color:#b6b09b;font-size:10px;line-height:1.55;}
#pokehub-app .ph-lb-feed-caption{margin-top:8px;color:#777970;font-size:8px;line-height:1.5;}
#pokehub-app .ph-lb-feed-more-wrap{display:flex;justify-content:center;gap:8px;flex-wrap:wrap;margin-top:10px;}
#pokehub-app .ph-lb-feed-collapse{border-color:rgba(148,151,196,.28);background:rgba(148,151,196,.055);color:#c0c2d5;}
#pokehub-app .ph-lb-feed-collapse:hover{border-color:rgba(255,211,92,.45);background:rgba(255,211,92,.08);}
#pokehub-app .ph-lb-feed-more{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:9px 15px;border:1px solid rgba(255,211,92,.42);border-radius:9px;background:linear-gradient(135deg,rgba(255,211,92,.12),rgba(255,211,92,.035));color:#ffe39a;font:inherit;font-size:11px;font-weight:800;cursor:pointer;transition:background .15s ease,border-color .15s ease,transform .15s ease;}
#pokehub-app .ph-lb-feed-more:hover{border-color:#ffd35c;background:rgba(255,211,92,.16);transform:translateY(-1px);}
#pokehub-app .ph-lb-feed-more:focus-visible{outline:2px solid #ffd35c;outline-offset:3px;}
#pokehub-app .ph-lb-feed-all-shown{margin-top:9px;text-align:center;color:#8ef6c2;font-size:9px;}
@media(max-width:420px){
 #pokehub-app .ph-lb-feed{padding:10px;}
 #pokehub-app .ph-lb-feed-item{grid-template-columns:54px minmax(0,1fr);gap:8px;padding:7px;}
 #pokehub-app .ph-lb-feed-card-art{width:54px;}
 #pokehub-app .ph-lb-feed-name{font-size:10px;}
 #pokehub-app .ph-lb-feed-card-name{font-size:10px;}
 #pokehub-app .ph-lb-feed .ph-lb-section-title{font-size:12px;}
}
</style>

<!-- vnGame.tv: đếm động số bộ đang thực sự được render -->
<script>
(function(){
  "use strict";
  var countNodes = document.querySelectorAll(".ph-brand-set-count");
  var grid = document.getElementById("ph-exp-grid");
  if (!countNodes.length || !grid) return;

  function updateSetCount(){
    var count = grid.querySelectorAll(":scope > .ph-exp-card").length;
    if (count > 0){
      countNodes.forEach(function(node){
        node.textContent = String(count) + " bộ đang khả dụng";
      });
    }
  }

  updateSetCount();
  if (window.MutationObserver){
    var observer = new MutationObserver(updateSetCount);
    observer.observe(grid, {childList:true});
  }
})();
</script>

<style>
/* ============================================================
   PokeHub REAL BOOSTER PACK — Vietnamese UI
   Visual-only layer. Existing JS/API/pull/collection logic stays intact.
   The pack uses real set artwork already available to the widget:
   30th key visual for M6A, then the selected set's first card artwork,
   with the real set logo layered on top when available.
   ============================================================ */
#pokehub-app .ph-stage{min-height:500px;position:relative;}
#pokehub-app .ph-pack{
  width:214px;height:322px;border-radius:18px;position:relative;overflow:hidden;
  cursor:pointer;isolation:isolate;
  background:
    radial-gradient(130px 180px at 50% 50%,rgba(65,155,255,.16),transparent 70%),
    linear-gradient(145deg,#283650 0%,#0d1424 47%,#0a1020 100%);
  border:1px solid rgba(210,228,255,.58);
  box-shadow:
    0 28px 55px rgba(0,0,0,.58),
    0 0 0 1px rgba(255,214,102,.22),
    0 0 42px rgba(36,145,255,.15);
  transform:translateZ(0);
  animation:ph-real-float 3.2s ease-in-out infinite;
  transition:transform .22s ease,filter .22s ease,box-shadow .22s ease;
}
#pokehub-app .ph-pack:hover{
  transform:translateY(-5px) scale(1.02);
  box-shadow:0 34px 64px rgba(0,0,0,.64),0 0 0 1px rgba(255,214,102,.38),0 0 58px rgba(36,145,255,.22);
}
#pokehub-app .ph-pack::before{
  content:'';position:absolute;left:7px;right:7px;top:8px;height:24px;z-index:8;
  border-radius:9px 9px 7px 7px;
  background:
    repeating-linear-gradient(90deg,rgba(255,255,255,.42) 0 2px,rgba(155,171,193,.18) 2px 5px),
    linear-gradient(180deg,#eef4f9,#9eaaba 44%,#737f90 55%,#dbe4eb);
  border:1px solid rgba(255,255,255,.68);
  box-shadow:inset 0 2px 3px rgba(255,255,255,.58),0 3px 8px rgba(0,0,0,.32);
  pointer-events:none;
}
#pokehub-app .ph-pack::after{
  content:'';position:absolute;inset:0;z-index:7;pointer-events:none;border-radius:inherit;
  background:
    linear-gradient(115deg,transparent 31%,rgba(255,255,255,.18) 43%,transparent 55%),
    repeating-linear-gradient(118deg,rgba(255,255,255,.06) 0 1px,transparent 1px 12px),
    linear-gradient(180deg,transparent 67%,rgba(0,0,0,.36) 100%);
  mix-blend-mode:screen;
}
#pokehub-app .ph-pack-art{
  position:absolute;left:9px;right:9px;top:34px;bottom:45px;z-index:1;
  width:calc(100% - 18px);height:calc(100% - 79px);
  object-fit:cover;object-position:center 38%;display:none;
  border-radius:13px 13px 9px 9px;
  filter:saturate(1.08) contrast(1.02) brightness(.93);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.2),0 5px 18px rgba(0,0,0,.32);
  pointer-events:none;
}
#pokehub-app .ph-pack-art-shade{
  position:absolute;left:9px;right:9px;top:34px;bottom:45px;z-index:2;
  border-radius:13px 13px 9px 9px;pointer-events:none;
  background:
    linear-gradient(180deg,rgba(3,7,18,.06),rgba(3,7,18,.02) 34%,rgba(3,7,18,.64) 100%),
    radial-gradient(90px 90px at 50% 52%,transparent 0,rgba(3,7,18,.13) 74%,rgba(3,7,18,.38) 100%);
}
#pokehub-app .ph-pack-logo{
  position:absolute;left:50%;top:44%;transform:translate(-50%,-50%);z-index:4;
  max-width:82%;max-height:84px;width:auto;height:auto;object-fit:contain;
  filter:drop-shadow(0 5px 10px rgba(0,0,0,.65));display:none;
  pointer-events:none;
}
#pokehub-app .ph-pack-label{
  position:absolute;left:18px;right:18px;bottom:38px;z-index:5;
  display:flex;align-items:center;justify-content:center;min-height:48px;padding:8px 10px;
  border:1px solid rgba(255,255,255,.25);border-radius:11px;
  background:linear-gradient(180deg,rgba(6,11,22,.22),rgba(4,8,17,.84));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 7px 18px rgba(0,0,0,.24);
  color:#fff;font-family:'Space Grotesk',system-ui,sans-serif;font-weight:900;font-size:16px;
  line-height:1.15;text-align:center;text-shadow:0 2px 7px rgba(0,0,0,.8);
  pointer-events:none;
}
#pokehub-app .ph-pack-series{
  position:absolute;left:14px;right:14px;bottom:10px;z-index:6;
  color:rgba(245,248,255,.84);font-size:8px;font-weight:800;letter-spacing:.18em;
  text-align:center;text-transform:uppercase;text-shadow:0 1px 4px rgba(0,0,0,.8);
  pointer-events:none;
}
#pokehub-app .ph-pack-seal{display:none;}
#pokehub-app .ph-pack-shine{
  position:absolute;inset:-15%;z-index:9;pointer-events:none;opacity:.12;
  background:linear-gradient(115deg,transparent 35%,rgba(255,255,255,.86) 50%,transparent 65%);
  transform:translateX(-70%) rotate(8deg);animation:ph-pack-shine-idle 4.2s ease-in-out infinite;
}
#pokehub-app .ph-pack.ph-pack-is-30th .ph-pack-art{object-position:center 42%;filter:saturate(1.04) contrast(1.04) brightness(.92);}
#pokehub-app .ph-pack.ph-pack-is-30th .ph-pack-label{
  border-color:rgba(255,214,102,.48);
  background:linear-gradient(180deg,rgba(31,24,7,.18),rgba(8,10,16,.86));
}
#pokehub-app .ph-pack.ph-ripping{
  animation:ph-real-rip .62s cubic-bezier(.18,.78,.2,1) forwards;
}
#pokehub-app .ph-pack.ph-ripping .ph-pack-shine{animation:ph-pack-open-shine .5s ease-out forwards;}
@keyframes ph-real-float{0%,100%{transform:translateY(0) rotate(0deg);}50%{transform:translateY(-7px) rotate(.35deg);}}
@keyframes ph-pack-shine-idle{0%,72%,100%{transform:translateX(-70%) rotate(8deg);opacity:0;}80%{transform:translateX(35%) rotate(8deg);opacity:.13;}90%{transform:translateX(115%) rotate(8deg);opacity:0;}}
@keyframes ph-pack-open-shine{0%{transform:translateX(-70%) rotate(8deg);opacity:0;}38%{transform:translateX(-10%) rotate(8deg);opacity:.85;}100%{transform:translateX(120%) rotate(8deg);opacity:0;}}
@keyframes ph-real-rip{
  0%{transform:translateY(0) scale(1) rotate(0deg);filter:brightness(1);}
  18%{transform:translateY(-2px) scale(1.015) rotate(-1deg);filter:brightness(1.08);}
  34%{transform:translateY(1px) scale(1.03) rotate(1.2deg);filter:brightness(1.16);}
  52%{transform:translateY(-3px) scale(1.08) rotate(-1.5deg);filter:brightness(1.45);}
  72%{transform:translateY(-5px) scale(1.15) rotate(1.2deg);filter:brightness(1.85) saturate(1.12);}
  100%{transform:translateY(-10px) scale(1.48) rotate(-3deg);opacity:0;filter:brightness(2.7) saturate(1.18);}
}
#pokehub-app .ph-hint{margin-top:30px;font-size:13px;color:#9fb4d6;}
#pokehub-app .ph-box-row{margin-top:20px;}
#pokehub-app .ph-chip{background:rgba(8,16,31,.84);border-color:rgba(117,164,227,.34);box-shadow:inset 0 1px 0 rgba(255,255,255,.04);}
#pokehub-app .ph-chip-hot{border-color:rgba(255,214,102,.7);box-shadow:0 0 18px rgba(255,214,102,.1);}
@media (max-width:520px){
  #pokehub-app .ph-pack{width:184px;height:276px;}
  #pokehub-app .ph-pack-art{top:31px;bottom:42px;height:calc(100% - 73px);}
  #pokehub-app .ph-pack-art-shade{top:31px;bottom:42px;}
  #pokehub-app .ph-pack-label{left:14px;right:14px;bottom:34px;font-size:13px;min-height:42px;}
  #pokehub-app .ph-pack-series{font-size:7px;bottom:9px;}
}
</style>


<style>
/* ============================================================
   PATCH: REAL BOOSTER COVER — KHÔNG DÙNG HÌNH POKEMON CARD LÀM MẶT PACK
   Giữ nguyên logic/API/click/pull; chỉ thay lớp hình ảnh mặt pack.
   Pack dùng chính TÊN BỘ làm cover, giống thẻ set ở màn hình ngoài.
   ============================================================ */
#pokehub-app .ph-pack-art,
#pokehub-app .ph-pack-art-shade,
#pokehub-app .ph-pack-logo{
  display:none !important;
}

#pokehub-app .ph-pack{
  background:
    radial-gradient(180px 145px at 50% 42%,color-mix(in srgb,var(--ph-c1) 30%,transparent),transparent 72%),
    radial-gradient(150px 130px at 78% 78%,color-mix(in srgb,var(--ph-c2) 22%,transparent),transparent 70%),
    linear-gradient(145deg,#2a3850 0%,#101827 48%,#09101d 100%);
}

#pokehub-app .ph-pack-label{
  left:10px !important;
  right:10px !important;
  top:72px !important;
  bottom:42px !important;
  min-height:0 !important;
  padding:72px 18px 62px !important;
  border:1px solid rgba(255,255,255,.30) !important;
  border-radius:15px !important;
  background:
    linear-gradient(135deg,rgba(17,28,48,.96),rgba(7,13,25,.95)),
    repeating-linear-gradient(118deg,rgba(255,255,255,.05) 0 2px,transparent 2px 13px) !important;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.10),
    inset 0 0 0 1px rgba(76,184,255,.08),
    0 10px 22px rgba(0,0,0,.28) !important;
  color:#fff !important;
  font-size:24px !important;
  font-weight:900 !important;
  letter-spacing:-.02em !important;
  line-height:1.06 !important;
  text-align:center !important;
  text-shadow:0 3px 10px rgba(0,0,0,.88),0 0 18px rgba(91,202,255,.18) !important;
  overflow:hidden !important;
  pointer-events:none !important;
}

#pokehub-app .ph-pack-label::before{
  content:'POKÉMON TRADING CARD GAME' !important;
  position:absolute;
  top:16px;
  left:14px;
  right:14px;
  padding-bottom:10px;
  border-bottom:1px solid rgba(255,255,255,.14);
  color:rgba(244,248,255,.72);
  font-family:system-ui,-apple-system,'Segoe UI',sans-serif;
  font-size:8px;
  font-weight:900;
  letter-spacing:.20em;
  line-height:1.2;
  text-align:center;
  white-space:nowrap;
}

#pokehub-app .ph-pack-label::after{
  content:'BOOSTER PACK' !important;
  position:absolute;
  left:14px;
  right:14px;
  bottom:16px;
  padding-top:9px;
  border-top:1px solid rgba(255,255,255,.14);
  color:#ffd866;
  font-family:system-ui,-apple-system,'Segoe UI',sans-serif;
  font-size:8px;
  font-weight:900;
  letter-spacing:.22em;
  line-height:1.2;
  text-align:center;
}

#pokehub-app .ph-pack-series{
  bottom:24px !important;
  font-size:7px !important;
  letter-spacing:.16em !important;
  color:rgba(245,248,255,.58) !important;
}

#pokehub-app .ph-pack.ph-pack-is-30th .ph-pack-label{
  background:
    radial-gradient(150px 100px at 50% 16%,rgba(255,215,90,.16),transparent 72%),
    linear-gradient(135deg,rgba(34,29,12,.97),rgba(9,11,17,.96)) !important;
  border-color:rgba(255,214,102,.46) !important;
}

@media (max-width:520px){
  #pokehub-app .ph-pack-label{
    top:58px !important;
    bottom:40px !important;
    padding:62px 14px 55px !important;
    font-size:19px !important;
  }
}
</style>


<!-- ============================================================
     PATCH: dùng ĐÚNG ảnh bìa đã hiển thị ở thẻ bộ bên ngoài
     cho pack mở bên trong. Không thay logic/API/pull.
     ============================================================ -->
<style>
#pokehub-app .ph-pack-cover-clone{
  position:absolute !important;
  inset:0 !important;
  width:100% !important;
  height:100% !important;
  margin:0 !important;
  padding:0 !important;
  clip-path:none !important;
  border-radius:inherit !important;
  overflow:hidden !important;
  z-index:1 !important;
  background:#0a1020 !important;
}
#pokehub-app .ph-pack-cover-clone::before,
#pokehub-app .ph-pack-cover-clone::after{
  display:none !important;
}
#pokehub-app .ph-pack-cover-clone .ph-art-bg{
  position:absolute !important;
  inset:0 !important;
  width:100% !important;
  height:100% !important;
  object-fit:cover !important;
  object-position:center !important;
  display:block !important;
  filter:none !important;
  border:0 !important;
  border-radius:inherit !important;
}
#pokehub-app .ph-pack-cover-clone .ph-art-logo{
  position:absolute !important;
  left:50% !important;
  top:48% !important;
  transform:translate(-50%,-50%) !important;
  z-index:3 !important;
  max-width:84% !important;
  max-height:38% !important;
  width:auto !important;
  height:auto !important;
  object-fit:contain !important;
  display:block !important;
  filter:drop-shadow(0 5px 10px rgba(0,0,0,.48)) !important;
}
#pokehub-app .ph-pack-cover-clone .ph-art-glyph{display:none !important;}
#pokehub-app .ph-pack .ph-pack-art,
#pokehub-app .ph-pack .ph-pack-logo,
#pokehub-app .ph-pack .ph-pack-label,
#pokehub-app .ph-pack .ph-pack-series,
#pokehub-app .ph-pack .ph-pack-art-shade{
  display:none !important;
}
#pokehub-app .ph-pack::after{
  z-index:8 !important;
  opacity:.22 !important;
}
#pokehub-app .ph-pack::before{z-index:9 !important;}
#pokehub-app .ph-pack-shine{z-index:10 !important;}
#pokehub-app .ph-pack.ph-ripping .ph-pack-cover-clone{
  animation:ph-cover-flash .62s cubic-bezier(.18,.78,.2,1) forwards;
}
@keyframes ph-cover-flash{
  0%{filter:brightness(1) saturate(1);transform:scale(1);}
  36%{filter:brightness(1.08) saturate(1.03);transform:scale(1.015) rotate(-.4deg);}
  70%{filter:brightness(1.34) saturate(1.08);transform:scale(1.08) rotate(.8deg);}
  100%{filter:brightness(2.1) saturate(1.12);transform:scale(1.34) rotate(-2deg);opacity:0;}
}
@media (max-width:520px){
  #pokehub-app .ph-pack-cover-clone .ph-art-logo{max-width:86% !important;max-height:34% !important;}
}
</style>
<script>
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  if(!app) return;
  var pack=document.getElementById("ph-pack");
  var label=document.getElementById("ph-pack-label");
  var grid=document.getElementById("ph-exp-grid");
  var screenOpen=document.getElementById("ph-screen-open");
  if(!pack || !label || !grid) return;

  function norm(s){
    return String(s||"")
      .replace(/\s+/g," ")
      .trim()
      .toLowerCase();
  }

  function findCard(){
    var wanted=norm(label.textContent);
    if(!wanted) return null;
    var cards=grid.querySelectorAll(".ph-exp-card");
    var fallback=null;
    for(var i=0;i<cards.length;i++){
      var nameEl=cards[i].querySelector(".ph-name");
      if(!nameEl) continue;
      var name=norm(nameEl.textContent);
      if(name===wanted) return cards[i];
      if(!fallback &#038;&#038; (name.indexOf(wanted)!==-1 || wanted.indexOf(name)!==-1)) fallback=cards[i];
    }
    return fallback;
  }

  function buildClone(){
    var card=findCard();
    if(!card) return false;
    var art=card.querySelector(".ph-art");
    if(!art) return false;

    var old=pack.querySelector(".ph-pack-cover-clone");
    if(old) old.remove();

    var clone=art.cloneNode(true);
    clone.className="ph-art ph-pack-cover-clone";

    // GIỮ NGUYÊN style/background của cover bên ngoài.
    // Bản trước xoá style ở đây nên ảnh bìa bị mất khi clone sang pack.
    var originalStyle=art.getAttribute("style") || "";
    if (originalStyle) clone.setAttribute("style", originalStyle);

    // Fallback chắc chắn: lấy background đã render thực tế của cover ngoài.
    try{
      var cs=window.getComputedStyle(art);
      clone.style.backgroundImage=cs.backgroundImage;
      clone.style.backgroundSize=cs.backgroundSize;
      clone.style.backgroundPosition=cs.backgroundPosition;
      clone.style.backgroundRepeat=cs.backgroundRepeat;
    }catch(e){}

    var bg=clone.querySelector(".ph-art-bg");
    if(bg){
      bg.style.display="block";
      bg.removeAttribute("loading");
    }

    var glyph=clone.querySelector(".ph-art-glyph");
    if(glyph) glyph.remove();

    pack.insertBefore(clone,pack.firstChild);
    pack.dataset.coverSource="outer-set-card";
    return true;
  }

  var lastLabel="";
  function sync(){
    var now=norm(label.textContent);
    if(!now &#038;&#038; lastLabel) return;
    if(now!==lastLabel || !pack.querySelector(".ph-pack-cover-clone")){
      if(buildClone()) lastLabel=now;
    }
  }

  sync();
  if(window.MutationObserver){
    var mo=new MutationObserver(function(){
      setTimeout(sync,0);
    });
    mo.observe(label,{childList:true,characterData:true,subtree:true});
    mo.observe(grid,{childList:true,subtree:true});
    if(screenOpen) mo.observe(screenOpen,{attributes:true,attributeFilter:["class","hidden"]});
  }
  setInterval(sync,800);
})();
</script>

<!-- ============================================================
     FINAL PATCH v7: lấy ĐÚNG COVER ĐANG HIỂN THỊ Ở CARD BÊN NGOÀI
     Không clone DOM nữa. Copy trực tiếp background + logo thực tế.
     Giữ nguyên toàn bộ logic mở pack/API/pull/collection.
     ============================================================ -->
<style>
#pokehub-app .ph-pack-cover-clone{display:none !important;}
#pokehub-app .ph-pack-exact-logo{
  position:absolute !important;
  left:50% !important;
  top:50% !important;
  transform:translate(-50%,-50%) !important;
  z-index:6 !important;
  display:block !important;
  width:auto !important;
  height:auto !important;
  max-width:88% !important;
  max-height:58% !important;
  object-fit:contain !important;
  pointer-events:none !important;
  filter:drop-shadow(0 4px 9px rgba(0,0,0,.55)) !important;
}
#pokehub-app .ph-pack.ph-exact-cover-ready{
  background-repeat:no-repeat !important;
  background-size:cover !important;
  background-position:center center !important;
}
#pokehub-app .ph-pack.ph-ripping .ph-pack-exact-logo{
  animation:ph-exact-cover-logo-rip .62s cubic-bezier(.18,.78,.2,1) forwards;
}
@keyframes ph-exact-cover-logo-rip{
  0%{transform:translate(-50%,-50%) scale(1);opacity:1;filter:drop-shadow(0 4px 9px rgba(0,0,0,.55));}
  36%{transform:translate(-50%,-50%) scale(1.015) rotate(-.4deg);opacity:1;}
  70%{transform:translate(-50%,-50%) scale(1.08) rotate(.8deg);opacity:1;filter:brightness(1.35) saturate(1.08) drop-shadow(0 6px 12px rgba(0,0,0,.6));}
  100%{transform:translate(-50%,-50%) scale(1.28) rotate(-2deg);opacity:0;filter:brightness(2) saturate(1.1) drop-shadow(0 8px 18px rgba(0,0,0,.7));}
}
</style>
<script>
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  if(!app) return;
  var pack=document.getElementById("ph-pack");
  var label=document.getElementById("ph-pack-label");
  var grid=document.getElementById("ph-exp-grid");
  if(!pack || !label || !grid) return;

  function norm(s){
    return String(s||"").replace(/\s+/g," ").trim().toLowerCase();
  }

  function findCard(){
    var wanted=norm(label.textContent);
    if(!wanted) return null;
    var cards=grid.querySelectorAll(".ph-exp-card");
    var fallback=null;
    for(var i=0;i<cards.length;i++){
      var nameEl=cards[i].querySelector(".ph-name");
      if(!nameEl) continue;
      var name=norm(nameEl.textContent);
      if(name===wanted) return cards[i];
      if(!fallback &#038;&#038; (name.indexOf(wanted)!==-1 || wanted.indexOf(name)!==-1)) fallback=cards[i];
    }
    return fallback;
  }

  function ensureLogo(){
    var logo=pack.querySelector(".ph-pack-exact-logo");
    if(!logo){
      logo=document.createElement("img");
      logo.className="ph-pack-exact-logo";
      logo.alt="";
      logo.decoding="async";
      logo.loading="eager";
      logo.setAttribute("aria-hidden","true");
      pack.appendChild(logo);
    }
    return logo;
  }

  function applyOuterCover(){
    var card=findCard();
    if(!card) return false;
    var art=card.querySelector(".ph-art");
    if(!art) return false;

    var cs;
    try{ cs=window.getComputedStyle(art); }catch(e){ cs=null; }
    if(!cs) return false;

    /* Xóa lớp clone cũ gây blank */
    var clones=pack.querySelectorAll(".ph-pack-cover-clone");
    for(var i=0;i<clones.length;i++) clones[i].remove();

    /* Copy CHÍNH background đang render ở card ngoài */
    var bgImage=cs.backgroundImage;
    var bgSize=cs.backgroundSize;
    var bgPos=cs.backgroundPosition;
    var bgRepeat=cs.backgroundRepeat;
    var bgColor=cs.backgroundColor;

    /* Nếu card ngoài có <img> cover mà computed background không có URL,
       dùng luôn src của ảnh đó làm fallback. */
    var bgImg=art.querySelector(".ph-art-bg");
    if((!bgImage || bgImage==="none") && bgImg && bgImg.src){
      bgImage='url("'+bgImg.src.replace(/"/g,'\\"')+'")';
    }

    if(bgImage && bgImage!=="none") pack.style.setProperty("background-image",bgImage,"important");
    else pack.style.setProperty("background-image",cs.backgroundImage||"none","important");
    pack.style.setProperty("background-size",bgSize||"cover","important");
    pack.style.setProperty("background-position",bgPos||"center center","important");
    pack.style.setProperty("background-repeat",bgRepeat||"no-repeat","important");
    if(bgColor) pack.style.setProperty("background-color",bgColor,"important");

    /* Copy đúng logo mà card bên ngoài đang dùng */
    var srcLogo=art.querySelector(".ph-art-logo");
    var logo=ensureLogo();
    if(srcLogo && srcLogo.src){
      logo.src=srcLogo.src;
      logo.style.display="block";
    }else{
      logo.removeAttribute("src");
      logo.style.display="none";
    }

    /* Nếu cover ngoài dùng ảnh 30th làm nền, không chồng logo khác lên */
    var is30=/30th\s*celebration/i.test(label.textContent||"");
    if(is30){
      logo.removeAttribute("src");
      logo.style.display="none";
    }

    /* Giữ accent của card ngoài nếu có */
    var c1=art.style.getPropertyValue("--c1");
    var c2=art.style.getPropertyValue("--c2");
    if(c1) pack.style.setProperty("--c1",c1);
    if(c2) pack.style.setProperty("--c2",c2);

    pack.classList.add("ph-exact-cover-ready");
    pack.dataset.coverSource="exact-outer-card";
    return true;
  }

  var last="";
  function sync(){
    var now=norm(label.textContent);
    if(!now) return;
    if(now!==last || !pack.classList.contains("ph-exact-cover-ready")){
      if(applyOuterCover()) last=now;
    }
  }

  sync();

  if(window.MutationObserver){
    var mo=new MutationObserver(function(){ setTimeout(sync,0); });
    mo.observe(label,{childList:true,characterData:true,subtree:true});
    mo.observe(grid,{childList:true,subtree:true});
  }

  /* Tự đồng bộ nhẹ để chịu được Ceris/WordPress thay DOM sau khi chọn set. */
  setInterval(sync,700);
})();
</script>

<!-- ============================================================
     FINAL COVER PATCH v8 — BẮT TRỰC TIẾP COVER CỦA CARD NGOÀI
     Không dò theo tên, không clone DOM, không đụng logic pull/API.
     Khi người dùng click một set, patch này chụp chính background + logo
     của card đó trước khi code gốc xử lý click, rồi đưa nguyên cover vào pack.
     ============================================================ -->
<style>
#pokehub-app .ph-pack-real-cover{
  position:absolute !important;
  inset:0 !important;
  width:100% !important;
  height:100% !important;
  display:block !important;
  z-index:2 !important;
  border-radius:inherit !important;
  background-color:#09101d !important;
  background-repeat:no-repeat !important;
  background-size:cover !important;
  background-position:center center !important;
  pointer-events:none !important;
  overflow:hidden !important;
}
#pokehub-app .ph-pack-real-logo{
  position:absolute !important;
  left:50% !important;
  top:48% !important;
  transform:translate(-50%,-50%) !important;
  width:auto !important;
  height:auto !important;
  max-width:84% !important;
  max-height:42% !important;
  display:block !important;
  z-index:4 !important;
  object-fit:contain !important;
  pointer-events:none !important;
  filter:drop-shadow(0 5px 10px rgba(0,0,0,.58)) !important;
}
#pokehub-app .ph-pack-real-cover[hidden],
#pokehub-app .ph-pack-real-logo[hidden]{display:none !important;}
#pokehub-app .ph-pack-real-cover.ph-cover-ripping{
  animation:ph-real-cover-rip .62s cubic-bezier(.18,.78,.2,1) forwards;
}
#pokehub-app .ph-pack-real-logo.ph-cover-ripping{
  animation:ph-real-logo-rip .62s cubic-bezier(.18,.78,.2,1) forwards;
}
@keyframes ph-real-cover-rip{
  0%{transform:scale(1) rotate(0deg);filter:brightness(1) saturate(1);opacity:1;}
  35%{transform:scale(1.015) rotate(-.35deg);filter:brightness(1.08) saturate(1.03);opacity:1;}
  70%{transform:scale(1.08) rotate(.8deg);filter:brightness(1.34) saturate(1.08);opacity:1;}
  100%{transform:scale(1.34) rotate(-2deg);filter:brightness(2.1) saturate(1.12);opacity:0;}
}
@keyframes ph-real-logo-rip{
  0%{transform:translate(-50%,-50%) scale(1) rotate(0deg);filter:drop-shadow(0 5px 10px rgba(0,0,0,.58));opacity:1;}
  35%{transform:translate(-50%,-50%) scale(1.015) rotate(-.35deg);opacity:1;}
  70%{transform:translate(-50%,-50%) scale(1.08) rotate(.8deg);filter:brightness(1.35) saturate(1.08) drop-shadow(0 7px 14px rgba(0,0,0,.62));opacity:1;}
  100%{transform:translate(-50%,-50%) scale(1.28) rotate(-2deg);filter:brightness(2) saturate(1.12) drop-shadow(0 9px 18px rgba(0,0,0,.7));opacity:0;}
}
@media (max-width:520px){
  #pokehub-app .ph-pack-real-logo{max-width:88% !important;max-height:36% !important;}
}
</style>
<script>
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  if(!app) return;
  var pack=document.getElementById("ph-pack");
  var grid=document.getElementById("ph-exp-grid");
  var openScreen=document.getElementById("ph-screen-open");
  if(!pack || !grid) return;

  var chosen={bg:"",size:"cover",position:"center center",repeat:"no-repeat",color:"#09101d",logo:"",c1:"",c2:""};

  function ensureCover(){
    var cover=pack.querySelector(".ph-pack-real-cover");
    if(!cover){
      cover=document.createElement("div");
      cover.className="ph-pack-real-cover";
      cover.setAttribute("aria-hidden","true");
      pack.insertBefore(cover,pack.firstChild);
    }
    return cover;
  }

  function ensureLogo(){
    var logo=pack.querySelector(".ph-pack-real-logo");
    if(!logo){
      logo=document.createElement("img");
      logo.className="ph-pack-real-logo";
      logo.alt="";
      logo.decoding="async";
      logo.loading="eager";
      logo.setAttribute("aria-hidden","true");
      pack.appendChild(logo);
    }
    return logo;
  }

  function readCardCover(card){
    if(!card) return false;
    var art=card.querySelector(".ph-art");
    if(!art) return false;

    var cs;
    try{ cs=window.getComputedStyle(art); }catch(e){ cs=null; }
    if(!cs) return false;

    var bg=cs.backgroundImage;
    var bgImg=art.querySelector(".ph-art-bg");
    if((!bg || bg==="none") && bgImg && (bgImg.currentSrc || bgImg.src)){
      var src=bgImg.currentSrc || bgImg.src;
      bg='url("'+String(src).replace(/"/g,'\\"')+'")';
    }

    chosen.bg=bg && bg!=="none" ? bg : "";
    chosen.size=cs.backgroundSize || "cover";
    chosen.position=cs.backgroundPosition || "center center";
    chosen.repeat=cs.backgroundRepeat || "no-repeat";
    chosen.color=cs.backgroundColor || "#09101d";
    chosen.c1=art.style.getPropertyValue("--c1") || "";
    chosen.c2=art.style.getPropertyValue("--c2") || "";

    var srcLogo=art.querySelector(".ph-art-logo");
    chosen.logo=(srcLogo && (srcLogo.currentSrc || srcLogo.src)) ? (srcLogo.currentSrc || srcLogo.src) : "";
    return !!(chosen.bg || chosen.logo);
  }

  function findCardFromEvent(target){
    if(!target) return null;
    var el=target.closest ? target.closest(".ph-exp-card") : null;
    return el && grid.contains(el) ? el : null;
  }

  function captureCard(card){
    if(!readCardCover(card)) return;
    try{ sessionStorage.setItem("pokehub.last.cover.v8",JSON.stringify(chosen)); }catch(e){}
    setTimeout(applyCover,0);
    setTimeout(applyCover,40);
    setTimeout(applyCover,180);
  }

  function applyCover(){
    var cover=ensureCover();
    if(chosen.bg){
      cover.style.backgroundImage=chosen.bg;
      cover.style.backgroundSize=chosen.size;
      cover.style.backgroundPosition=chosen.position;
      cover.style.backgroundRepeat=chosen.repeat;
      cover.style.backgroundColor=chosen.color;
      cover.hidden=false;
    }

    var logo=ensureLogo();
    if(chosen.logo){
      logo.src=chosen.logo;
      logo.hidden=false;
    }else{
      logo.removeAttribute("src");
      logo.hidden=true;
    }

    if(chosen.c1) pack.style.setProperty("--c1",chosen.c1);
    if(chosen.c2) pack.style.setProperty("--c2",chosen.c2);
    pack.classList.add("ph-v8-cover-ready");
  }

  function restoreSaved(){
    try{
      var raw=sessionStorage.getItem("pokehub.last.cover.v8");
      if(raw){
        var x=JSON.parse(raw);
        if(x && typeof x==="object"){
          chosen=Object.assign(chosen,x);
          applyCover();
        }
      }
    }catch(e){}
  }

  /* Capture trước listener gốc: chắc chắn lấy đúng card mà người dùng vừa chọn. */
  grid.addEventListener("click",function(e){
    var card=findCardFromEvent(e.target);
    if(card) captureCard(card);
  },true);

  grid.addEventListener("pointerdown",function(e){
    var card=findCardFromEvent(e.target);
    if(card) captureCard(card);
  },true);

  grid.addEventListener("keydown",function(e){
    if(e.key!=="Enter" && e.key!==" ") return;
    var card=findCardFromEvent(e.target);
    if(card) captureCard(card);
  },true);

  if(window.MutationObserver && openScreen){
    var mo=new MutationObserver(function(){
      if(openScreen.classList.contains("ph-active")) applyCover();
    });
    mo.observe(openScreen,{attributes:true,attributeFilter:["class"]});
  }

  function resetCoverVisual(){
    var c=pack.querySelector(".ph-pack-real-cover");
    var l=pack.querySelector(".ph-pack-real-logo");

    if(c){
      c.classList.remove("ph-cover-ripping");
      c.hidden=false;
      c.style.opacity="1";
      c.style.transform="none";
      c.style.filter="none";
      c.style.animation="none";
      void c.offsetWidth;
      c.style.animation="";
    }

    if(l){
      l.classList.remove("ph-cover-ripping");
      l.hidden = !chosen.logo;
      l.style.opacity = chosen.logo ? "1" : "";
      l.style.transform="translate(-50%,-50%)";
      l.style.filter="drop-shadow(0 5px 10px rgba(0,0,0,.58))";
      l.style.animation="none";
      void l.offsetWidth;
      l.style.animation="";
    }
  }

  var lastRipping=false;
  var lastOpenActive=false;
  setInterval(function(){
    if(!chosen.bg && !chosen.logo) return;

    var active=!!(openScreen && openScreen.classList.contains("ph-active"));
    var ripping=pack.classList.contains("ph-ripping");

    /* Khi quay lại màn hình pack hoặc bắt đầu lượt mở mới, luôn phục hồi cover
       từ trạng thái đã chọn; không để animation lần trước giữ opacity:0. */
    if(active && !lastOpenActive && !ripping){
      resetCoverVisual();
      applyCover();
    }

    if(active && !ripping){
      resetCoverVisual();
      applyCover();
    }

    if(ripping && !lastRipping){
      var c=pack.querySelector(".ph-pack-real-cover");
      var l=pack.querySelector(".ph-pack-real-logo");
      resetCoverVisual();
      if(c){ c.classList.remove("ph-cover-ripping"); void c.offsetWidth; c.classList.add("ph-cover-ripping"); }
      if(l && !l.hidden){ l.classList.remove("ph-cover-ripping"); void l.offsetWidth; l.classList.add("ph-cover-ripping"); }
    }

    /* Sau khi rip kết thúc, chuẩn bị sẵn cover cho lượt mở tiếp theo. */
    if(lastRipping && !ripping){
      resetCoverVisual();
      if(active) applyCover();
    }

    lastRipping=ripping;
    lastOpenActive=active;
  },220);

  restoreSaved();
})();
</script>



<style>
/* ============================================================
   ĐÔNG SƠN — TRỐNG ĐỒNG CHIM LẠC BACKDROP — VISUAL ONLY
   Chỉ thay hiệu ứng nền phía sau pack; không đụng gameplay.
   ============================================================ */
#pokehub-app .ph-stage{
  isolation:isolate;
  position:relative;
}

/* Mặt trống đồng tối: 3 vòng thưa + mặt trời trung tâm + chim Lạc */
#pokehub-app .ph-stage::before{
  content:"";
  position:absolute;
  left:50%;
  top:50%;
  width:min(520px,84vw);
  height:min(520px,84vw);
  transform:translate(-50%,-50%);
  border-radius:50%;
  z-index:0;
  pointer-events:none;
  background:
    /* tâm mặt trời Đông Sơn */
    radial-gradient(circle at 50% 50%,
      rgba(11,19,28,.98) 0 7.5%,
      rgba(171,126,40,.28) 7.8% 8.5%,
      transparent 8.9% 12%),
    /* 3 vòng thưa */
    radial-gradient(circle at 50% 50%,
      transparent 0 22%,
      rgba(210,171,67,.30) 22.25% 22.7%,
      transparent 23.1% 43%),
    radial-gradient(circle at 50% 50%,
      transparent 0 44%,
      rgba(210,171,67,.22) 44.25% 44.65%,
      transparent 45.05% 64%),
    radial-gradient(circle at 50% 50%,
      transparent 0 65%,
      rgba(210,171,67,.18) 65.25% 65.65%,
      transparent 66.05% 100%),
    /* tia mặt trời rất thưa */
    repeating-conic-gradient(from 0deg at 50% 50%,
      rgba(225,190,83,.12) 0deg 3deg,
      transparent 3deg 30deg),
    /* vòng chim Lạc cách xa tâm */
    radial-gradient(circle at 50% 50%,
      transparent 0 73%,
      rgba(225,190,83,.10) 73.25% 73.55%,
      transparent 73.9% 100%),
    /* nền đồng xanh đen */
    radial-gradient(circle at 50% 44%,
      rgba(91,76,35,.14),
      rgba(19,29,38,.18) 36%,
      rgba(4,9,15,.86) 73%,
      rgba(2,5,10,.98) 100%);
  border:1px solid rgba(210,171,67,.16);
  box-shadow:
    0 0 70px rgba(204,157,43,.08),
    inset 0 0 90px rgba(0,0,0,.80);
  opacity:.82;
  animation:ph-dongson-drum 32s linear infinite;
}

/* Vòng chim Lạc: 4 chim cách xa nhau, mô phỏng họa tiết khắc quanh mặt trống */
#pokehub-app .ph-stage::after{
  content:"";
  position:absolute;
  left:50%;
  top:50%;
  width:min(375px,64vw);
  height:min(375px,64vw);
  transform:translate(-50%,-50%);
  border-radius:50%;
  z-index:1;
  pointer-events:none;
  background:
    url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDIwIj4KPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDJhYjQzIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNTIiPgo8Y2lyY2xlIGN4PSIyMTAiIGN5PSIyMTAiIHI9IjE4NCIvPgo8L2c+CjxnIGZpbGw9IiNkMmFiNDMiIG9wYWNpdHk9IjAuNTgiPgogIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxMCA1OCkiPgogICAgPHBhdGggZD0iTTAgOCBDMTggLTggNDIgLTQgNTQgOCBDNDAgNiAyOSA5IDIwIDE5IEMxMiAyOCAtMSAyOSAtMTAgMTggQy0zIDE3IDAgMTQgMCA4WiIvPgogICAgPHBhdGggZD0iTTIwIDE5IEMzMCAxMiA0MiA4IDYyIDEyIEM0OCAxOSAzOSAyOCAzMyA0MSBDMjcgMzIgMjMgMjYgMjAgMTlaIi8+CiAgICA8cGF0aCBkPSJNLTEgMTcgTC0xOCAxMCBMLTkgMjIgWiIvPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09InJvdGF0ZSg5MCAyMTAgMjEwKSI+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMTAgNTgpIj4KICAgICAgPHBhdGggZD0iTTAgOCBDMTggLTggNDIgLTQgNTQgOCBDNDAgNiAyOSA5IDIwIDE5IEMxMiAyOCAtMSAyOSAtMTAgMTggQy0zIDE3IDAgMTQgMCA4WiIvPgogICAgICA8cGF0aCBkPSJNMjAgMTkgQzMwIDEyIDQyIDggNjIgMTIgQzQ4IDE5IDM5IDI4IDMzIDQxIEMyNyAzMiAyMyAyNiAyMCAxOVoiLz4KICAgICAgPHBhdGggZD0iTS0xIDE3IEwtMTggMTAgTC05IDIyIFoiLz4KICAgIDwvZz4KICA8L2c+CiAgPGcgdHJhbnNmb3JtPSJyb3RhdGUoMTgwIDIxMCAyMTApIj4KICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxMCA1OCkiPgogICAgICA8cGF0aCBkPSJNMCA4IEMxOCAtOCA0MiAtNCA1NCA4IEM0MCA2IDI5IDkgMjAgMTkgQzEyIDI4IC0xIDI5IC0xMCAxOCBDLTMgMTcgMCAxNCAwIDhaIi8+CiAgICAgIDxwYXRoIGQ9Ik0yMCAxOSBDMzAgMTIgNDIgOCA2MiAxMiBDNDggMTkgMzkgMjggMzMgNDEgQzI3IDMyIDIzIDI2IDIwIDE5WiIvPgogICAgICA8cGF0aCBkPSJNLTEgMTcgTC0xOCAxMCBMLTkgMjIgWiIvPgogICAgPC9nPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09InJvdGF0ZSgyNzAgMjEwIDIxMCkiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjEwIDU4KSI+CiAgICAgIDxwYXRoIGQ9Ik0wIDggQzE4IC04IDQyIC00IDU0IDggQzQwIDYgMjkgOSAyMCAxOSBDMTIgMjggLTEgMjkgLTEwIDE4IEMtMyAxNyAwIDE0IDAgOFoiLz4KICAgICAgPHBhdGggZD0iTTIwIDE5IEMzMCAxMiA0MiA4IDYyIDEyIEM0OCAxOSAzOSAyOCAzMyA0MSBDMjcgMzIgMjMgMjYgMjAgMTlaIi8+CiAgICAgIDxwYXRoIGQ9Ik0tMSAxNyBMLTE4IDEwIEwtOSAyMiBaIi8+CiAgICA8L2c+CiAgPC9nPgo8L2c+CjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QyYWI0MyIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjI2Ij4KICA8Y2lyY2xlIGN4PSIyMTAiIGN5PSIyMTAiIHI9IjMyIi8+CiAgPGNpcmNsZSBjeD0iMjEwIiBjeT0iMjEwIiByPSIxNCIvPgogIDxwYXRoIGQ9Ik0yMTAgMTgxIEwyMTYgMTk2IEwyMzIgMjAwIEwyMTggMjEwIEwyMjAgMjI2IEwyMTAgMjE4IEwyMDAgMjI2IEwyMDIgMjEwIEwxODggMjAwIEwyMDQgMTk2IFoiLz4KPC9nPgo8L3N2Zz4=") center/contain no-repeat,
    radial-gradient(circle at 50% 50%,
      rgba(6,10,15,.78) 0 14%,
      rgba(210,171,67,.08) 14.2% 21%,
      transparent 22% 100%);
  opacity:.64;
  filter:drop-shadow(0 0 10px rgba(210,171,67,.08));
}

#pokehub-app .ph-pack{
  position:relative;
  z-index:3;
}

/* Giữ họa tiết gọn trong đúng khu vực mở pack, không tràn lên thanh sưu tập hay footer. */
#pokehub-app .ph-stage{
  overflow:hidden;
}

@media (max-width:760px){
  #pokehub-app .ph-stage::before{
    top:52%;
    width:min(350px,88vw);
    height:min(350px,88vw);
  }
  #pokehub-app .ph-stage::after{
    top:52%;
    width:min(255px,66vw);
    height:min(255px,66vw);
  }
}

@media (max-width:480px){
  #pokehub-app .ph-stage::before{
    top:52%;
    width:min(305px,92vw);
    height:min(305px,92vw);
    opacity:.72;
  }
  #pokehub-app .ph-stage::after{
    top:52%;
    width:min(220px,68vw);
    height:min(220px,68vw);
    opacity:.56;
  }
}

@keyframes ph-dongson-drum{
  from{transform:translate(-50%,-50%) rotate(0deg);}
  to{transform:translate(-50%,-50%) rotate(360deg);}
}

@media (prefers-reduced-motion:reduce){
  #pokehub-app .ph-stage::before{animation:none;}
}


<style>
/* ============================================================
   V13: LÀM NỔI HỌA TIẾT TRỐNG ĐỒNG, NHƯNG KHÔNG ĐÈ LÊN TEXT/NÚT
   Chỉ chỉnh visual của backdrop.
   ============================================================ */
#pokehub-app .ph-stage::before{
  opacity: .92 !important;
  filter:
    drop-shadow(0 0 10px rgba(210,171,67,.16))
    drop-shadow(0 0 34px rgba(210,171,67,.07)) !important;
  z-index:0 !important;
}

#pokehub-app .ph-stage::after{
  opacity: .84 !important;
  filter:
    drop-shadow(0 0 9px rgba(210,171,67,.14)) !important;
  z-index:1 !important;
}

/* Ring và chim Lạc vẫn nổi, nhưng text/nút luôn nằm phía trên */
#pokehub-app .ph-stage > .ph-hint,
#pokehub-app .ph-stage > .ph-box-row{
  position:relative !important;
  z-index:6 !important;
}

#pokehub-app .ph-stage > .ph-hint{
  text-shadow:
    0 2px 8px rgba(0,0,0,.92),
    0 0 10px rgba(8,12,22,.96) !important;
}

#pokehub-app .ph-stage > .ph-box-row{
  isolation:isolate;
}

#pokehub-app .ph-stage > .ph-box-row .ph-box-lbl,
#pokehub-app .ph-stage > .ph-box-row .ph-chip{
  position:relative !important;
  z-index:7 !important;
  text-shadow:0 1px 6px rgba(0,0,0,.7);
}

/* Các vòng đồng có độ tương phản rõ hơn ở desktop */
@media (min-width:761px){
  #pokehub-app .ph-stage::before{
    background-blend-mode:screen,normal,normal,normal,screen,normal,normal !important;
  }
}

/* Mobile: nổi vừa đủ, tránh vòng ăn vào nút */
@media (max-width:760px){
  #pokehub-app .ph-stage::before{
    opacity:.80 !important;
    filter:drop-shadow(0 0 8px rgba(210,171,67,.14)) !important;
  }
  #pokehub-app .ph-stage::after{
    opacity:.70 !important;
    filter:drop-shadow(0 0 7px rgba(210,171,67,.12)) !important;
  }
}
</style>

<style>
/* ============================================================
   PATCH: ĐƯA TEXT + NÚT MỞ GÓI LÊN TRÊN HỌA TIẾT TRỐNG ĐỒNG
   Chỉ sửa thứ tự hiển thị; không đổi gameplay.
   ============================================================ */
#pokehub-app .ph-stage > .ph-hint,
#pokehub-app .ph-stage > .ph-box-row{
  position:relative !important;
  z-index:20 !important;
}

#pokehub-app .ph-box-row{
  padding:5px 8px !important;
  border-radius:14px !important;
  background:rgba(5,9,18,.28) !important;
  backdrop-filter:blur(2px);
  -webkit-backdrop-filter:blur(2px);
}

#pokehub-app .ph-box-lbl,
#pokehub-app .ph-chip{
  position:relative !important;
  z-index:21 !important;
}

/* Giữ pack vẫn cao nhất, còn họa tiết chỉ nằm phía sau */
#pokehub-app .ph-pack{
  position:relative !important;
  z-index:30 !important;
}

/* Vòng đồng rõ hơn nhưng không che chữ/nút */
#pokehub-app .ph-stage::before{
  opacity:.90 !important;
  filter:drop-shadow(0 0 16px rgba(210,171,67,.12)) !important;
}
#pokehub-app .ph-stage::after{
  opacity:.74 !important;
  filter:drop-shadow(0 0 12px rgba(210,171,67,.10)) !important;
}

@media (max-width:520px){
  #pokehub-app .ph-box-row{
    padding:4px 6px !important;
    background:rgba(5,9,18,.34) !important;
  }
}
</style>

<style>
/* ============================================================
   V14: mobile ring center-lock
   Luôn căn tâm họa tiết Đông Sơn theo TÂM PACK thực tế.
   Chỉ sửa vị trí backdrop; không sửa gameplay.
   ============================================================ */
#pokehub-app .ph-stage::before,
#pokehub-app .ph-stage::after{
  left:var(--ph-ring-center-x,50%) !important;
  top:var(--ph-ring-center-y,50%) !important;
}

@media (max-width:760px){
  /* Vòng nhỏ hơn để không lấn sang hai bên nhưng vẫn ôm đủ pack. */
  #pokehub-app .ph-stage::before{
    width:min(390px,94vw) !important;
    height:min(390px,94vw) !important;
  }
  #pokehub-app .ph-stage::after{
    width:min(270px,66vw) !important;
    height:min(270px,66vw) !important;
  }
}

@media (max-width:480px){
  #pokehub-app .ph-stage::before{
    width:min(340px,90vw) !important;
    height:min(340px,90vw) !important;
  }
  #pokehub-app .ph-stage::after{
    width:min(230px,64vw) !important;
    height:min(230px,64vw) !important;
  }
}
</style>

<script>
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  if(!app) return;
  var stage=app.querySelector(".ph-stage");
  var pack=document.getElementById("ph-pack");
  if(!stage || !pack) return;

  function lockRingToPack(){
    var sr=stage.getBoundingClientRect();
    var pr=pack.getBoundingClientRect();
    var x=(pr.left - sr.left) + (pr.width/2);
    var y=(pr.top - sr.top) + (pr.height/2);
    if(!isFinite(x) || !isFinite(y)) return;
    stage.style.setProperty("--ph-ring-center-x", x + "px");
    stage.style.setProperty("--ph-ring-center-y", y + "px");
  }

  lockRingToPack();

  if(window.ResizeObserver){
    var ro=new ResizeObserver(lockRingToPack);
    ro.observe(stage);
    ro.observe(pack);
  }

  window.addEventListener("resize",lockRingToPack,{passive:true});
  window.addEventListener("orientationchange",function(){ setTimeout(lockRingToPack,60); },{passive:true});
  setInterval(lockRingToPack,500);
})();
</script>

<style>
/* ============================================================
   FINAL DESKTOP PATCH — TRỐNG ĐỒNG GỌN GIỐNG MOBILE
   Chỉ chỉnh kích thước desktop. Mobile giữ nguyên.
   Không đụng pack/gameplay/API.
   ============================================================ */
@media (min-width:761px){
  #pokehub-app .ph-stage::before{
    width:min(390px,60vw) !important;
    height:min(390px,60vw) !important;
  }

  #pokehub-app .ph-stage::after{
    width:min(270px,42vw) !important;
    height:min(270px,42vw) !important;
  }
}
</style>

<style id="ph-card-modal-layer-fix-v2">
/* FIX V2: Chi tiết thẻ phải nằm trên Bộ sưu tập.
   Đặt cuối file và dùng hai ID trong selector để thắng rule .ph-modal !important phía trên. */
#pokehub-app #ph-col-modal {
  z-index:2147483500 !important;
}
#pokehub-app #ph-modal {
  z-index:2147483600 !important;
}
#pokehub-app #ph-modal > .ph-modal-card {
  z-index:2147483601 !important;
}
</style>

<style id="ph-pack-detail-scroll-price-fix-v2">
/* Chi tiết pack: cuộn toàn bộ nội dung trong một vùng duy nhất, không lồng vùng cuộn ở danh sách card. */
#pokehub-app .ph-pack-detail-modal .ph-pack-detail-dialog{
  display:flex !important;
  flex-direction:column !important;
  height:88vh !important;
  height:min(88vh, calc(100dvh - 24px)) !important;
  max-height:calc(100vh - 24px) !important;
  max-height:calc(100dvh - 24px) !important;
  min-height:0 !important;
  overflow:hidden !important;
}
#pokehub-app .ph-pack-detail-modal .ph-pack-detail-body{
  display:block !important;
  flex:1 1 0% !important;
  width:100% !important;
  min-height:0 !important;
  max-height:none !important;
  height:auto !important;
  overflow-y:auto !important;
  overflow-x:hidden !important;
  overscroll-behavior-y:contain !important;
  -webkit-overflow-scrolling:touch !important;
  padding:0 6px 16px 0 !important;
  scrollbar-gutter:stable;
}
#pokehub-app .ph-pack-detail-modal .ph-pack-detail-all-wrap{
  max-height:none !important;
  height:auto !important;
  overflow:visible !important;
  overscroll-behavior:initial !important;
  padding:2px 3px 12px 2px !important;
}
#pokehub-app .ph-pack-detail-price{
  display:block;
  margin:7px 8px 0;
  padding:5px 6px;
  border-radius:6px;
  background:rgba(255,211,92,.09);
  color:var(--ph-gold);
  font-size:11px;
  font-weight:800;
  line-height:1.2;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
#pokehub-app .ph-pack-detail-price.ph-card-noprice{
  color:var(--ph-dim);
  background:rgba(148,151,196,.08);
  font-size:10px;
  font-weight:500;
}
#pokehub-app .ph-pack-detail-price.ph-price-loading{
  color:var(--ph-dim);
  background:rgba(148,151,196,.06);
  font-size:10px;
  font-weight:500;
  animation:ph-price-pulse 1.5s ease-in-out infinite;
}
@keyframes ph-price-pulse{0%,100%{opacity:.62}50%{opacity:1}}
@media(max-width:560px){
  #pokehub-app .ph-pack-detail-modal{align-items:flex-start !important;padding:10px !important;}
  #pokehub-app .ph-pack-detail-modal .ph-pack-detail-dialog{
    width:calc(100vw - 20px) !important;
    max-width:none !important;
    height:calc(100dvh - 20px) !important;
    max-height:calc(100dvh - 20px) !important;
    margin:0 !important;
    padding:14px 14px 68px !important;
  }
  #pokehub-app .ph-pack-detail-modal .ph-pack-detail-body{
    padding:0 2px 14px 0 !important;
  }
}
@media(prefers-reduced-motion:reduce){#pokehub-app .ph-pack-detail-price.ph-price-loading{animation:none;}}
</style>



<style id="ph-pack-detail-mobile-header-clearance-v1">
/* Mobile fix: keep the pack-detail dialog below the sticky vnGame site header/logo.
   Additive CSS only; pack opening, prices, sorting and API logic remain unchanged. */
@media (max-width:560px){
  #pokehub-app .ph-pack-detail-modal{
    align-items:flex-start !important;
    padding:130px 10px 10px !important;
    box-sizing:border-box !important;
  }
  #pokehub-app .ph-pack-detail-modal .ph-pack-detail-dialog{
    width:calc(100vw - 20px) !important;
    max-width:none !important;
    height:calc(100dvh - 140px) !important;
    max-height:calc(100dvh - 140px) !important;
    min-height:0 !important;
    margin:0 !important;
    padding:14px 14px 68px !important;
    overflow:hidden !important;
    box-sizing:border-box !important;
  }
  #pokehub-app .ph-pack-detail-modal .ph-pack-detail-body{
    flex:1 1 0% !important;
    min-height:0 !important;
    max-height:none !important;
    overflow-y:auto !important;
    overflow-x:hidden !important;
    -webkit-overflow-scrolling:touch !important;
    overscroll-behavior-y:contain !important;
  }
}
</style>

<style id="ph-chase-card-v11-css">
#pokehub-app .ph-chase-tool{border-color:rgba(201,107,255,.3);}
#pokehub-app .ph-chase-tool:hover{border-color:#c96bff;}
#pokehub-app #ph-chase-modal{z-index:2147483550!important;}
#pokehub-app #ph-chase-modal .ph-modal-card{max-width:860px;border-color:rgba(201,107,255,.35);background:radial-gradient(ellipse at 100% 0%,rgba(201,107,255,.08),transparent 43%),var(--ph-panel);}
#pokehub-app .ph-chase-modal-title{color:#e6c7ff;font-family:'Space Grotesk',system-ui,sans-serif;font-weight:900;}
#pokehub-app .ph-chase-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin-bottom:14px;}
#pokehub-app .ph-chase-summary .ph-stat{border-color:rgba(201,107,255,.22);background:linear-gradient(145deg,rgba(201,107,255,.08),rgba(18,20,42,.85));}
#pokehub-app .ph-chase-summary .ph-stat-v{color:#e6c7ff;}
#pokehub-app .ph-chase-empty{padding:18px 15px;border:1px dashed rgba(201,107,255,.38);border-radius:12px;color:var(--ph-dim);background:rgba(201,107,255,.04);font-size:12px;line-height:1.7;}
#pokehub-app .ph-chase-set-progress-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin-bottom:14px;}
#pokehub-app .ph-chase-set-progress{padding:10px 11px;border:1px solid rgba(201,107,255,.19);border-radius:9px;background:rgba(201,107,255,.035);min-width:0;}
#pokehub-app .ph-chase-set-progress-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:7px;}
#pokehub-app .ph-chase-set-name{min-width:0;color:#eee4fb;font-size:11px;font-weight:800;overflow-wrap:anywhere;}
#pokehub-app .ph-chase-set-count{flex:none;color:#cda7f6;font-size:9px;font-weight:800;}
#pokehub-app .ph-chase-set-track{height:6px;overflow:hidden;border-radius:99px;background:#0b0c17;border:1px solid rgba(201,107,255,.12);}
#pokehub-app .ph-chase-set-fill{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#7b4dca,#cf8fff);box-shadow:0 0 9px rgba(201,107,255,.24);}
#pokehub-app .ph-chase-search-wrap{margin:0 0 10px;}
#pokehub-app .ph-chase-search{display:block;width:100%;padding:10px 12px;border:1px solid var(--ph-line);border-radius:9px;background:#0e1020;color:var(--ph-text);font:inherit;font-size:12px;outline:none;}
#pokehub-app .ph-chase-search:focus{border-color:#b879ed;box-shadow:0 0 0 2px rgba(201,107,255,.10);}
#pokehub-app .ph-chase-list{display:flex;flex-direction:column;gap:8px;max-height:42vh;overflow:auto;padding:2px 3px 4px 1px;}
#pokehub-app .ph-chase-item{display:grid;grid-template-columns:55px minmax(0,1fr) auto;gap:10px;align-items:center;min-width:0;padding:8px;border:1px solid rgba(201,107,255,.16);border-radius:10px;background:rgba(255,255,255,.018);}
#pokehub-app .ph-chase-item.ph-chase-owned{border-color:rgba(107,232,192,.28);background:rgba(107,232,192,.025);}
#pokehub-app .ph-chase-art{display:flex;align-items:center;justify-content:center;overflow:hidden;width:55px;aspect-ratio:245/337;border:1px solid rgba(201,107,255,.22);border-radius:6px;background:#171923;color:#cda7f6;font-size:19px;}
#pokehub-app .ph-chase-art img{width:100%;height:100%;object-fit:cover;display:block;}
#pokehub-app .ph-chase-item-main{min-width:0;}
#pokehub-app .ph-chase-item-name{color:#f0e5ff;font-size:12px;font-weight:900;overflow-wrap:anywhere;line-height:1.35;}
#pokehub-app .ph-chase-item-meta{margin-top:3px;color:#9e9bb0;font-size:10px;overflow-wrap:anywhere;}
#pokehub-app .ph-chase-item-price{margin-top:4px;color:#83ffc1;font-size:11px;font-weight:900;font-variant-numeric:tabular-nums;}
#pokehub-app .ph-chase-status{display:inline-flex;margin-top:5px;padding:2px 6px;border-radius:5px;font-size:8px;font-weight:900;letter-spacing:.04em;}
#pokehub-app .ph-chase-status-owned{border:1px solid rgba(107,232,192,.26);background:rgba(107,232,192,.07);color:#8ef6c2;}
#pokehub-app .ph-chase-status-missing{border:1px solid rgba(255,211,92,.23);background:rgba(255,211,92,.05);color:#ead69b;}
#pokehub-app .ph-chase-remove{padding:6px 8px;border:1px solid rgba(255,154,154,.2);border-radius:7px;background:rgba(255,154,154,.04);color:#ffb8b8;font:inherit;font-size:9px;font-weight:700;cursor:pointer;}
#pokehub-app .ph-chase-remove:hover{border-color:rgba(255,154,154,.55);background:rgba(255,154,154,.09);}
#pokehub-app .ph-chase-note{margin-top:10px;color:#858598;font-size:9px;line-height:1.55;}
#pokehub-app .ph-chase-card-actions{display:flex;justify-content:center;gap:8px;flex-wrap:wrap;margin:16px 0 2px;padding-top:13px;border-top:1px solid var(--ph-line);}
#pokehub-app .ph-chase-card-actions .ph-btn{font-size:11px;padding:9px 12px;}
#pokehub-app .ph-chase-card-add:disabled{opacity:.78;cursor:default;border:1px solid rgba(107,232,192,.32);background:rgba(107,232,192,.08);color:#8ef6c2;}
#pokehub-app .ph-chase-card-view{background:rgba(201,107,255,.06);border-color:rgba(201,107,255,.27);}
#pokehub-app .ph-lb-podium-best{overflow-wrap:anywhere;}
#pokehub-app .ph-lb-best-card-inline{max-width:100%;white-space:normal;overflow-wrap:anywhere;line-height:1.45;}
#ph-chase-hit-toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:2147483647;width:min(460px,calc(100vw - 24px));padding:15px 16px;border:1px solid rgba(201,107,255,.6);border-radius:14px;background:radial-gradient(ellipse at 0 0,rgba(201,107,255,.18),transparent 56%),linear-gradient(145deg,#191126,#090b13);box-shadow:0 20px 65px rgba(0,0,0,.58),0 0 26px rgba(201,107,255,.1);color:#f5edff;font-family:system-ui,-apple-system,'Segoe UI',sans-serif;animation:ph-chase-pop .22s ease-out;}
#ph-chase-hit-toast .ph-chase-hit-title{color:#e2b8ff;font-size:10px;font-weight:900;letter-spacing:.13em;}
#ph-chase-hit-toast .ph-chase-hit-name{margin-top:5px;color:#fff;font-size:15px;font-weight:900;line-height:1.35;overflow-wrap:anywhere;}
#ph-chase-hit-toast .ph-chase-hit-desc{margin-top:4px;color:#c8bed5;font-size:11px;line-height:1.5;}
#ph-chase-hit-toast .ph-chase-hit-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:11px;}
#ph-chase-hit-toast button{padding:7px 10px;border-radius:7px;font:inherit;font-size:10px;font-weight:800;cursor:pointer;}
#ph-chase-hit-toast .ph-chase-hit-share{border:1px solid rgba(201,107,255,.48);background:rgba(201,107,255,.13);color:#ead6ff;}
#ph-chase-hit-toast .ph-chase-hit-close{border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.04);color:#c9c4d2;}
@keyframes ph-chase-pop{from{opacity:0;transform:translate(-50%,10px) scale(.98);}to{opacity:1;transform:translate(-50%,0) scale(1);}}
@media(max-width:560px){
  #pokehub-app .ph-chase-summary{gap:6px;}
  #pokehub-app .ph-chase-summary .ph-stat{padding:9px 8px;}
  #pokehub-app .ph-chase-summary .ph-stat-v{font-size:17px;}
  #pokehub-app .ph-chase-item{grid-template-columns:46px minmax(0,1fr);gap:8px;padding:7px;}
  #pokehub-app .ph-chase-art{width:46px;}
  #pokehub-app .ph-chase-remove{grid-column:2;justify-self:start;}
  #pokehub-app .ph-chase-list{max-height:46vh;}
  #ph-chase-hit-toast{bottom:12px;padding:13px;}
}
</style>

<style id="ph-leaderboard-mobile-header-clearance-v1">
/* Mobile fix: keep the leaderboard below the sticky vnGame.tv logo/header.
   Only affects the leaderboard modal on small screens; game/API logic unchanged. */
@media (max-width:560px){
  #pokehub-app #ph-leaderboard-modal{
    align-items:flex-start !important;
    justify-content:flex-start !important;
    padding:76px 10px 10px !important;
    box-sizing:border-box !important;
  }
  #pokehub-app #ph-leaderboard-modal > .ph-modal-card{
    display:flex !important;
    flex-direction:column !important;
    flex:0 0 auto !important;
    width:calc(100vw - 20px) !important;
    max-width:none !important;
    height:calc(100dvh - 86px) !important;
    max-height:calc(100dvh - 86px) !important;
    min-height:0 !important;
    margin:0 !important;
    padding:14px 14px 68px !important;
    overflow:hidden !important;
    box-sizing:border-box !important;
  }
  #pokehub-app #ph-leaderboard-modal .ph-modal-title{
    flex:0 0 auto !important;
    padding-right:42px !important;
    overflow-wrap:anywhere !important;
  }
  #pokehub-app #ph-leaderboard-modal .ph-col-note{
    flex:0 0 auto !important;
    line-height:1.5 !important;
  }
  #pokehub-app #ph-leaderboard-modal .ph-modal-body{
    flex:1 1 0% !important;
    min-height:0 !important;
    max-height:none !important;
    overflow-y:auto !important;
    overflow-x:hidden !important;
    -webkit-overflow-scrolling:touch !important;
    overscroll-behavior-y:contain !important;
  }
}
</style>

<style id="ph-search-input-contrast-fix-v1">
/* Fix Ceris/theme overrides making search text and placeholders dark/invisible.
   Keeps all search behavior and layout unchanged. */
#pokehub-app input.ph-chase-search,
#pokehub-app input.ph-pack-detail-search,
#pokehub-app select.ph-pack-detail-filter{
  color:#f5f2ff !important;
  -webkit-text-fill-color:#f5f2ff !important;
  caret-color:#ffd35c !important;
  background-color:#0e1020 !important;
  opacity:1 !important;
}
#pokehub-app #ph-set-search-input{
  color:#f5f2ff !important;
  -webkit-text-fill-color:#f5f2ff !important;
  caret-color:#ffd35c !important;
  background-color:transparent !important;
  opacity:1 !important;
}
#pokehub-app input.ph-chase-search::placeholder,
#pokehub-app input.ph-pack-detail-search::placeholder,
#pokehub-app #ph-set-search-input::placeholder{
  color:#b9bfd8 !important;
  -webkit-text-fill-color:#b9bfd8 !important;
  opacity:1 !important;
}
#pokehub-app input.ph-chase-search::-webkit-input-placeholder,
#pokehub-app input.ph-pack-detail-search::-webkit-input-placeholder,
#pokehub-app #ph-set-search-input::-webkit-input-placeholder{
  color:#b9bfd8 !important;
  -webkit-text-fill-color:#b9bfd8 !important;
  opacity:1 !important;
}
#pokehub-app input.ph-chase-search::-moz-placeholder,
#pokehub-app input.ph-pack-detail-search::-moz-placeholder,
#pokehub-app #ph-set-search-input::-moz-placeholder{
  color:#b9bfd8 !important;
  opacity:1 !important;
}
#pokehub-app select.ph-pack-detail-filter option{
  color:#f5f2ff !important;
  background:#0e1020 !important;
}
</style>



<style id="ph-leaderboard-period-tabs-css">
/* Daily / weekly / all-time tabs, scoped to the existing dark gold leaderboard. */
#pokehub-app .ph-lb-period-tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;margin:0 0 10px;padding:6px;border:1px solid rgba(255,211,92,.22);border-radius:12px;background:rgba(8,10,15,.72);}
#pokehub-app .ph-lb-period-tab{appearance:none;min-width:0;min-height:40px;padding:9px 8px;border:1px solid rgba(255,211,92,.12);border-radius:8px;background:rgba(255,255,255,.025);color:#d8d8e5;font:inherit;font-size:12px;font-weight:900;line-height:1.2;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease;white-space:nowrap;}
#pokehub-app .ph-lb-period-tab:hover{border-color:rgba(255,211,92,.5);color:#ffe274;background:rgba(255,211,92,.07);}
#pokehub-app .ph-lb-period-tab.ph-is-active{border-color:rgba(255,211,92,.65);background:linear-gradient(110deg,rgba(255,211,92,.19),rgba(255,211,92,.07));color:#ffe274;box-shadow:inset 0 0 0 1px rgba(255,211,92,.06),0 0 14px rgba(255,211,92,.045);}
#pokehub-app .ph-lb-period-tab:focus-visible{outline:2px solid #ffd35c;outline-offset:2px;}
#pokehub-app .ph-lb-period-note{margin:0 0 12px;color:#aaa9bd;font-size:10px;line-height:1.5;}
#pokehub-app .ph-lb-period-error{margin:0 0 12px;padding:12px;border:1px solid rgba(255,130,130,.42);border-radius:10px;background:rgba(255,90,90,.07);color:#f0dada;font-size:12px;line-height:1.55;overflow-wrap:anywhere;}
#pokehub-app .ph-lb-period-error strong{display:block;margin-bottom:4px;color:#ffb9b9;}
#pokehub-app .ph-lb-period-error-detail{margin-top:6px;color:#b8a9a9;font-size:10px;}
@media(max-width:420px){#pokehub-app .ph-lb-period-tabs{gap:5px;padding:5px;}#pokehub-app .ph-lb-period-tab{font-size:11px;min-height:38px;padding:8px 4px;}}
</style>


<style id="ph-psa-grading-addon-css">
#pokehub-app .ph-psa-tool{border-color:rgba(255,211,92,.34);}
#pokehub-app .ph-psa-badge{background:#ffd35c;color:#15120a;border-radius:20px;padding:1px 7px;font-size:11px;font-weight:900;}
#pokehub-app #ph-psa-modal .ph-modal-card{border-color:rgba(255,211,92,.34);background:radial-gradient(ellipse at 100% 0%,rgba(255,211,92,.08),transparent 42%),#101116;}
#pokehub-app #ph-psa-modal .ph-modal-title{padding-right:40px;color:#ffe274;font-family:'Space Grotesk',system-ui,sans-serif;font-size:19px;font-weight:900;}
#pokehub-app .ph-psa-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin:0 0 12px;padding:5px;border:1px solid rgba(255,211,92,.2);border-radius:11px;background:rgba(0,0,0,.25);}
#pokehub-app .ph-psa-tab{min-width:0;border:1px solid transparent;border-radius:8px;padding:9px 8px;background:transparent;color:#c0c2d5;font:inherit;font-size:12px;font-weight:800;cursor:pointer;}
#pokehub-app .ph-psa-tab.ph-is-active{border-color:rgba(255,211,92,.5);background:rgba(255,211,92,.12);color:#ffe274;}
#pokehub-app .ph-psa-note{margin:0 0 12px;padding:10px 12px;border:1px solid rgba(255,211,92,.18);border-radius:10px;background:rgba(255,211,92,.045);color:#c6c6d7;font-size:11px;line-height:1.5;}
#pokehub-app .ph-psa-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(145px,1fr));gap:10px;}
#pokehub-app .ph-psa-card{min-width:0;padding:9px;border:1px solid #30324a;border-radius:12px;background:linear-gradient(160deg,#1a1c30,#10111c);}
#pokehub-app .ph-psa-card-img{position:relative;display:flex;align-items:center;justify-content:center;aspect-ratio:245/337;overflow:hidden;border-radius:8px;background:#0c0e18;border:1px solid rgba(255,255,255,.08);}
#pokehub-app .ph-psa-card-img img{display:block;max-width:100%;max-height:100%;width:100%;height:100%;object-fit:contain;}
#pokehub-app .ph-psa-card-name{margin-top:8px;color:#fff;font-size:11px;font-weight:800;line-height:1.35;overflow-wrap:anywhere;}
#pokehub-app .ph-psa-card-meta{margin-top:4px;color:#aaaec6;font-size:9px;line-height:1.45;overflow-wrap:anywhere;}
#pokehub-app .ph-psa-card-price{margin-top:5px;color:#ffd35c;font-size:10px;font-weight:800;}
#pokehub-app .ph-psa-submit{display:block;width:100%;margin-top:8px;padding:9px 7px;border:1px solid rgba(255,211,92,.36);border-radius:8px;background:linear-gradient(110deg,rgba(255,211,92,.16),rgba(255,211,92,.07));color:#ffe274;font:inherit;font-size:10px;font-weight:900;cursor:pointer;}
#pokehub-app .ph-psa-submit:disabled{opacity:.55;cursor:wait;}
#pokehub-app .ph-psa-qty{margin-top:5px;color:#8e91ad;font-size:9px;text-align:center;}
#pokehub-app .ph-psa-slab{position:relative;display:grid;grid-template-columns:68px minmax(0,1fr);gap:9px;padding:7px;border:1px solid rgba(255,211,92,.32);border-radius:10px;background:linear-gradient(135deg,#252735,#101116);}
#pokehub-app .ph-psa-slab-top{position:absolute;left:7px;right:7px;top:7px;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:4px;padding:5px 6px;border-radius:5px;background:linear-gradient(100deg,#b9202e,#e03845);color:#fff;font-size:8px;font-weight:1000;letter-spacing:.06em;}
#pokehub-app .ph-psa-slab-grade{display:block;font-size:14px;line-height:1.1;}
#pokehub-app .ph-psa-slab-img{margin-top:31px;aspect-ratio:245/337;overflow:hidden;border:2px solid #a5a6af;border-radius:5px;background:#080a12;}
#pokehub-app .ph-psa-slab-img img{width:100%;height:100%;object-fit:contain;display:block;}
#pokehub-app .ph-psa-slab-copy{min-width:0;padding-top:34px;}
#pokehub-app .ph-psa-slab-name{color:#fff2bd;font-size:11px;font-weight:900;line-height:1.35;overflow-wrap:anywhere;}
#pokehub-app .ph-psa-grade-big{margin:5px 0 2px;color:#ffd35c;font-family:'Space Grotesk',system-ui,sans-serif;font-size:27px;font-weight:1000;line-height:1;}
#pokehub-app .ph-psa-grade-label{color:#8dffc4;font-size:10px;font-weight:900;}
#pokehub-app .ph-psa-date{margin-top:7px;color:#9295b0;font-size:9px;line-height:1.45;}
#pokehub-app .ph-psa-empty{padding:26px 12px;border:1px dashed rgba(255,211,92,.22);border-radius:10px;color:#b2b5cd;text-align:center;font-size:12px;line-height:1.6;}
#pokehub-app .ph-psa-result{margin-bottom:12px;padding:12px;border:1px solid rgba(107,232,192,.28);border-radius:11px;background:rgba(107,232,192,.06);color:#d9fff0;font-size:12px;line-height:1.5;}
#pokehub-app .ph-lb-view-tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;margin:0 0 12px;padding:6px;border:1px solid rgba(255,211,92,.2);border-radius:12px;background:rgba(8,10,15,.62);}
#pokehub-app .ph-lb-view-tab{min-width:0;min-height:38px;padding:8px;border:1px solid rgba(255,211,92,.12);border-radius:8px;background:rgba(255,255,255,.025);color:#d8d8e5;font:inherit;font-size:11px;font-weight:900;cursor:pointer;}
#pokehub-app .ph-lb-view-tab.ph-is-active{border-color:rgba(255,211,92,.65);background:linear-gradient(110deg,rgba(255,211,92,.19),rgba(255,211,92,.07));color:#ffe274;box-shadow:inset 0 0 0 1px rgba(255,211,92,.06);}
#pokehub-app .ph-lb-unlucky-value{color:#ff9696 !important;}
@media(max-width:560px){#pokehub-app .ph-psa-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;}#pokehub-app .ph-psa-card{padding:7px;}#pokehub-app #ph-psa-modal .ph-modal-title{font-size:16px;}#pokehub-app .ph-lb-view-tab{font-size:9px;padding:7px 3px;}}
</style>


<style id="ph-trainer-profile-addon-css">
#pokehub-app #ph-profile-btn{display:flex!important;visibility:visible!important;opacity:1!important;flex:0 0 auto;cursor:pointer!important;border-color:rgba(107,232,192,.52)!important;color:#f2f1fb!important;box-shadow:inset 0 0 0 1px rgba(107,232,192,.035);}
#pokehub-app #ph-profile-btn:hover{border-color:#6be8c0!important;color:#8ff5c8!important;}
#pokehub-app .ph-profile-tool{border-color:rgba(107,232,192,.32);}
#pokehub-app .ph-lb-profile-link{cursor:pointer!important;position:relative;transition:color .15s ease,text-shadow .15s ease;outline-offset:3px;}
#pokehub-app .ph-lb-profile-link::after{content:"<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2197.png" alt="↗" class="wp-smiley" style="height: 1em; max-height: 1em;" />";display:inline-block;margin-left:5px;color:#6be8c0;font-size:.78em;opacity:.55;}
#pokehub-app .ph-lb-profile-link:hover{color:#8ff5cd!important;text-shadow:0 0 12px rgba(107,232,192,.18);}
#pokehub-app .ph-lb-profile-link:focus-visible{outline:2px solid #6be8c0;border-radius:4px;}
#pokehub-app #ph-trainer-profile-modal{z-index:2147483600!important;}
#pokehub-app #ph-trainer-profile-modal .ph-modal-card{border-color:rgba(107,232,192,.3);background:radial-gradient(ellipse at 100% 0%,rgba(107,232,192,.07),transparent 42%),#101116;}
#pokehub-app #ph-trainer-profile-modal .ph-modal-title{padding-right:40px;color:#ffe274;font-family:'Space Grotesk',system-ui,sans-serif;font-size:19px;font-weight:900;}
#pokehub-app .ph-profile-intro{display:flex;align-items:center;gap:12px;padding:12px;border:1px solid rgba(255,211,92,.18);border-radius:12px;background:linear-gradient(115deg,rgba(255,211,92,.07),rgba(107,232,192,.035));margin-bottom:12px;}
#pokehub-app .ph-profile-avatar{flex:0 0 58px;width:58px;height:58px;border:1px solid rgba(255,211,92,.42);border-radius:50%;display:flex;align-items:center;justify-content:center;overflow:hidden;background:#1a1c30;color:#ffd35c;font-size:25px;}
#pokehub-app .ph-profile-avatar img{width:100%;height:100%;object-fit:contain;}
#pokehub-app .ph-profile-nick{font-size:18px;font-weight:1000;color:#fff1be;overflow-wrap:anywhere;line-height:1.2;}
#pokehub-app .ph-profile-sub{margin-top:4px;color:#a7a9c0;font-size:10px;line-height:1.5;}
#pokehub-app .ph-profile-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px;margin:0 0 13px;}
#pokehub-app .ph-profile-stat{min-width:0;padding:10px 7px;border:1px solid rgba(255,255,255,.07);border-radius:10px;background:rgba(255,255,255,.025);text-align:center;}
#pokehub-app .ph-profile-stat-v{font-size:17px;font-weight:1000;color:#ffe274;line-height:1.15;overflow-wrap:anywhere;}
#pokehub-app .ph-profile-stat-l{margin-top:4px;color:#a7a9bf;font-size:9px;line-height:1.35;}
#pokehub-app .ph-profile-tabs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:5px;margin-bottom:12px;padding:5px;border:1px solid rgba(255,211,92,.18);border-radius:11px;background:rgba(0,0,0,.22);}
#pokehub-app .ph-profile-tab{min-width:0;padding:8px 4px;border:1px solid transparent;border-radius:7px;background:transparent;color:#c5c6d8;font:inherit;font-size:10px;font-weight:900;line-height:1.3;cursor:pointer;}
#pokehub-app .ph-profile-tab.ph-is-active{border-color:rgba(107,232,192,.36);background:rgba(107,232,192,.09);color:#8ef6c2;}
#pokehub-app .ph-profile-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:9px;}
#pokehub-app .ph-profile-card{min-width:0;padding:7px;border:1px solid rgba(255,211,92,.16);border-radius:10px;background:linear-gradient(160deg,#1a1c30,#10111c);}
#pokehub-app .ph-profile-card-art{aspect-ratio:245/337;overflow:hidden;border-radius:7px;background:#0c0e18;display:flex;align-items:center;justify-content:center;color:#ffd35c;}
#pokehub-app .ph-profile-card-art img{width:100%;height:100%;object-fit:contain;display:block;}
#pokehub-app .ph-profile-card-name{margin-top:7px;color:#fff2bf;font-size:10px;font-weight:900;line-height:1.35;overflow-wrap:anywhere;}
#pokehub-app .ph-profile-card-meta{margin-top:3px;color:#a5a8c0;font-size:9px;line-height:1.4;overflow-wrap:anywhere;}
#pokehub-app .ph-profile-grade{display:inline-block;margin-top:5px;padding:3px 5px;border-radius:5px;background:rgba(255,211,92,.12);border:1px solid rgba(255,211,92,.28);color:#ffe274;font-size:9px;font-weight:1000;}
#pokehub-app .ph-profile-subhead{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:12px 0 8px;color:#ffe274;font-size:12px;font-weight:900;}
#pokehub-app .ph-profile-empty{padding:20px 12px;border:1px dashed rgba(255,211,92,.2);border-radius:10px;color:#b8bbd0;text-align:center;font-size:11px;line-height:1.6;}
#pokehub-app .ph-profile-history{display:flex;flex-direction:column;gap:7px;}
#pokehub-app .ph-profile-history-row{display:grid;grid-template-columns:1fr auto;gap:8px;padding:9px 10px;border:1px solid rgba(255,255,255,.07);border-radius:9px;background:rgba(255,255,255,.025);}
#pokehub-app .ph-profile-history-title{color:#f4e8bf;font-size:10px;font-weight:900;line-height:1.4;}
#pokehub-app .ph-profile-history-meta{margin-top:3px;color:#979bb5;font-size:9px;line-height:1.45;}
#pokehub-app .ph-profile-history-value{align-self:center;color:#8ff5c8;font-size:11px;font-weight:900;text-align:right;white-space:nowrap;}
#pokehub-app .ph-profile-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 12px;padding:12px;border:1px solid rgba(107,232,192,.23);border-radius:11px;background:rgba(107,232,192,.045);}
#pokehub-app .ph-profile-privacy{display:flex;align-items:flex-start;gap:9px;flex:1;min-width:210px;color:#e6e6f1;font-size:11px;font-weight:800;line-height:1.45;}
#pokehub-app .ph-profile-privacy input{margin-top:2px;accent-color:#6be8c0;width:16px;height:16px;flex:0 0 16px;}
#pokehub-app .ph-profile-message{margin:0 0 10px;padding:10px 12px;border:1px solid rgba(107,232,192,.2);border-radius:9px;background:rgba(107,232,192,.045);color:#d6f8e9;font-size:10px;line-height:1.55;overflow-wrap:anywhere;}
#pokehub-app .ph-profile-message.ph-error{border-color:rgba(255,130,130,.32);background:rgba(255,90,90,.06);color:#ffc5c5;}
#pokehub-app .ph-profile-foot{margin-top:12px;color:#7f839b;font-size:9px;line-height:1.55;}
@media(max-width:560px){
 #pokehub-app #ph-trainer-profile-modal{align-items:flex-start!important;justify-content:flex-start!important;padding:76px 10px 10px!important;box-sizing:border-box!important;}
 #pokehub-app #ph-trainer-profile-modal>.ph-modal-card{display:flex!important;flex-direction:column!important;width:calc(100vw - 20px)!important;max-width:none!important;height:calc(100dvh - 86px)!important;max-height:calc(100dvh - 86px)!important;min-height:0!important;margin:0!important;padding:14px 12px 68px!important;overflow:hidden!important;box-sizing:border-box!important;}
 #pokehub-app #ph-trainer-profile-modal .ph-modal-body{flex:1 1 0%!important;min-height:0!important;max-height:none!important;overflow-y:auto!important;overflow-x:hidden!important;-webkit-overflow-scrolling:touch!important;}
 #pokehub-app .ph-profile-stats{grid-template-columns:repeat(2,minmax(0,1fr));}
 #pokehub-app .ph-profile-tabs{grid-template-columns:repeat(2,minmax(0,1fr));}
 #pokehub-app .ph-profile-card-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;}
 #pokehub-app .ph-profile-card{padding:5px;}
 #pokehub-app .ph-profile-card-name{font-size:9px;}
 #pokehub-app .ph-profile-intro{padding:9px;}
 #pokehub-app .ph-profile-avatar{width:48px;height:48px;flex-basis:48px;}
 #pokehub-app #ph-trainer-profile-modal .ph-modal-title{font-size:16px;}
}
</style>


<style id="ph-trainer-profile-click-fix-v6">
/* Keep the toolbar above incidental theme overlays, without covering modal dialogs. */
#pokehub-app .ph-tools{
  position:relative!important;
  z-index:500!important;
  pointer-events:auto!important;
  isolation:isolate;
}
#pokehub-app #ph-profile-btn{
  display:flex!important;
  visibility:visible!important;
  opacity:1!important;
  position:relative!important;
  z-index:501!important;
  pointer-events:auto!important;
  cursor:pointer!important;
  touch-action:manipulation!important;
  -webkit-tap-highlight-color:rgba(107,232,192,.18);
}
#pokehub-app #ph-profile-btn *{pointer-events:none!important;}
#pokehub-app #ph-profile-btn[data-ph-profile-bound="1"]{cursor:pointer!important;pointer-events:auto!important;touch-action:manipulation!important;}
#pokehub-app #ph-profile-btn:focus-visible{outline:2px solid #6be8c0!important;outline-offset:3px!important;}
#pokehub-app .ph-lb-profile-link[data-ph-profile-uid]{
  pointer-events:auto!important;
  cursor:pointer!important;
  touch-action:manipulation!important;
}
#pokehub-app #ph-trainer-profile-modal[hidden]{display:none!important;}
#pokehub-app #ph-trainer-profile-modal:not([hidden]){
  display:flex!important;
  pointer-events:auto!important;
}
#pokehub-app #ph-trainer-profile-modal:not([hidden]) .ph-modal-card,
#pokehub-app #ph-trainer-profile-modal:not([hidden]) .ph-modal-close,
#pokehub-app #ph-trainer-profile-modal:not([hidden]) .ph-modal-backdrop{pointer-events:auto!important;}
</style>


<style id="ph-trainer-profile-click-fix-v9">
#pokehub-app .ph-tools{position:relative!important;z-index:2147483200!important;pointer-events:auto!important;}
#pokehub-app #ph-profile-btn{position:relative!important;z-index:2147483201!important;pointer-events:auto!important;touch-action:manipulation!important;cursor:pointer!important;}
#pokehub-app #ph-profile-btn>*{pointer-events:none!important;}
</style>
<style id="ph-toolbar-hide-under-modal-v1">
#pokehub-app:has(.ph-modal:not([hidden])) .ph-tools,
#pokehub-app.ph-modal-is-open .ph-tools{
  z-index:0 !important;
  isolation:auto !important;
  visibility:hidden !important;
  pointer-events:none !important;
}
#pokehub-app:has(.ph-modal:not([hidden])) #ph-profile-btn,
#pokehub-app.ph-modal-is-open #ph-profile-btn{
  z-index:0 !important;
  pointer-events:none !important;
}
#pokehub-app .ph-modal:not([hidden]){
  z-index:2147483000 !important;
}
</style>

<script>
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  if(!app) return;
  function sync(){
    var open=!!app.querySelector(".ph-modal:not([hidden])");
    app.classList.toggle("ph-modal-is-open",open);
  }
  sync();
  if(window.MutationObserver){
    new MutationObserver(sync).observe(app,{subtree:true,attributes:true,attributeFilter:["hidden"],childList:true});
  }
  setInterval(sync,500);
})();
</script>

<!-- ============================================================
     ADD-ON v26: MENU HOẠT ĐỘNG GỌN
     Chỉ thay đổi bố trí menu; các chức năng/modal gốc tiếp tục dùng ID hiện có.
     ============================================================ -->
<style id="ph-activity-menu-v26-css">
  #pokehub-app .ph-tools{
    align-items:center;
    column-gap:8px;
    row-gap:8px;
  }
  #pokehub-app .ph-activity{
    position:relative;
    display:inline-flex;
    flex:0 0 auto;
    align-items:center;
  }
  #pokehub-app #ph-activity-toggle{
    border-color:rgba(255,211,92,.38);
    color:#f2f1fb;
    white-space:nowrap;
  }
  #pokehub-app #ph-activity-toggle[aria-expanded="true"]{
    border-color:#ffd35c;
    color:#ffd35c;
    background:#1b1d38;
  }
  #pokehub-app .ph-activity-chevron{
    display:inline-block;
    margin-left:1px;
    font-size:12px;
    transition:transform .16s ease;
  }
  #pokehub-app #ph-activity-toggle[aria-expanded="true"] .ph-activity-chevron{
    transform:rotate(180deg);
  }
  #pokehub-app .ph-activity-menu{
    position:absolute;
    top:calc(100% + 8px);
    right:0;
    z-index:2147483202;
    display:flex;
    flex-direction:column;
    gap:6px;
    width:max-content;
    min-width:230px;
    max-width:min(290px,calc(100vw - 44px));
    padding:8px;
    border:1px solid rgba(148,151,196,.28);
    border-radius:13px;
    background:linear-gradient(150deg,#191b35,#101221 80%);
    box-shadow:0 18px 44px rgba(0,0,0,.55),0 0 0 1px rgba(255,255,255,.025) inset;
  }
  #pokehub-app .ph-activity-menu[hidden]{display:none!important;}
  #pokehub-app .ph-activity-menu > .ph-tool{
    display:flex;
    width:100%;
    min-height:40px;
    height:auto;
    flex:0 0 auto;
    justify-content:flex-start;
    padding:9px 12px;
    border-radius:8px;
    text-align:left;
    white-space:nowrap;
  }
  #pokehub-app .ph-activity-menu > .ph-tool:hover{
    background:#222544;
  }
  #pokehub-app .ph-activity-menu > #ph-daily-btn{
    border-color:rgba(255,211,92,.24);
  }
  #pokehub-app #ph-daily-badge{
    margin-left:auto;
  }
  #pokehub-app #ph-leaderboard-btn .ph-lb-status{
    max-width:92px;
    overflow:hidden;
    text-overflow:ellipsis;
    white-space:nowrap;
  }
  @media(max-width:700px){
    #pokehub-app .ph-tools{justify-content:flex-start;}
    /* Keep the leaderboard's LIVE state visible on mobile as a compact dot. */
    #pokehub-app #ph-leaderboard-btn .ph-lb-status{
      display:inline-flex !important;
      align-items:center;
      justify-content:center;
      flex:0 0 10px;
      width:10px;
      min-width:10px;
      max-width:10px !important;
      height:10px;
      padding:0;
      overflow:visible !important;
      border:0;
      border-radius:50%;
      background:transparent;
      color:transparent;
      font-size:0 !important;
      line-height:0;
      letter-spacing:0;
      text-overflow:clip;
    }
    #pokehub-app #ph-leaderboard-btn .ph-lb-status::before{
      content:"";
      display:block;
      width:7px;
      height:7px;
      border-radius:50%;
      background:#9497c4;
      box-shadow:0 0 0 2px rgba(148,151,196,.12);
    }
    #pokehub-app #ph-leaderboard-btn .ph-lb-status.ph-lb-online::before{
      background:#6be8c0;
      box-shadow:0 0 0 2px rgba(107,232,192,.18),0 0 9px rgba(107,232,192,.58);
    }
    /* Mobile: anchor the dropdown to the toggle's left edge instead of right-aligning it,
       which could push the menu outside the widget/viewport and clip its labels. */
    #pokehub-app .ph-activity{position:relative!important;overflow:visible!important;}
    #pokehub-app .ph-activity-menu{
      left:0!important;
      right:auto!important;
      width:min(270px,calc(100vw - 40px))!important;
      min-width:0!important;
      max-width:calc(100vw - 40px)!important;
      box-sizing:border-box!important;
    }
    #pokehub-app .ph-activity-menu > .ph-tool{max-width:100%;box-sizing:border-box;}
  }
  @media(max-width:380px){
    #pokehub-app .ph-tools{gap:6px;}
    #pokehub-app .ph-tool{padding-left:9px;padding-right:9px;gap:5px;font-size:12px;}
    #pokehub-app .ph-activity-menu > .ph-tool{padding:9px 11px;font-size:12.5px;}
  }
</style>
<script id="ph-activity-menu-v26-js">
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  if(!app || app.dataset.phActivityMenuBound==="1") return;

  var activity=app.querySelector("#ph-activity");
  var toggle=app.querySelector("#ph-activity-toggle");
  var menu=app.querySelector("#ph-activity-menu");
  if(!activity || !toggle || !menu) return;
  app.dataset.phActivityMenuBound="1";

  function closeMenu(returnFocus){
    menu.hidden=true;
    toggle.setAttribute("aria-expanded","false");
    if(returnFocus){
      try{toggle.focus({preventScroll:true});}
      catch(e){toggle.focus();}
    }
  }

  toggle.addEventListener("click",function(event){
    event.preventDefault();
    event.stopPropagation();
    var willOpen=menu.hidden;
    menu.hidden=!willOpen;
    toggle.setAttribute("aria-expanded",willOpen?"true":"false");
  });

  /* Close the dropdown when clicking elsewhere, without intercepting the feature buttons. */
  document.addEventListener("click",function(event){
    if(!activity.contains(event.target) && !menu.hidden) closeMenu(false);
  });

  /* Menu items retain their original IDs and click handlers; hide only the dropdown afterward. */
  menu.addEventListener("click",function(event){
    var item=event.target && event.target.closest ? event.target.closest("button") : null;
    if(!item || !menu.contains(item)) return;
    window.setTimeout(function(){
      menu.hidden=true;
      toggle.setAttribute("aria-expanded","false");
      var modalOpen=!!app.querySelector(".ph-modal:not([hidden])");
      if(!modalOpen && menu.contains(document.activeElement)){
        try{toggle.focus({preventScroll:true});}
        catch(e){toggle.focus();}
      }
    },0);
  });

  document.addEventListener("keydown",function(event){
    if(event.key==="Escape" && !menu.hidden){
      closeMenu(true);
    }
  });
})();
</script>
<!-- ============================================================
     ADD-ON v28: KHÓA CUỘN NỀN CHỈ TRÊN DESKTOP
     Trên mobile giữ cuộn trang tự nhiên; desktop giữ vị trí bài viết.
     Không khóa trang khi chỉ mở menu Hoạt động.
     ============================================================ -->
<style id="ph-modal-scroll-lock-v28-css">
  html.ph-pokehub-scroll-locked,
  body.ph-pokehub-scroll-locked{
    overscroll-behavior:none !important;
  }
  body.ph-pokehub-scroll-locked{
    position:fixed !important;
    top:var(--ph-pokehub-lock-top,0px) !important;
    left:0 !important;
    right:0 !important;
    width:auto !important;
    overflow:hidden !important;
  }
  #pokehub-app .ph-modal:not([hidden]),
  #pokehub-app .ph-modal:not([hidden]) .ph-modal-card,
  #pokehub-app .ph-modal:not([hidden]) .ph-modal-body,
  #pokehub-app .ph-modal:not([hidden]) [class*="scroll"],
  #pokehub-app .ph-modal:not([hidden]) [class*="list"],
  #pokehub-app .ph-modal:not([hidden]) [class*="body"]{
    overscroll-behavior-y:contain;
  }
  @media(max-width:700px){
    #pokehub-app .ph-modal:not([hidden]),
    #pokehub-app .ph-modal:not([hidden]) .ph-modal-card,
    #pokehub-app .ph-modal:not([hidden]) .ph-modal-body,
    #pokehub-app .ph-modal:not([hidden]) [class*="scroll"],
    #pokehub-app .ph-modal:not([hidden]) [class*="list"],
    #pokehub-app .ph-modal:not([hidden]) [class*="body"]{
      overscroll-behavior-y:auto;
    }
  }
</style>
<script id="ph-modal-scroll-lock-v28-js">
(function(){
  "use strict";
  var app=document.getElementById("pokehub-app");
  var body=document.body;
  var root=document.documentElement;
  if(!app || !body || !root || window.__phModalScrollLockV28) return;
  window.__phModalScrollLockV28=true;

  var locked=false;
  var savedScrollY=0;
  var saved={};

  function saveInlineStyles(){
    saved={
      bodyPosition:body.style.position,
      bodyTop:body.style.top,
      bodyLeft:body.style.left,
      bodyRight:body.style.right,
      bodyWidth:body.style.width,
      bodyOverflow:body.style.overflow,
      bodyPaddingRight:body.style.paddingRight,
      bodyOverscroll:body.style.overscrollBehavior,
      rootOverflow:root.style.overflow,
      rootOverscroll:root.style.overscrollBehavior,
      lockTop:body.style.getPropertyValue("--ph-pokehub-lock-top"),
      lockTopPriority:body.style.getPropertyPriority("--ph-pokehub-lock-top")
    };
  }

  function lockPage(){
    if(locked) return;
    locked=true;
    savedScrollY=window.pageYOffset || root.scrollTop || body.scrollTop || 0;
    saveInlineStyles();

    var scrollbarGap=Math.max(0,window.innerWidth-root.clientWidth);
    var currentPadding=parseFloat(window.getComputedStyle(body).paddingRight)||0;

    body.classList.add("ph-pokehub-scroll-locked");
    root.classList.add("ph-pokehub-scroll-locked");
    body.style.setProperty("--ph-pokehub-lock-top",(-savedScrollY)+"px");
    body.style.position="fixed";
    body.style.top=(-savedScrollY)+"px";
    body.style.left="0";
    body.style.right="0";
    body.style.width="auto";
    body.style.overflow="hidden";
    body.style.overscrollBehavior="none";
    root.style.overflow="hidden";
    root.style.overscrollBehavior="none";
    if(scrollbarGap>0) body.style.paddingRight=(currentPadding+scrollbarGap)+"px";
  }

  function restoreInlineStyle(element,property,value){
    if(value) element.style.setProperty(property,value);
    else element.style.removeProperty(property);
  }

  function unlockPage(){
    if(!locked) return;
    locked=false;
    body.classList.remove("ph-pokehub-scroll-locked");
    root.classList.remove("ph-pokehub-scroll-locked");

    restoreInlineStyle(body,"position",saved.bodyPosition);
    restoreInlineStyle(body,"top",saved.bodyTop);
    restoreInlineStyle(body,"left",saved.bodyLeft);
    restoreInlineStyle(body,"right",saved.bodyRight);
    restoreInlineStyle(body,"width",saved.bodyWidth);
    restoreInlineStyle(body,"overflow",saved.bodyOverflow);
    restoreInlineStyle(body,"padding-right",saved.bodyPaddingRight);
    restoreInlineStyle(body,"overscroll-behavior",saved.bodyOverscroll);
    restoreInlineStyle(root,"overflow",saved.rootOverflow);
    restoreInlineStyle(root,"overscroll-behavior",saved.rootOverscroll);
    if(saved.lockTop){
      body.style.setProperty("--ph-pokehub-lock-top",saved.lockTop,saved.lockTopPriority);
    }else{
      body.style.removeProperty("--ph-pokehub-lock-top");
    }

    window.scrollTo(0,savedScrollY);
  }

  function isMobileViewport(){
    /* Match the existing mobile menu breakpoint. */
    if(window.matchMedia) return window.matchMedia("(max-width: 700px)").matches;
    return window.innerWidth <= 700;
  }

  function syncModalScrollLock(){
    var modalOpen=!!app.querySelector(".ph-modal:not([hidden])");
    /* Do not lock scrolling on phones/small screens; only desktop gets the lock. */
    if(modalOpen &#038;&#038; !isMobileViewport()) lockPage();
    else unlockPage();
  }

  syncModalScrollLock();
  /* Re-evaluate after device rotation or viewport resizing while a modal is open. */
  window.addEventListener("resize",syncModalScrollLock,{passive:true});
  window.addEventListener("orientationchange",syncModalScrollLock,{passive:true});
  if(window.MutationObserver){
    new MutationObserver(syncModalScrollLock).observe(app,{
      subtree:true,
      childList:true,
      attributes:true,
      attributeFilter:["hidden"]
    });
  }
  /* Fallback for legacy scripts that change modal visibility unusually. */
  window.setInterval(syncModalScrollLock,500);
})();
</script>
<style id="ph-psa-slab-uniform-fix-v1">
/* Lưới: mọi thẻ cao bằng nhau */
#pokehub-app .ph-psa-grid{
  grid-template-columns:repeat(auto-fill,minmax(150px,1fr)) !important;
  align-items:stretch !important;
}
#pokehub-app .ph-psa-graded-item{
  display:flex !important;
  min-width:0 !important;
}

/* Slab xếp dọc: thanh đỏ trên, ảnh giữa, chữ dưới */
#pokehub-app .ph-psa-slab{
  display:flex !important;
  flex-direction:column !important;
  width:100% !important;
  padding:8px !important;
  gap:0 !important;
}
#pokehub-app .ph-psa-slab-top{
  position:static !important;
  margin:0 0 8px !important;
  flex-wrap:nowrap !important;
  white-space:nowrap !important;
  overflow:hidden !important;
  font-size:7px !important;
}
#pokehub-app .ph-psa-slab-top span:first-child{
  overflow:hidden !important;
  text-overflow:ellipsis !important;
}
#pokehub-app .ph-psa-slab-img{
  margin:0 auto !important;
  width:100% !important;
  max-width:112px !important;
}
#pokehub-app .ph-psa-slab-copy{
  flex:1 1 auto !important;
  padding-top:8px !important;
  text-align:center !important;
  min-width:0 !important;
}

/* Tên thẻ: tối đa 2 dòng, luôn chiếm chỗ đều nhau */
#pokehub-app .ph-psa-slab-name{
  display:-webkit-box !important;
  -webkit-line-clamp:2 !important;
  -webkit-box-orient:vertical !important;
  overflow:hidden !important;
  min-height:30px !important;
  font-size:11px !important;
}
#pokehub-app .ph-psa-grade-big{font-size:24px !important;}

/* Ngày và giá tách dòng, chữ nhỏ gọn */
#pokehub-app .ph-psa-date{
  white-space:pre-line !important;
  font-size:9px !important;
  line-height:1.5 !important;
}

@media(max-width:560px){
  #pokehub-app .ph-psa-grid{grid-template-columns:repeat(2,minmax(0,1fr)) !important;}
  #pokehub-app .ph-psa-slab-img{max-width:96px !important;}
}
</style>



<details style="
  margin: 30px auto 10px;
  max-width: 100%;
  background: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 10px;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  overflow: hidden;
  box-shadow: 0 2px 5px rgba(0,0,0,0.03);
">
  <summary style="
    padding: 12px 16px;
    font-size: 13px;
    font-weight: 600;
    color: #4a5568;
    cursor: pointer;
    user-select: none;
    background: #f8fafc;
    display: flex;
    align-items: center;
    justify-content: space-between;
    outline: none;
  ">
    <span><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2696.png" alt="⚖" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Tuyên bố miễn trừ trách nhiệm / Disclaimer</span>
    <span style="font-size: 11px; color: #94a3b8; font-weight: normal;">(Bấm để xem)</span>
  </summary>

  <div style="
    padding: 16px;
    border-top: 1px solid #e2e8f0;
    font-size: 12px;
    line-height: 1.6;
    color: #475569;
    background: #ffffff;
    text-align: justify;
  ">
    <!-- KHỐI TIẾNG VIỆT -->
    <div style="margin-bottom: 16px;">
      <div style="font-weight: 700; color: #1e293b; margin-bottom: 8px; display: flex; align-items: center; gap: 6px;">
        <span style="background: #e2e8f0; color: #334155; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: bold;">VIE</span>
        Tiếng Việt
      </div>
      <div style="margin: 0 0 8px 0;">Công cụ này là một dự án fan-made/unofficial được tạo nhằm mục đích giải trí và trải nghiệm mô phỏng mở pack trực tuyến. Công cụ không bán, phân phối hoặc cung cấp sản phẩm thẻ bài vật lý và không thu bất kỳ khoản phí nào để sử dụng tính năng mô phỏng.</div>
      <div style="margin: 0 0 8px 0;">Tên thương hiệu, tên sản phẩm, nhân vật, hình ảnh, artwork và các tài sản trí tuệ liên quan đến Pokémon, Yu-Gi-Oh!, One Piece hoặc các bên thứ ba tương ứng thuộc về chủ sở hữu quyền của chúng. VNGame không tuyên bố quyền sở hữu đối với các tài sản trí tuệ đó và không đại diện cho, không được tài trợ bởi và không có liên kết chính thức với các chủ sở hữu thương hiệu tương ứng.</div>
      <div style="margin: 0;">Nội dung trên trang được cung cấp cho mục đích thông tin và giải trí. Nếu bạn là chủ sở hữu quyền và cho rằng bất kỳ nội dung nào trên trang vi phạm quyền của bạn, vui lòng liên hệ với VNGame để yêu cầu xem xét và xử lý nội dung liên quan.</div>
    </div>

    <hr style="border: 0; border-top: 1px dashed #cbd5e1; margin: 16px 0;">

    <!-- KHỐI TIẾNG ANH -->
    <div>
      <div style="font-weight: 700; color: #1e293b; margin-bottom: 8px; display: flex; align-items: center; gap: 6px;">
        <span style="background: #3b82f6; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: bold;">ENG</span>
        English
      </div>
      <div style="margin: 0 0 8px 0;">This tool is an unofficial, fan-made project created solely for entertainment and online simulation purposes. It does not sell, distribute, or provide physical trading cards, nor does it charge any fees for using the simulation features.</div>
      <div style="margin: 0 0 8px 0;">All brand names, product titles, characters, images, artwork, and related intellectual property regarding Pokémon, Yu-Gi-Oh!, One Piece, or other respective third parties belong to their respective copyright and trademark owners. VNGame claims no ownership over these intellectual assets and is not affiliated with, endorsed, or sponsored by the brand owners.</div>
      <div style="margin: 0;">Content on this page is provided for informational and entertainment purposes only. If you are a copyright owner and believe that any content on this page infringes upon your rights, please contact VNGame directly for prompt review and removal.</div>
    </div>
  </div>
</details>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Pokémon TCG Pack Opening Simulator là gì?</mark></h3>



<p class="wp-block-paragraph">Pokémon TCG Pack Opening Simulator là công cụ mô phỏng quá trình <strong>mở booster pack Pokémon TCG</strong> trên nền tảng online. Thay vì phải mua một gói bài vật lý, bạn có thể trải nghiệm việc mở pack trực tiếp trên website.</p>



<p class="wp-block-paragraph">Mỗi lần mở pack, hệ thống sẽ hiển thị các lá bài tương ứng với expansion mà bạn lựa chọn. Bạn cũng có thể xem độ hiếm của từng card và giá trị tham khảo của các lá bài trong pack.</p>



<p class="wp-block-paragraph">Đây là một trải nghiệm phù hợp với người chơi Pokémon TCG, người sưu tầm card hoặc đơn giản là những ai thích cảm giác hồi hộp khi mở pack.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Lưu ý:</strong> Đây là simulator mang tính giải trí. Các lá bài nhận được trong simulator không phải thẻ Pokémon TCG vật lý và không được gửi đến người chơi.</p>
</blockquote>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Cách mở pack Pokémon TCG miễn phí</mark></h3>



<p class="wp-block-paragraph">Việc mở pack khá đơn giản và không yêu cầu cài đặt phần mềm.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Bước 1: Chọn Expansion</mark></h4>



<p class="wp-block-paragraph">Chọn bộ Pokémon TCG mà bạn muốn mở từ danh sách expansion có sẵn.</p>



<p class="wp-block-paragraph">Mỗi expansion có một danh sách card và pool bài riêng, vì vậy việc lựa chọn expansion sẽ ảnh hưởng đến những lá bài bạn có thể pull được.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Bước 2: Chọn số lượng pack</mark></h4>



<p class="wp-block-paragraph">Bạn có thể lựa chọn số pack muốn mở trong một lần, chẳng hạn <strong>1, 3, 5 hoặc 10 pack</strong>.</p>



<p class="wp-block-paragraph">Nếu muốn trải nghiệm cảm giác mở từng gói, hãy bắt đầu với 1 pack. Còn nếu muốn thử vận may nhanh hơn, bạn có thể mở nhiều pack cùng lúc.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Bước 3: Mở pack và xem kết quả</mark></h4>



<p class="wp-block-paragraph">Nhấn nút mở pack để bắt đầu.</p>



<p class="wp-block-paragraph">Các lá bài sẽ được hiển thị sau khi pack được mở. Hãy kiểm tra rarity, card và giá trị tham khảo để xem lượt mở của bạn may mắn đến đâu.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Các Expansion Pokémon TCG có thể mở</mark></h3>



<p class="wp-block-paragraph">Simulator hỗ trợ các expansion Pokémon TCG được tích hợp trong hệ thống. Mỗi bộ có những card, rarity và danh sách bài khác nhau.</p>



<p class="wp-block-paragraph">Một trong những expansion có thể trải nghiệm là <strong>Genetic Apex</strong>. Bạn có thể chọn expansion trực tiếp trong simulator để xem danh sách card và bắt đầu mở pack.</p>



<p class="wp-block-paragraph">Khi có thêm expansion mới, danh sách có thể được cập nhật để mang đến nhiều lựa chọn hơn cho người chơi.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Rarity trong Pokémon TCG</mark></h3>



<p class="wp-block-paragraph">Một trong những điều thú vị nhất khi mở pack Pokémon TCG là không biết mình sẽ nhận được lá bài nào.</p>



<p class="wp-block-paragraph">Các card có nhiều cấp độ độ hiếm khác nhau. Những card phổ biến thường xuất hiện thường xuyên hơn, trong khi các card có rarity cao thường khó pull hơn.</p>



<p class="wp-block-paragraph">Một số nhóm rarity mà người chơi có thể gặp gồm:</p>



<ul class="wp-block-list">
<li><strong>Common</strong> – những lá bài phổ biến.</li>



<li><strong>Uncommon</strong> – độ hiếm cao hơn Common.</li>



<li><strong>Rare</strong> – những card có độ hiếm cao hơn trong pack.</li>



<li><strong>Double Rare</strong> – nhóm card hiếm với thiết kế đặc biệt.</li>



<li><strong>Illustration Rare</strong> – các card nổi bật với artwork đặc biệt.</li>



<li><strong>Special Illustration Rare</strong> – những card có artwork đặc biệt và thường được người sưu tầm quan tâm.</li>
</ul>



<p class="wp-block-paragraph">Tùy từng expansion, hệ thống rarity và danh sách card có thể khác nhau.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Luck Score – Lượt mở của bạn may mắn đến đâu?</mark></h3>



<p class="wp-block-paragraph">Sau khi mở pack, <strong>Luck Score</strong> giúp bạn đánh giá mức độ may mắn của lượt pull.</p>



<p class="wp-block-paragraph">Điểm số được dựa trên chất lượng và độ hiếm của những card xuất hiện trong pack. Nếu bạn pull được nhiều card có rarity cao, Luck Score sẽ phản ánh một lượt mở đáng chú ý hơn.</p>



<p class="wp-block-paragraph">Bạn có thể sử dụng Luck Score như một cách vui để so sánh các lượt mở pack của mình và thử xem lần tiếp theo có thể phá kỷ lục hay không.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Xem giá trị của Pack</mark></h3>



<p class="wp-block-paragraph">Ngoài rarity, simulator còn giúp bạn xem <strong>giá trị tham khảo của những card đã pull được</strong>.</p>



<p class="wp-block-paragraph">Tổng giá trị của pack được tính dựa trên giá trị tham khảo của các card xuất hiện trong lượt mở. Đây là một cách thú vị để xem pack vừa mở có những card đáng chú ý nào.</p>



<p class="wp-block-paragraph">Tuy nhiên, giá card Pokémon TCG có thể thay đổi theo thị trường và nguồn dữ liệu. Giá hiển thị trong simulator chỉ nên được xem là <strong>giá trị tham khảo</strong>, không phải mức giá mua hoặc bán được đảm bảo.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Collection và lịch sử mở Pack</mark></h3>



<p class="wp-block-paragraph">Nếu bạn thường xuyên sử dụng simulator, việc theo dõi những card đã mở sẽ giúp trải nghiệm thú vị hơn.</p>



<p class="wp-block-paragraph">Bạn có thể quan tâm đến:</p>



<ul class="wp-block-list">
<li>Những card hiếm nhất đã pull được.</li>



<li>Expansion đã mở.</li>



<li>Luck Score cao nhất.</li>



<li>Tổng số pack đã mở.</li>



<li>Tổng giá trị tham khảo của các card.</li>



<li>Những lượt pull đặc biệt mà bạn muốn chia sẻ với bạn bè.</li>
</ul>



<p class="wp-block-paragraph">Thay vì chỉ mở một pack rồi rời đi, bạn có thể thử nhiều expansion khác nhau và xem vận may của mình thay đổi như thế nào.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Chia sẻ kết quả mở Pack</mark></h3>



<p class="wp-block-paragraph">Vừa pull được một card cực hiếm?</p>



<p class="wp-block-paragraph">Sau khi hoàn thành lượt mở pack, bạn có thể sử dụng tính năng <strong>chia sẻ ảnh kết quả</strong> để lưu lại thành quả và gửi cho bạn bè hoặc chia sẻ lên mạng xã hội.</p>



<p class="wp-block-paragraph">Đây cũng là một cách thú vị để tạo thử thách:</p>



<p class="wp-block-paragraph"><strong>Ai có Luck Score cao hơn? Ai pull được card hiếm hơn?</strong></p>



<p class="wp-block-paragraph">Hãy thử mở cùng một expansion và so sánh kết quả với bạn bè.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Pokémon TCG Pack Opening Simulator có miễn phí không?</mark></h3>



<p class="wp-block-paragraph">Có. Bạn có thể sử dụng simulator để trải nghiệm <strong>mở pack Pokémon TCG miễn phí</strong> mà không cần mua booster pack vật lý.</p>



<p class="wp-block-paragraph">Simulator được tạo ra nhằm mang đến trải nghiệm pack opening trực tuyến nhanh chóng và thuận tiện.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Có nhận được card Pokémon thật không?</mark></h3>



<p class="wp-block-paragraph">Không.</p>



<p class="wp-block-paragraph">Các card xuất hiện trong simulator chỉ là <strong>card kỹ thuật số được sử dụng cho mục đích mô phỏng</strong>. Việc mở pack trên website không tạo ra hoặc gửi cho bạn bất kỳ thẻ Pokémon TCG vật lý nào.</p>



<p class="wp-block-paragraph">Nếu bạn muốn sở hữu card thật, bạn vẫn cần mua hoặc trao đổi các sản phẩm Pokémon TCG vật lý từ những nguồn phù hợp.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">FAQ – Câu hỏi thường gặp</mark></h3>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Pokémon TCG Pack Opening Simulator có mất phí không?</mark></h4>



<p class="wp-block-paragraph">Không. Bạn có thể mở pack online miễn phí và không cần mua booster pack vật lý.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Tôi có cần đăng ký tài khoản không?</mark></h4>



<p class="wp-block-paragraph">Bạn có thể bắt đầu trải nghiệm trực tiếp trên trang simulator mà không cần thực hiện quy trình mua pack.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Simulator có phải pack Pokémon TCG thật không?</mark></h4>



<p class="wp-block-paragraph">Không. Đây là công cụ mô phỏng việc mở pack Pokémon TCG. Card nhận được trên simulator không phải card vật lý.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Tỷ lệ pull có giống pack thật không?</mark></h4>



<p class="wp-block-paragraph">Simulator sử dụng hệ thống dữ liệu và xác suất được thiết lập cho trải nghiệm mô phỏng. Vì vậy, không nên xem kết quả simulator là cam kết về tỷ lệ pull của booster pack vật lý.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Giá card được lấy từ đâu?</mark></h4>



<p class="wp-block-paragraph">Giá trị card được lấy từ nguồn dữ liệu được tích hợp vào hệ thống và được sử dụng làm giá trị tham khảo. Giá thị trường thực tế có thể thay đổi theo thời gian.</p>



<h4 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-luminous-vivid-orange-color">Có thể mở nhiều pack cùng lúc không?</mark></h4>



<p class="wp-block-paragraph">Có. Simulator hỗ trợ nhiều lựa chọn số lượng pack, giúp bạn có thể mở nhanh nhiều pack trong một lượt.</p>



<h3 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Bắt đầu mở Pack Pokémon TCG miễn phí</mark></h3>



<p class="wp-block-paragraph">Không cần mua booster pack và cũng không cần chuẩn bị bộ sưu tập card. Chỉ cần chọn expansion, chọn số lượng pack và bắt đầu thử vận may.</p>



<p class="wp-block-paragraph"><strong>Bạn sẽ pull được card nào trong lần mở tiếp theo?</strong></p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Mở Pack Pokémon TCG miễn phí ngay và xem kết quả của bạn!</strong></p>
<p>Bài viết <a href="https://vngame.tv/trai-nghiem-mo-the-pokemon-tcg-mien-phi/" data-wpel-link="internal">Mở Pack Pokémon TCG Miễn Phí – Pokémon TCG Pack Opening Simulator</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/trai-nghiem-mo-the-pokemon-tcg-mien-phi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">19159</post-id>	</item>
		<item>
		<title>Bảng xếp hạng tốc độ meta của Pokémon Champions</title>
		<link>https://vngame.tv/bang-xep-hang-toc-do-meta-cua-pokemon-champions/</link>
					<comments>https://vngame.tv/bang-xep-hang-toc-do-meta-cua-pokemon-champions/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Thu, 13 Aug 2026 20:40:44 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Bảng xếp hạng tốc độ meta của Pokémon Champions]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=17655</guid>

					<description><![CDATA[<p>Xây dựng một đội hình dựa trên meta Regulation MB hiện tại có nghĩa là bạn phải nắm chắc một điều: ai thực sự nhanh hơn ai. Garchomp, Incineroar, Kingambit, Mimikyu — những cái tên này xuất hiện trong hầu hết các đội hình hàng đầu hiện nay, và việc Pokémon của bạn ra đòn trước hay sau chúng ở cấp độ 50 thường là yếu tố quyết định giữa việc hạ gục đối thủ và bị hạ gục trước. Xin giới thiệu&#160;Meta Speed ​​Scanner&#160;(được cung cấp bởi&#160;PokehubGuide.com&#160;), một tiện ích công nghệ cao thiết yếu trong bộ&#160;công cụ Pokémon [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/bang-xep-hang-toc-do-meta-cua-pokemon-champions/" data-wpel-link="internal">Bảng xếp hạng tốc độ meta của Pokémon Champions</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Xây dựng một đội hình dựa trên meta Regulation MB hiện tại có nghĩa là bạn phải nắm chắc một điều: ai thực sự nhanh hơn ai. Garchomp, Incineroar, Kingambit, Mimikyu — những cái tên này xuất hiện trong hầu hết các đội hình hàng đầu hiện nay, và việc Pokémon của bạn ra đòn trước hay sau chúng ở cấp độ 50 thường là yếu tố quyết định giữa việc hạ gục đối thủ và bị hạ gục trước.</p>



<p class="wp-block-paragraph">Xin giới thiệu&nbsp;<strong>Meta Speed ​​Scanner</strong>&nbsp;(được cung cấp bởi&nbsp;<strong>PokehubGuide.com</strong>&nbsp;), một tiện ích công nghệ cao thiết yếu trong bộ&nbsp;<em>công cụ Pokémon Champions</em>&nbsp;của chúng tôi . Thay vì phải tự tính toán Tốc độ cho từng Pokémon hàng đầu trong meta một cách thủ công, công cụ này cung cấp cho bạn biểu đồ chuẩn có sẵn về những Pokémon đang thực sự thống trị các giải đấu Regulation MB hiện nay.</p>



<!-- ============================================================
     META SPEED SCANNER — Bảng Mốc Tốc Độ Meta Pokémon Champions
     (bởi PokehubGuide.com)
     Dán toàn bộ khối này vào trang HTML của bạn.
     Dùng tiền tố "psb-" nên không xung đột với các tool khác.
     Cấp độ cố định 50 vì Champions tự động quy mọi Pokémon về Lv.50.
     ============================================================ -->
<div id="psb-root">
  <style>
    #psb-root {
      --psb-bg: #0b0d10;
      --psb-panel: #14171c;
      --psb-red: #e3350d;
      --psb-red-dim: #7a1c08;
      --psb-amber: #ffb703;
      --psb-green: #4bd68b;
      --psb-gold: #f4c542;
      --psb-text: #eef1f4;
      --psb-muted: #8a919c;
      --psb-line: #262b33;
      font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
      color: var(--psb-text);
      background: var(--psb-bg);
      max-width: 960px;
      margin: 0 auto;
      padding: 28px;
      border-radius: 20px;
      position: relative;
      overflow: hidden;
      box-shadow: 0 0 0 1px var(--psb-line), 0 30px 60px -20px rgba(0,0,0,0.6);
    }
    #psb-root::before {
      content: "";
      position: absolute; inset: 0;
      background: repeating-linear-gradient(
        to bottom, rgba(255,255,255,0.015) 0px, rgba(255,255,255,0.015) 1px,
        transparent 1px, transparent 3px
      );
      pointer-events: none; z-index: 5;
    }
    #psb-root * { box-sizing: border-box; }

    .psb-head { display: flex; align-items: center; gap: 14px; margin-bottom: 8px; }
    .psb-lens {
      width: 22px; height: 22px; border-radius: 50%;
      background: radial-gradient(circle at 35% 30%, #fff3c4, #f4c542 45%, #8a6a0a 100%);
      box-shadow: 0 0 0 4px #1a1e24, 0 0 14px rgba(244,197,66,0.55);
      flex-shrink: 0;
    }
    .psb-brand {
      font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.16em;
      text-transform: uppercase; color: var(--psb-amber); margin-bottom: 3px;
    }
    .psb-brand b { color: var(--psb-text); font-weight: 700; }
    .psb-head h1 {
      font-family: 'Space Mono', monospace; font-size: 20px; letter-spacing: 0.14em;
      text-transform: uppercase; margin: 0; color: var(--psb-text);
    }
    .psb-head span {
      display: block; font-family: 'Space Mono', monospace; font-size: 11px;
      color: var(--psb-gold); letter-spacing: 0.08em; margin-top: 2px;
    }
    .psb-dots { margin-left: auto; display: flex; gap: 6px; }
    .psb-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--psb-line); display: block; }
    .psb-dots i:nth-child(1) { background: var(--psb-red); }
    .psb-dots i:nth-child(2) { background: var(--psb-amber); }
    .psb-dots i:nth-child(3) { background: var(--psb-green); }

    .psb-level-pill {
      display: inline-flex; align-items: center; gap: 8px; margin: 12px 0 18px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--psb-gold);
      background: rgba(244,197,66,0.1); border: 1px solid rgba(244,197,66,0.3);
      padding: 8px 14px; border-radius: 999px;
    }

    .psb-panel {
      background: var(--psb-panel); border: 1px solid var(--psb-line);
      border-radius: 14px; padding: 18px; margin-bottom: 16px;
    }
    .psb-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; color: var(--psb-muted); margin: 0 0 14px;
      display: flex; align-items: center; gap: 8px;
    }
    .psb-panel h2::before {
      content: ""; width: 6px; height: 6px; background: var(--psb-gold);
      display: inline-block; border-radius: 1px;
    }

    .psb-table { width: 100%; border-collapse: collapse; font-family: 'Space Mono', monospace; font-size: 12.5px; }
    .psb-table th, .psb-table td { padding: 8px 8px; text-align: center; border-bottom: 1px solid var(--psb-line); }
    .psb-table th { color: var(--psb-muted); font-weight: 400; text-transform: uppercase; font-size: 9.5px; letter-spacing: 0.05em; }
    .psb-table td.psb-name { text-align: left; font-weight: 700; }
    .psb-table td.psb-tier-s { color: var(--psb-gold); }
    .psb-table td.psb-max { color: var(--psb-green); font-weight: 700; }
    .psb-table td.psb-scarf { color: var(--psb-amber); font-weight: 700; }
    .psb-table tr.psb-custom-row td { color: var(--psb-red); }
    .psb-table tr.psb-custom-row td.psb-name { font-style: italic; }

    .psb-remove-btn {
      background: none; border: none; color: var(--psb-red); cursor: pointer;
      font-family: 'Space Mono', monospace; font-size: 14px; padding: 0;
    }

    .psb-add-row { display: flex; gap: 8px; margin-top: 14px; flex-wrap: wrap; }
    #psb-root input[type=text], #psb-root input[type=number] {
      background: #0e1114; border: 1px solid var(--psb-line);
      color: var(--psb-text); font-family: 'Space Mono', monospace; font-size: 12.5px;
      padding: 8px 10px; border-radius: 8px; outline: none;
    }
    #psb-root input::placeholder {
      color: #b8bfc8;
      opacity: 1;
    }
    #psb-root input:focus { border-color: var(--psb-gold); }
    .psb-add-name { flex: 2; min-width: 140px; }
    .psb-add-base { flex: 1; min-width: 90px; }
    .psb-add-btn {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase;
      padding: 9px 16px; border-radius: 9px; background: rgba(244,197,66,0.12);
      border: 1px solid var(--psb-gold); color: var(--psb-gold); cursor: pointer;
    }
    .psb-add-btn:hover { background: rgba(244,197,66,0.2); }

    .psb-footer-note { margin-top: 14px; font-size: 11px; color: var(--psb-muted); line-height: 1.5; }

    .psb-credit {
      margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--psb-line);
      display: flex; align-items: center; justify-content: center; gap: 6px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--psb-muted); letter-spacing: 0.03em;
    }
    .psb-credit .psb-credit-mark {
      width: 16px; height: 16px; border-radius: 4px;
      background: linear-gradient(135deg, var(--psb-gold), var(--psb-amber));
      display: inline-block; flex-shrink: 0;
    }
    .psb-credit a {
      color: var(--psb-text); font-weight: 700; text-decoration: none;
      border-bottom: 1px solid var(--psb-red-dim); transition: border-color .15s, color .15s;
    }
    .psb-credit a:hover { color: var(--psb-amber); border-color: var(--psb-amber); }
  </style>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&#038;family=DM+Sans:wght@400;500;700&#038;display=swap" rel="stylesheet">

  <div class="psb-head">
    <div class="psb-lens"></div>
    <div>
      <div class="psb-brand">Pokehub<b>Guide</b>.com</div>
      <h1>Máy Quét Tốc Độ Meta</h1>
      <span>BẢNG MỐC TỐC ĐỘ THEO LUẬT M-B</span>
    </div>
    <div class="psb-dots"><i></i><i></i><i></i></div>
  </div>

  <div class="psb-level-pill">● Cố định ở Cấp 50 — Pokémon Champions tự động quy mọi Pokémon về cấp này trong trận</div>

  <div class="psb-panel">
    <h2>Mốc Tốc Độ Meta Hàng Đầu</h2>
    <table class="psb-table" id="psb-table"></table>
    <div class="psb-add-row">
      <input type="text" class="psb-add-name" id="psb-new-name" placeholder="Tên Pokémon cần thêm">
      <input type="number" class="psb-add-base" id="psb-new-base" placeholder="Tốc độ gốc">
      <button class="psb-add-btn" id="psb-add-btn">+ Thêm Vào Bảng</button>
    </div>
    <div class="psb-footer-note">
      <b>Min</b> = 0 EV, Tính cách trung tính. <b>Max</b> = 252 EV, Tính cách +Tốc độ (Timid/Jolly). <b>Max + Khăn</b> = Max × 1.5 (Choice Scarf). Mọi số liệu cố định ở Cấp 50 với IV Tốc độ 31. Bảng này gồm các Pokémon có chỉ số Tốc độ gốc ổn định, được xác nhận rộng rãi trong meta Luật M-B hiện tại — thêm bất kỳ Pokémon nào khác bằng các ô nhập ở trên.
    </div>
  </div>

  <div class="psb-credit">
    <span class="psb-credit-mark"></span>
    Cung cấp bởi <a href="https://pokehubguide.com" target="_blank" rel="noopener external noreferrer" class="local-link" data-wpel-link="external">PokehubGuide.com</a>
  </div>
</div>

<script>
(function () {
  // ------------------------------------------------------------------
  // FIX 1 (entity): chữ có dấu trong <script> có thể bị nền tảng lưu
  // trang entity-hoá. Toàn bộ nhãn tiếng Việt dùng trong script viết
  // bằng escape Unicode \uXXXX — mã nguồn 100% ASCII.
  // FIX 2 (cấu trúc): bảng gốc dùng template literal LỒNG NHAU
  // (`<button ...>` bên trong một template literal khác qua toán tử
  // ba ngôi) — cú pháp này rất dễ bị bộ minify/sanitize của nền tảng
  // xử lý sai, làm hỏng HTML (đã từng gây lỗi lồng khối ở tool khác).
  // Bảng giờ được dựng hoàn toàn bằng DOM API (createElement), không
  // còn ghép chuỗi HTML nào.
  // ------------------------------------------------------------------
  const TXT = {
    colName: "Pok\u00e9mon",
    colBase: "T\u1ed1c \u0110\u1ed9 G\u1ed1c",
    colMin: "Min",
    colMax: "Max",
    colScarf: "Max + Kh\u0103n",
    removeSymbol: "\u00d7"
  };

  const LEVEL = 50;

  // Base Speed của các Pokémon nổi bật trong meta Regulation M-B hiện tại (theo tier list/usage).
  // Chỉ đưa vào những loài có Base Speed ổn định, được xác nhận rộng rãi.
  const META_MONS = [
    { name: "Gengar",       base: 130 },
    { name: "Meowscarada",  base: 123 },
    { name: "Greninja",     base: 122 },
    { name: "Whimsicott",   base: 116 },
    { name: "Delphox",      base: 104 },
    { name: "Garchomp",     base: 102 },
    { name: "Charizard",    base: 100 },
    { name: "Hydreigon",    base: 98 },
    { name: "Mimikyu",      base: 96 },
    { name: "Gyarados",     base: 81 },
    { name: "Dragonite",    base: 80 },
    { name: "Metagross",    base: 71 },
    { name: "Corviknight",  base: 67 },
    { name: "Scizor",       base: 65 },
    { name: "Incineroar",   base: 60 },
    { name: "Primarina",    base: 60 },
    { name: "Archaludon",   base: 60 },
    { name: "Kingambit",    base: 50 },
    { name: "Hippowdon",    base: 47 }
  ];

  let customMons = [];

  function statAt(base, iv, ev, natureMult) {
    const raw = Math.floor(((2 * base + iv + Math.floor(ev / 4)) * LEVEL) / 100) + 5;
    return Math.floor(raw * natureMult);
  }

  function render() {
    const all = META_MONS.map(m => ({ ...m, custom: false }))
      .concat(customMons.map(m => ({ ...m, custom: true })));

    const rows = all.map(m => {
      const min = statAt(m.base, 31, 0, 1.0);
      const max = statAt(m.base, 31, 252, 1.1);
      const maxScarf = Math.floor(max * 1.5);
      return { ...m, min, max, maxScarf };
    });

    rows.sort((a, b) => b.maxScarf - a.maxScarf);

    const table = document.getElementById("psb-table");
    table.innerHTML = "";

    const headRow = document.createElement("tr");
    [TXT.colName, TXT.colBase, TXT.colMin, TXT.colMax, TXT.colScarf, ""].forEach(text => {
      const th = document.createElement("th");
      th.textContent = text;
      headRow.appendChild(th);
    });
    table.appendChild(headRow);

    rows.forEach(r => {
      const tr = document.createElement("tr");
      if (r.custom) tr.className = "psb-custom-row";

      const nameTd = document.createElement("td");
      nameTd.className = "psb-name";
      nameTd.textContent = r.name;
      tr.appendChild(nameTd);

      const baseTd = document.createElement("td");
      baseTd.textContent = r.base;
      tr.appendChild(baseTd);

      const minTd = document.createElement("td");
      minTd.textContent = r.min;
      tr.appendChild(minTd);

      const maxTd = document.createElement("td");
      maxTd.className = "psb-max";
      maxTd.textContent = r.max;
      tr.appendChild(maxTd);

      const scarfTd = document.createElement("td");
      scarfTd.className = "psb-scarf";
      scarfTd.textContent = r.maxScarf;
      tr.appendChild(scarfTd);

      const actionTd = document.createElement("td");
      if (r.custom) {
        const btn = document.createElement("button");
        btn.className = "psb-remove-btn";
        btn.dataset.name = r.name;
        btn.textContent = TXT.removeSymbol;
        btn.addEventListener("click", () => {
          customMons = customMons.filter(m => m.name !== r.name);
          render();
        });
        actionTd.appendChild(btn);
      }
      tr.appendChild(actionTd);

      table.appendChild(tr);
    });
  }

  document.getElementById("psb-add-btn").addEventListener("click", () => {
    const name = document.getElementById("psb-new-name").value.trim();
    const base = parseInt(document.getElementById("psb-new-base").value);
    if (!name || !base || base <= 0) return;
    customMons.push({ name, base });
    document.getElementById("psb-new-name").value = "";
    document.getElementById("psb-new-base").value = "";
    render();
  });

  render();
})();
</script>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Biểu đồ được tạo sẵn, không phải là máy tính trống.</mark></h2>



<p class="wp-block-paragraph"><a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán tốc độ</a> của chúng tôi được thiết kế để kiểm tra một trận đấu cụ thể mà bạn đã nghĩ đến — Pokémon của bạn đấu với một mối đe dọa mà bạn nêu tên. Meta Speed ​​Scanner lại có cách tiếp cận khác: nó được tải sẵn các chỉ số tốc độ chuẩn của các Pokémon hiện đang định hình meta Regulation MB, dựa trên việc sử dụng trong các giải đấu và thứ hạng trong bảng xếp hạng, tất cả đều được cố định ở cấp độ 50 chung của Champions. Mở công cụ và ngay lập tức xem những cái tên lớn nhất của thể thức này nằm ở vị trí nào — không cần thiết lập gì cả.</p>



<p class="wp-block-paragraph">Mỗi mục hiển thị ba con số:</p>



<ul class="wp-block-list">
<li><strong>Tối thiểu</strong> — 0 Xe điện tốc độ, thuộc tính trung lập. Tốc độ tối thiểu cho một cấu hình chưa đầu tư.</li>



<li><strong>Max</strong> — 252 điểm Tốc độ EV với chỉ số Tốc độ Cao hơn (Nhút nhát hoặc Vui vẻ). Đây là tốc độ tối đa cho một cấu hình được đầu tư tối đa.</li>



<li><strong>Max + Scarf</strong> — chỉ số Max được nhân với hệ số 1.5 của Choice Scarf, con số nhanh nhất mà Pokémon có thể đạt được trong thực tế.</li>
</ul>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Cách sử dụng</mark></h2>



<ol class="wp-block-list">
<li><strong>Hãy xem bảng được tải sẵn</strong> , được sắp xếp tự động từ nhanh nhất đến chậm nhất dựa trên giới hạn tối đa được tăng cường bởi Scarf — những con số quan trọng nhất khi bạn tự hỏi "liệu con này có thể vượt qua đội của tôi ngay cả khi có Scarf không?"</li>



<li><strong>Hãy so sánh Tốc độ được tính toán của Pokémon của bạn</strong> (từ <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán bậc tốc độ</a> hoặc <a href="https://vngame.tv/cong-cu-lap-ke-hoach-phan-bo-diem-ev-cho-pokemon/" class="local-link" data-wpel-link="internal">Công cụ lập kế hoạch phân bổ EV</a> của chúng tôi ) với cột Tối thiểu và Tối đa ở đây để xem chính xác vị trí của bạn so với meta hiện tại.</li>



<li><strong>Thêm bất kỳ Pokémon nào chưa có trong danh sách</strong> bằng cách sử dụng tên và tốc độ cơ bản ở phía dưới — nó sẽ được thêm vào bảng xếp hạng ngay lập tức, được đánh dấu màu đỏ để bạn có thể phân biệt nó với danh sách có sẵn.</li>
</ol>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Vì sao các chỉ số so sánh tổng quát lại quan trọng hơn các chỉ số so sánh chung chung</mark></h2>



<p class="wp-block-paragraph">Một công cụ tính tốc độ với các ô trống chỉ hữu ích khi bạn nhớ rõ định dạng của nó — bạn phải biết trước những chỉ số tốc độ cơ bản nào đủ quan trọng để kiểm tra. Biểu đồ chuẩn thì ngược lại: nó cho bạn biết ngay từ đầu những chỉ số nào thực sự đáng quan tâm hiện nay, dựa trên những gì đang giúp chiến thắng trong các giải đấu, để bạn có thể xây dựng chiến lược tốc độ của mình xoay quanh những mối đe dọa thực sự thay vì chỉ đoán xem những trận đấu nào đủ phổ biến để lên kế hoạch.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Câu hỏi thường gặp</mark></h2>



<p class="wp-block-paragraph"><strong>Tại sao không phải tất cả Pokémon quan trọng trong meta đều có trong danh sách này?</strong>&nbsp;Biểu đồ này chỉ bao gồm những Pokémon có chỉ số Tốc độ Cơ bản đã được xác định rõ ràng và ghi chép đầy đủ. Một vài lựa chọn meta mới hơn hoặc ít được biết đến hơn đã cố tình bị loại bỏ để tránh công bố một con số mà chúng tôi không hoàn toàn chắc chắn — hãy tự thêm chúng vào bằng cách sử dụng trường Tốc độ Cơ bản nếu bạn biết.</p>



<p class="wp-block-paragraph"><strong>Biểu đồ này có tính đến các vật phẩm khác ngoài Choice Scarf không?</strong>&nbsp;Không — Choice Scarf được bao gồm vì nó là vật phẩm tăng tốc phổ biến nhất trong thể thức này, nhưng các hiệu ứng khác (Tailwind, Paralysis, tăng tốc dựa trên kỹ năng) không được hiển thị ở đây. Hãy sử dụng&nbsp;<a href="https://pokehubguide.com/pokemon-speed-tier-calculator/" class="local-link" data-wpel-link="external" target="_blank" rel="external noopener noreferrer">Công cụ tính toán cấp độ tốc độ</a>&nbsp;của chúng tôi để có bảng phân tích đầy đủ bao gồm cả các yếu tố điều chỉnh đó.</p>



<p class="wp-block-paragraph"><strong>Liệu danh sách này có được cập nhật khi meta thay đổi không?</strong>&nbsp;Chỉ số Tốc độ Cơ bản không bao giờ thay đổi, nhưng những Pokémon nào đáng được xuất hiện trong bảng xếp hạng "meta hiện tại" sẽ thay đổi khi các Bộ Quy định xoay vòng và xu hướng giải đấu biến động. Hãy kiểm tra lại định kỳ và sử dụng mục "Thêm vào bảng xếp hạng" cho bất kỳ Pokémon nào mới có liên quan mà chưa được liệt kê.</p>



<p class="wp-block-paragraph"><strong>Liệu Max + Scarf luôn là con số tôi cần lo lắng?</strong>&nbsp;Không nhất thiết — người chơi sử dụng Scarf phải từ bỏ sự linh hoạt của một vật phẩm giữ khác, vì vậy không phải mọi Pokémon nhanh nhẹn bạn gặp đều thực sự sử dụng nó. Hãy coi Max + Scarf như mức tối đa cần lưu ý, còn cột Max thông thường là chuẩn mực thực tế phổ biến hơn.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Các công cụ liên quan: <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán bậc tốc độ Pokémon</a> — tính toán và so sánh chi tiết mọi trận đấu tùy chỉnh. <a href="https://vngame.tv/cong-cu-kiem-tra-tinh-hop-le-cua-pokemon-champion/" class="local-link" data-wpel-link="internal">Công cụ kiểm tra tính hợp lệ của đội hình Pokémon Champions</a> — xác nhận đội hình của bạn hợp lệ trước khi xây dựng dựa trên các tiêu chuẩn này.</em></p>
<p>Bài viết <a href="https://vngame.tv/bang-xep-hang-toc-do-meta-cua-pokemon-champions/" data-wpel-link="internal">Bảng xếp hạng tốc độ meta của Pokémon Champions</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/bang-xep-hang-toc-do-meta-cua-pokemon-champions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17655</post-id>	</item>
		<item>
		<title>Báo cáo so sánh đội hình Pokémon Champions</title>
		<link>https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/</link>
					<comments>https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Thu, 13 Aug 2026 19:34:58 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Báo cáo so sánh đội hình vô địch Pokémon Champions]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=17641</guid>

					<description><![CDATA[<p>Hiểu rõ đội hình của mình chỉ là một nửa của quá trình chuẩn bị. Nửa còn lại — và là phần mà hầu hết người chơi bỏ qua vì quá tốn thời gian khi làm thủ công — là so sánh đội hình của mình với đội hình của đối thủ cụ thể trước khi trận đấu bắt đầu. Cho dù bạn đang chuẩn bị cho một đối thủ xếp hạng đã biết, nghiên cứu danh sách đội hình công khai của đối thủ trong giải đấu, hay chỉ đơn giản là thử nghiệm đội hình của mình với [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/" data-wpel-link="internal">Báo cáo so sánh đội hình Pokémon Champions</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hiểu rõ đội hình của mình chỉ là một nửa của quá trình chuẩn bị. Nửa còn lại — và là phần mà hầu hết người chơi bỏ qua vì quá tốn thời gian khi làm thủ công — là so sánh đội hình của mình với đội hình của đối thủ cụ thể trước khi trận đấu bắt đầu. Cho dù bạn đang chuẩn bị cho một đối thủ xếp hạng đã biết, nghiên cứu danh sách đội hình công khai của đối thủ trong giải đấu, hay chỉ đơn giản là thử nghiệm đội hình của mình với bạn bè, việc so sánh hai đội hình sáu Pokémon đầy đủ, từng chỉ số và từng loại, sẽ tốn rất nhiều thời gian nếu làm thủ công.</p>



<p class="wp-block-paragraph">Giới thiệu&nbsp;<strong>Matchup Scanner</strong>&nbsp;(được cung cấp bởi&nbsp;<strong>PokehubGuide.com</strong>&nbsp;), một tiện ích công nghệ cao thiết yếu trong bộ&nbsp;<em>công cụ Pokémon Champions</em>&nbsp;của chúng tôi . Thay vì kiểm tra Tốc độ và khả năng bao phủ hệ của từng Pokémon một, công cụ này sẽ xem xét toàn bộ đội hình cùng lúc và tạo ra báo cáo so sánh hoàn chỉnh chỉ bằng một cú nhấp chuột.</p>



<!-- ============================================================
     MATCHUP SCANNER — Báo Cáo Đối Đầu Đội Hình Pokémon Champions
     (bởi PokehubGuide.com)
     Dán toàn bộ khối này vào trang HTML của bạn.
     Dùng tiền tố "pvt-" nên không xung đột với các tool khác.
     Cấp độ cố định 50 vì Champions tự động quy mọi Pokémon về Lv.50.
     ============================================================ -->
<div id="pvt-root">
  <style>
    #pvt-root {
      --pvt-bg: #0b0d10;
      --pvt-panel: #14171c;
      --pvt-red: #e3350d;
      --pvt-red-dim: #7a1c08;
      --pvt-amber: #ffb703;
      --pvt-green: #4bd68b;
      --pvt-gold: #f4c542;
      --pvt-you: #f4c542;
      --pvt-opp: #8a919c;
      --pvt-text: #eef1f4;
      --pvt-muted: #8a919c;
      --pvt-line: #262b33;
      font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
      color: var(--pvt-text);
      background: var(--pvt-bg);
      max-width: 1020px;
      margin: 0 auto;
      padding: 28px;
      border-radius: 20px;
      position: relative;
      overflow: hidden;
      box-shadow: 0 0 0 1px var(--pvt-line), 0 30px 60px -20px rgba(0,0,0,0.6);
    }
    #pvt-root::before {
      content: "";
      position: absolute; inset: 0;
      background: repeating-linear-gradient(
        to bottom, rgba(255,255,255,0.015) 0px, rgba(255,255,255,0.015) 1px,
        transparent 1px, transparent 3px
      );
      pointer-events: none; z-index: 5;
    }
    #pvt-root * { box-sizing: border-box; }

    .pvt-head { display: flex; align-items: center; gap: 14px; margin-bottom: 8px; }
    .pvt-lens {
      width: 22px; height: 22px; border-radius: 50%;
      background: radial-gradient(circle at 35% 30%, #fff3c4, #f4c542 45%, #8a6a0a 100%);
      box-shadow: 0 0 0 4px #1a1e24, 0 0 14px rgba(244,197,66,0.55);
      flex-shrink: 0;
    }
    .pvt-brand {
      font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.16em;
      text-transform: uppercase; color: var(--pvt-amber); margin-bottom: 3px;
    }
    .pvt-brand b { color: var(--pvt-text); font-weight: 700; }
    .pvt-head h1 {
      font-family: 'Space Mono', monospace; font-size: 20px; letter-spacing: 0.14em;
      text-transform: uppercase; margin: 0; color: var(--pvt-text);
    }
    .pvt-head span {
      display: block; font-family: 'Space Mono', monospace; font-size: 11px;
      color: var(--pvt-gold); letter-spacing: 0.08em; margin-top: 2px;
    }
    .pvt-dots { margin-left: auto; display: flex; gap: 6px; }
    .pvt-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--pvt-line); display: block; }
    .pvt-dots i:nth-child(1) { background: var(--pvt-red); }
    .pvt-dots i:nth-child(2) { background: var(--pvt-amber); }
    .pvt-dots i:nth-child(3) { background: var(--pvt-green); }

    .pvt-level-pill {
      display: inline-flex; align-items: center; gap: 8px; margin: 12px 0 18px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pvt-gold);
      background: rgba(244,197,66,0.1); border: 1px solid rgba(244,197,66,0.3);
      padding: 8px 14px; border-radius: 999px;
    }

    .pvt-teams-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
    @media (max-width: 820px) { .pvt-teams-grid { grid-template-columns: 1fr; } }

    .pvt-panel {
      background: var(--pvt-panel); border: 1px solid var(--pvt-line);
      border-radius: 14px; padding: 16px; margin-bottom: 16px;
    }
    .pvt-panel.pvt-you { border-top: 3px solid var(--pvt-you); }
    .pvt-panel.pvt-opp { border-top: 3px solid var(--pvt-opp); }
    .pvt-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; margin: 0 0 12px; display: flex; align-items: center; gap: 8px;
    }
    .pvt-panel.pvt-you h2 { color: var(--pvt-you); }
    .pvt-panel.pvt-opp h2 { color: var(--pvt-opp); }

    .pvt-slot {
      display: grid; grid-template-columns: 1.2fr 1fr 1fr 0.9fr 0.9fr; gap: 6px;
      align-items: center; padding: 6px 0; border-bottom: 1px solid var(--pvt-line);
    }
    .pvt-slot:last-child { border-bottom: none; }
    @media (max-width: 500px) { .pvt-slot { grid-template-columns: 1fr 1fr; row-gap: 4px; } }

    #pvt-root input[type=text], #pvt-root input[type=number], #pvt-root select {
      width: 100%; background: #0e1114; border: 1px solid var(--pvt-line);
      color: var(--pvt-text); font-family: 'Space Mono', monospace; font-size: 11.5px;
      padding: 6px 7px; border-radius: 6px; outline: none; appearance: none;
    }
    #pvt-root input[type=text]::placeholder, #pvt-root input[type=number]::placeholder {
      color: #b8bfc8;
      opacity: 1;
    }
    #pvt-root select {
      background-image: linear-gradient(45deg, transparent 50%, var(--pvt-muted) 50%),
                         linear-gradient(135deg, var(--pvt-muted) 50%, transparent 50%);
      background-position: calc(100% - 10px) center, calc(100% - 6px) center;
      background-size: 4px 4px, 4px 4px; background-repeat: no-repeat; cursor: pointer;
    }
    #pvt-root input:focus, #pvt-root select:focus { border-color: var(--pvt-gold); }

    .pvt-btn {
      font-family: 'Space Mono', monospace; font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase;
      padding: 13px; border-radius: 10px; width: 100%; cursor: pointer; border: none;
      background: linear-gradient(180deg, var(--pvt-gold), #c9a02f); color: #0b0d10; font-weight: 700;
      box-shadow: 0 6px 18px -6px rgba(244,197,66,0.5); margin-bottom: 18px;
    }

    .pvt-report-panel {
      background: var(--pvt-panel); border: 1px solid var(--pvt-line); border-radius: 14px; padding: 18px; margin-bottom: 16px;
    }
    .pvt-report-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; color: var(--pvt-muted); margin: 0 0 14px;
      display: flex; align-items: center; gap: 8px;
    }
    .pvt-report-panel h2::before { content: ""; width: 6px; height: 6px; background: var(--pvt-gold); display: inline-block; border-radius: 1px; }

    .pvt-lb-row { display: grid; grid-template-columns: 26px 1fr 80px; align-items: center; gap: 10px; margin-bottom: 6px; }
    .pvt-lb-rank { font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pvt-muted); text-align: center; }
    .pvt-lb-bar-wrap { background: #0e1114; border: 1px solid var(--pvt-line); border-radius: 8px; overflow: hidden; }
    .pvt-lb-bar {
      display: flex; align-items: center; height: 30px; padding: 0 10px;
      font-family: 'Space Mono', monospace; font-size: 11.5px; color: #0b0d10; font-weight: 700;
      white-space: nowrap; overflow: hidden; transition: width .35s ease;
    }
    .pvt-lb-bar.pvt-bar-you { background: var(--pvt-you); }
    .pvt-lb-bar.pvt-bar-opp { background: var(--pvt-opp); color: var(--pvt-text); }
    .pvt-lb-speed { font-family: 'Space Mono', monospace; font-size: 13px; font-weight: 700; text-align: right; color: var(--pvt-text); }

    .pvt-summary-strip { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 14px; }
    @media (max-width: 560px) { .pvt-summary-strip { grid-template-columns: 1fr; } }
    .pvt-summary-chip { background: #0e1114; border: 1px solid var(--pvt-line); border-radius: 10px; padding: 14px; text-align: center; }
    .pvt-summary-chip .pvt-sc-label { font-family: 'Space Mono', monospace; font-size: 10px; color: var(--pvt-muted); text-transform: uppercase; margin-bottom: 6px; }
    .pvt-summary-chip .pvt-sc-value { font-family: 'Space Mono', monospace; font-size: 22px; font-weight: 700; }

    .pvt-danger-table { width: 100%; border-collapse: collapse; font-family: 'Space Mono', monospace; font-size: 12px; }
    .pvt-danger-table th, .pvt-danger-table td { padding: 8px; text-align: center; border-bottom: 1px solid var(--pvt-line); }
    .pvt-danger-table th { color: var(--pvt-muted); font-weight: 400; text-transform: uppercase; font-size: 9.5px; }
    .pvt-danger-table td.pvt-dtype { text-align: left; font-weight: 700; }
    .pvt-danger-high { color: var(--pvt-red); font-weight: 700; }
    .pvt-danger-med { color: var(--pvt-amber); font-weight: 700; }
    .pvt-danger-low { color: var(--pvt-muted); }

    .pvt-footer-note { margin-top: 14px; font-size: 11px; color: var(--pvt-muted); line-height: 1.5; }

    .pvt-credit {
      margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--pvt-line);
      display: flex; align-items: center; justify-content: center; gap: 6px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pvt-muted); letter-spacing: 0.03em;
    }
    .pvt-credit .pvt-credit-mark {
      width: 16px; height: 16px; border-radius: 4px;
      background: linear-gradient(135deg, var(--pvt-gold), var(--pvt-amber));
      display: inline-block; flex-shrink: 0;
    }
    .pvt-credit a {
      color: var(--pvt-text); font-weight: 700; text-decoration: none;
      border-bottom: 1px solid var(--pvt-red-dim); transition: border-color .15s, color .15s;
    }
    .pvt-credit a:hover { color: var(--pvt-amber); border-color: var(--pvt-amber); }
  </style>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&#038;family=DM+Sans:wght@400;500;700&#038;display=swap" rel="stylesheet">

  <div class="pvt-head">
    <div class="pvt-lens"></div>
    <div>
      <div class="pvt-brand">Pokehub<b>Guide</b>.com</div>
      <h1>Máy Quét Đối Đầu</h1>
      <span>ĐƠN VỊ BÁO CÁO ĐỐI ĐẦU ĐỘI HÌNH — POKÉMON CHAMPIONS</span>
    </div>
    <div class="pvt-dots"><i></i><i></i><i></i></div>
  </div>

  <div class="pvt-level-pill">● Cố định ở Cấp 50 — Pokémon Champions tự động quy mọi Pokémon về cấp này trong trận</div>

  <div class="pvt-teams-grid">
    <div class="pvt-panel pvt-you">
      <h2>Đội Hình Của Bạn</h2>
      <div id="pvt-you-slots"></div>
    </div>
    <div class="pvt-panel pvt-opp">
      <h2>Đội Hình Đối Thủ</h2>
      <div id="pvt-opp-slots"></div>
    </div>
  </div>

  <button class="pvt-btn" id="pvt-generate">Tạo Báo Cáo Đối Đầu</button>

  <div id="pvt-report"></div>

  <div class="pvt-credit">
    <span class="pvt-credit-mark"></span>
    Cung cấp bởi <a href="https://pokehubguide.com" target="_blank" rel="noopener external noreferrer" class="local-link" data-wpel-link="external">PokehubGuide.com</a>
  </div>

  <!-- ============================================================
       TEMPLATE cho mỗi dòng Pokémon — nhãn/tuỳ chọn tĩnh (placeholder,
       "— Hệ 2 —", "Tốc độ Min/Max"...) nằm ngoài <script> nên luôn
       hiển thị đúng. JS chỉ clone và điền option hệ.
       ============================================================ -->
  <template id="pvt-slot-template">
    <div class="pvt-slot">
      <input type="text" class="pvt-name" placeholder="">
      <select class="pvt-type1"></select>
      <select class="pvt-type2"><option value="">— Hệ 2 —</option></select>
      <input type="number" class="pvt-base-spe" placeholder="Tốc độ gốc">
      <select class="pvt-spe-tier">
        <option value="min">Tốc độ Min</option>
        <option value="max" selected>Tốc độ Max</option>
        <option value="scarf">Max+Khăn</option>
      </select>
    </div>
  </template>
</div>

<script>
(function () {
  // ------------------------------------------------------------------
  // FIX: chữ có dấu và ký hiệu non-ASCII (&#x26a0;, &#x2694;, —...) nằm trong
  // <script> có thể bị nền tảng lưu trang entity-hoá và hiển thị sai.
  // Nhãn tĩnh của mỗi dòng Pokémon đã chuyển ra <template> ở trên; toàn
  // bộ chuỗi tiếng Việt còn lại buộc phải nằm trong JS (tiêu đề báo
  // cáo, ghi chú, tên cột...) viết bằng escape Unicode \uXXXX — mã
  // nguồn 100% ASCII nên không có gì để nền tảng entity-hoá. Toàn bộ
  // báo cáo động cũng dựng bằng DOM API thay vì ghép chuỗi HTML, tránh
  // luôn rủi ro lồng thẻ sai khi nền tảng xử lý lại trang.
  // ------------------------------------------------------------------
  const TXT = {
    namePlaceholderPrefix: "Pok\u00e9mon ",
    fillTeamsNote: "\u0110i\u1ec1n \u00edt nh\u1ea5t 1 Pok\u00e9mon cho m\u1ed7i \u0111\u1ed9i (t\u00ean/h\u1ec7 kh\u00f4ng b\u1eaft bu\u1ed9c, nh\u01b0ng c\u1ea7n T\u1ed1c \u0111\u1ed9 g\u1ed1c \u0111\u1ec3 xem b\u00e1o c\u00e1o t\u1ed1c \u0111\u1ed9) r\u1ed3i t\u1ea1o b\u00e1o c\u00e1o l\u1ea1i.",
    speedComparisonTitle: "So S\u00e1nh T\u1ed1c \u0110\u1ed9",
    addSpeedNote: "Nh\u1eadp T\u1ed1c \u0111\u1ed9 g\u1ed1c \u0111\u1ec3 xem so s\u00e1nh.",
    speedLegendNote: "Thanh m\u00e0u v\u00e0ng l\u00e0 \u0111\u1ed9i c\u1ee7a b\u1ea1n, thanh m\u00e0u x\u00e1m l\u00e0 \u0111\u1ed9i \u0111\u1ed1i th\u1ee7 \u2014 s\u1eafp x\u1ebfp t\u1eeb nhanh \u0111\u1ebfn ch\u1eadm.",
    noSharedWeakness: "Kh\u00f4ng ph\u00e1t hi\u1ec7n \u0111i\u1ec3m y\u1ebfu chung tr\u01b0\u1edbc c\u00e1c h\u1ec7 STAB kh\u1ea3 d\u0129 c\u1ee7a \u0111\u1ed1i th\u1ee7 \u2014 \u0111i\u1ec1n h\u1ec7 cho c\u1ea3 2 \u0111\u1ed9i \u0111\u1ec3 ki\u1ec3m tra.",
    colTypeOpponentCarries: "H\u1ec7 \u0110\u1ed1i Th\u1ee7 C\u00f3 Th\u1ec3 S\u1edf H\u1eefu",
    colHowManyWeak: "S\u1ed1 Pok\u00e9mon \u0110\u1ed9i B\u1ea1n B\u1ecb Y\u1ebfu Th\u1ebf",
    yourThreatsTitle: "\u26a0 M\u1ed1i \u0110e D\u1ecda \u0110\u1ed9i B\u1ea1n Y\u1ebfu Th\u1ebf",
    theirThreatsTitle: "\u2694 M\u1ed1i \u0110e D\u1ecda \u0110\u1ed1i Th\u1ee7 Y\u1ebfu Th\u1ebf",
    quickSummaryTitle: "T\u00f3m T\u1eaft Nhanh",
    outspeedLabel: "S\u1ed1 Pok\u00e9mon C\u1ee7a B\u1ea1n Nhanh H\u01a1n To\u00e0n \u0110\u1ed9i \u0110\u1ed1i Th\u1ee7",
    biggestWeaknessLabel: "\u0110i\u1ec3m Y\u1ebfu Chung L\u1edbn Nh\u1ea5t C\u1ee7a B\u1ea1n",
    dash: "\u2014"
  };

  const LEVEL = 50;
  const TYPES = ["Normal","Fire","Water","Electric","Grass","Ice","Fighting","Poison","Ground","Flying","Psychic","Bug","Rock","Ghost","Dragon","Dark","Steel","Fairy"];

  const CHART = {
    Normal:   { Rock:0.5, Ghost:0, Steel:0.5 },
    Fire:     { Fire:0.5, Water:0.5, Grass:2, Ice:2, Bug:2, Rock:0.5, Dragon:0.5, Steel:2 },
    Water:    { Fire:2, Water:0.5, Grass:0.5, Ground:2, Rock:2, Dragon:0.5 },
    Electric: { Water:2, Electric:0.5, Grass:0.5, Ground:0, Flying:2, Dragon:0.5 },
    Grass:    { Fire:0.5, Water:2, Grass:0.5, Poison:0.5, Ground:2, Flying:0.5, Bug:0.5, Rock:2, Dragon:0.5, Steel:0.5 },
    Ice:      { Fire:0.5, Water:0.5, Grass:2, Ice:0.5, Ground:2, Flying:2, Dragon:2, Steel:0.5 },
    Fighting: { Normal:2, Ice:2, Poison:0.5, Flying:0.5, Psychic:0.5, Bug:0.5, Rock:2, Ghost:0, Dark:2, Steel:2, Fairy:0.5 },
    Poison:   { Grass:2, Poison:0.5, Ground:0.5, Rock:0.5, Ghost:0.5, Steel:0, Fairy:2 },
    Ground:   { Fire:2, Electric:2, Grass:0.5, Poison:2, Flying:0, Bug:0.5, Rock:2, Steel:2 },
    Flying:   { Electric:0.5, Grass:2, Fighting:2, Bug:2, Rock:0.5, Steel:0.5 },
    Psychic:  { Fighting:2, Poison:2, Psychic:0.5, Dark:0, Steel:0.5 },
    Bug:      { Fire:0.5, Grass:2, Fighting:0.5, Poison:0.5, Flying:0.5, Psychic:2, Ghost:0.5, Dark:2, Steel:0.5, Fairy:0.5 },
    Rock:     { Fire:2, Ice:2, Fighting:0.5, Ground:0.5, Flying:2, Bug:2, Steel:0.5 },
    Ghost:    { Normal:0, Psychic:2, Ghost:2, Dark:0.5 },
    Dragon:   { Dragon:2, Steel:0.5, Fairy:0 },
    Dark:     { Fighting:0.5, Psychic:2, Ghost:2, Dark:0.5, Fairy:0.5 },
    Steel:    { Fire:0.5, Water:0.5, Electric:0.5, Ice:2, Rock:2, Steel:0.5, Fairy:2 },
    Fairy:    { Fire:0.5, Fighting:2, Poison:0.5, Dragon:2, Dark:2, Steel:0.5 }
  };
  function singleMult(atk, def) { const row = CHART[atk] || {}; return row[def] !== undefined ? row[def] : 1; }
  function dualMult(atk, def1, def2) { let m = singleMult(atk, def1); if (def2) m *= singleMult(atk, def2); return m; }

  function speedAt(base, tier) {
    // Min = 0 EV trung tính | Max = 252 EV +Tính cách | Scarf = Max * 1.5
    const min = Math.floor((Math.floor((2 * base * LEVEL) / 100) + 5) * 1.0);
    const max = Math.floor((Math.floor(((2 * base + 31 + 63) * LEVEL) / 100) + 5) * 1.1);
    const scarf = Math.floor(max * 1.5);
    if (tier === "min") return min;
    if (tier === "scarf") return scarf;
    return max;
  }

  function buildSlots(containerId) {
    const wrap = document.getElementById(containerId);
    const slotTemplate = document.getElementById("pvt-slot-template");
    for (let i = 1; i <= 6; i++) {
      const frag = slotTemplate.content.cloneNode(true);
      frag.querySelector(".pvt-name").placeholder = TXT.namePlaceholderPrefix + i;

      const t1 = frag.querySelector(".pvt-type1");
      const t2 = frag.querySelector(".pvt-type2");
      TYPES.forEach(t => {
        const o1 = document.createElement("option"); o1.value = t; o1.textContent = t; t1.appendChild(o1);
        const o2 = document.createElement("option"); o2.value = t; o2.textContent = t; t2.appendChild(o2);
      });
      wrap.appendChild(frag);
    }
  }
  buildSlots("pvt-you-slots");
  buildSlots("pvt-opp-slots");

  function readTeam(containerId) {
    const rows = Array.from(document.querySelectorAll("#" + containerId + " .pvt-slot"));
    return rows.map((r, i) => {
      const name = r.querySelector(".pvt-name").value.trim();
      const t1 = r.querySelector(".pvt-type1").value;
      const t2 = r.querySelector(".pvt-type2").value;
      const base = parseFloat(r.querySelector(".pvt-base-spe").value);
      const tier = r.querySelector(".pvt-spe-tier").value;
      if (!name && !t1 && !base) return null;
      return {
        name: name || (TXT.namePlaceholderPrefix + (i + 1)),
        t1, t2,
        speed: base ? speedAt(base, tier) : null
      };
    }).filter(Boolean);
  }

  // ---------- Các hàm tiện ích dựng DOM ----------
  function el(tag, className, text) {
    const e = document.createElement(tag);
    if (className) e.className = className;
    if (text !== undefined) e.textContent = text;
    return e;
  }

  function buildReportPanel(titleText) {
    const panel = el("div", "pvt-report-panel");
    panel.appendChild(el("h2", null, titleText));
    return panel;
  }

  function buildSpeedPanel(speedEntries, maxSpeed) {
    const panel = buildReportPanel(TXT.speedComparisonTitle);
    if (speedEntries.length > 0) {
      speedEntries.forEach((e, i) => {
        const pct = Math.max(10, (e.speed / maxSpeed) * 100);

        const row = el("div", "pvt-lb-row");
        row.appendChild(el("div", "pvt-lb-rank", "#" + (i + 1)));

        const barWrap = el("div", "pvt-lb-bar-wrap");
        const bar = el("div", "pvt-lb-bar " + (e.side === "you" ? "pvt-bar-you" : "pvt-bar-opp"), e.name);
        bar.style.width = pct + "%";
        barWrap.appendChild(bar);
        row.appendChild(barWrap);

        row.appendChild(el("div", "pvt-lb-speed", e.speed));
        panel.appendChild(row);
      });
    } else {
      panel.appendChild(el("div", "pvt-footer-note", TXT.addSpeedNote));
    }
    panel.appendChild(el("div", "pvt-footer-note", TXT.speedLegendNote));
    return panel;
  }

  function buildDangerPanel(titleText, rows, teamSize) {
    const panel = buildReportPanel(titleText);
    if (rows.length === 0) {
      panel.appendChild(el("div", "pvt-footer-note", TXT.noSharedWeakness));
    } else {
      const table = document.createElement("table");
      table.className = "pvt-danger-table";

      const headRow = document.createElement("tr");
      headRow.appendChild(el("th", null, TXT.colTypeOpponentCarries));
      headRow.appendChild(el("th", null, TXT.colHowManyWeak));
      table.appendChild(headRow);

      rows.slice(0, 6).forEach(r => {
        const cls = r.weakCount >= 3 ? "pvt-danger-high" : r.weakCount === 2 ? "pvt-danger-med" : "pvt-danger-low";
        const tr = document.createElement("tr");
        tr.appendChild(el("td", "pvt-dtype", r.atkType));
        tr.appendChild(el("td", cls, r.weakCount + " / " + teamSize));
        table.appendChild(tr);
      });

      panel.appendChild(table);
    }
    return panel;
  }

  function buildSummaryPanel(youOutspeedCount, youLength, biggestWeaknessType) {
    const panel = buildReportPanel(TXT.quickSummaryTitle);
    const strip = el("div", "pvt-summary-strip");

    const chip1 = el("div", "pvt-summary-chip");
    chip1.appendChild(el("div", "pvt-sc-label", TXT.outspeedLabel));
    const val1 = el("div", "pvt-sc-value", youOutspeedCount + " / " + youLength);
    val1.style.color = "var(--pvt-you)";
    chip1.appendChild(val1);
    strip.appendChild(chip1);

    const chip2 = el("div", "pvt-summary-chip");
    chip2.appendChild(el("div", "pvt-sc-label", TXT.biggestWeaknessLabel));
    const val2 = el("div", "pvt-sc-value", biggestWeaknessType || TXT.dash);
    val2.style.color = "var(--pvt-red)";
    chip2.appendChild(val2);
    strip.appendChild(chip2);

    panel.appendChild(strip);
    return panel;
  }

  function renderReport() {
    const you = readTeam("pvt-you-slots");
    const opp = readTeam("pvt-opp-slots");
    const reportEl = document.getElementById("pvt-report");
    reportEl.innerHTML = "";

    if (you.length === 0 || opp.length === 0) {
      const panel = buildReportPanel("");
      panel.querySelector("h2").remove();
      panel.appendChild(el("div", "pvt-footer-note", TXT.fillTeamsNote));
      reportEl.appendChild(panel);
      return;
    }

    // ---------- Bảng Xếp Hạng Tốc Độ ----------
    const speedEntries = you.filter(p => p.speed !== null).map(p => ({ ...p, side: "you" }))
      .concat(opp.filter(p => p.speed !== null).map(p => ({ ...p, side: "opp" })));
    speedEntries.sort((a, b) => b.speed - a.speed);
    const maxSpeed = Math.max(...speedEntries.map(e => e.speed), 1);

    let youOutspeedCount = 0;
    const oppMaxSpeeds = opp.filter(p => p.speed !== null).map(p => p.speed);
    you.filter(p => p.speed !== null).forEach(p => {
      if (oppMaxSpeeds.every(os => p.speed > os)) youOutspeedCount++;
    });

    // ---------- Báo Cáo Điểm Yếu Theo Hệ ----------
    function dangerReport(defTeam, atkTeam) {
      return TYPES.map(atkType => {
        const weakCount = defTeam.filter(p => dualMult(atkType, p.t1, p.t2) > 1).length;
        const attackerHasType = atkTeam.some(p => p.t1 === atkType || p.t2 === atkType);
        return { atkType, weakCount, attackerHasType };
      }).filter(r => r.weakCount > 0 && r.attackerHasType)
        .sort((a, b) => b.weakCount - a.weakCount);
    }

    const yourDanger = dangerReport(you, opp);
    const oppDanger = dangerReport(opp, you);

    reportEl.appendChild(buildSummaryPanel(youOutspeedCount, you.length, yourDanger.length ? yourDanger[0].atkType : null));
    reportEl.appendChild(buildSpeedPanel(speedEntries, maxSpeed));
    reportEl.appendChild(buildDangerPanel(TXT.yourThreatsTitle, yourDanger, you.length));
    reportEl.appendChild(buildDangerPanel(TXT.theirThreatsTitle, oppDanger, opp.length));
  }

  document.getElementById("pvt-generate").addEventListener("click", renderReport);
})();
</script>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Một bản báo cáo, ba góc nhìn</mark></h2>



<p class="wp-block-paragraph">Matchup Scanner kết hợp logic của hai công cụ hiện có của chúng tôi — <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán cấp độ tốc độ Pokémon</a> và <a href="https://vngame.tv/cong-cu-phan-tich-diem-yeu-cua-doi-pokemon/" class="local-link" data-wpel-link="internal">Công cụ phân tích điểm yếu của đội Pokémon</a>  — thành một kết quả đầu ra duy nhất được xây dựng đặc biệt để so sánh hai đội trực tiếp:</p>



<ul class="wp-block-list">
<li><strong>So sánh tốc độ</strong> — tất cả Pokémon của cả hai đội được xếp hạng cùng nhau trên một bảng xếp hạng, giúp bạn dễ dàng nhận thấy tốc độ của đội mình và đội đối phương nằm ở mức nào.</li>



<li><strong>Các mối đe dọa mà bạn dễ bị tổn thương</strong> — sử dụng hệ của đối thủ làm thước đo cho các đòn tấn công STAB tiềm năng của chúng, điều này cho thấy những hệ nào mà chúng có thể mang theo và đe dọa nhiều Pokémon trong đội của bạn cùng một lúc.</li>



<li><strong>Các mối đe dọa mà chúng yếu thế trước</strong> — cùng một thao tác kiểm tra nhưng theo chiều ngược lại, cho bạn thấy loại tấn công nào sẽ gây sát thương lớn nhất cho đội của chúng.</li>
</ul>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Cách sử dụng</mark></h2>



<ol class="wp-block-list">
<li><strong>Hãy điền thông tin đội của bạn</strong> — tên (tùy chọn, chỉ để dễ đọc), một hoặc hai loại, Tốc độ cơ bản và mức đầu tư nhanh (Tối thiểu cho đội chưa đầu tư, Tối đa cho đội đầu tư tối đa với chỉ số Tốc độ cộng thêm, hoặc Tối đa cộng thêm Khăn choàng).</li>



<li><strong>Hãy điền thông tin về đội hình đối thủ</strong> theo cách tương tự — dựa trên danh sách đội hình đã được theo dõi, danh sách đội hình công khai của một giải đấu, hoặc dựa trên dự đoán tốt nhất của bạn về đội hình mà họ có khả năng sử dụng.</li>



<li><strong>Nhấp vào “Tạo báo cáo so sánh”</strong> và đọc ba phần: phần Tóm tắt nhanh sẽ cho bạn biết ngay lập tức có bao nhiêu Pokémon của bạn nhanh hơn toàn bộ đội hình của đối phương và điểm yếu chung lớn nhất của cả hai bên là gì, trước khi bạn xem đến các bảng chi tiết bên dưới.</li>
</ol>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Tại sao cách này hiệu quả hơn việc kiểm tra từng Pokémon một?</mark></h2>



<p class="wp-block-paragraph">Một lần kiểm tra Tốc độ hay một lần so sánh hệ chỉ cho bạn biết về một sự kết hợp cụ thể. Câu hỏi thực sự trước trận đấu rộng hơn:&nbsp;<strong>trên toàn bộ đội hình, đâu là những vấn đề lặp đi lặp lại?</strong>&nbsp;Một hệ chỉ đe dọa một trong số Pokémon của bạn chỉ là một sự bất tiện nhỏ; một hệ đe dọa ba hoặc bốn Pokémon cùng lúc — hiển thị ngay lập tức trong bảng “Những mối đe dọa bạn yếu thế” — là loại lỗ hổng quyết định trận đấu trước khi nó bắt đầu. Việc nhìn thấy cả hai đội hình được trình bày cùng nhau, thay vì ghép nối từ sáu lần kiểm tra riêng lẻ, chính là điều làm cho báo cáo trước trận đấu thực sự hữu ích chứ không chỉ đơn thuần là cung cấp thông tin.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Câu hỏi thường gặp</mark></h2>



<p class="wp-block-paragraph"><strong>Tôi có thể lấy thông tin đội hình đối thủ trước trận đấu ở đâu?</strong> Đối với các đối thủ trong chế độ Xếp hạng, bạn thường không thể biết trước – hãy sử dụng công cụ này với đội hình mà bạn dự đoán dựa trên xu hướng meta hiện tại (xem <a href="https://vngame.tv/chuyen-muc/pokemon-champions/tier-list-champion/" class="local-link" data-wpel-link="internal">Bảng xếp hạng</a> của chúng tôi ). Đối với các giải đấu có danh sách đội hình công khai, hoặc các trận đấu thông thường với đối thủ đã biết, hãy nhập đội hình thực tế của họ để có báo cáo chính xác hơn.</p>



<p class="wp-block-paragraph"><strong>Báo cáo "Mối đe dọa" có tính đến bộ chiêu thức thực tế, chứ không chỉ là hệ?</strong>&nbsp;Không — nó sử dụng hệ của mỗi Pokémon làm đại diện cho đòn tấn công cùng hệ (STAB) có khả năng nhất, đây là một giả định hợp lý trong hầu hết các trường hợp nhưng không đảm bảo bộ chiêu thức thực tế của chúng. Một Pokémon sử dụng các chiêu thức có phạm vi tấn công bất thường nằm ngoài hệ của nó sẽ không xuất hiện trong báo cáo này.</p>



<p class="wp-block-paragraph"><strong>“Max + Scarf” có nghĩa là gì nếu đối thủ thực sự không sử dụng Choice Scarf?</strong>&nbsp;Nó được dùng như một trường hợp xấu nhất để kiểm tra – nếu bạn vẫn nhanh hơn Pokémon của họ ngay cả khi giả định họ dùng Choice Scarf, bạn có thể tự tin về trận đấu đó bất kể họ thực sự chọn vật phẩm nào. Nếu bạn chỉ nhanh hơn Pokémon cấp “Max” của họ nhưng không nhanh hơn “Max + Scarf”, đó là một rủi ro thực sự cần phải lên kế hoạch cẩn thận.</p>



<p class="wp-block-paragraph"><strong>Tôi có thể sử dụng công cụ này cho cả các trận đấu đơn chứ không chỉ đôi không?</strong>&nbsp;Có – logic về tốc độ và phạm vi loại áp dụng giống nhau bất kể thể thức nào. Công cụ này không phân biệt giữa đơn và đôi vì cả hai đều sử dụng cùng một cơ chế thống kê và loại cơ bản.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Các công cụ liên quan: <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Công cụ tính toán cấp độ tốc độ</a> — cho một trận đấu chi tiết hơn. <a href="https://vngame.tv/cong-cu-phan-tich-diem-yeu-cua-doi-pokemon/" class="local-link" data-wpel-link="internal">Công cụ phân tích điểm yếu của đội</a> — cho bản đồ nhiệt đầy đủ về đội của bạn mà không cần đối thủ. <a href="https://vngame.tv/cong-cu-tinh-toan-cap-do-toc-do-pokemon/" class="local-link" data-wpel-link="internal">Biểu đồ chuẩn tốc độ Meta</a> — tham khảo nhanh tốc độ của các mối đe dọa hàng đầu trong thể thức này.</em></p>
<p>Bài viết <a href="https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/" data-wpel-link="internal">Báo cáo so sánh đội hình Pokémon Champions</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/bao-cao-so-sanh-doi-hinh-vo-dich-pokemon-champions/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17641</post-id>	</item>
		<item>
		<title>Công cụ tính toán giao dịch may mắn và bụi sao trong Pokémon GO</title>
		<link>https://vngame.tv/cong-cu-tinh-toan-giao-dich-may-man-va-bui-sao-trong-pokemon-go/</link>
					<comments>https://vngame.tv/cong-cu-tinh-toan-giao-dich-may-man-va-bui-sao-trong-pokemon-go/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Mon, 10 Aug 2026 21:21:14 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Công cụ tính toán giao dịch may mắn và bụi sao trong Pokémon GO]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=17567</guid>

					<description><![CDATA[<p>Pokémon May Mắn là một trong những cơ chế tiết kiệm tài nguyên tốt nhất trong Pokémon GO — đảm bảo chỉ số IV tối thiểu 80% trở lên và một nửa lượng Bụi Sao cần thiết để nâng cấp tối đa. Tuy nhiên, các quy tắc về việc giao dịch&#160;nào&#160;đảm bảo kết quả May Mắn thay đổi gần như mỗi năm khi Niantic mở rộng khung thời gian bắt Pokémon đủ điều kiện trong các sự kiện đặc biệt, và rất dễ dàng giao dịch đi một Pokémon thực sự đủ điều kiện mà không hề hay biết. Xin [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/cong-cu-tinh-toan-giao-dich-may-man-va-bui-sao-trong-pokemon-go/" data-wpel-link="internal">Công cụ tính toán giao dịch may mắn và bụi sao trong Pokémon GO</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pokémon May Mắn là một trong những cơ chế tiết kiệm tài nguyên tốt nhất trong Pokémon GO — đảm bảo chỉ số IV tối thiểu 80% trở lên và một nửa lượng Bụi Sao cần thiết để nâng cấp tối đa. Tuy nhiên, các quy tắc về việc giao dịch&nbsp;<em>nào</em>&nbsp;đảm bảo kết quả May Mắn thay đổi gần như mỗi năm khi Niantic mở rộng khung thời gian bắt Pokémon đủ điều kiện trong các sự kiện đặc biệt, và rất dễ dàng giao dịch đi một Pokémon thực sự đủ điều kiện mà không hề hay biết.</p>



<p class="wp-block-paragraph">Xin giới thiệu&nbsp;<strong>Lucky Scanner</strong>&nbsp;(được cung cấp bởi&nbsp;<strong>PokehubGuide.com</strong>&nbsp;), một tiện ích công nghệ cao thiết yếu trong bộ&nbsp;<em>công cụ Pokémon</em>&nbsp;của chúng tôi được xây dựng dành riêng cho việc giao dịch&nbsp;<strong>Pokémon GO</strong>&nbsp;. Cho dù bạn đang kiểm tra xem một Pokémon đã bắt được trước đó có đủ điều kiện để được giao dịch May mắn đảm bảo hay không, tính toán chính xác lượng Bụi Sao mà một Pokémon May mắn sẽ giúp bạn tiết kiệm được, hay ước tính phạm vi CP mà một khoản đầu tư May mắn có thể đạt được, công cụ này sẽ cung cấp cho bạn câu trả lời rõ ràng và chính xác.</p>



<!-- ============================================================
     LUCKY SCANNER — Công cụ Lucky Trade & Tiết kiệm Bụi Sao
     (bởi PokehubGuide.com) — BẢN VIỆT HÓA
     Dán toàn bộ khối này vào trang HTML của bạn.
     Dùng tiền tố "plt-" nên không xung đột với các tool khác.
     ============================================================ -->
<div id="plt-root">
  <style>
    #plt-root {
      --plt-bg: #0b0d10;
      --plt-panel: #14171c;
      --plt-red: #e3350d;
      --plt-red-dim: #7a1c08;
      --plt-amber: #ffb703;
      --plt-green: #4bd68b;
      --plt-lime: #c6f24a;
      --plt-text: #eef1f4;
      --plt-muted: #8a919c;
      --plt-line: #262b33;
      font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
      color: var(--plt-text);
      background: var(--plt-bg);
      max-width: 960px;
      margin: 0 auto;
      padding: 28px;
      border-radius: 20px;
      position: relative;
      overflow: hidden;
      box-shadow: 0 0 0 1px var(--plt-line), 0 30px 60px -20px rgba(0,0,0,0.6);
    }
    #plt-root::before {
      content: "";
      position: absolute; inset: 0;
      background: repeating-linear-gradient(
        to bottom, rgba(255,255,255,0.015) 0px, rgba(255,255,255,0.015) 1px,
        transparent 1px, transparent 3px
      );
      pointer-events: none; z-index: 5;
    }
    #plt-root * { box-sizing: border-box; }

    .plt-head { display: flex; align-items: center; gap: 14px; margin-bottom: 20px; }
    .plt-lens {
      width: 22px; height: 22px; border-radius: 50%;
      background: radial-gradient(circle at 35% 30%, #fff6c9, #f2c94c 45%, #7a5c0a 100%);
      box-shadow: 0 0 0 4px #1a1e24, 0 0 14px rgba(242,201,76,0.55);
      flex-shrink: 0;
    }
    .plt-brand {
      font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.16em;
      text-transform: uppercase; color: var(--plt-amber); margin-bottom: 3px;
    }
    .plt-brand b { color: var(--plt-text); font-weight: 700; }
    .plt-head h1 {
      font-family: 'Space Mono', monospace; font-size: 20px; letter-spacing: 0.14em;
      text-transform: uppercase; margin: 0; color: var(--plt-text);
    }
    .plt-head span {
      display: block; font-family: 'Space Mono', monospace; font-size: 11px;
      color: var(--plt-lime); letter-spacing: 0.08em; margin-top: 2px;
    }
    .plt-dots { margin-left: auto; display: flex; gap: 6px; }
    .plt-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--plt-line); display: block; }
    .plt-dots i:nth-child(1) { background: var(--plt-red); }
    .plt-dots i:nth-child(2) { background: var(--plt-amber); }
    .plt-dots i:nth-child(3) { background: var(--plt-green); }

    .plt-tabs { display: flex; gap: 8px; margin-bottom: 18px; flex-wrap: wrap; }
    .plt-tab {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.04em;
      padding: 10px 16px; border-radius: 10px; background: var(--plt-panel);
      border: 1px solid var(--plt-line); color: var(--plt-muted); cursor: pointer;
      transition: all .15s; user-select: none;
    }
    .plt-tab.plt-active { color: #0b0d10; border-color: #f2c94c; background: #f2c94c; font-weight: 700; }

    .plt-view { display: none; }
    .plt-view.plt-visible { display: block; }

    .plt-panel {
      background: var(--plt-panel); border: 1px solid var(--plt-line);
      border-radius: 14px; padding: 18px; margin-bottom: 16px;
    }
    .plt-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; color: var(--plt-muted); margin: 0 0 14px;
      display: flex; align-items: center; gap: 8px;
    }
    .plt-panel h2::before {
      content: ""; width: 6px; height: 6px; background: #f2c94c;
      display: inline-block; border-radius: 1px;
    }

    #plt-root .plt-grid-2 { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 12px; }
    #plt-root .plt-grid-3 { display: grid !important; grid-template-columns: 1fr 1fr 1fr !important; gap: 12px; }
    @media (max-width: 620px) { #plt-root .plt-grid-3 { grid-template-columns: 1fr 1fr !important; } }

    .plt-field label { display: block; font-size: 11px; color: var(--plt-muted); margin-bottom: 5px; }
    #plt-root input[type=number], #plt-root select {
      width: 100%; background: #0e1114; border: 1px solid var(--plt-line);
      color: var(--plt-text); font-family: 'Space Mono', monospace; font-size: 13px;
      padding: 9px 10px; border-radius: 8px; outline: none; appearance: none;
    }
    #plt-root select {
      background-image: linear-gradient(45deg, transparent 50%, var(--plt-muted) 50%),
                         linear-gradient(135deg, var(--plt-muted) 50%, transparent 50%);
      background-position: calc(100% - 14px) center, calc(100% - 9px) center;
      background-size: 5px 5px, 5px 5px; background-repeat: no-repeat; cursor: pointer;
    }
    #plt-root input:focus, #plt-root select:focus {
      border-color: #f2c94c; box-shadow: 0 0 0 3px rgba(242,201,76,0.18);
    }

    #plt-root .plt-result-strip { display: grid !important; grid-template-columns: 1fr 1fr !important; gap: 10px; margin-top: 4px; width: 100%; }
    #plt-root .plt-stat-chip { background: #0e1114; border: 1px solid var(--plt-line); border-radius: 10px; padding: 14px; text-align: center; width: 100%; min-width: 0; box-sizing: border-box; }
    .plt-stat-chip .plt-label { font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--plt-muted); margin-bottom: 6px; }
    .plt-stat-chip .plt-value { font-family: 'Space Mono', monospace; font-size: 22px; font-weight: 700; color: #f2c94c; }

    #plt-root .plt-badge { display: inline-block !important; width: fit-content; max-width: 100%; font-family: 'Space Mono', monospace; font-size: 13px; padding: 10px 16px; border-radius: 10px; font-weight: 700; margin-top: 4px; }
    .plt-badge-yes { background: rgba(75,214,139,0.16); color: var(--plt-green); }
    .plt-badge-no { background: rgba(227,53,13,0.16); color: var(--plt-red); }
    .plt-badge-cap { background: rgba(255,183,3,0.16); color: var(--plt-amber); }

    .plt-savings-bar-track { height: 10px; border-radius: 999px; background: #0e1114; overflow: hidden; border: 1px solid var(--plt-line); margin: 14px 0 6px; }
    .plt-savings-bar-fill { height: 100%; background: linear-gradient(90deg, #f2c94c, var(--plt-lime)); width: 0%; transition: width .35s ease; }

    .plt-cp-range-row { display: flex; align-items: center; gap: 10px; margin-top: 14px; font-family: 'Space Mono', monospace; }
    .plt-cp-endpoint { text-align: center; flex: 1; }
    .plt-cp-endpoint .plt-cp-num { font-size: 22px; font-weight: 700; }
    .plt-cp-endpoint.plt-cp-min .plt-cp-num { color: var(--plt-muted); }
    .plt-cp-endpoint.plt-cp-max .plt-cp-num { color: var(--plt-lime); }
    .plt-cp-endpoint .plt-cp-caption { font-size: 10px; color: var(--plt-muted); letter-spacing: 0.05em; text-transform: uppercase; margin-top: 4px; }
    .plt-cp-arrow { color: var(--plt-muted); font-size: 18px; }

    .plt-footer-note { margin-top: 14px; font-size: 11px; color: var(--plt-muted); line-height: 1.5; }
    .plt-note-warn {
      background: rgba(255,183,3,0.08); border: 1px solid rgba(255,183,3,0.3);
      border-radius: 10px; padding: 12px 14px; font-size: 12px; color: var(--plt-amber);
      margin-top: 14px; line-height: 1.5;
    }

    .plt-credit {
      margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--plt-line);
      display: flex; align-items: center; justify-content: center; gap: 6px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--plt-muted); letter-spacing: 0.03em;
    }
    .plt-credit .plt-credit-mark {
      width: 16px; height: 16px; border-radius: 4px;
      background: linear-gradient(135deg, #f2c94c, var(--plt-lime));
      display: inline-block; flex-shrink: 0;
    }
    .plt-credit a {
      color: var(--plt-text); font-weight: 700; text-decoration: none;
      border-bottom: 1px solid var(--plt-red-dim); transition: border-color .15s, color .15s;
    }
    .plt-credit a:hover { color: var(--plt-amber); border-color: var(--plt-amber); }
  </style>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&#038;family=DM+Sans:wght@400;500;700&#038;display=swap" rel="stylesheet">

  <div class="plt-head">
    <div class="plt-lens"></div>
    <div>
      <div class="plt-brand">Pokehub<b>Guide</b>.com</div>
      <h1>Máy Quét Lucky</h1>
      <span>LUCKY TRADE &amp; BỤI SAO — POKÉMON GO</span>
    </div>
    <div class="plt-dots"><i></i><i></i><i></i></div>
  </div>

  <div class="plt-tabs">
    <div class="plt-tab plt-active" data-view="eligibility">Kiểm Tra Lucky Đảm Bảo</div>
    <div class="plt-tab" data-view="stardust">Tiết Kiệm Bụi Sao</div>
    <div class="plt-tab" data-view="cprange">Khoảng CP Lucky</div>
  </div>

  <!-- ============ TAB 1: Kiểm Tra Lucky Đảm Bảo ============ -->
  <div class="plt-view plt-visible" id="plt-view-eligibility">
    <div class="plt-panel">
      <h2>Bắt Được Khi Nào?</h2>
      <div class="plt-grid-2" style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
        <div class="plt-field">
          <label>Năm bắt được</label>
          <select id="plt-catch-year"></select>
        </div>
        <div class="plt-field">
          <label>Số lượt Trade Lucky đảm bảo đã dùng (trên 45)</label>
          <input type="number" id="plt-trades-used" value="0" min="0" max="45">
        </div>
      </div>
    </div>

    <div class="plt-panel">
      <h2>Kết Quả</h2>
      <div id="plt-eligibility-result"></div>
      <div class="plt-note-warn">
        Niantic thường xuyên mở rộng mốc năm bắt được đảm bảo và giới hạn trọn đời theo từng sự kiện đặc biệt (cập nhật gần nhất: bắt được từ năm 2020 trở về trước, giới hạn 45 lượt trọn đời, tính theo sự kiện Năm Mới 2026). Luôn kiểm tra lại mốc hiện tại trong game trước khi áp dụng cho một lượt trade cụ thể.
      </div>
    </div>
  </div>

  <!-- ============ TAB 2: Tiết Kiệm Bụi Sao ============ -->
  <div class="plt-view" id="plt-view-stardust">
    <div class="plt-panel">
      <h2>Chi Phí Nâng Cấp Thông Thường</h2>
      <div class="plt-field">
        <label>Tổng Bụi Sao để nâng cấp tối đa (Pokémon thường)</label>
        <input type="number" id="plt-stardust-normal" value="150000" min="0" step="1000">
      </div>
    </div>
    <div class="plt-panel">
      <h2>Kết Quả — Pokémon Lucky (Giảm 50%)</h2>
      <div class="plt-result-strip" style="display:grid;grid-template-columns:1fr 1fr;gap:10px;width:100%;box-sizing:border-box;">
        <div class="plt-stat-chip"><div class="plt-label">Chi phí thường</div><div class="plt-value" id="plt-sd-normal">—</div></div>
        <div class="plt-stat-chip"><div class="plt-label">Chi phí Lucky</div><div class="plt-value" id="plt-sd-lucky">—</div></div>
      </div>
      <div class="plt-savings-bar-track"><div class="plt-savings-bar-fill" id="plt-sd-bar" style="width:50%"></div></div>
      <div class="plt-footer-note" id="plt-sd-note">Pokémon Lucky cần ít hơn 50% Bụi Sao để nâng cấp tối đa — đó chính là mức tiết kiệm hiển thị ở trên.</div>
    </div>
  </div>

  <!-- ============ TAB 3: Khoảng CP Lucky ============ -->
  <div class="plt-view" id="plt-view-cprange">
    <div class="plt-panel">
      <h2>Chỉ Số Gốc Của Loài</h2>
      <div class="plt-grid-3" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;">
        <div class="plt-field"><label>Tấn công gốc</label><input type="number" id="plt-base-atk" value="198" min="1"></div>
        <div class="plt-field"><label>Phòng thủ gốc</label><input type="number" id="plt-base-def" value="180" min="1"></div>
        <div class="plt-field"><label>Thể lực gốc</label><input type="number" id="plt-base-sta" value="216" min="1"></div>
      </div>
      <div class="plt-field" style="margin-top:12px;"><label>Cấp độ</label><select id="plt-cp-level"></select></div>
    </div>
    <div class="plt-panel">
      <h2>Khoảng CP Đảm Bảo Cho Pokémon Lucky</h2>
      <div class="plt-cp-range-row">
        <div class="plt-cp-endpoint plt-cp-min"><div class="plt-cp-num" id="plt-cp-min">—</div><div class="plt-cp-caption">Xấu nhất (12/12/12)</div></div>
        <div class="plt-cp-arrow">→</div>
        <div class="plt-cp-endpoint plt-cp-max"><div class="plt-cp-num" id="plt-cp-max">—</div><div class="plt-cp-caption">Tốt nhất (15/15/15)</div></div>
      </div>
      <div class="plt-footer-note">
        Mọi Pokémon Lucky đều được đảm bảo tối thiểu chỉ số IV 12/12/12 (80%) ở mỗi chỉ số — khoảng này thể hiện CP thấp nhất và cao nhất ở cấp độ bạn chọn, theo công thức CP chuẩn: ⌊(Tấn công × √Phòng thủ × √Thể lực × CPM²) / 10⌋.
      </div>
    </div>
  </div>

  <div class="plt-credit">
    <span class="plt-credit-mark"></span>
    Được cung cấp bởi <a href="https://pokehubguide.com" target="_blank" rel="noopener external noreferrer" class="local-link" data-wpel-link="external">PokehubGuide.com</a>
  </div>
</div>

<script>
(function () {
  // ------------------------------------------------------------------
  // FIX: chữ có dấu nằm trong <script> có thể bị nền tảng lưu trang
  // entity-hoá (vd "đảm bảo" -> "&#273;&#7843;m b&#7843;o"), và
  // innerHTML/textContent đều KHÔNG tự sửa được việc này nếu chính
  // chuỗi nguồn trong JS đã bị mangling — chỉ giải mã được entity nếu
  // chuỗi vốn dùng cú pháp entity một cách chủ đích. Cách xử lý đúng:
  // viết toàn bộ nhãn tiếng Việt trong script bằng escape Unicode
  // \uXXXX (mã nguồn 100% ASCII, không có gì để nền tảng entity-hoá),
  // và dựng phần kết quả động bằng DOM API thay vì ghép chuỗi HTML.
  // ------------------------------------------------------------------
  const TXT = {
    notEligibleBadge: "Ch\u01b0a \u0111\u1ee7 tu\u1ed5i \u0111\u1ec3 trade Lucky \u0111\u1ea3m b\u1ea3o",
    notEligibleNote: "Pok\u00e9mon n\u00e0y v\u1eabn c\u00f3 th\u1ec3 tr\u1edf th\u00e0nh Lucky qua t\u1ec9 l\u1ec7 ng\u1eabu nhi\u00ean th\u00f4ng th\u01b0\u1eddng (t\u0103ng d\u1ea7n theo tu\u1ed5i Pok\u00e9mon v\u00e0 c\u1ea5p \u0111\u1ed9 th\u00e2n thi\u1ebft), ch\u1ec9 l\u00e0 kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ea3m b\u1ea3o.",
    capBadge: "\u0110\u1ee7 \u0111i\u1ec1u ki\u1ec7n theo n\u0103m b\u1eaft, nh\u01b0ng \u0111\u00e3 h\u1ebft l\u01b0\u1ee3t \u0111\u1ea3m b\u1ea3o",
    capNote: "Pok\u00e9mon n\u00e0y \u0111\u1ee7 \u0111i\u1ec1u ki\u1ec7n theo n\u0103m b\u1eaft \u0111\u01b0\u1ee3c, nh\u01b0ng b\u1ea1n \u0111\u00e3 d\u00f9ng h\u1ebft to\u00e0n b\u1ed9 l\u01b0\u1ee3t Trade Lucky \u0111\u1ea3m b\u1ea3o. N\u00f3 v\u1eabn c\u00f3 th\u1ec3 l\u00ean Lucky qua t\u1ec9 l\u1ec7 ng\u1eabu nhi\u00ean th\u00f4ng th\u01b0\u1eddng.",
    eligibleBadge: "\u0110\u1ee7 \u0111i\u1ec1u ki\u1ec7n Trade Lucky \u0111\u1ea3m b\u1ea3o",
    chipRemaining: "L\u01b0\u1ee3t c\u00f2n l\u1ea1i",
    chipLifetime: "Gi\u1edbi h\u1ea1n tr\u1ecdn \u0111\u1eddi",
    levelPrefix: "C\u1ea5p ",
    stardustNoteA: "Pok\u00e9mon Lucky c\u1ea7n \u00edt h\u01a1n 50% B\u1ee5i Sao \u0111\u1ec3 n\u00e2ng c\u1ea5p t\u1ed1i \u0111a \u2014 b\u1ea1n s\u1ebd ti\u1ebft ki\u1ec7m \u0111\u01b0\u1ee3c ",
    stardustNoteB: " B\u1ee5i Sao cho Pok\u00e9mon n\u00e0y."
  };

  // ---------- Chuyển tab ----------
  document.querySelectorAll(".plt-tab").forEach(tab => {
    tab.addEventListener("click", () => {
      document.querySelectorAll(".plt-tab").forEach(t => t.classList.remove("plt-active"));
      tab.classList.add("plt-active");
      const view = tab.dataset.view;
      document.getElementById("plt-view-eligibility").classList.toggle("plt-visible", view === "eligibility");
      document.getElementById("plt-view-stardust").classList.toggle("plt-visible", view === "stardust");
      document.getElementById("plt-view-cprange").classList.toggle("plt-visible", view === "cprange");
    });
  });

  // ---------- Tab 1: Kiểm Tra Lucky Đảm Bảo ----------
  // Mốc hiện tại (đã kiểm tra lại theo sự kiện Năm Mới 2026): bắt trong hoặc trước năm 2020 = đủ điều kiện,
  // với giới hạn trọn đời là 45 lượt trade Lucky "đảm bảo".
  const GUARANTEED_CUTOFF_YEAR = 2020;
  const LIFETIME_CAP = 45;

  const yearSel = document.getElementById("plt-catch-year");
  const nowYear = new Date().getFullYear();
  for (let y = nowYear; y >= 2016; y--) {
    const opt = document.createElement("option");
    opt.value = y; opt.textContent = y;
    yearSel.appendChild(opt);
  }
  yearSel.value = "2019";

  // Dựng kết quả bằng DOM API thuần — không ghép chuỗi HTML, tránh mọi
  // rủi ro cấu trúc/entity khi nền tảng lưu lại trang.
  function makeChip(label, value) {
    const chip = document.createElement("div");
    chip.className = "plt-stat-chip";
    chip.style.width = "100%";
    chip.style.boxSizing = "border-box";

    const labelDiv = document.createElement("div");
    labelDiv.className = "plt-label";
    labelDiv.textContent = label;
    chip.appendChild(labelDiv);

    const valueDiv = document.createElement("div");
    valueDiv.className = "plt-value";
    valueDiv.textContent = value;
    chip.appendChild(valueDiv);

    return chip;
  }

  function renderEligibility() {
    const year = parseInt(yearSel.value);
    const used = Math.max(0, Math.min(LIFETIME_CAP, parseInt(document.getElementById("plt-trades-used").value) || 0));
    const remaining = LIFETIME_CAP - used;
    const eligible = year <= GUARANTEED_CUTOFF_YEAR;

    const el = document.getElementById("plt-eligibility-result");
    el.innerHTML = "";

    const badge = document.createElement("div");
    badge.className = "plt-badge";
    badge.style.display = "inline-block";
    badge.style.width = "fit-content";
    badge.style.maxWidth = "100%";

    const note = document.createElement("div");
    note.className = "plt-footer-note";

    if (!eligible) {
      badge.classList.add("plt-badge-no");
      badge.textContent = TXT.notEligibleBadge;
      note.textContent = TXT.notEligibleNote;
      el.appendChild(badge);
      el.appendChild(note);
    } else if (remaining <= 0) {
      badge.classList.add("plt-badge-cap");
      badge.textContent = TXT.capBadge;
      note.textContent = TXT.capNote;
      el.appendChild(badge);
      el.appendChild(note);
    } else {
      badge.classList.add("plt-badge-yes");
      badge.textContent = TXT.eligibleBadge;
      el.appendChild(badge);

      const strip = document.createElement("div");
      strip.className = "plt-result-strip";
      strip.style.display = "grid";
      strip.style.gridTemplateColumns = "1fr 1fr";
      strip.style.gap = "10px";
      strip.style.width = "100%";
      strip.style.boxSizing = "border-box";
      strip.style.marginTop = "14px";

      strip.appendChild(makeChip(TXT.chipRemaining, remaining));
      strip.appendChild(makeChip(TXT.chipLifetime, LIFETIME_CAP));
      el.appendChild(strip);
    }
  }
  document.getElementById("plt-view-eligibility").addEventListener("input", renderEligibility);
  document.getElementById("plt-view-eligibility").addEventListener("change", renderEligibility);
  renderEligibility();

  // ---------- Tab 2: Tiết Kiệm Bụi Sao ----------
  function renderStardust() {
    const normal = Math.max(0, parseFloat(document.getElementById("plt-stardust-normal").value) || 0);
    const lucky = Math.round(normal * 0.5);
    document.getElementById("plt-sd-normal").textContent = normal.toLocaleString('vi-VN');
    document.getElementById("plt-sd-lucky").textContent = lucky.toLocaleString('vi-VN');
    document.getElementById("plt-sd-note").textContent =
      TXT.stardustNoteA + (normal - lucky).toLocaleString('vi-VN') + TXT.stardustNoteB;
  }
  document.getElementById("plt-view-stardust").addEventListener("input", renderStardust);
  renderStardust();

  // ---------- Tab 3: Khoảng CP Lucky ----------
  const CPM = {
    1:0.094,1.5:0.1351374318,2:0.16639787,2.5:0.192650919,3:0.21573247,3.5:0.2365726613,
    4:0.25572005,4.5:0.2735303812,5:0.29024988,5.5:0.3060573775,6:0.3210876,6.5:0.3354450362,
    7:0.34921268,7.5:0.3624577511,8:0.3752356,8.5:0.387592416,9:0.39956728,9.5:0.4111935514,
    10:0.4225,10.5:0.4329264091,11:0.44310755,11.5:0.4530599591,12:0.4627984,12.5:0.472336093,
    13:0.48168495,13.5:0.4908558003,14:0.49985844,14.5:0.508701765,15:0.51739395,15.5:0.5259425113,
    16:0.5343543,16.5:0.5426357375,17:0.5507927,17.5:0.5588305862,18:0.5667545,18.5:0.5745691333,
    19:0.5822789,19.5:0.5898879072,20:0.5974,20.5:0.6048236651,21:0.6121573,21.5:0.6194041216,
    22:0.6265671,22.5:0.6336491432,23:0.64065295,23.5:0.6475809666,24:0.65443563,24.5:0.6612192524,
    25:0.667934,25.5:0.6745818959,26:0.6811649,26.5:0.6876849038,27:0.69414365,27.5:0.70054287,
    28:0.7068842,28.5:0.7131691091,29:0.7193991,29.5:0.7255756136,30:0.7317,30.5:0.7347410093,
    31:0.7377695,31.5:0.7407855938,32:0.74378943,32.5:0.7467812109,33:0.74976104,33.5:0.7527290867,
    34:0.7556855,34.5:0.7586303683,35:0.76156384,35.5:0.7644860647,36:0.76739717,36.5:0.7702972656,
    37:0.7731865,37.5:0.7760649616,38:0.77893275,38.5:0.7817900548,39:0.784637,39.5:0.7874736075,
    40:0.7903,40.5:0.792803968,41:0.79530001,41.5:0.797800015,42:0.8003,42.5:0.802799995,
    43:0.8053,43.5:0.8078,44:0.81029999,44.5:0.812799985,45:0.81529999,45.5:0.81779999,
    46:0.82029999,46.5:0.82279999,47:0.82529999,47.5:0.82779999,48:0.83029999,48.5:0.83279999,
    49:0.83529999,49.5:0.83779999,50:0.84029999,50.5:0.84279999,51:0.84529999
  };
  const LEVELS = Object.keys(CPM).map(Number).sort((a,b) => a - b);
  const cpLevelSel = document.getElementById("plt-cp-level");
  LEVELS.forEach(l => {
    const opt = document.createElement("option");
    opt.value = l; opt.textContent = TXT.levelPrefix + (Number.isInteger(l) ? l : l.toFixed(1));
    cpLevelSel.appendChild(opt);
  });
  cpLevelSel.value = "25";

  function cpAt(baseAtk, baseDef, baseSta, iv, level) {
    const cpm = CPM[level];
    const atk = baseAtk + iv, def = baseDef + iv, sta = baseSta + iv;
    return Math.max(10, Math.floor((atk * Math.sqrt(def) * Math.sqrt(sta) * cpm * cpm) / 10));
  }

  function renderCpRange() {
    const baseAtk = parseFloat(document.getElementById("plt-base-atk").value) || 0;
    const baseDef = parseFloat(document.getElementById("plt-base-def").value) || 0;
    const baseSta = parseFloat(document.getElementById("plt-base-sta").value) || 0;
    const level = parseFloat(cpLevelSel.value);

    const cpMin = cpAt(baseAtk, baseDef, baseSta, 12, level);
    const cpMax = cpAt(baseAtk, baseDef, baseSta, 15, level);

    document.getElementById("plt-cp-min").textContent = cpMin.toLocaleString('vi-VN');
    document.getElementById("plt-cp-max").textContent = cpMax.toLocaleString('vi-VN');
  }
  document.getElementById("plt-view-cprange").addEventListener("input", renderCpRange);
  document.getElementById("plt-view-cprange").addEventListener("change", renderCpRange);
  renderCpRange();
})();
</script>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Điều gì khiến một Pokémon trở nên "may mắn"?</mark></h2>



<p class="wp-block-paragraph">Pokémon May Mắn là một biến thể đặc biệt có được thông qua trao đổi, đi kèm với hai lợi ích vĩnh viễn: tốn&nbsp;<strong>ít hơn 50% Bụi Sao</strong>&nbsp;để nâng cấp tối đa và được đảm bảo&nbsp;<strong>chỉ số IV tối thiểu là 12/12/12</strong>&nbsp;(80%) ở mọi chỉ số — nghĩa là mỗi chỉ số riêng lẻ nằm trong khoảng từ 12 đến 15. Việc trao đổi có thể biến Pokémon thành May Mắn một cách ngẫu nhiên, với tỷ lệ tăng lên dựa trên tuổi của Pokémon và mức độ thân thiết của bạn với người trao đổi, hoặc&nbsp;<strong>được đảm bảo</strong>&nbsp;nếu Pokémon được bắt trước một ngày nhất định và bạn chưa vượt quá giới hạn trao đổi được đảm bảo trọn đời.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Hướng dẫn sử dụng máy quét may mắn</mark></h2>



<p class="wp-block-paragraph"><strong>Công cụ Kiểm Tra Pokémon May Mắn Đảm Bảo</strong>&nbsp;— chọn năm bắt được Pokémon và số lần trao đổi May Mắn đảm bảo bạn đã sử dụng. Công cụ này sẽ cho bạn biết ngay lập tức liệu Pokémon cụ thể này có đủ điều kiện để nhận được kết quả May Mắn đảm bảo hay không, và bạn còn bao nhiêu ô đảm bảo nữa trong giới hạn trọn đời của mình.</p>



<p class="wp-block-paragraph"><strong>Tiết kiệm Tinh Thạch</strong>&nbsp;— nhập tổng số Tinh Thạch cần thiết để nâng cấp tối đa một Pokémon thông thường, và xem chính xác chi phí của phiên bản May Mắn, cùng với số Tinh Thạch bạn tiết kiệm được. Đây là cách nhanh nhất để quyết định xem một Pokémon cụ thể có đáng để ưu tiên trao đổi bằng giao dịch May Mắn trước khi bạn đầu tư Tinh Thạch vào nó theo cách thông thường hay không.</p>



<p class="wp-block-paragraph"><strong>Phạm vi CP may mắn</strong>&nbsp;— nhập chỉ số Tấn công, Phòng thủ và Thể lực cơ bản của một loài cộng với cấp độ, và xem phạm vi CP được đảm bảo mà phiên bản may mắn của loài đó sẽ đạt được — từ mức IV thấp nhất là 12/12/12 đến mức hoàn hảo là 15/15/15.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Vì sao luật lệ cứ liên tục thay đổi</mark></h2>



<p class="wp-block-paragraph">Niantic đã mở rộng thời gian diễn ra giao dịch may mắn (Lucky Trade) nhiều lần kể từ khi tính năng này ra mắt vào năm 2018 — từ thời gian bắt Pokémon ban đầu là hai tháng và giới hạn 10 giao dịch trọn đời, cho đến thời gian nhiều năm hiện nay và giới hạn cao hơn nhiều, hầu như luôn được công bố trong các sự kiện theo chủ đề trong game. Vì những con số này thay đổi, Lucky Scanner được cập nhật theo thay đổi chính thức mới nhất chứ không phải là một quy tắc cố định mà dần dần trở nên lỗi thời. Tuy nhiên, hãy luôn kiểm tra lại thời gian diễn ra giao dịch trong game hiện tại trước khi thực hiện giao dịch không thể đảo ngược — thông tin trên trang sự kiện của Niantic là thông tin chính thức cuối cùng.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Câu hỏi thường gặp</mark></h2>



<p class="wp-block-paragraph"><strong>Việc trao đổi một Pokémon đủ điều kiện trở thành Lucky có đảm bảo tôi giữ được phiên bản Lucky đó không?</strong>&nbsp;Trạng thái Lucky được áp dụng cho Pokémon&nbsp;<em>bạn nhận được</em>&nbsp;trong giao dịch, chứ không phải Pokémon bạn gửi đi. Nếu bạn đang cố gắng biến một Pokémon cụ thể thành Lucky, thì chính Pokémon đó phải là Pokémon được trao đổi với bạn, và nó cần đáp ứng các yêu cầu về tuổi tác hoặc tình bạn.</p>



<p class="wp-block-paragraph"><strong>Sự khác biệt giữa giao dịch May Mắn được đảm bảo và giao dịch ngẫu nhiên là gì?</strong>&nbsp;Giao dịch được đảm bảo sử dụng quy tắc ngày bắt Pokémon cũ và luôn cho kết quả May Mắn (cho đến khi đạt giới hạn trọn đời). Ngoài ra, mỗi giao dịch đều có một xác suất ngẫu nhiên nhỏ hơn để trở thành May Mắn, xác suất này tăng lên theo tuổi của Pokémon và mức độ thân thiết của bạn với người huấn luyện — nhưng không bao giờ chắc chắn.</p>



<p class="wp-block-paragraph"><strong>Liệu một Pokémon may mắn có thể là Pokémon hệ Shiny hoặc có chỉ số IV hoàn hảo không?</strong>&nbsp;Có — Trạng thái May mắn hoàn toàn độc lập với trạng thái Shiny và không đảm bảo chỉ số IV hoàn hảo, chỉ đảm bảo tối thiểu 12/12/12. Một Pokémon may mắn có thể có chỉ số IV từ 80% đến 100%.</p>



<p class="wp-block-paragraph"><strong>Giảm giá Stardust có áp dụng cho Mega Evolution hay Elite TM không?</strong>&nbsp;Không — mức giảm giá 50% chỉ áp dụng cho chi phí Power Up tiêu chuẩn (tăng CP và HP). Chi phí năng lượng cho Mega Evolution và yêu cầu Elite TM không bị ảnh hưởng bởi trạng thái Lucky.</p>



<p class="wp-block-paragraph"><strong>Liệu có đáng để giữ lại những Pokémon cũ chỉ để đảm bảo nhận được Giao dịch May mắn?</strong>&nbsp;Đối với những Pokémon tốn kém để nâng cấp — đặc biệt là Pokémon Huyền thoại và các loài có CP cao khác — thì câu trả lời là có, vì lượng Bụi Sao tiết kiệm được sẽ càng nhiều khi bạn đầu tư nhiều hơn. Hãy sử dụng tab Tiết kiệm Bụi Sao để xem chính xác bạn sẽ tiết kiệm được bao nhiêu cho một Pokémon cụ thể trước khi quyết định.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Các công cụ liên quan: <a href="https://vngame.tv/cong-cu-tinh-cp-va-kiem-tra-iv-trong-pokemon-go/" class="local-link" data-wpel-link="internal">Công cụ tính CP và kiểm tra IV trong Pokémon GO</a> — kiểm tra chỉ số IV thực của Pokémon trước khi quyết định xem có nên dùng Giao dịch May mắn để đổi Pokémon hay không. <a href="https://vngame.tv/cong-cu-tinh-cp-va-kiem-tra-iv-trong-pokemon-go/" class="local-link" data-wpel-link="internal">Công cụ tính xếp hạng PvP trong Pokémon GO</a> — xem chỉ số tối thiểu được đảm bảo của Pokémon May mắn ảnh hưởng đến thứ hạng của nó trong Giải đấu Chiến đấu như thế nào.</em></p>
<p>Bài viết <a href="https://vngame.tv/cong-cu-tinh-toan-giao-dich-may-man-va-bui-sao-trong-pokemon-go/" data-wpel-link="internal">Công cụ tính toán giao dịch may mắn và bụi sao trong Pokémon GO</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/cong-cu-tinh-toan-giao-dich-may-man-va-bui-sao-trong-pokemon-go/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17567</post-id>	</item>
		<item>
		<title>Công cụ tính toán sát thương trong Pokémon GO</title>
		<link>https://vngame.tv/cong-cu-tinh-toan-sat-thuong-trong-pokemon-go/</link>
					<comments>https://vngame.tv/cong-cu-tinh-toan-sat-thuong-trong-pokemon-go/#respond</comments>
		
		<dc:creator><![CDATA[Cá]]></dc:creator>
		<pubDate>Mon, 10 Aug 2026 21:07:07 +0000</pubDate>
				<category><![CDATA[Pokemon Tools]]></category>
		<category><![CDATA[Công cụ tính toán sát thương trong Pokémon GO]]></category>
		<guid isPermaLink="false">https://vngame.tv/?p=17563</guid>

					<description><![CDATA[<p>Pokémon GO sử dụng hệ thống sát thương hoàn toàn khác so với các game chính trong series — cùng chỉ số Tấn công, cùng hệ tương khắc, nhưng công thức tính sát thương lại khác hẳn. Việc đoán xem liệu Pokémon tấn công mạnh nhất của bạn có thực sự đánh bại được bóng ma của Team Rocket, trùm raid cấp 5 hay đối thủ trong Great League hay không có thể khiến bạn thua trận, mất thời gian hoặc mất khiên phòng thủ. Giới thiệu&#160;GO Damage Scanner&#160;(được cung cấp bởi&#160;PokehubGuide.com&#160;), một tiện ích công nghệ cao thiết yếu [&#8230;]</p>
<p>Bài viết <a href="https://vngame.tv/cong-cu-tinh-toan-sat-thuong-trong-pokemon-go/" data-wpel-link="internal">Công cụ tính toán sát thương trong Pokémon GO</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pokémon GO sử dụng hệ thống sát thương hoàn toàn khác so với các game chính trong series — cùng chỉ số Tấn công, cùng hệ tương khắc, nhưng công thức tính sát thương lại khác hẳn. Việc đoán xem liệu Pokémon tấn công mạnh nhất của bạn có thực sự đánh bại được bóng ma của Team Rocket, trùm raid cấp 5 hay đối thủ trong Great League hay không có thể khiến bạn thua trận, mất thời gian hoặc mất khiên phòng thủ.</p>



<p class="wp-block-paragraph">Giới thiệu&nbsp;<strong>GO Damage Scanner</strong>&nbsp;(được cung cấp bởi&nbsp;<strong>PokehubGuide.com</strong>&nbsp;), một tiện ích công nghệ cao thiết yếu trong bộ&nbsp;<em>công cụ Pokémon</em>&nbsp;của chúng tôi được xây dựng dành riêng cho&nbsp;<strong>Pokémon GO</strong>&nbsp;— không phải được chuyển thể từ các trò chơi chính trong series. Cho dù bạn đang lên kế hoạch cho trận đấu Raid, kiểm tra giao dịch PvP hay tối ưu hóa đội hình Team Rocket, công cụ này sẽ cung cấp cho bạn con số chính xác mà công thức của Niantic đưa ra.</p>



<!-- ============================================================
     GO DAMAGE SCANNER — Máy Tính Sát Thương Pokémon GO (bởi PokehubGuide.com)
     Dán toàn bộ khối này vào trang HTML của bạn.
     Dùng tiền tố "pgd-" nên không xung đột với pdc-/psc-/ptc-/pst-/pgc-root.
     ============================================================ -->
<div id="pgd-root">
  <style>
    #pgd-root {
      --pgd-bg: #0b0d10;
      --pgd-panel: #14171c;
      --pgd-red: #e3350d;
      --pgd-red-dim: #7a1c08;
      --pgd-amber: #ffb703;
      --pgd-green: #4bd68b;
      --pgd-lime: #c6f24a;
      --pgd-text: #eef1f4;
      --pgd-muted: #8a919c;
      --pgd-line: #262b33;
      font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
      color: var(--pgd-text);
      background: var(--pgd-bg);
      max-width: 960px;
      margin: 0 auto;
      padding: 28px;
      border-radius: 20px;
      position: relative;
      overflow: hidden;
      box-shadow: 0 0 0 1px var(--pgd-line), 0 30px 60px -20px rgba(0,0,0,0.6);
    }
    #pgd-root::before {
      content: "";
      position: absolute; inset: 0;
      background: repeating-linear-gradient(
        to bottom, rgba(255,255,255,0.015) 0px, rgba(255,255,255,0.015) 1px,
        transparent 1px, transparent 3px
      );
      pointer-events: none; z-index: 5;
    }
    #pgd-root * { box-sizing: border-box; }

    .pgd-head { display: flex; align-items: center; gap: 14px; margin-bottom: 20px; }
    .pgd-lens {
      width: 22px; height: 22px; border-radius: 50%;
      background: radial-gradient(circle at 35% 30%, #eaffb0, #9fd82a 45%, #4a6b0a 100%);
      box-shadow: 0 0 0 4px #1a1e24, 0 0 14px rgba(198,242,74,0.55);
      flex-shrink: 0;
    }
    .pgd-brand {
      font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.16em;
      text-transform: uppercase; color: var(--pgd-amber); margin-bottom: 3px;
    }
    .pgd-brand b { color: var(--pgd-text); font-weight: 700; }
    .pgd-head h1 {
      font-family: 'Space Mono', monospace; font-size: 20px; letter-spacing: 0.14em;
      text-transform: uppercase; margin: 0; color: var(--pgd-text);
    }
    .pgd-head span {
      display: block; font-family: 'Space Mono', monospace; font-size: 11px;
      color: var(--pgd-lime); letter-spacing: 0.08em; margin-top: 2px;
    }
    .pgd-dots { margin-left: auto; display: flex; gap: 6px; }
    .pgd-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--pgd-line); display: block; }
    .pgd-dots i:nth-child(1) { background: var(--pgd-red); }
    .pgd-dots i:nth-child(2) { background: var(--pgd-amber); }
    .pgd-dots i:nth-child(3) { background: var(--pgd-green); }

    .pgd-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
    @media (max-width: 700px) { .pgd-grid { grid-template-columns: 1fr; } }

    .pgd-panel {
      background: var(--pgd-panel); border: 1px solid var(--pgd-line);
      border-radius: 14px; padding: 18px; margin-bottom: 16px;
    }
    .pgd-panel h2 {
      font-family: 'Space Mono', monospace; font-size: 12px; letter-spacing: 0.12em;
      text-transform: uppercase; color: var(--pgd-muted); margin: 0 0 14px;
      display: flex; align-items: center; gap: 8px;
    }
    .pgd-panel h2::before {
      content: ""; width: 6px; height: 6px; background: var(--pgd-lime);
      display: inline-block; border-radius: 1px;
    }

    .pgd-field { margin-bottom: 12px; }
    .pgd-field label { display: block; font-size: 11px; color: var(--pgd-muted); margin-bottom: 5px; }
    .pgd-row { display: flex; gap: 10px; }
    .pgd-row > .pgd-field { flex: 1; }

    #pgd-root input[type=number], #pgd-root select {
      width: 100%; background: #0e1114; border: 1px solid var(--pgd-line);
      color: var(--pgd-text); font-family: 'Space Mono', monospace; font-size: 13px;
      padding: 9px 10px; border-radius: 8px; outline: none; appearance: none;
    }
    #pgd-root select {
      background-image: linear-gradient(45deg, transparent 50%, var(--pgd-muted) 50%),
                         linear-gradient(135deg, var(--pgd-muted) 50%, transparent 50%);
      background-position: calc(100% - 14px) center, calc(100% - 9px) center;
      background-size: 5px 5px, 5px 5px; background-repeat: no-repeat; cursor: pointer;
    }
    #pgd-root input:focus, #pgd-root select:focus {
      border-color: var(--pgd-lime); box-shadow: 0 0 0 3px rgba(198,242,74,0.18);
    }

    .pgd-check { display: flex; align-items: center; gap: 8px; font-size: 13px; margin-top: 8px; cursor: pointer; user-select: none; }
    .pgd-check input { accent-color: var(--pgd-lime); width: 15px; height: 15px; }

    .pgd-result {
      background: var(--pgd-panel); border: 1px solid var(--pgd-line); border-radius: 14px; padding: 22px;
    }
    .pgd-result-top { display: flex; justify-content: space-between; align-items: flex-end; flex-wrap: wrap; gap: 12px; margin-bottom: 14px; }
    .pgd-dmg-label { font-family: 'Space Mono', monospace; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--pgd-muted); margin-bottom: 4px; }
    .pgd-dmg-value { font-family: 'Space Mono', monospace; font-size: 40px; font-weight: 700; line-height: 1; color: var(--pgd-lime); }
    .pgd-dmg-value small { font-size: 16px; color: var(--pgd-muted); font-weight: 400; }

    .pgd-badge { font-family: 'Space Mono', monospace; font-size: 12px; padding: 7px 12px; border-radius: 999px; font-weight: 700; letter-spacing: 0.03em; white-space: nowrap; }
    .pgd-eff-hi { background: rgba(75,214,139,0.16); color: var(--pgd-green); }
    .pgd-eff-mid { background: rgba(138,145,156,0.15); color: var(--pgd-muted); }
    .pgd-eff-low { background: rgba(255,183,3,0.14); color: var(--pgd-amber); }
    .pgd-eff-zero { background: rgba(227,53,13,0.16); color: var(--pgd-red); }

    .pgd-bar-track { height: 8px; border-radius: 999px; background: #0e1114; overflow: hidden; border: 1px solid var(--pgd-line); margin-bottom: 6px; }
    .pgd-bar-fill { height: 100%; background: linear-gradient(90deg, var(--pgd-red), var(--pgd-amber), var(--pgd-lime)); width: 0%; transition: width .4s ease; }
    .pgd-hp-note { font-size: 11px; color: var(--pgd-muted); font-family: 'Space Mono', monospace; }

    .pgd-breakdown { margin-top: 16px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
    @media (max-width: 620px) { .pgd-breakdown { grid-template-columns: repeat(2, 1fr); } }
    .pgd-chip { background: #0e1114; border: 1px solid var(--pgd-line); border-radius: 10px; padding: 10px; text-align: center; }
    .pgd-chip .pgd-chip-label { font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--pgd-muted); margin-bottom: 4px; font-family: 'Space Mono', monospace; }
    .pgd-chip .pgd-chip-value { font-family: 'Space Mono', monospace; font-size: 14px; color: var(--pgd-text); }

    .pgd-footer-note { margin-top: 14px; font-size: 11px; color: var(--pgd-muted); line-height: 1.5; }

    .pgd-credit {
      margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--pgd-line);
      display: flex; align-items: center; justify-content: center; gap: 6px;
      font-family: 'Space Mono', monospace; font-size: 11px; color: var(--pgd-muted); letter-spacing: 0.03em;
    }
    .pgd-credit .pgd-credit-mark {
      width: 16px; height: 16px; border-radius: 4px;
      background: linear-gradient(135deg, var(--pgd-lime), var(--pgd-amber));
      display: inline-block; flex-shrink: 0;
    }
    .pgd-credit a {
      color: var(--pgd-text); font-weight: 700; text-decoration: none;
      border-bottom: 1px solid var(--pgd-red-dim); transition: border-color .15s, color .15s;
    }
    .pgd-credit a:hover { color: var(--pgd-amber); border-color: var(--pgd-amber); }
  </style>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&#038;family=DM+Sans:wght@400;500;700&#038;display=swap" rel="stylesheet">

  <div class="pgd-head">
    <div class="pgd-lens"></div>
    <div>
      <div class="pgd-brand">Pokehub<b>Guide</b>.com</div>
      <h1>GO Damage Scanner</h1>
      <span>SÁT THƯƠNG PVE &amp; PVP — POKÉMON GO</span>
    </div>
    <div class="pgd-dots"><i></i><i></i><i></i></div>
  </div>

  <div class="pgd-grid">
    <div class="pgd-panel">
      <h2>Bên Tấn Công</h2>
      <div class="pgd-row">
        <div class="pgd-field"><label>Tấn Công Cơ Bản</label><input type="number" id="pgd-base-atk" value="198" min="1"></div>
        <div class="pgd-field"><label>IV Tấn Công (0–15)</label><input type="number" id="pgd-iv-atk" value="15" min="0" max="15"></div>
      </div>
      <div class="pgd-field"><label>Cấp Độ</label><select id="pgd-level-atk"></select></div>
      <div class="pgd-row">
        <div class="pgd-field"><label>Hệ 1</label><select id="pgd-atype1"></select></div>
        <div class="pgd-field"><label>Hệ 2 (tùy chọn)</label><select id="pgd-atype2"><option value="">— Không có —</option></select></div>
      </div>
    </div>

    <div class="pgd-panel">
      <h2>Chiêu Thức</h2>
      <div class="pgd-row">
        <div class="pgd-field"><label>Sức Mạnh</label><input type="number" id="pgd-power" value="15" min="1"></div>
        <div class="pgd-field"><label>Hệ Chiêu Thức</label><select id="pgd-mtype"></select></div>
      </div>
      <label class="pgd-check"><input type="checkbox" id="pgd-weather"> Boost Thời Tiết (×1.2)</label>
      <label class="pgd-check"><input type="checkbox" id="pgd-dodge"> Né Được — Chiêu Chính, PvE (×0.25)</label>
    </div>

    <div class="pgd-panel">
      <h2>Bên Phòng Thủ</h2>
      <div class="pgd-row">
        <div class="pgd-field"><label>Phòng Thủ Cơ Bản</label><input type="number" id="pgd-base-def" value="180" min="1"></div>
        <div class="pgd-field"><label>IV Phòng Thủ (0–15)</label><input type="number" id="pgd-iv-def" value="15" min="0" max="15"></div>
      </div>
      <div class="pgd-field"><label>Cấp Độ</label><select id="pgd-level-def"></select></div>
      <div class="pgd-row">
        <div class="pgd-field"><label>Hệ 1</label><select id="pgd-dtype1"></select></div>
        <div class="pgd-field"><label>Hệ 2 (tùy chọn)</label><select id="pgd-dtype2"><option value="">— Không có —</option></select></div>
      </div>
    </div>

    <div class="pgd-panel">
      <h2>Khác</h2>
      <div class="pgd-field"><label>HP Hiện Tại Của Đối Thủ (tùy chọn)</label><input type="number" id="pgd-hp" placeholder="vd: 111" min="1"></div>
      <div class="pgd-field"><label>Hệ Số Khác (Mega, Độ Thân Thiết, v.v.)</label><input type="number" id="pgd-other" value="1" step="0.05" min="0"></div>
    </div>
  </div>

  <div class="pgd-result">
    <div class="pgd-result-top">
      <div>
        <div class="pgd-dmg-label">Sát Thương Ước Tính</div>
        <div class="pgd-dmg-value" id="pgd-dmg-out">— <small>/ đòn</small></div>
      </div>
      <div class="pgd-badge pgd-eff-mid" id="pgd-eff-badge">Chưa tính</div>
    </div>

    <div class="pgd-bar-track"><div class="pgd-bar-fill" id="pgd-bar"></div></div>
    <div class="pgd-hp-note" id="pgd-hp-note">Nhập HP của đối thủ để xem sát thương theo % lượng máu</div>

    <div class="pgd-breakdown">
      <div class="pgd-chip"><span class="pgd-chip-label">STAB</span><span class="pgd-chip-value" id="pgd-out-stab">×1.00</span></div>
      <div class="pgd-chip"><span class="pgd-chip-label">Hệ Số Hệ</span><span class="pgd-chip-value" id="pgd-out-type">×1.00</span></div>
      <div class="pgd-chip"><span class="pgd-chip-label">Thời Tiết</span><span class="pgd-chip-value" id="pgd-out-weather">×1.00</span></div>
      <div class="pgd-chip"><span class="pgd-chip-label">Né Đòn</span><span class="pgd-chip-value" id="pgd-out-dodge">×1.00</span></div>
    </div>

    <div class="pgd-footer-note" id="pgd-footer-note"></div>
  </div>

  <div class="pgd-credit">
    <span class="pgd-credit-mark"></span>
    Cung cấp bởi <a href="https://pokehubguide.com" target="_blank" rel="noopener external noreferrer" class="local-link" data-wpel-link="external">PokehubGuide.com</a>
  </div>
</div>

<script>
(function () {
  const TYPES = ["Normal","Fire","Water","Electric","Grass","Ice","Fighting","Poison","Ground","Flying","Psychic","Bug","Rock","Ghost","Dragon","Dark","Steel","Fairy"];

  // Bảng hệ số main-series (0 / 0.5 / 1 / 2) — sẽ được quy đổi sang thang của GO (×1.6 / ×0.625) bên dưới
  const CHART = {
    Normal:   { Rock:0.5, Ghost:0, Steel:0.5 },
    Fire:     { Fire:0.5, Water:0.5, Grass:2, Ice:2, Bug:2, Rock:0.5, Dragon:0.5, Steel:2 },
    Water:    { Fire:2, Water:0.5, Grass:0.5, Ground:2, Rock:2, Dragon:0.5 },
    Electric: { Water:2, Electric:0.5, Grass:0.5, Ground:0, Flying:2, Dragon:0.5 },
    Grass:    { Fire:0.5, Water:2, Grass:0.5, Poison:0.5, Ground:2, Flying:0.5, Bug:0.5, Rock:2, Dragon:0.5, Steel:0.5 },
    Ice:      { Fire:0.5, Water:0.5, Grass:2, Ice:0.5, Ground:2, Flying:2, Dragon:2, Steel:0.5 },
    Fighting: { Normal:2, Ice:2, Poison:0.5, Flying:0.5, Psychic:0.5, Bug:0.5, Rock:2, Ghost:0, Dark:2, Steel:2, Fairy:0.5 },
    Poison:   { Grass:2, Poison:0.5, Ground:0.5, Rock:0.5, Ghost:0.5, Steel:0, Fairy:2 },
    Ground:   { Fire:2, Electric:2, Grass:0.5, Poison:2, Flying:0, Bug:0.5, Rock:2, Steel:2 },
    Flying:   { Electric:0.5, Grass:2, Fighting:2, Bug:2, Rock:0.5, Steel:0.5 },
    Psychic:  { Fighting:2, Poison:2, Psychic:0.5, Dark:0, Steel:0.5 },
    Bug:      { Fire:0.5, Grass:2, Fighting:0.5, Poison:0.5, Flying:0.5, Psychic:2, Ghost:0.5, Dark:2, Steel:0.5, Fairy:0.5 },
    Rock:     { Fire:2, Ice:2, Fighting:0.5, Ground:0.5, Flying:2, Bug:2, Steel:0.5 },
    Ghost:    { Normal:0, Psychic:2, Ghost:2, Dark:0.5 },
    Dragon:   { Dragon:2, Steel:0.5, Fairy:0 },
    Dark:     { Fighting:0.5, Psychic:2, Ghost:2, Dark:0.5, Fairy:0.5 },
    Steel:    { Fire:0.5, Water:0.5, Electric:0.5, Ice:2, Rock:2, Steel:0.5, Fairy:2 },
    Fairy:    { Fire:0.5, Fighting:2, Poison:0.5, Dragon:2, Dark:2, Steel:0.5 }
  };

  function mainSeriesMult(atk, def) {
    const row = CHART[atk] || {};
    return row[def] !== undefined ? row[def] : 1;
  }
  // Chuyển hệ số main-series (0 / 0.5 / 1 / 2) sang thang GO (0 / 0.625 / 1 / 1.6)
  function toGoMult(m) {
    if (m === 0) return 0;
    if (m === 2) return 1.6;
    if (m === 0.5) return 0.625;
    return 1;
  }
  function typeMultiplierGo(moveType, defType1, defType2) {
    let m = toGoMult(mainSeriesMult(moveType, defType1));
    if (defType2) m *= toGoMult(mainSeriesMult(moveType, defType2));
    return m;
  }

  // Bảng CPM chính thức Pokémon GO, cấp độ 1–51 (bước 0.5)
  const CPM = {
    1:0.094,1.5:0.1351374318,2:0.16639787,2.5:0.192650919,3:0.21573247,3.5:0.2365726613,
    4:0.25572005,4.5:0.2735303812,5:0.29024988,5.5:0.3060573775,6:0.3210876,6.5:0.3354450362,
    7:0.34921268,7.5:0.3624577511,8:0.3752356,8.5:0.387592416,9:0.39956728,9.5:0.4111935514,
    10:0.4225,10.5:0.4329264091,11:0.44310755,11.5:0.4530599591,12:0.4627984,12.5:0.472336093,
    13:0.48168495,13.5:0.4908558003,14:0.49985844,14.5:0.508701765,15:0.51739395,15.5:0.5259425113,
    16:0.5343543,16.5:0.5426357375,17:0.5507927,17.5:0.5588305862,18:0.5667545,18.5:0.5745691333,
    19:0.5822789,19.5:0.5898879072,20:0.5974,20.5:0.6048236651,21:0.6121573,21.5:0.6194041216,
    22:0.6265671,22.5:0.6336491432,23:0.64065295,23.5:0.6475809666,24:0.65443563,24.5:0.6612192524,
    25:0.667934,25.5:0.6745818959,26:0.6811649,26.5:0.6876849038,27:0.69414365,27.5:0.70054287,
    28:0.7068842,28.5:0.7131691091,29:0.7193991,29.5:0.7255756136,30:0.7317,30.5:0.7347410093,
    31:0.7377695,31.5:0.7407855938,32:0.74378943,32.5:0.7467812109,33:0.74976104,33.5:0.7527290867,
    34:0.7556855,34.5:0.7586303683,35:0.76156384,35.5:0.7644860647,36:0.76739717,36.5:0.7702972656,
    37:0.7731865,37.5:0.7760649616,38:0.77893275,38.5:0.7817900548,39:0.784637,39.5:0.7874736075,
    40:0.7903,40.5:0.792803968,41:0.79530001,41.5:0.797800015,42:0.8003,42.5:0.802799995,
    43:0.8053,43.5:0.8078,44:0.81029999,44.5:0.812799985,45:0.81529999,45.5:0.81779999,
    46:0.82029999,46.5:0.82279999,47:0.82529999,47.5:0.82779999,48:0.83029999,48.5:0.83279999,
    49:0.83529999,49.5:0.83779999,50:0.84029999,50.5:0.84279999,51:0.84529999
  };
  const LEVELS = Object.keys(CPM).map(Number).sort((a,b) => a - b);

  // Ghi chú: dùng innerHTML (không dùng textContent) cho mọi nhãn có chữ tiếng Việt
  // có dấu, để tránh lỗi hiển thị "&#xxxx;" nếu nền tảng nhúng trang tự escape
  // ký tự UTF-8 thành HTML entity trong mã nguồn.
  function fillLevelSelect(sel, def) {
    LEVELS.forEach(l => {
      const opt = document.createElement("option");
      opt.value = l;
      opt.innerHTML = "Cấp Độ " + (Number.isInteger(l) ? l : l.toFixed(1));
      sel.appendChild(opt);
    });
    sel.value = def;
  }
  fillLevelSelect(document.getElementById("pgd-level-atk"), "40");
  fillLevelSelect(document.getElementById("pgd-level-def"), "25");

  function fillTypeSelect(sel) {
    TYPES.forEach(t => {
      const opt = document.createElement("option");
      opt.value = t; opt.textContent = t;
      sel.appendChild(opt);
    });
  }
  const atype1 = document.getElementById("pgd-atype1");
  const atype2 = document.getElementById("pgd-atype2");
  const mtype  = document.getElementById("pgd-mtype");
  const dtype1 = document.getElementById("pgd-dtype1");
  const dtype2 = document.getElementById("pgd-dtype2");
  [atype1, atype2, mtype, dtype1, dtype2].forEach(fillTypeSelect);
  atype1.value = "Dragon"; mtype.value = "Dragon"; dtype1.value = "Dragon";

  // Đặt nội dung ghi chú công thức bằng innerHTML để hiển thị đúng chữ có dấu
  document.getElementById("pgd-footer-note").innerHTML =
    "Công thức: Sát thương = ⌊0.5 × Sức Mạnh × (Tấn Công/Phòng Thủ) × STAB(1.2) × Hệ Số Hệ × Thời Tiết(1.2) × Né Đòn(0.25) × Hệ Số Khác⌋ + 1. Tấn Công/Phòng Thủ = (Chỉ Số Cơ Bản + IV) × CPM tại cấp độ tương ứng. Pokémon GO dùng hệ số ×1.6 / ×0.625 cho mỗi bậc hệ, thay vì ×2 / ×0.5 như trong dòng game chính.";

  function effClass(mult) {
    if (mult === 0) return "pgd-eff-zero";
    if (mult > 1) return "pgd-eff-hi";
    if (mult === 1) return "pgd-eff-mid";
    return "pgd-eff-low";
  }
  function effLabel(mult) {
    if (mult === 0) return "Không hiệu quả";
    if (mult >= 2.56) return "Cực mạnh (×2.56)";
    if (mult > 1) return "Hiệu quả cao (×1.6)";
    if (mult === 1) return "Hiệu quả bình thường";
    if (mult <= 0.4) return "Kháng mạnh (×0.39)";
    return "Kém hiệu quả (×0.625)";
  }

  function calcAll() {
    const baseAtk = parseFloat(document.getElementById("pgd-base-atk").value) || 0;
    const ivAtk = Math.max(0, Math.min(15, parseInt(document.getElementById("pgd-iv-atk").value) || 0));
    const levelAtk = parseFloat(document.getElementById("pgd-level-atk").value);
    const baseDef = parseFloat(document.getElementById("pgd-base-def").value) || 0;
    const ivDef = Math.max(0, Math.min(15, parseInt(document.getElementById("pgd-iv-def").value) || 0));
    const levelDef = parseFloat(document.getElementById("pgd-level-def").value);
    const power = parseFloat(document.getElementById("pgd-power").value) || 0;
    const mv = mtype.value;
    const a1 = atype1.value, a2 = atype2.value;
    const d1 = dtype1.value, d2 = dtype2.value;
    const weatherOn = document.getElementById("pgd-weather").checked;
    const dodgeOn = document.getElementById("pgd-dodge").checked;
    const other = parseFloat(document.getElementById("pgd-other").value) || 1;
    const hp = parseFloat(document.getElementById("pgd-hp").value);

    const atkEff = (baseAtk + ivAtk) * CPM[levelAtk];
    const defEff = (baseDef + ivDef) * CPM[levelDef];

    const stab = (mv === a1 || mv === a2) ? 1.2 : 1.0;
    const typeMult = typeMultiplierGo(mv, d1, d2);
    const weather = weatherOn ? 1.2 : 1.0;
    const dodge = dodgeOn ? 0.25 : 1.0;

    const damage = Math.floor(0.5 * power * (atkEff / defEff) * stab * typeMult * weather * dodge * other) + 1;

    document.getElementById("pgd-dmg-out").innerHTML = (typeMult === 0 ? 0 : damage) + " <small>/ đòn</small>";

    const badge = document.getElementById("pgd-eff-badge");
    badge.className = "pgd-badge " + effClass(typeMult);
    badge.innerHTML = effLabel(typeMult);

    document.getElementById("pgd-out-stab").innerHTML = "×" + stab.toFixed(2);
    document.getElementById("pgd-out-type").innerHTML = "×" + typeMult.toFixed(3).replace(/0+$/,'').replace(/\.$/,'');
    document.getElementById("pgd-out-weather").innerHTML = "×" + weather.toFixed(2);
    document.getElementById("pgd-out-dodge").innerHTML = "×" + dodge.toFixed(2);

    const bar = document.getElementById("pgd-bar");
    const note = document.getElementById("pgd-hp-note");
    const finalDmg = typeMult === 0 ? 0 : damage;
    if (hp && hp > 0) {
      const pct = Math.min(100, (finalDmg / hp) * 100);
      bar.style.width = pct + "%";
      note.innerHTML = "Gây khoảng " + pct.toFixed(1) + "% lượng máu của đối thủ (" + hp + " HP)";
    } else {
      bar.style.width = Math.min(100, (finalDmg / (finalDmg + 60)) * 100) + "%";
      note.innerHTML = "Nhập HP của đối thủ để xem sát thương theo % lượng máu";
    }
  }

  document.getElementById("pgd-root").addEventListener("input", calcAll);
  document.getElementById("pgd-root").addEventListener("change", calcAll);
  calcAll();
})();
</script>



<ol class="wp-block-list">
<li><strong>Nhập Sức tấn công cơ bản, Chỉ số tấn công IV và Cấp độ của kẻ tấn công</strong>&nbsp;— những con số tương tự như bạn sử dụng trong Công cụ tính CP.</li>



<li><strong>Chọn loại (các) kẻ tấn công</strong>&nbsp;để STAB được áp dụng chính xác.</li>



<li><strong>Nhập Sức mạnh và loại của chiêu thức</strong>&nbsp;, cùng với Chỉ số Phòng thủ Cơ bản, Chỉ số Phòng thủ IV, Cấp độ và loại (các loại) của người phòng thủ.</li>



<li><strong>Kích hoạt Tăng Sức Mạnh Thời Tiết</strong>&nbsp;nếu thời tiết hiện tại trong game phù hợp với loại chiêu thức (×1.2).</li>



<li><strong>Chỉ bật/tắt Né tránh</strong>&nbsp;cho một đòn tấn công tích điện đã được né tránh thành công trong trận đấu PvE raid hoặc gym (×0.25) — điều này không áp dụng trong PvP.</li>



<li>Đọc&nbsp;<strong>thông số sát thương gây ra</strong>&nbsp;và&nbsp;<strong>huy hiệu hiệu quả</strong>&nbsp;, sau đó nhập lượng HP hiện tại của người phòng thủ để xem chính xác phần trăm thanh máu bị mất đi do đòn đánh.</li>
</ol>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Cách tính sát thương trong Pokémon GO</mark></h2>



<p class="wp-block-paragraph">GO Damage Scanner sử dụng công thức chính thức trong game, khác với dòng game chính ở ba điểm quan trọng:</p>



<pre class="wp-block-code"><code>Damage = ⌊0.5 × Power × (Attack / Defense) × STAB × Type Effectiveness × Weather × Dodge × Other⌋ + 1

Attack  = (Base Attack + Attack IV) × CPM at the attacker's level
Defense = (Base Defense + Defense IV) × CPM at the defender's level
</code></pre>



<ul class="wp-block-list">
<li><strong>STAB trong GO có hệ số nhân là ×1.2</strong>&nbsp;, chứ không phải ×1.5 như trong các game chính của series — một hệ số thưởng cùng loại nhỏ hơn, dễ bị đánh giá quá cao nếu bạn đã quen với các game trên console.</li>



<li><strong>Hiệu quả của từng loại được tính theo thang điểm khác</strong>&nbsp;: ×1.6 cho đòn đánh siêu hiệu quả và ×0.625 cho đòn đánh bị kháng cự, thay vì ×2 / ×0.5 như thường lệ. Các hệ phòng thủ kép cũng cộng dồn các giá trị này theo cách tương tự (×2.56 cho mục tiêu yếu kép, ×0.39 cho mục tiêu kháng kép), công cụ tính toán sẽ tự động xử lý việc này ngay khi bạn chọn loại phòng thủ thứ hai.</li>



<li><strong>Sức tấn công và phòng thủ được tính toán thông qua CPM</strong>&nbsp;, hệ số nhân dựa trên cấp độ tương tự như&nbsp;<a href="https://pokehubguide.com/pokemon-go-cp-calculator/" class="local-link" data-wpel-link="external" target="_blank" rel="external noopener noreferrer">công cụ tính CP của GO Scanner</a>&nbsp;— hãy nhập các chỉ số cơ bản, IV và cấp độ giống như bạn vẫn dùng ở đó.</li>
</ul>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Tại sao điều này không giống với máy tính dòng chính?</mark></h2>



<p class="wp-block-paragraph">Rất nhiều &#8220;công cụ tính toán sát thương Pokémon&#8221; trực tuyến âm thầm sử dụng công thức của phiên bản console và chỉ đổi tên nó cho Pokémon GO — điều này dẫn đến những con số sai lệch rõ rệt, đặc biệt là về hiệu quả theo loại và STAB. Một chiêu thức mà theo công thức của phiên bản chính sẽ chắc chắn hạ gục đối thủ trong 2 lượt đánh có thể không như vậy trong GO vì hệ số hiệu quả nhỏ hơn, hoặc một con trùm raid có thể sống sót sau một đòn đánh mà bạn tưởng là chí mạng. Việc tính toán chính xác điều này rất quan trọng khi thời gian, số lần hồi sinh của bạn, hoặc một cuộc chạm trán hiếm hoi với Team Rocket đang bị đe dọa — công cụ này sử dụng công thức thực tế của Niantic, chứ không phải là một công thức gần đúng được mượn từ một trò chơi khác.</p>



<h2 class="wp-block-heading"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">Câu hỏi thường gặp</mark></h2>



<p class="wp-block-paragraph"><strong>Tại sao hiệu quả theo loại chỉ là ×1.6 thay vì ×2 như trong các game chính?</strong>&nbsp;Pokémon GO sử dụng thang hiệu quả riêng, được xác nhận thông qua các tập tin trò chơi của Niantic: ×1.6 cho hiệu quả siêu mạnh và ×0.625 cho hiệu quả không cao, thay vì ×2 và ×0.5 như trong series chính. Đây là một lựa chọn thiết kế có chủ đích để giữ cho các trận đấu theo loại vẫn có tác động mà không làm cho những kẻ tấn công bị kháng hoàn toàn không thể sử dụng được.</p>



<p class="wp-block-paragraph"><strong>Hiệu ứng Tăng Sức Mạnh Thời Tiết có tác động đến mọi chiêu thức hay chỉ một số loại nhất định?</strong>&nbsp;Hiệu ứng Tăng Sức Mạnh Thời Tiết chỉ áp dụng hệ số nhân ×1.2 cho các chiêu thức có loại trùng khớp với loại đang được tăng sức mạnh trong điều kiện thời tiết đó (ví dụ: trời nắng tăng sức mạnh cho các chiêu thức hệ Lửa, Cỏ và Đất). Hãy kiểm tra biểu tượng thời tiết trong game để xác nhận loại nào đang hoạt động trước khi bật hiệu ứng này.</p>



<p class="wp-block-paragraph"><strong>Hệ số giảm né tránh có áp dụng trong các trận đấu PvP không?</strong>&nbsp;Không — mức giảm né tránh ×0.25 chỉ áp dụng cho các đòn tấn công tích điện được né tránh trong nội dung PvE như raid, phòng gym và các trận chiến với Team Rocket. PvP sử dụng một hệ thống khác: các đòn tấn công nhanh không thể né tránh để giảm sát thương, và các đòn tấn công tích điện được phản công bằng Khiên, thứ sẽ chặn 100% sát thương thay vì giảm sát thương.</p>



<p class="wp-block-paragraph"><strong>Tôi có thể tìm chỉ số Tấn công cơ bản và Phòng thủ cơ bản của Pokémon ở đâu?</strong>&nbsp;Chỉ số cơ bản là cố định cho mỗi loài và có sẵn trên bất kỳ nguồn thông tin Pokédex nào của Pokémon GO — đó cũng chính là những con số bạn sẽ nhập vào&nbsp;<a href="https://pokehubguide.com/pokemon-go-cp-calculator/" class="local-link" data-wpel-link="external" target="_blank" rel="external noopener noreferrer">Công cụ tính CP</a>&nbsp;của chúng tôi để kiểm tra Sức mạnh chiến đấu.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Công cụ liên quan: <a href="https://vngame.tv/cong-cu-tinh-cp-va-kiem-tra-iv-trong-pokemon-go/" class="local-link" data-wpel-link="internal">Máy tính CP &amp; Kiểm tra IV Pokémon GO </a>— tính toán chính xác giá trị Tấn công và Phòng thủ để đưa vào công thức tính sát thương này.</em></p>
<p>Bài viết <a href="https://vngame.tv/cong-cu-tinh-toan-sat-thuong-trong-pokemon-go/" data-wpel-link="internal">Công cụ tính toán sát thương trong Pokémon GO</a> đã xuất hiện đầu tiên vào ngày <a href="https://vngame.tv" data-wpel-link="internal">vnGAME</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vngame.tv/cong-cu-tinh-toan-sat-thuong-trong-pokemon-go/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17563</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: vngame.tv @ 2026-11-16 02:07:10 by W3 Total Cache
-->